소스 검색

更新所有相关Nuget包到最新版本
更新数据包到最新数据
新增ListHelper帮助类将列表转换为树形结构
新增用户删除后真删用户角色数据
新增角色删除后真删角色权限数据
新增角色唯一编码
调整data.json数据主键为雪花漂移Id,扁平化数据调整为树形结构数据。
修复个人信息上传头像失败无错误提示的问题
优化角色权限界面保存逻辑更改为允许空权限保存,刷新权限禁止保存。
优化角色权限刷新角色列表时同时刷权限列表

zhontai 3 년 전
부모
커밋
8270d53149
58개의 변경된 파일981개의 추가작업 그리고 701개의 파일을 삭제
  1. 10 9
      Admin.Core.Common/Admin.Core.Common.csproj
  2. 9 0
      Admin.Core.Common/Attributes/SnowflakeAttribute.cs
  3. 1 1
      Admin.Core.Common/Auth/User.cs
  4. 4 2
      Admin.Core.Common/BaseModel/Entity.cs
  5. 57 0
      Admin.Core.Common/Helpers/ListHelper.cs
  6. 5 1
      Admin.Core.Model/Admin/ApiEntity.cs
  7. 5 1
      Admin.Core.Model/Admin/DictionaryEntity.cs
  8. 1 1
      Admin.Core.Model/Admin/DocumentEntity.cs
  9. 1 1
      Admin.Core.Model/Admin/DocumentImageEntity.cs
  10. 5 1
      Admin.Core.Model/Admin/PermissionEntity.cs
  11. 8 1
      Admin.Core.Model/Admin/RoleEntity.cs
  12. 1 1
      Admin.Core.Model/Admin/RolePermissionEntity.cs
  13. 30 4
      Admin.Core.Model/Admin/TenantEntity.cs
  14. 2 2
      Admin.Core.Model/Admin/UserEntity.cs
  15. 1 1
      Admin.Core.Model/Admin/UserRoleEntity.cs
  16. 5 1
      Admin.Core.Model/Admin/ViewEntity.cs
  17. 2 2
      Admin.Core.Repository/Base/IdleBusExtesions.cs
  18. 1 1
      Admin.Core.Repository/Base/MyUnitOfWorkManager.cs
  19. 0 3
      Admin.Core.Services/Admin.Core.Service.csproj
  20. 1 1
      Admin.Core.Services/Admin/Api/Input/ApiUpdateInput.cs
  21. 60 0
      Admin.Core.Services/Admin/Api/Output/ApiDataOutput.cs
  22. 12 12
      Admin.Core.Services/Admin/Auth/AuthService.cs
  23. 1 1
      Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs
  24. 2 2
      Admin.Core.Services/Admin/Permission/Input/PermissionAddApiInput.cs
  25. 1 1
      Admin.Core.Services/Admin/Permission/Input/PermissionAddDotInput.cs
  26. 1 1
      Admin.Core.Services/Admin/Permission/Input/PermissionAddGroupInput.cs
  27. 1 1
      Admin.Core.Services/Admin/Permission/Input/PermissionAddMenuInput.cs
  28. 2 2
      Admin.Core.Services/Admin/Permission/Input/PermissionAssignInput.cs
  29. 106 0
      Admin.Core.Services/Admin/Permission/Output/PermissionDataOutput.cs
  30. 1 6
      Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs
  31. 10 0
      Admin.Core.Services/Admin/Permission/PermissionService.cs
  32. 5 0
      Admin.Core.Services/Admin/Role/Input/RoleAddInput.cs
  33. 2 2
      Admin.Core.Services/Admin/Role/Input/RoleUpdateInput.cs
  34. 5 0
      Admin.Core.Services/Admin/Role/Output/RoleListOutput.cs
  35. 9 2
      Admin.Core.Services/Admin/Role/RoleService.cs
  36. 16 1
      Admin.Core.Services/Admin/Tenant/Input/TenantAddInput.cs
  37. 1 1
      Admin.Core.Services/Admin/Tenant/Input/TenantUpdateInput.cs
  38. 16 1
      Admin.Core.Services/Admin/Tenant/Output/TenantListOutput.cs
  39. 41 13
      Admin.Core.Services/Admin/Tenant/TenantService.cs
  40. 5 5
      Admin.Core.Services/Admin/User/Input/UserAddInput.cs
  41. 6 6
      Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs
  42. 4 0
      Admin.Core.Services/Admin/User/UserService.cs
  43. 50 0
      Admin.Core.Services/Admin/View/Output/ViewDataOutput.cs
  44. 11 0
      Admin.Core.Services/Base/BaseService.cs
  45. 12 0
      Admin.Core/Admin.Core.Common.xml
  46. 27 2
      Admin.Core/Admin.Core.Model.xml
  47. 237 7
      Admin.Core/Admin.Core.Service.xml
  48. 6 6
      Admin.Core/Admin.Core.csproj
  49. 2 52
      Admin.Core/Admin.Core.xml
  50. 1 1
      Admin.Core/Controllers/Admin/UserController.cs
  51. 51 37
      Admin.Core/Db/DBServiceCollectionExtensions.cs
  52. 4 3
      Admin.Core/Db/Data.cs
  53. 0 0
      Admin.Core/Db/Data/data.json
  54. 88 105
      Admin.Core/Db/DbHelper.cs
  55. 31 15
      Admin.Core/Db/TenantDBServiceCollectionExtensions.cs
  56. 0 381
      Admin.Core/Db/TenantDbHelper.cs
  57. 4 0
      Admin.Core/Startup.cs
  58. 1 1
      Admin.Core/configs/appconfig.json

+ 10 - 9
Admin.Core.Common/Admin.Core.Common.csproj

@@ -22,22 +22,23 @@
 
   <ItemGroup>
     <PackageReference Include="CSRedisCore" Version="3.6.6" />
-    <PackageReference Include="FreeSql" Version="2.3.200" />
-    <PackageReference Include="FreeSql.Provider.MySql" Version="2.3.200" />
-    <PackageReference Include="FreeSql.Provider.Oracle" Version="2.3.200" />
-    <PackageReference Include="FreeSql.Provider.PostgreSQL" Version="2.3.200" />
-    <PackageReference Include="FreeSql.Provider.Sqlite" Version="2.3.200" />
-    <PackageReference Include="FreeSql.Provider.SqlServer" Version="2.3.200" />
-    <PackageReference Include="FreeSql.Repository" Version="2.3.200" />
+    <PackageReference Include="FreeSql" Version="2.5.100" />
+    <PackageReference Include="FreeSql.Provider.MySql" Version="2.5.100" />
+    <PackageReference Include="FreeSql.Provider.Oracle" Version="2.5.100" />
+    <PackageReference Include="FreeSql.Provider.PostgreSQL" Version="2.5.100" />
+    <PackageReference Include="FreeSql.Provider.Sqlite" Version="2.5.100" />
+    <PackageReference Include="FreeSql.Provider.SqlServer" Version="2.5.100" />
+    <PackageReference Include="FreeSql.Repository" Version="2.5.100" />
     <PackageReference Include="IdleBus" Version="1.5.2" />
     <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
     <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="5.0.0" />
     <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
     <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0" />
-    <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.8.0" />
+    <PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.11.0" />
     <PackageReference Include="System.Drawing.Common" Version="5.0.2" />
-    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.8.0" />
+    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.11.0" />
     <PackageReference Include="UAParser" Version="3.1.46" />
+    <PackageReference Include="Yitter.IdGenerator" Version="1.0.12" />
   </ItemGroup>
 
 </Project>

+ 9 - 0
Admin.Core.Common/Attributes/SnowflakeAttribute.cs

@@ -0,0 +1,9 @@
+using System;
+
+namespace Admin.Core.Common.Attributes
+{
+    [AttributeUsage(AttributeTargets.Property)]
+    public class SnowflakeAttribute : Attribute
+    {
+    }
+}

+ 1 - 1
Admin.Core.Common/Auth/User.cs

@@ -79,7 +79,7 @@ namespace Admin.Core.Common.Auth
                 {
                     return tenantId.Value.ToLong();
                 }
-                return 0;
+                return null;
             }
         }
     }

+ 4 - 2
Admin.Core.Common/BaseModel/Entity.cs

@@ -1,4 +1,5 @@
-using FreeSql.DataAnnotations;
+using Admin.Core.Common.Attributes;
+using FreeSql.DataAnnotations;
 using System.ComponentModel;
 
 namespace Admin.Core.Common.BaseModel
@@ -22,7 +23,8 @@ namespace Admin.Core.Common.BaseModel
         /// 主键Id
         /// </summary>
         [Description("主键Id")]
-        [Column(Position = 1, IsIdentity = true)]
+        [Snowflake]
+        [Column(Position = 1, IsIdentity = false, IsPrimary = true)]
         public virtual TKey Id { get; set; }
     }
 

+ 57 - 0
Admin.Core.Common/Helpers/ListHelper.cs

@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Admin.Core.Common.Helpers
+{
+    public static class ListHelper
+    {
+        /// <summary>
+        /// 将列表转换为树形结构
+        /// </summary>
+        /// <typeparam name="T">类型</typeparam>
+        /// <param name="list">数据</param>
+        /// <param name="rootWhere">根条件</param>
+        /// <param name="childsWhere">节点条件</param>
+        /// <param name="addChilds">添加子节点</param>
+        /// <param name="entity"></param>
+        /// <returns></returns>
+        public static List<T> ToTree<T>(this List<T> list, Func<T, T, bool> rootWhere, Func<T, T, bool> childsWhere, Action<T, IEnumerable<T>> addChilds, T entity = default)
+        {
+            var treelist = new List<T>();
+            //空树
+            if (list == null || list.Count == 0)
+            {
+                return treelist;
+            }
+            if (!list.Any(e => rootWhere(entity, e)))
+            {
+                return treelist;
+            }
+
+            //树根
+            if (list.Any(e => rootWhere(entity, e)))
+            {
+                treelist.AddRange(list.Where(e => rootWhere(entity, e)));
+            }
+
+            //树叶
+            foreach (var item in treelist)
+            {
+                if (list.Any(e => childsWhere(item, e)))
+                {
+                    var nodedata = list.Where(e => childsWhere(item, e)).ToList();
+                    foreach (var child in nodedata)
+                    {
+                        //添加子集
+                        var data = list.ToTree(childsWhere, childsWhere, addChilds, child);
+                        addChilds(child, data);
+                    }
+                    addChilds(item, nodedata);
+                }
+            }
+
+            return treelist;
+        }
+    }
+}

+ 5 - 1
Admin.Core.Model/Admin/ApiEntity.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using Admin.Core.Common.BaseModel;
 using FreeSql.DataAnnotations;
 
@@ -8,7 +9,7 @@ namespace Admin.Core.Model.Admin
     /// 接口管理
     /// </summary>
 	[Table(Name = "ad_api")]
