页面提交

This commit is contained in:
FlowerWater
2025-11-29 17:20:17 +08:00
parent 95832a6288
commit 0eb8ac9181
50 changed files with 8471 additions and 63 deletions

94
src/api/address.ts Normal file
View File

@@ -0,0 +1,94 @@
import { mockAddressList } from '@/mock/address'
import type { Address } from '@/typings/mall'
/**
* 地址相关 API
*/
// 获取地址列表
export function getAddressList() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
code: 0,
data: mockAddressList,
})
}, 300)
})
}
// 添加地址
export function addAddress(data: Omit<Address, 'id'>) {
return new Promise((resolve) => {
setTimeout(() => {
const newAddress = {
...data,
id: `addr_${Date.now()}`,
}
mockAddressList.push(newAddress)
resolve({
code: 0,
data: newAddress,
message: '添加成功',
})
}, 300)
})
}
// 编辑地址
export function updateAddress(data: Address) {
return new Promise((resolve) => {
setTimeout(() => {
const index = mockAddressList.findIndex(item => item.id === data.id)
if (index > -1) {
mockAddressList[index] = data
resolve({
code: 0,
data,
message: '修改成功',
})
} else {
resolve({
code: 1,
message: '地址不存在',
})
}
}, 300)
})
}
// 删除地址
export function deleteAddress(id: string) {
return new Promise((resolve) => {
setTimeout(() => {
const index = mockAddressList.findIndex(item => item.id === id)
if (index > -1) {
mockAddressList.splice(index, 1)
resolve({
code: 0,
message: '删除成功',
})
} else {
resolve({
code: 1,
message: '地址不存在',
})
}
}, 300)
})
}
// 设置默认地址
export function setDefaultAddress(id: string) {
return new Promise((resolve) => {
setTimeout(() => {
mockAddressList.forEach(item => {
item.isDefault = item.id === id
})
resolve({
code: 0,
message: '设置成功',
})
}, 300)
})
}

57
src/api/auth.ts Normal file
View File

@@ -0,0 +1,57 @@
import { mockMember } from '@/mock/member'
import type { User } from '@/typings/mall'
/**
* 认证相关 API
*/
// 登录
export function login(data: { phone: string, code?: string, password?: string }) {
return new Promise((resolve) => {
setTimeout(() => {
// 模拟登录成功
const user: User = {
id: 'user_001',
username: data.phone,
nickname: `用户${data.phone.slice(-4)}`,
avatar: 'https://picsum.photos/200/200?random=avatar',
phone: data.phone,
creditLimits: [],
member: mockMember,
}
resolve({
code: 0,
data: {
token: 'mock_token_123456',
user,
},
message: '登录成功',
})
}, 500)
})
}
// 发送验证码
export function sendCode(phone: string) {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
code: 0,
message: '验证码发送成功',
})
}, 300)
})
}
// 退出登录
export function logout() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
code: 0,
message: '退出成功',
})
}, 300)
})
}

17
src/api/banner.ts Normal file
View File

@@ -0,0 +1,17 @@
import { mockBannerList } from '@/mock/banner'
/**
* 轮播图相关 API
*/
// 获取轮播图列表
export function getBannerList() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
code: 0,
data: mockBannerList,
})
}, 300)
})
}

30
src/api/category.ts Normal file
View File

@@ -0,0 +1,30 @@
import { mockCategoryList } from '@/mock/category'
/**
* 分类相关 API
*/
// 获取分类列表
export function getCategoryList() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
code: 0,
data: mockCategoryList,
})
}, 300)
})
}
// 获取分类详情
export function getCategoryDetail(id: string) {
return new Promise((resolve) => {
setTimeout(() => {
const category = mockCategoryList.find(item => item.id === id)
resolve({
code: 0,
data: category || null,
})
}, 300)
})
}

125
src/api/finance.ts Normal file
View File

