blob: 25c1d9a909df86c026192c3925976aabf16e6721 [file] [log] [blame]
// service.ts - 活动系统服务层文件
import { request } from '@umijs/max';
import type {
GetActivityListResponse,
GetLeaderboardResponse,
ParticipateActivityResponse,
ActivityListParams,
LeaderboardParams,
SysActivity,
LeaderboardEntry,
StandardizedActivityListResponse,
StandardizedLeaderboardResponse
} from './data';
// 开发环境模拟数据开关
const USE_MOCK = process.env.NODE_ENV === 'development' && false;
// 模拟活动数据 - 适配后端格式
const mockActivities: SysActivity[] = [
{
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
activityId: 1,
activityName: '新手上传挑战',
rewardBonus: 100,
conditionValue: '10GB',
startTime: '2025-06-01T00:00:00.000+08:00',
endTime: '2025-06-30T23:59:59.000+08:00',
status: 1,
activityType: 'UPLOAD'
},
{
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
activityId: 2,
activityName: '种子下载任务',
rewardBonus: 50,
conditionValue: '94',
startTime: '2025-06-01T00:00:00.000+08:00',
endTime: '2025-06-15T23:59:59.000+08:00',
status: 1,
activityType: 'DOWNLOAD'
}
];
// 模拟排行榜数据
const mockLeaderboard: LeaderboardEntry[] = [
{ userId: 1, userName: 'user001', score: 1500 },
{ userId: 2, userName: 'user002', score: 1200 },
{ userId: 3, userName: 'user003', score: 1000 }
];
/**
* 时间格式转换工具函数
* 将 ISO 8601 格式转换为显示格式
*/
export function formatDateTime(isoString: string): string {
const date = new Date(isoString);
return date.toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
}).replace(/\//g, '-');
}
/**
* 数据格式标准化函数
* 将后端返回格式转换为前端组件期望的格式
*/
function normalizeActivityListResponse(
backendResponse: GetActivityListResponse,
params?: ActivityListParams
): StandardizedActivityListResponse {
return {
code: backendResponse.code === 200 ? 0 : backendResponse.code, // 后端成功码是200,前端期望0
msg: backendResponse.msg,
data: {
list: backendResponse.rows,
total: backendResponse.total,
pageSize: params?.pageSize || 10,
current: params?.pageNum || 1,
}
};
}
function normalizeLeaderboardResponse(
backendResponse: GetLeaderboardResponse,
params?: LeaderboardParams
): StandardizedLeaderboardResponse {
return {
code: backendResponse.code === 200 ? 0 : backendResponse.code,
msg: backendResponse.msg,
data: {
list: backendResponse.rows,
total: backendResponse.total,
pageSize: params?.pageSize || 10,
current: params?.pageNum || 1,
}
};
}
/**
* 获取活动列表
*/
export async function getActivityList(params?: ActivityListParams): Promise<StandardizedActivityListResponse> {
if (USE_MOCK) {
let filteredList = mockActivities;
// 按状态筛选
if (params?.status !== undefined) {
filteredList = filteredList.filter(item => item.status === params.status);
}
// 按活动类型筛选
if (params?.activityType) {
filteredList = filteredList.filter(item => item.activityType === params.activityType);
}
// 按活动名称搜索
if (params?.activityName) {
filteredList = filteredList.filter(item =>
item.activityName.includes(params.activityName!)
);
}
// 模拟后端返回格式
const mockBackendResponse: GetActivityListResponse = {
total: filteredList.length,
rows: filteredList,
code: 200,
msg: '查询成功'
};
return normalizeActivityListResponse(mockBackendResponse, params);
}
try {
// 调用实际后端接口
const response: GetActivityListResponse = await request('/api/system/activity/list', {
method: 'GET',
params: {
pageNum: params?.pageNum,
pageSize: params?.pageSize,
activityName: params?.activityName,
activityType: params?.activityType,
status: params?.status,
},
});
// 标准化响应格式
return normalizeActivityListResponse(response, params);
} catch (error) {
console.error('获取活动列表失败:', error);
throw error;
}
}
/**
* 参与活动
*/
export async function participateActivity(activityId: number): Promise<ParticipateActivityResponse> {
if (USE_MOCK) {
return Promise.resolve({
code: 0,
msg: '参与成功',
data: null,
});
}
try {
return await request(`/api/system/activity/participate/${activityId}`, {
method: 'POST',
});
} catch (error) {
console.error('参与活动失败:', error);
throw error;
}
}
/**
* 获取排行榜
*/
export async function getLeaderboard(params?: LeaderboardParams): Promise<StandardizedLeaderboardResponse> {
if (USE_MOCK) {
const mockBackendResponse: GetLeaderboardResponse = {
total: mockLeaderboard.length,
rows: mockLeaderboard,
code: 200,
msg: '查询成功'
};
return normalizeLeaderboardResponse(mockBackendResponse, params);
}
try {
const response: GetLeaderboardResponse = await request('/api/system/activity/leaderboard', {
method: 'GET',
params: {
pageNum: params?.pageNum,
pageSize: params?.pageSize,
},
});
return normalizeLeaderboardResponse(response, params);
} catch (error) {
console.error('获取排行榜失败:', error);
throw error;
}
}