'use client'; import { useEffect, useState, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { API_BASE } from '@/lib/config'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import * as Dialog from '@/components/ui/dialog'; interface Role { id: string; name: string; description: string; permissions: string[]; status: string; } interface Permission { key: string; name: string; category: string; } interface Admin { id: number; username: string; nickname: string; roleId: string | null; role: { id: string; name: string } | null; status: string; } function getAuthHeaders() { const token = localStorage.getItem('adminToken'); return { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }; } export default function SettingsRolesPage() { const router = useRouter(); const [roles, setRoles] = useState([]); const [permissions, setPermissions] = useState([]); const [loading, setLoading] = useState(true); const [tab, setTab] = useState<'roles' | 'admins'>('roles'); const loadData = useCallback(async () => { setLoading(true); try { const headers = getAuthHeaders(); const [rolesRes, permsRes] = await Promise.all([ fetch(`${API_BASE}/admin/settings/roles`, { headers }), fetch(`${API_BASE}/admin/settings/permissions`, { headers }), ]); if (rolesRes.ok) setRoles((await rolesRes.json()).items || []); if (permsRes.ok) setPermissions((await permsRes.json()).items || []); } catch (e) { console.error(e); } setLoading(false); }, []); useEffect(() => { loadData(); }, [loadData]); const categories = [...new Set(permissions.map(p => p.category))]; if (loading) { return
加载中...
; } return (

角色权限管理

管理系统角色、权限和管理员

{tab === 'roles' ? ( ) : ( )}
); } function RolesTab({ roles, permissions, categories, onReload }: { roles: Role[]; permissions: Permission[]; categories: string[]; onReload: () => void; }) { const [editRole, setEditRole] = useState(null); const [open, setOpen] = useState(false); return (
{ setOpen(false); onReload(); }} /> {roles.length === 0 ? (
暂无角色
) : (
{roles.map(role => ( ))}
角色名称 描述 权限 操作
{role.name} {role.description || '-'}
{(role.permissions || []).length === 0 ? ( 无权限 ) : ( role.permissions.map(p => ( {permissions.find(perm => perm.key === p)?.name || p} )) )}
)}
); } function RoleDialog({ role, permissions, categories, open, onOpenChange, onSaved }: { role: Role | null; permissions: Permission[]; categories: string[]; open: boolean; onOpenChange: (v: boolean) => void; onSaved: () => void; }) { const [name, setName] = useState(''); const [description, setDescription] = useState(''); const [selectedPerms, setSelectedPerms] = useState([]); const [saving, setSaving] = useState(false); useEffect(() => { if (open) { setName(role?.name || ''); setDescription(role?.description || ''); setSelectedPerms(role?.permissions || []); } }, [open, role]); async function handleSave() { if (!name.trim()) return; setSaving(true); try { const headers = getAuthHeaders(); if (role) { await fetch(`${API_BASE}/admin/settings/roles/${role.id}`, { method: 'PUT', headers, body: JSON.stringify({ name, description, permissions: selectedPerms }), }); } else { await fetch(`${API_BASE}/admin/settings/roles`, { method: 'POST', headers, body: JSON.stringify({ name, description, permissions: selectedPerms }), }); } onSaved(); } catch (e) { console.error(e); } setSaving(false); } return ( {role ? '编辑角色' : '新建角色'}
setName(e.target.value)} placeholder="请输入角色名称" />