fix(占位/来信): 工具卡演示占位归中性 + 档案屏空态 + 修来信「红点有、卡没有」(v26092210)

一、占位数据(新用户实测)
- 首页工具卡:孕期体重「58.2kg」是写死的演示值(后端也确无体重数据源,
  GET /records 只给当日聚合)→ 改中性占位 '--';数胎动「今天 3 次」默认
  3 在访客态/records 失败时没人覆盖 → HTML 默认 '--'、state.kickToday 改 0。
- 孕检日历 #calNext:init 先按内置默认(预产期=今天+3月 → 孕27周)写下
  演示日期,而 pregEmpty 分支只清 [data-ga]/[data-wk] 两种钩子、**漏了它**
  (它没有这两种属性),applyRemoteProfile 又提前 return → 假日期留在首页。
  两条空态分支各补一行显式归 '--'。
- 档案屏「成长数据」:三张统计卡 + 体重曲线 + 双顶径/股骨长/腹围等测量值
  全部无接口数据源,空态(未建档/产后)整块隐藏改显示引导;#favCount 从
  写死的 18 改为按 DOM 里点亮的星标实时统计(18 与屏幕上的 6 张对不上)。
  ⚠️ 该屏真机到不了(go('archive') 无条件跳 chanjian-rili),属防御性改动。
- **明确不动**的两处真实数据,都已加注释防止再被当演示值删掉:
  · 指南区「128 份孕育资料」= 后端准备总数(按孕周陆续发放,目前上架 8 份,
    其余可扫码找小助手索要)——「数字与列表条数不符」是对的;
  · 三张卡「12.8 / 20.4 / 9.6 万妈妈已领取」= 真实领取量(手工同步的静态文案)。

二、宝宝来信「tab 红点有、首页提醒卡没有」
根因:syncPregnancy 的未建档分支里那句 hideLetterCard() 只藏卡、**不动 #tabBadge**,
而它旁边的理由(「applyLaixinReminder 里也判 pregEmpty」)是错的 —— 后者明确
故意不看 pregEmpty(来信与建档是两件事,历史上加过一版就是这个症状)。
于是 laixin 先回来(亮红点 + 显示卡)、/profile 后回来(走该分支)时,卡被藏回去、
红点留下。定时复现:profile 延迟 1.5s 必现(卡内文案已写好却带 .hide,即「先显示后被藏」);
同时返回则正常。删掉那句后 0/1.5/3s 三档都一致;未读 0 与访客态仍两者都收。
This commit is contained in:
2026-09-22 21:12:19 +08:00
parent e349907463
commit ab8a3a5ea0
3 changed files with 95 additions and 17 deletions

View File

