Browse Source

添加租户权限

zhontai 3 years ago
parent
commit
11f5022888

+ 33 - 0
Admin.Core.Model/Admin/TenantPermissionEntity.cs

@@ -0,0 +1,33 @@
+using Admin.Core.Common.BaseModel;
+using FreeSql.DataAnnotations;
+
+namespace Admin.Core.Model.Admin
+{
+    /// <summary>
+    /// 租户权限
+    /// </summary>
+	[Table(Name = "ad_tenant_permission")]
+    [Index("idx_{tablename}_01", nameof(TenantId) + "," + nameof(PermissionId), true)]
+    public class TenantPermissionEntity : EntityAdd
+    {
+        /// <summary>
+        /// 租户Id
+        /// </summary>
+		public long TenantId { get; set; }
+
+        /// <summary>
+        /// 权限Id
+        /// </summary>
+		public long PermissionId { get; set; }
+
+        /// <summary>
+        /// 租户
+        /// </summary>
+        public TenantEntity Tenant { get; set; }
+
+        /// <summary>
+        /// 权限
+        /// </summary>
+        public PermissionEntity Permission { get; set; }
+    }
+}

+ 6 - 1
Admin.Core.Service/Admin/Permission/IPermissionService.cs

@@ -19,7 +19,10 @@ namespace Admin.Core.Service.Admin.Permission
 
         Task<IResponseOutput> GetPermissionList();
 
-        Task<IResponseOutput> GetRolePermissionList(long roleId = 0);
+        Task<IResponseOutput> GetRolePermissionList(long roleId);
+
+
+        Task<IResponseOutput> GetTenantPermissionList(long tenantId);
 
         Task<IResponseOutput> ListAsync(string key, DateTime? start, DateTime? end);
 
@@ -44,5 +47,7 @@ namespace Admin.Core.Service.Admin.Permission
         Task<IResponseOutput> SoftDeleteAsync(long id);
 
         Task<IResponseOutput> AssignAsync(PermissionAssignInput input);
+
+        Task<IResponseOutput> SaveTenantPermissionsAsync(PermissionSaveTenantPermissionsInput input);
     }
 }

+ 14 - 0
Admin.Core.Service/Admin/Permission/Input/PermissionSaveTenantPermissionsInput.cs

@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+
+namespace Admin.Core.Service.Admin.Permission.Input
+{
+    public class PermissionSaveTenantPermissionsInput
+    {
+        [Required(ErrorMessage = "租户不能为空!")]
+        public long TenantId { get; set; }
+
+        [Required(ErrorMessage = "权限不能为空!")]
+        public List<long> PermissionIds { get; set; }
+    }
+}

+ 61 - 8
Admin.Core.Service/Admin/Permission/PermissionService.cs

@@ -4,6 +4,7 @@ using Admin.Core.Common.Cache;
 using Admin.Core.Common.Configs;
 using Admin.Core.Common.Output;
 using Admin.Core.Model.Admin;
+using Admin.Core.Repository;
 using Admin.Core.Repository.Admin;
 using Admin.Core.Service.Admin.Permission.Input;
 using Admin.Core.Service.Admin.Permission.Output;
@@ -20,21 +21,24 @@ namespace Admin.Core.Service.Admin.Permission
         private readonly IPermissionRepository _permissionRepository;
         private readonly IRoleRepository _roleRepository;
         private readonly IRolePermissionRepository _rolePermissionRepository;
-        private readonly ITenantRepository _tenantRepository;
+        private readonly IRepositoryBase<TenantPermissionEntity> _tenantPermissionRepository;
+        private readonly IUserRepository _userRepository;
 
         public PermissionService(
             AppConfig appConfig,
             IPermissionRepository permissionRepository,
             IRoleRepository roleRepository,
             IRolePermissionRepository rolePermissionRepository,
-            ITenantRepository tenantRepository
+            IRepositoryBase<TenantPermissionEntity> tenantPermissionRepository,
+            IUserRepository userRepository
         )
         {
             _appConfig = appConfig;
             _permissionRepository = permissionRepository;
             _roleRepository = roleRepository;
             _rolePermissionRepository = rolePermissionRepository;
-            _tenantRepository = tenantRepository;
+            _tenantPermissionRepository = tenantPermissionRepository;
+            _userRepository = userRepository;
         }
 
         public async Task<IResponseOutput> GetAsync(long id)
@@ -228,14 +232,54 @@ namespace Admin.Core.Service.Admin.Permission
             return ResponseOutput.Ok();
         }
 
