页面提交

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

126
src/store/cart.ts Normal file
View File

@@ -0,0 +1,126 @@
import { defineStore } from 'pinia'
import type { CartItem } from '@/typings/mall'
export const useCartStore = defineStore('cart', {
state: () => ({
items: [] as CartItem[],
}),
getters: {
// 购物车商品数量
totalCount(): number {
return this.items.reduce((sum, item) => sum + item.quantity, 0)
},
// 选中的商品
checkedItems(): CartItem[] {
return this.items.filter(item => item.checked)
},
// 选中商品数量
checkedCount(): number {
return this.checkedItems.reduce((sum, item) => sum + item.quantity, 0)
},
// 总价
totalPrice(): number {
return this.checkedItems.reduce((sum, item) => {
return sum + item.price * item.quantity
}, 0)
},
// 是否全选
isAllChecked(): boolean {
return this.items.length > 0 && this.items.every(item => item.checked)
},
},
actions: {
// 初始化检查(迁移旧数据)
initCheck() {
this.items.forEach(item => {
if (!item.shopId) {
item.shopId = 'merchant_a'
item.shopName = '商户A'
}
})
},
// 添加商品
addItem(item: Omit<CartItem, 'id' | 'checked'>) {
const existItem = this.items.find(
i =>
i.goodsId === item.goodsId
&& JSON.stringify(i.selectedSpec) === JSON.stringify(item.selectedSpec),
)
if (existItem) {
// 已存在,增加数量
existItem.quantity += item.quantity
}
else {
// 不存在,添加新商品
this.items.push({
...item,
id: `cart_${Date.now()}`,
checked: true,
shopId: item.shopId || 'merchant_a', // 兼容旧数据默认商户A
shopName: item.shopName || '商户A', // 兼容旧数据默认商户A
})
}
},
// 删除商品
removeItem(id: string) {
const index = this.items.findIndex(item => item.id === id)
if (index > -1) {
this.items.splice(index, 1)
}
},
// 更新数量
updateQuantity(id: string, quantity: number) {
const item = this.items.find(item => item.id === id)
if (item) {
item.quantity = Math.max(1, Math.min(quantity, item.stock))
}
},
// 切换选中状态
toggleChecked(id: string) {
const item = this.items.find(item => item.id === id)
if (item) {
item.checked = !item.checked
}
},
// 全选/取消全选
toggleAllChecked() {
const checked = !this.isAllChecked
this.items.forEach((item) => {
item.checked = checked
})
},
// 清空购物车
clear() {
this.items = []
},
// 清空已选中的商品
clearChecked() {
this.items = this.items.filter(item => !item.checked)
},
},
// 持久化配置
persist: {
key: 'shop-toy-cart',
storage: {
getItem: key => uni.getStorageSync(key),
setItem: (key, value) => uni.setStorageSync(key, value),
},
},
})

79
src/store/finance.ts Normal file
View File

@@ -0,0 +1,79 @@
import { defineStore } from 'pinia'
import { getCreditLimit, getSettlementList, getDueOrders, submitWriteOff, getWriteOffList } from '@/api/finance'
import type { CreditLimit, Settlement, SettlementStatus, WriteOff } from '@/typings/mall'
export const useFinanceStore = defineStore('finance', {
state: () => ({
creditLimits: [] as CreditLimit[],
settlementList: [] as Settlement[],
dueOrders: [] as Settlement[],
writeOffList: [] as WriteOff[],
}),
getters: {
// 总可用额度
totalAvailableLimit(state): number {
return state.creditLimits.reduce((sum, item) => sum + item.availableLimit, 0)
},
// 总已用额度
totalUsedLimit(state): number {
return state.creditLimits.reduce((sum, item) => sum + item.usedLimit, 0)
},
},
actions: {
// 获取信用额度
async fetchCreditLimit() {
try {
const res: any = await getCreditLimit()
this.creditLimits = res.data
} catch (error) {
console.error('获取信用额度失败', error)
}
},
// 获取应结账款列表
async fetchSettlementList(params?: { status?: SettlementStatus, merchantId?: string }) {
try {
const res: any = await getSettlementList(params)
this.settlementList = res.data
} catch (error) {
console.error('获取应结账款失败', error)
}
},
// 获取到期订单
async fetchDueOrders() {
try {
const res: any = await getDueOrders()
this.dueOrders = res.data
} catch (error) {
console.error('获取到期订单失败', error)
}
},
// 提交消账
async submitWriteOff(data: { settlementId: string, amount: number, proof: string[], remark: string }) {
try {
await submitWriteOff(data)
// 刷新列表
this.fetchSettlementList()
this.fetchWriteOffList(data.settlementId)
} catch (error) {
console.error('提交消账失败', error)
throw error
}
},
// 获取消账记录
async fetchWriteOffList(settlementId?: string) {
try {
const res: any = await getWriteOffList(settlementId)
this.writeOffList = res.data
} catch (error) {
console.error('获取消账记录失败', error)
}
},
},
})

