import { useEffect, useRef, useState } from 'react' import { Table, Button, Tag, Space, message, Modal, Form, Input, Select } from 'antd' import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons' import axios from 'axios' import AppLayout from '../../components/AppLayout/AppLayout' interface User { id: number username: string email: string role: string is_active: boolean created_at: string } function Users() { const [users, setUsers] = useState([]) const [loading, setLoading] = useState(false) const [modalVisible, setModalVisible] = useState(false) const [editingUser, setEditingUser] = useState(null) const tableRegionRef = useRef(null) const [tableHeight, setTableHeight] = useState(360) const [form] = Form.useForm() const fetchUsers = async () => { setLoading(true) try { const res = await axios.get('/api/v1/users') setUsers(res.data.data || []) } finally { setLoading(false) } } useEffect(() => { fetchUsers() }, []) useEffect(() => { const updateTableHeight = () => { const regionHeight = tableRegionRef.current?.offsetHeight || 0 setTableHeight(Math.max(220, regionHeight - 56)) } updateTableHeight() if (typeof ResizeObserver === 'undefined') { return undefined } const observer = new ResizeObserver(updateTableHeight) if (tableRegionRef.current) observer.observe(tableRegionRef.current) return () => observer.disconnect() }, [users.length]) const handleAdd = () => { setEditingUser(null) form.resetFields() setModalVisible(true) } const handleEdit = (user: User) => { setEditingUser(user) form.setFieldsValue(user) setModalVisible(true) } const handleDelete = async (id: number) => { Modal.confirm({ title: '确认删除', content: '确定要删除此用户吗?', onOk: async () => { await axios.delete(`/api/v1/users/${id}`) message.success('删除成功') fetchUsers() }, }) } const handleSubmit = async (values: Record) => { try { if (editingUser) { await axios.put(`/api/v1/users/${editingUser.id}`, values) message.success('更新成功') } else { await axios.post('/api/v1/users', values) message.success('创建成功') } setModalVisible(false) fetchUsers() } catch (error: unknown) { const err = error as { response?: { data?: { detail?: string } } } message.error(err.response?.data?.detail || '操作失败') } } const columns = [ { title: 'ID', dataIndex: 'id', key: 'id', width: 80 }, { title: '用户名', dataIndex: 'username', key: 'username', width: 180 }, { title: '邮箱', dataIndex: 'email', key: 'email', width: 260, ellipsis: true }, { title: '角色', dataIndex: 'role', key: 'role', width: 140, render: (role: string) => { const colors: Record = { super_admin: 'red', admin: 'orange', operator: 'blue', viewer: 'green', } return {role} }, }, { title: '状态', dataIndex: 'is_active', key: 'is_active', width: 120, render: (active: boolean) => ( {active ? '活跃' : '禁用'} ), }, { title: '操作', key: 'action', width: 180, render: (_: unknown, record: User) => ( ), }, ] return (

用户管理

setModalVisible(false)} footer={null} >
{!editingUser && ( )}
) } export default Users