From 540712500fc92eb843dcdc418813de5ecbadfbd5 Mon Sep 17 00:00:00 2001 From: Nexus Agent Date: Fri, 12 Jun 2026 01:43:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=20iframe=20=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E5=99=A8=E5=B9=B6=E4=BC=98=E5=8C=96=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E9=A1=B5=E6=9C=8D=E5=8A=A1=E5=99=A8=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除内置浏览器前后端;推送页支持卡片/列表切换、点击名称复制与长名称展示。 Co-authored-by: Cursor --- .../2026-06-11-remove-browser-push-ui.md | 48 ++ .../2026-06-11-remove-embedded-browser.md | 43 ++ .../2026-06-11-push-server-name-display.md | 36 ++ .../2026-06-11-remove-embedded-browser.md | 45 ++ frontend/src/App.vue | 5 - .../src/components/GlobalBrowserPanel.vue | 543 ------------------ .../src/components/push/PushHistoryTable.vue | 17 + .../src/components/push/PushPreviewDialog.vue | 15 +- .../src/components/push/PushProgressList.vue | 14 +- .../src/components/push/PushServerGrid.vue | 178 +++++- frontend/src/composables/push/usePushLogs.ts | 2 +- .../composables/push/usePushServerViewMode.ts | 28 + frontend/src/composables/useGlobalBrowser.ts | 384 ------------- frontend/src/pages/BrowserPage.vue | 29 - frontend/src/pages/ServersPage.vue | 4 +- frontend/src/router/index.ts | 1 - server/api/browser.py | 87 --- server/main.py | 5 - server/utils/browser_ui_state.py | 164 ------ 19 files changed, 415 insertions(+), 1233 deletions(-) create mode 100644 docs/audit/2026-06-11-remove-browser-push-ui.md create mode 100644 docs/audit/2026-06-11-remove-embedded-browser.md create mode 100644 docs/changelog/2026-06-11-push-server-name-display.md create mode 100644 docs/changelog/2026-06-11-remove-embedded-browser.md delete mode 100644 frontend/src/components/GlobalBrowserPanel.vue create mode 100644 frontend/src/composables/push/usePushServerViewMode.ts delete mode 100644 frontend/src/composables/useGlobalBrowser.ts delete mode 100644 frontend/src/pages/BrowserPage.vue delete mode 100644 server/api/browser.py delete mode 100644 server/utils/browser_ui_state.py diff --git a/docs/audit/2026-06-11-remove-browser-push-ui.md b/docs/audit/2026-06-11-remove-browser-push-ui.md new file mode 100644 index 00000000..8eb92e46 --- /dev/null +++ b/docs/audit/2026-06-11-remove-browser-push-ui.md @@ -0,0 +1,48 @@ +# 审计 — 移除内置浏览器 + 推送页服务器 UI + +**Changelog**: `docs/changelog/2026-06-11-remove-embedded-browser.md` · `docs/changelog/2026-06-11-push-server-name-display.md` + +## 范围(文件清单) + +| 文件 | 变更 | +|------|------| +| `frontend/src/App.vue` | 移除浏览器侧栏与 GlobalBrowserPanel | +| `frontend/src/router/index.ts` | 移除 `/browser` | +| `frontend/src/pages/ServersPage.vue` | 站点 → 新标签打开 | +| `frontend/src/components/GlobalBrowserPanel.vue` | 删除 | +| `frontend/src/composables/useGlobalBrowser.ts` | 删除 | +| `frontend/src/pages/BrowserPage.vue` | 删除 | +| `server/api/browser.py` | 删除 | +| `server/utils/browser_ui_state.py` | 删除 | +| `server/main.py` | 注销 browser 路由 | +| `frontend/src/components/push/PushServerGrid.vue` | 卡片/列表切换、名称复制 | +| `frontend/src/composables/push/usePushServerViewMode.ts` | 视图偏好 localStorage | +| `frontend/src/components/push/PushProgressList.vue` | 名称 truncate + title | +| `frontend/src/components/push/PushHistoryTable.vue` | 服务器列 slot | +| `frontend/src/components/push/PushPreviewDialog.vue` | 名称 truncate + title | +| `frontend/src/composables/push/usePushLogs.ts` | 列宽 | + +## Step 3 规则扫描 + +| H | 规则 | 结论 | +|---|------|------| +| H1 | SSRF / 安全 | PASS — 删除 iframe 浏览器 API;推送页无新后端 | +| H2 | 无静默吞错 | PASS | +| H3 | clipboard | PASS — copy 失败有 snackbar | +| H4 | CUD 审计 | N/A — 删除 browser state API | + +## Closure + +| H | 判定 | 依据 | +|---|------|------| +| H1–H4 | PASS | 前端 UI + 删除 dead code | + +## DoD + +- [x] `npm run type-check` +- [x] `import server.main` +- [ ] 生产 `/app/#/push` 验证列表切换与复制 + +## 验证 + +侧栏无浏览器;推送页卡片/列表切换;点击名称复制。 diff --git a/docs/audit/2026-06-11-remove-embedded-browser.md b/docs/audit/2026-06-11-remove-embedded-browser.md new file mode 100644 index 00000000..a9008991 --- /dev/null +++ b/docs/audit/2026-06-11-remove-embedded-browser.md @@ -0,0 +1,43 @@ +# 审计 — 移除 iframe 内置浏览器 + +**Changelog**: `docs/changelog/2026-06-11-remove-embedded-browser.md` + +## 范围(文件清单) + +| 文件 | 变更 | +|------|------| +| `frontend/src/components/GlobalBrowserPanel.vue` | 删除 | +| `frontend/src/composables/useGlobalBrowser.ts` | 删除 | +| `frontend/src/pages/BrowserPage.vue` | 删除 | +| `server/api/browser.py` | 删除 | +| `server/utils/browser_ui_state.py` | 删除 | +| `tests/test_browser_ui_state.py` | 删除 | +| `frontend/src/App.vue` | 移除 GlobalBrowserPanel、侧栏项 | +| `frontend/src/router/index.ts` | 移除路由 | +| `frontend/src/pages/ServersPage.vue` | 站点 → window.open | +| `server/main.py` | 移除 router | + +## Step 3 规则扫描 + +| H | 规则 | 结论 | +|---|------|------| +| H1 | 无 SSRF 新增 | PASS — 删除 iframe,站点按钮仅客户端 window.open | +| H2 | 无静默吞错 | PASS — 无新增 | +| H3 | 无密钥 | PASS | +| H4 | CUD 审计 | N/A — 删除 API,无新 CUD | + +## Closure + +| H | 判定 | 依据 | +|---|------|------| +| H1–H4 | PASS | 纯删除 + 外链兜底 | + +## DoD + +- [x] type-check +- [x] 删除 `/api/browser` 路由 +- [ ] 生产部署(待用户批准) + +## 验证 + +侧栏无浏览器;站点按钮新标签打开公网 URL。 diff --git a/docs/changelog/2026-06-11-push-server-name-display.md b/docs/changelog/2026-06-11-push-server-name-display.md new file mode 100644 index 00000000..981a5c02 --- /dev/null +++ b/docs/changelog/2026-06-11-push-server-name-display.md @@ -0,0 +1,36 @@ +# 推送页服务器名称显示优化 + +**日期**:2026-06-11 + +## 动机 + +推送服务器卡片名称过长时被单行截断,且无悬停提示,难以区分相似主机名。 + +## 变更 + +- **服务器网格**:名称最多显示 2 行(`line-clamp`);悬停 `title` 展示「名称 + 域名」 +- **卡片 / 列表切换**:工具栏图标切换,偏好存 `localStorage`(`nexus_push_server_view_v1`) +- **列表视图**:表格列展示名称、域名、目标路径、勾选与推送状态 +- **点击名称复制**:卡片与列表中点击名称复制到剪贴板(`@click.stop`,不触发勾选) +- **推送进度 / 历史 / 预览**:省略号 + `title` 完整名称;历史列宽 120→200 + +## 涉及文件 + +- `frontend/src/components/push/PushServerGrid.vue` +- `frontend/src/composables/push/usePushServerViewMode.ts`(新建) +- `frontend/src/components/push/PushProgressList.vue` +- `frontend/src/components/push/PushHistoryTable.vue` +- `frontend/src/components/push/PushPreviewDialog.vue` +- `frontend/src/composables/push/usePushLogs.ts` + +## 验证 + +```bash +cd frontend && npm run type-check +``` + +推送页:长名称卡片显示两行;悬停见全名;切换列表视图;点击名称 toast「名称已复制」。 + +## 迁移 + +无。仅前端构建部署。 diff --git a/docs/changelog/2026-06-11-remove-embedded-browser.md b/docs/changelog/2026-06-11-remove-embedded-browser.md new file mode 100644 index 00000000..21d899c1 --- /dev/null +++ b/docs/changelog/2026-06-11-remove-embedded-browser.md @@ -0,0 +1,45 @@ +# 移除 iframe 内置浏览器 + +**日期**:2026-06-11 +**动机**:用户拒绝 iframe 方案,待独立 Worker + Playwright Chromium 重建;先清理现有实现避免误导。 + +## 变更摘要 + +删除全局浮动浏览器、侧栏「浏览器」页、`/api/browser/state` 及关联前后端代码。 + +## 涉及文件 + +| 文件 | 动作 | +|------|------| +| `frontend/src/components/GlobalBrowserPanel.vue` | 删除 | +| `frontend/src/composables/useGlobalBrowser.ts` | 删除 | +| `frontend/src/pages/BrowserPage.vue` | 删除 | +| `server/api/browser.py` | 删除 | +| `server/utils/browser_ui_state.py` | 删除 | +| `tests/test_browser_ui_state.py` | 删除 | +| `frontend/src/App.vue` | 移除挂载与侧栏入口 | +| `frontend/src/router/index.ts` | 移除 `/browser` | +| `frontend/src/pages/ServersPage.vue` | 「站点」改为新标签打开 | +| `server/main.py` | 注销 browser 路由 | + +**保留**:`frontend/src/utils/browserUrl.ts`(域名 → https URL,供「站点」外链) + +## 迁移 / 重启 + +- 无需 DB 迁移;`admin_ui_preferences` 中 `embedded_browser` 上下文可留空或手动清理 +- 需重启 API + 前端构建部署 + +## 验证 + +```bash +cd frontend && npm run type-check +pytest tests/ -q --ignore=tests/integration # 或 bash scripts/local_verify.sh +``` + +- 侧栏无「浏览器」 +- `#/browser` 不再存在(404/回仪表盘) +- 服务器列表「站点」在新标签打开 `https://{domain}` + +## 后续 + +服务端远程浏览器见 `docs/design/plans/2026-06-11-browser-worker-server-procurement.md`。 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 991ddf70..24f1d125 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -223,8 +223,6 @@ {{ snackbar.text }} - - @@ -249,8 +247,6 @@ import { } from '@/composables/useScriptSubmitToast' import { clearCachedQueries } from '@/composables/useCachedQuery' import { scheduleRoutePrefetch, cancelRoutePrefetch } from '@/composables/useRoutePrefetch' -import GlobalBrowserPanel from '@/components/GlobalBrowserPanel.vue' -import { useGlobalBrowser } from '@/composables/useGlobalBrowser' import { CACHED_PAGE_NAMES } from '@/constants/cachedPages' import { api } from '@/api' @@ -347,7 +343,6 @@ const opsItems = [ { to: '/', title: '仪表盘', icon: 'mdi-view-dashboard-outline' }, { to: '/servers', title: '服务器', icon: 'mdi-server' }, { to: '/terminal', title: '终端', icon: 'mdi-console' }, - { to: '/browser', title: '浏览器', icon: 'mdi-web' }, { to: '/files', title: '文件管理', icon: 'mdi-folder-outline' }, { to: '/push', title: '推送', icon: 'mdi-upload-outline' }, { to: '/scripts', title: '脚本库', icon: 'mdi-code-braces' }, diff --git a/frontend/src/components/GlobalBrowserPanel.vue b/frontend/src/components/GlobalBrowserPanel.vue deleted file mode 100644 index 385922aa..00000000 --- a/frontend/src/components/GlobalBrowserPanel.vue +++ /dev/null @@ -1,543 +0,0 @@ -