0
0
Prechádzať zdrojové kódy

新增 角色管理设置权限功能
新增 输入模型验证异常日志
新增 租户类型用于数据权限控制
调整 角色权限列表权限范围,平台不限制,租户限制权限范围。
优化 布局容器,标题区和操作区控制是否显示
修复 事物同步执行,友好返回异常事物没有回滚的问题

zhontai 3 rokov pred
rodič
commit
50f8c0d5ec
35 zmenil súbory, kde vykonal 262 pridanie a 171 odobranie
  1. 5 0
      Admin.Core.Common/Auth/ClaimAttributes.cs
  2. 9 1
      Admin.Core.Common/Auth/IUser.cs
  3. 18 0
      Admin.Core.Common/Auth/User.cs
  4. 18 0
      Admin.Core.Common/BaseModel/TenantType.cs
  5. 3 3
      Admin.Core.Common/Configs/AppConfig.cs
  6. 2 2
      Admin.Core.Common/Extensions/ListExtensions.cs
  7. 2 8
      Admin.Core.Model/Admin/ApiEntity.cs
  8. 3 9
      Admin.Core.Model/Admin/DocumentImageEntity.cs
  9. 2 8
      Admin.Core.Model/Admin/PermissionEntity.cs
  10. 2 8
      Admin.Core.Model/Admin/RolePermissionEntity.cs
  11. 13 2
      Admin.Core.Model/Admin/TenantEntity.cs
  12. 2 0
      Admin.Core.Model/Admin/UserEntity.cs
  13. 2 8
      Admin.Core.Model/Admin/UserRoleEntity.cs
  14. 2 8
      Admin.Core.Model/Admin/ViewEntity.cs
  15. 1 1
      Admin.Core.Repository/Base/IdleBusExtesions.cs
  16. 26 23
      Admin.Core.Services/Admin/Auth/AuthService.cs
  17. 8 1
      Admin.Core.Services/Admin/Auth/Output/AuthLoginOutput.cs
  18. 5 0
      Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs
  19. 1 0
      Admin.Core.Services/Admin/Permission/IPermissionService.cs
  20. 13 5
      Admin.Core.Services/Admin/Permission/PermissionService.cs
  21. 11 1
      Admin.Core.Services/Admin/Tenant/Output/TenantListOutput.cs
  22. 2 1
      Admin.Core.Services/Admin/Tenant/TenantService.cs
  23. 0 5
      Admin.Core.Services/Admin/User/Input/UserAddInput.cs
  24. 0 5
      Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs
  25. 48 18
      Admin.Core/Admin.Core.Common.xml
  26. 12 32
      Admin.Core/Admin.Core.Model.xml
  27. 21 11
      Admin.Core/Admin.Core.Service.xml
  28. 5 0
      Admin.Core/Admin.Core.xml
  29. 9 1
      Admin.Core/Aop/TransactionAsyncInterceptor.cs
  30. 5 1
      Admin.Core/Attributes/ValidateInputAttribute.cs
  31. 3 1
      Admin.Core/Controllers/Admin/AuthController.cs
  32. 0 0
      Admin.Core/Db/Data/data.json
  33. 5 4
      Admin.Core/Db/DbHelper.cs
  34. 2 2
      Admin.Core/Db/TenantDBServiceCollectionExtensions.cs
  35. 2 2
      Admin.Core/configs/appconfig.json

+ 5 - 0
Admin.Core.Common/Auth/ClaimAttributes.cs

@@ -34,5 +34,10 @@
         /// 租户Id
         /// </summary>
         public const string TenantId = "tenantid";
+
+        /// <summary>
+        /// 租户类型
+        /// </summary>
+        public const string TenantType = "tenanttype";
     }
 }

+ 9 - 1
Admin.Core.Common/Auth/IUser.cs

@@ -1,4 +1,7 @@
-namespace Admin.Core.Common.Auth
+using Admin.Core.Common.BaseModel;
+using Admin.Core.Common.Configs;
+
+namespace Admin.Core.Common.Auth
 {
     /// <summary>
     /// 用户信息接口
@@ -24,5 +27,10 @@
         /// 租户Id
         /// </summary>
         long? TenantId { get; }
+
+        /// <summary>
+        /// 租户类型
+        /// </summary>
+        TenantType? TenantType { get; }
     }
 }

+ 18 - 0
Admin.Core.Common/Auth/User.cs

@@ -1,5 +1,7 @@
 using Microsoft.AspNetCore.Http;
 using Admin.Core.Common.Helpers;
