将 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 }
})
}
+89
View File
@@ -0,0 +1,89 @@
import request from '@/utils/http'
import { buildWebEncryptedLoginBody } from '@/utils/loginRsa'
/**
* Web端登录(RSA 加密传输账号密码)
* @param params 登录参数 { username, password }
* @returns 登录响应
*/
export async function fetchLogin(params: { username: string; password: string }) {
const body = await buildWebEncryptedLoginBody(params.username, params.password)
return request.post<{
token: string
refreshToken: string
expiresIn: number
userInfo: {
id: string
username: string
realName: string
phone: string
role: string
regionId: string
regionName: string
avatarUrl?: string | null
}
}>({
url: '/web/auth/login',
data: body
})
}
/**
* 获取当前用户信息
* @returns 用户信息
*/
export function fetchGetUserInfo() {
return request.get<{
id: string
username: string
realName: string
phone: string
role: string
regionId: string
regionName: string
regionIds?: string[]
isSuperAdmin?: boolean
isActive: boolean
avatarUrl?: string | null
}>({
url: '/web/auth/current-user'
})
}
/**
* 获取当前用户菜单 code 权限
*/
export function fetchGetMenuCodes() {
return request.get<{
isSuperAdmin: boolean
all: boolean
menuCodes: string[]
}>({
url: '/web/auth/menu-codes'
})
}
/**
* 刷新Token
* @param refreshToken 刷新令牌
* @returns 新令牌
*/
export function fetchRefreshToken(refreshToken: string) {
return request.post<{
token: string
refreshToken: string
expiresIn: number
}>({
url: '/web/auth/refresh-token',
params: { refreshToken }
})
}
/**
* 登出
*/
export function fetchLogout() {
return request.post({
url: '/web/auth/logout'
})
}
+15
View File
@@ -0,0 +1,15 @@
import request from '@/utils/http'
/** 与小程序端一致:value=区划代码,label=名称,children=下级 */
export interface ChinaRegionTreeNode {
value: string
label: string
children?: ChinaRegionTreeNode[]
}
/** 运营端:数据源 bas_china_region */
export function fetchChinaRegionTree() {
return request.get<{ tree: ChinaRegionTreeNode[] }>({
url: '/web/admin/china-region-tree'
})
}
+39
View File
@@ -0,0 +1,39 @@
import request from '@/utils/http'
import type { AppRouteRecord } from '@/types/router'
/**
* 获取菜单列表
* 从后端获取运营端菜单
*/
export async function fetchGetMenuList() {
const res = await request.get<AppRouteRecord[] | { menuList?: AppRouteRecord[] }>({
url: '/web/menu/list'
})
if (Array.isArray(res)) return res
return res?.menuList || []
}
/**
* 获取角色列表
*/
export function fetchGetRoleList() {
return request.get<Array<{ label: string; value: string }>>({
url: '/web/admin/roles'
})
}
/**
* 示例表格用户列表(兼容旧示例页调用)
*/
export function fetchGetUserList(params?: Record<string, any>) {
return request.get<{
list: any[]
total: number
page?: number
pageSize?: number
}>({
url: '/web/admin/users',
params
})
}
+206
View File
@@ -0,0 +1,206 @@
import request from '@/utils/http'
/**
* 更新日志相关 API
*/
/**
* 获取更新日志列表
*/
export function fetchGetUpgradeLogs(params: { page?: number; pageSize?: number }) {
return request.get<{
list: Array<{
id: string
version: string
title: string
date: string
detail: string[]
requireReLogin: boolean
remark?: string
createAt: string
}>
total: number
page: number
pageSize: number
}>({
url: '/web/system/upgrade-logs',
params
})
}
/**
* 获取所有更新日志(用于变更日志页面展示)
*/
export function fetchGetAllUpgradeLogs() {
return request.get<Array<{
version: string
title: string
date: string
detail: string[]
requireReLogin: boolean
remark?: string
}>>({
url: '/web/system/upgrade-logs/all'
})
}
/**
* 获取最新一条更新日志(用于升级检测)
*/
export function fetchGetLatestUpgradeLog() {
return request.get<{
version: string
title: string
date: string
detail: string[]
requireReLogin: boolean
remark?: string
} | null>({
url: '/web/system/upgrade-logs/latest'
})
}
/**
* 创建更新日志
*/
export function fetchCreateUpgradeLog(data: {
version: string
title: string
date: string
detail?: string
require_re_login?: boolean
remark?: string
}) {
return request.post<{ id: string }>({
url: '/web/system/upgrade-logs',
data
})
}
/**
* 更新更新日志
*/
export function fetchUpdateUpgradeLog(
logId: string,
data: {
version?: string
title?: string
date?: string
detail?: string
require_re_login?: boolean
remark?: string
}
) {
return request.put<{ id: string }>({
url: `/web/system/upgrade-logs/${logId}`,
data
})
}
/**
* 删除更新日志
*/
export function fetchDeleteUpgradeLog(logId: string) {
return request.delete<{ id: string }>({
url: `/web/system/upgrade-logs/${logId}`
})
}
/**
* 评论相关 API
*/
/**
* 获取评论列表
*/
export function fetchGetComments(params: {
target_type?: string
target_id?: string
page?: number
pageSize?: number
}) {
return request.get<{
list: CommentItem[]
total: number
page: number
pageSize: number
}>({
url: '/web/system/comments',
params
})
}
export interface CommentItem {
id: string
parentId?: string
author: string
authorId?: string
content: string
targetType?: string
targetId?: string
timestamp: string
replies: CommentItem[]
}
/**
* 创建评论
*/
export function fetchCreateComment(data: {
author: string
content: string
parent_id?: string
author_id?: string
target_type?: string
target_id?: string
}) {
return request.post<CommentItem>({
url: '/web/system/comments',
data
})
}
/**
* 删除评论
*/
export function fetchDeleteComment(commentId: string) {
return request.delete<{ id: string }>({
url: `/web/system/comments/${commentId}`
})
}
/**
* 系统配置相关 API
*/
/**
* 获取中国地图GeoJSON数据
*/
export function fetchGetChinaMapData() {
return request.get<any>({
url: '/web/system/china-map'
})
}
/**
* 获取系统配置
*/
export function fetchGetSystemConfig(configKey: string) {
return request.get<{
key: string
value: unknown
name: string
type: string
description?: string
} | null>({
url: `/web/system/config/${configKey}`
})
}
/**
* 获取当前系统版本号
*/
export function fetchGetCurrentVersion() {
return request.get<{ version: string }>({
url: '/web/system/version'
})
}