分开上下行统计

This commit is contained in:
CN-JS-HuiBai
2026-04-05 18:06:11 +08:00
parent 9e827c9831
commit aed9147074
4 changed files with 34 additions and 12 deletions

View File

@@ -557,6 +557,23 @@ input:checked+.slider:before {
line-height: 1.2; line-height: 1.2;
} }
.stat-card-value-group {
display: flex;
align-items: baseline;
gap: 6px;
}
.stat-card-value-group .stat-card-value {
font-size: 1.3rem; /* Slightly smaller to fit two in one row */
}
.stat-card-separator {
font-size: 1rem;
color: var(--text-muted);
opacity: 0.5;
font-weight: 300;
}
.stat-card-servers .stat-card-value { .stat-card-servers .stat-card-value {
color: var(--accent-purple); color: var(--accent-purple);
} }

View File

@@ -181,9 +181,13 @@
</svg> </svg>
</div> </div>
<div class="stat-card-content"> <div class="stat-card-content">
<span class="stat-card-label">实时带宽</span> <span class="stat-card-label">实时带宽 (↑/↓)</span>
<span class="stat-card-value" id="totalBandwidth">0 B/s</span> <div class="stat-card-value-group">
<span class="stat-card-sub" id="bandwidthDetail">↓ 0 ↑ 0</span> <span class="stat-card-value" id="totalBandwidthTx">0 B/s</span>
<span class="stat-card-separator">/</span>
<span class="stat-card-value" id="totalBandwidthRx">0 B/s</span>
</div>
<span class="stat-card-sub" id="bandwidthDetail">实时期末统计</span>
</div> </div>
</div> </div>
</section> </section>
@@ -205,7 +209,7 @@
<span class="legend-item"><span class="legend-dot legend-rx"></span>接收 (RX)</span> <span class="legend-item"><span class="legend-dot legend-rx"></span>接收 (RX)</span>
<span class="legend-item"><span class="legend-dot legend-tx"></span>发送 (TX)</span> <span class="legend-item"><span class="legend-dot legend-tx"></span>发送 (TX)</span>
<span class="legend-item disabled" id="legendP95" style="cursor: pointer;" title="点击切换 P95 线显示/隐藏"> <span class="legend-item disabled" id="legendP95" style="cursor: pointer;" title="点击切换 P95 线显示/隐藏">
<span class="legend-dot legend-p95"></span>95计费 (P95) <span class="legend-dot legend-p95"></span>95计费 (上行)
</span> </span>
</div> </div>
</div> </div>
@@ -222,7 +226,7 @@
<span class="traffic-value" id="traffic24hTx">0 B</span> <span class="traffic-value" id="traffic24hTx">0 B</span>
</div> </div>
<div class="traffic-stat traffic-stat-p95"> <div class="traffic-stat traffic-stat-p95">
<span class="traffic-label">95计费带宽</span> <span class="traffic-label">95计费 (上行)</span>
<span class="traffic-value" id="trafficP95">0 B/s</span> <span class="traffic-value" id="trafficP95">0 B/s</span>
</div> </div>
<div class="traffic-stat traffic-stat-total"> <div class="traffic-stat traffic-stat-total">

View File

@@ -19,7 +19,8 @@
memDetail: document.getElementById('memDetail'), memDetail: document.getElementById('memDetail'),
diskPercent: document.getElementById('diskPercent'), diskPercent: document.getElementById('diskPercent'),
diskDetail: document.getElementById('diskDetail'), diskDetail: document.getElementById('diskDetail'),
totalBandwidth: document.getElementById('totalBandwidth'), totalBandwidthTx: document.getElementById('totalBandwidthTx'),
totalBandwidthRx: document.getElementById('totalBandwidthRx'),
bandwidthDetail: document.getElementById('bandwidthDetail'), bandwidthDetail: document.getElementById('bandwidthDetail'),
traffic24hRx: document.getElementById('traffic24hRx'), traffic24hRx: document.getElementById('traffic24hRx'),
traffic24hTx: document.getElementById('traffic24hTx'), traffic24hTx: document.getElementById('traffic24hTx'),
@@ -570,8 +571,9 @@
dom.diskDetail.textContent = `${formatBytes(data.disk.used)}/${formatBytes(data.disk.total)}`; dom.diskDetail.textContent = `${formatBytes(data.disk.used)}/${formatBytes(data.disk.total)}`;
// Bandwidth // Bandwidth
dom.totalBandwidth.textContent = formatBandwidth(data.network.total || 0); dom.totalBandwidthTx.textContent = formatBandwidth(data.network.tx || 0);
dom.bandwidthDetail.textContent = `${formatBandwidth(data.network.rx)}${formatBandwidth(data.network.tx)}`; dom.totalBandwidthRx.textContent = formatBandwidth(data.network.rx || 0);
dom.bandwidthDetail.textContent = `当前实时数据聚合`;
// 24h traffic // 24h traffic
dom.traffic24hRx.textContent = formatBytes(data.traffic24h.rx); dom.traffic24hRx.textContent = formatBytes(data.traffic24h.rx);
@@ -586,7 +588,7 @@
// Flash animation // Flash animation
if (previousMetrics) { if (previousMetrics) {
[dom.cpuPercent, dom.memPercent, dom.diskPercent, dom.totalBandwidth].forEach(el => { [dom.cpuPercent, dom.memPercent, dom.diskPercent, dom.totalBandwidthTx, dom.totalBandwidthRx].forEach(el => {
el.classList.remove('value-update'); el.classList.remove('value-update');
void el.offsetWidth; // Force reflow void el.offsetWidth; // Force reflow
el.classList.add('value-update'); el.classList.add('value-update');

View File

@@ -49,9 +49,8 @@ class AreaChart {
} }
// Calculate P95 (95th percentile) // Calculate P95 (95th percentile)
// Common standard: 95th percentile of the peak (max of rx/tx or sum) // Updated: Only count Upstream (TX) as requested
// We'll use max(rx, tx) at each point which is common for billing const combined = data.tx.map(t => t || 0);
const combined = data.rx.map((r, i) => Math.max(r || 0, data.tx[i] || 0));
if (combined.length > 0) { if (combined.length > 0) {
const sorted = [...combined].sort((a, b) => a - b); const sorted = [...combined].sort((a, b) => a - b);
const p95Idx = Math.floor(sorted.length * 0.95); const p95Idx = Math.floor(sorted.length * 0.95);