Completed
As a 小程序用户, I want 在商品列表页面(首页、商品列表页、搜索结果页)点击商品卡片的"添加到购物车"图标时,如果商品有多规格选项,能够弹出规格选择器选择规格后再添加到购物车, so that 无需进入商品详情页就能快速完成多规格商品的购物车添加操作,提升购物体验
parentGoodsId字段正确设置[x] 分析现有商品卡片组件和规格选择器组件 (AC: 1, 2, 3, 4)
mini/src/components/goods-card/index.tsx组件的当前实现,特别是handleAddCart函数mini/src/components/goods-spec-selector/index.tsx组件的API和props接口mini/src/pages/goods-detail/index.tsx)中的规格选择逻辑,作为参考实现[x] 设计商品卡片组件扩展方案 (AC: 1, 2, 3, 4, 5)
showSpecModal控制弹窗显示,selectedSpec记录选择的规格handleAddToCart逻辑parentGoodsId正确传递[x] 实现商品卡片多规格支持 (AC: 1, 2, 3, 4)
mini/src/components/goods-card/index.tsx组件,添加规格选择判断逻辑GoodsSpecSelector组件,支持add-to-cart操作类型handleAddCart函数的多规格处理逻辑showSpecModal、selectedSpec、pendingAction等状态[x] 更新商品卡片使用页面 (AC: 5)
mini/src/pages/index/index.tsx首页,确保传递正确的商品数据给商品卡片mini/src/pages/goods-list/index.tsx商品列表页,确保传递正确的商品数据mini/src/pages/search-result/index.tsx搜索结果页,确保传递正确的商品数据mini/src/components/goods-list/index.tsx商品列表组件,确保数据传递正确[x] 编写单元测试 (AC: 7)
mini/tests/unit/components/goods-card/goods-card.test.tsx测试文件[x] 集成测试和验证 (AC: 1, 2, 3, 4, 5, 6)
[x] 修复多规格商品加入购物车成功但实际未添加的问题 (AC: 2, 4)
mini/目录包含Taro小程序前端代码mini/src/components/goods-card/index.tsxmini/src/components/goods-spec-selector/index.tsxmini/src/components/goods-list/index.tsxmini/src/pages/index/index.tsxmini/src/pages/goods-list/index.tsxmini/src/pages/search-result/index.tsxmini/src/pages/goods-detail/index.tsx (参考实现)mini/src/contexts/CartContext.tsx,包含addToCart和switchSpec函数tests/unit/目录与源码对应结构商品详情页规格选择逻辑 (mini/src/pages/goods-detail/index.tsx):
handleAddToCart函数(第355-417行)包含完整的规格选择逻辑hasSpecOptions)setShowSpecModal(true))onConfirm回调执行添加购物车操作pendingAction状态记录用户意图(加入购物车或立即购买)商品卡片当前实现 (mini/src/components/goods-card/index.tsx):
handleAddCart函数(第41-44行)直接调用onAddCart(data)规格选择器组件 (mini/src/components/goods-spec-selector/index.tsx):
actionType prop(add-to-cart或buy-now)onConfirm回调返回选择的规格信息和数量parentGoodsId参数获取子商品列表商品卡片props扩展:
interface GoodsCardProps {
// 现有props...
hasSpecOptions?: boolean; // 是否有规格选项
parentGoodsId?: number; // 父商品ID(用于获取子商品列表)
goodsId?: number; // 当前商品ID(父商品或子商品ID)
// ...其他props
}
状态管理:
const [showSpecModal, setShowSpecModal] = useState(false);
const [selectedSpec, setSelectedSpec] = useState<GoodsSpecSelection | null>(null);
const [pendingAction, setPendingAction] = useState<'add-to-cart' | null>(null);
修改handleAddCart函数:
const handleAddCart = () => {
if (hasSpecOptions && parentGoodsId) {
// 有多规格选项,弹出规格选择器
setPendingAction('add-to-cart');
setShowSpecModal(true);
} else {
// 单规格商品,直接添加到购物车
onAddCart(data);
}
};
规格选择器集成:
<GoodsSpecSelector
open={showSpecModal}
onOpenChange={setShowSpecModal}
parentGoodsId={parentGoodsId}
actionType="add-to-cart"
onConfirm={(selection) => {
// 执行添加购物车操作
onAddCart({
...data,
id: selection.goodsId, // 子商品ID
parentGoodsId: parentGoodsId,
name: selection.goodsName, // 子商品名称(规格名称)
price: selection.price,
count: selection.quantity
});
setSelectedSpec(selection);
}}
/>
数据传递更新:
hasSpecOptions和parentGoodsId给商品卡片主要修改文件:
mini/src/components/goods-card/index.tsx - 添加规格选择逻辑,集成GoodsSpecSelector组件mini/src/components/goods-list/index.tsx - 确保传递正确的商品数据相关页面更新:
mini/src/pages/index/index.tsx - 首页商品卡片数据传递mini/src/pages/goods-list/index.tsx - 商品列表页数据传递mini/src/pages/search-result/index.tsx - 搜索结果页数据传递测试文件:
mini/tests/unit/components/goods-card/goods-card.test.tsx - 商品卡片多规格支持单元测试(新建)/api/v1/goods/:id/children获取子商品列表CartContext.addToCart支持父子商品参数mini/tests/目录下tests/unit/**/*.test.{ts,tsx}单规格商品场景:
onAddCart回调被调用,传递正确的商品数据多规格商品场景:
onAddCart回调被调用,传递子商品数据和parentGoodsId规格选择取消场景:
数据传递验证:
hasSpecOptions和parentGoodsIdspuId: 0, 无子商品)spuId: 0, 有子商品列表)spuId: <父商品ID>)| Date | Version | Description | Author |
|---|---|---|---|
| 2025-12-15 | 1.0 | 初始故事创建,添加小程序商品卡片多规格支持 | John (Product Manager) |
此部分由开发代理在实现过程中填写
Claude Sonnet
无
mini/src/components/goods-card/index.tsx - 商品卡片组件,添加多规格支持mini/src/pages/index/index.tsx - 首页,更新数据转换和购物车处理mini/src/pages/goods-list/index.tsx - 商品列表页,更新数据转换和购物车处理mini/src/pages/search-result/index.tsx - 搜索结果页,更新数据转换和购物车处理packages/goods-module-mt/src/schemas/public-goods.schema.mt.ts - 添加childGoodsIds字段到API Schema定义mini/tests/unit/pages/search-result/basic.test.tsx - 修复useRouter模拟问题mini/tests/unit/components/goods-card/goods-card.test.tsx - 商品卡片单元测试文件,覆盖多规格场景docs/stories/006.017.mini-goods-card-multi-spec-support.story.md - 故事文件,更新任务状态和开发记录此部分由QA代理在审查完成后填写