闫腾 2 years ago
parent
commit
3ab5fcd38b
87 changed files with 1018 additions and 660 deletions
  1. 3 0
      Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj
  2. 1 0
      Admin.NET/Admin.NET.Application/Configuration/App.json
  3. 1 1
      Admin.NET/Admin.NET.Application/Configuration/CodeGen.json
  4. 12 0
      Admin.NET/Admin.NET.Application/Configuration/EventBus.json
  5. 1 1
      Admin.NET/Admin.NET.Application/Configuration/OAuth.json
  6. 8 7
      Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
  7. 7 5
      Admin.NET/Admin.NET.Core/Const/CacheConst.cs
  8. 15 3
      Admin.NET/Admin.NET.Core/Entity/EntityBase.cs
  9. 2 0
      Admin.NET/Admin.NET.Core/Entity/SysDictData.cs
  10. 4 0
      Admin.NET/Admin.NET.Core/Entity/SysOpenAccess.cs
  11. 2 0
      Admin.NET/Admin.NET.Core/Entity/SysOrg.cs
  12. 2 0
      Admin.NET/Admin.NET.Core/Entity/SysRoleMenu.cs
  13. 2 0
      Admin.NET/Admin.NET.Core/Entity/SysRoleOrg.cs
  14. 4 0
      Admin.NET/Admin.NET.Core/Entity/SysUser.cs
  15. 6 0
      Admin.NET/Admin.NET.Core/Entity/SysUserExtOrg.cs
  16. 2 0
      Admin.NET/Admin.NET.Core/Entity/SysUserRole.cs
  17. 2 0
      Admin.NET/Admin.NET.Core/Entity/SysWechatPay.cs
  18. 2 0
      Admin.NET/Admin.NET.Core/Entity/SysWechatUser.cs
  19. 135 0
      Admin.NET/Admin.NET.Core/EventBus/RabbitMQEventSourceStore.cs
  20. 1 0
      Admin.NET/Admin.NET.Core/GlobalUsings.cs
  21. 2 2
      Admin.NET/Admin.NET.Core/OAuth/OAuthSetup.cs
  22. 22 28
      Admin.NET/Admin.NET.Core/Option/EventBusOptions.cs
  23. 30 0
      Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs
  24. 26 0
      Admin.NET/Admin.NET.Core/Service/Common/Dto/SmKeyPairOutput.cs
  25. 20 0
      Admin.NET/Admin.NET.Core/Service/Common/SysCommonService.cs
  26. 67 32
      Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs
  27. 1 1
      Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs
  28. 2 2
      Admin.NET/Admin.NET.Core/Service/Org/SysOrgService.cs
  29. 0 1
      Admin.NET/Admin.NET.Core/Service/Role/SysRoleMenuService.cs
  30. 0 1
      Admin.NET/Admin.NET.Core/Service/Role/SysRoleOrgService.cs
  31. 2 0
      Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs
  32. 2 0
      Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs
  33. 0 1
      Admin.NET/Admin.NET.Core/Service/User/SysUserExtOrgService.cs
  34. 0 1
      Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs
  35. 1 0
      Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs
  36. 8 6
      Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs
  37. 0 4
      Admin.NET/Admin.NET.Core/Util/CodeGenUtil.cs
  38. 6 1
      Admin.NET/Admin.NET.Core/Util/CommonUtil.cs
  39. 4 3
      Admin.NET/Admin.NET.Core/Util/GM/GM.cs
  40. 1 1
      Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj
  41. 1 0
      Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs
  42. 42 14
      Admin.NET/Admin.NET.Web.Core/Startup.cs
  43. 0 12
      Admin.NET/Admin.NET.Web.Entry/.config/dotnet-tools.json
  44. 1 1
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Service.cs.vm
  45. 13 9
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm
  46. 4 4
      Admin.NET/Plugins/Admin.NET.Plugin.Elsa/Admin.NET.Plugin.Elsa.csproj
  47. 2 0
      Admin.NET/Plugins/Admin.NET.Plugin.GoView/Entity/GoViewPro.cs
  48. 10 10
      Web/package.json
  49. 9 0
      Web/src/App.vue
  50. 88 0
      Web/src/api-services/apis/sys-auth-api.ts
  51. 76 0
      Web/src/api-services/apis/sys-common-api.ts
  52. 101 17
      Web/src/api-services/apis/sys-file-api.ts
  53. 1 8
      Web/src/api-services/models/add-dict-data-input.ts
  54. 1 15
      Web/src/api-services/models/add-open-access-input.ts
  55. 1 8
      Web/src/api-services/models/add-org-input.ts
  56. 1 15
      Web/src/api-services/models/add-user-input.ts
  57. 12 12
      Web/src/api-services/models/admin-result-list-sys-file.ts
  58. 25 42
      Web/src/api-services/models/admin-result-sm-key-pair-output.ts
  59. 12 12
      Web/src/api-services/models/admin-result-sys-file.ts
  60. 4 4
      Web/src/api-services/models/index.ts
  61. 1 15
      Web/src/api-services/models/open-access-output.ts
  62. 42 0
      Web/src/api-services/models/sm-key-pair-output.ts
  63. 1 8
      Web/src/api-services/models/sys-dict-data.ts
  64. 1 8
      Web/src/api-services/models/sys-org.ts
  65. 0 175
      Web/src/api-services/models/sys-tenant.ts
  66. 1 22
      Web/src/api-services/models/sys-user-ext-org.ts
  67. 1 15
      Web/src/api-services/models/sys-user.ts
  68. 1 8
      Web/src/api-services/models/sys-wechat-pay.ts
  69. 1 8
      Web/src/api-services/models/sys-wechat-user.ts
  70. 1 8
      Web/src/api-services/models/update-dict-data-input.ts
  71. 1 15
      Web/src/api-services/models/update-open-access-input.ts
  72. 1 8
      Web/src/api-services/models/update-org-input.ts
  73. 1 15
      Web/src/api-services/models/update-user-input.ts
  74. 1 15
      Web/src/api-services/models/user-output.ts
  75. 84 13
      Web/src/layout/lockScreen/index.vue
  76. 1 1
      Web/src/layout/navBars/tagsView/tagsView.vue
  77. 2 2
      Web/src/stores/userInfo.ts
  78. 7 8
      Web/src/theme/element.scss
  79. 2 11
      Web/src/views/system/codeGen/index.vue
  80. 11 0
      Web/src/views/system/database/component/addTable.vue
  81. 3 3
      Web/src/views/system/dict/index.vue
  82. 4 4
      Web/src/views/system/log/oplog/index.vue
  83. 3 3
      Web/src/views/system/log/vislog/index.vue
  84. 3 3
      Web/src/views/system/org/index.vue
  85. 13 4
      Web/src/views/system/user/component/userCenter.vue
  86. 2 2
      Web/src/views/system/user/index.vue
  87. 19 2
      Web/vite.config.ts

+ 3 - 0
Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj

@@ -54,6 +54,9 @@
     <None Update="Configuration\Email.json">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Update="Configuration\EventBus.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Update="Configuration\JWT.json">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>

+ 1 - 0
Admin.NET/Admin.NET.Application/Configuration/App.json

@@ -29,6 +29,7 @@
     "DateTimeFormatCulture": "zh-CN" // 固定时间区域为特定时区(多语言)
   },
   "CorsAccessorSettings": {
+    // "WithOrigins": ["https://gitee.com"],
     "WithExposedHeaders": [ "Content-Disposition", "X-Pagination", "access-token", "x-access-token" ], // 如果前端不代理且是axios请求
     "SignalRSupport": true // 启用 SignalR 跨域支持
   },

+ 1 - 1
Admin.NET/Admin.NET.Application/Configuration/CodeGen.json

@@ -8,7 +8,7 @@
     "EntityBaseColumn": {
       "EntityTenantId": [ "Id", "TenantId" ],
       "EntityTenant": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "CreateUserName", "UpdateUserName", "IsDelete", "TenantId" ],
-      "EntityBaseData": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "CreateUserName", "UpdateUserName", "IsDelete", "CreateOrgId" ],
+      "EntityBaseData": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "CreateUserName", "UpdateUserName", "IsDelete", "CreateOrgId", "CreateOrgName" ],
       "EntityBase": [ "Id", "CreateTime", "UpdateTime", "CreateUserId", "UpdateUserId", "CreateUserName", "UpdateUserName", "IsDelete" ],
       "EntityBaseId": [ "Id" ]
       //"BaseId": [ "Id" ]

+ 12 - 0
Admin.NET/Admin.NET.Application/Configuration/EventBus.json

@@ -0,0 +1,12 @@
+{
+  "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
+
+  "EventBus": {
+    "RabbitMQ": {
+      "UserName": "adminnet",
+      "Password": "adminnet++123456",
+      "HostName": "127.0.0.1",
+      "Port": 5672
+    }
+  }
+}

+ 1 - 1
Admin.NET/Admin.NET.Application/Configuration/OAuth.json

@@ -8,7 +8,7 @@
     },
     "Gitee": {
       "ClientId": "daf46f82c7aef4ee192e7537319f7fd18a158b7f0b21ca11abccea59c55d8ac1",
-      "ClientSecret": "abf5d832a02503eb7e609bed09bcdd3f23bfc9461009f0602acf9a59f789fcd5"
+      "ClientSecret": "4ec9a6942c35d03ce64434cdffb92dee48d12fe1b2038eeda2dbb6f3c847b365"
     }
   }
 }

+ 8 - 7
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -21,28 +21,29 @@
     <PackageReference Include="AspNet.Security.OAuth.Gitee" Version="6.0.15" />
     <PackageReference Include="AspNet.Security.OAuth.Weixin" Version="6.0.15" />
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.24" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.24" />
-    <PackageReference Include="Furion.Pure" Version="4.9.1.24" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.1.28" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.1.28" />
+    <PackageReference Include="Furion.Pure" Version="4.9.1.28" />
     <PackageReference Include="IPTools.China" Version="1.6.0" />
     <PackageReference Include="Lazy.Captcha.Core" Version="2.0.6" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.5.1" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.5.1" />
     <PackageReference Include="MailKit" Version="4.3.0" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.26" />
-    <PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="6.0.25" />
-    <PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="6.0.25" />
+    <PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson" Version="6.0.26" />
+    <PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="6.0.26" />
     <PackageReference Include="NEST" Version="7.17.5" />
     <PackageReference Include="NewLife.Redis" Version="5.6.2024.105" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.9" />
+    <PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
     <PackageReference Include="SixLabors.ImageSharp.Web" Version="3.1.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.37.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.21.0" />
-    <PackageReference Include="SqlSugarCore" Version="5.1.4.137" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.140" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.8" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
-    <PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="6.0.25" />
+    <PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="6.0.26" />
   </ItemGroup>
 
   <ItemGroup>

+ 7 - 5
Admin.NET/Admin.NET.Core/Const/CacheConst.cs

@@ -14,10 +14,10 @@ namespace Admin.NET.Core;
 /// </summary>
 public class CacheConst
 {
-    /// <summary>
-    /// 用户缓存
-    /// </summary>
-    public const string KeyUser = "sys_user:";
+    ///// <summary>
+    ///// 用户缓存
+    ///// </summary>
+    //public const string KeyUser = "sys_user:";
 
     ///// <summary>
     ///// 用户菜单缓存
@@ -49,7 +49,9 @@ public class CacheConst
     /// </summary>
     public const string KeyVerCode = "sys_verCode:";
 
-    // 手机验证码缓存
+    /// <summary>
+    /// 手机验证码缓存
+    /// </summary>
     public const string KeyPhoneVerCode = "sys_phoneVerCode:";
 
     /// <summary>

+ 15 - 3
Admin.NET/Admin.NET.Core/Entity/EntityBase.cs

@@ -86,7 +86,7 @@ public abstract class EntityBase : EntityBaseId, IDeletedFilter
 }
 
 /// <summary>
-/// 业务数据实体基类(数据权限)
+/// 业务数据实体基类(数据权限)
 /// </summary>
 public abstract class EntityBaseData : EntityBase, IOrgIdFilter
 {
@@ -112,7 +112,7 @@ public abstract class EntityBaseData : EntityBase, IOrgIdFilter
 }
 
 /// <summary>
-/// 租户基类实体
+/// 租户实体基类
 /// </summary>
 public abstract class EntityTenant : EntityBase, ITenantIdFilter
 {
@@ -124,9 +124,21 @@ public abstract class EntityTenant : EntityBase, ITenantIdFilter
 }
 
 /// <summary>
-/// 租户基类实体Id
+/// 租户实体基类Id
 /// </summary>
 public abstract class EntityTenantId : EntityBaseId, ITenantIdFilter
+{
+    /// <summary>
+    /// 租户Id
+    /// </summary>
+    [SugarColumn(ColumnDescription = "租户Id", IsOnlyIgnoreUpdate = true)]
+    public virtual long? TenantId { get; set; }
+}
+
+/// <summary>
+/// 租户实体基类 + 业务数据(数据权限)
+/// </summary>
+public abstract class EntityTenantBaseData : EntityBaseData, ITenantIdFilter
 {
     /// <summary>
     /// 租户Id

+ 2 - 0
Admin.NET/Admin.NET.Core/Entity/SysDictData.cs

@@ -25,6 +25,8 @@ public class SysDictData : EntityBase
     /// <summary>
     /// 字典类型
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(DictTypeId))]
     public SysDictType DictType { get; set; }
 

+ 4 - 0
Admin.NET/Admin.NET.Core/Entity/SysOpenAccess.cs

@@ -39,6 +39,8 @@ public class SysOpenAccess : EntityBase
     /// <summary>
     /// 绑定租户
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(BindTenantId))]
     public SysTenant BindTenant { get; set; }
 
@@ -51,6 +53,8 @@ public class SysOpenAccess : EntityBase
     /// <summary>
     /// 绑定用户
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(BindUserId))]
     public SysUser BindUser { get; set; }
 }

+ 2 - 0
Admin.NET/Admin.NET.Core/Entity/SysOrg.cs

@@ -58,6 +58,8 @@ public class SysOrg : EntityTenant
     /// <summary>
     /// 负责人
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(DirectorId))]
     public SysUser Director { get; set; }
 

+ 2 - 0
Admin.NET/Admin.NET.Core/Entity/SysRoleMenu.cs

@@ -31,6 +31,8 @@ public class SysRoleMenu : EntityBaseId
     /// <summary>
     /// 菜单
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(MenuId))]
     public SysMenu SysMenu { get; set; }
 }

+ 2 - 0
Admin.NET/Admin.NET.Core/Entity/SysRoleOrg.cs

@@ -31,6 +31,8 @@ public class SysRoleOrg : EntityBaseId
     /// <summary>
     /// 机构
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(OrgId))]
     public SysOrg SysOrg { get; set; }
 }

+ 4 - 0
Admin.NET/Admin.NET.Core/Entity/SysUser.cs

@@ -213,6 +213,8 @@ public class SysUser : EntityTenant
     /// <summary>
     /// 直属主管
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(ManagerUserId))]
     public SysUser ManagerUser { get; set; }
 
@@ -225,6 +227,8 @@ public class SysUser : EntityTenant
     /// <summary>
     /// 职位
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(PosId))]
     public SysPos SysPos { get; set; }
 