40
src/store/member.ts Normal file
View File

@@ -0,0 +1,40 @@
import { defineStore } from 'pinia'
import { getMemberInfo, getMemberBenefits } from '@/api/member'
import type { Member } from '@/typings/mall'
import { memberLevelConfig } from '@/mock/member'
export const useMemberStore = defineStore('member', {
state: () => ({
memberInfo: null as Member | null,
benefits: [] as string[],
}),
getters: {
currentLevelConfig(state) {
if (!state.memberInfo) return null
return memberLevelConfig[state.memberInfo.level]
},
},
actions: {
// 获取会员信息
async fetchMemberInfo() {
try {
const res: any = await getMemberInfo()
this.memberInfo = res.data
} catch (error) {
console.error('获取会员信息失败', error)
}
},
// 获取会员权益
async fetchBenefits() {
try {
const res: any = await getMemberBenefits()
this.benefits = res.data
} catch (error) {
console.error('获取会员权益失败', error)
}
},
},
})

74
src/store/order.ts Normal file
View File

@@ -0,0 +1,74 @@
import { defineStore } from 'pinia'
import { createOrder, getOrderList, getOrderDetail, cancelOrder, payOrder } from '@/api/order'
import type { Order, OrderStatus } from '@/typings/mall'
export const useOrderStore = defineStore('order', {
state: () => ({
orderList: [] as Order[],
currentOrder: null as Order | null,
}),
actions: {
// 获取订单列表
async fetchOrderList(status?: OrderStatus) {
try {
const res: any = await getOrderList(status)
this.orderList = res.data
} catch (error) {
console.error('获取订单列表失败', error)
}
},
// 获取订单详情
async fetchOrderDetail(id: string) {
try {
const res: any = await getOrderDetail(id)
this.currentOrder = res.data
return res.data
} catch (error) {
console.error('获取订单详情失败', error)
return null
}
},
// 创建订单
async createOrder(data: any) {
try {
const res: any = await createOrder(data)
return res.data
} catch (error) {
console.error('创建订单失败', error)
throw error
}
},
// 支付订单
async payOrder(id: string) {
try {
await payOrder(id)
// 更新列表或详情
if (this.currentOrder && this.currentOrder.id === id) {
this.fetchOrderDetail(id)
}
this.fetchOrderList()
} catch (error) {
console.error('支付订单失败', error)
throw error
}
},
// 取消订单
async cancelOrder(id: string) {
try {
await cancelOrder(id)
if (this.currentOrder && this.currentOrder.id === id) {
this.fetchOrderDetail(id)
}
this.fetchOrderList()
} catch (error) {
console.error('取消订单失败', error)
throw error
}
},
},
})

View File

@@ -1,61 +1,40 @@
import type { IUserInfoRes } from '@/api/types/login'
import { defineStore } from 'pinia'
import { ref } from 'vue'
import {
getUserInfo,
} from '@/api/login'
import type { User } from '@/typings/mall'
import { mockMember } from '@/mock/member'
// 初始化状态
const userInfoState: IUserInfoRes = {
userId: -1,
username: '',
nickname: '',
avatar: '/static/images/default-avatar.png',
}
export const useUserStore = defineStore('user', {
state: () => ({
userInfo: {
id: 'user_001',
username: 'admin',
nickname: '测试用户',
avatar: 'https://picsum.photos/200/200?random=avatar',
phone: '13800138000',
creditLimits: [], // 实际应从 financeStore 获取或关联
member: mockMember,
} as User | null,
isLogin: true, // 默认已登录
}),
export const useUserStore = defineStore(
'user',
() => {
// 定义用户信息
const userInfo = ref<IUserInfoRes>({ ...userInfoState })
// 设置用户信息
const setUserInfo = (val: IUserInfoRes) => {
console.log('设置用户信息', val)
// 若头像为空 则使用默认头像
if (!val.avatar) {
val.avatar = userInfoState.avatar
}
userInfo.value = val
}
const setUserAvatar = (avatar: string) => {
userInfo.value.avatar = avatar
console.log('设置用户头像', avatar)
console.log('userInfo', userInfo.value)
}
// 删除用户信息
const clearUserInfo = () => {
userInfo.value = { ...userInfoState }
uni.removeStorageSync('user')
}
actions: {
// 登录(模拟)
login(data: any) {
this.isLogin = true
// ...
},
/**
* 获取用户信息
*/
const fetchUserInfo = async () => {
const res = await getUserInfo()
setUserInfo(res)
return res
}
return {
userInfo,
clearUserInfo,
fetchUserInfo,
setUserInfo,
setUserAvatar,
}
// 退出登录
logout() {
this.isLogin = false
this.userInfo = null
},
},
{
persist: true,
persist: {
key: 'shop-toy-user',
storage: {
getItem: key => uni.getStorageSync(key),
setItem: (key, value) => uni.setStorageSync(key, value),
},
},
)
})