+        [Transaction]
+        public async Task<IResponseOutput> SaveTenantPermissionsAsync(PermissionSaveTenantPermissionsInput input)
+        {
+            //查询租户权限
+            var permissionIds = await _tenantPermissionRepository.Select.Where(d => d.TenantId == input.TenantId).ToListAsync(m => m.PermissionId);
+
+            //批量删除租户权限
+            var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
+            if (deleteIds.Count() > 0)
+            {
+                await _tenantPermissionRepository.DeleteAsync(m => m.TenantId == input.TenantId && deleteIds.Contains(m.PermissionId));
+            }
+
+            //批量插入租户权限
+            var tenatPermissions = new List<TenantPermissionEntity>();
+            var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
+            if (insertPermissionIds.Count() > 0)
+            {
+                foreach (var permissionId in insertPermissionIds)
+                {
+                    tenatPermissions.Add(new TenantPermissionEntity()
+                    {
+                        TenantId = input.TenantId,
+                        PermissionId = permissionId,
+                    });
+                }
+                await _tenantPermissionRepository.InsertAsync(tenatPermissions);
+            }
+
+            //清除租户下所有用户权限
+            if (_appConfig.Tenant)
+            {
+                var userIds = await _userRepository.Select.Where(a => a.TenantId == input.TenantId).ToListAsync(a => a.Id);
+                foreach(var userId in userIds)
+                {
+                    await Cache.DelAsync(string.Format(CacheKey.UserPermissions, userId));
+                }
+            }
+
+            return ResponseOutput.Ok();
+        }
+
         public async Task<IResponseOutput> GetPermissionList()
         {
             var permissions = await _permissionRepository.Select
-                .WhereIf(_appConfig.Tenant && User.TenantType == TenantType.Tenant && User.DataIsolationType == DataIsolationType.Share, a =>
-                    _permissionRepository.Orm.Select<RolePermissionEntity>()
-                    .InnerJoin<TenantEntity>((b, c) => b.RoleId == c.RoleId && c.Id == User.TenantId)
-                    .DisableGlobalFilter("Tenant")
-                    .Where(b => b.PermissionId == a.Id)
+                .WhereIf(_appConfig.Tenant && User.TenantType == TenantType.Tenant, a =>
+                    _permissionRepository.Orm.Select<TenantPermissionEntity>()
+                    .Where(b => b.PermissionId == a.Id && b.TenantId == User.TenantId)
                     .Any()
                 )
                 .OrderBy(a => a.ParentId)
@@ -267,5 +311,14 @@ namespace Admin.Core.Service.Admin.Permission
 
             return ResponseOutput.Ok(permissionIds);
         }
+
+        public async Task<IResponseOutput> GetTenantPermissionList(long tenantId)
+        {
+            var permissionIds = await _tenantPermissionRepository
+                .Select.Where(d => d.TenantId == tenantId)
+                .ToListAsync(a => a.PermissionId);
+
+            return ResponseOutput.Ok(permissionIds);
+        }
     }
 }

+ 25 - 0
Admin.Core/Admin.Core.Model.xml

@@ -534,6 +534,31 @@
             说明
             </summary>
         </member>
+        <member name="T:Admin.Core.Model.Admin.TenantPermissionEntity">
+            <summary>
+            租户权限
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.TenantPermissionEntity.TenantId">
+            <summary>
+            租户Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.TenantPermissionEntity.PermissionId">
+            <summary>
+            权限Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.TenantPermissionEntity.Tenant">
+            <summary>
+            租户
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Admin.TenantPermissionEntity.Permission">
+            <summary>
+            权限
+            </summary>
+        </member>
         <member name="T:Admin.Core.Model.Admin.UserEntity">
             <summary>
             用户

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

@@ -430,6 +430,13 @@
             <param name="roleId"></param>
             <returns></returns>
         </member>
+        <member name="M:Admin.Core.Controllers.Admin.PermissionController.GetTenantPermissionList(System.Int64)">
+            <summary>
+            查询租户权限
+            </summary>
+            <param name="tenantId"></param>
+            <returns></returns>
+        </member>
         <member name="M:Admin.Core.Controllers.Admin.PermissionController.AddGroup(Admin.Core.Service.Admin.Permission.Input.PermissionAddGroupInput)">
             <summary>
             新增分组
@@ -500,6 +507,13 @@
             <param name="input"></param>
             <returns></returns>
         </member>
+        <member name="M:Admin.Core.Controllers.Admin.PermissionController.SaveTenantPermissions(Admin.Core.Service.Admin.Permission.Input.PermissionSaveTenantPermissionsInput)">
+            <summary>
+            保存租户权限
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
         <member name="T:Admin.Core.Controllers.Admin.RoleController">
             <summary>
             角色管理

+ 22 - 0
Admin.Core/Controllers/Admin/PermissionController.cs

@@ -97,6 +97,17 @@ namespace Admin.Core.Controllers.Admin
             return await _permissionServices.GetRolePermissionList(roleId);
         }
 
+        /// <summary>
+        /// 查询租户权限
+        /// </summary>
+        /// <param name="tenantId"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IResponseOutput> GetTenantPermissionList(long tenantId = 0)
+        {
+            return await _permissionServices.GetTenantPermissionList(tenantId);
+        }
+
         /// <summary>
         /// 新增分组
         /// </summary>
@@ -206,5 +217,16 @@ namespace Admin.Core.Controllers.Admin
         {
             return await _permissionServices.AssignAsync(input);
         }
+
+        /// <summary>
+        /// 保存租户权限
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IResponseOutput> SaveTenantPermissions(PermissionSaveTenantPermissionsInput input)
+        {
+            return await _permissionServices.SaveTenantPermissionsAsync(input);
+        }
     }
 }