b220a5a762
Co-authored-by: Cursor <cursoragent@cursor.com>
1 line
13 KiB
JavaScript
1 line
13 KiB
JavaScript
import{_ as e,t,v as n}from"./VSelect-qv3fL2oy.js";import{$r as r,B as i,Dr as a,F as o,H as s,Ir as c,N as l,Q as u,R as d,Tr as f,Ur as p,Yr as m,Zt as h,_r as g,dr as _,gr as v,hr as y,kt as b,pr as x,pt as S,sr as C,t as w,ur as T,z as E}from"./index-DC1GUjcg.js";import{n as ee,r as te,t as ne}from"./dataTable-esDY4cOk.js";import{t as re}from"./VDataTableServer-DmgDNDsc.js";import{t as D}from"./useServerList-BhHqPPmz.js";import{t as O}from"./VDialog-2336zotW.js";import{t as k}from"./VTextarea-Dde5kxXN.js";import{t as A}from"./VSwitch-CIWbYcTz.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=g({__name:`SchedulesPage`,setup(g){let N=[...ne],P=e(),{servers:le,loadServers:ue}=D(),F=[{value:`incremental`,label:`增量`},{value:`full`,label:`完全同步`},{value:`overwrite`,label:`覆盖`},{value:`checksum`,label:`校验和`}],I=p(!1),L=p(null),R=p(null),z=p([]),B=p([]),V=p(1),H=p(0),U=p(20),W=p(!1),G=p(null),K=p(!1),q=p({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=p(!1),Y=p(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 h.getList(`/scripts/`)).items||[]}catch{B.value=[]}}async function Z(){I.value=!0;try{let e=((await h.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 h.put(`/schedules/${G.value.id}`,e):await h.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 h.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 h.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}),b(`已触发脚本执行`);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 h.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 h.delete(`/schedules/${Y.value.id}`),J.value=!1,Z(),P(`已删除`)}catch(e){P(e instanceof Error?e.message:`删除失败`,`error`)}}return f(()=>{Z(),ue(),xe()}),(e,f)=>(a(),_(n,{fluid:``,class:`pa-6`},{default:c(()=>[v(d,{elevation:`0`,border:``,rounded:`lg`},{default:c(()=>[v(i,{class:`d-flex align-center text-h6`},{default:c(()=>[f[20]||=y(` 推送调度 `,-1),v(l),v(u,{color:`primary`,variant:`flat`,size:`small`,"prepend-icon":`mdi-plus`,onClick:f[0]||=e=>Q(null)},{default:c(()=>[...f[19]||=[y(`新建调度`,-1)]]),_:1})]),_:1}),v(re,{items:z.value,headers:m(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})=>[v(o,{size:`small`,variant:`tonal`,color:e.schedule_type===`script`?`secondary`:`primary`,label:``},{default:c(()=>[y(r(e.schedule_type===`script`?`脚本`:`推送`),1)]),_:2},1032,[`color`])]),"item.run_mode":c(({item:e})=>[T(`span`,j,r(e.run_mode===`once`?`一次性`:`Cron`),1)]),"item.cron_expr":c(({item:e})=>[e.run_mode===`cron`?(a(),_(o,{key:0,size:`small`,variant:`tonal`,label:``,"prepend-icon":`mdi-clock-outline`},{default:c(()=>[y(r(e.cron_expr||`—`),1)]),_:2},1024)):(a(),x(`span`,M,r(pe(e.fire_at)),1))]),"item.sync_mode":c(({item:e})=>[e.schedule_type===`script`?(a(),x(`span`,ae,`—`)):(a(),x(`span`,ie,r(fe(e.sync_mode)),1))]),"item.enabled":c(({item:e})=>[v(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})=>[T(`span`,oe,r(he(e.server_ids))+` 台`,1)]),"item.last_run_at":c(({item:e})=>[T(`span`,se,r(e.last_run_at||`从未运行`),1)]),"item.next_run":c(({item:e})=>[T(`span`,ce,r(e.next_run||`—`),1)]),"item.actions":c(({item:e})=>[v(u,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>Q(e)},{default:c(()=>[...f[21]||=[y(`编辑`,-1)]]),_:1},8,[`onClick`]),v(u,{variant:`text`,size:`x-small`,density:`compact`,loading:R.value===e.id,onClick:t=>$(e)},{default:c(()=>[...f[22]||=[y(`立即执行`,-1)]]),_:1},8,[`loading`,`onClick`]),v(u,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>we(e)},{default:c(()=>[...f[23]||=[y(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":c(()=>[...f[24]||=[T(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无计划任务`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`,`items-per-page`])]),_:1}),v(O,{modelValue:W.value,"onUpdate:modelValue":f[16]||=e=>W.value=e,"max-width":`640`,scrollable:``},{default:c(()=>[v(d,{border:``},{default:c(()=>[v(i,null,{default:c(()=>[y(r(G.value?`编辑调度`:`新建调度`),1)]),_:1}),v(E,null,{default:c(()=>[v(w,{modelValue:q.value.name,"onUpdate:modelValue":f[1]||=e=>q.value.name=e,label:`调度名称`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),v(S,{modelValue:q.value.schedule_type,"onUpdate:modelValue":f[2]||=e=>q.value.schedule_type=e,mandatory:``,density:`compact`,class:`mb-3`,color:`primary`},{default:c(()=>[v(u,{value:`push`,size:`small`},{default:c(()=>[...f[25]||=[y(`文件推送`,-1)]]),_:1}),v(u,{value:`script`,size:`small`},{default:c(()=>[...f[26]||=[y(`脚本执行`,-1)]]),_:1})]),_:1},8,[`modelValue`]),v(S,{modelValue:q.value.run_mode,"onUpdate:modelValue":f[3]||=e=>q.value.run_mode=e,mandatory:``,density:`compact`,class:`mb-3`,color:`primary`},{default:c(()=>[v(u,{value:`cron`,size:`small`},{default:c(()=>[...f[27]||=[y(`Cron 循环`,-1)]]),_:1}),v(u,{value:`once`,size:`small`},{default:c(()=>[...f[28]||=[y(`一次性`,-1)]]),_:1})]),_:1},8,[`modelValue`]),q.value.run_mode===`cron`?(a(),_(w,{key:0,modelValue:q.value.cron,"onUpdate:modelValue":f[4]||=e=>q.value.cron=e,label:`Cron 表达式(5 字段)`,variant:`outlined`,density:`compact`,hint:`分 时 日 月 周,例如: 0 2 * * *`,"persistent-hint":``,class:`mb-2`},null,8,[`modelValue`])):(a(),_(w,{key:1,modelValue:q.value.fire_at,"onUpdate:modelValue":f[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`?(a(),x(C,{key:2},[v(w,{modelValue:q.value.source_path,"onUpdate:modelValue":f[6]||=e=>q.value.source_path=e,label:`推送源路径(Nexus 主机)`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),v(w,{modelValue:q.value.target_path,"onUpdate:modelValue":f[7]||=e=>q.value.target_path=e,label:`目标路径(可选)`,variant:`outlined`,density:`compact`,hint:`留空则使用各服务器在「服务器管理」中配置的目标路径`,"persistent-hint":``,class:`mb-2`},null,8,[`modelValue`]),v(t,{modelValue:q.value.sync_mode,"onUpdate:modelValue":f[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)):(a(),x(C,{key:3},[v(t,{modelValue:q.value.script_id,"onUpdate:modelValue":f[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`]),v(k,{modelValue:q.value.script_content,"onUpdate:modelValue":f[10]||=e=>q.value.script_content=e,label:`命令内容(无脚本库时必填)`,variant:`outlined`,density:`compact`,rows:`4`,"auto-grow":``,class:`mb-2`},null,8,[`modelValue`]),v(w,{modelValue:q.value.exec_timeout,"onUpdate:modelValue":f[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`]),v(A,{modelValue:q.value.long_task,"onUpdate:modelValue":f[12]||=e=>q.value.long_task=e,label:`长任务(nohup)`,color:`primary`,density:`compact`,"hide-details":``,class:`mb-2`},null,8,[`modelValue`])],64)),v(t,{modelValue:q.value.server_ids,"onUpdate:modelValue":f[13]||=e=>q.value.server_ids=e,items:m(le),"item-title":`name`,"item-value":`id`,label:`目标服务器`,variant:`outlined`,density:`compact`,multiple:``,chips:``,class:`mb-2`},null,8,[`modelValue`,`items`]),v(A,{modelValue:q.value.enabled,"onUpdate:modelValue":f[14]||=e=>q.value.enabled=e,label:`启用`,color:`primary`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1}),v(s,null,{default:c(()=>[v(l),v(u,{variant:`text`,onClick:f[15]||=e=>W.value=!1},{default:c(()=>[...f[29]||=[y(`取消`,-1)]]),_:1}),v(u,{color:`primary`,variant:`flat`,onClick:Se,loading:K.value},{default:c(()=>[...f[30]||=[y(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),v(O,{modelValue:J.value,"onUpdate:modelValue":f[18]||=e=>J.value=e,"max-width":`400`},{default:c(()=>[v(d,{border:``},{default:c(()=>[v(i,null,{default:c(()=>[...f[31]||=[y(`确认删除`,-1)]]),_:1}),v(E,null,{default:c(()=>[f[32]||=y(`确定要删除调度 `,-1),T(`strong`,null,r(Y.value?.name),1),f[33]||=y(` 吗?`,-1)]),_:1}),v(s,null,{default:c(()=>[v(l),v(u,{variant:`text`,onClick:f[17]||=e=>J.value=!1},{default:c(()=>[...f[34]||=[y(`取消`,-1)]]),_:1}),v(u,{color:`error`,variant:`flat`,onClick:Te},{default:c(()=>[...f[35]||=[y(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{N as default}; |