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

7.2 KiB
Raw Blame History

资产主机详情抽屉与终端窗口壳

字段 内容
状态 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 主机表已有,本次不做)。