权限配置

This commit is contained in:
马梓彭 2026-06-23 22:09:15 +08:00
parent da8d63734f
commit e3273251d6
2 changed files with 41 additions and 19 deletions

View File

@ -359,8 +359,8 @@ public class SysMenuService : BaseService<SysMenu>, ITransient
{ {
if (_authManager.IsSuperAdmin) return true; if (_authManager.IsSuperAdmin) return true;
var cache = await GetAuthButtonCodeList(_authManager.UserId); var cache = await GetAuthButtonCodeList(_authManager.UserId);
var output = cache.FirstOrDefault(x => x.Code.Contains(code, StringComparison.CurrentCultureIgnoreCase)); var output = cache.FirstOrDefault(x => string.Equals(x.Code, code, StringComparison.CurrentCultureIgnoreCase));
return output?.Access ?? true; return output?.Access ?? false;
} }
/// <summary> /// <summary>
@ -371,21 +371,35 @@ public class SysMenuService : BaseService<SysMenu>, ITransient
[NonAction] [NonAction]
public async Task<List<CheckPermissionOutput>> GetAuthButtonCodeList(long userId) public async Task<List<CheckPermissionOutput>> GetAuthButtonCodeList(long userId)
{ {
var cache = await _easyCachingProvider.GetAsync($"{CacheConst.PermissionButtonCodeKey}{userId}", async () => var cacheKey = $"{CacheConst.PermissionButtonCodeKey}v2.{userId}";
var cache = await _easyCachingProvider.GetAsync(cacheKey, async () =>
{ {
var queryable = _sysMenuRepository.AsSugarClient().Queryable<SysRole>() var list = await _sysMenuRepository.AsSugarClient()
.InnerJoin<SysUserRole>((role, userRole) => role.Id == userRole.RoleId) .Queryable<SysUserRole>()
.InnerJoin<SysRoleMenu>((role, userRole, roleMenu) => role.Id == roleMenu.RoleId) .InnerJoin<SysRole>((userRole, role) => userRole.RoleId == role.Id)
.Where(role => role.Status == AvailabilityStatus.Enable) .InnerJoin<SysRoleMenu>((userRole, role, roleMenu) => role.Id == roleMenu.RoleId)
.Select((role, userRole, roleMenu) => roleMenu); .InnerJoin<SysMenu>((userRole, role, roleMenu, menu) => roleMenu.MenuId == menu.Id)
var list = await _sysMenuRepository.AsQueryable().LeftJoin(queryable, (menu, roleMenu) => menu.Id == roleMenu.MenuId) .Where((userRole, role, roleMenu, menu) =>
.Where(menu => menu.Type == MenuType.Button || menu.Type == MenuType.DataScope) userRole.UserId == userId &&
.Select((menu, roleMenu) => new CheckPermissionOutput role.Status == AvailabilityStatus.Enable &&
menu.Status == AvailabilityStatus.Enable &&
(menu.Type == MenuType.Button || menu.Type == MenuType.DataScope))
.Select((userRole, role, roleMenu, menu) => new CheckPermissionOutput
{ {
Code = menu.Code, Code = menu.Code,
Access = SqlFunc.IIF(SqlFunc.IsNull(roleMenu.Id, 0) > 0 || menu.Status == AvailabilityStatus.Disable, true, false) Access = true
}).ToListAsync(); })
return list.Distinct().ToList(); .ToListAsync();
return list
.Where(x => !string.IsNullOrWhiteSpace(x.Code))
.GroupBy(x => x.Code)
.Select(g => new CheckPermissionOutput
{
Code = g.Key,
Access = true
})
.ToList();
}, TimeSpan.FromDays(1)); }, TimeSpan.FromDays(1));
return cache.Value; return cache.Value;
} }

View File

@ -344,12 +344,20 @@ public class SysUserService : BaseService<SysUser>, ITransient
{ {
dto.AuthBtnList = _repository.AsSugarClient().Queryable<SysMenu>() dto.AuthBtnList = _repository.AsSugarClient().Queryable<SysMenu>()
.Where(x => x.Type == MenuType.Button || x.Type == MenuType.DataScope) .Where(x => x.Type == MenuType.Button || x.Type == MenuType.DataScope)
.Select(x => x.Code).ToList(); .Select(x => x.Code)
.ToList()
.Where(x => !string.IsNullOrWhiteSpace(x))
.Distinct()
.ToList();
} }
else else
{ {
var list = _sysMenuService.GetAuthButtonCodeList(userId).GetAwaiter().GetResult(); var list = _sysMenuService.GetAuthButtonCodeList(userId).GetAwaiter().GetResult();
dto.AuthBtnList = list.Where(x => x.Access).Select(x => x.Code).ToList(); dto.AuthBtnList = list
.Where(x => x.Access && !string.IsNullOrWhiteSpace(x.Code))
.Select(x => x.Code)
.Distinct()
.ToList();
} }
}) })
.FirstAsync(); .FirstAsync();