Files
Nexus/web/app/assets/SchedulesPage-DYeo4HYy.js
T
2026-06-08 07:24:32 +08:00

1 line
13 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{_ as e,t,v as n}from"./VSelect-CIKJ_OaY.js";import{B as r,Cr as i,F as a,H as o,N as s,Pr as c,Q as l,R as u,Tr as d,Vr as f,Yt as p,Zr as m,ar as h,cr as g,dr as _,hr as v,kt as y,lr as b,mr as x,pr as S,pt as C,qr as w,t as T,z as E}from"./index-Br7lTitF.js";import{n as ee,r as te,t as ne}from"./dataTable-esDY4cOk.js";import{t as re}from"./VDataTableServer-DVF-5CPV.js";import{t as D}from"./useServerList-rnJOf0WE.js";import{t as O}from"./VDialog-BclMUB-b.js";import{t as k}from"./VTextarea-CCS_rw4Q.js";import{t as A}from"./VSwitch-DcQ2DhTH.js";var j={class:`text-caption`},M={key:1,class:`text-caption text-medium-emphasis`},ie={key:0,class:`text-caption`},ae={key:1,class:`text-caption text-medium-emphasis`},oe={class:`text-medium-emphasis`},se={class:`text-caption text-medium-emphasis`},ce={class:`text-caption text-medium-emphasis`},N=v({__name:`SchedulesPage`,setup(v){let N=[...ne],P=e(),{servers:le,loadServers:ue}=D(),F=[{value:`incremental`,label:`增量`},{value:`full`,label:`完全同步`},{value:`overwrite`,label:`覆盖`},{value:`checksum`,label:`校验和`}],I=f(!1),L=f(null),R=f(null),z=f([]),B=f([]),V=f(1),H=f(0),U=f(20),W=f(!1),G=f(null),K=f(!1),q=f({name:``,schedule_type:`push`,run_mode:`cron`,cron:``,fire_at:``,source_path:``,target_path:``,sync_mode:`incremental`,script_id:null,script_content:``,exec_timeout:60,long_task:!1,server_ids:[],enabled:!0}),J=f(!1),Y=f(null),de=ee([{title:`名称`,key:`name`},{title:`类型`,key:`schedule_type`,width:80},{title:`模式`,key:`run_mode`,width:72},{title:`Cron / 执行时间`,key:`cron_expr`,width:160},{title:`源路径`,key:`source_path`},{title:`目标路径`,key:`target_path`},{title:`同步`,key:`sync_mode`,width:88},{title:`服务器`,key:`server_count`,width:80},{title:`上次运行`,key:`last_run_at`,width:140},{title:`下次运行`,key:`next_run`,width:140},{title:`启用`,key:`enabled`,width:80},{title:`操作`,key:`actions`,width:200,align:`end`}]);function fe(e){return F.find(t=>t.value===e)?.label||e||`增量`}function pe(e){return e?e.replace(`T`,` `).slice(0,16):`—`}function me(e){if(!e)return``;let t=new Date(e);if(Number.isNaN(t.getTime()))return e.slice(0,16);let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}T${n(t.getHours())}:${n(t.getMinutes())}`}function X(e){if(Array.isArray(e))return e.map(e=>Number(e)).filter(e=>!Number.isNaN(e));if(typeof e==`string`&&e.trim())try{let t=JSON.parse(e);if(Array.isArray(t))return t.map(e=>Number(e)).filter(e=>!Number.isNaN(e))}catch{}return[]}function he(e){return X(e).length}function ge(e){return{...e,server_ids:X(e.server_ids)}}function _e(e){let t=e.trim().split(/\s+/);return t.length===5?t.every(e=>/^[\d*/,\-]+$/.test(e)):!1}function ve(){let e=q.value.server_ids;if(!q.value.name.trim())throw Error(`请填写调度名称`);if(!e.length)throw Error(`请至少选择一台服务器`);let t={name:q.value.name.trim(),schedule_type:q.value.schedule_type,run_mode:q.value.run_mode,server_ids:JSON.stringify(e),enabled:q.value.enabled};if(q.value.run_mode===`cron`){if(!q.value.cron.trim())throw Error(`请填写 Cron 表达式`);if(!_e(q.value.cron.trim()))throw Error(`Cron 须为 5 字段(分 时 日 月 周)`);t.cron_expr=q.value.cron.trim()}else{if(!q.value.fire_at)throw Error(`请选择一次性执行时间`);t.fire_at=new Date(q.value.fire_at).toISOString()}if(q.value.schedule_type===`push`){if(!q.value.source_path.trim())throw Error(`请填写推送源路径`);t.source_path=q.value.source_path.trim();let e=q.value.target_path.trim();e&&(t.target_path=e),t.sync_mode=q.value.sync_mode}else{if(!q.value.script_id&&!q.value.script_content.trim())throw Error(`脚本调度须选择脚本库或填写命令内容`);q.value.script_id&&(t.script_id=q.value.script_id),q.value.script_content.trim()&&(t.script_content=q.value.script_content.trim()),t.exec_timeout=q.value.exec_timeout,t.long_task=q.value.long_task}return t}function ye(e){V.value=e,Z()}function be(e){U.value=e,V.value=1,Z()}async function xe(){try{B.value=(await p.getList(`/scripts/`)).items||[]}catch{B.value=[]}}async function Z(){I.value=!0;try{let e=((await p.getList(`/schedules/`)).items||[]).map(ge);H.value=e.length,z.value=te(e,V.value,U.value)}catch(e){z.value=[],H.value=0,P(e instanceof Error?e.message:`加载调度列表失败`,`error`)}finally{I.value=!1}}function Q(e){G.value=e,e?q.value={name:e.name,schedule_type:e.schedule_type===`script`?`script`:`push`,run_mode:e.run_mode===`once`?`once`:`cron`,cron:e.cron_expr||``,fire_at:me(e.fire_at),source_path:e.source_path||``,target_path:e.target_path||``,sync_mode:e.sync_mode||`incremental`,script_id:e.script_id??null,script_content:e.script_content||``,exec_timeout:e.exec_timeout??60,long_task:!!e.long_task,server_ids:X(e.server_ids),enabled:e.enabled}:q.value={name:``,schedule_type:`push`,run_mode:`cron`,cron:``,fire_at:``,source_path:``,target_path:``,sync_mode:`incremental`,script_id:null,script_content:``,exec_timeout:60,long_task:!1,server_ids:[],enabled:!0},W.value=!0}async function Se(){K.value=!0;try{let e=ve();G.value?await p.put(`/schedules/${G.value.id}`,e):await p.post(`/schedules/`,e),W.value=!1,Z(),P(`保存成功`)}catch(e){P(e instanceof Error?e.message:`保存失败`,`error`)}finally{K.value=!1}}async function Ce(e){L.value=e.id;try{await p.put(`/schedules/${e.id}`,{enabled:e.enabled}),Z()}catch(t){e.enabled=!e.enabled,P(t instanceof Error?t.message:`操作失败`,`error`)}finally{L.value=null}}async function $(e){R.value=e.id;try{let t=X(e.server_ids);if(e.schedule_type===`script`)await p.post(`/scripts/exec`,{server_ids:t,script_id:e.script_id??void 0,command:e.script_content||void 0,timeout:e.exec_timeout??60,long_task:!!e.long_task}),y(`已触发脚本执行`);else{let n={source_path:e.source_path,server_ids:t,sync_mode:e.sync_mode||`incremental`};e.target_path?.trim()&&(n.target_path=e.target_path.trim()),await p.post(`/sync/files`,n),P(`已触发推送`)}}catch(e){P(e instanceof Error?e.message:`执行失败`,`error`)}finally{R.value=null}}function we(e){Y.value=e,J.value=!0}async function Te(){if(Y.value)try{await p.delete(`/schedules/${Y.value.id}`),J.value=!1,Z(),P(`已删除`)}catch(e){P(e instanceof Error?e.message:`删除失败`,`error`)}}return i(()=>{Z(),ue(),xe()}),(e,i)=>(d(),b(n,{fluid:``,class:`pa-6`},{default:c(()=>[x(u,{elevation:`0`,border:``,rounded:`lg`},{default:c(()=>[x(r,{class:`d-flex align-center text-h6`},{default:c(()=>[i[20]||=S(` 推送调度 `,-1),x(s),x(l,{color:`primary`,variant:`flat`,size:`small`,"prepend-icon":`mdi-plus`,onClick:i[0]||=e=>Q(null)},{default:c(()=>[...i[19]||=[S(`新建调度`,-1)]]),_:1})]),_:1}),x(re,{items:z.value,headers:w(de),"items-length":H.value,loading:I.value,page:V.value,"items-per-page":U.value,"items-per-page-options":N,hover:``,density:`comfortable`,"onUpdate:page":ye,"onUpdate:itemsPerPage":be},{"item.schedule_type":c(({item:e})=>[x(a,{size:`small`,variant:`tonal`,color:e.schedule_type===`script`?`secondary`:`primary`,label:``},{default:c(()=>[S(m(e.schedule_type===`script`?`脚本`:`推送`),1)]),_:2},1032,[`color`])]),"item.run_mode":c(({item:e})=>[g(`span`,j,m(e.run_mode===`once`?`一次性`:`Cron`),1)]),"item.cron_expr":c(({item:e})=>[e.run_mode===`cron`?(d(),b(a,{key:0,size:`small`,variant:`tonal`,label:``,"prepend-icon":`mdi-clock-outline`},{default:c(()=>[S(m(e.cron_expr||`—`),1)]),_:2},1024)):(d(),_(`span`,M,m(pe(e.fire_at)),1))]),"item.sync_mode":c(({item:e})=>[e.schedule_type===`script`?(d(),_(`span`,ae,`—`)):(d(),_(`span`,ie,m(fe(e.sync_mode)),1))]),"item.enabled":c(({item:e})=>[x(A,{modelValue:e.enabled,"onUpdate:modelValue":[t=>e.enabled=t,t=>Ce(e)],color:`primary`,density:`compact`,"hide-details":``,loading:L.value===e.id},null,8,[`modelValue`,`onUpdate:modelValue`,`loading`])]),"item.server_count":c(({item:e})=>[g(`span`,oe,m(he(e.server_ids))+` 台`,1)]),"item.last_run_at":c(({item:e})=>[g(`span`,se,m(e.last_run_at||`从未运行`),1)]),"item.next_run":c(({item:e})=>[g(`span`,ce,m(e.next_run||`—`),1)]),"item.actions":c(({item:e})=>[x(l,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>Q(e)},{default:c(()=>[...i[21]||=[S(`编辑`,-1)]]),_:1},8,[`onClick`]),x(l,{variant:`text`,size:`x-small`,density:`compact`,loading:R.value===e.id,onClick:t=>$(e)},{default:c(()=>[...i[22]||=[S(`立即执行`,-1)]]),_:1},8,[`loading`,`onClick`]),x(l,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>we(e)},{default:c(()=>[...i[23]||=[S(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":c(()=>[...i[24]||=[g(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无计划任务`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`,`items-per-page`])]),_:1}),x(O,{modelValue:W.value,"onUpdate:modelValue":i[16]||=e=>W.value=e,"max-width":`640`,scrollable:``},{default:c(()=>[x(u,{border:``},{default:c(()=>[x(r,null,{default:c(()=>[S(m(G.value?`编辑调度`:`新建调度`),1)]),_:1}),x(E,null,{default:c(()=>[x(T,{modelValue:q.value.name,"onUpdate:modelValue":i[1]||=e=>q.value.name=e,label:`调度名称`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),x(C,{modelValue:q.value.schedule_type,"onUpdate:modelValue":i[2]||=e=>q.value.schedule_type=e,mandatory:``,density:`compact`,class:`mb-3`,color:`primary`},{default:c(()=>[x(l,{value:`push`,size:`small`},{default:c(()=>[...i[25]||=[S(`文件推送`,-1)]]),_:1}),x(l,{value:`script`,size:`small`},{default:c(()=>[...i[26]||=[S(`脚本执行`,-1)]]),_:1})]),_:1},8,[`modelValue`]),x(C,{modelValue:q.value.run_mode,"onUpdate:modelValue":i[3]||=e=>q.value.run_mode=e,mandatory:``,density:`compact`,class:`mb-3`,color:`primary`},{default:c(()=>[x(l,{value:`cron`,size:`small`},{default:c(()=>[...i[27]||=[S(`Cron 循环`,-1)]]),_:1}),x(l,{value:`once`,size:`small`},{default:c(()=>[...i[28]||=[S(`一次性`,-1)]]),_:1})]),_:1},8,[`modelValue`]),q.value.run_mode===`cron`?(d(),b(T,{key:0,modelValue:q.value.cron,"onUpdate:modelValue":i[4]||=e=>q.value.cron=e,label:`Cron 表达式(5 字段)`,variant:`outlined`,density:`compact`,hint:`分 时 日 月 周,例如: 0 2 * * *`,"persistent-hint":``,class:`mb-2`},null,8,[`modelValue`])):(d(),b(T,{key:1,modelValue:q.value.fire_at,"onUpdate:modelValue":i[5]||=e=>q.value.fire_at=e,label:`执行时间`,type:`datetime-local`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`])),q.value.schedule_type===`push`?(d(),_(h,{key:2},[x(T,{modelValue:q.value.source_path,"onUpdate:modelValue":i[6]||=e=>q.value.source_path=e,label:`推送源路径(Nexus 主机)`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),x(T,{modelValue:q.value.target_path,"onUpdate:modelValue":i[7]||=e=>q.value.target_path=e,label:`目标路径(可选)`,variant:`outlined`,density:`compact`,hint:`留空则使用各服务器在「服务器管理」中配置的目标路径`,"persistent-hint":``,class:`mb-2`},null,8,[`modelValue`]),x(t,{modelValue:q.value.sync_mode,"onUpdate:modelValue":i[8]||=e=>q.value.sync_mode=e,items:F,"item-title":`label`,"item-value":`value`,label:`同步模式`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`])],64)):(d(),_(h,{key:3},[x(t,{modelValue:q.value.script_id,"onUpdate:modelValue":i[9]||=e=>q.value.script_id=e,items:B.value,"item-title":`name`,"item-value":`id`,label:`脚本库(可选)`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`},null,8,[`modelValue`,`items`]),x(k,{modelValue:q.value.script_content,"onUpdate:modelValue":i[10]||=e=>q.value.script_content=e,label:`命令内容(无脚本库时必填)`,variant:`outlined`,density:`compact`,rows:`4`,"auto-grow":``,class:`mb-2`},null,8,[`modelValue`]),x(T,{modelValue:q.value.exec_timeout,"onUpdate:modelValue":i[11]||=e=>q.value.exec_timeout=e,modelModifiers:{number:!0},label:`超时(秒)`,type:`number`,min:`10`,max:`600`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),x(A,{modelValue:q.value.long_task,"onUpdate:modelValue":i[12]||=e=>q.value.long_task=e,label:`长任务(nohup`,color:`primary`,density:`compact`,"hide-details":``,class:`mb-2`},null,8,[`modelValue`])],64)),x(t,{modelValue:q.value.server_ids,"onUpdate:modelValue":i[13]||=e=>q.value.server_ids=e,items:w(le),"item-title":`name`,"item-value":`id`,label:`目标服务器`,variant:`outlined`,density:`compact`,multiple:``,chips:``,class:`mb-2`},null,8,[`modelValue`,`items`]),x(A,{modelValue:q.value.enabled,"onUpdate:modelValue":i[14]||=e=>q.value.enabled=e,label:`启用`,color:`primary`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1}),x(o,null,{default:c(()=>[x(s),x(l,{variant:`text`,onClick:i[15]||=e=>W.value=!1},{default:c(()=>[...i[29]||=[S(`取消`,-1)]]),_:1}),x(l,{color:`primary`,variant:`flat`,onClick:Se,loading:K.value},{default:c(()=>[...i[30]||=[S(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),x(O,{modelValue:J.value,"onUpdate:modelValue":i[18]||=e=>J.value=e,"max-width":`400`},{default:c(()=>[x(u,{border:``},{default:c(()=>[x(r,null,{default:c(()=>[...i[31]||=[S(`确认删除`,-1)]]),_:1}),x(E,null,{default:c(()=>[i[32]||=S(`确定要删除调度 `,-1),g(`strong`,null,m(Y.value?.name),1),i[33]||=S(` 吗?`,-1)]),_:1}),x(o,null,{default:c(()=>[x(s),x(l,{variant:`text`,onClick:i[17]||=e=>J.value=!1},{default:c(()=>[...i[34]||=[S(`取消`,-1)]]),_:1}),x(l,{color:`error`,variant:`flat`,onClick:Te},{default:c(()=>[...i[35]||=[S(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{N as default};