1. 风险分衰减定时任务: - services/scheduler.py: 每天 CST 04:00 自动执行 decay_scores() - 支持 RISK_SCORE_DECAY_TIME_CST 环境变量覆盖 2. 密码长度提示统一为8位: - app-frontend/src/pages/RegisterPage.vue - app-frontend/src/layouts/AppLayout.vue - admin-frontend/src/pages/SettingsPage.vue - templates/register.html 3. 浏览器池统计API: - GET /yuyx/api/browser_pool/stats - 返回 worker 状态、队列等待数等信息 - browser_pool_worker.py: 增强 get_stats() 方法 4. 登录后支持 next 参数回跳: - app-frontend/src/pages/LoginPage.vue: 检查 ?next= 参数 - 仅允许站内路径(防止开放重定向) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
17 lines
9.5 KiB
JavaScript
17 lines
9.5 KiB
JavaScript
import{f as ae,u as S,e as te}from"./system-C_4M4EtK.js";import{P as D,_ as oe,r as s,c as ne,o as ue,e as d,H as se,I as re,g as V,f as F,h as n,j as l,w as t,p as c,A as E,m as $,F as de,q as ie,n as me,J as T,K as p}from"./index-Dx-1XhY8.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 T.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 T.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 T.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 T.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"),A=d("el-card"),U=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(A,{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(A,{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(U,{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(A,{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(U,{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(A,{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(U,{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};
|