+using Admin.Core.Common.BaseModel;
+using System;
 
 namespace Admin.Core.Common.Auth
 {
@@ -82,5 +84,21 @@ namespace Admin.Core.Common.Auth
                 return null;
             }
         }
+
+        /// <summary>
+        /// 租户类型
+        /// </summary>
+        public virtual TenantType? TenantType
+        {
+            get
+            {
+                var tenantType = _accessor?.HttpContext?.User?.FindFirst(ClaimAttributes.TenantType);
+                if (tenantType != null && tenantType.Value.NotNull())
+                {
+                    return (TenantType)Enum.Parse(typeof(TenantType), tenantType.Value, true);
+                }
+                return null;
+            }
+        }
     }
 }

+ 18 - 0
Admin.Core.Common/BaseModel/TenantType.cs

@@ -0,0 +1,18 @@
+
+namespace Admin.Core.Common.BaseModel
+{
+    /// <summary>
+    /// 租户类型
+    /// </summary>
+    public enum TenantType
+    {
+        /// <summary>
+        /// 平台
+        /// </summary>
+        Platform = 1,
+        /// <summary>
+        /// 租户
+        /// </summary>
+        Tenant = 2
+    }
+}

+ 3 - 3
Admin.Core.Common/Configs/AppConfig.cs

