- services/pve.go: 导入 db 包,DB -> db.DB
- handlers/pve.go: 重写为 Gin 风格(原为标准库 net/http)
- go.mod/go.sum: go mod tidy 更新依赖
- web/dist: 重新构建前端包含 PVEHosts 页面
[金渐层/K2.6-code-preview🐾]
2 lines
23 KiB
JavaScript
2 lines
23 KiB
JavaScript
import{k as Te,I as He,J as Pe,K as Re,W as ze,X as Ee,o as i,c as d,a as s,b as t,w as o,h as p,t as u,p as Ie,e as m,n as _,m as $,Y as Ne,Z as qe,_ as le,$ as se,S as Y,N as U,O as P,a0 as Be,M as re,a1 as Le,r as y,d as S,G as Oe,u as Ae,L as Ke,a2 as Fe,a3 as Ge,a4 as We,a5 as je,a6 as ve,a7 as me,a8 as J,a9 as Ye,E as C,aa as _e,ab as pe,q as Je,ac as Xe,T as Ze,ad as Qe,ae as el,af as ll,ag as sl,ah as tl,ai as al,aj as ol}from"./index-BFjouPFU.js";import{_ as nl}from"./_plugin-vue_export-helper-DlAUqK2U.js";const il={key:0,class:"page"},ul={class:"detail-header"},dl={class:"header-left"},rl={class:"host-title"},vl={class:"host-subtitle"},ml={key:0},_l={key:1},pl={key:0,class:"header-actions"},cl={class:"detail-grid"},fl={class:"card"},yl={class:"info-list"},hl={class:"info-item"},gl={class:"info-value"},kl={key:0,class:"info-item"},Vl={class:"info-value"},wl={class:"info-item"},bl={class:"info-value"},xl={key:1,class:"info-item"},Sl={class:"info-value"},Cl={key:2,class:"info-item"},Ml={class:"info-value text-muted"},Ul={key:0,class:"card"},$l={class:"status-pills"},Dl={key:0,class:"status-pill"},Tl={class:"sp-info"},Hl={class:"sp-title"},Pl={class:"sp-bar"},Rl={class:"sp-num"},zl={key:1,class:"status-pill"},El={class:"sp-info"},Il={class:"sp-title"},Nl={class:"sp-bar"},ql={class:"sp-num"},Bl={key:2,class:"status-pill disk-multi"},Ll={class:"sp-info"},Ol={class:"sp-title"},Al={class:"sp-bar"},Kl={class:"sp-num"},Fl={class:"sp-info multi-disk-info"},Gl={class:"dd-mount"},Wl={class:"dd-bar-wrap"},jl={class:"dd-bar"},Yl={class:"dd-val"},Jl={class:"dd-pct"},Xl={key:0,class:"uptime-line"},Zl={key:1,class:"card"},Ql={key:0,class:"sync-actions"},es={class:"ssh-actions"},ls={key:1,class:"ssh-result"},ss={class:"result-grid"},ts={class:"result-item"},as={class:"rv"},os={class:"result-item"},ns={class:"rv"},is={class:"result-item"},us={class:"rv"},ds={class:"result-item"},rs={class:"rv"},vs={class:"result-item"},ms={class:"rv"},_s={class:"result-item"},ps={class:"rv"},cs={class:"result-item full"},fs={class:"rv"},ys={class:"card"},hs={class:"card-title"},gs={key:0,class:"service-list"},ks={class:"service-main"},Vs={class:"service-name"},ws={class:"service-port"},bs={key:0,class:"service-target"},xs={key:0,class:"target-note"},Ss={key:1,class:"service-note"},Cs={key:2,class:"service-actions"},Ms={key:2,class:"card"},Us={class:"offline-stats"},$s={class:"stat-box"},Ds={class:"stat-num"},Ts={class:"stat-box"},Hs={class:"stat-num"},Ps={key:0,class:"stat-box"},Rs={class:"stat-reason"},zs={key:0,class:"offline-logs"},Es={class:"log-time"},Is={class:"log-reason"},Ns={key:0,class:"log-dur"},qs={key:1,class:"log-dur pending"},Bs={key:3,class:"card"},Ls={class:"card-title"},Os={key:0,class:"rel-list"},As={class:"rel-arrow"},Ks={class:"rel-host"},Fs={class:"rel-host"},Gs={class:"rel-meta"},Ws={key:0,class:"rel-port"},js={key:1,class:"rel-note"},Ys={class:"rel-actions"},Js={__name:"MachineDetail",setup(Xs){const ce=Le(),fe=Ae(),h=Oe().is_admin,g=ce.params.id,n=y(null),X=y([]),Z=y([]),R=y(!1),z=y([]),Q=y([]),q=y(!1),f=y({}),B=y(!1),D=y({username:"",password:""}),b=y(null),E=y(!1),L=y(!1),k=y({}),O=y(!1),V=y({}),ye=Je(()=>{const a={};return z.value.forEach(e=>a[e.id]=e.hostname),a});let ee=null;Te(async()=>{if(await T(),await K(),h){await F();const e=await Ke();z.value=e.data}await He();const a=Pe||1e4;a>0&&(ee=setInterval(async()=>{await T(),await K(),h&&await F()},a))}),Re(()=>{ee&&clearInterval(ee)});async function T(){const a=await ze(g);if(n.value=a.data.machine,h){const e=await Fe(g);Q.value=e.data}n.value&&(n.value.cpu_info||n.value.memory_info||n.value.disk_info||n.value.uptime)?b.value={hostname:n.value.hostname,os_version:n.value.os_version,cpu:n.value.cpu_info,memory:n.value.memory_info,disk:n.value.disk_info,uptime:n.value.uptime,listen_ports:n.value.listen_ports?n.value.listen_ports.split(",").map(e=>e.trim()).filter(Boolean):[]}:b.value=null}async function K(){const a=await Ee(g);X.value=a.data}async function F(){const a=await Ge(),e={};z.value.forEach(r=>e[r.id]=r.hostname),Z.value=a.data.filter(r=>r.source_machine_id==g||r.target_machine_id==g).map(r=>({...r,source_hostname:e[r.source_machine_id]||r.source_machine_id,target_hostname:e[r.target_machine_id]||r.target_machine_id}))}function he(a){f.value={...a,ssh_port:a.ssh_port||22,ssh_username:a.ssh_username||"",ssh_password:""},q.value=!0}async function ge(){if(n.value.ssh_username){E.value=!0;try{const a=await _e(g,{username:n.value.ssh_username,password:""});b.value=a.data;const e={...b.value};delete e.hostname,await pe(g,e),C.success("获取并同步成功"),await T(),E.value=!1;return}catch{E.value=!1}}D.value={username:n.value.ssh_username||"",password:""},B.value=!0}async function ke(){await Ze(f.value.id,f.value),C.success("保存成功"),q.value=!1,T()}async function Ve(){R.value=!0;try{await tl(g),C.success("虚拟机已启动"),T()}catch{}R.value=!1}async function we(){try{await J.confirm("确定要关闭虚拟机吗?","确认关闭",{type:"warning"}),R.value=!0,await al(g),C.success("虚拟机已关闭"),T()}catch{}R.value=!1}async function be(){try{await J.confirm("确定删除该机器?","提示",{type:"warning"}),await Ye(g),C.success("删除成功"),fe.back()}catch{}}async function xe(){E.value=!0;try{const a=await _e(g,D.value);b.value=a.data,B.value=!1;const e={...b.value};delete e.hostname,await pe(g,e),C.success("获取并同步成功"),await T()}catch{}E.value=!1}function te(a){k.value=a?{...a,target_machine_id:a.target_machine_id||null,target_notes:a.target_notes||""}:{name:"",port:80,protocol:"TCP",notes:"",target_machine_id:null,target_notes:""},L.value=!0}async function Se(){const a={...k.value};a.id?await Qe(a.id,a):await el(g,a),C.success("保存成功"),L.value=!1,K()}async function Ce(a){try{await J.confirm("确定删除该服务?","提示",{type:"warning"}),await ol(a.id),C.success("删除成功"),K()}catch{}}function ae(a){V.value=a?{...a}:{source_machine_id:Number(g),target_machine_id:null,relation_type:"dependency",source_port:null,target_port:null,notes:""},O.value=!0}async function Me(){const a={...V.value};a.id?await ll(a.id,a):await sl(a),C.success("保存成功"),O.value=!1,F()}async function Ue(a){try{await J.confirm("确定删除该关系?","提示",{type:"warning"}),await Xe(a.id),C.success("删除成功"),F()}catch{}}function $e(a){return{port_forward:"端口转发",dependency:"依赖",primary_secondary:"主从",custom:"自定义"}[a]||a}function M(a){if(!a)return 0;const e=a.match(/\((\d+)%\)/)||a.match(/(\d+(?:\.\d+)?)%/);if(e){const r=parseFloat(e[1]);return isNaN(r)?0:Math.min(100,Math.max(0,Math.round(r)))}return 0}function De(a){return a>=90?"#f87171":a>=70?"#fbbf24":"#34d399"}function oe(a){return a>=90?"#f87171":a>=80?"#fbbf24":"#60a5fa"}function ne(a){if(!a)return[];const e=[],r=/(\S+)\s+([\d\.]+[KMGT]?\/[\d\.]+[KMGT]?)\s+\((\d+)%\)/g;let v;for(;(v=r.exec(a))!==null;)e.push({mount:v[1],detail:v[2],percent:parseInt(v[3],10)});if(e.length>0)return e;const I=M(a),H=extractDetail(a);return H?[{mount:"",detail:H,percent:I}]:[]}function ie(a){if(!a)return"-";const e=new Date(a);if(isNaN(e.getTime()))return a;const r=v=>String(v).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}function ue(a){if(!a&&a!==0)return"-";const e=Number(a);if(e<60)return`${e}秒`;if(e<3600)return`${Math.floor(e/60)}分${e%60}秒`;const r=Math.floor(e/3600),v=Math.floor(e%3600/60);if(r<24)return`${r}时${v}分`;const I=Math.floor(r/24),H=r%24;return`${I}天${H}时${v}分`}return(a,e)=>{var de;const r=S("el-icon"),v=S("el-button"),I=S("el-tag"),H=S("el-empty"),x=S("el-input"),c=S("el-form-item"),G=S("el-form"),W=S("el-dialog"),j=S("el-input-number"),w=S("el-option"),N=S("el-select");return n.value?(i(),d("div",il,[s("div",ul,[s("div",dl,[t(v,{text:"",circle:"",onClick:e[0]||(e[0]=l=>a.$router.back())},{default:o(()=>[t(r,null,{default:o(()=>[t(m(We))]),_:1})]),_:1}),s("div",null,[s("div",rl,[p(u(n.value.hostname)+" ",1),s("span",{class:Ie(["status-badge",n.value.is_online?"online":"offline"])},u(n.value.is_online?"在线":"离线"),3)]),s("div",vl,[m(h)?(i(),d("span",ml,u(n.value.ip),1)):_("",!0),s("span",null,u(n.value.os_type),1),n.value.os_version?(i(),d("span",_l,u(n.value.os_version),1)):_("",!0)])])]),m(h)?(i(),d("div",pl,[n.value.pve_host_id&&n.value.pve_vmid?(i(),$(v,{key:0,type:"success",icon:m(Ne),loading:R.value,onClick:Ve},{default:o(()=>[...e[35]||(e[35]=[p("启动",-1)])]),_:1},8,["icon","loading"])):_("",!0),n.value.pve_host_id&&n.value.pve_vmid?(i(),$(v,{key:1,type:"warning",icon:m(qe),loading:R.value,onClick:we},{default:o(()=>[...e[36]||(e[36]=[p("关闭",-1)])]),_:1},8,["icon","loading"])):_("",!0),t(v,{text:"",icon:m(le),onClick:e[1]||(e[1]=l=>he(n.value))},{default:o(()=>[...e[37]||(e[37]=[p("编辑",-1)])]),_:1},8,["icon"]),t(v,{text:"",type:"danger",icon:m(se),onClick:be},{default:o(()=>[...e[38]||(e[38]=[p("删除",-1)])]),_:1},8,["icon"])])):_("",!0)]),s("div",cl,[s("div",fl,[e[44]||(e[44]=s("div",{class:"card-title"},"基本信息",-1)),s("div",yl,[s("div",hl,[e[39]||(e[39]=s("span",{class:"info-label"},"IP",-1)),s("span",gl,u(n.value.ip),1)]),m(h)?(i(),d("div",kl,[e[40]||(e[40]=s("span",{class:"info-label"},"MAC",-1)),s("span",Vl,u(n.value.mac||"-"),1)])):_("",!0),s("div",wl,[e[41]||(e[41]=s("span",{class:"info-label"},"系统",-1)),s("span",bl,u(n.value.os_type)+" "+u(n.value.os_version||""),1)]),m(h)?(i(),d("div",xl,[e[42]||(e[42]=s("span",{class:"info-label"},"SSH 端口",-1)),s("span",Sl,u(n.value.ssh_port||22),1)])):_("",!0),m(h)?(i(),d("div",Cl,[e[43]||(e[43]=s("span",{class:"info-label"},"备注",-1)),s("span",Ml,u(n.value.notes||"-"),1)])):_("",!0)])]),n.value.cpu_info||n.value.memory_info||n.value.disk_info?(i(),d("div",Ul,[e[49]||(e[49]=s("div",{class:"card-title"},"系统状态",-1)),s("div",$l,[n.value.cpu_info?(i(),d("div",Dl,[e[45]||(e[45]=s("div",{class:"sp-icon cpu"},"CPU",-1)),s("div",Tl,[s("div",Hl,u(n.value.cpu_info),1),s("div",Pl,[s("div",{class:"sp-fill",style:Y({width:M(n.value.cpu_info)+"%"})},null,4)])]),s("div",Rl,u(M(n.value.cpu_info))+"%",1)])):_("",!0),n.value.memory_info?(i(),d("div",zl,[e[46]||(e[46]=s("div",{class:"sp-icon mem"},"MEM",-1)),s("div",El,[s("div",Il,u(n.value.memory_info),1),s("div",Nl,[s("div",{class:"sp-fill",style:Y({width:M(n.value.memory_info)+"%",background:De(M(n.value.memory_info))})},null,4)])]),s("div",ql,u(M(n.value.memory_info))+"%",1)])):_("",!0),n.value.disk_info?(i(),d("div",Bl,[ne(n.value.disk_info).length<=1?(i(),d(U,{key:0},[e[47]||(e[47]=s("div",{class:"sp-icon disk"},"DISK",-1)),s("div",Ll,[s("div",Ol,u(n.value.disk_info),1),s("div",Al,[s("div",{class:"sp-fill",style:Y({width:M(n.value.disk_info)+"%",background:oe(M(n.value.disk_info))})},null,4)])]),s("div",Kl,u(M(n.value.disk_info))+"%",1)],64)):(i(),d(U,{key:1},[e[48]||(e[48]=s("div",{class:"sp-icon disk"},"DISK",-1)),s("div",Fl,[(i(!0),d(U,null,P(ne(n.value.disk_info),(l,A)=>(i(),d("div",{key:A,class:"detail-disk-item"},[s("span",Gl,u(l.mount),1),s("div",Wl,[s("div",jl,[s("div",{class:"dd-fill",style:Y({width:l.percent+"%",background:oe(l.percent)})},null,4)])]),s("span",Yl,u(l.detail),1),s("span",Jl,u(l.percent)+"%",1)]))),128))])],64))])):_("",!0)]),n.value.uptime?(i(),d("div",Xl,[t(r,null,{default:o(()=>[t(m(je))]),_:1}),s("span",null,"运行时间 "+u(n.value.uptime),1)])):_("",!0)])):_("",!0),m(h)?(i(),d("div",Zl,[e[58]||(e[58]=s("div",{class:"card-title"},"SSH 系统信息",-1)),n.value.cpu_info||n.value.memory_info||n.value.disk_info||n.value.uptime?(i(),d("div",Ql,[t(I,{size:"small",effect:"plain",round:""},{default:o(()=>[p("上次同步 "+u(ie(n.value.ssh_synced_at)),1)]),_:1})])):_("",!0),s("div",es,[t(v,{type:"primary",icon:m(Be),onClick:ge},{default:o(()=>[...e[50]||(e[50]=[p("获取系统信息",-1)])]),_:1},8,["icon"])]),b.value?(i(),d("div",ls,[s("div",ss,[s("div",ts,[e[51]||(e[51]=s("span",{class:"rl"},"主机名",-1)),s("span",as,u(b.value.hostname),1)]),s("div",os,[e[52]||(e[52]=s("span",{class:"rl"},"系统版本",-1)),s("span",ns,u(b.value.os_version),1)]),s("div",is,[e[53]||(e[53]=s("span",{class:"rl"},"CPU",-1)),s("span",us,u(b.value.cpu),1)]),s("div",ds,[e[54]||(e[54]=s("span",{class:"rl"},"内存",-1)),s("span",rs,u(b.value.memory),1)]),s("div",vs,[e[55]||(e[55]=s("span",{class:"rl"},"磁盘",-1)),s("span",ms,u(b.value.disk),1)]),s("div",_s,[e[56]||(e[56]=s("span",{class:"rl"},"运行时间",-1)),s("span",ps,u(b.value.uptime),1)]),s("div",cs,[e[57]||(e[57]=s("span",{class:"rl"},"监听端口",-1)),s("span",fs,u((de=b.value.listen_ports)==null?void 0:de.join(", ")),1)])])])):_("",!0)])):_("",!0),s("div",ys,[s("div",hs,[e[60]||(e[60]=p(" 服务列表 ",-1)),m(h)?(i(),$(v,{key:0,size:"small",type:"primary",icon:m(re),onClick:e[2]||(e[2]=l=>te())},{default:o(()=>[...e[59]||(e[59]=[p("添加服务",-1)])]),_:1},8,["icon"])):_("",!0)]),X.value.length?(i(),d("div",gs,[(i(!0),d(U,null,P(X.value,l=>(i(),d("div",{key:l.id,class:"service-row"},[s("div",ks,[s("div",Vs,u(l.name),1),s("div",ws,u(l.port)+" / "+u(l.protocol),1)]),m(h)&&l.target_machine_id?(i(),d("div",bs,[t(r,null,{default:o(()=>[t(m(ve))]),_:1}),s("span",null,u(ye.value[l.target_machine_id]||l.target_machine_id),1),l.target_notes?(i(),d("span",xs,u(l.target_notes),1)):_("",!0)])):_("",!0),m(h)&&l.notes?(i(),d("div",Ss,u(l.notes),1)):_("",!0),m(h)?(i(),d("div",Cs,[t(v,{text:"",size:"small",icon:m(le),onClick:me(A=>te(l),["stop"])},{default:o(()=>[...e[61]||(e[61]=[p("编辑",-1)])]),_:1},8,["icon","onClick"]),t(v,{text:"",size:"small",type:"danger",icon:m(se),onClick:me(A=>Ce(l),["stop"])},{default:o(()=>[...e[62]||(e[62]=[p("删除",-1)])]),_:1},8,["icon","onClick"])])):_("",!0)]))),128))])):(i(),$(H,{key:1,description:"暂无服务","image-size":80}))]),m(h)?(i(),d("div",Ms,[e[67]||(e[67]=s("div",{class:"card-title"},"离线统计",-1)),s("div",Us,[s("div",$s,[s("div",Ds,u(n.value.offline_count||0),1),e[63]||(e[63]=s("div",{class:"stat-label"},"离线次数",-1))]),s("div",Ts,[s("div",Hs,u(ue(n.value.total_offline_seconds)),1),e[64]||(e[64]=s("div",{class:"stat-label"},"累计离线时长",-1))]),n.value.last_offline_reason?(i(),d("div",Ps,[s("div",Rs,u(n.value.last_offline_reason),1),e[65]||(e[65]=s("div",{class:"stat-label"},"上次离线原因",-1))])):_("",!0)]),Q.value.length?(i(),d("div",zs,[e[66]||(e[66]=s("div",{class:"log-title"},"最近离线记录",-1)),(i(!0),d(U,null,P(Q.value.slice(0,5),l=>(i(),d("div",{key:l.id,class:"log-row"},[s("span",Es,u(ie(l.started_at)),1),s("span",Is,u(l.reason||"未知原因"),1),l.duration_seconds!==null&&l.duration_seconds!==void 0?(i(),d("span",Ns,"持续 "+u(ue(l.duration_seconds)),1)):(i(),d("span",qs,"未恢复"))]))),128))])):_("",!0)])):_("",!0),m(h)?(i(),d("div",Bs,[s("div",Ls,[e[69]||(e[69]=p(" 关联关系 ",-1)),t(v,{size:"small",type:"primary",icon:m(re),onClick:e[3]||(e[3]=l=>ae())},{default:o(()=>[...e[68]||(e[68]=[p("添加关系",-1)])]),_:1},8,["icon"])]),Z.value.length?(i(),d("div",Os,[(i(!0),d(U,null,P(Z.value,l=>(i(),d("div",{key:l.id,class:"rel-row"},[s("div",As,[s("span",Ks,u(l.source_hostname),1),t(r,null,{default:o(()=>[t(m(ve))]),_:1}),s("span",Fs,u(l.target_hostname),1)]),s("div",Gs,[t(I,{size:"small",effect:"plain",round:""},{default:o(()=>[p(u($e(l.relation_type)),1)]),_:2},1024),l.source_port?(i(),d("span",Ws,u(l.source_port)+" → "+u(l.target_port||"-"),1)):_("",!0),l.notes?(i(),d("span",js,u(l.notes),1)):_("",!0)]),s("div",Ys,[t(v,{text:"",size:"small",icon:m(le),onClick:A=>ae(l)},{default:o(()=>[...e[70]||(e[70]=[p("编辑",-1)])]),_:1},8,["icon","onClick"]),t(v,{text:"",size:"small",type:"danger",icon:m(se),onClick:A=>Ue(l)},{default:o(()=>[...e[71]||(e[71]=[p("删除",-1)])]),_:1},8,["icon","onClick"])])]))),128))])):(i(),$(H,{key:1,description:"暂无关系","image-size":80}))])):_("",!0)]),t(W,{modelValue:B.value,"onUpdate:modelValue":e[7]||(e[7]=l=>B.value=l),title:"SSH 获取系统信息",width:"360px",class:"modern-dialog"},{footer:o(()=>[t(v,{onClick:e[6]||(e[6]=l=>B.value=!1)},{default:o(()=>[...e[72]||(e[72]=[p("取消",-1)])]),_:1}),t(v,{type:"primary",loading:E.value,onClick:xe},{default:o(()=>[...e[73]||(e[73]=[p("连接",-1)])]),_:1},8,["loading"])]),default:o(()=>[t(G,{model:D.value,"label-width":"80px"},{default:o(()=>[t(c,{label:"用户名"},{default:o(()=>[t(x,{modelValue:D.value.username,"onUpdate:modelValue":e[4]||(e[4]=l=>D.value.username=l)},null,8,["modelValue"])]),_:1}),t(c,{label:"密码"},{default:o(()=>[t(x,{modelValue:D.value.password,"onUpdate:modelValue":e[5]||(e[5]=l=>D.value.password=l),type:"password","show-password":""},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"]),t(W,{modelValue:q.value,"onUpdate:modelValue":e[18]||(e[18]=l=>q.value=l),title:"编辑机器",width:"480px",class:"modern-dialog"},{footer:o(()=>[t(v,{onClick:e[17]||(e[17]=l=>q.value=!1)},{default:o(()=>[...e[74]||(e[74]=[p("取消",-1)])]),_:1}),t(v,{type:"primary",onClick:ke},{default:o(()=>[...e[75]||(e[75]=[p("保存",-1)])]),_:1})]),default:o(()=>[t(G,{model:f.value,"label-width":"90px"},{default:o(()=>[t(c,{label:"主机名",required:""},{default:o(()=>[t(x,{modelValue:f.value.hostname,"onUpdate:modelValue":e[8]||(e[8]=l=>f.value.hostname=l)},null,8,["modelValue"])]),_:1}),t(c,{label:"IP",required:""},{default:o(()=>[t(x,{modelValue:f.value.ip,"onUpdate:modelValue":e[9]||(e[9]=l=>f.value.ip=l)},null,8,["modelValue"])]),_:1}),t(c,{label:"MAC"},{default:o(()=>[t(x,{modelValue:f.value.mac,"onUpdate:modelValue":e[10]||(e[10]=l=>f.value.mac=l)},null,8,["modelValue"])]),_:1}),t(c,{label:"SSH端口"},{default:o(()=>[t(j,{modelValue:f.value.ssh_port,"onUpdate:modelValue":e[11]||(e[11]=l=>f.value.ssh_port=l),min:1,max:65535,style:{width:"100%"}},null,8,["modelValue"])]),_:1}),t(c,{label:"SSH用户"},{default:o(()=>[t(x,{modelValue:f.value.ssh_username,"onUpdate:modelValue":e[12]||(e[12]=l=>f.value.ssh_username=l)},null,8,["modelValue"])]),_:1}),t(c,{label:"SSH密码"},{default:o(()=>[t(x,{modelValue:f.value.ssh_password,"onUpdate:modelValue":e[13]||(e[13]=l=>f.value.ssh_password=l),type:"password","show-password":"",placeholder:"输入则更新密码,留空保持不变"},null,8,["modelValue"])]),_:1}),t(c,{label:"系统",required:""},{default:o(()=>[t(N,{modelValue:f.value.os_type,"onUpdate:modelValue":e[14]||(e[14]=l=>f.value.os_type=l),style:{width:"100%"}},{default:o(()=>[t(w,{label:"Linux",value:"Linux"}),t(w,{label:"Windows",value:"Windows"}),t(w,{label:"macOS",value:"macOS"}),t(w,{label:"Other",value:"Other"})]),_:1},8,["modelValue"])]),_:1}),t(c,{label:"系统版本"},{default:o(()=>[t(x,{modelValue:f.value.os_version,"onUpdate:modelValue":e[15]||(e[15]=l=>f.value.os_version=l)},null,8,["modelValue"])]),_:1}),t(c,{label:"备注"},{default:o(()=>[t(x,{modelValue:f.value.notes,"onUpdate:modelValue":e[16]||(e[16]=l=>f.value.notes=l),type:"textarea",rows:2},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"]),t(W,{modelValue:L.value,"onUpdate:modelValue":e[26]||(e[26]=l=>L.value=l),title:"编辑服务",width:"440px",class:"modern-dialog"},{footer:o(()=>[t(v,{onClick:e[25]||(e[25]=l=>L.value=!1)},{default:o(()=>[...e[76]||(e[76]=[p("取消",-1)])]),_:1}),t(v,{type:"primary",onClick:Se},{default:o(()=>[...e[77]||(e[77]=[p("保存",-1)])]),_:1})]),default:o(()=>[t(G,{model:k.value,"label-width":"90px"},{default:o(()=>[t(c,{label:"名称",required:""},{default:o(()=>[t(x,{modelValue:k.value.name,"onUpdate:modelValue":e[19]||(e[19]=l=>k.value.name=l)},null,8,["modelValue"])]),_:1}),t(c,{label:"端口",required:""},{default:o(()=>[t(j,{modelValue:k.value.port,"onUpdate:modelValue":e[20]||(e[20]=l=>k.value.port=l),min:1,max:65535,style:{width:"100%"}},null,8,["modelValue"])]),_:1}),t(c,{label:"协议"},{default:o(()=>[t(N,{modelValue:k.value.protocol,"onUpdate:modelValue":e[21]||(e[21]=l=>k.value.protocol=l),style:{width:"100%"}},{default:o(()=>[t(w,{label:"TCP",value:"TCP"}),t(w,{label:"UDP",value:"UDP"}),t(w,{label:"HTTP",value:"HTTP"}),t(w,{label:"HTTPS",value:"HTTPS"})]),_:1},8,["modelValue"])]),_:1}),t(c,{label:"指向机器"},{default:o(()=>[t(N,{modelValue:k.value.target_machine_id,"onUpdate:modelValue":e[22]||(e[22]=l=>k.value.target_machine_id=l),clearable:"",style:{width:"100%"},placeholder:"选择目标机器(拓扑连线用)"},{default:o(()=>[(i(!0),d(U,null,P(z.value.filter(l=>l.id!=m(g)),l=>(i(),$(w,{key:l.id,label:l.hostname,value:l.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(c,{label:"指向备注"},{default:o(()=>[t(x,{modelValue:k.value.target_notes,"onUpdate:modelValue":e[23]||(e[23]=l=>k.value.target_notes=l),placeholder:"如:反向代理到目标"},null,8,["modelValue"])]),_:1}),t(c,{label:"备注"},{default:o(()=>[t(x,{modelValue:k.value.notes,"onUpdate:modelValue":e[24]||(e[24]=l=>k.value.notes=l),type:"textarea",rows:2},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"]),t(W,{modelValue:O.value,"onUpdate:modelValue":e[34]||(e[34]=l=>O.value=l),title:"编辑关系",width:"440px",class:"modern-dialog"},{footer:o(()=>[t(v,{onClick:e[33]||(e[33]=l=>O.value=!1)},{default:o(()=>[...e[78]||(e[78]=[p("取消",-1)])]),_:1}),t(v,{type:"primary",onClick:Me},{default:o(()=>[...e[79]||(e[79]=[p("保存",-1)])]),_:1})]),default:o(()=>[t(G,{model:V.value,"label-width":"100px"},{default:o(()=>[t(c,{label:"源机器",required:""},{default:o(()=>[t(N,{modelValue:V.value.source_machine_id,"onUpdate:modelValue":e[27]||(e[27]=l=>V.value.source_machine_id=l),style:{width:"100%"}},{default:o(()=>[(i(!0),d(U,null,P(z.value,l=>(i(),$(w,{key:l.id,label:l.hostname,value:l.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(c,{label:"目标机器",required:""},{default:o(()=>[t(N,{modelValue:V.value.target_machine_id,"onUpdate:modelValue":e[28]||(e[28]=l=>V.value.target_machine_id=l),style:{width:"100%"}},{default:o(()=>[(i(!0),d(U,null,P(z.value,l=>(i(),$(w,{key:l.id,label:l.hostname,value:l.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(c,{label:"关系类型",required:""},{default:o(()=>[t(N,{modelValue:V.value.relation_type,"onUpdate:modelValue":e[29]||(e[29]=l=>V.value.relation_type=l),style:{width:"100%"}},{default:o(()=>[t(w,{label:"端口转发",value:"port_forward"}),t(w,{label:"依赖",value:"dependency"}),t(w,{label:"主从",value:"primary_secondary"}),t(w,{label:"自定义",value:"custom"})]),_:1},8,["modelValue"])]),_:1}),t(c,{label:"源端口"},{default:o(()=>[t(j,{modelValue:V.value.source_port,"onUpdate:modelValue":e[30]||(e[30]=l=>V.value.source_port=l),min:1,max:65535,style:{width:"100%"}},null,8,["modelValue"])]),_:1}),t(c,{label:"目标端口"},{default:o(()=>[t(j,{modelValue:V.value.target_port,"onUpdate:modelValue":e[31]||(e[31]=l=>V.value.target_port=l),min:1,max:65535,style:{width:"100%"}},null,8,["modelValue"])]),_:1}),t(c,{label:"备注"},{default:o(()=>[t(x,{modelValue:V.value.notes,"onUpdate:modelValue":e[32]||(e[32]=l=>V.value.notes=l),type:"textarea",rows:2},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])])):_("",!0)}}},et=nl(Js,[["__scopeId","data-v-8622dedd"]]);export{et as default};
|