From 799140f6c43fc547319dbe7ee00fdb34e1df750a Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 1 Jun 2026 15:41:59 +0800 Subject: [PATCH] feat: terminal SPA layout, route sync, and WebSocket URL helper Co-authored-by: Cursor --- .../2026-06-01-terminal-spa-iteration.md | 36 +++++ ...026-06-01-terminal-spa-iteration-design.md | 34 ++++ frontend/src/App.vue | 19 ++- frontend/src/pages/FilesPage.vue | 23 ++- frontend/src/pages/TerminalPage.vue | 147 ++++++++++++++---- frontend/src/utils/wsUrl.ts | 23 +++ 6 files changed, 251 insertions(+), 31 deletions(-) create mode 100644 docs/changelog/2026-06-01-terminal-spa-iteration.md create mode 100644 docs/design/specs/2026-06-01-terminal-spa-iteration-design.md create mode 100644 frontend/src/utils/wsUrl.ts diff --git a/docs/changelog/2026-06-01-terminal-spa-iteration.md b/docs/changelog/2026-06-01-terminal-spa-iteration.md new file mode 100644 index 00000000..1cebe4da --- /dev/null +++ b/docs/changelog/2026-06-01-terminal-spa-iteration.md @@ -0,0 +1,36 @@ +# Changelog — 终端页 SPA 迭代 + +**日期**: 2026-06-01 + +## 摘要 + +迭代 `#/terminal`:全屏布局、路由 `server_id`/`path` 联动、统一 WebSocket URL、连接状态与空状态 UX;文件管理页增加「终端」入口。 + +## 动机 + +用户要求对 `app/#/terminal` 继续迭代;生产页存在终端区域高度不足、从服务器二次进入不建会话、连接态不清晰等问题。 + +## 涉及文件 + +- `frontend/src/App.vue` — `nexus-terminal-main` 布局 +- `frontend/src/pages/TerminalPage.vue` — 核心迭代 +- `frontend/src/utils/wsUrl.ts`(新) +- `frontend/src/pages/FilesPage.vue` — 带当前路径打开终端 +- `docs/design/specs/2026-06-01-terminal-spa-iteration-design.md`(新) + +## 验证 + +1. `cd frontend && npm run type-check` +2. 打开 `#/terminal?server_id=8` → 终端区占满、状态「已连接」、可输入 +3. 已在终端时从服务器点「终端」→ 切换对应标签 +4. 文件管理选服务器+路径 →「终端」→ 自动 `cd` 到当前目录 +5. `npm run test:e2e` 中 terminal 用例 + +## 迁移 / 重启 + +- 仅前端:需 `vite build` + 上传 `web/app/` +- 后端无变更 + +## 回滚 + +还原上述前端文件并重新构建部署。 diff --git a/docs/design/specs/2026-06-01-terminal-spa-iteration-design.md b/docs/design/specs/2026-06-01-terminal-spa-iteration-design.md new file mode 100644 index 00000000..e278d1cf --- /dev/null +++ b/docs/design/specs/2026-06-01-terminal-spa-iteration-design.md @@ -0,0 +1,34 @@ +# 终端页 SPA 迭代设计 + +**日期**: 2026-06-01 +**路由**: `/app/#/terminal`(`?server_id=&path=`) + +## 背景 + +Vue `TerminalPage` 已具备多标签 WebSSH、重连、快捷命令等能力,但存在: + +1. `v-main` 未限定高度,终端区域在部分视口下高度为 0 或过小 +2. 从服务器页带 `server_id` 跳转时,若已在终端路由则不会新建/切换会话(无 `watch`) +3. WebSocket URL 与 `useWebSocket` 构建方式不一致,`VITE_API_BASE=/api` 时 dev 可能异常 +4. 无「连接中」态,失败时仅禁用发送按钮 +5. `path` 查询参数仅全局生效,多标签会重复 cd +6. Ctrl+L 向 shell 发送 `clear\r` 非标准清屏 + +## 方案 + +| 项 | 做法 | +|----|------| +| 布局 | `App.vue` 对 `/terminal` 路由给 `v-main` 增加 `nexus-terminal-main`(`100dvh - app-bar` + flex) | +| WS URL | 新增 `utils/wsUrl.ts`,与告警 WS 同源规则 | +| 路由 | `watch(route.query)`:`server_id` / `path` / `new_tab` | +| 会话 | `TermSession.pendingPath`、`status`(connecting/connected/error) | +| 空状态 | 无会话时内嵌服务器列表 +「选择服务器」 | +| 清屏 | Ctrl+L 仅 `term.clear()` + 可选 `\x0c` | + +## 验收 + +- `#/terminal?server_id=8` 首屏终端区域占满内容区且可输入 +- 已在 `#/terminal` 时从服务器点「终端」能切换/新建会话 +- `#/terminal?server_id=8&path=/var/log` 首包后自动 cd +- 断线显示重连 overlay;手动断开不自动重连 +- 生产 `wss://host/ws/terminal/{id}?token=…` 可连 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 451a9af3..ce2240fb 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -219,7 +219,7 @@ - + @@ -378,3 +378,20 @@ interface SearchResults { query: string } + + diff --git a/frontend/src/pages/FilesPage.vue b/frontend/src/pages/FilesPage.vue index 4eb648e2..bd3ebc13 100644 --- a/frontend/src/pages/FilesPage.vue +++ b/frontend/src/pages/FilesPage.vue @@ -32,6 +32,15 @@ 上传 新建目录 刷新 + + 终端 + @@ -209,7 +218,7 @@