mirror of
https://github.com//cppla/ServerStatus
synced 2026-08-06 11:13:56 +08:00
+4
-2
@@ -346,10 +346,12 @@ table.data tbody tr[class*="os-"]:hover{background:linear-gradient(180deg, color
|
||||
.segmented button{height:36px;border:0;border-right:1px solid var(--border);background:transparent;color:var(--text-dim);padding:0 .8rem;cursor:pointer}
|
||||
.segmented button:last-child{border-right:0}
|
||||
.segmented button.active,.segmented button:hover{background:var(--accent);color:#fff}
|
||||
.icon-text,.primary-btn,.danger-btn{height:36px;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--text);padding:0 .75rem;cursor:pointer;transition:var(--trans);font-weight:600}
|
||||
.icon-text,.primary-btn,.warn-btn,.danger-btn{height:36px;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--text);padding:0 .75rem;cursor:pointer;transition:var(--trans);font-weight:600}
|
||||
.icon-text:hover{border-color:var(--accent);color:var(--accent)}
|
||||
.primary-btn{background:var(--accent);border-color:var(--accent);color:#fff}
|
||||
.primary-btn:hover{filter:brightness(1.08)}
|
||||
.warn-btn{background:rgba(245,158,11,.14);border-color:rgba(245,158,11,.42);color:var(--warn)}
|
||||
.warn-btn:hover{background:var(--warn);border-color:var(--warn);color:#111827}
|
||||
.danger-btn{background:rgba(239,68,68,.14);border-color:rgba(239,68,68,.38);color:var(--danger)}
|
||||
.danger-btn:hover{background:var(--danger);color:#fff}
|
||||
th[data-sort]{cursor:pointer;user-select:none}
|
||||
@@ -434,7 +436,7 @@ th[data-sort].sorted-desc:after{border-top-color:var(--accent);opacity:1}
|
||||
}
|
||||
@media (max-width:640px){
|
||||
.ops-toolbar{align-items:stretch}
|
||||
.search-field,.select-field,.search-field input,.select-field select,.segmented,.icon-text,.primary-btn,.danger-btn{width:100%}
|
||||
.search-field,.select-field,.search-field input,.select-field select,.segmented,.icon-text,.primary-btn,.warn-btn,.danger-btn{width:100%}
|
||||
.segmented button{flex:1;padding:0 .35rem}
|
||||
.section-head{flex-direction:column}
|
||||
.section-actions{width:100%;justify-content:stretch}
|
||||
|
||||
+3
-2
@@ -6,7 +6,7 @@
|
||||
<meta name="description" content="云监控,ServerStatus中文版,ServerStatus,ServerStatus cppla" />
|
||||
<title>云监控</title>
|
||||
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
|
||||
<link rel="stylesheet" href="css/app.css?v=20260702-1" />
|
||||
<link rel="stylesheet" href="css/app.css?v=20260706-1" />
|
||||
</head>
|
||||
<body>
|
||||
<header class="topbar">
|
||||
@@ -177,6 +177,7 @@
|
||||
<div id="configFields" class="config-fields"></div>
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="primary-btn">保存配置</button>
|
||||
<button type="button" id="resetTrafficBtn" class="warn-btn" style="display:none;">重置月流量</button>
|
||||
<button type="button" id="deleteConfigItemBtn" class="danger-btn">删除配置</button>
|
||||
<button type="button" id="resetConfigFormBtn" class="icon-text">清空</button>
|
||||
</div>
|
||||
@@ -199,6 +200,6 @@
|
||||
<a href="https://github.com/cppla/ServerStatus" target="_blank" rel="noopener">ServerStatus中文版</a>
|
||||
</footer>
|
||||
|
||||
<script src="js/app.js?v=20260630-7" defer></script>
|
||||
<script src="js/app.js?v=20260706-1" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -737,6 +737,10 @@ function renderConfigEditor(item){
|
||||
$('configEditorTitle').textContent = `${editing ? '编辑' : '新增'}${def.label}`;
|
||||
$('configEditorHint').textContent = def.hint;
|
||||
$('configFields').innerHTML = def.fields.map(field => fieldHTML(field, current)).join('');
|
||||
const resetTrafficBtn = $('resetTrafficBtn');
|
||||
const canResetTraffic = editing && S.admin.selectedType === 'servers';
|
||||
resetTrafficBtn.style.display = canResetTraffic ? '' : 'none';
|
||||
resetTrafficBtn.disabled = !canResetTraffic || S.admin.saving;
|
||||
$('deleteConfigItemBtn').disabled = !editing;
|
||||
}
|
||||
function fieldHTML(field, item){
|
||||
@@ -810,6 +814,28 @@ async function deleteConfigItem(key, index){
|
||||
S.admin.saving = false;
|
||||
}
|
||||
}
|
||||
async function resetServerTraffic(index){
|
||||
const server = configItems()[index];
|
||||
if(!server) return setAdminStatus('请先选择要重置月流量的节点。', 'err');
|
||||
const title = server.name || server.username || '未命名节点';
|
||||
if(!confirm(`将节点 ${title} 的月流量重置为 0?该操作会重启采集服务以写入当前流量基准。`)) return;
|
||||
S.admin.saving = true;
|
||||
S.suppressStatsReloadUntil = Date.now() + 10000;
|
||||
renderConfigEditor(server);
|
||||
try{
|
||||
const data = await api(`/api/servers/${encodeURIComponent(server.username)}/reset-traffic`, { method:'POST' });
|
||||
const beforeIn = humanMinMBFromB(data.stats?.month_in_before || 0);
|
||||
const beforeOut = humanMinMBFromB(data.stats?.month_out_before || 0);
|
||||
setAdminStatus(`${title} 月流量已重置为 0(重置前 ↓${beforeIn} / ↑${beforeOut})。`, 'ok');
|
||||
setTimeout(fetchData, 1500);
|
||||
}catch(err){
|
||||
setAdminStatus('重置月流量失败:' + err.message, 'err');
|
||||
}finally{
|
||||
S.admin.saving = false;
|
||||
S.suppressStatsReloadUntil = Date.now() + 8000;
|
||||
renderConfigEditor(configItems()[S.admin.selectedIndex]);
|
||||
}
|
||||
}
|
||||
function bindAdmin(){
|
||||
$('adminToken').value = S.admin.token;
|
||||
$('adminTokenForm').addEventListener('submit', async e => {
|
||||
@@ -828,6 +854,7 @@ function bindAdmin(){
|
||||
});
|
||||
$('addConfigItemBtn').addEventListener('click', clearConfigForm);
|
||||
$('resetConfigFormBtn').addEventListener('click', clearConfigForm);
|
||||
$('resetTrafficBtn').addEventListener('click', () => resetServerTraffic(S.admin.selectedIndex));
|
||||
$('adminReload').addEventListener('click', async () => {
|
||||
try{ await api('/api/reload', { method:'POST' }); setAdminStatus('配置重载已触发。', 'ok'); }
|
||||
catch(err){ setAdminStatus('重载失败:' + err.message, 'err'); }
|
||||
|
||||
Reference in New Issue
Block a user