# 终端页 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=…` 可连
