export const menuTree = [ { id: 'system', name: '系统管理', path: '/system', icon: 'SettingOutlined', type: 'menu', children: [ { id: 'sys_user', name: '用户管理', path: '/system/user', component: 'system/user/UserList', type: 'menu', buttons: [ { code: 'user:add', name: '新增' }, { code: 'user:edit', name: '修改' }, { code: 'user:delete', name: '删除' }, { code: 'user:lock', name: '锁定' }, { code: 'user:unlock', name: '解锁' }, { code: 'user:changePwd', name: '密码修改' }, { code: 'user:resetPwd', name: '密码重置并发送短信' } ] }, { id: 'sys_role', name: '角色管理', path: '/system/role', component: 'system/role/RoleList', type: 'menu', buttons: [ { code: 'role:add', name: '新增' }, { code: 'role:edit', name: '修改' }, { code: 'role:delete', name: '删除' } ] }, { id: 'sys_org', name: '机构管理', path: '/system/org', component: 'system/org/OrgList', type: 'menu', buttons: [ { code: 'org:add', name: '新增' }, { code: 'org:edit', name: '修改' }, { code: 'org:delete', name: '删除' } ] } ] }, { id: 'base_config', name: '基础配置', path: '/base-config', icon: 'AppstoreOutlined', type: 'menu', children: [ { id: 'base_channel', name: '核心企业管理', path: '/base-config/channel', component: 'base-config/channel/ChannelList', type: 'menu', buttons: [ { code: 'channel:add', name: '新增' }, { code: 'channel:edit', name: '修改' }, { code: 'channel:delete', name: '删除' } ] }, { id: 'base_manager', name: '客户经理管理', path: '/base-config/manager', component: 'base-config/manager/ManagerList', type: 'menu', buttons: [ { code: 'manager:add', name: '新增' }, { code: 'manager:edit', name: '修改' }, { code: 'manager:delete', name: '删除' } ] } ] } ] export function flattenButtons(tree) { const codes = [] function walk(nodes) { for (const n of nodes) { if (n.buttons) codes.push(...n.buttons.map((b) => b.code)) if (n.children) walk(n.children) } } walk(tree) return codes } // 依据角色勾选的 menuIds 集合裁剪菜单树:保留命中节点及其祖先节点(用于渲染路径), // 同时按 buttonCodeSet 过滤每个节点的按钮列表,实现"页面权限+功能权限"双重收敛。 export function pruneMenuTree(tree, menuIdSet, buttonCodeSet) { function walk(nodes) { const result = [] for (const n of nodes) { const children = n.children ? walk(n.children) : [] const selfMatched = menuIdSet.has(n.id) if (!selfMatched && children.length === 0) continue const buttons = (n.buttons || []).filter((b) => buttonCodeSet.has(b.code)) result.push({ ...n, children, buttons }) } return result } return walk(tree) }