Files
Yi.Admin/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Operlog/OperLogGlobalAttribute.cs

112 lines
4.1 KiB
C#
Raw Normal View History

using IPTools.Core;
2023-04-13 21:12:06 +08:00
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
2023-12-11 09:55:12 +08:00
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
2024-12-15 11:32:04 +08:00
using Volo.Abp.Uow;
2023-12-11 09:55:12 +08:00
using Volo.Abp.Users;
using Yi.Framework.Core.Extensions;
using Yi.Framework.Core.Helper;
using Yi.Framework.Rbac.Domain.Shared.OperLog;
namespace Yi.Framework.Rbac.Domain.Operlog
2023-04-13 21:12:06 +08:00
{
2023-12-21 16:55:47 +08:00
public class OperLogGlobalAttribute : ActionFilterAttribute, ITransientDependency
2023-04-13 21:12:06 +08:00
{
2023-12-11 09:55:12 +08:00
private ILogger<OperLogGlobalAttribute> _logger;
2023-04-13 21:12:06 +08:00
private IRepository<OperationLogEntity> _repository;
private ICurrentUser _currentUser;
2024-12-15 11:32:04 +08:00
private IUnitOfWorkManager _unitOfWorkManager;
2023-04-13 21:12:06 +08:00
//注入一个日志服务
2024-12-15 11:32:04 +08:00
public OperLogGlobalAttribute(ILogger<OperLogGlobalAttribute> logger, IRepository<OperationLogEntity> repository, ICurrentUser currentUser, IUnitOfWorkManager unitOfWorkManager)
2023-04-13 21:12:06 +08:00
{
_logger = logger;
_repository = repository;
_currentUser = currentUser;
2024-12-15 11:32:04 +08:00
_unitOfWorkManager = unitOfWorkManager;
2023-04-13 21:12:06 +08:00
}
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
2023-04-13 21:12:06 +08:00
{
var resultContext = await next();
2023-12-21 16:55:47 +08:00
//执行后
2023-04-13 21:12:06 +08:00
//判断标签是在方法上
2023-12-21 16:55:47 +08:00
if (resultContext.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor) return;
2023-04-13 21:12:06 +08:00
//查找标签,获取标签对象
2024-12-15 11:32:04 +08:00
OperLogAttribute? operLogAttribute = controllerActionDescriptor.MethodInfo
.GetCustomAttributes(inherit: true)
.FirstOrDefault(a => a.GetType().Equals(typeof(OperLogAttribute))) as OperLogAttribute;
2023-04-13 21:12:06 +08:00
//空对象直接返回
if (operLogAttribute is null) return;
////获取控制器名
//string controller = context.RouteData.Values["Controller"].ToString();
////获取方法名
//string action = context.RouteData.Values["Action"].ToString();
//获取Ip
2023-12-21 16:55:47 +08:00
string ip = resultContext.HttpContext.GetClientIp();
2023-04-13 21:12:06 +08:00
2024-12-15 11:32:04 +08:00
//根据ip获取地址
string location = "";
try
{
var ipTool = IpTool.Search(ip);
location = ipTool.Province + " " + ipTool.City;
}
catch
{
location = "搜索地址失败,可能是内网地址:" + ip;
}
2023-04-13 21:12:06 +08:00
//日志服务插入一条操作记录即可
var logEntity = new OperationLogEntity();
logEntity.OperIp = ip;
//logEntity.OperLocation = location;
logEntity.OperType = operLogAttribute.OperType;
logEntity.Title = operLogAttribute.Title;
2023-12-21 16:55:47 +08:00
logEntity.RequestMethod = resultContext.HttpContext.Request.Method;
logEntity.Method = resultContext.HttpContext.Request.Path.Value;
2023-04-13 21:12:06 +08:00
logEntity.OperLocation = location;
logEntity.OperUser = _currentUser.UserName;
if (operLogAttribute.IsSaveResponseData)
{
2023-12-21 16:55:47 +08:00
if (resultContext.Result is ContentResult result && result.ContentType == "application/json")
2023-04-13 21:12:06 +08:00
{
logEntity.RequestResult = result.Content?.Replace("\r\n", "").Trim();
}
2024-12-15 11:32:04 +08:00
2023-12-21 16:55:47 +08:00
if (resultContext.Result is JsonResult result2)
2023-04-13 21:12:06 +08:00
{
logEntity.RequestResult = result2.Value?.ToString();
}
2023-12-21 16:55:47 +08:00
if (resultContext.Result is ObjectResult result3)
2023-04-13 21:12:06 +08:00
{
logEntity.RequestResult = JsonHelper.ObjToStr(result3.Value);
}
}
if (operLogAttribute.IsSaveRequestData)
{
logEntity.RequestParam = JsonConvert.SerializeObject(context.ActionArguments);
2023-04-13 21:12:06 +08:00
}
2024-12-15 11:32:04 +08:00
using (var uow = _unitOfWorkManager.Begin())
{
await _repository.InsertAsync(logEntity);
}
2023-04-13 21:12:06 +08:00
}
2023-12-21 16:55:47 +08:00
2023-04-13 21:12:06 +08:00
}
}