mockData.js
8.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
/**
* @Description: Mock 数据生成工具 - 用于测试地图活动功能
* @Date: 2026-02-09
*
* 支持的 API Mock:
* - listAPI: 地图活动列表
* - detailAPI: 地图活动详情
* - isCheckedAPI: 是否已打卡
* - posterAPI: 获取海报
*/
// ============================================================================
// 工具函数
// ============================================================================
/**
* 随机图片 URL 生成器
* @param {number} width - 图片宽度
* @param {number} height - 图片高度
* @param {number} seed - 随机种子
* @returns {string} 图片 URL
*/
function randomImage(width = 400, height = 300, seed = 1) {
return `https://picsum.photos/${width}/${height}?random=${seed}`
}
/**
* 模拟网络延迟
* @param {number} min - 最小延迟(ms)
* @param {number} max - 最大延迟(ms)
* @returns {Promise}
*/
function mockDelay(min = 100, max = 300) {
const delay = Math.random() * (max - min) + min
return new Promise(resolve => setTimeout(resolve, delay))
}
// ============================================================================
// 1. 地图活动列表 Mock (listAPI)
// ============================================================================
const ACTIVITY_NAMES = [
'重阳登高打卡',
'公园晨跑打卡',
'社区健身打卡',
'周末徒步打卡',
'秋日赏菊打卡',
'古镇文化打卡',
'健康骑行活动',
'亲子运动会',
'户外拓展训练',
'城市定向挑战',
]
/**
* 生成地图活动列表项
* @param {number} id - 活动 ID
* @returns {Object} 活动对象
*/
function generateMapActivityItem(id) {
const activityName = ACTIVITY_NAMES[Math.floor(Math.random() * ACTIVITY_NAMES.length)]
const now = new Date()
const startDate = new Date(now.getTime() + Math.random() * 30 * 24 * 60 * 60 * 1000)
const endDate = new Date(startDate.getTime() + (30 + Math.random() * 60) * 24 * 60 * 60 * 1000)
// 格式化日期为 YYYY.MM.DD
const formatDate = date => {
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
return `${year}.${month}.${day}`
}
return {
id: String(id),
tittle: activityName,
cover: randomImage(400, 300, id),
begin_date: formatDate(startDate),
end_date: formatDate(endDate),
url: '',
}
}
/**
* Mock: listAPI (地图活动列表)
* @param {Object} params - 请求参数
* @returns {Promise<{code: number, msg: string, data: Array}>}
*/
export async function mockMapActivityListAPI() {
await mockDelay()
const list = []
const total = 6
for (let i = 0; i < total; i++) {
list.push(generateMapActivityItem(i + 1))
}
console.log(`[Mock] listAPI - 地图活动列表,共${list.length}条`)
return {
code: 1,
msg: 'success',
data: list,
}
}
// ============================================================================
// 2. 地图活动详情 Mock (detailAPI)
// ============================================================================
/**
* Mock: detailAPI (地图活动详情)
* @param {Object} params - 请求参数
* @param {string} params.id - 活动 ID
* @returns {Promise<{code: number, msg: string, data: Object}>}
*/
export async function mockMapActivityDetailAPI(params) {
await mockDelay()
const { id } = params
const item = generateMapActivityItem(parseInt(id) || 1)
console.log(`[Mock] detailAPI - 活动详情,ID:${id}`)
return {
code: 1,
msg: 'success',
data: {
...item,
url: 'https://example.com/map',
is_ended: false,
is_begin: true,
first_checkin_points: 10,
required_checkin_count: 5,
complete_points: 50,
discount_title: '打卡点优惠信息',
},
}
}
// ============================================================================
// 3. 是否已打卡 Mock (isCheckedAPI)
// ============================================================================
/**
* Mock: isCheckedAPI (是否已打卡)
* @param {Object} params - 请求参数
* @param {string} params.detail_id - 打卡点 ID
* @returns {Promise<{code: number, msg: string, data: Object}>}
*/
export async function mockIsCheckedAPI(params) {
await mockDelay()
const { detail_id } = params
const isChecked = parseInt(detail_id) % 3 === 0
console.log(`[Mock] isCheckedAPI - 打卡点${detail_id},${isChecked ? '已打卡' : '未打卡'}`)
return {
code: 1,
msg: 'success',
data: {
is_checked: isChecked,
},
}
}
// ============================================================================
// 4. 获取海报 Mock (posterAPI)
// ============================================================================
/**
* Mock: posterAPI (获取海报)
* @param {Object} params - 请求参数
* @param {string} params.activity_id - 活动 ID
* @returns {Promise<{code: number, msg: string, data: Object}>}
*/
export async function mockPosterAPI(params) {
await mockDelay()
const { activity_id } = params
console.log(`[Mock] posterAPI - 获取海报,活动ID:${activity_id}`)
return {
code: 1,
msg: 'success',
data: {
details: [
{
id: 1,
name: '起点打卡',
background_url: randomImage(750, 1200, 20),
main_slogan: '开启健康之旅',
sub_slogan: '坚持就是胜利',
is_checked: true,
},
{
id: 2,
name: '山顶打卡',
background_url: randomImage(750, 1200, 21),
main_slogan: '登高望远',
sub_slogan: '风景这边独好',
is_checked: false,
},
],
family: {
id: 123,
name: '快乐家庭',
avatar_url: randomImage(200, 200, 30),
},
show_detail_index: 0,
end_date: '2025.10.31',
qrcode_url: 'https://example.com/qrcode.jpg',
title: '重阳登高打卡',
begin_date: '2025.09.06',
},
}
}
// ============================================================================
// 导出统一 Mock API 调用器
// ============================================================================
/**
* Mock API 调用器
* @param {string} apiName - API 名称
* @param {Object} params - 请求参数
* @returns {Promise}
*/
export async function mockAPI(apiName, params) {
switch (apiName) {
case 'listAPI':
return await mockMapActivityListAPI(params)
case 'detailAPI':
return await mockMapActivityDetailAPI(params)
case 'isCheckedAPI':
return await mockIsCheckedAPI(params)
case 'posterAPI':
return await mockPosterAPI(params)
default:
console.warn(`[Mock] 未知的 API: ${apiName}`)
return { code: 0, msg: 'Unknown API', data: null }
}
}
/**
* Mock 地图活动详情数据
* @param {string} activityId - 活动 ID
* @returns {Object} 地图活动详情
*/
export const mockMapActivityDetail = () => {
return {
url: 'https://example.com/map',
id: '1',
cover: randomImage(750, 500, 10),
tittle: '重阳登高打卡',
begin_date: '2025.09.06',
end_date: '2025.10.31',
is_ended: false,
is_begin: true,
first_checkin_points: 10,
required_checkin_count: 5,
complete_points: 50,
discount_title: '打卡点优惠信息',
}
}
/**
* Mock 是否已打卡数据
* @param {string} detailId - 打卡点 ID
* @returns {boolean} 是否已打卡
*/
export const mockIsChecked = detailId => {
// 偶尔返回已打卡
return parseInt(detailId) % 3 === 0
}
/**
* Mock 海报数据
* @param {string} activityId - 活动 ID
* @returns {Object} 海报数据
*/
export const mockPoster = activityId => {
return {
details: [
{
id: 1,
name: '起点打卡',
background_url: randomImage(750, 1200, 20),
main_slogan: '开启健康之旅',
sub_slogan: '坚持就是胜利',
is_checked: true,
},
{
id: 2,
name: '山顶打卡',
background_url: randomImage(750, 1200, 21),
main_slogan: '登高望远',
sub_slogan: '风景这边独好',
is_checked: false,
},
],
family: {
id: 123,
name: '快乐家庭',
avatar_url: randomImage(200, 200, 30),
},
show_detail_index: 0,
end_date: '2025.10.31',
qrcode_url: 'https://example.com/qrcode.jpg',
title: '重阳登高打卡',
begin_date: '2025.09.06',
}
}