@@ -0,0 +1,125 @@
import { mockCreditLimitList, mockSettlementList, mockWriteOffList } from '@/mock/finance'
import { WriteOffStatus } from '@/typings/mall'
import type { SettlementStatus, WriteOff } from '@/typings/mall'
/**
* 金融相关 API
*/
// 获取信用额度
export function getCreditLimit() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
code: 0,
data: mockCreditLimitList,
})
}, 300)
})
}
// 获取应结账款列表
export function getSettlementList(params?: {
status?: SettlementStatus
merchantId?: string
}) {
return new Promise((resolve) => {
setTimeout(() => {
let list = [...mockSettlementList]
// 筛选
if (params?.status) {
// 如果查询未结,则包含逾期状态
if (params.status === 'unsettled') {
list = list.filter(item => item.status === 'unsettled' || item.status === 'overdue')
} else {
list = list.filter(item => item.status === params.status)
}
}
if (params?.merchantId) {
list = list.filter(item => item.merchantId === params.merchantId)
}
resolve({
code: 0,
data: list,
})
}, 300)
})
}
// 获取到期订单
export function getDueOrders() {
return new Promise((resolve) => {
setTimeout(() => {
const now = new Date()
// 7天后
const sevenDaysLater = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000)
// 筛选7天内到期的未结账款包括已逾期
const list = mockSettlementList.filter((item) => {
// 只关注未结和逾期状态
if (item.status !== 'unsettled' && item.status !== 'overdue')
return false
const dueDate = new Date(item.dueDate)
// 只要到期时间在7天内包括过去的时间即已逾期都应该提醒
return dueDate <= sevenDaysLater
})
resolve({
code: 0,
data: list,
})
}, 300)
})
}
// 提交消账申请
export function submitWriteOff(data: {
settlementId: string
amount: number
proof: string[]
remark: string
}) {
return new Promise((resolve) => {
setTimeout(() => {
const newWriteOff: WriteOff = {
id: `writeoff_${Date.now()}`,
settlementId: data.settlementId,
amount: data.amount,
proof: data.proof,
remark: data.remark,
submitTime: new Date().toISOString(),
status: WriteOffStatus.PENDING,
}
// 模拟添加到列表
mockWriteOffList.push(newWriteOff)
resolve({
code: 0,
data: newWriteOff,
message: '提交成功,等待审核',
})
}, 500)
})
}
// 获取消账记录
export function getWriteOffList(settlementId?: string) {
return new Promise((resolve) => {
setTimeout(() => {
let list = [...mockWriteOffList]
if (settlementId) {
list = list.filter(item => item.settlementId === settlementId)
}
resolve({
code: 0,
data: list,
})
}, 300)
})
}

95
src/api/goods.ts Normal file
View File

@@ -0,0 +1,95 @@
import { mockGoodsList } from '@/mock/goods'
import type { Goods } from '@/typings/mall'
/**
* 商品相关 API
*/
// 获取商品列表(支持分页、筛选)
export function getGoodsList(params: {
page?: number
pageSize?: number
categoryId?: string
keyword?: string
sortBy?: 'sales' | 'price' | 'new'
sortOrder?: 'asc' | 'desc'
}) {
return new Promise((resolve) => {
setTimeout(() => {
let list = [...mockGoodsList]
// 筛选
if (params.categoryId) {
list = list.filter(item => item.categoryId === params.categoryId)
}
if (params.keyword) {
list = list.filter(item => item.name.includes(params.keyword))
}
// 排序
if (params.sortBy) {
list.sort((a, b) => {
let compareValue = 0
if (params.sortBy === 'sales') {
compareValue = a.sales - b.sales
}
else if (params.sortBy === 'price') {
compareValue = a.price - b.price
}
else if (params.sortBy === 'new') {
compareValue = a.id.localeCompare(b.id)
}
return params.sortOrder === 'desc' ? -compareValue : compareValue
})
}
// 分页
const page = params.page || 1
const pageSize = params.pageSize || 10
const start = (page - 1) * pageSize
const end = start + pageSize
resolve({
code: 0,
data: {
list: list.slice(start, end),
total: list.length,
page,
pageSize,
},
})
}, 300)
})
}
// 获取商品详情
export function getGoodsDetail(id: string) {
return new Promise<{ code: number, data: Goods | null }>((resolve) => {
setTimeout(() => {
const goods = mockGoodsList.find(item => item.id === id)
resolve({ code: 0, data: goods || null })
}, 300)
})
}
// 搜索商品
export function searchGoods(keyword: string) {
return getGoodsList({ keyword, pageSize: 20 })
}
// 获取推荐商品
export function getRecommendGoods(limit = 10) {
return new Promise((resolve) => {
setTimeout(() => {
// 按销量排序,取前 N 个
const list = [...mockGoodsList]
.sort((a, b) => b.sales - a.sales)
.slice(0, limit)
resolve({
code: 0,
data: list,
})
}, 300)
})
}

