import { useMemo, useState } from 'react'; import { Alert, Badge, Button, Field, Input, Select } from '../components/ui.jsx'; import { Icon, PageTitle, Toolbar, Panel, ApiNotice, Modal, ConfirmDialog, SimpleTable } from '../components/layout.jsx'; import { explainApiError } from '../api.js'; const emptyUserForm = { username: '', name: '', phone: '', email: '', roleId: 'R002', status: '启用' }; export function UsersPage({ userRows, setUserRows, roleRows, apiLoading, apiError, refreshApi, can = () => true, onDeleteUser }) { const [keyword, setKeyword] = useState(''); const [roleFilter, setRoleFilter] = useState('all'); const [statusFilter, setStatusFilter] = useState('all'); const [editingUser, setEditingUser] = useState(undefined); const [userForm, setUserForm] = useState(emptyUserForm); const [resetTarget, setResetTarget] = useState(null); const [deleteUserTarget, setDeleteUserTarget] = useState(null); const [resetMessage, setResetMessage] = useState(''); const [actionError, setActionError] = useState(''); const canManage = can('users.manage'); const roleMap = useMemo(() => new Map(roleRows.map((role) => [role.id, role.name])), [roleRows]); const visibleUsers = useMemo(() => { const normalized = keyword.trim().toLowerCase(); return userRows.filter((user) => { const matchesKeyword = !normalized || [user.username, user.name, user.phone, user.email].some((value) => value.toLowerCase().includes(normalized)); return matchesKeyword && (roleFilter === 'all' || user.roleId === roleFilter) && (statusFilter === 'all' || user.status === statusFilter); }); }, [keyword, roleFilter, statusFilter, userRows]); const openCreateUser = () => { setEditingUser(null); setUserForm(emptyUserForm); }; const openEditUser = (user) => { setEditingUser(user); setUserForm({ username: user.username, name: user.name, phone: user.phone, email: user.email, roleId: user.roleId, status: user.status }); }; const closeUserModal = () => { setEditingUser(undefined); setUserForm(emptyUserForm); }; const submitUser = (event) => { event.preventDefault(); if (!userForm.username.trim() || !userForm.name.trim() || !userForm.roleId) return; if (editingUser) { setUserRows((rows) => rows.map((user) => user.id === editingUser.id ? { ...user, ...userForm } : user)); } else { const nextId = `U${String(1001 + userRows.length).padStart(4, '0')}`; setUserRows((rows) => [...rows, { id: nextId, ...userForm, lastLogin: '从未登录', lastIp: '-' }]); } closeUserModal(); }; const toggleUserStatus = (user) => { setUserRows((rows) => rows.map((item) => item.id === user.id ? { ...item, status: item.status === '启用' ? '禁用' : '启用' } : item)); }; const deleteUser = async (user) => { try { setActionError(''); if (onDeleteUser) { await onDeleteUser(user.id); } else { setUserRows((rows) => rows.filter((item) => item.id !== user.id)); } setDeleteUserTarget(null); } catch (error) { setActionError(explainApiError(error)); } }; const confirmResetPassword = () => { setResetMessage(`${resetTarget.name}(${resetTarget.username})的密码已重置,下次登录需修改密码。`); setResetTarget(null); }; return ( <> } onClick={openCreateUser}>新增用户 : null} /> {resetMessage ? {resetMessage} : null} {actionError ? {actionError} : null} setKeyword(event.target.value)} placeholder="用户名、姓名、手机号或邮箱" /> 共 {visibleUsers.length} 个用户} className="wide-panel"> ({ ...user, roleName: roleMap.get(user.roleId) || '-' }))} columns={[ { key: 'username', label: '用户名' }, { key: 'name', label: '姓名' }, { key: 'phone', label: '手机号' }, { key: 'roleName', label: '角色' }, { key: 'status', label: '状态', status: true }, { key: 'lastLogin', label: '最后登录时间' }, { key: 'lastIp', label: '最后登录 IP' }, { key: 'actions', label: '操作', render: (row) =>
{canManage ? : null}{canManage ? : null}{canManage ? : null}{canManage ? : '-'}
}, ]} />
{editingUser !== undefined ? (
用户名 *}> setUserForm({ ...userForm, username: event.target.value })} placeholder="用于登录,不可重复" disabled={Boolean(editingUser)} required /> 姓名 *}> setUserForm({ ...userForm, name: event.target.value })} placeholder="请输入用户姓名" required /> setUserForm({ ...userForm, phone: event.target.value })} placeholder="请输入手机号" /> setUserForm({ ...userForm, email: event.target.value })} placeholder="请输入邮箱" /> 角色 *}>
) : null} {resetTarget ? ( setResetTarget(null)} onConfirm={confirmResetPassword} >

确认重置用户「{resetTarget.name}({resetTarget.username})」的登录密码吗?重置后该用户需要使用临时密码登录并立即修改密码。

) : null} {deleteUserTarget ? ( setDeleteUserTarget(null)} onConfirm={() => void deleteUser(deleteUserTarget)} >

确认删除用户「{deleteUserTarget.name}({deleteUserTarget.username})」吗?删除后该用户将不能登录,也不再出现在用户列表中。

) : null} ); }