diff --git a/public/css/style.css b/public/css/style.css index 283aa75..cf9a8e0 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,5 +1,5 @@ /* ===== Modern MC Report System ===== */ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap'); +/* 字体使用系统栈, 不依赖 Google Fonts(国内不可达且受 CSP 限制) */ :root { --p: #6366f1; --pd: #4f46e5; --pl: #eef2ff; --pg: linear-gradient(135deg,#6366f1,#8b5cf6); @@ -19,7 +19,7 @@ *{margin:0;padding:0;box-sizing:border-box} body{ - font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI','Noto Sans SC',sans-serif; + font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Noto Sans SC','Microsoft YaHei',sans-serif; background:var(--g1);color:var(--g8);line-height:1.6; -webkit-font-smoothing:antialiased;display:flex;flex-direction:column;min-height:100vh; } diff --git a/public/index.html b/public/index.html index 67b2a7e..534225f 100644 --- a/public/index.html +++ b/public/index.html @@ -54,32 +54,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/public/js/app.js b/public/js/app.js index 6b7ab6b..32eae31 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -97,12 +97,68 @@ const App = { closeModal() { document.getElementById('modal-overlay').classList.add('hidden'); }, navigate(page, param) { location.hash = `#/${page}` + (param ? `/${param}` : ''); }, - route() { + // ===== 页面脚本懒加载: 按路由动态注入, 避免全量下发 ===== + _scriptCache: {}, + // 路由 → 依赖脚本(不带 .js 后缀); home 依赖 ticket-create(首页内嵌提交表单), reset 定义于 forgot.js + PAGE_SCRIPTS: { + home: ['home', 'ticket-create'], + install: ['install'], + login: ['login'], + register: ['register'], + forgot: ['forgot'], + reset: ['forgot'], + verify: ['verify'], + dashboard: ['dashboard'], + unclaimed: ['unclaimed'], + tickets: ['tickets', 'ticket-create'], + ticket: ['ticket-detail'], + tracking: ['tracking'], + users: ['users'], + notifications: ['notifications'], + 'external-api': ['external-api'], + 'external-api-docs': ['external-api-docs'], + sources: ['sources'], + templates: ['templates'], + settings: ['settings-page'], + export: ['export-page'], + polls: ['polls'], + features: ['features'], + feature: ['feature-detail'], + servers: ['servers'], + bans: ['bans'], + logs: ['logs'], + }, + loadScript(src) { + if (this._scriptCache[src]) return this._scriptCache[src]; + const p = new Promise((resolve, reject) => { + const s = document.createElement('script'); + s.src = src; + s.onload = () => resolve(); + s.onerror = () => { delete this._scriptCache[src]; reject(new Error('脚本加载失败: ' + src)); }; + document.head.appendChild(s); + }); + this._scriptCache[src] = p; + return p; + }, + async loadPageScripts(page) { + const files = this.PAGE_SCRIPTS[page] || [page]; + for (const f of files) await this.loadScript(`js/pages/${f}.js`); + }, + + async route() { const hash = location.hash || '#/home'; const parts = hash.replace('#/', '').split('/'); const page = parts[0]; const param = parts.slice(1).join('/'); + // 先加载当前路由所需页面脚本, 再渲染 + try { await this.loadPageScripts(page); } + catch (e) { + console.error('页面脚本加载失败:', e.message); + document.getElementById('page-content').innerHTML = `
页面资源加载失败, 请刷新重试
`; + return; + } + if (page === 'verify') { this.showPublic('verify'); return;