import React, { useEffect, useState } from 'react'; import { API, showError, showSuccess } from '../helpers'; import { Button, Form, Popconfirm, Space, Table, Tag, Tooltip, } 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'; import { useTranslation } from 'react-i18next'; const UsersTable = () => { const { t } = useTranslation(); function renderRole(role) { switch (role) { case 1: return {t('普通用户')}; case 10: return ( {t('管理员')} ); case 100: return ( {t('超级管理员')} ); default: return ( {t('未知身份')} ); } } const columns = [ { title: 'ID', dataIndex: 'id', }, { title: t('用户名'), dataIndex: 'username', }, { title: t('分组'), dataIndex: 'group', render: (text, record, index) => { return
{renderGroup(text)}
; }, }, { title: t('统计信息'), dataIndex: 'info', render: (text, record, index) => { return (
{renderQuota(record.quota)} {renderQuota(record.used_quota)} {renderNumber(record.request_count)}
); }, }, { title: t('邀请信息'), dataIndex: 'invite', render: (text, record, index) => { return (
{renderNumber(record.aff_count)} {renderQuota(record.aff_history_quota)} {record.inviter_id === 0 ? ( {t('无')} ) : ( {record.inviter_id} )}
); }, }, { title: t('角色'), dataIndex: 'role', render: (text, record, index) => { return
{renderRole(text)}
; }, }, { title: t('状态'), dataIndex: 'status', render: (text, record, index) => { return (
{record.DeletedAt !== null ? ( {t('已注销')} ) : ( renderStatus(text) )}
); }, }, { title: '', dataIndex: 'operate', render: (text, record, index) => (
{record.DeletedAt !== null ? ( <> ) : ( <> { manageUser(record.id, 'promote', record); }} > { manageUser(record.id, 'demote', record); }} > {record.status === 1 ? ( ) : ( )} { manageUser(record.id, 'delete', record).then(() => { removeRecord(record.id); }); }} > )}
), }, ]; const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [activePage, setActivePage] = useState(1); const [pageSize, setPageSize] = useState(ITEMS_PER_PAGE); const [searchKeyword, setSearchKeyword] = useState(''); const [searching, setSearching] = useState(false); const [searchGroup, setSearchGroup] = useState(''); const [groupOptions, setGroupOptions] = useState([]); const [userCount, setUserCount] = useState(ITEMS_PER_PAGE); const [showAddUser, setShowAddUser] = useState(false); const [showEditUser, setShowEditUser] = useState(false); const [editingUser, setEditingUser] = useState({ id: undefined, }); const removeRecord = (key) => { let newDataSource = [...users]; if (key != null) { let idx = newDataSource.findIndex((data) => data.id === key); if (idx > -1) { // update deletedAt newDataSource[idx].DeletedAt = new Date(); setUsers(newDataSource); } } }; const setUserFormat = (users) => { for (let i = 0; i < users.length; i++) { users[i].key = users[i].id; } setUsers(users); } const loadUsers = async (startIdx, pageSize) => { const res = await API.get(`/api/user/?p=${startIdx}&page_size=${pageSize}`); const { success, message, data } = res.data; if (success) { const newPageData = data.items; setActivePage(data.page); setUserCount(data.total); setUserFormat(newPageData); } else { showError(message); } setLoading(false); }; useEffect(() => { loadUsers(0, pageSize) .then() .catch((reason) => { showError(reason); }); fetchGroups().then(); }, []); const manageUser = async (userId, action, record) => { const res = await API.post('/api/user/manage', { id: userId, 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 {t('已激活')}; case 2: return ( {t('已封禁')} ); default: return ( {t('未知状态')} ); } }; const searchUsers = async (startIdx, pageSize, searchKeyword, searchGroup) => { if (searchKeyword === '' && searchGroup === '') { // if keyword is blank, load files instead. await loadUsers(startIdx, pageSize); return; } setSearching(true); const res = await API.get(`/api/user/search?keyword=${searchKeyword}&group=${searchGroup}&p=${startIdx}&page_size=${pageSize}`); const { success, message, data } = res.data; if (success) { const newPageData = data.items; setActivePage(data.page); setUserCount(data.total); setUserFormat(newPageData); } else { showError(message); } setSearching(false); }; const handleKeywordChange = async (value) => { setSearchKeyword(value.trim()); }; const handlePageChange = (page) => { setActivePage(page); if (searchKeyword === '' && searchGroup === '') { loadUsers(page, pageSize).then(); } else { searchUsers(page, pageSize, searchKeyword, searchGroup).then(); } }; const closeAddUser = () => { setShowAddUser(false); }; const closeEditUser = () => { setShowEditUser(false); setEditingUser({ id: undefined, }); }; const refresh = async () => { setActivePage(1) if (searchKeyword === '') { await loadUsers(activePage, pageSize); } else { await searchUsers(activePage, pageSize, searchKeyword, searchGroup); } }; const fetchGroups = async () => { try { let res = await API.get(`/api/group/`); // add 'all' option // res.data.data.unshift('all'); if (res === undefined) { return; } setGroupOptions( res.data.data.map((group) => ({ label: group, value: group, })), ); } catch (error) { showError(error.message); } }; const handlePageSizeChange = async (size) => { localStorage.setItem('page-size', size + ''); setPageSize(size); setActivePage(1); loadUsers(activePage, size) .then() .catch((reason) => { showError(reason); }); }; return ( <>
{ searchUsers(activePage, pageSize, searchKeyword, searchGroup); }} labelPosition='left' >
handleKeywordChange(value)} /> { setSearchGroup(value); searchUsers(activePage, pageSize, searchKeyword, value); }} />
t('第 {{start}} - {{end}} 条,共 {{total}} 条', { start: page.currentStart, end: page.currentEnd, total: users.length }), currentPage: activePage, pageSize: pageSize, total: userCount, pageSizeOpts: [10, 20, 50, 100], showSizeChanger: true, onPageSizeChange: (size) => { handlePageSizeChange(size); }, onPageChange: handlePageChange, }} loading={loading} /> ); }; export default UsersTable;