Files
zsglpt/static/admin/assets/ReportPage-BITaX3hh.js

2 lines
11 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{q as Le,r as Ie,v as We,x as Ae,y as Ne,l as Ee,A as Be}from"./vendor-element-CJoVtPsD.js";import{a as De,_ as ze,f as Fe}from"./index-bXG7gEdM.js";import{f as Ve}from"./email-DgztAWKJ.js";import{f as Ue,a as Oe,b as Ge,c as je,d as He}from"./tasks-Y3hOqi3L.js";import{f as Qe}from"./system-1p1K-j-4.js";import{M as Ze}from"./MetricGrid-CPdC57ab.js";import{i as J,r as o,c as t,v as Ke,Y as Ye,aW as Je,z as p,A as m,B as i,S as Xe,N as A,Q as y,R as X,ak as ee,K as el,L as ll,E as al}from"./vendor-sLgkZK1v.js";import"./vendor-vue-CWkOjFoA.js";import"./vendor-axios-B9ygI19o.js";async function tl(){const{data:N}=await De.get("/browser_pool/stats");return N}const ul={class:"page-stack"},sl={class:"report-hero"},nl={class:"hero-head"},ol={class:"hero-main"},rl={class:"hero-meta app-muted"},il={key:0},cl={key:1,class:"hero-dot"},vl={key:2},dl={class:"mobile-report"},_l={class:"mobile-module-head"},bl={class:"mobile-module-title"},ml={class:"mobile-module-desc app-muted"},fl={class:"mobile-metrics"},pl={class:"mobile-metric-label app-muted"},hl={class:"mobile-metric-value"},kl=5e3,gl=2e4,yl={__name:"ReportPage",setup(N){const le=J("refreshStats",null),ae=J("adminStats",null),$=o(!1),M=o(!1),h=o(""),q=o(null),r=o(null),n=o(null),b=o(null),d=o(null),S=o(null),k=o(null),c=o(null),_=o(null);o("running");function te(){try{h.value=new Date().toLocaleString("zh-CN",{hour12:!1,timeZone:"Asia/Shanghai"})}catch{h.value=""}}function e(l){const a=Number(l);return Number.isFinite(a)?a:0}function ue(l){const a=String(l??"").trim();if(!a)return 0;const s=a.endsWith("%")?a.slice(0,-1):a,u=Number(s);return!Number.isFinite(u)||u<0?0:u>1e3?1e3:u}function P(l){return`${Math.round(ue(l))}%`}function R(l){const a=Number(l);return!Number.isFinite(a)||a<0?"-":a>=100?`${Math.round(a)}ms`:`${a.toFixed(1)}ms`}function se(l){const a=Number(l);if(!Number.isFinite(a)||a<=0)return"-";try{return new Date(a*1e3).toLocaleTimeString("zh-CN",{hour12:!1,timeZone:"Asia/Shanghai"})}catch{return"-"}}function ne(l){const a=String(l??"").trim();return!a||a==="manual"?"手动":a==="scheduled"?"系统定时":a==="batch"?"批量执行":a==="resumed"?"断点续跑":a.startsWith("user_scheduled:")?"用户定时":a}const E=t(()=>{const l=ae?.value||{},a=e(r.value?.max_concurrent);return[{label:"总用户数",value:e(l.total_users),icon:Le,tone:"blue"},{label:"今日注册",value:e(l.new_users_today),icon:Ie,tone:"green"},{label:"近7天注册",value:e(l.new_users_7d),icon:We,tone:"purple"},{label:"总账号数",value:e(l.total_accounts),icon:Ae,tone:"cyan"},{label:"VIP用户",value:e(l.vip_users),icon:Ne,tone:"orange"},{label:"运行中任务",value:e(r.value?.running_count),icon:Ee,tone:"green",sub:a?`并发上限 ${a}`:""},{label:"排队任务",value:e(r.value?.queuing_count),icon:Be,tone:"purple"}]}),v=t(()=>q.value?.today||{}),f=t(()=>q.value?.total||{});t(()=>r.value?.running||[]);const x=t(()=>r.value?.queuing||[]),oe=t(()=>e(r.value?.running_count)),re=t(()=>e(r.value?.queuing_count)),ie=t(()=>{const l=k.value?.workers;return Array.isArray(l)?[...l].sort((a,s)=>e(a?.worker_id)-e(s?.worker_id)):[]}),B=t(()=>e(k.value?.total_workers)),C=t(()=>ie.value.filter(l=>!!l?.has_browser).length),D=t(()=>e(k.value?.idle_workers)),z=t(()=>e(k.value?.queue_size)),T=t(()=>e(k.value?.active_workers)),F=t(()=>{const l=e(v.value.success_tasks),a=e(v.value.failed_tasks),s=l+a;return s>0?Math.round(l/s*1e3)/10:0}),L=t(()=>e(n.value?.success_rate));t(()=>[{label:"总任务",value:e(v.value.total_tasks),tone:"blue"},{label:"成功",value:e(v.value.success_tasks),tone:"green"},{label:"失败",value:e(v.value.failed_tasks),tone:"red"},{label:"浏览内容",value:e(v.value.total_items),tone:"purple"},{label:"查看附件",value:e(v.value.total_attachments),tone:"cyan"}]),t(()=>[{label:"总任务",value:e(f.value.total_tasks),tone:"blue"},{label:"成功",value:e(f.value.success_tasks),tone:"green"},{label:"失败",value:e(f.value.failed_tasks),tone:"red"},{label:"浏览内容",value:e(f.value.total_items),tone:"purple"},{label:"查看附件",value:e(f.value.total_attachments),tone:"cyan"}]),t(()=>[{label:"总发送",value:e(n.value?.total_sent),tone:"blue"},{label:"成功",value:e(n.value?.total_success),tone:"green"},{label:"失败",value:e(n.value?.total_failed),tone:"red"},{label:"成功率",value:`${L.value}%`,tone:"purple"}]),t(()=>[{label:"注册验证",value:e(n.value?.register_sent),tone:"cyan"},{label:"密码重置",value:e(n.value?.reset_sent),tone:"orange"},{label:"邮箱绑定",value:e(n.value?.bind_sent),tone:"purple"},{label:"任务完成",value:e(n.value?.task_complete_sent),tone:"green"}]),t(()=>[{label:"总反馈",value:e(b.value?.total),tone:"blue"},{label:"待处理",value:e(b.value?.pending),tone:"orange"},{label:"已回复",value:e(b.value?.replied),tone:"green"}]),t(()=>[{label:"总 Worker",value:B.value,tone:"blue"},{label:"活跃 Worker",value:C.value,tone:"green"},{label:"空闲 Worker",value:D.value,tone:"cyan"},{label:"忙碌 Worker",value:T.value,tone:"orange"},{label:"队列",value:z.value,tone:"purple"}]);const ce=t(()=>(c.value?.schedule_enabled??0)===1),ve=t(()=>c.value?.schedule_time||"-"),de=t(()=>c.value?.schedule_browse_type||"-"),_e=t(()=>String(c.value?.schedule_weekdays||"").trim());t(()=>{const l=_e.value;if(!l)return"";const a={1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六",7:"周日"},s=l.split(",").map(u=>u.trim()).filter(Boolean);return s.length?s.map(u=>a[Number(u)]||u).join("、"):l});const be=t(()=>(c.value?.proxy_enabled??0)===1);t(()=>c.value?.proxy_api_url||"");const V=t(()=>e(c.value?.proxy_expire_minutes)),I=t(()=>e(c.value?.max_concurrent_global)),me=t(()=>e(c.value?.max_concurrent_per_account)),fe=t(()=>e(c.value?.max_screenshot_concurrent)),pe=t(()=>{const l=e(r.value?.running_count),a=e(r.value?.queuing_count),s=e(r.value?.max_concurrent);return`运行中 ${l} / 排队 ${a} / 并发上限 ${s||I.value||"-"}`}),he=t(()=>E.value.map(l=>({label:l.label,value:l.sub?`${l.value}${l.sub}`:l.value}))),ke=t(()=>[{label:"今日总任务",value:e(v.value.total_tasks)},{label:"今日成功",value:e(v.value.success_tasks)},{label:"今日失败",value:e(v.value.failed_tasks)},{label:"今日成功率",value:`${F.value}%`},{label:"累计任务",value:e(f.value.total_tasks)},{label:"累计成功",value:e(f.value.success_tasks)}]),ge=t(()=>[{label:"运行中",value:oe.value},{label:"排队中",value:re.value},{label:"并发上限",value:e(r.value?.max_concurrent)||I.value||"-"},{label:"排队首条来源",value:ne(x.value[0]?.source)},{label:"排队首条状态",value:x.value[0]?.detail_status||x.value[0]?.status||"-"},{label:"最长等待",value:x.value[0]?.elapsed_display||"-"}]),ye=t(()=>[{label:"总发送",value:e(n.value?.total_sent)},{label:"成功",value:e(n.value?.total_success)},{label:"失败",value:e(n.value?.total_failed)},{label:"成功率",value:`${L.value}%`},{label:"注册验证",value:e(n.value?.register_sent)},{label:"重置密码",value:e(n.value?.reset_sent)}]),we=t(()=>[{label:"总反馈",value:e(b.value?.total)},{label:"待处理",value:e(b.value?.pending)},{label:"已回复",value:e(b.value?.replied)}]),Se=t(()=>[{label:"CPU",value:P(d.value?.cpu_percent)},{label:"内存",value:P(d.value?.memory_percent)},{label:"磁盘",value:P(d.value?.disk_percent)},{label:"容器状态",value:S.value?.status||"-"},{label:"容器名",value:S.value?.container_name||"-"},{label:"容器运行",value:S.value?.uptime||"-"}]),xe=t(()=>[{label:"总 Worker",value:B.value},{label:"活跃 Worker",value:C.value},{label:"忙碌 Worker",value:T.value},{label:"空闲 Worker",value:D.value},{label:"任务队列",value:z.value}]),$e=t(()=>{const l=_.value?.top_paths;return Array.isArray(l)?l.slice(0,3):[]}),Me=t(()=>{const l=[{label:"总请求",value:e(_.value?.total_requests)},{label:"API请求",value:e(_.value?.api_requests)},{label:"慢请求",value:e(_.value?.slow_requests)},{label:"错误请求",value:e(_.value?.error_requests)}];return $e.value.forEach((a,s)=>{const u=String(a?.path||"-");l.push({label:`慢接口${s+1}`,value:`${u} · 峰值 ${R(a?.max_ms)}`})}),l}),qe=t(()=>{const l=R(_.value?.avg_duration_ms),a=R(_.value?.max_duration_ms),s=se(_.value?.last_request_ts);return`均值 ${l} · 峰值 ${a} · 最近 ${s}`}),Pe=t(()=>[{label:"定时任务",value:ce.value?"启用":"关闭"},{label:"执行时间",value:ve.value||"-"},{label:"浏览类型",value:de.value||"-"},{label:"代理",value:be.value?"启用":"关闭"},{label:"代理有效期",value:V.value?`${V.value} 分钟`:"-"},{label:"全局并发",value:I.value||"-"},{label:"单账号并发",value:me.value||"-"},{label:"截图并发",value:fe.value||"-"}]),Re=t(()=>[{key:"overview",title:"平台概览",desc:h.value?`更新 ${h.value}`:"核心指标",tone:"blue",items:he.value},{key:"task",title:"任务概览",desc:e(v.value.total_tasks)>0?`今日成功率 ${F.value}%`:"今日暂无任务",tone:"purple",items:ke.value},{key:"queue",title:"队列监控",desc:pe.value,tone:"blue",items:ge.value},{key:"email",title:"邮件报表",desc:`成功率 ${L.value}%`,tone:"cyan",items:ye.value},{key:"feedback",title:"反馈概览",desc:`待处理 ${e(b.value?.pending)}`,tone:"orange",items:we.value},{key:"resource",title:"系统资源",desc:d.value?.uptime?`运行 ${d.value.uptime}`:"运行状态获取中",tone:"green",items:Se.value},{key:"request",title:"接口性能",desc:qe.value,tone:"purple",items:Me.value},{key:"worker",title:"截图线程池",desc:`活跃 ${C.value} · 忙碌 ${T.value}`,tone:"cyan",items:xe.value},{key:"config",title:"配置概览",desc:"并发 / 代理 / 定时任务",tone:"red",items:Pe.value}]);async function U(l={}){const a=l.showLoading??!0;if(!M.value){M.value=!0,a&&($.value=!0);try{const[s,u,g,j,H,Q,Z,K,Y]=await Promise.allSettled([Ue(),Oe(),Ve(),Fe(),Ge(),je(),tl(),He(),Qe()]);s.status==="fulfilled"&&(q.value=s.value),u.status==="fulfilled"&&(r.value=u.value),g.status==="fulfilled"&&(n.value=g.value),j.status==="fulfilled"&&(b.value=j.value),H.status==="fulfilled"&&(d.value=H.value),Q.status==="fulfilled"&&(S.value=Q.value),Z.status==="fulfilled"&&(k.value=Z.value),K.status==="fulfilled"&&(_.value=K.value),Y.status==="fulfilled"&&(c.value=Y.value),await le?.(),te()}finally{M.value=!1,a&&($.value=!1)}}}let w=null;function Ce(){return typeof document>"u"?!1:document.visibilityState==="hidden"}function Te(){return Ce()?gl:kl}function O(){w&&(clearTimeout(w),w=null)}function W(){O(),w=window.setTimeout(async()=>{w=null,await U({showLoading:!1}).catch(()=>{}),W()},Te())}function G(){W()}return Ke(()=>{U({showLoading:!1}).catch(()=>{}).finally(()=>{W()}),window.addEventListener("visibilitychange",G)}),Ye(()=>{O(),window.removeEventListener("visibilitychange",G)}),(l,a)=>{const s=Je("el-card");return m(),p("div",ul,[i("section",sl,[i("div",nl,[i("div",ol,[a[0]||(a[0]=i("h2",null,"报表中心",-1)),i("div",rl,[h.value?(m(),p("span",il,"更新时间:"+y(h.value),1)):A("",!0),d.value?.uptime?(m(),p("span",cl,"·")):A("",!0),d.value?.uptime?(m(),p("span",vl,"运行 "+y(d.value.uptime),1)):A("",!0)])])]),Xe(Ze,{class:"hero-overview-grid",items:E.value,loading:$.value,"min-width":165},null,8,["items","loading"])]),i("section",dl,[(m(!0),p(X,null,ee(Re.value,u=>(m(),el(s,{key:u.key,shadow:"never",class:al(["mobile-module-card",`mobile-tone-${u.tone}`]),"body-style":{padding:"12px"}},{default:ll(()=>[i("div",_l,[i("div",bl,y(u.title),1),i("div",ml,y(u.desc),1)]),i("div",fl,[(m(!0),p(X,null,ee(u.items,g=>(m(),p("div",{key:`${u.key}-${g.label}`,class:"mobile-metric-item"},[i("div",pl,y(g.label),1),i("div",hl,y(g.value),1)]))),128))])]),_:2},1032,["class"]))),128))])])}}},Tl=ze(yl,[["__scopeId","data-v-48412586"]]);export{Tl as default};