商城购物车
购物车是 Mall 交易链路中连接“商品选择”和“订单结算”的轻量模块。RuoYi Office 当前购物车能力主要面向会员端 / App 端接口,管理端不会直接维护用户购物车,但会在「交易配置」和「交易订单」页面提供文档入口,方便开发者理解购物车如何影响结算和下单。
本页基于当前 AppCartController、CartServiceImpl 和 trade_cart 数据对象整理,不复用上游截图。
模块边界
| 层 | 路径 / 接口 |
|---|---|
| 后端模块 | ruoyi-office/yudao-module-mall/yudao-module-trade-server |
| App 控制器 | controller/app/cart/AppCartController.java |
| 服务实现 | service/cart/CartServiceImpl.java |
| 数据对象 | dal/dataobject/cart/CartDO.java |
| 数据表 | trade_cart |
| 接口前缀 | /app-api/trade/cart 或经网关映射后的 App 端路径 |
| 管理端引用 | views/mall/trade/config/index.vue、views/mall/trade/order/index.vue 的 DocAlert |
购物车链路
购物车只保存用户选择的 SKU、数量和选中状态。价格、商品上下架、库存、规格展示等信息在查询列表时通过 Product 模块实时组合,避免购物车中长期保存过期商品快照。
接口清单
AppCartController 提供的接口如下:
| 动作 | 方法与路径 | 说明 |
|---|---|---|
| 加入购物车 | POST /trade/cart/add | 根据 skuId 和 count 新增购物项;同 SKU 已存在时累加数量并设为选中 |
| 修改数量 | PUT /trade/cart/update-count | 校验购物项归属当前用户,并重新校验 SKU 库存 |
| 修改选中 | PUT /trade/cart/update-selected | 批量修改购物项选中/取消选中状态 |
| 重置规格 | PUT /trade/cart/reset | 删除原购物项,再切换到新的 SKU 和数量 |
| 删除商品 | DELETE /trade/cart/delete | 按购物车记录 ID 批量删除 |
| 查询数量 | GET /trade/cart/get-count | 返回当前用户购物车商品总数量 |
| 查询列表 | GET /trade/cart/list | 返回有效和无效购物项列表 |
注意:购物车接口均基于
getLoginUserId()获取当前会员用户,二次开发时不要从前端传入userId作为可信身份。
数据模型
CartDO 对应 trade_cart,核心字段较少:
| 字段 | 含义 | 说明 |
|---|---|---|
id | 购物车记录编号 | 删除、改数量、重置规格均使用该编号 |
userId | 会员用户编号 | 关联会员用户,所有查询都应带当前用户边界 |
spuId | 商品 SPU 编号 | 用于查询商品主信息;SPU 删除后购物项会被延迟删除 |
skuId | 商品 SKU 编号 | 用于库存、价格和规格查询 |
count | 购买数量 | 加购时累加,更新时重新校验库存 |
selected | 是否选中 | 结算页通常只处理选中的购物项 |
购物车不直接保存商品名称、图片、规格、价格等展示字段,这些字段在 getCartList 时由 ProductSpuApi 和 ProductSkuApi 组合得到。
关键校验
CartServiceImpl 中最重要的校验集中在 checkProductSku:
- SKU 是否存在。
- 购买数量是否超过库存。
- 通过 SKU 找到所属 SPU,用于新增购物项。
查询购物车列表时还会加载 SPU/SKU 列表,并对已删除的 SPU 做延迟清理:如果商品 SPU 已不存在,系统会删除对应购物车记录,避免用户继续结算失效商品。
和交易配置、订单的关系
购物车本身不负责订单价格计算,但它会影响结算页传给交易订单的商品范围和数量。
| 模块 | 关系 |
|---|---|
| Product 商品 | 购物车依赖 SPU/SKU 查询名称、图片、规格、价格和库存 |
| Trade Config 交易配置 | 配送、售后、分销等规则会在结算/下单阶段影响最终订单 |
| Trade Order 交易订单 | 选中的购物项进入结算后生成订单项快照 |
| Promotion 营销 | 当前服务注释中已提示购物车价格计算仍有扩展空间,复杂营销建议在结算阶段统一计算 |
因此排查“购物车价格不等于订单价格”时,应先确认订单是否经过优惠券、满减、会员价、积分、运费和调价等结算逻辑,而不是只看 trade_cart。
二次开发建议
- 新增购物车展示字段:优先从 Product API 组合,不建议把商品快照冗余到
trade_cart。 - 新增选中规则:保持按当前登录用户过滤,避免跨用户批量修改。
- 新增营销价格:建议在结算页或订单创建服务统一计算,避免购物车列表和订单金额出现两套规则。
- 新增库存占用:当前购物车只校验库存,不锁库存;如要提前锁库存,需要和订单超时关闭、库存释放一起设计。
- 新增清理任务:可按长期未更新、SPU/SKU 失效等条件定期清理,但要注意不要删除用户近期仍可能结算的购物项。
排查清单
| 现象 | 优先检查 |
|---|---|
| 加购失败 | SKU 是否存在、库存是否足够、用户是否登录 |
| 修改数量失败 | 购物车记录是否属于当前用户、数量是否超过库存 |
| 列表商品消失 | SPU 是否被删除或下架,getCartList 是否触发延迟删除 |
| 数量角标不准确 | get-count 当前按用户汇总数量,是否需要只统计选中项需结合产品需求判断 |
| 结算金额和列表不同 | 结算阶段是否叠加营销、会员价、优惠券、运费、积分等规则 |
