Files
Nexus/web/app/assets/ServersPage-MFMUnFRr.js
T
Your Name 51948469c2 build(frontend): track Vite output in Git for Gitea deploy
- Stop ignoring web/app/index.html and web/app/assets/
- Bundle index-DBKIQT7H.js from current vite build (~101MB assets)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 00:52:44 +08:00

2 lines
29 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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,$n as t,A as n,Ar as r,Bt as i,C as a,Dn as o,Dr as s,Et as c,F as l,Gn as u,Hn as d,Ht as f,In as p,It as m,Jn as h,Kn as g,L as _,Ln as v,M as y,Mt as b,N as x,Nn as S,P as C,Pn as ee,Qn as w,R as T,Rt as E,S as D,Sr as te,St as O,T as ne,Ut as k,Wn as re,Xn as ie,Xt as A,Y as ae,Yn as oe,Yt as se,Zt as j,_n as M,_r as N,_t as P,ar as F,cr as ce,ct as I,dn as L,dr as R,en as z,fr as le,hr as ue,ir as B,j as de,jn as V,jr as H,k as fe,kr as U,ln as pe,nn as me,nt as he,on as W,ot as ge,qn as G,rr as _e,sn as ve,st as ye,t as K,tn as be,tr as xe,tt as q,un as J,ur as Y,vr as Se,w as X,wr as Z,xr as Q,xt as Ce,y as we,yr as Te}from"./index-CyY9hglL.js";import{t as Ee}from"./useSnackbar-D7YOfKok.js";import{n as De,r as Oe,t as ke}from"./VChip-DTinW069.js";import{t as Ae}from"./VDialog-DHIVGppO.js";import{a as je}from"./VSelectionControl-BXb2FMyy.js";import{n as Me,t as Ne}from"./VRow-DgZHDMph.js";import{t as $}from"./VSpacer-Fs7uGyhc.js";import{t as Pe}from"./VSelect-iIQG0oXp.js";import{t as Fe}from"./VDataTableServer-DRziuDTZ.js";import{a as Ie}from"./validation-Yxuom3Du.js";import{i as Le,n as Re,r as ze,t as Be}from"./status-zxVmAdtz.js";import{t as Ve}from"./VFileInput-C2w9Xfn7.js";import{t as He}from"./VAlert-CyciX2yl.js";function Ue(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 We(e){let t=[];for(let n of e){let e=Ue(typeof n==`object`&&n&&`id`in n?n.id:n);e!==null&&t.push(e)}return[...new Set(t)]}function Ge(e){return(e||[]).filter(e=>e.success).length}function Ke(e,t){if(e instanceof m){let n=e.detail??e.message;return typeof n==`string`?n:Array.isArray(n)?n.map(e=>e?.msg||JSON.stringify(e)).join(`; `):n&&typeof n==`object`?JSON.stringify(n):e.message||t}return e instanceof Error&&e.message||t}var qe=Symbol.for(`vuetify:v-tabs`),Je=J({fixed:Boolean,sliderColor:String,sliderTransition:String,sliderTransitionDuration:[String,Number],hideSlider:Boolean,inset:Boolean,direction:{type:String,default:`horizontal`},...S(T({selectedClass:`v-tab--selected`,variant:`text`}),[`active`,`block`,`flat`,`location`,`position`,`symbol`])},`VTab`),Ye=W()({name:`VTab`,props:Je(),setup(e,{slots:n,attrs:i}){let{textColorClasses:a,textColorStyles:o}=O(()=>e.sliderColor),{backgroundColorClasses:s,backgroundColorStyles:c}=Ce(()=>e.sliderColor),l=Q(),d=Q(),f=g(()=>e.direction===`horizontal`),p=g(()=>l.value?.group?.isSelected.value??!1);function m(e,t){return{opacity:[0,1]}}function h(t,n){return e.direction===`vertical`?{transform:[`scaleY(0)`,`scaleY(1)`]}:{transform:[`scaleX(0)`,`scaleX(1)`]}}function v(e,t){let n=t.getBoundingClientRect(),r=e.getBoundingClientRect(),i=f.value?`x`:`y`,a=f.value?`X`:`Y`,o=f.value?`right`:`bottom`,s=f.value?`width`:`height`,c=n[i]>r[i]?n[o]-r[o]:n[i]-r[i],l=Math.sign(c)>0?f.value?`right`:`bottom`:Math.sign(c)<0?f.value?`left`:`top`:`center`,u=(Math.abs(c)+(Math.sign(c)<0?n[s]:r[s]))/Math.max(n[s],r[s])||0,d=n[s]/r[s]||0,p=1.5;return{transform:[`translate${a}(${c}px) scale${a}(${d})`,`translate${a}(${c/p}px) scale${a}(${(u-1)/p+1})`,`none`],transformOrigin:[,,,].fill(l)}}function y({value:t}){if(t){let t=l.value?.$el.parentElement?.querySelector(`.v-tab--selected .v-tab__slider`),n=d.value;if(!t||!n)return;let r=getComputedStyle(t).backgroundColor,i={fade:m,grow:h,shift:v}[e.sliderTransition??`shift`]??v,a=Number(e.sliderTransitionDuration)||({fade:400,grow:350,shift:225}[e.sliderTransition??`shift`]??225);L(n,{backgroundColor:[r,r],...i(n,t)},{duration:a,easing:me})}}return z(()=>{let f=_.filterProps(e);return t(_,B({symbol:qe,ref:l,class:[`v-tab`,e.class,p.value&&e.inset?s.value:[]],style:[e.style,p.value&&e.inset?c.value:[],{backgroundColor:p.value&&e.inset?`transparent !important`:void 0}],tabindex:p.value?0:-1,role:`tab`,"aria-selected":String(p.value),active:!1},f,i,{block:e.fixed,maxWidth:e.fixed?300:void 0,"onGroup:selected":y}),{...n,default:()=>G(u,null,[n.default?.()??e.text,!e.hideSlider&&G(`div`,{ref:d,class:U([`v-tab__slider`,e.inset?s.value:a.value]),style:r([o.value,e.inset?c.value:a.value])},null)])})}),we({},l)}}),Xe=e=>{let{touchstartX:t,touchendX:n,touchstartY:r,touchendY:i}=e,a=.5;e.offsetX=n-t,e.offsetY=i-r,Math.abs(e.offsetY)<a*Math.abs(e.offsetX)&&(e.left&&n<t-16&&e.left(e),e.right&&n>t+16&&e.right(e)),Math.abs(e.offsetX)<a*Math.abs(e.offsetY)&&(e.up&&i<r-16&&e.up(e),e.down&&i>r+16&&e.down(e))};function Ze(e,t){let n=e.changedTouches[0];t.touchstartX=n.clientX,t.touchstartY=n.clientY,t.start?.({originalEvent:e,...t})}function Qe(e,t){let n=e.changedTouches[0];t.touchendX=n.clientX,t.touchendY=n.clientY,t.end?.({originalEvent:e,...t}),Xe(t)}function $e(e,t){let n=e.changedTouches[0];t.touchmoveX=n.clientX,t.touchmoveY=n.clientY,t.move?.({originalEvent:e,...t})}function et(e={}){let t={touchstartX:0,touchstartY:0,touchendX:0,touchendY:0,touchmoveX:0,touchmoveY:0,offsetX:0,offsetY:0,left:e.left,right:e.right,up:e.up,down:e.down,start:e.start,move:e.move,end:e.end};return{touchstart:e=>Ze(e,t),touchend:e=>Qe(e,t),touchmove:e=>$e(e,t)}}function tt(e,t){let n=t.value,r=n?.parent?e.parentElement:e,i=n?.options??{passive:!0},a=t.instance?.$.uid;if(!r||a===void 0)return;let o=et(t.value);r._touchHandlers=r._touchHandlers??Object.create(null),r._touchHandlers[a]=o,V(o).forEach(e=>{r.addEventListener(e,o[e],i)})}function nt(e,t){let n=t.value?.parent?e.parentElement:e,r=t.instance?.$.uid;if(!n?._touchHandlers||r===void 0)return;let i=n._touchHandlers[r];V(i).forEach(e=>{n.removeEventListener(e,i[e])}),delete n._touchHandlers[r]}var rt={mounted:tt,unmounted:nt},it=Symbol.for(`vuetify:v-window`),at=Symbol.for(`vuetify:v-window-group`),ot=J({continuous:Boolean,nextIcon:{type:[Boolean,String,Function,Object],default:`$next`},prevIcon:{type:[Boolean,String,Function,Object],default:`$prev`},reverse:Boolean,showArrows:{type:[Boolean,String],validator:e=>typeof e==`boolean`||e===`hover`},verticalArrows:[Boolean,String],touch:{type:[Object,Boolean],default:void 0},direction:{type:String,default:`horizontal`},modelValue:null,disabled:Boolean,selectedClass:{type:String,default:`v-window-item--active`},mandatory:{type:[Boolean,String],default:`force`},crossfade:Boolean,transitionDuration:Number,...pe(),...b(),...f()},`VWindow`),st=W()({name:`VWindow`,directives:{vTouch:rt},props:ot(),emits:{"update:modelValue":e=>!0},setup(e,{slots:n}){let{themeClasses:i}=k(e),{isRtl:a}=A(),{t:o}=se(),s=q(e,at),c=Q(),l=g(()=>a.value?!e.reverse:e.reverse),u=te(!1),d=g(()=>e.crossfade?`v-window-crossfade-transition`:`v-window-${e.direction===`vertical`?`y`:`x`}${(l.value?!u.value:u.value)?`-reverse`:``}-transition`),f=te(0),m=Q(void 0),h=g(()=>s.items.value.findIndex(e=>s.selected.value.includes(e.id)));ue(h,(e,t)=>{let n,r={left:0,top:0};p&&t>=0&&(n=be(c.value),r.left=n?.scrollLeft,r.top=n?.scrollTop);let i=s.items.value.length,a=i-1;i<=2?u.value=e<t:e===a&&t===0?u.value=!1:e===0&&t===a?u.value=!0:u.value=e<t,F(()=>{!p||!n||(n.scrollTop!==r.top&&n.scrollTo({...r,behavior:`instant`}),requestAnimationFrame(()=>{n&&n.scrollTop!==r.top&&n.scrollTo({...r,behavior:`instant`})}))})},{flush:`sync`}),R(it,{transition:d,isReversed:u,transitionCount:f,transitionHeight:m,rootRef:c});let y=Z(()=>e.continuous||h.value!==0),b=Z(()=>e.continuous||h.value!==s.items.value.length-1);function x(){y.value&&s.prev()}function S(){b.value&&s.next()}let C=g(()=>{let r=[],i={icon:a.value?e.nextIcon:e.prevIcon,class:`v-window__${l.value?`right`:`left`}`,onClick:s.prev,"aria-label":o(`$vuetify.carousel.prev`)};r.push(y.value?n.prev?n.prev({props:i}):t(_,i,null):G(`div`,null,null));let c={icon:a.value?e.prevIcon:e.nextIcon,class:`v-window__${l.value?`left`:`right`}`,onClick:s.next,"aria-label":o(`$vuetify.carousel.next`)};return r.push(b.value?n.next?n.next({props:c}):t(_,c,null):G(`div`,null,null)),r}),ee=g(()=>e.touch===!1?e.touch:{left:()=>{l.value?x():S()},right:()=>{l.value?S():x()},start:({originalEvent:e})=>{e.stopPropagation()},...e.touch===!0?{}:e.touch});function w(t){(e.direction===`horizontal`&&t.key===`ArrowLeft`||e.direction===`vertical`&&t.key===`ArrowUp`)&&(t.preventDefault(),x(),F(()=>{y.value?T(0):T(1)})),(e.direction===`horizontal`&&t.key===`ArrowRight`||e.direction===`vertical`&&t.key===`ArrowDown`)&&(t.preventDefault(),S(),F(()=>{b.value?T(1):T(0)}))}function T(e){let t=C.value[e];t&&(Array.isArray(t)?t[0]:t).el?.focus()}return z(()=>Se(t(e.tag,{ref:c,class:U([`v-window`,{"v-window--show-arrows-on-hover":e.showArrows===`hover`,"v-window--vertical-arrows":!!e.verticalArrows,"v-window--crossfade":!!e.crossfade},i.value,e.class]),style:r([e.style,{"--v-window-transition-duration":v()?null:M(e.transitionDuration,`ms`)}])},{default:()=>[G(`div`,{class:`v-window__container`,style:{height:m.value}},[n.default?.({group:s}),e.showArrows!==!1&&G(`div`,{class:U([`v-window__controls`,{"v-window__controls--left":e.verticalArrows===`left`||e.verticalArrows===!0},{"v-window__controls--right":e.verticalArrows===`right`}]),onKeydown:w},[C.value])]),n.additional?.({group:s})]}),[[rt,ee.value]])),{group:s}}}),ct=J({...S(ot(),[`continuous`,`nextIcon`,`prevIcon`,`showArrows`,`touch`,`mandatory`])},`VTabsWindow`),lt=W()({name:`VTabsWindow`,props:ct(),emits:{"update:modelValue":e=>!0},setup(e,{slots:n}){let r=_e(qe,null),i=j(e,`modelValue`),a=g({get(){return i.value!=null||!r?i.value:r.items.value.find(e=>r.selected.value.includes(e.id))?.value},set(e){i.value=e}});return z(()=>t(st,B({_as:`VTabsWindow`},st.filterProps(e),{modelValue:a.value,"onUpdate:modelValue":e=>a.value=e,class:[`v-tabs-window`,e.class],style:e.style,mandatory:!1,touch:!1}),n)),{}}}),ut=J({reverseTransition:{type:[Boolean,String],default:void 0},transition:{type:[Boolean,String],default:void 0},...pe(),...e(),...a()},`VWindowItem`),dt=W()({name:`VWindowItem`,directives:{vTouch:rt},props:ut(),emits:{"group:selected":e=>!0},setup(e,{slots:n}){let i=_e(it),a=he(e,at),{isBooted:o}=I();if(!i||!a)throw Error(`[Vuetify] VWindowItem must be used inside VWindow`);let s=te(!1),c=g(()=>o.value&&(i.isReversed.value?e.reverseTransition!==!1:e.transition!==!1));function l(){!s.value||!i||(s.value=!1,i.transitionCount.value>0&&(--i.transitionCount.value,i.transitionCount.value===0&&(i.transitionHeight.value=void 0)))}function u(){s.value||!i||(s.value=!0,i.transitionCount.value===0&&(i.transitionHeight.value=M(i.rootRef.value?.clientHeight)),i.transitionCount.value+=1)}function f(){l()}function p(e){s.value&&F(()=>{!c.value||!s.value||!i||(i.transitionHeight.value=M(e.clientHeight))})}let m=g(()=>{let t=i.isReversed.value?e.reverseTransition:e.transition;return c.value?{name:typeof t==`string`?t:i.transition.value,onBeforeEnter:u,onAfterEnter:l,onEnterCancelled:f,onBeforeLeave:u,onAfterLeave:l,onLeaveCancelled:f,onEnter:p}:!1}),{hasContent:h}=X(e,a.isSelected);return z(()=>t(P,{transition:m.value,disabled:!o.value},{default:()=>[Se(G(`div`,{class:U([`v-window-item`,a.selectedClass.value,e.class]),style:r(e.style)},[h.value&&n.default?.()]),[[d,a.isSelected.value]])]})),{groupItem:a}}}),ft=J({...ut()},`VTabsWindowItem`),pt=W()({name:`VTabsWindowItem`,props:ft(),setup(e,{slots:n}){return z(()=>t(dt,B({_as:`VTabsWindowItem`},dt.filterProps(e),{class:[`v-tabs-window-item`,e.class],style:e.style}),n)),{}}});function mt(e){return e?e.map(e=>o(e)?e:{text:e,value:e}):[]}var ht=J({alignTabs:{type:String,default:`start`},color:String,fixedTabs:Boolean,items:{type:Array,default:()=>[]},stacked:Boolean,bgColor:String,grow:Boolean,height:{type:[Number,String],default:void 0},hideSlider:Boolean,inset:Boolean,insetPadding:[String,Number],insetRadius:[String,Number],sliderColor:String,...ee(Je(),[`spaced`,`sliderTransition`,`sliderTransitionDuration`]),...Oe({mandatory:`force`,selectedClass:`v-tab-item--selected`}),...ge(),...b()},`VTabs`),gt=W()({name:`VTabs`,props:ht(),emits:{"update:modelValue":e=>!0},setup(e,{attrs:n,slots:r}){let i=j(e,`modelValue`),a=g(()=>mt(e.items)),{densityClasses:o}=ye(e),{backgroundColorClasses:s,backgroundColorStyles:c}=Ce(()=>e.bgColor),{scopeId:l}=D();return ve({VTab:{color:Z(e,`color`),direction:Z(e,`direction`),stacked:Z(e,`stacked`),fixed:Z(e,`fixedTabs`),inset:Z(e,`inset`),sliderColor:Z(e,`sliderColor`),sliderTransition:Z(e,`sliderTransition`),sliderTransitionDuration:Z(e,`sliderTransitionDuration`),hideSlider:Z(e,`hideSlider`)}}),z(()=>{let d=De.filterProps(e),f=!!(r.window||e.items.length>0);return G(u,null,[t(De,B(d,{modelValue:i.value,"onUpdate:modelValue":e=>i.value=e,class:[`v-tabs`,`v-tabs--${e.direction}`,`v-tabs--align-tabs-${e.alignTabs}`,{"v-tabs--fixed-tabs":e.fixedTabs,"v-tabs--grow":e.grow,"v-tabs--inset":e.inset,"v-tabs--stacked":e.stacked},o.value,s.value,e.class],style:[{"--v-tabs-height":M(e.height),"--v-tabs-inset-padding":e.inset?M(e.insetPadding):void 0,"--v-tabs-inset-radius":e.inset?M(e.insetRadius):void 0},c.value,e.style],role:`tablist`,symbol:qe},l,n),{default:r.default??(()=>a.value.map(n=>r.tab?.({item:n})??t(Ye,B(n,{key:n.text,value:n.value,spaced:e.spaced}),{default:r[`tab.${n.value}`]?()=>r[`tab.${n.value}`]?.({item:n}):void 0}))),prev:r.prev,next:r.next}),f&&t(lt,B({modelValue:i.value,"onUpdate:modelValue":e=>i.value=e,key:`tabs-window`},l),{default:()=>[a.value.map(e=>r.item?.({item:e})??t(pt,{value:e.value},{default:()=>r[`item.${e.value}`]?.({item:e})})),r.window?.()]})])}),{}}}),_t={class:`text-body-2 mr-4`},vt={class:`font-weight-medium`},yt={class:`text-medium-emphasis`},bt={key:1,class:`text-medium-emphasis`},xt={class:`text-medium-emphasis`},St={class:`text-caption text-medium-emphasis`},Ct={class:`d-flex ga-1`},wt={class:`text-h6`},Tt={class:`text-h6`},Et={class:`text-h6`},Dt={class:`text-h6`},Ot={key:0,class:`text-medium-emphasis text-center py-4`},kt=xe({__name:`ServersPage`,setup(e){let r=Ee(),a=i(),{servers:o,loading:d,page:f,itemsPerPage:p,total:m,search:v,loadServers:b,onSearch:S,onPageChange:ee,onItemsPerPageChange:T}=Le();async function D(){try{await b()}catch{r(`加载服务器列表失败`,`error`)}}let te=Q([]),O=Q(!1),k=Q(!1),A=Q(!1),se=Q(!1),j=Q(!1),M=Q(null),P=Q(null),F=Q({name:``,address:``,category:``,platform_id:null,ssh_user:``,ssh_port:22,password:``}),I=Q([]),L=g(()=>new Set(We(I.value))),R=Q(null),z=Q(`info`),ue=Q([]),B=[{title:`状态`,key:`status`,width:100},{title:`名称`,key:`name`},{title:`地址`,key:`address`},{title:`分类`,key:`category`,width:100},{title:`Agent`,key:`agent`,width:100},{title:`心跳`,key:`heartbeat`,width:120},{title:`操作`,key:`actions`,width:200,align:`end`}],V=Q([{label:`服务器总数`,value:`0`,sub:``,color:`blue`,icon:`mdi-server-network`},{label:`在线`,value:`0`,sub:``,color:`green`,icon:`mdi-check-circle-outline`},{label:`离线`,value:`0`,sub:``,color:`orange`,icon:`mdi-alert-circle-outline`},{label:`告警中`,value:`0`,sub:``,color:`red`,icon:`mdi-bell-alert-outline`}]);async function U(){try{let e=await E.get(`/servers/stats`);V.value[0].value=String(e.total),V.value[1].value=String(e.online),V.value[1].sub=e.total?`${(e.online/e.total*100).toFixed(1)}% 在线率`:``,V.value[2].value=String(e.offline),V.value[3].value=String(e.alerts)}catch{}}async function pe(){try{te.value=(await E.get(`/assets/platforms`)).items||[]}catch{}}function me(e){a.push({path:`/terminal`,query:{server_id:String(e.id)}})}function he(e){a.push({path:`/files`,query:{server_id:String(e.id)}})}let W=Q(!1);async function ge(){let e=We(I.value);if(e.length){r(`正在检查 ${e.length} 台服务器...`);try{await E.post(`/servers/check`,{server_ids:e}),r(`健康检查完成`),D()}catch(e){r(Ke(e,`检查失败`),`error`)}}}async function _e(){if(confirm(`确定删除选中的 ${L.value.size} 台服务器?`)){for(let e of L.value)try{await E.delete(`/servers/${e}`)}catch{}I.value=[],r(`批量删除完成`),D(),U()}}async function ve(){let e=We(I.value);if(e.length){W.value=!0;try{r(`安装完成: ${Ge((await E.post(`/servers/batch/install-agent`,{server_ids:e})).results)}/${e.length} 成功`),D()}catch(e){r(Ke(e,`安装失败`),`error`)}finally{W.value=!1}}}async function ye(){let e=We(I.value);if(e.length){W.value=!0;try{r(`升级完成: ${Ge((await E.post(`/servers/batch/upgrade-agent`,{server_ids:e})).results)}/${e.length} 成功`),D()}catch(e){r(Ke(e,`升级失败`),`error`)}finally{W.value=!1}}}async function be(){let e=We(I.value);if(e.length&&confirm(`确定卸载选中的 ${e.length} 台服务器的 Agent`)){W.value=!0;try{r(`卸载完成: ${Ge((await E.post(`/servers/batch/uninstall-agent`,{server_ids:e})).results)}/${e.length} 成功`),D()}catch(e){r(Ke(e,`卸载失败`),`error`)}finally{W.value=!1}}}async function xe(){try{let e=await E.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||``]),i=``+[t.join(`,`),...n.map(e=>e.map(e=>`"${String(e).replace(/"/g,`""`)}"`).join(`,`))].join(`
`),a=new Blob([i],{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),r(`导出完成`)}catch(e){r(e.message||`导出失败`,`error`)}}let q=Q(!1),J=Q([]),Se=Q(!1),X=Q(null);async function Z(){if(J.value?.length){Se.value=!0,X.value=null;try{let e=new FormData;e.append(`file`,J.value[0]),X.value=await E.upload(`/servers/import`,e),r(`导入完成`),D()}catch(e){r(e instanceof Error?e.message:`导入失败`,`error`)}finally{Se.value=!1}}}async function Ce(e){R.value=e,z.value=`info`;try{ue.value=(await E.get(`/servers/${e.id}/logs`,{limit:20})).items||[]}catch{ue.value=[]}}function we(e){A.value=!0,P.value=e.id,F.value={name:e.name,address:e.domain||``,category:e.category||``,platform_id:e.platform_id,ssh_user:e.username||``,ssh_port:e.port||22,password:``},O.value=!0}function De(e){M.value=e,k.value=!0}async function Oe(){se.value=!0;try{let e={name:F.value.name,domain:F.value.address,username:F.value.ssh_user,port:F.value.ssh_port,category:F.value.category||void 0,platform_id:F.value.platform_id||void 0,password:F.value.password||void 0};A.value&&P.value?await E.put(`/servers/${P.value}`,e):await E.post(`/servers/`,e),O.value=!1,qe(),D(),U(),r(`保存成功`)}catch(e){r(e.message||`保存失败`,`error`)}finally{se.value=!1}}async function Ue(){if(M.value){j.value=!0;try{await E.delete(`/servers/${M.value.id}`),k.value=!1,D(),U(),r(`已删除`)}catch(e){r(e.message||`删除失败`,`error`)}finally{j.value=!1}}}function qe(){A.value=!1,P.value=null,F.value={name:``,address:``,category:``,platform_id:null,ssh_user:``,ssh_port:22,password:``}}return ce(()=>{U(),D(),pe()}),(e,r)=>(Y(),h(je,{fluid:``,class:`pa-6`},{default:N(()=>[t(Ne,null,{default:N(()=>[(Y(!0),ie(u,null,le(V.value,e=>(Y(),h(Me,{cols:`12`,sm:`6`,lg:`3`,key:e.label},{default:N(()=>[t(ne,{elevation:`0`,lines:`two`,rounded:`lg`,border:``},{default:N(()=>[t(fe,null,{append:N(()=>[t(ae,{color:e.color,size:`30`},{default:N(()=>[w(H(e.icon),1)]),_:2},1032,[`color`])]),default:N(()=>[t(n,{class:`text-body-small`},{default:N(()=>[w(H(e.label),1)]),_:2},1024),t(n,null,{default:N(()=>[w(H(e.value),1)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1}),t(y,{elevation:`0`,rounded:`lg`,class:`mt-4`,border:``},{default:N(()=>[t(C,{class:`d-flex align-center`},{default:N(()=>[r[26]||=w(` 服务器列表 `,-1),t($),t(K,{modelValue:s(v),"onUpdate:modelValue":[r[0]||=e=>Te(v)?v.value=e:null,s(S)],"prepend-inner-icon":`mdi-magnify`,label:`搜索...`,density:`compact`,"hide-details":``,rounded:``,style:{"max-width":`240px`},variant:`outlined`},null,8,[`modelValue`,`onUpdate:modelValue`]),t(_,{color:`primary`,variant:`flat`,class:`ml-3`,"prepend-icon":`mdi-plus`,size:`small`,onClick:r[1]||=e=>O.value=!0},{default:N(()=>[...r[23]||=[w(` 添加 `,-1)]]),_:1}),t(_,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-download`,size:`small`,onClick:xe},{default:N(()=>[...r[24]||=[w(` 导出CSV `,-1)]]),_:1}),t(_,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-file-import`,size:`small`,onClick:r[2]||=e=>q.value=!0},{default:N(()=>[...r[25]||=[w(` 导入 `,-1)]]),_:1})]),_:1}),L.value.size>0?(Y(),h(y,{key:0,class:`mx-4 mb-2`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:N(()=>[t(x,{class:`d-flex align-center py-2`},{default:N(()=>[G(`span`,_t,`已选择 `+H(L.value.size)+` 台服务器`,1),t($),t(_,{size:`small`,variant:`text`,onClick:ge},{default:N(()=>[...r[27]||=[w(`健康检查`,-1)]]),_:1}),t(_,{size:`small`,variant:`text`,onClick:ve,loading:W.value},{default:N(()=>[...r[28]||=[w(`安装Agent`,-1)]]),_:1},8,[`loading`]),t(_,{size:`small`,variant:`text`,onClick:ye,loading:W.value},{default:N(()=>[...r[29]||=[w(`升级Agent`,-1)]]),_:1},8,[`loading`]),t(_,{size:`small`,variant:`text`,color:`error`,onClick:be,loading:W.value},{default:N(()=>[...r[30]||=[w(`卸载Agent`,-1)]]),_:1},8,[`loading`]),t(_,{size:`small`,variant:`text`,color:`error`,onClick:_e},{default:N(()=>[...r[31]||=[w(`批量删除`,-1)]]),_:1}),t(_,{size:`small`,variant:`text`,onClick:r[3]||=e=>I.value=[]},{default:N(()=>[...r[32]||=[w(`取消选择`,-1)]]),_:1})]),_:1})]),_:1})):oe(``,!0),t(Fe,{items:s(o),headers:B,"items-length":s(m),loading:s(d),page:s(f),"items-per-page":s(p),hover:``,density:`comfortable`,"item-value":`id`,"show-select":``,modelValue:I.value,"onUpdate:modelValue":r[4]||=e=>I.value=e,"onUpdate:page":s(ee),"onUpdate:itemsPerPage":s(T),"onClick:row":r[5]||=(e,{item:t})=>Ce(t)},{"item.status":N(({item:e})=>[t(ke,{color:s(Re)(e.status),size:`x-small`,variant:`tonal`,label:``,border:`current sm`},{default:N(()=>[w(H(s(ze)(e.status)),1)]),_:2},1032,[`color`])]),"item.name":N(({item:e})=>[G(`span`,vt,H(e.name),1)]),"item.address":N(({item:e})=>[G(`span`,yt,H(e.domain)+`:`+H(e.port),1)]),"item.category":N(({item:e})=>[e.category?(Y(),h(ke,{key:0,color:`primary`,variant:`tonal`,size:`small`,label:``},{default:N(()=>[w(H(e.category),1)]),_:2},1024)):(Y(),ie(`span`,bt,`—`))]),"item.agent":N(({item:e})=>[G(`span`,xt,H(e.agent_version||`—`),1)]),"item.heartbeat":N(({item:e})=>[G(`span`,St,H(s(Be)(e.last_heartbeat)),1)]),"item.actions":N(({item:e})=>[G(`div`,Ct,[t(_,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:re(t=>me(e),[`stop`])},{default:N(()=>[...r[33]||=[w(`终端`,-1)]]),_:1},8,[`onClick`]),t(_,{variant:`text`,size:`x-small`,density:`compact`,onClick:re(t=>he(e),[`stop`])},{default:N(()=>[...r[34]||=[w(`文件`,-1)]]),_:1},8,[`onClick`]),t(_,{variant:`text`,size:`x-small`,density:`compact`,onClick:re(t=>we(e),[`stop`])},{default:N(()=>[...r[35]||=[w(`编辑`,-1)]]),_:1},8,[`onClick`]),t(_,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:re(t=>De(e),[`stop`])},{default:N(()=>[...r[36]||=[w(`删除`,-1)]]),_:1},8,[`onClick`])])]),"no-data":N(()=>[...r[37]||=[G(`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}),t(c,null,{default:N(()=>[R.value?(Y(),h(y,{key:0,class:`mt-4`,elevation:`0`,border:``,rounded:`lg`},{default:N(()=>[t(C,{class:`d-flex align-center`},{default:N(()=>[t(ae,{class:`mr-2`},{default:N(()=>[...r[38]||=[w(`mdi-information-outline`,-1)]]),_:1}),w(` `+H(R.value.name)+` `,1),t(ke,{color:s(Re)(R.value.status),size:`small`,variant:`tonal`,label:``,class:`ml-2`},{default:N(()=>[w(H(s(ze)(R.value.status)),1)]),_:1},8,[`color`]),t($),t(_,{icon:`mdi-close`,size:`small`,variant:`text`,onClick:r[6]||=e=>R.value=null})]),_:1}),t(de),t(gt,{modelValue:z.value,"onUpdate:modelValue":r[7]||=e=>z.value=e,density:`compact`},{default:N(()=>[t(Ye,{value:`info`},{default:N(()=>[...r[39]||=[w(`系统信息`,-1)]]),_:1}),t(Ye,{value:`logs`},{default:N(()=>[...r[40]||=[w(`同步日志`,-1)]]),_:1})]),_:1},8,[`modelValue`]),t(lt,{modelValue:z.value,"onUpdate:modelValue":r[8]||=e=>z.value=e},{default:N(()=>[t(pt,{value:`info`},{default:N(()=>[t(x,null,{default:N(()=>[t(Ne,{dense:``},{default:N(()=>[t(Me,{cols:`6`,md:`3`},{default:N(()=>[r[41]||=G(`div`,{class:`text-caption text-medium-emphasis`},`CPU`,-1),G(`div`,wt,H(R.value.system_info?.cpu_usage??`—`)+`%`,1)]),_:1}),t(Me,{cols:`6`,md:`3`},{default:N(()=>[r[42]||=G(`div`,{class:`text-caption text-medium-emphasis`},`内存`,-1),G(`div`,Tt,H(R.value.system_info?.mem_usage??`—`)+`%`,1)]),_:1}),t(Me,{cols:`6`,md:`3`},{default:N(()=>[r[43]||=G(`div`,{class:`text-caption text-medium-emphasis`},`磁盘`,-1),G(`div`,Et,H(R.value.system_info?.disk_usage??`—`)+`%`,1)]),_:1}),t(Me,{cols:`6`,md:`3`},{default:N(()=>[r[44]||=G(`div`,{class:`text-caption text-medium-emphasis`},`Agent`,-1),G(`div`,Dt,H(R.value.agent_version||`未安装`),1)]),_:1})]),_:1})]),_:1})]),_:1}),t(pt,{value:`logs`},{default:N(()=>[t(x,null,{default:N(()=>[ue.value.length===0?(Y(),ie(`div`,Ot,`暂无同步日志`)):(Y(),h(ne,{key:1,density:`compact`},{default:N(()=>[(Y(!0),ie(u,null,le(ue.value,e=>(Y(),h(fe,{key:e.id,subtitle:e.created_at,title:`${e.source_path}${e.target_path}`},{append:N(()=>[t(ke,{size:`x-small`,color:e.status===`success`?`green`:`red`,variant:`tonal`,label:``},{default:N(()=>[w(H(e.status),1)]),_:2},1032,[`color`])]),_:2},1032,[`subtitle`,`title`]))),128))]),_:1}))]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1})):oe(``,!0)]),_:1}),t(Ae,{modelValue:O.value,"onUpdate:modelValue":r[17]||=e=>O.value=e,"max-width":`600`},{default:N(()=>[t(y,{border:``},{default:N(()=>[t(C,null,{default:N(()=>[w(H(A.value?`编辑服务器`:`添加服务器`),1)]),_:1}),t(x,null,{default:N(()=>[t(K,{modelValue:F.value.name,"onUpdate:modelValue":r[9]||=e=>F.value.name=e,label:`名称`,variant:`outlined`,density:`compact`,class:`mb-2`,rules:[s(Ie)(`服务器名称`)]},null,8,[`modelValue`,`rules`]),t(K,{modelValue:F.value.address,"onUpdate:modelValue":r[10]||=e=>F.value.address=e,label:`地址 (IP:端口)`,variant:`outlined`,density:`compact`,class:`mb-2`,rules:[s(Ie)(`地址`)]},null,8,[`modelValue`,`rules`]),t(K,{modelValue:F.value.category,"onUpdate:modelValue":r[11]||=e=>F.value.category=e,label:`分类`,variant:`outlined`,density:`compact`,class:`mb-2`},null,8,[`modelValue`]),t(Pe,{modelValue:F.value.platform_id,"onUpdate:modelValue":r[12]||=e=>F.value.platform_id=e,items:te.value,"item-title":`name`,"item-value":`id`,label:`平台`,variant:`outlined`,density:`compact`,class:`mb-2`,clearable:``},null,8,[`modelValue`,`items`]),t(K,{modelValue:F.value.ssh_user,"onUpdate:modelValue":r[13]||=e=>F.value.ssh_user=e,label:`SSH 用户`,variant:`outlined`,density:`compact`,class:`mb-2`,rules:[s(Ie)(`用户名`)]},null,8,[`modelValue`,`rules`]),t(K,{modelValue:F.value.ssh_port,"onUpdate:modelValue":r[14]||=e=>F.value.ssh_port=e,label:`SSH 端口`,variant:`outlined`,density:`compact`,type:`number`,class:`mb-2`},null,8,[`modelValue`]),t(K,{modelValue:F.value.password,"onUpdate:modelValue":r[15]||=e=>F.value.password=e,label:`密码`,variant:`outlined`,density:`compact`,type:`password`,class:`mb-2`},null,8,[`modelValue`])]),_:1}),t(l,null,{default:N(()=>[t($),t(_,{variant:`text`,onClick:r[16]||=e=>O.value=!1},{default:N(()=>[...r[45]||=[w(`取消`,-1)]]),_:1}),t(_,{color:`primary`,variant:`flat`,onClick:Oe,loading:se.value},{default:N(()=>[...r[46]||=[w(`保存`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),t(Ae,{modelValue:k.value,"onUpdate:modelValue":r[19]||=e=>k.value=e,"max-width":`400`},{default:N(()=>[t(y,{border:``},{default:N(()=>[t(C,null,{default:N(()=>[...r[47]||=[w(`确认删除`,-1)]]),_:1}),t(x,null,{default:N(()=>[r[48]||=w(`确定要删除服务器 `,-1),G(`strong`,null,H(M.value?.name),1),r[49]||=w(` 吗?`,-1)]),_:1}),t(l,null,{default:N(()=>[t($),t(_,{variant:`text`,onClick:r[18]||=e=>k.value=!1},{default:N(()=>[...r[50]||=[w(`取消`,-1)]]),_:1}),t(_,{color:`error`,variant:`flat`,onClick:Ue,loading:j.value},{default:N(()=>[...r[51]||=[w(`删除`,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})]),_:1},8,[`modelValue`]),t(Ae,{modelValue:q.value,"onUpdate:modelValue":r[22]||=e=>q.value=e,"max-width":`500`},{default:N(()=>[t(y,{border:``},{default:N(()=>[t(C,null,{default:N(()=>[...r[52]||=[w(`导入服务器`,-1)]]),_:1}),t(x,null,{default:N(()=>[r[53]||=G(`div`,{class:`text-body-2 text-medium-emphasis mb-3`},[w(` 上传 CSV 文件批量导入服务器。 `),G(`a`,{href:`/app/servers_import_template.csv`,download:``,class:`text-primary`},`下载模板`)],-1),t(Ve,{modelValue:J.value,"onUpdate:modelValue":r[20]||=e=>J.value=e,label:`选择 CSV 文件`,variant:`outlined`,density:`compact`,accept:`.csv`,"show-size":``},null,8,[`modelValue`]),X.value?(Y(),h(He,{key:0,type:X.value.failed>0?`warning`:`success`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:N(()=>[w(` 成功 `+H(X.value.created)+`,跳过 `+H(X.value.skipped)+`,失败 `+H(X.value.failed),1)]),_:1},8,[`type`])):oe(``,!0)]),_:1}),t(l,null,{default:N(()=>[t($),t(_,{variant:`text`,onClick:r[21]||=e=>q.value=!1},{default:N(()=>[...r[54]||=[w(`关闭`,-1)]]),_:1}),t(_,{color:`primary`,variant:`flat`,onClick:Z,loading:Se.value,disabled:!J.value?.length},{default:N(()=>[...r[55]||=[w(`开始导入`,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{kt as default};