From 6bcda1789482f5a2858594b1aa19a12a66acd462 Mon Sep 17 00:00:00 2001 From: wangdl Date: Wed, 27 May 2026 21:17:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(admin):=20=E6=99=AE=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E9=A1=B5=E9=9D=A2=E6=98=BE=E7=A4=BA=20C=20=E7=AB=AF?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=E7=94=A8=E6=88=B7=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /users/members 路由改为使用 MemberManagement 组件 - 新增"用户列表"Tab:调用 /admin-api/users 展示所有 C 端用户 - 显示邮箱、昵称、角色、状态、最后登录、注册时间 - 保留原有会员管理和注销审核 Tab Co-Authored-By: Claude Opus 4.7 --- src/pages/MemberManagement.tsx | 14 ++++++++++++++ src/routes/index.tsx | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/pages/MemberManagement.tsx b/src/pages/MemberManagement.tsx index 7d1edbf..6da65fa 100644 --- a/src/pages/MemberManagement.tsx +++ b/src/pages/MemberManagement.tsx @@ -13,6 +13,7 @@ export default function MemberManagement() { const [addOpen, setAddOpen] = useState(false) const [form] = Form.useForm() + const { data: usersData } = useQuery({ queryKey: ['users', 'list'], queryFn: (): Promise => api.get('/admin-api/users') }) const { data: memberships } = useQuery({ queryKey: ['users', 'memberships'], queryFn: (): Promise => api.get('/admin-api/users/memberships') }) const { data: deletions } = useQuery({ queryKey: ['users', 'deletions'], queryFn: (): Promise => 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) => {v} }, + { title: '状态', dataIndex: 'status', width: 80, render: (v: string) => v === 'active' ? 正常 : {v} }, + { 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 = [ { title: '用户ID', dataIndex: 'userId', width: 160, ellipsis: true }, { title: '计划', dataIndex: ['plan', 'name'], width: 120, render: (_: any, r: any) => r.plan?.name || '-' }, @@ -66,6 +76,10 @@ export default function MemberManagement() { , + }, { key: 'membership', label: '会员管理', children: , diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 3b0aaf0..ef2e242 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -4,6 +4,7 @@ import type { AdminRole } from '@/types/admin' const Dashboard = lazy(() => import('@/pages/Dashboard')) const TaskAssistant = lazy(() => import('@/pages/TaskAssistant')) const UserManagement = lazy(() => import('@/pages/UserManagement')) +const MemberManagement = lazy(() => import('@/pages/MemberManagement')) export interface RouteConfig { path: string @@ -17,7 +18,7 @@ export const routeConfig: RouteConfig[] = [ { path: '/assistant', title: '任务助理', element: TaskAssistant }, { path: '/users', title: '用户管理', element: UserManagement, requiredRole: '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: '/knowledge/bases', title: '知识库列表', element: UserManagement }, { path: '/knowledge/sources', title: '知识源列表', element: UserManagement },