hdApp首页商品区自动排列-1.md 7.3 KB


name: 秒杀/团购首页自动布局 overview: 隐藏 hdApp 秒杀/团购配置页的"商品展示数量"和"排列规则"手动设置项,改为后端按商品数量+新增的"商品展开"开关自动推导 layoutCols 与 displayCount,mallApp 店铺首页现有的"更多"链接逻辑无需改动即可自动生效。 todos:

  • id: backend-layout content: 后端 HomePageModuleClass 新增 expand 字段与 resolveActivityLayout 自动计算逻辑(seckill+groupBuy) status: completed
  • id: frontend-seckill content: hdApp seckill.vue:新增商品展开开关,删除商品展示数量与排列规则UI及相关脚本 status: completed
  • id: frontend-groupbuy content: hdApp groupBuy.vue:同步做与 seckill.vue 一致的改动 status: completed
  • id: verify content: 自测四种商品数量场景(1/2/3/>3及展开开关开关状态)下 layoutCols/displayCount/goodsTotal 计算是否符合预期 status: completed

    isProject: false

    计划需求指令:

  • hdApp/src/admin/homePageConfig/new.vue 页面也做以上同样的处理。

    • hdApp/src/admin/homePageConfig/pullGoods.vue 页面下的商品展示数量隐藏(或删除),“排列规则”删除掉(或隐藏),使用如下隐藏规则:
    • 当只添加了一个商品时,按1排1列来展示
    • 当只添加了两个商品时,按1排2列来展示
    • 当添加了三个及以上商品时,还是按1排2列来展示(且把展示数量设置为全部x),且在mallApp下的店铺首页的下拉商品中把所有的商品都展示。由于全部商品都显示了,右上角没有“更多”链接。

秒杀/团购首页展示规则自动化

背景梳理

  • layoutCols(1排1列/2列/3列)与 displayCount(展示数量)目前由商家在 hdApp/src/admin/homePageConfig/seckill.vue / groupBuy.vue 手动填写,提交给后端 saveSeckill/saveGroupBuy 校验后原样存 Redis。
  • mallApp 店铺首页渲染组件 mallApp/src/components/home/activitySection.vue 已经具备:
    • cols computed 读取 data.layoutCols 控制列数(第99-102行)
    • showMore computed:data.goodsTotal > data.goods.length 时显示右上角"更多"链接(第104-106行,第21行渲染)
    • 后端 HomePageDisplayClass::formatActivity()(第147-162行)负责按 displayCount 截断 goods 并计算 goodsTotal
  • 结论:mallApp 端"更多"链接和列数渲染逻辑已经齐全,完全不需要改动;只需要让后端在读取秒杀/团购配置时,根据"已添加商品数量"+新增"商品展开"开关,自动算出 layoutCols/displayCount,替代商家手动填写。

后端改动(huahuibao)

文件:biz-hd/homePageConfig/classes/HomePageModuleClass.php

  1. 新增字段 expand(商品展开开关,0/1,默认0),随活动基础信息一起存取:
    • validateActivityBase():不再读取/校验客户端传入的 layoutCols/displayCount;改为读取并落地 expand
    • normalizeActivityBase():不再返回 layoutCols/displayCount(改由下面新逻辑动态计算);返回 expand
  2. 新增静态方法 resolveActivityLayout($goodsCount, $expand)
    • expand 为真 → ['layoutCols' => 1, 'displayCount' => 0](全部按1排1列展示)
    • $goodsCount <= 1layoutCols=1, displayCount=0
    • $goodsCount == 2layoutCols=2, displayCount=0
    • $goodsCount >= 3layoutCols=3, displayCount=3
  3. getSeckill() / getGroupBuy():在算出 $data['goods'](即商家已添加的商品数组,不管单个商品开关状态)之后,调用 resolveActivityLayout(count($data['goods']), $data['expand']),把结果写入 $data['layoutCols'] / $data['displayCount']。这样每次读取都会自动刷新,不依赖旧数据迁移。
  4. saveSeckill() / saveGroupBuy():无需再处理 layoutCols/displayCount(交由读取时动态计算),只需把 expand 存入 Redis(随 validateActivityBase() 返回值一起 array_merge)。

不改动:LAYOUT_COLS_OPTIONSDEFAULT_LAYOUT_COLSnormalizeLayoutColssaveGoodsSection/getGoodsSection(热门/上新/下拉商品模块的排列规则保持商家手动配置,本次需求未涉及);HomePageDisplayClass::formatActivity() 不需要改(复用现有 displayCount 截断 + goodsTotal 计算)。

前端改动(hdApp)

hdApp/src/admin/homePageConfig/seckill.vuehdApp/src/admin/homePageConfig/groupBuy.vue 做相同处理:

  1. "显示倒计时"同行右侧新增"商品展开"开关:复用相同 switch 组件与颜色,默认关闭。

    <tui-list-cell class="line-cell between" :hover="false">
     <view class="switch-item">
       <view class="tui-title">显示倒计时</view>
       <switch class="switch-ctrl" :checked="form.showCountdown == 1" color="#09C567" @change="onShowCountdownChange" />
     </view>
     <view class="switch-item">
       <view class="tui-title">商品展开</view>
       <switch class="switch-ctrl" :checked="form.expand == 1" color="#09C567" @change="onExpandChange" />
     </view>
    </tui-list-cell>
    
  2. 删除"商品展示数量"输入框及其提示文案(原第51-62行区块)。

  3. 删除"排列规则"整块(cols-section,原第95-111行),包括对应的 onLayoutColsChange 方法与 scss 样式(.cols-section/.cols-radio/.cols-label/.cols-text)。

  4. 脚本调整

    • data.form:移除 displayCountlayoutCols;新增 expand: 0
    • normalizeForm(data):移除 displayCount/layoutCols 解析;新增 expand: data.expand == 1 ? 1 : 0
    • 新增 onExpandChange(e) { this.form.expand = e.detail.value ? 1 : 0 }
    • 删除 parseDisplayCount() 方法及其在 saveFn() 中的调用/校验。
    • saveFn() 提交给 saveSeckill/saveGroupBuy 的 payload:去掉 displayCountlayoutCols,新增 expand: this.form.expand
  5. 补充 .switch-item(flex 布局,左标题右开关)等少量样式;移除不再使用的 .field-hint 等(若确认无其他地方引用)。

效果验证(新规则)

  • 添加1个商品 → 1排1列展示,全部商品显示,无"更多"。
  • 添加2个商品 → 1排2列展示,全部商品显示,无"更多"。
  • 添加≥3个商品、"商品展开"关闭 → 1排3列,只展示3个;若实际添加数>3,mallApp 秒杀/团购专区右上角自动出现"更多"(复用现有 showMore 逻辑,无需改 mallApp 代码)。
  • 添加≥3个商品、"商品展开"开启 → 不论数量,1排1列展示全部商品,不显示"更多"。
  • 以上规则在 HomePageModuleClass::getSeckill/getGroupBuy 每次读取时动态计算,因此秒杀和团购各自独立生效,且旧数据无需迁移脚本即可自动生效。

验证方式

  • 修改完成后运行 npm run validate(如涉及索引/文档同步,参考 AGENTS.md 要求)。
  • 不涉及 git add/commit/push,也不主动执行 npm run build:mp-weixin