From d0650e200ac3ead86873fa3cb797267798b60a9d Mon Sep 17 00:00:00 2001 From: xiangning Date: Fri, 3 Jul 2026 09:28:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(platform):=20=E6=B7=BB=E5=8A=A0=E6=9D=83?= =?UTF-8?q?=E9=99=90=E5=88=86=E7=BB=84=E6=A0=91=E6=9F=A5=E8=AF=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 GetPermissionTreeEndpoint 提供 /permission/tree 接口 - 实现 GetPermissionTreeQuery 查询权限分组树数据 - 创建 GetPermissionTreeQueryHandler 处理器进行数据聚合 - 添加 PermissionGroupNodeDto 数据传输对象定义 - 按 Group 字段聚合权限数据,空值归入"未分组" - 需要 permission:read 权限访问此功能 --- .../Permissions/GetPermissionTreeEndpoint.cs | 25 +++++++++++++ .../DTOs/PermissionGroupNodeDto.cs | 15 ++++++++ .../Handlers/GetPermissionTreeQueryHandler.cs | 37 +++++++++++++++++++ .../Queries/GetPermissionTreeQuery.cs | 9 +++++ 4 files changed, 86 insertions(+) create mode 100644 src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs create mode 100644 src/modules/platform/Application/Permissions/DTOs/PermissionGroupNodeDto.cs create mode 100644 src/modules/platform/Application/Permissions/Handlers/GetPermissionTreeQueryHandler.cs create mode 100644 src/modules/platform/Application/Permissions/Queries/GetPermissionTreeQuery.cs diff --git a/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs b/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs new file mode 100644 index 0000000..e5533b2 --- /dev/null +++ b/src/BuildFlow.Host/Endpoints/platform/Permissions/GetPermissionTreeEndpoint.cs @@ -0,0 +1,25 @@ +using BuildFlow.Platform.Application.Permissions.DTOs; +using BuildFlow.Platform.Application.Permissions.Queries; +using MediatR; + +namespace BuildFlow.Host.Endpoints.rag.Permissions; + +/// +/// 获取权限分组树。按 Group 聚合,供管理端树形表格展示。 +/// 需 permission:read 权限——权限码本身是敏感信息,仅授权用户可见。 +/// +public class GetPermissionTreeEndpoint(IMediator mediator) + : EndpointWithoutRequest> +{ + 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); + } +} diff --git a/src/modules/platform/Application/Permissions/DTOs/PermissionGroupNodeDto.cs b/src/modules/platform/Application/Permissions/DTOs/PermissionGroupNodeDto.cs new file mode 100644 index 0000000..1b94ea1 --- /dev/null +++ b/src/modules/platform/Application/Permissions/DTOs/PermissionGroupNodeDto.cs @@ -0,0 +1,15 @@ +namespace BuildFlow.Platform.Application.Permissions.DTOs; + +/// +/// 权限分组树节点。按 Group 字段聚合,供管理端树形表格展示。 +/// 第一层为分组,其下 Children 为该分组内的权限。 +/// Group 为空的权限归入“未分组”。 +/// +public record PermissionGroupNodeDto +{ + /// 分组名称(为空时归入“未分组”)。 + public required string Group { get; init; } + + /// 该分组下的权限列表。 + public List Permissions { get; init; } = []; +} diff --git a/src/modules/platform/Application/Permissions/Handlers/GetPermissionTreeQueryHandler.cs b/src/modules/platform/Application/Permissions/Handlers/GetPermissionTreeQueryHandler.cs new file mode 100644 index 0000000..56096b1 --- /dev/null +++ b/src/modules/platform/Application/Permissions/Handlers/GetPermissionTreeQueryHandler.cs @@ -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; + +/// +/// 权限分组树查询处理器。按 Group 聚合,一次查询后在内存分组,避免多次往返。 +/// Group 为空的统一归入“未分组”,便于管理端一并展示。 +/// +public class GetPermissionTreeQueryHandler(PlatformDbContext db) + : IRequestHandler> +{ + public async Task> 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(); + } +} diff --git a/src/modules/platform/Application/Permissions/Queries/GetPermissionTreeQuery.cs b/src/modules/platform/Application/Permissions/Queries/GetPermissionTreeQuery.cs new file mode 100644 index 0000000..306eb92 --- /dev/null +++ b/src/modules/platform/Application/Permissions/Queries/GetPermissionTreeQuery.cs @@ -0,0 +1,9 @@ +using MediatR; +using BuildFlow.Platform.Application.Permissions.DTOs; + +namespace BuildFlow.Platform.Application.Permissions.Queries; + +/// +/// 查询权限分组树。按 Group 聚合返回树结构,供管理端树形展示。 +/// +public record GetPermissionTreeQuery : IRequest>;