Просмотр исходного кода

😁日志相关调整:增加DisplayName特性、合并异常日志表、去掉事件总线模式记录日志等其他优化

zuohuaijun 3 лет назад
Родитель
Сommit
2c7afbcb47
47 измененных файлов с 521 добавлено и 537 удалено
  1. 7 5
      Admin.NET/Admin.NET.Application/Configuration/Logging.json
  2. 4 3
      Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
  3. 71 151
      Admin.NET/Admin.NET.Core/Admin.NET.Core.xml
  4. 1 1
      Admin.NET/Admin.NET.Core/Entity/SysLogDiff.cs
  5. 0 71
      Admin.NET/Admin.NET.Core/Entity/SysLogEx.cs
  6. 27 33
      Admin.NET/Admin.NET.Core/Entity/SysLogOp.cs
  7. 46 12
      Admin.NET/Admin.NET.Core/Entity/SysLogVis.cs
  8. 7 19
      Admin.NET/Admin.NET.Core/Enum/LoginTypeEnum.cs
  9. 30 0
      Admin.NET/Admin.NET.Core/EventBus/AppEventSubscriber.cs
  10. 0 56
      Admin.NET/Admin.NET.Core/EventBus/LogEventSubscriber.cs
  11. 0 1
      Admin.NET/Admin.NET.Core/Job/LogJob.cs
  12. 86 26
      Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs
  13. 3 14
      Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs
  14. 1 1
      Admin.NET/Admin.NET.Core/SeedData/SysConfigSeedData.cs
  15. 16 14
      Admin.NET/Admin.NET.Core/Service/ApiJson/SelectTable.cs
  16. 15 42
      Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs
  17. 4 0
      Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs
  18. 3 0
      Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs
  19. 9 0
      Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs
  20. 6 0
      Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs
  21. 2 0
      Admin.NET/Admin.NET.Core/Service/Const/SysConstService.cs
  22. 11 1
      Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs
  23. 9 0
      Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs
  24. 9 1
      Admin.NET/Admin.NET.Core/Service/Dict/SysDictTypeService.cs
  25. 7 0
      Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs
  26. 17 0
      Admin.NET/Admin.NET.Core/Service/Job/SysJobService.cs
  27. 3 1
      Admin.NET/Admin.NET.Core/Service/Logging/SysLogDiffService.cs
  28. 0 61
      Admin.NET/Admin.NET.Core/Service/Logging/SysLogExService.cs
  29. 4 1
      Admin.NET/Admin.NET.Core/Service/Logging/SysLogOpService.cs
  30. 3 1
      Admin.NET/Admin.NET.Core/Service/Logging/SysLogVisService.cs
  31. 8 2
      Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs
  32. 5 0
      Admin.NET/Admin.NET.Core/Service/Message/SysMessageService.cs
  33. 12 4
      Admin.NET/Admin.NET.Core/Service/Notice/SysNoticeService.cs
  34. 3 1
      Admin.NET/Admin.NET.Core/Service/OnlineUser/SysOnlineUserService.cs
  35. 6 2
      Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs
  36. 4 0
      Admin.NET/Admin.NET.Core/Service/Pos/SysPosService.cs
  37. 7 1
      Admin.NET/Admin.NET.Core/Service/Region/SysRegionService.cs
  38. 11 1
      Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs
  39. 5 1
      Admin.NET/Admin.NET.Core/Service/Server/SysServerService.cs
  40. 9 0
      Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs
  41. 15 3
      Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs
  42. 8 2
      Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatPayService.cs
  43. 7 3
      Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs
  44. 4 0
      Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatUserService.cs
  45. 1 1
      Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs
  46. 9 1
      Admin.NET/Admin.NET.Web.Core/Startup.cs
  47. 6 0
      Admin.NET/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

+ 7 - 5
Admin.NET/Admin.NET.Application/Configuration/Logging.json

@@ -4,10 +4,11 @@
     "Logging": {
         "LogLevel": {
             "Default": "Information",
-            "Microsoft.AspNetCore": "Warning"
+            "Microsoft.AspNetCore": "Warning",
+            "Microsoft.EntityFrameworkCore": "Information"
         },
         "File": {
-            "Enabled": true, // 启用文件日志
+            "Enabled": false, // 启用文件日志
             "FileName": "logs/{0:yyyyMMdd}_{1}.log", // 日志文件
             "Append": true, // 追加覆盖
             // "MinimumLevel": "Information", // 日志级别
@@ -28,9 +29,10 @@
             "IncludeOfMethods": [], // 拦截特定方法,当GlobalEnabled=false有效
             "ExcludeOfMethods": [], // 排除特定方法,当GlobalEnabled=true有效
             "BahLogLevel": "Information", // Oops.Oh 和 Oops.Bah 业务日志输出级别
-            "WithReturnValue": true, // 配置是否包含返回值,默认true
-            "ReturnValueThreshold": 500, // 配置返回值字符串阈值,默认0全量输出
-            "JsonBehavior": "None", // 配置Json输出行为,默认None(OnlyJson、All)
+            "WithReturnValue": true, // 是否包含返回值,默认true
+            "ReturnValueThreshold": 500, // 返回值字符串阈值,默认0全量输出
+            "JsonBehavior": "None", // 是否输出Json,默认None(OnlyJson、All)
+            "JsonIndented": false, // 是否格式化Json
             "UseUtcTimestamp": false // 时间格式UTC、LOCAL
         }
     }

+ 4 - 3
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -19,9 +19,10 @@
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
     <PackageReference Include="DotNetCore.Natasha.CSharp" Version="5.0.2" />
     <PackageReference Include="FluentEmail.Smtp" Version="3.0.2" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.6.3" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.6.3" />
-    <PackageReference Include="Furion.Pure" Version="4.8.6.3" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.6.4" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.6.4" />
+    <PackageReference Include="Furion.Pure" Version="4.8.6.4" />
+    <PackageReference Include="IPTools.China" Version="1.6.0" />
     <PackageReference Include="Lazy.Captcha.Core" Version="2.0.1" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.4.2" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.4.2" />

+ 71 - 151
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -942,144 +942,104 @@
             差异操作
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogDiff.Duration">
+        <member name="P:Admin.NET.Core.SysLogDiff.Elapsed">
             <summary>
             耗时
             </summary>
         </member>
-        <member name="T:Admin.NET.Core.SysLogEx">
-            <summary>
-            系统异常日志表
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysLogEx.LogName">
-            <summary>
-            记录器类别名称
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysLogEx.LogLevel">
+        <member name="T:Admin.NET.Core.SysLogOp">
             <summary>
-            日志级别
+            系统操作日志表
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogEx.EventId">
+        <member name="P:Admin.NET.Core.SysLogOp.HttpMethod">
             <summary>
-            事件Id
+            请求方式
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogEx.Message">
+        <member name="P:Admin.NET.Core.SysLogOp.RequestUrl">
             <summary>
-            日志消息
+            请求地址
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogEx.Exception">
+        <member name="P:Admin.NET.Core.SysLogOp.RequestParam">
             <summary>
-            异常对象
+            请求参数
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogEx.State">
+        <member name="P:Admin.NET.Core.SysLogOp.ReturnResult">
             <summary>
-            当前状态值
+            返回结果
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogEx.LogDateTime">
+        <member name="P:Admin.NET.Core.SysLogOp.EventId">
             <summary>
-            日志记录时间
+            事件Id
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogEx.ThreadId">
+        <member name="P:Admin.NET.Core.SysLogOp.ThreadId">
             <summary>
             线程Id
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogEx.TraceId">
+        <member name="P:Admin.NET.Core.SysLogOp.TraceId">
             <summary>
             请求跟踪Id
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogEx.UseUtcTimestamp">
-            <summary>
-            是否使用UTC时间戳
-            </summary>
-        </member>
-        <member name="T:Admin.NET.Core.SysLogOp">
-            <summary>
-            系统操作日志表
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysLogOp.LogName">
-            <summary>
-            记录器类别名称
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysLogOp.LogLevel">
-            <summary>
-            日志级别
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysLogOp.EventId">
+        <member name="P:Admin.NET.Core.SysLogOp.Exception">
             <summary>
-            事件Id
+            异常信息
             </summary>
         </member>
         <member name="P:Admin.NET.Core.SysLogOp.Message">
             <summary>
-            日志消息
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysLogOp.Exception">
-            <summary>
-            异常对象
+            日志消息Json
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogOp.State">
-            <summary>
-            当前状态值
-            </summary>
-        </member>
-        <member name="P:Admin.NET.Core.SysLogOp.LogDateTime">
+        <member name="T:Admin.NET.Core.SysLogVis">
             <summary>
-            日志记录时间
+            系统访问日志表
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogOp.ThreadId">
+        <member name="P:Admin.NET.Core.SysLogVis.ControllerName">
             <summary>
-            线程Id
+            模块名称
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogOp.TraceId">
-            <summary>
-            请求跟踪Id
+        <member name="P:Admin.NET.Core.SysLogVis.ActionName">
+             <summary>
+             方法名称 
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogOp.UseUtcTimestamp">
-            <summary>
-            是否使用UTC时间戳
+        <member name="P:Admin.NET.Core.SysLogVis.DisplayTitle">
+             <summary>
+             显示名称 
             </summary>
         </member>
-        <member name="T:Admin.NET.Core.SysLogVis">
+        <member name="P:Admin.NET.Core.SysLogVis.Status">
             <summary>
-            系统访问日志表
+            执行状态
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogVis.Success">
+        <member name="P:Admin.NET.Core.SysLogVis.RemoteIp">
             <summary>
-            是否执行成功(Y-是,N-否)
+            IP地址
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogVis.Message">
+        <member name="P:Admin.NET.Core.SysLogVis.Location">
             <summary>
-            具体消息
+            登录地点
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogVis.Ip">
+        <member name="P:Admin.NET.Core.SysLogVis.Longitude">
             <summary>
-            IP地址
+            经度
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogVis.Location">
+        <member name="P:Admin.NET.Core.SysLogVis.Latitude">
             <summary>
-            地址
+            维度
             </summary>
         </member>
         <member name="P:Admin.NET.Core.SysLogVis.Browser">
@@ -1092,9 +1052,14 @@
             操作系统
             </summary>
         </member>
-        <member name="P:Admin.NET.Core.SysLogVis.VisType">
+        <member name="P:Admin.NET.Core.SysLogVis.Elapsed">
+            <summary>
+            操作用时
+            </summary>
+        </member>
+        <member name="P:Admin.NET.Core.SysLogVis.LogDateTime">
             <summary>
-            访问类型
+            日志时间
             </summary>
         </member>
         <member name="P:Admin.NET.Core.SysLogVis.Account">
@@ -2814,27 +2779,17 @@
         </member>
         <member name="F:Admin.NET.Core.LoginTypeEnum.Login">
             <summary>
-            登录
+            PC登录
             </summary>
         </member>
         <member name="F:Admin.NET.Core.LoginTypeEnum.Logout">
             <summary>
-            退出
+            PC退出
             </summary>
         </member>
         <member name="F:Admin.NET.Core.LoginTypeEnum.Register">
             <summary>
-            注册
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.LoginTypeEnum.ChangePassword">
-            <summary>
-            改密
-            </summary>
-        </member>
-        <member name="F:Admin.NET.Core.LoginTypeEnum.AuthorizedLogin">
-            <summary>
-            三方授权登陆
+            PC注册
             </summary>
         </member>
         <member name="T:Admin.NET.Core.MenuTypeEnum">
@@ -3109,32 +3064,11 @@
             </summary>
         </member>
-        <member name="T:Admin.NET.Core.LogEventSubscriber">
+        <member name="T:Admin.NET.Core.AppEventSubscriber">
             <summary>
-            日志事件订阅
+            事件订阅
             </summary>
         </member>
-        <member name="M:Admin.NET.Core.LogEventSubscriber.CreateOpLog(Furion.EventBus.EventHandlerExecutingContext)">
-            <summary>
-            增加操作日志
-            </summary>
-            <param name="context"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.NET.Core.LogEventSubscriber.CreateExLog(Furion.EventBus.EventHandlerExecutingContext)">
-            <summary>
-            增加异常日志
-            </summary>
-            <param name="context"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.NET.Core.LogEventSubscriber.CreateVisLog(Furion.EventBus.EventHandlerExecutingContext)">
-            <summary>
-            增加访问日志
-            </summary>
-            <param name="context"></param>
-            <returns></returns>
-        </member>
         <member name="T:Admin.NET.Core.RedisEventSourceStorer">
             <summary>
             Redis自定义事件源存储器
@@ -3625,6 +3559,13 @@
             数据库日志写入器
             </summary>
         </member>
