PageSourceSearch

https://newmanager.wechatapi.net/_nuxt/D716qGKn.js

js wechatapi.net collected 2026-10-06 14:14:08 UTC 12,406 bytes, 1 lines download raw bytes

1import{G as F}from"./B8GfTJIh.js";import{G as ie}from"./DB_JrYOs.js";import{_ as ue}from"./SypvEzTk.js";import{G as re}from"./Dr5LZDZS.js";import{f as de,g as me,h as ve,c as d,a as t,G as w,H as z,i as a,I as be,J as O,E as p,b as H,d as L,t as g,k as h,V as ce,F as q,s as W,n as P,r as o,W as pe,X as ge,Y as xe,Z as ye,o as m,v as fe,l as n,$ as je,a0 as we,_ as ke}from"./BIa-rvUl.js";import"./D-rfyR7C.js";import"./wj2zYrbi.js";import"./DVRxrgot.js";const Ce={class:"gw-filter-box"},Se={class:"flex gap-2 ml-auto"},Ne=["disabled"],$e=["disabled"],Ee=["disabled"],Ve={key:0,class:"gw-card mb-4"},ze={class:"text-xs",style:{color:"var(--gw-text-muted)"}},Te={class:"gw-card job-modal"},Ge={class:"job-modal-head"},Me=["value"],Ue={class:"job-cron-presets"},Je=["onClick"],De={class:"job-status-options"},he={key:2,class:"job-modal-error"},Ae={class:"job-modal-actions"},Ke=["disabled"],Oe={class:"gw-card job-modal job-modal--narrow"},Pe={class:"job-modal-head"},Re={class:"job-modal-text"},Ie={class:"job-modal-actions"},Be=["disabled"],Fe=de({__name:"jobs",setup(He){const{showToast:x}=me(),k=o(!1),A=o(!0),R=o(""),I=o([]),B=o(0),b=o(1),K=o(20),T=o(""),C=o("all"),M=o([]),X=[{label:"每天 10:00",value:"0 0 10 * * ?"},{label:"每天 09:00",value:"0 0 9 * * ?"},{label:"每小时整点",value:"0 0 * * * ?"},{label:"每 10 分钟",value:"0 0/10 * * * ?"}];async function u(l){b.value=Math.max(1,l),k.value=!0;try{const e=C.value==="all"?void 0:Number(C.value),i=await pe({page_no:b.value,page_size:K.value,keyword:T.value.trim()||void 0,status:e});A.value=i.available,R.value=i.message||"",I.value=i.data?.lists||[],B.value=i.data?.count??0}finally{k.value=!1}}async function Y(){try{M.value=await ge()}catch{}}function Z(){C.value="all",T.value="",u(1)}const y=o(!1),U=o(!1),S=o(null),f=o(""),r=o(""),v=o("0 0 10 * * ?"),N=o(""),$=o(""),j=o(0),c=o(""),Q=fe(()=>S.value===null?"新增任务":"编辑任务");function _(){S.value=null,f.value="",r.value=M.value[0]||"",v.value="0 0 10 * * ?",N.value="",$.value="",j.value=0,c.value="",y.value=!0}function ee(l){S.value=l.id,f.value=l.jobName,r.value=l.jobKey,v.value=l.cronExpression,N.value=l.jobParams,$.value=l.remark,j.value=l.status,c.value="",y.value=!0}async function te(){if(c.value="",!f.value.trim()||!r.value.trim()||!v.value.trim()){c.value="任务名称、任务标识、cron 表达式都不能为空";return}const l=N.value.trim();if(l)try{JSON.parse(l)}catch{c.value='任务参数必须是合法 JSON,例如 {"limit":200}';return}U.value=!0;try{await xe({id:S.value??void 0,jobName:f.value.trim(),jobKey:r.value.trim(),cronExpression:v.value.trim(),jobParams:l||void 0,remark:$.value.trim()||void 0,status:j.value}),x(S.value===null?"任务已创建":"任务已保存","success"),y.value=!1,u(S.value===null?1:b.value)}catch(e){c.value=e?.msg||"保存失败"}finally{U.value=!1}}const G=o(null);async function le(l){const e=l.status===1?0:1;G.value=l.id;try{await we({id:l.id,status:e}),x(e===1?`已开启「${l.jobName}」`:`已关闭「${l.jobName}」`,"success"),u(b.value)}catch(i){x(i?.msg||"操作失败","error")}finally{G.value=null}}async function se(l){G.value=l.id;try{await je({id:l.id}),x(`已触发「${l.jobName}」,执行结果稍后显示在「最近执行」`,"success"),setTimeout(()=>u(b.value),2500)}catch(e){x(e?.msg||"触发失败","error")}finally{G.value=null}}const E=o(!1),J=o(null),D=o(!1);function ae(l){J.value=l,E.value=!0}async function oe(){if(J.value){D.value=!0;try{await ye({id:J.value.id}),x("任务已删除","success"),E.value=!1,u(b.value)}catch(l){x(l?.msg||"删除失败","error")}finally{D.value=!1}}}ve(()=>{u(1),Y()});const ne=[{id:"jobName",header:"任务名称",size:200,cell:({row:l})=>{const e=l.original;return n("div",{class:"text-sm"},[n("div",{class:"font-semibold",style:"color: var(--gw-text-main);"},e.jobName||"-"),n("div",{class:"text-xs font-mono",style:"color: var(--gw-text-muted);"},e.jobKey||"-"),e.handlerMissing?n("div",{class:"text-xs mt-1",style:"color: var(--gw-danger, #D6564A);"},"后端无此任务实现,无法执行"):null])}},{id:"cron",header:"执行时间(cron)",size:150,cell:({row:l})=>n("span",{class:"text-sm font-mono",style:"color: var(--gw-text-main);",title:"Spring 6 位表达式:秒 分 时 日 月 周"},l.original.cronExpression||"-")},{id:"params",header:"任务参数",size:200,cell:({row:l})=>
1{const e=l.original.jobParams;return e?n("span",{class:"text-xs font-mono job-params",style:"color: var(--gw-text-muted);",title:e},e):n("span",{class:"text-sm",style:"color: var(--gw-text-hint);"},"-")}},{id:"execCount",header:()=>n("span",{title:"任务累计执行次数(含手动立即执行),由后端累加"},"执行次数"),size:100,cell:({row:l})=>n("span",{class:"text-sm",style:"color: var(--gw-text-main);"},String(l.original.execCount??0))},{id:"lastExec",header:"最近执行",size:220,cell:({row:l})=>{const e=l.original;if(!e.lastExecTime)return n("span",{class:"text-sm",style:"color: var(--gw-text-hint);"},"从未执行");const i=e.lastExecStatus===1;return n("div",[n("div",{class:"flex items-center gap-2"},[n(F,{label:i?"成功":"失败",tone:i?"success":"danger",dot:!1}),n("span",{class:"text-xs",style:"color: var(--gw-text-muted);"},e.lastExecTime)]),e.lastExecMsg?n("div",{class:"text-xs mt-1 job-exec-msg",style:"color: var(--gw-text-muted);",title:e.lastExecMsg},e.lastExecMsg):null])}},{id:"status",header:"状态",size:90,cell:({row:l})=>n(F,{label:l.original.status===1?"开启":"关闭",tone:l.original.status===1?"success":"neutral"})},{id:"remark",header:"备注",size:200,cell:({row:l})=>{const e=l.original.remark;return e?n("span",{class:"text-xs job-remark",style:"color: var(--gw-text-muted);",title:e},e):n("span",{class:"text-sm",style:"color: var(--gw-text-hint);"},"-")}},{id:"actions",header:"操作",size:260,cell:({row:l})=>{const e=l.original,i=G.value===e.id;return n(ie,{compact:!0,actions:[{key:"run",label:"立即执行",tone:"primary",disabled:i||e.handlerMissing,title:e.handlerMissing?"后端没有这个任务的实现,无法执行":"手动触发一次(后台异步执行)"},{key:"toggle",label:e.status===1?"关闭":"开启",tone:"neutral",disabled:i},{key:"edit",label:"编辑",tone:"neutral",disabled:i},{key:"delete",label:"删除",tone:"danger",disabled:i}],onSelect:V=>{V.key==="run"?se(e):V.key==="toggle"?le(e):V.key==="edit"?ee(e):V.key==="delete"&&ae(e)}})}}];return(l,e)=>{const i=ue,V=re;return m(),d("div",null,[t("div",{class:"flex justify-between items-start mb-1 gap-4"},[e[22]||(e[22]=t("div",null,[t("h3",{class:"text-2xl font-bold mb-1 tracking-tight",style:{color:"var(--gw-title)"}}," 任务管理 "),t("p",{class:"text-xs",style:{color:"var(--gw-text-muted)"}}," 后台定时任务的开关与手工触发。改动即刻生效,不需要重启服务;cron 用 Spring 6 位表达式(秒 分 时 日 月 周)。 ")],-1)),t("button",{class:"gw-btn gw-btn-primary text-xs py-1.5 px-3 shrink-0",onClick:_}," 新增任务 ")]),t("div",Ce,[w(t("input",{"onUpdate:modelValue":e[0]||(e[0]=s=>p(T)?T.value=s:null),placeholder:"搜索 任务名称 / 标识 / 备注",onKeydown:e[1]||(e[1]=be(O(s=>u(1),["prevent"]),["enter"]))},null,544),[[z,a(T)]]),H(i,{modelValue:a(C),"onUpdate:modelValue":[e[2]||(e[2]=s=>p(C)?C.value=s:null),e[3]||(e[3]=s=>u(1))],class:"gw-filter-select",items:[{label:"全部状态",value:"all"},{label:"开启",value:"1"},{label:"关闭",value:"0"}]},null,8,["modelValue"]),t("div",Se,[t("button",{class:"gw-btn gw-btn-primary text-xs py-1.5 px-3",disabled:a(k),onClick:e[4]||(e[4]=s=>u(1))}," 搜索 ",8,Ne),t("button",{class:"gw-btn gw-btn-ghost text-xs py-1.5 px-3",disabled:a(k),onClick:Z}," 重置 ",8,$e),t("button",{class:"gw-btn gw-btn-ghost text-xs py-1.5 px-3",disabled:a(k),onClick:e[5]||(e[5]=s=>u(a(b)))}," 刷新 ",8,Ee)])]),a(A)?h("",!0):(m(),d("div",Ve,[e[25]||(e[25]=t("div",{class:"text-sm font-semibold mb-1",style:{color:"var(--gw-text-main)"}}," 任务列表接口暂不可用 ",-1)),t("div",ze,[L(" GET /api/admin/job/list 返回异常:"+g(a(R)||"无返回")+"。若后端已部署,请确认 ",1),e[23]||(e[23]=t("code",null,"t_front_job.sql",-1)),e[24]||(e[24]=L(" 已在 finder 库执行。 ",-1))])])),H(V,{columns:ne,data:a(I),loading:a(k),total:a(B),page:a(b),"page-size":a(K),"row-key":"id","min-width":"1280px","empty-title":"暂无任务","empty-description":a(A)?"点右上角「新增任务」创建一条":"等待任务接口支持","onUpdate:page":e[6]||(e[6]=s=>
1u(s)),"onUpdate:pageSize":e[7]||(e[7]=s=>{K.value=s,u(1)})},null,8,["data","loading","total","page","page-size","empty-description"]),a(y)?(m(),d("div",{key:1,class:"job-modal-mask",onClick:e[18]||(e[18]=O(s=>y.value=!1,["self"]))},[t("div",Te,[t("div",Ge,[t("h4",null,g(a(Q)),1),t("button",{class:"job-modal-close",onClick:e[8]||(e[8]=s=>y.value=!1)}," ✕ ")]),e[26]||(e[26]=t("label",{class:"job-modal-label"},"任务名称",-1)),w(t("input",{"onUpdate:modelValue":e[9]||(e[9]=s=>p(f)?f.value=s:null),class:"job-modal-input",placeholder:"例如:注册未登录用户短信提醒",maxlength:"64"},null,512),[[z,a(f)]]),e[27]||(e[27]=t("label",{class:"job-modal-label"},"任务标识",-1)),a(M).length?w((m(),d("select",{key:0,"onUpdate:modelValue":e[10]||(e[10]=s=>p(r)?r.value=s:null),class:"job-modal-input"},[(m(!0),d(q,null,W(a(M),s=>(m(),d("option",{key:s,value:s},g(s),9,Me))),128))],512)),[[ce,a(r)]]):w((m(),d("input",{key:1,"onUpdate:modelValue":e[11]||(e[11]=s=>p(r)?r.value=s:null),class:"job-modal-input",placeholder:"后端处理器标识,如 inactiveUserSms",maxlength:"64"},null,512)),[[z,a(r)]]),e[28]||(e[28]=t("p",{class:"job-modal-hint"}," 决定这条任务跑哪段后端代码,取值来自后端已实现的处理器清单。 ",-1)),e[29]||(e[29]=t("label",{class:"job-modal-label"},"执行时间(cron)",-1)),w(t("input",{"onUpdate:modelValue":e[12]||(e[12]=s=>p(v)?v.value=s:null),class:"job-modal-input font-mono",placeholder:"0 0 10 * * ?",maxlength:"64"},null,512),[[z,a(v)]]),t("div",Ue,[(m(),d(q,null,W(X,s=>t("button",{key:s.value,class:P(["job-chip",{active:a(v)===s.value}]),type:"button",onClick:Le=>v.value=s.value},g(s.label),11,Je)),64))]),e[30]||(e[30]=t("p",{class:"job-modal-hint"}," 6 位:秒 分 时 日 月 周。注意不是 Linux crontab 的 5 位写法。 ",-1)),e[31]||(e[31]=t("label",{class:"job-modal-label"},"任务参数(可选,JSON)",-1)),w(t("textarea",{"onUpdate:modelValue":e[13]||(e[13]=s=>p(N)?N.value=s:null),class:"job-modal-textarea font-mono",rows:"3",placeholder:'{"hours":48,"recentDays":7,"limit":200}'},null,512),[[z,a(N)]]),e[32]||(e[32]=t("p",{class:"job-modal-hint"}," 由该任务自己解释。短信提醒任务支持:hours(注册满几小时)、recentDays(只看最近几天注册的)、limit(单次上限)、templateId、vars。 ",-1)),e[33]||(e[33]=t("label",{class:"job-modal-label"},"备注(可选)",-1)),w(t("textarea",{"onUpdate:modelValue":e[14]||(e[14]=s=>p($)?$.value=s:null),class:"job-modal-textarea",rows:"2",placeholder:"这条任务是干什么的、谁在用"},null,512),[[z,a($)]]),e[34]||(e[34]=t("label",{class:"job-modal-label"},"状态",-1)),t("div",De,[t("button",{class:P(["job-chip",{active:a(j)===1}]),type:"button",onClick:e[15]||(e[15]=s=>j.value=1)}," 开启 ",2),t("button",{class:P(["job-chip",{active:a(j)===0}]),type:"button",onClick:e[16]||(e[16]=s=>j.value=0)}," 关闭 ",2)]),a(c)?(m(),d("p",he,g(a(c)),1)):h("",!0),t("div",Ae,[t("button",{class:"gw-btn gw-btn-ghost text-xs py-1.5 px-4",onClick:e[17]||(e[17]=s=>y.value=!1)}," 取消 "),t("button",{class:"gw-btn gw-btn-primary text-xs py-1.5 px-4",disabled:a(U),onClick:te},g(a(U)?"保存中…":"保存"),9,Ke)])])])):h("",!0),a(E)?(m(),d("div",{key:2,class:"job-modal-mask",onClick:e[21]||(e[21]=O(s=>E.value=!1,["self"]))},[t("div",Oe,[t("div",Pe,[e[35]||(e[35]=t("h4",null,"删除任务",-1)),t("button",{class:"job-modal-close",onClick:e[19]||(e[19]=s=>E.value=!1)}," ✕ ")]),t("p",Re," 确定删除「"+g(a(J)?.jobName)+"」?删除后该任务立即停止调度,且不可恢复。 ",1),t("div",Ie,[t("button",{class:"gw-btn gw-btn-ghost text-xs py-1.5 px-4",onClick:e[20]||(e[20]=s=>E.value=!1)}," 取消 "),t("button",{class:"gw-btn gw-btn-primary text-xs py-1.5 px-4",disabled:a(D),onClick:oe},g(a(D)?"删除中…":"确定删除"),9,Be)])])])):h("",!0)])}}}),tt=ke(Fe,[["__scopeId","data-v-dc165117"]]);export{tt as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.