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
40 KiB
1 lines
40 KiB
import{_ as Ze}from"./mgru9RGc.js";import{g as et,C as tt,c as a,l as _,a as e,d as V,q as c,s as R,F as b,r as k,t as d,p as Ue,L as F,v as y,x as j,n as C,H as Se,y as m,z as Te,A as Q,o,I as z,D as ee,_ as lt}from"./DMxDLVSv.js";import{u as st}from"./CCZrj3X-.js";import{u as ot}from"./B-sqZCu-.js";import"./DD3V9C6_.js";const nt={key:0,class:"mb-4 rounded-lg px-4 py-3 text-sm",style:{background:"#fffbeb",border:"1px solid #fde68a",color:"#92400e"}},at={class:"flex items-center justify-between mb-5"},it={class:"flex items-center gap-3"},dt=["value"],ut=["value"],rt={key:1,class:"rounded-lg px-3 py-2 mb-4 text-xs",style:{background:"#fefce8",border:"1px solid #fde047",color:"#854d0e"}},ct={key:2,class:"flex flex-col gap-6"},pt={class:"flex items-center gap-2 mb-3"},vt={class:"text-sm font-semibold text-slate-700"},bt={class:"text-xs text-slate-400"},mt={class:"svc-grid"},xt=["onClick"],yt={class:"card-head"},_t={class:"head-text"},ht={class:"name-line"},kt=["title"],gt=["title"],ft=["title"],wt={class:"chip-row"},Vt=["title"],Ct={class:"field-count"},Ut={key:1,class:"lock-badge"},St=["title"],Tt=["onClick"],$t={class:"text-xs text-slate-400 mt-1"},Mt={key:3,class:"bg-white rounded-2xl border border-slate-100 shadow-sm text-center text-slate-300 py-20"},At={class:"svc-box"},zt={class:"flex items-center justify-between mb-5"},Dt={class:"flex items-center gap-3"},Ft={class:"text-base font-semibold text-slate-800"},jt={class:"text-xs text-slate-400 mt-0.5"},Lt={key:0},Et={class:"flex gap-2"},It={class:"grid grid-cols-2 gap-4 mb-4"},Nt={class:"form-control"},Rt={class:"form-control"},Ot={class:"form-control mb-4"},Pt={class:"mb-4"},Bt={class:"text-xs text-slate-500 ml-2"},Ht={key:0,class:"rounded-lg px-3 py-2 mb-3 text-xs",style:{background:"#f0fdfa",border:"1px solid #99f6e4",color:"#0f766e"}},Jt={key:0,class:"text-xs text-slate-400 py-4 text-center"},qt={key:1,class:"overflow-x-auto"},Gt={class:"table text-xs"},Kt=["onUpdate:modelValue","title"],Qt=["onUpdate:modelValue"],Wt={class:"text-center"},Xt=["onUpdate:modelValue"],Yt={class:"relative"},Zt=["type","onUpdate:modelValue"],el=["onClick"],tl=["onUpdate:modelValue"],ll=["onUpdate:modelValue"],sl=["onClick"],ol={class:"wizard-steps mb-5"},nl={key:0},al={key:0},il={class:"type-grid"},dl=["onClick"],ul={class:"text-sm text-slate-700 mt-2"},rl={class:"flex items-center justify-between mb-3"},cl={class:"text-sm text-slate-500"},pl={class:"type-grid"},vl=["onClick"],bl={class:"provider-chip"},ml={class:"text-sm text-slate-700 mt-2"},xl={class:"text-[11px] text-slate-400 mt-0.5"},yl={key:0,class:"text-xs text-slate-400 mt-2"},_l={class:"flex items-center justify-between mb-3"},hl={class:"flex items-center gap-2"},kl={key:0,class:"provider-chip"},gl={class:"flex gap-2"},fl={class:"grid grid-cols-2 gap-4 mb-4"},wl={class:"form-control"},Vl={class:"form-control"},Cl={class:"grid grid-cols-2 gap-4 mb-4"},Ul={class:"form-control"},Sl={class:"form-control"},Tl={class:"form-control mb-4"},$l={key:0,class:"text-xs text-slate-400 py-4 text-center"},Ml={key:1,class:"overflow-x-auto"},Al={class:"table text-xs"},zl=["onUpdate:modelValue","title"],Dl=["onUpdate:modelValue"],Fl={class:"text-center"},jl=["onUpdate:modelValue"],Ll={class:"relative"},El=["type","onUpdate:modelValue"],Il=["onClick"],Nl=["onUpdate:modelValue"],Rl=["onUpdate:modelValue"],Ol=["onClick"],Pl={key:0,class:"text-center py-10 text-slate-400"},Bl={class:"flex items-center justify-between mb-5"},Hl={class:"flex items-center gap-3"},Jl={class:"text-base font-semibold text-slate-800"},ql={class:"badge badge-warning badge-sm mt-0.5"},Gl={class:"flex gap-2"},Kl={class:"rounded-lg px-3 py-2 mb-4 text-xs",style:{background:"#fefce8",border:"1px solid #fde047",color:"#854d0e"}},Ql={class:"overflow-x-auto"},Wl={class:"table text-xs"},Xl=["title"],Yl={class:"text-slate-500"},Zl={class:"text-center"},es={key:0,class:"disabled-badge"},ts={key:1,class:"override-badge"},ls={key:2,class:"inherit-badge"},ss={class:"text-center"},os=["onUpdate:modelValue"],ns={class:"relative"},as=["type","onUpdate:modelValue","disabled"],is=["onClick"],ds=["onUpdate:modelValue","disabled"],us=["onUpdate:modelValue","disabled","placeholder"],rs={key:0},cs={class:"divider text-xs text-slate-400 my-3"},ps={key:0,class:"text-xs text-slate-400 py-2 text-center"},vs={key:1,class:"overflow-x-auto"},bs={class:"table text-xs"},ms=["onUpdate:modelValue","title"],xs=["onUpdate:modelValue"],ys={class:"text-center"},_s=["onUpdate:modelValue"],hs={class:"relative"},ks=["type","onUpdate:modelValue"],gs=["onClick"],fs=["onUpdate:modelValue"],ws=["onClick"],Vs={class:"modal-overlay",style:{"z-index":"120"}},Cs={class:"sync-box"},Us={class:"flex items-start gap-3 mb-4"},Ss={style:{width:"42px",height:"42px",background:"linear-gradient(135deg,#4f46e5,#7c3aed)","border-radius":"13px",display:"flex","align-items":"center","justify-content":"center","flex-shrink":"0"}},Ts={style:{width:"20px",height:"20px",color:"#fff"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},$s={class:"text-xs text-slate-400 mt-1"},Ms=["innerHTML"],As={class:"flex items-center justify-between mb-1"},zs={class:"flex gap-2"},Ds={class:"sync-region-grid"},Fs=["onClick"],js=["checked","onClick"],Ls={class:"modal-overlay",style:{"z-index":"130"}},Es={class:"tpl-box"},Is={class:"flex items-center justify-between mb-4"},Ns={class:"flex gap-2"},Rs={class:"tpl-list"},Os={class:"text-xs font-semibold text-slate-500 mb-1"},Ps={style:{"min-width":"0",flex:"1"}},Bs={class:"flex items-center gap-2"},Hs={class:"font-semibold text-sm text-slate-800 truncate"},Js={class:"provider-chip"},qs={key:0,class:"badge badge-xs badge-ghost"},Gs={class:"text-xs text-slate-400 mt-0.5"},Ks={class:"flex gap-1"},Qs=["onClick"],Ws=["onClick"],Xs={key:0,class:"text-xs text-slate-400 text-center py-6"},Ys={class:"flex items-center justify-between mb-4"},Zs={class:"text-base font-semibold text-slate-800"},eo={class:"flex gap-2"},to={class:"grid grid-cols-2 gap-3 mb-3"},lo={class:"form-control"},so=["disabled"],oo={class:"form-control"},no=["value"],ao={class:"form-control"},io={class:"form-control"},uo={class:"form-control mb-3"},ro={class:"overflow-x-auto",style:{"max-height":"34vh"}},co={class:"table text-xs"},po=["onUpdate:modelValue","title"],vo=["onUpdate:modelValue"],bo={class:"text-center"},mo=["onUpdate:modelValue"],xo=["onUpdate:modelValue"],yo=["onClick"],_o={key:0},$e=10,ho=et({__name:"serviceconfig",setup(ko){const O=[{value:1,label:"中国"},{value:2,label:"美国"},{value:3,label:"东亚"},{value:4,label:"东南亚"},{value:5,label:"南亚"},{value:6,label:"中东"},{value:7,label:"欧洲"},{value:8,label:"俄罗斯"},{value:9,label:"非洲"},{value:10,label:"南美"},{value:11,label:"北美"},{value:12,label:"大洋洲"},{value:13,label:"巴西"},{value:14,label:"印度"}],P=[{v:1,label:"STT 语音识别",short:"STT",color:"#0369a1",bg:"#dbeafe"},{v:8,label:"录音文件识别",short:"录音识别",color:"#0e7490",bg:"#cffafe"},{v:2,label:"TTS 语音合成",short:"TTS",color:"#7c3aed",bg:"#ede9fe"},{v:3,label:"MT 机器翻译",short:"MT",color:"#059669",bg:"#dcfce7"},{v:4,label:"AST 端到端翻译",short:"AST",color:"#c2410c",bg:"#fff7ed"},{v:5,label:"LLM 文本大模型",short:"文本LLM",color:"#b45309",bg:"#fef9c3"},{v:9,label:"多媒体大模型",short:"多媒体LLM",color:"#9333ea",bg:"#f3e8ff"},{v:7,label:"STS 端到端对话",short:"STS",color:"#be185d",bg:"#fce7f3"},{v:6,label:"存储 OSS/COS",short:"存储",color:"#475569",bg:"#f1f5f9"},{v:10,label:"MCP 服务",short:"MCP",color:"#0d9488",bg:"#ccfbf1"}],{webApi:U,consoleApi:Me}=st(),{success:L,error:S}=ot(),M=m(""),te=m([]);async function Ae(){try{const s=await Me("products/list",{});te.value=(s??[]).map(l=>l.name).filter(Boolean)}catch{te.value=[]}}function ze(){w(),N()}function T(s){return P.find(l=>l.v===s)||{short:"?",color:"#999",bg:"#eee",v:0,label:""}}function W(){return x.value===$e?!0:!!p.value&&X(p.value.categories).includes($e)}function X(s){return(s||"").split(",").map(l=>parseInt(l)||0).filter(l=>l>0)}function ce(s){return(s.fields||[]).filter(l=>l.encrypted).length}function le(s){const l=oe.value[s.id]||[],r=l.map(t=>O.find(i=>i.value===t)?.label||"区域"+t);return g.value===0?l.length?{text:l.length+" 区域分叉",cls:"has",title:"已分叉:"+r.join("、")}:{text:"全区域通用",cls:"plain",title:"未做任何区域分叉,各区域都用默认配置"}:l.includes(g.value)?{text:"本区域已分叉",cls:"has",title:I.value+"有独立的字段配置"}:{text:"继承默认",cls:"plain",title:I.value+"未分叉,使用默认配置"}}const se=m(!0),B=m([]),oe=m({}),p=m(null),g=m(0),Y=m(!1),E=m("default"),u=Te({id:"",name:"",provider:"",description:"",enable:!1}),x=m(0),f=m([]),H=m(""),h=m(1),J=m([]),D=m([]),ne=m(!1),q=m([]),I=Q(()=>{const s=O.find(l=>l.value===g.value);return s?s.label:"区域"+g.value}),pe=Q(()=>{const s=P.map(r=>({...r,items:B.value.filter(t=>X(t.categories).includes(r.v))})).filter(r=>r.items.length),l=B.value.filter(r=>!X(r.categories).length);return l.length&&s.push({v:0,label:"未分类",short:"未分类",color:"#64748b",bg:"#f1f5f9",items:l}),s}),De=Q(()=>P.map(s=>({cat:s.v,label:s.label,items:q.value.filter(l=>l.category===s.v)})).filter(s=>s.items.length));async function N(){try{const s=await U("getsvcconfigs",{app_name:M.value});B.value=s?.items??[],oe.value=s?.regions??{},se.value=!0}catch{se.value=!1,B.value=[],oe.value={};return}if(p.value){const s=B.value.find(l=>l.id===p.value.id);s&&(p.value=s)}}async function Z(){try{const s=await U("getsvctemplates",{});q.value=s?.items??[]}catch{q.value=[]}}function Fe(){w()}function je(s){s&&(p.value=s,Y.value=!0,g.value===0?Le():Ie())}function w(){Y.value=!1,p.value=null}function Le(){const s=p.value;u.id=s.id,u.name=s.name||"",u.provider=s.provider||"",u.description=s.description||"",u.enable=!!s.enable,x.value=X(s.categories)[0]||0,f.value=JSON.parse(JSON.stringify(s.fields||[])).map(l=>({...l,_show:!1})),E.value="default"}function ae(s=0){p.value=null,u.id="",u.name="",u.provider="",u.description="",u.enable=!1,x.value=s,f.value=[],H.value="",h.value=s?2:1,E.value="new",Y.value=!0}const ve=Q(()=>q.value.filter(s=>s.category===x.value));function Ee(s){x.value!==s&&(x.value=s,H.value="",u.provider="",f.value=[]),h.value=2}function be(s){s?(H.value=s.id,u.provider=s.provider||"",u.name||(u.name=s.name||""),u.id||(u.id=s.id||""),u.description||(u.description=s.description||""),f.value=(s.fields||[]).map(l=>({key:l.key,description:l.description,type:l.type||"",encrypted:!!l.encrypted,def_value:l.def_value||"",sort:l.sort,_show:!1}))):(H.value="",u.provider="",f.value=[]),h.value=3}function me(){f.value.push({key:"",description:"",encrypted:!1,def_value:"",sort:f.value.length,_show:!1})}function xe(s){f.value.splice(s,1),f.value.forEach((l,r)=>{l.sort=r})}async function Ie(){const s=p.value;ne.value=!0,E.value="region";try{const r=(await U("getsvcregionoverride",{app_name:M.value,svc_id:s.id,region:g.value}))?.fields??[];J.value=r.filter(t=>!t.region_only).map(t=>({key:t.key,description:t.description,type:t.type||"",encrypted:!!t.encrypted,is_overridden:!!t.is_overridden,disabled:!!t.disabled,value:t.value||"",_input:t.encrypted?"":t.is_overridden&&t.value||"",_show:!1})),D.value=r.filter(t=>t.region_only).map(t=>({key:t.key,description:t.description,encrypted:!!t.encrypted,_input:t.encrypted?"":t.value||"",_show:!1}))}catch(l){S(l?.message??"加载区域分叉失败"),J.value=[],D.value=[]}finally{ne.value=!1}}function Ne(){D.value.push({key:"",description:"",encrypted:!1,_input:"",_show:!1})}function Re(s){D.value.splice(s,1)}function Oe(s){const l={name:u.name||"",provider:u.provider||"",description:u.description||"",categories:x.value?String(x.value):"",enable:u.enable||!1,fields:f.value.map(r=>({key:r.key,description:r.description,type:r.type||"",encrypted:r.encrypted,def_value:r.def_value,sort:r.sort}))};return s?l.id=u.id||"":l.id=p.value.id,l.app_name=M.value,l}function Pe(){const s={},l=[];J.value.forEach(t=>{s[t.key]=t._input||"",t.disabled&&l.push(t.key)});const r=D.value.filter(t=>(t.key||"").trim()).map((t,i)=>({key:t.key.trim(),description:t.description,encrypted:t.encrypted,def_value:t._input||"",sort:i}));return{overrides:s,disabled_keys:l,extra_fields:r}}async function ye(s){const l=s||!p.value;if(g.value===0){const r=Oe(l);if(!r.id||!r.name)return S("服务ID 和名称 必填"),!1;const t=l?"addsvcconfig":"updatesvcconfig";try{const i=await U(t,r);return p.value=i,await N(),L("保存成功"),!0}catch(i){return S(i?.message??"保存失败"),!1}}else{const{overrides:r,disabled_keys:t,extra_fields:i}=Pe();try{return await U("savesvcregionoverride",{app_name:M.value,svc_id:p.value.id,region:g.value,overrides:r,disabled_keys:t,extra_fields:i}),await N(),L("区域分叉已保存"),!0}catch(n){return S(n?.message??"保存失败"),!1}}}async function Be(){if(p.value&&window.confirm("确定删除服务「"+p.value.name+"」及其所有区域分叉?")){try{await U("delsvcconfig",{app_name:M.value,id:p.value.id})}catch(s){S(s?.message??"删除失败");return}w(),L("已删除"),await N()}}const ie=m(!1),de=m(!1),_e=m(""),he=m(""),A=m([]),ke=Q(()=>O.filter(s=>s.value!==g.value));function ue(s){de.value=s;const l=p.value?p.value.name:u.name||"新服务",r=g.value===0;_e.value=r?"「"+l+"」默认配置将保存,可同步推送到其他区域。":"「"+l+"」在当前区域的字段分叉将保存,可同步到其他区域。",he.value=r?"✦ 同步内容:各字段<b>默认值</b>推送为目标区域「覆盖值」,目标区域原有分叉将被替换。":"✦ 同步内容:当前区域的值覆盖 / 区域专属字段 / 停用字段整体复制到目标区域。",A.value=[],ie.value=!0}function ge(s){const l=A.value.indexOf(s);l>=0?A.value.splice(l,1):A.value.push(s)}function fe(s){A.value=s?ke.value.map(l=>l.value):[]}function we(){ie.value=!1}async function He(){we(),await ye(de.value)&&w()}async function Je(){const s=A.value.slice();if(we(),!await ye(de.value))return;const r=p.value?p.value.id:null;if(!s.length||!r){w();return}let t=0;try{t=(await U("syncsvctoregins",{app_name:M.value,svc_id:r,src_region:g.value,target_regions:s}))?.synced??0}catch(n){S(n?.message??"同步失败");return}await N();const i=s.map(n=>{const Ce=O.find(Ye=>Ye.value===n);return Ce?Ce.label:"区域"+n});L("已保存并同步到:"+i.join("、")+"("+t+" 个)"),w()}const re=m(!1),G=m("list"),K=m(!1),v=Te({id:"",category:2,provider:"",name:"",description:""}),$=m([]);function qe(){G.value="list",re.value=!0,Z()}function Ge(){re.value=!1}function Ve(s){s?(K.value=!0,v.id=s.id,v.category=s.category||2,v.provider=s.provider||"",v.name=s.name||"",v.description=s.description||"",$.value=(s.fields||[]).map(l=>({key:l.key,description:l.description,type:l.type||"",encrypted:!!l.encrypted,def_value:l.def_value||"",sort:l.sort}))):(K.value=!1,v.id="",v.category=2,v.provider="",v.name="",v.description="",$.value=[]),G.value="form"}function Ke(){$.value.push({key:"",description:"",encrypted:!1,def_value:"",sort:$.value.length})}function Qe(s){$.value.splice(s,1),$.value.forEach((l,r)=>{l.sort=r})}async function We(){if(!v.id.trim()||!v.name.trim()||!v.provider.trim()){S("模板ID / 展示名 / 服务商标识 必填");return}const s={id:v.id.trim(),category:Number(v.category)||0,provider:v.provider.trim(),name:v.name.trim(),description:v.description.trim(),fields:$.value.map((l,r)=>({key:l.key,description:l.description,type:l.type||"",encrypted:l.encrypted,def_value:l.def_value,sort:r}))};try{await U(K.value?"updatesvctemplate":"addsvctemplate",s)}catch(l){S(l?.message??"保存失败");return}L("模板已保存"),await Z(),G.value="list"}async function Xe(s){if(window.confirm("确定删除模板「"+s.name+"」?"+(s.builtin?"(内置模板下次启动会被重新补回)":""))){try{await U("delsvctemplate",{id:s.id})}catch(l){S(l?.message??"删除失败");return}L("已删除"),await Z()}}return tt(()=>{Ae(),N(),Z()}),(s,l)=>{const r=Ze;return o(),a("div",null,[se.value?_("",!0):(o(),a("div",nt," ⚠ 「第三方服务配置」后端接口暂不可用(连接失败),请检查 console 服务是否运行。 ")),e("div",at,[l[31]||(l[31]=e("div",null,[e("h2",{class:"text-lg font-semibold text-slate-800"},"第三方服务配置"),e("p",{class:"text-xs text-slate-400 mt-1"},[V("按服务类型分组管理已接入的第三方服务(火山引擎、阿里云、Azure 等)。默认展示"),e("b",null,"全局默认"),V("配置,可切换到具体应用;区域默认"),e("b",null,"中国"),V(",切换区域后点击卡片可为该区域覆盖字段值。")])],-1)),e("div",it,[c(e("select",{"onUpdate:modelValue":l[0]||(l[0]=t=>M.value=t),class:"select select-bordered select-sm",onChange:ze},[l[29]||(l[29]=e("option",{value:""},"全局默认",-1)),(o(!0),a(b,null,k(te.value,t=>(o(),a("option",{key:t,value:t},"应用:"+d(t),9,dt))),128))],544),[[R,M.value]]),c(e("select",{"onUpdate:modelValue":l[1]||(l[1]=t=>g.value=t),class:"select select-bordered select-sm",onChange:Fe},[l[30]||(l[30]=e("option",{value:0},"默认(全区域)",-1)),(o(),a(b,null,k(O,t=>e("option",{key:t.value,value:t.value},d(t.label),9,ut)),64))],544),[[R,g.value,void 0,{number:!0}]]),e("button",{class:"btn btn-ghost btn-sm",onClick:qe},"服务商模板"),e("button",{class:"btn btn-primary btn-sm text-white",onClick:l[2]||(l[2]=t=>ae())},"+ 添加服务")])]),g.value!==0?(o(),a("div",rt," ✦ 当前处于「"+d(I.value)+"」区域视图:点击服务卡片编辑该区域的字段分叉(覆盖值 / 停用字段 / 区域专属字段)。要改服务本身的默认配置,请切回「默认(全区域)」。 ",1)):_("",!0),pe.value.length?(o(),a("div",ct,[(o(!0),a(b,null,k(pe.value,t=>(o(),a("section",{key:t.v},[e("div",pt,[e("span",{class:"cat-chip",style:F({color:t.color,background:t.bg})},d(t.short),5),e("h3",vt,d(t.label),1),e("span",bt,d(t.items.length)+" 个服务",1),l[32]||(l[32]=e("div",{class:"flex-1 h-px bg-slate-100 ml-2"},null,-1))]),e("div",mt,[(o(!0),a(b,null,k(t.items,i=>(o(),a("div",{key:i.id,class:C(["svc-card",{off:!i.enable}]),onClick:n=>je(i)},[e("div",yt,[e("div",{class:"svc-logo",style:F({background:i.color||"#6366f1"})},d(i.icon||(i.name||"").charAt(0)),5),e("div",_t,[e("div",ht,[e("span",{class:"svc-name",title:i.name},d(i.name),9,kt),e("span",{class:C(["state-chip",i.enable?"on":"off"])},d(i.enable?"启用":"停用"),3)]),e("p",{class:"svc-id",title:i.id},d(i.id),9,gt)])]),e("p",{class:"svc-desc",title:i.description||""},d(i.description||"—"),9,ft),e("div",wt,[i.provider?(o(),a("span",{key:0,class:"provider-chip",title:i.provider},d(i.provider),9,Vt)):_("",!0),e("span",Ct,d((i.fields||[]).length)+" 字段",1),ce(i)?(o(),a("span",Ut,"🔒"+d(ce(i)),1)):_("",!0),e("span",{class:C(["region-chip",le(i).cls]),title:le(i).title},d(le(i).text),11,St)])],10,xt))),128)),e("div",{class:"svc-card add-card",onClick:i=>ae(t.v)},[l[33]||(l[33]=e("span",{class:"text-2xl text-slate-300"},"+",-1)),e("span",$t,"添加"+d(t.short)+"服务",1)],8,Tt)])]))),128))])):(o(),a("div",Mt,[l[34]||(l[34]=e("div",{class:"text-5xl mb-3"},"⚙️",-1)),l[35]||(l[35]=e("p",{class:"text-sm mb-4"},"尚未配置任何第三方服务",-1)),e("button",{class:"btn btn-primary btn-sm text-white",onClick:l[3]||(l[3]=t=>ae())},"+ 添加服务")])),Y.value?(o(),a("div",{key:4,class:"modal-overlay",onClick:Ue(w,["self"])},[e("div",At,[E.value==="default"&&p.value?(o(),a(b,{key:0},[e("div",zt,[e("div",Dt,[e("div",{class:"svc-logo",style:F({background:p.value.color||"#6366f1",width:"44px",height:"44px",fontSize:"20px"})},d(p.value.icon||(p.value.name||"").charAt(0)),5),e("div",null,[e("h3",Ft,d(p.value.name),1),e("p",jt,[V(d(p.value.id),1),u.provider?(o(),a("span",Lt," · 服务商 "+d(u.provider),1)):_("",!0)])])]),e("div",Et,[e("button",{class:"btn btn-error btn-sm btn-outline",onClick:Be},"删除服务"),e("button",{class:"btn btn-primary btn-sm text-white",onClick:l[4]||(l[4]=t=>ue(!1))},"保存"),e("button",{class:"btn btn-ghost btn-sm",onClick:w},"关闭")])]),l[45]||(l[45]=e("div",{class:"divider text-xs text-slate-400 my-3"},"基本信息",-1)),e("div",It,[e("div",Nt,[l[36]||(l[36]=e("label",{class:"label"},[e("span",{class:"label-text"},"服务名称 *")],-1)),c(e("input",{"onUpdate:modelValue":l[5]||(l[5]=t=>u.name=t),class:"input input-bordered"},null,512),[[y,u.name]])]),e("div",Rt,[l[37]||(l[37]=e("label",{class:"label"},[e("span",{class:"label-text"},"启用")],-1)),c(e("input",{"onUpdate:modelValue":l[6]||(l[6]=t=>u.enable=t),type:"checkbox",class:"toggle toggle-primary mt-3"},null,512),[[j,u.enable]])])]),e("div",Ot,[l[38]||(l[38]=e("label",{class:"label"},[e("span",{class:"label-text"},"服务描述")],-1)),c(e("input",{"onUpdate:modelValue":l[7]||(l[7]=t=>u.description=t),class:"input input-bordered"},null,512),[[y,u.description]])]),e("div",Pt,[l[39]||(l[39]=e("p",{class:"text-sm font-medium text-slate-700 mb-2"},"服务类型",-1)),x.value?(o(),a("span",{key:0,class:"cat-chip",style:F({color:T(x.value).color,background:T(x.value).bg})},d(T(x.value).short),5)):_("",!0),e("span",Bt,d(x.value?T(x.value).label:"未设置"),1),l[40]||(l[40]=e("span",{class:"text-[11px] text-slate-400 ml-2"},"(类型在创建时确定,不可更改)",-1))]),l[46]||(l[46]=e("div",{class:"divider text-xs text-slate-400 my-3"},"配置字段(全区域共用)",-1)),W()?(o(),a("div",Ht,[...l[41]||(l[41]=[V(" ✦ MCP 服务与其他第三方服务同表存储(svc_config):这里填的 url/type/tools 为",-1),e("b",null,"全区域默认",-1),V("; 只在某些区域生效的地址,切到对应区域做分叉即可,卡片上会显示已分叉的区域数。 ",-1)])])):_("",!0),e("div",null,[f.value.length?(o(),a("div",qt,[e("table",Gt,[l[44]||(l[44]=e("thead",null,[e("tr",null,[e("th",{class:"w-44"},"字段名"),e("th",null,"字段描述"),e("th",{class:"w-16 text-center"},"加密"),e("th",null,"默认值"),e("th",{class:"w-12"})])],-1)),e("tbody",null,[(o(!0),a(b,null,k(f.value,(t,i)=>(o(),a("tr",{key:i},[e("td",null,[c(e("input",{class:"field-input","onUpdate:modelValue":n=>t.key=n,placeholder:"key",title:t.key},null,8,Kt),[[y,t.key]])]),e("td",null,[c(e("input",{class:"field-input","onUpdate:modelValue":n=>t.description=n,placeholder:"用途描述"},null,8,Qt),[[y,t.description]])]),e("td",Wt,[c(e("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","onUpdate:modelValue":n=>t.encrypted=n},null,8,Xt),[[j,t.encrypted]])]),e("td",null,[t.type==="langs"?(o(),z(r,{key:0,modelValue:t.def_value,"onUpdate:modelValue":n=>t.def_value=n,multiple:!0},null,8,["modelValue","onUpdate:modelValue"])):t.type==="lang"?(o(),z(r,{key:1,modelValue:t.def_value,"onUpdate:modelValue":n=>t.def_value=n},null,8,["modelValue","onUpdate:modelValue"])):t.encrypted?(o(),a(b,{key:2},[e("div",Yt,[c(e("input",{type:t._show?"text":"password",class:"field-input pr-14","onUpdate:modelValue":n=>t.def_value=n,placeholder:"留空保留原值"},null,8,Zt),[[ee,t.def_value]]),e("button",{type:"button",class:"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700",onClick:n=>t._show=!t._show},d(t._show?"隐藏":"显示"),9,el)]),l[42]||(l[42]=e("span",{class:"lock-badge ml-1"},"🔒 加密",-1))],64)):W()&&t.key==="type"?c((o(),a("select",{key:3,class:"field-input","onUpdate:modelValue":n=>t.def_value=n},[...l[43]||(l[43]=[e("option",{value:"0"},"HTTP",-1),e("option",{value:"1"},"SSE",-1)])],8,tl)),[[R,t.def_value]]):c((o(),a("input",{key:4,class:"field-input","onUpdate:modelValue":n=>t.def_value=n},null,8,ll)),[[y,t.def_value]])]),e("td",null,[e("button",{class:"btn btn-ghost btn-xs text-error",onClick:n=>xe(i)},"×",8,sl)])]))),128))])])])):(o(),a("p",Jt,"尚无字段,点击下方添加")),e("button",{class:"btn btn-ghost btn-sm mt-2 text-primary",onClick:me},"+ 添加字段")])],64)):E.value==="new"?(o(),a(b,{key:1},[e("div",{class:"flex items-center justify-between mb-4"},[l[47]||(l[47]=e("h3",{class:"text-base font-semibold text-slate-800"},"新增第三方服务",-1)),e("button",{class:"btn btn-ghost btn-sm",onClick:w},"取消")]),e("div",ol,[e("div",{class:C(["wstep",{on:h.value>=1,cur:h.value===1}]),onClick:l[8]||(l[8]=t=>h.value=1)},[l[48]||(l[48]=V("① 服务类型",-1)),x.value?(o(),a("span",nl," · "+d(T(x.value).short),1)):_("",!0)],2),l[50]||(l[50]=e("div",{class:"wline"},null,-1)),e("div",{class:C(["wstep",{on:h.value>=2,cur:h.value===2,disabled:!x.value}]),onClick:l[9]||(l[9]=t=>x.value&&(h.value=2))},[l[49]||(l[49]=V("② 服务商",-1)),u.provider?(o(),a("span",al," · "+d(u.provider),1)):_("",!0)],2),l[51]||(l[51]=e("div",{class:"wline"},null,-1)),e("div",{class:C(["wstep",{on:h.value>=3,cur:h.value===3,disabled:h.value<3}])},"③ 配置",2)]),h.value===1?(o(),a(b,{key:0},[l[52]||(l[52]=e("p",{class:"text-sm text-slate-500 mb-3"},"请选择要接入的服务类型(每个服务归属单一类型,独立配置):",-1)),e("div",il,[(o(),a(b,null,k(P,t=>e("div",{key:t.v,class:C(["type-card",{on:x.value===t.v}]),onClick:i=>Ee(t.v)},[e("span",{class:"cat-chip",style:F({color:t.color,background:t.bg})},d(t.short),5),e("span",ul,d(t.label),1)],10,dl)),64))])],64)):h.value===2?(o(),a(b,{key:1},[e("div",rl,[e("p",cl,"为「"+d(T(x.value).label)+"」选择服务商:",1),e("button",{class:"btn btn-ghost btn-xs",onClick:l[10]||(l[10]=t=>h.value=1)},"← 上一步")]),e("div",pl,[(o(!0),a(b,null,k(ve.value,t=>(o(),a("div",{key:t.id,class:C(["type-card",{on:H.value===t.id}]),onClick:i=>be(t)},[e("span",bl,d(t.provider),1),e("span",ml,d(t.name),1),e("span",xl,d((t.fields||[]).length)+" 字段",1)],10,vl))),128)),e("div",{class:"type-card",onClick:l[11]||(l[11]=t=>be(null))},[...l[53]||(l[53]=[e("span",{class:"provider-chip",style:{background:"#f1f5f9",color:"#475569"}},"自定义",-1),e("span",{class:"text-sm text-slate-700 mt-2"},"空白自定义",-1),e("span",{class:"text-[11px] text-slate-400 mt-0.5"},"手动添加字段",-1)])])]),ve.value.length?_("",!0):(o(),a("p",yl,"该类型暂无内置模板,可选「空白自定义」,或到「服务商模板」新增。"))],64)):(o(),a(b,{key:2},[e("div",_l,[e("div",hl,[e("span",{class:"cat-chip",style:F({color:T(x.value).color,background:T(x.value).bg})},d(T(x.value).short),5),u.provider?(o(),a("span",kl,d(u.provider),1)):_("",!0)]),e("div",gl,[e("button",{class:"btn btn-ghost btn-xs",onClick:l[12]||(l[12]=t=>h.value=2)},"← 上一步"),e("button",{class:"btn btn-primary btn-sm text-white",onClick:l[13]||(l[13]=t=>ue(!0))},"创建")])]),e("div",fl,[e("div",wl,[l[54]||(l[54]=e("label",{class:"label"},[e("span",{class:"label-text"},[V("服务ID * "),e("span",{class:"text-slate-400 text-xs"},"(唯一,如 tts_azure)")])],-1)),c(e("input",{"onUpdate:modelValue":l[14]||(l[14]=t=>u.id=t),class:"input input-bordered font-mono",placeholder:"tts_azure"},null,512),[[y,u.id]])]),e("div",Vl,[l[55]||(l[55]=e("label",{class:"label"},[e("span",{class:"label-text"},"服务名称 *")],-1)),c(e("input",{"onUpdate:modelValue":l[15]||(l[15]=t=>u.name=t),class:"input input-bordered",placeholder:"微软 Azure TTS"},null,512),[[y,u.name]])])]),e("div",Cl,[e("div",Ul,[l[56]||(l[56]=e("label",{class:"label"},[e("span",{class:"label-text"},[V("服务商标识 "),e("span",{class:"text-slate-400 text-xs"},"(如 azure/alibaba)")])],-1)),c(e("input",{"onUpdate:modelValue":l[16]||(l[16]=t=>u.provider=t),class:"input input-bordered font-mono",placeholder:"azure"},null,512),[[y,u.provider]])]),e("div",Sl,[l[57]||(l[57]=e("label",{class:"label"},[e("span",{class:"label-text"},"启用")],-1)),c(e("input",{"onUpdate:modelValue":l[17]||(l[17]=t=>u.enable=t),type:"checkbox",class:"toggle toggle-primary mt-3"},null,512),[[j,u.enable]])])]),e("div",Tl,[l[58]||(l[58]=e("label",{class:"label"},[e("span",{class:"label-text"},"服务描述")],-1)),c(e("input",{"onUpdate:modelValue":l[18]||(l[18]=t=>u.description=t),class:"input input-bordered",placeholder:"简述该服务的用途"},null,512),[[y,u.description]])]),l[62]||(l[62]=e("div",{class:"divider text-xs text-slate-400 my-3"},"配置字段",-1)),e("div",null,[f.value.length?(o(),a("div",Ml,[e("table",Al,[l[61]||(l[61]=e("thead",null,[e("tr",null,[e("th",{class:"w-44"},"字段名"),e("th",null,"字段描述"),e("th",{class:"w-16 text-center"},"加密"),e("th",null,"默认值"),e("th",{class:"w-12"})])],-1)),e("tbody",null,[(o(!0),a(b,null,k(f.value,(t,i)=>(o(),a("tr",{key:i},[e("td",null,[c(e("input",{class:"field-input","onUpdate:modelValue":n=>t.key=n,placeholder:"key",title:t.key},null,8,zl),[[y,t.key]])]),e("td",null,[c(e("input",{class:"field-input","onUpdate:modelValue":n=>t.description=n,placeholder:"用途描述"},null,8,Dl),[[y,t.description]])]),e("td",Fl,[c(e("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","onUpdate:modelValue":n=>t.encrypted=n},null,8,jl),[[j,t.encrypted]])]),e("td",null,[t.type==="langs"?(o(),z(r,{key:0,modelValue:t.def_value,"onUpdate:modelValue":n=>t.def_value=n,multiple:!0},null,8,["modelValue","onUpdate:modelValue"])):t.type==="lang"?(o(),z(r,{key:1,modelValue:t.def_value,"onUpdate:modelValue":n=>t.def_value=n},null,8,["modelValue","onUpdate:modelValue"])):t.encrypted?(o(),a(b,{key:2},[e("div",Ll,[c(e("input",{type:t._show?"text":"password",class:"field-input pr-14","onUpdate:modelValue":n=>t.def_value=n,placeholder:"留空保留原值"},null,8,El),[[ee,t.def_value]]),e("button",{type:"button",class:"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700",onClick:n=>t._show=!t._show},d(t._show?"隐藏":"显示"),9,Il)]),l[59]||(l[59]=e("span",{class:"lock-badge ml-1"},"🔒 加密",-1))],64)):W()&&t.key==="type"?c((o(),a("select",{key:3,class:"field-input","onUpdate:modelValue":n=>t.def_value=n},[...l[60]||(l[60]=[e("option",{value:"0"},"HTTP",-1),e("option",{value:"1"},"SSE",-1)])],8,Nl)),[[R,t.def_value]]):c((o(),a("input",{key:4,class:"field-input","onUpdate:modelValue":n=>t.def_value=n},null,8,Rl)),[[y,t.def_value]])]),e("td",null,[e("button",{class:"btn btn-ghost btn-xs text-error",onClick:n=>xe(i)},"×",8,Ol)])]))),128))])])])):(o(),a("p",$l,"尚无字段,选模板自动带出或点击下方添加")),e("button",{class:"btn btn-ghost btn-sm mt-2 text-primary",onClick:me},"+ 添加字段")])],64))],64)):E.value==="region"&&p.value?(o(),a(b,{key:2},[ne.value?(o(),a("div",Pl,"加载中...")):(o(),a(b,{key:1},[e("div",Bl,[e("div",Hl,[e("div",{class:"svc-logo",style:F({background:p.value.color||"#6366f1",width:"44px",height:"44px",fontSize:"20px"})},d(p.value.icon||(p.value.name||"").charAt(0)),5),e("div",null,[e("h3",Jl,d(p.value.name),1),e("span",ql,d(I.value)+" 分叉模式",1)])]),e("div",Gl,[e("button",{class:"btn btn-primary btn-sm text-white",onClick:l[19]||(l[19]=t=>ue(!1))},"保存分叉"),e("button",{class:"btn btn-ghost btn-sm",onClick:w},"关闭")])]),e("div",Kl," ✦ 当前编辑「"+d(I.value)+"」的字段分叉:默认字段可覆盖值或勾选「不适用」停用;也可新增本区域专属字段。留空的覆盖字段继承默认值,加密字段留空保留已存储密文。 ",1),l[69]||(l[69]=e("p",{class:"text-sm font-medium text-slate-700 mb-2"},"默认字段",-1)),e("div",Ql,[e("table",Wl,[l[66]||(l[66]=e("thead",null,[e("tr",null,[e("th",{class:"w-44"},"字段名"),e("th",null,"字段描述"),e("th",{class:"w-24 text-center"},"状态"),e("th",{class:"w-20 text-center"},"本区域不适用"),e("th",null,"有效值")])],-1)),e("tbody",null,[(o(!0),a(b,null,k(J.value,(t,i)=>(o(),a("tr",{key:i,class:C({"opacity-50":t.disabled})},[e("td",{class:"font-mono text-slate-700 break-all",title:t.key},d(t.key),9,Xl),e("td",Yl,d(t.description),1),e("td",Zl,[t.disabled?(o(),a("span",es,"停用")):t.is_overridden?(o(),a("span",ts,"覆盖")):(o(),a("span",ls,"继承"))]),e("td",ss,[c(e("input",{type:"checkbox",class:"checkbox checkbox-xs","onUpdate:modelValue":n=>t.disabled=n},null,8,os),[[j,t.disabled]])]),e("td",null,[t.type==="langs"?(o(),z(r,{key:0,modelValue:t._input,"onUpdate:modelValue":n=>t._input=n,multiple:!0,disabled:t.disabled},null,8,["modelValue","onUpdate:modelValue","disabled"])):t.type==="lang"?(o(),z(r,{key:1,modelValue:t._input,"onUpdate:modelValue":n=>t._input=n,disabled:t.disabled},null,8,["modelValue","onUpdate:modelValue","disabled"])):t.encrypted?(o(),a(b,{key:2},[e("div",ns,[c(e("input",{type:t._show?"text":"password",class:"field-input pr-14","onUpdate:modelValue":n=>t._input=n,disabled:t.disabled,placeholder:"留空继承默认"},null,8,as),[[ee,t._input]]),e("button",{type:"button",class:"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700",onClick:n=>t._show=!t._show},d(t._show?"隐藏":"显示"),9,is)]),l[63]||(l[63]=e("span",{class:"lock-badge ml-1"},"🔒",-1))],64)):W()&&t.key==="type"?c((o(),a("select",{key:3,class:"field-input","onUpdate:modelValue":n=>t._input=n,disabled:t.disabled},[...l[64]||(l[64]=[e("option",{value:""},"继承默认",-1),e("option",{value:"0"},"HTTP",-1),e("option",{value:"1"},"SSE",-1)])],8,ds)),[[R,t._input]]):c((o(),a("input",{key:4,class:"field-input","onUpdate:modelValue":n=>t._input=n,disabled:t.disabled,placeholder:"留空继承:"+(t.value||"")},null,8,us)),[[y,t._input]])])],2))),128)),J.value.length?_("",!0):(o(),a("tr",rs,[...l[65]||(l[65]=[e("td",{colspan:"5",class:"text-center text-slate-400 py-3"},"该服务尚无默认字段",-1)])]))])])]),e("div",cs,d(I.value)+" 专属字段",1),e("div",null,[D.value.length?(o(),a("div",vs,[e("table",bs,[l[68]||(l[68]=e("thead",null,[e("tr",null,[e("th",{class:"w-44"},"字段名"),e("th",null,"字段描述"),e("th",{class:"w-16 text-center"},"加密"),e("th",null,"值"),e("th",{class:"w-12"})])],-1)),e("tbody",null,[(o(!0),a(b,null,k(D.value,(t,i)=>(o(),a("tr",{key:i},[e("td",null,[c(e("input",{class:"field-input","onUpdate:modelValue":n=>t.key=n,placeholder:"key",title:t.key},null,8,ms),[[y,t.key]])]),e("td",null,[c(e("input",{class:"field-input","onUpdate:modelValue":n=>t.description=n,placeholder:"用途描述"},null,8,xs),[[y,t.description]])]),e("td",ys,[c(e("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","onUpdate:modelValue":n=>t.encrypted=n},null,8,_s),[[j,t.encrypted]])]),e("td",null,[t.encrypted?(o(),a(b,{key:0},[e("div",hs,[c(e("input",{type:t._show?"text":"password",class:"field-input pr-14","onUpdate:modelValue":n=>t._input=n,placeholder:"留空保留原值"},null,8,ks),[[ee,t._input]]),e("button",{type:"button",class:"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700",onClick:n=>t._show=!t._show},d(t._show?"隐藏":"显示"),9,gs)]),l[67]||(l[67]=e("span",{class:"lock-badge ml-1"},"🔒",-1))],64)):c((o(),a("input",{key:1,class:"field-input","onUpdate:modelValue":n=>t._input=n},null,8,fs)),[[y,t._input]])]),e("td",null,[e("button",{class:"btn btn-ghost btn-xs text-error",onClick:n=>Re(i)},"×",8,ws)])]))),128))])])])):(o(),a("p",ps,"尚无区域专属字段,点击下方添加")),e("button",{class:"btn btn-ghost btn-sm mt-2 text-primary",onClick:Ne},"+ 添加区域专属字段")])],64))],64)):_("",!0)])])):_("",!0),c(e("div",Vs,[e("div",Cs,[e("div",Us,[e("div",Ss,[(o(),a("svg",Ts,[...l[70]||(l[70]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"},null,-1)])]))]),e("div",null,[l[71]||(l[71]=e("h3",{class:"text-base font-semibold text-slate-800"},"同步到其他区域",-1)),e("p",$s,d(_e.value),1)])]),e("div",{class:"text-xs px-3 py-2 rounded-lg mb-3",style:{background:"#f0fdf4",border:"1px solid #bbf7d0",color:"#15803d"},innerHTML:he.value},null,8,Ms),e("div",As,[l[72]||(l[72]=e("span",{class:"text-xs font-semibold text-slate-500"},"选择目标区域",-1)),e("div",zs,[e("button",{class:"btn btn-ghost btn-xs",onClick:l[20]||(l[20]=t=>fe(!0))},"全选"),e("button",{class:"btn btn-ghost btn-xs",onClick:l[21]||(l[21]=t=>fe(!1))},"清空")])]),e("div",Ds,[(o(!0),a(b,null,k(ke.value,t=>(o(),a("label",{key:t.value,class:C(["sync-region-item",{checked:A.value.includes(t.value)}]),onClick:i=>ge(t.value)},[e("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:A.value.includes(t.value),onClick:Ue(i=>ge(t.value),["stop"])},null,8,js),e("span",null,d(t.label),1)],10,Fs))),128))]),l[73]||(l[73]=e("p",{class:"text-[11px] text-slate-400 mb-5"},"⚠ 已勾选区域将被当前配置(值覆盖 / 区域专属字段 / 停用字段)整体替换;加密字段密文一并同步。",-1)),e("div",{class:"flex gap-3 justify-end"},[e("button",{class:"btn btn-ghost",onClick:He},"仅保存当前区域"),e("button",{class:"btn btn-primary text-white",onClick:Je},"保存并同步")])])],512),[[Se,ie.value]]),c(e("div",Ls,[e("div",Es,[G.value==="list"?(o(),a(b,{key:0},[e("div",Is,[l[74]||(l[74]=e("div",null,[e("h3",{class:"text-base font-semibold text-slate-800"},"服务商模板"),e("p",{class:"text-xs text-slate-400 mt-1"},"模板是字段预设,新增服务时可一键带出。内置模板可编辑;删除后重启会被重新补回。")],-1)),e("div",Ns,[e("button",{class:"btn btn-primary btn-sm text-white",onClick:l[22]||(l[22]=t=>Ve())},"+ 新增模板"),e("button",{class:"btn btn-ghost btn-sm",onClick:Ge},"关闭")])]),e("div",Rs,[(o(!0),a(b,null,k(De.value,t=>(o(),a("div",{key:t.cat,class:"mb-3"},[e("p",Os,d(t.label),1),(o(!0),a(b,null,k(t.items,i=>(o(),a("div",{key:i.id,class:"tpl-row"},[e("div",Ps,[e("div",Bs,[e("span",Hs,d(i.name),1),e("span",Js,d(i.provider),1),i.builtin?(o(),a("span",qs,"内置")):_("",!0)]),e("p",Gs,d(i.id)+" · "+d((i.fields||[]).length)+" 字段",1)]),e("div",Ks,[e("button",{class:"btn btn-ghost btn-xs",onClick:n=>Ve(i)},"编辑",8,Qs),e("button",{class:"btn btn-ghost btn-xs text-error",onClick:n=>Xe(i)},"删除",8,Ws)])]))),128))]))),128)),q.value.length?_("",!0):(o(),a("p",Xs,"暂无模板"))])],64)):(o(),a(b,{key:1},[e("div",Ys,[e("h3",Zs,d(K.value?"编辑模板":"新增模板"),1),e("div",eo,[e("button",{class:"btn btn-ghost btn-sm",onClick:l[23]||(l[23]=t=>G.value="list")},"返回"),e("button",{class:"btn btn-primary btn-sm text-white",onClick:We},"保存")])]),e("div",to,[e("div",lo,[l[75]||(l[75]=e("label",{class:"label"},[e("span",{class:"label-text text-xs"},"模板ID *")],-1)),c(e("input",{"onUpdate:modelValue":l[24]||(l[24]=t=>v.id=t),disabled:K.value,class:"input input-bordered input-sm font-mono",placeholder:"tts_azure"},null,8,so),[[y,v.id]])]),e("div",oo,[l[76]||(l[76]=e("label",{class:"label"},[e("span",{class:"label-text text-xs"},"类别 *")],-1)),c(e("select",{"onUpdate:modelValue":l[25]||(l[25]=t=>v.category=t),class:"select select-bordered select-sm"},[(o(),a(b,null,k(P,t=>e("option",{key:t.v,value:t.v},d(t.label),9,no)),64))],512),[[R,v.category,void 0,{number:!0}]])]),e("div",ao,[l[77]||(l[77]=e("label",{class:"label"},[e("span",{class:"label-text text-xs"},"服务商标识 *")],-1)),c(e("input",{"onUpdate:modelValue":l[26]||(l[26]=t=>v.provider=t),class:"input input-bordered input-sm font-mono",placeholder:"azure"},null,512),[[y,v.provider]])]),e("div",io,[l[78]||(l[78]=e("label",{class:"label"},[e("span",{class:"label-text text-xs"},"展示名 *")],-1)),c(e("input",{"onUpdate:modelValue":l[27]||(l[27]=t=>v.name=t),class:"input input-bordered input-sm",placeholder:"微软 Azure TTS"},null,512),[[y,v.name]])])]),e("div",uo,[l[79]||(l[79]=e("label",{class:"label"},[e("span",{class:"label-text text-xs"},"描述")],-1)),c(e("input",{"onUpdate:modelValue":l[28]||(l[28]=t=>v.description=t),class:"input input-bordered input-sm"},null,512),[[y,v.description]])]),l[82]||(l[82]=e("p",{class:"text-sm font-medium text-slate-700 mb-1"},"字段",-1)),e("div",ro,[e("table",co,[l[81]||(l[81]=e("thead",null,[e("tr",null,[e("th",{class:"w-44"},"字段名"),e("th",null,"字段描述"),e("th",{class:"w-16 text-center"},"加密"),e("th",null,"默认/提示值"),e("th",{class:"w-12"})])],-1)),e("tbody",null,[(o(!0),a(b,null,k($.value,(t,i)=>(o(),a("tr",{key:i},[e("td",null,[c(e("input",{class:"field-input","onUpdate:modelValue":n=>t.key=n,placeholder:"key",title:t.key},null,8,po),[[y,t.key]])]),e("td",null,[c(e("input",{class:"field-input","onUpdate:modelValue":n=>t.description=n,placeholder:"用途描述"},null,8,vo),[[y,t.description]])]),e("td",bo,[c(e("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary","onUpdate:modelValue":n=>t.encrypted=n},null,8,mo),[[j,t.encrypted]])]),e("td",null,[t.type==="langs"?(o(),z(r,{key:0,modelValue:t.def_value,"onUpdate:modelValue":n=>t.def_value=n,multiple:!0},null,8,["modelValue","onUpdate:modelValue"])):t.type==="lang"?(o(),z(r,{key:1,modelValue:t.def_value,"onUpdate:modelValue":n=>t.def_value=n},null,8,["modelValue","onUpdate:modelValue"])):c((o(),a("input",{key:2,class:"field-input","onUpdate:modelValue":n=>t.def_value=n,placeholder:"可留空"},null,8,xo)),[[y,t.def_value]])]),e("td",null,[e("button",{class:"btn btn-ghost btn-xs text-error",onClick:n=>Qe(i)},"×",8,yo)])]))),128)),$.value.length?_("",!0):(o(),a("tr",_o,[...l[80]||(l[80]=[e("td",{colspan:"5",class:"text-center text-slate-400 py-2"},"尚无字段",-1)])]))])])]),e("button",{class:"btn btn-ghost btn-sm mt-2 text-primary",onClick:Ke},"+ 添加字段")],64))])],512),[[Se,re.value]])])}}}),Uo=lt(ho,[["__scopeId","data-v-8fc1a20c"]]);export{Uo as default};
|
|
|