+        <member name="M:Admin.NET.Core.DatabaseLoggingWriter.GetIpAddress(System.String)">
+            <summary>
+            解析IP地址
+            </summary>
+            <param name="ip"></param>
+            <returns></returns>
+        </member>
         <member name="T:Admin.NET.Core.ElasticSearchLoggingWriter">
             <summary>
             ES日志写入器
@@ -4200,15 +4141,17 @@
             <returns></returns>
         </member>
         <member name="M:Admin.NET.Core.Service.SelectTable.GetTableData(System.String,System.Int32,System.Int32,System.Int32,System.String,Newtonsoft.Json.Linq.JObject)">
-             <summary>
+            <summary>
             
-             </summary>
-             <param name="subtable"></param>
-             <param name="page"></param>
-             <param name="count"></param>
-             <param name="json"></param>
-             <param name="dd"></param>
-             <returns></returns>
+            </summary>
+            <param name="subtable"></param>
+            <param name="page"></param>
+            <param name="count"></param>
+            <param name="query"></param>
+            <param name="json"></param>
+            <param name="dd"></param>
+            <returns></returns>
+            <exception cref="T:System.Exception"></exception>
         </member>
         <member name="M:Admin.NET.Core.Service.SelectTable.GetFirstData(System.String,System.String,Newtonsoft.Json.Linq.JObject)">
              <summary>
@@ -5839,29 +5782,6 @@
             </summary>
             <returns></returns>
         </member>
-        <member name="T:Admin.NET.Core.Service.SysLogExService">
-            <summary>
-            系统异常日志服务
-            </summary>
-        </member>
-        <member name="M:Admin.NET.Core.Service.SysLogExService.GetPage(Admin.NET.Core.Service.PageLogInput)">
-            <summary>
-            获取异常日志分页列表
-            </summary>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.NET.Core.Service.SysLogExService.Clear">
-            <summary>
-            清空异常日志
-            </summary>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.NET.Core.Service.SysLogExService.ExporLogOp(Admin.NET.Core.Service.LogInput)">
-            <summary>
-            导出异常日志
-            </summary>
-            <returns></returns>
-        </member>
         <member name="T:Admin.NET.Core.Service.SysLogOpService">
             <summary>
             系统操作日志服务
@@ -6203,14 +6123,14 @@
         </member>
         <member name="M:Admin.NET.Core.Service.SysNoticeService.GetPageReceived(Admin.NET.Core.Service.PageNoticeInput)">
             <summary>
-            获取接收的通知公告(当前用户)
+            获取接收的通知公告
             </summary>
             <param name="input"></param>
             <returns></returns>
         </member>
         <member name="M:Admin.NET.Core.Service.SysNoticeService.GetUnReadList">
             <summary>
-            获取未读的通知公告(当前用户)
+            获取未读的通知公告
             </summary>
             <returns></returns>
         </member>
@@ -6418,7 +6338,7 @@
         </member>
         <member name="M:Admin.NET.Core.Service.SysRegionService.GetPage(Admin.NET.Core.Service.PageRegionInput)">
             <summary>
-            获取行政区域列表
+            获取行政区域分页列表
             </summary>
             <param name="input"></param>
             <returns></returns>
@@ -6702,7 +6622,7 @@
         </member>
         <member name="M:Admin.NET.Core.Service.SysServerService.GetServerUsed">
             <summary>
-            获取服务器内存信息
+            获取服务器使用信息
             </summary>
             <returns></returns>
         </member>

+ 1 - 1
Admin.NET/Admin.NET.Core/Entity/SysLogDiff.cs

@@ -47,5 +47,5 @@ public class SysLogDiff : EntityBase
     /// 耗时
     /// </summary>
     [SugarColumn(ColumnDescription = "耗时")]
-    public long Duration { get; set; }
+    public long Elapsed { get; set; }
 }

+ 0 - 71
Admin.NET/Admin.NET.Core/Entity/SysLogEx.cs

@@ -1,71 +0,0 @@
-namespace Admin.NET.Core;
-
-/// <summary>
-/// 系统异常日志表
-/// </summary>
-[SugarTable(null, "系统异常日志表")]
-[SystemTable]
-public class SysLogEx : EntityTenant
-{
-    /// <summary>
-    /// 记录器类别名称
-    /// </summary>
-    [SugarColumn(ColumnDescription = "记录器类别名称", Length = 256)]
-    [MaxLength(256)]
-    public string? LogName { get; set; }
-
-    /// <summary>
-    /// 日志级别
-    /// </summary>
-    [SugarColumn(ColumnDescription = "日志级别", Length = 16)]
-    [MaxLength(16)]
-    public string? LogLevel { get; set; }
-
-    /// <summary>
-    /// 事件Id
-    /// </summary>
-    [SugarColumn(ColumnDescription = "事件Id", ColumnDataType = StaticConfig.CodeFirst_BigString)]
-    public string? EventId { get; set; }
-
-    /// <summary>
-    /// 日志消息
-    /// </summary>
-    [SugarColumn(ColumnDescription = "日志消息", ColumnDataType = StaticConfig.CodeFirst_BigString)]
-    public string? Message { get; set; }
-
-    /// <summary>
-    /// 异常对象
-    /// </summary>
-    [SugarColumn(ColumnDescription = "异常对象", ColumnDataType = StaticConfig.CodeFirst_BigString)]
-    public string? Exception { get; set; }
-
-    /// <summary>
-    /// 当前状态值
-    /// </summary>
-    [SugarColumn(ColumnDescription = "当前状态值", ColumnDataType = StaticConfig.CodeFirst_BigString)]
-    public string? State { get; set; }
-
-    /// <summary>
-    /// 日志记录时间
-    /// </summary>
-    [SugarColumn(ColumnDescription = "日志记录时间")]
-    public DateTime LogDateTime { get; set; }
-
-    /// <summary>
-    /// 线程Id
-    /// </summary>
-    [SugarColumn(ColumnDescription = "线程Id")]
-    public int ThreadId { get; set; }
-
-    /// <summary>
-    /// 请求跟踪Id
-    /// </summary>
-    [SugarColumn(ColumnDescription = "请求跟踪Id", Length = 128)]
-    [MaxLength(128)]
-    public string? TraceId { get; set; }
-
-    /// <summary>
-    /// 是否使用UTC时间戳
-    /// </summary>
-    public bool UseUtcTimestamp { get; set; }
-}

+ 27 - 33
Admin.NET/Admin.NET.Core/Entity/SysLogOp.cs

@@ -5,57 +5,44 @@
 /// </summary>
 [SugarTable(null, "系统操作日志表")]
 [SystemTable]
-public class SysLogOp : EntityTenant
+public class SysLogOp : SysLogVis
 {
     /// <summary>
-    /// 记录器类别名称
+    /// 请求方式
     /// </summary>
-    [SugarColumn(ColumnDescription = "记录器类别名称", Length = 256)]
-    [MaxLength(256)]
-    public string? LogName { get; set; }
+    [SugarColumn(ColumnDescription = "请求方式", Length = 32)]
+    [MaxLength(32)]
+    public string HttpMethod { get; set; }
 
     /// <summary>
-    /// 日志级别
+    /// 请求地址
     /// </summary>
-    [SugarColumn(ColumnDescription = "日志级别", Length = 16)]
-    [MaxLength(16)]
-    public string? LogLevel { get; set; }
+    [SugarColumn(ColumnDescription = "请求地址", ColumnDataType = StaticConfig.CodeFirst_BigString)]
+    public string RequestUrl { get; set; }
 
     /// <summary>
-    /// 事件Id
-    /// </summary>
-    [SugarColumn(ColumnDescription = "事件Id", ColumnDataType = StaticConfig.CodeFirst_BigString)]
-    public string? EventId { get; set; }
-
-    /// <summary>
-    /// 日志消息
+    /// 请求参数
     /// </summary>
-    [SugarColumn(ColumnDescription = "日志消息", ColumnDataType = StaticConfig.CodeFirst_BigString)]
-    public string? Message { get; set; }
+    [SugarColumn(ColumnDescription = "请求参数", ColumnDataType = StaticConfig.CodeFirst_BigString)]
+    public string? RequestParam { get; set; }
 
     /// <summary>
-    /// 异常对象
+    /// 返回结果
     /// </summary>
-    [SugarColumn(ColumnDescription = "异常对象", ColumnDataType = StaticConfig.CodeFirst_BigString)]
-    public string? Exception { get; set; }
+    [SugarColumn(ColumnDescription = "返回结果", ColumnDataType = StaticConfig.CodeFirst_BigString)]
+    public string? ReturnResult { get; set; }
 
     /// <summary>
-    /// 当前状态值
-    /// </summary>
-    [SugarColumn(ColumnDescription = "当前状态值", ColumnDataType = StaticConfig.CodeFirst_BigString)]
-    public string? State { get; set; }
-
-    /// <summary>
-    /// 日志记录时间
+    /// 事件Id
     /// </summary>
-    [SugarColumn(ColumnDescription = "日志记录时间")]
-    public DateTime LogDateTime { get; set; }
+    [SugarColumn(ColumnDescription = "事件Id")]
+    public int? EventId { get; set; }
 
     /// <summary>
     /// 线程Id
     /// </summary>
     [SugarColumn(ColumnDescription = "线程Id")]
-    public int ThreadId { get; set; }
+    public int? ThreadId { get; set; }
 
     /// <summary>
     /// 请求跟踪Id
@@ -65,7 +52,14 @@ public class SysLogOp : EntityTenant
     public string? TraceId { get; set; }
 
     /// <summary>
-    /// 是否使用UTC时间戳
+    /// 异常信息
     /// </summary>
-    public bool UseUtcTimestamp { get; set; }
+    [SugarColumn(ColumnDescription = "异常信息", ColumnDataType = StaticConfig.CodeFirst_BigString)]
+    public string? Exception { get; set; }
+
+    /// <summary>
+    /// 日志消息Json
+    /// </summary>
+    [SugarColumn(ColumnDescription = "日志消息Json", ColumnDataType = StaticConfig.CodeFirst_BigString)]
+    public string? Message { get; set; }
 }

+ 46 - 12
Admin.NET/Admin.NET.Core/Entity/SysLogVis.cs

