fix: Sentinel 横版 — 完全移除 MiniChart, 纯文本数值展示

This commit is contained in:
qinglong
2026-06-13 22:19:47 +08:00
parent 5628f5d288
commit 06d5bf8071
+12 -37
View File
@@ -86,7 +86,6 @@
// 确保 chart.js 已加载 (SPA 导航时可能未加载) // 确保 chart.js 已加载 (SPA 导航时可能未加载)
var pollTimer = null; var pollTimer = null;
var _chartInstances = {};
var editingId = null; var editingId = null;
var _layoutMode = 'grid'; // 'grid' | 'row' var _layoutMode = 'grid'; // 'grid' | 'row'
@@ -95,7 +94,6 @@
var btn = document.getElementById("btn-layout"); var btn = document.getElementById("btn-layout");
var grid = document.getElementById("sentinel-grid"); var grid = document.getElementById("sentinel-grid");
// 销毁旧图表 // 销毁旧图表
_chartInstances = {};
_cardCache = {}; _cardCache = {};
_firstRender = true; _firstRender = true;
grid.innerHTML = '<div class="card" style="text-align:center;padding:24px;color:var(--text-dim)">加载中...</div>'; grid.innerHTML = '<div class="card" style="text-align:center;padding:24px;color:var(--text-dim)">加载中...</div>';
@@ -184,29 +182,17 @@
'</div>'+ '</div>'+
'<div class="card-mid">'+ '<div class="card-mid">'+
'<div class="metrics-body">'+ '<div class="metrics-body">'+
'<div style="display:flex;flex-wrap:wrap;gap:12px">'+ '<div class="metric-row">'+
'<div class="chart-box"><canvas class="chart-cpu" width="200" height="60"></canvas></div>'+ '<div class="metric"><div class="metric-label">CPU</div><div class="metric-value cpu-val" style="font-size:1.3rem">0%</div></div>'+
'<div class="chart-box"><canvas class="chart-mem" width="200" height="60"></canvas></div>'+ '<div class="metric"><div class="metric-label">MEM</div><div class="metric-value mem-val" style="font-size:1.3rem">0%</div><div class="mem-detail-val" style="font-size:.65rem;color:var(--text-dim)"></div></div>'+
'<div class="chart-box"><canvas class="chart-net" width="200" height="60"></canvas></div>'+ '<div class="metric"><div class="metric-label">NET ↓</div><div class="metric-value net-down" style="font-size:1rem"></div></div>'+
'</div>'+ '<div class="metric"><div class="metric-label">NET ↑</div><div class="metric-value net-up" style="font-size:1rem"></div></div>'+
'<div class="metric-row" style="margin-top:4px">'+
'<div class="metric"><span class="metric-label">CPU</span> <span class="metric-value cpu-val" style="font-size:.9rem">0%</span></div>'+
'<div class="metric"><span class="metric-label">MEM</span> <span class="metric-value mem-val" style="font-size:.9rem">0%</span></div>'+
'<div class="metric"><span class="mem-detail-val" style="font-size:.65rem;color:var(--text-dim)"></span></div>'+
'</div>'+ '</div>'+
'</div>'+ '</div>'+
'</div>'+ '</div>'+
'<div class="card-right">'+ '<div class="card-right">'+
'<div class="node-time"></div>'+ '<div class="node-time"></div>'+
'</div>'; '</div>';
if (typeof MiniChart !== 'undefined') {
var body = card.querySelector('.metrics-body');
_chartInstances[id] = [
new MiniChart(body.querySelector('.chart-cpu'), '#7aa2f7'),
new MiniChart(body.querySelector('.chart-mem'), '#9ece6a'),
new MiniChart(body.querySelector('.chart-net'), '#e0af68'),
];
}
} else { } else {
card.innerHTML = card.innerHTML =
'<div class="node-name">'+(n.online?'🟢':'🔴')+' '+esc(n.name)+'</div>'+ '<div class="node-name">'+(n.online?'🟢':'🔴')+' '+esc(n.name)+'</div>'+
@@ -238,21 +224,12 @@
if (!body) return; if (!body) return;
if (isRow) { if (isRow) {
// 更新图表 body.querySelector('.net-down').textContent = fmtSpeed(net.rx_bytes_sec||0);
var charts = _chartInstances[id]; body.querySelector('.net-up').textContent = fmtSpeed(net.tx_bytes_sec||0);
if (charts && charts[0]) { var md3 = body.querySelector('.mem-detail-val');
charts[0].update(cpuVal); if (md3) md3.textContent = (mem.used_gb||0).toFixed(1) + '/' + (mem.total_gb||0).toFixed(1) + ' GB';
charts[1].update(memVal); animateValue(body.querySelector('.cpu-val'), oldCpu, cpuVal, 1, '%');
charts[2].update(net.rx_bytes_sec||0); animateValue(body.querySelector('.mem-val'), oldMem, memVal, 1, '%');
}
// 更新数值
var ce = body.querySelector('.cpu-val');
var me = body.querySelector('.mem-val');
var md = body.querySelector('.mem-detail-val');
if (ce) ce.textContent = cpuVal.toFixed(1) + '%';
if (me) me.textContent = memVal.toFixed(1) + '%';
if (md) md.textContent = 'NET ↓'+fmtSpeed(net.rx_bytes_sec||0)+' ↑'+fmtSpeed(net.tx_bytes_sec||0);
// 右边数值
var right = card.querySelector('.card-right'); var right = card.querySelector('.card-right');
if (right) right.innerHTML = if (right) right.innerHTML =
'<div style="font-size:1.1rem;font-weight:600">CPU '+(cpuVal).toFixed(1)+'%</div>'+ '<div style="font-size:1.1rem;font-weight:600">CPU '+(cpuVal).toFixed(1)+'%</div>'+
@@ -260,9 +237,7 @@
'<div style="font-size:.7rem;color:var(--text-dim);margin-top:4px">'+(mem.used_gb||0).toFixed(1)+'/'+(mem.total_gb||0).toFixed(1)+' GB</div>'+ '<div style="font-size:.7rem;color:var(--text-dim);margin-top:4px">'+(mem.used_gb||0).toFixed(1)+'/'+(mem.total_gb||0).toFixed(1)+' GB</div>'+
'<div style="font-size:.75rem;color:var(--text-dim);margin-top:8px">↓ '+fmtSpeed(net.rx_bytes_sec||0)+'</div>'+ '<div style="font-size:.75rem;color:var(--text-dim);margin-top:8px">↓ '+fmtSpeed(net.rx_bytes_sec||0)+'</div>'+
'<div style="font-size:.75rem;color:var(--text-dim)">↑ '+fmtSpeed(net.tx_bytes_sec||0)+'</div>'; '<div style="font-size:.75rem;color:var(--text-dim)">↑ '+fmtSpeed(net.tx_bytes_sec||0)+'</div>';
// 时间 card.querySelector('.node-time').innerHTML = '<div style="font-size:.7rem;color:var(--text-dim);margin-top:8px">'+(n.last_seen ? new Date(n.last_seen*1000).toLocaleTimeString() : '—')+'</div>';
var timeEl = card.querySelector('.node-time');
if (timeEl) timeEl.innerHTML = '<div style="font-size:.7rem;color:var(--text-dim);margin-top:8px">'+(n.last_seen ? new Date(n.last_seen*1000).toLocaleTimeString() : '—')+'</div>';
} else { } else {
// 网格模式 // 网格模式
var oldCpu = parseFloat(body.getAttribute('data-cpu')||cpuVal); var oldCpu = parseFloat(body.getAttribute('data-cpu')||cpuVal);