import React, { useState, useEffect } from 'react'; import apiClient from '../../utils/apiClient'; import { buildApiUrl, API_ENDPOINTS } from '../../config/api'; import { Plus, Edit, Trash2, KeyRound, User, Mail, Shield, Search, X } from 'lucide-react'; import ConfirmDialog from '../../components/ConfirmDialog'; import FormModal from '../../components/FormModal'; import Toast from '../../components/Toast'; import './UserManagement.css'; const UserManagement = () => { const [users, setUsers] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [showUserModal, setShowUserModal] = useState(false); const [isEditing, setIsEditing] = useState(false); const [currentUser, setCurrentUser] = useState(null); const [deleteConfirmInfo, setDeleteConfirmInfo] = useState(null); const [resetConfirmInfo, setResetConfirmInfo] = useState(null); const [roles, setRoles] = useState([]); const [toasts, setToasts] = useState([]); const [searchText, setSearchText] = useState(''); // 搜索文本 // Toast helper functions const showToast = (message, type = 'info') => { const id = Date.now(); setToasts(prev => [...prev, { id, message, type }]); }; const removeToast = (id) => { setToasts(prev => prev.filter(toast => toast.id !== id)); }; useEffect(() => { fetchUsers(); fetchRoles(); }, [page, pageSize, searchText]); const fetchUsers = async () => { setLoading(true); try { let url = `${API_ENDPOINTS.USERS.LIST}?page=${page}&size=${pageSize}`; if (searchText) { url += `&search=${encodeURIComponent(searchText)}`; } const response = await apiClient.get(buildApiUrl(url)); setUsers(response.data.users); setTotal(response.data.total); } catch (err) { setError('无法加载用户列表'); } finally { setLoading(false); } }; const fetchRoles = async () => { try { const response = await apiClient.get(buildApiUrl(API_ENDPOINTS.USERS.ROLES)); setRoles(response.data); } catch (err) { console.error('Error fetching roles:', err); // 如果无法获取角色列表,使用默认值 setRoles([ { role_id: 1, role_name: '平台管理员' }, { role_id: 2, role_name: '普通用户' } ]); } }; const handleAddUser = async (e) => { e.preventDefault(); try { await apiClient.post(buildApiUrl(API_ENDPOINTS.USERS.CREATE), currentUser); handleCloseModal(); setError(''); fetchUsers(); showToast('用户添加成功', 'success'); } catch (err) { console.error('Error adding user:', err); setError(err.response?.data?.message || '新增用户失败'); } }; const handleUpdateUser = async (e) => { e.preventDefault(); try { const updateData = { caption: currentUser.caption, email: currentUser.email, role_id: currentUser.role_id }; if (currentUser.username && currentUser.username.trim()) { updateData.username = currentUser.username; } await apiClient.put(buildApiUrl(API_ENDPOINTS.USERS.UPDATE(currentUser.user_id)), updateData); handleCloseModal(); setError(''); fetchUsers(); showToast('用户修改成功', 'success'); } catch (err) { console.error('Error updating user:', err); setError(err.response?.data?.message || '修改用户失败'); } }; const handleDeleteUser = async () => { try { await apiClient.delete(buildApiUrl(API_ENDPOINTS.USERS.DELETE(deleteConfirmInfo.user_id))); setDeleteConfirmInfo(null); showToast('用户删除成功', 'success'); fetchUsers(); } catch (err) { console.error('Error deleting user:', err); showToast('删除用户失败,请重试', 'error'); setDeleteConfirmInfo(null); } }; const handleResetPassword = async () => { try { await apiClient.post(buildApiUrl(API_ENDPOINTS.USERS.RESET_PASSWORD(resetConfirmInfo.user_id))); setResetConfirmInfo(null); showToast('密码重置成功', 'success'); } catch (err) { console.error('Error resetting password:', err); showToast('重置密码失败,请重试', 'error'); setResetConfirmInfo(null); } }; const handleOpenModal = (user = null) => { if (user) { setIsEditing(true); setCurrentUser({ ...user }); } else { setIsEditing(false); setCurrentUser({ username: '', caption: '', email: '', role_id: 2 }); } setError(''); setShowUserModal(true); }; const handleCloseModal = () => { setShowUserModal(false); setCurrentUser(null); setError(''); }; const handleSave = async () => { if (isEditing) { await handleUpdateUser({ preventDefault: () => {} }); } else { await handleAddUser({ preventDefault: () => {} }); } }; const handleInputChange = (field, value) => { setCurrentUser(prev => ({ ...prev, [field]: value })); }; const openDeleteConfirm = (user) => { setDeleteConfirmInfo({ user_id: user.user_id, caption: user.caption }); }; const openResetConfirm = (user) => { setResetConfirmInfo({ user_id: user.user_id, caption: user.caption }); }; return (
加载中...
} {error &&{error}
} {!loading && !error && ( <>| ID | 用户名 | 姓名 | 邮箱 | 角色 | 创建时间 | 操作 |
|---|---|---|---|---|---|---|
| {user.user_id} | {user.username} | {user.caption} | {user.email} | {user.role_name} | {new Date(user.created_at).toLocaleString()} |
注:新用户的默认密码为系统配置的默认密码,用户可登录后自行修改