@@ -3,7 +3,7 @@
(function () {
'use strict';
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
var VER = '26092207';
var VER = '26092210';
const $ = (s, c) => (c || document).querySelector(s);
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
@@ -45,10 +45,12 @@
/* ---------- 全局状态 ---------- */
const state = {
screen: 'home',
kickToday: 3,
kickToday: 0, /* ⚠️ 原为演示值 3:访客态/接口失败时它会直接落到首页数胎动卡上,
现已改 0 且 HTML 默认渲染 '--'(真实值由 __applyRecords 写) */
kickQuick: 1,
todayCount: 4,
favCount: 18,
favCount: 0, /* ⚠️ 原为演示值 18(与屏幕上的星标数不符);
启动时按 DOM 里 .star.is-on 的实际个数回填,见「珍贵时刻收藏」那段 */
resCat: 'all',
resKey: 'book',
resFav: [], // 已收藏的资源 key,数组顺序即收藏顺序
@@ -505,6 +507,12 @@
});
/* ================= 珍贵时刻收藏 ================= */
/* ⚠️ 计数不能写死(原来 #favCount=18、state.favCount=18,而屏幕上点亮的星标只有 6 个,
数字与内容对不上)。启动时按 DOM 里 `.star.is-on` 的**实际个数**回填,
点星标时再 ±1 —— 这样标签上的数永远等于卡上看得见的收藏。
(档案页不是首屏,用户看不到"先 0 再回填"的中间态。) */
state.favCount = $$('.star.is-on').length;
(function () { const fc = $('#favCount'); if (fc) fc.textContent = state.favCount; })();
$$('.star').forEach(st => st.addEventListener('click', e => {
e.stopPropagation();
const on = st.classList.toggle('is-on');
@@ -1006,6 +1014,15 @@
}
/* 把 state 里的孕期信息刷到「我的」孕期卡 + 首页头部 + 档案页顶部 */
/* 成长数据面板的空态开关(CSS 见 mama-box.css 的 .data-empty 段):
未建档 / 产后 = 面板里那些数字(58.2kg、日均胎动 31 次、双顶径 6.1cm、体重曲线)
**一个都没有接口数据源**,对这类用户是纯假数据 → 整块隐藏改显示引导。
⚠️ 有真实孕周的用户仍看演示值:这是与「AI 小结演示文案」同一批的遗留,
要一起清得先有数据源,别只在这里删。 */
function setGrowthDataEmpty(on) {
const p = $('.seg-panel[data-panel="data"]');
if (p) p.classList.toggle('is-empty', !!on);
}
function syncPregnancy() {
/* ---- 产后态:宝宝已出生 → 一律不显示孕周数字(2026-09-22) ----
⚠️ 必须放在 pregEmpty 之前:产后返回体的 week 也是 null,
@@ -1060,6 +1077,12 @@
const gwt = $('#genWeekTag'); if (gwt) gwt.textContent = '产后';
$$('[data-ga]').forEach(n => { n.textContent = '--'; });
$$('[data-wk]').forEach(n => { n.textContent = '--'; });
/* ⚠️ #calNext(首页「孕检日历」卡)**没有 data-wk / data-ga 钩子**,上面两条循环抓不到它。
而 init 早已按内置默认(孕 27 周)把它写成「9月29日」这类演示日期,
产后分支之后没人再改 → 会以假日期留在首页。这里显式归占位。
(2026-09-22 新用户实测:孕检日历 9月29日 / 孕期体重 58.2kg 两处漏网。) */
const _cnPost = $('#calNext'); if (_cnPost) _cnPost.textContent = '--';
setGrowthDataEmpty(true); /* 产后同样没有这些数据的来源,别留演示数字 */
syncBabyWords();
return;
}
@@ -1105,13 +1128,30 @@
不保留 HTML 里的演示默认值(孕27周/9月15日…) */
$$('[data-ga]').forEach(n => { n.textContent = '--'; });
$$('[data-wk]').forEach(n => { n.textContent = '--'; });
/* ⚠️ 上面注释里的「孕检日历」**并不被那两条循环覆盖**:#calNext 没有 data-wk / data-ga
属性,选择器抓不到。而 init 早已按内置默认(孕 27 周)把它写成「9月29日」,
且 applyRemoteProfile 在 pregEmpty 时提前 return —— 于是新用户首页上
只剩这一个孕周派生的假日期(2026-09-22 实测)。这里显式归占位。 */
const _cn = $('#calNext'); if (_cn) _cn.textContent = '--';
setGrowthDataEmpty(true);
const _t = new Date();
$('#noteWhen').textContent = mdTxt(_t);
syncBabyWords();
hideLetterCard();
/* ⚠️ 这里**不能** hideLetterCard()(2026-09-22 修「红点有、首页卡没有」):
本分支(未建档)原来顺手把来信卡收起了,理由是「applyLaixinReminder 里也判 pregEmpty」
—— 那个理由**是错的**:applyLaixinReminder 明确故意不看 pregEmpty(见它的注释),
来信卡与红点的唯一 owner 是 syncLaixinReminder → applyLaixinReminder。
两边规则打架的后果是一个**竞态**:
· laixin 先回来(快)→ 红点亮 + 卡显示;
· /profile 后回来(它可能要先打上游用户中心,常见更慢)→ 走到这里 → 只把卡藏了。
而 hideLetterCard() **不动 #tabBadge** → 最终「红点在、卡没有」,与「红点说有新信、
卡里什么都没有」那类自相矛盾的屏完全一致(定时复现:profile 延迟 1.5s 必现;
同时返回则正常。卡里的文案已经写好、只是被 .hide 盖住,正是「先显示后藏掉」的痕迹)。
卡在 HTML 里**默认就是 .hide + .no-letter**,不需要谁来收;让它只由 laixin 结果决定。 */
return;
}
const week = state.week, day = state.day, name = state.babyName;
setGrowthDataEmpty(false); /* 有真实孕周了:恢复面板(数据源接入前仍是演示值,见函数注释) */
const _tl2 = document.querySelector('.today-line');
if (_tl2) _tl2.style.display = '';
const days = week * 7 + day; // 一起生活了多少天
@@ -2756,7 +2796,8 @@
state.due = null; state.week = null; state.day = null;
state.babyName = ''; state.userName = '';
syncPregnancy(); /* 占位 + 隐藏脚印时间轴 */
/* 首页来信卡归 laixin(applyLaixinReminder 里也判 pregEmpty/无身份),这里直接收起 */
/* 首页来信卡归 laixin(红点与卡都由 syncLaixinReminder 一处落,见它的无 openid 早退分支),
这里直接收起是**兜底**:访客态不该出现任何「你有新信」的暗示。 */
hideLetterCard();
return;
}