import React, { useEffect, useState } from 'react'; import { API, showError, showSuccess, renderGroup, renderNumber, renderQuota } from '../../helpers'; import { User, Shield, Crown, HelpCircle, CheckCircle, XCircle, Minus, Coins, Activity, Users, DollarSign, UserPlus, } from 'lucide-react'; import { Button, Card, Divider, Dropdown, Empty, Form, Modal, Space, Table, Tag, Tooltip, Typography } from '@douyinfe/semi-ui'; import { IllustrationNoResult, IllustrationNoResultDark } from '@douyinfe/semi-illustrations'; import { IconSearch, IconUserAdd, IconMore, } from '@douyinfe/semi-icons'; import { ITEMS_PER_PAGE } from '../../constants'; import AddUser from '../../pages/User/AddUser'; import EditUser from '../../pages/User/EditUser'; import { useTranslation } from 'react-i18next'; import { useTableCompactMode } from '../../hooks/useTableCompactMode'; const { Text } = Typography; const UsersTable = () => { const { t } = useTranslation(); const [compactMode, setCompactMode] = useTableCompactMode('users'); function renderRole(role) { switch (role) { case 1: return ( }> {t('普通用户')} ); case 10: return ( }> {t('管理员')} ); case 100: return ( }> {t('超级管理员')} ); default: return ( }> {t('未知身份')} ); } } const renderStatus = (status) => { switch (status) { case 1: return }>{t('已激活')}; case 2: return ( }> {t('已封禁')} ); default: return ( }> {t('未知状态')} ); } }; const columns = [ { title: 'ID', dataIndex: 'id', }, { title: t('用户名'), dataIndex: 'username', render: (text, record) => { const remark = record.remark; if (!remark) { return {text}; } const maxLen = 10; const displayRemark = remark.length > maxLen ? remark.slice(0, maxLen) + '…' : remark; return ( {text}
{displayRemark}
); }, }, { title: t('分组'), dataIndex: 'group', render: (text, record, index) => { return
{renderGroup(text)}
; }, }, { title: t('统计信息'), dataIndex: 'info', render: (text, record, index) => { return (
}> {t('剩余')}: {renderQuota(record.quota)} }> {t('已用')}: {renderQuota(record.used_quota)} }> {t('调用')}: {renderNumber(record.request_count)}
); }, }, { title: t('邀请信息'), dataIndex: 'invite', render: (text, record, index) => { return (
}> {t('邀请')}: {renderNumber(record.aff_count)} }> {t('收益')}: {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', fixed: 'right', render: (text, record, index) => { if (record.DeletedAt !== null) { return <>; } // 创建更多操作的下拉菜单项 const moreMenuItems = [ { node: 'item', name: t('提升'), type: 'warning', onClick: () => { Modal.confirm({ title: t('确定要提升此用户吗?'), content: t('此操作将提升用户的权限级别'), onOk: () => { manageUser(record.id, 'promote', record); }, }); }, }, { node: 'item', name: t('降级'), type: 'secondary', onClick: () => { Modal.confirm({ title: t('确定要降级此用户吗?'), content: t('此操作将降低用户的权限级别'), onOk: () => { manageUser(record.id, 'demote', record); }, }); }, }, { node: 'item', name: t('注销'), type: 'danger', onClick: () => { Modal.confirm({ title: t('确定是否要注销此用户?'), content: t('相当于删除用户,此修改将不可逆'), onOk: () => { manageUser(record.id, 'delete', record).then(() => { removeRecord(record.id); }); }, }); }, } ]; // 动态添加启用/禁用按钮 if (record.status === 1) { moreMenuItems.splice(-1, 0, { node: 'item', name: t('禁用'), type: 'warning', onClick: () => { manageUser(record.id, 'disable', record); }, }); } else { moreMenuItems.splice(-1, 0, { node: 'item', name: t('启用'), type: 'secondary', onClick: () => { manageUser(record.id, 'enable', record); }, disabled: record.status === 3, }); } return (
setFormApi(api)} onSubmit={() => { setActivePage(1); searchUsers(1, pageSize); }} allowEmpty={true} autoComplete="off" layout="horizontal" trigger="change" stopValidateWithError={false} className="w-full md:w-auto order-1 md:order-2" >
} placeholder={t('支持搜索用户的 ID、用户名、显示名称和邮箱地址')} showClear pure />
{ // 分组变化时自动搜索 setTimeout(() => { setActivePage(1); searchUsers(1, pageSize); }, 100); }} className="w-full" showClear pure />
); return ( <> rest) : columns} dataSource={users} scroll={compactMode ? undefined : { x: 'max-content' }} pagination={{ formatPageText: (page) => t('第 {{start}} - {{end}} 条,共 {{total}} 条', { start: page.currentStart, end: page.currentEnd, total: userCount, }), currentPage: activePage, pageSize: pageSize, total: userCount, pageSizeOpts: [10, 20, 50, 100], showSizeChanger: true, onPageSizeChange: (size) => { handlePageSizeChange(size); }, onPageChange: handlePageChange, }} loading={loading} onRow={handleRow} empty={ } darkModeImage={} description={t('搜索无结果')} style={{ padding: 30 }} /> } className="overflow-hidden" size="middle" /> ); }; export default UsersTable;