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