测一测:列表、信息流卡、测试开始页显示「N万人测过」模拟人数(AGENTS.md 12b 登记例外,2026-12-31 前复核);v26110224
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -101,6 +101,12 @@ nginx:`root /opt/app` + `Cache-Control: no-cache` + `etag on` —— 缓存靠
|
||||
- ⚠️ 悄悄话后端(`models/mamaBoxWhisper.py`、`services/mama_box_whisper_serv.py`、`mama_box_router.py` 与 `models/__init__.py` 的改动)是 2026-10-02 **直接改在服务器 `/opt/app/box_app` 上的,没进 git**(当时的账号无 box_app 推送权限;改前备份在 `/opt/app/box_app_bak_202610021000`)。服务器下次 `git reset --hard` 前,必须由有权限的人先把这几个文件提交进仓库,否则接口会丢。
|
||||
- 边界:**只限这张卡**。孕期盲盒的数字(已收集、本周开盒人数)一律真实;任何别处都不得引用这里的模拟数字,前端也不得在接口失败时自造数字兜底。
|
||||
|
||||
12b. **⚠️ 第 2 条的第二个登记例外:孕妈广场「测一测」的「N 人测过」(2026-11-02 起)**
|
||||
- 内容:测一测列表、信息流测试卡、测试开始页显示的「N万人测过」和测一测头卡的「累计 N 万人次参与」,都是前端 `guangchang/ceshi/meta.js` 里 `gcTested(id)` 按测试 id 哈希出的模拟数(1.2万~6万起,每天约 +0.4%),不落库、不进任何报表。
|
||||
- 决策人:产品负责人(用户本人),2026-11-02 拍板「人数用模拟数字就行,先帮我放上模拟数字」;已书面告知虚假宣传风险(《反不正当竞争法》第 8 条),并建议过改用真实统计。
|
||||
- 期限:**最晚 2026-12-31** 复核;接真实统计后删掉 `gcTested` / `gcTestedText`,调用处改读接口。
|
||||
- 边界:只限上述几处;测试结果页、分享图、其他应用不得引用这个数。
|
||||
|
||||
13. **跳其它 H5 应用 / 调第三方接口一律同源:只写相对路径 `/<slug>/`,不写域名**(2026-10-09 用户定)
|
||||
- 背景:小程序 web-view 只放行业务域名 `mp.yizhezhe.com`,直连 `taidong.douba.top`(或任何 `*.douba.top`)会被拦;
|
||||
首页直接 `fetch` 别的域名还会跨域。所有第三方 H5 都由 mp 前置机(8.145.39.61)nginx 反代过去,路径不变。
|
||||
|
||||
@@ -187,5 +187,5 @@
|
||||
}
|
||||
/* feed.js 首页默认不加载(index.html 只引了 topics.js),这里按需拉一次 */
|
||||
if (window.GC_FEED) init();
|
||||
else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110223'; fs.onload = fs.onerror = init; document.body.appendChild(fs); }
|
||||
else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110224'; fs.onload = fs.onerror = init; document.body.appendChild(fs); }
|
||||
})();
|
||||
|
||||
@@ -225,6 +225,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
</head>
|
||||
<body>
|
||||
<svg class="hide" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
|
||||
<symbol id="i-user" viewBox="0 0 24 24"><path d="M16 19v-1a4 4 0 00-4-4H8a4 4 0 00-4 4v1M10 10a3 3 0 100-6 3 3 0 000 6zM20 19v-1a4 4 0 00-3-3.9M15 4.1a3 3 0 010 5.8"/></symbol>
|
||||
<symbol id="i-back" viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></symbol>
|
||||
<symbol id="i-arrow" viewBox="0 0 24 24"><path d="M5 12h13M13 6.5l5.5 5.5-5.5 5.5"/></symbol>
|
||||
<symbol id="i-check" viewBox="0 0 24 24"><path d="M5 12.5l4.5 4.5L19 7.5"/></symbol>
|
||||
@@ -254,6 +255,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
<div class="meta">
|
||||
<span><svg class="ic"><use href="#i-list"/></svg><b class="num" id="sN"></b>题 · 约<b class="num" id="sMin"></b>分钟</span>
|
||||
<span id="sKind"></span>
|
||||
<span id="sCnt"><svg class="ic"><use href="#i-user"/></svg><b class="num" id="sCntN"></b></span>
|
||||
</div>
|
||||
<img class="pic" id="sPic" src="" alt="">
|
||||
</section>
|
||||
@@ -323,7 +325,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
</div>
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script src="tests.js?v=26110223"></script>
|
||||
<script src="meta.js?v=26110224"></script>
|
||||
<script src="tests.js?v=26110224"></script>
|
||||
<script>
|
||||
(function () {
|
||||
'use strict';
|
||||
@@ -394,6 +397,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
$('#sKind').innerHTML = '<svg class="ic"><use href="#' + (isQuiz ? 'i-bulb' : 'i-heart') + '"/></svg>' + (isQuiz ? '答完当场看解析' : '没有对错之分');
|
||||
$('#sPic').src = IMG(0); $('#sPic').alt = t.title;
|
||||
$('#sLead').textContent = t.intro;
|
||||
if (window.gcTestedText) $('#sCntN').textContent = gcTestedText(t.id); else $('#sCnt').hidden = true;
|
||||
$('#sTyEn').textContent = R.length + (isType ? ' TYPES' : ' LEVELS');
|
||||
$('#sTyT').textContent = isType ? R.length + ' 种结果,你是哪一种?' : isQuiz ? R.length + ' 个称号,你能拿到哪个?' : R.length + ' 种状态,看看你在哪一档';
|
||||
$('#tgrid').innerHTML = R.map(function (r) { return '<div class="tcard"><img src="' + rImg(r) + '" alt="" loading="lazy"><span><b>' + esc(r.title) + '</b><small>' + esc(r.tag) + '</small></span></div>'; }).join('');
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -143,6 +143,9 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
|
||||
.csg-h b{position:relative;font-size:17px;font-weight:900;color:#2A1E1E}
|
||||
.csg-h b::after{content:"";position:absolute;left:-2px;right:-2px;bottom:1px;height:7px;border-radius:4px;background:var(--tg);opacity:.22;z-index:-1}
|
||||
.csg-h b{z-index:0}
|
||||
.pc{display:inline-flex;align-items:center;margin-top:3px;font-size:11px;font-style:normal;font-weight:700;color:#C98A7A}
|
||||
.csf .pc{display:flex;margin:6px 0 0}
|
||||
.pc::before{content:"";width:6px;height:6px;margin-right:4px;border-radius:50%;background:#FF8A6B;box-shadow:0 0 0 2px rgba(255,138,107,.2)}
|
||||
.csg-h small{font-size:12px;color:#A08B85}
|
||||
.csg-h em{margin-left:auto;font-style:normal;font-size:12px;font-weight:800;color:var(--tg)}
|
||||
.csf{position:relative;display:flex;align-items:center;gap:12px;width:100%;margin-top:10px;padding:14px 12px 14px 16px;border-radius:22px;overflow:hidden;text-align:left;background:linear-gradient(125deg,var(--tl),#fff 85%);box-shadow:0 8px 20px -14px var(--tg)}
|
||||
@@ -587,10 +590,10 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
|
||||
<div id="sheet" role="dialog" aria-modal="true"><i class="sg"></i><div class="sbd" id="sbd"></div></div>
|
||||
<div class="toast" id="toast"></div>
|
||||
|
||||
<script src="topics.js?v=26110223"></script>
|
||||
<script src="data.js?v=26110223"></script>
|
||||
<script src="feed.js?v=26110223"></script>
|
||||
<script src="ceshi/meta.js?v=26110223"></script>
|
||||
<script src="topics.js?v=26110224"></script>
|
||||
<script src="data.js?v=26110224"></script>
|
||||
<script src="feed.js?v=26110224"></script>
|
||||
<script src="ceshi/meta.js?v=26110224"></script>
|
||||
<script>
|
||||
(function () {
|
||||
'use strict';
|
||||
@@ -791,7 +794,7 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
|
||||
function testCardHTML(x, done) {
|
||||
var d = done && done[x.id];
|
||||
return '<button type="button" class="nc tst g-' + x.group + '" data-test="' + x.id + '"><div class="cvw"><img src="ceshi/img/' + x.id + '_s.webp" alt="" loading="lazy">' +
|
||||
'<span class="tb"><svg class="ic"><use href="#i-spark"/></svg>测一测</span><span class="tq">' + x.n + ' 题 · 约 ' + x.min + ' 分钟</span></div>' +
|
||||
'<span class="tb"><svg class="ic"><use href="#i-spark"/></svg>测一测</span><span class="tq">' + gcTestedText(x.id) + ' · ' + x.n + ' 题</span></div>' +
|
||||
'<div class="nb"><h3>' + esc(x.title) + '</h3><div class="nf">' + (d ? '<span class="gs dn">已测 · ' + esc(d.title) + '</span>' : '<span class="gs">' + TG[x.group] + '</span>') +
|
||||
'<span class="gt">' + (d ? '再测' : '去测') + ' ›</span></div></div></button>';
|
||||
}
|
||||
@@ -802,23 +805,23 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
|
||||
var d = done[x.id];
|
||||
return '<button type="button" class="cst k' + (i % 5) + (i === 0 ? ' big' : i === l.length - 1 && l.length % 2 === 0 ? ' wide' : '') + '" data-test="' + x.id + '"><i class="qm">?</i>' +
|
||||
'<b>' + esc(x.title) + '</b><small>' + esc(x.sub) + '</small>' +
|
||||
'<span class="ft">' + (d ? '<em>我是 · ' + esc(d.title) + '</em>' : x.n + ' 题') + '<span class="ar"><svg class="ic"><use href="#i-right"/></svg></span></span></button>';
|
||||
'<span class="ft">' + (d ? '<em>我是 · ' + esc(d.title) + '</em>' : gcTestedText(x.id)) + '<span class="ar"><svg class="ic"><use href="#i-right"/></svg></span></span></button>';
|
||||
}).join('') + '</div>';
|
||||
if (g === 'game') return '<ol class="csm">' + l.map(function (x, i) {
|
||||
var d = done[x.id];
|
||||
return '<li><button type="button" class="csx' + (d ? ' ok' : '') + '" data-test="' + x.id + '"><span class="nd"><small>第</small>' + (i + 1) + '<small>站</small></span>' +
|
||||
'<span class="tx"><b>' + esc(x.title) + '</b><small>' + (d ? '已拿称号「' + esc(d.title) + '」' : esc(x.sub)) + '</small></span>' +
|
||||
'<span class="tx"><b>' + esc(x.title) + '</b><small>' + (d ? '已拿称号「' + esc(d.title) + '」' : esc(x.sub)) + '</small>' + '<i class="pc">' + gcTestedText(x.id) + '</i>' + '</span>' +
|
||||
'<span class="go">' + (d ? '再闯' : '开闯') + '</span></button></li>';
|
||||
}).join('') + '</ol>';
|
||||
if (g === 'quiz') return '<div class="csq">' + l.map(function (x, i) {
|
||||
var d = done[x.id];
|
||||
return '<button type="button" class="csn" data-test="' + x.id + '"><span class="no"><small>NO.</small>' + ('0' + (TM.filter(function (y) { return y.group === 'quiz'; }).indexOf(x) + 1)).slice(-2) + '</span><span class="tx"><b>' + esc(x.title) + '</b>' +
|
||||
'<small>' + (d ? '<em>已测 · ' + esc(d.title) + '</em>' : esc(x.sub)) + '</small></span><span class="ar"><svg class="ic"><use href="#i-right"/></svg></span></button>';
|
||||
'<small>' + (d ? '<em>已测 · ' + esc(d.title) + '</em>' : esc(x.sub)) + '</small>' + '<i class="pc">' + gcTestedText(x.id) + '</i>' + '</span><span class="ar"><svg class="ic"><use href="#i-right"/></svg></span></button>';
|
||||
}).join('') + '</div>';
|
||||
return l.map(function (x) {
|
||||
var d = done[x.id];
|
||||
return '<button type="button" class="csr" data-test="' + x.id + '"><img src="ceshi/img/' + x.id + '_s.webp" alt="" loading="lazy"><span class="tx"><b>' + esc(x.title) + '</b>' +
|
||||
'<small>' + (d ? '<em>已测 · ' + esc(d.title) + '</em>' : esc(x.sub)) + '</small></span><span class="ar"><svg class="ic"><use href="#i-right"/></svg></span></button>';
|
||||
'<small>' + (d ? '<em>已测 · ' + esc(d.title) + '</em>' : esc(x.sub)) + '</small>' + '<i class="pc">' + gcTestedText(x.id) + '</i>' + '</span><span class="ar"><svg class="ic"><use href="#i-right"/></svg></span></button>';
|
||||
}).join('');
|
||||
}
|
||||
function ceshiListHTML() {
|
||||
@@ -829,14 +832,14 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
|
||||
var f = l.filter(function (x) { return !done[x.id]; })[0] || l[0]; /* 推荐位:本组第一个没测过的 */
|
||||
if (g === 'psy' || g === 'game') return '<section class="csg g-' + g + '"><div class="csg-h"><b>' + TG[g] + '</b><small>' + l.length + ' 套 · ' + TGD[g] + '</small>' + (nd ? '<em>已测 ' + nd + '</em>' : '') + '</div>' + rest(g, l, done) + '</section>';
|
||||
return '<section class="csg g-' + g + '"><div class="csg-h"><b>' + TG[g] + '</b><small>' + l.length + ' 套 · ' + TGD[g] + '</small>' + (nd ? '<em>已测 ' + nd + '</em>' : '') + '</div>' +
|
||||
'<button type="button" class="csf" data-test="' + f.id + '"><span class="tx"><small>' + (done[f.id] ? '再测一次' : '本组推荐') + '</small><b>' + esc(f.title) + '</b><p>' + esc(f.sub) + '</p>' +
|
||||
'<button type="button" class="csf" data-test="' + f.id + '"><span class="tx"><small>' + (done[f.id] ? '再测一次' : '本组推荐') + '</small><b>' + esc(f.title) + '</b><p>' + esc(f.sub) + '</p><i class="pc">' + gcTestedText(f.id) + '</i>' +
|
||||
'<span class="go">' + (done[f.id] ? '再测' : '开始测') + '<svg class="ic"><use href="#i-right"/></svg></span></span><img src="ceshi/img/' + f.id + '_s.webp" alt="" loading="lazy"></button>' +
|
||||
rest(g, l.filter(function (x) { return x !== f; }), done) + '</section>';
|
||||
}).join('') + '</div>';
|
||||
}
|
||||
function ceshiHead() {
|
||||
var n = function (g) { return TM.filter(function (x) { return x.group === g; }).length; };
|
||||
return '<div class="csh"><b>孕育测一测</b><p>知识考卷、趣味心理、闯关挑战、好物配置,测完就有专属结果卡</p>' +
|
||||
return '<div class="csh"><b>孕育测一测</b><p>累计 ' + Math.round(TM.reduce(function (a, x) { return a + gcTested(x.id); }, 0) / 1e4) + ' 万人次参与 · 知识考卷、趣味心理、闯关挑战、好物配置,测完就有专属结果卡</p>' +
|
||||
'<div class="gn"><span class="g-quiz">考卷 ' + n('quiz') + '</span><span class="g-psy">心理 ' + n('psy') + '</span><span class="g-game">闯关 ' + n('game') + '</span><span class="g-shop">好物 ' + n('shop') + '</span></div>' +
|
||||
'<img src="ceshi/img/t11_s.webp" alt=""></div>';
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ main{padding:6px 16px 0}
|
||||
</div>
|
||||
<div class="wb"><button type="button" id="write"><svg class="ic" viewBox="0 0 24 24"><path d="M12 20h9M16.5 3.5a2.1 2.1 0 013 3L7 19l-4 1 1-4z"/></svg>写新的故事</button></div>
|
||||
|
||||
<script src="../topics.js?v=26110223"></script>
|
||||
<script src="../topics.js?v=26110224"></script>
|
||||
<script>
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<title>兜爸心选 · 孕育陪伴</title>
|
||||
<!-- V:26110223 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||
<!-- V:26110224 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||
<link rel="stylesheet" href="mama-box.css">
|
||||
<link rel="stylesheet" href="night.css">
|
||||
<!-- 夜晚模式:首屏绘制前就按上次的选择加 class,避免先白后黑闪一下(开关在首页右上角 #nightBtn,逻辑见 app.js) -->
|
||||
@@ -2498,7 +2498,7 @@
|
||||
<script src="/_bridge/avatar-picker.js?v=26101105"></script>
|
||||
<script src="/_bridge/hand-icons.js?v=26101202"></script>
|
||||
<script src="js/zodiac-art.js"></script>
|
||||
<script src="guangchang/topics.js?v=26110223"></script>
|
||||
<script src="guangchang/topics.js?v=26110224"></script>
|
||||
<script src="js/app.js"></script>
|
||||
<script>
|
||||
/* 11-02 首页「孕妈广场」效果稿:地址带 ?gcv=1~6 时,把 #gcHome 换成 demo/gch/vN.css + vN.js 的版式并滚到这一块。
|
||||
@@ -2506,7 +2506,7 @@
|
||||
(function () {
|
||||
var m = location.search.match(/[?&]gcv=([1-6])(?:&|$)/);
|
||||
if (!m) window.__gcDefault = 1;
|
||||
var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110223';
|
||||
var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110224';
|
||||
l.rel = 'stylesheet'; l.href = 'demo/gch/v' + n + '.css?' + q;
|
||||
s.src = 'demo/gch/v' + n + '.js?' + q;
|
||||
if (m) s.onload = function () { setTimeout(function () { var el = document.getElementById('gcHome'); if (el) el.scrollIntoView({ block: 'center' }); }, 900); };
|
||||
@@ -2514,7 +2514,7 @@
|
||||
/* 11-02 品牌露出(用户定 4 处都要):默认加载,?brand=0 可关掉对比;⚠️ 上正式前和 V6 一起并进正式代码,别依赖 demo/ */
|
||||
if (!/[?&]brand=0/.test(location.search)) {
|
||||
var bl = document.createElement('link'), bs = document.createElement('script');
|
||||
bl.rel = 'stylesheet'; bl.href = 'demo/brand/brand.css?v=26110223'; bs.src = 'demo/brand/brand.js?v=26110223';
|
||||
bl.rel = 'stylesheet'; bl.href = 'demo/brand/brand.css?v=26110224'; bs.src = 'demo/brand/brand.js?v=26110224';
|
||||
document.head.appendChild(bl); document.body.appendChild(bs);
|
||||
}
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user