节点在线、应用在线、配置在线使用令牌查询
|
# 星尘看æ¿è®¾è®¡ç¨¿
> 版本:v1.2 · 2026-10-31(MVC StarWeb è½åœ°ï¼Œè¡¥å……实现记录与设计调整)
> å®žçŽ°ç›®æ ‡ï¼šMVC StarWeb(`Stardust.Web`,已è½åœ°ï¼Œè§ §16);Vue 版 StarWeb(`Stardust.Web.Vue`)åŽç»æŒ‰åŒä¸€è®¾è®¡ç¨¿è¿ç§»
> 视觉基准:[设计令牌](/NewLife/Stardust/Blob/master/Doc/Dashboard/../../Stardust.Web.Vue/src/design-system/tokens.css) · 星尘设计系统(明暗åŒä¸»é¢˜ï¼Œé»˜è®¤è·Ÿéšç³»ç»Ÿï¼‰
本目录是星尘平å°**分层看æ¿**çš„è®¾è®¡è“æœ¬ï¼ŒåŒ…å« 5 个å¯äº¤äº’ HTML 原型与本文档。MVC 控制å°ï¼ˆ`Stardust.Web`)已于 2026-10-31 完æˆè½åœ°ï¼Œè·¯ç”±ã€æ•°æ®æ¥æºä¸Žè®¾è®¡è°ƒæ•´è§ §16。
---
## 1. ç›®æ ‡ä¸ŽèŒƒå›´
### 1.1 è¦è§£å†³çš„问题
现有 StarWeb åªæœ‰ä¸€ä¸ªã€ŒæŽ§åˆ¶å°æ¦‚览ã€èšåˆé¡µï¼Œç¼ºå°‘分层视角:
- 进入æŸä¸ªåº”用时,看ä¸åˆ°è¯¥åº”用的在线状æ€ã€é”™è¯¯ã€æ…¢ç«¯ç‚¹ã€å®žä¾‹å¥åº·ä¸Žæœ€è¿‘å˜æ›´ï¼›
- 进入æŸä¸ªé¡¹ç›®æ—¶ï¼Œåº”用与节点分散在ä¸åŒåˆ—è¡¨é¡µï¼Œæ— æ³•ä¸€å±åˆ¤æ–项目å¥åº·ï¼›
- è¿ç»´æŽ’查节点问题时,需è¦åŒæ—¶çœ‹èµ„æºæ—¶åºã€ç½‘络质é‡ã€è¿›ç¨‹ä¸Žéƒ¨ç½²æƒ…况;
- å¹³å°ç®¡ç†å‘˜ç¼ºå°‘å…¨å±€è§†è§’ï¼Œä¸”çŽ°æœ‰åˆ—è¡¨æŽ¥å£æ²¡æœ‰æ•°æ®çº§é¡¹ç›®éš”离。
### 1.2 è®¾è®¡ç›®æ ‡
| ç›®æ ‡ | 说明 |
|------|------|
| åˆ†å±‚å›žç” | 系统 → 项目 → 应用 / 节点,æ¯ä¸€å±‚åªå›žç”该层最关心的问题 |
| 3 秒结论 | 顶部 KPI å…ˆç»™ç»“è®ºï¼Œä¸»å›¾è§£é‡ŠåŽŸå› ï¼Œå³ä¾§äº‹ä»¶æµæç¤ºå˜åŒ– |
| 状æ€å…ˆè¡Œ | 在线 / å‘Šè¦ / 离线三æ€è´¯ç©¿æ‰€æœ‰å¡ç‰‡ã€å›¾è¡¨ä¸Žåˆ—表 |
| æƒé™å³èŒƒå›´ | æ¯é¡µæ ‡æ³¨å¯è§é¡¹ç›®èŒƒå›´ï¼›æ— 授æƒä¸ç•™ç©ºå›¾è¡¨ï¼Œç»™å‡ºç”³è¯·å…¥å£ |
| å¯ç›´æŽ¥è½åœ° | 所有视觉值æ¥è‡ª `--sd-*` 令牌,组件与 StarWeb 现有 GlassCard / KpiStat å¯¹é½ |
### 1.3 éžç›®æ ‡
- ä¸ä¿®æ”¹ `Stardust.Web`(MVC 控制å°ï¼‰ä»»ä½•功能;
- ä¸åœ¨æœ¬ç›®å½•å®žçŽ°çœŸå®žæ•°æ®æŽ¥å…¥ï¼›
- ä¸å®šä¹‰æ–°çš„åŽç«¯å议细节(仅给出 scope å¥‘çº¦å»ºè®®ï¼Œè§ Â§7.2)。
---
## 2. 设计总览
### 2.1 å››å±‚ä¿¡æ¯æž¶æž„
| 层级 | çœ‹æ¿ | å…¥å£ | 回ç”的问题 | 主è¦ä¸‹é’» |
|:----:|------|------|------------|---------|
| L0 | ç³»ç»Ÿçº§çœ‹æ¿ | ä¾§æ 「系统〠| 平尿•´ä½“好ä¸å¥½ï¼Ÿå“ªä¸ªé¡¹ç›®/应用最差? | 项目看æ¿ã€åº”ç”¨çœ‹æ¿ |
| L1 | é¡¹ç›®çœ‹æ¿ | 系统看æ¿é¡¹ç›®è¡Œ / 项目列表 | è¿™ä¸ªé¡¹ç›®ä¸‹çš„åº”ç”¨å’ŒèŠ‚ç‚¹çŽ°åœ¨æ€Žä¹ˆæ ·ï¼Ÿ | 应用看æ¿ã€èŠ‚ç‚¹çœ‹æ¿ |
| L2 | åº”ç”¨çœ‹æ¿ | é¡¹ç›®åº”ç”¨å¡ / 应用列表 | 应用是å¦åœ¨çº¿ï¼Ÿæœ‰æ²¡æœ‰æŠ¥é”™ï¼Ÿæ…¢åœ¨å“ªï¼Ÿå®žä¾‹å¥åº·å—? | 节点看æ¿ã€è°ƒç”¨é“¾ã€è·Ÿè¸ªç»Ÿè®¡ |
| L2 | èŠ‚ç‚¹çœ‹æ¿ | 项目节点行 / 实例表 | è¿™å°æœºå™¨å¥åº·å—?è°åœ¨åƒèµ„æºï¼Ÿæœ€è¿‘åšè¿‡ä»€ä¹ˆï¼Ÿ | 应用看æ¿ã€æŒ‡ä»¤è®°å½• |
| — | 大屿¨¡å¼ | 系统看æ¿ã€ŒæŠ•å±ã€ | æ— äººå€¼å®ˆæ—¶ï¼Œä¸€å±è½®æ’全局æ€åŠ¿ | — |
### 2.2 统一骨架
```
┌────────────────────────────────────────────────────────────────────────â”
│ é¡¶æ :å“牌 · 项目上下文 · å¯è§èŒƒå›´å¾½æ ‡ · æ—¶é’Ÿ / 刷新 / è´¦å· â”‚
├────────────────────────────────────────────────────────────────────────┤
│ 作用域æ :é¢åŒ…屑 · 页颿 ‡é¢˜ / çŠ¶æ€ Â· 时间范围 · 自动刷新 · æŠ•å± Â· 主æ“作 │
├────────────────────────────────────────────────────────────────────────┤
│ KPI æ¡ï¼ˆ6 å¡ï¼‰ï¼šç»“è®ºæ•°å— + 环比 + è¿·ä½ è¶‹åŠ¿ │
├───────────────────────────────────────────────┬────────────────────────┤
│ 主区:趋势 / 矩阵 / 列表(24 æ …æ ¼ï¼Œ14px gutter)│ 事件æ ï¼ˆå¯æŠ˜å ) │
├───────────────────────────────────────────────┴────────────────────────┤
│ é¡µè„šï¼šæ•°æ®æ¥æº · æœ€åŽæ›´æ–°æ—¶é—´ · 下钻æç¤º │
└────────────────────────────────────────────────────────────────────────┘
```
- ä¾§æ æ²¿ç”¨ StarWeb 56px å›¾æ ‡å¯¼èˆªï¼ˆåŽŸåž‹ä¸ä¸º 60px,实现时以现有布局为准)。
- å¡ç‰‡ç»Ÿä¸€ä¸ºçŽ»ç’ƒæ‹Ÿæ€ï¼š`backdrop-filter: blur(14px)` + 1px 边框 + 16px 圆角 + è“调阴影。
- 页é¢å®½åº¦ä¸Šé™ 1680px,超宽å±ç•™ç™½ï¼Œé¿å…大屿‹‰ä¼¸å¯¼è‡´ä¿¡æ¯å¯†åº¦è¿‡ä½Žã€‚
### 2.3 æ …æ ¼ä¸Žæ–点
| æ–点 | ä¸»åŒºæ …æ ¼ | KPI | 说明 |
|------|----------|-----|------|
| ≥ 1360px | 24 列 | 6 列 | å®Œæ•´åŒæ + 事件æ |
| 1100–1359px | 12 列 | 3 列 | å¡ç‰‡ä¸¤ä¸¤åˆå¹¶ï¼Œäº‹ä»¶æ 移至底部 |
| < 1100px | 2 列 | 2 列 | å•列滚动,ä¿ç•™ KPI 与主图 |
| < 720px | 1 列 | 1 列 | 移动端仅ä¿è¯å¯è¯» |
---
## 3. 设计è¯è¨€
### 3.1 色彩
| 令牌 | 暗色 | 浅色 | 用途 |
|------|------|------|------|
| `--sd-color-brand` | `#6673FF` | `#4F5BE8` | 主æ“ä½œã€æ´»åЍæ€ã€å“牌 |
| `--sd-color-brand-2` | `#8C5CF5` | `#7A46E0` | æ¸å˜æœ«ç«¯ã€åº”用拓扑节点 |
| `--sd-color-accent` | `#6FE3EC` | `#0E8F9B` | 强调ã€ç„¦ç‚¹ã€æ˜Ÿå°˜é’ |
| `--sd-color-online` | `#43E8A3` | `#0B9A66` | 在线 / æˆåŠŸ / æ£å¸¸ |
| `--sd-color-alert` | `#FFC208` | `#B45309` | å‘Šè¦ / 接近阈值 |
| `--sd-color-offline` | `#FF4545` | `#D92D20` | 离线 / 错误 / è¶…é™ |
| `--sd-bg-page` | `#16202A` | `#F2F5FA` | 页é¢åº•色 |
| `--sd-bg-surface` | `#1F2A33` | `#FFFFFF` | å¡ç‰‡ / ä¾§æ è¡¨é¢ |
| `--sd-bg-elevated` | `#26333F` | `#FFFFFF` | 悬浮层 / 抽屉 |
| `--sd-text-primary` | `#E6EDF3` | `#16202A` | 主文本 |
| `--sd-text-secondary` | `#8A97A6` | `#5C6B7A` | æ¬¡è¦æ–‡æœ¬ |
- 原型与实现都åªèƒ½å¼•用å˜é‡ï¼Œç¦æ¢åœ¨é¡µé¢å†…硬编ç åå…进制色值;
- 浅色令牌是本次设计稿的扩展(官方 `tokens.css` ç›®å‰åªæœ‰æš—色),实现时建议把 `[data-theme="light"]` å—åˆå¹¶å›žä¸Šæ¸¸ï¼Œä¿æŒå•一事实æºï¼›
- 图表(canvasï¼‰æ— æ³•è¯»å– CSS å˜é‡ï¼Œ`assets/charts.js` 维护 **暗色 / 浅色åŒè°ƒè‰²æ¿**,按 `<html data-theme>` 选择;主题切æ¢åŽéœ€é‡å»ºå›¾è¡¨ï¼ˆåŽŸåž‹ç”¨é‡è½½ï¼Œè§ §15)。
### 3.2 å—体与数å—
- æ£æ–‡ï¼š`Inter / PingFang SC / Microsoft YaHei`ï¼Œæ£æ–‡ 14pxã€è¾…助 11–12pxï¼›
- æ•°å—:`font-variant-numeric: tabular-nums`,KPI 29–30pxï¼Œå¤§å± `clamp(24px, 2.35vw, 44px)`ï¼›
- 代ç / æ ‡è¯†ï¼š`JetBrains Mono / Consolas`,用于 IPã€AppIdã€traceIdã€ç‰ˆæœ¬å·ã€‚
### 3.3 å¡ç‰‡ä¸Žçжæ€
- å¡ç‰‡å¤´ï¼š3px å“牌æ¸å˜ç«–æ¡ + 13px åŠç²—æ ‡é¢˜ + å³ä¾§æç¤º / 链接;
- 状æ€è¯ä¸¸ï¼šè‰²å€¼ 12% 逿˜Žåº¦åº• + 6px 圆点,在线状æ€åР呼å¸åŠ¨ç”»ï¼›
- æ°´ä½æ¡ï¼šæ£å¸¸ç»¿ / è¦æˆ’黄(≥65%)/ å±é™©çº¢ï¼ˆâ‰¥80%),项目节点资æºç»Ÿä¸€ä½¿ç”¨ï¼›
- 空æ€ï¼šå›¾æ ‡ + 一å¥åŽŸå› + ä¸‹ä¸€æ¥æ“作,ä¸å‡ºçŽ°ç©ºç™½å›¾è¡¨ã€‚
---
## 4. å„看æ¿ä¿¡æ¯æž¶æž„
### 4.1 系统级看æ¿ï¼ˆ`system.html`)
| åŒºå— | æ …æ ¼ | 内容 | 交互 |
|------|:----:|------|------|
| 作用域æ | 24 | æ ‡é¢˜ã€æ•´ä½“状æ€ã€è¦†ç›–项目/应用/节点数 | 时间范围ã€è‡ªåŠ¨åˆ·æ–°ã€æŠ•å± |
| KPI × 6 | 24 | 项目(å¯è§ï¼‰ã€åœ¨çº¿åº”用ã€èŠ‚ç‚¹åœ¨çº¿ã€ä»Šæ—¥è¯·æ±‚ã€P95ã€é”™è¯¯çއ | é¡¹ç›®å¡æ˜¾ç¤ºå¯è§æ•°é‡ |
| 全局åžåä¸Žè´¨é‡ | 16 | 请求é‡é¢ç§¯ + 错误率折线(åŒè½´ï¼‰ï¼Œ24h / 7d | æ—¶é—´åˆ‡æ¢ |
| 集群å¥åº· | 8 | 在线/告è¦/离线环 + ç¦»çº¿ä¸Žå‘Šè¦ Top3 | 点击进节点 |
| 项目å¥åº·çŸ©é˜µ | 8 | 项目 × 应用/节点/错误率/告è¦/å¥åº·åº¦ | 点击项目行下钻 |
| Top 应用 | 8 | QPS / 错误率 / è€—æ—¶ä¸‰è§†å›¾æ¨ªå‘æ¡å½¢ | 点击进应用 |
| æœåŠ¡æ‹“æ‰‘ | 8 | ECharts graphï¼ŒèŠ‚ç‚¹å¤§å° = QPS | 点击下钻 |
| æœºæˆ¿èµ„æºæ°´ä½ | 16 | å—京/上海/广州/北京 CPU/内å˜/ç£ç›˜åˆ†ç»„柱 | hover 查看 |
| 实时事件 | 8 | 告è¦ã€éƒ¨ç½²ã€ä¸Šä¸‹çº¿ã€é…ç½®å˜æ›´æ—¶é—´æµ | 点击查看详情 |
**æƒé™è¡¨çް**:å³ä¸Šè§’「å¯è§ 3 / 12 个项目ã€ï¼›å—陿—¶éšè—未授æƒé¡¹ç›®è¡Œå¹¶ç»™å‡ºæç¤ºæ¡ï¼›æ— æŽˆæƒæ—¶æ•´é¡µç©ºæ€ + 申请按钮。
### 4.2 项目看æ¿ï¼ˆ`project.html`)
| åŒºå— | æ …æ ¼ | 内容 |
|------|:----:|------|
| 项目头 | 24 | åç§°ã€è´Ÿè´£äººã€æˆå‘˜æ•°ã€åˆ›å»ºæ—¶é—´ã€é¡¹ç›® IDã€æ•°æ®èŒƒå›´ã€å¿«æ·æ“作 |
| KPI × 6 | 24 | 在线应用ã€èŠ‚ç‚¹åœ¨çº¿ã€æœåŠ¡å®žä¾‹ã€ä»Šæ—¥è¯·æ±‚ã€P95ã€æ´»è·ƒå‘Šè¦ |
| 应用矩阵 | 16 | æ¯ä¸ªåº”ç”¨ä¸€å¼ å¡ï¼šçжæ€ã€å®žä¾‹ã€QPSã€é”™è¯¯çއã€sparklineã€ç‰ˆæœ¬ä¸Žè€—æ—¶ |
| èŠ‚ç‚¹èµ„æº | 8 | 节点å/机房/IPã€çжæ€ã€CPU/内å˜/ç£ç›˜æ°´ä½ |
| 项目拓扑 | 12 | 项目 → 应用 → 节点三层关系,连线宽度 = 实例数 |
| 最近部署 | 6 | 应用ã€ç‰ˆæœ¬ã€èŠ‚ç‚¹æ•°ã€è€—æ—¶ã€çŠ¶æ€ |
| 当å‰å‘Šè¦ | 6 | 本项目的告è¦åˆ—表,未确认优先 |
**空æ€**:项目未接入应用时,应用矩阵替æ¢ä¸º `AddStardust("appId")` 代ç å—与创建入å£ã€‚
### 4.3 应用看æ¿ï¼ˆ`app.html`)
| åŒºå— | æ …æ ¼ | 内容 |
|------|:----:|------|
| 应用头 | 24 | 显示å / AppIdã€æ‰€å±žé¡¹ç›®ã€åˆ†ç±»ã€ç‰ˆæœ¬ä¸Žç¼–译时间ã€åœ¨çº¿çжæ€ã€å®žä¾‹æ•°ã€å¿«æ·æ“作 |
| KPI × 6 | 24 | å½“å‰ QPSã€å¹³å‡è€—æ—¶ã€P95ã€é”™è¯¯çއã€åœ¨çº¿å®žä¾‹ã€æ³¨å†ŒæœåŠ¡ |
| 请求é‡ä¸Žé”™è¯¯çŽ‡è¶‹åŠ¿ | 16 | 24h 分钟粒度 / 7d å°æ—¶ç²’度,åŒè½´ |
| 实例å¥åº· | 8 | 6/6 环图 + å¹³å‡åœ¨çº¿æ—¶é•¿/版本分布 + 实例表(节点ã€ç‰ˆæœ¬ã€åœ¨çº¿ã€CPU/内å˜ã€çжæ€ï¼‰ |
| 端点 Top | 8 | 耗时 / 错误率 / 调用é‡ä¸‰è§†å›¾ï¼Œç‚¹å‡»è¿›è·Ÿè¸ªç»Ÿè®¡ |
| 错误分布 | 8 | 状æ€ç /异常类型环图 + å æ¯” + æœ€æ–°é”™è¯¯æ ·æœ¬ï¼ˆtraceId 深链) |
| è¿è¡Œæ—¶æ€§èƒ½ | 8 | CPUã€å†…å˜ã€æ‰˜ç®¡å †ã€çº¿ç¨‹ã€TCPã€GC å…é¡¹æŒ‡æ ‡ + 阈值色 |
| ä¾èµ–æœåŠ¡ | 12 | 出站æœåŠ¡ã€å˜å‚¨ã€ç¼“å˜çš„ QPS / 耗时 / 错误率 |
| æœ€è¿‘å˜æ›´ | 6 | 部署ã€é…ç½®ã€å›žæ»šæ—¶é—´çº¿ |
| æœ€æ–°å‘Šè¦ | 6 | æœ¬åº”ç”¨ç›¸å…³å‘Šè¦ |
### 4.4 节点看æ¿ï¼ˆ`node.html`,å•节点)
| åŒºå— | æ …æ ¼ | 内容 |
|------|:----:|------|
| 节点头 | 24 | åç§°ã€IPã€OS/æž¶æž„ã€æœºæˆ¿ã€è¿è¡Œæ—¶é•¿ã€Agent ç‰ˆæœ¬ã€æ“作 |
| KPI × 6 | 24 | CPUã€å†…å˜ã€ç£ç›˜ã€ç³»ç»Ÿè´Ÿè½½ã€æ¸©åº¦ã€ç½‘络åžå |
| èµ„æºæ—¶åº | 16 | CPU / å†…å˜ / ç£ç›˜ä¸‰çº¿ï¼Œ1h / 24h / 7d |
| å¥åº·è¯„分 | 8 | CPU / å†…å˜ / ç£ç›˜ / 网络 / 温度 / 稳定性å…ç»´é›·è¾¾ |
| ç½‘ç»œè´¨é‡ | 8 | 内网 / 外网评分仪表 + 网关/DNS/æœåŠ¡å™¨å»¶è¿Ÿä¸Žä¸¢åŒ… |
| ç£ç›˜åˆ†åŒº | 8 | `/data`ã€`/`ã€`/var/log` æ°´ä½ä¸Žã€Œé¢„计写满天数〠|
| 进程 Top | 8 | 按 CPU / å†…å˜æŽ’åºå‰ 6 进程 |
| 已部署应用 | 12 | 应用ã€ç‰ˆæœ¬ã€éƒ¨ç½²æ—¶é—´ã€ç«¯å£ã€è¿è¡Œçжæ€ï¼›é™„ç£ç›˜ I/Oã€IOPSã€TCP 统计 |
| æ“ä½œåŽ†å² | 6 | 远程命令ã€å‡çº§ã€é‡å¯ã€å³°å€¼å‘Šè¦æ—¶é—´çº¿ |
| èŠ‚ç‚¹å‘Šè¦ | 6 | æœ¬èŠ‚ç‚¹å‘Šè¦ |
**离线æ€**:顶部横幅æç¤ºç¦»çº¿æ—¶é•¿ä¸Žæœ€åŽä¸ŠæŠ¥æ—¶é—´ï¼ŒKPI ç½®ç°ã€å›¾è¡¨é™é€æ˜Žåº¦ï¼Œä»ä¿ç•™æœ€åŽä¸€æ¬¡å¿«ç…§ã€‚
### 4.5 大屿¨¡å¼ï¼ˆ`wallboard.html`)
- 16:9 é“ºæ»¡ï¼Œæ— ä¾§æ 与顶æ ,å—å·ä½¿ç”¨ `clamp()` é€‚é… 1920×1080 与 2560×1440ï¼›
- 布局:左列 3 å¼ æŒ‡æ ‡å¡ã€ä¸åˆ—大图 + 项目å¥åº·ã€å³åˆ—事件 / Top 应用 / 机房资æºï¼›
- æ¯ 12s è½®æ’ 4 个视角:总览åžå → 项目å¥åº· → æœºæˆ¿èµ„æº â†’ 告è¦åˆ†å¸ƒï¼›
- åº•éƒ¨è¿›åº¦æ¡ + 圆点å¯ç‚¹å‡»åˆ‡æ¢ï¼Œç©ºæ ¼æš‚åœï¼›ä¸å¿ƒæ ‡é¢˜ä¸Žå›¾ä¾‹éšè§†è§’切æ¢ã€‚
---
## 5. 组件清å•(StarWeb 实现建议)
| 组件 | 说明 | å¤ç”¨æ¥æº |
|------|------|---------|
| `DashboardShell` | é¡¶æ + 作用域æ + 内容区 + 页脚 | 现有 StardustLayout |
| `ScopeBar` | é¢åŒ…å±‘ã€æ ‡é¢˜ã€çжæ€ã€æ—¶é—´èŒƒå›´ã€åˆ·æ–°ã€æŠ•å± | 新建 |
| `ScopeBadge` | å¯è§é¡¹ç›®èŒƒå›´å¾½æ ‡ + 项目选择抽屉 | 新建(TopBar 项目选择器扩展) |
| `KpiTile` | æ ‡ç¾ã€ä¸»æ•°å—ã€å•ä½ã€çŽ¯æ¯”ã€sparklineã€é˜ˆå€¼è‰² | 扩展 KpiStat |
| `GlassCard` | 玻璃å¡ç‰‡ä¸Žæ ‡é¢˜æ¡ | 直接å¤ç”¨ |
| `TrendPanel` | ECharts 折线/é¢ç§¯å›¾ï¼Œç»Ÿä¸€è½´ä¸Žæç¤ºæ ·å¼ | 扩展 EChart.vue |
| `GaugeRing` / `HealthRadar` | 环图与雷达 | ECharts å°è£… |
| `HealthMatrix` | 项目/节点å¥åº·è¡¨æ ¼ + æ°´ä½æ¡ | 新建 |
| `EventFeed` | 告è¦/事件时间æµï¼Œæ”¯æŒ 2 è¡Œæˆªæ– | 新建 |
| `AppCard` | 项目看æ¿åº”ç”¨å¡ | 新建 |
| `NodeResourceBar` | CPU/内å˜/ç£ç›˜ä¸‰æ®µæ°´ä½ | 新建 |
| `EmptyState` | æ— æ•°æ® / æ— æƒé™ / 接入引导 | 新建 |
| `Skeleton` | 首å±éª¨æž¶å± | 新建 |
---
## 6. æ•°æ®æ˜ 射(现有 WebApi)
| 看æ¿åŒºå— | æŽ¥å£ | 关键嗿®µ | 建议刷新 |
|----------|------|----------|:--------:|
| é¡¹ç›®ä¿¡æ¯ | `/Platform/GalaxyProject` | nameã€managerIdã€nodesã€appsã€enable | 5 min |
| 项目æˆå‘˜ | `/Platform/ProjectUser` | projectIdã€userId | 手动 |
| åº”ç”¨ä¿¡æ¯ | `/Registry/App` | nameã€displayNameã€categoryã€versionã€compileã€enable | 5 min |
| 应用在线实例 | `/Registry/AppOnline` | appNameã€nodeNameã€clientIdã€version | 30 s |
| 注册æœåŠ¡ | `/Registry/AppService` | appIdã€serviceIdã€client | 60 s |
| 分钟级åžå/耗时 | `/Monitors/AppMinuteStat` | totalã€errorsã€errorRateã€costã€maxCost | 60 s |
| 日级汇总 | `/Monitors/AppDayStat` | statDateã€totalã€ringRateã€apisã€httpsã€dbs | 5 min |
| 端点与链路统计 | `/Monitors/TraceHourStat`ã€`/Monitors/TraceItem` | nameã€totalã€errorsã€costã€maxCost | 60 s |
| é”™è¯¯æ ·æœ¬ | `/Monitors/TraceData` | traceIdã€nameã€costã€error | 60 s |
| è¿è¡Œæ—¶æ€§èƒ½ | `/Monitors/AppMeter`(应用性能) | cpuUsageã€memoryã€threadsã€heapSizeã€gcCountã€connections | 30 s |
| 节点实时 | `/Nodes/NodeOnline` | cpuRateã€memoryã€diskIopsã€temperatureã€ç½‘络评分ã€tcpConnections | 30 s |
| èŠ‚ç‚¹æ—¶åº | `/Nodes/NodeStat`ã€`/Nodes/NodeData` | cpuRateã€memoryã€freeSpaceã€iops | 60 s |
| èŠ‚ç‚¹åŸºæœ¬ä¿¡æ¯ | `/Nodes/Node` | nameã€ipã€osã€locationã€uptimeã€version | 5 min |
| 节点已部署应用 | `/Deployment/AppDeployNode` | appIdã€versionã€statusã€deployTime | 60 s |
| 部署记录 | `/Deployment/AppDeploy`ã€`/Deployment/AppPipelineRun` | versionã€nodeCountã€statusã€cost | 60 s |
| å‘Šè¦ | `/Monitors/AlarmRecord`ã€`/Monitors/AlarmHistory` | levelã€appã€nodeã€messageã€status | 30 s |
> åˆ†é’Ÿçº§ä¸Žå°æ—¶çº§ç»Ÿè®¡ä¸ºé¢„èšåˆè¡¨ï¼Œçœ‹æ¿ä¸ç›´æŽ¥æ‰«æåŽŸå§‹è¿½è¸ªæ•°æ®ï¼›24h å›¾å– 1 分钟/5 分钟粒度,7d 图å–å°æ—¶ç²’度,é¿å…一次拉å–过é‡ç‚¹ã€‚
---
## 7. æƒé™ä¸Žæ•°æ®èŒƒå›´
### 7.1 现状(必须æ£è§†ï¼‰
《[架构审查与æƒé™åˆ†æž](/NewLife/Stardust/Blob/master/Doc/Dashboard/../架构审查与æƒé™åˆ†æž.md)》第五节结论:当å‰åªæœ‰**功能级æƒé™**(`[EntityAuthorize]`),**没有数æ®çº§ `[DataPermission]`**ï¼›`ProjectUser`(项目æˆå‘˜ï¼‰è¡¨æœªè¢«ä»»ä½•业务查询使用;约 77% 的明细与时åºè¡¨æ²¡æœ‰ `ProjectId`,åªèƒ½ç» `AppId` / `NodeId` 间接关è”ï¼›Vue å‰å°æ²¡æœ‰é¡¹ç›®ä½œç”¨åŸŸæ¦‚念。
å› æ¤çœ‹æ¿ä¸èƒ½åªåœ¨ç•Œé¢ä¸Š"è—æ•°æ®"——必须在æœåŠ¡ç«¯æŒ‰å½“å‰ç”¨æˆ·å¯è§é¡¹ç›®è¿‡æ»¤ï¼Œå¦åˆ™å—é™è´¦å·ä»å¯é€šè¿‡æŽ¥å£çœ‹åˆ°å…¨é‡æ•°æ®ã€‚
### 7.2 建议的 scope 契约
```http
GET /api/dashboard/scope
{
"userId": 1024,
"isAdmin": false,
"projectIds": [1, 2, 3],
"totalProjects": 12,
"visibleProjects": 3,
"generatedAt": "2026-10-30T14:20:00+08:00"
}
```
- æ‰€æœ‰çœ‹æ¿æŽ¥å£ï¼ˆæˆ–统一的查询过滤器)接收/注入 `projectIds`:
- 有 `ProjectId` 的表:直接 `ProjectId IN (...)`;
- æ— `ProjectId` 的表:通过 `AppId` / `NodeId` åæŸ¥è¯¢é—´æŽ¥è¿‡æ»¤ï¼›
- 管ç†å‘˜ï¼ˆ`isAdmin`)返回全部项目,å‰ç«¯ä»æ˜¾ç¤ºã€Œå…¨éƒ¨ 12 个项目ã€ï¼›
- å‰ç«¯åœ¨ Pinia ä¿å˜ scope,所有请求自动æºå¸¦ï¼›URL ä¸çš„ `projectId` åªä½œä¸ºç›é€‰ï¼Œä¸ä½œä¸ºæƒé™ä¾æ®ï¼›
- 下钻详情(应用ã€èŠ‚ç‚¹ï¼‰å¿…é¡»å…ˆæ ¡éªŒæ‰€å±žé¡¹ç›®åœ¨ scope 内,å¦åˆ™è¿”回 403 å¹¶è·³è½¬æ— æƒé™é¡µï¼›
- 大å±ä¸Žå¯¼å‡ºæŽ¥å£åŒæ ·åº”用 scope,ä¸èƒ½å› 为是"åªè¯»"而绕过。
### 7.3 三æ€è®¾è®¡
| çŠ¶æ€ | è§¦å‘ | 表现 |
|------|------|------|
| å…¨é‡ | 管ç†å‘˜ / 全部项目å¯è§ | å¾½æ ‡ã€Œå…¨éƒ¨ 12 个项目ã€ï¼Œæ£å¸¸å±•示 |
| å—é™ | 仅部分项目å¯è§ | å¾½æ ‡ã€Œå¯è§ 3 / 12 个项目ã€+ 黄色æç¤ºæ¡ï¼›éšè—未授æƒé¡¹ç›®è¡Œï¼›KPI åªç»Ÿè®¡å¯è§èŒƒå›´ |
| æ— æŽˆæƒ | æœªåŠ å…¥ä»»ä½•é¡¹ç›® | 整页空æ€ï¼Œè¯´æ˜ŽåŽŸå› å¹¶ç»™å‡ºç”³è¯·å…¥å£ï¼›ä¸æ¸²æŸ“任何图表 |
评审时å¯é€šè¿‡ `?scope=limited` / `?scope=none` 直接查看åŽä¸¤æ€ã€‚
---
## 8. 交互规范
1. **时间范围**:`1 å°æ—¶ / 24 å°æ—¶ / 7 天` 分段控件;切æ¢åªå½±å“趋势图与 Top 列表,ä¸åˆ·æ–°æ•´é¡µã€‚
2. **自动刷新**:30sï¼ˆå®žæ—¶æŒ‡æ ‡ï¼‰/ 60s(统计)/ 5min(元数æ®ï¼‰ï¼›é¡µé¢å¤±ç„¦æ—¶æš‚åœï¼ŒæŒ‰é’®æ˜¾ç¤ºå€’计时。
3. **下钻**:å¡ç‰‡ã€è¡¨æ ¼è¡Œã€æ‹“扑节点å‡å¯ç‚¹å‡»ï¼›ä¸‹é’»è·¯å¾„写入 URL(`/stardust/dashboard/app/:id?projectId=2&range=24h`),支æŒåˆ†äº«ä¸Žæµè§ˆå™¨åŽé€€ã€‚
4. **空æ€**:
- æ— æ•°æ®ï¼šè¯´æ˜ŽåŽŸå› + 接入引导(SDK 代ç å—);
- æ— æƒé™ï¼šç”³è¯·å…¥å£ï¼›
- åŠ è½½å¤±è´¥ï¼šé”™è¯¯æ‘˜è¦ + é‡è¯•按钮;
- 首å±ï¼šéª¨æž¶å±ï¼Œåˆ·æ–°æ—¶ä¿ç•™æ—§æ•°æ® + æŒ‰é’®è½¬åœˆï¼ˆæ²¿ç”¨çŽ°æœ‰æ¦‚è§ˆé¡µåšæ³•)。
5. **大å±**ï¼šç©ºæ ¼æš‚åœ/ç»§ç»è½®æ’;点击指示æ¡åˆ‡æ¢è§†è§’ï¼›`Esc` 退出全å±ã€‚
---
## 9. å“应å¼ä¸Žæ€§èƒ½
- 图表统一使用 `EChart.vue` å°è£…,`resize` 由容器 ResizeObserver 触å‘ï¼›
- 24h 曲线按 1 分钟粒度最多 1440 点,å‰ç«¯é™é‡‡æ ·åˆ° 200–300 点绘制;
- 首å±å¹¶è¡Œè¯·æ±‚:scopeã€é¡¹ç›®ã€åº”用ã€èŠ‚ç‚¹ã€èšåˆç»Ÿè®¡ï¼›
- 拓扑图节点超过 200 个时改为按项目èšåˆï¼Œé¿å…力导å‘å¡é¡¿ï¼›
- 大å±éšè—ä¾§æ 与顶æ ,å‡å°‘一层布局计算;`prefers-reduced-motion` 下关é—è½®æ’与呼å¸åŠ¨ç”»ã€‚
---
## 10. StarWeb è½åœ°å»ºè®®
### 10.1 路由
| 路由 | é¡µé¢ | 说明 |
|------|------|------|
| `/stardust/dashboard/system` | ç³»ç»Ÿçº§çœ‹æ¿ | å…¼å®¹æ ¹è·¯å¾„é‡å®šå‘ |
| `/stardust/dashboard/project/:id` | é¡¹ç›®çœ‹æ¿ | `id` 为 GalaxyProject.Id |
| `/stardust/dashboard/app/:id` | åº”ç”¨çœ‹æ¿ | `id` 为 App.Id |
| `/stardust/dashboard/node/:id` | èŠ‚ç‚¹çœ‹æ¿ | `id` 为 Node.Id |
| `/stardust/wallboard` | 大屿¨¡å¼ | 独立布局,ä¸åŠ è½½ä¾§æ / é¡¶æ |
### 10.2 目录与模型
```
apps/stardust/src/views/Dashboard/
├── System/index.vue
├── Project/index.vue
├── App/index.vue
├── Node/index.vue
├── Wallboard/index.vue
├── components/ # KpiTile / HealthMatrix / EventFeed / AppCard ...
└── models/ # 纯函数:èšåˆã€æ´¾ç”Ÿã€æ ¼å¼åŒ–(å¯å•测)
```
- 沿用 `views/Stardust/overview.model.ts` çš„åšæ³•:把 KPI èšåˆã€å¥åº·åˆ†æ®µã€äº‹ä»¶æ´¾ç”Ÿã€ç›¸å¯¹æ—¶é—´ç‰æŠ½æˆçº¯å‡½æ•°ï¼Œç”¨ Vitest 覆盖;
- 组件内ä¸ç›´æŽ¥æ‹¼æŽ¥æŽ¥å£å‚数,统一走 `api/dashboard.ts`ï¼›
- 颜色åªç”¨ `--el-*` / `--sd-*` 令牌,图表主题集ä¸åœ¨ä¸€å¤„导出。
### 10.3 测试
- å•元测试:KPI èšåˆï¼ˆç©ºæ•°ç»„ã€å…¨ç¦»çº¿ã€éƒ¨åˆ†å‘Šè¦ï¼‰ã€å¥åº·åº¦è®¡ç®—ã€æ—¶é—´èŒƒå›´æ ¼å¼åŒ–ï¼›
- 组件测试:KPI 阈值色ã€ç©ºæ€ã€æƒé™å¾½æ ‡ï¼›
- E2E(Playwright):4 个看æ¿åŠ è½½ã€å—陿€éšè—未授æƒé¡¹ç›®ã€æ— 授æƒç©ºæ€ã€ä¸‹é’»è·³è½¬ã€å¤§å±è½®æ’与暂åœã€‚
---
## 11. 分期建议
| 阶段 | 内容 | ä¾èµ– |
|------|------|------|
| P0 | scope æŽ¥å£ + ç³»ç»Ÿçº§çœ‹æ¿ + é¡¹ç›®çœ‹æ¿ | æœåŠ¡ç«¯é¡¹ç›®è¿‡æ»¤ï¼ˆÂ§7.2) |
| P1 | åº”ç”¨çœ‹æ¿ + èŠ‚ç‚¹çœ‹æ¿ | 统计接å£å—段补é½ï¼ˆP95ã€é”™è¯¯æ ·æœ¬ï¼‰ |
| P2 | 大屿¨¡å¼ + è§†è§’è½®æ’ | P0/P1 å®Œæˆ |
| P3 | 自定义看æ¿ï¼ˆæ‹–拽å¡ç‰‡ã€ä¿å˜å¸ƒå±€ï¼‰ | 视需求å†è¯„ä¼°ï¼Œä¸æå‰è®¾è®¡ |
---
## 12. 文件清å•
| 文件 | 说明 |
|------|------|
| `index.html` | 设计总览:画廊ã€åŽŸåˆ™ã€ä»¤ç‰Œã€çŠ¶æ€æ¼”示 |
| `system.html` | L0 ç³»ç»Ÿçº§çœ‹æ¿ |
| `project.html` | L1 é¡¹ç›®çœ‹æ¿ |
| `app.html` | L2 åº”ç”¨çœ‹æ¿ |
| `node.html` | L2 å•èŠ‚ç‚¹çœ‹æ¿ |
| `wallboard.html` | 16:9 大屿¨¡å¼ |
| `assets/tokens.css` | 与官方 tokens åŒæºçš„è®¾è®¡ä»¤ç‰Œï¼ˆå«æµ…色主题扩展) |
| `assets/dashboard.css` | 骨架ã€å¡ç‰‡ã€KPIã€è¡¨æ ¼ã€äº‹ä»¶æµã€ä¸»é¢˜åˆ‡æ¢ã€å¤§å±æ ·å¼ |
| `assets/theme.js` | 主题三æ€ï¼ˆè·Ÿéšç³»ç»Ÿ / 浅色 / æ·±è‰²ï¼‰ã€æŒä¹…åŒ–ä¸Žåˆ‡æ¢æŽ§ä»¶ |
| `assets/mock.js` | ç»Ÿä¸€å‡æ•°æ®ã€ä¸‰æ€åˆ‡æ¢ã€sparkline 工具 |
| `assets/charts.js` | ECharts 暗色 / 浅色åŒè°ƒè‰²æ¿ä¸Žå›¾è¡¨æž„é€ å™¨ |
## 13. 评审方å¼
直接用æµè§ˆå™¨æ‰“å¼€ `index.html` å³å¯ï¼›ECharts èµ° CDN,离线时图表é™çº§ä¸ºæç¤ºï¼ŒKPI 与布局ä¸å—å½±å“。
- 主题:å³ä¸Šè§’(大å±åœ¨å¤´éƒ¨ï¼‰ä¸‰æ€åˆ‡æ¢ï¼›é»˜è®¤ã€Œè·Ÿéšç³»ç»Ÿã€ï¼Œé€‰æ‹©è®°å¿†åœ¨ `localStorage['sd-theme']`
- 三æ€ï¼š`system.html?scope=limited`ã€`system.html?scope=none`
- 空æ€ï¼š`project.html?state=empty`
- 离线æ€ï¼š`node.html?state=offline`
## 14. 与旧稿的关系
`Doc/Design/*.html` 是早期 Bootstrap 浅色示æ„稿,用于快速表达页é¢ç»“构;本目录以 StarWeb 真实设计系统(明暗åŒä¸»é¢˜ã€çŽ»ç’ƒå¡ç‰‡ã€æ˜Ÿå°˜æ¸å˜ï¼‰ä¸ºå‡†ï¼ŒåŽç»å®žçްã€è¯„审与视觉验收å‡ä»¥æœ¬ç›®å½•为准。
---
## 15. 明暗主题与「跟éšç³»ç»Ÿã€
### 15.1 三æ€ä¸Žé»˜è®¤å€¼
| æ¨¡å¼ | 值 | 行为 |
|------|----|------|
| è·Ÿéšç³»ç»Ÿ | `auto`(默认) | è¯»å– `prefers-color-scheme`ï¼Œç³»ç»Ÿåˆ‡æ¢æ—¶è‡ªåŠ¨è·Ÿéš |
| 浅色 | `light` | é”定浅色 |
| 深色 | `dark` | é”定深色 |
- 选择写入 `localStorage['sd-theme']`;
- è½åœ°åœ¨ `<html data-theme="light|dark" data-theme-mode="auto|light|dark">`ï¼›
- 首å±åœ¨ `<head>` 内è”脚本ä¸å…ˆè¡Œåº”用,é¿å…闪白/闪黑;
- åˆ‡æ¢æŽ§ä»¶ä¸ºä¸‰æžšå›¾æ ‡ï¼ˆæ˜¾ç¤ºå™¨ / 太阳 / 月亮),系统看æ¿åœ¨é¡¶æ å³ä¾§ï¼Œå¤§å±åœ¨æ ‡é¢˜å³ä¾§ï¼Œæ€»è§ˆé¡µåœ¨å³ä¸Šè§’。
### 15.2 浅色主题设计è¦ç‚¹
- 页é¢åº•色改为冷ç°è“ `#F2F5FA`,å¡ç‰‡çº¯ç™½ + æ›´æµ…çš„ç°è“阴影,去掉暗色辉光;
- 星点背景é™ä¸ºæ·¡ç´«è“细点,ä¿ç•™ã€Œæ˜Ÿå°˜ã€æ°”è´¨ä½†ä¸æŠ¢å†…å®¹ï¼›
- è¯ä¹‰è‰²æ•´ä½“åŠ æ·±ï¼ˆåœ¨çº¿ `#0B9A66`ã€å‘Šè¦ `#B45309`ã€ç¦»çº¿ `#D92D20`),ä¿è¯ç™½åº•对比度;
- 大å±ä¿æŒåŒæ ·çš„ä¿¡æ¯å±‚次:数å—ä¸å†å‘å…‰ï¼Œæ”¹ä¸ºæ·±è‰²é«˜å¯¹æ¯”æ•°å— + 细边框å¡ç‰‡ï¼›
- é¡¶æ ã€ä¾§æ ã€è¡¨æ ¼ã€ç©ºæ€ã€çжæ€è¯ä¸¸å…¨éƒ¨é€šè¿‡åŒåå˜é‡è‡ªåЍ适é…ï¼Œé¡µé¢æ— éœ€å†™ä¸¤å¥—æ ·å¼ã€‚
### 15.3 StarWeb 实现建议
1. 现在 `src/main.ts` 强制 `document.documentElement.classList.add('dark')`,需移除并改为主题 store;
2. Element Plus 的暗色ä¾èµ– `html.dark`ï¼Œå»ºè®®åŒæ—¶ç»´æŠ¤ `data-theme`(业务令牌)与 `dark` class(Element),二者由åŒä¸€çжæ€é©±åŠ¨ï¼›
3. `auto` 模å¼ç›‘å¬ `window.matchMedia('(prefers-color-scheme: dark)')`,系统å˜åŒ–æ—¶åªæ›´æ–°çжæ€ã€ä¸åˆ·æ–°é¡µé¢ï¼›
4. ECharts 使用åŒè°ƒè‰²æ¿ï¼šç›‘å¬ä¸»é¢˜å˜åŒ–åŽ `setOption` é‡ç»˜ï¼ˆä¸è¦åƒåŽŸåž‹ä¸€æ · reload);å°å±/大å±å›¾è¡¨å…±ç”¨åŒä¸€å¥—主题函数;
5. 大å±é»˜è®¤ã€Œè·Ÿéšç³»ç»Ÿã€ï¼Œå€¼å®ˆæ—¶å¯é”定深色;切æ¢å…¥å£æ”¾åœ¨å¤§å±å¤´éƒ¨ï¼Œé¿å…æŠ•å±æ—¶è¯¯è§¦ï¼›
6. 测试补充:三模å¼åˆ‡æ¢ã€ç³»ç»Ÿä¸»é¢˜å˜åŒ–ã€`localStorage` æŒä¹…化ã€å›¾è¡¨é¢œè‰²éšä¸»é¢˜é‡ç»˜ã€æµ…色下对比度(WCAG AA)。
## 16. MVC StarWeb è½åœ°è®°å½•(2026-10-31)
按「先能用手ã€çš„ç›®æ ‡ï¼Œçœ‹æ¿ä¼˜å…ˆåœ¨ MVC æŽ§åˆ¶å° `Stardust.Web`(StarWeb 程åºé›†ï¼‰è½åœ°ï¼Œè®¾è®¡ç¨¿çš„视觉è¯è¨€ã€å¡ç‰‡ç»“æž„ã€å›¾è¡¨è¯ä¹‰ä¿æŒä¸å˜ï¼›Vue 版åŽç»æŒ‰åŒä¸€èŠ‚è¿ç§»ã€‚
### 16.1 路由
| 路由 | é¡µé¢ | 说明 |
|------|------|------|
| `/` | ç³»ç»Ÿçº§çœ‹æ¿ | ç«™ç‚¹æ ¹è·¯å¾„å³çœ‹æ¿ï¼›ç™»å½•æˆåŠŸåŽé»˜è®¤è½åœ°æ¤å¤„ |
| `/Dashboard` | 跳转 | é»˜è®¤è¿›ç³»ç»Ÿçº§çœ‹æ¿ |
| `/Dashboard/System` | ç³»ç»Ÿçº§çœ‹æ¿ | 与 `/` åŒä¸€é¡µé¢ï¼Œèœå•与é¢åŒ…å±‘ä½¿ç”¨è¯¥åœ°å€ |
| `/Dashboard/Project/{id?}` | é¡¹ç›®çœ‹æ¿ | æ— `id` 时为项目选择页 `/Dashboard/Projects` |
| `/Dashboard/App/{id?}` | åº”ç”¨çœ‹æ¿ | æ— `id` 时为应用选择页 `/Dashboard/Apps` |
| `/Dashboard/Node/{id?}` | èŠ‚ç‚¹çœ‹æ¿ | æ— `id` 时为节点选择页 `/Dashboard/Nodes` |
| `/Dashboard/Wallboard` | 大屿¨¡å¼ | 16:9 å…¨å±ã€å››è§†è§’è½®æ’ |
| `/Dashboard/Data` | æ•°æ®æŽ¥å£ | 返回当å‰é¡µ JSON,供 30 秒轮询与å‰ç«¯äºŒæ¬¡å¼€å‘ |
åŽå°å…¥å£ï¼šçœ‹æ¿å·¦ä¾§æ 底部「åŽå°ã€å›¾æ ‡è·³è½¬ `/Admin`ã€‚é”æ–¹ç®¡ç†åŽå°é¦–é¡µä¿æŒåŽŸç”Ÿå·¥ä½œå°ï¼ˆ`Cube.StartPage` = `/Admin/Index/Dashboard`),ä¸åµŒå…¥çœ‹æ¿ï¼›ç™»å½•æˆåŠŸåŽé€šè¿‡ `LoginLandingMiddleware` æŠŠé”æ–¹å›ºå®šçš„ `/Admin` 跳转改写为 `/`ï¼ˆå¸¦è¿”å›žåœ°å€æ—¶ä¸æ”¹å†™ï¼‰ã€‚
åå‘å…¥å£ï¼šåŽå°å·¦ä¾§ã€Œå¹³å°ç®¡ç† → 看æ¿ä¸å¿ƒã€æ‰“å¼€ `/Dashboard`,看æ¿é¡µé¢åœ¨æ¡†æž¶å†…检测到被åŽå°åµŒå¥—时跳转到顶层,直接以整页呈现(`_Layout_Dashboard` 首å±è„šæœ¬ï¼‰ã€‚
çœ‹æ¿æŽ§åˆ¶å™¨ä½äºŽä¸»ç¨‹åºé›†è€ŒéžåŒºåŸŸï¼ŒCube èœå•扫æä¸ä¼šè‡ªåŠ¨ç”Ÿæˆï¼›`Startup.EnsureDashboardMenu` 在 `UseCube` 之åŽè¡¥æŒ‚「平å°ç®¡ç† → 看æ¿ä¸å¿ƒã€ï¼Œå¹¶æœ€å¤šç‰å¾… 10 秒以é¿å¼€å¯åŠ¨ç«žæ€ã€‚
### 16.2 æ•°æ®æ¥æº
全部æ¥è‡ªçŽ°æœ‰å®žä½“ï¼Œæœªæ–°å»ºè¡¨ï¼›ç¼ºèšåˆå£å¾„时在对应 Biz 文件补分组查询(`AppMinuteStat.SearchGroupApp/SearchGroupTime`ã€`AppDayStat.SearchGroupApp/SearchGroupDate`ã€`TraceHourStat.SearchGroupName`ã€`AlarmRecord.SearchGroupCategory`):
| 看æ¿åŒºå— | æ•°æ®æ¥æº |
|----------|----------|
| åžå/错误/耗时 | `AppMinuteStat`(分钟èšåˆï¼Œè·¨åº”用分表åˆå¹¶ï¼‰ |
| 项目å¥åº·çŸ©é˜µã€Top 应用 | `AppMinuteStat` + `App` + `AppDayStat` |
| 实例/节点在线 | `AppOnline`ã€`NodeOnline`(`StardustData` 连接) |
| èµ„æºæ°´ä½ã€ç£ç›˜ã€è¿›ç¨‹ | `NodeData` + `Node` |
| 端点 Topã€é”™è¯¯åˆ†å¸ƒ | `TraceHourStat`(按åç§°/错误分组) |
| 告è¦ä¸Žäº‹ä»¶ | `AlarmRecord` + `AlarmGroup`(按项目归属过滤)ã€`App`/`Node` å˜æ›´ |
| ä¾èµ–拓扑 | `App` → `AppOnline` → `Node` ä¸‰çº§å…³ç³»æŽ¨å¯¼ï¼Œæ— ç‹¬ç«‹ä¾èµ–表 |
### 16.3 设计调整(以真实数æ®ä¸ºå‡†ï¼‰
原型ä¸çš„éƒ¨åˆ†æŒ‡æ ‡åœ¨çŽ°æœ‰æ•°æ®é‡Œæ²¡æœ‰å¯¹åº”å—æ®µï¼Œè½åœ°æ—¶æŒ‰ã€Œæœ‰æ•°æ®æ‰ç”»ã€æ²¡æœ‰å°±æ¢å£å¾„ã€å¤„ç†ï¼š
| 原型 | è½åœ°å𿳕 | åŽŸå› |
|------|----------|------|
| P95/P99 耗时 | 改为平å‡è€—æ—¶ + 最大耗时 | `AppMinuteStat` åªæœ‰ Cost/Avgï¼Œæ— åˆ†ä½å£å¾„ |
| 错误类型分布 | 改为错误端点分布(按接å£å分组) | æ— é”™è¯¯ç /异常类型èšåˆè¡¨ |
| 进程 Top | 改为「进程守护ã€åˆ—表(å—管进程 + 状æ€ï¼‰ | 采集侧åªä¸ŠæŠ¥å—管进程 |
| ç£ç›˜ã€Œé¢„计写满〠| 有历å²å®¹é‡æ—¶ä¼°ç®—ï¼Œæ— åˆ™ä¸æ˜¾ç¤ºè¯¥åˆ— | 多数环境åªä¸ŠæŠ¥ä¸€æ¬¡å®¹é‡ |
| æœåŠ¡æ‹“æ‰‘ | 改为「项目 → 应用 → 节点ã€éƒ¨ç½²æ‹“扑 | æ— RPC è°ƒç”¨é“¾æ•°æ® |
| 机房维度 | æ— æœºæˆ¿å—æ®µæ—¶æŒ‰é¡¹ç›®åˆ†ç»„ | `Node` æ— æœºæˆ¿å—æ®µ |
| 节点å¥åº·é›·è¾¾ | 用 CPU/内å˜/ç£ç›˜/网络/åœ¨çº¿çŽ‡åˆæˆ | æ— ç‹¬ç«‹è¯„åˆ†æºï¼ŒæŒ‰æƒé‡åˆæˆ |
| å¥åº·è¯„分å£å¾„ | 使用率 50% 以内䏿‰£åˆ†ï¼Œè¶…è¿‡åŽæ¯ç™¾åˆ†ç‚¹æ‰£ 2 分;温度 65℃ 起扣;稳定分从 60 èµ·ç®— | 线性扣分会让æ£å¸¸èŠ‚ç‚¹ï¼ˆ40%~60%)被判「较差ã€ï¼Œå¤±åŽ»å‚考æ„义 |
| 趋势尾桶 | å‰”é™¤å°šæœªèµ°å®Œçš„å½“å‰æ¡¶ | 当剿¡¶åªç§¯ç´¯äº†å‡ åç§’æ•°æ®ï¼Œæ›²çº¿æœ«ç«¯ä¼šçªç„¶è·Œåˆ° 0,看起æ¥åƒæ•…éšœ |
| 大å±è¿·ä½ 趋势 | 按 36 点分桶平å‡ï¼›èŠ‚ç‚¹åœ¨çº¿çŽ‡å–è¿‘ 24 å°æ—¶æ¯å°æ—¶é‡‡æ · | åŽŸå§‹åˆ†é’Ÿçº§æ›²çº¿åœ¨è¿·ä½ å›¾ä¸Šå™ªå£°è¿‡å¤§ |
| åº”ç”¨ã€Œæœ€è¿‘å˜æ›´ã€ | åªä¿ç•™å‘布与生命周期动作(上线/下线/注册/é‡å¯/è¶…æ—¶ç‰ï¼‰ï¼ŒåŒä¸€åŠ¨ä½œåªç•™æœ€æ–°ä¸€æ¡ | `AppHistory` 混有 WebSocketã€å¿ƒè·³ã€é‰´æƒç‰è¿è¡Œæ—¥å¿—ï¼Œç›´æŽ¥å±•ç¤ºä¼šåˆ·å± |
| 错误分布 | 环形图下方补端点图例(次数 + å æ¯”) | åŽŸåž‹åªæœ‰å›¾ï¼Œè½åœ°åŽæ— å›¾ä¾‹æ— æ³•è¯»æ•° |
### 16.4 æ•°æ®èŒƒå›´ï¼ˆä¸¥æ ¼éš”离)
- 系统角色(`Role.IsSystem`)å¯è§å…¨éƒ¨é¡¹ç›®ä¸Žæœªå½’属数æ®ï¼›
- 普通用户按 `ProjectUser` 授æƒè¡Œè¿‡æ»¤ï¼Œæ‰€æœ‰èšåˆ SQL 都带项目æ¡ä»¶ï¼›
- æ— ä»»ä½•æŽˆæƒé¡¹ç›®æ—¶æ•´é¡µç©ºæ€ï¼ˆ`Mode = none`ï¼‰ï¼Œä¸æ³„露项目å与统计;
- 项目/应用/èŠ‚ç‚¹é€‰æ‹©é¡µåŒæ ·åªåˆ—出授æƒèŒƒå›´å†…的对象。
### 16.5 实现è¦ç‚¹
- æœåŠ¡ç«¯æ¸²æŸ“ + `dashboard.js` 增强:主题三æ€ï¼ˆäº®/æš—/è·Ÿéšç³»ç»Ÿï¼‰ä¸åˆ·æ–°é¡µé¢ï¼Œåˆ‡æ¢åŽé‡ç»˜ EChartsï¼›30 秒轮询 `/Dashboard/Data` 局部刷新(401 自动回登录页);
- 设计令牌与å¡ç‰‡æ ·å¼ç›´æŽ¥å¤ç”¨æœ¬ç›®å½•çš„ `tokens.css` / `dashboard.css`,é¿å…第二套视觉;
- æ•°æ®æŸ¥è¯¢ç»Ÿä¸€èµ° `DashboardService`,带 10 秒进程内缓å˜ï¼Œé¿å…轮询打爆数æ®åº“ï¼›
- 覆盖测试:`Stardust.Tests/Dashboard/DashboardMathTests.cs`(å£å¾„与算法)+ `Stardust.E2ETests/Tests/DashboardPageTests.cs`(五个页é¢åŠ è½½ä¸Žæ•°æ®æŽ¥å£ï¼‰ã€‚
### 16.6 å¡ç‰‡ä¸‹é’»ä¸Žå¸ƒå±€ä¸ªæ€§åŒ–(2026-10-31 增强)
**下钻链接**:链接统一由 `DashboardLinks` 生æˆï¼Œé¿å…视图硬编ç 。
- KPI å¡ï¼šæ•´å¡å¯ç‚¹ï¼Œè½åˆ°å¯¹åº”列表/看æ¿ï¼›
- 图表å¡ï¼šå¡ç‰‡å¤´ã€ŒæŸ¥çœ‹æ˜Žç»†/全部ã€ï¼Œå›¾è¡¨æ•°æ®é¡¹æ”¯æŒç‚¹å‡»ä¸‹é’»ï¼›
- è¡¨æ ¼å¡ï¼šä¿ç•™è¡Œç‚¹å‡»ï¼Œæ–°å¢žé”®ç›˜å¯è¾¾ï¼ˆ`data-href` + Enter/Space);
- 事件æµï¼šå‘Šè¦ → 告è¦è¯¦æƒ…,应用/部署/节点事件 → 对应看æ¿ï¼›
- 大å±ï¼šå¡ç‰‡å¤´ã€Œè¯¦æƒ…ã€ã€é¡¹ç›®è¡Œã€Top 应用ã€äº‹ä»¶è¡Œå‡å¯ç‚¹ã€‚
é“¾æŽ¥åªæºå¸¦å®žä½“过滤æ¡ä»¶ï¼Œä¸æºå¸¦çœ‹æ¿æ—¶é—´èŒƒå›´ï¼Œé¿å…åˆ†äº«é“¾æŽ¥æ—¶æ—¶é—´çª—å£æ¼‚移。
**布局个性化**:æ¯å¼ å¡ç‰‡æœ‰ç¨³å®š `data-card` æ ‡è¯†ï¼Œé¡¶æ ã€Œå¸ƒå±€ã€æ‰“å¼€å³ä¾§æŠ½å±‰ã€‚
| 能力 | 说明 |
|------|------|
| æ˜¾éš | 按å¡ç‰‡å‹¾é€‰ï¼ŒKPI 与内容å¡å‡æ”¯æŒ |
| æŽ’åº | 上下移动或拖拽,åªåœ¨åŒä¸€ç½‘æ ¼å†…æŽ’åº |
| 宽度 | 6/8/12/16/24 æ 预设,仅 ≥1360px ç”Ÿæ•ˆï¼Œçª„å±æ²¿ç”¨åŽŸå“应å¼è§„则 |
| 高度 | æ ‡å‡†/åŠ é«˜ï¼Œå›¾è¡¨ä¸Žå¯æ»šåŠ¨è¡¨æ ¼ç”Ÿæ•ˆ |
| ä¿å˜ | `localStorage['sd-dashboard-layout:v1:<page>:<userId>']`ï¼ŒæŒ‰é¡µé¢ + 用户隔离 |
| æ¢å¤ | 抽屉内「æ¢å¤é»˜è®¤ã€æ¸…除当å‰é¡µé¢é…置并刷新 |
大å±ä¸åšå¡ç‰‡å°ºå¯¸è°ƒæ•´ï¼Œæä¾›ã€Œè§†è§’设置ã€ï¼šå‹¾é€‰å‚与轮æ’的视角ã€è½®æ’间隔(12/30/60 秒),ä¿å˜äºŽ `localStorage['sd-wallboard-settings:v1']`。
### 16.7 告è¦ç¡®è®¤ä¸Žé™é»˜ï¼ˆ2026-10-31 增强)
`AlarmRecord` æ–°å¢žä¸‰ä¸ªæ‰©å±•å—æ®µï¼š
| å—æ®µ | 说明 |
|------|------|
| `AckTime` | 确认时间 |
| `AckUser` | 确认人 |
| `SilenceTime` | é™é»˜æˆªæ¢æ—¶é—´ |
行为约定:
- **确认**ï¼šè®°å½•ç¡®è®¤äººä¸Žæ—¶é—´ï¼Œä¸æ”¹å˜ Alarming/Recovered 状æ€ï¼Œä¸å•ç‹¬åœæ¢é€šçŸ¥ï¼›
- **é™é»˜**:é™é»˜æœŸå†…ä¸å†å‘é€è¯¥æŠ¥è¦è®°å½•的外部通知,å¯é€‰ 1 å°æ—¶/24 å°æ—¶/7 å¤©ï¼›æŠ¥è¦æ¢å¤é€šçŸ¥ä»å‘é€ï¼›
- é™é»˜åªä½œç”¨äºŽå½“剿Хè¦è®°å½•ï¼›æ¢å¤åŽå†æ¬¡è§¦å‘ä¼šç”Ÿæˆæ–°è®°å½•ï¼Œéœ€é‡æ–°é™é»˜ï¼›
- æƒé™ï¼šç™»å½• + `Monitors/AlarmRecord` çš„ `PermissionFlags.Update` + 看æ¿é¡¹ç›®èŒƒå›´æ ¡éªŒï¼›
- 接å£ï¼š`POST /Dashboard/Alarm/Ack`ã€`POST /Dashboard/Alarm/Silence`,带防伪令牌;
- 通知抑制点:`RobotHelper.SendAlarmWithRecord` å‘é€å‰æ£€æŸ¥ `AlarmRecord.CanNotify`,é™é»˜æ—¶åªæ›´æ–°å†…容/æŒç»æ—¶é•¿ï¼Œä¸å¢žåŠ é€šçŸ¥æ¬¡æ•°ï¼›
- 测试:`Stardust.ServerTests/Monitors/AlarmLifecycleTests.cs` è¦†ç›–å—æ®µè½åº“ã€é€šçŸ¥åˆ¤å®šä¸Žé™é»˜æŠ‘制;`DashboardPageTests.AlarmActions_AckAndSilence` 覆盖页é¢ç¡®è®¤/é™é»˜ä¸Žè½åº“。
|