import{g as W,y as X,z as Y,j as Z,c as a,a as s,t as d,l as c,d as f,k as V,p as T,F as h,r as U,A as k,x as A,s as v,o as l,n as ee,m as $,B as te,_ as se}from"./CfpW9SkI.js";import{u as ae}from"./DSu8q42f.js";import{u as le}from"./CMwGY1Mu.js";import"./DL330dAC.js";const oe={class:"rounded-xl px-5 py-4 mb-5",style:{background:"linear-gradient(135deg,#eef2ff,#faf5ff)",border:"1px solid #e0e7ff"}},ne={class:"flex items-center gap-4"},de={class:"app-avatar"},ie={class:"flex-1 min-w-0"},ue={class:"flex items-center gap-2 flex-wrap"},ce={class:"text-base font-bold text-slate-800"},re={class:"badge badge-sm",style:{background:"#e0e7ff",color:"#4338ca",border:"none"}},pe={key:0,class:"badge badge-ghost badge-sm"},me={key:1,class:"badge badge-ghost badge-sm"},ve={key:2,class:"badge badge-warning badge-sm text-amber-900"},_e={key:3,class:"badge badge-success badge-sm text-white"},xe={class:"text-[11px] text-slate-500 mt-1 flex flex-wrap gap-x-4 gap-y-0.5"},ge={key:0},ye={class:"font-mono"},be={class:"font-mono"},fe={class:"flex items-center gap-2 mt-3 pt-3 border-t border-indigo-100"},he=["disabled"],ke=["value"],we={key:0,class:"loading loading-spinner loading-xs text-indigo-400"},Ce={class:"bg-white rounded-2xl border border-slate-100 shadow-sm p-5"},Ve={key:0,class:"alert alert-warning py-2 text-sm mb-3"},Ue={key:1,class:"py-12 text-center"},Me={key:2,class:"flex gap-5"},Be={class:"w-48 shrink-0"},Ne={class:"text-[11px] font-semibold text-slate-400 px-2 mb-1"},Ae=["onClick"],De={key:0,class:"w-1.5 h-1.5 rounded-full bg-emerald-400 inline-block"},Ie={class:"flex-1 min-w-0"},Se={class:"flex items-center justify-between mb-3"},je={class:"text-sm font-semibold text-slate-800"},qe={key:0,class:"text-[11px] text-slate-400 mt-0.5"},Ee={class:"flex items-center gap-2"},Te=["disabled"],$e=["disabled"],ze={class:"grid grid-cols-1 gap-3 max-w-2xl"},Fe={class:"label py-0.5"},Re={class:"label-text text-sm"},Le={key:0,class:"text-rose-400"},Oe={key:1,class:"lock-tag ml-1"},Pe={class:"text-[10px] font-normal text-slate-300 ml-1 font-mono"},Ge={key:0,class:"cursor-pointer flex items-center gap-2"},He=["checked","onChange"],Je={class:"text-xs text-slate-500"},Ke=["onUpdate:modelValue"],Qe=["value"],We=["onUpdate:modelValue","placeholder"],Xe={key:3,class:"relative"},Ye=["onUpdate:modelValue","type"],Ze=["onClick"],et=["onUpdate:modelValue","placeholder"],tt={key:5,class:"text-[11px] text-slate-400 mt-0.5"},st={key:1,class:"py-10 text-center text-slate-400 text-sm"},at=W({__name:"appconfig",setup(lt){const{consoleApi:_}=ae(),{success:D,error:w}=le(),j=X(),z=Y(),y=k(()=>Number(j.query.id)||0),q=k(()=>j.query.name||"未指定应用"),F=k(()=>(i.app_name||q.value||"A").charAt(0).toUpperCase()),i=A({id:0,app_name:"",status:"",name:"",region:"",env_id:0,base_url:"",service_dsn:""}),E=v([]),b=v(0),M=v(!1),x=v([]),u=v(""),r=A({}),B=A(new Set),N=A({}),I=v(!1),g=v(!1),C=v(""),m=k(()=>x.value.find(o=>o.module===u.value)||null),p=k(()=>r[u.value]||{}),R=k(()=>{const o=[],t=new Map;for(const e of x.value)t.has(e.group)||(t.set(e.group,[]),o.push(e.group)),t.get(e.group).push(e);return o.map(e=>({name:e,modules:t.get(e)}))});function L(o,t){const e=r[u.value]||(r[u.value]={});e[o]=t.target.checked?"true":"false"}function O(){z.push("/apps")}function P(o){const t=(o||"").match(/\/([^/?]+)\?/);return t?t[1]:o?"(自定义)":"—"}async function G(){try{const[o,t]=await Promise.all([_("apps/list",{}),_("envs/list",{})]),e=(o??[]).find(n=>n.id===y.value);e&&Object.assign(i,e),E.value=t??[],b.value=i.env_id||0}catch(o){w(o?.message??"获取应用信息失败")}}async function H(){try{const o=await _("modulecfg/catalog",{});x.value=o?.modules??[];for(const t of x.value)r[t.module]||(r[t.module]={});x.value.length&&!u.value&&(u.value=x.value[0].module)}catch(o){w(o?.message??"获取配置目录失败")}}async function S(){if(y.value){I.value=!0,C.value="";try{const o=await _("modulecfg/list",{app_id:y.value});for(const t of x.value)r[t.module]={};B.clear();for(const t of o?.items??[])r[t.module]||(r[t.module]={}),r[t.module][t.key]=t.value,B.add(t.module)}catch(o){C.value=o?.message??"连接失败"}finally{I.value=!1}}}async function J(){if(i.id){M.value=!0;try{await _("apps/bindenv",{id:i.id,env_id:b.value}),i.env_id=b.value,D("部署环境已更新")}catch(o){w(o?.message??"切换环境失败"),b.value=i.env_id||0}finally{M.value=!1}}}async function K(){if(m.value){g.value=!0;try{const o=m.value.fields.map(t=>({key:t.key,value:r[u.value]?.[t.key]??""}));await _("modulecfg/save",{app_id:y.value,module:u.value,items:o}),D("配置已保存"),await S()}catch(o){w(o?.message??"保存失败")}finally{g.value=!1}}}async function Q(){if(u.value&&confirm(`确认清空「${m.value?.name}」的全部配置?`)){g.value=!0;try{await _("modulecfg/del",{app_id:y.value,module:u.value}),D("已清空"),await S()}catch(o){w(o?.message??"清空失败")}finally{g.value=!1}}}return Z(async()=>{await G(),await H(),await S()}),(o,t)=>(l(),a("div",null,[s("div",{class:"flex items-center gap-2 mb-4"},[s("button",{class:"btn btn-ghost btn-sm",onClick:O},"← 返回应用列表"),t[1]||(t[1]=s("span",{class:"text-slate-300"},"/",-1)),t[2]||(t[2]=s("h2",{class:"text-lg font-semibold text-slate-800"},"应用服务配置",-1))]),s("div",oe,[s("div",ne,[s("div",de,d(F.value),1),s("div",ie,[s("div",ue,[s("span",ce,d(i.name||q.value),1),s("span",re,"#"+d(y.value),1),i.app_name?(l(),a("span",pe,"应用:"+d(i.app_name),1)):c("",!0),i.region?(l(),a("span",me,d(i.region),1)):c("",!0),i.status==="pending"?(l(),a("span",ve,"待部署")):(l(),a("span",_e,"已接入"))]),s("div",xe,[i.base_url?(l(),a("span",ge,[t[3]||(t[3]=f("地址:",-1)),s("span",ye,d(i.base_url),1)])):c("",!0),s("span",null,[t[4]||(t[4]=f("业务库:",-1)),s("span",be,d(P(i.service_dsn)),1)])])])]),s("div",fe,[t[6]||(t[6]=s("span",{class:"text-xs text-slate-500 shrink-0"},"部署环境",-1)),V(s("select",{"onUpdate:modelValue":t[0]||(t[0]=e=>b.value=e),class:"select select-bordered select-sm w-64",disabled:M.value,onChange:J},[t[5]||(t[5]=s("option",{value:0},"未绑定",-1)),(l(!0),a(h,null,U(E.value,e=>(l(),a("option",{key:e.id,value:e.id},d(e.name)+"("+d(e.code||"-")+")",9,ke))),128))],40,he),[[T,b.value,void 0,{number:!0}]]),M.value?(l(),a("span",we)):c("",!0),t[7]||(t[7]=s("span",{class:"text-[11px] text-slate-400"},"切换后即时保存。",-1))])]),s("div",Ce,[t[12]||(t[12]=s("div",{class:"mb-3"},[s("h3",{class:"text-base font-semibold text-slate-800"},"业务功能配置"),s("p",{class:"text-[11px] text-slate-400 mt-0.5"},[f(" 登录 / 短信 / 邮件 / 支付等应用独立配置,保存在"),s("b",null,"该部署的业务库"),f("(不进公共库)。密钥字段加密落库,显示时脱敏。 ")])],-1)),C.value?(l(),a("div",Ve,[s("span",null,[f("无法连接应用业务库:"+d(C.value),1),t[8]||(t[8]=s("br",null,null,-1)),t[9]||(t[9]=s("span",{class:"text-xs opacity-70"},"待部署的应用先完成部署、或检查业务库 DSN 连通后再配置。",-1))])])):c("",!0),I.value?(l(),a("div",Ue,[...t[10]||(t[10]=[s("span",{class:"loading loading-spinner loading-sm"},null,-1)])])):(l(),a("div",Me,[s("aside",Be,[(l(!0),a(h,null,U(R.value,e=>(l(),a("div",{key:e.name,class:"mb-3"},[s("div",Ne,d(e.name),1),(l(!0),a(h,null,U(e.modules,n=>(l(),a("button",{key:n.module,class:ee(["w-full flex items-center justify-between text-left px-3 py-2 rounded-lg text-sm mb-0.5 transition-colors",u.value===n.module?"bg-indigo-50 text-indigo-700 font-medium":"text-slate-600 hover:bg-slate-50"]),onClick:ot=>u.value=n.module},[s("span",null,d(n.name),1),B.has(n.module)?(l(),a("span",De)):c("",!0)],10,Ae))),128))]))),128))]),s("section",Ie,[m.value?(l(),a(h,{key:0},[s("div",Se,[s("div",null,[s("div",je,d(m.value.name),1),m.value.desc?(l(),a("div",qe,d(m.value.desc),1)):c("",!0)]),s("div",Ee,[B.has(u.value)?(l(),a("button",{key:0,class:"btn btn-ghost btn-xs text-rose-500",disabled:g.value,onClick:Q},"清空",8,Te)):c("",!0),s("button",{class:"btn btn-primary btn-sm text-white",disabled:g.value||C.value!=="",onClick:K},d(g.value?"保存中…":"保存"),9,$e)])]),s("div",ze,[(l(!0),a(h,null,U(m.value.fields,e=>(l(),a("div",{key:e.key,class:"form-control"},[s("label",Fe,[s("span",Re,[f(d(e.label)+" ",1),e.required?(l(),a("span",Le,"*")):c("",!0),e.secret?(l(),a("span",Oe,"🔒")):c("",!0),s("span",Pe,d(e.key),1)])]),e.type==="bool"?(l(),a("label",Ge,[s("input",{type:"checkbox",class:"toggle toggle-sm toggle-primary",checked:p.value[e.key]==="true",onChange:n=>L(e.key,n)},null,40,He),s("span",Je,d(p.value[e.key]==="true"?"开启":"关闭"),1)])):e.type==="select"?V((l(),a("select",{key:1,"onUpdate:modelValue":n=>p.value[e.key]=n,class:"select select-bordered select-sm w-full"},[t[11]||(t[11]=s("option",{value:""},"请选择",-1)),(l(!0),a(h,null,U(e.options,n=>(l(),a("option",{key:n.value,value:n.value},d(n.label),9,Qe))),128))],8,Ke)),[[T,p.value[e.key]]]):e.type==="textarea"?V((l(),a("textarea",{key:2,"onUpdate:modelValue":n=>p.value[e.key]=n,class:"textarea textarea-bordered w-full font-mono text-xs",rows:"3",placeholder:e.secret?"留空/保持 [encrypted] 则不变":e.placeholder||""},null,8,We)),[[$,p.value[e.key]]]):e.type==="password"?(l(),a("div",Xe,[V(s("input",{"onUpdate:modelValue":n=>p.value[e.key]=n,type:N[e.key]?"text":"password",class:"input input-bordered input-sm w-full font-mono text-xs pr-14",placeholder:"留空/保持 [encrypted] 则不变"},null,8,Ye),[[te,p.value[e.key]]]),s("button",{type:"button",class:"absolute right-3 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700",onClick:n=>N[e.key]=!N[e.key]},d(N[e.key]?"隐藏":"显示"),9,Ze)])):V((l(),a("input",{key:4,"onUpdate:modelValue":n=>p.value[e.key]=n,type:"text",class:"input input-bordered input-sm w-full font-mono text-xs",placeholder:e.placeholder||""},null,8,et)),[[$,p.value[e.key]]]),e.desc?(l(),a("span",tt,d(e.desc),1)):c("",!0)]))),128))])],64)):(l(),a("div",st,"暂无可配置的业务模块。"))])]))])]))}}),ct=se(at,[["__scopeId","data-v-a2d8388e"]]);export{ct as default};