页面提交
This commit is contained in:
94
src/api/address.ts
Normal file
94
src/api/address.ts
Normal 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
57
src/api/auth.ts
Normal 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
17
src/api/banner.ts
Normal 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
30
src/api/category.ts
Normal 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
125
src/api/finance.ts
Normal 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
95
src/api/goods.ts
Normal 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
29
src/api/member.ts
Normal 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
112
src/api/order.ts
Normal 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)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user