From 8f0e38ad511db39404708d4a838699cd74ed568e Mon Sep 17 00:00:00 2001 From: rain Date: Thu, 9 Jul 2026 11:09:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B5=E9=9D=A2=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E5=8A=9F=E8=83=BD=EF=BC=8C=E9=A6=96=E9=A1=B5=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E5=8A=9F=E8=83=BD=E5=AF=BC=E8=88=AA=E6=A0=8F=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E5=8A=9F=E8=83=BD=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/index.html | 2 +- images/trend-icons/basic-trend.png | Bin 0 -> 2395 bytes images/trend-icons/blue-amplitude.png | Bin 0 -> 3141 bytes images/trend-icons/blue-tail.png | Bin 0 -> 3912 bytes images/trend-icons/blue-trend.png | Bin 0 -> 3526 bytes images/trend-icons/blue-two-sum.png | Bin 0 -> 3190 bytes images/trend-icons/combined-trend.png | Bin 0 -> 4254 bytes images/trend-icons/dev-coming.png | Bin 0 -> 5129 bytes images/trend-icons/number-distribution.png | Bin 0 -> 4967 bytes images/trend-icons/red-blue-trend.png | Bin 0 -> 4691 bytes images/trend-icons/ssq-trend.png | Bin 0 -> 4878 bytes tmp/cai-single-lottery-test.js | 37 ++ tmp/generate-trend-icons.ps1 | 308 ++++++++++++ tmp/topbar-navigation-mode-test.js | 59 +++ tmp/topbar-signin-test.js | 28 ++ tmp/trend-icons-preview.png | Bin 0 -> 37071 bytes utils/CommonUtil.js | 523 ++++++++++++++++++++- 17 files changed, 943 insertions(+), 14 deletions(-) create mode 100644 images/trend-icons/basic-trend.png create mode 100644 images/trend-icons/blue-amplitude.png create mode 100644 images/trend-icons/blue-tail.png create mode 100644 images/trend-icons/blue-trend.png create mode 100644 images/trend-icons/blue-two-sum.png create mode 100644 images/trend-icons/combined-trend.png create mode 100644 images/trend-icons/dev-coming.png create mode 100644 images/trend-icons/number-distribution.png create mode 100644 images/trend-icons/red-blue-trend.png create mode 100644 images/trend-icons/ssq-trend.png create mode 100644 tmp/cai-single-lottery-test.js create mode 100644 tmp/generate-trend-icons.ps1 create mode 100644 tmp/topbar-navigation-mode-test.js create mode 100644 tmp/topbar-signin-test.js create mode 100644 tmp/trend-icons-preview.png diff --git a/html/index.html b/html/index.html index a874cde..b44cf05 100644 --- a/html/index.html +++ b/html/index.html @@ -532,7 +532,7 @@ escapeHtml(item.name) + '" />
' + escapeHtml(item.name) + - "进入预测文章
查看", + "进入分析文章查看", ); $trend.append( ' { + assert(commonUtil.includes(`'${page}'`), `cai navigation page missing: ${page}`); +}); + +[ + "usercenter.html", + "mianfeishoucang.html", + "tuiguang.html", + "jine.html", + "chongzhi.html", + "tixian.html", + "tixianlist.html", + "fabumianfeiwenzhang.html", + "fufei.html", + "appdown.html", + "apply.html", + "open-browser.html", + "reg.html", + "repwd.html", + "social-callback.html", + "upgrade.html", + "wodefenxiao.html", + "yinsixieyi.html", + "yonghuxieyi.html", +].forEach((page) => { + assert(commonUtil.includes(`'${page}'`), `empty navigation page missing: ${page}`); +}); + +[ + "双色球走势图", + "基本走势", + "出号分布", + "红蓝走势", + "综合走势", + "蓝球走势", + "蓝球振幅", + "蓝球尾数", + "蓝球两数和", +].forEach((label) => { + assert(commonUtil.includes(`label: '${label}'`), `feature nav item missing: ${label}`); +}); + +assert(commonUtil.includes("开发中敬请期待"), "coming-soon popup text missing"); +assert(commonUtil.includes("trend-icons/dev-coming.png"), "coming-soon popup image missing"); +assert(commonUtil.includes("this.installTopbarNavigationMode();"), "loadPageConfig should install topbar navigation mode"); +assert(commonUtil.includes("DOMContentLoaded', installTopbarNavigationMode"), "DOMContentLoaded should install topbar navigation mode"); + +console.log("topbar navigation mode checks passed"); diff --git a/tmp/topbar-signin-test.js b/tmp/topbar-signin-test.js new file mode 100644 index 0000000..9e7edfd --- /dev/null +++ b/tmp/topbar-signin-test.js @@ -0,0 +1,28 @@ +const fs = require('fs'); +const path = require('path'); + +const source = fs.readFileSync(path.join(__dirname, '..', 'utils', 'CommonUtil.js'), 'utf8'); + +function assertContains(pattern, message) { + if (!pattern.test(source)) { + console.error(message); + process.exit(1); + } +} + +assertContains(/topbar__btn--signin/, 'Expected public topbar to inject a sign-in button.'); +assertContains(/CommonUtil\.signIn\(/, 'Expected sign-in button to call CommonUtil.signIn().'); +assertContains(/text:\s*['"]\u7b7e\u5230['"]/, 'Expected sign-in button text to be sign in.'); +assertContains(/ensureTopbarSignInStyle/, 'Expected public topbar to install a dedicated sign-in button style.'); +assertContains(/\.topbar__btn--signin\s*\{/, 'Expected dedicated sign-in button CSS to be injected.'); +assertContains(/setTopbarSignInSigned/, 'Expected a shared helper to lock the topbar sign-in button.'); +assertContains(/\u5df2\u7b7e\u5230/, 'Expected signed state text to be already signed.'); +assertContains(/mineSignInStatus|\/api\/web\/mine\/sign-in\/status/, 'Expected topbar to load the current sign-in status.'); +assertContains(/\u5df2\u7b7e\u5230\|\u5df2\u7b7e\|\u5df2\u7ecf\u7b7e\u5230\|\u7b7e\u5230\u8fc7/, 'Expected already-signed API messages to lock the button.'); + +if (/class:\s*['"][^'"]*topbar__btn--signin[^'"]*topbar__btn--primary/.test(source)) { + console.error('Expected sign-in button to use a quieter dedicated style, not the primary button style.'); + process.exit(1); +} + +console.log('topbar sign-in checks passed'); diff --git a/tmp/trend-icons-preview.png b/tmp/trend-icons-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..f586ca91aa21c5589fe0427b076b162631f93383 GIT binary patch literal 37071 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 { + const $button = $(button); + $button + .prop('disabled', !!signed) + .toggleClass('is-signed', !!signed) + .text(signed ? '已签到' : '签到'); + }); + }, + + hasTopbarSignInStatusValue(data) { + if (typeof data === 'boolean') return true; + if (!data || typeof data !== 'object') return false; + const source = data.data && typeof data.data === 'object' ? data.data : data; + return [ + 'signedToday', + 'todaySigned', + 'isSignedToday', + 'signed', + 'isSigned', + 'hasSigned', + 'signIn', + 'signInStatus', + ].some((key) => source[key] !== undefined); + }, + + readTopbarSignInSigned(data) { + if (typeof data === 'boolean') return data; + if (!data || typeof data !== 'object') return false; + const source = data.data && typeof data.data === 'object' ? data.data : data; + const keys = [ + 'signedToday', + 'todaySigned', + 'isSignedToday', + 'signed', + 'isSigned', + 'hasSigned', + 'signIn', + 'signInStatus', + ]; + const value = keys.map((key) => source[key]).find((item) => item !== undefined && item !== null && item !== ''); + return value === true || value === 1 || value === '1' || String(value).toLowerCase() === 'true'; + }, + + isAlreadySignedResponse(res) { + if (this.hasTopbarSignInStatusValue(res) && this.readTopbarSignInSigned(res)) return true; + const data = res && typeof res.data === 'object' ? res.data : {}; + const text = [ + res && res.msg, + res && res.message, + data.msg, + data.message, + ].filter(Boolean).join(' '); + return /已签到|已签|已经签到|签到过/.test(text); + }, + + isSignInSuccessResponse(res) { + if (typeof ApiClient !== 'undefined' && ApiClient.isSuccess) return ApiClient.isSuccess(res); + return !!res && res.code === 0; + }, + + loadTopbarSignInStatus() { + if (typeof ApiClient === 'undefined' || !this.getToken()) return; + const url = ApiClient.API && ApiClient.API.mineSignInStatus + ? ApiClient.API.mineSignInStatus + : '/api/web/mine/sign-in/status'; + ApiClient.get(url, null, { headers: this.authHeaders() }) + .then((res) => { + if (this.isAlreadySignedResponse(res)) { + this.setTopbarSignInSigned(true); + } else if (this.hasTopbarSignInStatusValue(res)) { + this.setTopbarSignInSigned(this.readTopbarSignInSigned(res)); + } + }) + .catch(() => {}); + }, + installTopbarUserCenterEntry() { if (typeof document === 'undefined') return; + this.ensureTopbarSignInStyle(); const $ = this.$; $('#loggedInBox').each((index, box) => { const $box = $(box); @@ -244,14 +361,348 @@ const CommonUtil = { if ($logout.length && !$logout.parent().is($actions)) { $logout.appendTo($actions); } - if ($actions.find('.topbar__btn--center').length) return; - const $entry = $('', { - href: 'usercenter.html', - class: 'topbar__btn topbar__btn--center', - text: '个人中心', - }); - $actions.prepend($entry); + if (!$box.find('.topbar__btn--signin').length) { + const $signIn = $('' + + ''; + if (typeof layui !== 'undefined' && layui.layer) { + const index = layui.layer.open({ + type: 1, + title: false, + closeBtn: 0, + shadeClose: true, + area: ['348px', 'auto'], + skin: 'topbar-dev-layer', + content, + end: () => { + this.$('#navLotteryItems .topbar__nav-link--feature').removeClass('is-active'); + }, + }); + setTimeout(() => { + this.$('.topbar-dev-confirm').off('click.topbarDev').on('click.topbarDev', () => layui.layer.close(index)); + }, 0); + } else { + alert('开发中敬请期待'); + } + }, + + renderTopbarEmptyNav() { + const $ = this.$; + const $nav = $('#navLotteryItems'); + if (!$nav.length) return; + this.ensureTopbarNavigationModeStyle(); + if ($nav.attr('data-nav-mode') === 'empty' && !$nav.children().length) return; + $nav + .attr('data-nav-mode', 'empty') + .removeClass('topbar__nav--feature') + .addClass('is-empty') + .empty(); + }, + + renderTopbarFeatureNav() { + const $ = this.$; + const $nav = $('#navLotteryItems'); + if (!$nav.length) return; + const items = this.getTopbarFeatureNavItems(); + if ( + $nav.attr('data-nav-mode') === 'feature' && + $nav.find('.topbar__nav-link--feature').length === items.length + ) { + return; + } + + this.ensureTopbarNavigationModeStyle(); + $nav + .attr('data-nav-mode', 'feature') + .removeClass('is-empty') + .addClass('topbar__nav--feature') + .empty(); + + items.forEach((item) => { + $('', { + href: 'javascript:void(0)', + class: 'topbar__nav-link topbar__nav-link--feature', + 'data-nav-label': item.label, + title: item.label, + }) + .append($('', { + src: item.icon, + alt: '', + class: 'topbar__nav-feature-icon', + 'aria-hidden': 'true', + })) + .append($('', { + class: 'topbar__nav-feature-text', + text: item.label, + })) + .on('click', (event) => { + event.preventDefault(); + event.stopPropagation(); + if (event.stopImmediatePropagation) event.stopImmediatePropagation(); + $('#navLotteryItems .topbar__nav-link--feature').removeClass('is-active'); + this.showTopbarFeatureComingSoon(item); + }) + .appendTo($nav); + }); + }, + + applyTopbarNavigationMode() { + if (typeof document === 'undefined' || this.isTopbarCaiNavPage()) return; + if (this.isTopbarEmptyNavPage()) { + this.renderTopbarEmptyNav(); + return; + } + this.renderTopbarFeatureNav(); + }, + + installTopbarNavigationMode() { + if (typeof document === 'undefined' || this.isTopbarCaiNavPage() || window.__TOPBAR_NAV_MODE_INSTALLED__) return; + window.__TOPBAR_NAV_MODE_INSTALLED__ = true; + const run = () => this.applyTopbarNavigationMode(); + run(); + const nav = document.getElementById('navLotteryItems'); + if (!nav || typeof MutationObserver === 'undefined') return; + const observer = new MutationObserver(() => { + window.clearTimeout(window.__TOPBAR_NAV_MODE_TIMER__); + window.__TOPBAR_NAV_MODE_TIMER__ = window.setTimeout(run, 0); + }); + observer.observe(nav, { childList: true, subtree: true }); }, applyWebConfigs(configs) { @@ -580,6 +1031,39 @@ const CommonUtil = { ); }, + installCaiSingleLotteryMode() { + if (typeof document === 'undefined' || typeof ApiClient === 'undefined') return; + const $ = this.$; + const $lotteryFilter = $('#lotteryFilter'); + if (!$lotteryFilter.length) return; + + $lotteryFilter.closest('.cxz-filter-row').hide(); + + const $nav = $('#navLotteryItems'); + if (!$nav.length) return; + const currentCode = new URLSearchParams(window.location.search).get('id') || 'ssq'; + ApiClient.loadMenuCompat() + .then((res) => { + if (!res || res.code !== 0 || !Array.isArray(res.data)) return; + $nav.find('.topbar__nav-link').remove(); + res.data.forEach((item) => { + const code = item.suoxie || item.code || ''; + if (!code) return; + const activeClass = String(code) === currentCode ? ' is-active' : ''; + $nav.append( + '' + + this.escapeHtml(item.name || code) + + '' + ); + }); + }) + .catch(() => {}); + }, + asArray(value) { if (typeof ApiClient !== 'undefined' && ApiClient.asArray) return ApiClient.asArray(value); if (Array.isArray(value)) return value; @@ -601,6 +1085,8 @@ const CommonUtil = { this.ensureGlobalFooterLayout(); this.installWechatLoginEntry(); this.installWechatAccountBindEntry(); + this.installCaiSingleLotteryMode(); + this.installTopbarNavigationMode(); const loadHomeData = options.home !== false && this.isHomePageDom(); const request = loadHomeData ? this.loadHomePageData() : this.loadBasePageData(options); this.applyCaiExpertListLabels(); @@ -1919,13 +2405,21 @@ const CommonUtil = { signIn(onComplete) { layui.use('layer', () => { const layer = layui.layer; - ApiClient.post('/api/web/mine/sign-in', null, { headers: this.authHeaders() }).then((res) => { - layer.msg(res.code === 0 ? '签到成功' : res.msg || '签到失败', { - icon: res.code === 0 ? 1 : 2, - time: 1500, + ApiClient.post('/api/web/mine/sign-in', null, { headers: this.authHeaders() }) + .then((res) => { + layer.msg(res.code === 0 ? '签到成功' : res.msg || '签到失败', { + icon: res.code === 0 ? 1 : 2, + time: 1500, + }); + if (typeof onComplete === 'function') onComplete(res); + }) + .catch((error) => { + layer.msg(error?.message || '签到失败', { + icon: 2, + time: 1500, + }); + if (typeof onComplete === 'function') onComplete({ code: -1, msg: '签到失败', error }); }); - if (typeof onComplete === 'function') onComplete(res); - }); }); }, @@ -2019,12 +2513,15 @@ if (typeof module !== 'undefined' && module.exports) { window.CommonUtil = CommonUtil; CommonUtil.installUnifiedPagination(); const installTopbarUserCenterEntry = () => CommonUtil.installTopbarUserCenterEntry(); + const installTopbarNavigationMode = () => CommonUtil.installTopbarNavigationMode(); const ensureGlobalFooterLayout = () => CommonUtil.ensureGlobalFooterLayout(); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', installTopbarUserCenterEntry); + document.addEventListener('DOMContentLoaded', installTopbarNavigationMode); document.addEventListener('DOMContentLoaded', ensureGlobalFooterLayout); } else { installTopbarUserCenterEntry(); + installTopbarNavigationMode(); ensureGlobalFooterLayout(); } }