7 lines
57 KiB
JavaScript
7 lines
57 KiB
JavaScript
|
|
import{a as e,t}from"./VDataTable-DDvcFoZv.js";import{_ as n,a as r,c as i,d as a,i as o,l as s,n as c,o as ee,r as te,s as ne,t as l,u as re,v as u}from"./VSelect-qv3fL2oy.js";import{n as d,t as f}from"./VRow-B_1khu0W.js";import{$r as p,A as ie,B as m,Bn as ae,Cn as h,D as oe,Dr as g,F as _,H as v,Ir as y,J as se,Jn as ce,Kr as le,M as ue,N as b,Nn as de,O as fe,On as pe,P as me,Pn as he,Pr as x,Q as S,Qn as ge,Qr as _e,R as C,Rr as ve,Sr as ye,T as be,Tr as xe,U as Se,Ur as w,Wr as T,Yn as E,Yr as D,Z as Ce,Zn as we,Zr as Te,Zt as O,_ as k,_n as Ee,_r as De,ar as Oe,bt as ke,dn as Ae,dr as A,fr as j,ft as je,gr as M,hr as N,j as Me,k as Ne,kr as Pe,ln as Fe,lr as P,lt as F,m as Ie,mn as Le,n as Re,or as I,ot as ze,pr as L,pt as Be,sr as R,t as z,tn as Ve,u as He,ur as B,ut as Ue,v as We,xr as V,y as H,yn as U,z as W}from"./index-DC1GUjcg.js";import{t as Ge}from"./dataTable-esDY4cOk.js";import{t as Ke}from"./VDataTableServer-DmgDNDsc.js";import{t as G}from"./apiError-DkJwfJ23.js";import{n as qe}from"./labels-CzOhyWto.js";import{i as K}from"./validation-DMwOxx4a.js";import{t as q}from"./VDialog-2336zotW.js";import{t as Je}from"./VTextarea-Dde5kxXN.js";import{a as Ye,i as Xe,n as Ze,r as Qe,t as $e}from"./StatCardsRow-BgN54P9h.js";import{i as J,n as et,r as tt,t as nt}from"./VTabs-BJ-JhetG.js";import{t as rt}from"./usePageAutoRefresh-6iIH21ho.js";import{i as it,n as at,r as ot,t as st}from"./VExpansionPanels-BEgiCh1R.js";import{n as ct,t as lt}from"./useServerCategories-CZgCKa-o.js";function ut(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 dt(e){let t=[];for(let n of e){let e=ut(typeof n==`object`&&n&&`id`in n?n.id:n);e!==null&&t.push(e)}return[...new Set(t)]}var ft=h({alwaysFilter:Boolean,autoSelectFirst:{type:[Boolean,String]},clearOnSelect:{type:Boolean,default:!0},delimiters:Array,...r({filterKeys:[`title`]}),...c({hideNoData:!0,returnObject:!0}),...E(Re({modelValue:null,role:`combobox`}),[`validationValue`,`dirty`])},`VCombobox`),pt=U()({name:`VCombobox`,props:ft(),emits:{"update:focused":e=>!0,"update:modelValue":e=>!0,"update:search":e=>!0,"update:menu":e=>!0},setup(e,{emit:t,slots:n}){let{t:r}=Fe(),c=w(),l=T(!1),u=T(!0),d=T(!1),f=w(),p=w(),m=T(-1),h=!1,{items:g,transformIn:v,transformOut:y}=fe(e),{textColorClasses:se,textColorStyles:ue}=ke(()=>c.value?.color),{InputIcon:b}=Ie(e),S=Ae(e,`modelValue`,[],e=>v(we(e)),t=>{let n=y(t);return e.multiple?n:n[0]??null}),C=He(e),ve=le(()=>e.closableChips&&!C.isReadonly.value&&!C.isDisabled.value),xe=P(()=>!!(e.chips||n.chip)),E=P(()=>xe.value||!!n.selection),D=T(!e.multiple&&!E.value?S.value[0]?.title??``:``),Ce=T(null),O=P({get:()=>D.value,set:async t=>{if(D.value=t??``,t===null||t===``&&!e.multiple&&!E.value?S.value=[]:!e.multiple&&!E.value&&(S.value=[oe(e,t)],ye(()=>p.value?.scrollToIndex(0))),t&&e.multiple&&e.delimiters?.length){let e=et(t);e.length>1&&(tt(e),D.value=``)}t||(m.value=-1),u.value=!t}}),De=P(()=>typeof e.counterValue==`function`?e.counterValue(S.value):typeof e.counterValue==`number`?e.counterValue:e.multiple?S.value.length:O.value.length),{filteredItems:Oe,getMatches:A}=ee(e,g,()=>Ce.value??(e.alwaysFilter||!u.value?O.value:``)),j=P(()=>e.hideSelected&&Ce.value===null?Oe.value.filter(e=>!S.value.some(t=>t.value===e.value)):Oe.value),Me=P(()=>e.hideNoData&&!j.value.length||C.isReadonly.value||C.isDisabled.value),Pe=Ae(e,`menu`),F=P({get:()=>Pe.value,set:e=>{Pe.value&&!e&&f.value?.ΨopenChildren.size||e&&Me.value||(Pe.value=e)}}),{menuId:Re,ariaExpanded:I,ariaControls:ze}=te(e,F);x(D,e=>{h?ye(()=>h=!1):l.value&&!F.value&&(F.value=!0),t(`update:search`,e)}),x(S,t=>{!e.multiple&&!E.value&&(D.value=t[0]?.title??``)});let L=P(()=>S.value.map(e=>e.value)),Be=P(()=>j.value.find(e=>e.type===`item`&&!e.props.disabled)),Ve=P(()=>(e.autoSelectFirst===!0||e.autoSelectFirst===`exact`&&O.value===Be.value?.title)&&j.value.length>0&&!u.value&&!d.value),U=w(),W=w(),Ge=w(),Ke=i(U,c),G=s(F,()=>f.value?.contentEl,()=>c.value
|
|||
|
|
`,...e.delimiters??[]].map(he).join(`|`);return t.split(RegExp(`(?:${n})+`))}async function tt(t){for(let n of t)n=n.trim(),n&&(J(oe(e,n)),await ye())}function nt(e){l.value=!0,setTimeout(()=>{d.value=!0})}function rt(e){if(d.value=!1,!c.value?.$el.contains(e.relatedTarget)){if(G(e))return;l.value=!1}}let it=0;function at(){it=performance.now()}function ot(e){let t=e.relatedTarget;((f.value?.contentEl)?.contains(t)||!t&&performance.now()-it<10)&&(l.value=!0)}return x(l,(t,n)=>{if(!(t||t===n)&&(m.value=-1,F.value=!1,O.value)){if(e.multiple){J(oe(e,O.value));return}if(!E.value)return;S.value.some(({title:e})=>e===O.value)?D.value=``:J(oe(e,O.value))}}),x(F,t=>{if(!e.hideSelected&&t&&S.value.length&&u.value){let t=j.value.findIndex(t=>S.value.some(n=>(e.valueComparator||Ee)(n.value,t.value)));ge&&window.requestAnimationFrame(()=>{t>=0&&p.value?.scrollToIndex(t)})}t&&(Ce.value=null)}),x(g,(e,t)=>{F.value||l.value&&!t.length&&e.length&&(F.value=!0)}),Le(()=>{let t=!!(!e.hideNoData||j.value.length||n[`prepend-item`]||n[`append-item`]||n[`no-data`]),i=S.value.length>0,s=z.filterProps(e),ee={search:O,filteredItems:Oe.value};return M(z,V({ref:c},s,{modelValue:O.value,"onUpdate:modelValue":e=>O.value=e,focused:l.value,"onUpdate:focused":e=>l.value=e,validationValue:S.externalValue,counterValue:De.value,dirty:i,class:[`v-combobox`,{"v-combobox--active-menu":F.value,"v-combobox--chips":!!e.chips,"v-combobox--selection-slot":!!E.value,"v-combobox--selecting-index":m.value>-1,[`v-combobox--${e.multiple?`multiple`:`single`}`]:!0},e.class],style:e.style,readonly:C.isReadonly.value,placeholder:i?void 0:e.placeholder,"onClick:clear":K,"onMousedown:control":q,onKeydown:Xe,onPaste:Ze,onBlur:ot,"aria-expanded":I.value,"aria-controls":ze.value}),{...n,default:({id:i})=>B(R,null,[M(We,V({id:Re.value,ref:f,modelValue:F.value,"onUpdate:modelValue":e=>F.value=e,activator:`parent`,disabled:Me.value,eager:e.eager,maxHeight:310,openOnClick:!1,closeOnContentClick:!1,onAfterEnter:Qe,onAfterLeave:$e},e.menuProps,{contentClass:[`v-combobox__content`,e.menuProps?.contentClass]}),{default:()=>[M(k,{elevation:e.menuElevation,onFocusin:nt,onKeydown:Ye,onMousedown:at},{default:()=>[n[`menu-header`]&&B(`header`,{ref:W},[n[`menu-header`](ee)]),t&&M(be,V({key:`combobox-list`,ref:U,filterable:!0,selected:L.value,selectStrategy:e.multiple?`independent`:`single-independent`,onMousedown:e=>e.preventDefault(),selectable:!!j.value.length,onFocusout:rt,tabindex:`-1`,"aria-live":`polite`,"aria-labelledby":`${i.value}-label`,"aria-multiselectable":e.multiple,color:e.itemColor??e.color},Ke,e.listProps),{default:()=>[n[`prepend-item`]?.(),!j.value.length&&!e.hideNoData&&(n[`no-data`]?.()??M(ie,{key:`no-data`,title:r(e.noDataText)},null)),M(re,{ref:p,renderless:!0,items:j.value,itemKey:`value`},{default:({item:t,index:r,itemRef:i})=>{let s=V(t.props,{ref:i,key:t.value,active:Ve.value&&t===Be.value?!0:void 0,onClick:()=>J(t,null),"aria-posinset":r+1,"aria-setsize":j.value.length});return t.type===`divider`?n.divider?.({props:t.raw,index:r})??M(me,V(t.props,{key:`divider-${r}`}),null):t.type===`subheader`?n.subheader?.({props:t.raw,index:r})??M(Ne,V(t.props,{key:`subheader-${r}`}),null):n.item?.({item:t.raw,internalItem:t,index:r,props:s})??M(ie,V(s,{role:`option`}),{prepend:({isSelected:n})=>B(R,null,[e.multiple&&!e.hideSelected?M(a,{key:t.value,modelValue:n,ripple:!1,tabindex:`-1`,"aria-hidden":!0,onClick:e=>e.preventDefault()},null):void 0,t.props.prependAvatar&&M(Se,{image:t.props.prependAvatar},null),t.props.prependIcon&&M(Ue,{icon:t.props.prependIcon},null)]),title:()=>u.value?t.title:o(`v-combobox`,t.title,A(t)?.title)})}}),n[`append-item`]?.()]}),n[`menu-footer`]&&B(`footer`,{ref:Ge},[n[`menu-footer`](ee)])]})]}),S.value.map((t,r)=>{function i(e){e.stopPropagation(),e.preventDefault(),J(t,!1)}let a=V(_.filterProps(t.props),{"onClick:close":i,onKeydown(e){e.key!==`Enter`&&e.key!==` `||(e.preventDefault(),e.stopPropagation(),i(e))},onMousedown(e){e.preventDefault(),e.stopPropagation()},modelValue:!0,"onUpdate:modelValue":void 0}),o=xe.value?!!n.chip:!!n.selection,s=o?
|
|||
|
|
将停止服务、删除 /opt/nexus-agent 并清除 Agent 状态。`,reload:!0})}finally{Q.value=!1}}async function pr(){try{let e=await O.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(`
|
|||
|
|
`),i=new Blob([r],{type:`text/csv;charset=utf-8;`}),a=URL.createObjectURL(i),s=document.createElement(`a`);s.href=a,s.download=`servers_${new Date().toISOString().slice(0,10)}.csv`,s.click(),URL.revokeObjectURL(a),o(`导出完成`)}catch(e){o(e.message||`导出失败`,`error`)}}let mr=w(!1),hr=w(``),gr=w(22),_r=w(8601),vr=w(!1),$=w(null);function yr(e){let t=e.trim();if(!t)return``;let n=t.indexOf(` `);if(n>=0)return t.slice(n+1).trim();let r=t.lastIndexOf(`,`);if(r>=0){let e=t.slice(r+1).trim(),n=t.slice(0,r).trim();if(e&&n&&(e.includes(`.`)||e.includes(`:`)))return e}return t}function br(e){let t=new Set,n=[],r=0;for(let i of e.split(`
|
|||
|
|
`)){let e=yr(i);if(!e)continue;r+=1;let a=e.toLowerCase();t.has(a)||(t.add(a),n.push(e))}return{unique:n.length,raw:r,deduped:Math.max(0,r-n.length)}}let xr=P(()=>br(hr.value));function Sr(){hr.value=``,gr.value=22,_r.value=8601,$.value=null,mr.value=!0}async function Cr(){let e=hr.value.trim();if(!e){o(`请填写至少一个 IP 或域名`,`error`);return}vr.value=!0,$.value=null;try{let t=await O.post(`/servers/add-by-ips-batch`,{text:e,port:gr.value||22,agent_port:_r.value||8601});$.value=t,t.created>0&&(k(),Ln()),t.pending>0&&sn(),o(t.pending>0?`添加完成:${t.created} 台成功,${t.pending} 台进入连接失败列表`:`添加完成:${t.created} 台成功`,t.pending>0?`warning`:`success`)}catch(e){o(G(e,`批量添加失败`),`error`)}finally{vr.value=!1}}async function wr(e){Z.value=e,On.value=`info`,An.value=!0,kn.value=[];try{kn.value=Pn(await O.get(`/servers/${e.id}/logs`,{limit:20}))}catch{kn.value=[]}finally{An.value=!1}}function Tr(e){Tn(e)}function Er(e){He.value=e,Re.value=!0}async function Dr(){if(He.value){ze.value=!0;try{await O.delete(`/servers/${He.value.id}`),Re.value=!1,k(),Ln(),o(`已删除`)}catch(e){o(e.message||`删除失败`,`error`)}finally{ze.value=!1}}}return xe(()=>{Ln(),Se(),k(),sn()}),(n,r)=>(g(),A(u,{fluid:``,class:`pa-4 pa-md-6`},{default:y(()=>[M($e,{items:In.value},null,8,[`items`]),M(C,{elevation:`0`,rounded:`lg`,class:`my-5`,border:``},{default:y(()=>[M(m,{class:`d-flex align-center`},{default:y(()=>[r[45]||=N(` 服务器列表 `,-1),M(b),M(z,{modelValue:D(re),"onUpdate:modelValue":[r[0]||=e=>ve(re)?re.value=e:null,D(ce)],"prepend-inner-icon":`mdi-magnify`,label:`搜索...`,density:`compact`,"hide-details":``,rounded:``,style:{"max-width":`240px`},variant:`outlined`},null,8,[`modelValue`,`onUpdate:modelValue`]),M(S,{color:`primary`,variant:`flat`,class:`ml-3`,"prepend-icon":`mdi-plus`,size:`small`,onClick:D(wn)},{default:y(()=>[...r[38]||=[N(` 添加 `,-1)]]),_:1},8,[`onClick`]),M(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-flash`,size:`small`,onClick:St},{default:y(()=>[...r[39]||=[N(` 快速添加(IP) `,-1)]]),_:1}),M(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-download`,size:`small`,onClick:pr},{default:y(()=>[...r[40]||=[N(` 导出CSV `,-1)]]),_:1}),M(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-ip-network`,size:`small`,onClick:Sr},{default:y(()=>[...r[41]||=[N(` 批量添加 `,-1)]]),_:1}),M(S,{variant:`tonal`,class:`ml-2`,"prepend-icon":`mdi-folder-search`,size:`small`,disabled:X.value.size===0,title:`请先勾选至少一台服务器`,onClick:or},{default:y(()=>[...r[42]||=[N(` 检测路径 `,-1)]]),_:1},8,[`disabled`]),M(Be,{modelValue:T.value,"onUpdate:modelValue":r[1]||=e=>T.value=e,mandatory:``,density:`compact`,class:`ml-2`,color:`primary`,variant:`outlined`,divided:``},{default:y(()=>[M(S,{value:`table`,size:`small`,"prepend-icon":`mdi-table`},{default:y(()=>[...r[43]||=[N(`列表`,-1)]]),_:1}),M(S,{value:`group`,size:`small`,"prepend-icon":`mdi-folder-multiple`},{default:y(()=>[...r[44]||=[N(`分类`,-1)]]),_:1})]),_:1},8,[`modelValue`])]),_:1}),M(W,{class:`pt-0 pb-2`},{default:y(()=>[B(`div`,Tt,[r[46]||=B(`span`,{class:`text-caption text-medium-emphasis mr-1`},`分类筛选`,-1),M(_,{color:D(ae)===``?`primary`:void 0,variant:D(ae)===``?`flat`:`outlined`,size:`small`,label:``,onClick:r[2]||=e=>Ae(``)},{default:y(()=>[N(` 全部 `+p(D(ye)),1)]),_:1},8,[`color`,`variant`]),(g(!0),L(R,null,Pe(D(ge),e=>(g(),A(_,{key:e.name,color:D(ae)===e.name?`primary`:void 0,variant:D(ae)===e.name?`flat`:`outlined`,size:`small`,label:``,onClick:t=>Ae(e.name)},{default:y(()=>[N(p(e.label)+` `+p(e.count),1)]),_:2},1032,[`color`,`variant`,`onClick`]))),128)),D(_e)?(g(),A(F,{key:0,indeterminate:``,size:`16`,width:`2`})):j(``,!0),M(b),M(S,{size:`small`,variant:`tonal`,disabled:D(l)===0,loading:Ne.value,onClick:Fe},{default:y(()=>[N(` 全选筛选结果 (`+p(D(l))+`) `,1)]),_:1},8,[`disabled`,`loading`])])]),_:1}),X.value.size>0?(g(),A(C,{key:0,class:`mx-4 mb-2`,color:`primary`,variant:`tonal`,rounded:`lg`},{default:y(()=>[M(W,{class:`d-flex align-center py-2`},{de
|
|||
|
|
192.168.1.11
|
|||
|
|
10.0.0.5`},null,8,[`modelValue`]),xr.value.unique>0?(g(),L(`div`,rn,[N(` 将添加 `+p(xr.value.unique)+` 台 `,1),xr.value.deduped>0?(g(),L(`span`,an,`(已去重 `+p(xr.value.deduped)+` 个重复)`,1)):j(``,!0)])):j(``,!0),M(f,{dense:``,class:`mt-1`},{default:y(()=>[M(d,{cols:`6`},{default:y(()=>[M(z,{modelValue:gr.value,"onUpdate:modelValue":r[34]||=e=>gr.value=e,modelModifiers:{number:!0},label:`SSH 端口`,type:`number`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1}),M(d,{cols:`6`},{default:y(()=>[M(z,{modelValue:_r.value,"onUpdate:modelValue":r[35]||=e=>_r.value=e,modelModifiers:{number:!0},label:`Agent 端口`,type:`number`,variant:`outlined`,density:`compact`,"hide-details":``},null,8,[`modelValue`])]),_:1})]),_:1}),$.value?(g(),A(Ce,{key:1,type:$.value.pending>0?`warning`:`success`,density:`compact`,variant:`tonal`,class:`mt-3`},{default:y(()=>[N(` 共 `+p($.value.total)+` 台:成功 `+p($.value.created)+`,待连接 `+p($.value.pending)+`,跳过 `+p($.value.skipped)+` `,1),($.value.duplicates_removed??0)>0?(g(),L(`span`,on,` (输入 `+p($.value.input_lines)+` 行,去重 `+p($.value.duplicates_removed)+` 个) `,1)):j(``,!0)]),_:1},8,[`type`])):j(``,!0)]),_:1}),M(v,null,{default:y(()=>[M(b),M(S,{variant:`text`,onClick:r[36]||=e=>mr.value=!1},{default:y(()=>[...r[104]||=[N(`关闭`,-1)]]),_:1}),M(S,{color:`primary`,variant:`flat`,onClick:Cr,loading:vr.value,disabled:!hr.value.trim()},{default:y(()=>[...r[105]||=[N(` 开始添加 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{sn as default};
|