From 26004fb0e706c151977d2687ce83203bd26dd825 Mon Sep 17 00:00:00 2001 From: dekun Date: Sat, 30 May 2026 12:19:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=AD=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manual_trading_hub/static/app.js | 29 ++++++++++++++++++++++++++++ manual_trading_hub/static/index.html | 2 +- manual_trading_hub/常见问题.md | 3 ++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/manual_trading_hub/static/app.js b/manual_trading_hub/static/app.js index a5127ae..943c418 100644 --- a/manual_trading_hub/static/app.js +++ b/manual_trading_hub/static/app.js @@ -21,6 +21,32 @@ /** @type {{ exchangeId: string, nextPath: string, title: string } | null} */ let instanceFrameCtx = null; + function isHubEmbedded() { + try { + return window.self !== window.top; + } catch (_) { + return true; + } + } + + function delegateInstanceToParent(url, title, exchangeId, nextPath) { + try { + window.parent.postMessage( + { + type: "hub:open-instance", + url, + title: title || "实例", + exchangeId: String(exchangeId), + nextPath: nextPath || "/", + }, + "*" + ); + return true; + } catch (_) { + return false; + } + } + async function fetchInstanceOpenUrl(exchangeId, nextPath) { const next = nextPath || "/"; const q = new URLSearchParams({ exchange_id: String(exchangeId), next }); @@ -45,6 +71,9 @@ const row = lastMonitorRows.find((x) => String(x.id) === String(exchangeId)); const title = row ? row.name : exchangeId; instanceFrameCtx = { exchangeId: String(exchangeId), nextPath: next, title }; + if (isHubEmbedded() && delegateInstanceToParent(url, title, exchangeId, next)) { + return; + } openInstanceFrame(url, title); } catch (e) { showToast(String(e), true); diff --git a/manual_trading_hub/static/index.html b/manual_trading_hub/static/index.html index bd46314..dbbf05b 100644 --- a/manual_trading_hub/static/index.html +++ b/manual_trading_hub/static/index.html @@ -120,6 +120,6 @@
- + diff --git a/manual_trading_hub/常见问题.md b/manual_trading_hub/常见问题.md index f973acf..acf2c34 100644 --- a/manual_trading_hub/常见问题.md +++ b/manual_trading_hub/常见问题.md @@ -227,7 +227,8 @@ HUB_PUBLIC_ORIGIN=http://192.168.8.6 2. `HUB_BRIDGE_TOKEN` 与四实例 `.env` 不一致。 3. `hub_settings` 里该户 `key` 与实例 `install_on_app(exchange=...)` 不一致(如 `okx`、`gate_bot`)。 4. **HTTPS 跨域 iframe**:中控与实例不同域名时,四实例须 `APP_COOKIE_SECURE=true`(使 session Cookie 为 `SameSite=None`),否则 SSO 成功仍跳 `/login`。 -5. 浏览器仍用旧书签直链首页,未从中控点「实例」(直链本来就要登录)。 +5. **经本地导航打开中控**(LocalNav → 中控 iframe → 点实例):旧版会在中控内再嵌一层实例 iframe,Cookie 易失效。请升级 **LocalNav + 中控** 最新代码:点实例后由导航页直接打开实例,工具栏有「← 中控」;须配置 `NAV_HUB_USERNAME` / `NAV_HUB_PASSWORD`,四实例 `HUB_EMBED_PARENT_ORIGINS` 含本地导航地址(如 `http://192.168.8.6:5070`)。 +6. 浏览器仍用旧书签直链首页,未从中控点「实例」(直链本来就要登录)。 **直链**:`http://IP:端口` 或 `https://实例域名` → 使用各实例 **`APP_USERNAME` / `APP_PASSWORD`**(四所建议统一)。