6-秒杀商品实现能展示与购买.md 5.9 KB

需求指令:

mallApp/src/pages/home/index.vue 在店铺首页下,点击秒杀专区的商品,进入详情页时,要把秒杀商品的数据带过来,并且能够加入购物车进行下一步的合并下单

AI执行

实现完成,改动跨了 mallApp 前端和 huahuibao 后端两个仓库。汇总如下:

问题诊断

之前点击首页「秒杀专区」的商品,只是带着 id 跳到普通商品详情页(activitySection.vuegoDetail),秒杀价、限购、活动截止时间等数据完全丢失;加入购物车后走「合并下单」(affirmMix.vuecreateMixOrder),后端 OrderController::actionCreateMixOrder 对花束类商品永远按商品原价重新核价,从没读取过秒杀配置——秒杀专区实际上只是首页展示噱头,跟真实下单完全没有打通。

前端改动(mallApp)

  • components/home/activitySection.vue:秒杀商品点击详情时,在跳转链接里附带 activityType/activityPrice/activityLimit/activityStock/activityEndTime
  • pages/goods/section-list.vue(秒杀「更多」列表):同样补上活动参数(后端 getSectionGoodsPage 也加了 startTime/endTime 返回,见下)。
  • pages/goods/detail.vue:解析活动参数,展示秒杀价横条(秒杀价标签、倒计时、限购提示)、原价划线;加入购物车时把活动标记透传下去。
  • mixins/cgProduct.jsaddBouquetToCart):购物车行打上 activityType/activityEndTime/originPrice,并让 getCartItemOriginalUnitPrice/cartPriceShowStrike 支持秒杀商品的划线价展示。
  • pages/home/cart.vuepages/billing/affirmMix.vue:购物车、确认下单页展示「秒杀」标签和划线原价;affirmMix 提交合并下单时把 activityType 一起传给后端。

后端改动(huahuibao)

  • biz-hd/homePageConfig/classes/HomePageModuleClass.php:新增 getSeckillActiveRow(校验活动是否在进行中、商品是否仍在秒杀配置里上架)、getSeckillSoldCount/getSeckillCustomBoughtCount(读取 Redis 计数)、reserveSeckillPurchase/rollbackSeckillReservationSnapshot/clearSeckillReservationSnapshot(预占秒杀名额+失败回滚,风格参照现有花材限购 ProductClass::handleLimitBuy 的写法)。
  • app-mall/controllers/OrderController::actionCreateMixOrder:花束行如果带 activityType=seckill不信任前端传的价格,独立回查 Redis 秒杀配置核实活动状态、剩余库存、单人限购,通过后才用秒杀价核价并预占名额;失败/异常时通过既有的 register_shutdown_function 一并回滚。
  • biz-hd/homePageConfig/classes/HomePageDisplayClass::getSectionGoodsPage:秒杀/团购「更多」列表接口补充返回 startTime/endTime

这样价格闭环是安全的:前端展示的秒杀价只是"提示",真正决定下单金额、是否超出限购/库存的,是服务端独立查一遍 Redis 里的秒杀配置,客户端传的价格不会被信任。

已知遗留范围(未改动)

  • 「立即购买」单件下单流程(sel-popup.vue 的下一步 → pages/order/buy.vueactionCreateOrder)没有做同样的服务端核价,如果需要该入口也支持秒杀价,需要再补一次类似改动。按你的描述(加入购物车→合并下单)这次没有动它。
  • 团购专区(groupBuy)目前没有改,只做了秒杀。

所有改动已跑过 PHP 语法检查(php -l)和 Vue 模板/脚本语法解析,均无报错;已运行 npm run indexnpm run validate 刷新并校验本知识库索引。未做任何 git add/commit

需求指令2:

「立即购买」单件下单流程(sel-popup.vue 的下一步 → pages/order/buy.vue → actionCreateOrder)没有做同样的服务端核价,请把该入口也支持秒杀价

所有改动均已完成,验证通过。总结一下这次的改动:

后端 huahuibao/app-mall/controllers/OrderController.phpactionCreateOrder

完全复用 actionCreateMixOrder 已验证过的秒杀核价套路:

  1. 不信任前端价格:当请求带 activityType=seckill 时,不再走 GoodsClass::getFinalPrice,而是调用 HomePageModuleClass::getSeckillActiveRow 从 Redis 独立回查该秒杀活动是否仍有效。
  2. 库存与限购校验:用 getSeckillSoldCount / getSeckillCustomBoughtCount 核对秒杀库存和该用户($this->customId,即 $hd->customId)的限购数量,超出则 util::fail
  3. 价格覆盖:校验通过后用 $seckillRow['price'] 覆盖 $unitPrice,再进入原有下单逻辑(运费、红包、创建订单等不变)。
  4. 事务安全:补上了 register_shutdown_function(原来 actionCreateOrder 没有)以及 reserveSeckillPurchase / clearSeckillReservationSnapshot / rollbackSeckillReservationSnapshot,确保秒杀名额预占与订单事务的提交/回滚/异常退出保持一致,不会出现"占了名额但没成单"的泄漏。

前端

  • mallApp/src/pages/goods/components/sel-popup.vuegoods/detail.vue 使用的那个 sel-popup):nextFn 在跳转 /pages/order/buy 前,若当前商品处于秒杀(info.activityType === 'seckill'),会把秒杀价、原价、限购、结束时间重新写回 goods(防止选规格时把价格字段带回原价),并在 URL 上带上 activityType=seckill
  • mallApp/src/pages/order/buy.vue:提交订单时,若 option.activityType 或缓存的 goodsInfo.activityTypeseckill,在请求体里附加 activityType: 'seckill',交给后端做真正的核价。
  • mallApp/src/pages/order/components/app-order-list2.vue(buy 页展示商品信息的组件):顺手加了"秒杀"标签和划线原价展示,和购物车/合并结算页的视觉风格保持一致。

已用 php -lacorn 分别检查了 PHP 与 Vue 组件脚本语法,并重新执行了 npm run index / npm run validate 刷新知识库索引,均无问题。