fix(admin): 普通用户页面显示 C 端真实用户列表
All checks were successful
Deploy Admin Frontend / build-and-deploy (push) Successful in 10s

- /users/members 路由改为使用 MemberManagement 组件
- 新增"用户列表"Tab:调用 /admin-api/users 展示所有 C 端用户
- 显示邮箱、昵称、角色、状态、最后登录、注册时间
- 保留原有会员管理和注销审核 Tab

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
wangdl 2026-05-27 21:17:26 +08:00
parent 60a9438176
commit 6bcda17894
2 changed files with 16 additions and 1 deletions

View File

@ -13,6 +13,7 @@ export default function MemberManagement() {
const [addOpen, setAddOpen] = useState(false) const [addOpen, setAddOpen] = useState(false)
const [form] = Form.useForm() const [form] = Form.useForm()
const { data: usersData } = useQuery({ queryKey: ['users', 'list'], queryFn: (): Promise<any> => api.get('/admin-api/users') })
const { data: memberships } = useQuery({ queryKey: ['users', 'memberships'], queryFn: (): Promise<any> => api.get('/admin-api/users/memberships') }) const { data: memberships } = useQuery({ queryKey: ['users', 'memberships'], queryFn: (): Promise<any> => api.get('/admin-api/users/memberships') })
const { data: deletions } = useQuery({ queryKey: ['users', 'deletions'], queryFn: (): Promise<any> => api.get('/admin-api/users/deletion-requests') }) const { data: deletions } = useQuery({ queryKey: ['users', 'deletions'], queryFn: (): Promise<any> => api.get('/admin-api/users/deletion-requests') })
@ -34,6 +35,15 @@ export default function MemberManagement() {
}) })
} }
const userCols = [
{ title: '邮箱', dataIndex: 'email', width: 200, ellipsis: true, render: (v: string) => v || '-' },
{ title: '昵称', dataIndex: 'nickname', width: 120, render: (v: string) => v || '-' },
{ title: '角色', dataIndex: 'role', width: 80, render: (v: string) => <Tag>{v}</Tag> },
{ title: '状态', dataIndex: 'status', width: 80, render: (v: string) => v === 'active' ? <Tag color="green"></Tag> : <Tag color="red">{v}</Tag> },
{ title: '最后登录', dataIndex: 'lastLoginAt', width: 140, render: (d: string) => d ? dayjs(d).format('MM-DD HH:mm') : '-' },
{ title: '注册时间', dataIndex: 'createdAt', width: 140, render: (d: string) => dayjs(d).format('MM-DD HH:mm') },
]
const membershipCols = [ const membershipCols = [
{ title: '用户ID', dataIndex: 'userId', width: 160, ellipsis: true }, { title: '用户ID', dataIndex: 'userId', width: 160, ellipsis: true },
{ title: '计划', dataIndex: ['plan', 'name'], width: 120, render: (_: any, r: any) => r.plan?.name || '-' }, { title: '计划', dataIndex: ['plan', 'name'], width: 120, render: (_: any, r: any) => r.plan?.name || '-' },
@ -66,6 +76,10 @@ export default function MemberManagement() {
</div> </div>
<Tabs items={[ <Tabs items={[
{
key: 'users', label: `用户列表 (${usersData?.total ?? 0})`,
children: <Table dataSource={usersData?.items || []} columns={userCols} rowKey="id" pagination={{ pageSize: 20 }} size="small" />,
},
{ {
key: 'membership', label: '会员管理', key: 'membership', label: '会员管理',
children: <Table dataSource={memberships || []} columns={membershipCols} rowKey="id" pagination={{ pageSize: 20 }} size="small" />, children: <Table dataSource={memberships || []} columns={membershipCols} rowKey="id" pagination={{ pageSize: 20 }} size="small" />,

View File

@ -4,6 +4,7 @@ import type { AdminRole } from '@/types/admin'
const Dashboard = lazy(() => import('@/pages/Dashboard')) const Dashboard = lazy(() => import('@/pages/Dashboard'))
const TaskAssistant = lazy(() => import('@/pages/TaskAssistant')) const TaskAssistant = lazy(() => import('@/pages/TaskAssistant'))
const UserManagement = lazy(() => import('@/pages/UserManagement')) const UserManagement = lazy(() => import('@/pages/UserManagement'))
const MemberManagement = lazy(() => import('@/pages/MemberManagement'))
export interface RouteConfig { export interface RouteConfig {
path: string path: string
@ -17,7 +18,7 @@ export const routeConfig: RouteConfig[] = [
{ path: '/assistant', title: '任务助理', element: TaskAssistant }, { path: '/assistant', title: '任务助理', element: TaskAssistant },
{ path: '/users', title: '用户管理', element: UserManagement, requiredRole: 'ADMIN' }, { path: '/users', title: '用户管理', element: UserManagement, requiredRole: 'ADMIN' },
{ path: '/users/admins', title: '管理员', element: UserManagement, requiredRole: 'SUPER_ADMIN' }, { path: '/users/admins', title: '管理员', element: UserManagement, requiredRole: 'SUPER_ADMIN' },
{ path: '/users/members', title: '普通用户', element: UserManagement }, { path: '/users/members', title: '普通用户', element: MemberManagement },
{ path: '/membership', title: '会员与额度', element: UserManagement, requiredRole: 'ADMIN' }, { path: '/membership', title: '会员与额度', element: UserManagement, requiredRole: 'ADMIN' },
{ path: '/knowledge/bases', title: '知识库列表', element: UserManagement }, { path: '/knowledge/bases', title: '知识库列表', element: UserManagement },
{ path: '/knowledge/sources', title: '知识源列表', element: UserManagement }, { path: '/knowledge/sources', title: '知识源列表', element: UserManagement },