hookehuyr

feat(购物车): 添加单一商品模式支持

在购物车功能中引入单一商品模式,允许用户在不同场景下选择单一商品或多商品模式。修改了购物车上下文逻辑,确保在单一商品模式下,购物车仅能包含一件商品。同时更新了相关页面逻辑,以适配新模式。
......@@ -19,7 +19,7 @@ import { apiList } from "@/api/wx/jsApiList.js";
import { wxInfo, getUrlParams, stringifyQuery } from "@/utils/tools";
provideAuth(); // 提供全局认证状态
provideCart(); // 提供全局购物车状态
provideCart('single'); // 提供全局购物车状态,单一商品模式
</script>
<template>
......
......@@ -3,9 +3,16 @@ import { useRouter } from 'vue-router'
const CartSymbol = Symbol()
export function provideCart() {
// 购物车模式配置
const CartMode = {
SINGLE: 'single', // 单一商品模式
MULTIPLE: 'multiple' // 多商品模式
}
export function provideCart(mode = CartMode.MULTIPLE) {
const router = useRouter()
const cartItems = ref([])
const cartMode = ref(mode)
// 从localStorage加载购物车数据
try {
......@@ -25,6 +32,11 @@ export function provideCart() {
// 添加商品到购物车
function addToCart(item) {
if (cartMode.value === CartMode.SINGLE) {
// 单一商品模式:直接替换现有商品
cartItems.value = [{ ...item, quantity: 1 }]
} else {
// 多商品模式:累加商品数量
const existingItemIndex = cartItems.value.findIndex(
i => i.id === item.id && i.type === item.type
)
......@@ -40,6 +52,7 @@ export function provideCart() {
cartItems.value = [...cartItems.value, { ...item, quantity: 1 }]
}
}
}
// 从购物车移除商品
function removeFromCart(itemId, itemType) {
......@@ -52,12 +65,20 @@ export function provideCart() {
function updateQuantity(itemId, itemType, quantity) {
if (quantity < 1) return
if (cartMode.value === CartMode.SINGLE) {
// 单一商品模式:直接更新数量
if (cartItems.value.length === 1) {
cartItems.value = [{ ...cartItems.value[0], quantity }]
}
} else {
// 多商品模式:更新指定商品数量
cartItems.value = cartItems.value.map(item =>
item.id === itemId && item.type === itemType
? { ...item, quantity }
: item
)
}
}
// 清空购物车
function clearCart() {
......@@ -122,6 +143,7 @@ export function provideCart() {
const cart = {
items: cartItems,
mode: cartMode,
addToCart,
removeFromCart,
updateQuantity,
......
......@@ -58,6 +58,7 @@
</p>
</div>
<button
v-if="mode === 'multiple'"
@click="() => {
itemToDelete = item
showConfirmDialog = true
......@@ -215,6 +216,7 @@
<span class="text-lg font-bold text-green-600">{{ formatPrice(getTotalPrice()) }}</span>
</div>
<button
v-if="mode === 'multiple'"
type="button"
@click="() => {
showConfirmDialog = true
......@@ -277,7 +279,7 @@ const $route = useRoute();
const $router = useRouter();
useTitle($route.meta.title);
const router = useRouter()
const { items: cartItems, getTotalPrice, handleCheckout, clearCart, removeFromCart } = useCart()
const { items: cartItems, mode, getTotalPrice, handleCheckout, clearCart, removeFromCart } = useCart()
// Form state
const formData = ref({
......