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
}
}
}