This commit is contained in:
dekun
2026-05-30 16:01:46 +08:00
parent 1993c7b4b1
commit e96a386d35
5 changed files with 240 additions and 8 deletions
+86 -2
View File
@@ -118,6 +118,15 @@
<span class="frame-title" id="current-service-name"></span>
</div>
<div class="frame-toolbar-actions">
<button
type="button"
class="btn btn-secondary btn-toolbar-refresh"
id="frame-gate-login"
title="通过本地导航代登录 Gate 扫单(需配置 NAV_GATE_SCOUT_USERNAME / NAV_GATE_SCOUT_PASSWORD"
hidden
>
Gate 登录
</button>
<button
type="button"
class="btn btn-secondary btn-toolbar-refresh"
@@ -159,6 +168,7 @@
<script>
(function () {
var hubAutoLogin = {{ 'true' if hub_auto_login else 'false' }};
var gateScoutAutoLogin = {{ 'true' if gate_scout_auto_login else 'false' }};
var layoutMain = document.getElementById("layout-main");
var btnSidebarCollapse = document.getElementById("sidebar-collapse");
var btnSidebarExpand = document.getElementById("sidebar-expand");
@@ -201,6 +211,7 @@
var btnBack = document.getElementById("frame-back-overview");
var btnBackHub = document.getElementById("frame-back-hub");
var btnHubLogin = document.getElementById("frame-hub-login");
var btnGateLogin = document.getElementById("frame-gate-login");
var btnInstanceSso = document.getElementById("frame-instance-sso");
var currentBaseUrl = "";
var currentOpenUrl = "";
@@ -240,6 +251,11 @@
return (kind || "").toLowerCase() === "hub";
}
function isGateScoutEmbed(kind) {
var k = (kind || "").toLowerCase();
return k === "gate_scout" || k === "gate_exec" || k === "scout" || k === "exec";
}
function toggleInstanceBackBtn(show) {
if (btnBackHub) btnBackHub.hidden = !show;
}
@@ -252,6 +268,10 @@
if (btnHubLogin) btnHubLogin.hidden = !show;
}
function toggleGateLoginBtn(show) {
if (btnGateLogin) btnGateLogin.hidden = !show;
}
function applyIframeUrl(url) {
if (!url) return;
frame.src = url;
@@ -329,6 +349,36 @@
});
}
function gateScoutLoginViaProxy(done) {
if (!currentServiceId && !currentOrigin) {
if (done) done(false, "未选择 Gate 服务");
return;
}
var body = { service_id: parseInt(currentServiceId, 10) || undefined, next: currentNextPath };
fetch("/api/embed/gate-scout-login", {
method: "POST",
headers: { "Content-Type": "application/json", "Accept": "application/json" },
body: JSON.stringify(body),
})
.then(function (r) {
return r.json().then(function (j) {
return { ok: r.ok, j: j };
});
})
.then(function (res) {
if (res.ok && res.j.ok && res.j.embed_auth_url) {
applyIframeUrl(res.j.embed_auth_url);
toggleGateLoginBtn(false);
if (done) done(true);
return;
}
if (done) done(false, (res.j && res.j.detail) || "Gate 登录失败");
})
.catch(function (e) {
if (done) done(false, String(e));
});
}
window.addEventListener("message", function (ev) {
var data = ev.data;
if (!data || !data.type) return;
@@ -480,19 +530,36 @@
instanceNavCtx = null;
hubReturnState = null;
toggleInstanceBackBtn(false);
toggleGateLoginBtn(false);
nameEl.textContent = name || "";
dashboard.hidden = true;
frameStack.hidden = false;
frame.hidden = false;
toggleHubLoginBtn(isHubEmbed(currentEmbedKind));
toggleHubLoginBtn(isHubEmbed(currentEmbedKind) && !hubAutoLogin);
toggleGateLoginBtn(isGateScoutEmbed(currentEmbedKind) && !gateScoutAutoLogin);
if (isHubEmbed(currentEmbedKind) && hubAutoLogin) {
hubLoginViaProxy(function (ok, err) {
if (!ok) applyIframeUrl(url);
if (!ok) {
applyIframeUrl(url);
toggleHubLoginBtn(true);
}
});
var nav = preferredNav || findNavLink(url);
setActive(nav);
return;
}
if (isGateScoutEmbed(currentEmbedKind) && gateScoutAutoLogin) {
gateScoutLoginViaProxy(function (ok, err) {
if (!ok) {
applyIframeUrl(url);
toggleGateLoginBtn(true);
if (err) console.warn("[LocalNav] Gate 代登录失败:", err);
}
});
var navGate = preferredNav || findNavLink(url);
setActive(navGate);
return;
}
applyIframeUrl(url);
var nav = preferredNav || findNavLink(url);
setActive(nav);
@@ -573,6 +640,7 @@
frameStack.hidden = true;
dashboard.hidden = false;
toggleHubLoginBtn(false);
toggleGateLoginBtn(false);
toggleInstanceSsoBtn(false);
setActive(null);
}
@@ -604,6 +672,22 @@
});
});
if (btnGateLogin) {
btnGateLogin.addEventListener("click", function () {
btnGateLogin.disabled = true;
gateScoutLoginViaProxy(function (ok, err) {
btnGateLogin.disabled = false;
if (!ok && err) {
window.alert(
"Gate 登录失败:\n" +
err +
"\n\n请检查 LocalNav .env 的 NAV_GATE_SCOUT_USERNAME / NAV_GATE_SCOUT_PASSWORD,以及云端 PM2 的 NAV_EMBED_SESSION / NAV_EMBED_ORIGINS。"
);
}
});
});
}
if (btnHubLogin) {
btnHubLogin.addEventListener("click", function () {
btnHubLogin.disabled = true;