Files
zsglpt/static/admin/assets/EmailPage-DyjXJ34D.js

2 lines
16 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{B as w,_ as Ve,r as c,C as le,z as Se,y as xe,o as Ce,c as he,a as o,j as I,b as t,w as s,d as _,e as Be,k as E,g as T,h as p,t as r,l as se,E as P,m as v}from"./index-BrN7V6n-.js";async function Te(){const{data:d}=await w.get("/email/settings");return d}async function ke(d){const{data:m}=await w.post("/email/settings",d);return m}async function Ue(){const{data:d}=await w.get("/email/stats");return d}async function Ee(d){const{data:m}=await w.get("/email/logs",{params:d});return m}async function Pe(d){const{data:m}=await w.post("/email/logs/cleanup",{days:d});return m}async function Le(){const{data:d}=await w.get("/smtp/configs");return d}async function Me(d){const{data:m}=await w.post("/smtp/configs",d);return m}async function $e(d,m){const{data:y}=await w.put(`/smtp/configs/${d}`,m);return y}async function Ne(d){const{data:m}=await w.delete(`/smtp/configs/${d}`);return m}async function De(d,m){const{data:y}=await w.post(`/smtp/configs/${d}/test`,{email:m});return y}async function ze(d){const{data:m}=await w.post(`/smtp/configs/${d}/primary`);return m}const Fe={class:"page-stack"},je={class:"app-page-title"},Ie={class:"toolbar"},Ae={class:"help app-muted"},He={class:"section-head"},Oe={class:"table-wrap"},Re={class:"stat-value"},qe={class:"stat-value ok"},Ge={class:"stat-value err"},Je={class:"stat-value"},Ke={class:"sub-stats"},Qe={class:"help app-muted"},We={class:"section-head"},Xe={class:"toolbar"},Ye={class:"table-wrap"},Ze=["title"],et=["title"],tt={class:"pagination"},at={class:"page-hint app-muted"},lt={class:"dialog-actions"},ne=15,st={__name:"EmailPage",setup(d){const m=c(!1),y=c(!1),u=le({enabled:!1,failover_enabled:!0,register_verify_enabled:!1,task_notify_enabled:!1,base_url:"",updated_at:null});let k=null;async function W(){m.value=!0;try{const n=await Te();u.enabled=!!n.enabled,u.failover_enabled=!!n.failover_enabled,u.register_verify_enabled=!!n.register_verify_enabled,u.task_notify_enabled=!!n.task_notify_enabled,u.base_url=n.base_url||"",u.updated_at=n.updated_at||null}catch{}finally{m.value=!1}}async function oe(){if(!m.value){y.value=!0;try{const n=await ke({enabled:u.enabled,failover_enabled:u.failover_enabled,register_verify_enabled:u.register_verify_enabled,task_notify_enabled:u.task_notify_enabled,base_url:(u.base_url||"").trim()});if(!n?.success){v.error(n?.error||"更新失败");return}v.success("邮件设置已更新"),await W()}catch{}finally{y.value=!1}}}function L(){k&&window.clearTimeout(k),k=window.setTimeout(oe,300)}Se(()=>{k&&window.clearTimeout(k),k=null});const A=c(!1),H=c([]),x=c(!1),V=c(!1),O=c(!1),a=le({id:null,name:"默认配置",enabled:!0,host:"",port:465,username:"",password:"",use_ssl:!0,use_tls:!1,sender_name:"自动化学习",sender_email:"",daily_limit:0,priority:0}),ie=xe(()=>V.value&&O.value?"留空保持不变":"SMTP密码或授权码");function X(){a.id=null,a.name="默认配置",a.enabled=!0,a.host="",a.port=465,a.username="",a.password="",a.use_ssl=!0,a.use_tls=!1,a.sender_name="自动化学习",a.sender_email="",a.daily_limit=0,a.priority=0,O.value=!1}async function M(){A.value=!0;try{H.value=await Le()}catch{H.value=[]}finally{A.value=!1}}function de(){V.value=!1,X(),x.value=!0}function ue(n){V.value=!0,X(),a.id=n.id,a.name=n.name||"默认配置",a.enabled=!!n.enabled,a.host=n.host||"",a.port=n.port||465,a.username=n.username||"",a.password="",a.use_ssl=!!n.use_ssl,a.use_tls=!!n.use_tls,a.sender_name=n.sender_name||"自动化学习",a.sender_email=n.sender_email||"",a.daily_limit=n.daily_limit??0,a.priority=n.priority??0,O.value=!!n.has_password,x.value=!0}function Y(n){return n.is_primary?{label:"主",type:"warning"}:n.enabled?{label:"备用",type:"success"}:{label:"禁用",type:"info"}}function re(n){return n.daily_limit&&n.daily_limit>0?`${n.daily_sent}/${n.daily_limit}`:`${n.daily_sent}/∞`}async function me(){if(!a.host.trim()){v.error("SMTP服务器地址不能为空");return}if(!a.username.trim()){v.error("SMTP用户名不能为空");return}const n={name:a.name.trim()||"默认配置",enabled:!!a.enabled,priority:Number(a.priority)||0,host:a.host.trim(),port:Number(a.port)||465,username:a.username.trim(),use_ssl:!!a.use_ssl,use_tls:!!a.use_tls,sender_name:(a.sender_name||"").trim(),sender_email:(a.sender_email||"").trim(),daily_limit:Number(a.daily_limit)||0};try{if(V.value){const e={...n};a.password&&(e.password=a.password);const i=await $e(a.id,e);if(!i?.success){v.error(i?.error||"更新失败");return}v.success("保存成功")}else{const e={...n};a.password&&(e.password=a.password);const i=await Me(e);if(!i?.success){v.error(i?.error||"创建失败");return}v.success("创建成功")}x.value=!1,await M()}catch{}}async function pe(){if(!V.value||!a.id){v.error("请先保存配置后再测试");return}let n;try{const e=await P.prompt("请输入测试收件邮箱","测试连接",{inputPlaceholder:"name@example.com",confirmButtonText:"发送测试邮件",cancelButtonText:"取消",inputValidator:i=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(i||"").trim()),inputErrorMessage:"邮箱格式不正确"});n=String(e.value||"").trim()}catch{return}try{const e=await De(a.id,n);e?.success?(v.success("测试成功,邮件已发送"),await M()):await P.alert(e?.error||"测试失败","测试失败",{confirmButtonText:"知道了"})}catch{}}async function fe(){if(!(!V.value||!a.id)){try{await P.confirm("确定将该配置设为主配置吗?","设为主配置",{confirmButtonText:"设为主配置",cancelButtonText:"取消",type:"warning"})}catch{return}try{const n=await ze(a.id);if(!n?.success){v.error(n?.error||"设置失败");return}v.success("已设为主配置"),x.value=!1,await M()}catch{}}}async function ce(){if(!(!V.value||!a.id)){try{await P.confirm("确定删除该SMTP配置吗此操作不可恢复。","删除配置",{confirmButtonText:"删除",cancelButtonText:"取消",type:"error"})}catch{return}try{const n=await Ne(a.id);if(!n?.success){v.error(n?.error||"删除失败");return}v.success("已删除"),x.value=!1,await M()}catch{}}}const R=c(!1),g=c({}),q=c(!1),N=c(""),D=c(""),z=c(1),G=c([]),J=c(0),K=c(1);function _e(n){return{register:"注册验证",reset:"密码重置",bind:"邮箱绑定",task_complete:"任务完成"}[n]||n}async function ve(){R.value=!0;try{g.value=await Ue()}catch{g.value={}}finally{R.value=!1}}async function $(n=1){q.value=!0;try{const e={page:n,page_size:ne};N.value&&(e.type=N.value),D.value&&(e.status=D.value);const i=await Ee(e);G.value=i?.logs||[],J.value=i?.total||0,z.value=i?.page||n,K.value=i?.total_pages||1}catch{G.value=[],J.value=0,K.value=1}finally{q.value=!1}}async function be(){let n;try{const e=await P.prompt("请输入保留天数(将删除该天数之前的日志)","清理日志",{inputValue:"30",confirmButtonText:"清理",cancelButtonText:"取消",inputValidator:i=>{const S=parseInt(String(i),10);return Number.isFinite(S)&&S>=7},inputErrorMessage:"天数必须大于等于7"});n=parseInt(String(e.value),10)}catch{return}try{await P.confirm(`确定删除 ${n} 天之前的邮件日志吗?`,"二次确认",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}try{const e=await Pe(n);if(!e?.success){v.error(e?.error||"清理失败");return}v.success(`已清理 ${e.deleted} 条日志`),await $(1)}catch{}}async function Z(){await Promise.all([W(),M(),ve(),$(1)])}return Ce(Z),(n,e)=>{const i=_("el-button"),S=_("el-switch"),f=_("el-form-item"),B=_("el-input"),ee=_("el-form"),C=_("el-card"),U=_("el-tag"),b=_("el-table-column"),te=_("el-table"),F=_("el-col"),ye=_("el-row"),h=_("el-option"),ae=_("el-select"),ge=_("el-pagination"),Q=_("el-input-number"),we=_("el-dialog"),j=Be("loading");return T(),he("div",Fe,[o("div",je,[e[25]||(e[25]=o("h2",null,"邮件配置",-1)),o("div",Ie,[t(i,{onClick:Z},{default:s(()=>[...e[24]||(e[24]=[p("刷新",-1)])]),_:1})])]),I((T(),E(C,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:s(()=>[e[27]||(e[27]=o("h3",{class:"section-title"},"全局设置",-1)),t(ee,{"label-width":"140px"},{default:s(()=>[t(f,{label:"启用邮件功能"},{default:s(()=>[t(S,{modelValue:u.enabled,"onUpdate:modelValue":e[0]||(e[0]=l=>u.enabled=l),disabled:y.value,onChange:L},null,8,["modelValue","disabled"])]),_:1}),t(f,{label:"启用故障转移"},{default:s(()=>[t(S,{modelValue:u.failover_enabled,"onUpdate:modelValue":e[1]||(e[1]=l=>u.failover_enabled=l),disabled:y.value,onChange:L},null,8,["modelValue","disabled"])]),_:1}),t(f,{label:"启用注册邮箱验证"},{default:s(()=>[t(S,{modelValue:u.register_verify_enabled,"onUpdate:modelValue":e[2]||(e[2]=l=>u.register_verify_enabled=l),disabled:y.value,onChange:L},null,8,["modelValue","disabled"])]),_:1}),t(f,{label:"启用任务完成通知"},{default:s(()=>[t(S,{modelValue:u.task_notify_enabled,"onUpdate:modelValue":e[3]||(e[3]=l=>u.task_notify_enabled=l),disabled:y.value,onChange:L},null,8,["modelValue","disabled"])]),_:1}),t(f,{label:"网站基础URL"},{default:s(()=>[t(B,{modelValue:u.base_url,"onUpdate:modelValue":e[4]||(e[4]=l=>u.base_url=l),placeholder:"例如: https://example.com",disabled:y.value,onBlur:L},null,8,["modelValue","disabled"]),e[26]||(e[26]=o("div",{class:"help"},"用于生成邮件中的验证链接,留空则使用默认配置。",-1))]),_:1})]),_:1}),o("div",Ae,"最近更新时间:"+r(u.updated_at||"-"),1)]),_:1})),[[j,m.value]]),t(C,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:s(()=>[o("div",He,[e[29]||(e[29]=o("h3",{class:"section-title"},"SMTP配置列表",-1)),t(i,{type:"primary",onClick:de},{default:s(()=>[...e[28]||(e[28]=[p("+ 添加配置",-1)])]),_:1})]),o("div",Oe,[I((T(),E(te,{data:H.value,style:{width:"100%"}},{default:s(()=>[t(b,{label:"状态",width:"90"},{default:s(({row:l})=>[t(U,{type:Y(l).type,effect:"light"},{default:s(()=>[p(r(Y(l).label),1)]),_:2},1032,["type"])]),_:1}),t(b,{prop:"name",label:"名称","min-width":"160"}),t(b,{label:"服务器","min-width":"200"},{default:s(({row:l})=>[p(r(l.host)+":"+r(l.port),1)]),_:1}),t(b,{label:"今日/限额",width:"110"},{default:s(({row:l})=>[p(r(re(l)),1)]),_:1}),t(b,{label:"成功率",width:"100"},{default:s(({row:l})=>[p(r(l.success_rate)+"%",1)]),_:1}),t(b,{label:"操作",width:"120",fixed:"right"},{default:s(({row:l})=>[t(i,{size:"small",onClick:nt=>ue(l)},{default:s(()=>[...e[30]||(e[30]=[p("编辑",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[j,A.value]])])]),_:1}),I((T(),E(C,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:s(()=>[e[35]||(e[35]=o("h3",{class:"section-title"},"邮件发送统计",-1)),t(ye,{gutter:12},{default:s(()=>[t(F,{xs:12,sm:6},{default:s(()=>[t(C,{shadow:"never",class:"stat-card","body-style":{padding:"14px"}},{default:s(()=>[o("div",Re,r(g.value.total_sent||0),1),e[31]||(e[31]=o("div",{class:"stat-label"},"总发送",-1))]),_:1})]),_:1}),t(F,{xs:12,sm:6},{default:s(()=>[t(C,{shadow:"never",class:"stat-card","body-style":{padding:"14px"}},{default:s(()=>[o("div",qe,r(g.value.total_success||0),1),e[32]||(e[32]=o("div",{class:"stat-label"},"成功",-1))]),_:1})]),_:1}),t(F,{xs:12,sm:6},{default:s(()=>[t(C,{shadow:"never",class:"stat-card","body-style":{padding:"14px"}},{default:s(()=>[o("div",Ge,r(g.value.total_failed||0),1),e[33]||(e[33]=o("div",{class:"stat-label"},"失败",-1))]),_:1})]),_:1}),t(F,{xs:12,sm:6},{default:s(()=>[t(C,{shadow:"never",class:"stat-card","body-style":{padding:"14px"}},{default:s(()=>[o("div",Je,r(g.value.success_rate||0)+"%",1),e[34]||(e[34]=o("div",{class:"stat-label"},"成功率",-1))]),_:1})]),_:1})]),_:1}),o("div",Ke,[t(U,{effect:"light"},{default:s(()=>[p("注册验证 "+r(g.value.register_sent||0),1)]),_:1}),t(U,{effect:"light"},{default:s(()=>[p("密码重置 "+r(g.value.reset_sent||0),1)]),_:1}),t(U,{effect:"light"},{default:s(()=>[p("邮箱绑定 "+r(g.value.bind_sent||0),1)]),_:1}),t(U,{effect:"light"},{default:s(()=>[p("任务完成 "+r(g.value.task_complete_sent||0),1)]),_:1})]),o("div",Qe,"最后更新:"+r(g.value.last_updated||"-"),1)]),_:1})),[[j,R.value]]),t(C,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:s(()=>[o("div",We,[e[37]||(e[37]=o("h3",{class:"section-title"},"邮件发送日志",-1)),o("div",Xe,[t(ae,{modelValue:N.value,"onUpdate:modelValue":e[5]||(e[5]=l=>N.value=l),style:{width:"140px"},onChange:e[6]||(e[6]=l=>$(1))},{default:s(()=>[t(h,{label:"全部类型",value:""}),t(h,{label:"注册验证",value:"register"}),t(h,{label:"密码重置",value:"reset"}),t(h,{label:"邮箱绑定",value:"bind"}),t(h,{label:"任务完成",value:"task_complete"})]),_:1},8,["modelValue"]),t(ae,{modelValue:D.value,"onUpdate:modelValue":e[7]||(e[7]=l=>D.value=l),style:{width:"120px"},onChange:e[8]||(e[8]=l=>$(1))},{default:s(()=>[t(h,{label:"全部状态",value:""}),t(h,{label:"成功",value:"success"}),t(h,{label:"失败",value:"failed"})]),_:1},8,["modelValue"]),t(i,{type:"danger",plain:"",onClick:be},{default:s(()=>[...e[36]||(e[36]=[p("清理日志",-1)])]),_:1})])]),o("div",Ye,[I((T(),E(te,{data:G.value,style:{width:"100%"}},{default:s(()=>[t(b,{prop:"created_at",label:"时间",width:"180"}),t(b,{prop:"email_to",label:"收件人","min-width":"180"}),t(b,{label:"类型",width:"120"},{default:s(({row:l})=>[p(r(_e(l.email_type)),1)]),_:1}),t(b,{label:"主题","min-width":"220"},{default:s(({row:l})=>[o("span",{class:"ellipsis",title:l.subject},r(l.subject),9,Ze)]),_:1}),t(b,{label:"状态",width:"90"},{default:s(({row:l})=>[t(U,{type:l.status==="success"?"success":"danger",effect:"light"},{default:s(()=>[p(r(l.status==="success"?"成功":"失败"),1)]),_:2},1032,["type"])]),_:1}),t(b,{label:"错误","min-width":"200"},{default:s(({row:l})=>[o("span",{class:"ellipsis",title:l.error_message||""},r(l.error_message||"-"),9,et)]),_:1})]),_:1},8,["data"])),[[j,q.value]])]),o("div",tt,[t(ge,{"current-page":z.value,"onUpdate:currentPage":e[9]||(e[9]=l=>z.value=l),"page-size":ne,total:J.value,layout:"prev, pager, next, ->, total",onCurrentChange:$},null,8,["current-page","total"]),o("div",at,"第 "+r(z.value)+" / "+r(K.value)+" 页",1)])]),_:1}),t(we,{modelValue:x.value,"onUpdate:modelValue":e[23]||(e[23]=l=>x.value=l),title:V.value?"编辑SMTP配置":"添加SMTP配置",width:"min(560px, 92vw)"},{footer:s(()=>[o("div",lt,[t(i,{onClick:pe},{default:s(()=>[...e[38]||(e[38]=[p("测试连接",-1)])]),_:1}),V.value?(T(),E(i,{key:0,onClick:fe},{default:s(()=>[...e[39]||(e[39]=[p("设为主配置",-1)])]),_:1})):se("",!0),V.value?(T(),E(i,{key:1,type:"danger",plain:"",onClick:ce},{default:s(()=>[...e[40]||(e[40]=[p("删除配置",-1)])]),_:1})):se("",!0),e[43]||(e[43]=o("div",{class:"spacer"},null,-1)),t(i,{onClick:e[22]||(e[22]=l=>x.value=!1)},{default:s(()=>[...e[41]||(e[41]=[p("取消",-1)])]),_:1}),t(i,{type:"primary",onClick:me},{default:s(()=>[...e[42]||(e[42]=[p("保存",-1)])]),_:1})])]),default:s(()=>[t(ee,{"label-width":"120px"},{default:s(()=>[t(f,{label:"名称"},{default:s(()=>[t(B,{modelValue:a.name,"onUpdate:modelValue":e[10]||(e[10]=l=>a.name=l)},null,8,["modelValue"])]),_:1}),t(f,{label:"启用"},{default:s(()=>[t(S,{modelValue:a.enabled,"onUpdate:modelValue":e[11]||(e[11]=l=>a.enabled=l)},null,8,["modelValue"])]),_:1}),t(f,{label:"服务器"},{default:s(()=>[t(B,{modelValue:a.host,"onUpdate:modelValue":e[12]||(e[12]=l=>a.host=l),placeholder:"smtp.example.com"},null,8,["modelValue"])]),_:1}),t(f,{label:"端口"},{default:s(()=>[t(Q,{modelValue:a.port,"onUpdate:modelValue":e[13]||(e[13]=l=>a.port=l),min:1,max:65535},null,8,["modelValue"])]),_:1}),t(f,{label:"用户名"},{default:s(()=>[t(B,{modelValue:a.username,"onUpdate:modelValue":e[14]||(e[14]=l=>a.username=l)},null,8,["modelValue"])]),_:1}),t(f,{label:"密码"},{default:s(()=>[t(B,{modelValue:a.password,"onUpdate:modelValue":e[15]||(e[15]=l=>a.password=l),type:"password","show-password":"",placeholder:ie.value},null,8,["modelValue","placeholder"])]),_:1}),t(f,{label:"SSL"},{default:s(()=>[t(S,{modelValue:a.use_ssl,"onUpdate:modelValue":e[16]||(e[16]=l=>a.use_ssl=l)},null,8,["modelValue"])]),_:1}),t(f,{label:"TLS"},{default:s(()=>[t(S,{modelValue:a.use_tls,"onUpdate:modelValue":e[17]||(e[17]=l=>a.use_tls=l)},null,8,["modelValue"])]),_:1}),t(f,{label:"发件人名称"},{default:s(()=>[t(B,{modelValue:a.sender_name,"onUpdate:modelValue":e[18]||(e[18]=l=>a.sender_name=l)},null,8,["modelValue"])]),_:1}),t(f,{label:"发件人邮箱"},{default:s(()=>[t(B,{modelValue:a.sender_email,"onUpdate:modelValue":e[19]||(e[19]=l=>a.sender_email=l),placeholder:"可选"},null,8,["modelValue"])]),_:1}),t(f,{label:"每日限额"},{default:s(()=>[t(Q,{modelValue:a.daily_limit,"onUpdate:modelValue":e[20]||(e[20]=l=>a.daily_limit=l),min:0,max:1e6},null,8,["modelValue"])]),_:1}),t(f,{label:"优先级"},{default:s(()=>[t(Q,{modelValue:a.priority,"onUpdate:modelValue":e[21]||(e[21]=l=>a.priority=l),min:0,max:1e3},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue","title"])])}}},it=Ve(st,[["__scopeId","data-v-0dc47913"]]);export{it as default};