Blame view

Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/Operlog/OperLogGlobalAttribute.cs 4.08 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  using IPTools.Core;
  using Microsoft.AspNetCore.Mvc;
  using Microsoft.AspNetCore.Mvc.Controllers;
  using Microsoft.AspNetCore.Mvc.Filters;
  using Microsoft.Extensions.Logging;
  using Newtonsoft.Json;
  using Volo.Abp.DependencyInjection;
  using Volo.Abp.Domain.Repositories;
  using Volo.Abp.Uow;
  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
  {
      public class OperLogGlobalAttribute : ActionFilterAttribute, ITransientDependency
      {
          private ILogger<OperLogGlobalAttribute> _logger;
          private IRepository<OperationLogEntity> _repository;
          private ICurrentUser _currentUser;
  
          private IUnitOfWorkManager _unitOfWorkManager;
          //注入一个日志服务
          public OperLogGlobalAttribute(ILogger<OperLogGlobalAttribute> logger, IRepository<OperationLogEntity> repository, ICurrentUser currentUser, IUnitOfWorkManager unitOfWorkManager)
          {
              _logger = logger;
              _repository = repository;
              _currentUser = currentUser;
              _unitOfWorkManager = unitOfWorkManager;
          }
  
          public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
          {
              var resultContext = await next();
              //执行后
  
              //判断标签是在方法上
              if (resultContext.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor) return;
  
              //查找标签,获取标签对象
              OperLogAttribute? operLogAttribute = controllerActionDescriptor.MethodInfo
                  .GetCustomAttributes(inherit: true)
                  .FirstOrDefault(a => a.GetType().Equals(typeof(OperLogAttribute))) as OperLogAttribute;
              //空对象直接返回
              if (operLogAttribute is null) return;
  
              ////获取控制器名
              //string controller = context.RouteData.Values["Controller"].ToString();
  
              ////获取方法名
              //string action = context.RouteData.Values["Action"].ToString();
              //获取Ip
              string ip = resultContext.HttpContext.GetClientIp();
  
              //根据ip获取地址
              string location = "";
              try
              {
                  var ipTool = IpTool.Search(ip);
                  location = ipTool.Province + " " + ipTool.City;
              }
              catch
              {
                  location = "搜索地址失败,可能是内网地址:" + ip;
              }
  
  
              //日志服务插入一条操作记录即可
  
              var logEntity = new OperationLogEntity();
              logEntity.OperIp = ip;
              //logEntity.OperLocation = location;
              logEntity.OperType = operLogAttribute.OperType;
              logEntity.Title = operLogAttribute.Title;
              logEntity.RequestMethod = resultContext.HttpContext.Request.Method;
              logEntity.Method = resultContext.HttpContext.Request.Path.Value;
              logEntity.OperLocation = location;
              logEntity.OperUser = _currentUser.UserName;
              if (operLogAttribute.IsSaveResponseData)
              {
                  if (resultContext.Result is ContentResult result && result.ContentType == "application/json")
                  {
                      logEntity.RequestResult = result.Content?.Replace("\r\n", "").Trim();
                  }
  
                  if (resultContext.Result is JsonResult result2)
                  {
                      logEntity.RequestResult = result2.Value?.ToString();
                  }
  
                  if (resultContext.Result is ObjectResult result3)
                  {
                      logEntity.RequestResult = JsonHelper.ObjToStr(result3.Value);
                  }
  
              }
  
              if (operLogAttribute.IsSaveRequestData)
              {
                  logEntity.RequestParam = JsonConvert.SerializeObject(context.ActionArguments);
              }
  
              using (var uow = _unitOfWorkManager.Begin())
              {
                  await _repository.InsertAsync(logEntity);
              }
          }
  
      }
  }