Files
lan-manager/web/dist/assets/MachineDetail-Du94nURq.js
openclaw 0a5f6a8047 Initial commit: Lan-manager project code
- Go backend (server/)
- Frontend (web/, server/static/)
- Database and deployment files
- Scripts and docs

Co-Authored-By: 狸花猫/Claude-Qwen3.6-Plus 🐾
2026-04-20 00:52:58 +08:00

2 lines
22 KiB
JavaScript

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