/** 菜单树 route 归一:column_key → 前端注册的规范页面路径。 * 共享库 columns.route_path 仍是旧式 slug(切机迁移未应用),这里按注册表 key 映射为新 Vue 路由, * 保证侧边栏/面包屑/首页跳转都能命中已注册页面,无需改写共享库。纯逻辑。 */ import { adminPages } from './routes' import type { AdminMenuNode } from '@/types/admin' const CANONICAL_BY_KEY = new Map() for (const page of adminPages) { if (page.menuKey) { CANONICAL_BY_KEY.set(page.menuKey, `/${page.path.replace(/^\/+/, '')}`) } } /** column_key → 规范路由(带前导 /,无 base 前缀);未登记返回 undefined。 */ export function canonicalRouteOf(key: string | undefined | null): string | undefined { return typeof key === 'string' ? CANONICAL_BY_KEY.get(key) : undefined } /** 递归把菜单树节点的 route 替换为规范路由;分组/未登记节点保持原值。 */ export function canonicalizeMenuTree(nodes: AdminMenuNode[] | null | undefined): AdminMenuNode[] { return (nodes || []).map((node) => { const canonical = canonicalRouteOf(node.key) const children = canonicalizeMenuTree(node.children) const route = canonical && node.route != null ? canonical : node.route return { ...node, route, children } }) }