'use client' // src/app/admin/roles/page.tsx — 角色权限管理 import { useState, useEffect, useCallback } from 'react' import { Shield, RotateCw, Save } from 'lucide-react' interface RoleData { role: string; permissions: { key: string; enabled: boolean }[] } export default function RolesPage() { const [roles, setRoles] = useState([]) const [allPermissions, setAllPermissions] = useState([]) const [loading, setLoading] = useState(true) const [editing, setEditing] = useState(null) const [perms, setPerms] = useState([]) const [saving, setSaving] = useState(false) const [toast, setToast] = useState<{ type: 'ok' | 'err'; msg: string } | null>(null) const load = useCallback(async () => { setLoading(true) const res = await fetch('/api/admin/roles') if (res.ok) { const data = await res.json() setRoles(data.roles) setAllPermissions(data.allPermissions) } setLoading(false) }, []) useEffect(() => { load() }, [load]) const showToast = (type: 'ok' | 'err', msg: string) => { setToast({ type, msg }) setTimeout(() => setToast(null), 3000) } const startEdit = (role: RoleData) => { setEditing(role.role) setPerms(role.permissions.filter(p => p.enabled).map(p => p.key)) } const togglePerm = (key: string) => { setPerms(prev => prev.includes(key) ? prev.filter(k => k !== key) : [...prev, key]) } const handleSave = async () => { if (!editing) return setSaving(true) try { const res = await fetch('/api/admin/roles', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ role: editing, permissions: perms }), }) if (res.ok) { showToast('ok', `${editing} 角色权限已更新`); setEditing(null); load() } else { const d = await res.json(); showToast('err', d.error || '保存失败') } } catch { showToast('err', '网络错误') } setSaving(false) } const permLabels: Record = { 'dashboard:view': '查看仪表盘', 'services:view': '查看服务', 'services:manage': '管理服务', 'alerts:view': '查看告警', 'alerts:manage': '管理告警渠道', 'status_history:view': '查看状态历史', 'status_history:stats': '可用率统计', 'audit:view': '查看审计', 'users:view': '查看用户', 'users:manage': '管理用户', 'roles:manage': '管理角色', } return (
{toast && (
{toast.msg}
)}

角色权限管理

admin / editor / viewer

{loading ? (
加载中...
) : (
{roles.map(role => (

{role.role}

{editing === role.role ? (
) : ( )}
{role.role === 'admin' ? ( admin 角色拥有全部 {allPermissions.length} 个权限 ) : editing === role.role ? ( allPermissions.map(p => ( )) ) : ( role.permissions.filter(p => p.enabled).map(p => ( {permLabels[p.key] || p.key} )) )}
))}
)}
) }