fix(mining-admin-web): 修复用户列表API响应格式不匹配问题

- 添加transformUserOverview和transformUserDetail函数
- 转换后端返回格式(data/pagination)到前端期望格式(items)
- 修复keyword到search的参数名转换
- 解决React hydration错误和数据不显示问题

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-11 19:15:55 -08:00
parent 3fe4f82906
commit 99550a2a9d
1 changed files with 64 additions and 3 deletions

View File

@ -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<PaginatedResponse<UserOverview>> => {
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<UserDetail> => {
const response = await apiClient.get(`/users/${accountSequence}`);
return response.data.data;
return transformUserDetail(response.data.data);
},
getContributionRecords: async (