Collapse dashboard server status into top bar and include .env in backup restore.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -25,6 +25,48 @@
|
||||
font-size: 0.78rem;
|
||||
}
|
||||
|
||||
.dash-server-compact {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.35rem 0.45rem;
|
||||
max-width: 100%;
|
||||
padding: 0.28rem 0.55rem;
|
||||
border: 1px solid rgba(255, 255, 255, 0.08);
|
||||
border-radius: 999px;
|
||||
background: rgba(0, 0, 0, 0.22);
|
||||
color: var(--text-title);
|
||||
font-size: 0.76rem;
|
||||
line-height: 1.35;
|
||||
cursor: pointer;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.dash-server-compact:hover {
|
||||
border-color: rgba(76, 217, 127, 0.35);
|
||||
}
|
||||
|
||||
.dash-server-compact[aria-expanded="true"] .dash-toggle-icon {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.dash-server-compact-label {
|
||||
font-weight: 600;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.dash-server-summary {
|
||||
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
||||
font-size: 0.72rem;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.dash-server-compact .dash-toggle-icon {
|
||||
font-size: 0.62rem;
|
||||
opacity: 0.75;
|
||||
transition: transform 0.2s ease;
|
||||
}
|
||||
|
||||
.dashboard-account-card {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
@@ -46,6 +88,10 @@
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.dashboard-server-card[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.dash-server-head {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
|
||||
@@ -41,6 +41,9 @@
|
||||
var serverDiskSubEl = document.getElementById('dash-server-disk-sub');
|
||||
var serverNetUpEl = document.getElementById('dash-server-net-up');
|
||||
var serverNetDownEl = document.getElementById('dash-server-net-down');
|
||||
var serverCardEl = document.getElementById('dash-server-card');
|
||||
var serverToggleEl = document.getElementById('dash-server-toggle');
|
||||
var serverSummaryEl = document.getElementById('dash-server-summary');
|
||||
|
||||
var pollTimer = null;
|
||||
var pollInFlight = false;
|
||||
@@ -78,6 +81,30 @@
|
||||
riskToggleEl.setAttribute('aria-expanded', expanded ? 'true' : 'false');
|
||||
}
|
||||
|
||||
function initServerToggle() {
|
||||
if (!serverCardEl || !serverToggleEl) return;
|
||||
serverCardEl.hidden = true;
|
||||
serverToggleEl.setAttribute('aria-expanded', 'false');
|
||||
function toggleServer() {
|
||||
var expanded = serverCardEl.hidden;
|
||||
serverCardEl.hidden = !expanded;
|
||||
serverToggleEl.setAttribute('aria-expanded', expanded ? 'true' : 'false');
|
||||
}
|
||||
serverToggleEl.addEventListener('click', toggleServer);
|
||||
}
|
||||
|
||||
function buildServerSummary(server) {
|
||||
if (!server) return '—';
|
||||
var parts = [];
|
||||
if (server.hostname) parts.push(server.hostname);
|
||||
if (server.public_ip) parts.push('外网 ' + server.public_ip);
|
||||
if (server.private_ip) parts.push('内网 ' + server.private_ip);
|
||||
if (server.cpu_pct != null) parts.push('CPU ' + server.cpu_pct + '%');
|
||||
if (server.memory_pct != null) parts.push('内存 ' + server.memory_pct + '%');
|
||||
if (server.disk_pct != null) parts.push('硬盘 ' + server.disk_pct + '%');
|
||||
return parts.length ? parts.join(' · ') : '—';
|
||||
}
|
||||
|
||||
function initRiskToggle() {
|
||||
if (!riskCardEl || !riskToggleEl) return;
|
||||
if (shouldCollapseRiskDefault()) {
|
||||
@@ -524,6 +551,7 @@
|
||||
|
||||
function applyServer(server) {
|
||||
if (!server) return;
|
||||
if (serverSummaryEl) serverSummaryEl.textContent = buildServerSummary(server);
|
||||
if (serverHostEl) serverHostEl.textContent = server.hostname || '—';
|
||||
if (serverUptimeEl) {
|
||||
serverUptimeEl.textContent = server.uptime_label
|
||||
@@ -1102,6 +1130,7 @@
|
||||
|
||||
startPolling();
|
||||
connectPositionStream();
|
||||
initServerToggle();
|
||||
initRiskToggle();
|
||||
initDetailModal();
|
||||
initMobileLists();
|
||||
|
||||
@@ -11,33 +11,20 @@
|
||||
<div class="dashboard-top-left">
|
||||
<span class="badge planned" id="dash-mode-badge">—</span>
|
||||
<span class="badge planned" id="dash-ctp-badge">CTP 检测中…</span>
|
||||
<button type="button" class="dash-server-compact" id="dash-server-toggle" aria-expanded="false" aria-controls="dash-server-card">
|
||||
<span class="dash-server-dot" aria-hidden="true"></span>
|
||||
<span class="dash-server-compact-label">服务器状态</span>
|
||||
<span class="dash-server-summary text-muted" id="dash-server-summary">—</span>
|
||||
<span class="dash-toggle-icon" aria-hidden="true">▼</span>
|
||||
</button>
|
||||
<span class="text-muted dash-updated" id="dash-updated">正在加载…</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card dashboard-account-card">
|
||||
<div class="stat-grid stat-grid-summary dashboard-account-grid">
|
||||
<div class="stat-item">
|
||||
<div class="label">账户权益</div>
|
||||
<div class="value" id="dash-equity">—</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="label">占用保证金</div>
|
||||
<div class="value" id="dash-margin">—</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="label">可用权益</div>
|
||||
<div class="value" id="dash-available">—</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card dashboard-section dashboard-server-card" id="dash-server-card">
|
||||
<div class="card dashboard-section dashboard-server-card" id="dash-server-card" hidden>
|
||||
<div class="dash-server-head">
|
||||
<div class="dash-server-title">
|
||||
<span class="dash-server-dot" aria-hidden="true"></span>
|
||||
<span>服务器状态</span>
|
||||
<span class="dash-server-host text-muted" id="dash-server-host">—</span>
|
||||
<span class="dash-server-host" id="dash-server-host">—</span>
|
||||
</div>
|
||||
<div class="dash-server-head-meta text-muted">
|
||||
<span id="dash-server-uptime"></span>
|
||||
@@ -92,6 +79,23 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card dashboard-account-card">
|
||||
<div class="stat-grid stat-grid-summary dashboard-account-grid">
|
||||
<div class="stat-item">
|
||||
<div class="label">账户权益</div>
|
||||
<div class="value" id="dash-equity">—</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="label">占用保证金</div>
|
||||
<div class="value" id="dash-margin">—</div>
|
||||
</div>
|
||||
<div class="stat-item">
|
||||
<div class="label">可用权益</div>
|
||||
<div class="value" id="dash-available">—</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card dashboard-section dashboard-risk-card" id="dash-risk-card">
|
||||
<h2 class="dashboard-risk-heading dash-section-toggle" id="dash-risk-toggle" role="button" tabindex="0" aria-expanded="false" aria-controls="dash-risk-body">
|
||||
<span class="dash-section-toggle-label">风控说明</span>
|
||||
|
||||
@@ -535,7 +535,7 @@
|
||||
<button type="submit" class="btn-primary" {% if backup_running %}disabled{% endif %}>立即备份</button>
|
||||
</form>
|
||||
</div>
|
||||
<p class="hint" style="margin:.5rem 0 0">备份含 <code>futures.db</code>、<code>uploads/</code>,默认恢复至 <code>{{ backup_restore_dir }}</code>。</p>
|
||||
<p class="hint" style="margin:.5rem 0 0">备份含 <code>futures.db</code>、<code>uploads/</code>、<code>.env</code>,默认恢复至 <code>{{ backup_restore_dir }}</code>。</p>
|
||||
|
||||
{% if backup_items %}
|
||||
<table class="settings-backup-table">
|
||||
@@ -564,7 +564,7 @@
|
||||
<li>解压:<code>tar -xzf qihuo_backup_*.tar.gz</code></li>
|
||||
<li>执行:<code>chmod +x restore.sh && ./restore.sh</code></li>
|
||||
<li>指定目录:<code>RESTORE_DIR=/opt/qihuo ./restore.sh</code></li>
|
||||
<li>部署代码、配置 <code>.env</code> 后重启服务。</li>
|
||||
<li>恢复脚本会自动还原数据库、<code>uploads/</code> 与 <code>.env</code>,然后重启服务。</li>
|
||||
</ol>
|
||||
</details>
|
||||
{% endcall %}
|
||||
|
||||
Reference in New Issue
Block a user