feat(首页卡): 5 张工具卡改读 box_app 封装的真实数据(接口优先、失败回退本地)(v26092213)

数据源:GET /api/mp/public/mama-box/tool-cards(box_app 封装数胎动平台的 app-cards,
H5 不直连上游、不持有 token)。此前这 5 张卡各自为政:数胎动读本地 records(mama-box 早就不自记
胎动,常年 0)、体重恒 `--`、孕检日历本地按预产期推算、数宫缩显本地孕周、胎儿估重静态文案。

- 新增 applyRemoteCards() / applyRemoteCardsFetch():按 `slot` 落 DOM
  (kick→#kickTodayHome、fweight/curve→.mc-sub、weight→#weightVal、cal→#calNext);
  上游字符串一律 textContent,**绝不用 innerHTML**(同 footprint 的写法)。
- 优先级 = **接口优先、失败回退本地**。两个来源并行返回、先后不定,所以用 cardsOwned 旗子定序,
  而不是赌顺序:#kickTodayHome 让位给卡片接口;#calNext 让位(卡片接口与孕检日历应用同一套排期,
  还支持"改过预约日以预约日为准");curve 卡写值后**摘掉 data-wk**,否则 syncStaticDates 的
  [data-wk] 循环会把它覆盖回孕周。
- 卡片点击与名称仍以 App 表为准(MINI_APP_MAP + APP_BY_ID,AGENTS §4.4);接口的 appId/path 仅诊断
  (上游 app_id 是 URL slug,与 identifier 刻意不同)。
- 版式:固定高度 bento 只留一个状态位 → `.bento .mc-sub` 单行省略;数宫缩那列文本宽仅 ≈73px,
  有数据时改显紧凑 value(「4分12秒」,否则上游 text「最近间隔 4分12秒」会被省略掉数字);
  孕检日历放宽到两行(过期未记时上游给「待补记 9月26日」,一行会把日期省掉)。
- 新增 `.mc-extra`:只有 kick / weight 两张有富余竖空间,用来放上游 sub
  (「2 段 · 最近 13:00」/「较孕前 +11.7 kg · 9月22日」);fweight/cal/curve 是固定高度、放不下第二行,
  注释写明要加得先重排 .bento 那笔高度账(158+10+64=232)。
- warn → `.is-warn` 标红(新增 --alert token):胎动偏低 / 宫缩达临产阈值 / 产检过期未记。
- 体重卡:有值时写 value + 小字 unit(不会出现「-- kg」),无值保持中性 `--`。

本地验证(无头浏览器 + 桩后端):接口成功 → kick=12(覆盖本地 records 的 3)、weight=58.7kg +
「较孕前…」、cal=9月26日、curve=4分12秒、kick 标红、无 JS 异常;接口 ok=false → 全部回退本地
(kick=3 / weight=-- / curve 恢复 data-wk),页面不变空。
This commit is contained in:
2026-09-22 23:01:51 +08:00
parent 06f76b4df4
commit d1fff2c248
3 changed files with 139 additions and 12 deletions

View File

@@ -7,7 +7,7 @@
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>兜爸心选 · 孕育陪伴</title>
<!-- V:26092212 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<!-- V:26092213 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<link rel="stylesheet" href="mama-box.css">
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<!-- 共享助手:授权/跳商城/位置上报(分享卡片同步,见 docs/h5-auth-standard.md 第四节) -->
@@ -206,6 +206,9 @@
真实值由 __applyRecords() 写入(未记录的新用户是 0)。
(2026-09-22 新用户实测:工具卡上的演示占位值一律归中性。) -->
<div class="mc-sub">今天 <b id="kickTodayHome">--</b> 次</div>
<!-- 第二行(上游 sub,如「2 段 · 最近 13:00」)——只有 kick 与 weight 两张卡
有富余竖向空间;fweight/cal/curve 是固定高度且列很窄,放不下第二行。 -->
<div class="mc-extra" id="kickExtra"></div>
</div>
<span class="mc-btn">记录</span>
<img class="mc-art" src="assets/img/7980160b80b0.png" alt="" aria-hidden="true">
@@ -230,13 +233,12 @@
<button class="mini-card weight ripple" data-mini="weight">
<img class="mc-art big" src="assets/img/b2066fd752bf.png" alt="" aria-hidden="true">
<div class="mc-title">孕期体重</div>
<!-- ⚠️ 这里原来是写死的演示值「58.2 kg」,**任何用户**(含未建档案的新用户)
都会看到 —— 属演示数据泄漏(2026-09-22 新用户实测)。
体重目前**没有数据源**:GET /records 只返回当日聚合(kickCount/total),
没有「最近一次体重」字段。所以先给中性占位 '--',与右列「数宫缩」
卡的 data-wk 占位同一口径(不要写成 0,0 是个看着像真的假值)。
将来接入真实体重:给这行加 id 并由 JS 写(同时把 <small>kg</small> 补回来)。 -->
<div class="mc-big">--</div>
<!-- ⚠️ 这里原来是写死的演示值「58.2 kg」,任何用户都会看到(2026-09-22 演示数据泄漏)。
现在由 `applyRemoteCards()` 按 box_app 封装的卡片接口写入:
有值时写 `value` + 小字 `<small>unit</small>`,没有值时保持中性占位 `--`
(**不写 0**,0 是个看着像真的假值)。接口拿不到就保留这里的默认值。 -->
<div class="mc-big" id="weightVal">--</div>
<div class="mc-extra" id="weightExtra"></div>
</button>
<div class="bento-col">
<button class="mini-card cal ripple" data-mini="cal">