mallApp/src/pages/home/index.vue 在店铺首页下,点击秒杀专区的商品,进入详情页时,要把秒杀商品的数据带过来,并且能够加入购物车进行下一步的合并下单
实现完成,改动跨了 mallApp 前端和 huahuibao 后端两个仓库。汇总如下:
之前点击首页「秒杀专区」的商品,只是带着 id 跳到普通商品详情页(activitySection.vue 的 goDetail),秒杀价、限购、活动截止时间等数据完全丢失;加入购物车后走「合并下单」(affirmMix.vue → createMixOrder),后端 OrderController::actionCreateMixOrder 对花束类商品永远按商品原价重新核价,从没读取过秒杀配置——秒杀专区实际上只是首页展示噱头,跟真实下单完全没有打通。
components/home/activitySection.vue:秒杀商品点击详情时,在跳转链接里附带 activityType/activityPrice/activityLimit/activityStock/activityEndTime。pages/goods/section-list.vue(秒杀「更多」列表):同样补上活动参数(后端 getSectionGoodsPage 也加了 startTime/endTime 返回,见下)。pages/goods/detail.vue:解析活动参数,展示秒杀价横条(秒杀价标签、倒计时、限购提示)、原价划线;加入购物车时把活动标记透传下去。mixins/cgProduct.js(addBouquetToCart):购物车行打上 activityType/activityEndTime/originPrice,并让 getCartItemOriginalUnitPrice/cartPriceShowStrike 支持秒杀商品的划线价展示。pages/home/cart.vue、pages/billing/affirmMix.vue:购物车、确认下单页展示「秒杀」标签和划线原价;affirmMix 提交合并下单时把 activityType 一起传给后端。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.vue → actionCreateOrder)没有做同样的服务端核价,如果需要该入口也支持秒杀价,需要再补一次类似改动。按你的描述(加入购物车→合并下单)这次没有动它。groupBuy)目前没有改,只做了秒杀。所有改动已跑过 PHP 语法检查(php -l)和 Vue 模板/脚本语法解析,均无报错;已运行 npm run index 和 npm run validate 刷新并校验本知识库索引。未做任何 git add/commit。
「立即购买」单件下单流程(sel-popup.vue 的下一步 → pages/order/buy.vue → actionCreateOrder)没有做同样的服务端核价,请把该入口也支持秒杀价
所有改动均已完成,验证通过。总结一下这次的改动:
huahuibao/app-mall/controllers/OrderController.php — actionCreateOrder完全复用 actionCreateMixOrder 已验证过的秒杀核价套路:
activityType=seckill 时,不再走 GoodsClass::getFinalPrice,而是调用 HomePageModuleClass::getSeckillActiveRow 从 Redis 独立回查该秒杀活动是否仍有效。getSeckillSoldCount / getSeckillCustomBoughtCount 核对秒杀库存和该用户($this->customId,即 $hd->customId)的限购数量,超出则 util::fail。$seckillRow['price'] 覆盖 $unitPrice,再进入原有下单逻辑(运费、红包、创建订单等不变)。register_shutdown_function(原来 actionCreateOrder 没有)以及 reserveSeckillPurchase / clearSeckillReservationSnapshot / rollbackSeckillReservationSnapshot,确保秒杀名额预占与订单事务的提交/回滚/异常退出保持一致,不会出现"占了名额但没成单"的泄漏。mallApp/src/pages/goods/components/sel-popup.vue(goods/detail.vue 使用的那个 sel-popup):nextFn 在跳转 /pages/order/buy 前,若当前商品处于秒杀(info.activityType === 'seckill'),会把秒杀价、原价、限购、结束时间重新写回 goods(防止选规格时把价格字段带回原价),并在 URL 上带上 activityType=seckill。mallApp/src/pages/order/buy.vue:提交订单时,若 option.activityType 或缓存的 goodsInfo.activityType 为 seckill,在请求体里附加 activityType: 'seckill',交给后端做真正的核价。mallApp/src/pages/order/components/app-order-list2.vue(buy 页展示商品信息的组件):顺手加了"秒杀"标签和划线原价展示,和购物车/合并结算页的视觉风格保持一致。已用 php -l 和 acorn 分别检查了 PHP 与 Vue 组件脚本语法,并重新执行了 npm run index / npm run validate 刷新知识库索引,均无问题。