You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1 lines
12 KiB

import{g as M,B as P,c as r,p as n,H as V,a as t,l as R,F as H,r as I,t as i,m as z,v as a,s as L,x as b,y as E,z as O,o as u,n as T,d as q}from"./mElhLwm2.js";import{u as G}from"./C6twYRfy.js";import{u as K}from"./FVTAbpot.js";import"./qig5Qp6S.js";const Y={class:"flex items-center justify-between mb-5"},J={class:"bg-white rounded-xl shadow-sm border border-slate-100"},Q={class:"overflow-x-auto"},W={class:"table table-zebra text-sm"},X={key:0},Z={key:1},tt={class:"font-mono"},st={class:"font-medium"},et={class:"font-mono text-xs text-slate-500"},lt={class:"text-xs text-slate-500"},ot={key:0,class:"text-green-600"},nt={key:1,class:"text-slate-400"},at={class:"flex gap-1"},dt=["onClick"],it=["onClick"],rt={class:"flex items-center gap-3 mb-5"},ut={class:"text-lg font-semibold text-slate-800"},pt={class:"bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-3xl"},mt={class:"grid grid-cols-2 gap-4"},bt={class:"form-control"},ft={class:"form-control"},ct={class:"grid grid-cols-3 gap-4"},xt={class:"form-control col-span-2"},vt={class:"form-control"},gt={class:"form-control mt-4"},yt={class:"form-control mt-4"},_t={class:"grid grid-cols-2 gap-4"},kt={class:"form-control"},wt={class:"form-control"},ht={class:"form-control"},St={class:"form-control"},Vt={class:"grid grid-cols-2 gap-4"},Ut={class:"form-control"},Ct={class:"form-control"},Ht={class:"grid grid-cols-2 gap-4 mt-4"},It={class:"form-control"},Et={class:"form-control"},Tt={class:"form-control mt-4"},Dt={class:"flex items-center gap-2 mt-4"},Nt={class:"flex items-center gap-2 cursor-pointer"},$t={class:"mt-4 text-sm space-y-0.5"},jt={class:"flex gap-3 mt-6"},At=["disabled"],Bt=["disabled"],Lt=M({__name:"environments",setup(Ft){const{consoleApi:c}=G(),{success:_,error:m}=K(),x=b("list"),v=b([]),k=b(!1),g=b(!1),f=b(!1),y=b(!1),d=E({show:!1,ok:!1,ssh_ok:!1,ssh_msg:"",etcd_ok:!1,etcd_msg:"",redis_ok:!1,redis_msg:"",nats_ok:!1,nats_msg:""}),D=O(()=>[{key:"ssh",label:"SSH 部署机",ok:d.ssh_ok,msg:d.ssh_msg},{key:"etcd",label:"ETCD",ok:d.etcd_ok,msg:d.etcd_msg},{key:"redis",label:"Redis",ok:d.redis_ok,msg:d.redis_msg},{key:"nats",label:"NATS",ok:d.nats_ok,msg:d.nats_msg}]);function w(){return{id:0,name:"",code:"",remark:"",enabled:!0,ssh_host:"",ssh_port:22,ssh_user:"root",ssh_private_key:"",registry:"",registry_user:"",registry_pass:"",docker_network:"1panel-network",etcd_servers:"",redis_addr:"",redis_pwd:"",nats_url:""}}const l=E(w());function U(o){Object.assign(l,w(),o)}function N(o){return o.ssh_host?`${o.ssh_user||"root"}@${o.ssh_host}:${o.ssh_port||22}`:"-"}function $(o){return o.registry||"-"}async function h(){k.value=!0;try{const o=await c("envs/list",{});v.value=o??[]}catch(o){m(o?.message??"获取环境列表失败"),v.value=[]}finally{k.value=!1}}function p(){f.value=!1,d.show=!1}function S(){x.value="list",h()}function C(o){o?(g.value=!0,U(o)):(g.value=!1,U(w())),p(),x.value="form"}async function j(){if(!l.ssh_host.trim()){m("请先填 SSH 主机");return}y.value=!0;try{const o=await c("envs/test",{...l});Object.assign(d,o,{show:!0}),f.value=!!o.ok,f.value?_("SSH 握手成功,可以保存"):m("SSH 未通过,请检查主机/私钥/用户")}catch(o){m(o?.message??"测试失败")}finally{y.value=!1}}async function A(){if(!f.value){m("请先「测试连接」通过再保存");return}const o={...l};let s="envs/add";g.value&&l.id?(o.id=Number(l.id),s="envs/update"):delete o.id;try{await c(s,o),_("保存成功"),S()}catch(e){m(e?.message??"失败")}}function B(o){window.confirm(`删除环境 #${o} ?(该环境下若有应用关联将被拒绝)`)&&c("envs/del",{id:o}).then(()=>{_("已删除"),h()}).catch(s=>m(s?.message??"失败"))}return P(h),(o,s)=>(u(),r("div",null,[n(t("div",null,[t("div",Y,[s[19]||(s[19]=t("div",null,[t("h2",{class:"text-lg font-semibold text-slate-800"},"环境节点(部署服务器)"),t("p",{class:"text-sm text-slate-400 mt-1"},"部署服务器节点(如 上海 / 日本 / 新加坡):远端 IP、SSH 登录账号与私钥、私有镜像仓库、区域共享基础设施。应用管理里「部署到目标环境」从这里选择、两边对应;下一期即可从页面直接更新服务/部署应用。密钥加密存储,不回显明文。")],-1)),t("button",{class:"btn btn-primary btn-sm text-white",onClick:s[0]||(s[0]=e=>C())},"+ 新增节点")]),t("div",J,[t("div",Q,[t("table",W,[s[22]||(s[22]=t("thead",null,[t("tr",null,[t("th",null,"ID"),t("th",null,"名称"),t("th",null,"区域码"),t("th",null,"SSH 目标"),t("th",null,"镜像仓库"),t("th",null,"启用"),t("th",null,"操作")])],-1)),t("tbody",null,[k.value?(u(),r("tr",X,[...s[20]||(s[20]=[t("td",{colspan:"7",class:"text-center py-8"},[t("span",{class:"loading loading-spinner loading-sm"})],-1)])])):v.value.length?R("",!0):(u(),r("tr",Z,[...s[21]||(s[21]=[t("td",{colspan:"7",class:"text-center text-slate-400 py-8"},"暂无环境",-1)])])),(u(!0),r(H,null,I(v.value,e=>(u(),r("tr",{key:e.id},[t("td",tt,i(e.id),1),t("td",st,i(e.name||""),1),t("td",null,i(e.code||""),1),t("td",et,i(N(e)),1),t("td",lt,i($(e)),1),t("td",null,[e.enabled?(u(),r("span",ot,"是")):(u(),r("span",nt,"否"))]),t("td",null,[t("div",at,[t("button",{class:"btn btn-ghost btn-xs",onClick:F=>C(e)},"编辑",8,dt),t("button",{class:"btn btn-ghost btn-xs text-red-500",onClick:F=>B(e.id)},"删除",8,it)])])]))),128))])])])])],512),[[V,x.value==="list"]]),n(t("div",null,[t("div",rt,[t("button",{class:"btn btn-ghost btn-sm",onClick:s[1]||(s[1]=e=>S())},"← 返回"),t("h2",ut,i(g.value?"编辑节点":"新增节点"),1)]),t("div",pt,[t("form",{onSubmit:z(A,["prevent"])},[t("div",mt,[t("div",bt,[s[23]||(s[23]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"名称 *")],-1)),n(t("input",{"onUpdate:modelValue":s[2]||(s[2]=e=>l.name=e),type:"text",class:"input input-bordered w-full",required:"",placeholder:"如 上海生产"},null,512),[[a,l.name]])]),t("div",ft,[s[24]||(s[24]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"区域码")],-1)),n(t("input",{"onUpdate:modelValue":s[3]||(s[3]=e=>l.code=e),type:"text",class:"input input-bordered w-full",list:"env-code-list",placeholder:"shanghai / japan / singapore"},null,512),[[a,l.code]]),s[25]||(s[25]=t("datalist",{id:"env-code-list"},[t("option",{value:"shanghai"}),t("option",{value:"japan"}),t("option",{value:"singapore"})],-1))])]),s[41]||(s[41]=t("div",{class:"divider text-xs text-slate-400 mt-6"},"SSH 部署目标",-1)),t("div",ct,[t("div",xt,[s[26]||(s[26]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"SSH 主机")],-1)),n(t("input",{"onUpdate:modelValue":s[4]||(s[4]=e=>l.ssh_host=e),type:"text",class:"input input-bordered w-full",placeholder:"139.224.212.237",onInput:p},null,544),[[a,l.ssh_host]])]),t("div",vt,[s[27]||(s[27]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"端口")],-1)),n(t("input",{"onUpdate:modelValue":s[5]||(s[5]=e=>l.ssh_port=e),type:"number",class:"input input-bordered w-full",placeholder:"22",onInput:p},null,544),[[a,l.ssh_port,void 0,{number:!0}]])])]),t("div",gt,[s[28]||(s[28]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"SSH 用户")],-1)),n(t("input",{"onUpdate:modelValue":s[6]||(s[6]=e=>l.ssh_user=e),type:"text",class:"input input-bordered w-full",placeholder:"root",onInput:p},null,544),[[a,l.ssh_user]])]),t("div",yt,[s[29]||(s[29]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"SSH 私钥 (PEM)")],-1)),n(t("textarea",{"onUpdate:modelValue":s[7]||(s[7]=e=>l.ssh_private_key=e),class:"textarea textarea-bordered w-full font-mono text-xs h-28",placeholder:"-----BEGIN OPENSSH PRIVATE KEY-----",onInput:p},null,544),[[a,l.ssh_private_key]]),s[30]||(s[30]=t("span",{class:"text-xs text-slate-400 mt-1"},"加密存储;编辑时显示 [encrypted] 表示不改,如需更换直接粘贴新私钥。",-1))]),s[42]||(s[42]=t("div",{class:"divider text-xs text-slate-400 mt-6"},"私有镜像仓库 + Docker 网络",-1)),t("div",_t,[t("div",kt,[s[31]||(s[31]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"仓库地址")],-1)),n(t("input",{"onUpdate:modelValue":s[8]||(s[8]=e=>l.registry=e),type:"text",class:"input input-bordered w-full",placeholder:"docker-registry.ideapsound.com"},null,512),[[a,l.registry]])]),t("div",wt,[s[32]||(s[32]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"Docker 网络")],-1)),n(t("input",{"onUpdate:modelValue":s[9]||(s[9]=e=>l.docker_network=e),type:"text",class:"input input-bordered w-full",placeholder:"1panel-network"},null,512),[[a,l.docker_network]])]),t("div",ht,[s[33]||(s[33]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"仓库账号")],-1)),n(t("input",{"onUpdate:modelValue":s[10]||(s[10]=e=>l.registry_user=e),type:"text",class:"input input-bordered w-full",autocomplete:"off"},null,512),[[a,l.registry_user]])]),t("div",St,[s[34]||(s[34]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"仓库密码")],-1)),n(t("input",{"onUpdate:modelValue":s[11]||(s[11]=e=>l.registry_pass=e),type:"password",class:"input input-bordered w-full",autocomplete:"new-password",placeholder:"[encrypted]"},null,512),[[a,l.registry_pass]])])]),s[43]||(s[43]=t("div",{class:"divider text-xs text-slate-400 mt-6"},"节点共享集群服务",-1)),s[44]||(s[44]=t("p",{class:"text-xs text-slate-400 -mt-2 mb-2"},"该服务器上各应用共用的地址。各应用自己的部署目录、业务库 DSN、镜像、redis 库号等,在「应用管理 → 部署到目标环境」里按应用填。",-1)),t("div",Vt,[t("div",Ut,[s[35]||(s[35]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"ETCD")],-1)),n(t("input",{"onUpdate:modelValue":s[12]||(s[12]=e=>l.etcd_servers=e),type:"text",class:"input input-bordered w-full font-mono text-xs",placeholder:"etcd:2379",onInput:p},null,544),[[a,l.etcd_servers]])]),t("div",Ct,[s[36]||(s[36]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"NATS")],-1)),n(t("input",{"onUpdate:modelValue":s[13]||(s[13]=e=>l.nats_url=e),type:"text",class:"input input-bordered w-full font-mono text-xs",placeholder:"nats://nats:4222",onInput:p},null,544),[[a,l.nats_url]])])]),t("div",Ht,[t("div",It,[s[37]||(s[37]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"Redis 地址")],-1)),n(t("input",{"onUpdate:modelValue":s[14]||(s[14]=e=>l.redis_addr=e),type:"text",class:"input input-bordered w-full font-mono text-xs",placeholder:"redis:6379",onInput:p},null,544),[[a,l.redis_addr]])]),t("div",Et,[s[38]||(s[38]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"Redis 密码")],-1)),n(t("input",{"onUpdate:modelValue":s[15]||(s[15]=e=>l.redis_pwd=e),type:"password",class:"input input-bordered w-full",autocomplete:"new-password",placeholder:"[encrypted]"},null,512),[[a,l.redis_pwd]])])]),t("div",Tt,[s[39]||(s[39]=t("label",{class:"label"},[t("span",{class:"label-text font-medium"},"备注")],-1)),n(t("input",{"onUpdate:modelValue":s[16]||(s[16]=e=>l.remark=e),type:"text",class:"input input-bordered w-full"},null,512),[[a,l.remark]])]),t("div",Dt,[t("label",Nt,[n(t("input",{"onUpdate:modelValue":s[17]||(s[17]=e=>l.enabled=e),type:"checkbox",class:"toggle toggle-primary toggle-sm"},null,512),[[L,l.enabled]]),s[40]||(s[40]=t("span",{class:"text-sm"},"启用",-1))])]),n(t("div",$t,[(u(!0),r(H,null,I(D.value,e=>(u(),r("div",{key:e.key,class:T(e.ok?"text-green-700":"text-red-600")},[t("span",{class:T(e.ok?"text-green-600":"text-red-500")},i(e.ok?"✓":"✗"),3),q(" "+i(e.label)+":"+i(e.msg),1)],2))),128))],512),[[V,d.show]]),t("div",jt,[t("button",{type:"button",class:"btn btn-ghost",onClick:s[18]||(s[18]=e=>S())},"取消"),t("button",{type:"button",class:"btn btn-outline",disabled:y.value,onClick:j},i(y.value?"测试中...":"测试连接"),9,At),t("button",{type:"submit",class:"btn btn-primary text-white",disabled:!f.value},"保存",8,Bt)]),s[45]||(s[45]=t("p",{class:"text-xs text-slate-400 mt-2"},"需先「测试连接」(SSH 握手成功即可保存;基础设施逐项仅作提示)。",-1))],32)])],512),[[V,x.value==="form"]])]))}});export{Lt as default};