feat: 设备卡片显示系统名+版本 + 项目根 version.json

- SystemInfoCollector.platform 新增 release 字段 (内核版本)
- Sentinel 卡片每台设备显示: Linux 6.12.23 | aarch64
- 数据刷新时同步更新系统信息行
- 项目根 version.json: 本地版本清单

当前版本检测:
  UpdateService 每6h从 {repo}/raw/branch/{branch}/version.json 拉取
  对比 base_config.yaml 的 framework.version
  远程 > 本地 → 顶栏绿色按钮 + 设置页更新提示

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
qinglong
2026-06-13 20:47:22 +08:00
parent c8f2cb7b98
commit 899bef7781
7 changed files with 52 additions and 4 deletions
+3
View File
@@ -103,6 +103,7 @@ class Plugin(PluginWebMixin):
"enabled": n.get("enabled", True),
"online": c.get("online", False),
"system": c.get("system", {}),
"platform": c.get("platform", {}),
"last_seen": c.get("last_seen", 0),
"error": c.get("error", ""),
})
@@ -186,6 +187,7 @@ class Plugin(PluginWebMixin):
_NODE_CACHE[node.get("id", "")] = {
"online": online,
"system": sys_info or {},
"platform": (sys_info or {}).get("platform", {}),
"last_seen": time.time(),
"error": err if not online else "",
}
@@ -225,6 +227,7 @@ class Plugin(PluginWebMixin):
"enabled": n.get("enabled", True),
"online": c.get("online", False),
"system": c.get("system", {}),
"platform": c.get("platform", {}),
"last_seen": c.get("last_seen", 0),
"error": c.get("error", ""),
})
+12 -1
View File
@@ -47,7 +47,8 @@
.node-card.offline { border-left:3px solid var(--error, #f44336); opacity:.7 }
.node-card.flash { animation:card-flash .6s ease-out }
@keyframes card-flash { 0%{background:var(--md-sys-color-surface-container-highest)} 100%{background:var(--md-sys-color-surface-container)} }
.node-name { font-weight:600; font-size:1rem; margin-bottom:4px }
.node-name { font-weight:600; font-size:1rem; margin-bottom:2px }
.node-sys { font-size:.75rem; color:var(--text-dim); margin-bottom:4px }
.node-url { font-size:.75rem; color:var(--text-dim); margin-bottom:8px; word-break:break-all }
.node-notes { font-size:.75rem; color:var(--text-dim); font-style:italic; margin-bottom:8px }
.metric-row { display:flex; gap:12px; margin-bottom:8px }
@@ -135,8 +136,11 @@
card = document.createElement('div');
card.className = 'node-card ' + (n.online ? 'online' : 'offline');
card.setAttribute('data-id', id);
var plat = n.platform || {};
var sysInfo = (plat.system||'') + (plat.release ? ' ' + plat.release : '') + (plat.machine ? ' | ' + plat.machine : '');
card.innerHTML =
'<div class="node-name">'+(n.online?'🟢':'🔴')+' '+esc(n.name)+'</div>'+
(sysInfo.trim() ? '<div class="node-sys">'+esc(sysInfo)+'</div>' : '')+
'<div class="node-url">'+esc(n.url||'')+'</div>'+
(n.notes ? '<div class="node-notes">📝 '+esc(n.notes)+'</div>' : '')+
'<div class="metrics-body"></div>'+
@@ -148,6 +152,13 @@
// 更新状态样式
card.className = 'node-card ' + (n.online ? 'online' : 'offline');
card.querySelector('.node-name').innerHTML = (n.online?'🟢':'🔴')+' '+esc(n.name);
var sysEl = card.querySelector('.node-sys');
var plat = n.platform || {};
var sysInfo = (plat.system||'') + (plat.release ? ' ' + plat.release : '') + (plat.machine ? ' | ' + plat.machine : '');
if (sysInfo.trim()) {
if (!sysEl) { sysEl = document.createElement('div'); sysEl.className = 'node-sys'; card.insertBefore(sysEl, card.querySelector('.node-url')); }
sysEl.textContent = sysInfo;
} else if (sysEl) { sysEl.remove(); }
card.querySelector('.node-url').textContent = n.url||'';
var notesEl = card.querySelector('.node-notes');
if (n.notes) {