关键修复: 不再直读WAL活库(会撞checkpoint报malformed), 改VACUUM INTO每5分钟一致性快照; 前端数据加载失败显式提示+重试; 看板显示快照时间

This commit is contained in:
mzl92
2026-08-27 13:50:18 +08:00
parent c32348f3b2
commit 520ffb78a1
3 changed files with 41 additions and 8 deletions
+7 -2
View File
@@ -144,7 +144,11 @@ async function enter(m){
me=m;$('loginBox').classList.add('hidden');$('main').classList.remove('hidden');$('logoutBtn').classList.remove('hidden');
$('whoami').textContent=`${m.username} · ${m.role==='super'?'超管':'HR'}`;
if(m.role==='super'){$('userPanel').classList.remove('hidden');loadUsers()}
loadStats();loadList(1);
loadStats().catch(e=>dataErr(e));loadList(1).catch(e=>dataErr(e));
}
function dataErr(e){
$('statCards').innerHTML=`<div class="card" style="grid-column:1/-1"><div class="k">⚠ 数据加载失败</div><div style="font-size:14px">${esc(e.message)} <button class="btn sub small" onclick="loadStats().then(()=>loadList(1)).catch(e=>dataErr(e))">重试</button></div></div>`;
toast('数据加载失败: '+e.message);
}
async function loadStats(){
const s=await api('/api/stats');
@@ -152,7 +156,8 @@ async function loadStats(){
<div class="card"><div class="k">累计候选人</div><div class="v">${s.total}</div></div>
<div class="card"><div class="k">今日新增</div><div class="v">${s.today}</div></div>
<div class="card"><div class="k">累计打招呼</div><div class="v">${s.greetedTotal}</div></div>
${s.byLevel.map(x=>`<div class="card"><div class="k">${esc(x.k)}</div><div class="v">${x.c}</div></div>`).join('')}`;
${s.byLevel.map(x=>`<div class="card"><div class="k">${esc(x.k)}</div><div class="v">${x.c}</div></div>`).join('')}
<div class="card"><div class="k">数据快照</div><div class="v" style="font-size:16px">${s.snapshotAt?new Date(new Date(s.snapshotAt).getTime()+8*3600e3).toISOString().slice(11,19):'-'}<span style="font-size:11px;color:var(--sub)"> +8 每5分钟</span></div></div>`;
const mx=Math.max(1,...s.last7.map(d=>d.c));
$('trend').innerHTML=s.last7.map(d=>`<div class="b">
<div class="lbl">${d.c}人/${d.greeted}招呼</div>