UGC 总开关:孕妈广场+测一测+专题评论区按后台 ugcEnabled 显示,关着时广场/测试页回首页(js/ugc.js,v26110415)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
deploy
2026-11-04 08:14:07 +00:00
parent 4c4e4582d6
commit 8b8c62d63f
25 changed files with 137 additions and 63 deletions

View File

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

View File

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

View File

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

View File

@@ -9,7 +9,7 @@
if (/[?&]kit=0(?:&|$)/.test(location.search)) return;
var box = document.getElementById('kit'), sec = document.getElementById('kitHome');
if (!box || !sec) return;
var V = '26110414';
var V = '26110415';
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');
@@ -33,7 +33,7 @@
{ k: 'js', n: '孕期计算器', d: '花多少钱、休几天产假,算一算', c: '14 个计算器', img: 'jisuan', u: '人算过' },
{ k: 'qz', n: '趣味小测试', d: '1 分钟测出你是哪种孕妈', c: '30 个测试', img: 'ceshi', u: '人测过' }
];
box.innerHTML = '<div class="kit-hd"><h2 class="kit-tt"><span>孕期百宝箱</span></h2><span>查一查 · 算一算 · 测一测</span></div><div class="kit-pn"><div class="kit-g">' +
box.innerHTML = '<div class="kit-hd"><h2 class="kit-tt"><span>孕期百宝箱</span></h2><span class="kit-sl">查一查 · 算一算' + (window.__mbUgc ? ' · 测一测' : '') + '</span></div><div class="kit-pn"><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>';
@@ -107,7 +107,8 @@
var r = [];
if (out.js[0]) r.push(Object.assign({ c: 'js', hot: 1 }, out.js[0]));
/* 11-04 用户:「百宝箱下面从 6 个改成 4 个」→ 生娃计算器(火)+ 测试 + 百问 + 第二个计算器,各类至少一条 */
[['qz', 0], ['qa', 0], ['js', 1]].forEach(function (p) { if (out[p[0]][p[1]]) r.push(Object.assign({ c: p[0] }, out[p[0]][p[1]])); });
/* 11-04 UGC 开关关着(js/ugc.js):不出测试,换成第二条百问,仍是 4 条 */
(window.__mbUgc ? [['qz', 0], ['qa', 0], ['js', 1]] : [['qa', 0], ['qa', 1], ['js', 1]]).forEach(function (p) { if (out[p[0]][p[1]]) r.push(Object.assign({ c: p[0] }, out[p[0]][p[1]])); });
return { r: r, wk: wk };
}
var TAG = { qz: '测试', qa: '百问', js: '计算器' };
@@ -227,6 +228,7 @@
.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);
window.addEventListener('mb-ugc', function () { var sl = box.querySelector('.kit-sl'); if (sl) sl.textContent = '查一查 · 算一算' + (window.__mbUgc ? ' · 测一测' : ''); paint(); });
setTimeout(paint, 3000); /* 「此刻」总人数接口晚到时按后台配置的人数重算一次 */
paint();

View File

@@ -8,7 +8,7 @@
postMessage 不是实时投递,微信在分享那一刻才派发,所以每次换内容都要再报一次;子页面没引 jweixin,这里按需加载。 */
(function (g) {
'use strict';
var V = '26110414';
var V = '26110415';
var isWx = /MicroMessenger/i.test(navigator.userAgent || '');
var waiting = [], loading = false;
function ready(cb) {

40
js/ugc.js Normal file
View File

@@ -0,0 +1,40 @@
/* 11-04 UGC 总开关(用户:「正式版先把孕妈广场和测一测整个模块隐藏起来,后台加个开关,打开就出现、关上就隐藏」)
开关在后台 /box_bm/plaza 顶部,存 box_admin.mamabox_configs.ugcEnabled,公开读 GET /api/mp/public/mama-box/config(改完不用发版)。
关闭时(默认):
· <html> 带 .ugc-off,下面这张样式表把首页孕妈广场整块、百宝箱「趣味小测试」、「我的收藏」、专题页评论区藏掉;
· 带 data-guard 引入本脚本的页面(广场页 / 测试页 / 我的投稿 / 两个老测试)直接回首页;
· 别的脚本读 window.__mbUgc(true/false),等结果用 window.__mbUgcReady(Promise),中途变了会发 mb-ugc 事件。
上一次拿到的值存本机 mmbox.ugc.v1,先按它渲染、接口回来再校正;接口不通就沿用上一次的值(从没拿到过 = 关)。
本文件在 <root>/js/ugc.js,必须同步 <script> 引入(要靠 document.currentScript 算首页地址)。 */
(function () {
var K = 'mmbox.ugc.v1', de = document.documentElement, me = document.currentScript, on = false;
try { on = localStorage.getItem(K) === '1'; } catch (e) {}
var guard = !!(me && me.hasAttribute('data-guard'));
var home = me ? new URL('../', me.src).pathname : '/';
var st = document.createElement('style');
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 .kit-g{grid-template-columns:repeat(2,1fr)!important}';
(document.head || de).appendChild(st);
function apply(v) { on = !!v; window.__mbUgc = on; de.classList.toggle('ugc-off', !on); }
function goHome() { location.replace(home + (location.hash || '')); }
apply(on);
if (guard && !on) de.style.visibility = 'hidden'; /* 还不知道开没开:先别露内容,免得关着时闪一下 */
window.__mbUgcReady = new Promise(function (res) {
var t = setTimeout(function () { res(null); }, 4000);
fetch('/api/mp/public/mama-box/config', { cache: 'no-store' })
.then(function (r) { return r.json(); })
.then(function (j) { clearTimeout(t); res(!!(j && j.result && j.result.ugcEnabled)); })
.catch(function () { clearTimeout(t); res(null); });
}).then(function (v) {
if (v === null) v = on; else try { localStorage.setItem(K, v ? '1' : '0'); } catch (e) {}
var changed = v !== on;
apply(v);
if (guard) { if (!v) { goHome(); return v; } de.style.visibility = ''; }
if (changed) try { window.dispatchEvent(new Event('mb-ugc')); } catch (e) {}
return v;
});
})();