Files
mama-box/js/kit.js

118 lines
8.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 11-03 孕期百宝箱(用户当天四轮改):
① 「把此刻那个板块改成测一测、科普、计算器」→ ② 「进去之后是列表页,名字改得大家看得懂」→ 三个入口:
趣味小测试 → 孕妈广场测试列表(guangchang/?c=ceshi);孕期百问 → 首页全部问题页(app.js openQA);孕期计算器 → topic/jisuan/
③ 「加上多少万人测过、算过」→ 卡上人数行(模拟数,AGENTS.md 12b,12-31 复核)
④ 「百宝箱单独拎出来做一个模块,下面放一个像『其他妈妈也在搜』的列表,三块各拿两个」→ 独立 section #kitHome(孕妈广场上面),
入口下面 6 条:测试 / 百问 / 计算器 交替各 2 条,按孕周挑,点了直达那一项。
原「此刻」#pulse 只是藏起来(kit.css),JS 照跑(别处要用它的总人数);地址带 ?kit=0 可看回旧版。 */
(function () {
if (/[?&]kit=0(?:&|$)/.test(location.search)) return;
var box = document.getElementById('kit'), sec = document.getElementById('kitHome');
if (!box || !sec) return;
var V = '26110264';
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/kit.css?v=' + V; document.head.appendChild(l);
document.documentElement.classList.add('has-kit');
function esc(t) { return String(t == null ? '' : t).replace(/[&<>"]/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]; }); }
function cleanQ(extra) {
var q = new URLSearchParams(location.search);
['t', 'n', 'c', 'id', 'mine', 'write', 'fav', 'kit'].forEach(function (k) { q.delete(k); });
if (extra) Object.keys(extra).forEach(function (k) { q.set(k, extra[k]); });
var s = q.toString(); return (s ? '?' + s : '') + location.hash;
}
function wan(n) { return n >= 1e6 ? Math.round(n / 1e4) + '万' : n >= 1e4 ? (Math.round(n / 1e3) / 10) + '万' : String(Math.round(n)); } /* 百万以上取整,卡片窄放得下 */
function total() { var p = window.__mbPulse; return (p && p.total && +p.total.value) || 1510000; }
var FIRE = '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12.6 2.5c.4 3-1.6 4.6-3 6.2C8 10.4 7 12 7 14.3A5 5 0 0012 19.5a5 5 0 005-5.2c0-2-1-3.6-1.9-4.6-.2 1.3-.9 2.2-1.9 2.6.6-3.4-.2-7-.6-9.8z" fill="currentColor"/></svg>';
/* ---------- 上:三个入口 ---------- */
var E = [
{ k: 'qz', n: '趣味小测试', d: '1 分钟出结果,测测你是哪种孕妈', c: '30 个测试', img: 'ceshi', u: '人测过' },
{ k: 'qa', n: '孕期百问', d: '孕妈最常问的问题,一次看明白', c: '100 个问题', img: 'kepu', u: '人看过' },
{ k: 'js', n: '孕期计算器', d: '花多少钱、休几天产假,算一算', c: '4 个计算器', img: 'jisuan', u: '人算过' }
];
box.innerHTML = '<div class="kit-hd"><h2 class="kit-tt"><span>孕期百宝箱</span></h2><span>测一测 · 查一查 · 算一算</span></div><div class="kit-g">' +
E.map(function (x) {
return '<button type="button" class="kit-e e-' + x.k + '" data-k="' + x.k + '"><img src="assets/img/kit/' + x.img + '.webp" alt="" decoding="async">' +
'<b>' + x.n + '</b><span>' + x.d + '</span><strong class="kit-n">' + FIRE + '<i>--</i>' + x.u + '</strong><em>' + x.c + '<i aria-hidden="true">›</i></em></button>';
}).join('') + '</div>' +
'<div class="kit-lh"><b>大家都在用</b><span class="kit-wk"></span></div><div class="ms-list kit-list"></div>';
sec.classList.remove('hide');
function setCnt(k, t) { var e = box.querySelector('.e-' + k + ' em'); if (e) e.firstChild.nodeValue = t; }
function setNum(k, n) { var e = box.querySelector('.e-' + k + ' .kit-n i'); if (e && n) e.textContent = wan(n); }
/* 人数口径:测过 = 30 个测试 gcTested 之和(同广场「累计 N 万人次参与」);看过 = 「此刻」总人数 × 0.62;算过 = 4 个计算器 heat 之和 × 总人数(同 topic/jisuan) */
function nums() {
if (window.GC_TESTS_META && window.gcTested) { setNum('qz', window.GC_TESTS_META.reduce(function (a, x) { return a + window.gcTested(x.id); }, 0)); setCnt('qz', window.GC_TESTS_META.length + ' 个测试'); }
setNum('qa', total() * .62);
setNum('js', total() * CALC.reduce(function (a, x) { return a + x.heat; }, 0));
if (QA && QA.length) setCnt('qa', QA.length + ' 个问题');
}
/* ---------- 下:6 条列表(测试 / 百问 / 计算器 交替,各 2 条) ---------- */
/* 测试按孕周段分池(段同 app.js qaBand:1 ≤8 / 2 ≤13 / 3 ≤20 / 4 ≤28 / 5 ≤36 / 6 37+;0 = 没孕周 / 产后),每天轮换起点 */
var QZ_POOL = {
0: ['t11', 't14', 't13', 't16', 't18', 't23', 't03', 't22'],
1: ['t17', 't01', 't25', 't24', 't02', 't11'],
2: ['t17', 't01', 't25', 't24', 't02', 't11'],
3: ['t24', 't25', 't01', 't17', 't21', 't02'],
4: ['t24', 't21', 't25', 't01', 't02', 't17'],
5: ['t05', 't21', 't02', 't24', 't03', 't25'],
6: ['t05', 't03', 't02', 't06', 't21', 't25']
};
/* 计算器(同 topic/jisuan 列表;heat 也同那页) */
var CALC = [
{ q: '生娃到底要花多少钱?一键算清', h: 'topic/huafei/', heat: .118 },
{ q: '孕期该长多少斤?按身高体重算', h: '/yunqi-tizhong/', heat: .083 },
{ q: '胎儿现在多重?填 B 超数估一估', h: '/taier-guzhong/', heat: .071, gate: 15 },
{ q: '产假能休多少天?哪天回去上班', h: 'topic/zhichang/', heat: .062 }
];
var QA = null, day = Math.floor((Date.now() + 288e5) / 864e5);
function band() { var p = window.__mbPreg || {}; return p.postpartum || !p.week ? 0 : (window.__mbQaBand ? window.__mbQaBand(p.week) : 0); }
function rows() {
var b = band(), p = window.__mbPreg || {}, wk = p.week && !p.postpartum ? p.week : 0, out = { qz: [], qa: [], js: [] };
var meta = window.GC_TESTS_META || [], pool = (QZ_POOL[b] || QZ_POOL[0]).map(function (id) { return meta.filter(function (x) { return x.id === id; })[0]; }).filter(Boolean);
for (var i = 0; i < Math.min(2, pool.length); i++) {
var t = pool[(day + i) % pool.length];
out.qz.push({ q: t.title, href: 'guangchang/ceshi/' + cleanQ({ id: t.id }), n: window.gcTested ? window.gcTested(t.id) : 0, u: '人测过' });
}
if (QA && QA.length) {
var skip = ['topic/huafei/', 'topic/ceshi/', 'topic/duiyou/', 'topic/zhichang/'];
var all = window.__mbQaPick ? window.__mbQaPick(QA, wk, 40) : QA;
all.filter(function (x) { return x.href && skip.indexOf(x.href) < 0; }).slice(0, 2).forEach(function (x) {
out.qa.push({ q: x.q, href: x.href + location.search + location.hash, n: total() * (+x.heat || .03), u: '人看过' });
});
}
var cl = CALC.filter(function (x) { return !(x.gate && wk && wk < x.gate); });
if (b >= 5) cl = [cl[cl.length - 1]].concat(cl.slice(0, -1)); /* 孕 29 周起产假排前 */
cl.slice(0, 2).forEach(function (x) { out.js.push({ q: x.q, href: x.h + location.search + location.hash, n: total() * x.heat, u: '人算过' }); });
var r = [];
for (var k = 0; k < 2; k++) ['qz', 'qa', 'js'].forEach(function (c) { if (out[c][k]) r.push(Object.assign({ c: c }, out[c][k])); });
return { r: r, wk: wk };
}
var TAG = { qz: '测试', qa: '百问', js: '计算器' };
function paint() {
nums();
var d = rows(), L = box.querySelector('.kit-list');
box.querySelector('.kit-wk').textContent = d.wk ? '孕 ' + d.wk + ' 周' : '';
L.innerHTML = d.r.map(function (x, i) {
return '<a class="ms-it ripple kit-it" href="' + esc(x.href) + '"><i class="ms-no">' + (i + 1) + '</i>' +
'<span class="ms-m"><span class="ms-q">' + esc(x.q) + '</span><span class="ms-h">' + FIRE + '<b>' + wan(x.n) + x.u + '</b></span></span>' +
'<span class="kit-tg t-' + x.c + '">' + TAG[x.c] + '</span><i class="ms-go">›</i></a>';
}).join('');
}
fetch('assets/data/qa/hot.json?v=' + V).then(function (r) { return r.ok ? r.json() : []; }).catch(function () { return []; })
.then(function (a) { QA = Array.isArray(a) ? a : []; paint(); });
if (!window.gcTested) { var ms = document.createElement('script'); ms.src = 'guangchang/ceshi/meta.js?v=' + V; ms.onload = paint; document.body.appendChild(ms); }
window.addEventListener('mb-preg', paint);
setTimeout(paint, 3000); /* 「此刻」总人数接口晚到时按后台配置的人数重算一次 */
paint();
box.addEventListener('click', function (e) {
var b = e.target.closest('.kit-e'); if (!b) return;
try { navigator.vibrate && navigator.vibrate(8); } catch (x) {}
var k = b.dataset.k;
if (k === 'qz') location.href = 'guangchang/' + cleanQ({ c: 'ceshi' });
else if (k === 'js') location.href = 'topic/jisuan/' + cleanQ();
else if (window.__mbOpenQA) window.__mbOpenQA('孕期百问');
});
})();