import { useState } from 'react'; import { Crown, Database, Code, Eye, Shield, ChevronRight, Check, Save } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { roles, permissionTreeData } from '@/lib/mock'; import type { Role } from '@/types'; const iconMap: Record = { Crown, Database, Code, Eye }; export default function RolesPage() { const [selectedRole, setSelectedRole] = useState(roles[0]); const [checkedKeys, setCheckedKeys] = useState>(new Set(roles[0]?.permissions || [])); const handleRoleSelect = (role: Role) => { setSelectedRole(role); setCheckedKeys(new Set(role.permissions)); }; const togglePermission = (id: string) => { const next = new Set(checkedKeys); if (next.has(id)) next.delete(id); else next.add(id); setCheckedKeys(next); }; const toggleChildren = (node: typeof permissionTreeData[0], checked: boolean) => { const next = new Set(checkedKeys); const toggleNode = (n: typeof node) => { if (checked) next.add(n.id); else next.delete(n.id); n.children?.forEach(toggleNode); }; toggleNode(node); setCheckedKeys(next); }; return (

角色权限管理

配置 RBAC 角色权限,控制用户对系统功能和数据的访问

{/* 角色卡片 */}
{roles.map(role => { const Icon = iconMap[role.icon] || Eye; return (
handleRoleSelect(role)} className={`dg-card p-5 cursor-pointer transition-all ${selectedRole?.id === role.id ? 'border-blue-500/50 bg-blue-500/5' : 'dg-card-hover'}`} >
{role.name}
{role.description}
{role.userCount} 用户
{role.permissionCount} 权限
); })}
{/* 权限配置 */} {selectedRole && ( {selectedRole.name} - 权限配置
{permissionTreeData.map(node => ( ))}
)}
); } function PermissionNodeComponent({ node, checkedKeys, onToggle, onToggleChildren, depth }: { node: typeof permissionTreeData[0]; checkedKeys: Set; onToggle: (id: string) => void; onToggleChildren: (node: typeof permissionTreeData[0], checked: boolean) => void; depth: number; }) { const [expanded, setExpanded] = useState(true); const isChecked = checkedKeys.has(node.id); const hasChildren = node.children && node.children.length > 0; const allChildrenChecked = hasChildren && node.children!.every(c => checkedKeys.has(c.id)); const someChildrenChecked = hasChildren && node.children!.some(c => checkedKeys.has(c.id)); return (
{ if (hasChildren) setExpanded(!expanded); }} > {hasChildren && ( )} {!hasChildren &&
}
{ e.stopPropagation(); if (hasChildren) onToggleChildren(node, !allChildrenChecked); else onToggle(node.id); }} > {(isChecked || allChildrenChecked || someChildrenChecked) && }
{node.label}
{hasChildren && expanded && (
{node.children!.map(child => ( ))}
)}
); }