@@ -1,9 +1,9 @@
 namespace Admin.Core.Common.Configs
 {
     /// <summary>
-    /// 租户类型
+    /// 租户数据库类型
     /// </summary>
-    public enum TenantType
+    public enum TenantDbType
     {
         /// <summary>
         /// 无租户
@@ -37,7 +37,7 @@
         /// <summary>
         /// 租户类型
         /// </summary>
-        public TenantType TenantType { get; set; } = TenantType.None;
+        public TenantDbType TenantDbType { get; set; } = TenantDbType.None;
 
         /// <summary>
         /// Swagger文档

+ 2 - 2
Admin.Core.Common/Helpers/ListHelper.cs → Admin.Core.Common/Extensions/ListExtensions.cs

@@ -2,9 +2,9 @@
 using System.Collections.Generic;
 using System.Linq;
 
-namespace Admin.Core.Common.Helpers
+namespace Admin.Core.Common.Extensions
 {
-    public static class ListHelper
+    public static class ListExtensions
     {
         /// <summary>
         /// 将列表转换为树形结构

+ 2 - 8
Admin.Core.Model/Admin/ApiEntity.cs

@@ -9,15 +9,9 @@ namespace Admin.Core.Model.Admin
     /// 接口管理
     /// </summary>
 	[Table(Name = "ad_api")]
-    [Index("idx_{tablename}_01", nameof(Path) + "," + nameof(TenantId), true)]
-    public class ApiEntity : EntityFull, ITenant
+    [Index("idx_{tablename}_01", nameof(Path), true)]
+    public class ApiEntity : EntityFull
     {
-        /// <summary>
-        /// 租户Id
-        /// </summary>
-        [Column(Position = -10, CanUpdate = false)]
-        public long? TenantId { get; set; }
-
         /// <summary>
         /// 所属模块
         /// </summary>

+ 3 - 9
Admin.Core.Model/Admin/DocumentImageEntity.cs

@@ -7,17 +7,11 @@ namespace Admin.Core.Model.Admin
     /// 文档图片
     /// </summary>
 	[Table(Name = "ad_document_image")]
-    [Index("idx_{tablename}_01", nameof(DocumentId) + "," + nameof(Url) + "," + nameof(TenantId), true)]
-    public class DocumentImageEntity: EntityAdd, ITenant
+    [Index("idx_{tablename}_01", nameof(DocumentId) + "," + nameof(Url), true)]
+    public class DocumentImageEntity: EntityAdd
     {
         /// <summary>
-        /// 租户Id
-        /// </summary>
-        [Column(Position = -10, CanUpdate = false)]
-        public long? TenantId { get; set; }
-
-        /// <summary>
-        /// 用户Id
+        /// 文档Id
         /// </summary>
         public long DocumentId { get; set; }
         

+ 2 - 8
Admin.Core.Model/Admin/PermissionEntity.cs

@@ -8,15 +8,9 @@ namespace Admin.Core.Model.Admin
     /// 权限
     /// </summary>
 	[Table(Name = "ad_permission")]
-    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Label) + "," + nameof(TenantId), true)]
-    public class PermissionEntity : EntityFull, ITenant
+    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Label), true)]
+    public class PermissionEntity : EntityFull
     {
-        /// <summary>
-        /// 租户Id
-        /// </summary>
-        [Column(Position = -10, CanUpdate = false)]
-        public long? TenantId { get; set; }
-
         /// <summary>
         /// 父级节点
         /// </summary>

+ 2 - 8
Admin.Core.Model/Admin/RolePermissionEntity.cs

@@ -7,15 +7,9 @@ namespace Admin.Core.Model.Admin
     /// 角色权限
     /// </summary>
 	[Table(Name = "ad_role_permission")]
-    [Index("idx_{tablename}_01", nameof(RoleId) + "," + nameof(PermissionId) + "," + nameof(TenantId), true)]
-    public class RolePermissionEntity: EntityAdd, ITenant
+    [Index("idx_{tablename}_01", nameof(RoleId) + "," + nameof(PermissionId), true)]
+    public class RolePermissionEntity: EntityAdd
     {
-        /// <summary>
-        /// 租户Id
-        /// </summary>
-        [Column(Position = -10, CanUpdate = false)]
-        public long? TenantId { get; set; }
-
         /// <summary>
         /// 角色Id
         /// </summary>

+ 13 - 2
Admin.Core.Model/Admin/TenantEntity.cs

@@ -50,13 +50,24 @@ namespace Admin.Core.Model.Admin
         public string Email { get; set; }
 
         /// <summary>
-        /// 拥有者
+        /// 授权用户
         /// </summary>
-        [Column(CanUpdate = false)]
         public long? UserId { get; set; }
 
         public UserEntity User { get; set; }
 
+        /// <summary>
+        /// 授权角色
+        /// </summary>
+        public long? RoleId { get; set; }
+
+        public RoleEntity Role { get; set; }
+
+        /// <summary>
+        /// 租户类型
+        /// </summary>
+        public TenantType? TenantType { get; set; } = Common.BaseModel.TenantType.Tenant;
+
         /// <summary>
         /// 数据库
         /// </summary>

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

@@ -18,6 +18,8 @@ namespace Admin.Core.Model.Admin
         [Column(Position = -10)]
         public long? TenantId { get; set; }
 
+        public TenantEntity  Tenant { get; set; }
+
         /// <summary>
         /// 账号
         /// </summary>

+ 2 - 8
Admin.Core.Model/Admin/UserRoleEntity.cs

@@ -7,15 +7,9 @@ namespace Admin.Core.Model.Admin
     /// 用户角色
     /// </summary>
 	[Table(Name = "ad_user_role")]
-    [Index("idx_{tablename}_01", nameof(UserId) + "," + nameof(RoleId) + "," + nameof(TenantId), true)]
-    public class UserRoleEntity: EntityAdd, ITenant
+    [Index("idx_{tablename}_01", nameof(UserId) + "," + nameof(RoleId), true)]
+    public class UserRoleEntity: EntityAdd
     {
-        /// <summary>
-        /// 租户Id
-        /// </summary>
-        [Column(Position = -10, CanUpdate = false)]
-        public long? TenantId { get; set; }
-
         /// <summary>
         /// 用户Id
         /// </summary>

+ 2 - 8
Admin.Core.Model/Admin/ViewEntity.cs

@@ -9,15 +9,9 @@ namespace Admin.Core.Model.Admin
     /// 视图管理
     /// </summary>
 	[Table(Name = "ad_view")]
-    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Label) + "," + nameof(TenantId), true)]
-    public class ViewEntity : EntityFull, ITenant
+    [Index("idx_{tablename}_01", nameof(ParentId) + "," + nameof(Label), true)]
+    public class ViewEntity : EntityFull
     {
-        /// <summary>
-        /// 租户Id
-        /// </summary>
-        [Column(Position = -10, CanUpdate = false)]
-        public long? TenantId { get; set; }
-
         /// <summary>
         /// 所属节点
         /// </summary>

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

@@ -8,7 +8,7 @@ namespace Admin.Core.Repository
         public static IFreeSql GetTenant(this IdleBus<IFreeSql> ib, long? tenantId, AppConfig appConfig)
         {
             var tenantName = AdminConsts.TenantName;
-            if (appConfig.TenantType == TenantType.Own)
+            if (appConfig.TenantDbType == TenantDbType.Own)
             {
                 tenantName = "tenant_" + tenantId?.ToString();
             }

+ 26 - 23
Admin.Core.Services/Admin/Auth/AuthService.cs

@@ -11,36 +11,34 @@ using Admin.Core.Common.Configs;
 using Admin.Core.Common.Helpers;
 using Admin.Core.Service.Admin.Auth.Input;
 using Admin.Core.Service.Admin.Auth.Output;
+using Admin.Core.Common.BaseModel;
 
 namespace Admin.Core.Service.Admin.Auth
 {
-    public class AuthService : IAuthService
+    public class AuthService : BaseService, IAuthService
     {
-        private readonly IUser _user;
         private readonly ICache _cache;
-        private readonly IMapper _mapper;
         private readonly AppConfig _appConfig;
         private readonly VerifyCodeHelper _verifyCodeHelper;
         private readonly IUserRepository _userRepository;
         private readonly IPermissionRepository _permissionRepository;
+        private readonly ITenantRepository _tenantRepository;
 
         public AuthService(
-            IUser user,
             ICache cache,
-            IMapper mapper,
             AppConfig appConfig,
             VerifyCodeHelper verifyCodeHelper,
             IUserRepository userRepository,
-            IPermissionRepository permissionRepository
+            IPermissionRepository permissionRepository,
+            ITenantRepository tenantRepository
         )
         {
-            _user = user;
             _cache = cache;
-            _mapper = mapper;
             _appConfig = appConfig;
             _verifyCodeHelper = verifyCodeHelper;
             _userRepository = userRepository;
             _permissionRepository = permissionRepository;
+            _tenantRepository = tenantRepository;
         }
 
         public async Task<IResponseOutput> LoginAsync(AuthLoginInput input)
@@ -108,20 +106,25 @@ namespace Admin.Core.Service.Admin.Auth
                 return ResponseOutput.NotOk("密码输入有误!", 4);
             }
 
-            var authLoginOutput = _mapper.Map<AuthLoginOutput>(user);
+            var authLoginOutput = Mapper.Map<AuthLoginOutput>(user);
+
+            if(_appConfig.TenantDbType == TenantDbType.Share)
+            {
+                authLoginOutput.TenantType = await _tenantRepository.Select.WhereDynamic(user.TenantId).ToOneAsync(a => a.TenantType);
+            }
 
             return ResponseOutput.Ok(authLoginOutput);
         }
 
         public async Task<IResponseOutput> GetUserInfoAsync()
         {
-            if (!(_user?.Id > 0))
+            if (!(User?.Id > 0))
             {
                 return ResponseOutput.NotOk("未登录!");
             }
 
             //用户信息
-            var user = await _userRepository.Select.WhereDynamic(_user.Id)
+            var user = await _userRepository.Select.WhereDynamic(User.Id)
                 .ToOneAsync(m => new {
                     m.NickName,
                     m.UserName,
@@ -131,12 +134,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()
-                //)
+                .WhereIf(User.TenantType == TenantType.Tenant, a =>
+                    _permissionRepository.Orm.Select<RolePermissionEntity>().DisableGlobalFilter("Tenant")
+                    .InnerJoin<TenantEntity>((b, c) => b.RoleId == c.RoleId && c.Id == User.TenantId)
+                    .Where(b => b.PermissionId == a.Id)
+                    .Any()
+                )
                 .OrderBy(a => a.ParentId)
                 .OrderBy(a => a.Sort)
                 .ToListAsync(a => new
@@ -158,12 +161,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 });

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

@@ -1,4 +1,6 @@
-using System;
+using Admin.Core.Common.BaseModel;
+using Admin.Core.Model.Admin;
+using System;
 
 namespace Admin.Core.Service.Admin.Auth.Output
 {
@@ -23,5 +25,10 @@ namespace Admin.Core.Service.Admin.Auth.Output
         /// 租户Id
         /// </summary>
         public long? TenantId { get; set; }
+
+        /// <summary>
+        /// 租户类型
+        /// </summary>
+        public TenantType? TenantType { get; set; } = Common.BaseModel.TenantType.Tenant;
     }
 }

+ 5 - 0
Admin.Core.Services/Admin/LoginLog/Input/LoginLogAddInput.cs

@@ -5,6 +5,11 @@
     /// </summary>
     public class LoginLogAddInput
     {
+        /// <summary>
+        /// 租户Id
+        /// </summary>
+        public long? TenantId { get; set; }
+
         /// <summary>
         /// 昵称
         /// </summary>

+ 1 - 0
Admin.Core.Services/Admin/Permission/IPermissionService.cs

@@ -45,5 +45,6 @@ namespace Admin.Core.Service.Admin.Permission
         Task<IResponseOutput> SoftDeleteAsync(long id);
 
         Task<IResponseOutput> AssignAsync(PermissionAssignInput input);
+
     }
 }

+ 13 - 5
Admin.Core.Services/Admin/Permission/PermissionService.cs

@@ -14,20 +14,21 @@ using Admin.Core.Common.Helpers;
 
 namespace Admin.Core.Service.Admin.Permission
 {	
-	public class PermissionService : IPermissionService
+	public class PermissionService : BaseService,IPermissionService
     {
         private readonly IMapper _mapper;
         private readonly ICache _cache;
         private readonly IPermissionRepository _permissionRepository;
         private readonly IRoleRepository _roleRepository;
         private readonly IRolePermissionRepository _rolePermissionRepository;
-
+        private readonly IUserRoleRepository _userRoleRepository;
         public PermissionService(
             IMapper mapper,
             ICache cache,
             IPermissionRepository permissionRepository,
             IRoleRepository roleRepository,
-            IRolePermissionRepository rolePermissionRepository
+            IRolePermissionRepository rolePermissionRepository,
+            IUserRoleRepository userRoleRepository
         )
         {
             _mapper = mapper;
@@ -35,6 +36,7 @@ namespace Admin.Core.Service.Admin.Permission
             _permissionRepository = permissionRepository;
             _roleRepository = roleRepository;
             _rolePermissionRepository = rolePermissionRepository;
+            _userRoleRepository = userRoleRepository;
         }
 
         public async Task<IResponseOutput> GetAsync(long id)
@@ -190,10 +192,10 @@ namespace Admin.Core.Service.Admin.Permission
         public async Task<IResponseOutput> AssignAsync(PermissionAssignInput input)
         {
             //分配权限的时候判断角色是否存在
-            var exists = await _roleRepository.Select.WhereDynamic(input.RoleId).AnyAsync();
+            var exists = await _roleRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(input.RoleId).AnyAsync();
             if (!exists)
             {
-                return ResponseOutput.NotOk("该角色不存在或已被删除,请刷新角色列表");
+                return ResponseOutput.NotOk("该角色不存在或已被删除");
             }
 
             //查询角色权限
@@ -231,6 +233,12 @@ namespace Admin.Core.Service.Admin.Permission
         public async Task<IResponseOutput> GetPermissionList()
         {
             var permissions = await _permissionRepository.Select
+                .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 { a.Id, a.ParentId, a.Label, a.Type });

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

@@ -11,7 +11,17 @@ namespace Admin.Core.Service.Admin.Tenant.Output
         public long Id { get; set; }
 
         /// <summary>
-        /// 编码
+        /// 授权用户
+        /// </summary>
+        public long? UserId { get; set; }
+
+        /// <summary>
+        /// 授权角色
+        /// </summary>
+        public long? RoleId { get; set; }
+
+        /// <summary>
+        /// 企业编码
         /// </summary>
         public string Code { get; set; }
 

+ 2 - 1
Admin.Core.Services/Admin/Tenant/TenantService.cs

@@ -78,11 +78,12 @@ namespace Admin.Core.Service.Admin.Tenant
             await _userRepository.InsertAsync(user);
 
             //添加用户角色
-            var userRole = new UserRoleEntity() { TenantId = tenantId, UserId = user.Id, RoleId = role.Id };
+            var userRole = new UserRoleEntity() { UserId = user.Id, RoleId = role.Id };
             await _userRoleRepository.InsertAsync(userRole);
 
             //更新租户用户
             tenant.UserId = user.Id;
+            tenant.RoleId = role.Id;
             await _tenantRepository.UpdateAsync(tenant);
 
             return ResponseOutput.Ok();

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

@@ -39,10 +39,5 @@ namespace Admin.Core.Service.Admin.User.Input
         /// 角色
         /// </summary>
         public long[] RoleIds { get; set; }
-
-        /// <summary>
-        /// 租户
-        /// </summary>
-        public long? TenantId { get; set; }
     }
 }

+ 0 - 5
Admin.Core.Services/Admin/User/Input/UserUpdateInput.cs

@@ -43,10 +43,5 @@ namespace Admin.Core.Service.Admin.User.Input
         /// 版本
         /// </summary>
         public long Version { get; set; }
-
-        /// <summary>
-        /// 租户
-        /// </summary>
-        public long? TenantId { get; set; }
     }
 }

+ 48 - 18
Admin.Core/Admin.Core.Common.xml

@@ -59,6 +59,11 @@
             租户Id
             </summary>
         </member>
+        <member name="F:Admin.Core.Common.Auth.ClaimAttributes.TenantType">
+            <summary>
+            租户类型
+            </summary>
+        </member>
         <member name="T:Admin.Core.Common.Auth.IUser">
             <summary>
             用户信息接口
@@ -84,6 +89,11 @@
             租户Id
             </summary>
         </member>
+        <member name="P:Admin.Core.Common.Auth.IUser.TenantType">
+            <summary>
+            租户类型
+            </summary>
+        </member>
         <member name="T:Admin.Core.Common.Auth.User">
             <summary>
             用户信息
@@ -109,6 +119,11 @@
             租户Id
             </summary>
         </member>
+        <member name="P:Admin.Core.Common.Auth.User.TenantType">
+            <summary>
+            租户类型
+            </summary>
+        </member>
         <member name="T:Admin.Core.Common.Auth.UserIdentiyServer">
             <summary>
             用户信息
@@ -254,6 +269,21 @@
             租户Id
             </summary>
         </member>
+        <member name="T:Admin.Core.Common.BaseModel.TenantType">
+            <summary>
+            租户类型
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.BaseModel.TenantType.Platform">
+            <summary>
+            平台
+            </summary>
+        </member>
+        <member name="F:Admin.Core.Common.BaseModel.TenantType.Tenant">
+            <summary>
+            租户
+            </summary>
+        </member>
         <member name="T:Admin.Core.Common.Cache.CacheKey">
             <summary>
             缓存键
@@ -400,22 +430,22 @@
             Redis缓存
             </summary>
         </member>
-        <member name="T:Admin.Core.Common.Configs.TenantType">
+        <member name="T:Admin.Core.Common.Configs.TenantDbType">
             <summary>
-            租户类型
+            租户数据库类型
             </summary>
         </member>
-        <member name="F:Admin.Core.Common.Configs.TenantType.None">
+        <member name="F:Admin.Core.Common.Configs.TenantDbType.None">
             <summary>
             无租户
             </summary>
         </member>
-        <member name="F:Admin.Core.Common.Configs.TenantType.Share">
+        <member name="F:Admin.Core.Common.Configs.TenantDbType.Share">
             <summary>
             共享数据库
             </summary>
         </member>
-        <member name="F:Admin.Core.Common.Configs.TenantType.Own">
+        <member name="F:Admin.Core.Common.Configs.TenantDbType.Own">
             <summary>
             独立数据库
             </summary>
@@ -435,7 +465,7 @@
             跨域地址,默认 http://*:9000
             </summary>
         </member>
-        <member name="P:Admin.Core.Common.Configs.AppConfig.TenantType">
+        <member name="P:Admin.Core.Common.Configs.AppConfig.TenantDbType">
             <summary>
             租户类型
             </summary>
@@ -764,6 +794,18 @@
             <param name="s"></param>
             <returns></returns>
         </member>
+        <member name="M:Admin.Core.Common.Extensions.ListExtensions.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.Files.FileInfo">
             <summary>
             文件信息
@@ -1169,18 +1211,6 @@
             </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加密

+ 12 - 32
Admin.Core/Admin.Core.Model.xml

@@ -9,11 +9,6 @@
             接口管理
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Admin.ApiEntity.TenantId">
-            <summary>
-            租户Id
-            </summary>
-        </member>
         <member name="P:Admin.Core.Model.Admin.ApiEntity.ParentId">
             <summary>
             所属模块
@@ -164,14 +159,9 @@
             文档图片
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Admin.DocumentImageEntity.TenantId">
-            <summary>
-            租户Id
-            </summary>
-        </member>
         <member name="P:Admin.Core.Model.Admin.DocumentImageEntity.DocumentId">
             <summary>
-            用户Id
+            文档Id
             </summary>
         </member>
         <member name="P:Admin.Core.Model.Admin.DocumentImageEntity.Url">
@@ -299,11 +289,6 @@
             权限
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Admin.PermissionEntity.TenantId">
-            <summary>
-            租户Id
-            </summary>
-        </member>
         <member name="P:Admin.Core.Model.Admin.PermissionEntity.ParentId">
             <summary>
             父级节点
@@ -449,11 +434,6 @@
             角色权限
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Admin.RolePermissionEntity.TenantId">
-            <summary>
-            租户Id
-            </summary>
-        </member>
         <member name="P:Admin.Core.Model.Admin.RolePermissionEntity.RoleId">
             <summary>
             角色Id
@@ -511,7 +491,17 @@
         </member>
         <member name="P:Admin.Core.Model.Admin.TenantEntity.UserId">
             <summary>
-            拥有者
+            授权用户
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.TenantEntity.RoleId">
+            <summary>
+            授权角色
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.TenantEntity.TenantType">
+            <summary>
+            租户类型
             </summary>
         </member>
         <member name="P:Admin.Core.Model.Admin.TenantEntity.DbType">
@@ -584,11 +574,6 @@
             用户角色
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Admin.UserRoleEntity.TenantId">
-            <summary>
-            租户Id
-            </summary>
-        </member>
         <member name="P:Admin.Core.Model.Admin.UserRoleEntity.UserId">
             <summary>
             用户Id
@@ -604,11 +589,6 @@
             视图管理
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Admin.ViewEntity.TenantId">
-            <summary>
-            租户Id
-            </summary>
-        </member>
         <member name="P:Admin.Core.Model.Admin.ViewEntity.ParentId">
             <summary>
             所属节点

+ 21 - 11
Admin.Core/Admin.Core.Service.xml

@@ -312,6 +312,11 @@
             租户Id
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Auth.Output.AuthLoginOutput.TenantType">
+            <summary>
+            租户类型
+            </summary>
+        </member>
         <member name="T:Admin.Core.Service.Admin.Auth.MapConfig">
             <summary>
             映射配置
@@ -610,6 +615,11 @@
             添加
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.LoginLog.Input.LoginLogAddInput.TenantId">
+            <summary>
+            租户Id
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.LoginLog.Input.LoginLogAddInput.NickName">
             <summary>
             昵称
@@ -1380,9 +1390,19 @@
             主键
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Tenant.Output.TenantListOutput.UserId">
+            <summary>
+            授权用户
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Admin.Tenant.Output.TenantListOutput.RoleId">
+            <summary>
+            授权角色
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.Tenant.Output.TenantListOutput.Code">
             <summary>
-            编码
+            企业编码
             </summary>
         </member>
         <member name="P:Admin.Core.Service.Admin.Tenant.Output.TenantListOutput.Name">
@@ -1480,11 +1500,6 @@
             角色
             </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>
             修改密码
@@ -1580,11 +1595,6 @@
             版本
             </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>
             用户服务

+ 5 - 0
Admin.Core/Admin.Core.xml

@@ -741,6 +741,11 @@
             数据
             </summary>
         </member>
+        <member name="F:Admin.Core.Db.DbHelper.TimeOffset">
+            <summary>
+            偏移时间
+            </summary>
+        </member>
         <member name="M:Admin.Core.Db.DbHelper.CreateDatabaseAsync(Admin.Core.Common.Configs.DbConfig)">
             <summary>
             创建数据库

+ 9 - 1
Admin.Core/Aop/TransactionAsyncInterceptor.cs

@@ -106,7 +106,15 @@ namespace Admin.Core.Aop
                 try
                 {
                     invocation.Proceed();
-                    _unitOfWork.Commit();
+                    var result = invocation.ReturnValue;
+                    if (result is IResponseOutput res && !res.Success)
+                    {
+                        _unitOfWork.Rollback();
+                    }
+                    else
+                    {
+                        _unitOfWork.Commit();
+                    }
                 }
                 catch
                 {

+ 5 - 1
Admin.Core/Attributes/ValidateInputAttribute.cs

@@ -4,6 +4,7 @@ using Admin.Core.Common.Output;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Mvc.Filters;
+using Microsoft.Extensions.Logging;
 
 namespace Admin.Core.Attributes
 {
@@ -19,7 +20,10 @@ namespace Admin.Core.Attributes
             {
                 try
                 {
-                    context.Result = new JsonResult(ResponseOutput.NotOk(context.ModelState.Values.First().Errors[0].ErrorMessage));
+                    var logger = (ILogger<ValidateInputAttribute>)context.HttpContext.RequestServices.GetService(typeof(ILogger<ValidateInputAttribute>));
+                    var errorMessages = context.ModelState.Values.First().Errors.Select(a => a.ErrorMessage);
+                    logger.LogError(string.Join(",", errorMessages));
+                    context.Result = new JsonResult(ResponseOutput.NotOk(errorMessages.First()));
                 }
                 catch
                 {

+ 3 - 1
Admin.Core/Controllers/Admin/AuthController.cs

@@ -61,7 +61,8 @@ namespace Admin.Core.Controllers.Admin
                 new Claim(ClaimAttributes.UserId, user.Id.ToString()),
                 new Claim(ClaimAttributes.UserName, user.UserName),
                 new Claim(ClaimAttributes.UserNickName, user.NickName),
-                new Claim(ClaimAttributes.TenantId, user.TenantId.ToString())
+                new Claim(ClaimAttributes.TenantId, user.TenantId.ToString()),
+                new Claim(ClaimAttributes.TenantType, user.TenantType.ToString())
             });
 
             return ResponseOutput.Ok(new { token });
@@ -135,6 +136,7 @@ namespace Admin.Core.Controllers.Admin
                 var user = output.Data;
                 loginLogAddInput.CreatedUserId = user.Id;
                 loginLogAddInput.NickName = user.NickName;
+                loginLogAddInput.TenantId = user.TenantId;
             }
 
             await _loginLogService.AddAsync(loginLogAddInput);

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
Admin.Core/Db/Data/data.json


+ 5 - 4
Admin.Core/Db/DbHelper.cs

@@ -19,6 +19,7 @@ using FreeSql.Aop;
 using Admin.Core.Common.Attributes;
 using Admin.Core.Common.Auth;
 using Yitter.IdGenerator;
+using Admin.Core.Common.Extensions;
 
 namespace Admin.Core.Db
 {
@@ -96,7 +97,7 @@ namespace Admin.Core.Db
         public static void ConfigEntity(IFreeSql db, AppConfig appConfig = null)
         {
             //非共享数据库实体配置,不生成和操作租户Id
-            if (appConfig.TenantType != TenantType.Share)
+            if (appConfig.TenantDbType != TenantDbType.Share)
             {
                 var iTenant = nameof(ITenant);
                 var tenantId = nameof(ITenant.TenantId);
@@ -316,7 +317,7 @@ namespace Admin.Core.Db
         /// <param name="e"></param>
         private static void SyncDataAuditValue(object s, AuditValueEventArgs e)
         {
-            var user = new { Id = 161223411986501, Name = "平台管理员", TenantId = 161223412138053 };
+            var user = new { Id = 161223411986501, Name = "admin", TenantId = 161223412138053 };
 
             if (e.Property.GetCustomAttribute<ServerTimeAttribute>(false) != null
                    && (e.Column.CsType == typeof(DateTime) || e.Column.CsType == typeof(DateTime?))
@@ -537,7 +538,6 @@ namespace Admin.Core.Db
                 #region 用户角色
                 var userRoles = await db.Queryable<UserRoleEntity>().ToListAsync(a => new
                 {
-                    a.TenantId,
                     a.Id,
                     a.UserId,
                     a.RoleId
@@ -547,7 +547,6 @@ namespace Admin.Core.Db
                 #region 角色权限
                 var rolePermissions = await db.Queryable<RolePermissionEntity>().ToListAsync(a => new
                 {
-                    a.TenantId,
                     a.Id,
                     a.RoleId,
                     a.PermissionId
@@ -559,6 +558,8 @@ namespace Admin.Core.Db
                 {
                     a.TenantId,
                     a.Id,
+                    a.UserId,
+                    a.RoleId,
                     a.Name,
                     a.Code,
                     a.RealName,

+ 2 - 2
Admin.Core/Db/TenantDBServiceCollectionExtensions.cs

@@ -40,7 +40,7 @@ namespace Admin.Core.Db
             IdleBus <IFreeSql> ib = new IdleBus<IFreeSql>(TimeSpan.FromMinutes(idleTime));
 
             var tenantName = AdminConsts.TenantName;
-            if(appConfig.TenantType == TenantType.Own)
+            if(appConfig.TenantDbType == TenantDbType.Own)
             {
                 tenantName = "tenant_" + user.TenantId?.ToString();
             }
@@ -70,7 +70,7 @@ namespace Admin.Core.Db
                 DbHelper.ConfigEntity(fsql, appConfig);
 
                 //共享数据库
-                if (appConfig.TenantType == TenantType.Share)
+                if (appConfig.TenantDbType == TenantDbType.Share)
                 {
                     fsql.GlobalFilter.ApplyIf<ITenant>("Tenant", () => user.TenantId > 0, a => a.TenantId == user.TenantId);
                 }

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

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

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov