import { useState, useEffect } from 'react'; import { useRouter } from 'next/router'; import Head from 'next/head'; import DashboardLayout from '../../components/Layout/DashboardLayout'; import { toast } from 'react-hot-toast'; import { MagnifyingGlassIcon, PlusIcon, PencilIcon, TrashIcon, EyeIcon, UserIcon, BuildingOfficeIcon, PhoneIcon, EnvelopeIcon, CalendarIcon, CheckCircleIcon, XCircleIcon, ExclamationTriangleIcon, ArrowDownTrayIcon, FunnelIcon, XMarkIcon } from '@heroicons/react/24/outline'; import { getDemoData } from '../../lib/demo-data'; import { formatTime } from '../../lib/utils'; interface User { id: string; name: string; email: string; phone: string; company: string; role: 'admin' | 'user' | 'interpreter'; status: 'active' | 'inactive' | 'pending'; created_at: string; last_login: string; total_calls: number; total_spent: number; } interface UserFilters { search: string; role: string; status: string; company: string; } export default function Users() { const router = useRouter(); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [selectedUsers, setSelectedUsers] = useState([]); const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [totalCount, setTotalCount] = useState(0); const [filters, setFilters] = useState({ search: '', role: '', status: '', company: '' }); // 添加模态框状态 const [showAddUserModal, setShowAddUserModal] = useState(false); const [newUser, setNewUser] = useState({ name: '', email: '', phone: '', company: '', role: 'user' as 'admin' | 'user' | 'interpreter', status: 'active' as 'active' | 'inactive' | 'pending' }); const [isSubmitting, setIsSubmitting] = useState(false); const pageSize = 10; useEffect(() => { fetchUsers(); }, [currentPage, filters]); const fetchUsers = async () => { try { setLoading(true); // 模拟加载延迟 await new Promise(resolve => setTimeout(resolve, 800)); // 使用演示数据 const mockUsers: User[] = [ { id: '1', name: '张三', email: 'zhangsan@example.com', phone: '13800138001', company: 'ABC科技有限公司', role: 'user', status: 'active', created_at: '2024-01-15T10:30:00Z', last_login: '2024-01-20T14:25:00Z', total_calls: 25, total_spent: 1250 }, { id: '2', name: '李四', email: 'lisi@example.com', phone: '13800138002', company: 'XYZ贸易公司', role: 'user', status: 'active', created_at: '2024-01-10T09:15:00Z', last_login: '2024-01-19T16:45:00Z', total_calls: 18, total_spent: 890 }, { id: '3', name: '王五', email: 'wangwu@example.com', phone: '13800138003', company: '翻译服务中心', role: 'interpreter', status: 'active', created_at: '2024-01-05T11:20:00Z', last_login: '2024-01-20T10:30:00Z', total_calls: 156, total_spent: 0 }, { id: '4', name: '赵六', email: 'zhaoliu@example.com', phone: '13800138004', company: '管理员', role: 'admin', status: 'active', created_at: '2024-01-01T08:00:00Z', last_login: '2024-01-20T18:00:00Z', total_calls: 5, total_spent: 0 }, { id: '5', name: '孙七', email: 'sunqi@example.com', phone: '13800138005', company: '新用户公司', role: 'user', status: 'pending', created_at: '2024-01-18T15:30:00Z', last_login: '', total_calls: 0, total_spent: 0 }, { id: '6', name: '周八', email: 'zhouba@example.com', phone: '13800138006', company: '暂停用户公司', role: 'user', status: 'inactive', created_at: '2024-01-12T13:45:00Z', last_login: '2024-01-15T09:20:00Z', total_calls: 8, total_spent: 320 } ]; // 应用过滤器 let filteredUsers = mockUsers; if (filters.search) { filteredUsers = filteredUsers.filter(user => user.name.toLowerCase().includes(filters.search.toLowerCase()) || user.email.toLowerCase().includes(filters.search.toLowerCase()) || user.company.toLowerCase().includes(filters.search.toLowerCase()) ); } if (filters.role) { filteredUsers = filteredUsers.filter(user => user.role === filters.role); } if (filters.status) { filteredUsers = filteredUsers.filter(user => user.status === filters.status); } if (filters.company) { filteredUsers = filteredUsers.filter(user => user.company.toLowerCase().includes(filters.company.toLowerCase()) ); } // 分页 const startIndex = (currentPage - 1) * pageSize; const endIndex = startIndex + pageSize; const paginatedUsers = filteredUsers.slice(startIndex, endIndex); setUsers(paginatedUsers); setTotalCount(filteredUsers.length); setTotalPages(Math.ceil(filteredUsers.length / pageSize)); } catch (error) { console.error('Failed to fetch users:', error); toast.error('加载用户数据失败'); } finally { setLoading(false); } }; const handleSearch = (value: string) => { setFilters(prev => ({ ...prev, search: value })); setCurrentPage(1); }; const handleFilterChange = (key: keyof UserFilters, value: string) => { setFilters(prev => ({ ...prev, [key]: value })); setCurrentPage(1); }; const handleSelectUser = (userId: string) => { setSelectedUsers(prev => prev.includes(userId) ? prev.filter(id => id !== userId) : [...prev, userId] ); }; const handleSelectAll = () => { if (selectedUsers.length === users.length) { setSelectedUsers([]); } else { setSelectedUsers(users.map(user => user.id)); } }; const handleBulkAction = async (action: string) => { if (selectedUsers.length === 0) { toast.error('请选择要操作的用户'); return; } try { // 模拟API调用 await new Promise(resolve => setTimeout(resolve, 1000)); switch (action) { case 'activate': toast.success(`已激活 ${selectedUsers.length} 个用户`); break; case 'deactivate': toast.success(`已停用 ${selectedUsers.length} 个用户`); break; case 'delete': toast.success(`已删除 ${selectedUsers.length} 个用户`); break; default: break; } setSelectedUsers([]); fetchUsers(); } catch (error) { toast.error('操作失败'); } }; const handleExport = async () => { try { toast.loading('正在导出用户数据...', { id: 'export' }); // 模拟导出延迟 await new Promise(resolve => setTimeout(resolve, 2000)); toast.success('用户数据导出成功', { id: 'export' }); } catch (error) { toast.error('导出失败', { id: 'export' }); } }; const getStatusColor = (status: string) => { switch (status) { case 'active': return 'text-green-800 bg-green-100'; case 'inactive': return 'text-red-800 bg-red-100'; case 'pending': return 'text-yellow-800 bg-yellow-100'; default: return 'text-gray-800 bg-gray-100'; } }; const getStatusText = (status: string) => { switch (status) { case 'active': return '活跃'; case 'inactive': return '停用'; case 'pending': return '待审核'; default: return status; } }; const getRoleText = (role: string) => { switch (role) { case 'admin': return '管理员'; case 'user': return '用户'; case 'interpreter': return '翻译员'; default: return role; } }; const getRoleColor = (role: string) => { switch (role) { case 'admin': return 'text-purple-800 bg-purple-100'; case 'user': return 'text-blue-800 bg-blue-100'; case 'interpreter': return 'text-green-800 bg-green-100'; default: return 'text-gray-800 bg-gray-100'; } }; // 添加用户提交函数 const handleAddUser = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); try { // 模拟API调用 await new Promise(resolve => setTimeout(resolve, 1000)); // 创建新用户对象 const newUserData: User = { id: Date.now().toString(), ...newUser, created_at: new Date().toISOString(), last_login: '从未登录', total_calls: 0, total_spent: 0 }; // 添加到用户列表 setUsers(prev => [newUserData, ...prev]); // 重置表单 setNewUser({ name: '', email: '', phone: '', company: '', role: 'user', status: 'active' }); // 关闭模态框 setShowAddUserModal(false); // 可以添加成功提示 alert('用户添加成功!'); } catch (error) { console.error('添加用户失败:', error); alert('添加用户失败,请重试'); } finally { setIsSubmitting(false); } }; // 添加用户模态框组件 const AddUserModal = () => (

添加新用户

setNewUser({...newUser, name: e.target.value})} />
setNewUser({...newUser, email: e.target.value})} />
setNewUser({...newUser, phone: e.target.value})} />
setNewUser({...newUser, company: e.target.value})} />
); return ( <> 用户管理 - 翻译服务管理系统
{/* 页面标题和操作 */}

用户管理

管理系统中的所有用户账户,包括用户、翻译员和管理员。

{/* 搜索和过滤器 */}
handleSearch(e.target.value)} />
handleFilterChange('company', e.target.value)} />
{/* 批量操作 */} {selectedUsers.length > 0 && (
已选择 {selectedUsers.length} 个用户
)} {/* 用户列表 */}
{loading ? (
) : ( <>
{users.map((user) => ( ))}
0} onChange={handleSelectAll} /> 用户信息 角色/状态 公司 统计数据 最后登录 操作
handleSelectUser(user.id)} />
{user.name}
{user.email}
{user.phone}
{getRoleText(user.role)}
{getStatusText(user.status)}
{user.company}
通话: {user.total_calls} 次
消费: ¥{user.total_spent}
{user.last_login ? formatTime(user.last_login) : '从未登录'}
{/* 分页 */} {totalPages > 1 && (

显示第 {(currentPage - 1) * pageSize + 1} 到{' '} {Math.min(currentPage * pageSize, totalCount)} 项, 共 {totalCount}

)} )}
{/* 添加用户模态框 */} ); }