From 99550a2a9d94a5db81966ea636a27441f3015068 Mon Sep 17 00:00:00 2001 From: hailin Date: Sun, 11 Jan 2026 19:15:55 -0800 Subject: [PATCH] =?UTF-8?q?fix(mining-admin-web):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=88=97=E8=A1=A8API=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=B8=8D=E5=8C=B9=E9=85=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加transformUserOverview和transformUserDetail函数 - 转换后端返回格式(data/pagination)到前端期望格式(items) - 修复keyword到search的参数名转换 - 解决React hydration错误和数据不显示问题 Co-Authored-By: Claude Opus 4.5 --- .../src/features/users/api/users.api.ts | 67 ++++++++++++++++++- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/frontend/mining-admin-web/src/features/users/api/users.api.ts b/frontend/mining-admin-web/src/features/users/api/users.api.ts index 05e5ac7b..79f1ad12 100644 --- a/frontend/mining-admin-web/src/features/users/api/users.api.ts +++ b/frontend/mining-admin-web/src/features/users/api/users.api.ts @@ -11,15 +11,76 @@ import type { } from '@/types/user'; import type { PaginatedResponse, PaginationParams } from '@/types/api'; +// 转换后端用户数据到前端 UserOverview 格式 +function transformUserOverview(backendUser: any): UserOverview { + return { + accountSequence: backendUser.accountSequence, + nickname: backendUser.realName || backendUser.nickname || '', + phone: backendUser.phone || '', + phoneNumberMasked: backendUser.phone, + avatar: null, + hasAdopted: backendUser.contribution?.hasAdopted || false, + totalContribution: backendUser.contribution?.totalContribution || '0', + effectiveContribution: backendUser.contribution?.effectiveContribution || '0', + miningBalance: backendUser.mining?.availableBalance || '0', + tradingBalance: backendUser.trading?.shareBalance || '0', + frozenBalance: '0', + personalAdoptions: 0, + teamAdoptions: 0, + referrerId: null, + status: backendUser.status?.toLowerCase() as 'active' | 'frozen' | 'deactivated', + isOnline: false, + createdAt: backendUser.createdAt, + }; +} + +// 转换后端用户详情到前端 UserDetail 格式 +function transformUserDetail(backendUser: any): UserDetail { + return { + ...transformUserOverview(backendUser), + referrerAccountSequence: null, + directReferralCount: backendUser.contribution?.directReferralCount || 0, + directReferralAdoptedCount: 0, + teamSize: 0, + teamAdoptedCount: 0, + contributions: { + personal: backendUser.contribution?.personalContribution || '0', + systemOperation: '0', + systemProvince: '0', + systemCity: '0', + teamLevel: backendUser.contribution?.teamLevelContribution || '0', + teamBonus: backendUser.contribution?.teamBonusContribution || '0', + total: backendUser.contribution?.totalContribution || '0', + }, + kycStatus: backendUser.kycStatus, + registeredAt: backendUser.createdAt, + }; +} + export const usersApi = { getList: async (params: PaginationParams & { keyword?: string }): Promise> => { - const response = await apiClient.get('/users', { params }); - return response.data.data; + // 转换参数名: keyword -> search + const apiParams = { + page: params.page, + pageSize: params.pageSize, + search: params.keyword, + }; + const response = await apiClient.get('/users', { params: apiParams }); + // 后端返回格式: { data: [...], pagination: { page, pageSize, total, totalPages } } + // 前端期望格式: { items: [...], total, page, pageSize, totalPages } + const result = response.data.data; + return { + items: (result.data || []).map((user: any) => transformUserOverview(user)), + total: result.pagination?.total || 0, + page: result.pagination?.page || 1, + pageSize: result.pagination?.pageSize || 20, + totalPages: result.pagination?.totalPages || 0, + }; }, getDetail: async (accountSequence: string): Promise => { const response = await apiClient.get(`/users/${accountSequence}`); - return response.data.data; + return transformUserDetail(response.data.data); }, getContributionRecords: async (