+ 6 - 0
Admin.NET/Admin.NET.Core/Entity/SysUserExtOrg.cs

@@ -25,6 +25,8 @@ public class SysUserExtOrg : EntityBaseId
     /// <summary>
     /// 用户
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(UserId))]
     public SysUser SysUser { get; set; }
 
@@ -37,6 +39,8 @@ public class SysUserExtOrg : EntityBaseId
     /// <summary>
     /// 机构
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(OrgId))]
     public SysOrg SysOrg { get; set; }
 
@@ -49,6 +53,8 @@ public class SysUserExtOrg : EntityBaseId
     /// <summary>
     /// 职位
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(PosId))]
     public SysPos SysPos { get; set; }
 

+ 2 - 0
Admin.NET/Admin.NET.Core/Entity/SysUserRole.cs

@@ -25,6 +25,8 @@ public class SysUserRole : EntityBaseId
     /// <summary>
     /// 用户
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(UserId))]
     public SysUser SysUser { get; set; }
 

+ 2 - 0
Admin.NET/Admin.NET.Core/Entity/SysWechatPay.cs

@@ -143,6 +143,8 @@ public class SysWechatPay : EntityBase
     /// <summary>
     /// 关联微信用户
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(OpenId))]
     public SysWechatUser SysWechatUser { get; set; }
 

+ 2 - 0
Admin.NET/Admin.NET.Core/Entity/SysWechatUser.cs

@@ -25,6 +25,8 @@ public class SysWechatUser : EntityBase
     /// <summary>
     /// 系统用户
     /// </summary>
+    [Newtonsoft.Json.JsonIgnore]
+    [System.Text.Json.Serialization.JsonIgnore]
     [Navigate(NavigateType.OneToOne, nameof(UserId))]
     public SysUser SysUser { get; set; }
 

+ 135 - 0
Admin.NET/Admin.NET.Core/EventBus/RabbitMQEventSourceStore.cs

@@ -0,0 +1,135 @@
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+using RabbitMQ.Client;
+using RabbitMQ.Client.Events;
+using System.Threading.Channels;
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// RabbitMQ自定义事件源存储器
+/// </summary>
+public class RabbitMQEventSourceStore : IEventSourceStorer
+{
+    /// <summary>
+    /// 内存通道事件源存储器
+    /// </summary>
+    private readonly Channel<IEventSource> _channel;
+
+    /// <summary>
+    /// 通道对象
+    /// </summary>
+    private readonly IModel _model;
+
+    /// <summary>
+    /// 连接对象
+    /// </summary>
+    private readonly IConnection _connection;
+
+    /// <summary>
+    /// 路由键
+    /// </summary>
+    private readonly string _routeKey;
+
+    /// <summary>
+    /// 构造函数
+    /// </summary>
+    /// <param name="factory">连接工厂</param>
+    /// <param name="routeKey">路由键</param>
+    /// <param name="capacity">存储器最多能够处理多少消息,超过该容量进入等待写入</param>
+    public RabbitMQEventSourceStore(ConnectionFactory factory, string routeKey, int capacity)
+    {
+        // 配置通道,设置超出默认容量后进入等待
+        var boundedChannelOptions = new BoundedChannelOptions(capacity)
+        {
+            FullMode = BoundedChannelFullMode.Wait
+        };
+
+        // 创建有限容量通道
+        _channel = Channel.CreateBounded<IEventSource>(boundedChannelOptions);
+
+        // 创建连接
+        _connection = factory.CreateConnection();
+        _routeKey = routeKey;
+
+        // 创建通道
+        _model = _connection.CreateModel();
+
+        // 声明路由队列
+        _model.QueueDeclare(routeKey, false, false, false, null);
+
+        // 创建消息订阅者
+        var consumer = new EventingBasicConsumer(_model);
+
+        // 订阅消息并写入内存 Channel
+        consumer.Received += (ch, ea) =>
+        {
+            // 读取原始消息
+            var stringEventSource = Encoding.UTF8.GetString(ea.Body.ToArray());
+
+            // 转换为 IEventSource,如果自定义了 EventSource,注意属性是可读可写
+            var eventSource = JSON.Deserialize<ChannelEventSource>(stringEventSource);
+
+            // 写入内存管道存储器
+            _channel.Writer.WriteAsync(eventSource);
+
+            // 确认该消息已被消费
+            _model.BasicAck(ea.DeliveryTag, false);
+        };
+
+        // 启动消费者且设置为手动应答消息
+        _model.BasicConsume(routeKey, false, consumer);
+    }
+
+    /// <summary>
+    /// 将事件源写入存储器
+    /// </summary>
+    /// <param name="eventSource">事件源对象</param>
+    /// <param name="cancellationToken">取消任务 Token</param>
+    /// <returns><see cref="ValueTask"/></returns>
+    public async ValueTask WriteAsync(IEventSource eventSource, CancellationToken cancellationToken)
+    {
+        if (eventSource == default)
+            throw new ArgumentNullException(nameof(eventSource));
+
+        // 判断是否是 ChannelEventSource 或自定义的 EventSource
+        if (eventSource is ChannelEventSource source)
+        {
+            // 序列化及发布
+            var data = Encoding.UTF8.GetBytes(JSON.Serialize(source));
+            _model.BasicPublish("", _routeKey, null, data);
+        }
+        else
+        {
+            // 处理动态订阅
+            await _channel.Writer.WriteAsync(eventSource, cancellationToken);
+        }
+    }
+
+    /// <summary>
+    /// 从存储器中读取一条事件源
+    /// </summary>
+    /// <param name="cancellationToken">取消任务 Token</param>
+    /// <returns>事件源对象</returns>
+    public async ValueTask<IEventSource> ReadAsync(CancellationToken cancellationToken)
+    {
+        var eventSource = await _channel.Reader.ReadAsync(cancellationToken);
+        return eventSource;
+    }
+
+    /// <summary>
+    /// 释放非托管资源
+    /// </summary>
+    public void Dispose()
+    {
+        _model.Dispose();
+        _connection.Dispose();
+    }
+}

+ 1 - 0
Admin.NET/Admin.NET.Core/GlobalUsings.cs

@@ -20,6 +20,7 @@ global using Furion.EventBus;
 global using Furion.FriendlyException;
 global using Furion.JsonSerialization;
 global using Furion.Logging;
+global using Furion.RemoteRequest;
 global using Furion.RemoteRequest.Extensions;
 global using Furion.Schedule;
 global using Furion.UnifyResult;

+ 2 - 2
Admin.NET/Admin.NET.Core/OAuth/OAuthSetup.cs

@@ -29,8 +29,8 @@ public static class OAuthSetup
             })
             .AddCookie(options =>
             {
-                options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None;
-                options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
+                options.Cookie.SameSite = SameSiteMode.None;
+                options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
             })
             .AddWeixin(options =>
             {

+ 22 - 28
Admin.NET/Admin.NET.Core/Service/File/Dto/FileOutput.cs → Admin.NET/Admin.NET.Core/Option/EventBusOptions.cs

@@ -1,4 +1,4 @@
-// 麻省理工学院许可证
+// 麻省理工学院许可证
 //
 // 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
 //
@@ -7,47 +7,41 @@
 // 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
 // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
 
-namespace Admin.NET.Core.Service;
+namespace Admin.NET.Core;
 
-public class FileOutput
+/// <summary>
+/// 事件总线配置选项
+/// </summary>
+public sealed class EventBusOptions : IConfigurableOptions
 {
     /// <summary>
-    /// Id
+    /// RabbitMQ
     /// </summary>
-    public long Id { get; set; }
-
-    /// <summary>
-    /// 提供者
-    /// </summary>
-    public string Provider { get; set; }
-
-    /// <summary>
-    /// 名称
-    /// </summary>
-    public string Name => Id + Suffix;
-
-    /// <summary>
-    /// URL
-    /// </summary>
-    public string Url { get; set; }
+    public RabbitMQSettings RabbitMQ { get; set; }
+}
 
+/// <summary>
+/// RabbitMQ
+/// </summary>
+public sealed class RabbitMQSettings
+{
     /// <summary>
-    /// 大小
+    /// 账号
     /// </summary>
-    public string SizeKb { get; set; }
+    public string UserName { get; set; }
 
     /// <summary>
-    /// 后缀
+    /// 密码
     /// </summary>
-    public string Suffix { get; set; }
+    public string Password { get; set; }
 
     /// <summary>
-    /// 路径
+    /// 主机
     /// </summary>
-    public string FilePath { get; set; }
+    public string HostName { get; set; }
 
     /// <summary>
-    /// 文件名称
+    /// 端口
     /// </summary>
-    public string FileName { get; set; }
+    public int Port { get; set; }
 }

+ 30 - 0
Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs

@@ -113,6 +113,36 @@ public class SysAuthService : IDynamicApiController, ITransient
         return await CreateToken(user);
     }
 
+    /// <summary>
+    /// 验证锁屏密码
+    /// </summary>
+    /// <param name="password"></param>
+    /// <returns></returns>
+    [DisplayName("验证锁屏密码")]
+    public async Task<bool> UnLockScreen([Required, FromQuery] string password)
+    {
+        // 账号是否存在
+        var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);
+        _ = user ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+
+        // 国密SM2解密(前端密码传输SM2加密后的)
+        password = CryptogramUtil.SM2Decrypt(password);
+
+        // 密码是否正确
+        if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString())
+        {
+            if (!user.Password.Equals(MD5Encryption.Encrypt(password)))
+                throw Oops.Oh(ErrorCodeEnum.D1000);
+        }
+        else
+        {
+            if (!CryptogramUtil.Decrypt(user.Password).Equals(password))
+                throw Oops.Oh(ErrorCodeEnum.D1000);
+        }
+
+        return true;
+    }
+
     /// <summary>
     /// 手机号登录
     /// </summary>

+ 26 - 0
Admin.NET/Admin.NET.Core/Service/Common/Dto/SmKeyPairOutput.cs

@@ -0,0 +1,26 @@
+// 麻省理工学院许可证
+//
+// 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
+//
+// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
+//
+// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
+// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
+
+namespace Admin.NET.Core.Service;
+
+/// <summary>
+/// 国密公钥私钥对输出
+/// </summary>
+public class SmKeyPairOutput
+{
+    /// <summary>
+    /// 私匙
+    /// </summary>
+    public string PrivateKey { get; set; }
+
+    /// <summary>
+    /// 公匙
+    /// </summary>
+    public string PublicKey { get; set; }
+}

+ 20 - 0
Admin.NET/Admin.NET.Core/Service/Common/SysCommonService.cs

@@ -8,6 +8,8 @@
 // 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
 
 using Microsoft.AspNetCore.Mvc.ApiExplorer;
+using Org.BouncyCastle.Crypto.Parameters;
+using Org.BouncyCastle.Utilities.Encoders;
 using Swashbuckle.AspNetCore.SwaggerGen;
 
 namespace Admin.NET.Core.Service;
@@ -26,6 +28,24 @@ public class SysCommonService : IDynamicApiController, ITransient
         _apiProvider = apiProvider;
     }
 
+    /// <summary>
+    /// 获取国密公钥私钥对
+    /// </summary>
+    /// <returns></returns>
+    [DisplayName("获取国密公钥私钥对")]
+    public SmKeyPairOutput GetSmKeyPair()
+    {
+        var kp = GM.GenerateKeyPair();
+        var privateKey = Hex.ToHexString(((ECPrivateKeyParameters)kp.Private).D.ToByteArray()).ToUpper();
+        var publicKey = Hex.ToHexString(((ECPublicKeyParameters)kp.Public).Q.GetEncoded()).ToUpper();
+
+        return new SmKeyPairOutput
+        {
+            PrivateKey = privateKey,
+            PublicKey = publicKey,
+        };
+    }
+
     /// <summary>
     /// 获取所有接口/动态API
     /// </summary>

+ 67 - 32
Admin.NET/Admin.NET.Core/Service/File/SysFileService.cs

@@ -1,4 +1,4 @@
-// 麻省理工学院许可证
+// 麻省理工学院许可证
 //
 // 版权所有 (c) 2021-2023 zuohuaijun,大名科技(天津)有限公司  联系电话/微信:18020030720  QQ:515096995
 //
@@ -62,18 +62,9 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="path"></param>
     /// <returns></returns>
     [DisplayName("上传文件")]
-    public async Task<FileOutput> UploadFile([Required] IFormFile file, [FromQuery] string? path)
+    public async Task<SysFile> UploadFile([Required] IFormFile file, [FromQuery] string? path)
     {
-        var sysFile = await HandleUploadFile(file, path);
-        return new FileOutput
-        {
-            Id = sysFile.Id,
-            Url = sysFile.Url, // string.IsNullOrWhiteSpace(sysFile.Url) ? _commonService.GetFileUrl(sysFile) : sysFile.Url,
-            SizeKb = sysFile.SizeKb,
-            Suffix = sysFile.Suffix,
-            FilePath = sysFile.FilePath,
-            FileName = sysFile.FileName
-        };
+        return await HandleUploadFile(file, path);
     }
 
     /// <summary>
@@ -84,7 +75,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="contentType"></param>
     /// <param name="path"></param>
     /// <returns></returns>
-    private async Task<FileOutput> UploadFileFromBase64(string strBase64, string fileName, string contentType, string? path)
+    private async Task<SysFile> UploadFileFromBase64(string strBase64, string fileName, string contentType, string? path)
     {
         byte[] fileData = Convert.FromBase64String(strBase64);
         var ms = new MemoryStream();
@@ -109,7 +100,7 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <returns></returns>
     [DisplayName("上传文件Base64")]
     [HttpPost]
-    public async Task<FileOutput> UploadFileFromBase64(UploadFileFromBase64Input input)
+    public async Task<SysFile> UploadFileFromBase64(UploadFileFromBase64Input input)
     {
         return await UploadFileFromBase64(input.FileDataBase64, input.FileName, input.ContentType, input.Path);
     }
@@ -120,9 +111,9 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="files"></param>
     /// <returns></returns>
     [DisplayName("上传多文件")]
-    public async Task<List<FileOutput>> UploadFiles([Required] List<IFormFile> files)
+    public async Task<List<SysFile>> UploadFiles([Required] List<IFormFile> files)
     {
-        var filelist = new List<FileOutput>();
+        var filelist = new List<SysFile>();
         foreach (var file in files)
         {
             filelist.Add(await UploadFile(file, ""));
@@ -154,6 +145,44 @@ public class SysFileService : IDynamicApiController, ITransient
         }
     }
 
+    /// <summary>
+    /// 下载指定文件Base64格式
+    /// </summary>
+    /// <param name="url"></param>
+    /// <returns></returns>
+    [AllowAnonymous]
+    public async Task<string> DownloadFileBase64([FromBody] string url)
+    {
+        if (_OSSProviderOptions.IsEnable)
+        {
+            using var httpClient = new HttpClient();
+            HttpResponseMessage response = await httpClient.GetAsync(url);
+            if (response.IsSuccessStatusCode)
+            {
+                // 读取文件内容并将其转换为 Base64 字符串
+                byte[] fileBytes = await response.Content.ReadAsByteArrayAsync();
+                return Convert.ToBase64String(fileBytes);
+            }
+            else
+            {
+                throw new HttpRequestException($"Request failed with status code: {response.StatusCode}");
+            }
+        }
+        else
+        {
+            var sysFile = await _sysFileRep.GetFirstAsync(u => u.Url == url) ?? throw Oops.Oh($"文件不存在");
+            var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, sysFile.FilePath);
+            if (!Directory.Exists(filePath))
+                Directory.CreateDirectory(filePath);
+
+            var realFile = Path.Combine(filePath, $"{sysFile.Id}{sysFile.Suffix}");
+            if (!File.Exists(realFile))
+                throw Oops.Oh($"文件[{realFile}]不在存");
+            byte[] fileBytes = File.ReadAllBytes(realFile);
+            return Convert.ToBase64String(fileBytes);
+        }
+    }
+
     /// <summary>
     /// 删除文件
     /// </summary>
