23 lines
15 KiB
JavaScript
23 lines
15 KiB
JavaScript
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-BqIWfEYV.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-B57Le1Kd.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};
|