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