1. CPU 显示修复: - routes/admin_api/core.py: 新增 _get_server_cpu_percent() - 首次调用使用 interval=0.1 避免返回 0.0 - 后续调用使用缓存,TTL 1秒 2. 报表面板浏览器池状态: - admin-frontend/src/api/browser_pool.js: 新增 API 调用 - ReportPage.vue: 添加浏览器池状态卡片 - 显示总/活跃/空闲 Worker 数和队列等待数 - Worker 表格带状态颜色标签(活跃/空闲/异常) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2 lines
21 KiB
JavaScript
2 lines
21 KiB
JavaScript
import{a as ze,_ as Me,i as ae,r as y,c as u,u as We,b as Ae,t as ie,k as Be,s as Ne,l as Le,d as Ve,o as Ie,e as Ue,f as m,g,h as _,j as e,m as l,n as P,p as t,w as a,q as d,F as j,v as De,x as W,y as Ee,z as Fe,A as $e,B as z,C as je,D as ne,E as Ge,G as He,H as Qe}from"./index-B9zsNTKQ.js";import{f as Ze}from"./email-JmyL2jV4.js";import{f as Je,a as Ke,b as Oe,c as Xe}from"./tasks-DILta43B.js";import{f as Ye}from"./system-DIc9L1cQ.js";async function es(){const{data:G}=await ze.get("/browser_pool/stats");return G}const ss={class:"page-stack"},ts={class:"hero"},ls={class:"hero-top"},as={class:"hero-title"},is={class:"hero-meta app-muted"},ns={key:0},os={key:1,class:"hero-dot"},ds={key:2},us={class:"hero-actions"},rs={class:"kpi-grid"},cs={class:"kpi-icon"},vs={class:"kpi-body"},_s={class:"kpi-value"},ps={class:"kpi-label"},fs={key:0,class:"kpi-sub app-muted"},ms={class:"panel-head"},hs={class:"head-left"},gs={class:"head-icon tone-purple"},bs={class:"head-text"},ks={class:"panel-sub app-muted"},ys={class:"tile-section"},ws={class:"tile-grid"},xs={class:"tile"},Ss={class:"tile-v"},Cs={class:"tile"},Ps={class:"tile-v ok"},Ts={class:"tile"},Rs={class:"tile-v err"},qs={class:"tile"},zs={class:"tile-v"},Ms={class:"tile"},Ws={class:"tile-v"},As={class:"tile-section"},Bs={class:"tile-grid"},Ns={class:"tile"},Ls={class:"tile-v"},Vs={class:"tile"},Is={class:"tile-v ok"},Us={class:"tile"},Ds={class:"tile-v err"},Es={class:"tile"},Fs={class:"tile-v"},$s={class:"tile"},js={class:"tile-v"},Gs={class:"panel-head"},Hs={class:"head-left"},Qs={class:"head-icon tone-blue"},Zs={class:"head-text"},Js={class:"panel-sub app-muted"},Ks={class:"tab-label"},Os={class:"table-wrap"},Xs={key:0,class:"help app-muted"},Ys={class:"tab-label"},et={class:"table-wrap"},st={key:0,class:"help app-muted"},tt={class:"panel-head"},lt={class:"head-left"},at={class:"head-icon tone-cyan"},it={class:"head-text"},nt={class:"panel-sub app-muted"},ot={class:"tile-grid tile-grid--3"},dt={class:"tile"},ut={class:"tile-v"},rt={class:"tile"},ct={class:"tile-v ok"},vt={class:"tile"},_t={class:"tile-v err"},pt={class:"type-grid"},ft={class:"type-item"},mt={class:"type-v"},ht={class:"type-item"},gt={class:"type-v"},bt={class:"type-item"},kt={class:"type-v"},yt={class:"type-item"},wt={class:"type-v"},xt={class:"panel-head"},St={class:"head-left"},Ct={class:"head-icon tone-orange"},Pt={class:"head-text"},Tt={class:"panel-sub app-muted"},Rt={class:"tile-grid tile-grid--3"},qt={class:"tile"},zt={class:"tile-v"},Mt={class:"tile"},Wt={class:"tile-v warn"},At={class:"tile"},Bt={class:"tile-v ok"},Nt={class:"panel-head"},Lt={class:"head-left"},Vt={class:"head-icon tone-green"},It={class:"resource-grid"},Ut={class:"resource-item"},Dt={class:"resource-sub app-muted"},Et={class:"resource-item"},Ft={class:"resource-sub app-muted"},$t={class:"resource-item"},jt={class:"resource-sub app-muted"},Gt={class:"panel-head"},Ht={class:"head-left"},Qt={class:"head-text"},Zt={class:"panel-sub app-muted"},Jt={class:"tile-grid tile-grid--4"},Kt={class:"tile"},Ot={class:"tile-v"},Xt={class:"tile"},Yt={class:"tile-v ok"},el={class:"tile"},sl={class:"tile-v"},tl={class:"tile"},ll={class:"tile-v warn"},al={class:"table-wrap"},il={class:"panel-head"},nl={class:"head-left"},ol={class:"head-icon tone-red"},dl={class:"config-grid"},ul={class:"config-item"},rl={class:"config-v"},cl={class:"config-inline app-muted"},vl={class:"config-sub app-muted"},_l={class:"config-item"},pl={class:"config-v"},fl={key:2,class:"config-inline app-muted"},ml={class:"config-sub app-muted"},hl={class:"config-item"},gl={class:"config-v"},bl={__name:"ReportPage",setup(G){const oe=ae("refreshStats",null),de=ae("adminStats",null),N=y(!1),L=y(""),U=y(null),b=y(null),x=y(null),A=y(null),r=y(null),R=y(null),T=y(null),k=y(null),H=y("running");function ue(){try{L.value=new Date().toLocaleString("zh-CN",{hour12:!1,timeZone:"Asia/Shanghai"})}catch{L.value=""}}function i(o){const s=Number(o);return Number.isFinite(s)?s:0}function h(o){const s=String(o??"").trim();if(!s)return 0;const p=s.endsWith("%")?s.slice(0,-1):s,c=Number(p);return!Number.isFinite(c)||c<0?0:c>1e3?1e3:c}function Q(o){const s=String(o??"").trim();return!s||s==="manual"?"手动":s==="scheduled"?"系统定时":s==="batch"?"批量执行":s==="resumed"?"断点续跑":s.startsWith("user_scheduled:")?"用户定时":s}const re=u(()=>{const o=de?.value||{},s=i(b.value?.max_concurrent);return[{label:"总用户数",value:i(o.total_users),icon:We,tone:"blue"},{label:"今日注册",value:i(o.new_users_today),icon:Ae,tone:"green"},{label:"近7天注册",value:i(o.new_users_7d),icon:ie,tone:"purple"},{label:"总账号数",value:i(o.total_accounts),icon:Be,tone:"cyan"},{label:"VIP用户",value:i(o.vip_users),icon:Ne,tone:"orange"},{label:"运行中任务",value:i(b.value?.running_count),icon:Le,tone:"green",sub:s?`并发上限 ${s}`:""},{label:"排队任务",value:i(b.value?.queuing_count),icon:Ve,tone:"purple"}]}),w=u(()=>U.value?.today||{}),B=u(()=>U.value?.total||{}),ce=u(()=>b.value?.running||[]),ve=u(()=>b.value?.queuing||[]),Z=u(()=>i(b.value?.running_count)),J=u(()=>i(b.value?.queuing_count)),K=u(()=>{const o=T.value?.workers;return Array.isArray(o)?[...o].sort((s,p)=>i(s?.worker_id)-i(p?.worker_id)):[]}),_e=u(()=>i(T.value?.total_workers)),O=u(()=>K.value.filter(o=>!!o?.has_browser).length),pe=u(()=>i(T.value?.idle_workers)),X=u(()=>i(T.value?.queue_size)),fe=u(()=>i(T.value?.active_workers));function me(o){return o?.thread_alive?o?.has_browser?"success":"info":"danger"}function he(o){return o?.thread_alive?o?.has_browser?"活跃":"空闲":"异常"}function ge(o){return o?.thread_alive?o?.idle?"info":"warning":"danger"}function be(o){return o?.thread_alive?o?.idle?"空闲":"忙碌":"停止"}const V=u(()=>{const o=i(w.value.success_tasks),s=i(w.value.failed_tasks),p=o+s;return p>0?Math.round(o/p*1e3)/10:0}),ke=u(()=>i(x.value?.success_rate)),ye=u(()=>(k.value?.schedule_enabled??0)===1),we=u(()=>k.value?.schedule_time||"-"),xe=u(()=>k.value?.schedule_browse_type||"-"),Y=u(()=>String(k.value?.schedule_weekdays||"").trim()),Se=u(()=>{const o=Y.value;if(!o)return"";const s={1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六",7:"周日"},p=o.split(",").map(c=>c.trim()).filter(Boolean);return p.length?p.map(c=>s[Number(c)]||c).join("、"):o}),ee=u(()=>(k.value?.proxy_enabled??0)===1),se=u(()=>k.value?.proxy_api_url||""),Ce=u(()=>i(k.value?.proxy_expire_minutes)),te=u(()=>i(k.value?.max_concurrent_global)),Pe=u(()=>i(k.value?.max_concurrent_per_account)),Te=u(()=>i(k.value?.max_screenshot_concurrent)),D=u(()=>{const o=i(b.value?.running_count),s=i(b.value?.queuing_count),p=i(b.value?.max_concurrent);return`运行中 ${o} / 排队 ${s} / 并发上限 ${p||te.value||"-"}`});async function E(){if(!N.value){N.value=!0;try{const[o,s,p,c,q,S,C,f]=await Promise.allSettled([Je(),Ke(),Ze(),He(),Oe(),Xe(),es(),Ye()]);U.value=o.status==="fulfilled"?o.value:null,b.value=s.status==="fulfilled"?s.value:null,x.value=p.status==="fulfilled"?p.value:null,A.value=c.status==="fulfilled"?c.value:null,r.value=q.status==="fulfilled"?q.value:null,R.value=S.status==="fulfilled"?S.value:null,T.value=C.status==="fulfilled"?C.value:null,k.value=f.status==="fulfilled"?f.value:null,await oe?.(),ue()}finally{N.value=!1}}}let I=null;return Ie(()=>{E(),I=setInterval(E,1e3)}),Ue(()=>{I&&(clearInterval(I),I=null)}),(o,s)=>{const p=m("el-button"),c=m("el-icon"),q=m("el-progress"),S=m("el-card"),C=m("el-col"),f=m("el-tag"),v=m("el-table-column"),F=m("el-table"),le=m("el-tab-pane"),Re=m("el-tabs"),$=m("el-row"),M=m("el-descriptions-item"),qe=m("el-descriptions");return _(),g("div",ss,[e("div",ts,[e("div",ls,[e("div",as,[s[1]||(s[1]=e("div",{class:"hero-title-row"},[e("h2",null,"报表中心")],-1)),e("div",is,[L.value?(_(),g("span",ns,"更新时间:"+t(L.value),1)):P("",!0),r.value?.uptime?(_(),g("span",os,"·")):P("",!0),r.value?.uptime?(_(),g("span",ds,"运行 "+t(r.value.uptime),1)):P("",!0)])]),e("div",us,[l(p,{type:"primary",plain:"",loading:N.value,onClick:E},{default:a(()=>[...s[2]||(s[2]=[d("刷新",-1)])]),_:1},8,["loading"])])]),e("div",rs,[(_(!0),g(j,null,De(re.value,n=>(_(),g("div",{key:n.label,class:ne(["kpi-card",`kpi-tone--${n.tone}`])},[e("div",cs,[l(c,null,{default:a(()=>[(_(),z(Qe(n.icon)))]),_:2},1024)]),e("div",vs,[e("div",_s,t(n.value),1),e("div",ps,t(n.label),1),n.sub?(_(),g("div",fs,t(n.sub),1)):P("",!0)])],2))),128))])]),l($,{gutter:12},{default:a(()=>[l(C,{xs:24,lg:12},{default:a(()=>[l(S,{shadow:"never",class:"panel","body-style":{padding:"16px"}},{default:a(()=>[e("div",ms,[e("div",hs,[e("div",gs,[l(c,null,{default:a(()=>[l(W(ie))]),_:1})]),e("div",bs,[s[3]||(s[3]=e("div",{class:"panel-title"},"任务概览",-1)),e("div",ks,[i(w.value.total_tasks)>0?(_(),g(j,{key:0},[d(" 今日成功率 "+t(V.value)+"% · "+t(D.value),1)],64)):(_(),g(j,{key:1},[d("今日无任务 · "+t(D.value),1)],64))])])]),l(q,{type:"circle",percentage:i(w.value.total_tasks)>0?Math.round(V.value):0,width:74,"stroke-width":10,status:i(w.value.total_tasks)===0||V.value>=90?"success":V.value>=60?"warning":"exception"},null,8,["percentage","status"])]),e("div",ys,[s[9]||(s[9]=e("div",{class:"tile-title app-muted"},"今日",-1)),e("div",ws,[e("div",xs,[e("div",Ss,t(i(w.value.total_tasks)),1),s[4]||(s[4]=e("div",{class:"tile-k app-muted"},"总任务",-1))]),e("div",Cs,[e("div",Ps,t(i(w.value.success_tasks)),1),s[5]||(s[5]=e("div",{class:"tile-k app-muted"},"成功",-1))]),e("div",Ts,[e("div",Rs,t(i(w.value.failed_tasks)),1),s[6]||(s[6]=e("div",{class:"tile-k app-muted"},"失败",-1))]),e("div",qs,[e("div",zs,t(i(w.value.total_items)),1),s[7]||(s[7]=e("div",{class:"tile-k app-muted"},"浏览内容",-1))]),e("div",Ms,[e("div",Ws,t(i(w.value.total_attachments)),1),s[8]||(s[8]=e("div",{class:"tile-k app-muted"},"查看附件",-1))])])]),s[16]||(s[16]=e("div",{class:"divider"},null,-1)),e("div",As,[s[15]||(s[15]=e("div",{class:"tile-title app-muted"},"累计",-1)),e("div",Bs,[e("div",Ns,[e("div",Ls,t(i(B.value.total_tasks)),1),s[10]||(s[10]=e("div",{class:"tile-k app-muted"},"总任务",-1))]),e("div",Vs,[e("div",Is,t(i(B.value.success_tasks)),1),s[11]||(s[11]=e("div",{class:"tile-k app-muted"},"成功",-1))]),e("div",Us,[e("div",Ds,t(i(B.value.failed_tasks)),1),s[12]||(s[12]=e("div",{class:"tile-k app-muted"},"失败",-1))]),e("div",Es,[e("div",Fs,t(i(B.value.total_items)),1),s[13]||(s[13]=e("div",{class:"tile-k app-muted"},"浏览内容",-1))]),e("div",$s,[e("div",js,t(i(B.value.total_attachments)),1),s[14]||(s[14]=e("div",{class:"tile-k app-muted"},"查看附件",-1))])])])]),_:1})]),_:1}),l(C,{xs:24,lg:12},{default:a(()=>[l(S,{shadow:"never",class:"panel","body-style":{padding:"16px"}},{default:a(()=>[e("div",Gs,[e("div",Hs,[e("div",Qs,[l(c,null,{default:a(()=>[l(W(Ee))]),_:1})]),e("div",Zs,[s[17]||(s[17]=e("div",{class:"panel-title"},"队列监控",-1)),e("div",Js,t(D.value),1)])])]),l(Re,{modelValue:H.value,"onUpdate:modelValue":s[0]||(s[0]=n=>H.value=n),class:"queue-tabs",stretch:""},{default:a(()=>[l(le,{name:"running"},{label:a(()=>[e("span",Ks,[s[18]||(s[18]=d(" 运行中 ",-1)),l(f,{size:"small",effect:"light",type:"success"},{default:a(()=>[d(t(Z.value),1)]),_:1})])]),default:a(()=>[e("div",Os,[l(F,{data:ce.value.slice(0,10),size:"small",style:{width:"100%"}},{default:a(()=>[l(v,{label:"用户","min-width":"120"},{default:a(({row:n})=>[d(t(n.user_username||"-"),1)]),_:1}),l(v,{label:"账号","min-width":"150"},{default:a(({row:n})=>[d(t(n.username||"-"),1)]),_:1}),l(v,{label:"来源",width:"100"},{default:a(({row:n})=>[d(t(Q(n.source)),1)]),_:1}),l(v,{label:"类型",width:"90"},{default:a(({row:n})=>[d(t(n.browse_type||"-"),1)]),_:1}),l(v,{label:"进度",width:"100"},{default:a(({row:n})=>[d(t(n.progress_items)+"/"+t(n.progress_attachments),1)]),_:1}),l(v,{label:"耗时",width:"100"},{default:a(({row:n})=>[d(t(n.elapsed_display||"-"),1)]),_:1}),l(v,{label:"状态","min-width":"140"},{default:a(({row:n})=>[d(t(n.detail_status||n.status||"-"),1)]),_:1})]),_:1},8,["data"])]),Z.value===0?(_(),g("div",Xs,"当前无运行任务")):P("",!0)]),_:1}),l(le,{name:"queuing"},{label:a(()=>[e("span",Ys,[s[19]||(s[19]=d(" 排队中 ",-1)),l(f,{size:"small",effect:"light",type:"warning"},{default:a(()=>[d(t(J.value),1)]),_:1})])]),default:a(()=>[e("div",et,[l(F,{data:ve.value.slice(0,10),size:"small",style:{width:"100%"}},{default:a(()=>[l(v,{label:"用户","min-width":"120"},{default:a(({row:n})=>[d(t(n.user_username||"-"),1)]),_:1}),l(v,{label:"账号","min-width":"150"},{default:a(({row:n})=>[d(t(n.username||"-"),1)]),_:1}),l(v,{label:"来源",width:"100"},{default:a(({row:n})=>[d(t(Q(n.source)),1)]),_:1}),l(v,{label:"类型",width:"90"},{default:a(({row:n})=>[d(t(n.browse_type||"-"),1)]),_:1}),l(v,{label:"等待",width:"100"},{default:a(({row:n})=>[d(t(n.elapsed_display||"-"),1)]),_:1}),l(v,{label:"状态","min-width":"160"},{default:a(({row:n})=>[d(t(n.detail_status||n.status||"-"),1)]),_:1})]),_:1},8,["data"])]),J.value===0?(_(),g("div",st,"当前无排队任务")):P("",!0)]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1})]),_:1}),l($,{gutter:12},{default:a(()=>[l(C,{xs:24,lg:12},{default:a(()=>[l(S,{shadow:"never",class:"panel","body-style":{padding:"16px"}},{default:a(()=>[e("div",tt,[e("div",lt,[e("div",at,[l(c,null,{default:a(()=>[l(W(Fe))]),_:1})]),e("div",it,[s[20]||(s[20]=e("div",{class:"panel-title"},"邮件报表",-1)),e("div",nt,"成功率 "+t(ke.value)+"%",1)])])]),e("div",ot,[e("div",dt,[e("div",ut,t(i(x.value?.total_sent)),1),s[21]||(s[21]=e("div",{class:"tile-k app-muted"},"总发送",-1))]),e("div",rt,[e("div",ct,t(i(x.value?.total_success)),1),s[22]||(s[22]=e("div",{class:"tile-k app-muted"},"成功",-1))]),e("div",vt,[e("div",_t,t(i(x.value?.total_failed)),1),s[23]||(s[23]=e("div",{class:"tile-k app-muted"},"失败",-1))])]),s[28]||(s[28]=e("div",{class:"divider"},null,-1)),s[29]||(s[29]=e("div",{class:"sub-title"},"类型统计",-1)),e("div",pt,[e("div",ft,[e("div",mt,t(i(x.value?.register_sent)),1),s[24]||(s[24]=e("div",{class:"type-k app-muted"},"注册验证",-1))]),e("div",ht,[e("div",gt,t(i(x.value?.reset_sent)),1),s[25]||(s[25]=e("div",{class:"type-k app-muted"},"密码重置",-1))]),e("div",bt,[e("div",kt,t(i(x.value?.bind_sent)),1),s[26]||(s[26]=e("div",{class:"type-k app-muted"},"邮箱绑定",-1))]),e("div",yt,[e("div",wt,t(i(x.value?.task_complete_sent)),1),s[27]||(s[27]=e("div",{class:"type-k app-muted"},"任务完成",-1))])])]),_:1})]),_:1}),l(C,{xs:24,lg:12},{default:a(()=>[l(S,{shadow:"never",class:"panel","body-style":{padding:"16px"}},{default:a(()=>[e("div",xt,[e("div",St,[e("div",Ct,[l(c,null,{default:a(()=>[l(W($e))]),_:1})]),e("div",Pt,[s[30]||(s[30]=e("div",{class:"panel-title"},"反馈概览",-1)),e("div",Tt,"待处理 "+t(i(A.value?.pending))+" 条",1)])])]),e("div",Rt,[e("div",qt,[e("div",zt,t(i(A.value?.total)),1),s[31]||(s[31]=e("div",{class:"tile-k app-muted"},"总反馈",-1))]),e("div",Mt,[e("div",Wt,t(i(A.value?.pending)),1),s[32]||(s[32]=e("div",{class:"tile-k app-muted"},"待处理",-1))]),e("div",At,[e("div",Bt,t(i(A.value?.replied)),1),s[33]||(s[33]=e("div",{class:"tile-k app-muted"},"已回复",-1))])]),s[34]||(s[34]=e("div",{class:"divider"},null,-1)),s[35]||(s[35]=e("div",{class:"help app-muted"},"提示:用户的反馈需要及时处理,避免影响活跃度与留存。",-1))]),_:1})]),_:1})]),_:1}),l($,{gutter:12},{default:a(()=>[l(C,{xs:24,lg:12},{default:a(()=>[l(S,{shadow:"never",class:"panel","body-style":{padding:"16px"}},{default:a(()=>[e("div",Nt,[e("div",Lt,[e("div",Vt,[l(c,null,{default:a(()=>[l(W(je))]),_:1})]),s[36]||(s[36]=e("div",{class:"head-text"},[e("div",{class:"panel-title"},"系统资源"),e("div",{class:"panel-sub app-muted"},"服务器与容器运行状态")],-1))]),r.value?.uptime?(_(),z(f,{key:0,effect:"light",type:"info"},{default:a(()=>[d("运行 "+t(r.value.uptime),1)]),_:1})):P("",!0)]),e("div",It,[e("div",Ut,[s[37]||(s[37]=e("div",{class:"resource-k app-muted"},"CPU",-1)),l(q,{percentage:Math.round(h(r.value?.cpu_percent)),status:h(r.value?.cpu_percent)>=90?"exception":h(r.value?.cpu_percent)>=75?"warning":"success"},null,8,["percentage","status"]),e("div",Dt,t(Math.round(h(r.value?.cpu_percent)))+"%",1)]),e("div",Et,[s[38]||(s[38]=e("div",{class:"resource-k app-muted"},"内存",-1)),l(q,{percentage:Math.round(h(r.value?.memory_percent)),status:h(r.value?.memory_percent)>=90?"exception":h(r.value?.memory_percent)>=75?"warning":"success"},null,8,["percentage","status"]),e("div",Ft,t(r.value?.memory_used||"-")+" / "+t(r.value?.memory_total||"-")+"("+t(Math.round(h(r.value?.memory_percent)))+"%) ",1)]),e("div",$t,[s[39]||(s[39]=e("div",{class:"resource-k app-muted"},"磁盘",-1)),l(q,{percentage:Math.round(h(r.value?.disk_percent)),status:h(r.value?.disk_percent)>=90?"exception":h(r.value?.disk_percent)>=75?"warning":"success"},null,8,["percentage","status"]),e("div",jt,t(r.value?.disk_used||"-")+" / "+t(r.value?.disk_total||"-")+"("+t(Math.round(h(r.value?.disk_percent)))+"%) ",1)])]),s[46]||(s[46]=e("div",{class:"divider"},null,-1)),s[47]||(s[47]=e("div",{class:"sub-title"},"容器",-1)),l(qe,{border:"",column:2,size:"small"},{default:a(()=>[l(M,{label:"状态"},{default:a(()=>[d(t(R.value?.status||"-"),1)]),_:1}),l(M,{label:"容器名"},{default:a(()=>[d(t(R.value?.container_name||"-"),1)]),_:1}),l(M,{label:"运行时长"},{default:a(()=>[d(t(R.value?.uptime||"-"),1)]),_:1}),l(M,{label:"CPU"},{default:a(()=>[d(t(R.value?.cpu_percent||"-"),1)]),_:1}),l(M,{label:"内存"},{default:a(()=>[d(t(R.value?.memory_usage||"-"),1)]),_:1}),l(M,{label:"内存占比"},{default:a(()=>[d(t(R.value?.memory_percent||"-"),1)]),_:1})]),_:1}),s[48]||(s[48]=e("div",{class:"divider"},null,-1)),e("div",Gt,[e("div",Ht,[e("div",Qt,[s[40]||(s[40]=e("div",{class:"panel-title"},"浏览器池",-1)),e("div",Zt," 活跃(有浏览器)"+t(O.value)+" · 忙碌 "+t(fe.value)+" · 队列 "+t(X.value),1)])]),T.value?.server_time_cst?(_(),z(f,{key:0,effect:"light",type:"info"},{default:a(()=>[d(t(T.value.server_time_cst),1)]),_:1})):P("",!0)]),e("div",Jt,[e("div",Kt,[e("div",Ot,t(_e.value),1),s[41]||(s[41]=e("div",{class:"tile-k app-muted"},"总 Worker",-1))]),e("div",Xt,[e("div",Yt,t(O.value),1),s[42]||(s[42]=e("div",{class:"tile-k app-muted"},"活跃(有浏览器)",-1))]),e("div",el,[e("div",sl,t(pe.value),1),s[43]||(s[43]=e("div",{class:"tile-k app-muted"},"空闲(无任务)",-1))]),e("div",tl,[e("div",ll,t(X.value),1),s[44]||(s[44]=e("div",{class:"tile-k app-muted"},"队列等待",-1))])]),s[49]||(s[49]=e("div",{class:"divider"},null,-1)),e("div",al,[l(F,{data:K.value,size:"small",border:""},{default:a(()=>[l(v,{prop:"worker_id",label:"Worker",width:"90"}),l(v,{label:"状态",width:"90"},{default:a(({row:n})=>[l(f,{type:me(n),effect:"light"},{default:a(()=>[d(t(he(n)),1)]),_:2},1032,["type"])]),_:1}),l(v,{label:"执行",width:"90"},{default:a(({row:n})=>[l(f,{type:ge(n),effect:"light"},{default:a(()=>[d(t(be(n)),1)]),_:2},1032,["type"])]),_:1}),l(v,{label:"任务",width:"120"},{default:a(({row:n})=>[e("span",null,t(i(n?.total_tasks)),1),s[45]||(s[45]=e("span",{class:"app-muted"}," / ",-1)),e("span",{class:ne(i(n?.failed_tasks)?"err":"app-muted")},t(i(n?.failed_tasks)),3)]),_:1}),l(v,{prop:"browser_use_count",label:"复用",width:"90"}),l(v,{prop:"last_active_at",label:"最近活跃","min-width":"160"}),l(v,{prop:"browser_created_at",label:"浏览器创建","min-width":"160"})]),_:1},8,["data"])])]),_:1})]),_:1}),l(C,{xs:24,lg:12},{default:a(()=>[l(S,{shadow:"never",class:"panel","body-style":{padding:"16px"}},{default:a(()=>[e("div",il,[e("div",nl,[e("div",ol,[l(c,null,{default:a(()=>[l(W(Ge))]),_:1})]),s[50]||(s[50]=e("div",{class:"head-text"},[e("div",{class:"panel-title"},"配置概览"),e("div",{class:"panel-sub app-muted"},"定时 / 代理 / 并发")],-1))])]),e("div",dl,[e("div",ul,[s[53]||(s[53]=e("div",{class:"config-k app-muted"},"定时任务",-1)),e("div",rl,[ye.value?(_(),z(f,{key:0,type:"success",effect:"light"},{default:a(()=>[...s[51]||(s[51]=[d("启用",-1)])]),_:1})):(_(),z(f,{key:1,type:"info",effect:"light"},{default:a(()=>[...s[52]||(s[52]=[d("关闭",-1)])]),_:1})),e("span",cl,t(we.value)+" / "+t(xe.value),1)]),e("div",vl,"日期:"+t(Se.value||Y.value||"-"),1)]),e("div",_l,[s[56]||(s[56]=e("div",{class:"config-k app-muted"},"代理",-1)),e("div",pl,[ee.value?(_(),z(f,{key:0,type:"success",effect:"light"},{default:a(()=>[...s[54]||(s[54]=[d("启用",-1)])]),_:1})):(_(),z(f,{key:1,type:"info",effect:"light"},{default:a(()=>[...s[55]||(s[55]=[d("关闭",-1)])]),_:1})),ee.value&&se.value?(_(),g("span",fl,t(se.value),1)):P("",!0)]),e("div",ml,"有效期:"+t(Ce.value||"-")+" 分钟",1)]),e("div",hl,[s[59]||(s[59]=e("div",{class:"config-k app-muted"},"并发",-1)),e("div",gl,[e("span",null,"全局 "+t(te.value||"-"),1),s[57]||(s[57]=e("span",{class:"config-split app-muted"},"/",-1)),e("span",null,"单账号 "+t(Pe.value||"-"),1),s[58]||(s[58]=e("span",{class:"config-split app-muted"},"/",-1)),e("span",null,"截图 "+t(Te.value||"-"),1)])])])]),_:1})]),_:1})]),_:1})])}}},Sl=Me(bl,[["__scopeId","data-v-a37ef846"]]);export{Sl as default};
|