将 web-admin 从子模块改为仓库内普通目录,便于单仓克隆与维护。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-05-12 16:41:08 +08:00
1 parent 2e9d020d50
commit c87732fcd5
515 files changed
+74372 -1

No files matched your search

+825
View File
@@ -0,0 +1,825 @@
import request from '@/utils/http'
/**
* 获取用户列表
*/
export function fetchUserList(params: {
page?: number
pageSize?: number
keyword?: string
role?: string
roleIn?: string
regionId?: string
isActive?: boolean
}) {
return request.get<{
list: Api.User.UserItem[]
total: number
page: number
pageSize: number
totalPages: number
}>({
url: '/web/admin/users',
params
})
}
/**
* 获取用户详情
*/
export function fetchUserDetail(id: string) {
return request.get<Api.User.UserDetail>({
url: `/web/admin/users/${id}`
})
}
/**
* 创建用户
*/
export function fetchCreateUser(data: {
username: string
password: string
realName: string
phone?: string
role: string
regionId?: string
regionIds?: string[]
avatarUrl?: string | null
}) {
return request.post({
url: '/web/admin/users',
data
})
}
/**
* 更新用户
*/
export function fetchUpdateUser(id: string, data: Partial<{
realName: string
phone?: string
role: string
regionId?: string
regionIds?: string[]
isActive: boolean
avatarUrl?: string | null
}>) {
return request.put({
url: `/web/admin/users/${id}`,
params: data
})
}
/**
* 可授权菜单 code 列表
*/
export function fetchAssignableMenuCodes() {
return request.get<{
list: Array<{
id: string
code: string
name: string
parentId?: string
sortOrder?: number
}>
}>({
url: '/web/admin/menus/assignable-codes'
})
}
/**
* 获取用户菜单授权
*/
export function fetchUserMenuScopes(userId: string) {
return request.get<{
userId: string
menuCodes: string[]
}>({
url: `/web/admin/users/${userId}/menu-scopes`
})
}
/**
* 更新用户菜单授权(全量覆盖)
*/
export function fetchUpdateUserMenuScopes(userId: string, menuCodes: string[]) {
return request.post({
url: `/web/admin/users/${userId}/menu-scopes`,
data: { menuCodes }
})
}
/**
* 删除用户
*/
export function fetchDeleteUser(id: string) {
return request.del({
url: `/web/admin/users/${id}`
})
}
/**
* 重置用户密码
*/
export function fetchResetPassword(id: string) {
return request.post({
url: `/web/admin/users/${id}/reset-password`
})
}
/**
* 修改用户密码
*/
export function fetchChangePassword(data: {
oldPassword: string
newPassword: string
}) {
return request.post({
url: '/web/admin/users/change-password',
params: data
})
}
/**
* 获取区域列表
*/
export function fetchRegionList(params?: {
page?: number
pageSize?: number
keyword?: string
isActive?: boolean
}) {
return request.get<{
list: Api.Region.RegionItem[]
total: number
page: number
pageSize: number
totalPages: number
}>({
url: '/web/admin/regions',
params
})
}
/**
* 获取启用的区域列表
*/
export function fetchActiveRegions() {
// 简单缓存:区域列表变化频率低,避免页面间重复请求导致“区域加载慢”
// 5 分钟 TTL;需要实时刷新时可在调用方自行绕过(后续可升级为 Pinia store)
const now = Date.now()
const anyFn = fetchActiveRegions as any
const cache = anyFn.__cache as undefined | { ts: number; data: Api.Region.RegionItem[] }
if (cache && now - cache.ts < 5 * 60 * 1000) return Promise.resolve(cache.data)
return request.get<Api.Region.RegionItem[]>({
url: '/web/admin/regions/active'
}).then((data) => {
anyFn.__cache = { ts: now, data: data || [] }
return data
})
}
/**
* 获取所有未删除的区域(包含禁用态 isActive=0)
* 用于后台各模块“区域 tab”展示全量范围。
*/
export async function fetchNotDeletedRegions() {
const now = Date.now()
const anyFn = fetchNotDeletedRegions as any
const cache = anyFn.__cache as undefined | { ts: number; data: Api.Region.RegionItem[] }
if (cache && now - cache.ts < 5 * 60 * 1000) return cache.data
// 注意:后端 `GET /web/admin/regions` 的 pageSize 有上限(<=100),不能一次性拉太大。
const pageSize = 100
const all: Api.Region.RegionItem[] = []
let page = 1
while (true) {
const res: any = await fetchRegionList({ page, pageSize })
const list: Api.Region.RegionItem[] = Array.isArray(res?.list) ? res.list : []
all.push(...list)
const total = Number(res?.total ?? 0)
// 没有更多数据:直接退出(避免死循环)
if (!total || all.length >= total || list.length < pageSize) break
page++
}
anyFn.__cache = { ts: now, data: all }
return all
}
/**
* 获取区域详情
*/
export function fetchRegionDetail(id: string) {
return request.get<Api.Region.RegionDetail>({
url: `/web/admin/regions/${id}`
})
}
/**
* 创建区域
*/
export function fetchCreateRegion(data: {
name: string
code: string
description?: string
sortOrder?: number
/** 预计配送时长(分钟) */
expectedDeliveryMinutes?: number | null
/** 计划到货前未送达时预警提前时间(分钟) */
deliveryWarnAdvanceMinutes?: number | null
}) {
return request.post({
url: '/web/admin/regions',
params: data
})
}
/**
* 更新区域
*/
export function fetchUpdateRegion(id: string, data: Partial<{
name: string
code: string
description?: string
sortOrder?: number
isActive?: boolean
expectedDeliveryMinutes?: number | null
deliveryWarnAdvanceMinutes?: number | null
}>) {
return request.put({
url: `/web/admin/regions/${id}`,
params: data
})
}
/**
* 删除区域
*/
export function fetchDeleteRegion(id: string) {
return request.del({
url: `/web/admin/regions/${id}`
})
}
/**
* 获取商品分类列表
*/
export function fetchCategoryList(params?: {
page?: number
pageSize?: number
keyword?: string
isActive?: boolean
}) {
return request.get<{
list: Api.Category.CategoryItem[]
total: number
page: number
pageSize: number
totalPages: number
}>({
url: '/web/admin/categories',
params
})
}
/**
* 获取商品分类树
*/
export function fetchCategoryTree() {
return request.get<any[]>({
url: '/web/admin/categories/tree'
})
}
/**
* 创建商品分类
*/
export function fetchCreateCategory(data: {
name: string
parentId?: string
sortOrder?: number
imageUrl?: string
/** 价格系数,百分比点数(如 5 表示 5%) */
priceCoefficient?: number
}) {
return request.post({
url: '/web/admin/categories',
params: data
})
}
/**
* 更新商品分类
*/
export function fetchUpdateCategory(id: string, data: Partial<{
name: string
parentId?: string
sortOrder?: number
isActive?: boolean
imageUrl?: string
priceCoefficient?: number
}>) {
return request.put({
url: `/web/admin/categories/${id}`,
params: data
})
}
/**
* 删除商品分类
*/
export function fetchDeleteCategory(id: string) {
return request.del({
url: `/web/admin/categories/${id}`
})
}
/**
* 上传商品分类图片(MinIO)并返回图片URL
*/
export function fetchUploadCategoryImage(data: FormData) {
return request.post({
url: '/web/admin/categories/upload-image',
data
})
}
/** 上传用户头像,返回 MinIO 等存储后的 URL,供写入 avatarUrl */
export function fetchUploadUserAvatar(data: FormData) {
return request.post<{ url: string }>({
url: '/web/admin/users/upload-avatar',
data
})
}
/**
* 获取商品单位列表
*/
export function fetchUnitList(params?: {
page?: number
pageSize?: number
keyword?: string
isActive?: boolean
}) {
return request.get<{
list: Api.Unit.UnitItem[]
total: number
page: number
pageSize: number
totalPages: number
}>({
url: '/web/admin/units',
params
})
}
/**
* 创建商品单位
*/
export function fetchCreateUnit(data: {
name: string
code: string
}) {
return request.post({
url: '/web/admin/units',
params: data
})
}
/**
* 更新商品单位
*/
export function fetchUpdateUnit(id: string, data: Partial<{
name: string
code: string
isActive?: boolean
}>) {
return request.put({
url: `/web/admin/units/${id}`,
params: data
})
}
/**
* 删除商品单位
*/
export function fetchDeleteUnit(id: string) {
return request.del({
url: `/web/admin/units/${id}`
})
}
/**
* 获取商品列表
*/
export function fetchProductList(params?: {
page?: number
pageSize?: number
keyword?: string
categoryId?: string
isActive?: boolean
}) {
return request.get<{
list: Api.Product.ProductItem[]
total: number
page: number
pageSize: number
totalPages: number
}>({
url: '/web/admin/products',
params
})
}
/**
* 获取商品详情
*/
export function fetchProductDetail(id: string) {
return request.get<Api.Product.ProductDetail>({
url: `/web/admin/products/${id}`
})
}
/**
* 商品在各启用区域的当前生效价(来自该区域生效中的价格清单)
*/
export function fetchProductRegionPrices(productId: string) {
return request.get<{
list: Array<{
regionId: string
regionName: string
price: number | null
unitId?: string | null
unitName?: string | null
}>
}>({
url: `/web/admin/products/${productId}/region-prices`
})
}
/**
* 创建商品
*/
export function fetchCreateProduct(data: {
name: string
skuCode?: string
categoryId?: string
unitId?: string
measureValue?: number | null
description?: string
imageUrl?: string
/** 调价系数(%):百分比点数,5 表示 5% */
priceCoefficient?: number
isActive?: boolean
detailContent?: string
}) {
return request.post({
url: '/web/admin/products',
params: data
})
}
/**
* 更新商品
*/
export function fetchUpdateProduct(id: string, data: Partial<{
name: string
skuCode?: string
categoryId?: string
unitId?: string
measureValue?: number | null
description?: string
imageUrl?: string
priceCoefficient?: number
isActive?: boolean
detailContent?: string
}>) {
return request.put({
url: `/web/admin/products/${id}`,
params: data
})
}
/**
* 删除商品
*/
export function fetchDeleteProduct(id: string) {
return request.del({
url: `/web/admin/products/${id}`
})
}
// ========== 商品轮播图 ==========
/**
* 获取商品轮播图列表
*/
export function fetchProductBannerList(productId: string) {
return request.get<{
list: Api.Product.ProductBanner[]
total: number
}>({
url: `/web/admin/product-banners/product/${productId}`
})
}
/**
* 批量添加商品轮播图
*/
export function fetchCreateProductBanners(productId: string, items: Api.Product.ProductBannerCreate[]) {
return request.post({
url: `/web/admin/product-banners/product/${productId}`,
params: items
})
}
/**
* 更新轮播图
*/
export function fetchUpdateProductBanner(id: string, data: Partial<Api.Product.ProductBannerUpdate>) {
return request.put({
url: `/web/admin/product-banners/${id}`,
params: data
})
}
/**
* 更新轮播图排序
*/
export function fetchUpdateProductBannerSort(productId: string, items: { id: string; sortOrder: number }[]) {
return request.put({
url: `/web/admin/product-banners/product/${productId}/sort`,
params: { items }
})
}
/**
* 删除轮播图
*/
export function fetchDeleteProductBanner(id: string) {
return request.del({
url: `/web/admin/product-banners/${id}`
})
}
// ========== 商品详情媒体 ==========
/**
* 获取商品详情媒体列表
*/
export function fetchProductDetailMediaList(productId: string) {
return request.get<{
list: Api.Product.ProductDetailMedia[]
total: number
}>({
url: `/web/admin/product-detail-media/product/${productId}`
})
}
/**
* 批量添加商品详情媒体
*/
export function fetchCreateProductDetailMedia(productId: string, items: Api.Product.ProductDetailMediaCreate[]) {
return request.post({
url: `/web/admin/product-detail-media/product/${productId}`,
params: items
})
}
/**
* 更新详情媒体
*/
export function fetchUpdateProductDetailMedia(id: string, data: Partial<Api.Product.ProductDetailMediaUpdate>) {
return request.put({
url: `/web/admin/product-detail-media/${id}`,
params: data
})
}
/**
* 更新详情媒体排序
*/
export function fetchUpdateProductDetailMediaSort(productId: string, items: { id: string; sortOrder: number }[]) {
return request.put({
url: `/web/admin/product-detail-media/product/${productId}/sort`,
params: { items }
})
}
/**
* 删除详情媒体
*/
export function fetchDeleteProductDetailMedia(id: string) {
return request.del({
url: `/web/admin/product-detail-media/${id}`
})
}
// ========== 商品参数模板 ==========
/**
* 获取参数模板列表
*/
export function fetchProductParameterList(params?: {
page?: number
pageSize?: number
keyword?: string
isActive?: number
}) {
return request.get<{
list: Api.Product.ProductParameter[]
total: number
page: number
pageSize: number
}>({
url: '/web/admin/product-parameters',
params
})
}
/**
* 获取参数模板简洁列表
*/
export function fetchProductParameterSimple() {
return request.get<{
list: Api.Product.ProductParameterSimple[]
total: number
}>({
url: '/web/admin/product-parameters/simple'
})
}
/**
* 获取参数模板详情
*/
export function fetchProductParameterDetail(id: string) {
return request.get<Api.Product.ProductParameter>({
url: `/web/admin/product-parameters/${id}`
})
}
/**
* 创建参数模板
*/
export function fetchCreateProductParameter(data: Api.Product.ProductParameterCreate) {
return request.post({
url: '/web/admin/product-parameters',
params: data
})
}
/**
* 更新参数模板
*/
export function fetchUpdateProductParameter(id: string, data: Partial<Api.Product.ProductParameterUpdate>) {
return request.put({
url: `/web/admin/product-parameters/${id}`,
params: data
})
}
/**
* 删除参数模板
*/
export function fetchDeleteProductParameter(id: string) {
return request.del({
url: `/web/admin/product-parameters/${id}`
})
}
// ========== 分类参数关联 ==========
/**
* 获取分类关联的参数列表
*/
export function fetchCategoryParameters(categoryId: string) {
return request.get<{
list: Api.Product.CategoryParameter[]
total: number
}>({
url: `/web/admin/categories/${categoryId}/parameters`
})
}
/**
* 更新分类关联的参数
*/
export function fetchUpdateCategoryParameters(categoryId: string, items: Api.Product.CategoryParameterCreate[]) {
return request.put({
url: `/web/admin/categories/${categoryId}/parameters`,
params: { items }
})
}
// ========== 商品参数值 ==========
/**
* 获取商品参数值列表
*/
export function fetchProductParameterValues(productId: string) {
return request.get<{
list: Api.Product.ProductParameterValue[]
total: number
}>({
url: `/web/admin/product-parameter-values/product/${productId}`
})
}
/**
* 批量保存商品参数值
*/
export function fetchSaveProductParameterValues(productId: string, values: Api.Product.ProductParameterValueCreate[]) {
return request.post({
url: `/web/admin/product-parameter-values/product/${productId}`,
params: { productId, values }
})
}
// ========== 售后评价 ==========
/**
* 获取评价列表
*/
export function fetchReviewList(params?: {
page?: number
pageSize?: number
productId?: string
productName?: string
userName?: string
status?: string
rating?: number
startDate?: string
endDate?: string
}) {
return request.get<{
list: Api.Product.ProductReview[]
total: number
page: number
pageSize: number
}>({
url: '/web/admin/reviews',
params
})
}
/**
* 获取评价统计
*/
export function fetchReviewStatistics(productId?: string) {
return request.get<Api.Product.ProductReviewStatistics>({
url: '/web/admin/reviews/statistics',
params: { productId }
})
}
/**
* 获取评价详情
*/
export function fetchReviewDetail(id: string) {
return request.get<Api.Product.ProductReview>({
url: `/web/admin/reviews/${id}`
})
}
/**
* 审核通过评价
*/
export function fetchApproveReview(id: string) {
return request.put({
url: `/web/admin/reviews/${id}/approve`
})
}
/**
* 拒绝评价
*/
export function fetchRejectReview(id: string, rejectReason: string) {
return request.put({
url: `/web/admin/reviews/${id}/reject`,
params: { rejectReason }
})
}
/**
* 回复评价
*/
export function fetchReplyReview(id: string, replyContent: string) {
return request.put({
url: `/web/admin/reviews/${id}/reply`,
params: { replyContent }
})
}
/**
* 置顶/取消置顶评价
*/
export function fetchToggleReviewTop(id: string, isTop: number) {
return request.put({
url: `/web/admin/reviews/${id}/top`,
params: { isTop }
})
}