diff --git a/components/monitoring/MonitoringTopologyView.tsx b/components/monitoring/MonitoringTopologyView.tsx index e9373eb..6164d0d 100644 --- a/components/monitoring/MonitoringTopologyView.tsx +++ b/components/monitoring/MonitoringTopologyView.tsx @@ -1,4 +1,4 @@ -/** +/** * 运行监控 - 3D 拓扑大屏 * * 移植自 ITYUNWEI TopologyView.vue @@ -2306,10 +2306,20 @@ export function MonitoringTopologyView({ hosts, keys }: Props) { } } catch { /* ignore */ } } - // 本地 Electron:从 localStorage 读 + // 本地 Electron:从 localStorage 读,找不到则从主进程 inspection-data.json 读 try { - const saved = localStorage.getItem('monitoring-topology-positions'); - return saved ? JSON.parse(saved) : null; + let saved = localStorage.getItem('monitoring-topology-positions'); + if (saved) return JSON.parse(saved); + // portable 版 localStorage 为空 → fallback 主进程 JSON(sendSync 同步) + try { + const nc = (window as any).netcatty; + const fromMain = nc?.inspection?.getTopologyPositionsSync?.(); + if (fromMain && typeof fromMain === 'object' && Object.keys(fromMain).length > 0) { + console.info('[Monitoring] localStorage 无位置,从主进程 inspection-data.json 加载'); + return fromMain; + } + } catch { /* ignore */ } + return null; } catch { return null; } })(); diff --git a/electron/bridges/inspection/index.cjs b/electron/bridges/inspection/index.cjs index ac6fb4e..b0d7d3a 100644 --- a/electron/bridges/inspection/index.cjs +++ b/electron/bridges/inspection/index.cjs @@ -1544,6 +1544,13 @@ function registerInspectionHandlers(ipcMain, options) { } catch { return {}; } }); + // sendSync 同步版本 — renderer 3D 布局 fallback 读取用 + ipcMain.on("inspection:getTopologyPositions", (event) => { + try { + event.returnValue = readStorage("_topology_positions") || {}; + } catch { event.returnValue = {}; } + }); + // 监控大屏标题同步(Electron localStorage → 远程浏览器可读) ipcMain.handle("inspection:saveDashboardTitle", (_e, title) => { if (!title || typeof title !== "string") return { ok: false }; diff --git a/electron/preload/api.cjs b/electron/preload/api.cjs index d6762fd..1021957 100644 --- a/electron/preload/api.cjs +++ b/electron/preload/api.cjs @@ -2122,6 +2122,10 @@ function createPreloadApi(ctx) { // 拓扑位置持久化(供远程浏览器同步读取) saveTopologyPositions: (positions) => ipcRenderer.invoke("inspection:saveTopologyPositions", positions), getTopologyPositions: () => ipcRenderer.invoke("inspection:getTopologyPositions"), + // 同步版本 — renderer 3D 布局同步加载位置时用(portable 版 localStorage 为空时 fallback 读主进程 JSON) + getTopologyPositionsSync: () => { + try { return ipcRenderer.sendSync("inspection:getTopologyPositions"); } catch { return null; } + }, // 监控大屏标题同步 saveDashboardTitle: (title) => ipcRenderer.invoke("inspection:saveDashboardTitle", title), getDashboardTitle: () => ipcRenderer.invoke("inspection:getDashboardTitle"),