-    [Index("idx_{tablename}_01", nameof(Path), true)]
+    [Index("idx_{tablename}_01", nameof(Path) + "," + nameof(TenantId), true)]
     public class ApiEntity : EntityFull, ITenant
     {
         /// <summary>
@@ -22,6 +23,9 @@ namespace Admin.Core.Model.Admin
         /// </summary>
 		public long ParentId { get; set; }
 
+        [Navigate(nameof(ParentId))]
+        public List<ApiEntity> Childs { get; set; }
+
         /// <summary>
         /// 接口命名
         /// </summary>

+ 5 - 1
Admin.Core.Model/Admin/DictionaryEntity.cs

@@ -1,5 +1,6 @@
 using Admin.Core.Common.BaseModel;
 using FreeSql.DataAnnotations;
+using System.Collections.Generic;
 
 namespace Admin.Core.Model.Admin 
 {
@@ -7,7 +8,7 @@ namespace Admin.Core.Model.Admin
     /// 数据字典
     /// </summary>
 	[Table(Name = "ad_dictionary")]
-    [Index("idx_{tablename}_01", nameof(ParentId)+","+nameof(Name), true)]
+    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Name) + "," + nameof(TenantId), true)]
     public class DictionaryEntity: EntityFull, ITenant
     {
         /// <summary>
@@ -21,6 +22,9 @@ namespace Admin.Core.Model.Admin
         /// </summary>
 		public long ParentId { get; set; }
 
+        [Navigate(nameof(ParentId))]
+        public List<DictionaryEntity> Childs { get; set; }
+
         /// <summary>
         /// 字典名称
         /// </summary>

+ 1 - 1
Admin.Core.Model/Admin/DocumentEntity.cs

@@ -7,7 +7,7 @@ namespace Admin.Core.Model.Admin
     /// 文档
     /// </summary>
 	[Table(Name = "ad_document")]
-    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Label), true)]
+    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Label) + "," + nameof(TenantId), true)]
     public class DocumentEntity : EntityFull, ITenant
     {
         /// <summary>

+ 1 - 1
Admin.Core.Model/Admin/DocumentImageEntity.cs

@@ -7,7 +7,7 @@ namespace Admin.Core.Model.Admin
     /// 文档图片
     /// </summary>
 	[Table(Name = "ad_document_image")]
-    [Index("idx_{tablename}_01", nameof(DocumentId) + "," + nameof(Url), true)]
+    [Index("idx_{tablename}_01", nameof(DocumentId) + "," + nameof(Url) + "," + nameof(TenantId), true)]
     public class DocumentImageEntity: EntityAdd, ITenant
     {
         /// <summary>

+ 5 - 1
Admin.Core.Model/Admin/PermissionEntity.cs

@@ -1,5 +1,6 @@
 using Admin.Core.Common.BaseModel;
 using FreeSql.DataAnnotations;
+using System.Collections.Generic;
 
 namespace Admin.Core.Model.Admin
 {
@@ -7,7 +8,7 @@ namespace Admin.Core.Model.Admin
     /// 权限
     /// </summary>
 	[Table(Name = "ad_permission")]
-    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Label), true)]
+    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Label) + "," + nameof(TenantId), true)]
     public class PermissionEntity : EntityFull, ITenant
     {
         /// <summary>
@@ -21,6 +22,9 @@ namespace Admin.Core.Model.Admin
         /// </summary>
         public long ParentId { get; set; }
 
+        [Navigate(nameof(ParentId))]
+        public List<PermissionEntity> Childs { get; set; }
+
         /// <summary>
         /// 权限名称
         /// </summary>

+ 8 - 1
Admin.Core.Model/Admin/RoleEntity.cs

@@ -9,7 +9,8 @@ namespace Admin.Core.Model.Admin
     /// 角色
     /// </summary>
 	[Table(Name = "ad_role")]
-    [Index("idx_{tablename}_01", nameof(Name), true)]
+    [Index("idx_{tablename}_01", nameof(Name) + "," + nameof(TenantId), true)]
+    [Index("idx_{tablename}_02", nameof(Code) + "," + nameof(TenantId), true)]
     public class RoleEntity: EntityFull, ITenant
     {
         /// <summary>
@@ -24,6 +25,12 @@ namespace Admin.Core.Model.Admin
         [Column(StringLength = 50)]
         public string Name { get; set; }
 
+        /// <summary>
+        /// 编码
+        /// </summary>
+        [Column(StringLength = 50)]
+        public string Code { get; set; }
+
         /// <summary>
         /// 说明
         /// </summary>

+ 1 - 1
Admin.Core.Model/Admin/RolePermissionEntity.cs

@@ -7,7 +7,7 @@ namespace Admin.Core.Model.Admin
     /// 角色权限
     /// </summary>
 	[Table(Name = "ad_role_permission")]
-    [Index("idx_{tablename}_01", nameof(RoleId) + "," + nameof(PermissionId), true)]
+    [Index("idx_{tablename}_01", nameof(RoleId) + "," + nameof(PermissionId) + "," + nameof(TenantId), true)]
     public class RolePermissionEntity: EntityAdd, ITenant
     {
         /// <summary>

+ 30 - 4
Admin.Core.Model/Admin/TenantEntity.cs

@@ -9,8 +9,8 @@ namespace Admin.Core.Model.Admin
     /// 租户
     /// </summary>
 	[Table(Name = "ad_tenant")]
-    [Index("idx_{tablename}_01", nameof(Name), true)]
-    [Index("idx_{tablename}_02", nameof(Code), true)]
+    [Index("idx_{tablename}_01", nameof(Name) + "," + nameof(TenantId), true)]
+    [Index("idx_{tablename}_02", nameof(Code) + "," + nameof(TenantId), true)]
     public class TenantEntity : EntityFull, ITenant
     {
         /// <summary>
@@ -19,6 +19,12 @@ namespace Admin.Core.Model.Admin
         [Column(Position = -10, CanUpdate = false)]
         public long? TenantId { get; set; }
 
+        /// <summary>
+        /// 企业名称
+        /// </summary>
+        [Column(StringLength = 50)]
+        public string Name { get; set; }
+
         /// <summary>
         /// 编码
         /// </summary>
@@ -26,10 +32,30 @@ namespace Admin.Core.Model.Admin
         public string Code { get; set; }
 
         /// <summary>
-        /// 名
+        /// 
         /// </summary>
         [Column(StringLength = 50)]
-        public string Name { get; set; }
+        public string RealName { get; set; }
+
+        /// <summary>
+        /// 手机号码
+        /// </summary>
+        [Column(StringLength = 20)]
+        public string  Phone { get; set; }
+
+        /// <summary>
+        /// 邮箱地址
+        /// </summary>
+        [Column(StringLength = 50)]
+        public string Email { get; set; }
+
+        /// <summary>
+        /// 拥有者
+        /// </summary>
+        [Column(CanUpdate = false)]
+        public long? UserId { get; set; }
+
+        public UserEntity User { get; set; }
 
         /// <summary>
         /// 数据库

+ 2 - 2
Admin.Core.Model/Admin/UserEntity.cs

@@ -9,13 +9,13 @@ namespace Admin.Core.Model.Admin
     /// 用户
     /// </summary>
 	[Table(Name = "ad_user")]
-    [Index("idx_{tablename}_01", nameof(UserName), true)]
+    [Index("idx_{tablename}_01", nameof(UserName) + "," + nameof(TenantId), true)]
     public class UserEntity: EntityFull, ITenant
     {
         /// <summary>
         /// 租户Id
         /// </summary>
-        [Column(Position = -10, CanUpdate = true)]
+        [Column(Position = -10)]
         public long? TenantId { get; set; }
 
         /// <summary>

+ 1 - 1
Admin.Core.Model/Admin/UserRoleEntity.cs

@@ -7,7 +7,7 @@ namespace Admin.Core.Model.Admin
     /// 用户角色
     /// </summary>
 	[Table(Name = "ad_user_role")]
-    [Index("idx_{tablename}_01", nameof(UserId) + "," + nameof(RoleId), true)]
+    [Index("idx_{tablename}_01", nameof(UserId) + "," + nameof(RoleId) + "," + nameof(TenantId), true)]
     public class UserRoleEntity: EntityAdd, ITenant
     {
         /// <summary>

+ 5 - 1
Admin.Core.Model/Admin/ViewEntity.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using Admin.Core.Common.BaseModel;
 using FreeSql.DataAnnotations;
 
@@ -8,7 +9,7 @@ namespace Admin.Core.Model.Admin
     /// 视图管理
     /// </summary>
 	[Table(Name = "ad_view")]
-    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Label), true)]
+    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Label) + "," + nameof(TenantId), true)]
     public class ViewEntity : EntityFull, ITenant
     {
         /// <summary>
@@ -22,6 +23,9 @@ namespace Admin.Core.Model.Admin
         /// </summary>
 		public long ParentId { get; set; }
 
+        [Navigate(nameof(ParentId))]
+        public List<ViewEntity> Childs { get; set; }
+
         /// <summary>
         /// 视图命名
         /// </summary>

+ 2 - 2
Admin.Core.Repository/Base/IdleBusExtesions.cs

@@ -5,12 +5,12 @@ namespace Admin.Core.Repository
 {
     public static class IdleBusExtesions
     {
-        public static IFreeSql Get(this IdleBus<IFreeSql> ib, long tenantId, AppConfig appConfig)
+        public static IFreeSql GetTenant(this IdleBus<IFreeSql> ib, long? tenantId, AppConfig appConfig)
         {
             var tenantName = AdminConsts.TenantName;
             if (appConfig.TenantType == TenantType.Own)
             {
-                tenantName = "tenant_" + tenantId.ToString();
+                tenantName = "tenant_" + tenantId?.ToString();
             }
             var freeSql = ib.Get(tenantName);
             return freeSql;

+ 1 - 1
Admin.Core.Repository/Base/MyUnitOfWorkManager.cs

@@ -8,7 +8,7 @@ namespace Admin.Core.Repository
 {
     public class MyUnitOfWorkManager : UnitOfWorkManager
     {
-        public MyUnitOfWorkManager(IdleBus<IFreeSql> ib, IUser user,AppConfig appConfig) : base(ib.Get(user.TenantId.Value, appConfig))
+        public MyUnitOfWorkManager(IdleBus<IFreeSql> ib, IUser user, AppConfig appConfig) : base(ib.GetTenant(user.TenantId, appConfig))
         {
         }
     }

+ 0 - 3
Admin.Core.Services/Admin.Core.Service.csproj

@@ -22,11 +22,8 @@
 
   <ItemGroup>
     <Compile Remove="Admin\Cache\Output\**" />
-    <Compile Remove="BASE\**" />
     <EmbeddedResource Remove="Admin\Cache\Output\**" />
-    <EmbeddedResource Remove="BASE\**" />
     <None Remove="Admin\Cache\Output\**" />
-    <None Remove="BASE\**" />
   </ItemGroup>
 
   <ItemGroup>

+ 1 - 1
Admin.Core.Services/Admin/Api/Input/ApiUpdateInput.cs

@@ -8,7 +8,7 @@
         /// <summary>
         /// 接口Id
         /// </summary>
-        public int Id { get; set; }
+        public long Id { get; set; }
 
         /// <summary>
         /// 版本

+ 60 - 0
Admin.Core.Services/Admin/Api/Output/ApiDataOutput.cs

@@ -0,0 +1,60 @@
+using Newtonsoft.Json;
+using System.Collections.Generic;
+
+namespace Admin.Core.Service.Admin.Api.Output
+{
+    public class ApiDataOutput
+    {
+        /// <summary>
+        /// 租户Id
+        /// </summary>
+        public long? TenantId { get; set; }
+
+        /// <summary>
+        /// 接口Id
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 接口父级
+        /// </summary>
+        public long? ParentId { get; set; }
+
+        /// <summary>
+        /// 接口命名
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 接口名称
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 接口地址
+        /// </summary>
+        public string Path { get; set; }
+
+        /// <summary>
+        /// 接口提交方法
+        /// </summary>
+        public string HttpMethods { get; set; }
+
+        /// <summary>
+        /// 说明
+        /// </summary>
+        public string Description { get; set; }
+
+        /// <summary>
+        /// 排序
+        /// </summary>
+        public int Sort { get; set; }
+
+        /// <summary>
+        /// 启用
+        /// </summary>
+        public bool Enabled { get; set; }
+
+        public List<ApiDataOutput> Childs { get; set; }
+    }
+}

+ 12 - 12
Admin.Core.Services/Admin/Auth/AuthService.cs

@@ -131,12 +131,12 @@ namespace Admin.Core.Service.Admin.Auth
             //用户菜单
             var menus = await _permissionRepository.Select
                 .Where(a => new[] { PermissionType.Group, PermissionType.Menu }.Contains(a.Type))
-                .Where(a =>
-                    _permissionRepository.Orm.Select<RolePermissionEntity>()
-                    .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == _user.Id)
-                    .Where(b => b.PermissionId == a.Id)
-                    .Any()
-                )
+                //.Where(a =>
+                //    _permissionRepository.Orm.Select<RolePermissionEntity>()
+                //    .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == _user.Id)
+                //    .Where(b => b.PermissionId == a.Id)
+                //    .Any()
+                //)
                 .OrderBy(a => a.ParentId)
                 .OrderBy(a => a.Sort)
                 .ToListAsync(a => new
@@ -158,12 +158,12 @@ namespace Admin.Core.Service.Admin.Auth
             //用户权限点
             var permissions = await _permissionRepository.Select
                 .Where(a => new[] { PermissionType.Api, PermissionType.Dot }.Contains(a.Type))
-                .Where(a =>
-                    _permissionRepository.Orm.Select<RolePermissionEntity>()
-                    .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == _user.Id)
-                    .Where(b => b.PermissionId == a.Id)
-                    .Any()
-                )
+                //.Where(a =>
+                //    _permissionRepository.Orm.Select<RolePermissionEntity>()
+                //    .InnerJoin<UserRoleEntity>((b, c) => b.RoleId == c.RoleId && c.UserId == _user.Id)
+                //    .Where(b => b.PermissionId == a.Id)
+                //    .Any()
+                //)
                 .ToListAsync(a => a.Code);
 
             return ResponseOutput.Ok(new { user, menus, permissions });

+ 1 - 1
Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs

@@ -22,6 +22,6 @@ namespace Admin.Core.Service.Admin.Auth.Output
         /// <summary>
         /// 租户Id
         /// </summary>
-        public long TenantId { get; set; }
+        public long? TenantId { get; set; }
     }
 }

+ 2 - 2
Admin.Core.Services/Admin/Permission/Input/PermissionAddApiInput.cs

@@ -12,12 +12,12 @@ namespace Admin.Core.Service.Admin.Permission.Input
         /// <summary>
         /// ¸¸¼¶½Úµã
         /// </summary>
-        public int ParentId { get; set; }
+        public long ParentId { get; set; }
 
         /// <summary>
         /// ½Ó¿Ú
         /// </summary>
-        public int? ApiId { get; set; }
+        public long? ApiId { get; set; }
 
         /// <summary>
         /// ȨÏÞÃû³Æ

+ 1 - 1
Admin.Core.Services/Admin/Permission/Input/PermissionAddDotInput.cs

@@ -12,7 +12,7 @@ namespace Admin.Core.Service.Admin.Permission.Input
         /// <summary>
         /// ¸¸¼¶½Úµã
         /// </summary>
-        public int ParentId { get; set; }
+        public long ParentId { get; set; }
 
         /// <summary>
         /// ȨÏÞÃû³Æ

+ 1 - 1
Admin.Core.Services/Admin/Permission/Input/PermissionAddGroupInput.cs

@@ -12,7 +12,7 @@ namespace Admin.Core.Service.Admin.Permission.Input
         /// <summary>
         /// ¸¸¼¶½Úµã
         /// </summary>
-        public int ParentId { get; set; }
+        public long ParentId { get; set; }
 
         /// <summary>
         /// ȨÏÞÃû³Æ

+ 1 - 1
Admin.Core.Services/Admin/Permission/Input/PermissionAddMenuInput.cs

@@ -12,7 +12,7 @@ namespace Admin.Core.Service.Admin.Permission.Input
         /// <summary>
         /// ¸¸¼¶½Úµã
         /// </summary>
-        public int ParentId { get; set; }
+        public long ParentId { get; set; }
 
         /// <summary>
         /// ÊÓͼ

+ 2 - 2
Admin.Core.Services/Admin/Permission/Input/PermissionAssignInput.cs

@@ -6,9 +6,9 @@ namespace Admin.Core.Service.Admin.Permission.Input
     public class PermissionAssignInput
     {
         [Required(ErrorMessage = "角色不能为空!")]
-        public int RoleId { get; set; }
+        public long RoleId { get; set; }
 
         [Required(ErrorMessage = "权限不能为空!")]
-        public List<int> PermissionIds { get; set; }
+        public List<long> PermissionIds { get; set; }
     }
 }

+ 106 - 0
Admin.Core.Services/Admin/Permission/Output/PermissionDataOutput.cs

@@ -0,0 +1,106 @@
+using Admin.Core.Model.Admin;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+
+namespace Admin.Core.Service.Admin.Permission.Output
+{
+    public class PermissionDataOutput
+    {
+        /// <summary>
+        /// 租户Id
+        /// </summary>
+        public long? TenantId { get; set; }
+
+        /// <summary>
+        /// 权限Id
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 父级节点
+        /// </summary>
+        public long ParentId { get; set; }
+
+        /// <summary>
+        /// 权限名称
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 权限编码
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 权限类型
+        /// </summary>
+        public PermissionType Type { get; set; }
+
+        /// <summary>
+        /// 视图
+        /// </summary>
+        public long? ViewId { get; set; }
+
+        /// <summary>
+        /// 接口
+        /// </summary>
+        public long? ApiId { get; set; }
+
+        /// <summary>
+        /// 访问地址
+        /// </summary>
+        public string Path { get; set; }
+
+        /// <summary>
+        /// 图标
+        /// </summary>
+        public string Icon { get; set; }
+
+        /// <summary>
+        /// 接口路径
+        /// </summary>
+        public string ApiPath { get; set; }
+
+        /// <summary>
+        /// 可关闭
+        /// </summary>
+        public bool? Closable { get; set; }
+
+        /// <summary>
+        /// 组打开
+        /// </summary>
+        public bool? Opened { get; set; }
+
+        /// <summary>
+        /// 打开新窗口
+        /// </summary>
+        public bool? NewWindow { get; set; }
+
+        /// <summary>
+        /// 链接外显
+        /// </summary>
+        public bool? External { get; set; }
+
+        /// <summary>
+        /// 隐藏
+        /// </summary>
+		public bool Hidden { get; set; }
+
+        /// <summary>
+        /// 排序
+        /// </summary>
+        public int? Sort { get; set; }
+
+        /// <summary>
+        /// 启用
+        /// </summary>
+		public bool Enabled { get; set; }
+
+        /// <summary>
+        /// 描述
+        /// </summary>
+        public string Description { get; set; }
+
+        public List<PermissionDataOutput> Childs { get; set; }
+    }
+}

+ 1 - 6
Admin.Core.Services/Admin/Permission/Output/PermissionListOutput.cs

@@ -12,18 +12,13 @@ namespace Admin.Core.Service.Admin.Permission.Output
         /// <summary>
         /// 父级节点
         /// </summary>
-        public int ParentId { get; set; }
+        public long ParentId { get; set; }
 
         /// <summary>
         /// 权限名称
         /// </summary>
         public string Label { get; set; }
 
-        /// <summary>
-        /// 权限命名
-        /// </summary>
-        public string Name { get; set; }
-
         /// <summary>
         /// 权限类型
         /// </summary>

+ 10 - 0
Admin.Core.Services/Admin/Permission/PermissionService.cs

@@ -19,18 +19,21 @@ namespace Admin.Core.Service.Admin.Permission
         private readonly IMapper _mapper;
         private readonly ICache _cache;
         private readonly IPermissionRepository _permissionRepository;
+        private readonly IRoleRepository _roleRepository;
         private readonly IRolePermissionRepository _rolePermissionRepository;
 
         public PermissionService(
             IMapper mapper,
             ICache cache,
             IPermissionRepository permissionRepository,
+            IRoleRepository roleRepository,
             IRolePermissionRepository rolePermissionRepository
         )
         {
             _mapper = mapper;
             _cache = cache;
             _permissionRepository = permissionRepository;
+            _roleRepository = roleRepository;
             _rolePermissionRepository = rolePermissionRepository;
         }
 
@@ -186,6 +189,13 @@ namespace Admin.Core.Service.Admin.Permission
         [Transaction]
         public async Task<IResponseOutput> AssignAsync(PermissionAssignInput input)
         {
+            //分配权限的时候判断角色是否存在
+            var exists = await _roleRepository.Select.WhereDynamic(input.RoleId).AnyAsync();
+            if (!exists)
+            {
+                return ResponseOutput.NotOk("该角色不存在或已被删除,请刷新角色列表");
+            }
+
             //查询角色权限
             var permissionIds = await _rolePermissionRepository.Select.Where(d => d.RoleId == input.RoleId).ToListAsync(m=>m.PermissionId);
 

+ 5 - 0
Admin.Core.Services/Admin/Role/Input/RoleAddInput.cs

@@ -10,6 +10,11 @@
         /// </summary>
         public string Name { get; set; }
 
+        /// <summary>
+        /// 编码
+        /// </summary>
+        public string Code { get; set; }
+
         /// <summary>
         /// 说明
         /// </summary>

+ 2 - 2
Admin.Core.Services/Admin/Role/Input/RoleUpdateInput.cs

@@ -3,12 +3,12 @@
     /// <summary>
     /// 修改
     /// </summary>
-    public partial class RoleUpdateInput :RoleAddInput
+    public partial class RoleUpdateInput : RoleAddInput
     {
         /// <summary>
         /// 接口Id
         /// </summary>
-        public int Id { get; set; }
+        public long Id { get; set; }
 
         /// <summary>
         /// 版本

+ 5 - 0
Admin.Core.Services/Admin/Role/Output/RoleListOutput.cs

@@ -14,6 +14,11 @@ namespace Admin.Core.Service.Admin.Role.Output
         /// </summary>
         public string Name { get; set; }
 
+        /// <summary>
+        /// 编码
+        /// </summary>
+        public string Code { get; set; }
+
         /// <summary>
         /// 说明
         /// </summary>

+ 9 - 2
Admin.Core.Services/Admin/Role/RoleService.cs

@@ -7,23 +7,28 @@ using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.Role.Input;
 using Admin.Core.Service.Admin.Role.Output;
+using System.Linq;
 
 namespace Admin.Core.Service.Admin.Role
-{	
+{
 	public class RoleService : IRoleService
     {
         private readonly IUser _user;
         private readonly IMapper _mapper;
         private readonly IRoleRepository _roleRepository;
+        private readonly IRolePermissionRepository _rolePermissionRepository;
+        
         public RoleService(
             IUser user,
             IMapper mapper,
-            IRoleRepository roleRepository
+            IRoleRepository roleRepository,
+            IRolePermissionRepository rolePermissionRepository
         )
         {
             _user = user;
             _mapper = mapper;
             _roleRepository = roleRepository;
+            _rolePermissionRepository = rolePermissionRepository;
         }
 
         public async Task<IResponseOutput> GetAsync(long id)
@@ -92,6 +97,7 @@ namespace Admin.Core.Service.Admin.Role
         public async Task<IResponseOutput> SoftDeleteAsync(long id)
         {
             var result = await _roleRepository.SoftDeleteAsync(id);
+            await _rolePermissionRepository.DeleteAsync(a => a.RoleId == id);
 
             return ResponseOutput.Result(result);
         }
@@ -99,6 +105,7 @@ namespace Admin.Core.Service.Admin.Role
         public async Task<IResponseOutput> BatchSoftDeleteAsync(long[] ids)
         {
             var result = await _roleRepository.SoftDeleteAsync(ids);
+            await _rolePermissionRepository.DeleteAsync(a => ids.Contains(a.RoleId));
 
             return ResponseOutput.Result(result);
         }

+ 16 - 1
Admin.Core.Services/Admin/Tenant/Input/TenantAddInput.cs

@@ -12,10 +12,25 @@ namespace Admin.Core.Service.Admin.Tenant.Input
         public string Code { get; set; }
 
         /// <summary>
-        /// 名称
+        /// 企业名称
         /// </summary>
         public string Name { get; set; }
 
+        /// <summary>
+        /// 姓名
+        /// </summary>
+        public string RealName { get; set; }
+
+        /// <summary>
+        /// 手机号码
+        /// </summary>
+        public string Phone { get; set; }
+
+        /// <summary>
+        /// 邮箱地址
+        /// </summary>
+        public string Email { get; set; }
+
         /// <summary>
         /// 数据库
         /// </summary>

+ 1 - 1
Admin.Core.Services/Admin/Tenant/Input/TenantUpdateInput.cs

@@ -8,7 +8,7 @@
         /// <summary>
         /// 接口Id
         /// </summary>
-        public int Id { get; set; }
+        public long Id { get; set; }
 
         /// <summary>
         /// 版本

+ 16 - 1
Admin.Core.Services/Admin/Tenant/Output/TenantListOutput.cs

@@ -16,10 +16,25 @@ namespace Admin.Core.Service.Admin.Tenant.Output
         public string Code { get; set; }
 
         /// <summary>
-        /// 名称
+        /// 企业名称
         /// </summary>
         public string Name { get; set; }
 
+        /// <summary>
+        /// 姓名
+        /// </summary>
+        public string RealName { get; set; }
+
+        /// <summary>
+        /// 手机号码
+        /// </summary>
+        public string Phone { get; set; }
+
+        /// <summary>
+        /// 邮箱地址
+        /// </summary>
+        public string Email { get; set; }
+
         /// <summary>
         /// 数据库
         /// </summary>

+ 41 - 13
Admin.Core.Services/Admin/Tenant/TenantService.cs

@@ -7,23 +7,32 @@ using Admin.Core.Model.Admin;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.Tenant.Input;
 using Admin.Core.Service.Admin.Tenant.Output;
+using Admin.Core.Common.Attributes;
+using Admin.Core.Common.Helpers;
 
 namespace Admin.Core.Service.Admin.Tenant
-{	
-	public class TenantService : ITenantService
+{
+    public class TenantService : BaseService,ITenantService
     {
-        private readonly IUser _user;
-        private readonly IMapper _mapper;
         private readonly ITenantRepository _tenantRepository;
+        private readonly IRoleRepository _roleRepository;
+        private readonly IUserRepository _userRepository;
+        private readonly IUserRoleRepository _userRoleRepository;
+        private readonly IRolePermissionRepository _rolePermissionRepository;
+
         public TenantService(
-            IUser user,
-            IMapper mapper,
-            ITenantRepository tenantRepository
+            ITenantRepository tenantRepository,
+            IRoleRepository roleRepository,
+            IUserRepository userRepository,
+            IUserRoleRepository userRoleRepository,
+            IRolePermissionRepository rolePermissionRepository
         )
         {
-            _user = user;
-            _mapper = mapper;
             _tenantRepository = tenantRepository;
+            _roleRepository = roleRepository;
+            _userRepository = userRepository;
+            _userRoleRepository = userRoleRepository;
+            _rolePermissionRepository = rolePermissionRepository;
         }
 
         public async Task<IResponseOutput> GetAsync(long id)
@@ -52,12 +61,31 @@ namespace Admin.Core.Service.Admin.Tenant
             return ResponseOutput.Ok(data);
         }
 
+        [Transaction]
         public async Task<IResponseOutput> AddAsync(TenantAddInput input)
         {
-            var entity = _mapper.Map<TenantEntity>(input);
-            var id = (await _tenantRepository.InsertAsync(entity)).Id;
+            var entity = Mapper.Map<TenantEntity>(input);
+            var tenant = await _tenantRepository.InsertAsync(entity);
+
+            var tenantId = tenant.Id;
+            //添加角色
+            var role = new RoleEntity { TenantId = tenantId, Code = "plat_admin", Name = "平台管理员", Enabled = true };
+            await _roleRepository.InsertAsync(role);
+
+            //添加用户
+            var pwd = MD5Encrypt.Encrypt32("111111");
+            var user = new UserEntity { TenantId = tenantId, UserName = input.Phone, NickName= input.RealName, Password = pwd, Status = 0 };
+            await _userRepository.InsertAsync(user);
 
-            return ResponseOutput.Result(id > 0);
+            //添加用户角色
+            var userRole = new UserRoleEntity() { TenantId = tenantId, UserId = user.Id, RoleId = role.Id };
+            await _userRoleRepository.InsertAsync(userRole);
+
+            //更新租户用户
+            tenant.UserId = user.Id;
+            await _tenantRepository.UpdateAsync(tenant);
+
+            return ResponseOutput.Ok();
         }
 
         public async Task<IResponseOutput> UpdateAsync(TenantUpdateInput input)
@@ -73,7 +101,7 @@ namespace Admin.Core.Service.Admin.Tenant
                 return ResponseOutput.NotOk("租户不存在!");
             }
 
-            _mapper.Map(input, entity);
+            Mapper.Map(input, entity);
             await _tenantRepository.UpdateAsync(entity);
             return ResponseOutput.Ok();
         }

+ 5 - 5
Admin.Core.Services/Admin/User/Input/UserAddInput.cs

@@ -25,11 +25,6 @@ namespace Admin.Core.Service.Admin.User.Input
         /// </summary>
         public string NickName { get; set; }
 
-        ///// <summary>
-        ///// 头像
-        ///// </summary>
-        //public string Avatar { get; set; }
-
         /// <summary>
         /// 状态
         /// </summary>
@@ -44,5 +39,10 @@ namespace Admin.Core.Service.Admin.User.Input
         /// 角色
         /// </summary>
         public long[] RoleIds { get; set; }
+
+        /// <summary>
+        /// 租户
+        /// </summary>
+        public long? TenantId { get; set; }
     }
 }

+ 6 - 6
Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs

@@ -11,7 +11,7 @@ namespace Admin.Core.Service.Admin.User.Input
         /// <summary>
         /// 主键Id
         /// </summary>
-        public int Id { get; set; }
+        public long Id { get; set; }
 
         /// <summary>
         /// 账号
@@ -24,11 +24,6 @@ namespace Admin.Core.Service.Admin.User.Input
         /// </summary>
         public string NickName { get; set; }
 
-        ///// <summary>
-        ///// 头像
-        ///// </summary>
-        //public string Avatar { get; set; }
-
         /// <summary>
         /// 状态
         /// </summary>
@@ -48,5 +43,10 @@ namespace Admin.Core.Service.Admin.User.Input
         /// 版本
         /// </summary>
         public long Version { get; set; }
+
+        /// <summary>
+        /// 租户
+        /// </summary>
+        public long? TenantId { get; set; }
     }
 }

+ 4 - 0
Admin.Core.Services/Admin/User/UserService.cs

@@ -216,16 +216,20 @@ namespace Admin.Core.Service.Admin.User
             return ResponseOutput.Result(result);
         }
 
+        [Transaction]
         public async Task<IResponseOutput> SoftDeleteAsync(long id)
         {
             var result = await _userRepository.SoftDeleteAsync(id);
+            await _userRoleRepository.DeleteAsync(a => a.UserId == id);
 
             return ResponseOutput.Result(result);
         }
 
+        [Transaction]
         public async Task<IResponseOutput> BatchSoftDeleteAsync(long[] ids)
         {
             var result = await _userRepository.SoftDeleteAsync(ids);
+            await _userRoleRepository.DeleteAsync(a => ids.Contains(a.UserId));
 
             return ResponseOutput.Result(result);
         }

+ 50 - 0
Admin.Core.Services/Admin/View/Output/ViewDataOutput.cs

@@ -0,0 +1,50 @@
+using Newtonsoft.Json;
+using System.Collections.Generic;
+
+namespace Admin.Core.Service.Admin.View.Output
+{
+    public class ViewDataOutput
+    {
+        /// <summary>
+        /// 租户Id
+        /// </summary>
+        public long? TenantId { get; set; }
+
+        /// <summary>
+        /// 视图Id
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 视图父级
+        /// </summary>
+        public long? ParentId { get; set; }
+
+        /// <summary>
+        /// 视图命名
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 视图名称
+        /// </summary>
+        public string Label { get; set; }
+
+        /// <summary>
+        /// 视图路径
+        /// </summary>
+        public string Path { get; set; }
+
+        /// <summary>
+        /// 启用
+        /// </summary>
+        public bool Enabled { get; set; }
+
+        /// <summary>
+        /// 说明
+        /// </summary>
+        public string Description { get; set; }
+
+        public List<ViewDataOutput> Childs { get; set; }
+    }
+}

+ 11 - 0
Admin.Core.Services/Base/BaseService.cs

@@ -0,0 +1,11 @@
+using AutoMapper;
+using Admin.Core.Common.Auth;
+
+namespace Admin.Core.Service
+{
+    public abstract class BaseService
+    {
+        public IUser User { get; set; }
+        public IMapper Mapper { get; set; }
+    }
+}

+ 12 - 0
Admin.Core/Admin.Core.Common.xml

@@ -1169,6 +1169,18 @@
             </summary>
             <returns></returns>
         </member>
+        <member name="M:Admin.Core.Common.Helpers.ListHelper.ToTree``1(System.Collections.Generic.List{``0},System.Func{``0,``0,System.Boolean},System.Func{``0,``0,System.Boolean},System.Action{``0,System.Collections.Generic.IEnumerable{``0}},``0)">
+            <summary>
+            将列表转换为树形结构
+            </summary>
+            <typeparam name="T">类型</typeparam>
+            <param name="list">数据</param>
+            <param name="rootWhere">根条件</param>
+            <param name="childsWhere">节点条件</param>
+            <param name="addChilds">添加子节点</param>
+            <param name="entity"></param>
+            <returns></returns>
+        </member>
         <member name="T:Admin.Core.Common.Helpers.MD5Encrypt">
             <summary>
             MD5加密

+ 27 - 2
Admin.Core/Admin.Core.Model.xml

@@ -424,6 +424,11 @@
             名称
             </summary>
         </member>
+        <member name="P:Admin.Core.Model.Admin.RoleEntity.Code">
+            <summary>
+            编码
+            </summary>
+        </member>
         <member name="P:Admin.Core.Model.Admin.RoleEntity.Description">
             <summary>
             说明
@@ -479,14 +484,34 @@
             租户Id
             </summary>
         </member>
+        <member name="P:Admin.Core.Model.Admin.TenantEntity.Name">
+            <summary>
+            企业名称
+            </summary>
+        </member>
         <member name="P:Admin.Core.Model.Admin.TenantEntity.Code">
             <summary>
             编码
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Admin.TenantEntity.Name">
+        <member name="P:Admin.Core.Model.Admin.TenantEntity.RealName">
             <summary>
-            名称
+            姓名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.TenantEntity.Phone">
+            <summary>
+            手机号码
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.TenantEntity.Email">
+            <summary>
+            邮箱地址
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.TenantEntity.UserId">
+            <summary>
+            拥有者
             </summary>
         </member>
         <member name="P:Admin.Core.Model.Admin.TenantEntity.DbType">

+ 237 - 7
Admin.Core/Admin.Core.Service.xml

@@ -152,6 +152,56 @@
             版本
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.TenantId">
+            <summary>
+            租户Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Id">
+            <summary>
+            接口Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.ParentId">
+            <summary>
+            接口父级
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Name">
+            <summary>
+            接口命名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Label">
+            <summary>
+            接口名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Path">
+            <summary>
+            接口地址
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.HttpMethods">
+            <summary>
+            接口提交方法
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Description">
+            <summary>
+            说明
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Sort">
+            <summary>
+            排序
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Api.Output.ApiDataOutput.Enabled">
+            <summary>
+            启用
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.Api.Output.ApiListOutput.Id">
             <summary>
             接口Id
@@ -1025,24 +1075,114 @@
             版本
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionListOutput.Id">
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.TenantId">
+            <summary>
+            租户Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Id">
             <summary>
             权限Id
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionListOutput.ParentId">
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.ParentId">
             <summary>
             父级节点
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionListOutput.Label">
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Label">
             <summary>
             权限名称
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionListOutput.Name">
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Code">
             <summary>
-            权限命名
+            权限编码
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Type">
+            <summary>
+            权限类型
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.ViewId">
+            <summary>
+            视图
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.ApiId">
+            <summary>
+            接口
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Path">
+            <summary>
+            访问地址
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Icon">
+            <summary>
+            图标
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.ApiPath">
+            <summary>
+            接口路径
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Closable">
+            <summary>
+            可关闭
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Opened">
+            <summary>
+            组打开
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.NewWindow">
+            <summary>
+            打开新窗口
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.External">
+            <summary>
+            链接外显
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Hidden">
+            <summary>
+            隐藏
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Sort">
+            <summary>
+            排序
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Enabled">
+            <summary>
+            启用
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionDataOutput.Description">
+            <summary>
+            描述
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionListOutput.Id">
+            <summary>
+            权限Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionListOutput.ParentId">
+            <summary>
+            父级节点
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionListOutput.Label">
+            <summary>
+            权限名称
             </summary>
         </member>
         <member name="P:Admin.Core.Service.Admin.Permission.Output.PermissionListOutput.Type">
@@ -1100,6 +1240,11 @@
             名称
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Role.Input.RoleAddInput.Code">
+            <summary>
+            编码
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.Role.Input.RoleAddInput.Description">
             <summary>
             说明
@@ -1135,6 +1280,11 @@
             名称
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Role.Output.RoleListOutput.Code">
+            <summary>
+            编码
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.Role.Output.RoleListOutput.Description">
             <summary>
             说明
@@ -1167,7 +1317,22 @@
         </member>
         <member name="P:Admin.Core.Service.Admin.Tenant.Input.TenantAddInput.Name">
             <summary>
-            名称
+            企业名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Tenant.Input.TenantAddInput.RealName">
+            <summary>
+            姓名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Tenant.Input.TenantAddInput.Phone">
+            <summary>
+            手机号码
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Tenant.Input.TenantAddInput.Email">
+            <summary>
+            邮箱地址
             </summary>
         </member>
         <member name="P:Admin.Core.Service.Admin.Tenant.Input.TenantAddInput.DbType">
@@ -1222,7 +1387,22 @@
         </member>
         <member name="P:Admin.Core.Service.Admin.Tenant.Output.TenantListOutput.Name">
             <summary>
-            名称
+            企业名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Tenant.Output.TenantListOutput.RealName">
+            <summary>
+            姓名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Tenant.Output.TenantListOutput.Phone">
+            <summary>
+            手机号码
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Tenant.Output.TenantListOutput.Email">
+            <summary>
+            邮箱地址
             </summary>
         </member>
         <member name="P:Admin.Core.Service.Admin.Tenant.Output.TenantListOutput.DbType">
@@ -1300,6 +1480,11 @@
             角色
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.User.Input.UserAddInput.TenantId">
+            <summary>
+            租户
+            </summary>
+        </member>
         <member name="T:Admin.Core.Service.Admin.User.Input.UserChangePasswordInput">
             <summary>
             修改密码
@@ -1395,6 +1580,11 @@
             版本
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.User.Input.UserUpdateInput.TenantId">
+            <summary>
+            租户
+            </summary>
+        </member>
         <member name="T:Admin.Core.Service.Admin.User.IUserService">
             <summary>
             用户服务
@@ -1538,6 +1728,46 @@
             <param name="id"></param>
             <returns></returns>
         </member>
+        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.TenantId">
+            <summary>
+            租户Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Id">
+            <summary>
+            视图Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.ParentId">
+            <summary>
+            视图父级
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Name">
+            <summary>
+            视图命名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Label">
+            <summary>
+            视图名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Path">
+            <summary>
+            视图路径
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Enabled">
+            <summary>
+            启用
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.View.Output.ViewDataOutput.Description">
+            <summary>
+            说明
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.View.Output.ViewListOutput.Id">
             <summary>
             视图Id

+ 6 - 6
Admin.Core/Admin.Core.csproj

@@ -50,14 +50,14 @@
     <PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.0" />
     <PackageReference Include="Caching.CSRedis" Version="3.6.60" />
     <PackageReference Include="Castle.Core.AsyncInterceptor" Version="2.0.0" />
-    <PackageReference Include="FluentValidation.AspNetCore" Version="9.5.2" />
+    <PackageReference Include="FluentValidation.AspNetCore" Version="10.1.0" />
     <PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />
-    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.4" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.4" />
+    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.6" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.6" />
     <PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
-    <PackageReference Include="NLog" Version="4.7.8" />
-    <PackageReference Include="NLog.Web.AspNetCore" Version="4.11.0" />
-    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.1.0" />
+    <PackageReference Include="NLog" Version="4.7.10" />
+    <PackageReference Include="NLog.Web.AspNetCore" Version="4.12.0" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.1.4" />
   </ItemGroup>
 
   <ItemGroup>

+ 2 - 52
Admin.Core/Admin.Core.xml

@@ -771,24 +771,17 @@
             <typeparam name="T"></typeparam>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Db.DbHelper.InitDtDataAsync``1(IFreeSql,``0[],System.Data.Common.DbTransaction,Admin.Core.Common.Configs.DbConfig)">
+        <member name="M:Admin.Core.Db.DbHelper.InitDtDataAsync``1(IFreeSql,FreeSql.IUnitOfWork,System.Data.Common.DbTransaction,``0[],Admin.Core.Common.Configs.DbConfig)">
             <summary>
             初始化数据表数据
             </summary>
             <typeparam name="T"></typeparam>
             <param name="db"></param>
+            <param name="unitOfWork"></param>
             <param name="data"></param>
-            <param name="tran"></param>
             <param name="dbConfig"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Db.DbHelper.SyncDataAuditValue(System.Object,FreeSql.Aop.AuditValueEventArgs)">
-            <summary>
-            同步数据审计方法
-            </summary>
-            <param name="s"></param>
-            <param name="e"></param>
-        </member>
         <member name="M:Admin.Core.Db.DbHelper.SyncDataAsync(IFreeSql,Admin.Core.Common.Configs.DbConfig)">
             <summary>
             同步数据
@@ -816,49 +809,6 @@
             <param name="multiDb"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Db.TenantDbHelper.CreateDatabase(Admin.Core.Common.Configs.DbConfig)">
-            <summary>
-            创建数据库
-            </summary>
-            <param name="dbConfig"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Db.TenantDbHelper.SyncStructure(IFreeSql,System.String,Admin.Core.Common.Configs.DbConfig)">
-            <summary>
-            同步结构
-            </summary>
-        </member>
-        <member name="M:Admin.Core.Db.TenantDbHelper.InitDtData``1(IFreeSql,``0[],System.Data.Common.DbTransaction,Admin.Core.Common.Configs.DbConfig)">
-            <summary>
-            初始化数据表数据
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="db"></param>
-            <param name="data"></param>
-            <param name="tran"></param>
-            <param name="dbConfig"></param>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Db.TenantDbHelper.SyncDataAuditValue(System.Object,FreeSql.Aop.AuditValueEventArgs)">
-            <summary>
-            同步数据审计方法
-            </summary>
-            <param name="s"></param>
-            <param name="e"></param>
-        </member>
-        <member name="M:Admin.Core.Db.TenantDbHelper.SyncData(IFreeSql,Admin.Core.Common.Configs.DbConfig)">
-            <summary>
-            同步数据
-            </summary>
-            <returns></returns>
-        </member>
-        <member name="M:Admin.Core.Db.TenantDbHelper.GenerateSimpleJsonData(IFreeSql)">
-            <summary>
-            生成极简数据
-            </summary>
-            <param name="db"></param>
-            <returns></returns>
-        </member>
         <member name="M:Admin.Core.Db.TenantDBServiceCollectionExtensions.AddTenantDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment)">
             <summary>
             添加租户数据库

+ 1 - 1
Admin.Core/Controllers/Admin/UserController.cs

@@ -152,7 +152,7 @@ namespace Admin.Core.Controllers.Admin
                 return ResponseOutput.Ok(res.Data.FileRelativePath);
             }
 
