Files
zsglpt/static/admin/assets/SystemPage-Dmtz_emI.js

23 lines
15 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 Ue,a as Pe,b as Ce,c as he,u as Q,e as Be,r as Te,d as Ie}from"./update-BrAMPxiF.js";import{S as X,_ as Ne,r,c as Se,o as Ae,U as Le,J as se,I as $e,e as C,f as i,g as l,w as t,n as m,h as v,x as u,y as n,j as x,F as je,p as Ee,m as y,K as L,L as b}from"./index-Da0EvMWc.js";async function Re(){const{data:h}=await X.get("/proxy/config");return h}async function De(h){const{data:w}=await X.post("/proxy/config",h);return w}async function Fe(h){const{data:w}=await X.post("/proxy/test",h);return w}const He={class:"page-stack"},Me={class:"app-page-title"},ze={class:"row-actions"},qe={class:"row-actions"},Oe={class:"row-actions",style:{"align-items":"center"}},We={class:"row-actions"},Ge={key:0},Je={key:1},Ke={key:2},Qe={key:3,class:"help"},Xe={key:4,class:"help"},Ye={__name:"SystemPage",setup(h){const w=r(!1),$=r(2),j=r(1),E=r(3),g=r(!1),R=r("02:00"),B=r("应读"),k=r(["1","2","3","4","5","6","7"]),T=r(!1),V=r(""),D=r(3),F=r(!1),H=r(10),M=r(7),G=r(!1),U=r(!1),_=r(null),z=r(""),d=r(null),q=r(""),J=r(!1),O=r(!1);let I=null;const re=[{label:"周一",value:"1"},{label:"周二",value:"2"},{label:"周三",value:"3"},{label:"周四",value:"4"},{label:"周五",value:"5"},{label:"周六",value:"6"},{label:"周日",value:"7"}],de={1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六",7:"周日"},ie=Se(()=>(k.value||[]).map(a=>de[Number(a)]||a).join("、"));function me(a){return String(a)==="注册前未读"?"注册前未读":"应读"}function N(a){const e=String(a||"").trim();return e?e.length>12?`${e.slice(0,12)}`:e:"-"}async function S({withLog:a=!0}={}){G.value=!0,z.value="";try{const[e,s]=await Promise.all([Pe(),Ce()]);e?.ok?_.value=e.data||null:(_.value=null,z.value=e?.error||"未发现更新状态Update-Agent 可能未运行)"),d.value=s?.ok?s.data:null;const f=d.value?.job_id;if(a&&f){const p=await he({job_id:f,max_bytes:2e5});q.value=p?.log||"",J.value=!!p?.truncated}else q.value="",J.value=!1}catch{}finally{G.value=!1}}function Y(){I||(I=setInterval(async()=>{d.value?.status==="running"&&await S()},5e3))}function pe(){I&&(clearInterval(I),I=null)}async function Z(){w.value=!0;try{const[a,e]=await Promise.all([Ue(),Re()]);$.value=a.max_concurrent_global??2,j.value=a.max_concurrent_per_account??1,E.value=a.max_screenshot_concurrent??3,g.value=(a.schedule_enabled??0)===1,R.value=a.schedule_time||"02:00",B.value=me(a.schedule_browse_type);const s=String(a.schedule_weekdays||"1,2,3,4,5,6,7").split(",").map(f=>f.trim()).filter(Boolean);k.value=s.length?s:["1","2","3","4","5","6","7"],F.value=(a.auto_approve_enabled??0)===1,H.value=a.auto_approve_hourly_limit??10,M.value=a.auto_approve_vip_days??7,T.value=(e.proxy_enabled??0)===1,V.value=e.proxy_api_url||"",D.value=e.proxy_expire_minutes??3,await S({withLog:!1}),Y()}catch{}finally{w.value=!1}}async function ce(){const a={max_concurrent_global:Number($.value),max_concurrent_per_account:Number(j.value),max_screenshot_concurrent:Number(E.value)};try{await L.confirm(`确定更新并发配置吗?
全局并发数: ${a.max_concurrent_global}
单账号并发数: ${a.max_concurrent_per_account}
截图并发数: ${a.max_screenshot_concurrent}`,"保存并发配置",{confirmButtonText:"保存",cancelButtonText:"取消",type:"warning"})}catch{return}try{const e=await Q(a);b.success(e?.message||"并发配置已更新")}catch{}}async function ve(){if(g.value&&(!k.value||k.value.length===0)){b.error("请至少选择一个执行日期");return}const a={schedule_enabled:g.value?1:0,schedule_time:R.value,schedule_browse_type:B.value,schedule_weekdays:(k.value||[]).join(",")},e=g.value?`确定启用定时任务吗?
执行时间: 每天 ${a.schedule_time}
执行日期: ${ie.value}
浏览类型: ${a.schedule_browse_type}
系统将自动执行所有账号的浏览任务(不包含截图)`:"确定关闭定时任务吗?";try{await L.confirm(e,"保存定时任务",{confirmButtonText:"确认",cancelButtonText:"取消",type:"warning"})}catch{return}try{const s=await Q(a);b.success(s?.message||(g.value?"定时任务已启用":"定时任务已关闭"))}catch{}}async function fe(){const a=`确定要立即执行定时任务吗?
这将执行所有账号的浏览任务
浏览类型: ${B.value}
注意:无视定时时间和执行日期配置,立即开始执行!`;try{await L.confirm(a,"立即执行",{confirmButtonText:"立即执行",cancelButtonText:"取消",type:"warning"})}catch{return}try{const e=await Be();b.success(e?.message||"定时任务已开始执行")}catch{}}async function ye(){if(T.value&&!V.value.trim()){b.error("启用代理时API地址不能为空");return}const a={proxy_enabled:T.value?1:0,proxy_api_url:V.value.trim(),proxy_expire_minutes:Number(D.value)||3};try{const e=await De(a);b.success(e?.message||"代理配置已更新")}catch{}}async function _e(){if(!V.value.trim()){b.error("请先输入代理API地址");return}try{const a=await Fe({api_url:V.value.trim()});await L.alert(a?.message||"测试完成","代理测试",{confirmButtonText:"知道了"})}catch{}}async function be(){const a=Number(H.value),e=Number(M.value);if(!Number.isFinite(a)||a<1){b.error("每小时注册限制必须大于0");return}if(!Number.isFinite(e)||e<0){b.error("VIP天数不能为负数");return}const s={auto_approve_enabled:F.value?1:0,auto_approve_hourly_limit:a,auto_approve_vip_days:e};try{const f=await Q(s);b.success(f?.message||"注册设置已保存")}catch{}}async function ge(){U.value=!0;try{const a=await Te();b.success(a?.success?"已触发检查更新":"已提交检查请求"),setTimeout(()=>S({withLog:!1}),800)}catch{}finally{U.value=!1}}async function xe(){const a=_.value,e=a?.remote_commit?N(a.remote_commit):"-",s=O.value?`
构建选项: 强制重建(--no-cache`:"";try{await L.confirm(`确定开始“一键更新”吗?
目标版本: ${e}${s}
更新将会重建并重启服务,页面可能短暂不可用;系统会先备份数据库。`,"一键更新确认",{confirmButtonText:"开始更新",cancelButtonText:"取消",type:"warning"})}catch{return}U.value=!0;try{const f=await Ie({build_no_cache:O.value?1:0});b.success(f?.message||"已提交更新请求"),Y(),setTimeout(()=>S(),800)}catch{}finally{U.value=!1}}return Ae(Z),Le(pe),(a,e)=>{const s=m("el-button"),f=m("el-input-number"),p=m("el-form-item"),W=m("el-form"),A=m("el-card"),K=m("el-switch"),we=m("el-time-picker"),ee=m("el-option"),ke=m("el-select"),le=m("el-checkbox"),Ve=m("el-checkbox-group"),te=m("el-input"),ae=m("el-alert"),c=m("el-descriptions-item"),P=m("el-tag"),oe=m("el-descriptions"),ne=m("el-divider"),ue=$e("loading");return se((u(),C("div",He,[i("div",Me,[e[16]||(e[16]=i("h2",null,"系统配置",-1)),i("div",null,[l(s,{onClick:Z},{default:t(()=>[...e[15]||(e[15]=[n("刷新",-1)])]),_:1})])]),l(A,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:t(()=>[e[21]||(e[21]=i("h3",{class:"section-title"},"系统并发配置",-1)),l(W,{"label-width":"130px"},{default:t(()=>[l(p,{label:"全局最大并发数"},{default:t(()=>[l(f,{modelValue:$.value,"onUpdate:modelValue":e[0]||(e[0]=o=>$.value=o),min:1,max:200},null,8,["modelValue"]),e[17]||(e[17]=i("div",{class:"help"},"同时最多运行的账号数量(浏览任务使用 API 方式,资源占用较低)。",-1))]),_:1}),l(p,{label:"单账号最大并发数"},{default:t(()=>[l(f,{modelValue:j.value,"onUpdate:modelValue":e[1]||(e[1]=o=>j.value=o),min:1,max:50},null,8,["modelValue"]),e[18]||(e[18]=i("div",{class:"help"},"单个账号同时最多运行的任务数量(建议设为 1。",-1))]),_:1}),l(p,{label:"截图最大并发数"},{default:t(()=>[l(f,{modelValue:E.value,"onUpdate:modelValue":e[2]||(e[2]=o=>E.value=o),min:1,max:50},null,8,["modelValue"]),e[19]||(e[19]=i("div",{class:"help"},"同时进行截图的最大数量(每个浏览器约占用 200MB 内存)。",-1))]),_:1})]),_:1}),l(s,{type:"primary",onClick:ce},{default:t(()=>[...e[20]||(e[20]=[n("保存并发配置",-1)])]),_:1})]),_:1}),l(A,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:t(()=>[e[24]||(e[24]=i("h3",{class:"section-title"},"定时任务配置",-1)),l(W,{"label-width":"130px"},{default:t(()=>[l(p,{label:"启用定时任务"},{default:t(()=>[l(K,{modelValue:g.value,"onUpdate:modelValue":e[3]||(e[3]=o=>g.value=o)},null,8,["modelValue"])]),_:1}),g.value?(u(),v(p,{key:0,label:"执行时间"},{default:t(()=>[l(we,{modelValue:R.value,"onUpdate:modelValue":e[4]||(e[4]=o=>R.value=o),"value-format":"HH:mm",format:"HH:mm"},null,8,["modelValue"])]),_:1})):x("",!0),g.value?(u(),v(p,{key:1,label:"浏览类型"},{default:t(()=>[l(ke,{modelValue:B.value,"onUpdate:modelValue":e[5]||(e[5]=o=>B.value=o),style:{width:"220px"}},{default:t(()=>[l(ee,{label:"注册前未读",value:"注册前未读"}),l(ee,{label:"应读",value:"应读"})]),_:1},8,["modelValue"])]),_:1})):x("",!0),g.value?(u(),v(p,{key:2,label:"执行日期"},{default:t(()=>[l(Ve,{modelValue:k.value,"onUpdate:modelValue":e[6]||(e[6]=o=>k.value=o)},{default:t(()=>[(u(),C(je,null,Ee(re,o=>l(le,{key:o.value,label:o.value},{default:t(()=>[n(y(o.label),1)]),_:2},1032,["label"])),64))]),_:1},8,["modelValue"])]),_:1})):x("",!0)]),_:1}),i("div",ze,[l(s,{type:"primary",onClick:ve},{default:t(()=>[...e[22]||(e[22]=[n("保存定时任务配置",-1)])]),_:1}),l(s,{type:"success",plain:"",onClick:fe},{default:t(()=>[...e[23]||(e[23]=[n("立即执行",-1)])]),_:1})])]),_:1}),l(A,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:t(()=>[e[29]||(e[29]=i("h3",{class:"section-title"},"代理设置",-1)),l(W,{"label-width":"130px"},{default:t(()=>[l(p,{label:"启用IP代理"},{default:t(()=>[l(K,{modelValue:T.value,"onUpdate:modelValue":e[7]||(e[7]=o=>T.value=o)},null,8,["modelValue"]),e[25]||(e[25]=i("div",{class:"help"},"开启后所有浏览任务将通过代理IP访问失败自动重试3次。",-1))]),_:1}),l(p,{label:"代理API地址"},{default:t(()=>[l(te,{modelValue:V.value,"onUpdate:modelValue":e[8]||(e[8]=o=>V.value=o),placeholder:"http://api.xxx/Tools/IP.ashx?..."},null,8,["modelValue"]),e[26]||(e[26]=i("div",{class:"help"},"API 应返回IP:PORT例如 123.45.67.89:8888。",-1))]),_:1}),l(p,{label:"代理有效期(分钟)"},{default:t(()=>[l(f,{modelValue:D.value,"onUpdate:modelValue":e[9]||(e[9]=o=>D.value=o),min:1,max:60},null,8,["modelValue"])]),_:1})]),_:1}),i("div",qe,[l(s,{type:"primary",onClick:ye},{default:t(()=>[...e[27]||(e[27]=[n("保存代理配置",-1)])]),_:1}),l(s,{onClick:_e},{default:t(()=>[...e[28]||(e[28]=[n("测试代理",-1)])]),_:1})])]),_:1}),l(A,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:t(()=>[e[32]||(e[32]=i("h3",{class:"section-title"},"注册设置",-1)),l(W,{"label-width":"130px"},{default:t(()=>[l(p,{label:"注册赠送VIP"},{default:t(()=>[l(K,{modelValue:F.value,"onUpdate:modelValue":e[10]||(e[10]=o=>F.value=o)},null,8,["modelValue"]),e[30]||(e[30]=i("div",{class:"help"},"开启后新用户注册成功后将赠送下方设置的VIP天数注册已默认无需审核。",-1))]),_:1}),l(p,{label:"每小时注册限制"},{default:t(()=>[l(f,{modelValue:H.value,"onUpdate:modelValue":e[11]||(e[11]=o=>H.value=o),min:1,max:1e4},null,8,["modelValue"])]),_:1}),l(p,{label:"注册赠送VIP天数"},{default:t(()=>[l(f,{modelValue:M.value,"onUpdate:modelValue":e[12]||(e[12]=o=>M.value=o),min:0,max:999999},null,8,["modelValue"])]),_:1})]),_:1}),l(s,{type:"primary",onClick:be},{default:t(()=>[...e[31]||(e[31]=[n("保存注册设置",-1)])]),_:1})]),_:1}),se((u(),v(A,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:t(()=>[e[47]||(e[47]=i("h3",{class:"section-title"},"版本与更新",-1)),_.value?.update_available?(u(),v(ae,{key:0,type:"warning",closable:!1,title:"检测到新版本:可以在此页面点击“一键更新”升级并自动重启服务。",style:{"margin-bottom":"10px"}})):x("",!0),z.value?(u(),v(ae,{key:1,type:"info",closable:!1,title:z.value,style:{"margin-bottom":"10px"}},null,8,["title"])):x("",!0),l(oe,{border:"",column:1,size:"small",style:{"margin-bottom":"10px"}},{default:t(()=>[l(c,{label:"本地版本(commit)"},{default:t(()=>[n(y(N(_.value?.local_commit)),1)]),_:1}),l(c,{label:"远端版本(commit)"},{default:t(()=>[n(y(N(_.value?.remote_commit)),1)]),_:1}),l(c,{label:"是否有更新"},{default:t(()=>[_.value?.update_available?(u(),v(P,{key:0,type:"danger"},{default:t(()=>[...e[33]||(e[33]=[n("有",-1)])]),_:1})):(u(),v(P,{key:1,type:"success"},{default:t(()=>[...e[34]||(e[34]=[n("无",-1)])]),_:1}))]),_:1}),l(c,{label:"工作区修改"},{default:t(()=>[_.value?.dirty?(u(),v(P,{key:0,type:"warning"},{default:t(()=>[...e[35]||(e[35]=[n("有未提交修改",-1)])]),_:1})):(u(),v(P,{key:1,type:"info"},{default:t(()=>[...e[36]||(e[36]=[n("干净",-1)])]),_:1}))]),_:1}),l(c,{label:"最近检查时间"},{default:t(()=>[n(y(_.value?.checked_at||"-"),1)]),_:1}),_.value?.error?(u(),v(c,{key:0,label:"检查错误"},{default:t(()=>[n(y(_.value?.error),1)]),_:1})):x("",!0)]),_:1}),i("div",Oe,[l(le,{modelValue:O.value,"onUpdate:modelValue":e[13]||(e[13]=o=>O.value=o)},{default:t(()=>[...e[37]||(e[37]=[n("强制重建(--no-cache",-1)])]),_:1},8,["modelValue"]),e[38]||(e[38]=i("div",{class:"help",style:{"margin-top":"0"}},"依赖变更或构建异常时建议开启(更新会更慢)。",-1))]),i("div",We,[l(s,{onClick:S,disabled:U.value},{default:t(()=>[...e[39]||(e[39]=[n("刷新更新信息",-1)])]),_:1},8,["disabled"]),l(s,{onClick:ge,loading:U.value},{default:t(()=>[...e[40]||(e[40]=[n("检查更新",-1)])]),_:1},8,["loading"]),l(s,{type:"danger",onClick:xe,loading:U.value,disabled:!_.value?.update_available},{default:t(()=>[...e[41]||(e[41]=[n(" 一键更新 ",-1)])]),_:1},8,["loading","disabled"])]),l(ne,{"content-position":"left"},{default:t(()=>[...e[42]||(e[42]=[n("最近一次更新结果",-1)])]),_:1}),d.value?(u(),v(oe,{key:2,border:"",column:1,size:"small",style:{"margin-bottom":"10px"}},{default:t(()=>[l(c,{label:"job_id"},{default:t(()=>[n(y(d.value.job_id),1)]),_:1}),l(c,{label:"状态"},{default:t(()=>[d.value.status==="running"?(u(),v(P,{key:0,type:"warning"},{default:t(()=>[...e[43]||(e[43]=[n("运行中",-1)])]),_:1})):d.value.status==="success"?(u(),v(P,{key:1,type:"success"},{default:t(()=>[...e[44]||(e[44]=[n("成功",-1)])]),_:1})):(u(),v(P,{key:2,type:"danger"},{default:t(()=>[...e[45]||(e[45]=[n("失败",-1)])]),_:1}))]),_:1}),l(c,{label:"阶段"},{default:t(()=>[n(y(d.value.stage||"-"),1)]),_:1}),l(c,{label:"开始时间"},{default:t(()=>[n(y(d.value.started_at||"-"),1)]),_:1}),l(c,{label:"结束时间"},{default:t(()=>[n(y(d.value.finished_at||"-"),1)]),_:1}),l(c,{label:"耗时(秒)"},{default:t(()=>[n(y(d.value.duration_seconds??"-"),1)]),_:1}),l(c,{label:"更新前(commit)"},{default:t(()=>[n(y(N(d.value.from_commit)),1)]),_:1}),l(c,{label:"更新后(commit)"},{default:t(()=>[n(y(N(d.value.to_commit)),1)]),_:1}),l(c,{label:"健康检查"},{default:t(()=>[d.value.health_ok===!0?(u(),C("span",Ge,"通过("+y(d.value.health_message)+"",1)):d.value.health_ok===!1?(u(),C("span",Je,"失败("+y(d.value.health_message)+"",1)):(u(),C("span",Ke,"-"))]),_:1}),d.value.error?(u(),v(c,{key:0,label:"错误"},{default:t(()=>[n(y(d.value.error),1)]),_:1})):x("",!0)]),_:1})):(u(),C("div",Qe,"暂无更新记录。")),l(ne,{"content-position":"left"},{default:t(()=>[...e[46]||(e[46]=[n("更新日志",-1)])]),_:1}),J.value?(u(),C("div",Xe,"日志过长,仅展示末尾内容。")):x("",!0),l(te,{modelValue:q.value,"onUpdate:modelValue":e[14]||(e[14]=o=>q.value=o),type:"textarea",rows:10,readonly:"",placeholder:"暂无日志"},null,8,["modelValue"])]),_:1})),[[ue,G.value]])])),[[ue,w.value]])}}},ll=Ne(Ye,[["__scopeId","data-v-d88590f1"]]);export{ll as default};