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:
51
js/app.js
51
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user