diff --git a/index.html b/index.html index 75567d9..a9f1add 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ 兜爸心选 · 孕育陪伴 - + diff --git a/js/app.js b/js/app.js index 4276b81..72574ac 100644 --- a/js/app.js +++ b/js/app.js @@ -3,7 +3,7 @@ (function () { 'use strict'; /* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */ - var VER = '26100451'; + var VER = '26100452'; const $ = (s, c) => (c || document).querySelector(s); const $$ = (s, c) => Array.from((c || document).querySelectorAll(s)); @@ -265,6 +265,17 @@ } /* ② 后退重载:脚本会重跑,init() 里调;① bfcache:整页不重载,挂在文件末尾已有的 pageshow 上 */ + /* ================= 示例模式(2026-10-05) ================= + 用户:「把首页的示例生成出来,用 29 周;所有该呈现的都呈现;脚印、底 tab 宝宝来信的圈都加示例;兜豆默认 2000; + 档案页现有的示例(含 40 周旅程图)都保留」。用途:演示 / 截图 / 给人看完整首页。 + ⚠️ 只在**预览路径 + 网址显式带 demo=1**(?demo=1 或 #…&demo=1)时打开。正式首页 /mama-box/ 永远走不到 —— + AGENTS §4.2 不造假数据,2026-09-22 出过写死演示值被所有用户看到的事故;示例绝不能靠「接口没回来就兜底」触发。 + 打开后覆盖的只有展示:孕 29 周 0 天(预产期按今天倒推)、脚印 4 条 + 宝宝气泡、来信角标 2、兜豆 2000、档案 Tab 带 ?demo=1。 + 其余模块(工具卡示例、此刻、悄悄话、小知识、商城商品、福利)本来就有数据或预览示例,照常显示。 */ + const DEMO = location.pathname.indexOf('/mama-box-preview/') === 0 && + (/[?&]demo=1(&|$)/.test(location.search) || hashParam('demo') === '1'); + const DEMO_WEEK = 29; + /* 2026-10-01 用户要求「档案」Tab 改跳孕期档案 H5(会话 19875b1b 提供)。 ⚠️ 对方说明:目前是设计演示版(写死演示数据),还不读 URL 参数;接真实数据时按 ?openid=&unionid= 读, 所以这里照旧拼上。无 return_url,返回靠宿主自带返回。原来跳的是 /chanjian-rili/(孕检日历)。 */ @@ -276,6 +287,7 @@ const q = []; if (oid) q.push('openid=' + encodeURIComponent(oid)); if (uid) q.push('unionid=' + encodeURIComponent(uid)); + if (DEMO) q.push('demo=1'); // 示例模式:成长档案也出它自己的示例(含 40 周旅程图) if (q.length) u += '?' + q.join('&'); reportLastApp(ARCHIVE_H5, 'chengzhangdangan'); reportHostLocation(u); @@ -763,7 +775,7 @@ let _laixinUnread = null; // 最近一次未读结果;建档状态变化时靠它重算 function renderLetterReminder() { const badge = $('#tabBadge'); - const r = _laixinUnread; + const r = DEMO ? { ok: true, unread: 2, unreadLetters: 1, unreadReplies: 1 } : _laixinUnread; // 示例模式:圈 2 if (state.pregEmpty || !r || r.ok === false || !(Number(r.unread) > 0)) { if (badge) badge.classList.remove('show'); hideLetterCard(); @@ -3218,6 +3230,13 @@ if (pg.result.due) { const d = parseDay(pg.result.due); if (d) state.due = d; } } } + if (DEMO) { // 示例模式:固定孕 29 周 0 天,预产期 = 今天 + (280 - 203) 天 + state.postpartum = false; state.pregEmpty = false; + state.week = DEMO_WEEK; state.day = 0; + const t = new Date(); t.setHours(0, 0, 0, 0); + state.due = new Date(t.getTime() + (TERM - DEMO_WEEK * 7) * DAY_MS); + if (!state.babyName) state.babyName = '小汤圆'; + } // 统一回刷依赖这些 state 的展示 syncPregnancy(); if (plHook) setTimeout(plHook, 0); // 「此刻」按孕周重拉(setTimeout:等下面 syncStaticDates 把 #calNext 算好) @@ -4781,7 +4800,21 @@ ⚠️ 模块显隐只有 fpRender 一个 owner(原来 syncPregnancy 也直接改 display,会撞竞态)。 */ let _fpMode = 'pending'; // pending(加载中) | rows | guide | hide let _fpData = null; // 接口 result(events / digest / lead / unused…) - function fpApply(mode, r) { _fpMode = mode; _fpData = r || null; fpRender(); if (plHook) plHook(); } + function fpApply(mode, r) { + if (DEMO) { // 示例模式:固定一组脚印 + 宝宝气泡(不再追加下面 fpRender 里的预览示例行) + mode = 'rows'; + r = { + events: [ + { at: '08:10', label: '称体重 58.2 kg,本周 +0.3 kg' }, + { at: '09:20', label: '数胎动,宝宝动了 12 次' }, + { at: '12:40', label: '查了「孕期能不能吃」:杨梅' }, + { at: '15:05', label: '记一次血糖 5.6 mmol/L(餐后 2 小时)' }, + ], + digest: { text: '妈妈今天好认真呀!我动了 12 下,你都数到啦~下午记得多喝点水,晚上我们一起听故事。' }, + }; + } + _fpMode = mode; _fpData = r || null; fpRender(); if (plHook) plHook(); + } function fpRender() { const tl = document.querySelector('.today-line'), steps = $('#tlSteps'), guide = $('#tlGuide'); const _cd = $('#fpCalD'); @@ -4826,7 +4859,7 @@ /* ⚠️ 示例脚印(2026-10-03 用户:「多放两个脚印示例,数胎动、数宫缩、称体重」)——**只在预览环境** (路径含 mama-box-preview,或 hash 带 fpdemo=1)追加,用来看多条时的排版;正式版不会出现,不冒充真记录。 确认样式后整段删掉即可。 */ - if (/mama-box-preview/.test(location.pathname) || hashParam('fpdemo') === '1') { + if (!DEMO && (/mama-box-preview/.test(location.pathname) || hashParam('fpdemo') === '1')) { rows.push( { at: '09:20', label: '数胎动,宝宝动了 12 次', detail: '', app: '' }, { at: '11:05', label: '数宫缩 3 次,间隔约 8 分钟', detail: '', app: '' }, @@ -5159,6 +5192,7 @@ return fetch(DOU_API + '/dou/summary', { headers: { Authorization: 'Bearer ' + tok } }) .then(function (r) { if (r.status === 401) douToken = ''; return r.ok ? r.json() : null; }); }).then(function (sum) { + if (DEMO) sum = Object.assign({}, sum || {}, { balance: 2000 }); // 示例模式:兜豆默认 2000 if (!sum || typeof sum.balance !== 'number') return; return dropP.then(function (d) { const now = d && d.server_time ? new Date(d.server_time).getTime() : Date.now();