diff --git a/src/SimpleAdmin.Api/SimpleAdminApiModule.cs b/src/SimpleAdmin.Api/SimpleAdminApiModule.cs index 86606f9..9cad2cb 100644 --- a/src/SimpleAdmin.Api/SimpleAdminApiModule.cs +++ b/src/SimpleAdmin.Api/SimpleAdminApiModule.cs @@ -11,10 +11,13 @@ using Fake.FeiShu; using Fake.Security.Claims; using Fake.Serilog; using Microsoft.AspNetCore.HttpOverrides; +using Microsoft.Extensions.DependencyInjection; using Oms.Application; using Oms.SqlSugarCore; using SimpleAdmin.Api.Auth; +using SimpleAdmin.Api.Swagger; using SimpleAdmin.Api.WeChat; +using Swashbuckle.AspNetCore.SwaggerGen; namespace SimpleAdmin.Api; @@ -70,6 +73,11 @@ public class SimpleAdminApiModule : FakeModule // 添加 Fake Swagger 支持 services.AddFakeSwaggerGen(addSecurity: true); + // Fake.Rbac 菜单/组织/权限/角色接口无 XML 注释,补全 summary + services.Configure(options => + { + options.OperationFilter(); + }); services.AddCors(options => { diff --git a/src/SimpleAdmin.Api/Swagger/RbacSwaggerOperationFilter.cs b/src/SimpleAdmin.Api/Swagger/RbacSwaggerOperationFilter.cs new file mode 100644 index 0000000..efcd837 --- /dev/null +++ b/src/SimpleAdmin.Api/Swagger/RbacSwaggerOperationFilter.cs @@ -0,0 +1,67 @@ +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace SimpleAdmin.Api.Swagger; + +/// +/// Fake.Rbac 包内菜单/组织/权限/角色接口缺少 XML 注释,在此补全 Swagger summary。 +/// +public sealed class RbacSwaggerOperationFilter : IOperationFilter +{ + private static readonly Dictionary Summaries = new(StringComparer.OrdinalIgnoreCase) + { + ["GET /rbac/menu/get"] = "按 Id 获取菜单详情。", + ["GET /rbac/menu/get-menu-tree"] = "获取菜单树。", + ["GET /rbac/menu/get-user-menus"] = "获取当前用户可见菜单。", + ["POST /rbac/menu/create"] = "创建菜单。", + ["PUT /rbac/menu/update"] = "更新菜单。", + ["PUT /rbac/menu/update-order"] = "更新菜单排序。", + ["DELETE /rbac/menu/delete"] = "删除菜单。", + ["POST /rbac/menu/move-menu"] = "移动菜单节点。", + + ["GET /rbac/organization/get"] = "按 Id 获取组织详情。", + ["GET /rbac/organization/get-list"] = "获取组织列表。", + ["GET /rbac/organization/get-tree"] = "获取组织树。", + ["POST /rbac/organization/create"] = "创建组织。", + ["PUT /rbac/organization/update"] = "更新组织。", + ["DELETE /rbac/organization/delete"] = "删除组织。", + ["POST /rbac/organization/move"] = "移动组织节点。", + + ["GET /rbac/permission/get-all-permissions"] = "获取全部权限列表。", + ["GET /rbac/permission/get-permission-tree"] = "获取权限树。", + ["POST /rbac/permission/check-permission"] = "校验单个权限。", + ["POST /rbac/permission/check-permissions"] = "批量校验权限。", + + ["GET /rbac/role/get"] = "按 Id 获取角色详情。", + ["GET /rbac/role/get-list"] = "分页获取角色列表。", + ["GET /rbac/role/get-all-roles"] = "获取全部角色。", + ["POST /rbac/role/create"] = "创建角色。", + ["PUT /rbac/role/update"] = "更新角色。", + ["DELETE /rbac/role/delete"] = "删除角色。", + ["POST /rbac/role/assign-permissions"] = "为角色分配权限。", + ["GET /rbac/role/get-role-permissions"] = "获取角色已分配权限。", + ["GET /rbac/role/get-role-users"] = "获取角色下用户列表。", + ["GET /rbac/role/get-role-user-count"] = "获取角色下用户数量。", + }; + + public void Apply(OpenApiOperation operation, OperationFilterContext context) + { + if (!string.IsNullOrWhiteSpace(operation.Summary)) + { + return; + } + + var path = context.ApiDescription.RelativePath?.Trim('/') ?? string.Empty; + var method = context.ApiDescription.HttpMethod?.ToUpperInvariant() ?? string.Empty; + if (string.IsNullOrWhiteSpace(path) || string.IsNullOrWhiteSpace(method)) + { + return; + } + + var key = $"{method} /{path.TrimStart('/')}"; + if (Summaries.TryGetValue(key, out var summary)) + { + operation.Summary = summary; + } + } +}