import { useState, useEffect } from 'react' import { rolesApi, type RoleInfo, type Permission } from '@/api' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Checkbox } from '@/components/ui/checkbox' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { RefreshCw, Loader2, Users, Check } from 'lucide-react' // 角色颜色映射 const roleColors: Record = { super_admin: { bg: 'bg-purple-100', text: 'text-purple-700', border: 'border-purple-300' }, admin: { bg: 'bg-red-100', text: 'text-red-700', border: 'border-red-300' }, moderator: { bg: 'bg-orange-100', text: 'text-orange-700', border: 'border-orange-300' }, user: { bg: 'bg-blue-100', text: 'text-blue-700', border: 'border-blue-300' }, } // 角色名称映射 const roleNameMap: Record = { super_admin: '超级管理员', admin: '管理员', moderator: '版主', user: '普通用户', } // 资源名称映射 const resourceNames: Record = { users: '用户', posts: '帖子', comments: '评论', groups: '群组', messages: '消息', reports: '举报', settings: '设置', logs: '日志', } // 操作名称映射 const actionNames: Record = { read: '读取', write: '写入', delete: '删除', manage: '管理', } // 预定义的权限矩阵结构 const permissionMatrix = { resources: ['users', 'posts', 'comments', 'groups', 'messages', 'reports', 'settings', 'logs'], actions: ['read', 'write', 'delete', 'manage'], } export default function Roles() { // 状态 const [roles, setRoles] = useState([]) const [loading, setLoading] = useState(true) const [selectedRole, setSelectedRole] = useState(null) const [rolePermissions, setRolePermissions] = useState([]) const [permissionsLoading, setPermissionsLoading] = useState(false) const [saving, setSaving] = useState(false) // 加载角色列表 const loadRoles = async () => { setLoading(true) try { const response = await rolesApi.getRoles() const data = response.data.data || [] setRoles(data) if (data.length > 0 && !selectedRole) { setSelectedRole(data[0].name) loadRolePermissions(data[0].name) } } catch (error) { console.error('Failed to load roles:', error) setRoles([]) } finally { setLoading(false) } } // 加载角色权限 const loadRolePermissions = async (roleName: string) => { setPermissionsLoading(true) try { const response = await rolesApi.getRolePermissions(roleName) setRolePermissions(response.data.data || []) } catch (error) { console.error('Failed to load role permissions:', error) setRolePermissions([]) } finally { setPermissionsLoading(false) } } // 初始加载 useEffect(() => { loadRoles() }, []) // 选择角色时加载权限 useEffect(() => { if (selectedRole) { loadRolePermissions(selectedRole) } }, [selectedRole]) // 检查权限是否存在 const hasPermission = (resource: string, action: string) => { return rolePermissions.some( (p) => p.resource === resource && p.action === action ) } // 切换权限 const togglePermission = async (resource: string, action: string) => { setSaving(true) try { const currentPermissions = [...rolePermissions] const hasIt = hasPermission(resource, action) let newPermissions: Permission[] if (hasIt) { newPermissions = currentPermissions.filter( (p) => !(p.resource === resource && p.action === action) ) } else { newPermissions = [ ...currentPermissions, { resource, action }, ] } // 更新权限 - 发送 {resource, action} 格式的数组 await rolesApi.updateRolePermissions( selectedRole!, newPermissions.map((p) => ({ resource: p.resource, action: p.action })) ) setRolePermissions(newPermissions) } catch (error) { console.error('Failed to update permission:', error) } finally { setSaving(false) } } // 刷新 const handleRefresh = () => { loadRoles() if (selectedRole) { loadRolePermissions(selectedRole) } } return (

角色管理

管理系统角色和权限

{/* 角色卡片 */}
{loading ? ( ) : roles.length === 0 ? ( 暂无角色数据 ) : ( roles.map((role) => { const colors = roleColors[role.name] || { bg: 'bg-gray-100', text: 'text-gray-700', border: 'border-gray-300' } const isSelected = selectedRole === role.name return ( setSelectedRole(role.name)} >
{roleNameMap[role.name] || role.display_name || role.name} {isSelected && ( )}
{role.description || '暂无描述'}
{role.priority} 优先级
) }) )}
{/* 权限矩阵 */} {selectedRole && (
权限矩阵 - {roleNameMap[selectedRole] || selectedRole} 管理角色的各项权限,点击复选框切换权限状态
{saving && ( 保存中... )}
{permissionsLoading ? (
) : (
资源 {permissionMatrix.actions.map((action) => ( {actionNames[action] || action} ))} {permissionMatrix.resources.map((resource) => ( {resourceNames[resource] || resource} {permissionMatrix.actions.map((action) => { const has = hasPermission(resource, action) return (
togglePermission(resource, action)} disabled={saving || selectedRole === 'super_admin'} className="data-[state=checked]:bg-primary" />
) })}
))}
)} {selectedRole === 'super_admin' && (

超级管理员拥有所有权限,无法修改

)}
)} {/* 角色说明 */} 角色说明 各角色的权限范围说明
超级管理员

拥有系统所有权限,可以管理其他管理员、系统设置等核心功能

管理员

可以管理用户、帖子、评论、群组等内容,处理用户举报

版主

负责审核和管理帖子、评论等内容,处理违规内容

普通用户

基本用户权限,可以发帖、评论、加入群组等

) }