fix 用户和菜单权限联合

This commit is contained in:
2024-01-08 10:35:25 +08:00
parent 82e77027e3
commit f4e401d649
22 changed files with 257 additions and 93 deletions

View File

@@ -5,7 +5,7 @@ using Dlhis.Sys.Menu.Response;
namespace Dlhis.Sys.Menu.Services;
public interface IMenuService
public interface IMenuService : IScopeDependency
{
Task<List<MenuResponse>> GetListAsync(PlatformEnumType platform);
@@ -13,7 +13,7 @@ public interface IMenuService
Task AssignmentAsync(MenuPermissionAssignmentRequest request);
Task<List<string>> GetAssignmentCodesAsync(MenuPermissionTypeEnumType permissionType, string uniqueData);
Task<List<string>> GetAssignmentCodesAsync(MenuAssignmentTypeEnumType permissionType, string uniqueData);
Task<List<string>> GetAllAssignmentPermissionsAsync();

View File

@@ -2,8 +2,10 @@
using Dlhis.Entity.Sys.Enums;
using Dlhis.Sys.Menu.Request;
using Dlhis.Sys.Menu.Response;
using Dlhis.User.Api;
using Kurisu.AspNetCore.Utils.Extensions;
using Kurisu.Core.User.Abstractions;
using Kurisu.SqlSugar.Attributes;
using Kurisu.SqlSugar.Services;
using Mapster;
@@ -13,11 +15,13 @@ public class MenuService : IMenuService
{
private readonly IDbContext _dbContext;
private readonly ICurrentUser _currentUser;
private readonly IUserApi _userApi;
public MenuService(IDbContext dbContext, ICurrentUser currentUser)
public MenuService(IDbContext dbContext, ICurrentUser currentUser, IUserApi userApi)
{
_dbContext = dbContext;
_currentUser = currentUser;
_userApi = userApi;
}
public async Task<List<MenuResponse>> GetListAsync(PlatformEnumType platform)
@@ -37,6 +41,7 @@ public class MenuService : IMenuService
return top;
}
[Transactional]
public async Task SaveMenuAsync(SaveMenuRequest request)
{
await CheckAsync(request);
@@ -57,27 +62,9 @@ public class MenuService : IMenuService
}
}
private async Task ChangeIfCodeEditAsync(string beforeCode, string pcode)
{
if (beforeCode != pcode)
{
//修改下级的PCode为当前的code
var menus = await _dbContext.Queryable<MenuEntity>().Where(x => x.PCode == beforeCode).ToListAsync();
menus.ForEach(x => { x.PCode = pcode; });
//修改权限code为当前的code,避免权限丢失
var permissions = await _dbContext.Queryable<MenuPermissionEntity>().Where(x => x.Code == beforeCode).ToListAsync();
permissions.ForEach(x => { x.Code = pcode; });
await _dbContext.UpdateAsync(menus);
await _dbContext.UpdateAsync(permissions);
}
}
public async Task AssignmentAsync(MenuPermissionAssignmentRequest request)
{
(request.UniqueType == MenuPermissionTypeEnumType.Role).ThrowIfTrue("暂不支持角色分配");
(request.UniqueType == MenuAssignmentTypeEnumType.Role).ThrowIfTrue("暂不支持角色分配");
//清空覆盖
var permissionsToDelete = await _dbContext.Queryable<MenuPermissionEntity>()
@@ -98,15 +85,57 @@ public class MenuService : IMenuService
await _dbContext.InsertAsync(permissions);
}
public Task<List<string>> GetAssignmentCodesAsync(MenuPermissionTypeEnumType permissionType, string uniqueData)
public async Task<List<string>> GetAssignmentCodesAsync(MenuAssignmentTypeEnumType uniqueType, string uniqueData)
{
throw new NotImplementedException();
var permissionCodes = await _dbContext.Queryable<MenuPermissionEntity>()
.Where(x => x.UniqueType == uniqueType)
.Where(x => x.UniqueValue == uniqueData)
.Select(x => x.Code)
.ToListAsync();
var menus = await GetListAsync(PlatformEnumType.PCAdmin);
foreach (var menu in menus)
{
if (menu.Items.Any())
{
var codes = RecursionHandler(menu.Items, permissionCodes);
permissionCodes.RemoveAll(x => codes.Contains(x));
}
}
return permissionCodes;
static List<string> RecursionHandler(List<MenuResponse> menus, List<string> innerPermissions)
{
var codes = new HashSet<string>();
foreach (var menu in menus)
{
if (menu.Items.Any())
{
var innerPermissionCodes = RecursionHandler(menu.Items, innerPermissions);
foreach (var item in innerPermissionCodes)
{
codes.Add(item);
}
}
if (!innerPermissions.Contains(menu.Code))
{
foreach (var item in menu.Items.Select(x => x.Code))
{
codes.Add(item);
}
}
}
return codes.ToList();
}
}
public async Task<List<string>> GetAllAssignmentPermissionsAsync()
{
var all = await GetAllAssignmentCodesAsync();
return await _dbContext.Queryable<MenuEntity>().Where(x => all.Contains(x.Code)).Select(x => x.Permission).ToListAsync();
}
@@ -238,20 +267,34 @@ public class MenuService : IMenuService
private async Task<List<string>> GetAllAssignmentCodesAsync()
{
var user = await _dbContext.Queryable<UserEntity>().Where(x => x.Id == _currentUser.GetIntSubjectId()).FirstAsync();
if (user == null)
var userApiResult = await _userApi.GetUserByIdAsync(_currentUser.GetIntSubjectId());
(userApiResult.Code == Kurisu.Core.Result.ApiStateCode.Success).ThrowIfFalse(userApiResult.Msg);
var user = userApiResult.Data;
// var groupCodes = await GetAssignmentCodesAsync(MenuPermissionTypeEnumType.Group, manager.usergrp);
//user
var userCodes = await GetAssignmentCodesAsync(MenuAssignmentTypeEnumType.User, user.Id.ToString());
var all = userCodes;// gP.Concat(uP).Distinct().ToList();
return all;
}
private async Task ChangeIfCodeEditAsync(string beforeCode, string pcode)
{
if (beforeCode != pcode)
{
return new List<string>();
//修改下级的PCode为当前的code
var menus = await _dbContext.Queryable<MenuEntity>().Where(x => x.PCode == beforeCode).ToListAsync();
menus.ForEach(x => { x.PCode = pcode; });
//修改权限code为当前的code,避免权限丢失
var permissions = await _dbContext.Queryable<MenuPermissionEntity>().Where(x => x.Code == beforeCode).ToListAsync();
permissions.ForEach(x => { x.Code = pcode; });
await _dbContext.UpdateAsync(menus);
await _dbContext.UpdateAsync(permissions);
}
// var gP = await GetAssignmentCodesAsync(MenuPermissionTypeEnumType.Group, manager.usergrp);
//
// //user
// var uP = await GetAssignmentCodesAsync(MenuPermissionTypeEnumType.User, manager.account);
// var all = gP.Concat(uP).Distinct().ToList();
//return all;
return new List<string>();
}
}