fix 用户和菜单权限联合
This commit is contained in:
@@ -8,6 +8,9 @@ using Dlhis.Entity.Sys.Enums;
|
||||
|
||||
namespace Dlhis.Sys.Menu.Controllers;
|
||||
|
||||
/// <summary>
|
||||
/// 菜单
|
||||
/// </summary>
|
||||
[Authorize]
|
||||
[Route("api/[controller]")]
|
||||
[ApiController]
|
||||
@@ -23,14 +26,11 @@ public class MenusController : ControllerBase
|
||||
/// <summary>
|
||||
/// 菜单列表
|
||||
/// </summary>
|
||||
/// <param name="platform">菜单平台类型 PlatformEnumType</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("list")]
|
||||
public async Task<List<MenuResponse>> GetListAsync([EnumDataType(typeof(PlatformEnumType))] PlatformEnumType? platform)
|
||||
public async Task<List<MenuResponse>> GetListAsync([EnumDataType(typeof(PlatformEnumType))] PlatformEnumType? platform = PlatformEnumType.PCAdmin)
|
||||
{
|
||||
if (!platform.HasValue)
|
||||
{
|
||||
platform = PlatformEnumType.UserMobile;
|
||||
}
|
||||
return await _menuService.GetListAsync(platform.Value);
|
||||
}
|
||||
|
||||
@@ -59,17 +59,19 @@ public class MenusController : ControllerBase
|
||||
/// <summary>
|
||||
/// 当前类型的权限分配
|
||||
/// </summary>
|
||||
/// <param name="permissionType">权限类型</param>
|
||||
/// <param name="uniqueType">权限分配类型 MenuAssignmentTypeEnumType</param>
|
||||
/// <param name="uniqueValue">类型对应的唯一值</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("assignments")]
|
||||
public async Task<List<string>> GetAssignmentsAsync([EnumDataType(typeof(MenuPermissionTypeEnumType))] MenuPermissionTypeEnumType permissionType, [Required] string uniqueValue)
|
||||
public async Task<List<string>> GetAssignmentsAsync(
|
||||
[EnumDataType(typeof(MenuAssignmentTypeEnumType))] MenuAssignmentTypeEnumType uniqueType,
|
||||
[Required] string uniqueValue)
|
||||
{
|
||||
return await _menuService.GetAssignmentCodesAsync(permissionType, uniqueValue);
|
||||
return await _menuService.GetAssignmentCodesAsync(uniqueType, uniqueValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有权限分配
|
||||
/// 获取我的所有权限
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("assignments/all")]
|
||||
@@ -79,7 +81,7 @@ public class MenusController : ControllerBase
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 我的菜单
|
||||
/// 获取我的菜单
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("my")]
|
||||
@@ -89,7 +91,7 @@ public class MenusController : ControllerBase
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重置
|
||||
/// 重置所有路由
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
@@ -6,10 +6,10 @@ namespace Dlhis.Sys.Menu.Request;
|
||||
public class MenuPermissionAssignmentRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 权限类型
|
||||
/// 权限类型 MenuAssignmentTypeEnumType
|
||||
/// </summary>
|
||||
[EnumDataType(typeof(MenuPermissionTypeEnumType))]
|
||||
public MenuPermissionTypeEnumType UniqueType { get; set; }
|
||||
[EnumDataType(typeof(MenuAssignmentTypeEnumType))]
|
||||
public MenuAssignmentTypeEnumType UniqueType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 唯一值
|
||||
|
||||
@@ -60,13 +60,13 @@ public class SaveMenuRequest : IValidatableObject
|
||||
public int Sequence { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 菜单类型
|
||||
/// 菜单类型 MenuEnumType
|
||||
/// </summary>
|
||||
[EnumDataType(typeof(MenuEnumType))]
|
||||
public MenuEnumType MenuType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 平台
|
||||
/// 平台 PlatformEnumType
|
||||
/// </summary>
|
||||
[EnumDataType(typeof(PlatformEnumType))]
|
||||
public PlatformEnumType Platform { get; set; }
|
||||
|
||||
@@ -68,12 +68,6 @@ public class MenuResponse
|
||||
/// </summary>
|
||||
public PlatformEnumType Platform { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 手机端才会有
|
||||
/// </summary>
|
||||
public List<string> HotelIds { get; set; } = new List<string>();
|
||||
|
||||
/// <summary>
|
||||
/// 子菜单
|
||||
/// </summary>
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user