管理后台界面重设计「机架 Rack」实施计划
管理后台界面重设计「机架 Rack」实施计划
状态:已实施(未合并)。验证与取舍见 PR 记录。
目标
管理后台(web/,Vue 3 + Element Plus)原先 Element 默认蓝与手写蓝并存,没有图标系统和暗色主题,容器一律白底描边卡片,
同类样式(筛选栏、分页、详情列表)在各视图里重复 5 到 14 份,另有约 35 处写死的颜色。目标是一套有明确风格的设计系统,
并让所有页面经由令牌与全局换肤自动继承。
决策
| 项 | 决定 |
|---|---|
| 范围 | 设计系统 + 外壳 + 登录页 + 仪表盘 / Agents / 令牌 / 审计日志精雕;其余视图通过令牌与全局皮肤继承,只做机械改动 |
| 主题 | 浅色 + 深色,可切换(浅色 / 深色 / 跟随系统),记住选择 |
| 组件库 | 保留 Element Plus 做行为层(AGENTS.md),深度换肤 + 自研关键部件 |
| 视觉 | 「机架 Rack」:亚麻灰底、石油青主色、等宽数据字体、LED 状态、配线板 |
| 浏览器下限 | Chrome 111 / Safari 16.2 / Firefox 113(color-mix()) |
| 字体 | Instrument Sans + Martian Mono,latin 子集 woff2 内置(合计 ≤140 KB,OFL,见 NOTICE),中文走系统字体 |
任务与完成情况
| # | 任务 | 结果 |
|---|---|---|
| 0 | 视觉验证脚手架 web/scripts/visual-qa/(本地 Server + 种子数据 + 无头 Chrome,5 页 × 2 主题 × 2 视口) |
完成 |
| 1 | 令牌、字体、主题切换(tokens-contrast 固化 WCAG 对比度) |
完成 |
| 2 | Element 全量换肤(element.css),十六进制颜色 lint 带“未迁移”名单 |
完成,名单已清空 |
| 3 | TmIcon 与基础部件:StatusLed、BrandMark、CodeBlock、SecretBlock、DescriptionList |
完成 |
| 4 | 外壳:layouts/navigation.ts、NavRail、TopBar、AccountMenu、ThemeToggle、CommandPalette |
完成 |
| 5 | PageHeader、StatusTag(LED 标签)、DataState、EmptyState、ErrorState | 完成 |
| 6 | 登录页(左侧静态机架线稿,不放虚构数据) | 完成 |
| 7 | 仪表盘:MetricStrip + PatchPanel + 最近事件 | 完成 |
| 8 | Agents 列表:内联筛选、IdCell、PagerBar、悬停行内操作 | 完成(见偏差) |
| 9 | 令牌页与密钥弹窗(SecretBlock 默认遮罩) | 完成 |
| 10 | 审计日志:已应用条件的可移除标签、行点击打开 DetailDrawer | 完成 |
| 11 | 其余视图清扫:颜色字面量换令牌、.page-size 去重、终端跟随主题、移除 @element-plus/icons-vue |
完成 |
| 12 | 文档与记录 | 完成;docs/assets/*.png 与 demo.gif 已用新界面重截 |
与原计划的偏差
- Agents 页没有状态 / 启用筛选:
GET /api/v1/agents只处理keyword、cursor、limit与按createdAt/updatedAt/id排序, 会忽略status与enabled。放上去只会是不起作用的控件,所以没有做;需要的话应先扩展服务端接口。 - 仪表盘配线板取最新的 32 个 Agent 并在浏览器内按名称排序:接口拒绝
sort=name(422)。图例总数使用摘要里的agentsTotal。 ListPageShell/FilterBar/useListQuery仍未接入任何视图;本次用PagerBar与IdCell抽出了确实被重复的部分, 没有为了“用上”而硬接,遵守 YAGNI。- 十六进制 lint 之外,Element 自己注入的默认变量块里仍含
#409eff,被:root:root覆盖,因此不能用grep 409eff web/dist为空来验收。
硬约束(由测试守护)
.tm-page的 grid 声明原样保留;任何display:grid必须带grid-template-columns;列宽之和超过 1270 的表格有fixed="right"。- 所有
data-test与被测试钉住的类名不变;build.spec钉住的 Element 样式导入保留;Go 的嵌入测试要求的英文文案不改写。 - 两个语言包键树一致,只追加键,不重排现有块。
- 不提交、不推送。
验证
cd web && npm test -- --run && npm run build && cd .. && ./scripts/verify-web-embed.sh && git diff --check
go test ./internal/server -run TestEmbeddedWebDist
cd web && node scripts/visual-qa/run.mjs --locale en-US # 20 张截图,输出到 $TM_QA_OUT