feat(platform): 添加权限分组树查询功能
- 新增 GetPermissionTreeEndpoint 提供 /permission/tree 接口 - 实现 GetPermissionTreeQuery 查询权限分组树数据 - 创建 GetPermissionTreeQueryHandler 处理器进行数据聚合 - 添加 PermissionGroupNodeDto 数据传输对象定义 - 按 Group 字段聚合权限数据,空值归入"未分组" - 需要 permission:read 权限访问此功能
This commit is contained in:
parent
105c7e3348
commit
d0650e200a
@ -0,0 +1,25 @@
|
||||
using BuildFlow.Platform.Application.Permissions.DTOs;
|
||||
using BuildFlow.Platform.Application.Permissions.Queries;
|
||||
using MediatR;
|
||||
|
||||
namespace BuildFlow.Host.Endpoints.rag.Permissions;
|
||||
|
||||
/// <summary>
|
||||
/// 获取权限分组树。按 Group 聚合,供管理端树形表格展示。
|
||||
/// 需 permission:read 权限——权限码本身是敏感信息,仅授权用户可见。
|
||||
/// </summary>
|
||||
public class GetPermissionTreeEndpoint(IMediator mediator)
|
||||
: EndpointWithoutRequest<List<PermissionGroupNodeDto>>
|
||||
{
|
||||
public override void Configure()
|
||||
{
|
||||
Get("/permission/tree");
|
||||
Permissions("permission:read");
|
||||
}
|
||||
|
||||
public override async Task HandleAsync(CancellationToken ct)
|
||||
{
|
||||
var tree = await mediator.Send(new GetPermissionTreeQuery(), ct);
|
||||
await Send.OkAsync(tree, ct);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
namespace BuildFlow.Platform.Application.Permissions.DTOs;
|
||||
|
||||
/// <summary>
|
||||
/// 权限分组树节点。按 Group 字段聚合,供管理端树形表格展示。
|
||||
/// 第一层为分组,其下 Children 为该分组内的权限。
|
||||
/// Group 为空的权限归入“未分组”。
|
||||
/// </summary>
|
||||
public record PermissionGroupNodeDto
|
||||
{
|
||||
/// <summary>分组名称(为空时归入“未分组”)。</summary>
|
||||
public required string Group { get; init; }
|
||||
|
||||
/// <summary>该分组下的权限列表。</summary>
|
||||
public List<PermissionDto> Permissions { get; init; } = [];
|
||||
}
|
||||
@ -0,0 +1,37 @@
|
||||
using MediatR;
|
||||
using BuildFlow.Platform.Application.Permissions.DTOs;
|
||||
using BuildFlow.Platform.Infrastructure.Persistence;
|
||||
using BuildFlow.Platform.Application.Permissions.Queries;
|
||||
|
||||
namespace BuildFlow.Platform.Application.Permissions.Handlers;
|
||||
|
||||
/// <summary>
|
||||
/// 权限分组树查询处理器。按 Group 聚合,一次查询后在内存分组,避免多次往返。
|
||||
/// Group 为空的统一归入“未分组”,便于管理端一并展示。
|
||||
/// </summary>
|
||||
public class GetPermissionTreeQueryHandler(PlatformDbContext db)
|
||||
: IRequestHandler<GetPermissionTreeQuery, List<PermissionGroupNodeDto>>
|
||||
{
|
||||
public async Task<List<PermissionGroupNodeDto>> Handle(
|
||||
GetPermissionTreeQuery request,
|
||||
CancellationToken ct)
|
||||
{
|
||||
// 一次查出全部权限,避免按分组逐组查询造成 N 次往返。
|
||||
var permissions = await db.Permissions
|
||||
.OrderBy(p => p.Group)
|
||||
.ThenBy(p => p.Code)
|
||||
.Select(p => new PermissionDto(p.Id, p.Name, p.Code, p.Description, p.Group))
|
||||
.ToListAsync(ct);
|
||||
|
||||
// 按 Group 聚合;null/空 Group 统一归入“未分组”。
|
||||
return permissions
|
||||
.GroupBy(p => string.IsNullOrWhiteSpace(p.Group) ? "未分组" : p.Group!)
|
||||
.OrderBy(g => g.Key)
|
||||
.Select(g => new PermissionGroupNodeDto
|
||||
{
|
||||
Group = g.Key,
|
||||
Permissions = g.ToList(),
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
using MediatR;
|
||||
using BuildFlow.Platform.Application.Permissions.DTOs;
|
||||
|
||||
namespace BuildFlow.Platform.Application.Permissions.Queries;
|
||||
|
||||
/// <summary>
|
||||
/// 查询权限分组树。按 Group 聚合返回树结构,供管理端树形展示。
|
||||
/// </summary>
|
||||
public record GetPermissionTreeQuery : IRequest<List<PermissionGroupNodeDto>>;
|
||||
Loading…
x
Reference in New Issue
Block a user