28 lines
967 B
TypeScript
28 lines
967 B
TypeScript
import type { NavItem } from '@/config/nav'
|
|
import type { CmsNavigation } from '@/api/cms/cmsNavigation/model'
|
|
|
|
/**
|
|
* 获取菜单状态 (响应式)
|
|
* 与模板项目的 useMenu() 对齐,使用 useState 跨组件共享
|
|
*/
|
|
export const useMenu = () => {
|
|
return useState<NavItem[]>('menu', () => [])
|
|
}
|
|
|
|
/**
|
|
* 将 CmsNavigation 树映射为 NavItem 树
|
|
*/
|
|
export function mapNavItem(tree: CmsNavigation[]): NavItem[] {
|
|
return (tree || [])
|
|
.filter(item => !item.hide) // 过滤隐藏项
|
|
.sort((a, b) => (a.sortNumber ?? 0) - (b.sortNumber ?? 0))
|
|
.map(item => ({
|
|
key: item.code || String(item.navigationId),
|
|
label: item.title || '',
|
|
to: item.path || '/',
|
|
href: item.target === '_blank' ? item.path : undefined,
|
|
badge: undefined, // 后端暂无 badge 字段,按需扩展
|
|
children: item.children?.length ? mapNavItem(item.children) : undefined,
|
|
}))
|
|
}
|