feat(channel-monitor): redesign user dashboard as card grid

Reference check-cx UI: INTELLIGENCE MONITOR hero + 3-column card grid
with 60-point timeline bars.

Backend:
- Add PrimaryPingLatencyMs + Timeline[60] to UserMonitorView
- ListRecentHistoryForMonitors: batch CTE + ROW_NUMBER() window query
- indexLatestByModel / indexAvailabilityByModel helpers

Frontend:
- 7 new components: ProviderIcon, MonitorMetricPair, MonitorAvailabilityRow,
  MonitorTimeline, MonitorHero, MonitorCard, MonitorCardGrid
- ChannelStatusView 381→~180 lines (delegated to subcomponents)
- AbortController reload concurrency protection
- HSL 0-120° availability color mapping
- Replace emoji with Icon component (bolt / globe)
- i18n: monitorCommon.* shared namespace, channelStatus.hero.*

Bump VERSION to 0.1.114.24
This commit is contained in:
erio
2026-04-20 23:38:59 +08:00
parent 20a4e41872
commit a1425b457d
19 changed files with 1134 additions and 278 deletions

View File

@@ -867,7 +867,22 @@ export default {
},
extraModelsHeader: 'Extra Models',
extraModelsEmpty: 'No extra models',
latencyEmpty: '-'
latencyEmpty: '-',
availabilityPrefix: 'Availability',
dialogLatency: 'Dialog Latency',
endpointPing: 'Endpoint PING',
history60pts: 'HISTORY ({n} PTS)',
nextUpdateIn: 'NEXT UPDATE IN {n}s',
past: 'PAST',
now: 'NOW',
maintenancePaused: 'Maintenance · timeline paused',
extraModelsCount: '+ {n} models',
pollEvery: '{n}s polling',
updatedAt: 'Updated {time}',
relativeSecondsAgo: '{n}s ago',
relativeMinutesAgo: '{n}m ago',
relativeHoursAgo: '{n}h ago',
relativeDaysAgo: '{n}d ago'
},
// Channel Status (user-facing read-only view)
@@ -880,6 +895,22 @@ export default {
detailLoadError: 'Failed to load channel detail',
detailTitle: 'Channel Detail',
closeDetail: 'Close',
hero: {
breadcrumb: 'CHANNEL · STATUS',
title: 'INTELLIGENCE MONITOR',
subtitleZh: 'Real-time tracking of availability, latency and status for leading AI endpoints.',
subtitleEn: 'Advanced performance metrics for next-gen intelligence.'
},
windowTab: {
'7d': '7 days',
'15d': '15 days',
'30d': '30 days'
},
overall: {
operational: 'OPERATIONAL',
degraded: 'DEGRADED',
unavailable: 'UNAVAILABLE'
},
columns: {
name: 'Name',
provider: 'Provider',

View File

@@ -871,7 +871,22 @@ export default {
},
extraModelsHeader: '附加模型',
extraModelsEmpty: '无附加模型',
latencyEmpty: '-'
latencyEmpty: '-',
availabilityPrefix: '可用性',
dialogLatency: '对话延迟',
endpointPing: '端点 PING',
history60pts: '近 {n} 次记录',
nextUpdateIn: '{n}s 后刷新',
past: 'PAST',
now: 'NOW',
maintenancePaused: '维护中 · 已暂停时间线采集',
extraModelsCount: '+ {n} 模型',
pollEvery: '{n}s 轮询',
updatedAt: '更新于 {time}',
relativeSecondsAgo: '{n} 秒前',
relativeMinutesAgo: '{n} 分钟前',
relativeHoursAgo: '{n} 小时前',
relativeDaysAgo: '{n} 天前'
},
// Channel Status (user-facing read-only view)
@@ -884,6 +899,22 @@ export default {
detailLoadError: '加载渠道详情失败',
detailTitle: '渠道详情',
closeDetail: '关闭',
hero: {
breadcrumb: '渠道 · 状态',
title: 'INTELLIGENCE MONITOR',
subtitleZh: '实时追踪各大 AI 模型对话接口的可用性、延迟与官方服务状态。',
subtitleEn: 'Advanced performance metrics for next-gen intelligence.'
},
windowTab: {
'7d': '7 天',
'15d': '15 天',
'30d': '30 天'
},
overall: {
operational: 'OPERATIONAL',
degraded: 'DEGRADED',
unavailable: 'UNAVAILABLE'
},
columns: {
name: '名称',
provider: '供应商',