import { useEffect, useState } from 'react' import { Card, Table, Button, Space, Tag, Popconfirm, message, Typography, Modal, Form, Input, List, Empty, Tooltip, Spin } from 'antd' import { PlusOutlined, ReloadOutlined, DeleteOutlined, EditOutlined, UserOutlined, KeyOutlined } from '@ant-design/icons' import { useTranslation } from 'react-i18next' import { apiService } from '../services/api' import { useMediaQuery } from 'react-responsive' const { Title } = Typography interface User { id: number username: string isDefault: boolean createdAt: number updatedAt: number } const UserList: React.FC = () => { const { t, i18n } = useTranslation() const isMobile = useMediaQuery({ maxWidth: 768 }) const [users, setUsers] = useState([]) const [loading, setLoading] = useState(false) const [createModalVisible, setCreateModalVisible] = useState(false) const [updatePasswordModalVisible, setUpdatePasswordModalVisible] = useState(false) const [updateOwnPasswordModalVisible, setUpdateOwnPasswordModalVisible] = useState(false) const [selectedUser, setSelectedUser] = useState(null) const [createForm] = Form.useForm() const [updatePasswordForm] = Form.useForm() const [updateOwnPasswordForm] = Form.useForm() // 获取当前用户(判断是否是默认账户) const currentUser = users.find(user => user.isDefault) || users[0] const isDefaultUser = currentUser?.isDefault || false const fetchUsers = async () => { setLoading(true) try { const response = await apiService.users.list() if (response.data.code === 0 && response.data.data) { setUsers(response.data.data) } else { message.error(response.data.msg || t('userList.fetchFailed') || '获取用户列表失败') } } catch (error: any) { console.error('获取用户列表失败:', error) const errorMsg = error.response?.data?.msg || error.message || t('userList.fetchFailed') || '获取用户列表失败' message.error(errorMsg) } finally { setLoading(false) } } useEffect(() => { fetchUsers() }, []) const handleCreate = async (values: { username: string; password: string }) => { try { const response = await apiService.users.create({ username: values.username, password: values.password }) if (response.data.code === 0) { message.success(t('userList.createSuccess') || '创建用户成功') setCreateModalVisible(false) createForm.resetFields() fetchUsers() } else { message.error(response.data.msg || t('userList.createFailed') || '创建用户失败') } } catch (error: any) { console.error('创建用户失败:', error) const errorMsg = error.response?.data?.msg || error.message || t('userList.createFailed') || '创建用户失败' message.error(errorMsg) } } const handleUpdatePassword = async (values: { newPassword: string }) => { if (!selectedUser) return try { const response = await apiService.users.updatePassword({ userId: selectedUser.id, newPassword: values.newPassword }) if (response.data.code === 0) { message.success(t('userList.updatePasswordSuccess') || '更新密码成功') setUpdatePasswordModalVisible(false) setSelectedUser(null) updatePasswordForm.resetFields() fetchUsers() } else { message.error(response.data.msg || t('userList.updatePasswordFailed') || '更新密码失败') } } catch (error: any) { console.error('更新密码失败:', error) const errorMsg = error.response?.data?.msg || error.message || t('userList.updatePasswordFailed') || '更新密码失败' message.error(errorMsg) } } const handleUpdateOwnPassword = async (values: { newPassword: string }) => { try { const response = await apiService.users.updateOwnPassword({ newPassword: values.newPassword }) if (response.data.code === 0) { message.success(t('userList.updateOwnPasswordSuccess') || '修改密码成功,请重新登录') setUpdateOwnPasswordModalVisible(false) updateOwnPasswordForm.resetFields() // 延迟跳转到登录页 setTimeout(() => { window.location.href = '/login' }, 1000) } else { message.error(response.data.msg || t('userList.updateOwnPasswordFailed') || '修改密码失败') } } catch (error: any) { console.error('修改密码失败:', error) const errorMsg = error.response?.data?.msg || error.message || t('userList.updateOwnPasswordFailed') || '修改密码失败' message.error(errorMsg) } } const handleDelete = async (user: User) => { try { const response = await apiService.users.delete({ userId: user.id }) if (response.data.code === 0) { message.success(t('userList.deleteSuccess') || '删除用户成功') fetchUsers() } else { message.error(response.data.msg || t('userList.deleteFailed') || '删除用户失败') } } catch (error: any) { console.error('删除用户失败:', error) const errorMsg = error.response?.data?.msg || error.message || t('userList.deleteFailed') || '删除用户失败' message.error(errorMsg) } } const columns = [ { title: 'ID', dataIndex: 'id', key: 'id', width: 80 }, { title: t('userList.username') || '用户名', dataIndex: 'username', key: 'username' }, { title: t('userList.role') || '角色', dataIndex: 'isDefault', key: 'isDefault', width: 100, render: (isDefault: boolean) => ( {isDefault ? t('userList.defaultAccount') || '默认账户' : t('userList.normalUser') || '普通用户'} ) }, { title: t('common.createdAt') || '创建时间', dataIndex: 'createdAt', key: 'createdAt', width: 180, render: (timestamp: number) => new Date(timestamp).toLocaleString(i18n.language || 'zh-CN') }, { title: t('common.actions') || '操作', key: 'action', width: 200, render: (_: any, record: User) => { // 如果是默认账户,可以管理所有用户 if (isDefaultUser) { return ( {!record.isDefault && ( <> handleDelete(record)} okText={t('common.confirm') || '确定'} cancelText={t('common.cancel') || '取消'} > )} ) } else { // 非默认账户:只能看到自己的信息,不显示操作按钮(修改密码通过顶部按钮) return null } } } ] return (
{t('userList.title') || '用户管理'} {isDefaultUser && (
{isMobile ? ( // 移动端卡片布局
{loading ? (
) : users.length === 0 ? ( ) : ( ( {/* 头部区域 - 用户名 */}
{user.username}
ID: {user.id}
{/* 角色信息区域 */}
{t('userList.role') || '角色'}
{user.isDefault ? (t('userList.defaultAccount') || '默认账户') : (t('userList.normalUser') || '普通用户')}
{t('common.createdAt') || '创建时间'}
{new Date(user.createdAt).toLocaleDateString(i18n.language || 'zh-CN')}
{/* 操作区域(仅管理员可见) */} {isDefaultUser && !user.isDefault && (
{ setSelectedUser(user) setUpdatePasswordModalVisible(true) }} style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', cursor: 'pointer', padding: '4px 8px' }} > {t('userList.updatePassword') || '改密'}
handleDelete(user)} okText={t('common.confirm') || '确定'} cancelText={t('common.cancel') || '取消'} >
{t('common.delete') || '删除'}
)}
)} /> )}
) : ( t('userList.total', { total }) || `共 ${total} 条` }} scroll={isMobile ? { x: 600 } : undefined} /> )} {/* 创建用户弹窗 */} { setCreateModalVisible(false) createForm.resetFields() }} onOk={() => createForm.submit()} okText={t('userList.createUser') || '创建'} cancelText={t('common.cancel') || '取消'} >
{/* 修改密码弹窗(管理员修改其他用户密码) */} { setUpdatePasswordModalVisible(false) setSelectedUser(null) updatePasswordForm.resetFields() }} onOk={() => updatePasswordForm.submit()} okText={t('common.confirm') || '确定'} cancelText={t('common.cancel') || '取消'} >
{/* 修改我的密码弹窗(默认账户修改自己密码) */} { setUpdateOwnPasswordModalVisible(false) updateOwnPasswordForm.resetFields() }} onOk={() => updateOwnPasswordForm.submit()} okText={t('common.confirm') || '确定'} cancelText={t('common.cancel') || '取消'} >
) } export default UserList