66 lines
2.1 KiB
TypeScript
Raw Normal View History

import type React from 'react'
import { RobotOutlined, DashboardOutlined,
UserOutlined,
BookOutlined,
ImportOutlined,
DollarOutlined,
SettingOutlined,
FileOutlined,
CloudOutlined,
SafetyOutlined,
} from '@ant-design/icons'
import type { AdminRole } from '@/types/admin'
import { hasRole } from '@/constants/roles'
export interface AdminMenuItem {
path: string
name: string
icon?: React.ReactNode
requiredRole?: AdminRole
children?: AdminMenuItem[]
}
export const adminMenuItems: AdminMenuItem[] = [
{ path: '/', name: '总览', icon: <DashboardOutlined /> },
{ path: '/assistant', name: '任务助理', icon: <RobotOutlined /> },
{
path: '/users',
name: '用户管理',
icon: <UserOutlined />,
requiredRole: 'ADMIN',
children: [
{ path: '/users/admins', name: '管理员', requiredRole: 'SUPER_ADMIN' },
{ path: '/users/members', name: '普通用户' },
],
},
{ path: '/membership', name: '会员与额度', icon: <DollarOutlined />, requiredRole: 'ADMIN' },
{
path: '/knowledge',
name: '知识库管理',
icon: <BookOutlined />,
children: [
{ path: '/knowledge/bases', name: '知识库列表' },
{ path: '/knowledge/sources', name: '知识源列表' },
],
},
{ path: '/imports', name: '文档导入', icon: <ImportOutlined /> },
{ path: '/ai-costs', name: 'AI 调用与成本', icon: <CloudOutlined /> },
{ path: '/files', name: '文件与 COS', icon: <FileOutlined /> },
{ path: '/settings', name: '系统配置', icon: <SettingOutlined />, requiredRole: 'ADMIN' },
{ path: '/audit', name: '审计日志', icon: <SafetyOutlined />, requiredRole: 'ADMIN' },
]
export function filterMenuByRole(items: AdminMenuItem[], role?: AdminRole): AdminMenuItem[] {
if (!role) return []
return items
.filter((item) => !item.requiredRole || hasRole(role, item.requiredRole))
.map((item) => ({
...item,
children: item.children ? filterMenuByRole(item.children, role) : undefined,
}))
.filter((item) => {
if (item.children && item.children.length === 0) return false
return true
})
}