import React, { useEffect, useState } from 'react'; import { Button, Form, Label, Pagination, Popup, Table, Dropdown } from 'semantic-ui-react'; import { Link } from 'react-router-dom'; import { API, showError, showSuccess } from '../helpers'; import { ITEMS_PER_PAGE } from '../constants'; import { renderGroup, renderNumber, renderQuota, renderText } from '../helpers/render'; function renderRole(role) { switch (role) { case 1: return ; case 10: return ; case 100: return ; default: return ; } } const UsersTable = () => { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [activePage, setActivePage] = useState(1); const [searchKeyword, setSearchKeyword] = useState(''); const [searching, setSearching] = useState(false); const loadUsers = async (startIdx) => { const res = await API.get(`/api/user/?p=${startIdx}`); const { success, message, data } = res.data; if (success) { if (startIdx === 0) { setUsers(data); } else { let newUsers = users; newUsers.push(...data); setUsers(newUsers); } } else { showError(message); } setLoading(false); }; const onPaginationChange = (e, { activePage }) => { (async () => { if (activePage === Math.ceil(users.length / ITEMS_PER_PAGE) + 1) { // In this case we have to load more data and then append them. await loadUsers(activePage - 1); } setActivePage(activePage); })(); }; useEffect(() => { loadUsers(0) .then() .catch((reason) => { showError(reason); }); }, []); const manageUser = (username, idx, newGroup) => { (async () => { const res = await API.post('/api/user/manage', { username, newGroup }); const { success, message } = res.data; if (success) { showSuccess('操作成功完成!'); let user = res.data.data; let newUsers = [...users]; let realIdx = (activePage - 1) * ITEMS_PER_PAGE + idx; newUsers[realIdx].group = user.group; // 用新的 user.group 更新用户分组 setUsers(newUsers); } else { showError(message); } })(); }; const groupOptions = [ { key: 'default', value: 'default', text: '默认', color: 'var(--czl-grayA)' }, { key: 'vip', value: 'vip', text: 'VIP', color: 'var(--czl-success-color)' }, { key: 'svip', value: 'svip', text: '超级VIP', color: 'var(--czl-error-color)' }, ]; const groupColor = (userGroup) => { const group = groupOptions.find((option) => option.value === userGroup); return group ? group.color : 'inherit'; // 如果未找到分组,则返回默认颜色 }; const renderStatus = (status) => { switch (status) { case 1: return ; case 2: return ( ); default: return ( ); } }; const searchUsers = async () => { if (searchKeyword === '') { // if keyword is blank, load files instead. await loadUsers(0); setActivePage(1); return; } setSearching(true); const res = await API.get(`/api/user/search?keyword=${searchKeyword}`); const { success, message, data } = res.data; if (success) { setUsers(data); setActivePage(1); } else { showError(message); } setSearching(false); }; const handleKeywordChange = async (e, { value }) => { setSearchKeyword(value.trim()); }; const sortUser = (key) => { if (users.length === 0) return; setLoading(true); let sortedUsers = [...users]; sortedUsers.sort((a, b) => { return ('' + a[key]).localeCompare(b[key]); }); if (sortedUsers[0].id === users[0].id) { sortedUsers.reverse(); } setUsers(sortedUsers); setLoading(false); }; return ( <>
{ sortUser('id'); }} > ID { sortUser('username'); }} > 用户名 {/* { sortUser('group'); }} > 分组 */} { sortUser('quota'); }} > 统计信息 { sortUser('role'); }} > 用户角色 { sortUser('status'); }} > 状态 操作 {users .slice( (activePage - 1) * ITEMS_PER_PAGE, activePage * ITEMS_PER_PAGE ) .map((user, idx) => { if (user.deleted) return <>; return ( {user.id} {renderText(user.username, 15)}} hoverable /> {/* {renderGroup(user.group)} */} {renderQuota(user.quota)}} /> {renderQuota(user.used_quota)}} /> {renderNumber(user.request_count)}} /> {renderRole(user.role)} {renderStatus(user.status)}
} onChange={(e, { value }) => manageUser(user.username, idx, value)} /> 删除 } on='click' flowing hoverable >
); })}
); }; export default UsersTable;