From 6d11fbee89bb50a84cd6da0829b54c2d796078af Mon Sep 17 00:00:00 2001 From: "Apple\\Apple" Date: Fri, 23 May 2025 17:12:17 +0800 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8FRefactor:=20Users=20Page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/UsersTable.js | 500 +++++++++++++++++-------------- web/src/i18n/locales/en.json | 10 +- web/src/pages/User/index.js | 12 +- 3 files changed, 292 insertions(+), 230 deletions(-) diff --git a/web/src/components/UsersTable.js b/web/src/components/UsersTable.js index b77f7396..25447a2e 100644 --- a/web/src/components/UsersTable.js +++ b/web/src/components/UsersTable.js @@ -2,46 +2,88 @@ import React, { useEffect, useState } from 'react'; import { API, showError, showSuccess } from '../helpers'; import { Button, - Form, - Popconfirm, + Card, + Divider, + Dropdown, + Input, + Modal, + Select, Space, Table, Tag, - Tooltip, + Typography, } from '@douyinfe/semi-ui'; +import { + IconPlus, + IconSearch, + IconEdit, + IconDelete, + IconStop, + IconPlay, + IconMore, + IconUserAdd, + IconArrowUp, + IconArrowDown, +} from '@douyinfe/semi-icons'; 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 { Text } = Typography; + const UsersTable = () => { const { t } = useTranslation(); function renderRole(role) { switch (role) { case 1: - return {t('普通用户')}; + 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', @@ -65,21 +107,15 @@ const UsersTable = () => { return (
- - - {renderQuota(record.quota)} - - - - - {renderQuota(record.used_quota)} - - - - - {renderNumber(record.request_count)} - - + + {t('剩余')}: {renderQuota(record.quota)} + + + {t('已用')}: {renderQuota(record.used_quota)} + + + {t('调用')}: {renderNumber(record.request_count)} +
); @@ -92,27 +128,15 @@ const UsersTable = () => { return (
- - - {renderNumber(record.aff_count)} - - - - - {renderQuota(record.aff_history_quota)} - - - - {record.inviter_id === 0 ? ( - - {t('无')} - - ) : ( - - {record.inviter_id} - - )} - + + {t('邀请')}: {renderNumber(record.aff_count)} + + + {t('收益')}: {renderQuota(record.aff_history_quota)} + + + {record.inviter_id === 0 ? t('无邀请人') : `邀请人: ${record.inviter_id}`} +
); @@ -132,7 +156,7 @@ const UsersTable = () => { return (
{record.DeletedAt !== null ? ( - {t('已注销')} + {t('已注销')} ) : ( renderStatus(text) )} @@ -143,92 +167,117 @@ const UsersTable = () => { { title: '', dataIndex: 'operate', - render: (text, record, index) => ( -
- {record.DeletedAt !== null ? ( - <> - ) : ( - <> - { + render: (text, record, index) => { + if (record.DeletedAt !== null) { + return <>; + } + + // 创建更多操作的下拉菜单项 + const moreMenuItems = [ + { + node: 'item', + name: t('提升'), + icon: , + type: 'warning', + onClick: () => { + Modal.confirm({ + title: t('确定要提升此用户吗?'), + content: t('此操作将提升用户的权限级别'), + onOk: () => { manageUser(record.id, 'promote', record); - }} - > - - - { + }, + }); + }, + }, + { + node: 'item', + name: t('降级'), + icon: , + type: 'secondary', + onClick: () => { + Modal.confirm({ + title: t('确定要降级此用户吗?'), + content: t('此操作将降低用户的权限级别'), + onOk: () => { manageUser(record.id, 'demote', record); - }} - > - - - {record.status === 1 ? ( - - ) : ( - - )} - - { + }, + }); + }, + }, + { + node: 'item', + name: t('注销'), + icon: , + 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('禁用'), + icon: , + type: 'warning', + onClick: () => { + manageUser(record.id, 'disable', record); + }, + }); + } else { + moreMenuItems.splice(-1, 0, { + node: 'item', + name: t('启用'), + icon: , + type: 'secondary', + onClick: () => { + manageUser(record.id, 'enable', record); + }, + disabled: record.status === 3, + }); + } + + return ( + + + + +
+ +
+
+ } + placeholder={t('支持搜索用户的 ID、用户名、显示名称和邮箱地址')} + value={searchKeyword} + onChange={handleKeywordChange} + className="!rounded-full" + showClear + /> +
+
+