diff --git a/internal/engineeringdashboard/assets/app.js b/internal/engineeringdashboard/assets/app.js index eecb4d03..db7f347c 100644 --- a/internal/engineeringdashboard/assets/app.js +++ b/internal/engineeringdashboard/assets/app.js @@ -1,5 +1,13 @@ (function () { - const token = window.__DASHBOARD_TOKEN__; + function resolveToken() { + const fromURL = new URL(window.location.href).searchParams.get("token"); + if (fromURL) return fromURL; + const meta = document.querySelector('meta[name="engineering-dashboard-token"]'); + const fromMeta = meta && meta.getAttribute("content"); + if (fromMeta && fromMeta !== "__TOKEN__") return fromMeta; + return ""; + } + const token = resolveToken(); const state = { snap: null, view: "overview", @@ -25,7 +33,7 @@ function syncURL() { const u = new URL(window.location.href); - u.searchParams.set("token", token); + if (token) u.searchParams.set("token", token); u.searchParams.set("view", state.view); if (state.q) u.searchParams.set("q", state.q); else u.searchParams.delete("q"); if (state.selectedDoc) u.searchParams.set("doc", state.selectedDoc); else u.searchParams.delete("doc"); @@ -44,6 +52,11 @@ } async function fetchSnapshot(force) { + if (!token) { + el.status.textContent = "缺少访问令牌"; + renderHardError("缺少 token:请使用服务启动时打印的完整 URL(含 ?token=)打开页面"); + return false; + } el.status.textContent = state.snap ? "刷新中…" : "首次加载中…"; const url = "/api/v1/snapshot?token=" + encodeURIComponent(token) + (force ? "&refresh=1" : ""); const headers = {}; @@ -281,6 +294,10 @@ async function loop() { loadURL(); + if (!token) { + renderHardError("缺少 token:请使用服务启动时打印的完整 URL(含 ?token=)打开页面"); + return; + } try { const changed = await fetchSnapshot(true); if (changed || state.snap) render(); diff --git a/internal/engineeringdashboard/assets/index.html b/internal/engineeringdashboard/assets/index.html index 88c76f46..63d53af2 100644 --- a/internal/engineeringdashboard/assets/index.html +++ b/internal/engineeringdashboard/assets/index.html @@ -3,6 +3,7 @@
+