diff --git a/patch_v2/meowpanel/web/meowpanel.js b/patch_v2/meowpanel/web/meowpanel.js index 95625eb..54d52ec 100644 --- a/patch_v2/meowpanel/web/meowpanel.js +++ b/patch_v2/meowpanel/web/meowpanel.js @@ -136,6 +136,16 @@ $('#offline-banner').hidden = !!ok; } + /* ---------------- 调试日志(浏览器控制台可见,过滤 [mp]) ---------------- */ + function dbg() { + const a = Array.from(arguments); + console.log.apply(console, ['[mp]'].concat(a)); + } + function dbgErr() { + const a = Array.from(arguments); + console.warn.apply(console, ['[mp][ERR]'].concat(a)); + } + /* ---------------- API 客户端 ---------------- */ // 返回 {code,message,status} 形异常;网络/非 JSON → 视为断连 async function api(method, path, body) { @@ -151,25 +161,34 @@ init.body = JSON.stringify(body); } if (Object.keys(headers).length) init.headers = headers; + const t0 = performance.now(); try { res = await fetch(path, init); } catch (e) { + dbgErr(method || 'GET', path, '网络层失败:', e && e.message); setConn(false); throw { code: 'NETWORK', message: '后端未连接', status: 0 }; } + const ms = Math.round(performance.now() - t0); + /* 先读原文再解析:非 JSON 时能拿到原始内容前 300 字节进控制台 */ + let text = ''; + try { text = await res.text(); } catch (e) { /* 读体失败走 NOT_JSON */ } let json = null; - try { json = await res.json(); } catch (e) { json = null; } + try { json = text ? JSON.parse(text) : null; } catch (e) { json = null; } if (!json || typeof json.ok !== 'boolean') { // 静态服务器返回 HTML / 404 等 + dbgErr(method || 'GET', path, 'HTTP', res.status, ms + 'ms', '非 JSON 响应, 原始内容头:', text.slice(0, 300)); setConn(res.ok ? true : false); throw { code: 'NOT_JSON', message: '后端返回了非 JSON 响应(HTTP ' + res.status + ')', status: res.status }; } if (!json.ok) { setConn(true); const code = (json.error && json.error.code) || 'ERROR'; + dbgErr(method || 'GET', path, 'HTTP', res.status, ms + 'ms', '后端错误:', code, (json.error && json.error.message) || ''); if (code === 'UNAUTHORIZED') authRequired(); // 会话失效/未认证 → 弹登录页 throw { code: code, message: (json.error && json.error.message) || ('后端错误 ' + code), status: res.status }; } + if (ms > 800) dbg(method || 'GET', path, '慢响应', ms + 'ms'); setConn(true); return json.data; } @@ -2321,6 +2340,7 @@ const id = (location.hash || '#/home').replace('#/', '').split('?')[0] || 'home'; const r = ROUTES[id] || ROUTES.home; state.route = id; + dbg('route →', id); stopPerf(); stopAudio(); stopNet();