import { useState, useEffect } from 'react' import { Table, Button, Modal, Form, Input, InputNumber, Select, Tag, Space, message, Popconfirm, TreeSelect } from 'antd' import { PlusOutlined, EditOutlined, DeleteOutlined, ReloadOutlined } from '@ant-design/icons' import type { ColumnsType } from 'antd/es/table' import { roleApi } from '@/api/role.api' import type { Role, CreateRoleRequest, UpdateRoleRequest, RolePageRequest, Permission } from '@/api/role.api' import type { PageResponse } from '@/api/user.api' import { RoleStatus, roleStatusMap } from '@/constants/status' import { VALIDATION } from '@/constants/validation-rules' import PermissionGuard from '@/components/PermissionGuard' export default function RoleManagement() { const [roles, setRoles] = useState([]) const [loading, setLoading] = useState(false) const [modalOpen, setModalOpen] = useState(false) const [editingRole, setEditingRole] = useState(null) const [permissions, setPermissions] = useState([]) const [pagination, setPagination] = useState({ current: 1, pageSize: 10, total: 0 }) const [form] = Form.useForm() useEffect(() => { loadRoles() loadPermissions() }, []) async function loadRoles() { setLoading(true) try { const params: RolePageRequest = { page: pagination.current - 1, size: pagination.pageSize } const res = await roleApi.getPage(params) const data = res as unknown as PageResponse setRoles(data.content) setPagination((prev) => ({ ...prev, total: data.totalElements })) } catch { message.error('加载角色列表失败') } finally { setLoading(false) } } async function loadPermissions() { try { const res = await roleApi.getAllPermissions() setPermissions(Array.isArray(res) ? res : []) } catch { /* ignored */ } } function handleAdd() { setEditingRole(null) form.resetFields() setModalOpen(true) } function handleEdit(record: Role) { setEditingRole(record) form.setFieldsValue({ roleName: record.roleName, roleKey: record.roleKey, roleSort: record.roleSort, status: record.status, permissions: record.permissions?.map((p) => p.id), }) setModalOpen(true) } async function handleDelete(id: number) { try { await roleApi.delete(id) message.success('删除成功') loadRoles() } catch { message.error('删除失败') } } async function handleSubmit() { try { const values = await form.validateFields() if (editingRole) { const data: UpdateRoleRequest = { ...values } await roleApi.update(editingRole.id, data) message.success('更新成功') } else { const data: CreateRoleRequest = { ...values } await roleApi.create(data) message.success('创建成功') } setModalOpen(false) loadRoles() } catch { /* ignored */ } } const permissionTreeData = buildPermissionTree(permissions) const columns: ColumnsType = [ { title: '角色名称', dataIndex: 'roleName', key: 'roleName' }, { title: '角色标识', dataIndex: 'roleKey', key: 'roleKey' }, { title: '排序', dataIndex: 'roleSort', key: 'roleSort', width: 80 }, { title: '状态', dataIndex: 'status', key: 'status', render: (status: RoleStatus) => { const info = roleStatusMap[status] return {info?.label || status} }, }, { title: '操作', key: 'action', render: (_, record) => ( rowKey="id" columns={columns} dataSource={roles} loading={loading} pagination={{ ...pagination, showSizeChanger: true, showTotal: (total) => `共 ${total} 条`, onChange: (page, pageSize) => { setPagination((prev) => ({ ...prev, current: page, pageSize })) setTimeout(loadRoles, 0) }, }} /> setModalOpen(false)} destroyOnHidden width={600} >