-            return ResponseOutput.NotOk("上传失败!");
+            return ResponseOutput.NotOk(res.Msg ?? "上传失败!");
         }
     }
 }

+ 51 - 37
Admin.Core/Db/DBServiceCollectionExtensions.cs

@@ -10,6 +10,7 @@ using Admin.Core.Common.Dbs;
 using Admin.Core.Model.Admin;
 using System.Reflection;
 using Admin.Core.Common.Attributes;
+using Yitter.IdGenerator;
 
 namespace Admin.Core.Db
 {
@@ -61,29 +62,6 @@ namespace Admin.Core.Db
                 DbHelper.SyncStructure(fsql, dbConfig: dbConfig, appConfig: appConfig);
             }
 
-            //同步数据
-            if (dbConfig.SyncData)
-            {
-                await DbHelper.SyncDataAsync(fsql, dbConfig);
-            }
-            #endregion
-
-            //生成数据包
-            if (dbConfig.GenerateData && !dbConfig.CreateDb && !dbConfig.SyncData)
-            {
-                await DbHelper.GenerateSimpleJsonDataAsync(fsql);
-            }
-
-            #region 监听Curd操作
-            if (dbConfig.Curd)
-            {
-                fsql.Aop.CurdBefore += (s, e) =>
-                {
-                    Console.WriteLine($"{e.Sql}\r\n");
-                };
-            }
-            #endregion
-
             #region 审计数据
             //计算服务器时间
             var serverTime = fsql.Select<DualEntity>().Limit(1).First(a => DateTime.UtcNow);
