Procházet zdrojové kódy

用户菜单权限使用缓存

tian_z před 3 roky
rodič
revize
033c8c1429

+ 45 - 16
Admin.NET/Admin.NET.Core/Service/Menu/SysMenuService.cs

@@ -19,16 +19,20 @@ namespace Admin.NET.Core.Service
         private readonly IUserManager _userManager;
         private readonly SysRoleMenuService _sysRoleMenuService;
         private readonly SysUserRoleService _sysUserRoleService;
+        private readonly ISysCacheService _sysCacheService;
 
         public SysMenuService(SqlSugarRepository<SysMenu> sysMenuRep,
             IUserManager userManager,
             SysRoleMenuService sysRoleMenuService,
-            SysUserRoleService sysUserRoleService)
+            SysUserRoleService sysUserRoleService,
+            ISysCacheService sysCacheService
+            )
         {
             _sysMenuRep = sysMenuRep;
             _userManager = userManager;
             _sysRoleMenuService = sysRoleMenuService;
             _sysUserRoleService = sysUserRoleService;
+            _sysCacheService = sysCacheService;
         }
 
         /// <summary>
@@ -98,6 +102,10 @@ namespace Admin.NET.Core.Service
 
             var menu = input.Adapt<SysMenu>();
             await _sysMenuRep.InsertAsync(menu);
+
+            // 清除缓存
+            await _sysCacheService.DelByPatternAsync(CacheConst.KeyMenu);
+            await _sysCacheService.DelByPatternAsync(CacheConst.KeyPermission);
         }
 
         /// <summary>
@@ -117,6 +125,10 @@ namespace Admin.NET.Core.Service
 
             var menu = input.Adapt<SysMenu>();
             await _sysMenuRep.AsUpdateable(menu).IgnoreColumns(true).ExecuteCommandAsync();
+
+            // 清除缓存
+            await _sysCacheService.DelByPatternAsync(CacheConst.KeyMenu);
+            await _sysCacheService.DelByPatternAsync(CacheConst.KeyPermission);
         }
 
         /// <summary>
@@ -135,6 +147,10 @@ namespace Admin.NET.Core.Service
 
             // 级联删除角色菜单数据
             await _sysRoleMenuService.DeleteRoleMenuByMenuIdList(menuIdList);
+
+            // 清除缓存
+            await _sysCacheService.DelByPatternAsync(CacheConst.KeyMenu);
+            await _sysCacheService.DelByPatternAsync(CacheConst.KeyPermission);
         }
 
         /// <summary>
@@ -168,28 +184,41 @@ namespace Admin.NET.Core.Service
         [HttpGet("getPermCode")]
         public async Task<List<string>> GetPermCodeList()
         {
-            if (_userManager.SuperAdmin)
-            {
-                return await _sysMenuRep.AsQueryable()
-                    .Where(u => u.Type == MenuTypeEnum.Btn)
-                    .Select(u => u.Permission).ToListAsync();
-            }
-            else
+            var userId = _userManager.UserId;
+            var permissions = await _sysCacheService.GetPermission(userId); // 先从缓存里面读取
+            if (permissions == null || permissions.Count == 0)
             {
-                var menuIdList = await GetMenuIdList();
-                return await _sysMenuRep.AsQueryable()
-                    .Where(u => u.Type == MenuTypeEnum.Btn)
-                    .Where(u => menuIdList.Contains(u.Id))
-                    .Select(u => u.Permission).ToListAsync();
+                if (_userManager.SuperAdmin)
+                {
+                    permissions= await _sysMenuRep.AsQueryable()
+                        .Where(u => u.Type == MenuTypeEnum.Btn)
+                        .Select(u => u.Permission).ToListAsync();
+                }
+                else
+                {
+                    var menuIdList = await GetMenuIdList();
+                    permissions= await _sysMenuRep.AsQueryable()
+                        .Where(u => u.Type == MenuTypeEnum.Btn)
+                        .Where(u => menuIdList.Contains(u.Id))
+                        .Select(u => u.Permission).ToListAsync();
+                }
+                await _sysCacheService.SetPermission(userId, permissions); // 缓存结果
             }
+            return permissions;
         }
 
         [NonAction]
         public async Task<List<string>> GetAllPermCodeList()
         {
-            return await _sysMenuRep.AsQueryable()
-                    .Where(u => u.Type == MenuTypeEnum.Btn)
-                    .Select(u => u.Permission).ToListAsync();
+            var permissions = await _sysCacheService.GetPermission(0); // 先从缓存里面读取
+            if (permissions == null || permissions.Count == 0)
+            {
+                permissions = await _sysMenuRep.AsQueryable()
+                        .Where(u => u.Type == MenuTypeEnum.Btn)
+                        .Select(u => u.Permission).ToListAsync();
+                await _sysCacheService.SetPermission(0, permissions); // 缓存结果
+            }
+            return permissions;
         }
 
         /// <summary>

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

@@ -11,10 +11,12 @@ namespace Admin.NET.Core.Service
     public class SysRoleMenuService : ITransient
     {
         private readonly SqlSugarRepository<SysRoleMenu> _sysRoleMenuRep;
+        private readonly ISysCacheService _sysCacheService;
 
-        public SysRoleMenuService(SqlSugarRepository<SysRoleMenu> sysRoleMenuRep)
+        public SysRoleMenuService(SqlSugarRepository<SysRoleMenu> sysRoleMenuRep, ISysCacheService sysCacheService)
         {
             _sysRoleMenuRep = sysRoleMenuRep;
+            _sysCacheService = sysCacheService;
         }
 
         /// <summary>
@@ -60,6 +62,10 @@ namespace Admin.NET.Core.Service
                 MenuId = u
             }).ToList();
             await _sysRoleMenuRep.InsertRangeAsync(menus);
+
+            // 清除缓存
+            await _sysCacheService.DelByPatternAsync(CacheConst.KeyMenu);
+            await _sysCacheService.DelByPatternAsync(CacheConst.KeyPermission);
         }
 
         /// <summary>