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
8.1 KiB

import{g as I,B as J,c as a,p,H as j,a as e,F as g,r as h,q,v as y,t as d,l as K,m as Q,x as r,y as W,z as w,o as i}from"./mElhLwm2.js";import{u as X}from"./C6twYRfy.js";import{u as Y}from"./FVTAbpot.js";import"./qig5Qp6S.js";const Z={class:"flex items-center justify-between mb-5"},ee=["disabled"],te={class:"flex items-center gap-3 mb-4 flex-wrap"},se=["value"],le=["disabled"],ne=["value"],oe={key:0,class:"bg-white rounded-xl shadow-sm border border-slate-100 text-center text-slate-400 py-16"},ae={class:"text-sm"},ie={key:1,class:"bg-white rounded-xl shadow-sm border border-slate-100"},ue={class:"overflow-x-auto"},de={class:"table"},re={key:0},pe={key:1},me={class:"bg-slate-100/80"},ve={colspan:"4",class:"py-2"},ce={class:"font-semibold text-slate-600 text-sm"},be={class:"text-xs text-slate-400 ml-2"},fe={class:"font-mono text-sm font-medium"},xe=["title"],ge={class:"text-sm text-slate-400"},ye={class:"text-right"},we={class:"inline-flex gap-1"},_e=["onClick"],ke=["onClick"],he={class:"flex items-center gap-3 mb-5"},Ce={class:"text-lg font-semibold text-slate-800"},$e={class:"text-xs text-slate-400"},Ve={class:"bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl"},Ae={class:"form-control mb-4"},Ne={class:"form-control mb-4"},Se={class:"form-control mb-4"},Ue={class:"form-control mb-6"},De={class:"flex gap-3"},Le=["disabled"],qe=I({__name:"appconfig",setup(Be){const{consoleApi:v}=X(),{success:D,error:c}=Y(),_=r("list"),b=r([]),C=r([]),m=r(""),u=r(0),f=r([]),$=r(!1),V=r(!1),k=r(!1),A=r(""),n=W({id:0,group:"",key:"",value:"",description:""}),N=w(()=>[...new Set(b.value.map(s=>s.app_name||s.name).filter(Boolean))].sort()),L=w(()=>b.value.filter(s=>(s.app_name||s.name)===m.value));function B(s){const t=C.value.find(U=>U.id===s.env_id),l=t?t.name||t.code:s.env_id?`环境#${s.env_id}`:"未关联环境",o=s.status==="pending"?"(待部署)":"";return s.region?`${l} · ${s.region}${o}`:`${l}${o}`}const O=w(()=>{const s=b.value.find(t=>t.id===u.value);return s?`${s.app_name||s.name} · ${B(s)}`:""}),M=w(()=>{const s=A.value.trim().toLowerCase();return s?f.value.filter(t=>((t.group||"")+(t.key||"")).toLowerCase().includes(s)):f.value}),R=w(()=>{const s={};return M.value.forEach(l=>{const o=l.group||"";(s[o]=s[o]||[]).push(l)}),Object.keys(s).sort((l,o)=>l===""?-1:o===""?1:l<o?-1:1).map(l=>({key:l,label:l||"未分组",items:s[l]}))});async function T(){try{const[s,t]=await Promise.all([v("apps/list",{}),v("envs/list",{})]);b.value=s??[],C.value=t??[],!m.value&&N.value.length&&(m.value=N.value[0],E(),await x())}catch(s){c(s?.message??"获取应用列表失败"),b.value=[],C.value=[]}}function E(){const s=L.value,t=s.find(l=>l.status!=="pending")??s[0];u.value=t?.id??0}function z(){E(),x()}async function x(){if(!u.value){f.value=[];return}$.value=!0;try{const s=await v("appcfg/list",{app_id:u.value});f.value=s?.items??[]}catch(s){c(s?.message??"获取配置失败"),f.value=[]}finally{$.value=!1}}function H(){x()}function S(){_.value="list",x()}function F(s){s?(k.value=!0,n.id=s.id||0,n.group=s.group||"",n.key=s.key||"",n.value=s.value||"",n.description=s.description||""):(k.value=!1,n.id=0,n.group="",n.key="",n.value="",n.description=""),_.value="form"}async function P(){if(!u.value){c("请先选择应用和部署环境");return}V.value=!0;try{const s={app_id:u.value,group:n.group.trim(),key:n.key.trim(),value:n.value,description:n.description.trim()};k.value?(s.id=Number(n.id),await v("appcfg/update",s)):await v("appcfg/add",s),D("保存成功"),S()}catch(s){c(s?.message??"保存失败")}finally{V.value=!1}}function G(s){window.confirm("确定删除该配置项吗?")&&v("appcfg/del",{app_id:u.value,ids:[s.id]}).then(()=>{D("删除成功"),x()}).catch(t=>c(t?.message??"删除失败"))}return J(T),(s,t)=>(i(),a("div",null,[p(e("div",null,[e("div",Z,[t[10]||(t[10]=e("div",null,[e("h2",{class:"text-lg font-semibold text-slate-800"},"应用环境配置"),e("p",{class:"text-xs text-slate-400 mt-1"},"应用自有的 key/value 配置(音乐、OSS 等),直接读写所选应用的业务库。结构同「全局环境配置」但不分区域。")],-1)),e("button",{class:"btn btn-primary btn-sm text-white",disabled:!u.value,onClick:t[0]||(t[0]=l=>F())},"+ 新增配置",8,ee)]),e("div",te,[t[13]||(t[13]=e("span",{class:"text-sm text-slate-500"},"应用",-1)),p(e("select",{"onUpdate:modelValue":t[1]||(t[1]=l=>m.value=l),class:"select select-bordered select-sm min-w-40",onChange:z},[t[11]||(t[11]=e("option",{value:"",disabled:""},"请选择应用",-1)),(i(!0),a(g,null,h(N.value,l=>(i(),a("option",{key:l,value:l},d(l),9,se))),128))],544),[[q,m.value]]),t[14]||(t[14]=e("span",{class:"text-sm text-slate-500"},"部署环境",-1)),p(e("select",{"onUpdate:modelValue":t[2]||(t[2]=l=>u.value=l),class:"select select-bordered select-sm min-w-48",disabled:!m.value,onChange:H},[t[12]||(t[12]=e("option",{value:0,disabled:""},"请选择环境",-1)),(i(!0),a(g,null,h(L.value,l=>(i(),a("option",{key:l.id,value:l.id},d(B(l)),9,ne))),128))],40,le),[[q,u.value,void 0,{number:!0}]]),p(e("input",{"onUpdate:modelValue":t[3]||(t[3]=l=>A.value=l),class:"input input-bordered input-sm w-48",placeholder:"按分组/键搜索"},null,512),[[y,A.value]])]),u.value?(i(),a("div",ie,[e("div",ue,[e("table",de,[t[18]||(t[18]=e("thead",null,[e("tr",null,[e("th",null,"键"),e("th",null,"值"),e("th",null,"描述"),e("th",{class:"text-right"},"操作")])],-1)),e("tbody",null,[$.value?(i(),a("tr",re,[...t[16]||(t[16]=[e("td",{colspan:"4",class:"text-center py-8"},[e("span",{class:"loading loading-spinner loading-sm"})],-1)])])):M.value.length?K("",!0):(i(),a("tr",pe,[...t[17]||(t[17]=[e("td",{colspan:"4",class:"text-center text-slate-400 py-8"},"暂无配置",-1)])])),(i(!0),a(g,null,h(R.value,l=>(i(),a(g,{key:l.key},[e("tr",me,[e("td",ve,[e("span",ce,"▸ "+d(l.label),1),e("span",be,d(l.items.length)+" 项",1)])]),(i(!0),a(g,null,h(l.items,o=>(i(),a("tr",{key:o.id,class:"hover"},[e("td",fe,d(o.key||""),1),e("td",{class:"text-sm text-slate-500 max-w-xs truncate",title:o.value||""},d(o.value||""),9,xe),e("td",ge,d(o.description||""),1),e("td",ye,[e("div",we,[e("button",{class:"btn btn-ghost btn-xs",onClick:U=>F(o)},"编辑",8,_e),e("button",{class:"btn btn-ghost btn-xs text-red-500",onClick:U=>G(o)},"删除",8,ke)])])]))),128))],64))),128))])])])])):(i(),a("div",oe,[t[15]||(t[15]=e("div",{class:"text-4xl mb-2"},"🗂️",-1)),e("p",ae,d(m.value?"该应用还没有部署环境,请先在「应用中心」为它部署一个环境":"请先在上方选择应用和部署环境"),1)]))],512),[[j,_.value==="list"]]),p(e("div",null,[e("div",he,[e("button",{class:"btn btn-ghost btn-sm",onClick:t[4]||(t[4]=l=>S())},"← 返回列表"),e("h2",Ce,d(k.value?"编辑配置":"新增配置"),1),e("span",$e,"配置目标:"+d(O.value),1)]),e("div",Ve,[e("form",{onSubmit:Q(P,["prevent"])},[e("div",Ae,[t[19]||(t[19]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"分组 (group)")],-1)),p(e("input",{"onUpdate:modelValue":t[5]||(t[5]=l=>n.group=l),type:"text",class:"input input-bordered w-full",placeholder:"如 music / oss / other"},null,512),[[y,n.group]])]),e("div",Ne,[t[20]||(t[20]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"键 (key) *")],-1)),p(e("input",{"onUpdate:modelValue":t[6]||(t[6]=l=>n.key=l),type:"text",class:"input input-bordered w-full",required:"",placeholder:"如 oss_access_key"},null,512),[[y,n.key]])]),e("div",Se,[t[21]||(t[21]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"值 (value)")],-1)),p(e("textarea",{"onUpdate:modelValue":t[7]||(t[7]=l=>n.value=l),class:"textarea textarea-bordered w-full font-mono text-sm",rows:"3"},null,512),[[y,n.value]])]),e("div",Ue,[t[22]||(t[22]=e("label",{class:"label"},[e("span",{class:"label-text font-medium"},"描述")],-1)),p(e("input",{"onUpdate:modelValue":t[8]||(t[8]=l=>n.description=l),type:"text",class:"input input-bordered w-full"},null,512),[[y,n.description]])]),e("div",De,[e("button",{type:"button",class:"btn btn-ghost",onClick:t[9]||(t[9]=l=>S())},"取消"),e("button",{type:"submit",class:"btn btn-primary text-white",disabled:V.value},"保存",8,Le)])],32)])],512),[[j,_.value==="form"]])]))}});export{qe as default};