From ab8a3a5ea0287e05c28cb6f9b1d3a537de811395 Mon Sep 17 00:00:00 2001 From: Karlcarlo Date: Tue, 22 Sep 2026 21:12:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=8D=A0=E4=BD=8D/=E6=9D=A5=E4=BF=A1):=20?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=8D=A1=E6=BC=94=E7=A4=BA=E5=8D=A0=E4=BD=8D?= =?UTF-8?q?=E5=BD=92=E4=B8=AD=E6=80=A7=20+=20=E6=A1=A3=E6=A1=88=E5=B1=8F?= =?UTF-8?q?=E7=A9=BA=E6=80=81=20+=20=E4=BF=AE=E6=9D=A5=E4=BF=A1=E3=80=8C?= =?UTF-8?q?=E7=BA=A2=E7=82=B9=E6=9C=89=E3=80=81=E5=8D=A1=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E3=80=8D(v26092210)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 一、占位数据(新用户实测) - 首页工具卡:孕期体重「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 与访客态仍两者都收。 --- index.html | 54 ++++++++++++++++++++++++++++++++++++++++------------ js/app.js | 51 ++++++++++++++++++++++++++++++++++++++++++++----- mama-box.css | 7 +++++++ 3 files changed, 95 insertions(+), 17 deletions(-) diff --git a/index.html b/index.html index d7a8052..ea3d64f 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ 兜爸心选 · 孕育陪伴 - + @@ -200,7 +200,11 @@
@@ -481,13 +503,21 @@ - + 数字搬到标签上(和分段控件里其它计数同一种写法),#favCount 仍由 JS 更新。 + ⚠️ 这里原来写死 18,而屏幕上点亮的星标只有 6 个 —— 数字与内容对不上。 + 现在默认 0,由 app.js 启动时按 DOM 里 `.star.is-on` 的**实际个数**回填 + (档案页不是首屏,用户看不到中间态;点星标时再 ±1)。 --> +
-
+ +
还没有可统计的记录
去「数胎动」或「孕期体重」记一笔,这里会生成趋势
+
体重
58.2kg
@@ -508,7 +538,7 @@
-
+
妈妈体重 · 孕12–24周
@@ -524,7 +554,7 @@
我的体重推荐区间
-
+
双顶径
6.1cmP58
股骨长
4.4cmP52
腹围
19.6cmP61
diff --git a/js/app.js b/js/app.js index 77fecad..66f5ef4 100644 --- a/js/app.js +++ b/js/app.js @@ -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; } diff --git a/mama-box.css b/mama-box.css index 5482971..8d02686 100644 --- a/mama-box.css +++ b/mama-box.css @@ -1021,6 +1021,13 @@ a.skip:focus{left:16px;top:16px} .seg-panel.is-active{display:block;animation:fadeUp .38s var(--ease)} @keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}} +/* 成长数据空态(未建档):.is-empty 由 syncPregnancy 的 pregEmpty 分支挂上。 + 演示数字(体重 58.2kg / 日均胎动 31 次 / 双顶径 6.1cm / 体重曲线…)全部无接口数据源, + 对未建档用户是纯假数据,整块隐藏改显示引导;健康态下这层完全不参与,原型观感不变。 */ +.data-empty{display:none;font-size:13px;color:var(--ink-2);line-height:1.9;text-align:center;padding:26px 18px;background:#fff;border-radius:22px;box-shadow:var(--sh)} +.seg-panel[data-panel="data"].is-empty .data-demo{display:none} +.seg-panel[data-panel="data"].is-empty .data-empty{display:block} + /* 时光轴 */ .tl-card{background:#fff;border-radius:22px;padding:20px 18px 6px;box-shadow:var(--sh)} .tl-item{position:relative;padding:0 0 24px 22px}