import { MEMBER_TYPE_COLORS, MEMBER_TYPE_LABELS, STATUS_DISABLED, STATUS_ENABLED } from '@/defines'; import { BindRolesDrawer } from '@/pages/Admin/_shared/BindRolesDrawer'; import { UserPermDrawer } from '@/pages/Admin/_shared/UserPermDrawer'; import { useProductRolesBase, useUserProductRoles, } from '@/pages/Admin/_shared/useUserProductRoles'; import { fetchUpdateUserStatus, fetchUserList } from '@/services/user'; import { unixTimeFormat } from '@/utils/timeUtils'; import { StopOutlined } from '@ant-design/icons'; import { ActionType, PageContainer, ProColumns, ProTable } from '@ant-design/pro-components'; import { useIntl } from '@umijs/max'; import { Button, Popconfirm, Tag, message } from 'antd'; import { useMemo, useRef, useState } from 'react'; import { UserForm } from './components/Form'; export default function UserPage() { const intl = useIntl(); const actionRef = useRef(); const [pageUsers, setPageUsers] = useState([]); const [rolesDrawer, setRolesDrawer] = useState<{ open: boolean; userId: number }>({ open: false, userId: 0, }); const [permDrawer, setPermDrawer] = useState<{ open: boolean; userId: number }>({ open: false, userId: 0, }); const [refreshKey, setRefreshKey] = useState(0); const userIds = useMemo(() => pageUsers.map((u) => u.id), [pageUsers]); const productRolesBase = useProductRolesBase(); const { userProductInfo } = useUserProductRoles(userIds, productRolesBase, refreshKey); const handleToggleStatus = async (r: API.UserItem) => { const res = await fetchUpdateUserStatus({ id: r.id, status: r.status === STATUS_ENABLED ? STATUS_DISABLED : STATUS_ENABLED, }); if (!res.success) return; message.success('操作成功'); actionRef.current?.reload(); }; const columns: ProColumns[] = [ { title: '用户名', dataIndex: 'username', width: 200 }, { title: '昵称', dataIndex: 'nickname', width: 200 }, { title: '状态', dataIndex: 'status', width: 80, render: (_, r) => ( {r.status === STATUS_ENABLED ? '启用' : '禁用'} ), }, { title: '产品角色', key: 'productRoles', render: (_, r) => { const info = userProductInfo.get(r.id) ?? []; if (info.length === 0) return ; return (
{info.map((p) => (
{p.productName} {p.productStatus !== STATUS_ENABLED && ( )} {MEMBER_TYPE_LABELS[p.memberType ?? ''] ?? p.memberType}
{p.roleNames.length > 0 ? ( p.roleNames.map((name) => ( {name} )) ) : ( 无角色 )}
))}
); }, }, { title: '创建时间', dataIndex: 'createTime', width: 180, render: (_, r) => unixTimeFormat(r.createTime), }, { title: '操作', valueType: 'option', width: 260, render: (_, r) => [ 编辑} onSuccess={() => actionRef.current?.reload()} />, 复制} onSuccess={() => actionRef.current?.reload()} />, setRolesDrawer({ open: true, userId: r.id })}> 分配角色 , setPermDrawer({ open: true, userId: r.id })}> 设置权限 , handleToggleStatus(r)} > {r.status === STATUS_ENABLED ? '冻结' : '解冻'} , ], }, ]; return ( actionRef={actionRef} columns={columns} rowKey="id" search={false} request={fetchUserList} onDataSourceChange={setPageUsers} scroll={{ x: 1220 }} tableLayout="fixed" pagination={{ defaultPageSize: 20, pageSizeOptions: [10, 20, 50, 100], showSizeChanger: true, }} toolBarRender={() => [ 新建用户} onSuccess={() => actionRef.current?.reload()} />, ]} /> setRolesDrawer((p) => ({ ...p, open: false }))} onSuccess={() => setRefreshKey((k) => k + 1)} /> setPermDrawer((p) => ({ ...p, open: false }))} /> ); }