@@ -91,6 +69,20 @@ namespace Admin.Core.Db
             var user = services.BuildServiceProvider().GetService<IUser>();
             fsql.Aop.AuditValue += (s, e) =>
             {
+                if (e.Property.GetCustomAttribute<ServerTimeAttribute>(false) != null
+                       && (e.Column.CsType == typeof(DateTime) || e.Column.CsType == typeof(DateTime?))
+                       && (e.Value == null || (DateTime)e.Value == default || (DateTime?)e.Value == default))
+                {
+                    e.Value = DateTime.Now.Subtract(timeOffset);
+                }
+
+                if (e.Column.CsType == typeof(long)
+                && e.Property.GetCustomAttribute<SnowflakeAttribute>(false) != null
+                && (e.Value == null || (long)e.Value == default || (long?)e.Value == default))
+                {
+                    e.Value = YitIdHelper.NextId();
+                }
+
                 if (user == null || user.Id <= 0)
                 {
                     return;
@@ -101,21 +93,24 @@ namespace Admin.Core.Db
                     switch (e.Property.Name)
                     {
                         case "CreatedUserId":
-                            e.Value = user.Id;
+                            if (e.Value == null || (long)e.Value == default || (long?)e.Value == default)
+                            {
+                                e.Value = user.Id;
+                            }
                             break;
                         case "CreatedUserName":
-                            e.Value = user.Name;
+                            if (e.Value == null || ((string)e.Value).IsNull())
+                            {
+                                e.Value = user.Name;
+                            }
                             break;
                         case "TenantId":
-                            e.Value = user.TenantId;
+                            if (e.Value == null || (long)e.Value == default || (long?)e.Value == default)
+                            {
+                                e.Value = user.TenantId;
+                            }
                             break;
                     }
-
-                    if (e.Property.GetCustomAttribute<ServerTimeAttribute>(false) != null && (e.Column.CsType == typeof(DateTime) || e.Column.CsType == typeof(DateTime?))
-                    && (e.Value == null || (DateTime)e.Value == default || (DateTime?)e.Value == default))
-                    {
-                        e.Value = DateTime.Now.Subtract(timeOffset);
-                    }
                 }
                 else if (e.AuditValueType == FreeSql.Aop.AuditValueType.Update)
                 {
@@ -128,14 +123,33 @@ namespace Admin.Core.Db
                             e.Value = user.Name;
                             break;
                     }
-                    if (e.Property.GetCustomAttribute<ServerTimeAttribute>(false) != null && (e.Column.CsType == typeof(DateTime) || e.Column.CsType == typeof(DateTime?))
-                    && (e.Value == null || (DateTime)e.Value == default || (DateTime?)e.Value == default))
-                    {
-                        e.Value = DateTime.Now.Subtract(timeOffset);
-                    }
+
                 }
             };
             #endregion