@@ -226,7 +255,12 @@ public class SysFileService : IDynamicApiController, ITransient
             {
                 fileMd5 = OssUtils.ComputeContentMd5(fileStream, fileStream.Length);
             }
-            var sysFile = await _sysFileRep.GetFirstAsync(u => u.FileMd5 == fileMd5 && (u.SizeKb == null || u.SizeKb == sizeKb.ToString()));
+            /*
+             * Mysql8 中如果使用了 utf8mb4_general_ci 之外的编码会出错,尽量避免在条件里使用.ToString()
+             * 因为 Squsugar 并不是把变量转换为字符串来构造SQL语句,而是构造了CAST(123 AS CHAR)这样的语句,这样这个返回值是utf8mb4_general_ci,所以容易出错。
+             */
+            var strSizeKb = sizeKb.ToString();
+            var sysFile = await _sysFileRep.GetFirstAsync(u => u.FileMd5 == fileMd5 && (u.SizeKb == null || u.SizeKb == strSizeKb));
             if (sysFile != null) return sysFile;
         }
 
@@ -322,7 +356,10 @@ public class SysFileService : IDynamicApiController, ITransient
             //}
 
             // 生成外链
-            newFile.Url = $"{CommonUtil.GetLocalhost()}/{newFile.FilePath}/{newFile.Id + newFile.Suffix}";
+            var host = CommonUtil.GetLocalhost();
+            if (!host.EndsWith("/"))
+                host += "/";
+            newFile.Url = $"{host}{newFile.FilePath}/{newFile.Id + newFile.Suffix}";
         }
         await _sysFileRep.AsInsertable(newFile).ExecuteCommandAsync();
         return newFile;
@@ -345,21 +382,20 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="file"></param>
     /// <returns></returns>
     [DisplayName("上传头像")]
-    public async Task<FileOutput> UploadAvatar([Required] IFormFile file)
+    public async Task<SysFile> UploadAvatar([Required] IFormFile file)
     {
+        var sysFile = await UploadFile(file, "Upload/Avatar");
+
         var sysUserRep = _sysFileRep.ChangeRepository<SqlSugarRepository<SysUser>>();
         var user = sysUserRep.GetFirst(u => u.Id == _userManager.UserId);
-        // 删除当前用户已有头像
+        // 删除已有头像文件
         if (!string.IsNullOrWhiteSpace(user.Avatar))
         {
             var fileId = Path.GetFileNameWithoutExtension(user.Avatar);
             await DeleteFile(new DeleteFileInput { Id = long.Parse(fileId) });
         }
-
-        var res = await UploadFile(file, "Upload/Avatar");
-        var url = _OSSProviderOptions.IsEnable ? res.Url : $"{res.FilePath}/{res.Name}";
-        await sysUserRep.UpdateAsync(u => new SysUser() { Avatar = url }, u => u.Id == user.Id);
-        return res;
+        await sysUserRep.UpdateAsync(u => new SysUser() { Avatar = sysFile.Url }, u => u.Id == user.Id);
+        return sysFile;
     }
 
     /// <summary>
@@ -368,20 +404,19 @@ public class SysFileService : IDynamicApiController, ITransient
     /// <param name="file"></param>
     /// <returns></returns>
     [DisplayName("上传电子签名")]
-    public async Task<FileOutput> UploadSignature([Required] IFormFile file)
+    public async Task<SysFile> UploadSignature([Required] IFormFile file)
     {
+        var sysFile = await UploadFile(file, "Upload/Signature");
+
         var sysUserRep = _sysFileRep.ChangeRepository<SqlSugarRepository<SysUser>>();
         var user = sysUserRep.GetFirst(u => u.Id == _userManager.UserId);
-        // 删除当前用户已有电子签名
+        // 删除已有电子签名文件
         if (!string.IsNullOrWhiteSpace(user.Signature) && user.Signature.EndsWith(".png"))
         {
             var fileId = Path.GetFileNameWithoutExtension(user.Signature);
             await DeleteFile(new DeleteFileInput { Id = long.Parse(fileId) });
         }
-
-        var res = await UploadFile(file, "Upload/Signature");
-        var url = _OSSProviderOptions.IsEnable ? res.Url : $"{res.FilePath}/{res.Name}";
-        await sysUserRep.UpdateAsync(u => new SysUser() { Signature = url }, u => u.Id == user.Id);
-        return res;
+        await sysUserRep.UpdateAsync(u => new SysUser() { Signature = sysFile.Url }, u => u.Id == user.Id);
+        return sysFile;
     }
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs

@@ -249,7 +249,7 @@ public class SysMenuService : IDynamicApiController, ITransient
                     .WhereIF(menuIdList.Count > 0, u => menuIdList.Contains(u.Id))
                     .Select(u => u.Permission).ToListAsync()
                 : new List<string>();
-            _sysCacheService.Set(CacheConst.KeyUserButton + userId, permissions);
+            _sysCacheService.Set(CacheConst.KeyUserButton + userId, permissions, TimeSpan.FromDays(7));
         }
 
         return permissions;

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

@@ -293,7 +293,7 @@ public class SysOrgService : IDynamicApiController, ITransient
             // 当前所属机构
             if (!orgIdList.Contains(_userManager.OrgId))
                 orgIdList.Add(_userManager.OrgId);
-            _sysCacheService.Set($"{CacheConst.KeyUserOrg}{userId}", orgIdList); // 存缓存
+            _sysCacheService.Set($"{CacheConst.KeyUserOrg}{userId}", orgIdList, TimeSpan.FromDays(7)); // 存缓存
         }
         return orgIdList;
     }
@@ -348,7 +348,7 @@ public class SysOrgService : IDynamicApiController, ITransient
         }
 
         // 缓存当前用户最大角色数据范围
-        _sysCacheService.Set(CacheConst.KeyRoleMaxDataScope + _userManager.UserId, strongerDataScopeType);
+        _sysCacheService.Set(CacheConst.KeyRoleMaxDataScope + _userManager.UserId, strongerDataScopeType, TimeSpan.FromDays(7));
 
         // 根据角色集合获取机构集合
         var roleOrgIdList = await _sysRoleOrgService.GetRoleOrgIdList(customDataScopeRoleIdList);

+ 0 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleMenuService.cs

@@ -41,7 +41,6 @@ public class SysRoleMenuService : ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [UnitOfWork]
     public async Task GrantRoleMenu(RoleMenuInput input)
     {
         await _sysRoleMenuRep.DeleteAsync(u => u.RoleId == input.Id);

+ 0 - 1
Admin.NET/Admin.NET.Core/Service/Role/SysRoleOrgService.cs

@@ -26,7 +26,6 @@ public class SysRoleOrgService : ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [UnitOfWork]
     public async Task GrantRoleOrg(RoleOrgInput input)
     {
         await _sysRoleOrgRep.DeleteAsync(u => u.RoleId == input.Id);

+ 2 - 0
Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs

@@ -160,6 +160,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
+    [UnitOfWork]
     [DisplayName("授权角色菜单")]
     public async Task GrantMenu(RoleMenuInput input)
     {
@@ -171,6 +172,7 @@ public class SysRoleService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
+    [UnitOfWork]
     [DisplayName("授权角色数据范围")]
     public async Task GrantDataScope(RoleOrgInput input)
     {

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

@@ -104,6 +104,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
+    [UnitOfWork]
     [ApiDescriptionSettings(Name = "Add"), HttpPost]
     [DisplayName("增加租户")]
     public async Task AddTenant(AddTenantInput input)
@@ -308,6 +309,7 @@ public class SysTenantService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
+    [UnitOfWork]
     [DisplayName("授权租户管理员角色菜单")]
     public async Task GrantMenu(RoleMenuInput input)
     {

+ 0 - 1
Admin.NET/Admin.NET.Core/Service/User/SysUserExtOrgService.cs

@@ -37,7 +37,6 @@ public class SysUserExtOrgService : ITransient
     /// <param name="userId"></param>
     /// <param name="extOrgList"></param>
     /// <returns></returns>
-    [UnitOfWork]
     public async Task UpdateUserExtOrg(long userId, List<SysUserExtOrg> extOrgList)
     {
         await _sysUserExtOrgRep.DeleteAsync(u => u.UserId == userId);

+ 0 - 1
Admin.NET/Admin.NET.Core/Service/User/SysUserRoleService.cs

@@ -29,7 +29,6 @@ public class SysUserRoleService : ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
-    [UnitOfWork]
     public async Task GrantUserRole(UserRoleInput input)
     {
         await _sysUserRoleRep.DeleteAsync(u => u.UserId == input.UserId);

+ 1 - 0
Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs

@@ -234,6 +234,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
+    [UnitOfWork]
     [DisplayName("授权用户角色")]
     public async Task GrantRole(UserRoleInput input)
     {

+ 8 - 6
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -114,6 +114,7 @@ public static class SqlSugarSetup
         {
             db.Aop.OnLogExecuting = (sql, pars) =>
             {
+                var log = $"【{DateTime.Now}——执行SQL】\r\n{UtilMethods.GetSqlString(config.DbType, sql, pars)}\r\n";
                 var originColor = Console.ForegroundColor;
                 if (sql.StartsWith("SELECT", StringComparison.OrdinalIgnoreCase))
                     Console.ForegroundColor = ConsoleColor.Green;
@@ -121,19 +122,19 @@ public static class SqlSugarSetup
                     Console.ForegroundColor = ConsoleColor.Yellow;
                 if (sql.StartsWith("DELETE", StringComparison.OrdinalIgnoreCase))
                     Console.ForegroundColor = ConsoleColor.Red;
-                Console.WriteLine("【" + DateTime.Now + "——执行SQL】\r\n" + UtilMethods.GetSqlString(config.DbType, sql, pars) + "\r\n");
+                Console.WriteLine(log);
                 Console.ForegroundColor = originColor;
-                App.PrintToMiniProfiler("SqlSugar", "Info", sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
+                App.PrintToMiniProfiler("SqlSugar", "Info", log);
             };
             db.Aop.OnError = ex =>
             {
                 if (ex.Parametres == null) return;
+                var log = $"【{DateTime.Now}——错误SQL】\r\n{UtilMethods.GetSqlString(config.DbType, ex.Sql, (SugarParameter[])ex.Parametres)}\r\n";
                 var originColor = Console.ForegroundColor;
                 Console.ForegroundColor = ConsoleColor.DarkRed;
-                var pars = db.Utilities.SerializeObject(((SugarParameter[])ex.Parametres).ToDictionary(it => it.ParameterName, it => it.Value));
-                Console.WriteLine("【" + DateTime.Now + "——错误SQL】\r\n" + UtilMethods.GetSqlString(config.DbType, ex.Sql, (SugarParameter[])ex.Parametres) + "\r\n");
+                Console.WriteLine(log);
                 Console.ForegroundColor = originColor;
-                App.PrintToMiniProfiler("SqlSugar", "Error", $"{ex.Message}{Environment.NewLine}{ex.Sql}{pars}{Environment.NewLine}");
+                App.PrintToMiniProfiler("SqlSugar", "Error", log);
             };
             db.Aop.OnLogExecuted = (sql, pars) =>
             {
@@ -143,11 +144,12 @@ public static class SqlSugarSetup
                     var fileName = db.Ado.SqlStackTrace.FirstFileName; // 文件名
                     var fileLine = db.Ado.SqlStackTrace.FirstLine; // 行号
                     var firstMethodName = db.Ado.SqlStackTrace.FirstMethodName; // 方法名
-                    var log = $"【所在文件名】:{fileName}\r\n【代码行数】:{fileLine}\r\n【方法名】:{firstMethodName}\r\n" + $"【sql语句】:{UtilMethods.GetSqlString(config.DbType, sql, pars)}";
+                    var log = $"【{DateTime.Now}——超时SQL】\r\n【所在文件名】:{fileName}\r\n【代码行数】:{fileLine}\r\n【方法名】:{firstMethodName}\r\n" + $"【SQL语句】:{UtilMethods.GetSqlString(config.DbType, sql, pars)}";
                     var originColor = Console.ForegroundColor;
                     Console.ForegroundColor = ConsoleColor.DarkYellow;
                     Console.WriteLine(log);
                     Console.ForegroundColor = originColor;
+                    App.PrintToMiniProfiler("SqlSugar", "Slow", log);
                 }
             };
         }

+ 0 - 4
Admin.NET/Admin.NET.Core/Util/CodeGenUtil.cs

@@ -227,10 +227,6 @@ public static class CodeGenUtil
             case "varbit":
                 return "byte";
 
-            case "public.geometry":
-            case "inet":
-                return "object";
-
             default:
                 return "object";
         }

+ 6 - 1
Admin.NET/Admin.NET.Core/Util/CommonUtil.cs

@@ -50,10 +50,15 @@ public static class CommonUtil
     public static string GetLocalhost()
     {
         string result = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Host.Value}";
+
         // 代理模式:获取真正的本机地址
         // X-Original-Host=原始请求
         // X-Forwarded-Server=从哪里转发过来
-        if (App.HttpContext.Request.Headers.ContainsKey("X-Original-Host"))
+        if (App.HttpContext.Request.Headers.ContainsKey("Origin")) // 配置成完整的路径如(结尾不要带"/"),比如 https://www.abc.com
+            result = $"{App.HttpContext.Request.Headers["Origin"]}";
+        else if (App.HttpContext.Request.Headers.ContainsKey("X-Original")) // 配置成完整的路径如(结尾不要带"/"),比如 https://www.abc.com
+            result = $"{App.HttpContext.Request.Headers["X-Original"]}";
+        else if (App.HttpContext.Request.Headers.ContainsKey("X-Original-Host"))
             result = $"{App.HttpContext.Request.Scheme}://{App.HttpContext.Request.Headers["X-Original-Host"]}";
         return result;
     }

+ 4 - 3
Admin.NET/Admin.NET.Core/Util/GM/GM.cs

@@ -256,6 +256,7 @@ public class GM
         return new DerSequence(v).GetEncoded("DER");
     }
 
+    // 生成公私匙对
     public static AsymmetricCipherKeyPair GenerateKeyPair()
     {
         ECKeyPairGenerator kpGen = new();
@@ -335,7 +336,7 @@ public class GM
      *
      * @param Z
      * @param klen
-     *            生成klen字节数长度的密钥
+     * 生成klen字节数长度的密钥
      * @return
      */
 
@@ -441,7 +442,7 @@ public class GM
         Asn1OctetString pubKeyX509 = (Asn1OctetString)pubSeq[1];
         X509Certificate x509 = new X509CertificateParser().ReadCertificate(pubKeyX509.GetOctets());
         sm2Cert.publicKey = x509.GetPublicKey();
-        sm2Cert.certId = x509.SerialNumber.ToString(10); //这里转10进,有啥其他进制要求的自己改改
+        sm2Cert.certId = x509.SerialNumber.ToString(10); //这里转10进,有啥其他进制要求的自己改改
         return sm2Cert;
     }
 
@@ -457,7 +458,7 @@ public class GM
 
         X509Certificate x509 = new X509CertificateParser().ReadCertificate(cert);
         sm2Cert.publicKey = x509.GetPublicKey();
-        sm2Cert.certId = x509.SerialNumber.ToString(10); //这里转10进,有啥其他进制要求的自己改改
+        sm2Cert.certId = x509.SerialNumber.ToString(10); //这里转10进,有啥其他进制要求的自己改改
         return sm2Cert;
     }
 

+ 1 - 1
Admin.NET/Admin.NET.Web.Core/Admin.NET.Web.Core.csproj

@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <TargetFramework>net6.0</TargetFramework>

+ 1 - 0
Admin.NET/Admin.NET.Web.Core/ProjectOptions.cs

@@ -39,6 +39,7 @@ public static class ProjectOptions
         services.AddConfigurableOptions<OAuthOptions>();
         services.AddConfigurableOptions<CryptogramOptions>();
         services.AddConfigurableOptions<SMSOptions>();
+        services.AddConfigurableOptions<EventBusOptions>();
         //services.AddConfigurableOptions<IpRateLimitingOptions>();
         //services.AddConfigurableOptions<IpRateLimitPoliciesOptions>();
         //services.AddConfigurableOptions<ClientRateLimitingOptions>();

+ 42 - 14
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -108,13 +108,38 @@ public class Startup : AppStartup
             options.LogEnabled = false;
             // 事件执行器(失败重试)
             options.AddExecutor<RetryEventHandlerExecutor>();
+
+            #region Redis消息队列
+
             //// 替换事件源存储器
             //options.ReplaceStorer(serviceProvider =>
             //{
             //    var redisCache = serviceProvider.GetService<ICache>();
-            //    // 创建默认内存通道事件源对象,可自定义队列路由key,比如这里是 eventbus
-            //    return new RedisEventSourceStorer(redisCache, "eventbus", 3000);
+            //    // 创建默认内存通道事件源对象,可自定义队列路由key,如:adminnet
+            //    return new RedisEventSourceStorer(redisCache, "adminnet", 3000);
             //});
+
+            #endregion Redis消息队列
+
+            #region RabbitMQ消息队列
+
+            //// 创建默认内存通道事件源对象,可自定义队列路由key,如:adminnet
+            //var eventBusOpt = App.GetConfig<EventBusOptions>("EventBus", true);
+            //var rbmqEventSourceStorer = new RabbitMQEventSourceStore(new ConnectionFactory
+            //{
+            //    UserName = eventBusOpt.RabbitMQ.UserName,
+            //    Password = eventBusOpt.RabbitMQ.Password,
+            //    HostName = eventBusOpt.RabbitMQ.HostName,
+            //    Port = eventBusOpt.RabbitMQ.Port
+            //}, "adminnet", 3000);
+
+            //// 替换默认事件总线存储器
+            //options.ReplaceStorer(serviceProvider =>
+            //{
+            //    return rbmqEventSourceStorer;
+            //});
+
+            #endregion RabbitMQ消息队列
         });
 
         // 图像处理
@@ -155,18 +180,9 @@ public class Startup : AppStartup
             app.UseHsts();
         }
 
-        // 添加状态码拦截中间件
-        app.UseUnifyResultStatusCodes();
-
-        // 配置多语言
-        app.UseAppLocalization();
-
         // 图像处理
         app.UseImageSharp();
 
-        //// 启用HTTPS
-        //app.UseHttpsRedirection();
-
         // 特定文件类型(文件后缀)处理
         var contentTypeProvider = FS.GetFileExtensionContentTypeProvider();
         // contentTypeProvider.Mappings[".文件后缀"] = "MIME 类型";
@@ -175,17 +191,29 @@ public class Startup : AppStartup
             ContentTypeProvider = contentTypeProvider
         });
 