@@ -8,31 +8,59 @@
 public class SysLogVis : EntityTenant
 {
     /// <summary>
-    /// 是否执行成功(Y-是,N-否)
+    /// 模块名称
     /// </summary>
-    [SugarColumn(ColumnDescription = "是否执行成功")]
-    public YesNoEnum Success { get; set; }
+    [SugarColumn(ColumnDescription = "模块名称", Length = 256)]
+    [MaxLength(256)]
+    public string ControllerName { get; set; }
 
     /// <summary>
-    /// 具体消息
+    /// 方法名称 
+    ///</summary>
+    [SugarColumn(ColumnDescription = "方法名称", Length = 256)]
+    [MaxLength(256)]
+    public string ActionName { get; set; }
+
+    /// <summary>
+    /// 显示名称 
+    ///</summary>
+    [SugarColumn(ColumnDescription = "显示名称", Length = 256)]
+    [MaxLength(256)]
+    public string DisplayTitle { get; set; }
+
+    /// <summary>
+    /// 执行状态
     /// </summary>
-    [SugarColumn(ColumnDescription = "具体消息", ColumnDataType = StaticConfig.CodeFirst_BigString)]
-    public string? Message { get; set; }
+    [SugarColumn(ColumnDescription = "执行状态", Length = 32)]
+    [MaxLength(32)]
+    public string Status { get; set; }
 
     /// <summary>
     /// IP地址
     /// </summary>
     [SugarColumn(ColumnDescription = "IP地址", Length = 256)]
     [MaxLength(256)]
-    public string? Ip { get; set; }
+    public string? RemoteIp { get; set; }
 
     /// <summary>
-    /// 地址
+    /// 登录地点
     /// </summary>
-    [SugarColumn(ColumnDescription = "地址", Length = 128)]
+    [SugarColumn(ColumnDescription = "登录地点", Length = 128)]
     [MaxLength(128)]
     public string? Location { get; set; }
 
+    /// <summary>
+    /// 经度
+    /// </summary>
+    [SugarColumn(ColumnDescription = "经度")]
+    public double? Longitude { get; set; }
+
+    /// <summary>
+    /// 维度
+    /// </summary>
+    [SugarColumn(ColumnDescription = "维度")]
+    public double? Latitude { get; set; }
+
     /// <summary>
     /// 浏览器
     /// </summary>
@@ -48,10 +76,16 @@ public class SysLogVis : EntityTenant
     public string? Os { get; set; }
 
     /// <summary>
-    /// 访问类型
+    /// 操作用时
+    /// </summary>
+    [SugarColumn(ColumnDescription = "操作用时")]
+    public long Elapsed { get; set; }
+
+    /// <summary>
+    /// 日志时间
     /// </summary>
-    [SugarColumn(ColumnDescription = "访问类型")]
-    public LoginTypeEnum VisType { get; set; }
+    [SugarColumn(ColumnDescription = "日志时间")]
+    public DateTime LogDateTime { get; set; }
 
     /// <summary>
     /// 账号

+ 7 - 19
Admin.NET/Admin.NET.Core/Enum/LoginTypeEnum.cs

@@ -6,32 +6,20 @@
 public enum LoginTypeEnum
 {
     /// <summary>
-    /// 登录
+    /// PC登录
     /// </summary>
-    [Description("登录")]
+    [Description("PC登录")]
     Login = 1,
 
     /// <summary>
-    /// 退出
+    /// PC退出
     /// </summary>
-    [Description("退出")]
+    [Description("PC退出")]
     Logout = 2,
 
     /// <summary>
-    /// 注册
+    /// PC注册
     /// </summary>
-    [Description("注册")]
-    Register = 3,
-
-    /// <summary>
-    /// 改密
-    /// </summary>
-    [Description("改密")]
-    ChangePassword = 4,
-
-    /// <summary>
-    /// 三方授权登陆
-    /// </summary>
-    [Description("授权登陆")]
-    AuthorizedLogin = 5
+    [Description("PC注册")]
+    Register = 3
 }

+ 30 - 0
Admin.NET/Admin.NET.Core/EventBus/AppEventSubscriber.cs

@@ -0,0 +1,30 @@
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 事件订阅
+/// </summary>
+public class AppEventSubscriber : IEventSubscriber, ISingleton
+{
+    private readonly IServiceProvider _serviceProvider;
+
+    public AppEventSubscriber(IServiceProvider serviceProvider)
+    {
+        _serviceProvider = serviceProvider;
+    }
+
+    ///// <summary>
+    ///// 增加异常日志
+    ///// </summary>
+    ///// <param name="context"></param>
+    ///// <returns></returns>
+    //[EventSubscribe("Add:ExLog")]
+    //public async Task CreateExLog(EventHandlerExecutingContext context)
+    //{
+    //    using var scope = _serviceProvider.CreateScope();
+    //    var _rep = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysLogEx>>();
+    //    await _rep.InsertAsync((SysLogEx)context.Source.Payload);
+
+    //    // 发送邮件
+    //    await scope.ServiceProvider.GetRequiredService<SysMessageService>().SendEmail(JSON.Serialize(context.Source.Payload));
+    //}
+}

+ 0 - 56
Admin.NET/Admin.NET.Core/EventBus/LogEventSubscriber.cs

@@ -1,56 +0,0 @@
-namespace Admin.NET.Core;
-
-/// <summary>
-/// 日志事件订阅
-/// </summary>
-public class LogEventSubscriber : IEventSubscriber, ISingleton
-{
-    private readonly IServiceProvider _serviceProvider;
-
-    public LogEventSubscriber(IServiceProvider serviceProvider)
-    {
-        _serviceProvider = serviceProvider;
-    }
-
-    /// <summary>
-    /// 增加操作日志
-    /// </summary>
-    /// <param name="context"></param>
-    /// <returns></returns>
-    [EventSubscribe("Add:OpLog")]
-    public async Task CreateOpLog(EventHandlerExecutingContext context)
-    {
-        using var scope = _serviceProvider.CreateScope();
-        var _rep = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysLogOp>>();
-        await _rep.InsertAsync((SysLogOp)context.Source.Payload);
-    }
-
-    /// <summary>
-    /// 增加异常日志
-    /// </summary>
-    /// <param name="context"></param>
-    /// <returns></returns>
-    [EventSubscribe("Add:ExLog")]
-    public async Task CreateExLog(EventHandlerExecutingContext context)
-    {
-        using var scope = _serviceProvider.CreateScope();
-        var _rep = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysLogEx>>();
-        await _rep.InsertAsync((SysLogEx)context.Source.Payload);
-
-        // 发送邮件
-        await scope.ServiceProvider.GetRequiredService<SysMessageService>().SendEmail(JSON.Serialize(context.Source.Payload));
-    }
-
-    /// <summary>
-    /// 增加访问日志
-    /// </summary>
-    /// <param name="context"></param>
-    /// <returns></returns>
-    [EventSubscribe("Add:VisLog")]
-    public async Task CreateVisLog(EventHandlerExecutingContext context)
-    {
-        using var scope = _serviceProvider.CreateScope();
-        var _rep = scope.ServiceProvider.GetRequiredService<SqlSugarRepository<SysLogVis>>();
-        await _rep.InsertAsync((SysLogVis)context.Source.Payload);
-    }
-}

+ 0 - 1
Admin.NET/Admin.NET.Core/Job/LogJob.cs

@@ -22,7 +22,6 @@ public class LogJob : IJob
         var daysAgo = 30; // 删除30天以前
         await db.Deleteable<SysLogVis>().Where(u => (DateTime)u.CreateTime < DateTime.Now.AddDays(-daysAgo)).ExecuteCommandAsync(); // 删除访问日志
         await db.Deleteable<SysLogOp>().Where(u => (DateTime)u.CreateTime < DateTime.Now.AddDays(-daysAgo)).ExecuteCommandAsync(); // 删除操作日志
-        await db.Deleteable<SysLogEx>().Where(u => (DateTime)u.CreateTime < DateTime.Now.AddDays(-daysAgo)).ExecuteCommandAsync(); // 删除异常日志
         await db.Deleteable<SysLogDiff>().Where(u => (DateTime)u.CreateTime < DateTime.Now.AddDays(-daysAgo)).ExecuteCommandAsync(); // 删除差异日志
     }
 }

+ 86 - 26
Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs

