- services/pve.go: 修复 &h.PasswordEnch.Username -> &h.NodeName
- MachineDetail.vue: 编辑弹窗添加PVE主机选择+VMID输入
- 删除macOS自动生成的冲突副本文件
- 重新构建前端dist
[金渐层/K2.6-code-preview🐾]
2 lines
11 KiB
JavaScript
2 lines
11 KiB
JavaScript
import{k as oe,I as ae,J as ne,K as ie,L as de,o as u,c as r,a as o,b as s,w as i,e as f,m as b,M as ue,n as p,N as $,O as F,r as V,d as m,G as re,P as pe,E as k,u as ce,Q as _e,R as me,h as y,p as U,t as c,S as R,T as ve,U as fe,V as ye}from"./index-lpjSKhQ-.js";import{_ as he}from"./_plugin-vue_export-helper-DlAUqK2U.js";const be={class:"page"},Ve={class:"toolbar"},we={class:"search-wrap"},ke={class:"cards-grid"},ge=["onClick"],Ce={class:"card-header"},xe={class:"title-row"},Me=["title"],Se={class:"hostname"},Ue={class:"meta-row"},De={key:0,class:"meta-ip"},Le={class:"meta-item"},Oe={key:1,class:"meta-item"},Ee={key:2,class:"meta-uptime"},Ie={key:3,class:"meta-pve"},$e={key:0,class:"stats-row"},Fe={key:0,class:"stat-pill"},Re={class:"pill-body"},Be={class:"pill-bar"},Ne={class:"pill-value"},Pe={key:1,class:"stat-pill"},Ae={class:"pill-body"},He={class:"pill-bar"},Te={class:"pill-value"},We={key:2,class:"stat-pill"},je={class:"pill-body"},ze={class:"pill-bar"},Ge={class:"pill-value"},Ke={key:1,class:"ports-row"},qe={key:0,class:"more-ports"},Je={key:2,class:"sync-time"},Qe={__name:"MachineList",setup(Ye){const T=ce(),h=re().is_admin,D=V([]),B=V([]),L=V(""),O=V(""),g=V(!1),d=V({hostname:"",ip:"",mac:"",os_type:"Linux",os_version:"",notes:"",ssh_port:22,ssh_username:"",ssh_password:"",pve_host_id:null,pve_vmid:""}),N=V(null);let E=null;oe(async()=>{if(await C(),await ae(),h)try{const e=await _e();B.value=e.data}catch{}const t=ne||1e4;t>0&&(E=setInterval(C,t))}),ie(()=>{E&&clearInterval(E)});async function C(){const t=await de({search:L.value,os_type:O.value});D.value=t.data}function W(t){T.push(`/machines/${t}`)}function j(t){d.value={hostname:"",ip:"",mac:"",os_type:"Linux",os_version:"",notes:"",ssh_port:22,ssh_username:"",ssh_password:"",pve_host_id:null,pve_vmid:""},g.value=!0}async function z(){const t={...d.value};if(!t.hostname||!t.ip||!t.os_type){k.warning("请填写必填项");return}t.id?await ve(t.id,t):await fe(t),k.success("保存成功"),g.value=!1,C()}async function G(){try{const t=await ye(),e=new Blob([t.data]),a=window.URL.createObjectURL(e),n=document.createElement("a");n.href=a,n.download=`lan-manager-backup-${new Date().toISOString().slice(0,10)}.json`,document.body.appendChild(n),n.click(),document.body.removeChild(n),window.URL.revokeObjectURL(a),k.success("导出成功")}catch{k.error("导出失败")}}function K(){var t;(t=N.value)==null||t.click()}async function q(t){var n;const e=(n=t.target.files)==null?void 0:n[0];if(!e)return;const a=new FormData;a.append("file",e),a.append("mode","overwrite");try{await pe(a),k.success("导入成功,页面即将刷新"),setTimeout(()=>location.reload(),800)}catch{k.error("导入失败")}t.target.value=""}function x(t){if(!t)return 0;const e=t.match(/\((\d+)%\)/)||t.match(/(\d+(?:\.\d+)?)%/);if(e){const a=parseFloat(e[1]);return isNaN(a)?0:Math.min(100,Math.max(0,Math.round(a)))}return 0}function P(t){if(!t)return"";const e=t.match(/\((\d+)\s*cores\)/);if(e)return e[1]+" cores";let a=t.replace(/\s*\(\d+(?:\.\d+)?%\)\s*/g,"").trim();return a.includes(",")&&(a=a.split(",")[0].trim()),a=a.replace(/^\/\s+/,"").trim(),/^\d+\.?\d*\/\d+\.?\d*$/.test(a)&&(a+="G"),a}function J(t){return t>=90?"#f87171":t>=70?"#fbbf24":"#34d399"}function Q(t){return t>=90?"#f87171":t>=80?"#fbbf24":"#60a5fa"}function Y(t){if(!t)return[];const e=[],a=/(\S+)\s+([\d\.]+[KMGT]?\/[\d\.]+[KMGT]?)\s+\((\d+)%\)/g;let n;for(;(n=a.exec(t))!==null;)e.push({mount:n[1],detail:n[2],percent:parseInt(n[3],10)});if(e.length>0)return e;const _=x(t),w=P(t);return w?[{mount:"",detail:w,percent:_}]:[]}function S(t){return Y(t).find(n=>n.mount==="/")||null}function X(t){return{Linux:"os-linux",Windows:"os-windows",macOS:"os-macos"}[t]||"os-other"}function Z(t){if(!t)return"-";const e=new Date(t);if(isNaN(e.getTime()))return t;const a=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${a(e.getMonth()+1)}-${a(e.getDate())} ${a(e.getHours())}:${a(e.getMinutes())}:${a(e.getSeconds())}`}return(t,e)=>{const a=m("el-icon"),n=m("el-input"),_=m("el-option"),w=m("el-select"),M=m("el-button"),A=m("el-tag"),ee=m("el-empty"),v=m("el-form-item"),H=m("el-divider"),le=m("el-input-number"),te=m("el-form"),se=m("el-dialog");return u(),r("div",be,[o("div",Ve,[o("div",we,[s(a,{class:"search-icon"},{default:i(()=>[s(f(me))]),_:1}),s(n,{modelValue:L.value,"onUpdate:modelValue":e[0]||(e[0]=l=>L.value=l),placeholder:"搜索主机名",clearable:"",onChange:C},null,8,["modelValue"])]),s(w,{modelValue:O.value,"onUpdate:modelValue":e[1]||(e[1]=l=>O.value=l),placeholder:"系统类型",clearable:"",onChange:C,class:"os-select"},{default:i(()=>[s(_,{label:"Linux",value:"Linux"}),s(_,{label:"Windows",value:"Windows"}),s(_,{label:"macOS",value:"macOS"}),s(_,{label:"Other",value:"Other"})]),_:1},8,["modelValue"]),f(h)?(u(),b(M,{key:0,type:"primary",icon:f(ue),onClick:e[2]||(e[2]=l=>j())},{default:i(()=>[...e[16]||(e[16]=[y("添加机器",-1)])]),_:1},8,["icon"])):p("",!0),f(h)?(u(),b(M,{key:1,type:"success",onClick:G},{default:i(()=>[...e[17]||(e[17]=[y("导出数据",-1)])]),_:1})):p("",!0),f(h)?(u(),b(M,{key:2,type:"warning",onClick:K},{default:i(()=>[...e[18]||(e[18]=[y("导入数据",-1)])]),_:1})):p("",!0),o("input",{ref_key:"importFileRef",ref:N,type:"file",accept:".json",style:{display:"none"},onChange:q},null,544)]),o("div",ke,[(u(!0),r($,null,F(D.value,l=>(u(),r("div",{key:l.id,class:U(["server-card",[{"guest-card":!f(h),"offline-card":!l.is_online}]]),onClick:I=>f(h)&&W(l.id)},[o("div",Ce,[o("div",xe,[o("span",{class:U(["os-dot",X(l.os_type)]),title:l.os_type},null,10,Me),o("span",Se,c(l.hostname),1),o("span",{class:U(["status-badge",l.is_online?"online":"offline"])},c(l.is_online?"在线":"离线"),3),l.service_count?(u(),b(A,{key:0,size:"small",effect:"plain",class:"svc-tag",round:""},{default:i(()=>[y("服务 "+c(l.service_count),1)]),_:2},1024)):p("",!0)]),o("div",Ue,[f(h)?(u(),r("span",De,c(l.ip),1)):p("",!0),o("span",Le,c(l.os_type),1),l.os_version?(u(),r("span",Oe,c(l.os_version),1)):p("",!0),l.uptime?(u(),r("span",Ee,c(l.uptime),1)):p("",!0),f(h)&&l.pve_host_id&&l.pve_vmid?(u(),r("span",Ie,[o("span",{class:U(["vm-status",l.pve_vm_status])},c(l.pve_vm_status==="running"?"🟢 VM运行中":"🔴 VM已停止"),3)])):p("",!0)])]),l.cpu_info||l.memory_info||l.disk_info?(u(),r("div",$e,[l.cpu_info?(u(),r("div",Fe,[e[20]||(e[20]=o("div",{class:"pill-icon cpu"},"C",-1)),o("div",Re,[e[19]||(e[19]=o("div",{class:"pill-label"},"CPU",-1)),o("div",Be,[o("div",{class:"pill-fill",style:R({width:x(l.cpu_info)+"%"})},null,4)])]),o("div",Ne,c(x(l.cpu_info))+"%",1)])):p("",!0),l.memory_info?(u(),r("div",Pe,[e[22]||(e[22]=o("div",{class:"pill-icon mem"},"M",-1)),o("div",Ae,[e[21]||(e[21]=o("div",{class:"pill-label"},"RAM",-1)),o("div",He,[o("div",{class:"pill-fill",style:R({width:x(l.memory_info)+"%",background:J(x(l.memory_info))})},null,4)])]),o("div",Te,c(P(l.memory_info)),1)])):p("",!0),S(l.disk_info)?(u(),r("div",We,[e[24]||(e[24]=o("div",{class:"pill-icon disk"},"D",-1)),o("div",je,[e[23]||(e[23]=o("div",{class:"pill-label"},"DISK",-1)),o("div",ze,[o("div",{class:"pill-fill",style:R({width:S(l.disk_info).percent+"%",background:Q(S(l.disk_info).percent)})},null,4)])]),o("div",Ge,c(S(l.disk_info).detail),1)])):p("",!0)])):p("",!0),l.listen_ports?(u(),r("div",Ke,[(u(!0),r($,null,F(l.listen_ports.split(",").slice(0,6),I=>(u(),b(A,{key:I,size:"small",effect:"plain",round:"",class:"port-tag"},{default:i(()=>[y(c(I.trim()),1)]),_:2},1024))),128)),l.listen_ports.split(",").length>6?(u(),r("span",qe,"+"+c(l.listen_ports.split(",").length-6),1)):p("",!0)])):p("",!0),l.ssh_synced_at?(u(),r("div",Je," 同步于 "+c(Z(l.ssh_synced_at)),1)):p("",!0)],10,ge))),128))]),D.value.length?p("",!0):(u(),b(ee,{key:0,description:"暂无机器"})),s(se,{modelValue:g.value,"onUpdate:modelValue":e[15]||(e[15]=l=>g.value=l),title:d.value.id?"编辑机器":"添加机器",width:"480px",class:"modern-dialog","destroy-on-close":""},{footer:i(()=>[s(M,{onClick:e[14]||(e[14]=l=>g.value=!1)},{default:i(()=>[...e[27]||(e[27]=[y("取消",-1)])]),_:1}),s(M,{type:"primary",onClick:z},{default:i(()=>[...e[28]||(e[28]=[y("保存",-1)])]),_:1})]),default:i(()=>[s(te,{model:d.value,"label-width":"90px"},{default:i(()=>[s(v,{label:"主机名",required:""},{default:i(()=>[s(n,{modelValue:d.value.hostname,"onUpdate:modelValue":e[3]||(e[3]=l=>d.value.hostname=l),placeholder:"如 web-server-01"},null,8,["modelValue"])]),_:1}),s(v,{label:"IP",required:""},{default:i(()=>[s(n,{modelValue:d.value.ip,"onUpdate:modelValue":e[4]||(e[4]=l=>d.value.ip=l),placeholder:"192.168.1.100"},null,8,["modelValue"])]),_:1}),s(v,{label:"MAC"},{default:i(()=>[s(n,{modelValue:d.value.mac,"onUpdate:modelValue":e[5]||(e[5]=l=>d.value.mac=l),placeholder:"AA:BB:CC:DD:EE:FF"},null,8,["modelValue"])]),_:1}),s(v,{label:"系统",required:""},{default:i(()=>[s(w,{modelValue:d.value.os_type,"onUpdate:modelValue":e[6]||(e[6]=l=>d.value.os_type=l),style:{width:"100%"}},{default:i(()=>[s(_,{label:"Linux",value:"Linux"}),s(_,{label:"Windows",value:"Windows"}),s(_,{label:"macOS",value:"macOS"}),s(_,{label:"Other",value:"Other"})]),_:1},8,["modelValue"])]),_:1}),s(v,{label:"系统版本"},{default:i(()=>[s(n,{modelValue:d.value.os_version,"onUpdate:modelValue":e[7]||(e[7]=l=>d.value.os_version=l),placeholder:"Ubuntu 22.04"},null,8,["modelValue"])]),_:1}),s(H,{"content-position":"left"},{default:i(()=>[...e[25]||(e[25]=[y("SSH 配置",-1)])]),_:1}),s(v,{label:"SSH 端口"},{default:i(()=>[s(le,{modelValue:d.value.ssh_port,"onUpdate:modelValue":e[8]||(e[8]=l=>d.value.ssh_port=l),min:1,max:65535,style:{width:"100%"}},null,8,["modelValue"])]),_:1}),s(v,{label:"SSH 用户"},{default:i(()=>[s(n,{modelValue:d.value.ssh_username,"onUpdate:modelValue":e[9]||(e[9]=l=>d.value.ssh_username=l),placeholder:"root"},null,8,["modelValue"])]),_:1}),s(v,{label:"SSH 密码"},{default:i(()=>[s(n,{modelValue:d.value.ssh_password,"onUpdate:modelValue":e[10]||(e[10]=l=>d.value.ssh_password=l),type:"password","show-password":"",placeholder:"输入则更新密码,留空保持不变"},null,8,["modelValue"])]),_:1}),s(v,{label:"备注"},{default:i(()=>[s(n,{modelValue:d.value.notes,"onUpdate:modelValue":e[11]||(e[11]=l=>d.value.notes=l),type:"textarea",rows:3,placeholder:"记录用途、负责人等信息"},null,8,["modelValue"])]),_:1}),s(H,{"content-position":"left"},{default:i(()=>[...e[26]||(e[26]=[y("PVE 配置(可选)",-1)])]),_:1}),s(v,{label:"PVE 主机"},{default:i(()=>[s(w,{modelValue:d.value.pve_host_id,"onUpdate:modelValue":e[12]||(e[12]=l=>d.value.pve_host_id=l),placeholder:"选择 PVE 主机",clearable:"",style:{width:"100%"}},{default:i(()=>[(u(!0),r($,null,F(B.value,l=>(u(),b(_,{key:l.id,label:l.name,value:l.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),s(v,{label:"虚拟机 ID"},{default:i(()=>[s(n,{modelValue:d.value.pve_vmid,"onUpdate:modelValue":e[13]||(e[13]=l=>d.value.pve_vmid=l),placeholder:"如 101"},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"])])}}},el=he(Qe,[["__scopeId","data-v-cae8dc77"]]);export{el as default};
|