Add joy online package injection helpers, expand vm/work/clone command surface for desktop and session ops, and polish remaining web tabs (drawer, ops, hardware, sessions) plus design/capacity docs.
8.5 KiB
joy web 设计原则
2026-07-11 · 以 神兽工坊 为视觉与结构标准
触发:神州「资产」按硬件 tab 重做后定稿
范围:Projects/joy-cli/src/joy/web/
0. 一句话
新世界 / 新 tab 的 UI 必须先对照神兽侧已有块再写;复用全局 CSS 与 core 组件,禁止另起一套「看起来差不多」的样式。
标准参考(按优先级):
- 设备/资产卡 → 神兽 · 硬件 tab(
js/tabs/hardware.js+#pane-hardware) - 列表/运维 → 神兽 · 运维 tab(
ops.js+card compact/infra-list) - 神兽列表 →
beasts.js+ 抽屉 - 全局 →
styles.css+core.js(ic/badgeXs/miniBar/esc/card-row)
神州大地 / 混沌蛮荒 不是 另开视觉体系,只是 数据与权限边界 不同。
1. 结构标准:硬件 tab 模式
神兽 · 硬件已验证的结构(2026-07 定稿):
| 层 | 做法 | 反例 |
|---|---|---|
| 总览 | 独立 section,card compact ops-stat 一排,可点跳到设备 |
把全部设备塞进一个 section 无限滚动 |
| 每台设备 | 独立 section(section-title = 设备名),body 内完整指标 |
所有主机塞一个大 grid 堆坨 |
| pane 布局 | CSS grid 列(硬件 4 列);总览 grid-column: 1 / -1;设备 span 1 |
仅靠 flex 横铺导致「全横排占满屏」 |
| 设备卡内容 | 顶栏 metric(在线/磁盘/内存/负载)+ miniBar + infra-list 明细 + 告警条 |
只留一个数字、或 26 张同质小卡无明细 |
神州 · 资产 · 云主机 已对齐(2026-07-11):
sz-hosts= 总览(对齐renderHwOverview)sz-host-<id>= 每台独立 section(对齐 NAS / 路由器 / huawei-pc)#pane-sz-assets= 4 列网格(对齐#pane-hardware)renderShenzhouHost(d, hostId)= 完整设备卡(对齐renderHwLive/renderHwNas)
2. 复用全局样式(禁止私造)
2.1 必须用的全局类 / 组件
| 用途 | 用 | 不要 |
|---|---|---|
| 指标卡 | .card .card.compact .card-title .card-value .card-meta .card-row |
自写 div + 内联 flex 仿卡片 |
| 可点总览格 | .ops-stat(pointer + hover) |
无交互的纯色块 |
| 明细行 | .infra-list .infra-row .infra-name .infra-status |
表格硬写或一长串 span |
| 状态色 | .c-ok .c-err .c-warn .c-dim + .infra-status ok|err|warn |
硬编码 #22c55e |
| 进度条 | miniBar(pct, sev)(core) |
自写 progress bar |
| 图标 | ic(name) / tab 内 _szIcon 委托 ic |
emoji 当主图标(告警文案除外) |
| 徽章 | badgeXs / _szBadge |
自写 badge class |
| 转义 | esc / _szEsc |
直接插用户/API 字符串 |
| 告警条 | .hw-alert(可复用)+ 通知按钮模式 |
只 toast 不落盘 |
2.2 允许的局部 CSS
- pane 网格:
#pane-<tab-id>+#section-wrap-<section-id>(与硬件同模式) - 领域前缀:如
.sz-*/.mh-*仅用于 布局钩子,不复制一套 card 皮肤 - 禁止:复制一份「神州专用 card 颜色/圆角/字号」与神兽不一致
2.3 内联 style
- 允许:间距微调(
margin-bottom:10px)、单行 ellipsis、flex 子项min-width:0 - 禁止:用内联定义整套视觉(颜色、字号阶梯、阴影)绕过
styles.css
3. 世界与导航
| 世界 | 正式名 | 标准 |
|---|---|---|
| local | 神兽工坊 | 视觉与交互 真源 |
| shenzhou | 神州大地 | 复用神兽组件;数据 = 生产资产 |
| manhuang | 混沌蛮荒 | 同上;业务/情报边界不同 |
- 世界切换在 页眉右侧(logo/时间在左,主题切换最右)
- 一级 tab 刷新时 禁止 因 badge 宽窄导致菜单跳动(
.tab-badge:empty { display:none }+white-space:nowrap)
4. 实现检查清单(PR / 改 tab 前)
- 是否已有神兽侧同类块可抄?(硬件 / 运维 / 神兽列表)
- 是否用了
card/infra-list/miniBar/ic/esc? - 多实体(主机/站点/设备)是否 总览 section + 每实体独立 section?
- pane 是否用 CSS grid 列布局,而不是「一个 section 里横排一百个」?
- 新 CSS 是否只加 pane/section 钩子,未复制 card 皮肤?
- 自动刷新是否只更新 section body(
_lastHtml),不重建 skeleton? - 缓存戳是否
update-cache-hash.sh?
5. 反模式(踩过的坑)
| 反模式 | 为何不行 | 正确做法 |
|---|---|---|
| 26 站各一张 ops-stat 堆成一坨 | 密度爆炸、不像硬件 | 汇总 metric + infra-list |
| 每台主机整行横铺(状态+磁盘+内存各占满宽) | 纵向爆炸 | 独立 section + pane 4 列 |
| 为「省空间」砍掉 miniBar/infra | 信息不足 | 保留完整卡,只改 网格 |
神州另起 _szCard 皮肤 |
双轨维护 | section-title + 全局 card |
| 自动刷新重建 tab DOM | 菜单跳动 | skeleton 一次;badge 固定占位策略 |
6. 文件索引
| 角色 | 路径 |
|---|---|
| 本原则 | docs/ops/joy-web-design.md |
| 前端拆分 | src/joy/web/js/README.md |
| 硬件标准实现 | src/joy/web/js/tabs/hardware.js |
| 硬件 pane CSS | styles.css → #pane-hardware |
| 神州资产对齐实现 | src/joy/web/js/tabs/shenzhou.js(renderShenzhouHost / SZ_CLOUD_HOSTS) |
| 神州资产 pane CSS | styles.css → #pane-sz-assets / #section-wrap-sz-host-* |
| TABS 注册 | src/joy/web/app.js(SHENZHOU_TABS / sz-assets sections) |
| 神州产品边界 | docs/ops/joy-shenzhou.md |
7. 生产服务器设备卡信息层级
硬件是基础,业务关联也有价值(2026-07-11 定稿)。
| 层 | 字段 |
|---|---|
| 硬件基础 | reachable · disk%+bar · mem%+bar · load · uptime · inode% · 容器运行数 |
| 台账 | role · region · specs · ip · panel · container runtime · web · hostname · ssh |
| 业务关联 | 关键路径 n/红 · SSL ok/warn/crit · 业务系统 ids · 服务 n |
| 元数据 | sampled_at 年龄 · 告警条(含路径/SSL/收款) |
展示节奏(对齐神兽硬件 NAS):
- 告警条 — 仅有 issue 时
- 主卡 4 列 — 始终(在线 / 盘 / 存 / 载)
- 采样行 + 短档案 — 始终(角色 / SSH / 业务脉搏一句话)
业务关联fold — 默认折叠,路径/SSL/收款异常时open机身详情fold — 默认折叠,硬件阈值命中时open
通知(神州 = 瓦普专场):
- 硬件 tab →
notifyTuxDevice→ poke tux - 神州 tab → 一律 poke wapuu(
notifyShenzhou/notifyWapuuPath/notifyWapuuHost/notifyWapuuShenzhouAlert) - 主机按钮文案固定「通知 wapuu」;payload 对齐硬件:角色/指标/路径/SSL/触发项全文,禁止只甩 host id
- wapuu 业务确认后,infra 转 konqi、制度转 tux
采集:_PROBE_REMOTE 含 INODE + docker/podman ps;_enrich_hosts_with_biz 挂 paths/ssl/business。
8. 关键路径(业务入口,非截图墙)
| 层 | 内容 |
|---|---|
| 主行 | 名 · 栈(WP/WP多站/CDN/静态/应用) · 状态 · 延迟/SLO · 钱标 |
| 短档案 | biz · 宿主跳转 · 多站摘要 · SSL 剩余天 · URL |
| 截图 fold | 默认折叠;异常时 open |
| 栈详情 fold | WP 版本/插件/DB/子站已列·未列;SSL;宿主 load |
| WP 网络卡 | 安装维度:多站点 9 子站 vs critical_paths 已列对照 |
| 通知 | notifyWapuuPath 全文 → poke wapuu |
未列子站 ≠ 故障:在 WP 网络中但未进脉搏台账;要监控再加 critical_paths。
栈扩展信息(只读,非面板内管理)
| stack | 接入字段 |
|---|---|
| wp / wp-ms | 主题(当前+已装) · 启用插件 slug@version · 目录插件数 · 网络级 sitewide · 未启用样例 · PHP/WP/DB |
| static / cdn | HTTP Server · CF/源缓存状态 · Content-Type · Last-Modified · 宿主运行时 |
| app | 同上指纹 + 宿主 containers_n/runtime/cores · 角色摘要 |
| 全栈 | SSL 剩余天 · 宿主 load/disk · 延迟/SLO |
启停插件/换主题 → 宝塔或 SSH;面板只展示 + 通知 wapuu。
9. 变更记录
| 日期 | 变更 |
|---|---|
| 2026-07-11 | 初版:以神兽硬件为标准;神州资产云主机按「总览 + 每台 section + 4 列」落地 |
| 2026-07-11 | 生产机设备卡:inode/容器/采样时间/地域台账/路径·SSL·业务关联 |
| 2026-07-11 | 关键路径:栈类型/WP多站/SSL·SLO/截图折叠/wp_networks |