name: 秒杀/团购首页自动布局 overview: 隐藏 hdApp 秒杀/团购配置页的"商品展示数量"和"排列规则"手动设置项,改为后端按商品数量+新增的"商品展开"开关自动推导 layoutCols 与 displayCount,mallApp 店铺首页现有的"更多"链接逻辑无需改动即可自动生效。 todos:
id: verify content: 自测四种商品数量场景(1/2/3/>3及展开开关开关状态)下 layoutCols/displayCount/goodsTotal 计算是否符合预期 status: completed
hdApp/src/admin/homePageConfig/new.vue 页面也做以上同样的处理。
layoutCols(1排1列/2列/3列)与 displayCount(展示数量)目前由商家在 hdApp/src/admin/homePageConfig/seckill.vue / groupBuy.vue 手动填写,提交给后端 saveSeckill/saveGroupBuy 校验后原样存 Redis。cols computed 读取 data.layoutCols 控制列数(第99-102行)showMore computed:data.goodsTotal > data.goods.length 时显示右上角"更多"链接(第104-106行,第21行渲染)displayCount 截断 goods 并计算 goodsTotal。layoutCols/displayCount,替代商家手动填写。文件:biz-hd/homePageConfig/classes/HomePageModuleClass.php
expand(商品展开开关,0/1,默认0),随活动基础信息一起存取:
validateActivityBase():不再读取/校验客户端传入的 layoutCols/displayCount;改为读取并落地 expand。normalizeActivityBase():不再返回 layoutCols/displayCount(改由下面新逻辑动态计算);返回 expand。resolveActivityLayout($goodsCount, $expand):
expand 为真 → ['layoutCols' => 1, 'displayCount' => 0](全部按1排1列展示)$goodsCount <= 1 → layoutCols=1, displayCount=0$goodsCount == 2 → layoutCols=2, displayCount=0$goodsCount >= 3 → layoutCols=3, displayCount=3getSeckill() / getGroupBuy():在算出 $data['goods'](即商家已添加的商品数组,不管单个商品开关状态)之后,调用 resolveActivityLayout(count($data['goods']), $data['expand']),把结果写入 $data['layoutCols'] / $data['displayCount']。这样每次读取都会自动刷新,不依赖旧数据迁移。saveSeckill() / saveGroupBuy():无需再处理 layoutCols/displayCount(交由读取时动态计算),只需把 expand 存入 Redis(随 validateActivityBase() 返回值一起 array_merge)。不改动:LAYOUT_COLS_OPTIONS、DEFAULT_LAYOUT_COLS、normalizeLayoutCols、saveGoodsSection/getGoodsSection(热门/上新/下拉商品模块的排列规则保持商家手动配置,本次需求未涉及);HomePageDisplayClass::formatActivity() 不需要改(复用现有 displayCount 截断 + goodsTotal 计算)。
对 hdApp/src/admin/homePageConfig/seckill.vue 与 hdApp/src/admin/homePageConfig/groupBuy.vue 做相同处理:
"显示倒计时"同行右侧新增"商品展开"开关:复用相同 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>
删除"商品展示数量"输入框及其提示文案(原第51-62行区块)。
删除"排列规则"整块(cols-section,原第95-111行),包括对应的 onLayoutColsChange 方法与 scss 样式(.cols-section/.cols-radio/.cols-label/.cols-text)。
脚本调整:
data.form:移除 displayCount、layoutCols;新增 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:去掉 displayCount、layoutCols,新增 expand: this.form.expand。补充 .switch-item(flex 布局,左标题右开关)等少量样式;移除不再使用的 .field-hint 等(若确认无其他地方引用)。
showMore 逻辑,无需改 mallApp 代码)。HomePageModuleClass::getSeckill/getGroupBuy 每次读取时动态计算,因此秒杀和团购各自独立生效,且旧数据无需迁移脚本即可自动生效。npm run validate(如涉及索引/文档同步,参考 AGENTS.md 要求)。git add/commit/push,也不主动执行 npm run build:mp-weixin。