import React, { useEffect, useState } from 'react' import { View, Text, Image, ScrollView } from '@tarojs/components' import Taro from '@tarojs/taro' import { useCartContext } from '@/contexts/CartContext' import { useUserContext } from '@/contexts/UserContext' import { pageShopGoods } from '@/api/shop/shopGoods' import type { ShopGoods } from '@/api/shop/shopGoods/model' import EmptyState from '@/components/common/EmptyState' import Loading from '@/components/common/Loading' import { isGuest } from '@/utils/auth' import { requireLogin } from '@/utils/login-guard' definePageConfig({ navigationBarTitleText: '购物车', }) const CartPage: React.FC = () => { const { items, selectedCount, selectedPrice, updateQuantity, toggleSelect, selectAll, removeItem, refresh, loading, removeSelected, addItem } = useCartContext() const { isLoggedIn } = useUserContext() const [recommendGoods, setRecommendGoods] = useState([]) const [recommendPage, setRecommendPage] = useState(1) const [refreshingRecommend, setRefreshingRecommend] = useState(false) useEffect(() => { if (isLoggedIn) { refresh() fetchRecommendGoods(1) } }, [isLoggedIn]) const fetchRecommendGoods = async (page?: number) => { const targetPage = page || recommendPage try { setRefreshingRecommend(true) const res = await pageShopGoods({ page: targetPage, limit: 6 }) if (res && res.list && res.list.length > 0) { setRecommendGoods(res.list || []) setRecommendPage(targetPage + 1) } else { // 没有更多数据时回到第一页重新请求 if (targetPage > 1) { const firstRes = await pageShopGoods({ page: 1, limit: 6 }) setRecommendGoods(firstRes?.list || []) setRecommendPage(2) } else { setRecommendGoods([]) } } } catch (err) { console.error('获取推荐商品失败', err) } finally { setRefreshingRecommend(false) } } // 换一批 const handleRefreshRecommend = () => { if (!refreshingRecommend) { fetchRecommendGoods() } } const handleCheckout = () => { if (!requireLogin({ action: 'checkout', redirect: '/pages/shop/cart' })) return if (selectedCount === 0) { Taro.showToast({ title: '请选择商品', icon: 'none' }) return } Taro.navigateTo({ url: '/pages/shop/checkout' }) } // 未登录状态:展示"购物车是空的"+ 推荐位商品(游客可正常浏览), // 不再直接弹登录页,避免被审核判"拒绝服务"。 if (!isLoggedIn) { return ( requireLogin({ action: 'viewOrder', redirect: '/pages/shop/cart', silent: true })} /> {recommendGoods.length > 0 && ( 猜你喜欢 {refreshingRecommend ? '加载中...' : '换一批'} {recommendGoods.map(goods => ( Taro.navigateTo({ url: `/pages/shop/product-detail?id=${goods.goodsId}` })} > {goods.name || goods.goodsName || '商品名称'} 登录后查看价格 ))} )} ) } return ( {/* 主要内容区域 - 使用ScrollView实现滚动 */} {items.length === 0 && !loading ? ( Taro.switchTab({ url: '/pages/index/index' })} /> ) : ( {/* 全选 */} selectAll(!items.every(i => i.checked))} style={{ backgroundColor: items.length > 0 && items.every(i => i.checked) ? '#0e932e' : 'transparent' }} > {items.length > 0 && items.every(i => i.checked) && } 全选 {selectedCount > 0 && ( 删除选中 )} {/* 商品列表 */} {loading ? ( ) : ( items.map((item) => ( toggleSelect(item.goodsId, item.skuId)} style={{ backgroundColor: item.checked ? '#0e932e' : 'transparent' }} > {item.checked && } {item.goodsName || item.product?.name || item.product?.goodsName || '商品名称'} {item.skuSpec && ( {item.skuSpec} )} ¥{item.skuPrice || item.sku?.price || item.product?.salePrice || item.product?.price || '0'} updateQuantity(item.goodsId, item.skuId, item.quantity - 1)}> - {item.quantity} updateQuantity(item.goodsId, item.skuId, item.quantity + 1)}> + removeItem(item.goodsId, item.skuId)}> )) )} {/* 推荐商品 */} {recommendGoods.length > 0 && ( 猜你喜欢 {refreshingRecommend ? '加载中...' : '换一批'} {recommendGoods.map(goods => ( Taro.navigateTo({ url: `/pages/shop/product-detail?id=${goods.goodsId}` })} > {goods.name || goods.title || '商品名称'} ¥{goods.salePrice || goods.price || '0'} { e.stopPropagation() addItem(goods, undefined, 1) }} > + ))} )} )} {/* 底部结算栏 */} {items.length > 0 && ( 合计: ¥{selectedPrice} 0 ? '#0e932e' : '#ccc' }} onClick={handleCheckout} > 结算({selectedCount}) )} ) } export default CartPage