feat(admin): 新增商品配置与系统公告两个后台页面

- src/api/admin/product.ts、src/api/admin/notice.ts 对齐后端新接口
- ProductManagementView:列表/筛选/新建编辑/上下架/删除,新建默认下架有提示
- NoticeManagementView:列表/筛选/新建编辑/发布下架/删除
- 状态列一律用接口返回的 statusText,不在前端写死中文
- id 按字符串处理(雪花 id 超过 JS 安全整数范围,数字会被四舍五入)
This commit is contained in:
Vicky committed 2026-10-16 16:33:22 +08:00
1 parent 1148458ca1
commit db313f4aa6
4 files changed
+968

No files matched your search

+66
View File
@@ -0,0 +1,66 @@
// Author: fruit.com.cn
import request from '@/axios'
import type { PageResult } from './types'
/** 系统公告:字段与 /admin/notices 的响应一一对应 */
export interface NoticeItem {
/** 雪花 id,后端以字符串下发(超过 JS 安全整数范围),原样回传即可 */
id: string
title: string
content: string
/** ALL / USER / CREATOR */
target: string
targetText: string
/** SYSTEM / AUDIT / PAYMENT / ACTIVITY */
type: string
typeText: string
/** 1 已发布 / 0 已下架 */
status: number
statusText: string
publishAt?: string
expireAt?: string
createdAt?: string
}
export interface NoticePageParams {
pageIndex?: number
pageSize?: number
status?: number
target?: string
type?: string
keyword?: string
}
export interface NoticeSaveData {
title: string
content: string
target: string
type: string
publishAt?: string | null
expireAt?: string | null
}
export const pageNoticesApi = (params: NoticePageParams) => {
return request.get<PageResult<NoticeItem>>({ url: '/admin/notices/page', params })
}
export const getNoticeApi = (id: string | number) => {
return request.get<NoticeItem>({ url: `/admin/notices/${id}` })
}
export const createNoticeApi = (data: NoticeSaveData) => {
return request.post<string>({ url: '/admin/notices', data })
}
export const updateNoticeApi = (id: string | number, data: NoticeSaveData) => {
return request.put<void>({ url: `/admin/notices/${id}`, data })
}
export const updateNoticeStatusApi = (id: string | number, status: number) => {
return request.put<void>({ url: `/admin/notices/${id}/status`, params: { status } })
}
export const deleteNoticeApi = (id: string | number) => {
return request.delete<void>({ url: `/admin/notices/${id}` })
}
+85
View File
@@ -0,0 +1,85 @@
// Author: fruit.com.cn
import request from '@/axios'
import type { PageResult } from './types'
/** 商品(金币包):字段与 /admin/products 的响应一一对应 */
export interface ProductItem {
/** 雪花 id,后端以字符串下发(超过 JS 安全整数范围),原样回传即可 */
id: string
code: string
name: string
/** COIN_PACK / VIP */
type: string
typeText: string
/** ALL / GOOGLE / APPLE */
platform: string
storeProductId: string
coinAmount: number
bonusCoin: number
/** coinAmount + bonusCoin,服务端算好,前端不再自己加 */
totalCoin: number
priceAmount: number
currency: string
displayPrice: string
regionCodes: string
vipDays: number
sort: number
/** 1 已上架 / 0 已下架 */
status: number
statusText: string
effectiveAt?: string
expireAt?: string
createdAt?: string
}
export interface ProductPageParams {
pageIndex?: number
pageSize?: number
type?: string
status?: number
platform?: string
keyword?: string
}
export interface ProductSaveData {
code: string
name: string
type: string
platform: string
storeProductId: string
coinAmount: number
bonusCoin: number
priceAmount: number
currency: string
displayPrice: string
regionCodes: string
vipDays: number
sort: number
effectiveAt?: string | null
expireAt?: string | null
}
export const pageProductsApi = (params: ProductPageParams) => {
return request.get<PageResult<ProductItem>>({ url: '/admin/products/page', params })
}
export const getProductApi = (id: string | number) => {
return request.get<ProductItem>({ url: `/admin/products/${id}` })
}
export const createProductApi = (data: ProductSaveData) => {
return request.post<string>({ url: '/admin/products', data })
}
export const updateProductApi = (id: string | number, data: ProductSaveData) => {
return request.put<void>({ url: `/admin/products/${id}`, data })
}
export const updateProductStatusApi = (id: string | number, status: number) => {
return request.put<void>({ url: `/admin/products/${id}/status`, params: { status } })
}
export const deleteProductApi = (id: string | number) => {
return request.delete<void>({ url: `/admin/products/${id}` })
}