fix(shop-cart): 修复购物车后端查询及前后端字段名对齐问题
- 修复后端ShopCartMapper SQL,关联查询商品和SKU信息,返回完整商品详情字段 - 新增ShopCart实体非持久化字段,映射商品名称、图片、价格、库存等 - 调整后端Controller列表方法,自动过滤当前登录用户购物车数据 - 前端ShopCart接口新增salePrice、dealerPrice字段,CartContext映射新增字段 - 修正购物车数量和选中状态字段名,前端与后端统一使用cartNum和selected - 统一更新购物车数量、选中状态的接口调用参数,避免因字段不匹配导致更新失败 - 购物车及结算页价格显示逻辑优先使用后端扁平dealerPrice字段,兼容VIP价格显示 - 各购物车相关页面调整添加购物车参数,确保字段名一致和正确传递
This commit is contained in:
@@ -55,3 +55,38 @@ adapter `/list` 接口忽略分页,一次返回全部收藏;前端 `listShop
|
||||
1. `updateCartNum`:`PUT /shop/shop-cart/{id}` + `{quantity}` → `PUT /shop/shop-cart` + `{id, num}`
|
||||
2. `updateCartChecked`:`PUT /shop/shop-cart/{id}` + `{selected}` → `PUT /shop/shop-cart` + `{id, checked}`(同时修正字段名 `selected`→`checked` 与 model 一致)
|
||||
3. `updateCartAllChecked`:`PUT /shop/shop-cart/selected` + `{selected}` → `POST /shop/shop-cart/selected` + `{checked}`(改用 POST,自定义批量操作更可能支持 POST;CartContext 已有静默 catch 兜底)
|
||||
|
||||
## 购物车后端 SQL 关联查询修复(2026-07-14)
|
||||
|
||||
### 问题
|
||||
`GET /api/shop/shop-cart` 返回的数据没有商品图片、价格等信息。前端 `CartContext.refresh()` 已映射 `goodsName/goodsImage/skuPrice/skuSpec/stock` 等字段,但后端根本没返回这些字段。
|
||||
|
||||
### 根因
|
||||
后端 `ShopCartMapper.xml` 的 SQL 只做 `SELECT a.* FROM shop_cart a`,没有 JOIN 商品表和 SKU 表。
|
||||
|
||||
### 后端修改(`guilixu-java` 项目)
|
||||
1. **`ShopCart.java`**:新增 7 个 `@TableField(exist = false)` 非持久化字段:`goodsName`、`goodsImage`、`skuPrice`、`skuSpec`、`stock`、`salePrice`、`dealerPrice`;补充 `TableField` import
|
||||
2. **`ShopCartMapper.xml`**:SQL 改为 `LEFT JOIN shop_goods g ON a.goods_id = g.goods_id` + `LEFT JOIN shop_goods_sku s ON a.sku_id = s.id`,SELECT 别名映射到新字段(`COALESCE(s.price, g.price) AS sku_price`、`COALESCE(s.stock, g.stock) AS stock`);同时修复 `userId/goodsId/merchantId` 从 `LIKE` 改为 `=`(原 LIKE 会导致 userId=1 匹配到 10/11/21 等)
|
||||
3. **`ShopCartController.java`**:`list()` 方法自动按当前登录用户过滤(`param.setUserId(loginUser.getUserId().longValue())`)
|
||||
|
||||
### 前端修改
|
||||
4. **`src/api/shop/shopCart/model/index.ts`**:`ShopCart` 接口新增 `salePrice`、`dealerPrice` 字段
|
||||
5. **`src/contexts/CartContext.tsx`**:`CartItem` 新增 `salePrice`、`dealerPrice`;`refresh()` 映射这两个字段;`calcPrice()` VIP 优先用扁平 `i.dealerPrice`(之前只看 `i.product?.dealerPrice`)
|
||||
6. **`src/pages/shop/cart.tsx`** + **`src/pages/shop/checkout.tsx`**:价格显示逻辑同步更新,优先使用扁平 `item.dealerPrice` / `item.salePrice`
|
||||
|
||||
## 购物车前后端字段名对齐修复(2026-07-14)
|
||||
|
||||
### 问题
|
||||
修改购物车数量时后端报 `UPDATE shop_cart WHERE id=?`(SET 子句为空),MyBatis-Plus 找不到要更新的字段。
|
||||
|
||||
### 根因
|
||||
前后端字段名不匹配:
|
||||
- 前端发送 `num`,后端实体字段是 `cartNum` → Jackson 反序列化时 `cartNum` 为 null → 空 UPDATE
|
||||
- 前端发送 `checked`,后端实体字段是 `selected` → 同样不匹配
|
||||
- 列表返回 `cartNum`,前端读 `item.num` → 数量永远为默认值 1
|
||||
|
||||
### 修改文件
|
||||
1. **`src/api/shop/shopCart/model/index.ts`**:`ShopCart.num` → `cartNum`;新增 `selected` 字段;`AddToCartParam.num` → `cartNum`;`UpdateCartNumParam.num` → `cartNum`
|
||||
2. **`src/api/shop/shopCart/index.ts`**:`updateCartNum` 发 `{id, cartNum}`;`updateCartChecked` 发 `{id, selected}`
|
||||
3. **`src/contexts/CartContext.tsx`**:`refresh()` 读 `item.cartNum` 和 `item.selected`;`addItem()` 发 `cartNum`;`updateQuantity` 调用 `{id, cartNum}`
|
||||
4. **`src/pages/shop/index.tsx`** + **`src/pages/shop/category.tsx`**:`addToCart` 参数 `num` → `cartNum`
|
||||
|
||||
Reference in New Issue
Block a user