feat: 前端基础设施更新 - API模块、路由、状态管理和工具类
- 新增 address/admin/favorite/review API 模块 - 更新已有 API 模块适配后端接口变更 - 新增 admin 类型定义和工具函数 - 添加静态资源文件 - 更新路由配置和守卫逻辑 - 更新 Vite 配置和依赖锁文件
This commit is contained in:
@@ -1,20 +1,51 @@
|
||||
import { request } from '../request'
|
||||
import type { ApiResponse, FlashSale, PageParams, PageResponse } from '@/types/api'
|
||||
import { mapOrderStatus, normalizeFlashSale, normalizePage } from '@/utils/normalizers'
|
||||
|
||||
const flashSaleStatusToCode = (status?: string) => {
|
||||
if (status === 'UPCOMING') return 1
|
||||
if (status === 'ACTIVE') return 2
|
||||
if (status === 'ENDED') return 3
|
||||
return undefined
|
||||
}
|
||||
|
||||
const flashSaleSortField = (sort?: string) => {
|
||||
if (sort === 'flashPrice') return 'flashPrice'
|
||||
if (sort === 'endTime') return 'endTime'
|
||||
return 'startTime'
|
||||
}
|
||||
|
||||
export const flashsaleApi = {
|
||||
// 获取秒杀活动列表
|
||||
getList(params?: PageParams & { status?: string }): Promise<ApiResponse<PageResponse<FlashSale>>> {
|
||||
return request.get('/api/flashsale/list', params)
|
||||
return request.post<ApiResponse<Record<string, any>>>('/api/flashsale/list', {
|
||||
status: flashSaleStatusToCode(params?.status),
|
||||
page: params?.page ?? 0,
|
||||
size: params?.size ?? 10,
|
||||
sortBy: flashSaleSortField(params?.sort),
|
||||
sortDirection: params?.order || 'asc',
|
||||
}).then((res) => ({
|
||||
...res,
|
||||
data: normalizePage(res.data, normalizeFlashSale),
|
||||
}))
|
||||
},
|
||||
|
||||
// 获取正在进行的秒杀活动
|
||||
getActive(limit?: number): Promise<ApiResponse<FlashSale[]>> {
|
||||
return request.get('/api/flashsale/active', { limit })
|
||||
return request.get<ApiResponse<any[]>>('/api/flashsale/active').then((res) => ({
|
||||
...res,
|
||||
data: (Array.isArray(res.data) ? res.data : [])
|
||||
.map((item) => normalizeFlashSale(item))
|
||||
.slice(0, limit ?? Number.MAX_SAFE_INTEGER),
|
||||
}))
|
||||
},
|
||||
|
||||
// 获取秒杀活动详情
|
||||
getDetail(id: number): Promise<ApiResponse<FlashSale>> {
|
||||
return request.get(`/api/flashsale/${id}`)
|
||||
return request.get<ApiResponse<any>>(`/api/flashsale/${id}`).then((res) => ({
|
||||
...res,
|
||||
data: normalizeFlashSale(res.data),
|
||||
}))
|
||||
},
|
||||
|
||||
// 参与秒杀
|
||||
@@ -23,12 +54,33 @@ export const flashsaleApi = {
|
||||
quantity: number;
|
||||
timestamp?: number;
|
||||
}): Promise<ApiResponse<{ orderId: number }>> {
|
||||
return request.post('/api/flashsale/participate', data)
|
||||
return request.post<ApiResponse<any>>('/api/flashsale/participate', data).then((res) => ({
|
||||
...res,
|
||||
data: {
|
||||
orderId: Number(res.data?.orderId || res.data?.id || 0),
|
||||
},
|
||||
}))
|
||||
},
|
||||
|
||||
// 获取用户参与记录
|
||||
getUserRecords(): Promise<ApiResponse<any[]>> {
|
||||
return request.get('/api/flashsale/user-records')
|
||||
return request.post<ApiResponse<Record<string, any>>>('/api/order/my-orders', {
|
||||
orderType: 2,
|
||||
page: 0,
|
||||
size: 100,
|
||||
sortBy: 'createdAt',
|
||||
sortDirection: 'desc',
|
||||
}).then((res) => {
|
||||
const content = Array.isArray(res.data?.content) ? res.data.content : []
|
||||
return {
|
||||
...res,
|
||||
data: content.map((item: Record<string, any>) => ({
|
||||
id: item.id,
|
||||
success: mapOrderStatus(item.status) !== 'CANCELLED',
|
||||
status: item.status,
|
||||
})),
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 检查用户是否可以参与
|
||||
@@ -37,6 +89,70 @@ export const flashsaleApi = {
|
||||
reason?: string;
|
||||
remainingQuota?: number;
|
||||
}>> {
|
||||
return request.get(`/api/flashsale/${flashSaleId}/check-eligibility`)
|
||||
return this.getDetail(flashSaleId).then((res) => {
|
||||
const eligible = res.data.status === 'ACTIVE' && res.data.remainingStock > 0
|
||||
return {
|
||||
code: 0,
|
||||
success: true,
|
||||
message: '检查成功',
|
||||
data: {
|
||||
eligible,
|
||||
reason: eligible ? '' : '活动未开始、已结束或库存不足',
|
||||
remainingQuota: res.data.limitPerUser,
|
||||
},
|
||||
}
|
||||
})
|
||||
},
|
||||
}
|
||||
|
||||
create(data: {
|
||||
productId: number
|
||||
flashPrice: number
|
||||
flashStock: number
|
||||
startTime: string
|
||||
endTime: string
|
||||
}): Promise<ApiResponse<FlashSale>> {
|
||||
return request.post<ApiResponse<any>>('/api/flashsale/create', data).then((res) => ({
|
||||
...res,
|
||||
data: normalizeFlashSale(res.data),
|
||||
}))
|
||||
},
|
||||
|
||||
update(id: number, data: Record<string, unknown>): Promise<ApiResponse<FlashSale>> {
|
||||
return request.put<ApiResponse<any>>(`/api/flashsale/${id}`, data).then((res) => ({
|
||||
...res,
|
||||
data: normalizeFlashSale(res.data),
|
||||
}))
|
||||
},
|
||||
|
||||
delete(id: number): Promise<ApiResponse> {
|
||||
return request.delete(`/api/flashsale/${id}`)
|
||||
},
|
||||
|
||||
publish(id: number): Promise<ApiResponse<FlashSale>> {
|
||||
return request.post<ApiResponse<any>>(`/api/flashsale/${id}/publish`).then((res) => ({
|
||||
...res,
|
||||
data: normalizeFlashSale(res.data),
|
||||
}))
|
||||
},
|
||||
|
||||
pause(id: number): Promise<ApiResponse<FlashSale>> {
|
||||
return request.post<ApiResponse<any>>(`/api/flashsale/${id}/pause`).then((res) => ({
|
||||
...res,
|
||||
data: normalizeFlashSale(res.data),
|
||||
}))
|
||||
},
|
||||
|
||||
resume(id: number): Promise<ApiResponse<FlashSale>> {
|
||||
return request.post<ApiResponse<any>>(`/api/flashsale/${id}/resume`).then((res) => ({
|
||||
...res,
|
||||
data: normalizeFlashSale(res.data),
|
||||
}))
|
||||
},
|
||||
|
||||
end(id: number): Promise<ApiResponse<FlashSale>> {
|
||||
return request.post<ApiResponse<any>>(`/api/flashsale/${id}/end`).then((res) => ({
|
||||
...res,
|
||||
data: normalizeFlashSale(res.data),
|
||||
}))
|
||||
},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user