购物车提交时服务端先用 Set 对 skuId 去重,再校验条数不超过 5,用户把同一商品加 99 次,去重后只剩 1 条,限购直接绕过,订单里 quantity 是 99。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
SELECT sku_id, sum(quantity) FROM cart_item WHERE user_id = 1001 GROUP BY sku_id; curl -s -X POST http://127.0.0.1:8080/api/cart/checkout -d @same_sku_99.json
去重把数量和条目混为一谈,去重后校验的是种类数不是件数。限购规则写在条目数上,实际约束的应该是同一 sku 的累计数量。校验顺序也错了,先去重再校验等于先把证据删了。这一点先确认清楚,后面就不用反复试。
「去重绕过限购」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
具体做法是,校验放在去重之前 按 skuId 汇总 quantity 后判断上限;去重只用于展示 不参与库存和价格计算;限购阈值做成配置 按活动区分;用同一 sku 99 件的请求确认被拒。
改完照着核一遍,同一 sku 累计 99 件的请求返回 400 提示超出限购数量。
