v26110443 首页「孕N周专属福利」加后台开关(giftEnabled,默认开;js/ugc.js 读同一接口,关时藏 .shelf.gift2)

This commit is contained in:
deploy
2026-11-05 03:06:51 +00:00
parent 4e6166c7e6
commit 93ebc92092
11 changed files with 38 additions and 29 deletions

View File

@@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) --> <!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) -->
<script src="../../js/ugc.js?v=26110416" data-guard></script> <script src="../../js/ugc.js?v=26110443" data-guard></script>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no"> <meta name="format-detection" content="telephone=no">
<title>测一测 · 孕妈广场</title> <title>测一测 · 孕妈广场</title>
@@ -369,8 +369,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
</div> </div>
<div class="toast" id="toast"></div> <div class="toast" id="toast"></div>
<script src="meta.js?v=26110416"></script> <script src="meta.js?v=26110443"></script>
<script src="tests.js?v=26110416"></script> <script src="tests.js?v=26110443"></script>
<script> <script>
(function () { (function () {
'use strict'; 'use strict';

View File

@@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) --> <!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) -->
<script src="../js/ugc.js?v=26110416" data-guard></script> <script src="../js/ugc.js?v=26110443" data-guard></script>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no"> <meta name="format-detection" content="telephone=no">
<title>孕妈广场</title> <title>孕妈广场</title>
@@ -668,10 +668,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 id="sheet" role="dialog" aria-modal="true"><i class="sg"></i><div class="sbd" id="sbd"></div></div>
<div class="toast" id="toast"></div> <div class="toast" id="toast"></div>
<script src="topics.js?v=26110416"></script> <script src="topics.js?v=26110443"></script>
<script src="data.js?v=26110416"></script> <script src="data.js?v=26110443"></script>
<script src="feed.js?v=26110416"></script> <script src="feed.js?v=26110443"></script>
<script src="ceshi/meta.js?v=26110416"></script> <script src="ceshi/meta.js?v=26110443"></script>
<script> <script>
(function () { (function () {
'use strict'; 'use strict';
@@ -737,7 +737,7 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
var CMD = null, CMERR = false; var CMD = null, CMERR = false;
/* 头像编码:数字 = av/NNNN.webp(旧代码头像);'av:c012' = av/c012.webp(卡通/可爱卡通);'/…' = 站内绝对路径(内置头像库 /_bridge/avatars/);其余 = assets/img/mom/xxx.jpg */ /* 头像编码:数字 = av/NNNN.webp(旧代码头像);'av:c012' = av/c012.webp(卡通/可爱卡通);'/…' = 站内绝对路径(内置头像库 /_bridge/avatars/);其余 = assets/img/mom/xxx.jpg */
var avP = function (a) { return typeof a === 'number' ? 'av/' + ('000' + a).slice(-4) + '.webp' : a.indexOf('av:') === 0 ? 'av/' + a.slice(3) + '.webp' : a.charAt(0) === '/' ? a : '../assets/img/mom/' + a + '.jpg'; }; var avP = function (a) { return typeof a === 'number' ? 'av/' + ('000' + a).slice(-4) + '.webp' : a.indexOf('av:') === 0 ? 'av/' + a.slice(3) + '.webp' : a.charAt(0) === '/' ? a : '../assets/img/mom/' + a + '.jpg'; };
fetch('cm.json?v=26110416').then(function (r) { return r.json(); }).then(function (j) { fetch('cm.json?v=26110443').then(function (r) { return r.json(); }).then(function (j) {
CMD = j; if (openId && NBY[openId]) { renderComments(NBY[openId]); syncBar(NBY[openId]); } CMD = j; if (openId && NBY[openId]) { renderComments(NBY[openId]); syncBar(NBY[openId]); }
}).catch(function () { CMERR = true; if (openId && NBY[openId]) renderComments(NBY[openId]); }); }).catch(function () { CMERR = true; if (openId && NBY[openId]) renderComments(NBY[openId]); });
function commentsOf(n) { function commentsOf(n) {

View File

@@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) --> <!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) -->
<script src="../../js/ugc.js?v=26110416" data-guard></script> <script src="../../js/ugc.js?v=26110443" data-guard></script>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no"> <meta name="format-detection" content="telephone=no">
<title>我的投稿</title> <title>我的投稿</title>
@@ -107,7 +107,7 @@ main{padding:6px 16px 0}
</div> </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> <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=26110416"></script> <script src="../topics.js?v=26110443"></script>
<script> <script>
(function () { (function () {
'use strict'; 'use strict';

View File

@@ -8,8 +8,8 @@
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<title>兜爸心选 · 孕育陪伴</title> <title>兜爸心选 · 孕育陪伴</title>
<!-- 11-04 UGC 总开关(孕妈广场 + 测一测,后台 /box_bm/plaza 顶部切换),见 js/ugc.js --> <!-- 11-04 UGC 总开关(孕妈广场 + 测一测,后台 /box_bm/plaza 顶部切换),见 js/ugc.js -->
<script src="js/ugc.js?v=26110416"></script> <script src="js/ugc.js?v=26110443"></script>
<!-- V:26110416 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 --> <!-- V:26110443 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<link rel="stylesheet" href="mama-box.css"> <link rel="stylesheet" href="mama-box.css">
<link rel="stylesheet" href="night.css"> <link rel="stylesheet" href="night.css">
<!-- 夜晚模式:首屏绘制前就按上次的选择加 class,避免先白后黑闪一下(开关在首页右上角 #nightBtn,逻辑见 app.js) --> <!-- 夜晚模式:首屏绘制前就按上次的选择加 class,避免先白后黑闪一下(开关在首页右上角 #nightBtn,逻辑见 app.js) -->
@@ -2521,7 +2521,7 @@
<script src="/_bridge/avatar-picker.js?v=26101105"></script> <script src="/_bridge/avatar-picker.js?v=26101105"></script>
<script src="/_bridge/hand-icons.js?v=26101202"></script> <script src="/_bridge/hand-icons.js?v=26101202"></script>
<script src="js/zodiac-art.js"></script> <script src="js/zodiac-art.js"></script>
<script src="guangchang/topics.js?v=26110416"></script> <script src="guangchang/topics.js?v=26110443"></script>
<script src="js/app.js"></script> <script src="js/app.js"></script>
<script> <script>
/* 11-02 首页「孕妈广场」效果稿:地址带 ?gcv=1~6 时,把 #gcHome 换成 demo/gch/vN.css + vN.js 的版式并滚到这一块。 /* 11-02 首页「孕妈广场」效果稿:地址带 ?gcv=1~6 时,把 #gcHome 换成 demo/gch/vN.css + vN.js 的版式并滚到这一块。
@@ -2533,7 +2533,7 @@
if (gchDone || !window.__mbUgc) return; gchDone = true; if (gchDone || !window.__mbUgc) return; gchDone = true;
var m = location.search.match(/[?&]gcv=([1-6])(?:&|$)/); var m = location.search.match(/[?&]gcv=([1-6])(?:&|$)/);
if (!m) window.__gcDefault = 1; if (!m) window.__gcDefault = 1;
var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110416'; var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110443';
var dir = n === '4' || n === '6' ? 'js/gch/' : 'demo/gch/'; /* 11-03 上正式:定稿 V6(含它套的 V4)并进 js/gch/,其余效果稿仍在 demo/ */ var dir = n === '4' || n === '6' ? 'js/gch/' : 'demo/gch/'; /* 11-03 上正式:定稿 V6(含它套的 V4)并进 js/gch/,其余效果稿仍在 demo/ */
l.rel = 'stylesheet'; l.href = dir + 'v' + n + '.css?' + q; l.rel = 'stylesheet'; l.href = dir + 'v' + n + '.css?' + q;
s.src = dir + 'v' + n + '.js?' + q; s.src = dir + 'v' + n + '.js?' + q;
@@ -2548,7 +2548,7 @@
/* 11-02 品牌露出(用户定 4 处都要):默认加载,?brand=0 可关掉对比;11-03 已并进 js/gch/ */ /* 11-02 品牌露出(用户定 4 处都要):默认加载,?brand=0 可关掉对比;11-03 已并进 js/gch/ */
if (!/[?&]brand=0/.test(location.search)) { if (!/[?&]brand=0/.test(location.search)) {
var bl = document.createElement('link'), bs = document.createElement('script'); var bl = document.createElement('link'), bs = document.createElement('script');
bl.rel = 'stylesheet'; bl.href = 'js/gch/brand.css?v=26110416'; bs.src = 'js/gch/brand.js?v=26110416'; bl.rel = 'stylesheet'; bl.href = 'js/gch/brand.css?v=26110443'; bs.src = 'js/gch/brand.js?v=26110443';
document.head.appendChild(bl); document.body.appendChild(bs); document.head.appendChild(bl); document.body.appendChild(bs);
} }
})(); })();

View File

@@ -3,7 +3,7 @@
(function () { (function () {
'use strict'; 'use strict';
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */ /* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
var VER = '26110416'; var VER = '26110443';
const $ = (s, c) => (c || document).querySelector(s); const $ = (s, c) => (c || document).querySelector(s);
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s)); const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));

View File

@@ -236,5 +236,5 @@
} }
/* feed.js 首页默认不加载(index.html 只引了 topics.js),这里按需拉一次 */ /* feed.js 首页默认不加载(index.html 只引了 topics.js),这里按需拉一次 */
if (window.GC_FEED) init(); if (window.GC_FEED) init();
else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110416'; fs.onload = fs.onerror = init; document.body.appendChild(fs); } else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110443'; fs.onload = fs.onerror = init; document.body.appendChild(fs); }
})(); })();

View File

@@ -6,9 +6,9 @@
(function () { (function () {
var sec = document.getElementById('gcHome'); var sec = document.getElementById('gcHome');
if (!sec) return; if (!sec) return;
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/gch/v4.css?v=26110416'; var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/gch/v4.css?v=26110443';
document.head.appendChild(l); document.head.appendChild(l);
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110416'; var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110443';
s.onload = function () { if (sec.querySelector('.g4-foot')) merge(); else sec.addEventListener('gc4-ready', merge, { once: true }); }; /* v4 要先拉 feed.js 才渲染 */ s.onload = function () { if (sec.querySelector('.g4-foot')) merge(); else sec.addEventListener('gc4-ready', merge, { once: true }); }; /* v4 要先拉 feed.js 才渲染 */
document.body.appendChild(s); document.body.appendChild(s);

View File

@@ -5,17 +5,20 @@
· 带 data-guard 引入本脚本的页面(广场页 / 测试页 / 我的投稿 / 两个老测试)直接回首页; · 带 data-guard 引入本脚本的页面(广场页 / 测试页 / 我的投稿 / 两个老测试)直接回首页;
· 别的脚本读 window.__mbUgc(true/false),等结果用 window.__mbUgcReady(Promise),中途变了会发 mb-ugc 事件。 · 别的脚本读 window.__mbUgc(true/false),等结果用 window.__mbUgcReady(Promise),中途变了会发 mb-ugc 事件。
上一次拿到的值存本机 mmbox.ugc.v1,先按它渲染、接口回来再校正;接口不通就沿用上一次的值(从没拿到过 = 关)。 上一次拿到的值存本机 mmbox.ugc.v1,先按它渲染、接口回来再校正;接口不通就沿用上一次的值(从没拿到过 = 关)。
11-05 同一个接口顺带读 giftEnabled(用户:「首页底部孕 N 周专属福利加个开关,可以关闭隐藏」):
false → <html> 带 .gift-off,藏首页 .shelf.gift2 整块;默认/从没拿到 = 显示,缓存 mmbox.gift.v1。
本文件在 <root>/js/ugc.js,必须同步 <script> 引入(要靠 document.currentScript 算首页地址)。 */ 本文件在 <root>/js/ugc.js,必须同步 <script> 引入(要靠 document.currentScript 算首页地址)。 */
(function () { (function () {
var K = 'mmbox.ugc.v1', de = document.documentElement, me = document.currentScript, on = false; var K = 'mmbox.ugc.v1', KG = 'mmbox.gift.v1', de = document.documentElement, me = document.currentScript, on = false;
try { on = localStorage.getItem(K) === '1'; } catch (e) {} try { on = localStorage.getItem(K) === '1'; de.classList.toggle('gift-off', localStorage.getItem(KG) === '0'); } catch (e) {}
var guard = !!(me && me.hasAttribute('data-guard')); var guard = !!(me && me.hasAttribute('data-guard'));
var home = me ? new URL('../', me.src).pathname : '/'; var home = me ? new URL('../', me.src).pathname : '/';
var st = document.createElement('style'); var st = document.createElement('style');
st.textContent = st.textContent =
'html.ugc-off #gcHome,html.ugc-off #meFavCard,html.ugc-off .kit-e.e-qz,html.ugc-off #tx-cm,html.ugc-off .tc-in{display:none!important}' + 'html.ugc-off #gcHome,html.ugc-off #meFavCard,html.ugc-off .kit-e.e-qz,html.ugc-off #tx-cm,html.ugc-off .tc-in{display:none!important}' +
'html.ugc-off .kit-g{grid-template-columns:repeat(2,1fr)!important}'; 'html.ugc-off .kit-g{grid-template-columns:repeat(2,1fr)!important}' +
'html.gift-off .shelf.gift2{display:none!important}';
(document.head || de).appendChild(st); (document.head || de).appendChild(st);
function apply(v) { on = !!v; window.__mbUgc = on; de.classList.toggle('ugc-off', !on); } function apply(v) { on = !!v; window.__mbUgc = on; de.classList.toggle('ugc-off', !on); }
@@ -27,7 +30,13 @@
var t = setTimeout(function () { res(null); }, 4000); var t = setTimeout(function () { res(null); }, 4000);
fetch('/api/mp/public/mama-box/config', { cache: 'no-store' }) fetch('/api/mp/public/mama-box/config', { cache: 'no-store' })
.then(function (r) { return r.json(); }) .then(function (r) { return r.json(); })
.then(function (j) { clearTimeout(t); res(!!(j && j.result && j.result.ugcEnabled)); }) .then(function (j) {
clearTimeout(t);
var g = !(j && j.result && j.result.giftEnabled === false);
de.classList.toggle('gift-off', !g);
try { localStorage.setItem(KG, g ? '1' : '0'); } catch (e) {}
res(!!(j && j.result && j.result.ugcEnabled));
})
.catch(function () { clearTimeout(t); res(null); }); .catch(function () { clearTimeout(t); res(null); });
}).then(function (v) { }).then(function (v) {
if (v === null) v = on; else try { localStorage.setItem(K, v ? '1' : '0'); } catch (e) {} if (v === null) v = on; else try { localStorage.setItem(K, v ? '1' : '0'); } catch (e) {}

View File

@@ -68,7 +68,7 @@
function getJSON(u) { return fetch(u, { cache: 'no-cache' }).then(function (r) { if (!r.ok) throw r.status; return r.json(); }); } function getJSON(u) { return fetch(u, { cache: 'no-cache' }).then(function (r) { if (!r.ok) throw r.status; return r.json(); }); }
function related(box) { function related(box) {
getJSON('../_shared/idx.json?v=26110416').then(function (idx) { getJSON('../_shared/idx.json?v=26110443').then(function (idx) {
var me = null; idx.forEach(function (x) { if (x[0] === SLUG) me = x; }); var me = null; idx.forEach(function (x) { if (x[0] === SLUG) me = x; });
var tag = me ? me[2] : '', h = 0; for (var i = 0; i < SLUG.length; i++) h = (h * 31 + SLUG.charCodeAt(i)) >>> 0; var tag = me ? me[2] : '', h = 0; for (var i = 0; i < SLUG.length; i++) h = (h * 31 + SLUG.charCodeAt(i)) >>> 0;
var rest = idx.filter(function (x) { return x[0] !== SLUG && (window.__mbUgc || ['ceshi', 'duiyou'].indexOf(x[0]) < 0); }); /* UGC 关着不推两个测试 */ var rest = idx.filter(function (x) { return x[0] !== SLUG && (window.__mbUgc || ['ceshi', 'duiyou'].indexOf(x[0]) < 0); }); /* UGC 关着不推两个测试 */
@@ -175,13 +175,13 @@
} }
fetch(API + '/comments?kind=topic&target=' + encodeURIComponent(SLUG) + (OID ? '&openid=' + encodeURIComponent(OID) : '')) fetch(API + '/comments?kind=topic&target=' + encodeURIComponent(SLUG) + (OID ? '&openid=' + encodeURIComponent(OID) : ''))
.then(function (r) { return r.json(); }).then(function (j) { if (j && j.code === 200) { RC = j.result; paint(); } }).catch(function () {}); .then(function (r) { return r.json(); }).then(function (j) { if (j && j.code === 200) { RC = j.result; paint(); } }).catch(function () {});
getJSON('../_shared/cm/' + SLUG + '.json?v=26110416').then(function (d) { L = d.c || []; paint(); }).catch(function () { paint(); }); getJSON('../_shared/cm/' + SLUG + '.json?v=26110443').then(function (d) { L = d.c || []; paint(); }).catch(function () { paint(); });
} }
function ugcReady() { function ugcReady() {
if (window.__mbUgcReady) return window.__mbUgcReady; if (window.__mbUgcReady) return window.__mbUgcReady;
return new Promise(function (res) { return new Promise(function (res) {
var u = document.createElement('script'); u.src = '../../js/ugc.js?v=26110416'; var u = document.createElement('script'); u.src = '../../js/ugc.js?v=26110443';
u.onload = function () { (window.__mbUgcReady || Promise.resolve(false)).then(res); }; u.onload = function () { (window.__mbUgcReady || Promise.resolve(false)).then(res); };
u.onerror = function () { res(false); }; u.onerror = function () { res(false); };
document.head.appendChild(u); document.head.appendChild(u);

View File

@@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) --> <!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) -->
<script src="../../js/ugc.js?v=26110416" data-guard></script> <script src="../../js/ugc.js?v=26110443" data-guard></script>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no"> <meta name="format-detection" content="telephone=no">
<title>测一测你是什么样的妈妈?</title> <title>测一测你是什么样的妈妈?</title>

View File

@@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) --> <!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) -->
<script src="../../js/ugc.js?v=26110416" data-guard></script> <script src="../../js/ugc.js?v=26110443" data-guard></script>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no"> <meta name="format-detection" content="telephone=no">
<title>测一测:你家准爸爸是哪种队友?</title> <title>测一测:你家准爸爸是哪种队友?</title>