页面提交
This commit is contained in:
126
src/store/cart.ts
Normal file
126
src/store/cart.ts
Normal 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
79
src/store/finance.ts
Normal 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
40
src/store/member.ts
Normal 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
74
src/store/order.ts
Normal 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
|
||||
}
|
||||
},
|
||||
},
|
||||
})
|
||||
@@ -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),
|
||||
},
|
||||
},
|
||||
)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user