dfb0ea2d8f
修复 ScriptsPage 执行契约(script_id/command、历史过滤、长任务/凭据)及 SchedulesPage 缺失能力(target_path、next_run、push/script、cron/once、sync_mode);后端补迁移与 schedule_runner 传参。
4 lines
52 KiB
JavaScript
4 lines
52 KiB
JavaScript
import{t as e}from"./VDataTable-i6orhoys.js";import{$n as t,A as n,An as r,Bn as i,Br as a,C as o,Cn as s,Ct as c,D as l,Dt as u,E as d,Er as f,Et as p,F as m,Gt as ee,Hn as te,Jn as ne,Kt as re,L as h,Lr as g,M as _,Mr as v,Mt as y,N as b,O as ie,P as x,Pr as S,Qt as ae,R as oe,Rn as C,S as se,Sr as ce,St as le,Tr as ue,Tt as w,Ut as de,V as fe,Vn as pe,Vr as T,Xn as E,Y as D,Yn as me,Z as he,Zn as O,_ as ge,_r as k,ar as A,bt as _e,dr as ve,en as ye,er as j,et as M,fn as be,gr as N,it as xe,j as Se,jr as P,k as Ce,ln as F,lr as we,m as Te,mr as Ee,mt as De,n as Oe,nn as ke,nr as I,nt as Ae,on as je,or as L,pn as Me,pt as Ne,rn as Pe,rr as R,rt as Fe,sr as Ie,t as z,tr as B,tt as Le,u as Re,un as ze,ur as V,v as Be,vn as H,vr as Ve,w as He,wn as U,wr as W,wt as G,xt as Ue,z as K,zn as q,zr as We,zt as J}from"./index-DNlvHxBC.js";import{o as Ge,t as Ke}from"./VContainer-CbSJCQsb.js";import{t as qe}from"./VChip-BbRVKa0H.js";import{a as Je,c as Ye,d as Xe,f as Ze,i as Y,l as Qe,n as $e,o as et,r as tt,s as nt,t as X,u as rt}from"./VSelect-D0AqVzoi.js";import{t as it}from"./VDataTableServer-BUUXYQSU.js";import{n as Z,t as at}from"./VRow-DW-g9AN1.js";import{t as Q}from"./VSpacer-DDACi18G.js";import{t as ot}from"./apiError-DPkg25-7.js";import{i as $}from"./validation-DMwOxx4a.js";import{t as st}from"./VDialog-CCk-u1DS.js";import{t as ct}from"./VTextarea-D0rtXV7P.js";import{a as lt,i as ut,n as dt,r as ft,t as pt}from"./StatCardsRow-Zftob5vY.js";import{a as mt,i as ht,n as gt,r as _t,t as vt}from"./VFileInput-CcjvH7nQ.js";import{t as yt}from"./VAlert-rUS7Wker.js";function bt(e){if(typeof e==`number`&&Number.isFinite(e)&&e>0)return Math.trunc(e);if(typeof e==`string`&&/^\d+$/.test(e.trim())){let t=Number(e.trim());return Number.isFinite(t)&&t>0?t:null}return null}function xt(e){let t=[];for(let n of e){let e=bt(typeof n==`object`&&n&&`id`in n?n.id:n);e!==null&&t.push(e)}return[...new Set(t)]}var St=Me({alwaysFilter:Boolean,autoSelectFirst:{type:[Boolean,String]},clearOnSelect:{type:Boolean,default:!0},delimiters:Array,...Je({filterKeys:[`title`]}),...$e({hideNoData:!0,returnObject:!0}),...q(Oe({modelValue:null,role:`combobox`}),[`validationValue`,`dirty`])},`VCombobox`),Ct=F()({name:`VCombobox`,props:St(),emits:{"update:focused":e=>!0,"update:modelValue":e=>!0,"update:search":e=>!0,"update:menu":e=>!0},setup(e,{emit:n,slots:i}){let{t:o}=ae(),u=P(),f=v(!1),m=v(!0),ee=v(!1),ne=P(),re=P(),h=v(-1),g=!1,{items:y,transformIn:b,transformOut:x}=l(e),{textColorClasses:se,textColorStyles:le}=c(()=>u.value?.color),{InputIcon:ue}=Te(e),w=ye(e,`modelValue`,[],e=>b(pe(e)),t=>{let n=x(t);return e.multiple?n:n[0]??null}),de=Re(e),fe=S(()=>e.closableChips&&!de.isReadonly.value&&!de.isDisabled.value),T=t(()=>!!(e.chips||i.chip)),E=t(()=>T.value||!!i.selection),D=v(!e.multiple&&!E.value?w.value[0]?.title??``:``),me=v(null),k=t({get:()=>D.value,set:async t=>{if(D.value=t??``,t===null||t===``&&!e.multiple&&!E.value?w.value=[]:!e.multiple&&!E.value&&(w.value=[d(e,t)],ve(()=>re.value?.scrollToIndex(0))),t&&e.multiple&&e.delimiters?.length){let e=J(t);e.length>1&&(Ge(e),D.value=``)}t||(h.value=-1),m.value=!t}}),_e=t(()=>typeof e.counterValue==`function`?e.counterValue(w.value):typeof e.counterValue==`number`?e.counterValue:e.multiple?w.value.length:k.value.length),{filteredItems:M,getMatches:be}=et(e,y,()=>me.value??(e.alwaysFilter||!m.value?k.value:``)),N=t(()=>e.hideSelected&&me.value===null?M.value.filter(e=>!w.value.some(t=>t.value===e.value)):M.value),xe=t(()=>e.hideNoData&&!N.value.length||de.isReadonly.value||de.isDisabled.value),Se=ye(e,`menu`),F=t({get:()=>Se.value,set:e=>{Se.value&&!e&&ne.value?.ΨopenChildren.size||e&&xe.value||(Se.value=e)}}),{menuId:we,ariaExpanded:Ee,ariaControls:De}=tt(e,F);ce(D,e=>{g?ve(()=>g=!1):f.value&&!F.value&&(F.value=!0),n(`update:search`,e)}),ce(w,t=>{!e.multiple&&!E.value&&(D.value=t[0]?.title??``)});let Oe=t(()=>w.value.map(e=>e.value)),ke=t(()=>N.value.find(e=>e.type===`item`&&!e.props.disabled)),I=t(()=>(e.autoSelectFirst===!0||e.autoSelectFirst===`exact`&&k.value===ke.value?.title)&&N.value.length>0&&!m.value&&!ee.value),Ae=P(),Me=P(),Ne=P(),R=Ye(Ae,u),Fe=Qe(F,()=>ne.value?.contentEl,()=>u.value?.controlRef),{onTabKeydown:Ie}=nt({groups:[{type:`element`,contentRef:Me},{type:`list`,contentRef:Ae,displayItemsCount:()=>N.value.length},{type:`element`,contentRef:Ne}],onLeave:()=>{F.value=!1,u.value?.focus()}});function B(t){g=!0,ve(()=>g=!1),e.openOnClear&&(F.value=!0)}function Le(){xe.value||(F.value=!0)}function ze(e){xe.value||(f.value&&(e.preventDefault(),e.stopPropagation()),F.value=!F.value)}function Ve(e){e.key===`Tab`&&Ie(e),Ae.value?.$el.contains(e.target)&&(H(e)||e.key===`Backspace`)&&u.value?.focus()}function W(t){if(r(t)||de.isReadonly.value)return;let n=u.value?.selectionStart,i=w.value.length;if([`Enter`,`ArrowDown`,`ArrowUp`].includes(t.key)&&t.preventDefault(),[`Enter`,`ArrowDown`].includes(t.key)&&(F.value=!0),[`Escape`].includes(t.key)&&(F.value=!1),I.value&&[`Enter`,`Tab`].includes(t.key)&&ke.value&&!w.value.some(({value:e})=>e===ke.value.value)&&q(ke.value),t.key===`ArrowDown`&&I.value&&Ae.value?.focus(`next`),t.key===`Enter`&&k.value&&(q(d(e,k.value),!0,!0),E.value&&(D.value=``)),[`Backspace`,`Delete`].includes(t.key)){if(!e.multiple&&E.value&&w.value.length>0&&!k.value)return q(w.value[0],!1);if(~h.value){t.preventDefault();let e=h.value;q(w.value[h.value],!1),h.value=e>=i-1?i-2:e}else t.key===`Backspace`&&!k.value&&(h.value=i-1);return}if(e.multiple)if(t.key===`ArrowLeft`){if(h.value<0&&n&&n>0)return;let e=h.value>-1?h.value-1:i-1;w.value[e]?h.value=e:(h.value=-1,u.value?.setSelectionRange(k.value.length,k.value.length))}else if(t.key===`ArrowRight`){if(h.value<0)return;let e=h.value+1;w.value[e]?h.value=e:(h.value=-1,u.value?.setSelectionRange(0,0))}else ~h.value&&H(t)&&(h.value=-1)}function G(t){let n=J(t?.clipboardData?.getData(`Text`)??``);n.length>1&&e.multiple&&(t.preventDefault(),Ge(n))}function Ue(){e.eager&&re.value?.calculateVisibleItems()}function K(){f.value&&(ne.value?.contentEl?._clickOutside?.lastMousedownWasOutside?f.value=!1:u.value?.focus()),m.value=!0,me.value=null}function q(t,n=!0,r=!1){if(!(!t||t.props.disabled))if(e.multiple){let r=w.value.findIndex(n=>(e.valueComparator||je)(n.value,t.value)),i=n??!~r;if(~r){let e=i?[...w.value,t]:[...w.value];e.splice(r,1),w.value=e}else i&&(w.value=[...w.value,t]);e.clearOnSelect&&(k.value=``)}else{let i=n!==!1;w.value=i?[t]:[],(!m.value||e.alwaysFilter)&&D.value&&(me.value=D.value),D.value=i&&!E.value?t.title:``,ve(()=>{F.value=r,m.value=!0})}}function J(t){let n=[`
|
||
`,...e.delimiters??[]].map(U).join(`|`);return t.split(RegExp(`(?:${n})+`))}async function Ge(t){for(let n of t)n=n.trim(),n&&(q(d(e,n)),await ve())}function Ke(e){f.value=!0,setTimeout(()=>{ee.value=!0})}function Je(e){if(ee.value=!1,!u.value?.$el.contains(e.relatedTarget)){if(Fe(e))return;f.value=!1}}let $e=0;function X(){$e=performance.now()}function it(e){let t=e.relatedTarget;((ne.value?.contentEl)?.contains(t)||!t&&performance.now()-$e<10)&&(f.value=!0)}return ce(f,(t,n)=>{if(!(t||t===n)&&(h.value=-1,F.value=!1,k.value)){if(e.multiple){q(d(e,k.value));return}if(!E.value)return;w.value.some(({title:e})=>e===k.value)?D.value=``:q(d(e,k.value))}}),ce(F,t=>{if(!e.hideSelected&&t&&w.value.length&&m.value){let t=N.value.findIndex(t=>w.value.some(n=>(e.valueComparator||je)(n.value,t.value)));te&&window.requestAnimationFrame(()=>{t>=0&&re.value?.scrollToIndex(t)})}t&&(me.value=null)}),ce(y,(e,t)=>{F.value||f.value&&!t.length&&e.length&&(F.value=!0)}),Pe(()=>{let t=!!(!e.hideNoData||N.value.length||i[`prepend-item`]||i[`append-item`]||i[`no-data`]),n=w.value.length>0,r=z.filterProps(e),c={search:k,filteredItems:M.value};return L(z,V({ref:u},r,{modelValue:k.value,"onUpdate:modelValue":e=>k.value=e,focused:f.value,"onUpdate:focused":e=>f.value=e,validationValue:w.externalValue,counterValue:_e.value,dirty:n,class:[`v-combobox`,{"v-combobox--active-menu":F.value,"v-combobox--chips":!!e.chips,"v-combobox--selection-slot":!!E.value,"v-combobox--selecting-index":h.value>-1,[`v-combobox--${e.multiple?`multiple`:`single`}`]:!0},e.class],style:e.style,readonly:de.isReadonly.value,placeholder:n?void 0:e.placeholder,"onClick:clear":B,"onMousedown:control":Le,onKeydown:W,onPaste:G,onBlur:it,"aria-expanded":Ee.value,"aria-controls":De.value}),{...i,default:({id:n})=>j(O,null,[L(ge,V({id:we.value,ref:ne,modelValue:F.value,"onUpdate:modelValue":e=>F.value=e,activator:`parent`,disabled:xe.value,eager:e.eager,maxHeight:310,openOnClick:!1,closeOnContentClick:!1,onAfterEnter:Ue,onAfterLeave:K},e.menuProps,{contentClass:[`v-combobox__content`,e.menuProps?.contentClass]}),{default:()=>[L(Xe,{elevation:e.menuElevation,onFocusin:Ke,onKeydown:Ve,onMousedown:X},{default:()=>[i[`menu-header`]&&j(`header`,{ref:Me},[i[`menu-header`](c)]),t&&L(He,V({key:`combobox-list`,ref:Ae,filterable:!0,selected:Oe.value,selectStrategy:e.multiple?`independent`:`single-independent`,onMousedown:e=>e.preventDefault(),selectable:!!N.value.length,onFocusout:Je,tabindex:`-1`,"aria-live":`polite`,"aria-labelledby":`${n.value}-label`,"aria-multiselectable":e.multiple,color:e.itemColor??e.color},R,e.listProps),{default:()=>[i[`prepend-item`]?.(),!N.value.length&&!e.hideNoData&&(i[`no-data`]?.()??L(Ce,{key:`no-data`,title:o(e.noDataText)},null)),L(rt,{ref:re,renderless:!0,items:N.value,itemKey:`value`},{default:({item:t,index:n,itemRef:r})=>{let a=V(t.props,{ref:r,key:t.value,active:I.value&&t===ke.value?!0:void 0,onClick:()=>q(t,null),"aria-posinset":n+1,"aria-setsize":N.value.length});return t.type===`divider`?i.divider?.({props:t.raw,index:n})??L(_,V(t.props,{key:`divider-${n}`}),null):t.type===`subheader`?i.subheader?.({props:t.raw,index:n})??L(ie,V(t.props,{key:`subheader-${n}`}),null):i.item?.({item:t.raw,internalItem:t,index:n,props:a})??L(Ce,V(a,{role:`option`}),{prepend:({isSelected:n})=>j(O,null,[e.multiple&&!e.hideSelected?L(Ze,{key:t.value,modelValue:n,ripple:!1,tabindex:`-1`,"aria-hidden":!0,onClick:e=>e.preventDefault()},null):void 0,t.props.prependAvatar&&L(oe,{image:t.props.prependAvatar},null),t.props.prependIcon&&L(he,{icon:t.props.prependIcon},null)]),title:()=>m.value?t.title:Y(`v-combobox`,t.title,be(t)?.title)})}}),i[`append-item`]?.()]}),i[`menu-footer`]&&j(`footer`,{ref:Ne},[i[`menu-footer`](c)])]})]}),w.value.map((t,n)=>{function r(e){e.stopPropagation(),e.preventDefault(),q(t,!1)}let o=V(qe.filterProps(t.props),{"onClick:close":r,onKeydown(e){e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),e.stopPropagation(),r(e))},onMousedown(e){e.preventDefault(),e.stopPropagation()},modelValue:!0,"onUpdate:modelValue":void 0}),c=T.value?!!i.chip:!!i.selection,l=c?s(T.value?i.chip({item:t.raw,internalItem:t,index:n,props:o}):i.selection({item:t.raw,internalItem:t,index:n})):void 0;if(!(c&&!l))return j(`div`,{key:t.value,class:We([`v-combobox__selection`,n===h.value&&[`v-combobox__selection--selected`,se.value]]),style:a(n===h.value?le.value:{})},[T.value?i.chip?L(p,{key:`chip-defaults`,defaults:{VChip:{closable:fe.value,size:`small`,text:t.title}}},{default:()=>[l]}):L(qe,V({key:`chip`,closable:fe.value,size:`small`,text:t.title,disabled:t.props.disabled},o),null):l??j(`span`,{class:`v-combobox__selection-text`},[t.title,e.multiple&&n<w.value.length-1&&j(`span`,{class:`v-combobox__selection-comma`},[A(`,`)])])])})]),"append-inner":(...t)=>j(O,null,[i[`append-inner`]?.(...t),(!e.hideNoData||e.items.length)&&e.menuIcon?L(he,{class:`v-combobox__menu-icon`,color:u.value?.fieldIconColor,icon:e.menuIcon,onMousedown:ze,onClick:C,"aria-hidden":!0,tabindex:`-1`},null):void 0,e.appendInnerIcon&&L(ue,{key:`append-icon`,name:`appendInner`,color:t[0].iconColor.value},null)])})}),Be({isFocused:f,isPristine:m,menu:F,search:k,selectionIndex:h,filteredItems:M,select:q},u)}}),wt=Symbol.for(`vuetify:v-expansion-panel`),Tt=Me({...be(),...se()},`VExpansionPanelText`),Et=F()({name:`VExpansionPanelText`,props:Tt(),setup(e,{slots:t}){let n=we(wt);if(!n)throw Error(`[Vuetify] v-expansion-panel-text needs to be placed inside v-expansion-panel`);let{hasContent:r,onAfterLeave:i}=o(e,n.isSelected);return Pe(()=>L(u,{onAfterLeave:i},{default:()=>[ue(j(`div`,{class:We([`v-expansion-panel-text`,e.class]),style:a(e.style)},[t.default&&r.value&&j(`div`,{class:`v-expansion-panel-text__wrapper`},[t.default?.()])]),[[ne,n.isSelected.value]])]})),{}}}),Dt=Me({color:String,expandIcon:{type:ke,default:`$expand`},collapseIcon:{type:ke,default:`$collapse`},hideActions:Boolean,focusable:Boolean,static:Boolean,ripple:{type:[Boolean,Object],default:!1},readonly:Boolean,...be(),...G()},`VExpansionPanelTitle`),Ot=F()({name:`VExpansionPanelTitle`,directives:{vRipple:fe},props:Dt(),setup(e,{slots:n}){let r=we(wt);if(!r)throw Error(`[Vuetify] v-expansion-panel-title needs to be placed inside v-expansion-panel`);let{backgroundColorClasses:i,backgroundColorStyles:o}=le(()=>e.color),{dimensionStyles:s}=w(e),c=t(()=>({collapseIcon:e.collapseIcon,disabled:r.disabled.value,expanded:r.isSelected.value,expandIcon:e.expandIcon,readonly:e.readonly})),l=S(()=>r.isSelected.value?e.collapseIcon:e.expandIcon);return Pe(()=>ue(j(`button`,{class:We([`v-expansion-panel-title`,{"v-expansion-panel-title--active":r.isSelected.value,"v-expansion-panel-title--focusable":e.focusable,"v-expansion-panel-title--static":e.static},i.value,e.class]),style:a([o.value,s.value,e.style]),type:`button`,tabindex:r.disabled.value?-1:void 0,disabled:r.disabled.value,"aria-expanded":r.isSelected.value,onClick:e.readonly?void 0:r.toggle},[j(`span`,{class:`v-expansion-panel-title__overlay`},null),n.default?.(c.value),!e.hideActions&&L(p,{defaults:{VIcon:{icon:l.value}}},{default:()=>[j(`span`,{class:`v-expansion-panel-title__icon`},[n.actions?.(c.value)??L(he,null,null)])]})]),[[fe,e.ripple]])),{}}}),kt=Me({title:String,text:String,bgColor:String,...Ne(),...Le(),..._e(),...y(),...Dt(),...Tt()},`VExpansionPanel`),At=F()({name:`VExpansionPanel`,props:kt(),emits:{"group:selected":e=>!0},setup(e,{slots:n}){let r=xe(e,wt),{backgroundColorClasses:i,backgroundColorStyles:o}=le(()=>e.bgColor),{elevationClasses:s}=De(e),{roundedClasses:c}=Ue(e),l=S(()=>r?.disabled.value||e.disabled),u=t(()=>r.group.items.value.reduce((e,t,n)=>(r.group.selected.value.includes(t.id)&&e.push(n),e),[])),d=t(()=>{let e=r.group.items.value.findIndex(e=>e.id===r.id);return!r.isSelected.value&&u.value.some(t=>t-e===1)}),f=t(()=>{let e=r.group.items.value.findIndex(e=>e.id===r.id);return!r.isSelected.value&&u.value.some(t=>t-e===-1)});return k(wt,r),Pe(()=>{let t=!!(n.text||e.text),u=!!(n.title||e.title),m=Ot.filterProps(e),ee=Et.filterProps(e);return L(e.tag,{class:We([`v-expansion-panel`,{"v-expansion-panel--active":r.isSelected.value,"v-expansion-panel--before-active":d.value,"v-expansion-panel--after-active":f.value,"v-expansion-panel--disabled":l.value},c.value,i.value,e.class]),style:a([o.value,e.style])},{default:()=>[j(`div`,{class:We([`v-expansion-panel__shadow`,...s.value])},null),L(p,{defaults:{VExpansionPanelTitle:{...m},VExpansionPanelText:{...ee}}},{default:()=>[u&&L(Ot,{key:`title`},{default:()=>[n.title?n.title():e.title]}),t&&L(Et,{key:`text`},{default:()=>[n.text?n.text():e.text]}),n.default?.()]})]})}),{groupItem:r}}}),jt=[`default`,`accordion`,`inset`,`popout`],Mt=Me({flat:Boolean,...Ae(),...i(kt(),[`bgColor`,`collapseIcon`,`color`,`eager`,`elevation`,`expandIcon`,`focusable`,`hideActions`,`readonly`,`ripple`,`static`]),..._e(),...ee(),...be(),...y(),variant:{type:String,default:`default`,validator:e=>jt.includes(e)}},`VExpansionPanels`),Nt=F()({name:`VExpansionPanels`,props:Mt(),emits:{"update:modelValue":e=>!0},setup(e,{slots:t}){let{next:n,prev:r}=Fe(e,wt),{themeClasses:i}=re(e),{roundedClasses:o}=Ue(e),s=S(()=>e.variant&&`v-expansion-panels--variant-${e.variant}`);return ze({VExpansionPanel:{bgColor:S(()=>e.bgColor),collapseIcon:S(()=>e.collapseIcon),color:S(()=>e.color),eager:S(()=>e.eager),elevation:S(()=>e.elevation),expandIcon:S(()=>e.expandIcon),focusable:S(()=>e.focusable),hideActions:S(()=>e.hideActions),readonly:S(()=>e.readonly),ripple:S(()=>e.ripple),static:S(()=>e.static)}}),Pe(()=>L(e.tag,{class:We([`v-expansion-panels`,{"v-expansion-panels--flat":e.flat,"v-expansion-panels--tile":e.tile},i.value,o.value,s.value,e.class]),style:a(e.style)},{default:()=>[t.default?.({prev:r,next:n})]})),{next:n,prev:r}}}),Pt=Ie({__name:`ServerFormDialog`,props:{modelValue:{type:Boolean},form:{},isEditing:{type:Boolean},saving:{type:Boolean},lookupsLoading:{type:Boolean},passwordPresets:{},sshKeyPresets:{},categoryOptions:{},platforms:{},nodes:{},editHints:{},filesElevationItems:{}},emits:[`update:modelValue`,`save`],setup(e,{emit:n}){let r=e,i=n,a=t(()=>r.form.preset_id||r.isEditing?[]:[$(`SSH 密码或选择密码预设`)]),o=t(()=>r.form.ssh_key_preset_id||r.isEditing?[]:[$(`私钥或选择 SSH 密钥预设`)]);return(t,n)=>(N(),B(st,{"model-value":e.modelValue,"max-width":`720`,scrollable:``,persistent:``,"onUpdate:modelValue":n[18]||=e=>i(`update:modelValue`,e)},{default:W(()=>[L(b,{border:``},{default:W(()=>[L(m,{class:`d-flex align-center`},{default:W(()=>[A(T(e.isEditing?`编辑服务器`:`添加服务器`)+` `,1),L(Q),L(K,{icon:`mdi-close`,variant:`text`,size:`small`,disabled:e.saving,onClick:n[0]||=e=>i(`update:modelValue`,!1)},null,8,[`disabled`])]),_:1}),L(_),L(x,{class:`pt-4`},{default:W(()=>[e.lookupsLoading?(N(),B(D,{key:0,indeterminate:``,color:`primary`,class:`mb-3`})):I(``,!0),n[21]||=j(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`基本信息`,-1),L(at,{dense:``},{default:W(()=>[L(Z,{cols:`12`,sm:`6`},{default:W(()=>[L(z,{modelValue:e.form.name,"onUpdate:modelValue":n[1]||=t=>e.form.name=t,label:`名称`,variant:`outlined`,density:`compact`,rules:[g($)(`服务器名称`)]},null,8,[`modelValue`,`rules`])]),_:1}),L(Z,{cols:`12`,sm:`6`},{default:W(()=>[L(z,{modelValue:e.form.domain,"onUpdate:modelValue":n[2]||=t=>e.form.domain=t,label:`域名 / IP`,variant:`outlined`,density:`compact`,placeholder:`例:192.168.1.10`,rules:[g($)(`域名或 IP`)]},null,8,[`modelValue`,`rules`])]),_:1}),L(Z,{cols:`6`,sm:`4`},{default:W(()=>[L(z,{modelValue:e.form.port,"onUpdate:modelValue":n[3]||=t=>e.form.port=t,modelModifiers:{number:!0},label:`SSH 端口`,type:`number`,variant:`outlined`,density:`compact`},null,8,[`modelValue`])]),_:1}),L(Z,{cols:`6`,sm:`8`},{default:W(()=>[L(z,{modelValue:e.form.username,"onUpdate:modelValue":n[4]||=t=>e.form.username=t,label:`SSH 用户名`,variant:`outlined`,density:`compact`,placeholder:`root`,rules:[g($)(`SSH 用户名`)]},null,8,[`modelValue`,`rules`])]),_:1})]),_:1}),L(_,{class:`my-4`}),n[22]||=j(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`认证方式`,-1),L(M,{modelValue:e.form.auth_method,"onUpdate:modelValue":n[5]||=t=>e.form.auth_method=t,mandatory:``,density:`compact`,variant:`outlined`,class:`mb-3`},{default:W(()=>[L(K,{value:`password`,size:`small`},{default:W(()=>[...n[19]||=[A(`密码`,-1)]]),_:1}),L(K,{value:`key`,size:`small`},{default:W(()=>[...n[20]||=[A(`SSH 密钥`,-1)]]),_:1})]),_:1},8,[`modelValue`]),e.form.auth_method===`password`?(N(),R(O,{key:1},[L(X,{modelValue:e.form.preset_id,"onUpdate:modelValue":n[6]||=t=>e.form.preset_id=t,items:e.passwordPresets,"item-title":`display`,"item-value":`id`,label:`密码预设(可选)`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`,hint:`选择后由服务端解密填入,无需再填密码框`,"persistent-hint":``},null,8,[`modelValue`,`items`]),e.form.preset_id?I(``,!0):(N(),B(z,{key:0,modelValue:e.form.password,"onUpdate:modelValue":n[7]||=t=>e.form.password=t,label:`SSH 密码`,variant:`outlined`,density:`compact`,type:`password`,placeholder:e.isEditing&&e.editHints.password_set?`留空表示不修改`:`安装 Agent 需可 SSH`,rules:a.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)):(N(),R(O,{key:2},[L(X,{modelValue:e.form.ssh_key_preset_id,"onUpdate:modelValue":n[8]||=t=>e.form.ssh_key_preset_id=t,items:e.sshKeyPresets,"item-title":`display`,"item-value":`id`,label:`SSH 密钥预设(可选)`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`,hint:`选择后由服务端解密私钥,无需再粘贴`,"persistent-hint":``},null,8,[`modelValue`,`items`]),L(z,{modelValue:e.form.ssh_key_path,"onUpdate:modelValue":n[9]||=t=>e.form.ssh_key_path=t,label:`密钥路径(可选)`,variant:`outlined`,density:`compact`,placeholder:`~/.ssh/id_rsa`,class:`mb-2`},null,8,[`modelValue`]),e.form.ssh_key_preset_id?I(``,!0):(N(),B(ct,{key:0,modelValue:e.form.ssh_key_private,"onUpdate:modelValue":n[10]||=t=>e.form.ssh_key_private=t,label:`私钥 PEM`,variant:`outlined`,density:`compact`,rows:`4`,"auto-grow":``,placeholder:e.isEditing&&e.editHints.ssh_key_private_set?`留空表示不修改私钥`:`粘贴 -----BEGIN ... PRIVATE KEY-----`,rules:o.value},null,8,[`modelValue`,`placeholder`,`rules`]))],64)),L(_,{class:`my-4`}),n[23]||=j(`div`,{class:`text-subtitle-2 text-medium-emphasis mb-2`},`部署`,-1),L(z,{modelValue:e.form.target_path,"onUpdate:modelValue":n[11]||=t=>e.form.target_path=t,label:`目标路径`,variant:`outlined`,density:`compact`,placeholder:`/www/wwwroot`,hint:`文件同步与推送的根目录,须为绝对路径`,"persistent-hint":``,class:`mb-2`,rules:[g($)(`目标路径`)]},null,8,[`modelValue`,`rules`]),L(Ct,{modelValue:e.form.category,"onUpdate:modelValue":n[12]||=t=>e.form.category=t,items:e.categoryOptions,label:`分类`,variant:`outlined`,density:`compact`,clearable:``,hint:`可从已有分类选择或输入新分类`,"persistent-hint":``},null,8,[`modelValue`,`items`]),L(Nt,{variant:`accordion`,class:`mt-4`},{default:W(()=>[L(At,{title:`高级选项`},{default:W(()=>[L(Et,null,{default:W(()=>[L(X,{modelValue:e.form.platform_id,"onUpdate:modelValue":n[13]||=t=>e.form.platform_id=t,items:e.platforms,"item-title":`name`,"item-value":`id`,label:`平台`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`},null,8,[`modelValue`,`items`]),L(X,{modelValue:e.form.node_id,"onUpdate:modelValue":n[14]||=t=>e.form.node_id=t,items:e.nodes,"item-title":`name`,"item-value":`id`,label:`节点`,variant:`outlined`,density:`compact`,clearable:``,class:`mb-2`},null,8,[`modelValue`,`items`]),L(X,{modelValue:e.form.files_elevation,"onUpdate:modelValue":n[15]||=t=>e.form.files_elevation=t,items:e.filesElevationItems,"item-title":`title`,"item-value":`value`,label:`文件管理提权`,variant:`outlined`,density:`compact`,hint:`非 root 用户需目标机配置免密 sudo`,"persistent-hint":``},null,8,[`modelValue`,`items`])]),_:1})]),_:1})]),_:1})]),_:1}),L(_),L(h,{class:`pa-4`},{default:W(()=>[L(Q),L(K,{variant:`text`,disabled:e.saving,onClick:n[16]||=e=>i(`update:modelValue`,!1)},{default:W(()=>[...n[24]||=[A(`取消`,-1)]]),_:1},8,[`disabled`]),L(K,{color:`primary`,variant:`flat`,loading:e.saving,onClick:n[17]||=e=>i(`save`)},{default:W(()=>[...n[25]||=[A(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}}),Ft={key:1,class:`text-body-2 text-medium-emphasis mb-0`},It={class:`text-body-2 mb-3`},Lt={class:`text-success font-weight-medium`},Rt={class:`text-error font-weight-medium`},zt={key:3,class:`text-medium-emphasis mb-0`},Bt=Ie({__name:`BatchAgentResultDialog`,props:{modelValue:{type:Boolean},title:{},loading:{type:Boolean},results:{}},emits:[`update:modelValue`],setup(e,{emit:r}){let i=e,a=r,o=t(()=>i.results.filter(e=>e.success).length),s=t(()=>i.results.length-o.value);return(t,r)=>(N(),B(st,{"model-value":e.modelValue,"max-width":`560`,scrollable:``,persistent:``,"onUpdate:modelValue":r[2]||=e=>a(`update:modelValue`,e)},{default:W(()=>[L(b,{border:``},{default:W(()=>[L(m,{class:`d-flex align-center`},{default:W(()=>[A(T(e.title)+` `,1),L(Q),L(K,{icon:`mdi-close`,variant:`text`,size:`small`,disabled:e.loading,onClick:r[0]||=e=>a(`update:modelValue`,!1)},null,8,[`disabled`])]),_:1}),L(_),L(x,{class:`pt-4`},{default:W(()=>[e.loading?(N(),B(D,{key:0,indeterminate:``,color:`primary`,class:`mb-2`})):I(``,!0),e.loading?(N(),R(`p`,Ft,`正在执行,请稍候…`)):e.results.length?(N(),R(O,{key:2},[j(`p`,It,[r[3]||=A(` 成功 `,-1),j(`span`,Lt,T(o.value),1),r[4]||=A(` 台, 失败 `,-1),j(`span`,Rt,T(s.value),1),r[5]||=A(` 台 `,-1)]),L(He,{density:`compact`,class:`rounded border`},{default:W(()=>[(N(!0),R(O,null,Ve(e.results,e=>(N(),B(Ce,{key:e.server_id,class:`py-1`},{prepend:W(()=>[L(he,{color:e.success?`success`:`error`,size:`18`},{default:W(()=>[A(T(e.success?`mdi-check-circle`:`mdi-close-circle`),1)]),_:2},1032,[`color`])]),default:W(()=>[L(n,{class:`text-body-2`},{default:W(()=>[A(T(e.server_name||`#${e.server_id}`),1)]),_:2},1024),e.success&&e.stdout?(N(),B(Se,{key:0,class:`text-caption text-medium-emphasis`},{default:W(()=>[A(T(e.stdout),1)]),_:2},1024)):!e.success&&e.error?(N(),B(Se,{key:1,class:`text-caption text-error`},{default:W(()=>[A(T(e.error),1)]),_:2},1024)):I(``,!0)]),_:2},1024))),128))]),_:1})],64)):(N(),R(`p`,zt,`无结果`))]),_:1}),L(_),L(h,{class:`pa-4`},{default:W(()=>[L(Q),L(K,{color:`primary`,variant:`flat`,disabled:e.loading,onClick:r[1]||=e=>a(`update:modelValue`,!1)},{default:W(()=>[...r[6]||=[A(` 关闭 `,-1)]]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`model-value`]))}});function Vt(){return{name:``,domain:``,port:22,username:`root`,auth_method:`password`,preset_id:null,password:``,ssh_key_preset_id:null,ssh_key_path:``,ssh_key_private:``,target_path:`/www/wwwroot`,category:``,platform_id:null,node_id:null,files_elevation:`auto_sudo`}}function Ht(e){return e===`uncategorized`?``:e}function Ut(e){let t=e.auth_method===`key`?`key`:`password`;return{name:e.name,domain:e.domain||``,port:e.port??22,username:e.username||`root`,auth_method:t,preset_id:e.preset_id,password:``,ssh_key_preset_id:e.ssh_key_preset_id,ssh_key_path:e.ssh_key_path||``,ssh_key_private:``,target_path:e.target_path||`/www/wwwroot`,category:e.category||``,platform_id:e.platform_id,node_id:e.node_id,files_elevation:e.files_elevation||`auto_sudo`}}function Wt(e){let n=Ge(),r=P(!1),i=P(null),a=P(!1),o=P(Vt()),s=P({password_set:!1,ssh_key_private_set:!1}),c=P([]),l=P([]),u=P([]),d=P([]),f=P([]),p=P(!1),m=t(()=>i.value!=null),ee=[{title:`自动(权限失败时 sudo)`,value:`auto_sudo`},{title:`关闭 sudo`,value:`off`},{title:`始终 sudo(排障)`,value:`always_sudo`}];async function te(){p.value=!0;try{let[e,t,n,r]=await Promise.all([J.get(`/servers/categories`),J.getList(`/presets/`,{per_page:500}),J.getList(`/ssh-key-presets/`,{per_page:500}),J.get(`/assets/nodes`)]),i=new Set;for(let t of e.categories||[]){let e=Ht(t.name);e&&i.add(e)}u.value=[...i].sort((e,t)=>e.localeCompare(t,`zh`)),d.value=(e.platforms||[]).map(e=>({id:e.id,name:e.name})),c.value=(t.items||[]).map(e=>({...e,display:`${e.name} (${e.username||`root`})`})),l.value=(n.items||[]).map(e=>({...e,display:`${e.name} (${e.username||`root`})`})),f.value=Array.isArray(r)?r:[]}catch{n(`加载表单选项失败`,`error`)}finally{p.value=!1}}async function ne(){i.value=null,o.value=Vt(),s.value={password_set:!1,ssh_key_private_set:!1},r.value=!0,await te()}async function re(e){i.value=e.id,o.value=Ut(e),s.value={password_set:!!e.password_set,ssh_key_private_set:!!(e.ssh_key_private_set||e.ssh_key_configured)},r.value=!0,await te()}function h(){r.value=!1,i.value=null,o.value=Vt(),s.value={password_set:!1,ssh_key_private_set:!1}}function g(){let e=o.value;if(!e.name.trim())return`请填写服务器名称`;if(!e.domain.trim())return`请填写域名或 IP`;if(!e.username.trim())return`请填写 SSH 用户名`;let t=Number(e.port);if(!Number.isFinite(t)||t<1||t>65535)return`SSH 端口无效`;let n=e.target_path.trim();if(!n)return`请填写目标路径(部署根目录)`;if(!n.startsWith(`/`))return`目标路径须为绝对路径(以 / 开头)`;if(e.auth_method===`password`){if(!m.value&&!e.preset_id&&!e.password.trim())return`请选择密码预设或填写 SSH 密码(安装 Agent 需要可 SSH)`}else if(!m.value&&!e.ssh_key_preset_id&&!e.ssh_key_private.trim())return`请选择 SSH 密钥预设或粘贴私钥`;return null}function _(){let e=o.value,t={name:e.name.trim(),domain:e.domain.trim(),port:Number(e.port),username:e.username.trim()||`root`,auth_method:e.auth_method,target_path:e.target_path.trim(),category:e.category.trim()||void 0,platform_id:e.platform_id??void 0,node_id:e.node_id??void 0,files_elevation:e.files_elevation,agent_port:8601};return e.auth_method===`password`?(e.preset_id!=null&&(t.preset_id=e.preset_id),e.password.trim()&&(t.password=e.password.trim()),m.value||!e.preset_id&&e.password.trim()):(e.ssh_key_preset_id!=null&&(t.ssh_key_preset_id=e.ssh_key_preset_id),e.ssh_key_path.trim()&&(t.ssh_key_path=e.ssh_key_path.trim()),e.ssh_key_private.trim()&&(t.ssh_key_private=e.ssh_key_private.trim())),t}async function v(){let t=g();if(t){n(t,`error`);return}a.value=!0;try{let t=_();m.value&&i.value!=null?await J.put(`/servers/${i.value}`,t):await J.post(`/servers/`,t),h(),e(),n(`保存成功`)}catch(e){n(ot(e,`保存失败`),`error`)}finally{a.value=!1}}return{visible:r,editingId:i,isEditing:m,saving:a,form:o,editHints:s,passwordPresets:c,sshKeyPresets:l,categoryOptions:u,platforms:d,nodes:f,lookupsLoading:p,filesElevationItems:ee,openAdd:ne,openEdit:re,close:h,save:v}}var Gt={class:`text-body-2 mr-4`},Kt={class:`font-weight-medium`},qt={class:`text-medium-emphasis`},Jt={key:1,class:`text-medium-emphasis`},Yt={key:1,class:`d-flex align-center ga-1`},Xt=[`title`],Zt={class:`text-medium-emphasis`},Qt={class:`text-caption text-medium-emphasis`},$t={class:`d-flex ga-1`},en={class:`text-medium-emphasis`},tn={class:`text-caption text-medium-emphasis`},nn=[`title`],rn={class:`text-h6`},an={class:`text-h6`},on={class:`text-h6`},sn={class:`text-h6`},cn={class:`text-body-1 font-weight-medium text-truncate`},ln={key:0,class:`text-medium-emphasis text-center py-4`},un={key:1,class:`text-medium-emphasis`},dn={class:`text-body-2 mb-2`},fn=Ie({__name:`ServersPage`,setup(r){let i=Ge(),a=de(),{servers:o,loading:s,page:c,itemsPerPage:l,total:d,search:p,loadServers:ee,onSearch:te,onPageChange:ne,onItemsPerPageChange:re}=lt();async function v(){try{await ee()}catch{i(`加载服务器列表失败`,`error`)}}let y=P(!1),ie=P(!1),S=P(null),ae=P(!1),oe=P(!1),C=P({domain:``,port:22,name:``}),se=P([]),le=P(!1),ue=P(null),w=P(!1),fe=P([]),pe=P(``),D=P(!1),ge=P(null),k=P(!1),_e=[{title:`名称`,key:`name`},{title:`地址`,key:`address`},{title:`尝试次数`,key:`attempts`,width:100},{title:`最后错误`,key:`last_error`},{title:`最后尝试`,key:`last_attempt_at`,width:160},{title:`操作`,key:`actions`,width:140,align:`end`}];function ve(){C.value={domain:``,port:22,name:``},ae.value=!0}function ye(e,t){fe.value=e,pe.value=t||``,w.value=!0}async function M(){le.value=!0;try{se.value=(await J.get(`/servers/pending`)).items||[]}catch(e){se.value=[],i(ot(e,`加载失败列表失败`),`error`)}finally{le.value=!1}}async function be(){let e=C.value.domain.trim();if(!e){i(`请填写 IP 或域名`,`error`);return}oe.value=!0;try{let t={domain:e,port:C.value.port||22},n=C.value.name.trim();n&&(t.name=n);let r=await J.post(`/servers/add-by-ip`,t);r.success&&r.server?(ae.value=!1,i(`添加成功:${r.matched_preset} (${r.matched_username})`),v(),Ye()):(ae.value=!1,ye(r.errors||[],r.message),M())}catch(e){i(ot(e,`添加失败`),`error`)}finally{oe.value=!1}}async function xe(e){ue.value=e.id;try{let t=await J.post(`/servers/pending/${e.id}/retry`,{});t.success&&t.server?(i(`重试成功:${t.matched_preset} (${t.matched_username})`),v(),Ye(),M()):(ye(t.errors||[],t.message),M())}catch(e){i(ot(e,`重试失败`),`error`)}finally{ue.value=null}}function F(e){ge.value=e,D.value=!0}async function we(){if(ge.value){k.value=!0;try{await J.delete(`/servers/pending/${ge.value.id}`),D.value=!1,i(`已从失败列表移除`),M()}catch(e){i(ot(e,`删除失败`),`error`)}finally{k.value=!1}}}let{visible:Te,form:De,isEditing:Oe,saving:ke,lookupsLoading:Ae,passwordPresets:je,sshKeyPresets:Me,categoryOptions:Ne,platforms:Pe,nodes:Fe,editHints:Ie,filesElevationItems:Le,openAdd:Re,openEdit:ze,close:V,save:Be}=Wt(()=>{v(),Ye()});ce(Te,(e,t)=>{t&&!e&&V()});let H=P([]),U=t(()=>new Set(xt(H.value))),G=P(null),Ue=P(`info`),q=P([]),We=[{title:`状态`,key:`status`,width:100},{title:`名称`,key:`name`},{title:`地址`,key:`address`},{title:`分类`,key:`category`,width:100},{title:`目标路径`,key:`target_path`,width:200},{title:`Agent`,key:`agent`,width:100},{title:`心跳`,key:`heartbeat`,width:120},{title:`操作`,key:`actions`,width:200,align:`end`}],Je=P([{subtitle:`服务器总数`,title:`0`,icon:`mdi-server-network`,color:`blue`},{subtitle:`在线`,title:`0`,icon:`mdi-check-circle-outline`,color:`green`},{subtitle:`离线`,title:`0`,icon:`mdi-alert-circle-outline`,color:`orange`},{subtitle:`告警中`,title:`0`,icon:`mdi-bell-alert-outline`,color:`red`}]);async function Ye(){try{let e=await J.get(`/servers/stats`);Je.value[0].title=String(e.total),Je.value[1].title=String(e.online),Je.value[2].title=String(e.offline),Je.value[3].title=String(e.alerts??0)}catch{}}function Xe(e){a.push({path:`/terminal`,query:{server_id:String(e.id)}})}function Ze(e){a.push({path:`/files`,query:{server_id:String(e.id)}})}let Y=P(!1),Qe=P(!1),$e=P(!1),et=P(!1),tt=P(``),nt=P([]),X=P(null),rt=P(``),$=P(null);function ct(e){tt.value=e,nt.value=[],et.value=!0,$e.value=!0}function bt(e){nt.value=e,et.value=!1}async function St(e,t,n){let r=xt(H.value);if(!r.length){i(`请先选择服务器`,`warning`);return}if(!(n?.confirm&&!confirm(n.confirm.replace(`{n}`,String(r.length))))){ct(e);try{bt((await J.post(t,{server_ids:r})).results||[]),n?.reload!==!1&&v()}catch(e){$e.value=!1,i(ot(e,`操作失败`),`error`)}}}function Ct(e){X.value=e.id,rt.value=e.target_path?.trim()||`/www/wwwroot`}function wt(){X.value=null,rt.value=``,$.value=null}async function Tt(e){let t=rt.value.trim();if(!t){i(`目标路径不能为空`,`warning`);return}if(!t.startsWith(`/`)){i(`目标路径须为绝对路径(以 / 开头)`,`warning`);return}$.value=e;try{await J.put(`/servers/${e}`,{target_path:t}),i(`目标路径已更新`),wt(),v(),G.value?.id===e&&(G.value={...G.value,target_path:t})}catch(e){i(ot(e,`保存失败`),`error`)}finally{$.value=null}}function Et(){if(!U.value.size){i(`请先选择服务器`,`warning`);return}Qe.value=!0}async function Dt(){Qe.value=!1,await St(`自动检测目标路径`,`/servers/batch/detect-path`)}async function Ot(){let e=xt(H.value);if(e.length){i(`正在检查 ${e.length} 台服务器...`);try{await J.post(`/servers/check`,{server_ids:e}),i(`健康检查完成`),v()}catch(e){i(ot(e,`检查失败`),`error`)}}}async function kt(){if(confirm(`确定删除选中的 ${U.value.size} 台服务器?`)){for(let e of U.value)try{await J.delete(`/servers/${e}`)}catch{}H.value=[],i(`批量删除完成`),v(),Ye()}}async function At(){Y.value=!0;try{await St(`批量安装 Agent`,`/servers/batch/install-agent`,{reload:!0})}finally{Y.value=!1}}async function jt(){Y.value=!0;try{await St(`批量升级 Agent`,`/servers/batch/upgrade-agent`,{confirm:`确定对 {n} 台服务器升级 Agent?`,reload:!0})}finally{Y.value=!1}}async function Mt(){Y.value=!0;try{await St(`批量卸载 Agent`,`/servers/batch/uninstall-agent`,{confirm:`确定对 {n} 台已安装 Agent 的服务器执行卸载?
|
||
将停止服务、删除 /opt/nexus-agent 并清除 Agent 状态。`,reload:!0})}finally{Y.value=!1}}async function Nt(){try{let e=await J.getList(`/servers/`,{per_page:5e3}),t=[`ID`,`名称`,`地址`,`端口`,`用户名`,`分类`,`状态`,`Agent版本`,`最后心跳`],n=(e.items||[]).map(e=>[e.id,e.name,e.domain,e.port,e.username,e.category||``,e.status,e.agent_version||``,e.last_heartbeat||``]),r=``+[t.join(`,`),...n.map(e=>e.map(e=>`"${String(e).replace(/"/g,`""`)}"`).join(`,`))].join(`
|
||
`),a=new Blob([r],{type:`text/csv;charset=utf-8;`}),o=URL.createObjectURL(a),s=document.createElement(`a`);s.href=o,s.download=`servers_${new Date().toISOString().slice(0,10)}.csv`,s.click(),URL.revokeObjectURL(o),i(`导出完成`)}catch(e){i(e.message||`导出失败`,`error`)}}let Ft=P(!1),It=P([]),Lt=P(!1),Rt=P(null);async function zt(){if(It.value?.length){Lt.value=!0,Rt.value=null;try{let e=new FormData;e.append(`file`,It.value[0]),Rt.value=await J.upload(`/servers/import`,e),i(`导入完成`),v()}catch(e){i(e instanceof Error?e.message:`导入失败`,`error`)}finally{Lt.value=!1}}}async function Vt(e){G.value=e,Ue.value=`info`;try{q.value=(await J.get(`/servers/${e.id}/logs`,{limit:20})).items||[]}catch{q.value=[]}}function Ht(e){ze(e)}function Ut(e){S.value=e,y.value=!0}async function fn(){if(S.value){ie.value=!0;try{await J.delete(`/servers/${S.value.id}`),y.value=!1,v(),Ye(),i(`已删除`)}catch(e){i(e.message||`删除失败`,`error`)}finally{ie.value=!1}}}return Ee(()=>{Ye(),v(),M()}),(t,r)=>(N(),B(Ke,{fluid:``,class:`pa-4 pa-md-6`},{default:W(()=>[L(pt,{items:Je.value},null,8,[`items`]),L(b,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:W(()=>[L(m,{class:`d-flex align-center`},{default:W(()=>[r[33]||=A(` 服务器列表 `,-1),L(Q),L(z,{modelValue:g(p),"onUpdate:modelValue":[r[0]||=e=>f(p)?p.value=e:null,g(te)],"prepend-inner-icon":`mdi-magnify`,label:`搜索...`,density:`compact`,"hide-details":``,rounded:``,style:{"max-width":`240px`},variant:`outlined`},null,8,[`modelValue`,`onUpdate:modelValue`]),L(K,{color:`primary`,variant:`flat`,class:`ml-3`,"prepend-icon":`mdi-plus`,size:`small`,onClick:g(Re)},{default:W(()=>[...r[28]||=[A(` 添加 `,-1)]]),_:1},8,[`onClick`]),L(K,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-flash`,size:`small`,onClick:ve},{default:W(()=>[...r[29]||=[A(` 快速添加(IP) `,-1)]]),_:1}),L(K,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-download`,size:`small`,onClick:Nt},{default:W(()=>[...r[30]||=[A(` 导出CSV `,-1)]]),_:1}),L(K,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-file-import`,size:`small`,onClick:r[1]||=e=>Ft.value=!0},{default:W(()=>[...r[31]||=[A(` 导入 `,-1)]]),_:1}),L(K,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-folder-search`,size:`small`,disabled:U.value.size===0,title:`请先勾选至少一台服务器`,onClick:Et},{default:W(()=>[...r[32]||=[A(` 检测路径 `,-1)]]),_:1},8,[`disabled`])]),_:1}),U.value.size>0?(N(),B(b,{key:0,class:`mx-4 mb-2`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:W(()=>[L(x,{class:`d-flex align-center py-2`},{default:W(()=>[j(`span`,Gt,`已选择 `+T(U.value.size)+` 台服务器`,1),L(Q),L(K,{size:`small`,variant:`text`,onClick:Ot},{default:W(()=>[...r[34]||=[A(`健康检查`,-1)]]),_:1}),L(K,{size:`small`,variant:`text`,onClick:Et},{default:W(()=>[...r[35]||=[A(`检测目标路径`,-1)]]),_:1}),L(K,{size:`small`,variant:`text`,onClick:At,loading:Y.value},{default:W(()=>[...r[36]||=[A(`安装Agent`,-1)]]),_:1},8,[`loading`]),L(K,{size:`small`,variant:`text`,onClick:jt,loading:Y.value},{default:W(()=>[...r[37]||=[A(`升级Agent`,-1)]]),_:1},8,[`loading`]),L(K,{size:`small`,variant:`text`,color:`error`,onClick:Mt,loading:Y.value},{default:W(()=>[...r[38]||=[A(`卸载Agent`,-1)]]),_:1},8,[`loading`]),L(K,{size:`small`,variant:`text`,color:`error`,onClick:kt},{default:W(()=>[...r[39]||=[A(`批量删除`,-1)]]),_:1}),L(K,{size:`small`,variant:`text`,onClick:r[2]||=e=>H.value=[]},{default:W(()=>[...r[40]||=[A(`取消选择`,-1)]]),_:1})]),_:1})]),_:1})):I(``,!0),L(it,{items:g(o),headers:We,"items-length":g(d),loading:g(s),page:g(c),"items-per-page":g(l),hover:``,density:`comfortable`,"item-value":`id`,"show-select":``,modelValue:H.value,"onUpdate:modelValue":r[5]||=e=>H.value=e,"onUpdate:page":g(ne),"onUpdate:itemsPerPage":g(re),"onClick:row":r[6]||=(e,{item:t})=>Vt(t)},{"item.status":W(({item:e})=>[L(qe,{color:g(ft)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:W(()=>[A(T(g(ut)(e.status)),1)]),_:2},1032,[`color`])]),"item.name":W(({item:e})=>[j(`span`,Kt,T(e.name),1)]),"item.address":W(({item:e})=>[j(`span`,qt,T(e.domain)+`:`+T(e.port),1)]),"item.category":W(({item:e})=>[e.category?(N(),B(qe,{key:0,color:`primary`,variant:`tonal`,size:`small`,label:``},{default:W(()=>[A(T(e.category),1)]),_:2},1024)):(N(),R(`span`,Jt,`—`))]),"item.target_path":W(({item:e})=>[X.value===e.id?(N(),R(`div`,{key:0,class:`d-flex align-center ga-1`,onClick:r[4]||=E(()=>{},[`stop`])},[L(z,{modelValue:rt.value,"onUpdate:modelValue":r[3]||=e=>rt.value=e,density:`compact`,variant:`outlined`,"hide-details":``,placeholder:`/www/wwwroot`,style:{"max-width":`140px`},onKeyup:[me(t=>Tt(e.id),[`enter`]),me(wt,[`esc`])]},null,8,[`modelValue`,`onKeyup`]),L(K,{icon:`mdi-check`,size:`x-small`,variant:`text`,color:`primary`,loading:$.value===e.id,onClick:t=>Tt(e.id)},null,8,[`loading`,`onClick`]),L(K,{icon:`mdi-close`,size:`x-small`,variant:`text`,onClick:wt})])):(N(),R(`div`,Yt,[j(`span`,{class:`text-caption text-medium-emphasis text-truncate d-inline-block`,style:{"max-width":`140px`},title:e.target_path||`未配置`},T(e.target_path?.trim()||`—`),9,Xt),L(K,{icon:`mdi-pencil`,size:`x-small`,variant:`text`,density:`compact`,title:`编辑目标路径`,onClick:E(t=>Ct(e),[`stop`])},null,8,[`onClick`])]))]),"item.agent":W(({item:e})=>[j(`span`,Zt,T(e.agent_version||`—`),1)]),"item.heartbeat":W(({item:e})=>[j(`span`,Qt,T(g(dt)(e.last_heartbeat)),1)]),"item.actions":W(({item:e})=>[j(`div`,$t,[L(K,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:E(t=>Xe(e),[`stop`])},{default:W(()=>[...r[41]||=[A(`终端`,-1)]]),_:1},8,[`onClick`]),L(K,{variant:`text`,size:`x-small`,density:`compact`,onClick:E(t=>Ze(e),[`stop`])},{default:W(()=>[...r[42]||=[A(`文件`,-1)]]),_:1},8,[`onClick`]),L(K,{variant:`text`,size:`x-small`,density:`compact`,onClick:E(t=>Ht(e),[`stop`])},{default:W(()=>[...r[43]||=[A(`编辑`,-1)]]),_:1},8,[`onClick`]),L(K,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:E(t=>Ut(e),[`stop`])},{default:W(()=>[...r[44]||=[A(`删除`,-1)]]),_:1},8,[`onClick`])])]),"no-data":W(()=>[...r[45]||=[j(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无服务器数据`,-1)]]),_:1},8,[`items`,`items-length`,`loading`,`page`,`items-per-page`,`modelValue`,`onUpdate:page`,`onUpdate:itemsPerPage`])]),_:1}),L(b,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:W(()=>[L(m,{class:`d-flex align-center`},{default:W(()=>[r[47]||=A(` 连接失败列表 `,-1),se.value.length?(N(),B(qe,{key:0,size:`small`,class:`ml-2`,color:`error`,variant:`tonal`,label:``},{default:W(()=>[A(T(se.value.length),1)]),_:1})):I(``,!0),L(Q),L(K,{variant:`text`,size:`small`,"prepend-icon":`mdi-refresh`,loading:le.value,onClick:M},{default:W(()=>[...r[46]||=[A(` 刷新 `,-1)]]),_:1},8,[`loading`])]),_:1}),L(e,{items:se.value,headers:_e,loading:le.value,hover:``,density:`comfortable`,"items-per-page":10},{"item.address":W(({item:e})=>[j(`span`,en,T(e.domain)+`:`+T(e.port),1)]),"item.last_attempt_at":W(({item:e})=>[j(`span`,tn,T(g(dt)(e.last_attempt_at)),1)]),"item.last_error":W(({item:e})=>[j(`span`,{class:`text-caption text-error text-truncate d-inline-block`,style:{"max-width":`320px`},title:e.last_error},T(e.last_error||`—`),9,nn)]),"item.actions":W(({item:e})=>[L(K,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,loading:ue.value===e.id,onClick:t=>xe(e)},{default:W(()=>[...r[48]||=[A(` 重试 `,-1)]]),_:1},8,[`loading`,`onClick`]),L(K,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>F(e)},{default:W(()=>[...r[49]||=[A(`删除`,-1)]]),_:1},8,[`onClick`])]),"no-data":W(()=>[...r[50]||=[j(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无连接失败记录`,-1)]]),_:1},8,[`items`,`loading`])]),_:1}),L(u,null,{default:W(()=>[G.value?(N(),B(b,{key:0,class:`mt-4`,elevation:`0`,border:``,rounded:`lg`},{default:W(()=>[L(m,{class:`d-flex align-center`},{default:W(()=>[L(he,{class:`mr-2`},{default:W(()=>[...r[51]||=[A(`mdi-information-outline`,-1)]]),_:1}),A(` `+T(G.value.name)+` `,1),L(qe,{color:g(ft)(G.value.status),size:`small`,variant:`tonal`,label:``,class:`ml-2`},{default:W(()=>[A(T(g(ut)(G.value.status)),1)]),_:1},8,[`color`]),L(Q),L(K,{icon:`mdi-close`,size:`small`,variant:`text`,onClick:r[7]||=e=>G.value=null})]),_:1}),L(_),L(gt,{modelValue:Ue.value,"onUpdate:modelValue":r[8]||=e=>Ue.value=e,density:`compact`},{default:W(()=>[L(mt,{value:`info`},{default:W(()=>[...r[52]||=[A(`系统信息`,-1)]]),_:1}),L(mt,{value:`logs`},{default:W(()=>[...r[53]||=[A(`同步日志`,-1)]]),_:1})]),_:1},8,[`modelValue`]),L(ht,{modelValue:Ue.value,"onUpdate:modelValue":r[9]||=e=>Ue.value=e},{default:W(()=>[L(_t,{value:`info`},{default:W(()=>[L(x,null,{default:W(()=>[L(at,{dense:``},{default:W(()=>[L(Z,{cols:`6`,md:`3`},{default:W(()=>[r[54]||=j(`div`,{class:`text-caption text-medium-emphasis`},`CPU`,-1),j(`div`,rn,T(G.value.system_info?.cpu_usage??`—`)+`%`,1)]),_:1}),L(Z,{cols:`6`,md:`3`},{default:W(()=>[r[55]||=j(`div`,{class:`text-caption text-medium-emphasis`},`内存`,-1),j(`div`,an,T(G.value.system_info?.mem_usage??`—`)+`%`,1)]),_:1}),L(Z,{cols:`6`,md:`3`},{default:W(()=>[r[56]||=j(`div`,{class:`text-caption text-medium-emphasis`},`磁盘`,-1),j(`div`,on,T(G.value.system_info?.disk_usage??`—`)+`%`,1)]),_:1}),L(Z,{cols:`6`,md:`3`},{default:W(()=>[r[57]||=j(`div`,{class:`text-caption text-medium-emphasis`},`Agent`,-1),j(`div`,sn,T(G.value.agent_version||`未安装`),1)]),_:1}),L(Z,{cols:`12`,md:`6`},{default:W(()=>[r[58]||=j(`div`,{class:`text-caption text-medium-emphasis`},`目标路径`,-1),j(`div`,cn,T(G.value.target_path?.trim()||`未配置(推送页留空时无法推送到此机)`),1)]),_:1})]),_:1})]),_:1})]),_:1}),L(_t,{value:`logs`},{default:W(()=>[L(x,null,{default:W(()=>[q.value.length===0?(N(),R(`div`,ln,`暂无同步日志`)):(N(),B(He,{key:1,density:`compact`},{default:W(()=>[(N(!0),R(O,null,Ve(q.value,e=>(N(),B(Ce,{key:e.id,subtitle:e.created_at,title:`${e.source_path} → ${e.target_path}`},{append:W(()=>[L(qe,{size:`x-small`,color:e.status===`success`?`green`:`red`,variant:`tonal`,label:``},{default:W(()=>[A(T(e.status),1)]),_:2},1032,[`color`])]),_:2},1032,[`subtitle`,`title`]))),128))]),_:1}))]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1})):I(``,!0)]),_:1}),L(Pt,{modelValue:g(Te),"onUpdate:modelValue":r[10]||=e=>f(Te)?Te.value=e:null,form:g(De),"is-editing":g(Oe),saving:g(ke),"lookups-loading":g(Ae),"password-presets":g(je),"ssh-key-presets":g(Me),"category-options":g(Ne),platforms:g(Pe),nodes:g(Fe),"edit-hints":g(Ie),"files-elevation-items":g(Le),onSave:g(Be)},null,8,[`modelValue`,`form`,`is-editing`,`saving`,`lookups-loading`,`password-presets`,`ssh-key-presets`,`category-options`,`platforms`,`nodes`,`edit-hints`,`files-elevation-items`,`onSave`]),L(st,{modelValue:y.value,"onUpdate:modelValue":r[12]||=e=>y.value=e,"max-width":`400`},{default:W(()=>[L(b,{border:``},{default:W(()=>[L(m,null,{default:W(()=>[...r[59]||=[A(`确认删除`,-1)]]),_:1}),L(x,null,{default:W(()=>[r[60]||=A(`确定要删除服务器 `,-1),j(`strong`,null,T(S.value?.name),1),r[61]||=A(` 吗?`,-1)]),_:1}),L(h,null,{default:W(()=>[L(Q),L(K,{variant:`text`,onClick:r[11]||=e=>y.value=!1},{default:W(()=>[...r[62]||=[A(`取消`,-1)]]),_:1}),L(K,{color:`error`,variant:`flat`,onClick:fn,loading:ie.value},{default:W(()=>[...r[63]||=[A(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),L(st,{modelValue:ae.value,"onUpdate:modelValue":r[17]||=e=>ae.value=e,"max-width":`480`,persistent:``},{default:W(()=>[L(b,{border:``},{default:W(()=>[L(m,null,{default:W(()=>[...r[64]||=[A(`快速添加服务器(仅 IP)`,-1)]]),_:1}),L(x,null,{default:W(()=>[r[65]||=j(`p`,{class:`text-body-2 text-medium-emphasis mb-3`},` 将按顺序轮询凭据管理中的全部密码预设与 SSH 密钥预设尝试登录,首个成功即加入服务器列表。 `,-1),L(z,{modelValue:C.value.domain,"onUpdate:modelValue":r[13]||=e=>C.value.domain=e,label:`IP 或域名`,variant:`outlined`,density:`compact`,class:`mb-2`,placeholder:`192.168.1.10`,rules:[e=>!!e?.trim()||`必填`]},null,8,[`modelValue`,`rules`]),L(z,{modelValue:C.value.port,"onUpdate:modelValue":r[14]||=e=>C.value.port=e,modelModifiers:{number:!0},label:`SSH 端口`,variant:`outlined`,density:`compact`,type:`number`,class:`mb-2`},null,8,[`modelValue`]),L(z,{modelValue:C.value.name,"onUpdate:modelValue":r[15]||=e=>C.value.name=e,label:`显示名称(可选)`,variant:`outlined`,density:`compact`,hint:`留空则使用 IP`,"persistent-hint":``},null,8,[`modelValue`])]),_:1}),L(h,null,{default:W(()=>[L(Q),L(K,{variant:`text`,disabled:oe.value,onClick:r[16]||=e=>ae.value=!1},{default:W(()=>[...r[66]||=[A(`取消`,-1)]]),_:1},8,[`disabled`]),L(K,{color:`primary`,variant:`flat`,loading:oe.value,onClick:be},{default:W(()=>[...r[67]||=[A(`开始轮询`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),L(st,{modelValue:w.value,"onUpdate:modelValue":r[19]||=e=>w.value=e,"max-width":`560`},{default:W(()=>[L(b,{border:``},{default:W(()=>[L(m,{class:`text-error`},{default:W(()=>[...r[68]||=[A(`SSH 连接失败`,-1)]]),_:1}),L(x,null,{default:W(()=>[r[69]||=j(`p`,{class:`text-body-2 mb-3`},`已尝试全部凭据预设,均未登录成功。该服务器已加入「连接失败列表」,可稍后重试。`,-1),fe.value.length?(N(),B(He,{key:0,density:`compact`,class:`bg-grey-lighten-4 rounded`},{default:W(()=>[(N(!0),R(O,null,Ve(fe.value,(e,t)=>(N(),B(Ce,{key:t},{default:W(()=>[L(n,{class:`text-body-2`},{default:W(()=>[A(` [`+T(e.preset_type===`password`?`密码`:e.preset_type===`system`?`系统`:`密钥`)+`] `+T(e.preset_name)+` (`+T(e.username)+`) `,1)]),_:2},1024),L(Se,{class:`text-error`},{default:W(()=>[A(T(e.error),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})):(N(),R(`p`,un,T(pe.value),1))]),_:1}),L(h,null,{default:W(()=>[L(Q),L(K,{color:`primary`,variant:`flat`,onClick:r[18]||=e=>w.value=!1},{default:W(()=>[...r[70]||=[A(`知道了`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),L(st,{modelValue:D.value,"onUpdate:modelValue":r[21]||=e=>D.value=e,"max-width":`400`},{default:W(()=>[L(b,{border:``},{default:W(()=>[L(m,null,{default:W(()=>[...r[71]||=[A(`确认删除`,-1)]]),_:1}),L(x,null,{default:W(()=>[r[72]||=A(`从失败列表移除 `,-1),j(`strong`,null,T(ge.value?.domain),1),r[73]||=A(`?`,-1)]),_:1}),L(h,null,{default:W(()=>[L(Q),L(K,{variant:`text`,onClick:r[20]||=e=>D.value=!1},{default:W(()=>[...r[74]||=[A(`取消`,-1)]]),_:1}),L(K,{color:`error`,variant:`flat`,loading:k.value,onClick:we},{default:W(()=>[...r[75]||=[A(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),L(st,{modelValue:Qe.value,"onUpdate:modelValue":r[23]||=e=>Qe.value=e,"max-width":`480`},{default:W(()=>[L(b,{border:``},{default:W(()=>[L(m,null,{default:W(()=>[...r[76]||=[A(`自动检测目标路径`,-1)]]),_:1}),L(x,null,{default:W(()=>[j(`p`,dn,[r[77]||=A(` 将对选中的 `,-1),j(`strong`,null,T(U.value.size),1),r[78]||=A(` 台服务器执行 SSH 检测。 `,-1)]),r[79]||=j(`p`,{class:`text-body-2 text-medium-emphasis mb-0`},[A(` 在远程 `),j(`code`,null,`/www/wwwroot`),A(` 下搜索 `),j(`code`,null,`workerman.bat`),A(`,找到后将所在目录写入各服务器的 `),j(`strong`,null,`target_path`),A(`(找到第一个即停止)。 `)],-1)]),_:1}),L(h,null,{default:W(()=>[L(Q),L(K,{variant:`text`,onClick:r[22]||=e=>Qe.value=!1},{default:W(()=>[...r[80]||=[A(`取消`,-1)]]),_:1}),L(K,{color:`primary`,variant:`flat`,onClick:Dt},{default:W(()=>[...r[81]||=[A(`开始检测`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`]),L(Bt,{modelValue:$e.value,"onUpdate:modelValue":r[24]||=e=>$e.value=e,title:tt.value,loading:et.value,results:nt.value},null,8,[`modelValue`,`title`,`loading`,`results`]),L(st,{modelValue:Ft.value,"onUpdate:modelValue":r[27]||=e=>Ft.value=e,"max-width":`500`},{default:W(()=>[L(b,{border:``},{default:W(()=>[L(m,null,{default:W(()=>[...r[82]||=[A(`导入服务器`,-1)]]),_:1}),L(x,null,{default:W(()=>[r[83]||=j(`div`,{class:`text-body-2 text-medium-emphasis mb-3`},[A(` 上传 CSV 文件批量导入服务器。 `),j(`a`,{href:`/app/servers_import_template.csv`,download:``,class:`text-primary`},`下载模板`)],-1),L(vt,{modelValue:It.value,"onUpdate:modelValue":r[25]||=e=>It.value=e,label:`选择 CSV 文件`,variant:`outlined`,density:`compact`,accept:`.csv`,"show-size":``},null,8,[`modelValue`]),Rt.value?(N(),B(yt,{key:0,type:Rt.value.failed>0?`warning`:`success`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:W(()=>[A(` 成功 `+T(Rt.value.created)+`,跳过 `+T(Rt.value.skipped)+`,失败 `+T(Rt.value.failed),1)]),_:1},8,[`type`])):I(``,!0)]),_:1}),L(h,null,{default:W(()=>[L(Q),L(K,{variant:`text`,onClick:r[26]||=e=>Ft.value=!1},{default:W(()=>[...r[84]||=[A(`关闭`,-1)]]),_:1}),L(K,{color:`primary`,variant:`flat`,onClick:zt,loading:Lt.value,disabled:!It.value?.length},{default:W(()=>[...r[85]||=[A(`开始导入`,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{fn as default}; |