Files
zsglpt/static/admin/assets/SystemPage-BPHukDdR.js
yuyx 01ffaf96a3 fix: CPU显示修复 + 报表面板添加浏览器池状态
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>
2025-12-27 20:15:48 +08:00

17 lines
9.5 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{f as ae,u as S,e as te}from"./system-DIc9L1cQ.js";import{a as D,_ as oe,r as s,c as ne,o as ue,f as d,I as se,J as re,h as V,g as F,j as n,m as l,w as t,q as c,B as E,n as $,F as de,v as ie,p as me,K as U,L as p}from"./index-B9zsNTKQ.js";async function pe(){const{data:f}=await D.get("/proxy/config");return f}async function ce(f){const{data:v}=await D.post("/proxy/config",f);return v}async function ve(f){const{data:v}=await D.post("/proxy/test",f);return v}const ye={class:"page-stack"},_e={class:"app-page-title"},fe={class:"row-actions"},xe={class:"row-actions"},be={__name:"SystemPage",setup(f){const v=s(!1),g=s(2),w=s(1),k=s(3),i=s(!1),P=s("02:00"),x=s("应读"),y=s(["1","2","3","4","5","6","7"]),b=s(!1),_=s(""),C=s(3),B=s(!1),N=s(10),I=s(7),j=[{label:"周一",value:"1"},{label:"周二",value:"2"},{label:"周三",value:"3"},{label:"周四",value:"4"},{label:"周五",value:"5"},{label:"周六",value:"6"},{label:"周日",value:"7"}],L={1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六",7:"周日"},O=ne(()=>(y.value||[]).map(a=>L[Number(a)]||a).join("、"));function W(a){return String(a)==="注册前未读"?"注册前未读":"应读"}async function H(){v.value=!0;try{const[a,e]=await Promise.all([ae(),pe()]);g.value=a.max_concurrent_global??2,w.value=a.max_concurrent_per_account??1,k.value=a.max_screenshot_concurrent??3,i.value=(a.schedule_enabled??0)===1,P.value=a.schedule_time||"02:00",x.value=W(a.schedule_browse_type);const u=String(a.schedule_weekdays||"1,2,3,4,5,6,7").split(",").map(m=>m.trim()).filter(Boolean);y.value=u.length?u:["1","2","3","4","5","6","7"],B.value=(a.auto_approve_enabled??0)===1,N.value=a.auto_approve_hourly_limit??10,I.value=a.auto_approve_vip_days??7,b.value=(e.proxy_enabled??0)===1,_.value=e.proxy_api_url||"",C.value=e.proxy_expire_minutes??3}catch{}finally{v.value=!1}}async function q(){const a={max_concurrent_global:Number(g.value),max_concurrent_per_account:Number(w.value),max_screenshot_concurrent:Number(k.value)};try{await U.confirm(`确定更新并发配置吗?
全局并发数: ${a.max_concurrent_global}
单账号并发数: ${a.max_concurrent_per_account}
截图并发数: ${a.max_screenshot_concurrent}`,"保存并发配置",{confirmButtonText:"保存",cancelButtonText:"取消",type:"warning"})}catch{return}try{const e=await S(a);p.success(e?.message||"并发配置已更新")}catch{}}async function z(){if(i.value&&(!y.value||y.value.length===0)){p.error("请至少选择一个执行日期");return}const a={schedule_enabled:i.value?1:0,schedule_time:P.value,schedule_browse_type:x.value,schedule_weekdays:(y.value||[]).join(",")},e=i.value?`确定启用定时任务吗?
执行时间: 每天 ${a.schedule_time}
执行日期: ${O.value}
浏览类型: ${a.schedule_browse_type}
系统将自动执行所有账号的浏览任务(不包含截图)`:"确定关闭定时任务吗?";try{await U.confirm(e,"保存定时任务",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"})}catch{return}try{const u=await S(a);p.success(u?.message||(i.value?"定时任务已启用":"定时任务已关闭"))}catch{}}async function G(){const a=`确定要立即执行定时任务吗?
这将执行所有账号的浏览任务
浏览类型: ${x.value}
注意:无视定时时间和执行日期配置,立即开始执行!`;try{await U.confirm(a,"立即执行",{confirmButtonText:"立即执行",cancelButtonText:"取消",type:"warning"})}catch{return}try{const e=await te();p.success(e?.message||"定时任务已开始执行")}catch{}}async function J(){if(b.value&&!_.value.trim()){p.error("启用代理时API地址不能为空");return}const a={proxy_enabled:b.value?1:0,proxy_api_url:_.value.trim(),proxy_expire_minutes:Number(C.value)||3};try{const e=await ce(a);p.success(e?.message||"代理配置已更新")}catch{}}async function K(){if(!_.value.trim()){p.error("请先输入代理API地址");return}try{const a=await ve({api_url:_.value.trim()});await U.alert(a?.message||"测试完成","代理测试",{confirmButtonText:"知道了"})}catch{}}async function R(){const a=Number(N.value),e=Number(I.value);if(!Number.isFinite(a)||a<1){p.error("每小时注册限制必须大于0");return}if(!Number.isFinite(e)||e<0){p.error("VIP天数不能为负数");return}const u={auto_approve_enabled:B.value?1:0,auto_approve_hourly_limit:a,auto_approve_vip_days:e};try{const m=await S(u);p.success(m?.message||"注册设置已保存")}catch{}}return ue(H),(a,e)=>{const u=d("el-button"),m=d("el-input-number"),r=d("el-form-item"),h=d("el-form"),T=d("el-card"),A=d("el-switch"),Q=d("el-time-picker"),M=d("el-option"),X=d("el-select"),Y=d("el-checkbox"),Z=d("el-checkbox-group"),ee=d("el-input"),le=se("loading");return re((V(),F("div",ye,[n("div",_e,[e[14]||(e[14]=n("h2",null,"系统配置",-1)),n("div",null,[l(u,{onClick:H},{default:t(()=>[...e[13]||(e[13]=[c("刷新",-1)])]),_:1})])]),l(T,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:t(()=>[e[19]||(e[19]=n("h3",{class:"section-title"},"系统并发配置",-1)),l(h,{"label-width":"130px"},{default:t(()=>[l(r,{label:"全局最大并发数"},{default:t(()=>[l(m,{modelValue:g.value,"onUpdate:modelValue":e[0]||(e[0]=o=>g.value=o),min:1,max:200},null,8,["modelValue"]),e[15]||(e[15]=n("div",{class:"help"},"同时最多运行的账号数量(浏览任务使用 API 方式,资源占用较低)。",-1))]),_:1}),l(r,{label:"单账号最大并发数"},{default:t(()=>[l(m,{modelValue:w.value,"onUpdate:modelValue":e[1]||(e[1]=o=>w.value=o),min:1,max:50},null,8,["modelValue"]),e[16]||(e[16]=n("div",{class:"help"},"单个账号同时最多运行的任务数量(建议设为 1。",-1))]),_:1}),l(r,{label:"截图最大并发数"},{default:t(()=>[l(m,{modelValue:k.value,"onUpdate:modelValue":e[2]||(e[2]=o=>k.value=o),min:1,max:50},null,8,["modelValue"]),e[17]||(e[17]=n("div",{class:"help"},"同时进行截图的最大数量(每个浏览器约占用 200MB 内存)。",-1))]),_:1})]),_:1}),l(u,{type:"primary",onClick:q},{default:t(()=>[...e[18]||(e[18]=[c("保存并发配置",-1)])]),_:1})]),_:1}),l(T,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:t(()=>[e[22]||(e[22]=n("h3",{class:"section-title"},"定时任务配置",-1)),l(h,{"label-width":"130px"},{default:t(()=>[l(r,{label:"启用定时任务"},{default:t(()=>[l(A,{modelValue:i.value,"onUpdate:modelValue":e[3]||(e[3]=o=>i.value=o)},null,8,["modelValue"])]),_:1}),i.value?(V(),E(r,{key:0,label:"执行时间"},{default:t(()=>[l(Q,{modelValue:P.value,"onUpdate:modelValue":e[4]||(e[4]=o=>P.value=o),"value-format":"HH:mm",format:"HH:mm"},null,8,["modelValue"])]),_:1})):$("",!0),i.value?(V(),E(r,{key:1,label:"浏览类型"},{default:t(()=>[l(X,{modelValue:x.value,"onUpdate:modelValue":e[5]||(e[5]=o=>x.value=o),style:{width:"220px"}},{default:t(()=>[l(M,{label:"注册前未读",value:"注册前未读"}),l(M,{label:"应读",value:"应读"})]),_:1},8,["modelValue"])]),_:1})):$("",!0),i.value?(V(),E(r,{key:2,label:"执行日期"},{default:t(()=>[l(Z,{modelValue:y.value,"onUpdate:modelValue":e[6]||(e[6]=o=>y.value=o)},{default:t(()=>[(V(),F(de,null,ie(j,o=>l(Y,{key:o.value,label:o.value},{default:t(()=>[c(me(o.label),1)]),_:2},1032,["label"])),64))]),_:1},8,["modelValue"])]),_:1})):$("",!0)]),_:1}),n("div",fe,[l(u,{type:"primary",onClick:z},{default:t(()=>[...e[20]||(e[20]=[c("保存定时任务配置",-1)])]),_:1}),l(u,{type:"success",plain:"",onClick:G},{default:t(()=>[...e[21]||(e[21]=[c("立即执行",-1)])]),_:1})])]),_:1}),l(T,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:t(()=>[e[27]||(e[27]=n("h3",{class:"section-title"},"代理设置",-1)),l(h,{"label-width":"130px"},{default:t(()=>[l(r,{label:"启用IP代理"},{default:t(()=>[l(A,{modelValue:b.value,"onUpdate:modelValue":e[7]||(e[7]=o=>b.value=o)},null,8,["modelValue"]),e[23]||(e[23]=n("div",{class:"help"},"开启后所有浏览任务将通过代理IP访问失败自动重试3次。",-1))]),_:1}),l(r,{label:"代理API地址"},{default:t(()=>[l(ee,{modelValue:_.value,"onUpdate:modelValue":e[8]||(e[8]=o=>_.value=o),placeholder:"http://api.xxx/Tools/IP.ashx?..."},null,8,["modelValue"]),e[24]||(e[24]=n("div",{class:"help"},"API 应返回IP:PORT例如 123.45.67.89:8888。",-1))]),_:1}),l(r,{label:"代理有效期(分钟)"},{default:t(()=>[l(m,{modelValue:C.value,"onUpdate:modelValue":e[9]||(e[9]=o=>C.value=o),min:1,max:60},null,8,["modelValue"])]),_:1})]),_:1}),n("div",xe,[l(u,{type:"primary",onClick:J},{default:t(()=>[...e[25]||(e[25]=[c("保存代理配置",-1)])]),_:1}),l(u,{onClick:K},{default:t(()=>[...e[26]||(e[26]=[c("测试代理",-1)])]),_:1})])]),_:1}),l(T,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:t(()=>[e[30]||(e[30]=n("h3",{class:"section-title"},"注册设置",-1)),l(h,{"label-width":"130px"},{default:t(()=>[l(r,{label:"注册赠送VIP"},{default:t(()=>[l(A,{modelValue:B.value,"onUpdate:modelValue":e[10]||(e[10]=o=>B.value=o)},null,8,["modelValue"]),e[28]||(e[28]=n("div",{class:"help"},"开启后新用户注册成功后将赠送下方设置的VIP天数注册已默认无需审核。",-1))]),_:1}),l(r,{label:"每小时注册限制"},{default:t(()=>[l(m,{modelValue:N.value,"onUpdate:modelValue":e[11]||(e[11]=o=>N.value=o),min:1,max:1e4},null,8,["modelValue"])]),_:1}),l(r,{label:"注册赠送VIP天数"},{default:t(()=>[l(m,{modelValue:I.value,"onUpdate:modelValue":e[12]||(e[12]=o=>I.value=o),min:0,max:999999},null,8,["modelValue"])]),_:1})]),_:1}),l(u,{type:"primary",onClick:R},{default:t(()=>[...e[29]||(e[29]=[c("保存注册设置",-1)])]),_:1})]),_:1})])),[[le,v.value]])}}},we=oe(be,[["__scopeId","data-v-bb187149"]]);export{we as default};