1 line
73 KiB
Plaintext
1 line
73 KiB
Plaintext
{"version":3,"sources":["pages/main/cart.uvue","pages/main/index.uvue","pages/user/change-password.uvue","pages/user/login.uvue","pages/user/center.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["<!-- pages/main/cart.uvue -->\r\n<template>\r\n\t<view class=\"cart-page\">\r\n\t\t<!-- 智能顶部导航栏 - 与消息页保持一致 -->\r\n\t\t<view class=\"smart-navbar\" :style=\"{ paddingTop: statusBarHeight + 'px' }\">\r\n\t\t\t<view class=\"nav-container\">\r\n\t\t\t\t<text class=\"nav-title\">购物车</text>\r\n\t\t\t\t<view class=\"nav-actions\">\r\n\t\t\t\t\t<view class=\"action-btn\" @click=\"toggleManageMode\">\r\n\t\t\t\t\t\t<text class=\"action-icon\">{{ isManageMode ? '✓' : '⚙️' }}</text>\r\n\t\t\t\t\t\t<text class=\"action-text\">{{ isManageMode ? '完成' : '管理' }}</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 导航栏占位符 - 需要包含statusBarHeight + 导航栏高度44px -->\r\n\t\t<view class=\"navbar-placeholder\" :style=\"{ height: (statusBarHeight + 44) + 'px' }\"></view>\r\n\t\t\r\n\t\t<!-- 购物车内容 -->\r\n\t\t<scroll-view \r\n :scroll-y=\"true\" \r\n class=\"cart-content\" \r\n :show-scrollbar=\"false\" \r\n :enhanced=\"true\" \r\n :bounces=\"true\"\r\n >\r\n\t\t\t<!-- 空购物车 -->\r\n\t\t\t<view v-if=\"!loading && cartItems.length === 0\" class=\"empty-cart\">\r\n\t\t\t\t<text class=\"empty-icon\">🛒</text>\r\n\t\t\t\t<text class=\"empty-title\">购物车是空的</text>\r\n\t\t\t\t<text class=\"empty-desc\">快去挑选喜欢的商品吧</text>\r\n\t\t\t\t<button class=\"go-shopping-btn\" @click=\"goShopping\">去逛逛</button>\r\n\t\t\t</view>\r\n\t\t\t\r\n\t\t\t<!-- 购物车商品列表 -->\r\n\t\t\t<view v-else class=\"cart-list\">\r\n\t\t\t\t<view \r\n\t\t\t\t\tv-for=\"group in cartGroups\" \r\n\t\t\t\t\t:key=\"group.shopId\"\r\n\t\t\t\t\tclass=\"shop-group\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<!-- 店铺头部 -->\r\n\t\t\t\t\t<view class=\"shop-header\">\r\n\t\t\t\t\t\t<view class=\"shop-select\" @click=\"toggleShopSelect(group.shopId)\">\r\n\t\t\t\t\t\t\t<text v-if=\"isShopSelected(group.shopId)\" class=\"selected-icon\">✓</text>\r\n\t\t\t\t\t\t\t<text v-else class=\"unselected-icon\"></text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<text class=\"shop-icon\" @click=\"navigateToShop(group.shopId, group.merchantId)\">🏪</text>\r\n\t\t\t\t\t\t<text class=\"shop-name\" :lines=\"1\" @click=\"navigateToShop(group.shopId, group.merchantId)\">{{ group.shopName }}</text>\r\n\t\t\t\t\t\t<text class=\"shop-arrow\" @click=\"navigateToShop(group.shopId, group.merchantId)\">></text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 店铺商品 -->\r\n\t\t\t\t\t<view \r\n\t\t\t\t\t\tv-for=\"item in group.items\" \r\n\t\t\t\t\t\t:key=\"item.id\"\r\n\t\t\t\t\t\tclass=\"cart-item\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<view class=\"item-select\" @click=\"toggleSelect(item.id)\">\r\n\t\t\t\t\t\t\t<text v-if=\"item.selected\" class=\"selected-icon\">✓</text>\r\n\t\t\t\t\t\t\t<text v-else class=\"unselected-icon\"></text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t<image \r\n\t\t\t\t\t\t\tclass=\"item-image\" \r\n\t\t\t\t\t\t\t:src=\"item.image\" \r\n\t\t\t\t\t\t\tmode=\"aspectFill\"\r\n\t\t\t\t\t\t\t@click=\"navigateToProduct(item)\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t<view class=\"item-info\">\r\n\t\t\t\t\t\t\t<view class=\"info-top\">\r\n\t\t\t\t\t\t\t\t<text class=\"item-name\" :lines=\"1\">{{ item.name }}</text>\r\n\t\t\t\t\t\t\t\t<text class=\"item-spec\">{{ item.spec }}</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t<view class=\"item-footer\">\r\n\t\t\t\t\t\t\t\t<text class=\"item-price\">¥{{ item.price }}</text>\r\n\t\t\t\t\t\t\t\t<view class=\"quantity-control\">\r\n\t\t\t\t\t\t\t\t\t<text class=\"quantity-btn\" @click=\"decreaseQuantity(item.id)\">-</text>\r\n\t\t\t\t\t\t\t\t\t<text class=\"quantity-value\">{{ item.quantity }}</text>\r\n\t\t\t\t\t\t\t\t\t<text class=\"quantity-btn\" @click=\"increaseQuantity(item.id)\">+</text>\r\n\t\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t\t\r\n\t\t\t<!-- 购物车操作栏 (移至推荐商品上方) -->\r\n <view v-if=\"cartItems.length > 0\" class=\"cart-action-bar\">\r\n <view class=\"action-bar-content\">\r\n <view class=\"action-left\">\r\n <view class=\"select-all\" @click=\"toggleSelectAll\">\r\n <text v-if=\"allSelected\" class=\"selected-icon\">✓</text>\r\n <text v-else class=\"unselected-icon\"></text>\r\n <text class=\"select-all-text\">全选</text>\r\n </view>\r\n </view>\r\n \r\n <view class=\"action-right\">\r\n <view v-if=\"!isManageMode\" class=\"total-info\">\r\n <text class=\"total-text\">合计:</text>\r\n <text class=\"total-price\">¥{{ totalPrice }}</text>\r\n <text v-if=\"parseFloat(memberSavedAmount) > 0\" class=\"member-saved\">会员已省¥{{ memberSavedAmount }}</text>\r\n </view>\r\n <button v-if=\"!isManageMode\" class=\"checkout-btn\" @click=\"goToCheckout\">\r\n 去结算({{ selectedCount }})\r\n </button>\r\n <button v-else class=\"delete-btn\" @click=\"deleteSelectedItems\">\r\n 删除({{ selectedCount }})\r\n </button>\r\n </view>\r\n </view>\r\n </view>\r\n\t\t\t\r\n\t\t\t<!-- 推荐商品 -->\r\n\t\t\t<view v-if=\"recommendProducts.length > 0\" class=\"recommend-section\">\r\n\t\t\t\t<view class=\"section-header\">\r\n\t\t\t\t\t<text class=\"section-title\">猜你喜欢</text>\r\n\t\t\t\t\t<view class=\"refresh-btn\" @click=\"refreshRecommend\">\r\n\t\t\t\t\t\t<text class=\"refresh-icon\">🔄</text>\r\n\t\t\t\t\t\t<text class=\"refresh-text\">换一批</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"recommend-list\">\r\n\t\t\t\t\t<view \r\n\t\t\t\t\t\tv-for=\"product in recommendProducts\" \r\n\t\t\t\t\t\t:key=\"product.id\"\r\n\t\t\t\t\t\tclass=\"recommend-item\"\r\n\t\t\t\t\t\t@click=\"navigateToProduct(product)\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<image \r\n\t\t\t\t\t\t\tclass=\"recommend-image\" \r\n\t\t\t\t\t\t\t:src=\"product.image\" \r\n\t\t\t\t\t\t\tmode=\"aspectFill\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t<text class=\"recommend-name\" :lines=\"2\">{{ product.name }}</text>\r\n\t\t\t\t\t\t<view class=\"recommend-bottom\">\r\n\t\t\t\t\t\t\t<text class=\"recommend-price\">¥{{ product.price }}</text>\r\n\t\t\t\t\t\t\t<view class=\"recommend-add-btn\" @click.stop=\"addToCart(product)\">\r\n\t\t\t\t\t\t\t\t<text class=\"recommend-add-icon\">+</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n <!-- 底部占位符:确保内容不被原生 TabBar 遮挡 -->\r\n <view class=\"tabbar-safe-area\"></view>\r\n\t\t</scroll-view>\r\n\t\t\r\n\t\t<!-- 底部结算栏 - 已移除,移动到内容区域 -->\r\n\t\t<!-- <view v-if=\"cartItems.length > 0\" class=\"cart-footer\">\r\n\t\t\t<view class=\"footer-content\">\r\n\t\t\t\t<view class=\"footer-left\">\r\n\t\t\t\t\t<view class=\"select-all\" @click=\"toggleSelectAll\">\r\n\t\t\t\t\t\t<text v-if=\"allSelected\" class=\"selected-icon\">✓</text>\r\n\t\t\t\t\t\t<text v-else class=\"unselected-icon\"></text>\r\n\t\t\t\t\t\t<text class=\"select-all-text\">全选</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<view class=\"footer-right\">\r\n\t\t\t\t\t<view v-if=\"!isManageMode\" class=\"total-info\">\r\n\t\t\t\t\t\t<text class=\"total-text\">合计:</text>\r\n\t\t\t\t\t\t<text class=\"total-price\">¥{{ totalPrice }}</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<button v-if=\"!isManageMode\" class=\"checkout-btn\" @click=\"goToCheckout\">\r\n\t\t\t\t\t\t去结算({{ selectedCount }})\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button v-else class=\"delete-btn\" @click=\"deleteSelectedItems\">\r\n\t\t\t\t\t\t删除({{ selectedCount }})\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view> -->\r\n\t</view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, computed, onMounted } from 'vue'\r\nimport { onShow } from '@dcloudio/uni-app'\r\nimport { supabaseService, type CartItem as SupabaseCartItem, type Product } from '@/utils/supabaseService.uts'\r\n\r\ntype LocalCartItem = {\r\n id: string\r\n shopId: string\r\n shopName: string\r\n name: string\r\n price: number\r\n originalPrice: number // 原价\r\n memberPrice: number // 会员价\r\n image: string\r\n spec: string\r\n quantity: number\r\n selected: boolean\r\n productId: string\r\n skuId: string\r\n merchantId: string\r\n}\r\n\r\ntype CartGroup = {\r\n\tshopId: string\r\n\tshopName: string\r\n\tmerchantId: string\r\n\titems: LocalCartItem[]\r\n}\r\n\r\nconst compareStrings = (a: string, b: string): boolean => {\r\n\tconsole.log('[compareStrings] a length:', a.length, 'b length:', b.length)\r\n\tconsole.log('[compareStrings] a type:', typeof a, 'b type:', typeof b)\r\n\tconsole.log('[compareStrings] a value:', JSON.stringify(a))\r\n\tconsole.log('[compareStrings] b value:', JSON.stringify(b))\r\n\t\r\n\tif (a.length !== b.length) return false\r\n\tfor (let i = 0; i < a.length; i++) {\r\n\t\tconst aCode = a.charCodeAt(i)\r\n\t\tconst bCode = b.charCodeAt(i)\r\n\t\tif (aCode != null && bCode != null && aCode !== bCode) {\r\n\t\t\tconsole.log('[compareStrings] mismatch at index:', i, 'a:', aCode, 'b:', bCode)\r\n\t\t\treturn false\r\n\t\t}\r\n\t}\r\n\treturn true\r\n}\r\n\r\ntype RecommendProduct = {\r\n\tid: string\r\n\tshopId: string\r\n\tshopName: string\r\n\tname: string\r\n\tprice: number\r\n\timage: string\r\n\tskuId: string\r\n\tmerchant_id: string\r\n}\r\n\r\n// 响应式数据\r\nconst cartItems = ref<LocalCartItem[]>([])\r\nconst recommendProducts = ref<RecommendProduct[]>([])\r\nconst recommendPage = ref<number>(1)\r\nconst loading = ref<boolean>(false)\r\nconst statusBarHeight = ref(0)\r\nconst isManageMode = ref(false)\r\nconst updatingItems = ref<Set<string>>(new Set()) // Track items being updated to prevent race conditions\r\n\r\n// 计算属性\r\nconst cartGroups = computed<CartGroup[]>(() => {\r\n\tconsole.log('[cartGroups] 计算购物车分组, cartItems count:', cartItems.value.length)\r\n\tconst groups = new Map<string, CartGroup>()\r\n\r\n\tcartItems.value.forEach((item: LocalCartItem) => {\r\n\t\tconsole.log('[cartGroups] item:', item.id, 'shopId:', item.shopId, 'shopName:', item.shopName)\r\n\t\tconst shopKey = item.shopId\r\n\t\tif (!groups.has(shopKey)) {\r\n\t\t\tgroups.set(shopKey, {\r\n\t\t\t\tshopId: item.shopId,\r\n\t\t\t\tshopName: item.shopName,\r\n\t\t\t\tmerchantId: item.merchantId,\r\n\t\t\t\titems: []\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tconst group = groups.get(shopKey)\r\n\t\tif (group != null) {\r\n\t\t\tgroup.items.push(item)\r\n\t\t}\r\n\t})\r\n\r\n\tconst groupArray: CartGroup[] = []\r\n\tgroups.forEach((value: CartGroup) => {\r\n\t\tconsole.log('[cartGroups] group:', value.shopId, 'items count:', value.items.length)\r\n\t\tgroupArray.push(value)\r\n\t})\r\n\treturn groupArray\r\n})\r\n\r\nconst allSelected = computed(() => {\r\n\treturn cartItems.value.length > 0 && cartItems.value.every((item: LocalCartItem) => item.selected)\r\n})\r\n\r\nconst selectedCount = computed(() => {\r\n\treturn cartItems.value.filter((item: LocalCartItem) => item.selected).reduce((sum: number, item: LocalCartItem) => sum + item.quantity, 0)\r\n})\r\n\r\nconst totalPrice = computed(() => {\r\n\treturn cartItems.value\r\n\t\t.filter((item: LocalCartItem) => item.selected)\r\n\t\t.reduce((sum: number, item: LocalCartItem) => {\r\n\t\t\t// 优先使用会员价,如果没有会员价则使用原价\r\n\t\t\tconst finalPrice = item.memberPrice > 0 && item.memberPrice < item.price ? item.memberPrice : item.price\r\n\t\t\treturn sum + finalPrice * item.quantity\r\n\t\t}, 0)\r\n\t\t.toFixed(2)\r\n})\r\n\r\n// 计算会员节省金额\r\nconst memberSavedAmount = computed(() => {\r\n\treturn cartItems.value\r\n\t\t.filter((item: LocalCartItem) => item.selected && item.memberPrice > 0 && item.memberPrice < item.price)\r\n\t\t.reduce((sum: number, item: LocalCartItem) => sum + (item.price - item.memberPrice) * item.quantity, 0)\r\n\t\t.toFixed(2)\r\n})\r\n\r\n// 检查店铺是否全选\r\nconst isShopSelected = (shopId: string): boolean => {\r\n\tconst shopItems: LocalCartItem[] = []\r\n\tfor (let i = 0; i < cartItems.value.length; i++) {\r\n\t\tif (compareStrings(cartItems.value[i].shopId, shopId)) {\r\n\t\t\tshopItems.push(cartItems.value[i])\r\n\t\t}\r\n\t}\r\n\tif (shopItems.length === 0) return false\r\n\tfor (let i = 0; i < shopItems.length; i++) {\r\n\t\tif (!shopItems[i].selected) return false\r\n\t}\r\n\treturn true\r\n}\r\n\r\nconst toggleManageMode = () => {\r\n\tisManageMode.value = !isManageMode.value\r\n}\r\n\r\n// 初始化页面数据\r\nconst initPage = () => {\r\n\tconst systemInfo = uni.getSystemInfoSync()\r\n\tstatusBarHeight.value = systemInfo.statusBarHeight ?? 0\r\n}\r\n\r\n// 生命周期\r\nonMounted(() => {\r\n\tinitPage()\r\n})\r\n\r\n// 提取更新列表的辅助函数以减少重复代码\r\nconst updateRecommendList = (recommends: Product[]) => {\r\n recommendProducts.value = recommends.map((p: Product): RecommendProduct => {\r\n return {\r\n id: p.id,\r\n shopId: p.merchant_id ?? 'unknown',\r\n shopName: p.shop_name ?? '商城推荐',\r\n name: p.name,\r\n price: p.base_price ?? p.market_price ?? 0,\r\n image: p.main_image_url ?? p.image_url ?? '/static/images/default-product.png',\r\n skuId: '',\r\n merchant_id: p.merchant_id ?? ''\r\n }\r\n })\r\n}\r\n\r\nconst refreshRecommend = async () => {\r\n try {\r\n // 1. 模拟市面加载感,锁定按钮防止连续快速点击\r\n if (loading.value) return\r\n loading.value = true\r\n \r\n uni.showLoading({\r\n title: '正在挑选...',\r\n mask: true\r\n })\r\n \r\n // 2. 模拟市面“随机性”逻辑:\r\n // 淘宝京东不会按顺序翻页,而是跳跃选取页码,并打乱排序规则\r\n const maxOffsetPages = 20 // 假设数据库中至少有 20 页热推商品\r\n const sorts = ['sales', 'price_asc', 'rating']\r\n \r\n // 随机页码 + 随机排序 = 每次点击都有新发现\r\n const nextRandomPage = Math.floor(Math.random() * maxOffsetPages) + 1\r\n const randomSort = sorts[Math.floor(Math.random() * sorts.length)]\r\n \r\n console.log(`[refreshRecommend] 换一批: 随机页=${nextRandomPage}, 随机排=${randomSort}`)\r\n \r\n const hotResp = await supabaseService.searchProducts('', nextRandomPage, 6, randomSort)\r\n let recommends = hotResp.data\r\n \r\n // 3. 兜底逻辑:如果随机到的页码没数据,回退到第 1 页\r\n if (recommends.length === 0) {\r\n const fallbackResp = await supabaseService.searchProducts('', 1, 6, 'sales')\r\n recommends = fallbackResp.data\r\n }\r\n \r\n // 4. 前端打乱 (Shuffle):即使是同一页数据,乱序排布也会增加“新鲜感”\r\n if (recommends.length > 0) {\r\n recommends.sort(() => Math.random() - 0.5)\r\n updateRecommendList(recommends)\r\n \r\n uni.hideLoading()\r\n uni.showToast({\r\n title: '已为你换一批好物',\r\n icon: 'none',\r\n duration: 1000\r\n })\r\n } else {\r\n uni.hideLoading()\r\n }\r\n } catch (error) {\r\n uni.hideLoading()\r\n console.error('刷新推荐失败:', error)\r\n uni.showToast({ title: '加载失败,请重试', icon: 'none' })\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\n// 加载数据\r\nconst loadCartData = async () => {\r\n\tloading.value = true\r\n\t\r\n\ttry {\r\n\t\t// 获取会员折扣信息\r\n\t\tlet memberDiscount = 1.0\r\n\t\ttry {\r\n\t\t\tconst memberInfo = await supabaseService.getUserMemberInfo()\r\n\t\t\tconst discountRaw = memberInfo.get('discount')\r\n\t\t\tif (discountRaw != null) {\r\n\t\t\t\tmemberDiscount = discountRaw as number\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tconsole.log('获取会员信息失败,使用默认折扣:', e)\r\n\t\t}\r\n\t\t\r\n\t\t// 从Supabase加载购物车数据\r\n\t\tconst supabaseCartItems = await supabaseService.getCartItems()\r\n\t\t\r\n\t\t// 转换数据格式以匹配前端界面\r\n\t\tconst transformedItems = supabaseCartItems.map((item: SupabaseCartItem): LocalCartItem => {\r\n\t\t\t// 调试日志:打印每条商品数据的关键字段\r\n\t\t\tconsole.log(`CartItem raw: id=${item.id}, shop_id=${item.shop_id}, shop_name=${item.shop_name}, name=${item.product_name}, price=${item.product_price}`);\r\n\t\t\t\r\n\t\t\t// 关键修复:确保shopId有值,如果后端返回null/undefined,使用'default_shop'作为分组键\r\n\t\t\tconst shopId = (item.shop_id != null && item.shop_id !== '') ? item.shop_id : 'default_shop'\r\n\t\t\tconst shopName = (item.shop_name != null && item.shop_name !== '') ? item.shop_name : '商城优选'\r\n\t\t\t\r\n\t\t\t// 计算会员价\r\n\t\t\tconst originalPrice = item.product_price != null ? item.product_price : 0\r\n\t\t\tlet memberPrice = 0\r\n\t\t\tif (memberDiscount > 0 && memberDiscount < 1 && originalPrice > 0) {\r\n\t\t\t\tmemberPrice = Math.round(originalPrice * memberDiscount * 100) / 100\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn {\r\n\t\t\t\tid: item.id,\r\n\t\t\t\tshopId: shopId,\r\n\t\t\t\tshopName: shopName,\r\n\t\t\t\tname: item.product_name ?? '未知商品',\r\n\t\t\t\tprice: originalPrice,\r\n\t\t\t\toriginalPrice: originalPrice,\r\n\t\t\t\tmemberPrice: memberPrice,\r\n\t\t\t\timage: item.product_image ?? '/static/images/default-product.png',\r\n\t\t\t\tspec: item.product_specification ?? '标准规格',\r\n\t\t\t\tquantity: item.quantity ?? 1,\r\n\t\t\t\tselected: item.selected ?? false,\r\n\t\t\t\tproductId: item.product_id ?? '',\r\n\t\t\t\tskuId: item.sku_id ?? '',\r\n\t\t\t\tmerchantId: item.merchant_id ?? ''\r\n\t\t\t} as LocalCartItem\r\n\t\t})\r\n\t\t\r\n\t\tconsole.log('Transformed items count:', transformedItems.length);\r\n\t\tcartItems.value = transformedItems\r\n\t\t\r\n\t\t// 加载推荐商品(优先获取推荐位商品,如果没有则通过搜索获取热销商品)\r\n let recommends = await supabaseService.getRecommendedProducts(6)\r\n \r\n // 如果没有设置推荐商品,则获取热销商品作为补充\r\n if (recommends.length === 0) {\r\n const hotResp = await supabaseService.searchProducts('', 1, 6, 'sales')\r\n recommends = hotResp.data\r\n }\r\n\r\n if (recommends.length > 0) {\r\n recommendProducts.value = recommends.map((p: Product): RecommendProduct => {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tid: p.id,\r\n\t\t\t\t\tshopId: p.merchant_id ?? 'unknown',\r\n\t\t\t\t\tshopName: p.shop_name ?? '商城推荐',\r\n\t\t\t\t\tname: p.name,\r\n\t\t\t\t\tprice: p.base_price ?? p.market_price ?? 0,\r\n\t\t\t\t\timage: p.main_image_url ?? p.image_url ?? '/static/images/default-product.png',\r\n\t\t\t\t\tskuId: '',\r\n\t\t\t\t\tmerchant_id: p.merchant_id ?? ''\r\n\t\t\t\t}\r\n\t\t\t})\r\n } else {\r\n recommendProducts.value = []\r\n }\r\n\t} catch (error) {\r\n\t\tconsole.error('加载购物车数据失败:', error)\r\n\t\tcartItems.value = []\r\n\t} finally {\r\n\t\tloading.value = false\r\n\t}\r\n}\r\n\r\nonShow(() => {\r\n\tloadCartData()\r\n})\r\n\r\n// 商品操作 - 更新选中状态到Supabase\r\nconst toggleSelect = async (itemId: string) => {\r\n // 乐观更新\r\n\tconst index = cartItems.value.findIndex(item => item.id === itemId)\r\n\tif (index !== -1) {\r\n\t\tconst newSelected = !cartItems.value[index].selected\r\n\t\tcartItems.value[index].selected = newSelected\r\n\t\tcartItems.value = [...cartItems.value] // 触发响应式更新\r\n\t\t\r\n\t\t// 更新到Supabase\r\n\t\tconst success = await supabaseService.updateCartItemSelection(itemId, newSelected)\r\n\t\tif (!success) {\r\n\t\t\tconsole.error('更新选中状态失败')\r\n\t\t\t// 恢复状态\r\n\t\t\tcartItems.value[index].selected = !newSelected\r\n\t\t\tcartItems.value = [...cartItems.value]\r\n uni.showToast({ title: '网络异常,请重试', icon: 'none' })\r\n\t\t}\r\n\t}\r\n}\r\n\r\nconst toggleShopSelect = async (shopId: string) => {\r\n\tconsole.log('[toggleShopSelect] shopId:', shopId)\r\n\tconsole.log('[toggleShopSelect] shopId length:', shopId.length)\r\n\tconsole.log('[toggleShopSelect] cartItems.value.length:', cartItems.value.length)\r\n\t\r\n\t// 用 for 循环替代 filter,避免安卓端 UTS filter 的问题\r\n\tconst shopItems: LocalCartItem[] = []\r\n\tfor (let i = 0; i < cartItems.value.length; i++) {\r\n\t\tconst item = cartItems.value[i]\r\n\t\tconst itemShopId = item.shopId\r\n\t\t// 安卓端字符串比较问题:使用 localeCompare 或逐字符比较\r\n\t\tconst isMatch = compareStrings(itemShopId, shopId)\r\n\t\tconsole.log('[toggleShopSelect] checking item:', item.id, 'item.shopId:', itemShopId, 'match:', isMatch)\r\n\t\tif (isMatch) {\r\n\t\t\tshopItems.push(item)\r\n\t\t}\r\n\t}\r\n\tconsole.log('[toggleShopSelect] shopItems count:', shopItems.length)\r\n\t\r\n\tif (shopItems.length === 0) return\r\n\t\r\n\t// 用 for 循环替代 every\r\n\tlet allSelected = true\r\n\tfor (let i = 0; i < shopItems.length; i++) {\r\n\t\tif (!shopItems[i].selected) {\r\n\t\t\tallSelected = false\r\n\t\t\tbreak\r\n\t\t}\r\n\t}\r\n\tconst newState = !allSelected\r\n\tconsole.log('[toggleShopSelect] allSelected:', allSelected, 'newState:', newState)\r\n\t\r\n\tconst shopItemIds: string[] = []\r\n\tfor (let i = 0; i < shopItems.length; i++) {\r\n\t\tshopItemIds.push(shopItems[i].id)\r\n\t}\r\n\tconsole.log('[toggleShopSelect] shopItemIds:', shopItemIds)\r\n\t\r\n\t// 创建全新的数组来触发响应式更新\r\n\tconst newCartItems: LocalCartItem[] = []\r\n\tfor (let i = 0; i < cartItems.value.length; i++) {\r\n\t\tconst item = cartItems.value[i]\r\n\t\tconst isMatch = compareStrings(item.shopId, shopId)\r\n\t\tif (isMatch) {\r\n\t\t\tconsole.log('[toggleShopSelect] updating item:', item.id, 'to selected:', newState)\r\n\t\t\t// 创建新的对象\r\n\t\t\tconst newItem: LocalCartItem = {\r\n\t\t\t\tid: item.id,\r\n\t\t\t\tshopId: item.shopId,\r\n\t\t\t\tshopName: item.shopName,\r\n\t\t\t\tname: item.name,\r\n\t\t\t\tprice: item.price,\r\n\t\t\t\toriginalPrice: item.originalPrice,\r\n\t\t\t\tmemberPrice: item.memberPrice,\r\n\t\t\t\timage: item.image,\r\n\t\t\t\tspec: item.spec,\r\n\t\t\t\tquantity: item.quantity,\r\n\t\t\t\tselected: newState,\r\n\t\t\t\tproductId: item.productId,\r\n\t\t\t\tskuId: item.skuId,\r\n\t\t\t\tmerchantId: item.merchantId\r\n\t\t\t}\r\n\t\t\tnewCartItems.push(newItem)\r\n\t\t} else {\r\n\t\t\tnewCartItems.push(item)\r\n\t\t}\r\n\t}\r\n\t// 替换整个数组\r\n\tcartItems.value = newCartItems\r\n\r\n\t// 批量更新到Supabase\r\n\tconst success = await supabaseService.batchUpdateCartItemSelection(shopItemIds, newState)\r\n\t\r\n\tif (!success) {\r\n\t\tconsole.error('批量更新店铺商品选中状态失败')\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '操作失败',\r\n\t\t\ticon: 'none'\r\n\t\t})\r\n\t\t// 重新加载数据以确保状态一致\r\n\t\tloadCartData()\r\n\t}\r\n}\r\n\r\nconst toggleSelectAll = async () => {\r\n // 目标状态:如果当前全选,则取消全选;否则全选\r\n\tconst newSelectedState = !allSelected.value\r\n \r\n // 乐观更新\r\n\tconst oldItems = JSON.parse(JSON.stringify(cartItems.value)) as LocalCartItem[]\r\n\tconst selectedItems = cartItems.value.map((item): LocalCartItem => {\r\n item.selected = newSelectedState\r\n return item\r\n })\r\n cartItems.value = selectedItems\r\n\t\r\n\t// 更新到Supabase\r\n\tconst itemIds = cartItems.value.map(item => item.id)\r\n if (itemIds.length === 0) return\r\n\r\n\tconst success = await supabaseService.batchUpdateCartItemSelection(itemIds, newSelectedState)\r\n\t\r\n\tif (!success) {\r\n\t\tconsole.error('批量更新选中状态失败')\r\n\t\tcartItems.value = oldItems\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '操作失败',\r\n\t\t\ticon: 'none'\r\n\t\t})\r\n\t}\r\n}\r\n\r\nconst increaseQuantity = async (itemId: string) => {\r\n if (updatingItems.value.has(itemId)) return\r\n \r\n\tconst index = cartItems.value.findIndex(item => item.id === itemId)\r\n\tif (index !== -1) {\r\n updatingItems.value.add(itemId)\r\n\t\tconst newQuantity = cartItems.value[index].quantity + 1\r\n\t\tcartItems.value[index].quantity = newQuantity\r\n\t\tcartItems.value = [...cartItems.value]\r\n\t\t\r\n\t\t// 更新到Supabase\r\n\t\tconst success = await supabaseService.updateCartItemQuantity(itemId, newQuantity)\r\n updatingItems.value.delete(itemId)\r\n\r\n\t\tif (!success) {\r\n\t\t\tconsole.error('更新商品数量失败')\r\n\t\t\t// 恢复状态\r\n\t\t\tcartItems.value[index].quantity = newQuantity - 1\r\n\t\t\tcartItems.value = [...cartItems.value]\r\n uni.showToast({ title: '更新失败', icon: 'none' })\r\n\t\t}\r\n\t}\r\n}\r\n\r\nconst decreaseQuantity = async (itemId: string) => {\r\n if (updatingItems.value.has(itemId)) return\r\n\r\n\tconst index = cartItems.value.findIndex(item => item.id === itemId)\r\n\tif (index !== -1) {\r\n\t\tif (cartItems.value[index].quantity > 1) {\r\n updatingItems.value.add(itemId)\r\n\t\t\tconst newQuantity = cartItems.value[index].quantity - 1\r\n\t\t\tcartItems.value[index].quantity = newQuantity\r\n\t\t\tcartItems.value = [...cartItems.value]\r\n\t\t\t\r\n\t\t\t// 更新到Supabase\r\n\t\t\tconst success = await supabaseService.updateCartItemQuantity(itemId, newQuantity)\r\n updatingItems.value.delete(itemId)\r\n\r\n\t\t\tif (!success) {\r\n\t\t\t\tconsole.error('更新商品数量失败')\r\n\t\t\t\t// 恢复状态\r\n\t\t\t\tcartItems.value[index].quantity = newQuantity + 1\r\n\t\t\t\tcartItems.value = [...cartItems.value]\r\n uni.showToast({ title: '更新失败', icon: 'none' })\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// 数量为1时,询问是否删除\r\n\t\t\tuni.showModal({\r\n\t\t\t\ttitle: '提示',\r\n\t\t\t\tcontent: '确定要从购物车移除该商品吗?',\r\n\t\t\t\tsuccess: (res) => {\r\n\t\t\t\t\tif (res.confirm) {\r\n\t\t\t\t\t\t// 从Supabase删除\r\n\t\t\t\t\t\tsupabaseService.deleteCartItem(itemId).then((success) => {\r\n\t\t\t\t\t\t\tif (success) {\r\n\t\t\t\t\t\t\t\tcartItems.value.splice(index, 1)\r\n\t\t\t\t\t\t\t\tcartItems.value = [...cartItems.value]\r\n\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\ttitle: '已移除',\r\n\t\t\t\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tconsole.error('删除商品失败')\r\n\t\t\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\t\t\ttitle: '删除失败',\r\n\t\t\t\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// 删除商品 - 增加保存逻辑\r\nconst deleteSelectedItems = async () => {\r\n\tif (selectedCount.value === 0) {\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '请选择要删除的商品',\r\n\t\t\ticon: 'none'\r\n\t\t})\r\n\t\treturn\r\n\t}\r\n\t\r\n\tuni.showModal({\r\n\t\ttitle: '提示',\r\n\t\tcontent: `确定要删除选中的 ${selectedCount.value} 件商品吗?`,\r\n\t\tsuccess: (res) => {\r\n\t\t\tif (res.confirm) {\r\n\t\t\t\t// 获取选中的商品ID\r\n\t\t\t\tconst selectedItemIds = cartItems.value\r\n\t\t\t\t\t.filter(item => item.selected)\r\n\t\t\t\t\t.map(item => item.id)\r\n\t\t\t\t\r\n\t\t\t\t// 批量删除到Supabase\r\n\t\t\t\tsupabaseService.batchDeleteCartItems(selectedItemIds).then((success) => {\r\n\t\t\t\t\tif (success) {\r\n\t\t\t\t\t\t// 从本地列表移除\r\n\t\t\t\t\t\tcartItems.value = cartItems.value.filter(item => !item.selected)\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// 如果购物车删空了,退出管理模式\r\n\t\t\t\t\t\tif (cartItems.value.length === 0) {\r\n\t\t\t\t\t\t\tisManageMode.value = false\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: '删除成功',\r\n\t\t\t\t\t\t\ticon: 'success'\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tconsole.error('批量删除商品失败')\r\n\t\t\t\t\t\tuni.showToast({\r\n\t\t\t\t\t\t\ttitle: '删除失败',\r\n\t\t\t\t\t\t\ticon: 'none'\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\t})\r\n}\r\n\r\nconst addToCart = async (product: RecommendProduct) => {\r\n\tuni.showLoading({ title: '检查商品...' })\r\n\ttry {\r\n\t\tconst productId = product.id\r\n\t\tconst skuId = product.skuId\r\n\t\tconst merchantId = product.merchant_id\r\n\t\t\r\n\t\t// 检查商品是否有SKU\r\n\t\tconst skus = await supabaseService.getProductSkus(productId)\r\n\t\tuni.hideLoading()\r\n\t\t\r\n\t\tif (skus.length > 0) {\r\n\t\t\t// 有规格,提示并跳转到商品详情页选择规格\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '请选择规格',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: '/pages/mall/consumer/product-detail?id=' + productId\r\n\t\t\t\t})\r\n\t\t\t}, 500)\r\n\t\t} else {\r\n\t\t\t// 无规格,直接加入购物车\r\n\t\t\tuni.showLoading({ title: '添加中...' })\r\n\t\t\tconst success = await supabaseService.addToCart(productId, 1, skuId, merchantId)\r\n\t\t\tuni.hideLoading()\r\n\t\t\tif (success) {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: '已添加到购物车',\r\n\t\t\t\t\ticon: 'success'\r\n\t\t\t\t})\r\n\t\t\t\t\r\n\t\t\t\t// 重新加载购物车数据\r\n\t\t\t\tloadCartData()\r\n\t\t\t} else {\r\n\t\t\t\tconsole.error('添加商品到购物车失败')\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: '添加失败',\r\n\t\t\t\t\ticon: 'none'\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error('添加商品到购物车异常:', error)\r\n\t\tuni.hideLoading()\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '添加失败',\r\n\t\t\ticon: 'none'\r\n\t\t})\r\n\t}\r\n}\r\n\r\n// 导航函数\r\nconst navigateToShop = (shopId: string, merchantId: any) => {\r\n // Prevent navigation for invalid shops\r\n if (shopId == '' || shopId === 'default_shop' || shopId === 'unknown') return\r\n \r\n\tlet url = `/pages/mall/consumer/shop-detail?id=${shopId}`\r\n\tif (merchantId != null) {\r\n const mId = `${merchantId}`\r\n if (mId !== '' && mId !== 'null' && mId !== 'undefined' && mId !== 'false') {\r\n url += `&merchantId=${mId}`\r\n }\r\n\t}\r\n\tuni.navigateTo({ url })\r\n}\r\n\r\nconst goShopping = () => {\r\n\tuni.switchTab({ url: '/pages/main/index' })\r\n}\r\n\r\nconst navigateToProduct = (product: any) => {\r\n\tconsole.log('navigateToProduct', product)\r\n\t\r\n\t// 使用 JSON 转换确保可以作为 JSONObject 处理,兼容 LocalCartItem 类型和普通对象\r\n\tconst productJson = JSON.parse(JSON.stringify(product)) as UTSJSONObject\r\n\t\r\n\t// 使用productId(如果存在)作为跳转的商品ID,否则使用id\r\n\tlet productId = productJson.getString('productId')\r\n\tif (productId == null || productId == '') {\r\n\t\tproductId = productJson.getString('id')\r\n\t}\r\n\t\r\n\tif (productId == null || productId == '') {\r\n\t\tconsole.error('无法获取商品ID', product)\r\n\t\treturn\r\n\t}\r\n\r\n\t// 传递完整的参数,确保商品详情页能正确加载\r\n\tlet paramsArr: string[] = []\r\n\tparamsArr.push('id=' + encodeURIComponent(productId))\r\n\tparamsArr.push('productId=' + encodeURIComponent(productId))\r\n\t\r\n\tconst price = productJson.getNumber('price') ?? 0\r\n\tparamsArr.push('price=' + price)\r\n\t\r\n\tlet originalPrice = productJson.getNumber('original_price')\r\n\tif (originalPrice == null) {\r\n\t\toriginalPrice = productJson.getNumber('originalPrice')\r\n\t}\r\n\tif (originalPrice == null) {\r\n\t\toriginalPrice = parseFloat((price * 1.2).toFixed(2))\r\n\t}\r\n\tparamsArr.push('originalPrice=' + originalPrice)\r\n\r\n\tconst name = productJson.getString('name') ?? ''\r\n\tparamsArr.push('name=' + encodeURIComponent(name))\r\n\t\r\n\tconst image = productJson.getString('image') ?? '/static/product1.jpg'\r\n\tparamsArr.push('image=' + encodeURIComponent(image))\r\n\t\r\n\tconst url = `/pages/mall/consumer/product-detail?${paramsArr.join('&')}`\r\n\tconsole.log('Navigate to:', url)\r\n\t\r\n\tuni.navigateTo({ \r\n\t\turl: url\r\n\t})\r\n}\r\n\r\nconst goToCheckout = () => {\r\n\tif (selectedCount.value === 0) {\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '请选择商品',\r\n\t\t\ticon: 'none'\r\n\t\t})\r\n\t\treturn\r\n\t}\r\n\t\r\n\t// 获取选中的商品 (直接过滤cartItems,不依赖cartGroups,确保扁平化传递)\r\n\tconst selectedItems = cartItems.value\r\n\t\t.filter(item => item.selected)\r\n\t\t.map(item => ({\r\n\t\t\tid: item.id,\r\n\t\t\tproduct_id: item.productId ?? item.id,\r\n\t\t\tsku_id: item.skuId ?? item.id,\r\n\t\t\tproduct_name: item.name,\r\n shop_id: item.shopId, // 关键:保留shopId用于分组\r\n shop_name: item.shopName, // 关键:保留shopName\r\n\t\t\tmerchant_id: item.merchantId,\r\n\t\t\tproduct_image: item.image,\r\n\t\t\tsku_specifications: item.spec,\r\n\t\t\tprice: item.price, // 确保是数字\r\n\t\t\tquantity: item.quantity // 确保是数字\r\n\t\t}))\r\n\r\n // 关键修复:将结算数据写入 Storage,确保 checkout 页面能稳定获取\r\n uni.setStorageSync('checkout_type', 'cart')\r\n // 使用纯JSON序列化防止复杂对象引发的问题\r\n try {\r\n uni.setStorageSync('checkout_items', JSON.stringify(selectedItems))\r\n } catch (e) {\r\n console.error('存储结算数据失败', e)\r\n uni.showToast({ title: '系统异常,请重试', icon: 'none' })\r\n return\r\n }\r\n\r\n\t// 跳转到结算页面并传递数据\r\n\tuni.navigateTo({\r\n\t\turl: '/pages/mall/consumer/checkout'\r\n\t})\r\n}\r\n</script>\r\n\r\n<style>\r\n.cart-page {\r\n\tflex: 1; /* 使用 Flex 撑满 */\r\n height: 100%; /* 兼容性考虑,部分环境需要 */\r\n\tbackground-color: #f5f5f5;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n overflow: hidden; /* 防止整页滚动 */\r\n}\r\n\r\n/* 智能导航栏 */\r\n\t.smart-navbar {\r\n\t\tposition: fixed;\r\n\t\ttop: 0;\r\n\t\tleft: 0;\r\n\t\tright: 0;\r\n\t\tbackground-color: #ff5000;\r\n\t\tz-index: 1000;\r\n\t\tbox-shadow: 0 2px 12px rgba(255, 80, 0, 0.15);\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tjustify-content: flex-start;\r\n\t\tflex-shrink: 0;\r\n\t}\r\n\r\n.nav-container {\r\n\tpadding: 0 16px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n\twidth: 100%;\r\n\tmax-width: 1400px;\r\n\tmargin: 0 auto;\r\n\theight: 44px; /* 统一高度 44px */\r\n}\r\n\r\n.nav-title {\r\n\tfont-size: 18px;\r\n\tfont-weight: bold;\r\n\tcolor: white;\r\n}\r\n\r\n.nav-actions {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n}\r\n\r\n.action-btn {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tbackground: rgba(255, 255, 255, 0.2);\r\n\tpadding: 4px 12px;\r\n\tborder-radius: 20px;\r\n\t/* cursor: pointer; REMOVED */\r\n\ttransition: all 0.2s ease;\r\n}\r\n\r\n.action-btn:hover {\r\n\tbackground: rgba(255, 255, 255, 0.3);\r\n}\r\n\r\n.action-icon {\r\n\tfont-size: 14px;\r\n\tmargin-right: 4px;\r\n\tcolor: white;\r\n}\r\n\r\n.action-text {\r\n\tfont-size: 12px;\r\n\tcolor: white;\r\n\tfont-weight: bold;\r\n}\r\n\r\n/* 导航栏占位符 */\r\n.navbar-placeholder {\r\n\twidth: 100%;\r\n\tflex-shrink: 0;\r\n}\r\n\r\n/* 内容区 */\r\n.cart-content {\r\n\tflex: 1;\r\n /* 必须设置 height: 0 或 overflow: hidden 可以在 flex 容器中正确收缩 */\r\n height: 0px; \r\n width: 100%;\r\n\tpadding-bottom: 20px; /* 减小内边距,因为结算栏已在内容流中 */\r\n}\r\n\r\n/* 购物车操作栏 (移至推荐商品上方) */\r\n.cart-action-bar {\r\n background-color: white;\r\n margin: 10px;\r\n border-radius: 12px;\r\n box-shadow: 0 2px 10px rgba(0,0,0,0.05);\r\n z-index: 10;\r\n}\r\n\r\n.action-bar-content {\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 12px 15px;\r\n}\r\n\r\n.action-left {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n}\r\n\r\n.action-right {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n}\r\n\r\n.select-all {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n}\r\n\r\n.select-all-text {\r\n font-size: 14px;\r\n color: #333;\r\n margin-left: 8px;\r\n}\r\n\r\n.total-info {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: baseline;\r\n margin-right: 15px;\r\n}\r\n\r\n.total-text {\r\n font-size: 14px;\r\n color: #666;\r\n}\r\n\r\n.total-price {\r\n font-size: 18px;\r\n color: #ff5000;\r\n font-weight: bold;\r\n margin-left: 4px;\r\n}\r\n\r\n.checkout-btn {\r\n background-color: #ff5000;\r\n color: white;\r\n border: none;\r\n border-radius: 20px;\r\n padding: 8px 15px;\r\n font-size: 14px;\r\n font-weight: bold;\r\n min-width: 100px;\r\n}\r\n\r\n.delete-btn {\r\n background-color: #fff;\r\n color: #ff5000;\r\n border: 1px solid #ff5000;\r\n border-radius: 20px;\r\n padding: 8px 15px;\r\n font-size: 14px;\r\n font-weight: bold;\r\n min-width: 100px;\r\n}\r\n\r\n/* 空购物车 */\r\n.empty-cart {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tpadding: 60px 20px;\r\n\ttext-align: center;\r\n}\r\n\r\n.empty-icon {\r\n\tfont-size: 80px;\r\n\tcolor: #ddd;\r\n\tmargin-bottom: 20px;\r\n}\r\n\r\n.empty-title {\r\n\tfont-size: 18px;\r\n\tcolor: #666;\r\n\tmargin-bottom: 10px;\r\n}\r\n\r\n.empty-desc {\r\n\tfont-size: 14px;\r\n\tcolor: #999;\r\n\tmargin-bottom: 30px;\r\n}\r\n\r\n.go-shopping-btn {\r\n\tbackground-color: #ff5000;\r\n\tcolor: white;\r\n\tborder: none;\r\n\tborder-radius: 25px;\r\n\tpadding: 10px 40px;\r\n\tfont-size: 16px;\r\n}\r\n\r\n/* 购物车商品列表 */\r\n.cart-list {\r\n\tbackground-color: transparent; /* 背景透明,因为每个店铺有自己的卡片 */\r\n\tmargin: 10px;\r\n\tborder-radius: 0;\r\n\toverflow: visible;\r\n}\r\n\r\n.shop-group {\r\n\tbackground-color: white;\r\n\tborder-radius: 12px;\r\n\tmargin-bottom: 12px;\r\n\toverflow: hidden;\r\n}\r\n\r\n.shop-header {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* 强制横向排列 */\r\n\talign-items: center;\r\n\tjustify-content: flex-start; /* 靠左对齐 */\r\n\tpadding: 12px;\r\n\tborder-bottom: 1px solid #f5f5f5;\r\n}\r\n\r\n.shop-select {\r\n\twidth: 24px;\r\n\theight: 24px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tmargin-right: 8px;\r\n\tflex-shrink: 0; /* 防止被压缩 */\r\n}\r\n\r\n.shop-icon {\r\n\tfont-size: 16px;\r\n\tmargin-right: 6px;\r\n\tflex-shrink: 0;\r\n}\r\n\r\n.shop-name {\r\n\tfont-size: 14px;\r\n\tfont-weight: 700;\r\n\tcolor: #333;\r\n\tmargin-right: 4px;\r\n\t/* 自适应宽度,但不超过剩余空间 */\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\twhite-space: nowrap;\r\n}\r\n\r\n.shop-arrow {\r\n\tfont-size: 12px;\r\n\tcolor: #999;\r\n\tflex-shrink: 0;\r\n}\r\n\r\n.cart-item {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* 显式横向排列 */\r\n\tpadding: 12px; /* 减小内边距 */\r\n\tborder-bottom: 1px solid #f5f5f5;\r\n\talign-items: center;\r\n\theight: 100px; /* 固定高度节省空间 */\r\n}\r\n\r\n.cart-item:last-child {\r\n\tborder-bottom: none;\r\n}\r\n\r\n.item-select {\r\n\twidth: 30px; /* 减小选择框区域 */\r\n\theight: 100%;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tmargin-right: 5px;\r\n}\r\n\r\n.selected-icon {\r\n\twidth: 18px;\r\n\theight: 18px;\r\n\tbackground-color: #ff5000;\r\n\tcolor: white;\r\n\tborder-radius: 9px;\r\n\ttext-align: center;\r\n\tline-height: 18px;\r\n\tfont-size: 12px;\r\n}\r\n\r\n.unselected-icon {\r\n\twidth: 18px;\r\n\theight: 18px;\r\n\tborder: 1px solid #ddd;\r\n\tborder-radius: 9px;\r\n}\r\n\r\n.item-image {\r\n\twidth: 70px; /* 减小图片尺寸 */\r\n\theight: 70px;\r\n\tborder-radius: 6px;\r\n\tmargin-right: 10px;\r\n\tflex-shrink: 0;\r\n}\r\n\r\n.item-info {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tjustify-content: space-between;\r\n\theight: 70px; /* 与图片高度一致 */\r\n\toverflow: hidden;\r\n}\r\n\r\n.info-top {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n}\r\n\r\n.item-name {\r\n\tfont-size: 14px; /* 稍微减小字体 */\r\n\tcolor: #333;\r\n\tmargin-bottom: 2px;\r\n\t/* display: -webkit-box; REMOVED */\r\n\t/* -webkit-line-clamp: 1; REMOVED */\r\n\t/* -webkit-box-orient: vertical; REMOVED */\r\n\toverflow: hidden;\r\n\tfont-weight: bold;\r\n\ttext-overflow: ellipsis;\r\n}\r\n\r\n.item-spec {\r\n\tfont-size: 12px;\r\n\tcolor: #999;\r\n\tmargin-bottom: auto; /* 自动占据中间空间 */\r\n}\r\n\r\n.item-footer {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* 显式设置横向排列 */\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\twidth: 100%; /* 确保占满宽度 */\r\n}\r\n\r\n.item-price {\r\n\tfont-size: 16px;\r\n\tcolor: #ff5000;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.quantity-control {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tbackground-color: #f5f5f5;\r\n\tborder-radius: 12px;\r\n\toverflow: hidden;\r\n\theight: 28px;\r\n}\r\n\r\n.quantity-btn {\r\n\twidth: 28px;\r\n\theight: 28px;\r\n\ttext-align: center;\r\n\tline-height: 28px;\r\n\tfont-size: 16px;\r\n\tcolor: #333;\r\n\tbackground-color: #eee;\r\n}\r\n\r\n.quantity-value {\r\n\tmin-width: 36px;\r\n\ttext-align: center;\r\n\tfont-size: 14px;\r\n\tline-height: 28px;\r\n\tcolor: #333;\r\n}\r\n\r\n/* 推荐商品 */\r\n.recommend-section {\r\n\tmargin: 20px 10px;\r\n\tbackground-color: white;\r\n\tborder-radius: 10px;\r\n\tpadding: 15px;\r\n}\r\n\r\n.section-header {\r\n\tmargin-bottom: 15px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n}\r\n\r\n.refresh-btn {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tpadding: 4px 8px;\r\n}\r\n\r\n.refresh-icon {\r\n\tfont-size: 14px;\r\n\tmargin-right: 4px;\r\n}\r\n\r\n.refresh-text {\r\n\tfont-size: 12px;\r\n\tcolor: #999;\r\n}\r\n\r\n.section-title {\r\n\tfont-size: 16px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n}\r\n\r\n.recommend-list {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tflex-wrap: wrap;\r\n\tjustify-content: space-between;\r\n\t/* grid-template-columns: repeat(2, 1fr); REMOVED */\r\n\t/* gap: 12px; REMOVED */\r\n}\r\n\r\n.recommend-item {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tbackground: #fff;\r\n\tborder-radius: 8px;\r\n\toverflow: hidden;\r\n\twidth: 48%; /* 替换 grid 1fr auto fit */\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n.recommend-image {\r\n\twidth: 100%;\r\n\theight: 170px; /* 显式高度 */\r\n\t/* aspect-ratio: 1; REMOVED */\r\n\t/* object-fit: cover; REMOVED */\r\n\tborder-radius: 8px;\r\n\tmargin-bottom: 8px;\r\n\tbackground: #f5f5f5;\r\n}\r\n\r\n\t.recommend-name {\r\n\t\tfont-size: 13px;\r\n\t\tcolor: #333;\r\n\t\tmargin-bottom: 5px;\r\n\t\tline-height: 1.4;\r\n\t\theight: 36px;\r\n\t\toverflow: hidden;\r\n\t\t/* display: -webkit-box; REMOVED */\r\n\t\t/* -webkit-line-clamp: 2; REMOVED */\r\n\t\t/* -webkit-box-orient: vertical; REMOVED */\r\n\t\ttext-overflow: ellipsis;\r\n\t}\r\n\r\n.recommend-bottom {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t\tpadding-right: 8px;\r\n\t}\r\n\r\n\t.recommend-price {\r\n\t\tfont-size: 15px;\r\n\t\tcolor: #ff5000;\r\n\t\tfont-weight: bold;\r\n\t}\r\n\t\r\n\t.recommend-add-btn {\r\n\t\twidth: 24px;\r\n\t\theight: 24px;\r\n\t\tbackground-color: #ff5000;\r\n\t\tborder-radius: 12px;\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t}\r\n\t\r\n\t.recommend-add-icon {\r\n\t\tcolor: white;\r\n\t\tfont-size: 16px;\r\n\t\tline-height: 1;\r\n\t\tfont-weight: bold;\r\n\t}\r\n\r\n\t/* 响应式布局优化 */\r\n@media screen and (min-width: 768px) {\r\n\t.cart-list, \r\n\t.recommend-section {\r\n\t\tmargin: 20px auto;\r\n\t\twidth: 95%; /* max-width -> width */\r\n\t}\r\n\r\n\t.recommend-list {\r\n\t\t/* grid-template-columns: repeat(4, 1fr); REMOVED */\r\n\t\t/* gap: 16px; REMOVED */\r\n\t\t/* Flex 布局参数调整在下方 update */\r\n\t}\r\n\t.recommend-item {\r\n\t\twidth: 23%;\r\n\t\tmargin-bottom: 16px;\r\n\t}\r\n}\r\n\r\n@media screen and (min-width: 1024px) {\r\n\t/* 桌面端整体布局调整 */\r\n\t.cart-content {\r\n\t\tpadding: 20px 40px;\r\n\t\tbackground-color: #f5f5f5;\r\n\t}\r\n\r\n\t.cart-list, \r\n\t.recommend-section {\r\n\t\tmargin: 20px auto;\r\n\t\twidth: 96%; /* max-width -> width: percentage is safer */\r\n\t\tmax-width: 1200px;\r\n\t}\r\n\r\n\t/* 店铺分组在桌面端显示为网格布局 */\r\n\t.shop-group {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tbackground: transparent;\r\n\t\tbox-shadow: none;\r\n\t\tborder-radius: 0;\r\n\t\toverflow: visible;\r\n\t}\r\n\r\n\t.shop-header {\r\n\t\tbackground: white;\r\n\t\tborder-radius: 12px;\r\n\t\tmargin-bottom: 12px;\r\n\t\tpadding: 16px 80px 16px 24px; /* 同步增加右侧内边距 */\r\n\t}\r\n\r\n\t/* 购物车商品列表转为列表布局 */\r\n\t.cart-item {\r\n\t\tbackground: white;\r\n\t\tborder-radius: 0;\r\n\t\tpadding: 15px 80px 15px 30px; /* 进一步增加右侧内边距 */\r\n\t\theight: 80px; /* 固定高度 */\r\n\t\tborder-bottom: 1px solid #eee;\r\n\t\tbox-shadow: none;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row; /* 显式设置横向排列 */\r\n\t\talign-items: center; /* 垂直居中 */\r\n\t\twidth: 100%;\r\n\t}\r\n \r\n .cart-item:hover {\r\n background-color: #f9f9f9;\r\n transform: none;\r\n box-shadow: none;\r\n }\r\n\r\n\t.item-image {\r\n\t\twidth: 50px;\r\n\t\theight: 50px;\r\n\t\tmargin-right: 20px;\r\n\t\tflex-shrink: 0;\r\n\t}\r\n\r\n\t.item-info {\r\n\t\tflex: 1;\r\n height: 100%;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row; /* 信息区域横向排列 */\r\n\t\talign-items: center;\r\n justify-content: space-between;\r\n overflow: visible;\r\n\t}\r\n \r\n .info-top {\r\n flex: 1;\r\n\t\tdisplay: flex;\r\n flex-direction: row; /* 名称和规格横向排列 */\r\n align-items: center;\r\n margin-right: 20px;\r\n\t\theight: 100%;\r\n }\r\n\r\n\t.item-name {\r\n\t\tfont-size: 14px;\r\n width: 250px; /* 固定名称宽度 */\r\n margin-right: 20px;\r\n\t\t/* 限制行数 */\r\n\t\twhite-space: nowrap;\r\n\t\toverflow: hidden;\r\n\t\ttext-overflow: ellipsis;\r\n margin-bottom: 0;\r\n\t}\r\n \r\n .item-spec {\r\n width: 150px;\r\n margin-bottom: 0;\r\n\t\twhite-space: nowrap;\r\n\t\toverflow: hidden;\r\n\t\ttext-overflow: ellipsis;\r\n }\r\n \r\n .item-footer {\r\n width: auto;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row;\r\n justify-content: flex-end;\r\n\t\talign-items: center;\r\n /* gap: 40px; REMOVED */\r\n\t\theight: 100%;\r\n }\r\n \r\n .item-price {\r\n width: 100px;\r\n text-align: right;\r\n\t\tmargin-bottom: 0;\r\n\t\tmargin-right: 40px; /* Replace gap */\r\n }\r\n \r\n .quantity-control {\r\n margin-left: 0;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row;\r\n }\r\n\r\n\t/* 推荐商品优化 */\r\n\t.recommend-list {\r\n\t\t/* grid-template-columns: repeat(5, 1fr); REMOVED */\r\n\t\t/* gap: 20px; REMOVED */\r\n\t}\r\n\t.recommend-item {\r\n\t\twidth: 18%; /* 5列 */\r\n\t\tmargin-bottom: 20px;\r\n\t}\r\n \r\n .recommend-image {\r\n height: 200px; /* 强制高度 */\r\n }\r\n\t\r\n\t/* 底部结算栏优化 */\r\n\t.cart-footer {\r\n\t\tpadding: 0 40px;\r\n\t\twidth: 100%; /* max-width -> width */\r\n\t\tmargin: 0 auto;\r\n\t\tbox-shadow: 0 -2px 10px rgba(0,0,0,0.05);\r\n\t}\r\n\t\r\n\t.footer-content {\r\n\t\tmax-width: 1200px;\r\n\t\tmargin: 0 auto;\r\n\t\twidth: 100%;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: space-between;\r\n\t\talign-items: center;\r\n\t}\r\n}\r\n\r\n@media screen and (min-width: 1400px) {\r\n\t.cart-list, \r\n\t.recommend-section {\r\n\t\twidth: 1400px;\r\n\t}\r\n\r\n\t/* 大屏下购物车商品显示3列 - 移除,保持单列列表 */\r\n\t/* .cart-list .shop-group > view:not(.shop-header) {\r\n\t\tgrid-template-columns: repeat(3, 1fr);\r\n\t} */\r\n\r\n\t.recommend-list {\r\n\t\t/* grid-template-columns: repeat(6, 1fr); REMOVED */\r\n\t}\r\n\t.recommend-item {\r\n\t\twidth: 15%; /* 6 columns approx */\r\n\t}\r\n\t\r\n\t.footer-content {\r\n\t\twidth: 1400px;\r\n\t}\r\n}\r\n\r\n\t/* 购物车操作栏样式 - 自适应横向排列 */\r\n\t.cart-action-bar {\r\n\t\tbackground-color: white;\r\n\t\tmargin: 10px;\r\n\t\tborder-radius: 12px;\r\n\t\tpadding: 10px 15px; /* 减小内边距 */\r\n\t\tbox-shadow: 0 2px 8px rgba(0,0,0,0.05);\r\n\t}\r\n\r\n\t.action-bar-content {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row; /* 强制横向 */\r\n\t\talign-items: center;\r\n\t\tjustify-content: space-between;\r\n\t\twidth: 100%;\r\n /* gap: 20px; REMOVED from .action-bar-content usually in desktop */\r\n\t}\r\n\r\n\t.action-left {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row;\r\n\t\talign-items: center;\r\n\t\tflex-shrink: 0;\r\n\t}\r\n\r\n\t.action-right {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row; /* 强制横向 */\r\n\t\talign-items: center;\r\n\t\tjustify-content: flex-end;\r\n\t\tflex: 1;\r\n\t\tmin-width: 0;\r\n\t}\r\n\t\r\n\t/* 合计信息区域 */\r\n\t.total-info {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row; /* 强制横向 */\r\n\t\talign-items: center;\r\n\t\tmargin-right: 10px;\r\n\t\tflex-shrink: 1; /* 允许压缩 */\r\n\t\toverflow: hidden;\r\n\t}\r\n\t\r\n\t.total-text {\r\n\t\tfont-size: 14px;\r\n\t\tcolor: #333;\r\n\t\tmargin-right: 2px;\r\n\t\twhite-space: nowrap;\r\n\t\tflex-shrink: 0;\r\n\t}\r\n\t\r\n\t.total-price {\r\n\t\tfont-size: 16px;\r\n\t\tcolor: #ff5000;\r\n\t\tfont-weight: bold;\r\n\t\twhite-space: nowrap;\r\n\t\toverflow: hidden;\r\n\t\ttext-overflow: ellipsis;\r\n\t}\r\n\t\r\n\t/* 结算按钮 */\r\n\t.checkout-btn, .delete-btn {\r\n\t\tbackground-color: #ff5000;\r\n\t\tcolor: white;\r\n\t\tborder: none;\r\n\t\tborder-radius: 25px;\r\n\t\tpadding: 6px 16px; /* 减小按钮内边距 */\r\n\t\tfont-size: 14px;\r\n\t\twhite-space: nowrap;\r\n\t\tflex-shrink: 0;\r\n\t\tmargin: 0; /* 移除可能的margin */\r\n\t}\r\n\t\r\n\t.delete-btn {\r\n\t\tbackground-color: #ff3b30;\r\n\t\tpadding: 6px 20px;\r\n\t}\r\n\t\r\n\t/* 全选区域 */\r\n\t.select-all {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row; /* 强制横向 */\r\n\t\talign-items: center;\r\n\t}\r\n\t\r\n\t.select-all-text {\r\n\t\tmargin-left: 8px;\r\n\t\tfont-size: 14px;\r\n\t\tcolor: #333;\r\n\t\twhite-space: nowrap;\r\n\t}\r\n\t\r\n\t/* 响应式调整 */\r\n\t/* 手机端小屏幕优化 */\r\n\t@media screen and (max-width: 375px) {\r\n\t\t.cart-action-bar {\r\n\t\t\tpadding: 10px;\r\n\t\t\tmargin: 10px 5px; /* 减小外边距增加可用宽度 */\r\n\t\t}\r\n\t\t\r\n\t\t.total-text {\r\n\t\t\tfont-size: 12px;\r\n\t\t}\r\n\t\t\r\n\t\t.total-price {\r\n\t\t\tfont-size: 15px;\r\n\t\t}\r\n\t\t\r\n\t\t.checkout-btn, .delete-btn {\r\n\t\t\tpadding: 6px 12px;\r\n\t\t\tfont-size: 12px;\r\n\t\t}\r\n\t\t\r\n\t\t.select-all-text {\r\n\t\t\tfont-size: 13px;\r\n\t\t\tmargin-left: 4px;\r\n\t\t}\r\n\t}\r\n\t\r\n\t/* 平板端优化 */\r\n\t@media screen and (min-width: 768px) {\r\n\t\t.cart-action-bar {\r\n\t\t\tmargin: 20px auto;\r\n\t\t\twidth: 95%; /* max-width -> width */\r\n\t\t\tpadding: 20px;\r\n\t\t}\r\n\t\t\r\n\t\t.action-bar-content {\r\n\t\t\t/* gap: 20px; REMOVED */\r\n\t\t}\r\n\t\t\r\n\t\t.total-price {\r\n\t\t\tfont-size: 20px;\r\n\t\t}\r\n\t\t\r\n\t\t.checkout-btn, .delete-btn {\r\n\t\t\tpadding: 10px 30px;\r\n\t\t\tfont-size: 16px;\r\n\t\t\tmargin-left: 20px; /* Replace gap */\r\n\t\t}\r\n\t}\r\n\t\r\n\t/* 桌面端优化 */\r\n\t@media screen and (min-width: 1024px) {\r\n\t\t.cart-action-bar {\r\n\t\t\twidth: 1200px; /* max-width -> width */\r\n\t\t\tpadding: 20px 30px;\r\n\t\t}\r\n\t\t\r\n\t\t.action-bar-content {\r\n\t\t\tjustify-content: space-between;\r\n\t\t}\r\n\t\t\r\n\t\t.total-info {\r\n\t\t\tmargin-right: 30px;\r\n\t\t}\r\n\t\t\r\n\t\t.total-text {\r\n\t\t\tfont-size: 16px;\r\n\t\t}\r\n\t\t\r\n\t\t.total-price {\r\n\t\t\tfont-size: 22px;\r\n\t\t}\r\n\t\t\r\n\t\t.checkout-btn, .delete-btn {\r\n\t\t\tpadding: 12px 40px;\r\n\t\t\tfont-size: 16px;\r\n\t\t}\r\n\t\t\r\n\t\t.select-all-text {\r\n\t\t\tfont-size: 16px;\r\n\t\t}\r\n\t}\r\n\t\r\n\t/* 大屏幕优化 */\r\n\t@media screen and (min-width: 1400px) {\r\n\t\t.cart-action-bar {\r\n\t\t\twidth: 1400px; /* max-width -> width */\r\n\t\t}\r\n\t}\r\n\r\n .tabbar-safe-area {\r\n height: 100px;\r\n width: 100%;\r\n background-color: transparent;\r\n }\r\n</style>\r\n\r\n",null,null,null,null,null],"names":[],"mappings":"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"} |