+        //// 启用HTTPS
+        //app.UseHttpsRedirection();
+
+        // 添加状态码拦截中间件
+        app.UseUnifyResultStatusCodes();
+
+        // 启用多语言,必须在 UseRouting 之前
+        app.UseAppLocalization();
+
+        // 路由注册
         app.UseRouting();
 
+        // 启用跨域,必须在 UseRouting 和 UseAuthentication 之间注册
         app.UseCorsAccessor();
 
+        // 启用鉴权授权
+        app.UseAuthentication();
+        app.UseAuthorization();
+
         // 限流组件(在跨域之后)
         app.UseIpRateLimiting();
         app.UseClientRateLimiting();
 
-        app.UseAuthentication();
-        app.UseAuthorization();
-
         // 任务调度看板
         app.UseScheduleUI();
 

+ 0 - 12
Admin.NET/Admin.NET.Web.Entry/.config/dotnet-tools.json

@@ -1,12 +0,0 @@
-{
-  "version": 1,
-  "isRoot": true,
-  "tools": {
-    "dotnet-ef": {
-      "version": "6.0.2",
-      "commands": [
-        "dotnet-ef"
-      ]
-    }
-  }
-}

+ 1 - 1
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Service.cs.vm

@@ -221,7 +221,7 @@ if(@column.EffectType == "Upload"){
     @:/// <param name="file"></param>
     @:/// <returns></returns>
     @:[ApiDescriptionSettings(Name = "Upload@(@column.PropertyName)"), HttpPost]
-    @:public async Task<FileOutput> Upload@(@column.PropertyName)([Required] IFormFile file)
+    @:public async Task<SysFile> Upload@(@column.PropertyName)([Required] IFormFile file)
     @:{
             @:var service = App.GetService<SysFileService>();
             @:return await service.UploadFile(file, "upload/@(@column.PropertyName)"); 

+ 13 - 9
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm

@@ -79,25 +79,29 @@
             }
           @:<el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6" class="mb10">
             @:<el-form-item>
-              @:<el-button-group>
+              @:<el-button-group style="display: flex; align-items: center;">
                 @:<el-button type="primary"  icon="ele-Search" @@click="handleQuery" v-auth="'@(@Model.LowerClassName):page'"> 查询 </el-button>
                 @:<el-button icon="ele-Refresh" @@click="() => queryParams = {}"> 重置 </el-button>
                 @if(haveLikeCdt){
-                @:<el-button icon="ele-ZoomIn" @@click="changeAdvanceQueryUI" v-if="!showAdvanceQueryUI"> 高级 </el-button>
-                @:<el-button icon="ele-ZoomOut" @@click="changeAdvanceQueryUI" v-if="showAdvanceQueryUI"> 隐藏 </el-button>
+                @:<el-button icon="ele-ZoomIn" @@click="changeAdvanceQueryUI" v-if="!showAdvanceQueryUI" style="margin-left:5px;"> 高级查询 </el-button>
+                @:<el-button icon="ele-ZoomOut" @@click="changeAdvanceQueryUI" v-if="showAdvanceQueryUI" style="margin-left:5px;"> 隐藏 </el-button>
                 }
+                @:<el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @@click="openAdd@(@Model.ClassName)" v-auth="'@(@Model.LowerClassName):add'"> 新增 </el-button>
                 @:
               </el-button-group>
-              @:
-              @:<el-button-group style="margin-left:20px">
-                @:<el-button type="primary" icon="ele-Plus" @@click="openAdd@(@Model.ClassName)" v-auth="'@(@Model.LowerClassName):add'"> 新增 </el-button>
-                @:
-              </el-button-group>
-              @:
             </el-form-item>
             @:
           @:</el-col>
         </el-row>
+        @* 操作区另起一行
+        @:<el-row>
+          @:<el-col>
+            @:<el-button-group style="margin-left:20px;margin-bottom:5px;">
+              @:<el-button type="primary" icon="ele-Plus" @@click="openAdd@(@Model.ClassName)" v-auth="'@(@Model.LowerClassName):add'"> 新增 </el-button>
+            </el-button-group>
+          @:</el-col>
+        </el-row>
+		*@
       </el-form>
       }
     </el-card>

+ 4 - 4
Admin.NET/Plugins/Admin.NET.Plugin.Elsa/Admin.NET.Plugin.Elsa.csproj

@@ -16,10 +16,10 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Elsa" Version="2.13.0" />
-    <PackageReference Include="Elsa.Activities.Http" Version="2.13.0" />
-    <PackageReference Include="Elsa.Designer.Components.Web" Version="2.13.0" />
-    <PackageReference Include="Elsa.Server.Api" Version="2.13.0" />
+    <PackageReference Include="Elsa" Version="2.14.1" />
+    <PackageReference Include="Elsa.Activities.Http" Version="2.14.1" />
+    <PackageReference Include="Elsa.Designer.Components.Web" Version="2.14.1" />
+    <PackageReference Include="Elsa.Server.Api" Version="2.14.1" />
   </ItemGroup>
 
   <ItemGroup>

+ 2 - 0
Admin.NET/Plugins/Admin.NET.Plugin.GoView/Entity/GoViewPro.cs

@@ -45,6 +45,8 @@ public class GoViewPro : EntityTenant
     ///// <summary>
     ///// 项目数据
     ///// </summary>
+    //[Newtonsoft.Json.JsonIgnore]
+    //[System.Text.Json.Serialization.JsonIgnore]
     //[Navigate(NavigateType.OneToOne, nameof(Id))]
     //public GoViewProData GoViewProData { get; set; }
 }

+ 10 - 10
Web/package.json

@@ -19,13 +19,13 @@
 		"@wangeditor/editor": "^5.1.23",
 		"@wangeditor/editor-for-vue": "^5.1.12",
 		"animate.css": "^4.1.1",
-		"axios": "^1.6.5",
+		"axios": "^1.6.7",
 		"countup.js": "^2.8.0",
 		"cropperjs": "^1.6.1",
 		"echarts": "^5.4.3",
 		"echarts-gl": "^2.0.9",
 		"echarts-wordcloud": "^2.1.0",
-		"element-plus": "^2.5.2",
+		"element-plus": "^2.5.5",
 		"js-cookie": "^3.0.5",
 		"js-table2excel": "^1.1.2",
 		"jsplumb": "^2.15.6",
@@ -45,9 +45,9 @@
 		"vform3-builds": "^3.0.10",
 		"vue": "^3.4.15",
 		"vue-clipboard3": "^2.0.0",
-		"vue-demi": "^0.14.6",
+		"vue-demi": "^0.14.7",
 		"vue-grid-layout": "3.0.0-beta1",
-		"vue-i18n": "^9.9.0",
+		"vue-i18n": "^9.9.1",
 		"vue-json-pretty": "^2.3.0",
 		"vue-plugin-hiprint": "0.0.57-beta6",
 		"vue-router": "^4.2.5",
@@ -57,17 +57,17 @@
 	},
 	"devDependencies": {
 		"@types/lodash-es": "^4.17.12",
-		"@types/node": "^20.11.5",
+		"@types/node": "^20.11.16",
 		"@types/nprogress": "^0.2.3",
 		"@types/sortablejs": "^1.15.7",
-		"@typescript-eslint/eslint-plugin": "^6.19.0",
-		"@typescript-eslint/parser": "^6.19.0",
+		"@typescript-eslint/eslint-plugin": "^6.20.0",
+		"@typescript-eslint/parser": "^6.20.0",
 		"@vitejs/plugin-vue": "^5.0.3",
 		"@vitejs/plugin-vue-jsx": "^3.1.0",
 		"@vue/compiler-sfc": "^3.4.15",
-		"code-inspector-plugin": "^0.4.5",
+		"code-inspector-plugin": "^0.7.0",
 		"eslint": "^8.56.0",
-		"eslint-plugin-vue": "^9.20.1",
+		"eslint-plugin-vue": "^9.21.1",
 		"less": "^4.2.0",
 		"prettier": "^3.2.4",
 		"sass": "^1.70.0",
@@ -76,7 +76,7 @@
 		"vite-plugin-cdn-import": "^0.3.5",
 		"vite-plugin-compression": "^0.5.1",
 		"vite-plugin-vue-setup-extend-plus": "^0.1.0",
-		"vue-eslint-parser": "^9.4.0"
+		"vue-eslint-parser": "^9.4.2"
 	},
 	"browserslist": [
 		"> 1%",

+ 9 - 0
Web/src/App.vue

@@ -106,3 +106,12 @@ watch(
 	}
 );
 </script>
+
+<style>
+.el-select {
+	width: 171px !important;
+}
+.el-select__wrapper {
+	line-height: 22px !important;
+}
+</style>

+ 88 - 0
Web/src/api-services/apis/sys-auth-api.ts

@@ -17,6 +17,7 @@ import { Configuration } from '../configuration';
 // Some imports not used depending on template conditions
 // @ts-ignore
 import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
+import { AdminResultBoolean } from '../models';
 import { AdminResultLoginOutput } from '../models';
 import { AdminResultLoginUserOutput } from '../models';
 import { AdminResultObject } from '../models';