@@ -1,53 +1,113 @@
-namespace Admin.NET.Core;
+using IPTools.Core;
+
+namespace Admin.NET.Core;
 
 /// <summary>
 /// 数据库日志写入器
 /// </summary>
 public class DatabaseLoggingWriter : IDatabaseLoggingWriter
 {
-    private readonly SqlSugarRepository<SysLogOp> _sysLogOpRep; // 操作日志
-    private readonly SqlSugarRepository<SysLogEx> _sysLogExRep; // 异常日志
+    private readonly SqlSugarRepository<SysLogVis> _sysLogVisRep; // 访问日志
+    private readonly SqlSugarRepository<SysLogOp> _sysLogOpRep;   // 操作日志
 
-    public DatabaseLoggingWriter(SqlSugarRepository<SysLogOp> sysLogOpRep,
-        SqlSugarRepository<SysLogEx> sysLogExRep)
+    public DatabaseLoggingWriter(SqlSugarRepository<SysLogVis> sysLogVisRep,
+        SqlSugarRepository<SysLogOp> sysLogOpRep)
     {
+        _sysLogVisRep = sysLogVisRep;
         _sysLogOpRep = sysLogOpRep;
-        _sysLogExRep = sysLogExRep;
     }
 
-    public void Write(LogMessage logMsg, bool flush)
+    public async void Write(LogMessage logMsg, bool flush)
     {
-        if (logMsg.LogLevel == Microsoft.Extensions.Logging.LogLevel.Information)
+        var jsonStr = logMsg.Context.Get("loggingMonitor").ToString();
+        dynamic loggingMonitor = JsonConvert.DeserializeObject(jsonStr);
+
+        // 不记录数据校验日志
+        if (loggingMonitor.Validation != null) return;
+
+        string remoteIPv4 = loggingMonitor.remoteIPv4;
+        (string ipLocation, double? longitude, double? latitude) = GetIpAddress(remoteIPv4);
+
+        // 获取当前操作者
+        var account = "";
+        var realName = "";
+        foreach (var item in loggingMonitor.authorizationClaims)
         {
-            _sysLogOpRep.Insert(new SysLogOp
+            if (item.type == ClaimConst.Account)
+                account = item.value;
+            if (item.type == ClaimConst.RealName)
+                realName = item.value;
+        }
+
+        if (loggingMonitor.actionName == "login")
+        {
+            _sysLogVisRep.Insert(new SysLogVis
             {
-                LogName = logMsg.LogName,
-                LogLevel = logMsg.LogLevel.ToString(),
-                EventId = logMsg.EventId.Id.ToString(),
-                Message = logMsg.Message,
-                Exception = logMsg.Exception?.ToString(),
-                State = logMsg.State?.ToString(),
+                ControllerName = loggingMonitor.controllerName,
+                ActionName = loggingMonitor.actionName,
+                DisplayTitle = loggingMonitor.displayTitle,
+                Status = loggingMonitor.returnInformation.httpStatusCode,
+                RemoteIp = remoteIPv4,
+                Location = ipLocation,
+                Longitude = longitude,
+                Latitude = latitude,
+                Browser = loggingMonitor.userAgent,
+                Os = loggingMonitor.osDescription + " " + loggingMonitor.osArchitecture,
+                Elapsed = loggingMonitor.timeOperationElapsedMilliseconds,
                 LogDateTime = logMsg.LogDateTime,
-                ThreadId = logMsg.ThreadId,
-                TraceId = logMsg.TraceId,
-                UseUtcTimestamp = logMsg.UseUtcTimestamp,
+                Account = account,
+                RealName = realName
             });
         }
         else
         {
-            _sysLogExRep.Insert(new SysLogEx
+            _sysLogOpRep.Insert(new SysLogOp
             {
-                LogName = logMsg.LogName,
-                LogLevel = logMsg.LogLevel.ToString(),
-                EventId = logMsg.EventId.Id.ToString(),
-                Message = logMsg.Message,
-                Exception = logMsg.Exception?.ToString(),
-                State = logMsg.State?.ToString(),
+                ControllerName = loggingMonitor.controllerName,
+                ActionName = loggingMonitor.actionName,
+                DisplayTitle = loggingMonitor.displayTitle,
+                Status = loggingMonitor.returnInformation.httpStatusCode,
+                RemoteIp = remoteIPv4,
+                Location = ipLocation,
+                Longitude = longitude,
+                Latitude = latitude,
+                Browser = loggingMonitor.userAgent,
+                Os = loggingMonitor.osDescription + " " + loggingMonitor.osArchitecture,
+                Elapsed = loggingMonitor.timeOperationElapsedMilliseconds,
                 LogDateTime = logMsg.LogDateTime,
+                Account = account,
+                RealName = realName,
+                HttpMethod = loggingMonitor.httpMethod,
+                RequestUrl = loggingMonitor.requestUrl,
+                RequestParam = (loggingMonitor.parameters == null || loggingMonitor.parameters.Count == 0) ? null : JsonConvert.SerializeObject(loggingMonitor.parameters[0].value),
+                ReturnResult = JsonConvert.SerializeObject(loggingMonitor.returnInformation.value),
+                EventId = logMsg.EventId.Id,
                 ThreadId = logMsg.ThreadId,
                 TraceId = logMsg.TraceId,
-                UseUtcTimestamp = logMsg.UseUtcTimestamp,
+                Exception = loggingMonitor.exception,
+                Message = logMsg.Message
             });
         }
+
+        // 异常时发送邮件
+        if (logMsg.Exception != null)
+            await App.GetRequiredService<SysMessageService>().SendEmail(loggingMonitor.exception);
+    }
+
+    /// <summary>
+    /// 解析IP地址
+    /// </summary>
+    /// <param name="ip"></param>
+    /// <returns></returns>
+    private static (string ipLocation, double? longitude, double? latitude) GetIpAddress(string ip)
+    {
+        try
+        {
+            var ipInfo = IpTool.Search(ip);
+            var addressList = new List<string>() { ipInfo.Country, ipInfo.Province, ipInfo.City, ipInfo.NetworkOperator };
+            return (string.Join("|", addressList.Where(it => it != "0").ToList()), ipInfo.Longitude, ipInfo.Latitude); // 去掉0并用|连接
+        }
+        catch { }
+        return ("未知", 0, 0);
     }
 }

+ 3 - 14
Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs

@@ -16,19 +16,8 @@ public class ElasticSearchLoggingWriter : IDatabaseLoggingWriter
 
     public void Write(LogMessage logMsg, bool flush)
     {
-        var document = new SysLogOp
-        {
-            LogName = logMsg.LogName,
-            LogLevel = logMsg.LogLevel.ToString(),
-            EventId = logMsg.EventId.Id.ToString(),
-            Message = logMsg.Message,
-            Exception = logMsg.Exception?.ToString(),
-            State = logMsg.State?.ToString(),
-            LogDateTime = logMsg.LogDateTime,
-            ThreadId = logMsg.ThreadId,
-            TraceId = logMsg.TraceId,
-            UseUtcTimestamp = logMsg.UseUtcTimestamp,
-        };
-        _esClient.IndexDocument(document);
+        var jsonStr = logMsg.Context.Get("loggingMonitor").ToString();
+        // dynamic loggingMonitor = JsonConvert.DeserializeObject(jsonStr);
+        _esClient.IndexDocument(jsonStr);
     }
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/SeedData/SysConfigSeedData.cs

@@ -20,7 +20,7 @@ public class SysConfigSeedData : ISqlSugarEntitySeedData<SysConfig>
             new SysConfig{ Id=1300000000104, Name="操作日志", Code="sys_oplog", Value="True", SysFlag=YesNoEnum.Y, Remark="开启操作日志", OrderNo=4, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysConfig{ Id=1300000000105, Name="单点登录", Code="sys_single_login", Value="True", SysFlag=YesNoEnum.Y, Remark="开启单点登录", OrderNo=5, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysConfig{ Id=1300000000106, Name="登录二次验证", Code="sys_second_ver", Value="True", SysFlag=YesNoEnum.Y, Remark="登录二次验证", OrderNo=6, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
-            new SysConfig{ Id=1300000000107, Name="开启图形验证码", Code="sys_captcha", Value="True", SysFlag=YesNoEnum.Y, Remark="开启图形验证码", OrderNo=7, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
+            new SysConfig{ Id=1300000000107, Name="开启图形验证码", Code="sys_captcha", Value="false", SysFlag=YesNoEnum.Y, Remark="开启图形验证码", OrderNo=7, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysConfig{ Id=1300000000108, Name="开启水印", Code="sys_wartermark", Value="True", SysFlag=YesNoEnum.Y, Remark="开启水印", OrderNo=8, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
         };
     }

+ 16 - 14
Admin.NET/Admin.NET.Core/Service/ApiJson/SelectTable.cs

@@ -83,14 +83,16 @@ public class SelectTable : ISingleton
     }
 
     /// <summary>
-    ///
+    /// 
     /// </summary>
     /// <param name="subtable"></param>
     /// <param name="page"></param>
     /// <param name="count"></param>
+    /// <param name="query"></param>
     /// <param name="json"></param>
     /// <param name="dd"></param>
     /// <returns></returns>
+    /// <exception cref="Exception"></exception>
     public Tuple<dynamic, int> GetTableData(string subtable, int page, int count, int query, string json, JObject dd)
     {
         var role = _identitySvc.GetSelectRole(subtable);
@@ -179,7 +181,7 @@ public class SelectTable : ISingleton
     /// <returns></returns>
     public JObject Query(string queryJson)
     {
-        JObject resultObj = new JObject();
+        JObject resultObj = new();
 
         try
         {
@@ -203,7 +205,7 @@ public class SelectTable : ISingleton
     /// <returns></returns>
     public JObject QuerySingle(JObject queryObj, string nodeName = "infos")
     {
-        JObject resultObj = new JObject();
+        JObject resultObj = new();
         resultObj.Add("code", "200");
         resultObj.Add("msg", "success");
         try
@@ -261,7 +263,7 @@ public class SelectTable : ISingleton
     /// <returns></returns>
     public JObject Query(JObject queryObj)
     {
-        JObject resultObj = new JObject();
+        JObject resultObj = new();
         resultObj.Add("code", "200");
         resultObj.Add("msg", "success");
         try
@@ -376,7 +378,7 @@ public class SelectTable : ISingleton
         var query = jb["query"] == null ? 0 : int.Parse(jb["query"].ToString());
         jb.Remove("page"); jb.Remove("count"); jb.Remove("query");
         var htt = new JArray();
-        List<string> tables = new List<string>(), where = new List<string>();
+        List<string> tables = new(), where = new();
         foreach (var t in jb)
         {
             tables.Add(t.Key); where.Add(t.Value.ToString());
@@ -468,7 +470,7 @@ public class SelectTable : ISingleton
             tb.Select(selectrole);
         }
 
-        List<IConditionalModel> conModels = new List<IConditionalModel>();
+        List<IConditionalModel> conModels = new();
         if (!values["identity"].IsNullOrEmpty())
         {
             conModels.Add(new ConditionalModel() { FieldName = values["identity"].ToString(), ConditionalType = ConditionalType.Equal, FieldValue = _identitySvc.GetUserIdentity() });
@@ -566,8 +568,8 @@ public class SelectTable : ISingleton
     {
         if (!values["@having"].IsNullOrEmpty())
         {
-            List<IConditionalModel> hw = new List<IConditionalModel>();
-            List<string> havingItems = new List<string>();
+            List<IConditionalModel> hw = new();
+            List<string> havingItems = new();
             if (values["@having"].HasValues)
             {
                 havingItems = values["@having"].Select(p => p.ToString()).ToList();
@@ -592,13 +594,13 @@ public class SelectTable : ISingleton
                     model.ConditionalType = ConditionalType.LessThanOrEqual;
                     model.FieldValue = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[1];
                 }
-                else if (and.Contains(">"))
+                else if (and.Contains('>'))
                 {
                     model.FieldName = and.Split(new string[] { ">" }, StringSplitOptions.RemoveEmptyEntries)[0];
                     model.ConditionalType = ConditionalType.GreaterThan;
                     model.FieldValue = and.Split(new string[] { ">" }, StringSplitOptions.RemoveEmptyEntries)[1];
                 }
-                else if (and.Contains("<"))
+                else if (and.Contains('<'))
                 {
                     model.FieldName = and.Split(new string[] { "<" }, StringSplitOptions.RemoveEmptyEntries)[0];
                     model.ConditionalType = ConditionalType.LessThan;
@@ -610,7 +612,7 @@ public class SelectTable : ISingleton
                     model.ConditionalType = ConditionalType.NoEqual;
                     model.FieldValue = and.Split(new string[] { "!=" }, StringSplitOptions.RemoveEmptyEntries)[1];
                 }
-                else if (and.Contains("="))
+                else if (and.Contains('='))
                 {
                     model.FieldName = and.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries)[0];
                     model.ConditionalType = ConditionalType.Equal;
@@ -681,7 +683,7 @@ public class SelectTable : ISingleton
         string field = vakey.TrimEnd("{}".ToCharArray());
         if (va.Value.HasValues)
         {
-            List<string> inValues = new List<string>();
+            List<string> inValues = new();
             foreach (var cm in va.Value)
             {
                 inValues.Add(cm.ToString());
@@ -727,7 +729,7 @@ public class SelectTable : ISingleton
     {
         string vakey = va.Key.Trim();
         string field = vakey.TrimEnd("%".ToCharArray());
-        List<string> inValues = new List<string>();
+        List<string> inValues = new();
 
         if (va.Value.HasValues)
         {
@@ -792,7 +794,7 @@ public class SelectTable : ISingleton
         }
     }
 
-    public string ReplaceSQLChar(string str)
+    public static string ReplaceSQLChar(string str)
     {
         if (str == String.Empty)
             return String.Empty;

+ 15 - 42
Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs

@@ -14,7 +14,6 @@ public class SysAuthService : IDynamicApiController, ITransient
     private readonly SqlSugarRepository<SysUser> _sysUserRep;
     private readonly RefreshTokenOptions _refreshTokenOptions;
     private readonly IHttpContextAccessor _httpContextAccessor;
-    private readonly IEventPublisher _eventPublisher;
     private readonly SysMenuService _sysMenuService;
     private readonly SysOnlineUserService _sysOnlineUserService;
     private readonly SysConfigService _sysConfigService;
@@ -25,7 +24,6 @@ public class SysAuthService : IDynamicApiController, ITransient
         SqlSugarRepository<SysUser> sysUserRep,
         IOptions<RefreshTokenOptions> refreshTokenOptions,
         IHttpContextAccessor httpContextAccessor,
-        IEventPublisher eventPublisher,
         SysMenuService sysMenuService,
         SysOnlineUserService sysOnlineUserService,
         SysConfigService sysConfigService,
@@ -36,7 +34,6 @@ public class SysAuthService : IDynamicApiController, ITransient
         _sysUserRep = sysUserRep;
         _httpContextAccessor = httpContextAccessor;
         _refreshTokenOptions = refreshTokenOptions.Value;
-        _eventPublisher = eventPublisher;
         _sysMenuService = sysMenuService;
         _sysOnlineUserService = sysOnlineUserService;
         _sysConfigService = sysConfigService;
@@ -50,9 +47,9 @@ public class SysAuthService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <remarks>用户名/密码:superadmin/123456</remarks>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Login")]
     [AllowAnonymous]
-    [SuppressMonitor]
+    [ApiDescriptionSettings(Name = "Login")]
+    [DisplayName("登录系统")]
     public async Task<LoginOutput> Login([Required] LoginInput input)
     {
         //// 可以根据域名获取具体租户
@@ -126,6 +123,7 @@ public class SysAuthService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "UserInfo")]
+    [DisplayName("获取登录账号信息")]
     public async Task<LoginUserOutput> GetUserInfo()
     {
         var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);
@@ -138,25 +136,6 @@ public class SysAuthService : IDynamicApiController, ITransient
         // 按钮权限集合
         var buttons = await _sysMenuService.GetBtnPermissionList();
 
-        // 登录日志
-        var ip = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4();
-        var client = Parser.GetDefault().Parse(_httpContextAccessor.HttpContext.Request.Headers["User-Agent"]);
-        //var ipInfo = IpTool.Search(ip);
-        //var address = ipInfo.Country + ipInfo.Province + ipInfo.City + "[" + ipInfo.NetworkOperator + "][" + ipInfo.Latitude + ipInfo.Longitude + "]";
-        await _eventPublisher.PublishAsync("Add:VisLog", new SysLogVis
-        {
-            Success = YesNoEnum.Y,
-            Message = "登录",
-            Ip = ip,
-            //Location = address,
-            Browser = client.UA.Family + client.UA.Major,
-            Os = client.OS.Family + client.OS.Major,
-            VisType = LoginTypeEnum.Login,
-            Account = user.Account,
-            RealName = user.RealName,
-            TenantId = user.TenantId,
-        });
-
         return new LoginUserOutput
         {
             Account = user.Account,
@@ -177,6 +156,7 @@ public class SysAuthService : IDynamicApiController, ITransient
     /// <param name="accessToken"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "RefreshToken")]
+    [DisplayName("获取刷新Token")]
     public string GetRefreshToken([Required] string accessToken)
     {
         return JWTEncryption.GenerateRefreshToken(accessToken, _refreshTokenOptions.ExpiredTime);
@@ -186,33 +166,23 @@ public class SysAuthService : IDynamicApiController, ITransient
     /// 退出系统
     /// </summary>
     [ApiDescriptionSettings(Name = "Logout")]
-    public async void Logout()
+    [DisplayName("退出系统")]
+    public void Logout()
     {
         if (string.IsNullOrWhiteSpace(_userManager.Account))
             throw Oops.Oh(ErrorCodeEnum.D1011);
 
-        // 置响应报文头
+        // 置响应报文头
         _httpContextAccessor.HttpContext.SetTokensOfResponseHeaders(null, null);
-
-        // 退出日志
-        await _eventPublisher.PublishAsync("Add:VisLog", new SysLogVis
-        {
-            Success = YesNoEnum.Y,
-            Message = "退出",
-            VisType = LoginTypeEnum.Logout,
-            Ip = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4(),
-            Account = _userManager.Account,
-            RealName = _userManager.RealName
-        });
     }
 
     /// <summary>
     /// 获取登录配置
     /// </summary>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "LoginConfig")]
     [AllowAnonymous]
-    [SuppressMonitor]
+    [ApiDescriptionSettings(Name = "LoginConfig")]
+    [DisplayName("获取登录配置")]
     public async Task<dynamic> GetLoginConfig()
     {
         var secondVerEnabled = await _sysConfigService.GetConfigValue<bool>(CommonConst.SysSecondVer);
@@ -225,9 +195,10 @@ public class SysAuthService : IDynamicApiController, ITransient
     /// 获取验证码
     /// </summary>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Captcha")]
     [AllowAnonymous]
     [SuppressMonitor]
+    [ApiDescriptionSettings(Name = "Captcha")]
+    [DisplayName("获取验证码")]
     public dynamic GetCaptcha()
     {
         var codeId = YitIdHelper.NextId();
@@ -239,8 +210,9 @@ public class SysAuthService : IDynamicApiController, ITransient
     /// swagger登录检查
     /// </summary>
     /// <returns></returns>
-    [HttpPost("/api/swagger/checkUrl"), NonUnify]
     [AllowAnonymous]
+    [HttpPost("/api/swagger/checkUrl"), NonUnify]
+    [DisplayName("swagger登录检查")]
     public int SwaggerCheckUrl()
     {
         return _cache.Get<bool>(CacheConst.SwaggerLogin) ? 200 : 401;
@@ -251,8 +223,9 @@ public class SysAuthService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="auth"></param>
     /// <returns></returns>
-    [HttpPost("/api/swagger/submitUrl"), NonUnify]
     [AllowAnonymous]
+    [HttpPost("/api/swagger/submitUrl"), NonUnify]
+    [DisplayName("swagger登录提交")]
     public int SwaggerSubmitUrl([FromForm] SpecificationAuth auth)
     {
         var userName = App.GetConfig<string>("SpecificationDocumentSettings:LoginInfo:UserName");

+ 4 - 0
Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs

@@ -18,6 +18,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "KeyList")]
+    [DisplayName("获取缓存键名集合")]
     public List<string> GetKeyList()
     {
         return _cache.Keys.ToList();
@@ -66,6 +67,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
     /// <param name="key"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除缓存")]
     public void Remove(string key)
     {
         _cache.Remove(key);
@@ -88,6 +90,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
     /// <param name="prefixKey">键名前缀</param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "DeleteByPreKey")]
+    [DisplayName("根据键名前缀删除缓存")]
     public int RemoveByPrefixKey(string prefixKey)
     {
         var delKeys = _cache.Keys.Where(u => u.StartsWith(prefixKey)).ToArray();
@@ -101,6 +104,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
     /// <param name="key"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Value")]
+    [DisplayName("获取缓存值")]
     public dynamic GetValue(string key)
     {
         return _cache.Get<dynamic>(key);

+ 3 - 0
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs

@@ -19,6 +19,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取代码生成配置列表")]
     public async Task<List<CodeGenConfig>> GetList([FromQuery] CodeGenConfig input)
     {
         return await _db.Queryable<SysCodeGenConfig>()
@@ -32,6 +33,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
     /// <param name="inputList"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新代码生成配置")]
     public async Task UpdateCodeGenConfig(List<CodeGenConfig> inputList)
     {
         if (inputList == null || inputList.Count < 1) return;
@@ -55,6 +57,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Detail")]
+    [DisplayName("获取代码生成配置详情")]
     public async Task<SysCodeGenConfig> GetDetail([FromQuery] CodeGenConfig input)
     {
         return await _db.Queryable<SysCodeGenConfig>().FirstAsync(u => u.Id == input.Id);

+ 9 - 0
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -32,6 +32,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取代码生成分页列表")]
     public async Task<SqlSugarPagedList<SysCodeGen>> GetPage([FromQuery] CodeGenInput input)
     {
         return await _db.Queryable<SysCodeGen>()
@@ -46,6 +47,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加代码生成")]
     public async Task AddCodeGen(AddCodeGenInput input)
     {
         var isExist = await _db.Queryable<SysCodeGen>().Where(u => u.TableName == input.TableName).AnyAsync();
@@ -64,6 +66,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新代码生成")]
     public async Task UpdateCodeGen(UpdateCodeGenInput input)
     {
         var isExist = await _db.Queryable<SysCodeGen>().AnyAsync(u => u.TableName == input.TableName && u.Id != input.Id);
@@ -79,6 +82,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     /// <param name="inputs"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除代码生成")]
     public async Task DeleteCodeGen(List<DeleteCodeGenInput> inputs)
     {
         if (inputs == null || inputs.Count < 1) return;
@@ -100,6 +104,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Detail")]
+    [DisplayName("获取代码生成详情")]
     public async Task<SysCodeGen> GetDetail([FromQuery] QueryCodeGenInput input)
     {
         return await _db.Queryable<SysCodeGen>().SingleAsync(m => m.Id == input.Id);
@@ -110,6 +115,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "DatabaseList")]
+    [DisplayName("获取数据库库集合")]
     public async Task<List<DatabaseOutput>> GetDatabaseList()
     {
         var dbCongigs = App.GetOptions<DbConnectionOptions>().ConnectionConfigs;
@@ -121,6 +127,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "TableList")]
+    [DisplayName("获取数据库表(实体)集合")]
     public async Task<List<TableOutput>> GetTableList(string configId = SqlSugarConst.ConfigId)
     {
         var provider = _db.AsTenant().GetConnectionScope(configId);
@@ -144,6 +151,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "ColumnListByTableName")]
+    [DisplayName("根据表名获取列集合")]
     public List<ColumnOuput> GetColumnListByTableName([Required] string tableName, string configId = SqlSugarConst.ConfigId)
     {
         // 切库---多库代码生成用
@@ -195,6 +203,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "RunLocal")]
+    [DisplayName("代码生成到本地")]
     public async Task RunLocal(SysCodeGen input)
     {
         // 先删除该表已生成的菜单列表

+ 6 - 0
Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs

@@ -22,6 +22,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取参数配置分页列表")]
     public async Task<SqlSugarPagedList<SysConfig>> GetPage([FromQuery] PageConfigInput input)
     {
         return await _sysConfigRep.AsQueryable()
@@ -36,6 +37,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取参数配置列表")]
     public async Task<List<SysConfig>> GetList()
     {
         return await _sysConfigRep.GetListAsync();
@@ -47,6 +49,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加参数配置")]
     public async Task AddConfig(AddConfigInput input)
     {
         var isExist = await _sysConfigRep.IsAnyAsync(u => u.Name == input.Name || u.Code == input.Code);
@@ -62,6 +65,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新参数配置")]
     public async Task UpdateConfig(UpdateConfigInput input)
     {
         var isExist = await _sysConfigRep.IsAnyAsync(u => (u.Name == input.Name || u.Code == input.Code) && u.Id != input.Id);
@@ -80,6 +84,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除参数配置")]
     public async Task DeleteConfig(DeleteConfigInput input)
     {
         var config = await _sysConfigRep.GetFirstAsync(u => u.Id == input.Id);
@@ -97,6 +102,7 @@ public class SysConfigService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Detail")]
+    [DisplayName("获取参数配置详情")]
     public async Task<SysConfig> GetDetail([FromQuery] ConfigInput input)
     {
         return await _sysConfigRep.GetFirstAsync(u => u.Id == input.Id);

+ 2 - 0
Admin.NET/Admin.NET.Core/Service/Const/SysConstService.cs

@@ -19,6 +19,7 @@ public class SysConstService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取所有常量列表")]
     public async Task<List<ConstOutput>> GetList()
     {
         var key = $"{CacheConst.KeyConst}list";
@@ -43,6 +44,7 @@ public class SysConstService : IDynamicApiController, ITransient
     /// <param name="typeName"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Data")]
+    [DisplayName("根据类名获取常量数据")]
     public async Task<List<ConstOutput>> GetData([Required] string typeName)
     {
         var key = $"{CacheConst.KeyConst}{typeName.ToUpper()}";

+ 11 - 1
Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs

@@ -24,6 +24,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取库列表")]
     public List<dynamic> GetList()
     {
         return App.GetOptions<DbConnectionOptions>().ConnectionConfigs.Select(u => u.ConfigId).ToList();
@@ -35,8 +36,9 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     /// <param name="tableName">表名</param>
     /// <param name="configId">ConfigId</param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "ColumnList")]
     [AllowAnonymous]
+    [ApiDescriptionSettings(Name = "ColumnList")]
+    [DisplayName("获取字段列表")]
     public List<DbColumnOutput> GetColumnList(string tableName, string configId = SqlSugarConst.ConfigId)
     {
         var db = _db.AsTenant().GetConnectionScope(configId);
@@ -51,6 +53,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     [ApiDescriptionSettings(Name = "AddColumn")]
+    [DisplayName("增加列")]
     public void AddColumn(DbColumnInput input)
     {
         var column = new DbColumnInfo
@@ -76,6 +79,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     [ApiDescriptionSettings(Name = "DeleteColumn")]
+    [DisplayName("删除列")]
     public void DeleteColumn(DeleteDbColumnInput input)
     {
         var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
@@ -87,6 +91,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     [ApiDescriptionSettings(Name = "UpdateColumn")]
+    [DisplayName("编辑列")]
     public void UpdateColumn(UpdateDbColumnInput input)
     {
         var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
@@ -102,6 +107,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     /// <param name="configId">ConfigId</param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "TableList")]
+    [DisplayName("获取表列表")]
     public List<DbTableInfo> GetTableList(string configId = SqlSugarConst.ConfigId)
     {
         var db = _db.AsTenant().GetConnectionScope(configId);
@@ -113,6 +119,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     [ApiDescriptionSettings(Name = "AddTable")]
+    [DisplayName("增加表")]
     public void AddTable(DbTableInput input)
     {
         var columns = new List<DbColumnInfo>();
@@ -159,6 +166,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     [ApiDescriptionSettings(Name = "DeleteTable")]
+    [DisplayName("删除表")]
     public void DeleteTable(DeleteDbTableInput input)
     {
         var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
@@ -170,6 +178,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     [ApiDescriptionSettings(Name = "UpdateTable")]
+    [DisplayName("编辑表")]
     public void UpdateTable(UpdateDbTableInput input)
     {
         var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
@@ -184,6 +193,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     [ApiDescriptionSettings(Name = "CreateEntity")]
+    [DisplayName("创建实体")]
     public void CreateEntity(CreateEntityInput input)
     {
         input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Admin.NET.Application" : input.Position;

+ 9 - 0
Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs

@@ -20,6 +20,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取字典值分页列表")]
     public async Task<SqlSugarPagedList<SysDictData>> GetPage([FromQuery] PageDictDataInput input)
     {
         var code = !string.IsNullOrEmpty(input.Code?.Trim());
@@ -37,6 +38,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取字典值列表")]
     public async Task<List<SysDictData>> GetList([FromQuery] GetDataDictDataInput input)
     {
         return await GetDictDataListByDictTypeId(input.DictTypeId);
@@ -48,6 +50,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加字典值")]
     public async Task AddDictData(AddDictDataInput input)
     {
         var isExist = await _sysDictDataRep.IsAnyAsync(u => (u.Code == input.Code || u.Value == input.Value) && u.DictTypeId == input.DictTypeId);
@@ -63,6 +66,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新字典值")]
     public async Task UpdateDictData(UpdateDictDataInput input)
     {
         var isExist = await _sysDictDataRep.IsAnyAsync(u => u.Id == input.Id);
@@ -80,6 +84,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除字典值")]
     public async Task DeleteDictData(DeleteDictDataInput input)
     {
         var dictData = await _sysDictDataRep.GetFirstAsync(u => u.Id == input.Id);
@@ -95,6 +100,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Detail")]
+    [DisplayName("获取字典值详情")]
     public async Task<SysDictData> GetDetail([FromQuery] DictDataInput input)
     {
         return await _sysDictDataRep.GetFirstAsync(u => u.Id == input.Id);
@@ -106,6 +112,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SetStatus")]
+    [DisplayName("修改字典值状态")]
     public async Task SetStatus(DictDataInput input)
     {
         var dictData = await _sysDictDataRep.GetFirstAsync(u => u.Id == input.Id);
@@ -138,6 +145,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// <param name="code"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "DataList")]
+    [DisplayName("根据字典类型编码获取字典值集合")]
     public async Task<dynamic> GetDataList([Required] string code)
     {
         return await _sysDictDataRep.Context.Queryable<SysDictType>()
@@ -156,6 +164,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "DataList")]
+    [DisplayName("根据查询条件获取字典值集合")]
     public async Task<dynamic> GetDataList([FromQuery] QueryDictDataInput input)
     {
         return await _sysDictDataRep.Context.Queryable<SysDictType>()

+ 9 - 1
Admin.NET/Admin.NET.Core/Service/Dict/SysDictTypeService.cs

@@ -22,6 +22,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取字典类型分页列表")]
     public async Task<SqlSugarPagedList<SysDictType>> GetPage([FromQuery] PageDictTypeInput input)
     {
         var code = !string.IsNullOrEmpty(input.Code?.Trim());
@@ -38,6 +39,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取字典类型列表")]
     public async Task<List<SysDictType>> GetList()
     {
         return await _sysDictTypeRep.AsQueryable().OrderBy(u => u.OrderNo).ToListAsync();
@@ -48,8 +50,9 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "DataList")]
     [AllowAnonymous]
+    [ApiDescriptionSettings(Name = "DataList")]
+    [DisplayName("获取字典类型-值列表")]
     public async Task<List<SysDictData>> GetDataList([FromQuery] GetDataDictTypeInput input)
     {
         var dictType = await _sysDictTypeRep.GetFirstAsync(u => u.Code == input.Code);
@@ -64,6 +67,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("添加字典类型")]
     public async Task AddDictType(AddDictTypeInput input)
     {
         var isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Name == input.Name || u.Code == input.Code);
@@ -79,6 +83,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新字典类型")]
     public async Task UpdateDictType(UpdateDictTypeInput input)
     {
         var isExist = await _sysDictTypeRep.IsAnyAsync(u => u.Id == input.Id);
@@ -98,6 +103,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除字典类型")]
     public async Task DeleteDictType(DeleteDictTypeInput input)
     {
         var dictType = await _sysDictTypeRep.GetFirstAsync(u => u.Id == input.Id);
@@ -115,6 +121,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Detail")]
+    [DisplayName("获取字典类型详情")]
     public async Task<SysDictType> GetDetail([FromQuery] DictTypeInput input)
     {
         return await _sysDictTypeRep.GetFirstAsync(u => u.Id == input.Id);
@@ -126,6 +133,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SetStatus")]
+    [DisplayName("修改字典类型状态")]
     public async Task SetStatus(DictTypeInput input)
     {
         var dictType = await _sysDictTypeRep.GetFirstAsync(u => u.Id == input.Id);

+ 7 - 0
Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs

@@ -38,6 +38,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取文件分页列表")]
     public async Task<SqlSugarPagedList<SysFile>> GetPage([FromQuery] PageFileInput input)
     {
         return await _sysFileRep.AsQueryable()
@@ -55,6 +56,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="path"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "UploadFile")]
+    [DisplayName("上传文件")]
     public async Task<FileOutput> UploadFile([Required] IFormFile file, [FromQuery] string? path)
     {
         var sysFile = await HandleUploadFile(file, path);
@@ -74,6 +76,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="files"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "UploadFiles")]
+    [DisplayName("上传多文件")]
     public async Task<List<FileOutput>> UploadFiles([Required] List<IFormFile> files)
     {
         var filelist = new List<FileOutput>();
@@ -90,6 +93,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "DownloadFile")]
+    [DisplayName("下载文件(文件流)")]
     public async Task<IActionResult> DownloadFile(FileInput input)
     {
         var file = await GetFile(input);
@@ -114,6 +118,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除文件")]
     public async Task DeleteFile(DeleteFileInput input)
     {
         var file = await _sysFileRep.GetFirstAsync(u => u.Id == input.Id);
@@ -265,6 +270,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="file"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "UploadAvatar")]
+    [DisplayName("上传头像")]
     public async Task<FileOutput> UploadAvatar([Required] IFormFile file)
     {
         var sysUserRep = _sysFileRep.ChangeRepository<SqlSugarRepository<SysUser>>();
@@ -287,6 +293,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="file"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "UploadSignature")]
+    [DisplayName("上传电子签名")]
     public async Task<FileOutput> UploadSignature([Required] IFormFile file)
     {
         var sysUserRep = _sysFileRep.ChangeRepository<SqlSugarRepository<SysUser>>();

+ 17 - 0
Admin.NET/Admin.NET.Core/Service/Job/SysJobService.cs

@@ -26,6 +26,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// 获取作业分页列表
     /// </summary>
     [ApiDescriptionSettings(Name = "PageJobDetail")]
+    [DisplayName("获取作业分页列表")]
     public async Task<SqlSugarPagedList<JobOutput>> GetPageJobDetail([FromQuery] PageJobInput input)
     {
         var jobDetails = await _sysJobDetailRep.AsQueryable()
@@ -57,6 +58,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "AddJobDetail")]
+    [DisplayName("添加作业")]
     public async Task AddJobDetail(AddJobDetailInput input)
     {
         var isExist = await _sysJobDetailRep.IsAnyAsync(u => u.JobId == input.JobId && u.Id != input.Id);
@@ -79,6 +81,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "UpdateJobDetail")]
+    [DisplayName("更新作业")]
     public async Task UpdateJobDetail(UpdateJobDetailInput input)
     {
         var isExist = await _sysJobDetailRep.IsAnyAsync(u => u.JobId == input.JobId && u.Id != input.Id);
@@ -93,6 +96,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "DeleteJobDetail")]
+    [DisplayName("删除作业")]
     public async Task DeleteJobDetail(DeleteJobDetailInput input)
     {
         _schedulerFactory.RemoveJob(input.JobId);
@@ -105,6 +109,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// 获取触发器列表
     /// </summary>
     [ApiDescriptionSettings(Name = "JobTriggerList")]
+    [DisplayName("获取触发器列表")]
     public async Task<List<SysJobTrigger>> GetJobTriggerList([FromQuery] JobDetailInput input)
     {
         return await _sysJobTriggerRep.AsQueryable()
@@ -117,6 +122,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "AddJobTrigger")]
+    [DisplayName("添加触发器")]
     public async Task AddJobTrigger(AddJobTriggerInput input)
     {
         var isExist = await _sysJobTriggerRep.IsAnyAsync(u => u.TriggerId == input.TriggerId && u.Id != input.Id);
@@ -133,6 +139,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "UpdateJobTrigger")]
+    [DisplayName("更新触发器")]
     public async Task UpdateJobTrigger(UpdateJobTriggerInput input)
     {
         var isExist = await _sysJobTriggerRep.IsAnyAsync(u => u.TriggerId == input.TriggerId && u.Id != input.Id);
@@ -149,6 +156,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "DeleteJobTrigger")]
+    [DisplayName("删除触发器")]
     public async Task DeleteJobTrigger(DeleteJobTriggerInput input)
     {
         await _sysJobTriggerRep.DeleteAsync(u => u.TriggerId == input.TriggerId);
@@ -159,6 +167,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "PauseAllJob")]
+    [DisplayName("暂停所有作业")]
     public void PauseAllJob()
     {
         _schedulerFactory.PauseAll();
@@ -169,6 +178,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "StartAllJob")]
+    [DisplayName("启动所有作业")]
     public void StartAllJob()
     {
         _schedulerFactory.StartAll();
@@ -178,6 +188,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// 暂停作业
     /// </summary>
     [ApiDescriptionSettings(Name = "PauseJob")]
+    [DisplayName("暂停作业")]
     public void PauseJob(JobDetailInput input)
     {
         _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
@@ -188,6 +199,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// 启动作业
     /// </summary>
     [ApiDescriptionSettings(Name = "StartJob")]
+    [DisplayName("启动作业")]
     public void StartJob(JobDetailInput input)
     {
         _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
@@ -198,6 +210,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// 暂停触发器
     /// </summary>
     [ApiDescriptionSettings(Name = "PauseTrigger")]
+    [DisplayName("暂停触发器")]
     public void PauseTrigger(JobTriggerInput input)
     {
         _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
@@ -208,6 +221,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// 启动触发器
     /// </summary>
     [ApiDescriptionSettings(Name = "StartTrigger")]
+    [DisplayName("启动触发器")]
     public void StartTrigger(JobTriggerInput input)
     {
         _ = _schedulerFactory.TryGetJob(input.JobId, out var _scheduler);
@@ -218,6 +232,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// 强制唤醒作业调度器
     /// </summary>
     [ApiDescriptionSettings(Name = "CancelSleep")]
+    [DisplayName("强制唤醒作业调度器")]
     public void CancelSleep()
     {
         _schedulerFactory.CancelSleep();
@@ -227,6 +242,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// 强制触发所有作业持久化
     /// </summary>
     [ApiDescriptionSettings(Name = "PersistAll")]
+    [DisplayName("强制触发所有作业持久化")]
     public void PersistAll()
     {
         _schedulerFactory.PersistAll();
@@ -236,6 +252,7 @@ public class SysJobService : IDynamicApiController, ITransient
     /// 获取集群列表
     /// </summary>
     [ApiDescriptionSettings(Name = "JobClusterList")]
+    [DisplayName("获取集群列表")]
     public async Task<List<SysJobCluster>> GetJobClusterList()
     {
         return await _sysJobClusterRep.GetListAsync();

+ 3 - 1
Admin.NET/Admin.NET.Core/Service/Logging/SysLogDiffService.cs

@@ -17,8 +17,9 @@ public class SysLogDiffService : IDynamicApiController, ITransient
     /// 获取差异日志分页列表
     /// </summary>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Page")]
     [SuppressMonitor]
+    [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取差异日志分页列表")]
     public async Task<SqlSugarPagedList<SysLogDiff>> GetPage([FromQuery] PageLogInput input)
     {
         return await _sysLogDiffRep.AsQueryable()
@@ -33,6 +34,7 @@ public class SysLogDiffService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Clear")]
+    [DisplayName("清空差异日志")]
     public async Task<bool> Clear()
     {
         return await _sysLogDiffRep.DeleteAsync(u => u.Id > 0);

+ 0 - 61
Admin.NET/Admin.NET.Core/Service/Logging/SysLogExService.cs

@@ -1,61 +0,0 @@
-using Magicodes.ExporterAndImporter.Excel;
-
-namespace Admin.NET.Core.Service;
-
-/// <summary>
-/// 系统异常日志服务
-/// </summary>
-[ApiDescriptionSettings(Order = 340)]
-public class SysLogExService : IDynamicApiController, ITransient
-{
-    private readonly SqlSugarRepository<SysLogEx> _sysLogExRep;
-
-    public SysLogExService(SqlSugarRepository<SysLogEx> sysLogExRep)
-    {
-        _sysLogExRep = sysLogExRep;
-    }
-
-    /// <summary>
-    /// 获取异常日志分页列表
-    /// </summary>
-    /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Page")]
-    [SuppressMonitor]
-    public async Task<SqlSugarPagedList<SysLogEx>> GetPage([FromQuery] PageLogInput input)
-    {
-        return await _sysLogExRep.AsQueryable()
-            .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
-                u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
-            .OrderBy(u => u.CreateTime, OrderByType.Desc)
-            .ToPagedListAsync(input.Page, input.PageSize);
-    }
-
-    /// <summary>
-    /// 清空异常日志
-    /// </summary>
-    /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Clear")]
-    public async Task<bool> Clear()
-    {
-        return await _sysLogExRep.DeleteAsync(u => u.Id > 0);
-    }
-
-    /// <summary>
-    /// 导出异常日志
-    /// </summary>
-    /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Export"), NonUnify]
-    public async Task<IActionResult> ExporLogOp(LogInput input)
-    {
-        var lopOpList = await _sysLogExRep.AsQueryable()
-            .WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
-                    u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
-            .OrderBy(u => u.CreateTime, OrderByType.Desc)
-            .Select<ExportLogDto>().ToListAsync();
-
-        IExcelExporter excelExporter = new ExcelExporter();
-        var res = await excelExporter.ExportAsByteArray(lopOpList);
-
-        return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "异常日志.xlsx" };
-    }
-}

+ 4 - 1
Admin.NET/Admin.NET.Core/Service/Logging/SysLogOpService.cs

@@ -19,8 +19,9 @@ public class SysLogOpService : IDynamicApiController, ITransient
     /// 获取操作日志分页列表
     /// </summary>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Page")]
     [SuppressMonitor]
+    [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取操作日志分页列表")]
     public async Task<SqlSugarPagedList<SysLogOp>> GetPage([FromQuery] PageLogInput input)
     {
         return await _sysLogOpRep.AsQueryable()
@@ -36,6 +37,7 @@ public class SysLogOpService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Clear")]
+    [DisplayName("清空操作日志")]
     public async Task<bool> Clear()
     {
         return await _sysLogOpRep.DeleteAsync(u => u.Id > 0);
@@ -46,6 +48,7 @@ public class SysLogOpService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Export"), NonUnify]
+    [DisplayName("导出操作日志")]
     public async Task<IActionResult> ExportLogOp(LogInput input)
     {
         var lopOpList = await _sysLogOpRep.AsQueryable()

+ 3 - 1
Admin.NET/Admin.NET.Core/Service/Logging/SysLogVisService.cs

@@ -17,8 +17,9 @@ public class SysLogVisService : IDynamicApiController, ITransient
     /// 获取访问日志分页列表
     /// </summary>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Page")]
     [SuppressMonitor]
+    [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取访问日志分页列表")]
     public async Task<SqlSugarPagedList<SysLogVis>> GetPage([FromQuery] PageLogInput input)
     {
         return await _sysLogVisRep.AsQueryable()
@@ -33,6 +34,7 @@ public class SysLogVisService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Clear")]
+    [DisplayName("清空访问日志")]
     public async Task<bool> Clear()
     {
         return await _sysLogVisRep.DeleteAsync(u => u.Id > 0);

+ 8 - 2
Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs

@@ -30,6 +30,7 @@ public class SysMenuService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "LoginMenuTree")]
+    [DisplayName("获取登录菜单树")]
     public async Task<List<MenuOutput>> GetLoginMenuTree()
     {
         if (_userManager.SuperAdmin)
@@ -69,8 +70,9 @@ public class SysMenuService : IDynamicApiController, ITransient
     /// 获取菜单列表
     /// </summary>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "List")]
     [AllowAnonymous]
+    [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取菜单列表")]
     public async Task<List<SysMenu>> GetList([FromQuery] MenuInput input)
     {
         var menuIdList = _userManager.SuperAdmin ? new List<long>() : await GetMenuIdList();
@@ -97,6 +99,7 @@ public class SysMenuService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加菜单")]
     public async Task AddMenu(AddMenuInput input)
     {
         var isExist = input.Type != MenuTypeEnum.Btn
@@ -121,6 +124,7 @@ public class SysMenuService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新菜单")]
     public async Task UpdateMenu(UpdateMenuInput input)
     {
         var isExist = input.Type != MenuTypeEnum.Btn
@@ -143,8 +147,9 @@ public class SysMenuService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Delete")]
     [UnitOfWork]
+    [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除菜单")]
     public async Task DeleteMenu(DeleteMenuInput input)
     {
         var menuTreeList = await _sysMenuRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true);
@@ -180,6 +185,7 @@ public class SysMenuService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "BtnPermissionList")]
+    [DisplayName("获取按钮权限集合")]
     public async Task<List<string>> GetBtnPermissionList()
     {
         var userId = _userManager.UserId;

+ 5 - 0
Admin.NET/Admin.NET.Core/Service/Message/SysMessageService.cs

@@ -31,6 +31,7 @@ public class SysMessageService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SendAllUser")]
+    [DisplayName("发送消息给所有人")]
     public async Task SendAllUser(MessageInput input)
     {
         await _chatHubContext.Clients.All.ReceiveMessage(input);
@@ -42,6 +43,7 @@ public class SysMessageService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SendOtherUser")]
+    [DisplayName("发送消息给除了发送人的其他人")]
     public async Task SendOtherUser(MessageInput input)
     {
         var onlineuserlist = _sysCacheService.Get<List<SysOnlineUser>>(CacheConst.KeyOnlineUser);
@@ -59,6 +61,7 @@ public class SysMessageService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SendUser")]
+    [DisplayName("发送消息给某个人")]
     public async Task SendUser(MessageInput input)
     {
         var onlineuserlist = _sysCacheService.Get<List<SysOnlineUser>>(CacheConst.KeyOnlineUser);
@@ -78,6 +81,7 @@ public class SysMessageService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SendUsers")]
+    [DisplayName("发送消息给某些人")]
     public async Task SendUsers(MessageInput input)
     {
         var onlineuserlist = _sysCacheService.Get<List<SysOnlineUser>>(CacheConst.KeyOnlineUser);
@@ -97,6 +101,7 @@ public class SysMessageService : IDynamicApiController, ITransient
     /// <param name="message"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SendEmail")]
+    [DisplayName("发送邮件")]
     public async Task SendEmail([Required] string message)
     {
         await _fluentEmail.To(_emailOptions.DefaultToEmail).Body(message).SendAsync();

+ 12 - 4
Admin.NET/Admin.NET.Core/Service/Notice/SysNoticeService.cs

@@ -32,6 +32,7 @@ public class SysNoticeService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取通知公告分页列表")]
     public async Task<SqlSugarPagedList<SysNotice>> GetPage([FromQuery] PageNoticeInput input)
     {
         return await _sysNoticeRep.AsQueryable()
@@ -48,6 +49,7 @@ public class SysNoticeService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加通知公告")]
     public async Task AddNotice(AddNoticeInput input)
     {
         var notice = input.Adapt<SysNotice>();
@@ -60,8 +62,9 @@ public class SysNoticeService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Update")]
     [UnitOfWork]
+    [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新通知公告")]
     public async Task UpdateNotice(UpdateNoticeInput input)
     {
         var notice = input.Adapt<SysNotice>();
@@ -74,8 +77,9 @@ public class SysNoticeService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Delete")]
     [UnitOfWork]
+    [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除通知公告")]
     public async Task DeleteNotice(DeleteNoticeInput input)
     {
         await _sysNoticeRep.DeleteAsync(u => u.Id == input.Id);
@@ -89,6 +93,7 @@ public class SysNoticeService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Public")]
+    [DisplayName("发布通知公告")]
     public async Task PublicNotice(NoticeInput input)
     {
         // 更新发布状态和时间
@@ -117,6 +122,7 @@ public class SysNoticeService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SetRead")]
+    [DisplayName("设置通知公告已读状态")]
     public async Task SetRead(NoticeInput input)
     {
         await _sysNoticeUserRep.UpdateAsync(u => new SysNoticeUser
@@ -127,11 +133,12 @@ public class SysNoticeService : IDynamicApiController, ITransient
     }
 
     /// <summary>
-    /// 获取接收的通知公告(当前用户)
+    /// 获取接收的通知公告
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "PageReceived")]
+    [DisplayName("获取接收的通知公告")]
     public async Task<SqlSugarPagedList<SysNoticeUser>> GetPageReceived([FromQuery] PageNoticeInput input)
     {
         return await _sysNoticeRep.AsSugarClient().Queryable<SysNoticeUser>().Includes(u => u.SysNotice)
@@ -143,10 +150,11 @@ public class SysNoticeService : IDynamicApiController, ITransient
     }
 
     /// <summary>
-    /// 获取未读的通知公告(当前用户)
+    /// 获取未读的通知公告
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "UnReadList")]
+    [DisplayName("获取未读的通知公告")]
     public async Task<List<SysNotice>> GetUnReadList()
     {
         var noticeUserList = await _sysNoticeRep.AsSugarClient().Queryable<SysNoticeUser>().Includes(u => u.SysNotice)

+ 3 - 1
Admin.NET/Admin.NET.Core/Service/OnlineUser/SysOnlineUserService.cs

@@ -26,6 +26,7 @@ public class SysOnlineUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取在线用户分页列表")]
     public async Task<SqlSugarPagedList<SysOnlineUser>> GetPage([FromQuery] PageOnlineUserInput input)
     {
         return await _sysOnlineUerRep.AsQueryable()
@@ -39,8 +40,9 @@ public class SysOnlineUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="user"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "ForceOffline")]
     [NonValidation]
+    [ApiDescriptionSettings(Name = "ForceOffline")]
+    [DisplayName("强制下线")]
     public async Task ForceOffline(SysOnlineUser user)
     {
         await _onlineUserHubContext.Clients.Client(user.ConnectionId).ForceOffline("强制下线");

+ 6 - 2
Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs

@@ -33,6 +33,7 @@ public class SysOrgService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取机构列表")]
     public async Task<List<SysOrg>> GetList([FromQuery] OrgInput input)
     {
         var orgIdList = await GetUserOrgIdList();
@@ -66,6 +67,7 @@ public class SysOrgService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加机构")]
     public async Task<long> AddOrg(AddOrgInput input)
     {
         var isExist = await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code);
@@ -98,8 +100,9 @@ public class SysOrgService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Update")]
     [UnitOfWork]
+    [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新机构")]
     public async Task UpdateOrg(UpdateOrgInput input)
     {
         if (input.Pid != 0)
@@ -133,8 +136,9 @@ public class SysOrgService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Delete")]
     [UnitOfWork]
+    [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除机构")]
     public async Task DeleteOrg(DeleteOrgInput input)
     {
         var sysOrg = await _sysOrgRep.GetFirstAsync(u => u.Id == input.Id);

+ 4 - 0
Admin.NET/Admin.NET.Core/Service/Pos/SysPosService.cs

@@ -22,6 +22,7 @@ public class SysPosService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取职位列表")]
     public async Task<List<SysPos>> GetList([FromQuery] PosInput input)
     {
         return await _sysPosRep.AsQueryable()
@@ -36,6 +37,7 @@ public class SysPosService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加职位")]
     public async Task AddPos(AddPosInput input)
     {
         var isExist = await _sysPosRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code);
@@ -51,6 +53,7 @@ public class SysPosService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新职位")]
     public async Task UpdatePos(UpdatePosInput input)
     {
         var isExist = await _sysPosRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id);
@@ -66,6 +69,7 @@ public class SysPosService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除职位")]
     public async Task DeletePos(DeletePosInput input)
     {
         // 该职位下是否有用户

+ 7 - 1
Admin.NET/Admin.NET.Core/Service/Region/SysRegionService.cs

@@ -17,11 +17,12 @@ public class SysRegionService : IDynamicApiController, ITransient
     }
 
     /// <summary>
-    /// 获取行政区域列表
+    /// 获取行政区域分页列表
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取行政区域分页列表")]
     public async Task<SqlSugarPagedList<SysRegion>> GetPage([FromQuery] PageRegionInput input)
     {
         return await _sysRegionRep.AsQueryable()
@@ -37,6 +38,7 @@ public class SysRegionService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取行政区域列表")]
     public async Task<List<SysRegion>> GetList([FromQuery] RegionInput input)
     {
         return await _sysRegionRep.GetListAsync(u => u.Pid == input.Id);
@@ -48,6 +50,7 @@ public class SysRegionService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加行政区域")]
     public async Task<long> AddRegion(AddRegionInput input)
     {
         var isExist = await _sysRegionRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code);
@@ -65,6 +68,7 @@ public class SysRegionService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新行政区域")]
     public async Task UpdateRegion(UpdateRegionInput input)
     {
         if (input.Pid != 0)
@@ -95,6 +99,7 @@ public class SysRegionService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除行政区域")]
     public async Task DeleteRegion(DeleteRegionInput input)
     {
         var regionTreeList = await _sysRegionRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true);
@@ -107,6 +112,7 @@ public class SysRegionService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Sync")]
+    [DisplayName("同步行政区域")]
     public async Task SyncRegion()
     {
         await _sysRegionRep.DeleteAsync(u => u.Id > 0);

+ 11 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs

@@ -37,6 +37,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取角色分页列表")]
     public async Task<SqlSugarPagedList<SysRole>> GetPage([FromQuery] PageRoleInput input)
     {
         return await _sysRoleRep.AsQueryable()
@@ -51,6 +52,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("获取角色列表")]
     public async Task<List<RoleOutput>> GetList()
     {
         return await _sysRoleRep.AsQueryable().OrderBy(u => u.OrderNo).Select<RoleOutput>().ToListAsync();
@@ -62,6 +64,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加角色")]
     public async Task AddRole(AddRoleInput input)
     {
         var isExist = await _sysRoleRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code);
@@ -95,6 +98,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新角色")]
     public async Task UpdateRole(UpdateRoleInput input)
     {
         var isExist = await _sysRoleRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id);
@@ -112,8 +116,9 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Delete")]
     [UnitOfWork]
+    [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除角色")]
     public async Task DeleteRole(DeleteRoleInput input)
     {
         var sysRole = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id);
@@ -138,6 +143,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "GrantMenu")]
+    [DisplayName("授权角色菜单")]
     public async Task GrantMenu(RoleMenuInput input)
     {
         await _sysRoleMenuService.GrantRoleMenu(input);
@@ -149,6 +155,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "GrantDataScope")]
+    [DisplayName("授权角色数据范围")]
     public async Task GrantDataScope(RoleOrgInput input)
     {
         // 删除所有用户机构缓存
@@ -187,6 +194,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "OwnMenuList")]
+    [DisplayName("根据角色Id获取菜单Id集合")]
     public async Task<List<long>> GetOwnMenuList([FromQuery] RoleInput input)
     {
         return await _sysRoleMenuService.GetRoleMenuIdList(new List<long> { input.Id });
@@ -198,6 +206,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "OwnOrgList")]
+    [DisplayName("根据角色Id获取机构Id集合")]
     public async Task<List<long>> GetOwnOrgList([FromQuery] RoleInput input)
     {
         return await _sysRoleOrgService.GetRoleOrgIdList(new List<long> { input.Id });
@@ -209,6 +218,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SetStatus")]
+    [DisplayName("设置角色状态")]
     public async Task<int> SetStatus(RoleInput input)
     {
         if (!Enum.IsDefined(typeof(StatusEnum), input.Status))

+ 5 - 1
Admin.NET/Admin.NET.Core/Service/Server/SysServerService.cs

@@ -25,6 +25,7 @@ public class SysServerService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "ServerBase")]
+    [DisplayName("获取服务器配置信息")]
     public dynamic GetServerBase()
     {
         return new
@@ -44,10 +45,11 @@ public class SysServerService : IDynamicApiController, ITransient
     }
 
     /// <summary>
-    /// 获取服务器内存信息
+    /// 获取服务器使用信息
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "ServerUsed")]
+    [DisplayName("获取服务器使用信息")]
     public dynamic GetServerUsed()
     {
         var programStartTime = Process.GetCurrentProcess().StartTime;
@@ -73,6 +75,7 @@ public class SysServerService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "ServerDisk")]
+    [DisplayName("获取服务器磁盘信息")]
     public dynamic GetServerDisk()
     {
         return ComputerUtil.GetDiskInfos();
@@ -83,6 +86,7 @@ public class SysServerService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "AssemblyList")]
+    [DisplayName("获取框架主要程序集")]
     public dynamic GetAssemblyList()
     {
         var furionAssembly = typeof(App).Assembly.GetName();

+ 9 - 0
Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs

@@ -52,6 +52,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取租户分页列表")]
     public async Task<SqlSugarPagedList<TenantOutput>> GetPage([FromQuery] PageTenantInput input)
     {
         return await _sysTenantRep.AsQueryable()
@@ -96,6 +97,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加租户")]
     public async Task AddTenant(AddTenantInput input)
     {
         var isExist = await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name);
@@ -125,6 +127,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SetStatus")]
+    [DisplayName("设置租户状态")]
     public async Task<int> SetStatus(TenantInput input)
     {
         var tenant = await _sysTenantRep.GetFirstAsync(u => u.Id == input.Id);
@@ -227,6 +230,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除租户")]
     public async Task DeleteTenant(DeleteTenantInput input)
     {
         // 禁止删除默认租户
@@ -263,6 +267,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新租户")]
     public async Task UpdateTenant(UpdateTenantInput input)
     {
         var isExist = await _sysOrgRep.IsAnyAsync(u => u.Name == input.Name && u.Id != input.OrgId);
@@ -289,6 +294,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "GrantMenu")]
+    [DisplayName("授权租户管理员角色菜单")]
     public async Task GrantMenu(RoleMenuInput input)
     {
         var tenantAdminUser = await _sysUserRep.GetFirstAsync(u => u.TenantId == input.Id && u.AccountType == AccountTypeEnum.Admin);
@@ -305,6 +311,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "OwnMenuList")]
+    [DisplayName("获取租户管理员角色拥有菜单Id集合")]
     public async Task<List<long>> GetOwnMenuList([FromQuery] TenantUserInput input)
     {
         var roleIds = await _sysUserRoleService.GetUserRoleIdList(input.UserId);
@@ -317,6 +324,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "ResetPwd")]
+    [DisplayName("重置租户管理员密码")]
     public async Task ResetPwd(TenantUserInput input)
     {
         var password = await _sysConfigService.GetConfigValue<string>(CommonConst.SysPassword);
@@ -357,6 +365,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "CreateDb")]
+    [DisplayName("创建租户数据库")]
     public async Task CreateDb(TenantInput input)
     {
         var tenant = await _sysTenantRep.GetFirstAsync(u => u.Id == input.Id);

+ 15 - 3
Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs

@@ -34,6 +34,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取用户分页列表")]
     public async Task<SqlSugarPagedList<SysUser>> GetPage([FromQuery] PageUserInput input)
     {
         var orgList = input.OrgId > 0 ? await _sysOrgService.GetChildIdListWithSelfById(input.OrgId) :
@@ -54,8 +55,9 @@ public class SysUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Add")]
     [UnitOfWork]
+    [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加用户")]
     public async Task AddUser(AddUserInput input)
     {
         var isExist = await _sysUserRep.AsQueryable().Filter(null, true).AnyAsync(u => u.Account == input.Account);
@@ -87,8 +89,9 @@ public class SysUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Update")]
     [UnitOfWork]
+    [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新用户")]
     public async Task UpdateUser(UpdateUserInput input)
     {
         var isExist = await _sysUserRep.AsQueryable().Filter(null, true).AnyAsync(u => u.Account == input.Account && u.Id != input.Id);
@@ -105,8 +108,9 @@ public class SysUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "Delete")]
     [UnitOfWork]
+    [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除用户")]
     public async Task DeleteUser(DeleteUserInput input)
     {
         var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id);
@@ -131,6 +135,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "BaseInfo")]
+    [DisplayName("查看用户基本信息")]
     public async Task<SysUser> GetBaseInfo()
     {
         return await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);
@@ -141,6 +146,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "BaseInfo")]
+    [DisplayName("更新用户基本信息")]
     public async Task<int> UpdateBaseInfo(SysUser user)
     {
         return await _sysUserRep.AsUpdateable(user)
@@ -153,6 +159,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "SetStatus")]
+    [DisplayName("设置用户状态")]
     public async Task<int> SetStatus(UserInput input)
     {
         var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id);
@@ -172,6 +179,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "GrantRole")]
+    [DisplayName("授权用户角色")]
     public async Task GrantRole(UserRoleInput input)
     {
         var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.UserId);
@@ -187,6 +195,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "ChangePwd")]
+    [DisplayName("修改用户密码")]
     public async Task<int> ChangePwd(ChangePwdInput input)
     {
         var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);
@@ -211,6 +220,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "ResetPwd")]
+    [DisplayName("重置用户密码")]
     public async Task<int> ResetPwd(ResetPwdUserInput input)
     {
         var password = await _sysConfigService.GetConfigValue<string>(CommonConst.SysPassword);
@@ -226,6 +236,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// <param name="userId"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "OwnRoleList")]
+    [DisplayName("获取用户拥有角色集合")]
     public async Task<List<long>> GetOwnRoleList([Required] long userId)
     {
         return await _sysUserRoleService.GetUserRoleIdList(userId);
@@ -237,6 +248,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// <param name="userId"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "OwnExtOrgList")]
+    [DisplayName("获取用户扩展机构集合")]
     public async Task<List<SysUserExtOrg>> GetOwnExtOrgList([Required] long userId)
     {
         return await _sysUserExtOrgService.GetUserExtOrgList(userId);

+ 8 - 2
Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatPayService.cs

@@ -45,6 +45,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "GenerateParametersForJsapiPay")]
+    [DisplayName("生成JSAPI调起支付所需参数")]
     public dynamic GenerateParametersForJsapiPay(WechatPayParaInput input)
     {
         return WechatTenpayClient.GenerateParametersForJsapiPayRequest(_wechatPayOptions.AppId, input.PrepayId);
@@ -54,6 +55,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
     /// 微信支付统一下单获取Id(商户直连)
     /// </summary>
     [ApiDescriptionSettings(Name = "CreatePayTransaction")]
+    [DisplayName("微信支付统一下单获取Id(商户直连)")]
     public async Task<dynamic> CreatePayTransaction([FromBody] WechatPayTransactionInput input)
     {
         var request = new CreatePayTransactionJsapiRequest()
@@ -96,6 +98,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
     /// 微信支付统一下单获取Id(服务商模式)
     /// </summary>
     [ApiDescriptionSettings(Name = "CreatePayPartnerTransaction")]
+    [DisplayName("微信支付统一下单获取Id(服务商模式)")]
     public async Task<dynamic> CreatePayPartnerTransaction([FromBody] WechatPayTransactionInput input)
     {
         var request = new CreatePayPartnerTransactionJsapiRequest()
@@ -146,6 +149,7 @@ public class SysWechatPayService : IDynamicApiController, ITransient
     /// <param name="tradeId"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "PayInfo")]
+    [DisplayName("获取支付订单详情")]
     public async Task<SysWechatPay> GetPayInfo(string tradeId)
     {
         return await _sysWechatPayUserRep.GetFirstAsync(u => u.OutTradeNumber == tradeId);
@@ -155,8 +159,9 @@ public class SysWechatPayService : IDynamicApiController, ITransient
     /// 微信支付成功回调(商户直连)
     /// </summary>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "PayCallBack")]
     [AllowAnonymous]
+    [ApiDescriptionSettings(Name = "PayCallBack")]
+    [DisplayName("微信支付成功回调(商户直连)")]
     public async Task<WechatPayOutput> PayCallBack()
     {
         using var ms = new MemoryStream();
@@ -202,8 +207,9 @@ public class SysWechatPayService : IDynamicApiController, ITransient
     /// 微信支付成功回调(服务商模式)
     /// </summary>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "PayPartnerCallBack")]
     [AllowAnonymous]
+    [ApiDescriptionSettings(Name = "PayPartnerCallBack")]
+    [DisplayName("微信支付成功回调(服务商模式)")]
     public async Task PayPartnerCallBack()
     {
         using var ms = new MemoryStream();

+ 7 - 3
Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatService.cs

@@ -21,8 +21,9 @@ public class SysWechatService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "GenAuthUrl")]
     [AllowAnonymous]
+    [ApiDescriptionSettings(Name = "GenAuthUrl")]
+    [DisplayName("生成网页授权Url")]
     public string GenAuthUrl(GenAuthUrlInput input)
     {
         return _wechatApiClient.GenerateParameterizedUrlForConnectOAuth2Authorize(input.RedirectUrl, input.Scope);
@@ -32,8 +33,9 @@ public class SysWechatService : IDynamicApiController, ITransient
     /// 授权登录(Code换取OpenId)
     /// </summary>
     /// <param name="input"></param>
-    [ApiDescriptionSettings(Name = "SnsOAuth2")]
     [AllowAnonymous]
+    [ApiDescriptionSettings(Name = "SnsOAuth2")]
+    [DisplayName("授权登录(Code换取OpenId)")]
     public async Task<string> SnsOAuth2([Required] WechatOAuth2Input input)
     {
         var reqOAuth2 = new SnsOAuth2AccessTokenRequest()
@@ -73,8 +75,9 @@ public class SysWechatService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [ApiDescriptionSettings(Name = "OpenIdLogin")]
     [AllowAnonymous]
+    [ApiDescriptionSettings(Name = "OpenIdLogin")]
+    [DisplayName("微信用户登录")]
     public async Task<dynamic> OpenIdLogin(WechatUserLogin input)
     {
         var wxUser = await _sysWechatUserRep.GetFirstAsync(p => p.OpenId == input.OpenId);
@@ -98,6 +101,7 @@ public class SysWechatService : IDynamicApiController, ITransient
     /// </summary>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "GenConfigPara")]
+    [DisplayName("获取配置签名参数(wx.config)")]
     public async Task<dynamic> GenConfigPara(SignatureInput input)
     {
         var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(new CgibinTokenRequest());

+ 4 - 0
Admin.NET/Admin.NET.Core/Service/Wechat/SysWechatUserService.cs

@@ -19,6 +19,7 @@ public class SysWechatUserService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("获取微信用户列表")]
     public async Task<SqlSugarPagedList<SysWechatUser>> GetPage([FromQuery] WechatUserInput input)
     {
         return await _sysWechatUserRep.AsQueryable()
@@ -34,6 +35,7 @@ public class SysWechatUserService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("增加微信用户")]
     public async Task AddWechatUser(SysWechatUser input)
     {
         await _sysWechatUserRep.InsertAsync(input.Adapt<SysWechatUser>());
@@ -45,6 +47,7 @@ public class SysWechatUserService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("更新微信用户")]
     public async Task UpdateWechatUser(SysWechatUser input)
     {
         var weChatUser = input.Adapt<SysWechatUser>();
@@ -57,6 +60,7 @@ public class SysWechatUserService : IDynamicApiController, ITransient
     /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("删除微信用户")]
     public async Task DeleteWechatUser(DeleteWechatUserInput input)
     {
         await _sysWechatUserRep.DeleteAsync(u => u.Id == input.Id);

+ 1 - 1
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -189,7 +189,7 @@ public static class SqlSugarSetup
                 DiffType = u.DiffType.ToString(),
                 Sql = UtilMethods.GetSqlString(config.DbType, u.Sql, u.Parameters),
                 Parameters = JsonConvert.SerializeObject(u.Parameters),
-                Duration = u.Time == null ? 0 : (long)u.Time.Value.TotalMilliseconds
+                Elapsed = u.Time == null ? 0 : (long)u.Time.Value.TotalMilliseconds
             };
             await db.Insertable(logDiff).ExecuteCommandAsync();
             Console.ForegroundColor = ConsoleColor.Red;

+ 9 - 1
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -166,7 +166,15 @@ public class Startup : AppStartup
         }
         if (App.GetConfig<bool>("Logging:Database:Enabled")) // 日志写入数据库
         {
-            services.AddDatabaseLogging<DatabaseLoggingWriter>();
+            services.AddDatabaseLogging<DatabaseLoggingWriter>(options =>
+            {
+                options.WithTraceId = true; // 显示线程Id
+                options.IgnoreReferenceLoop = false; // 忽略循环检测
+                options.WriteFilter = (logMsg) =>
+                {
+                    return logMsg.LogName == "System.Logging.LoggingMonitor"; // 只写LoggingMonitor日志
+                };
+            });
         }
         if (App.GetConfig<bool>("Logging:ElasticSearch:Enabled")) // 日志写入ElasticSearch
         {

+ 6 - 0
Admin.NET/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -71,4 +71,10 @@
 		</Content>
 	</ItemGroup>
 
+	<ItemGroup>
+	  <None Update="ip2region.db">
+	    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+	  </None>
+	</ItemGroup>
+
 </Project>