+
+            //同步数据
+            if (dbConfig.SyncData)
+            {
+                await DbHelper.SyncDataAsync(fsql, dbConfig);
+            }
+            #endregion
+
+            //生成数据包
+            if (dbConfig.GenerateData && !dbConfig.CreateDb && !dbConfig.SyncData)
+            {
+                await DbHelper.GenerateSimpleJsonDataAsync(fsql);
+            }
+
+            #region 监听Curd操作
+            if (dbConfig.Curd)
+            {
+                fsql.Aop.CurdBefore += (s, e) =>
+                {
+                    Console.WriteLine($"{e.Sql}\r\n");
+                };
+            }
+            #endregion
             #endregion
 
             //导入多数据库

+ 4 - 3
Admin.Core/Db/Data.cs

@@ -7,10 +7,11 @@ namespace Admin.Core.Db
     /// </summary>
     public class Data
     {
-        public DictionaryEntity[] Dictionaries { get; set; }
+        //public DictionaryEntity[] Dictionaries { get; set; }
         public ApiEntity[] Apis { get; set; }
-        public ViewEntity[] Views { get; set; }
-        public PermissionEntity[] Permissions { get; set; }
+        public ApiEntity[] ApiTree { get; set; }
+        public ViewEntity[] ViewTree { get; set; }
+        public PermissionEntity[] PermissionTree { get; set; }
         public UserEntity[] Users { get; set; }
         public RoleEntity[] Roles { get; set; }
         public UserRoleEntity[] UserRoles { get; set; }

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
Admin.Core/Db/Data/data.json


+ 88 - 105
Admin.Core/Db/DbHelper.cs

@@ -5,7 +5,6 @@ using System.Threading.Tasks;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using FreeSql;
-using FreeSql.Aop;
 using FreeSql.DataAnnotations;
 using Admin.Core.Common.Configs;
 using Admin.Core.Common.Helpers;
@@ -13,6 +12,9 @@ using Admin.Core.Model.Admin;
 using System.Collections.Generic;
 using System.Reflection;
 using Admin.Core.Common.BaseModel;
+using Admin.Core.Service.Admin.Api.Output;
+using Admin.Core.Service.Admin.View.Output;
+using Admin.Core.Service.Admin.Permission.Output;
 
 namespace Admin.Core.Db
 {
@@ -165,14 +167,15 @@ namespace Admin.Core.Db
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="db"></param>
+        /// <param name="unitOfWork"></param>
         /// <param name="data"></param>
-        /// <param name="tran"></param>
         /// <param name="dbConfig"></param>
         /// <returns></returns>
         private static async Task InitDtDataAsync<T>(
-            IFreeSql db, 
+            IFreeSql db,
+            IUnitOfWork unitOfWork,
+            System.Data.Common.DbTransaction tran,
             T[] data, 
-            System.Data.Common.DbTransaction tran, 
             DbConfig dbConfig = null
         ) where T : class
         {
@@ -185,10 +188,11 @@ namespace Admin.Core.Db
                 {
                     if (data?.Length > 0)
                     {
+                        var repo = db.GetRepository<T>();
                         var insert = db.Insert<T>();
-
-                        if(tran != null)
+                        if (unitOfWork != null)
                         {
+                            repo.UnitOfWork = unitOfWork;
                             insert = insert.WithTransaction(tran);
                         }
 
@@ -197,9 +201,8 @@ namespace Admin.Core.Db
                         {
                             if (dbConfig.Type == DataType.SqlServer)
                             {
-
                                 var insrtSql = insert.AppendData(data).InsertIdentity().ToSql();
-                                await db.Ado.ExecuteNonQueryAsync($"SET IDENTITY_INSERT {tableName} ON\n {insrtSql} \nSET IDENTITY_INSERT {tableName} OFF");
+                                await repo.Orm.Ado.ExecuteNonQueryAsync($"SET IDENTITY_INSERT {tableName} ON\n {insrtSql} \nSET IDENTITY_INSERT {tableName} OFF");
                             }
                             else
                             {
@@ -208,7 +211,8 @@ namespace Admin.Core.Db
                         }
                         else
                         {
-                            await insert.AppendData(data).ExecuteAffrowsAsync();
+                            repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
+                            await repo.InsertAsync(data);
                         }
 
                         Console.WriteLine($" table: {tableName} sync data succeed");
@@ -229,39 +233,6 @@ namespace Admin.Core.Db
             }
         }
 
-        /// <summary>
-        /// 同步数据审计方法
-        /// </summary>
-        /// <param name="s"></param>
-        /// <param name="e"></param>
-        private static void SyncDataAuditValue(object s, AuditValueEventArgs e)
-        {
-            if (e.AuditValueType == AuditValueType.Insert)
-            {
-                switch (e.Property.Name)
-                {
-                    case "CreatedUserId":
-                        e.Value = 2;
-                        break;
-                    case "CreatedUserName":
-                        e.Value = "admin";
-                        break;
-                }
-            }
-            else if (e.AuditValueType == AuditValueType.Update)
-            {
-                switch (e.Property.Name)
-                {
-                    case "ModifiedUserId":
-                        e.Value = 2;
-                        break;
-                    case "ModifiedUserName":
-                        e.Value = "admin";
-                        break;
-                }
-            }
-        }
-
         /// <summary>
         /// 同步数据
         /// </summary>
@@ -277,8 +248,6 @@ namespace Admin.Core.Db
 
                 Console.WriteLine("\r\n sync data started");
 
-                db.Aop.AuditValue += SyncDataAuditValue;
-               
                 var filePath = Path.Combine(AppContext.BaseDirectory, "Db/Data/data.json").ToPath();
                 var jsonData = FileHelper.ReadFile(filePath);
                 var data = JsonConvert.DeserializeObject<Data>(jsonData);
@@ -286,26 +255,26 @@ namespace Admin.Core.Db
                 using (var uow = db.CreateUnitOfWork())
                 using (var tran = uow.GetOrBeginTransaction())
                 {
-                    if (!await db.Queryable<DualEntity>().AnyAsync())
+                    var dualRepo = db.GetRepository<DualEntity>();
+                    dualRepo.UnitOfWork = uow;
+                    if (!await dualRepo.Select.AnyAsync())
                     {
-                        await db.Insert<DualEntity>().WithTransaction(tran).AppendData(new DualEntity { }).ExecuteAffrowsAsync();
+                        await dualRepo.InsertAsync(new DualEntity { });
                     }
 
-                    await InitDtDataAsync(db, data.Dictionaries, tran, dbConfig);
-                    await InitDtDataAsync(db, data.Apis, tran, dbConfig);
-                    await InitDtDataAsync(db, data.Views, tran, dbConfig);
-                    await InitDtDataAsync(db, data.Permissions, tran, dbConfig);
-                    await InitDtDataAsync(db, data.Users, tran, dbConfig);
-                    await InitDtDataAsync(db, data.Roles, tran, dbConfig);
-                    await InitDtDataAsync(db, data.UserRoles, tran, dbConfig);
-                    await InitDtDataAsync(db, data.RolePermissions, tran, dbConfig);
-                    await InitDtDataAsync(db, data.Tenants, tran, dbConfig);
+                    //await InitDtDataAsync(db, uow, tran, data.Dictionaries, dbConfig);
+                    await InitDtDataAsync(db, uow, tran, data.ApiTree, dbConfig);
+                    await InitDtDataAsync(db, uow, tran, data.ViewTree, dbConfig);
+                    await InitDtDataAsync(db, uow, tran, data.PermissionTree, dbConfig);
+                    await InitDtDataAsync(db, uow, tran, data.Users, dbConfig);
+                    await InitDtDataAsync(db, uow, tran, data.Roles, dbConfig);
+                    await InitDtDataAsync(db, uow, tran, data.UserRoles, dbConfig);
+                    await InitDtDataAsync(db, uow, tran, data.RolePermissions, dbConfig);
+                    await InitDtDataAsync(db, uow, tran, data.Tenants, dbConfig);
 
                     uow.Commit();
                 }
 
-                db.Aop.AuditValue -= SyncDataAuditValue;
-
                 Console.WriteLine(" sync data succeed\r\n");
             }
             catch (Exception ex)
@@ -328,69 +297,74 @@ namespace Admin.Core.Db
                 #region 数据表
 
                 #region 数据字典
-                var dictionaries = await db.Queryable<DictionaryEntity>().ToListAsync(a => new
-                {
-                    a.Id,
-                    a.ParentId,
-                    a.Name,
-                    a.Code,
-                    a.Value,
-                    a.Description,
-                    a.Sort
-                });
+                //var dictionaries = await db.Queryable<DictionaryEntity>().ToListAsync(a => new
+                //{
+                //    a.TenantId,
+                //    a.Id,
+                //    a.ParentId,
+                //    a.Name,
+                //    a.Code,
+                //    a.Value,
+                //    a.Description,
+                //    a.Sort
+                //});
                 #endregion
 
                 #region 接口
-                var apis = await db.Queryable<ApiEntity>().ToListAsync(a => new
+                var apis = await db.Queryable<ApiEntity>().ToListAsync<ApiDataOutput>();
+                var apiTree = apis.ToTree((r, c) =>
                 {
-                    a.Id,
-                    a.ParentId,
-                    a.Name,
-                    a.Label,
-                    a.Path,
-                    a.HttpMethods,
-                    a.Description,
-                    a.Sort
+                    return c.ParentId == 0;
+                },
+                (r, c) =>
+                {
+                    return r.Id == c.ParentId;
+                },
+                (r, datalist) =>
+                {
+                    r.Childs ??= new List<ApiDataOutput>();
+                    r.Childs.AddRange(datalist);
                 });
                 #endregion
 
                 #region 视图
-                var views = await db.Queryable<ViewEntity>().ToListAsync(a => new
+                var views = await db.Queryable<ViewEntity>().ToListAsync<ViewDataOutput>();
+                var viewTree = views.ToTree((r, c) =>
                 {
-                    a.Id,
-                    a.ParentId,
-                    a.Name,
-                    a.Label,
-                    a.Path,
-                    a.Description,
-                    a.Sort
-                });
+                    return c.ParentId == 0;
+                },
+               (r, c) =>
+               {
+                   return r.Id == c.ParentId;
+               },
+               (r, datalist) =>
+               {
+                   r.Childs ??= new List<ViewDataOutput>();
+                   r.Childs.AddRange(datalist);
+               });
                 #endregion
 
                 #region 权限
-                var permissions = await db.Queryable<PermissionEntity>().ToListAsync(a => new
+                var permissions = await db.Queryable<PermissionEntity>().ToListAsync<PermissionDataOutput>();
+                var permissionTree = permissions.ToTree((r, c) =>
                 {
-                    a.Id,
-                    a.ParentId,
-                    a.Label,
-                    a.Code,
-                    a.Type,
-                    a.ViewId,
-                    a.ApiId,
-                    a.Path,
-                    a.Icon,
-                    a.Closable,
-                    a.Opened,
-                    a.NewWindow,
-                    a.External,
-                    a.Sort,
-                    a.Description
-                });
+                    return c.ParentId == 0;
+                },
+               (r, c) =>
+               {
+                   return r.Id == c.ParentId;
+               },
+               (r, datalist) =>
+               {
+                   r.Childs ??= new List<PermissionDataOutput>();
+                   r.Childs.AddRange(datalist);
+               });
                 #endregion
 
                 #region 用户
                 var users = await db.Queryable<UserEntity>().ToListAsync(a => new
                 {
+                    a.TenantId,
                     a.Id,
                     a.UserName,
                     a.Password,
@@ -404,8 +378,10 @@ namespace Admin.Core.Db
                 #region 角色
                 var roles = await db.Queryable<RoleEntity>().ToListAsync(a => new
                 {
+                    a.TenantId,
                     a.Id,
                     a.Name,
+                    a.Code,
                     a.Sort,
                     a.Description
                 });
@@ -414,6 +390,7 @@ namespace Admin.Core.Db
                 #region 用户角色
                 var userRoles = await db.Queryable<UserRoleEntity>().ToListAsync(a => new
                 {
+                    a.TenantId,
                     a.Id,
                     a.UserId,
                     a.RoleId
@@ -423,6 +400,7 @@ namespace Admin.Core.Db
                 #region 角色权限
                 var rolePermissions = await db.Queryable<RolePermissionEntity>().ToListAsync(a => new
                 {
+                    a.TenantId,
                     a.Id,
                     a.RoleId,
                     a.PermissionId
@@ -432,9 +410,13 @@ namespace Admin.Core.Db
                 #region 租户
                 var tenants = await db.Queryable<TenantEntity>().ToListAsync(a => new
                 {
+                    a.TenantId,
                     a.Id,
                     a.Name,
                     a.Code,
+                    a.RealName,
+                    a.Phone,
+                    a.Email,
                     a.DbType,
                     a.ConnectionString,
                     a.IdleTime,
@@ -456,10 +438,11 @@ namespace Admin.Core.Db
                 settings.DefaultValueHandling = DefaultValueHandling.Ignore;
                 var jsonData = JsonConvert.SerializeObject(new
                 {
-                    dictionaries,
+                    //dictionaries,
                     apis,
-                    views,
-                    permissions,
+                    apiTree,
+                    viewTree,
+                    permissionTree,
                     users,
                     roles,
                     userRoles,

+ 31 - 15
Admin.Core/Db/TenantDBServiceCollectionExtensions.cs

@@ -11,6 +11,7 @@ using Admin.Core.Common.Consts;
 using Admin.Core.Model.Admin;
 using Admin.Core.Common.Attributes;
 using System.Reflection;
+using Yitter.IdGenerator;
 
 namespace Admin.Core.Db
 {
@@ -41,13 +42,14 @@ namespace Admin.Core.Db
             var tenantName = AdminConsts.TenantName;
             if(appConfig.TenantType == TenantType.Own)
             {
-                tenantName = "tenant_" + user.TenantId.ToString();
+                tenantName = "tenant_" + user.TenantId?.ToString();
             }
             ib.TryRegister(tenantName, () =>
             {
                 #region FreeSql
                 var freeSqlBuilder = new FreeSqlBuilder()
                         .UseConnectionString(dbConfig.Type, dbConfig.ConnectionString)
+                        .UseAutoSyncStructure(false)
                         .UseLazyLoading(false)
                         .UseNoneCommandParameter(true);
 
@@ -89,30 +91,48 @@ namespace Admin.Core.Db
                 var timeOffset = DateTime.UtcNow.Subtract(serverTime);
                 fsql.Aop.AuditValue += (s, e) =>
                 {
+                    if (e.Property.GetCustomAttribute<ServerTimeAttribute>(false) != null
+                        && (e.Column.CsType == typeof(DateTime) || e.Column.CsType == typeof(DateTime?))
+                        && (e.Value == null || (DateTime)e.Value == default || (DateTime?)e.Value == default))
+                    {
+                        e.Value = DateTime.Now.Subtract(timeOffset);
+                    }
+
+                    if (e.Column.CsType == typeof(long)
+                    && e.Property.GetCustomAttribute<SnowflakeAttribute>(false) != null
+                    && (e.Value == null || (long)e.Value == default || (long?)e.Value == default))
+                    {
+                        e.Value = YitIdHelper.NextId();
+                    }
+
                     if (user == null || user.Id <= 0)
                     {
                         return;
                     }
-
+                    
                     if (e.AuditValueType == FreeSql.Aop.AuditValueType.Insert)
                     {
                         switch (e.Property.Name)
                         {
                             case "CreatedUserId":
-                                e.Value = user.Id;
+                                if (e.Value == null || (long)e.Value == default || (long?)e.Value == default)
+                                {
+                                    e.Value = user.Id;
+                                }
                                 break;
                             case "CreatedUserName":
-                                e.Value = user.Name;
+                                if (e.Value == null || ((string)e.Value).IsNull())
+                                {
+                                    e.Value = user.Name;
+                                }
                                 break;
                             case "TenantId":
-                                e.Value = user.TenantId;
+                                if (e.Value == null || (long)e.Value == default || (long?)e.Value == default)
+                                {
+                                    e.Value = user.TenantId;
+                                }
                                 break;
                         }
-                        if (e.Property.GetCustomAttribute<ServerTimeAttribute>(false) != null && (e.Column.CsType == typeof(DateTime) || e.Column.CsType == typeof(DateTime?))
-                        && (e.Value == null || (DateTime)e.Value == default || (DateTime?)e.Value == default))
-                        {
-                            e.Value = DateTime.Now.Subtract(timeOffset);
-                        }
                     }
                     else if (e.AuditValueType == FreeSql.Aop.AuditValueType.Update)
                     {
@@ -125,11 +145,7 @@ namespace Admin.Core.Db
                                 e.Value = user.Name;
                                 break;
                         }
-                        if (e.Property.GetCustomAttribute<ServerTimeAttribute>(false) != null && (e.Column.CsType == typeof(DateTime) || e.Column.CsType == typeof(DateTime?))
-                        && (e.Value == null || (DateTime)e.Value == default || (DateTime?)e.Value == default))
-                        {
-                            e.Value = DateTime.Now.Subtract(timeOffset);
-                        }
+                        
                     }
                 };
                 #endregion

+ 0 - 381
Admin.Core/Db/TenantDbHelper.cs

@@ -1,381 +0,0 @@
-using System;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Serialization;
-using FreeSql;
-using FreeSql.Aop;
-using FreeSql.DataAnnotations;
-using Admin.Core.Common.Configs;
-using Admin.Core.Common.Helpers;
-using Admin.Core.Model.Admin;
-
-namespace Admin.Core.Db
-{
-    public class TenantDbHelper
-    {
-        /// <summary>
-        /// 创建数据库
-        /// </summary>
-        /// <param name="dbConfig"></param>
-        /// <returns></returns>
-        public async static Task CreateDatabase(DbConfig dbConfig)
-        {
-            if (!dbConfig.CreateDb || dbConfig.Type == DataType.Sqlite)
-            {
-                return;
-            }
-
-            var db = new FreeSqlBuilder()
-                    .UseConnectionString(dbConfig.Type, dbConfig.CreateDbConnectionString)
-                    .Build();
-
-            try
-            {
-                Console.WriteLine("\r\ncreate database started");
-                await db.Ado.ExecuteNonQueryAsync(dbConfig.CreateDbSql);
-                Console.WriteLine("create database succeed\r\n");
-            }
-            catch (Exception e)
-            {
-                Console.WriteLine($"create database failed.\n{e.Message}\r\n");
-            }
-        }
-
-        /// <summary>
-        /// 同步结构
-        /// </summary>
-        public static void SyncStructure(IFreeSql db, string msg = null, DbConfig dbConfig = null)
-        {
-            //打印结构比对脚本
-            //var dDL = db.CodeFirst.GetComparisonDDLStatements<PermissionEntity>();
-            //Console.WriteLine("\r\n" + dDL);
-
-            //打印结构同步脚本
-            //db.Aop.SyncStructureAfter += (s, e) =>
-            //{
-            //    if (e.Sql.NotNull())
-            //    {
-            //        Console.WriteLine("sync structure sql:\n" + e.Sql);
-            //    }
-            //};
-
-            // 同步结构
-            var dbType = dbConfig.Type.ToString();
-            Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} started");
-            if(dbConfig.Type == DataType.Oracle)
-            {
-                db.CodeFirst.IsSyncStructureToUpper = true;
-            }
-            db.CodeFirst.SyncStructure(new Type[]
-            {
-                typeof(DictionaryEntity),
-                typeof(ApiEntity),
-                typeof(ViewEntity),
-                typeof(PermissionEntity),
-                typeof(UserEntity),
-                typeof(RoleEntity),
-                typeof(UserRoleEntity),
-                typeof(RolePermissionEntity),
-                typeof(OprationLogEntity),
-                typeof(LoginLogEntity),
-                typeof(DocumentEntity),
-                typeof(DocumentImageEntity)
-            });
-            Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n");
-        }
-
-        /// <summary>
-        /// 初始化数据表数据
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="db"></param>
-        /// <param name="data"></param>
-        /// <param name="tran"></param>
-        /// <param name="dbConfig"></param>
-        /// <returns></returns>
-        private static async Task InitDtData<T>(
-            IFreeSql db, 
-            T[] data, 
-            System.Data.Common.DbTransaction tran, 
-            DbConfig dbConfig = null
-        ) where T : class
-        {
-            var table = typeof(T).GetCustomAttributes(typeof(TableAttribute),false).FirstOrDefault() as TableAttribute;
-            var tableName = table.Name;
-
-            try
-            {
-                if (!await db.Queryable<T>().AnyAsync())
-                {
-                    if (data?.Length > 0)
-                    {
-                        var insert = db.Insert<T>();
-
-                        if(tran != null)
-                        {
-                            insert = insert.WithTransaction(tran);
-                        }
-
-                        if(dbConfig.Type == DataType.SqlServer)
-                        {
-                            var insrtSql = insert.AppendData(data).InsertIdentity().ToSql();
-                            await db.Ado.ExecuteNonQueryAsync($"SET IDENTITY_INSERT {tableName} ON\n {insrtSql} \nSET IDENTITY_INSERT {tableName} OFF");
-                        }
-                        else
-                        {
-                            await insert.AppendData(data).InsertIdentity().ExecuteAffrowsAsync();
-                        }
-                        
-                        Console.WriteLine($"table: {tableName} sync data succeed");
-                    }
-                    else
-                    {
-                        Console.WriteLine($"table: {tableName} import data []");
-                    }
-                }
-                else
-                {
-                    Console.WriteLine($"table: {tableName} record already exists");
-                }
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine($"table: {tableName} sync data failed.\n{ex.Message}");
-            }
-        }
-
-        /// <summary>
-        /// 同步数据审计方法
-        /// </summary>
-        /// <param name="s"></param>
-        /// <param name="e"></param>
-        private static void SyncDataAuditValue(object s, AuditValueEventArgs e)
-        {
-            if (e.AuditValueType == AuditValueType.Insert)
-            {
-                switch (e.Property.Name)
-                {
-                    case "CreatedUserId":
-                        e.Value = 2;
-                        break;
-                    case "CreatedUserName":
-                        e.Value = "admin";
-                        break;
-                }
-            }
-            else if (e.AuditValueType == AuditValueType.Update)
-            {
-                switch (e.Property.Name)
-                {
-                    case "ModifiedUserId":
-                        e.Value = 2;
-                        break;
-                    case "ModifiedUserName":
-                        e.Value = "admin";
-                        break;
-                }
-            }
-        }
-
-        /// <summary>
-        /// 同步数据
-        /// </summary>
-        /// <returns></returns>
-        public static async Task SyncData(IFreeSql db, DbConfig dbConfig = null)
-        {
-            try
-            {
-                //db.Aop.CurdBefore += (s, e) =>
-                //{
-                //    Console.WriteLine($"{e.Sql}\r\n");
-                //};
-
-                Console.WriteLine("sync data started");
-
-                db.Aop.AuditValue += SyncDataAuditValue;
-               
-                var filePath = Path.Combine(AppContext.BaseDirectory, "Db/Data/data.json").ToPath();
-                var jsonData = FileHelper.ReadFile(filePath);
-                var data = JsonConvert.DeserializeObject<Data>(jsonData);
-
-                using (var uow = db.CreateUnitOfWork())
-                using (var tran = uow.GetOrBeginTransaction())
-                {
-                    await InitDtData(db, data.Dictionaries, tran, dbConfig);
-                    await InitDtData(db, data.Apis, tran, dbConfig);
-                    await InitDtData(db, data.Views, tran, dbConfig);
-                    await InitDtData(db, data.Permissions, tran, dbConfig);
-                    await InitDtData(db, data.Users, tran, dbConfig);
-                    await InitDtData(db, data.Roles, tran, dbConfig);
-                    await InitDtData(db, data.UserRoles, tran, dbConfig);
-                    await InitDtData(db, data.RolePermissions, tran, dbConfig);
-
-                    uow.Commit();
-                }
-
-                db.Aop.AuditValue -= SyncDataAuditValue;
-
-                Console.WriteLine("sync data succeed\r\n");
-            }
-            catch (Exception ex)
-            {
-                throw new Exception($"sync data failed.\n{ex.Message}\r\n");
-            }
-        }
-
-        /// <summary>
-        /// 生成极简数据
-        /// </summary>
-        /// <param name="db"></param>
-        /// <returns></returns>
-        public static async Task GenerateSimpleJsonData(IFreeSql db)
-        {
-            try
-            {
-                Console.WriteLine("\r\ngenerate data started");
-
-                #region 数据表
-
-                #region 数据字典
-                var dictionaries = await db.Queryable<DictionaryEntity>().ToListAsync(a => new
-                {
-                    a.Id,
-                    a.ParentId,
-                    a.Name,
-                    a.Code,
-                    a.Value,
-                    a.Description,
-                    a.Sort
-                });
-                #endregion
-
-                #region 接口
-                var apis = await db.Queryable<ApiEntity>().ToListAsync(a => new
-                {
-                    a.Id,
-                    a.ParentId,
-                    a.Name,
-                    a.Label,
-                    a.Path,
-                    a.HttpMethods,
-                    a.Description,
-                    a.Sort
-                });
-                #endregion
-
-                #region 视图
-                var views = await db.Queryable<ViewEntity>().ToListAsync(a => new
-                {
-                    a.Id,
-                    a.ParentId,
-                    a.Name,
-                    a.Label,
-                    a.Path,
-                    a.Description,
-                    a.Sort
-                });
-                #endregion
-
-                #region 权限
-                var permissions = await db.Queryable<PermissionEntity>().ToListAsync(a => new
-                {
-                    a.Id,
-                    a.ParentId,
-                    a.Label,
-                    a.Code,
-                    a.Type,
-                    a.ViewId,
-                    a.ApiId,
-                    a.Path,
-                    a.Icon,
-                    a.Closable,
-                    a.Opened,
-                    a.NewWindow,
-                    a.External,
-                    a.Sort,
-                    a.Description
-                });
-                #endregion
-
-                #region 用户
-                var users = await db.Queryable<UserEntity>().ToListAsync(a => new
-                {
-                    a.Id,
-                    a.UserName,
-                    a.Password,
-                    a.NickName,
-                    a.Avatar,
-                    a.Status,
-                    a.Remark
-                });
-                #endregion
-
-                #region 角色
-                var roles = await db.Queryable<RoleEntity>().ToListAsync(a => new
-                {
-                    a.Id,
-                    a.Name,
-                    a.Sort,
-                    a.Description
-                });
-                #endregion
-
-                #region 用户角色
-                var userRoles = await db.Queryable<UserRoleEntity>().ToListAsync(a => new
-                {
-                    a.Id,
-                    a.UserId,
-                    a.RoleId
-                });
-                #endregion
-
-                #region 角色权限
-                var rolePermissions = await db.Queryable<RolePermissionEntity>().ToListAsync(a => new
-                {
-                    a.Id,
-                    a.RoleId,
-                    a.PermissionId
-                });
-                #endregion
-
-                #endregion
-
-                if(!(users?.Count > 0))
-                {
-                    return;
-                }
-
-                #region 生成数据
-                var settings = new JsonSerializerSettings();
-                settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
-                settings.NullValueHandling = NullValueHandling.Ignore;
-                settings.DefaultValueHandling = DefaultValueHandling.Ignore;
-                var jsonData = JsonConvert.SerializeObject(new
-                {
-                    dictionaries,
-                    apis,
-                    views,
-                    permissions,
-                    users,
-                    roles,
-                    userRoles,
-                    rolePermissions
-                },
-                //Formatting.Indented, 
-                settings
-                );
-                var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Db/Data/data.json").ToPath();
-                FileHelper.WriteFile(filePath, jsonData);
-                #endregion
-
-                Console.WriteLine("generate data succeed\r\n");
-            }
-            catch (Exception ex)
-            {
-                throw new Exception($"generate data failed。\n{ex.Message}\r\n");
-            }
-        }
-    }
-}

+ 4 - 0
Admin.Core/Startup.cs

@@ -37,6 +37,7 @@ using Admin.Core.Common.Auth;
 using AspNetCoreRateLimit;
 using IdentityServer4.AccessTokenValidation;
 using System.IdentityModel.Tokens.Jwt;
+using Yitter.IdGenerator;
 
 namespace Admin.Core
 {
@@ -59,6 +60,9 @@ namespace Admin.Core
 
         public void ConfigureServices(IServiceCollection services)
         {
+            //雪花漂移算法
+            YitIdHelper.SetIdGenerator(new IdGeneratorOptions(1) { WorkerIdBitLength = 6 });
+
             services.AddScoped<IPermissionHandler, PermissionHandler>();
 
             // ClaimType不被更改

+ 1 - 1
Admin.Core/configs/appconfig.json

@@ -4,7 +4,7 @@
   //跨域地址
   "corUrls": [ "http://localhost:9000", "http://127.0.0.1:9000" ],
   //租户类型:None无租户, Share共享数据库, Own独立数据库
-  "tenantType": "None",
+  "tenantType": "Share",
   //Swagger文档
   "swagger": false,
   //统一认证授权服务器

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.