'use client' import { useState, type ReactNode } from 'react' import Link from 'next/link' import { usePathname, useRouter } from 'next/navigation' import { LayoutDashboard, Users, Server, Cpu, Key, BarChart3, ArrowLeftRight, Settings, FileText, MessageSquare, Bot, LogOut, ChevronLeft, Menu, Bell, } from 'lucide-react' import { AuthGuard, useAuth } from '@/components/auth-guard' import { logout } from '@/lib/auth' import { cn } from '@/lib/utils' /** 权限常量 — 与后端 db.rs SEED_ROLES 保持同步 */ const ROLE_PERMISSIONS: Record = { super_admin: ['admin:full', 'account:admin', 'provider:manage', 'model:manage', 'relay:admin', 'config:write', 'prompt:read', 'prompt:write', 'prompt:publish', 'prompt:admin'], admin: ['account:read', 'account:admin', 'provider:manage', 'model:read', 'model:manage', 'relay:use', 'relay:admin', 'config:read', 'config:write', 'prompt:read', 'prompt:write', 'prompt:publish'], user: ['model:read', 'relay:use', 'config:read', 'prompt:read'], } /** 根据 role 获取权限列表 */ function getPermissionsForRole(role: string): string[] { return ROLE_PERMISSIONS[role] ?? [] } const navItems = [ { href: '/', label: '仪表盘', icon: LayoutDashboard }, { href: '/accounts', label: '账号管理', icon: Users, permission: 'account:admin' }, { href: '/providers', label: '服务商', icon: Server, permission: 'provider:manage' }, { href: '/models', label: '模型管理', icon: Cpu, permission: 'model:read' }, { href: '/agent-templates', label: 'Agent 模板', icon: Bot, permission: 'model:read' }, { href: '/api-keys', label: 'API 密钥', icon: Key, permission: 'admin:full' }, { href: '/usage', label: '用量统计', icon: BarChart3, permission: 'admin:full' }, { href: '/relay', label: '中转任务', icon: ArrowLeftRight, permission: 'relay:use' }, { href: '/config', label: '系统配置', icon: Settings, permission: 'config:read' }, { href: '/prompts', label: '提示词管理', icon: MessageSquare, permission: 'prompt:read' }, { href: '/logs', label: '操作日志', icon: FileText, permission: 'admin:full' }, ] function Sidebar({ collapsed, onToggle, }: { collapsed: boolean onToggle: () => void }) { const pathname = usePathname() const router = useRouter() const { account } = useAuth() const permissions = account ? getPermissionsForRole(account.role) : [] function handleLogout() { logout() router.replace('/login') } const filteredNavItems = navItems.filter((item) => { if (!item.permission) return true return permissions.includes(item.permission) || permissions.includes('admin:full') }) return ( ) } function Header() { const pathname = usePathname() const currentNav = navItems.find( (item) => item.href === '/' ? pathname === '/' : pathname.startsWith(item.href), ) return (
{/* 移动端菜单按钮 */} {/* 页面标题 */}

{currentNav?.label || '仪表盘'}

{/* 通知 */}
) } function MobileMenuButton() { // Placeholder for mobile menu toggle return ( ) } export default function DashboardLayout({ children }: { children: ReactNode }) { const [sidebarCollapsed, setSidebarCollapsed] = useState(false) return (
setSidebarCollapsed(!sidebarCollapsed)} />
{children}
) }