Files
aiops/docs/specs/asset/server-detail-sheet.md
T
Logan.LiandCursor 4658812876 feat: 增加资产主机详情抽屉并统一终端窗口壳
服务器列表可从右侧查看规格、迷你曲线和进程 TOP;SSH 与审计终端改为 macOS 风格标题栏。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-14 09:43:20 +08:00

130 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 资产主机详情抽屉与终端窗口壳
| 字段 | 内容 |
|------|------|
| 状态 | Implemented |
| 级别 | S2 |
| 负责人 | Logan.Li |
| 创建日期 | 2026-09-14 |
| 最后更新 | 2026-09-14 |
| 关联任务 | 服务器管理页右侧 Sheet 详情;SSH 终端 Dialog 借鉴 lite `/monitor` 窗口壳 |
## 1. 背景与证据
当前 `/servers` 点资产名称或编辑,进入的是 `ServerForm` 编辑弹窗,没有只读详情。Agent 监控有居中 `HostDetailDialog`,主机监控页是整页图表,都不适合在资产列表里扫一眼。
opsx-web-lite `/monitor` 右侧 560px `HostDetailDrawer`(规格网格 + 2×2 迷你曲线 + 进程 TOP 进度条)以及 macOS 风格终端壳(红黄绿 + `user@host:~` + 深蓝底)已在本地 `localhost:5184/monitor` 对照过。lite 曲线/进程是演示数据,本次只用其布局,数据走现有 `GET /servers` 列表字段与 `GET /agent/history/:hostname`。
## 2. 目标与非目标
### 目标
- 资产列表可打开右侧只读详情抽屉,不离开列表。
- 抽屉展示真实资产规格、最近 30 分钟迷你曲线、进程 TOP5;无 Agent 时给空态。
- SSH 终端弹窗采用 lite 窗口壳,保留真实 xterm / WebSocket / 全屏 / 凭证选择。
### 非目标
- 不新增 API、表字段或权限码。
- 不移植 lite 假终端命令模拟器。
- 不改服务器编辑表单、不改主机监控整页。
- 不把窗口壳扩到 Kubectl / Pod exec / WebShell 整页(审计实时监控弹窗与 SSH 弹窗共用壳,因其注释已要求布局一致)。
## 3. 用户场景
- 当运维在服务器列表点击资产名称或菜单「详情」时,系统必须从右侧滑出该主机只读详情,列表仍可见。
- 当该主机有 Agent 上报时,系统必须展示 CPU/内存/磁盘/网络迷你曲线与进程 TOP5。
- 当无 Agent 上报时,系统必须展示规格信息,并在曲线/进程区给出空态,不得伪造内核、CPU 型号或进程。
- 当运维从抽屉点终端(或列表原入口)打开 SSH 时,系统必须显示红黄绿标题栏与 `username@展示名:~`,红点关闭、绿点全屏。
## 4. 需求
### 功能需求
- `FR-01`:服务器列表资产名称与下拉「详情」打开右侧 Sheet(约 560px),关闭后回到列表。
- `FR-02`:抽屉标题为展示名(别名 > 云实例名 > hostname > IP)加资产状态徽章;副标题说明只读详情。
- `FR-03`:规格网格展示 OS、内核、CPU 核数、内存、磁盘、IP、区域、运行时长;有则展示公网 IP、云实例、Agent 状态/版本、标签。缺字段显示 `—`。
- `FR-04`:有 `hostname` 时请求最近 30 分钟 Agent 历史;用末尾至多 30 个点画 CPU/内存/磁盘/网络下行迷你曲线;网络最后一点用 B/s→KB/s→MB/s 换算,禁止把 bps 当 MB/s。
- `FR-05`:进程 TOP5 取最新上报 `process_top_info`,按 CPU% 降序,带 CPU/MEM 进度条;无数据给空态。
- `FR-06`:抽屉底部快捷操作:终端或 RDP、文件、监控(`/monitor-center?host=`)、编辑;受现有 `server:webshell` / `server:update` / `agent:monitor` 控制;编辑仍打开现有表单。
- `FR-07`:`TerminalDialog` 与 `LiveMonitorDialog` 标题栏改为红黄绿窗口壳 + 会话名,去掉与红点重复的右上角 X;绿点切换全屏,全屏时黄点退出全屏。
### 非功能需求
- `NFR-01`:抽屉仅在打开时拉历史,失败时规格仍可用,曲线/进程空态。
- `NFR-02`:中英文文案走 i18n;主题色用 `var(--dg-*)`,终端内容区保持深蓝底。
- `NFR-03`:不引入规格外重构;新增 React 文件不超过 700 行。
## 5. 设计与契约
### 模块边界
- 新组件:`frontend/src/components/server/ServerDetailSheet.tsx` 及 `server-detail/` 辅助。
- 窗口壳:`frontend/src/components/common/TerminalWindowChrome.tsx`,SSH 与审计实时监控共用。
- 复用 `useHostHistory`、`getTags`、`getStatusBadge`、`isRdpServer`。
- 不改 `ServerForm` 的「更多详情」折叠编辑区。
### API / 事件
- 无新接口。历史:`GET /api/v1/agent/history/:hostname?minutes=30`(已有 JWT `authorized` 组)。
- 资产字段来自当前列表行(`GET /servers` 已 Preload Region/Cloud)。
### 数据与迁移
- 无。
### UI / 交互
- 入口:资产名称、行菜单「详情」。原终端图标、编辑、删除不变。
- 抽屉打开时列表可被遮罩;终端 Dialog 叠在抽屉之上,关闭终端后抽屉仍在。
- 加载:曲线区 Spinner;空:无上报文案;错误:与空态相同(不弹阻塞框)。
## 6. 风险与可观测性
| 风险/失败模式 | 防护或降级 | 观测信号 |
|---------------|------------|----------|
| 主机无 Agent / hostname 对不上 | 规格照常,曲线与进程空态 | 抽屉空态文案 |
| 历史接口 4xx/5xx | TanStack Query error → 空态 | 浏览器网络错误 |
| 网络单位误用 | helpers 统一按 bps 换算 | AC-04 |
| 终端 ESC 被 Dialog 吃掉 | 保持现有 `onEscapeKeyDown` preventDefault | 现有 SSH 行为 |
## 7. 验收标准
- `AC-01`:给定已登录且列表有主机,当点击资产名称,则右侧出现详情抽屉,可见主机名与状态徽章。
- `AC-02`:给定主机缺内核/区域等字段,当打开抽屉,则对应值显示 `—`,不出现 Xeon/nginx 等写死演示值。
- `AC-03`:给定主机近 30 分钟有 Agent 上报,当打开抽屉,则出现 4 张迷你曲线,进程 TOP 来自上报而非固定进程名。
- `AC-04`:给定 `net_rx_bps` 为字节每秒,当展示网络卡片当前值,则单位为 B/s、KB/s 或 MB/s,数值与换算一致。
- `AC-05`:给定无 Agent 上报,当打开抽屉,则曲线与进程区为空态,规格区仍在。
- `AC-06`:给定 `server:webshell`,当点抽屉「终端」,则打开带红黄绿与 `user@host:~` 的 SSH 窗,红点关闭、绿点全屏。
- `AC-07`:`npx tsc --noEmit` 零错误。
## 8. 验证追踪
| 验收标准 | 测试或检查 | 结果 |
|----------|------------|------|
| AC-01 | 浏览器:`/servers` 点资产名 | Pending(本机 5173/8080 未启动) |
| AC-02 | 代码审查 helpers + 抽屉渲染;无 KERNELS/PROCESS_NAMES 常量 | Passed |
| AC-03 | 有 Agent 主机打开抽屉 | Pending(本机未起 AIOps) |
| AC-04 | `formatBps(933735.6)` → `911.9 KB/s`(非 MB/s) | Passed |
| AC-05 | 无 Agent 主机打开抽屉 | Pending(本机未起 AIOps) |
| AC-06 | 打开 SSH 终端对照窗口壳 | Pending(本机未起 AIOps) |
| AC-07 | `npm exec -- tsc -p tsconfig.app.json --noEmit` | Passed |
## 9. 发布与回滚
前端静态变更,随版本发布。回滚该提交即可。无迁移。
## 10. 决策记录
| 日期 | 决策 | 原因与影响 |
|------|------|------------|
| 2026-09-14 | 右侧 Sheet 而非居中 Dialog | 列表上下文不丢,对齐 lite 与云账号详情 |
| 2026-09-14 | 曲线窗口 30 分钟、最多 30 点 | Agent 约 10s 上报,1 分钟点太少 |
| 2026-09-14 | 终端去掉重复 X,红点关闭 | lite 红黄绿与右上 X 冲突 |
| 2026-09-14 | LiveMonitorDialog 同步窗口壳 | 该组件已声明与 WebSSH 弹窗布局一致 |
## 11. 遗留事项
- Kubectl / Pod 终端是否统一窗口壳。
- 资产列表行内是否展示实时 CPU/内存条(lite 主机表已有,本次不做)。