29
src/api/member.ts Normal file
View File

@@ -0,0 +1,29 @@
import { mockMember, memberLevelConfig } from '@/mock/member'
/**
* 会员相关 API
*/
// 获取会员信息
export function getMemberInfo() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
code: 0,
data: mockMember,
})
}, 300)
})
}
// 获取会员权益
export function getMemberBenefits() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
code: 0,
data: memberLevelConfig[mockMember.level].benefits,
})
}, 300)
})
}

112
src/api/order.ts Normal file
View File

@@ -0,0 +1,112 @@
import { OrderStatus } from '@/typings/mall'
import type { Order } from '@/typings/mall'
// 模拟订单列表
const mockOrderList: Order[] = []
/**
* 订单相关 API
*/
// 创建订单
export function createOrder(data: Omit<Order, 'id' | 'createTime' | 'status' | 'orderNo'>) {
return new Promise((resolve, reject) => {
setTimeout(() => {
// 如果是信用支付
if (data.paymentMethod === 'credit') {
// 模拟检查额度(这里简单模拟,实际应调用金融服务)
// 假设额度总是足够的,或者在前端已经校验过了
// 创建应结账款记录(模拟)
console.log('创建信用支付订单,生成应结账款...')
}
const newOrder: Order = {
...data,
id: `order_${Date.now()}`,
orderNo: `ORD${Date.now()}`,
status: data.paymentMethod === 'credit' ? OrderStatus.PENDING_DELIVERY : OrderStatus.PENDING_PAYMENT, // 信用支付直接待发货
createTime: new Date().toISOString(),
isSettled: false,
payTime: data.paymentMethod === 'credit' ? new Date().toISOString() : undefined,
}
mockOrderList.unshift(newOrder)
resolve({
code: 0,
data: newOrder,
message: '订单创建成功',
})
}, 500)
})
}
// 获取订单列表
export function getOrderList(status?: OrderStatus) {
return new Promise((resolve) => {
setTimeout(() => {
let list = [...mockOrderList]
if (status) {
list = list.filter(item => item.status === status)
}
resolve({
code: 0,
data: list,
})
}, 300)
})
}
// 获取订单详情
export function getOrderDetail(id: string) {
return new Promise((resolve) => {
setTimeout(() => {
const order = mockOrderList.find(item => item.id === id)
resolve({
code: 0,
data: order || null,
})
}, 300)
})
}
// 取消订单
export function cancelOrder(id: string) {
return new Promise((resolve) => {
setTimeout(() => {
const order = mockOrderList.find(item => item.id === id)
if (order) {
order.status = 'cancelled' as OrderStatus
resolve({
code: 0,
message: '订单已取消',
})
} else {
resolve({
code: 1,
message: '订单不存在',
})
}
}, 300)
})
}
// 支付订单(模拟)
export function payOrder(id: string) {
return new Promise((resolve) => {
setTimeout(() => {
const order = mockOrderList.find(item => item.id === id)
if (order) {
order.status = 'pending_delivery' as OrderStatus // 支付后变为待发货
order.payTime = new Date().toISOString()
resolve({
code: 0,
message: '支付成功',
})
} else {
resolve({
code: 1,
message: '订单不存在',
})
}
}, 500)
})
}