using Masuit.MyBlogs.Core.Configs; using Masuit.MyBlogs.Core.Infrastructure.Services.Interface; using Masuit.MyBlogs.Core.Models.DTO; using Masuit.MyBlogs.Core.Models.Enum; using Masuit.MyBlogs.Core.Models.ViewModel; using Masuit.Tools.Core.Net; using Masuit.Tools.NoSQL; using Masuit.Tools.Security; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; #if DEBUG using Common; #endif namespace Masuit.MyBlogs.Core.Controllers { /// /// 基本父控制器 /// [ApiExplorerSettings(IgnoreApi = true)] public class BaseController : Controller { /// /// UserInfoService /// public IUserInfoService UserInfoService { get; set; } /// /// MenuService /// public IMenuService MenuService { get; set; } /// /// LinksService /// public ILinksService LinksService { get; set; } /// /// ContactsService /// public IContactsService ContactsService { get; set; } /// /// RedisHelper /// public RedisHelper RedisHelper { get; set; } /// /// 响应数据 /// /// 数据 /// 响应状态 /// 响应消息 /// 登录状态 /// http响应码 /// public ContentResult ResultData(object data, bool success = true, string message = "", bool isLogin = true, HttpStatusCode code = HttpStatusCode.OK) { return Content(JsonConvert.SerializeObject(new { IsLogin = isLogin, Success = success, Message = message, Data = data, code }, new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Ignore, NullValueHandling = NullValueHandling.Ignore, ReferenceLoopHandling = ReferenceLoopHandling.Ignore }), "application/json", Encoding.UTF8); } /// /// 分页响应数据 /// /// 数据 /// 总页数 /// 总条数 /// public ContentResult PageResult(object data, int pageCount, int total) { return Content(JsonConvert.SerializeObject(new PageDataModel(data, pageCount, total), new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Ignore }), "application/json", Encoding.UTF8); } /// 在调用操作方法前调用。 /// 有关当前请求和操作的信息。 public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); if (filterContext.HttpContext.Request.Method.Equals("GET", StringComparison.InvariantCultureIgnoreCase)) //get方式的多半是页面 { UserInfoOutputDto user = filterContext.HttpContext.Session.GetByRedis(SessionKey.UserInfo); #if DEBUG user = UserInfoService.GetByUsername("masuit").Mapper(); filterContext.HttpContext.Session.SetByRedis(SessionKey.UserInfo, user); #endif if (user == null && Request.Cookies.Count > 2) //执行自动登录 { string name = Request.Cookies["username"]; string pwd = Request.Cookies["password"]?.DesDecrypt(AppConfig.BaiduAK); var userInfo = UserInfoService.Login(name, pwd); if (userInfo != null) { Response.Cookies.Append("username", name, new CookieOptions() { Expires = DateTime.Now.AddDays(7) }); Response.Cookies.Append("password", Request.Cookies["password"].DesEncrypt(AppConfig.BaiduAK), new CookieOptions() { Expires = DateTime.Now.AddDays(7) }); filterContext.HttpContext.Session.SetByRedis(SessionKey.UserInfo, userInfo); } } } else { if (ModelState.IsValid) return; List errmsgs = new List(); ModelState.ForEach(kv => kv.Value.Errors.ForEach(error => errmsgs.Add(error.ErrorMessage))); if (errmsgs.Count > 1) { for (var i = 0; i < errmsgs.Count; i++) { errmsgs[i] = i + 1 + ". " + errmsgs[i]; } } filterContext.Result = ResultData(errmsgs, false, "数据校验失败,错误信息:" + string.Join(" | ", errmsgs), true, HttpStatusCode.BadRequest); } } /// 在调用操作方法后调用。 /// 有关当前请求和操作的信息。 public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); if (filterContext.HttpContext.Request.Method.Equals("POST", StringComparison.InvariantCultureIgnoreCase) && filterContext.Result is ViewResult) { filterContext.Result = ResultData(null, false, "该URL仅支持Get请求方式", false, HttpStatusCode.MethodNotAllowed); return; } #region 准备页面数据模型 ViewBag.menus = MenuService.LoadEntitiesFromL2Cache(m => m.Status == Status.Available).OrderBy(m => m.Sort).ToList(); //菜单 PageFootViewModel model = new PageFootViewModel //页脚 { Links = LinksService.LoadPageEntitiesFromL2Cache(1, 40, out int _, l => l.Status == Status.Available, l => l.Recommend, false).ToList(), Contacts = ContactsService.LoadEntitiesFromL2Cache(l => l.Status == Status.Available, l => l.Id, false).ToList() }; ViewBag.Footer = model; #endregion } } }