Files
Nexus/web/app/assets/SchedulesPage-CViyk83L.js
T
Nexus Agent fb6a4be797 feat(commands): 推送日志第三视图与 CSV 导入模板
按对齐计划 Phase1:Commands 页增加推送日志筛选视图;补全 servers_import_template.csv;扩写功能指南 §12.6/12.8/12.10 与 acceptance_catalog。
2026-06-08 02:45:17 +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{F as e,L as t,Lr as n,N as r,P as i,Vr as a,Zn as o,ar as s,er as c,et as l,gr as u,jr as d,mr as f,or as p,rr as m,sr as ee,t as h,tr as g,wr as _,z as v,zt as y}from"./index-AmyXDl4i.js";import{o as b,t as te}from"./VContainer-Dqw80qLq.js";import{t as x}from"./VChip-D3vZhJU3.js";import{t as S}from"./VSelect-DZ1vTOq0.js";import{t as C}from"./VDataTableServer-BYd6EHtC.js";import{t as w}from"./VSpacer-e_QpSKFJ.js";import{t as ne}from"./useServerList-CLbf7hZr.js";import{t as T}from"./VDialog-hWg6_Knl.js";import{t as re}from"./VTextarea-CV8U5DbY.js";import{t as E}from"./VSwitch-DsvYP8mQ.js";var D={class:`text-caption`},O={key:1,class:`text-caption text-medium-emphasis`},k={key:0,class:`text-caption`},A={key:1,class:`text-caption text-medium-emphasis`},j={class:`text-medium-emphasis`},M={class:`text-caption text-medium-emphasis`},N={class:`text-caption text-medium-emphasis`},P=ee({__name:`SchedulesPage`,setup(ee){let P=b(),{servers:ie,loadServers:ae}=ne(),F=[{value:`incremental`,label:`增量`},{value:`full`,label:`完全同步`},{value:`overwrite`,label:`覆盖`},{value:`checksum`,label:`校验和`}],I=d(!1),L=d(null),R=d(null),z=d([]),B=d([]),V=d(1),H=d(0),U=d(20),W=d(!1),G=d(null),K=d(!1),q=d({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=d(!1),Y=d(null),oe=[{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 se(e){return F.find(t=>t.value===e)?.label||e||`增量`}function ce(e){return e?e.replace(`T`,` `).slice(0,16):`—`}function le(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 ue(e){return X(e).length}function de(e){return{...e,server_ids:X(e.server_ids)}}function fe(e){let t=e.trim().split(/\s+/);return t.length===5?t.every(e=>/^[\d*/,\-]+$/.test(e)):!1}function pe(){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(!fe(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 me(e){V.value=e,Q()}function he(e){U.value=e,V.value=1,Q()}async function Z(){try{B.value=(await y.getList(`/scripts/`)).items||[]}catch{B.value=[]}}async function Q(){I.value=!0;try{let e=((await y.getList(`/schedules/`)).items||[]).map(de);H.value=e.length;let t=(V.value-1)*U.value;z.value=e.slice(t,t+U.value)}catch(e){z.value=[],H.value=0,P(e instanceof Error?e.message:`加载调度列表失败`,`error`)}finally{I.value=!1}}function $(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:le(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 ge(){K.value=!0;try{let e=pe();G.value?await y.put(`/schedules/${G.value.id}`,e):await y.post(`/schedules/`,e),W.value=!1,Q(),P(`保存成功`)}catch(e){P(e instanceof Error?e.message:`保存失败`,`error`)}finally{K.value=!1}}async function _e(e){L.value=e.id;try{await y.put(`/schedules/${e.id}`,{enabled:e.enabled}),Q()}catch(t){e.enabled=!e.enabled,P(t instanceof Error?t.message:`操作失败`,`error`)}finally{L.value=null}}async function ve(e){R.value=e.id;try{let t=X(e.server_ids);if(e.schedule_type===`script`)await y.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}),P(`已触发脚本执行`);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 y.post(`/sync/files`,n),P(`已触发推送`)}}catch(e){P(e instanceof Error?e.message:`执行失败`,`error`)}finally{R.value=null}}function ye(e){Y.value=e,J.value=!0}async function be(){if(Y.value)try{await y.delete(`/schedules/${Y.value.id}`),J.value=!1,Q(),P(`已删除`)}catch(e){P(e instanceof Error?e.message:`删除失败`,`error`)}}return f(()=>{Q(),ae(),Z()}),(d,f)=>(u(),g(te,{fluid:``,class:`pa-6`},{default:_(()=>[p(r,{elevation:`0`,border:``,rounded:`lg`},{default:_(()=>[p(e,{class:`d-flex align-center text-h6`},{default:_(()=>[f[20]||=s(` 推送调度 `,-1),p(w),p(v,{color:`primary`,variant:`flat`,size:`small`,"prepend-icon":`mdi-plus`,onClick:f[0]||=e=>$(null)},{default:_(()=>[...f[19]||=[s(`新建调度`,-1)]]),_:1})]),_:1}),p(C,{items:z.value,headers:oe,"items-length":H.value,loading:I.value,page:V.value,"items-per-page":U.value,hover:``,density:`comfortable`,"onUpdate:page":me,"onUpdate:itemsPerPage":he},{"item.schedule_type":_(({item:e})=>[p(x,{size:`small`,variant:`tonal`,color:e.schedule_type===`script`?`secondary`:`primary`,label:``},{default:_(()=>[s(a(e.schedule_type===`script`?`脚本`:`推送`),1)]),_:2},1032,[`color`])]),"item.run_mode":_(({item:e})=>[c(`span`,D,a(e.run_mode===`once`?`一次性`:`Cron`),1)]),"item.cron_expr":_(({item:e})=>[e.run_mode===`cron`?(u(),g(x,{key:0,size:`small`,variant:`tonal`,label:``,"prepend-icon":`mdi-clock-outline`},{default:_(()=>[s(a(e.cron_expr||`—`),1)]),_:2},1024)):(u(),m(`span`,O,a(ce(e.fire_at)),1))]),"item.sync_mode":_(({item:e})=>[e.schedule_type===`script`?(u(),m(`span`,A,`—`)):(u(),m(`span`,k,a(se(e.sync_mode)),1))]),"item.enabled":_(({item:e})=>[p(E,{modelValue:e.enabled,"onUpdate:modelValue":[t=>e.enabled=t,t=>_e(e)],color:`primary`,density:`compact`,"hide-details":``,loading:L.value===e.id},null,8,[`modelValue`,`onUpdate:modelValue`,`loading`])]),"item.server_count":_(({item:e})=>[c(`span`,j,a(ue(e.server_ids))+` 台`,1)]),"item.last_run_at":_(({item:e})=>[c(`span`,M,a(e.last_run_at||`从未运行`),1)]),"item.next_run":_(({item:e})=>[c(`span`,N,a(e.next_run||`—`),1)]),"item.actions":_(({item:e})=>[p(v,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>$(e)},{default:_(()=>[...f[21]||=[s(`编辑`,-1)]]),_:1},8,[`onClick`]),p(v,{variant:`text`,size:`x-small`,density:`compact`,loading:R.value===e.id,onClick:t=>ve(e)},{default:_(()=>[...f[22]||=[s(`立即执行`,-1)]]),_:1},8,[`loading`,`onClick`]),p(v,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>ye(e)},{default:_(()=>[...f[23]||=[s(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":_(()=>[...f[24]||=[c(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无计划任务`,-1)]]),_:1},8,[`items`,`items-length`,`loading`,`page`,`items-per-page`])]),_:1}),p(T,{modelValue:W.value,"onUpdate:modelValue":f[16]||=e=>W.value=e,"max-width":`640`,scrollable:``},{default:_(()=>[p(r,{border:``},{default:_(()=>[p(e,null,{default:_(()=>[s(a(G.value?`编辑调度`:`新建调度`),1)]),_:1}),p(i,null,{default:_(()=>[p(h,{modelValue:q.value.name,"onUpdate:modelValue":f[1]||=e=>q.value.name=e,label:`调度名称`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),p(l,{modelValue:q.value.schedule_type,"onUpdate:modelValue":f[2]||=e=>q.value.schedule_type=e,mandatory:``,density:`compact`,class:`mb-3`,color:`primary`},{default:_(()=>[p(v,{value:`push`,size:`small`},{default:_(()=>[...f[25]||=[s(`文件推送`,-1)]]),_:1}),p(v,{value:`script`,size:`small`},{default:_(()=>[...f[26]||=[s(`脚本执行`,-1)]]),_:1})]),_:1},8,[`modelValue`]),p(l,{modelValue:q.value.run_mode,"onUpdate:modelValue":f[3]||=e=>q.value.run_mode=e,mandatory:``,density:`compact`,class:`mb-3`,color:`primary`},{default:_(()=>[p(v,{value:`cron`,size:`small`},{default:_(()=>[...f[27]||=[s(`Cron 循环`,-1)]]),_:1}),p(v,{value:`once`,size:`small`},{default:_(()=>[...f[28]||=[s(`一次性`,-1)]]),_:1})]),_:1},8,[`modelValue`]),q.value.run_mode===`cron`?(u(),g(h,{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`])):(u(),g(h,{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`?(u(),m(o,{key:2},[p(h,{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`]),p(h,{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`]),p(S,{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)):(u(),m(o,{key:3},[p(S,{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`]),p(re,{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`]),p(h,{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`]),p(E,{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)),p(S,{modelValue:q.value.server_ids,"onUpdate:modelValue":f[13]||=e=>q.value.server_ids=e,items:n(ie),"item-title":`name`,"item-value":`id`,label:`目标服务器`,variant:`outlined`,density:`compact`,multiple:``,chips:``,class:`mb-2`},null,8,[`modelValue`,`items`]),p(E,{modelValue:q.value.enabled,"onUpdate:modelValue":f[14]||=e=>q.value.enabled=e,label:`启用`,color:`primary`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1}),p(t,null,{default:_(()=>[p(w),p(v,{variant:`text`,onClick:f[15]||=e=>W.value=!1},{default:_(()=>[...f[29]||=[s(`取消`,-1)]]),_:1}),p(v,{color:`primary`,variant:`flat`,onClick:ge,loading:K.value},{default:_(()=>[...f[30]||=[s(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),p(T,{modelValue:J.value,"onUpdate:modelValue":f[18]||=e=>J.value=e,"max-width":`400`},{default:_(()=>[p(r,{border:``},{default:_(()=>[p(e,null,{default:_(()=>[...f[31]||=[s(`确认删除`,-1)]]),_:1}),p(i,null,{default:_(()=>[f[32]||=s(`确定要删除调度 `,-1),c(`strong`,null,a(Y.value?.name),1),f[33]||=s(` 吗?`,-1)]),_:1}),p(t,null,{default:_(()=>[p(w),p(v,{variant:`text`,onClick:f[17]||=e=>J.value=!1},{default:_(()=>[...f[34]||=[s(`取消`,-1)]]),_:1}),p(v,{color:`error`,variant:`flat`,onClick:be},{default:_(()=>[...f[35]||=[s(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{P as default};