fix(card): 观影海报墙格数改偶数并按海报去重 #3
用户原话:「怎么是单数的?我这里看,显示的是21张图片。观影卡片。」
上一版(#2)修掉了「只有 6 张图」,但留下了新的结构问题:
· keys(配图)按 poster 去重,上限 20
· list(格子)按行过滤,无上限
⇒ 一部电影看了两场(两天各一场 / 重映),两行 poster 相同、拿到的 img
也相同,于是「有图的行数」会**多于**「图片张数」,可能是 21 这种单数。
两列栅格下奇数格必然让最后一行右侧留空 —— 就是用户看到的样子。
修法(`list` 的语义是「一部电影一格」,不是「一场观影一格」):
· 按 poster 去重(键用 poster 而非 title:同名重映 / 译名相同的不同片不算同一部)
· 顺带保证偶数:len - (len % 2),不写死 20/18(图少时减法会变负索引)
· poster === '' 的行显式跳过(没海报键的行不该进墙)
验证:静态守卫 1324/0(新增 groupV97 六条)· 反向验证 13/0(6 条注入各自命中)
编译 BUILD SUCCESSFUL,产物 6.2M。真机待验(hdc 设备掉线,见工单)。
顺带修掉两处「跑不起来」的环境问题(与本次 bug 无关,但会挡住验证):
· 编译脚本补 JAVA_HOME / PATH:PackageHap 阶段要 spawn java,
缺了只报 `Error Code: 00308018 Unknown Error`,真因
`spawn java ENOENT` 藏在 build-logs 深处。
· PATH 必须写 POSIX 风格 /d/... 而不是 D:/...:
MSYS2 的 PATH 是冒号分隔,`D:/xxx` 里的冒号会把路径劈成两段。
This commit is contained in:
@@ -253,11 +253,41 @@ export async function fbMovieCardBuild(ctx: common.Context): Promise<FbMovieCard
|
|||||||
out.formImages = bag.formImages;
|
out.formImages = bag.formImages;
|
||||||
out.imgFds = bag.imgFds;
|
out.imgFds = bag.imgFds;
|
||||||
|
|
||||||
|
/* 🔴🔴 工单 #3(用户 2026-10-28):「怎么是单数的?我这里看,显示的是21张图片」
|
||||||
|
⚠️ 这是上一版(工单 #2)修法留下的坑,**不是**配图没配够:
|
||||||
|
`keys` 按 **poster 去重**收集(最多 20 张),而这里按 **行** 过滤
|
||||||
|
⇒ 一部电影看了两场(两天各一场 / 重映)两行 poster 相同、
|
||||||
|
拿到的 `img` 也相同,于是「有图的行数」会**多于**「图片张数」,
|
||||||
|
既可能超过 20,也可能是 21 这种单数(两列布局最后一行右侧留空)。
|
||||||
|
|
||||||
|
⇒ 修法:`list` 也**按 poster 去重**,并且顺带保证**偶数**。
|
||||||
|
理由:这面墙的语义是「一部电影一格」,不是「一场观影一格」——
|
||||||
|
同一部片摆两块一模一样的海报,用户看到的是重复,不是信息。
|
||||||
|
|
||||||
|
实现要点(三条都不能省):
|
||||||
|
① 去重键用 `poster`,**不是** `title`:同名重映 / 译名相同的不同片不算同一部;
|
||||||
|
② `poster === ''` 的行直接跳过 —— 没有海报键的行即使 `img` 侥幸非空也不该进墙
|
||||||
|
(实际上不可能非空,但写成显式判断,免得以后逻辑变动时漏掉);
|
||||||
|
③ 裁剪成偶数:两列栅格,奇数必然右侧留空。
|
||||||
|
用 `len - (len % 2)`,**不要**写死成 20 / 18 —— 图少的时候(比如只有 7 张)
|
||||||
|
写死会因为减法变成负索引。
|
||||||
|
⚠️ 顺序仍然必须是「先建行 → 配图 → 再过滤 → 最后 stringify」,
|
||||||
|
反过来的话 `img` 压根不会进 JSON,卡片拿到的每个 `img` 都空。 */
|
||||||
const list: FbMovieCardRow[] = [];
|
const list: FbMovieCardRow[] = [];
|
||||||
|
const seenPoster: string[] = [];
|
||||||
for (const r of rows) {
|
for (const r of rows) {
|
||||||
if (r.img !== '') {
|
if (r.img === '' || r.poster === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (seenPoster.indexOf(r.poster) >= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
seenPoster.push(r.poster);
|
||||||
list.push(r);
|
list.push(r);
|
||||||
}
|
}
|
||||||
|
// 两列栅格:奇数格会让最后一行右侧空半格 ⇒ 裁掉末尾那个
|
||||||
|
if (list.length % 2 === 1) {
|
||||||
|
list.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
out.recentJson = JSON.stringify(rows);
|
out.recentJson = JSON.stringify(rows);
|
||||||
|
|||||||
Reference in New Issue
Block a user