@@ -310,6 +311,58 @@ export const SysAuthApiAxiosParamCreator = function (configuration?: Configurati
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 验证锁屏密码
+         * @param {string} password 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysAuthUnLockScreenPost: async (password: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            // verify required parameter 'password' is not null or undefined
+            if (password === null || password === undefined) {
+                throw new RequiredError('password','Required parameter password was null or undefined when calling apiSysAuthUnLockScreenPost.');
+            }
+            const localVarPath = `/api/sysAuth/unLockScreen`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            if (password !== undefined) {
+                localVarQueryParameter['password'] = password;
+            }
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
         /**
          * 
          * @summary 获取登录账号
@@ -586,6 +639,20 @@ export const SysAuthApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 验证锁屏密码
+         * @param {string} password 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysAuthUnLockScreenPost(password: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultBoolean>>> {
+            const localVarAxiosArgs = await SysAuthApiAxiosParamCreator(configuration).apiSysAuthUnLockScreenPost(password, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 获取登录账号
@@ -706,6 +773,16 @@ export const SysAuthApiFactory = function (configuration?: Configuration, basePa
         async apiSysAuthRefreshTokenGet(accessToken?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultString>> {
             return SysAuthApiFp(configuration).apiSysAuthRefreshTokenGet(accessToken, options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 验证锁屏密码
+         * @param {string} password 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysAuthUnLockScreenPost(password: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultBoolean>> {
+            return SysAuthApiFp(configuration).apiSysAuthUnLockScreenPost(password, options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 获取登录账号
@@ -817,6 +894,17 @@ export class SysAuthApi extends BaseAPI {
     public async apiSysAuthRefreshTokenGet(accessToken?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultString>> {
         return SysAuthApiFp(this.configuration).apiSysAuthRefreshTokenGet(accessToken, options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 验证锁屏密码
+     * @param {string} password 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysAuthApi
+     */
+    public async apiSysAuthUnLockScreenPost(password: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultBoolean>> {
+        return SysAuthApiFp(this.configuration).apiSysAuthUnLockScreenPost(password, options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 获取登录账号

+ 76 - 0
Web/src/api-services/apis/sys-common-api.ts

@@ -18,6 +18,7 @@ import { Configuration } from '../configuration';
 // @ts-ignore
 import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
 import { AdminResultListApiOutput } from '../models';
+import { AdminResultSmKeyPairOutput } from '../models';
 /**
  * SysCommonApi - axios parameter creator
  * @export
@@ -62,6 +63,49 @@ export const SysCommonApiAxiosParamCreator = function (configuration?: Configura
             let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
             localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
 
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
+        /**
+         * 
+         * @summary 获取国密公钥私钥对
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysCommonSmKeyPairGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysCommon/smKeyPair`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+
             return {
                 url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
                 options: localVarRequestOptions,
@@ -89,6 +133,19 @@ export const SysCommonApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 获取国密公钥私钥对
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysCommonSmKeyPairGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSmKeyPairOutput>>> {
+            const localVarAxiosArgs = await SysCommonApiAxiosParamCreator(configuration).apiSysCommonSmKeyPairGet(options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
     }
 };
 
@@ -107,6 +164,15 @@ export const SysCommonApiFactory = function (configuration?: Configuration, base
         async apiSysCommonApiListGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListApiOutput>> {
             return SysCommonApiFp(configuration).apiSysCommonApiListGet(options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 获取国密公钥私钥对
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysCommonSmKeyPairGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSmKeyPairOutput>> {
+            return SysCommonApiFp(configuration).apiSysCommonSmKeyPairGet(options).then((request) => request(axios, basePath));
+        },
     };
 };
 
@@ -127,4 +193,14 @@ export class SysCommonApi extends BaseAPI {
     public async apiSysCommonApiListGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListApiOutput>> {
         return SysCommonApiFp(this.configuration).apiSysCommonApiListGet(options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 获取国密公钥私钥对
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysCommonApi
+     */
+    public async apiSysCommonSmKeyPairGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSmKeyPairOutput>> {
+        return SysCommonApiFp(this.configuration).apiSysCommonSmKeyPairGet(options).then((request) => request(this.axios, this.basePath));
+    }
 }

+ 101 - 17
Web/src/api-services/apis/sys-file-api.ts

@@ -17,10 +17,11 @@ import { Configuration } from '../configuration';
 // Some imports not used depending on template conditions
 // @ts-ignore
 import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
-import { AdminResultFileOutput } from '../models';
 import { AdminResultIActionResult } from '../models';
-import { AdminResultListFileOutput } from '../models';
+import { AdminResultListSysFile } from '../models';
 import { AdminResultSqlSugarPagedListSysFile } from '../models';
+import { AdminResultString } from '../models';
+import { AdminResultSysFile } from '../models';
 import { DeleteFileInput } from '../models';
 import { FileInput } from '../models';
 import { PageFileInput } from '../models';
@@ -79,6 +80,54 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
                 options: localVarRequestOptions,
             };
         },
+        /**
+         * 
+         * @summary 下载指定文件Base64格式
+         * @param {string} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        apiSysFileDownloadFileBase64Post: async (body?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
+            const localVarPath = `/api/sysFile/downloadFileBase64`;
+            // use dummy base URL string because the URL constructor only accepts absolute URLs.
+            const localVarUrlObj = new URL(localVarPath, 'https://example.com');
+            let baseOptions;
+            if (configuration) {
+                baseOptions = configuration.baseOptions;
+            }
+            const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
+            const localVarHeaderParameter = {} as any;
+            const localVarQueryParameter = {} as any;
+
+            // authentication Bearer required
+            // http bearer authentication required
+            if (configuration && configuration.accessToken) {
+                const accessToken = typeof configuration.accessToken === 'function'
+                    ? await configuration.accessToken()
+                    : await configuration.accessToken;
+                localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
+            }
+
+            localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
+
+            const query = new URLSearchParams(localVarUrlObj.search);
+            for (const key in localVarQueryParameter) {
+                query.set(key, localVarQueryParameter[key]);
+            }
+            for (const key in options.params) {
+                query.set(key, options.params[key]);
+            }
+            localVarUrlObj.search = (new URLSearchParams(query)).toString();
+            let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
+            localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
+            const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
+            localVarRequestOptions.data =  needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
+
+            return {
+                url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
+                options: localVarRequestOptions,
+            };
+        },
         /**
          * 
          * @summary 根据文件Id或Url下载
@@ -508,6 +557,20 @@ export const SysFileApiFp = function(configuration?: Configuration) {
                 return axios.request(axiosRequestArgs);
             };
         },
+        /**
+         * 
+         * @summary 下载指定文件Base64格式
+         * @param {string} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysFileDownloadFileBase64Post(body?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultString>>> {
+            const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileDownloadFileBase64Post(body, options);
+            return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
+                const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
+                return axios.request(axiosRequestArgs);
+            };
+        },
         /**
          * 
          * @summary 根据文件Id或Url下载
@@ -557,7 +620,7 @@ export const SysFileApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadAvatarPostForm(file?: Blob, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultFileOutput>>> {
+        async apiSysFileUploadAvatarPostForm(file?: Blob, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> {
             const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadAvatarPostForm(file, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@@ -571,7 +634,7 @@ export const SysFileApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadFileFromBase64Post(body?: UploadFileFromBase64Input, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultFileOutput>>> {
+        async apiSysFileUploadFileFromBase64Post(body?: UploadFileFromBase64Input, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> {
             const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFileFromBase64Post(body, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@@ -586,7 +649,7 @@ export const SysFileApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadFilePostForm(file?: Blob, path?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultFileOutput>>> {
+        async apiSysFileUploadFilePostForm(file?: Blob, path?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> {
             const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFilePostForm(file, path, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@@ -600,7 +663,7 @@ export const SysFileApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadFilesPostForm(files?: Array<Blob>, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListFileOutput>>> {
+        async apiSysFileUploadFilesPostForm(files?: Array<Blob>, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultListSysFile>>> {
             const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFilesPostForm(files, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@@ -614,7 +677,7 @@ export const SysFileApiFp = function(configuration?: Configuration) {
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadSignaturePostForm(file?: Blob, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultFileOutput>>> {
+        async apiSysFileUploadSignaturePostForm(file?: Blob, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysFile>>> {
             const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadSignaturePostForm(file, options);
             return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
                 const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
@@ -640,6 +703,16 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
         async apiSysFileDeletePost(body?: DeleteFileInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
             return SysFileApiFp(configuration).apiSysFileDeletePost(body, options).then((request) => request(axios, basePath));
         },
+        /**
+         * 
+         * @summary 下载指定文件Base64格式
+         * @param {string} [body] 
+         * @param {*} [options] Override http request option.
+         * @throws {RequiredError}
+         */
+        async apiSysFileDownloadFileBase64Post(body?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultString>> {
+            return SysFileApiFp(configuration).apiSysFileDownloadFileBase64Post(body, options).then((request) => request(axios, basePath));
+        },
         /**
          * 
          * @summary 根据文件Id或Url下载
@@ -677,7 +750,7 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadAvatarPostForm(file?: Blob, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultFileOutput>> {
+        async apiSysFileUploadAvatarPostForm(file?: Blob, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> {
             return SysFileApiFp(configuration).apiSysFileUploadAvatarPostForm(file, options).then((request) => request(axios, basePath));
         },
         /**
@@ -687,7 +760,7 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadFileFromBase64Post(body?: UploadFileFromBase64Input, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultFileOutput>> {
+        async apiSysFileUploadFileFromBase64Post(body?: UploadFileFromBase64Input, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> {
             return SysFileApiFp(configuration).apiSysFileUploadFileFromBase64Post(body, options).then((request) => request(axios, basePath));
         },
         /**
@@ -698,7 +771,7 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadFilePostForm(file?: Blob, path?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultFileOutput>> {
+        async apiSysFileUploadFilePostForm(file?: Blob, path?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> {
             return SysFileApiFp(configuration).apiSysFileUploadFilePostForm(file, path, options).then((request) => request(axios, basePath));
         },
         /**
@@ -708,7 +781,7 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadFilesPostForm(files?: Array<Blob>, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListFileOutput>> {
+        async apiSysFileUploadFilesPostForm(files?: Array<Blob>, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultListSysFile>> {
             return SysFileApiFp(configuration).apiSysFileUploadFilesPostForm(files, options).then((request) => request(axios, basePath));
         },
         /**
@@ -718,7 +791,7 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
          * @param {*} [options] Override http request option.
          * @throws {RequiredError}
          */
-        async apiSysFileUploadSignaturePostForm(file?: Blob, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultFileOutput>> {
+        async apiSysFileUploadSignaturePostForm(file?: Blob, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysFile>> {
             return SysFileApiFp(configuration).apiSysFileUploadSignaturePostForm(file, options).then((request) => request(axios, basePath));
         },
     };
@@ -742,6 +815,17 @@ export class SysFileApi extends BaseAPI {
     public async apiSysFileDeletePost(body?: DeleteFileInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
         return SysFileApiFp(this.configuration).apiSysFileDeletePost(body, options).then((request) => request(this.axios, this.basePath));
     }
+    /**
+     * 
+     * @summary 下载指定文件Base64格式
+     * @param {string} [body] 
+     * @param {*} [options] Override http request option.
+     * @throws {RequiredError}
+     * @memberof SysFileApi
+     */
+    public async apiSysFileDownloadFileBase64Post(body?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultString>> {
+        return SysFileApiFp(this.configuration).apiSysFileDownloadFileBase64Post(body, options).then((request) => request(this.axios, this.basePath));
+    }
     /**
      * 
      * @summary 根据文件Id或Url下载
@@ -783,7 +867,7 @@ export class SysFileApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysFileApi
      */
-    public async apiSysFileUploadAvatarPostForm(file?: Blob, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultFileOutput>> {
+    public async apiSysFileUploadAvatarPostForm(file?: Blob, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> {
         return SysFileApiFp(this.configuration).apiSysFileUploadAvatarPostForm(file, options).then((request) => request(this.axios, this.basePath));
     }
     /**
@@ -794,7 +878,7 @@ export class SysFileApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysFileApi
      */
-    public async apiSysFileUploadFileFromBase64Post(body?: UploadFileFromBase64Input, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultFileOutput>> {
+    public async apiSysFileUploadFileFromBase64Post(body?: UploadFileFromBase64Input, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> {
         return SysFileApiFp(this.configuration).apiSysFileUploadFileFromBase64Post(body, options).then((request) => request(this.axios, this.basePath));
     }
     /**
@@ -806,7 +890,7 @@ export class SysFileApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysFileApi
      */
-    public async apiSysFileUploadFilePostForm(file?: Blob, path?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultFileOutput>> {
+    public async apiSysFileUploadFilePostForm(file?: Blob, path?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> {
         return SysFileApiFp(this.configuration).apiSysFileUploadFilePostForm(file, path, options).then((request) => request(this.axios, this.basePath));
     }
     /**
@@ -817,7 +901,7 @@ export class SysFileApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysFileApi
      */
-    public async apiSysFileUploadFilesPostForm(files?: Array<Blob>, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListFileOutput>> {
+    public async apiSysFileUploadFilesPostForm(files?: Array<Blob>, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultListSysFile>> {
         return SysFileApiFp(this.configuration).apiSysFileUploadFilesPostForm(files, options).then((request) => request(this.axios, this.basePath));
     }
     /**
@@ -828,7 +912,7 @@ export class SysFileApi extends BaseAPI {
      * @throws {RequiredError}
      * @memberof SysFileApi
      */
-    public async apiSysFileUploadSignaturePostForm(file?: Blob, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultFileOutput>> {
+    public async apiSysFileUploadSignaturePostForm(file?: Blob, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysFile>> {
         return SysFileApiFp(this.configuration).apiSysFileUploadSignaturePostForm(file, options).then((request) => request(this.axios, this.basePath));
     }
 }

+ 1 - 8
Web/src/api-services/models/add-dict-data-input.ts

@@ -13,9 +13,8 @@
  */
 
 import { StatusEnum } from './status-enum';
-import { SysDictType } from './sys-dict-type';
 import {
-    StatusEnum,SysDictType,
+    StatusEnum,
 } from ".";
 
 /**
@@ -98,12 +97,6 @@ export interface AddDictDataInput {
      */
     dictTypeId?: number;
 
-    /**
-     * @type {SysDictType}
-     * @memberof AddDictDataInput
-     */
-    dictType?: SysDictType;
-
     /**
      * 值
      *

+ 1 - 15
Web/src/api-services/models/add-open-access-input.ts

@@ -12,10 +12,8 @@
  * Do not edit the class manually.
  */
 
-import { SysTenant } from './sys-tenant';
-import { SysUser } from './sys-user';
 import {
-    SysTenant,SysUser,
+    
 } from ".";
 
 /**
@@ -98,18 +96,6 @@ export interface AddOpenAccessInput {
      */
     bindTenantId?: number;
 
-    /**
-     * @type {SysTenant}
-     * @memberof AddOpenAccessInput
-     */
-    bindTenant?: SysTenant;
-
-    /**
-     * @type {SysUser}
-     * @memberof AddOpenAccessInput
-     */
-    bindUser?: SysUser;
-
     /**
      * 身份标识
      *

+ 1 - 8
Web/src/api-services/models/add-org-input.ts

@@ -14,9 +14,8 @@
 
 import { StatusEnum } from './status-enum';
 import { SysOrg } from './sys-org';
-import { SysUser } from './sys-user';
 import {
-    StatusEnum,SysOrg,SysUser,
+    StatusEnum,SysOrg,
 } from ".";
 
 /**
@@ -139,12 +138,6 @@ export interface AddOrgInput {
      */
     directorId?: number | null;
 
-    /**
-     * @type {SysUser}
-     * @memberof AddOrgInput
-     */
-    director?: SysUser;
-
     /**
      * 排序
      *

+ 1 - 15
Web/src/api-services/models/add-user-input.ts

@@ -18,11 +18,9 @@ import { CultureLevelEnum } from './culture-level-enum';
 import { GenderEnum } from './gender-enum';
 import { StatusEnum } from './status-enum';
 import { SysOrg } from './sys-org';
-import { SysPos } from './sys-pos';
-import { SysUser } from './sys-user';
 import { SysUserExtOrg } from './sys-user-ext-org';
 import {
-    AccountTypeEnum,CardTypeEnum,CultureLevelEnum,GenderEnum,StatusEnum,SysOrg,SysPos,SysUser,SysUserExtOrg,
+    AccountTypeEnum,CardTypeEnum,CultureLevelEnum,GenderEnum,StatusEnum,SysOrg,SysUserExtOrg,
 } from ".";
 
 /**
@@ -301,12 +299,6 @@ export interface AddUserInput {
      */
     managerUserId?: number | null;
 
-    /**
-     * @type {SysUser}
-     * @memberof AddUserInput
-     */
-    managerUser?: SysUser;
-
     /**
      * 职位Id
      *
@@ -315,12 +307,6 @@ export interface AddUserInput {
      */
     posId?: number;
 
-    /**
-     * @type {SysPos}
-     * @memberof AddUserInput
-     */
-    sysPos?: SysPos;
-
     /**
      * 工号
      *

+ 12 - 12
Web/src/api-services/models/admin-result-list-file-output.ts → Web/src/api-services/models/admin-result-list-sys-file.ts

@@ -12,24 +12,24 @@
  * Do not edit the class manually.
  */
 
-import { FileOutput } from './file-output';
+import { SysFile } from './sys-file';
 import {
-    FileOutput,
+    SysFile,
 } from ".";
 
 /**
  * 全局返回结果
  *
  * @export
- * @interface AdminResultListFileOutput
+ * @interface AdminResultListSysFile
  */
-export interface AdminResultListFileOutput {
+export interface AdminResultListSysFile {
 
     /**
      * 状态码
      *
      * @type {number}
-     * @memberof AdminResultListFileOutput
+     * @memberof AdminResultListSysFile
      */
     code?: number;
 
@@ -37,7 +37,7 @@ export interface AdminResultListFileOutput {
      * 类型success、warning、error
      *
      * @type {string}
-     * @memberof AdminResultListFileOutput
+     * @memberof AdminResultListSysFile
      */
     type?: string | null;
 
@@ -45,23 +45,23 @@ export interface AdminResultListFileOutput {
      * 错误信息
      *
      * @type {string}
-     * @memberof AdminResultListFileOutput
+     * @memberof AdminResultListSysFile
      */
     message?: string | null;
 
     /**
      * 数据
      *
-     * @type {Array<FileOutput>}
-     * @memberof AdminResultListFileOutput
+     * @type {Array<SysFile>}
+     * @memberof AdminResultListSysFile
      */
-    result?: Array<FileOutput> | null;
+    result?: Array<SysFile> | null;
 
     /**
      * 附加数据
      *
      * @type {any}
-     * @memberof AdminResultListFileOutput
+     * @memberof AdminResultListSysFile
      */
     extras?: any | null;
 
@@ -69,7 +69,7 @@ export interface AdminResultListFileOutput {
      * 时间
      *
      * @type {Date}
-     * @memberof AdminResultListFileOutput
+     * @memberof AdminResultListSysFile
      */
     time?: Date;
 }

+ 25 - 42
Web/src/api-services/models/file-output.ts → Web/src/api-services/models/admin-result-sm-key-pair-output.ts

@@ -12,79 +12,62 @@
  * Do not edit the class manually.
  */
 
+import { SmKeyPairOutput } from './sm-key-pair-output';
 import {
-    
+    SmKeyPairOutput,
 } from ".";
 
 /**
- * 
+ * 全局返回结果
  *
  * @export
- * @interface FileOutput
+ * @interface AdminResultSmKeyPairOutput
  */
-export interface FileOutput {
+export interface AdminResultSmKeyPairOutput {
 
     /**
-     * Id
+     * 状态码
      *
      * @type {number}
-     * @memberof FileOutput
+     * @memberof AdminResultSmKeyPairOutput
      */
-    id?: number;
+    code?: number;
 
     /**
-     * 提供者
+     * 类型success、warning、error
      *
      * @type {string}
-     * @memberof FileOutput
+     * @memberof AdminResultSmKeyPairOutput
      */
-    provider?: string | null;
+    type?: string | null;
 
     /**
-     * 名称
+     * 错误信息
      *
      * @type {string}
-     * @memberof FileOutput
+     * @memberof AdminResultSmKeyPairOutput
      */
-    name?: string | null;
+    message?: string | null;
 
     /**
-     * URL
-     *
-     * @type {string}
-     * @memberof FileOutput
-     */
-    url?: string | null;
-
-    /**
-     * 大小
-     *
-     * @type {string}
-     * @memberof FileOutput
+     * @type {SmKeyPairOutput}
+     * @memberof AdminResultSmKeyPairOutput
      */
-    sizeKb?: string | null;
+    result?: SmKeyPairOutput;
 
     /**
-     * 后缀
+     * 附加数据
      *
-     * @type {string}
-     * @memberof FileOutput
+     * @type {any}
+     * @memberof AdminResultSmKeyPairOutput
      */
-    suffix?: string | null;
+    extras?: any | null;
 
     /**
-     * 路径
+     * 时间
      *
-     * @type {string}
-     * @memberof FileOutput
-     */
-    filePath?: string | null;
-
-    /**
-     * 文件名称
-     *
-     * @type {string}
-     * @memberof FileOutput
+     * @type {Date}
+     * @memberof AdminResultSmKeyPairOutput
      */
-    fileName?: string | null;
+    time?: Date;
 }

+ 12 - 12
Web/src/api-services/models/admin-result-file-output.ts → Web/src/api-services/models/admin-result-sys-file.ts

@@ -12,24 +12,24 @@
  * Do not edit the class manually.
  */
 
-import { FileOutput } from './file-output';
+import { SysFile } from './sys-file';
 import {
-    FileOutput,
+    SysFile,
 } from ".";
 
 /**
  * 全局返回结果
  *
  * @export
- * @interface AdminResultFileOutput
+ * @interface AdminResultSysFile
  */
-export interface AdminResultFileOutput {
+export interface AdminResultSysFile {
 
     /**
      * 状态码
      *
      * @type {number}
-     * @memberof AdminResultFileOutput
+     * @memberof AdminResultSysFile
      */
     code?: number;
 
@@ -37,7 +37,7 @@ export interface AdminResultFileOutput {
      * 类型success、warning、error
      *
      * @type {string}
-     * @memberof AdminResultFileOutput
+     * @memberof AdminResultSysFile
      */
     type?: string | null;
 
@@ -45,21 +45,21 @@ export interface AdminResultFileOutput {
      * 错误信息
      *
      * @type {string}
-     * @memberof AdminResultFileOutput
+     * @memberof AdminResultSysFile
      */
     message?: string | null;
 
     /**
-     * @type {FileOutput}
-     * @memberof AdminResultFileOutput
+     * @type {SysFile}
+     * @memberof AdminResultSysFile
      */
-    result?: FileOutput;
+    result?: SysFile;
 
     /**
      * 附加数据
      *
      * @type {any}
-     * @memberof AdminResultFileOutput
+     * @memberof AdminResultSysFile
      */
     extras?: any | null;
 
@@ -67,7 +67,7 @@ export interface AdminResultFileOutput {
      * 时间
      *
      * @type {Date}
-     * @memberof AdminResultFileOutput
+     * @memberof AdminResultSysFile
      */
     time?: Date;
 }

+ 4 - 4
Web/src/api-services/models/index.ts

@@ -18,7 +18,6 @@ export * from './add-subscribe-message-template-input';
 export * from './add-tenant-input';
 export * from './add-user-input';
 export * from './admin-result-boolean';
-export * from './admin-result-file-output';
 export * from './admin-result-iaction-result';
 export * from './admin-result-int32';
 export * from './admin-result-int64';
@@ -32,7 +31,6 @@ export * from './admin-result-list-db-column-output';
 export * from './admin-result-list-db-table-info';
 export * from './admin-result-list-enum-entity';
 export * from './admin-result-list-enum-type-output';
-export * from './admin-result-list-file-output';
 export * from './admin-result-list-int64';
 export * from './admin-result-list-menu-output';
 export * from './admin-result-list-role-output';
@@ -40,6 +38,7 @@ export * from './admin-result-list-string';
 export * from './admin-result-list-sys-config';
 export * from './admin-result-list-sys-dict-data';
 export * from './admin-result-list-sys-dict-type';
+export * from './admin-result-list-sys-file';
 export * from './admin-result-list-sys-job-cluster';
 export * from './admin-result-list-sys-job-trigger';
 export * from './admin-result-list-sys-menu';
@@ -53,6 +52,7 @@ export * from './admin-result-list-table-output';
 export * from './admin-result-login-output';
 export * from './admin-result-login-user-output';
 export * from './admin-result-object';
+export * from './admin-result-sm-key-pair-output';
 export * from './admin-result-sql-sugar-paged-list-job-detail-output';
 export * from './admin-result-sql-sugar-paged-list-open-access-output';
 export * from './admin-result-sql-sugar-paged-list-sys-code-gen';
@@ -81,6 +81,7 @@ export * from './admin-result-sys-code-gen-config';
 export * from './admin-result-sys-config';
 export * from './admin-result-sys-dict-data';
 export * from './admin-result-sys-dict-type';
+export * from './admin-result-sys-file';
 export * from './admin-result-sys-print';
 export * from './admin-result-sys-user';
 export * from './admin-result-sys-wechat-pay';
@@ -134,7 +135,6 @@ export * from './dict-type-input';
 export * from './enum-entity';
 export * from './enum-type-output';
 export * from './file-input';
-export * from './file-output';
 export * from './gen-auth-url-input';
 export * from './gender-enum';
 export * from './iaction-result';
@@ -183,6 +183,7 @@ export * from './role-org-input';
 export * from './role-output';
 export * from './send-subscribe-message-input';
 export * from './signature-input';
+export * from './sm-key-pair-output';
 export * from './sql-sugar-paged-list-job-detail-output';
 export * from './sql-sugar-paged-list-open-access-output';
 export * from './sql-sugar-paged-list-sys-code-gen';
@@ -236,7 +237,6 @@ export * from './sys-pos';
 export * from './sys-print';
 export * from './sys-region';
 export * from './sys-role';
-export * from './sys-tenant';
 export * from './sys-user';
 export * from './sys-user-ext-org';
 export * from './sys-wechat-pay';

+ 1 - 15
Web/src/api-services/models/open-access-output.ts

@@ -12,10 +12,8 @@
  * Do not edit the class manually.
  */
 
-import { SysTenant } from './sys-tenant';
-import { SysUser } from './sys-user';
 import {
-    SysTenant,SysUser,
+    
 } from ".";
 
 /**
@@ -114,12 +112,6 @@ export interface OpenAccessOutput {
      */
     bindTenantId?: number;
 
-    /**
-     * @type {SysTenant}
-     * @memberof OpenAccessOutput
-     */
-    bindTenant?: SysTenant;
-
     /**
      * 绑定用户Id
      *
@@ -128,12 +120,6 @@ export interface OpenAccessOutput {
      */
     bindUserId?: number;
 
-    /**
-     * @type {SysUser}
-     * @memberof OpenAccessOutput
-     */
-    bindUser?: SysUser;
-
     /**
      * 绑定用户账号
      *

+ 42 - 0
Web/src/api-services/models/sm-key-pair-output.ts

@@ -0,0 +1,42 @@
+/* tslint:disable */
+/* eslint-disable */
+/**
+ * Admin.NET 通用权限开发平台
+ * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
+ *
+ * OpenAPI spec version: 1.0.0
+ * Contact: 515096995@qq.com
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+import {
+    
+} from ".";
+
+/**
+ * 国密公钥私钥对输出
+ *
+ * @export
+ * @interface SmKeyPairOutput
+ */
+export interface SmKeyPairOutput {
+
+    /**
+     * 私匙
+     *
+     * @type {string}
+     * @memberof SmKeyPairOutput
+     */
+    privateKey?: string | null;
+
+    /**
+     * 公匙
+     *
+     * @type {string}
+     * @memberof SmKeyPairOutput
+     */
+    publicKey?: string | null;
+}

+ 1 - 8
Web/src/api-services/models/sys-dict-data.ts

@@ -13,9 +13,8 @@
  */
 
 import { StatusEnum } from './status-enum';
-import { SysDictType } from './sys-dict-type';
 import {
-    StatusEnum,SysDictType,
+    StatusEnum,
 } from ".";
 
 /**
@@ -98,12 +97,6 @@ export interface SysDictData {
      */
     dictTypeId?: number;
 
-    /**
-     * @type {SysDictType}
-     * @memberof SysDictData
-     */
-    dictType?: SysDictType;
-
     /**
      * 值
      *

+ 1 - 8
Web/src/api-services/models/sys-org.ts

@@ -14,9 +14,8 @@
 
 import { StatusEnum } from './status-enum';
 import { SysOrg } from './sys-org';
-import { SysUser } from './sys-user';
 import {
-    StatusEnum,SysOrg,SysUser,
+    StatusEnum,SysOrg,
 } from ".";
 
 /**
@@ -147,12 +146,6 @@ export interface SysOrg {
      */
     directorId?: number | null;
 
-    /**
-     * @type {SysUser}
-     * @memberof SysOrg
-     */
-    director?: SysUser;
-
     /**
      * 排序
      *

+ 0 - 175
Web/src/api-services/models/sys-tenant.ts

@@ -1,175 +0,0 @@
-/* tslint:disable */
-/* eslint-disable */
-/**
- * Admin.NET 通用权限开发平台
- * 让 .NET 开发更简单、更通用、更流行。前后端分离架构(.NET6/Vue3),开箱即用紧随前沿技术。<br/><a href='https://gitee.com/zuohuaijun/Admin.NET/'>https://gitee.com/zuohuaijun/Admin.NET</a>
- *
- * OpenAPI spec version: 1.0.0
- * Contact: 515096995@qq.com
- *
- * NOTE: This class is auto generated by the swagger code generator program.
- * https://github.com/swagger-api/swagger-codegen.git
- * Do not edit the class manually.
- */
-
-import { DbType } from './db-type';
-import { StatusEnum } from './status-enum';
-import { TenantTypeEnum } from './tenant-type-enum';
-import {
-    DbType,StatusEnum,TenantTypeEnum,
-} from ".";
-
-/**
- * 系统租户表
- *
- * @export
- * @interface SysTenant
- */
-export interface SysTenant {
-
-    /**
-     * 雪花Id
-     *
-     * @type {number}
-     * @memberof SysTenant
-     */
-    id?: number;
-
-    /**
-     * 创建时间
-     *
-     * @type {Date}
-     * @memberof SysTenant
-     */
-    createTime?: Date | null;
-
-    /**
-     * 更新时间
-     *
-     * @type {Date}
-     * @memberof SysTenant
-     */
-    updateTime?: Date | null;
-
-    /**
-     * 创建者Id
-     *
-     * @type {number}
-     * @memberof SysTenant
-     */
-    createUserId?: number | null;
-
-    /**
-     * 创建者姓名
-     *
-     * @type {string}
-     * @memberof SysTenant
-     */
-    createUserName?: string | null;
-
-    /**
-     * 修改者Id
-     *
-     * @type {number}
-     * @memberof SysTenant
-     */
-    updateUserId?: number | null;
-
-    /**
-     * 修改者姓名
-     *
-     * @type {string}
-     * @memberof SysTenant
-     */
-    updateUserName?: string | null;
-
-    /**
-     * 软删除
-     *
-     * @type {boolean}
-     * @memberof SysTenant
-     */
-    isDelete?: boolean;
-
-    /**
-     * 用户Id
-     *
-     * @type {number}
-     * @memberof SysTenant
-     */
-    userId?: number;
-
-    /**
-     * 机构Id
-     *
-     * @type {number}
-     * @memberof SysTenant
-     */
-    orgId?: number;
-
-    /**
-     * 主机
-     *
-     * @type {string}
-     * @memberof SysTenant
-     */
-    host?: string | null;
-
-    /**
-     * @type {TenantTypeEnum}
-     * @memberof SysTenant
-     */
-    tenantType?: TenantTypeEnum;
-
-    /**
-     * @type {DbType}
-     * @memberof SysTenant
-     */
-    dbType?: DbType;
-
-    /**
-     * 数据库连接
-     *
-     * @type {string}
-     * @memberof SysTenant
-     */
-    connection?: string | null;
-
-    /**
-     * 数据库标识
-     *
-     * @type {string}
-     * @memberof SysTenant
-     */
-    configId?: string | null;
-
-    /**
-     * 从库连接/读写分离
-     *
-     * @type {string}
-     * @memberof SysTenant
-     */
-    slaveConnections?: string | null;
-
-    /**
-     * 排序
-     *
-     * @type {number}
-     * @memberof SysTenant
-     */
-    orderNo?: number;
-
-    /**
-     * 备注
-     *
-     * @type {string}
-     * @memberof SysTenant
-     */
-    remark?: string | null;
-
-    /**
-     * @type {StatusEnum}
-     * @memberof SysTenant
-     */
-    status?: StatusEnum;
-}

+ 1 - 22
Web/src/api-services/models/sys-user-ext-org.ts

@@ -12,11 +12,8 @@
  * Do not edit the class manually.
  */
 
-import { SysOrg } from './sys-org';
-import { SysPos } from './sys-pos';
-import { SysUser } from './sys-user';
 import {
-    SysOrg,SysPos,SysUser,
+    
 } from ".";
 
 /**
@@ -43,12 +40,6 @@ export interface SysUserExtOrg {
      */
     userId?: number;
 
-    /**
-     * @type {SysUser}
-     * @memberof SysUserExtOrg
-     */
-    sysUser?: SysUser;
-
     /**
      * 机构Id
      *
@@ -57,12 +48,6 @@ export interface SysUserExtOrg {
      */
     orgId?: number;
 
-    /**
-     * @type {SysOrg}
-     * @memberof SysUserExtOrg
-     */
-    sysOrg?: SysOrg;
-
     /**
      * 职位Id
      *
@@ -71,12 +56,6 @@ export interface SysUserExtOrg {
      */
     posId?: number;
 
-    /**
-     * @type {SysPos}
-     * @memberof SysUserExtOrg
-     */
-    sysPos?: SysPos;
-
     /**
      * 工号
      *

+ 1 - 15
Web/src/api-services/models/sys-user.ts

@@ -18,10 +18,8 @@ import { CultureLevelEnum } from './culture-level-enum';
 import { GenderEnum } from './gender-enum';
 import { StatusEnum } from './status-enum';
 import { SysOrg } from './sys-org';
-import { SysPos } from './sys-pos';
-import { SysUser } from './sys-user';
 import {
-    AccountTypeEnum,CardTypeEnum,CultureLevelEnum,GenderEnum,StatusEnum,SysOrg,SysPos,SysUser,
+    AccountTypeEnum,CardTypeEnum,CultureLevelEnum,GenderEnum,StatusEnum,SysOrg,
 } from ".";
 
 /**
@@ -316,12 +314,6 @@ export interface SysUser {
      */
     managerUserId?: number | null;
 
-    /**
-     * @type {SysUser}
-     * @memberof SysUser
-     */
-    managerUser?: SysUser;
-
     /**
      * 职位Id
      *
@@ -330,12 +322,6 @@ export interface SysUser {
      */
     posId?: number;
 
-    /**
-     * @type {SysPos}
-     * @memberof SysUser
-     */
-    sysPos?: SysPos;
-
     /**
      * 工号
      *

+ 1 - 8
Web/src/api-services/models/sys-wechat-pay.ts

@@ -12,9 +12,8 @@
  * Do not edit the class manually.
  */
 
-import { SysWechatUser } from './sys-wechat-user';
 import {
-    SysWechatUser,
+    
 } from ".";
 
 /**
@@ -249,12 +248,6 @@ export interface SysWechatPay {
      */
     openId?: string | null;
 
-    /**
-     * @type {SysWechatUser}
-     * @memberof SysWechatPay
-     */
-    sysWechatUser?: SysWechatUser;
-
     /**
      * 子商户号
      *

+ 1 - 8
Web/src/api-services/models/sys-wechat-user.ts

@@ -13,9 +13,8 @@
  */
 
 import { PlatformTypeEnum } from './platform-type-enum';
-import { SysUser } from './sys-user';
 import {
-    PlatformTypeEnum,SysUser,
+    PlatformTypeEnum,
 } from ".";
 
 /**
@@ -98,12 +97,6 @@ export interface SysWechatUser {
      */
     userId?: number;
 
-    /**
-     * @type {SysUser}
-     * @memberof SysWechatUser
-     */
-    sysUser?: SysUser;
-
     /**
      * @type {PlatformTypeEnum}
      * @memberof SysWechatUser

+ 1 - 8
Web/src/api-services/models/update-dict-data-input.ts

@@ -13,9 +13,8 @@
  */
 
 import { StatusEnum } from './status-enum';
-import { SysDictType } from './sys-dict-type';
 import {
-    StatusEnum,SysDictType,
+    StatusEnum,
 } from ".";
 
 /**
@@ -98,12 +97,6 @@ export interface UpdateDictDataInput {
      */
     dictTypeId?: number;
 
-    /**
-     * @type {SysDictType}
-     * @memberof UpdateDictDataInput
-     */
-    dictType?: SysDictType;
-
     /**
      * 值
      *

+ 1 - 15
Web/src/api-services/models/update-open-access-input.ts

@@ -12,10 +12,8 @@
  * Do not edit the class manually.
  */
 
-import { SysTenant } from './sys-tenant';
-import { SysUser } from './sys-user';
 import {
-    SysTenant,SysUser,
+    
 } from ".";
 
 /**
@@ -98,18 +96,6 @@ export interface UpdateOpenAccessInput {
      */
     bindTenantId?: number;
 
-    /**
-     * @type {SysTenant}
-     * @memberof UpdateOpenAccessInput
-     */
-    bindTenant?: SysTenant;
-
-    /**
-     * @type {SysUser}
-     * @memberof UpdateOpenAccessInput
-     */
-    bindUser?: SysUser;
-
     /**
      * 身份标识
      *

+ 1 - 8
Web/src/api-services/models/update-org-input.ts

@@ -14,9 +14,8 @@
 
 import { StatusEnum } from './status-enum';
 import { SysOrg } from './sys-org';
-import { SysUser } from './sys-user';
 import {
-    StatusEnum,SysOrg,SysUser,
+    StatusEnum,SysOrg,
 } from ".";
 
 /**
@@ -139,12 +138,6 @@ export interface UpdateOrgInput {
      */
     directorId?: number | null;
 
-    /**
-     * @type {SysUser}
-     * @memberof UpdateOrgInput
-     */
-    director?: SysUser;
-
     /**
      * 排序
      *

+ 1 - 15
Web/src/api-services/models/update-user-input.ts

@@ -18,11 +18,9 @@ import { CultureLevelEnum } from './culture-level-enum';
 import { GenderEnum } from './gender-enum';
 import { StatusEnum } from './status-enum';
 import { SysOrg } from './sys-org';
-import { SysPos } from './sys-pos';
-import { SysUser } from './sys-user';
 import { SysUserExtOrg } from './sys-user-ext-org';
 import {
-    AccountTypeEnum,CardTypeEnum,CultureLevelEnum,GenderEnum,StatusEnum,SysOrg,SysPos,SysUser,SysUserExtOrg,
+    AccountTypeEnum,CardTypeEnum,CultureLevelEnum,GenderEnum,StatusEnum,SysOrg,SysUserExtOrg,
 } from ".";
 
 /**
@@ -301,12 +299,6 @@ export interface UpdateUserInput {
      */
     managerUserId?: number | null;
 
-    /**
-     * @type {SysUser}
-     * @memberof UpdateUserInput
-     */
-    managerUser?: SysUser;
-
     /**
      * 职位Id
      *
@@ -315,12 +307,6 @@ export interface UpdateUserInput {
      */
     posId?: number;
 
-    /**
-     * @type {SysPos}
-     * @memberof UpdateUserInput
-     */
-    sysPos?: SysPos;
-
     /**
      * 工号
      *

+ 1 - 15
Web/src/api-services/models/user-output.ts

@@ -18,10 +18,8 @@ import { CultureLevelEnum } from './culture-level-enum';
 import { GenderEnum } from './gender-enum';
 import { StatusEnum } from './status-enum';
 import { SysOrg } from './sys-org';
-import { SysPos } from './sys-pos';
-import { SysUser } from './sys-user';
 import {
-    AccountTypeEnum,CardTypeEnum,CultureLevelEnum,GenderEnum,StatusEnum,SysOrg,SysPos,SysUser,
+    AccountTypeEnum,CardTypeEnum,CultureLevelEnum,GenderEnum,StatusEnum,SysOrg,
 } from ".";
 
 /**
@@ -316,12 +314,6 @@ export interface UserOutput {
      */
     managerUserId?: number | null;
 
-    /**
-     * @type {SysUser}
-     * @memberof UserOutput
-     */
-    managerUser?: SysUser;
-
     /**
      * 职位Id
      *
@@ -330,12 +322,6 @@ export interface UserOutput {
      */
     posId?: number;
 
-    /**
-     * @type {SysPos}
-     * @memberof UserOutput
-     */
-    sysPos?: SysPos;
-
     /**
      * 工号
      *

+ 84 - 13
Web/src/layout/lockScreen/index.vue

@@ -28,16 +28,15 @@
 				<div v-show="state.isShowLoockLogin" class="layout-lock-screen-login">
 					<div class="layout-lock-screen-login-box">
 						<div class="layout-lock-screen-login-box-img">
-							<img src="https://img2.baidu.com/it/u=1978192862,2048448374&fm=253&fmt=auto&app=138&f=JPEG?w=504&h=500" />
+							<img :src="userInfos.avatar || 'https://img2.baidu.com/it/u=1978192862,2048448374&fm=253&fmt=auto&app=138&f=JPEG?w=504&h=500'" />
 						</div>
-						<div class="layout-lock-screen-login-box-name">Administrator</div>
-						<div class="layout-lock-screen-login-box-value">
-							<el-input
-								placeholder="请输入密码"
-								ref="layoutLockScreenInputRef"
-								v-model="state.lockScreenPassword"
-								@keyup.enter.native.stop="onLockScreenSubmit()"
-							>
+						<div class="layout-lock-screen-login-box-name">{{ userInfos.account }}</div>
+						<div v-if="state.showMessage" class="layout-lock-screen-login-box-message">
+							<span>{{ state.message }}</span>
+							<el-button style="max-width: 80px; margin-top: 20px" size="default" @click="hideMessage"> 确认 </el-button>
+						</div>
+						<div v-else class="layout-lock-screen-login-box-value">
+							<el-input placeholder="请输入密码" type="password" ref="layoutLockScreenInputRef" size="default" v-model="state.lockScreenPassword" @keyup.enter.native.stop="onLockScreenSubmit()">
 								<template #append>
 									<el-button @click="onLockScreenSubmit">
 										<el-icon class="el-input__icon">
@@ -65,12 +64,18 @@ import { formatDate } from '/@/utils/formatTime';
 import { Local } from '/@/utils/storage';
 import { storeToRefs } from 'pinia';
 import { useThemeConfig } from '/@/stores/themeConfig';
+import { useUserInfo } from '/@/stores/userInfo';
+import { sm2 } from 'sm-crypto-v2';
+import { feature, getAPI } from '/@/utils/axios-utils';
+import { SysAuthApi } from '/@/api-services';
 
 // 定义变量内容
 const layoutLockScreenDateRef = ref<HtmlType>();
 const layoutLockScreenInputRef = ref();
 const storesThemeConfig = useThemeConfig();
 const { themeConfig } = storeToRefs(storesThemeConfig);
+const storesUserInfo = useUserInfo();
+const { userInfos } = storeToRefs(storesUserInfo);
 const state = reactive({
 	transparency: 1,
 	downClientY: 0,
@@ -87,6 +92,8 @@ const state = reactive({
 	isShowLockScreen: false,
 	isShowLockScreenIntervalTime: 0,
 	lockScreenPassword: '',
+	message: '',
+	showMessage: false,
 });
 
 // 鼠标按下 pc
@@ -160,6 +167,12 @@ const initSetTime = () => {
 const initLockScreen = () => {
 	if (themeConfig.value.isLockScreen) {
 		state.isShowLockScreenIntervalTime = window.setInterval(() => {
+			// 锁屏时间为null重置为300秒,防止白屏
+			if (themeConfig.value.lockScreenTime == null) {
+				themeConfig.value.lockScreenTime = 300;
+				setLocalThemeConfig();
+				return false;
+			}
 			if (themeConfig.value.lockScreenTime <= 1) {
 				state.isShowLockScreen = true;
 				setLocalThemeConfig();
@@ -177,16 +190,62 @@ const setLocalThemeConfig = () => {
 	Local.set('themeConfig', themeConfig.value);
 };
 // 密码输入点击事件
-const onLockScreenSubmit = () => {
-	themeConfig.value.isLockScreen = false;
-	themeConfig.value.lockScreenTime = 30;
-	setLocalThemeConfig();
+const onLockScreenSubmit = async () => {
+	if (state.lockScreenPassword) {
+		try {
+			// SM2加密密码
+			// const keys = SM2.generateKeyPair();
+			const publicKey = `0484C7466D950E120E5ECE5DD85D0C90EAA85081A3A2BD7C57AE6DC822EFCCBD66620C67B0103FC8DD280E36C3B282977B722AAEC3C56518EDCEBAFB72C5A05312`;
+			const password = sm2.doEncrypt(state.lockScreenPassword, publicKey, 1);
+			const [err, res] = await feature(getAPI(SysAuthApi).apiSysAuthUnLockScreenPost(password));
+			if (err) {
+				console.log(err);
+				state.message = err.message;
+				state.showMessage = true;
+				state.lockScreenPassword = '';
+
+				return;
+			}
+			if (res.data.result) {
+				themeConfig.value.isLockScreen = false;
+				themeConfig.value.lockScreenTime = 30;
+				setLocalThemeConfig();
+			}
+		} catch (ex: any) {
+			state.message = `出错了:${ex}`;
+			state.showMessage = true;
+		}
+	}
+};
+// 隐藏消息
+const hideMessage = () => {
+	state.showMessage = false;
+	nextTick(() => {
+		layoutLockScreenInputRef.value.focus();
+	});
 };
 // 页面加载时
 onMounted(() => {
 	initGetElement();
 	initSetTime();
 	initLockScreen();
+	//侦听ENTER按钮事件
+	document.onkeydown = (e) => {
+		if (e.key === 'Enter') {
+			//当显示锁屏页时,按ENTER切到密码输入
+			if (state.isShowLoockLogin == false) {
+				const moveInterval = setInterval(() => {
+					state.isFlags = true;
+					state.moveDifference = state.moveDifference - 10;
+					onMove();
+					//超过600像素则结束
+					if (state.moveDifference < -600) clearInterval(moveInterval);
+				}, 5);
+			}
+			//当显示消息时,按ENTER切到密码输入
+			if (state.showMessage == true) hideMessage();
+		}
+	};
 });
 // 页面卸载时
 onUnmounted(() => {
@@ -322,6 +381,15 @@ onUnmounted(() => {
 				font-size: 26px;
 				margin: 15px 0 30px;
 			}
+			&-message {
+				font-size: 16px;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+			}
+			&-value {
+				min-height: 73px;
+			}
 		}
 		&-icon {
 			position: absolute;
@@ -343,6 +411,9 @@ onUnmounted(() => {
 	background: var(--el-color-white);
 	padding: 0px 15px;
 }
+:deep(.el-input__wrapper.is-focus) {
+	box-shadow: unset !important;
+}
 :deep(.el-input__inner) {
 	border-right-color: var(--el-border-color-extra-light);
 	&:hover {

+ 1 - 1
Web/src/layout/navBars/tagsView/tagsView.vue

@@ -601,7 +601,7 @@ watch(
 	background-color: var(--el-color-white);
 	border-bottom: 1px solid var(--next-border-color-light);
 	position: relative;
-	z-index: 2001;
+	z-index: 1999;
 	:deep(.el-scrollbar__wrap) {
 		overflow-x: auto !important;
 	}

+ 2 - 2
Web/src/stores/userInfo.ts

@@ -72,9 +72,9 @@ export const useUserInfo = defineStore('userInfo', {
 							realName: d.realName,
 							phone: d.phone,
 							idCardNum: d.idCardNum,
-							email: d.Email,
+							email: d.email,
 							accountType: d.accountType,
-							avatar: d.avatar ? '/' + d.avatar : '/favicon.ico',
+							avatar: d.avatar ?? '/favicon.ico',
 							address: d.address,
 							signature: d.signature,
 							orgId: d.orgId,

+ 7 - 8
Web/src/theme/element.scss

@@ -113,7 +113,7 @@
 	@extend .el-menu-hover-bg-color;
 	color: var(--el-color-primary-dark-2);
 }
-.el-sub-menu:not(.is-active) .el-sub-menu__title{
+.el-sub-menu:not(.is-active) .el-sub-menu__title {
 	color: var(--next-bg-menuBarColor);
 }
 // 鼠标 hover 时背景色
@@ -289,17 +289,16 @@
 // 	font-weight: 700;
 // }
 .el-dialog__header {
-	margin: 0;
-	// padding-top: 10px;
+	margin: -16px -16px 0px -16px;
 	padding: 8px 0px 8px 20px;
 	background: var(--el-color-primary);
 }
-.el-dialog__footer {
-	// border-top: 1px solid var(--el-color-info-light-7);
-	padding-bottom: 10px;
-}
+// .el-dialog__footer {
+// 	// border-top: 1px solid var(--el-color-info-light-7);
+// 	padding-bottom: 10px;
+// }
 .el-dialog__headerbtn {
-	height: 28px;
+	margin-top: -5px;
 	.el-dialog__close {
 		color: #fff;
 	}

+ 2 - 11
Web/src/views/system/codeGen/index.vue

@@ -2,10 +2,10 @@
 	<div class="sys-codeGen-container">
 		<el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
 			<el-form :model="state.queryParams" ref="queryForm" :inline="true">
-				<el-form-item label="业务名" prop="busName">
+				<el-form-item label="业务名">
 					<el-input placeholder="业务名" clearable @keyup.enter="handleQuery" v-model="state.queryParams.busName" />
 				</el-form-item>
-				<el-form-item label="数据库表名" prop="tableName">
+				<el-form-item label="数据库表名">
 					<el-input placeholder="数据库表名" clearable @keyup.enter="handleQuery" v-model="state.queryParams.tableName" />
 				</el-form-item>
 				<el-form-item>
@@ -183,12 +183,3 @@ const handleGenerate = (row: any) => {
 		.catch(() => {});
 };
 </script>
-
-<style lang="scss" scoped>
-//搜索区域Label固定宽度
-.sys-codeGen-container {
-	::v-deep(.el-form-item__label) {
-		width: 90px;
-	}
-}
-</style>

+ 11 - 0
Web/src/views/system/database/component/addTable.vue

@@ -243,6 +243,17 @@ function addBaseColumn() {
 			desc: '修改者姓名',
 			length: 64,
 		},
+		{
+			dataType: 'bigint',
+			name: 'CreateOrgId',
+			desc: '创建者部门Id',
+		},
+		{
+			dataType: 'varchar',
+			name: 'CreateOrgName',
+			desc: '创建者部门名称',
+			length: 64,
+		},
 		{
 			dataType: 'bit',
 			name: 'IsDelete',

+ 3 - 3
Web/src/views/system/dict/index.vue

@@ -26,8 +26,8 @@
 
 					<el-table :data="state.dictTypeData" style="width: 100%" v-loading="state.loading" @row-click="handleDictType" highlight-current-row border>
 						<el-table-column type="index" label="序号" width="55" align="center" />
-						<el-table-column prop="name" label="字典名称" header-align="center" show-overflow-tooltip />
-						<el-table-column prop="code" label="字典编码" header-align="center" show-overflow-tooltip />
+						<el-table-column prop="name" label="字典名称" min-width="120" header-align="center" show-overflow-tooltip />
+						<el-table-column prop="code" label="字典编码" min-width="140" header-align="center" show-overflow-tooltip />
 						<el-table-column prop="status" label="状态" width="70" align="center" show-overflow-tooltip>
 							<template #default="scope">
 								<el-tag type="success" v-if="scope.row.status === 1">启用</el-tag>
@@ -141,7 +141,7 @@
 
 					<el-table :data="state.dictDataData" style="width: 100%" v-loading="state.loading" border>
 						<el-table-column type="index" label="序号" width="55" align="center" />
-						<el-table-column prop="value" label="字典值" header-align="center" min-width="100" show-overflow-tooltip>
+						<el-table-column prop="value" label="字典值" header-align="center" min-width="140" show-overflow-tooltip>
 							<template #default="scope">
 								<el-tag :type="scope.row.tagType" :style="scope.row.styleSetting" :class="scope.row.classSetting">{{ scope.row.value }}</el-tag>
 							</template>

+ 4 - 4
Web/src/views/system/log/oplog/index.vue

@@ -24,7 +24,7 @@
 		<el-card class="full-table" shadow="hover" style="margin-top: 8px">
 			<el-table :data="state.logData" @sort-change="sortChange" style="width: 100%" border :row-class-name="tableRowClassName">
 				<el-table-column type="index" label="序号" width="55" align="center" />
-				<el-table-column prop="controllerName" label="模块名称" width="100" header-align="center" show-overflow-tooltip />
+				<el-table-column prop="controllerName" label="模块名称" min-width="120" header-align="center" show-overflow-tooltip />
 				<el-table-column prop="displayTitle" label="显示名称" width="170" header-align="center" show-overflow-tooltip />
 				<el-table-column prop="actionName" label="方法名称" width="150" header-align="center" show-overflow-tooltip />
 				<el-table-column prop="httpMethod" label="请求方式" width="90" align="center" show-overflow-tooltip />
@@ -45,9 +45,9 @@
 				<el-table-column prop="traceId" label="请求跟踪Id" width="150" header-align="center" sortable="custom" show-overflow-tooltip />
 				<el-table-column prop="account" label="账号名称" width="100" align="center" show-overflow-tooltip />
 				<el-table-column prop="realName" label="真实姓名" width="100" align="center" show-overflow-tooltip />
-				<el-table-column prop="remoteIp" label="IP地址" width="120" align="center" show-overflow-tooltip />
-				<el-table-column prop="location" label="登录地点" width="120" align="center" show-overflow-tooltip />
-				<el-table-column prop="browser" label="浏览器" width="160" align="center" show-overflow-tooltip />
+				<el-table-column prop="remoteIp" label="IP地址" min-width="120" align="center" show-overflow-tooltip />
+				<el-table-column prop="location" label="登录地点" min-width="120" align="center" show-overflow-tooltip />
+				<el-table-column prop="browser" label="浏览器" min-width="150" align="center" show-overflow-tooltip />
 				<el-table-column prop="os" label="操作系统" width="120" align="center" show-overflow-tooltip />
 				<el-table-column prop="status" label="状态" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">

+ 3 - 3
Web/src/views/system/log/vislog/index.vue

@@ -27,9 +27,9 @@
 				<el-table-column prop="actionName" label="方法名称" width="150" header-align="center" show-overflow-tooltip />
 				<el-table-column prop="account" label="账号名称" width="100" align="center" show-overflow-tooltip />
 				<el-table-column prop="realName" label="真实姓名" width="100" align="center" show-overflow-tooltip />
-				<el-table-column prop="remoteIp" label="IP地址" align="center" show-overflow-tooltip />
-				<el-table-column prop="location" label="登录地点" align="center" show-overflow-tooltip />
-				<el-table-column prop="browser" label="浏览器" align="center" show-overflow-tooltip />
+				<el-table-column prop="remoteIp" label="IP地址" min-width="120" align="center" show-overflow-tooltip />
+				<el-table-column prop="location" label="登录地点" min-width="120" align="center" show-overflow-tooltip />
+				<el-table-column prop="browser" label="浏览器" min-width="150" align="center" show-overflow-tooltip />
 				<el-table-column prop="os" label="操作系统" width="120" align="center" show-overflow-tooltip />
 				<el-table-column prop="status" label="状态" width="70" align="center" show-overflow-tooltip>
 					<template #default="scope">

+ 3 - 3
Web/src/views/system/org/index.vue

@@ -11,11 +11,11 @@
 						<el-form-item label="机构名称">
 							<el-input v-model="state.queryParams.name" placeholder="机构名称" clearable />
 						</el-form-item>
-						<el-form-item label="机构编码">
+						<!-- <el-form-item label="机构编码">
 							<el-input v-model="state.queryParams.code" placeholder="机构编码" clearable />
-						</el-form-item>
+						</el-form-item> -->
 						<el-form-item label="机构类型">
-							<el-select v-model="state.queryParams.type" filterable clearable class="w100">
+							<el-select v-model="state.queryParams.type" filterable clearable>
 								<el-option v-for="item in state.orgTypeList" :key="item.value" :label="item.value" :value="item.code" />
 							</el-select>
 						</el-form-item>

+ 13 - 4
Web/src/views/system/user/component/userCenter.vue

@@ -172,7 +172,7 @@ import VueGridLayout from 'vue-grid-layout';
 
 import { clearAccessTokens, getAPI } from '/@/utils/axios-utils';
 import { SysFileApi, SysUserApi } from '/@/api-services/api';
-import { ChangePwdInput, SysUser } from '/@/api-services/models';
+import { ChangePwdInput, SysUser, SysFile } from '/@/api-services/models';
 
 const stores = useUserInfo();
 const { userInfos } = storeToRefs(stores);
@@ -215,7 +215,7 @@ watch(state.signOptions, () => {
 // 上传头像图片
 const uploadCropperImg = async (e: any) => {
 	var res = await getAPI(SysFileApi).apiSysFileUploadAvatarPostForm(e.img);
-	userInfos.value.avatar = res.data.result?.filePath + '/' + res.data.result?.name;
+	userInfos.value.avatar = getFileUrl(res.data.result!);
 };
 
 // 打开电子签名页面
@@ -229,7 +229,7 @@ const saveUploadSign = async () => {
 	if (isEmpty) return;
 
 	var res = await getAPI(SysFileApi).apiSysFileUploadSignaturePostForm(base64ToFile(data, userInfos.value.account + '.png'));
-	userInfos.value.signature = res.data.result?.filePath + '/' + res.data.result?.name;
+	userInfos.value.signature = getFileUrl(res.data.result!);
 
 	clearSign();
 	state.signDialogVisible = false;
@@ -248,7 +248,7 @@ const clearSign = () => {
 // 上传手写电子签名
 const uploadSignFile = async (file: any) => {
 	var res = await getAPI(SysFileApi).apiSysFileUploadSignaturePostForm(file.raw);
-	userInfos.value.signature = res.data.result?.url + '';
+	userInfos.value.signature = res.data.result?.url;
 };
 
 // 获得电子签名文件列表
@@ -325,6 +325,15 @@ const uploadSignFileExceed: UploadProps['onExceed'] = (files) => {
 	uploadSignRef.value!.handleStart(file);
 };
 
+// 获取文件地址
+const getFileUrl = (row: SysFile): string => {
+	if (row.bucketName == 'Local') {
+		return `/${row.filePath}/${row.id}${row.suffix}`;
+	} else {
+		return row.url!;
+	}
+};
+
 // 导出对象
 defineExpose({ handleChangeSignFile });
 </script>

+ 2 - 2
Web/src/views/system/user/index.vue

@@ -61,7 +61,7 @@
 								<el-tag v-else> 其他 </el-tag>
 							</template>
 						</el-table-column>
-						<el-table-column prop="roleName" label="角色集合" min-width="130" align="center" show-overflow-tooltip />
+						<el-table-column prop="roleName" label="角色集合" min-width="150" align="center" show-overflow-tooltip />
 						<el-table-column prop="orgName" label="所属机构" min-width="120" align="center" show-overflow-tooltip />
 						<el-table-column prop="posName" label="职位名称" min-width="120" align="center" show-overflow-tooltip />
 						<el-table-column label="状态" width="70" align="center" show-overflow-tooltip>
@@ -160,7 +160,7 @@
 <script lang="ts" setup name="sysUser">
 import { onMounted, reactive, ref } from 'vue';
 import { ElMessageBox, ElMessage } from 'element-plus';
-import { formatDate } from '/@/utils/formatTime';
+// import { formatDate } from '/@/utils/formatTime';
 import { auth } from '/@/utils/authFunction';
 import OrgTree from '/@/views/system/org/component/orgTree.vue';
 import EditUser from '/@/views/system/user/component/editUser.vue';

+ 19 - 2
Web/vite.config.ts

@@ -29,7 +29,15 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
 			vue(),
 			vueJsx(),
 			vueSetupExtend(),
-			viteCompression(),
+			viteCompression({
+				verbose: true, // 默认即可
+				disable: false, // 开启压缩(不禁用),默认即可
+				deleteOriginFile: false, // 删除源文件
+				// 对所有大于 5KB 的文件进行 gzip 压缩
+				threshold: 5120, // the unit is Bytes
+				algorithm: 'gzip', // 压缩算法
+				ext: '.gz', // 文件类型
+			}),
 			JSON.parse(env.VITE_OPEN_CDN) ? buildConfig.cdn() : null,
 		],
 		root: process.cwd(),
@@ -57,6 +65,15 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
 		build: {
 			outDir: 'dist',
 			chunkSizeWarningLimit: 1500,
+			assetsInlineLimit: 5000, // 小于此阈值的导入或引用资源将内联为 base64 编码
+			sourcemap: false, // 构建后是否生成 source map 文件
+			terserOptions: {
+				compress: {
+					//生产环境时移除console
+					drop_console: true,
+					drop_debugger: true,
+				},
+			},
 			rollupOptions: {
 				output: {
 					chunkFileNames: 'assets/js/[name]-[hash].js',
@@ -64,7 +81,7 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
 					assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
 					manualChunks(id) {
 						if (id.includes('node_modules')) {
-							let newId = id.toString().replace("/.", "/");
+							let newId = id.toString().replace('/.', '/');
 							return newId.match(/\/node_modules\/(?!.pnpm)(?<moduleName>[^\/]*)\//)?.groups!.moduleName ?? 'vender';
 						}
 					},