feat: 管理端返回权限过滤的菜单树

This commit is contained in:
2025-12-04 22:06:05 +08:00
parent 7f52af34e5
commit 15ccff5407
5 changed files with 365 additions and 1 deletions

View File

@@ -0,0 +1,265 @@
using System.Collections.Generic;
using System.Linq;
using TakeoutSaaS.Application.Identity.Contracts;
namespace TakeoutSaaS.Application.Identity.Services;
/// <summary>
/// 管理端菜单生成器(基于权限过滤)。
/// </summary>
public static class AdminMenuProvider
{
/// <summary>
/// 按权限生成可见菜单树。
/// </summary>
/// <param name="permissions">当前用户拥有的权限集合。</param>
/// <returns>过滤后的菜单树。</returns>
public static IReadOnlyList<MenuNodeDto> BuildMenuTree(IEnumerable<string> permissions)
{
// 1. 归一化权限集合
var permissionSet = new HashSet<string>(permissions ?? [], System.StringComparer.OrdinalIgnoreCase);
// 2. 过滤菜单
var definitions = GetMenuDefinitions();
return Filter(definitions, permissionSet);
}
private static IReadOnlyList<MenuNodeDto> Filter(IEnumerable<MenuNodeDto> nodes, HashSet<string> permissionSet)
{
// 1. 遍历节点并过滤子节点
var result = new List<MenuNodeDto>();
foreach (var node in nodes)
{
var filteredChildren = Filter(node.Children, permissionSet);
var visible = node.RequiredPermissions.Length == 0 || node.RequiredPermissions.Any(permissionSet.Contains);
if (visible || filteredChildren.Count > 0)
{
result.Add(node with { Children = filteredChildren });
}
}
// 2. 返回过滤结果
return result;
}
private static IReadOnlyList<MenuNodeDto> GetMenuDefinitions()
{
// 1. 顶部菜单定义
return
[
new MenuNodeDto
{
Code = "dashboard",
Name = "仪表盘",
Path = "/dashboard",
Icon = "dashboard"
},
new MenuNodeDto
{
Code = "merchant",
Name = "商户",
Path = "/merchant",
Icon = "store",
RequiredPermissions = ["merchant:read"],
Children =
[
new MenuNodeDto
{
Code = "merchant-list",
Name = "商户管理",
Path = "/merchant/list",
RequiredPermissions = ["merchant:read"]
},
new MenuNodeDto
{
Code = "store",
Name = "门店管理",
Path = "/merchant/stores",
RequiredPermissions = ["store:read"]
},
new MenuNodeDto
{
Code = "staff",
Name = "员工管理",
Path = "/merchant/staff",
RequiredPermissions = ["store-staff:read"]
}
]
},
new MenuNodeDto
{
Code = "product",
Name = "商品",
Path = "/product",
Icon = "goods",
RequiredPermissions = ["product:read"],
Children =
[
new MenuNodeDto
{
Code = "product-list",
Name = "商品管理",
Path = "/product/list",
RequiredPermissions = ["product:read"]
},
new MenuNodeDto
{
Code = "category",
Name = "品类管理",
Path = "/product/category",
RequiredPermissions = ["merchant_category:read"]
}
]
},
new MenuNodeDto
{
Code = "order",
Name = "订单",
Path = "/order",
Icon = "order",
RequiredPermissions = ["order:read"],
Children =
[
new MenuNodeDto
{
Code = "order-list",
Name = "订单管理",
Path = "/order/list",
RequiredPermissions = ["order:read"]
},
new MenuNodeDto
{
Code = "delivery",
Name = "配送管理",
Path = "/order/delivery",
RequiredPermissions = ["delivery:read"]
}
]
},
new MenuNodeDto
{
Code = "inventory",
Name = "库存",
Path = "/inventory",
Icon = "inventory",
RequiredPermissions = ["inventory:read"],
Children =
[
new MenuNodeDto
{
Code = "inventory-list",
Name = "库存查询",
Path = "/inventory/list",
RequiredPermissions = ["inventory:read"]
},
new MenuNodeDto
{
Code = "inventory-batch",
Name = "批次管理",
Path = "/inventory/batch",
RequiredPermissions = ["inventory:batch:read"]
}
]
},
new MenuNodeDto
{
Code = "payment",
Name = "支付",
Path = "/payment",
Icon = "payment",
RequiredPermissions = ["payment:read"],
Children =
[
new MenuNodeDto
{
Code = "payment-list",
Name = "支付记录",
Path = "/payment/list",
RequiredPermissions = ["payment:read"]
}
]
},
new MenuNodeDto
{
Code = "dictionary",
Name = "字典",
Path = "/dictionary",
Icon = "dictionary",
RequiredPermissions = ["dictionary:group:read", "dictionary:item:read"],
Children =
[
new MenuNodeDto
{
Code = "dictionary-group",
Name = "字典分组",
Path = "/dictionary/group",
RequiredPermissions = ["dictionary:group:read"]
},
new MenuNodeDto
{
Code = "dictionary-item",
Name = "字典项",
Path = "/dictionary/item",
RequiredPermissions = ["dictionary:item:read"]
}
]
},
new MenuNodeDto
{
Code = "identity",
Name = "权限",
Path = "/identity",
Icon = "shield",
RequiredPermissions = ["identity:role:read", "identity:permission:read"],
Children =
[
new MenuNodeDto
{
Code = "identity-user",
Name = "用户权限",
Path = "/identity/users",
RequiredPermissions = ["identity:permission:read"]
},
new MenuNodeDto
{
Code = "identity-role",
Name = "角色管理",
Path = "/identity/roles",
RequiredPermissions = ["identity:role:read"]
},
new MenuNodeDto
{
Code = "identity-permission",
Name = "权限管理",
Path = "/identity/permissions",
RequiredPermissions = ["identity:permission:read"]
}
]
},
new MenuNodeDto
{
Code = "system",
Name = "系统",
Path = "/system",
Icon = "settings",
RequiredPermissions = ["system-parameter:read", "tenant-announcement:read"],
Children =
[
new MenuNodeDto
{
Code = "system-parameter",
Name = "系统参数",
Path = "/system/parameters",
RequiredPermissions = ["system-parameter:read"]
},
new MenuNodeDto
{
Code = "announcement",
Name = "公告管理",
Path = "/system/announcements",
RequiredPermissions = ["tenant-announcement:read"]
}
]
}
];
}
}