import { useEffect, useState, useCallback } from 'react'; import { Table, Button, Space, Modal, Form, Input, Tag, Popconfirm, Checkbox, message, } from 'antd'; import { PlusOutlined, EditOutlined, DeleteOutlined, SafetyCertificateOutlined } from '@ant-design/icons'; import { listRoles, createRole, updateRole, deleteRole, assignPermissions, getRolePermissions, listPermissions, type RoleInfo, type PermissionInfo, } from '../api/roles'; import { useThemeMode } from '../hooks/useThemeMode'; export default function Roles() { const [roles, setRoles] = useState([]); const [permissions, setPermissions] = useState([]); const [loading, setLoading] = useState(false); const [createModalOpen, setCreateModalOpen] = useState(false); const [editRole, setEditRole] = useState(null); const [permModalOpen, setPermModalOpen] = useState(false); const [selectedRole, setSelectedRole] = useState(null); const [selectedPermIds, setSelectedPermIds] = useState([]); const [form] = Form.useForm(); const isDark = useThemeMode(); const fetchRoles = useCallback(async () => { setLoading(true); try { const result = await listRoles(); setRoles(result.data); } catch { message.error('加载角色失败'); } setLoading(false); }, []); const fetchPermissions = useCallback(async () => { try { setPermissions(await listPermissions()); } catch { // 静默处理 } }, []); useEffect(() => { fetchRoles(); fetchPermissions(); }, [fetchRoles, fetchPermissions]); const handleCreate = async (values: { name: string; code: string; description?: string; }) => { try { if (editRole) { await updateRole(editRole.id, { ...values, version: editRole.version }); message.success('角色更新成功'); } else { await createRole(values); message.success('角色创建成功'); } setCreateModalOpen(false); setEditRole(null); form.resetFields(); fetchRoles(); } catch (err: unknown) { const errorMsg = (err as { response?: { data?: { message?: string } } })?.response?.data?.message || '操作失败'; message.error(errorMsg); } }; const handleDelete = async (id: string) => { try { await deleteRole(id); message.success('角色已删除'); fetchRoles(); } catch { message.error('删除失败'); } }; const openPermModal = async (role: RoleInfo) => { setSelectedRole(role); try { const rolePerms = await getRolePermissions(role.id); setSelectedPermIds(rolePerms.map((p) => p.id)); } catch { setSelectedPermIds([]); } setPermModalOpen(true); }; const savePermissions = async () => { if (!selectedRole) return; try { await assignPermissions(selectedRole.id, selectedPermIds); message.success('权限分配成功'); setPermModalOpen(false); } catch { message.error('权限分配失败'); } }; const openEditModal = (role: RoleInfo) => { setEditRole(role); form.setFieldsValue({ name: role.name, code: role.code, description: role.description, }); setCreateModalOpen(true); }; const openCreateModal = () => { setEditRole(null); form.resetFields(); setCreateModalOpen(true); }; const closeCreateModal = () => { setCreateModalOpen(false); setEditRole(null); form.resetFields(); }; const columns = [ { title: '角色名称', dataIndex: 'name', key: 'name', render: (v: string, record: RoleInfo) => (
{v}
), }, { title: '编码', dataIndex: 'code', key: 'code', render: (v: string) => ( {v} ), }, { title: '描述', dataIndex: 'description', key: 'description', ellipsis: true, render: (v: string | undefined) => ( {v || '-'} ), }, { title: '类型', dataIndex: 'is_system', key: 'is_system', width: 100, render: (v: boolean) => ( {v ? '系统' : '自定义'} ), }, { title: '操作', key: 'actions', width: 180, render: (_: unknown, record: RoleInfo) => ( {!record.is_system && ( <> {/* 表格容器 */}
`共 ${t} 条记录` }} /> {/* 新建/编辑角色弹窗 */} form.submit()} width={480} >
{/* 权限分配弹窗 */} setPermModalOpen(false)} onOk={savePermissions} width={600} >
{Object.entries(groupedPermissions).map(([resource, perms]) => (
{resource}
setSelectedPermIds(values as string[])} style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }} > {perms.map((p) => ( {p.name} ))}
))}
); }