import React, { useEffect, useState } from 'react'; import { API, showError, showSuccess } from '../helpers'; import { Button, Form, Popconfirm, Space, Table, Tag, Tooltip, Dropdown } from '@douyinfe/semi-ui'; import { ITEMS_PER_PAGE } from '../constants'; import { renderGroup, renderNumber, renderQuota } from '../helpers/render'; import AddUser from '../pages/User/AddUser'; import EditUser from '../pages/User/EditUser'; function renderRole(role) { switch (role) { case 1: return 普通用户; case 10: return 管理员; case 100: return 超级管理员; default: return 未知身份; } } const UsersTable = () => { const columns = [{ title: 'ID', dataIndex: 'id' }, { title: '用户名', dataIndex: 'username' }, { title: '分组', dataIndex: 'group', render: (text, record, index) => { return (
{renderGroup(text)}
); } }, { title: '统计信息', dataIndex: 'info', render: (text, record, index) => { return (
{renderQuota(record.quota)} {renderQuota(record.used_quota)} {renderNumber(record.request_count)}
); } }, // { // title: '邀请信息', dataIndex: 'invite', render: (text, record, index) => { // return (
// // // {renderNumber(record.aff_count)} // // // {renderQuota(record.aff_history_quota)} // // // {record.inviter_id === 0 ? : // {record.inviter_id}} // // //
); // } // }, { title: '角色', dataIndex: 'role', render: (text, record, index) => { return (
{renderRole(text)}
); } }, { title: '状态', dataIndex: 'status', render: (text, record, index) => { return (
{renderStatus(text)}
); } }, { title: '', dataIndex: 'operate', render: (text, record, index) => (
<> { manageUser(record.username, 'promote', record); }} > { manageUser(record.username, 'demote', record); }} > {record.status === 1 ? : } { manageUser(record.username, 'delete', record).then(() => { removeRecord(record.id); }); }} >
) }]; const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [activePage, setActivePage] = useState(1); const [searchKeyword, setSearchKeyword] = useState(''); const [searching, setSearching] = useState(false); const [userCount, setUserCount] = useState(ITEMS_PER_PAGE); const [showAddUser, setShowAddUser] = useState(false); const [showEditUser, setShowEditUser] = useState(false); const [editingUser, setEditingUser] = useState({ id: undefined }); const [orderBy, setOrderBy] = useState(''); const [dropdownVisible, setDropdownVisible] = useState(false); const setCount = (data) => { if (data.length >= (activePage) * ITEMS_PER_PAGE) { setUserCount(data.length + 1); } else { setUserCount(data.length); } }; const removeRecord = key => { console.log(key); let newDataSource = [...users]; if (key != null) { let idx = newDataSource.findIndex(data => data.id === key); if (idx > -1) { newDataSource.splice(idx, 1); setUsers(newDataSource); } } }; const loadUsers = async (startIdx) => { const res = await API.get(`/api/user/?p=${startIdx}&order=${orderBy}`); const { success, message, data } = res.data; if (success) { if (startIdx === 0) { setUsers(data); setCount(data); } else { let newUsers = users; newUsers.push(...data); setUsers(newUsers); setCount(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, orderBy); } setActivePage(activePage); })(); }; useEffect(() => { loadUsers(0, orderBy) .then() .catch((reason) => { showError(reason); }); }, [orderBy]); const manageUser = async (username, action, record) => { const res = await API.post('/api/user/manage', { username, action }); const { success, message } = res.data; if (success) { showSuccess('操作成功完成!'); let user = res.data.data; let newUsers = [...users]; if (action === 'delete') { } else { record.status = user.status; record.role = user.role; } setUsers(newUsers); } else { showError(message); } }; 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); setOrderBy(''); 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 (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); }; const handlePageChange = page => { setActivePage(page); if (page === Math.ceil(users.length / ITEMS_PER_PAGE) + 1) { // In this case we have to load more data and then append them. loadUsers(page - 1).then(r => { }); } }; const pageData = users.slice((activePage - 1) * ITEMS_PER_PAGE, activePage * ITEMS_PER_PAGE); const closeAddUser = () => { setShowAddUser(false); }; const closeEditUser = () => { setShowEditUser(false); setEditingUser({ id: undefined }); }; const refresh = async () => { if (searchKeyword === '') { await loadUsers(activePage - 1); } else { await searchUsers(); } }; const handleOrderByChange = (e, { value }) => { setOrderBy(value); setActivePage(1); setDropdownVisible(false); }; const renderSelectedOption = (orderBy) => { switch (orderBy) { case 'quota': return '按剩余额度排序'; case 'used_quota': return '按已用额度排序'; case 'request_count': return '按请求次数排序'; default: return '默认排序'; } }; return ( <>
handleKeywordChange(value)} /> setDropdownVisible(visible)} render={ handleOrderByChange('', { value: '' })}>默认排序 handleOrderByChange('', { value: 'quota' })}>按剩余额度排序 handleOrderByChange('', { value: 'used_quota' })}>按已用额度排序 handleOrderByChange('', { value: 'request_count' })}>按请求次数排序 } > ); }; export default UsersTable;