顶栏任务状态灯: hr1/hr2四态(运行中/已收工/异常/今日未运行+聊天剩余), 只读挂载runner状态目录

This commit is contained in:
mzl92
2026-08-27 17:17:06 +08:00
parent 896795462a
commit e3cdadab88
4 changed files with 47 additions and 0 deletions
+22
View File
@@ -10,6 +10,14 @@
body{font:14px/1.6 -apple-system,"Segoe UI","Microsoft YaHei",sans-serif;background:var(--bg);color:var(--txt)}
.topbar{background:#1e293b;color:#fff;padding:0 20px;height:52px;display:flex;align-items:center;gap:16px}
.topbar b{font-size:16px}.topbar .sp{flex:1}
.taskStatus{display:flex;gap:8px;align-items:center}
.tchip{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:12px;font-size:12px;background:rgba(255,255,255,.08);color:#cbd5e1}
.tchip .dot{width:8px;height:8px;border-radius:50%;background:#94a3b8}
.tchip.running .dot{background:#22c55e;animation:pulse 1.5s infinite}
.tchip.done .dot{background:#10b981}
.tchip.error .dot{background:#ef4444;animation:pulse 1s infinite}
.tchip.error{color:#fca5a5}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}
.topbar button{background:transparent;color:#cbd5e1;border:1px solid #475569;border-radius:6px;padding:4px 12px;cursor:pointer}
.topbar button:hover{color:#fff;border-color:#94a3b8}
.wrap{max-width:1200px;margin:20px auto;padding:0 16px}
@@ -109,6 +117,7 @@ tr.today:hover td{background:#fde68a!important}
<body>
<div class="topbar">
<b>📋 招聘数据后台</b><span id="whoami" style="color:#94a3b8;font-size:12px"></span>
<span class="taskStatus" id="taskStatus"></span>
<span class="sp"></span>
<button id="rulesBtn" class="hidden" onclick="openRulesModal()">筛选规则</button>
<button id="userMgrBtn" class="hidden" onclick="openUserModal()">账号管理</button>
@@ -275,7 +284,20 @@ async function enter(m){
$('rulesBtn').classList.remove('hidden');
if(m.role==='super'){$('userMgrBtn').classList.remove('hidden');$('accessLogBtn').classList.remove('hidden')}
loadStats().catch(e=>dataErr(e));loadList(1).catch(e=>dataErr(e));
refreshTaskStatus();
}
// ---------- 任务状态灯 ----------
async function refreshTaskStatus(){
try{
const s=await api('/api/task-status');
$('taskStatus').innerHTML=['hr1','hr2'].map(a=>{
const t=s[a]||{state:'idle',text:'今日未运行'};
const extra=t.chatLeft!=null?`·剩${t.chatLeft}次`:'';
return `<span class="tchip ${t.state}" title="${a}"><span class="dot"></span>${a} ${t.text}${extra}</span>`;
}).join('');
}catch(_){}
}
setInterval(refreshTaskStatus,60000);
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);