250 changed files with 6124 additions and 2129 deletions
@ -0,0 +1 @@ |
|||||
|
{} |
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@ |
|||||
import{g as h,j as x,k as w,C as y,c as r,a as e,t as d,l as b,p as _,q as v,v as f,n as k,z as M,y as u,o as p,_ as z}from"./DMxDLVSv.js";const A={class:"login-bg flex items-center justify-center px-4"},B={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},q={style:{"margin-bottom":"24px"}},D=h({__name:"index",setup(L){const a=x(),c=w(),o=M({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function g(){l.value=!0,n.value="";try{const s=await $fetch("/web/api/api_login",{method:"POST",body:{account:o.account,password:o.password}});s.code===0&&s.data?(a.setLoginData(s.data),c.push("/dashboard")):n.value=s.msg||"登录失败"}catch{n.value="网络错误,请检查连接"}finally{l.value=!1}}return(s,t)=>(p(),r("div",A,[e("div",B,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(g,["prevent"])},[e("div",j,[t[5]||(t[5]=e("label",{class:"login-label"},"账号",-1)),v(e("input",{"onUpdate:modelValue":t[0]||(t[0]=i=>o.account=i),type:"text",class:"login-input",placeholder:"请输入管理员账号",autocomplete:"username",required:""},null,512),[[f,o.account]])]),e("div",q,[t[6]||(t[6]=e("label",{class:"login-label"},"密码",-1)),v(e("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>o.password=i),type:"password",class:"login-input",placeholder:"请输入密码",autocomplete:"current-password",required:""},null,512),[[f,o.password]])]),e("button",{type:"submit",class:k(["login-btn",{loading:l.value}])},d(l.value?"登录中...":"登 录"),3)],32),t[7]||(t[7]=e("p",{style:{"text-align":"center","font-size":"11px",color:"#94A3B8","margin-top":"24px"}}," © 2025 Admin Console · v1.0.1 ",-1))])]))}}),O=z(D,[["__scopeId","data-v-4f88fb34"]]);export{O as default}; |
import{g as h,j as x,k as w,C as y,c as r,a as e,t as d,l as b,p as _,q as v,v as f,n as k,z as M,y as u,o as p,_ as z}from"./DSy_gLdM.js";const A={class:"login-bg flex items-center justify-center px-4"},B={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},q={style:{"margin-bottom":"24px"}},D=h({__name:"index",setup(L){const a=x(),c=w(),o=M({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function g(){l.value=!0,n.value="";try{const s=await $fetch("/web/api/api_login",{method:"POST",body:{account:o.account,password:o.password}});s.code===0&&s.data?(a.setLoginData(s.data),c.push("/dashboard")):n.value=s.msg||"登录失败"}catch{n.value="网络错误,请检查连接"}finally{l.value=!1}}return(s,t)=>(p(),r("div",A,[e("div",B,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(g,["prevent"])},[e("div",j,[t[5]||(t[5]=e("label",{class:"login-label"},"账号",-1)),v(e("input",{"onUpdate:modelValue":t[0]||(t[0]=i=>o.account=i),type:"text",class:"login-input",placeholder:"请输入管理员账号",autocomplete:"username",required:""},null,512),[[f,o.account]])]),e("div",q,[t[6]||(t[6]=e("label",{class:"login-label"},"密码",-1)),v(e("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>o.password=i),type:"password",class:"login-input",placeholder:"请输入密码",autocomplete:"current-password",required:""},null,512),[[f,o.password]])]),e("button",{type:"submit",class:k(["login-btn",{loading:l.value}])},d(l.value?"登录中...":"登 录"),3)],32),t[7]||(t[7]=e("p",{style:{"text-align":"center","font-size":"11px",color:"#94A3B8","margin-top":"24px"}}," © 2025 Admin Console · v1.0.1 ",-1))])]))}}),O=z(D,[["__scopeId","data-v-4f88fb34"]]);export{O as default}; |
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@ |
|||||
import{_ as s}from"./DBs5psLk.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./DMxDLVSv.js";import{u as f}from"./CYxZMiFx.js";const p={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},m={class:"max-w-520px text-center"},h=["textContent"],b=["textContent"],x=["textContent"],g={class:"flex items-center justify-center w-full"},y={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:404},statusText:{type:String,default:"Page not found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(e){const r=e;return f({title:`${r.status} - ${r.statusText} | ${r.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(k,_)=>{const o=s;return i(),u("div",p,[t("div",m,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:n(e.status)},null,8,h),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:n(e.statusText)},null,8,b),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:n(e.description)},null,8,x),t("div",g,[c(o,{to:"/",class:"font-medium hover:text-[#00DC82] text-sm underline underline-offset-3"},{default:l(()=>[d(n(e.backHome),1)]),_:1})])])])}}},z=a(y,[["__scopeId","data-v-52418c85"]]);export{z as default}; |
import{_ as s}from"./32rNuZwS.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./DSy_gLdM.js";import{u as f}from"./obp34o1K.js";const p={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},m={class:"max-w-520px text-center"},h=["textContent"],b=["textContent"],x=["textContent"],g={class:"flex items-center justify-center w-full"},y={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:404},statusText:{type:String,default:"Page not found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(e){const r=e;return f({title:`${r.status} - ${r.statusText} | ${r.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(k,_)=>{const o=s;return i(),u("div",p,[t("div",m,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:n(e.status)},null,8,h),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:n(e.statusText)},null,8,b),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:n(e.description)},null,8,x),t("div",g,[c(o,{to:"/",class:"font-medium hover:text-[#00DC82] text-sm underline underline-offset-3"},{default:l(()=>[d(n(e.backHome),1)]),_:1})])])])}}},z=a(y,[["__scopeId","data-v-52418c85"]]);export{z as default}; |
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@ |
|||||
import{L as y,l as x}from"./DD3V9C6_.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,A as h,o as s,d as B,_ as N}from"./DMxDLVSv.js";const L={class:"lang-select"},O={class:"lang-chip-name"},S=["onClick"],j={key:0,class:"lang-empty"},A={key:0,class:"lang-dd"},F={class:"lang-dd-sum"},I={class:"lang-dd-panel"},T=["checked","onChange"],$={class:"lang-opt-code"},w={class:"lang-opt-name"},z=["value","disabled"],D=["value"],E=V({__name:"LangSelect",props:{modelValue:{},multiple:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},options:{default:void 0}},emits:["update:modelValue"],setup(c,{emit:f}){const d=c,m=f,p=h(()=>d.options&&d.options.length?d.options:y),i=h(()=>(d.modelValue||"").split(",").map(a=>a.trim()).filter(Boolean));function v(a){return x(a)}function _(a){if(d.disabled)return;const n=i.value.slice(),e=n.indexOf(a);e>=0?n.splice(e,1):n.push(a),m("update:modelValue",n.join(","))}function b(a){m("update:modelValue",a.target.value)}return(a,n)=>(s(),t("div",L,[c.multiple?(s(),t(u,{key:0},[l("div",{class:C(["lang-chips",{"lang-disabled":c.disabled}])},[(s(!0),t(u,null,r(i.value,e=>(s(),t("span",{key:e,class:"lang-chip"},[B(o(e),1),l("span",O,o(v(e)),1),l("button",{type:"button",class:"lang-x",onClick:k=>_(e)},"×",8,S)]))),128)),i.value.length?g("",!0):(s(),t("span",j,"未选择语言"))],2),c.disabled?g("",!0):(s(),t("details",A,[l("summary",F,"+ 选择语言(已选 "+o(i.value.length)+")",1),l("div",I,[(s(!0),t(u,null,r(p.value,e=>(s(),t("label",{key:e.code,class:"lang-opt"},[l("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:i.value.includes(e.code),onChange:k=>_(e.code)},null,40,T),l("span",$,o(e.code),1),l("span",w,o(e.name),1)]))),128))])]))],64)):(s(),t("select",{key:1,class:"select select-bordered select-sm w-full text-xs",value:c.modelValue,disabled:c.disabled,onChange:b},[n[0]||(n[0]=l("option",{value:""},"(未设置)",-1)),(s(!0),t(u,null,r(p.value,e=>(s(),t("option",{key:e.code,value:e.code},o(e.code)+" · "+o(e.name),9,D))),128))],40,z))]))}}),q=Object.assign(N(E,[["__scopeId","data-v-4903af59"]]),{__name:"LangSelect"});export{q as _}; |
import{L as y,l as x}from"./DD3V9C6_.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,A as h,o as s,d as B,_ as N}from"./DSy_gLdM.js";const L={class:"lang-select"},O={class:"lang-chip-name"},S=["onClick"],j={key:0,class:"lang-empty"},A={key:0,class:"lang-dd"},F={class:"lang-dd-sum"},I={class:"lang-dd-panel"},T=["checked","onChange"],$={class:"lang-opt-code"},w={class:"lang-opt-name"},z=["value","disabled"],D=["value"],E=V({__name:"LangSelect",props:{modelValue:{},multiple:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},options:{default:void 0}},emits:["update:modelValue"],setup(c,{emit:f}){const d=c,m=f,p=h(()=>d.options&&d.options.length?d.options:y),i=h(()=>(d.modelValue||"").split(",").map(a=>a.trim()).filter(Boolean));function v(a){return x(a)}function _(a){if(d.disabled)return;const n=i.value.slice(),e=n.indexOf(a);e>=0?n.splice(e,1):n.push(a),m("update:modelValue",n.join(","))}function b(a){m("update:modelValue",a.target.value)}return(a,n)=>(s(),t("div",L,[c.multiple?(s(),t(u,{key:0},[l("div",{class:C(["lang-chips",{"lang-disabled":c.disabled}])},[(s(!0),t(u,null,r(i.value,e=>(s(),t("span",{key:e,class:"lang-chip"},[B(o(e),1),l("span",O,o(v(e)),1),l("button",{type:"button",class:"lang-x",onClick:k=>_(e)},"×",8,S)]))),128)),i.value.length?g("",!0):(s(),t("span",j,"未选择语言"))],2),c.disabled?g("",!0):(s(),t("details",A,[l("summary",F,"+ 选择语言(已选 "+o(i.value.length)+")",1),l("div",I,[(s(!0),t(u,null,r(p.value,e=>(s(),t("label",{key:e.code,class:"lang-opt"},[l("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:i.value.includes(e.code),onChange:k=>_(e.code)},null,40,T),l("span",$,o(e.code),1),l("span",w,o(e.name),1)]))),128))])]))],64)):(s(),t("select",{key:1,class:"select select-bordered select-sm w-full text-xs",value:c.modelValue,disabled:c.disabled,onChange:b},[n[0]||(n[0]=l("option",{value:""},"(未设置)",-1)),(s(!0),t(u,null,r(p.value,e=>(s(),t("option",{key:e.code,value:e.code},o(e.code)+" · "+o(e.name),9,D))),128))],40,z))]))}}),q=Object.assign(N(E,[["__scopeId","data-v-4903af59"]]),{__name:"LangSelect"});export{q as _}; |
||||
File diff suppressed because one or more lines are too long
@ -1 +1 @@ |
|||||
import{_ as t,o,c as s,R as c}from"./DMxDLVSv.js";const r={},a={class:"min-h-screen","data-theme":"corporate"};function n(e,_){return o(),s("div",a,[c(e.$slots,"default")])}const l=t(r,[["render",n]]);export{l as default}; |
import{_ as t,o,c as s,R as c}from"./DSy_gLdM.js";const r={},a={class:"min-h-screen","data-theme":"corporate"};function n(e,_){return o(),s("div",a,[c(e.$slots,"default")])}const l=t(r,[["render",n]]);export{l as default}; |
||||
@ -1 +1 @@ |
|||||
import{_ as o,o as s,c as a,a as t,t as r}from"./DMxDLVSv.js";import{u as i}from"./CYxZMiFx.js";const u={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},c={class:"max-w-520px text-center"},l=["textContent"],d=["textContent"],p=["textContent"],f={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:500},statusText:{type:String,default:"Internal server error"},description:{type:String,default:"This page is temporarily unavailable."},refresh:{type:String,default:"Refresh this page"}},setup(e){const n=e;return i({title:`${n.status} - ${n.statusText} | ${n.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(h,m)=>(s(),a("div",u,[t("div",c,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:r(e.status)},null,8,l),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:r(e.statusText)},null,8,d),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:r(e.description)},null,8,p)])]))}},x=o(f,[["__scopeId","data-v-2c2ce9e3"]]);export{x as default}; |
import{_ as o,o as s,c as a,a as t,t as r}from"./DSy_gLdM.js";import{u as i}from"./obp34o1K.js";const u={class:"antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"},c={class:"max-w-520px text-center"},l=["textContent"],d=["textContent"],p=["textContent"],f={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},status:{type:Number,default:500},statusText:{type:String,default:"Internal server error"},description:{type:String,default:"This page is temporarily unavailable."},refresh:{type:String,default:"Refresh this page"}},setup(e){const n=e;return i({title:`${n.status} - ${n.statusText} | ${n.appName}`,script:[{innerHTML:`!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`}],style:[{innerHTML:'*,:after,:before{box-sizing:border-box;border-width:0;border-style:solid;border-color:var(--un-default-border-color,#e5e7eb)}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}h1,h2{font-size:inherit;font-weight:inherit}h1,h2,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }'}]}),(h,m)=>(s(),a("div",u,[t("div",c,[t("h1",{class:"font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]",textContent:r(e.status)},null,8,l),t("h2",{class:"font-semibold mb-2 sm:text-3xl text-2xl",textContent:r(e.statusText)},null,8,d),t("p",{class:"mb-4 px-2 text-[#64748B] text-md",textContent:r(e.description)},null,8,p)])]))}},x=o(f,[["__scopeId","data-v-2c2ce9e3"]]);export{x as default}; |
||||
File diff suppressed because one or more lines are too long
@ -1 +1 @@ |
|||||
import{g as t,C as n,P as a,c as o,a as s,o as c}from"./DMxDLVSv.js";const i={class:"py-16 text-center text-slate-400"},m=t({__name:"mcpconfig",setup(l){return n(()=>{a("/serviceconfig")}),(r,e)=>(c(),o("div",i,[...e[0]||(e[0]=[s("span",{class:"loading loading-spinner loading-sm"},null,-1),s("p",{class:"text-sm mt-3"},"MCP 配置已并入「第三方服务配置」,正在跳转…",-1)])]))}});export{m as default}; |
import{g as t,C as n,P as a,c as o,a as s,o as c}from"./DSy_gLdM.js";const i={class:"py-16 text-center text-slate-400"},m=t({__name:"mcpconfig",setup(l){return n(()=>{a("/serviceconfig")}),(r,e)=>(c(),o("div",i,[...e[0]||(e[0]=[s("span",{class:"loading loading-spinner loading-sm"},null,-1),s("p",{class:"text-sm mt-3"},"MCP 配置已并入「第三方服务配置」,正在跳转…",-1)])]))}});export{m as default}; |
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,2 +1,2 @@ |
|||||
import{u as r}from"./B-sqZCu-.js";import{g as x,c as i,a as t,t as o,l as f,o as l}from"./DMxDLVSv.js";const b={key:0,class:"modal modal-open"},u={class:"modal-box max-w-md"},p={class:"font-bold text-base mb-1"},y={class:"rounded-xl border border-slate-200 bg-slate-50 p-3 space-y-2"},g={class:"flex items-center justify-between gap-3"},v={class:"font-mono font-semibold text-sm"},_={class:"flex items-center justify-between gap-3"},w={class:"font-mono font-semibold text-sm"},h={key:0,class:"mt-3 text-xs text-emerald-600"},k={key:1,class:"mt-3 text-xs text-amber-600"},C={class:"modal-action"},T=x({__name:"AccountCredentialDialog",props:{info:{}},emits:["close"],setup(s){const n=s,{success:c,warn:m}=r();async function d(){if(!n.info)return;const a=`用户名:${n.info.username} |
import{u as r}from"./EeX3zgoF.js";import{g as x,c as i,a as t,t as o,l as f,o as l}from"./DSy_gLdM.js";const b={key:0,class:"modal modal-open"},u={class:"modal-box max-w-md"},p={class:"font-bold text-base mb-1"},y={class:"rounded-xl border border-slate-200 bg-slate-50 p-3 space-y-2"},g={class:"flex items-center justify-between gap-3"},v={class:"font-mono font-semibold text-sm"},_={class:"flex items-center justify-between gap-3"},w={class:"font-mono font-semibold text-sm"},h={key:0,class:"mt-3 text-xs text-emerald-600"},k={key:1,class:"mt-3 text-xs text-amber-600"},C={class:"modal-action"},T=x({__name:"AccountCredentialDialog",props:{info:{}},emits:["close"],setup(s){const n=s,{success:c,warn:m}=r();async function d(){if(!n.info)return;const a=`用户名:${n.info.username} |
||||
初始密码:${n.info.password}`;try{await navigator.clipboard.writeText(a),c("凭据已复制")}catch{m("复制失败,请手工记录")}}return(a,e)=>s.info?(l(),i("div",b,[t("div",u,[t("h3",p,o(s.info.title),1),e[3]||(e[3]=t("p",{class:"text-xs text-slate-400 mb-3"},"初始密码仅在此显示一次,关闭后无法再查看(如需重设请到「后台账号」改密)。",-1)),t("div",y,[t("div",g,[e[1]||(e[1]=t("span",{class:"text-xs text-slate-500"},"登录用户名",-1)),t("span",v,o(s.info.username),1)]),t("div",_,[e[2]||(e[2]=t("span",{class:"text-xs text-slate-500"},"初始密码",-1)),t("span",w,o(s.info.password),1)])]),s.info.mailTo?(l(),i("div",h," ✓ 凭据已邮件发送至 "+o(s.info.mailTo),1)):(l(),i("div",k," ⚠ 凭据未能邮件送达"+o(s.info.mailError?":"+s.info.mailError:"")+",请手工转达上面的用户名和密码。 ",1)),t("div",C,[t("button",{class:"btn btn-ghost btn-sm",onClick:d},"复制"),t("button",{class:"btn btn-primary btn-sm text-white",onClick:e[0]||(e[0]=$=>a.$emit("close"))},"我已记录,关闭")])])])):f("",!0)}}),D=Object.assign(T,{__name:"AccountCredentialDialog"});export{D as _};
|
初始密码:${n.info.password}`;try{await navigator.clipboard.writeText(a),c("凭据已复制")}catch{m("复制失败,请手工记录")}}return(a,e)=>s.info?(l(),i("div",b,[t("div",u,[t("h3",p,o(s.info.title),1),e[3]||(e[3]=t("p",{class:"text-xs text-slate-400 mb-3"},"初始密码仅在此显示一次,关闭后无法再查看(如需重设请到「后台账号」改密)。",-1)),t("div",y,[t("div",g,[e[1]||(e[1]=t("span",{class:"text-xs text-slate-500"},"登录用户名",-1)),t("span",v,o(s.info.username),1)]),t("div",_,[e[2]||(e[2]=t("span",{class:"text-xs text-slate-500"},"初始密码",-1)),t("span",w,o(s.info.password),1)])]),s.info.mailTo?(l(),i("div",h," ✓ 凭据已邮件发送至 "+o(s.info.mailTo),1)):(l(),i("div",k," ⚠ 凭据未能邮件送达"+o(s.info.mailError?":"+s.info.mailError:"")+",请手工转达上面的用户名和密码。 ",1)),t("div",C,[t("button",{class:"btn btn-ghost btn-sm",onClick:d},"复制"),t("button",{class:"btn btn-primary btn-sm text-white",onClick:e[0]||(e[0]=$=>a.$emit("close"))},"我已记录,关闭")])])])):f("",!0)}}),D=Object.assign(T,{__name:"AccountCredentialDialog"});export{D as _};
|
||||
File diff suppressed because one or more lines are too long
@ -1,4 +1,4 @@ |
|||||
import{g as G,C as K,Q as P,c as a,a as e,d as u,q as g,s as U,F as f,r as B,v as Q,x as Y,t as n,y as i,A as E,o,n as F,l as A,_ as Z}from"./DMxDLVSv.js";import{u as J}from"./CCZrj3X-.js";import{u as W}from"./B-sqZCu-.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},_t={key:1,class:"muted"},gt={class:"muted"},xt={class:"muted"},yt={class:"muted"},bt={class:"muted"},ht={key:0,class:"muted"},wt={class:"t"},kt={key:0,class:"late"},Ct=G({__name:"statlog",setup(Tt){const{webApi:I}=J(),{success:O,error:R}=W(),H={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?H[l]||l:"-"}const c=i([]),x=i(!1),_=i(""),L=i("-"),N=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function S(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const V=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function M(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function j(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+S(t.product_id)+" "+(t.channel_id||"")+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){x.value=!0,_.value="";try{const l=await I("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){_.value=l?.message||"网络异常"}finally{x.value=!1}}async function q(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗?
|
import{g as G,C as K,Q as P,c as a,a as e,d as u,q as g,s as U,F as f,r as B,v as Q,x as Y,t as n,y as i,A as E,o,n as F,l as A,_ as Z}from"./DSy_gLdM.js";import{u as J}from"./NtXZuCUg.js";import{u as W}from"./EeX3zgoF.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},_t={key:1,class:"muted"},gt={class:"muted"},xt={class:"muted"},yt={class:"muted"},bt={class:"muted"},ht={key:0,class:"muted"},wt={class:"t"},kt={key:0,class:"late"},Ct=G({__name:"statlog",setup(Tt){const{webApi:I}=J(),{success:O,error:R}=W(),H={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?H[l]||l:"-"}const c=i([]),x=i(!1),_=i(""),L=i("-"),N=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function S(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const V=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function M(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function j(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+S(t.product_id)+" "+(t.channel_id||"")+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){x.value=!0,_.value="";try{const l=await I("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){_.value=l?.message||"网络异常"}finally{x.value=!1}}async function q(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗?
|
||||
|
|
||||
只清除本核对面板的记录,不影响已落库的统计数据。 |
只清除本核对面板的记录,不影响已落库的统计数据。 |
||||
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await I("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function z(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return K(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[g(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,B(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[U,v.value,void 0,{number:!0}]]),g(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[U,b.value]]),g(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品/渠道商"},null,512),[[Q,h.value]]),e("label",st,[g(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:z},null,544),[[Y,w.value]]),s[5]||(s[5]=u(" 自动刷新 ",-1))]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:m},"刷新"),e("button",{class:"btn btn-outline btn-error btn-sm",title:"清空本日核对流水(不影响已落库的统计数据),清空后可重新观察埋点是否正常进来",onClick:q},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(N.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品 · 渠道商"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[x.value?(o(),a("div",ct,"加载中...")):_.value?(o(),a("div",dt,"加载失败:"+n(_.value),1)):T.value.length?(o(!0),a(f,{key:3},B(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",M(t.level).cls])},n(M(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?A("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",_t,"(无应用名)")),e("span",gt," · "+n(D(t.region)),1),e("span",xt," · "+n(S(t.product_id)),1),e("span",yt," · "+n(t.channel_id||"未分配渠道"),1)]),e("div",bt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",ht," · "+n(t.summary),1)):A("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",wt,[u(n(C(t.snap_ts)),1),j(t)?(o(),a("span",kt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):A("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=Z(Ct,[["__scopeId","data-v-e7a3debc"]]);export{Lt as default};
|
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await I("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function z(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return K(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[g(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,B(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[U,v.value,void 0,{number:!0}]]),g(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[U,b.value]]),g(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品/渠道商"},null,512),[[Q,h.value]]),e("label",st,[g(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:z},null,544),[[Y,w.value]]),s[5]||(s[5]=u(" 自动刷新 ",-1))]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:m},"刷新"),e("button",{class:"btn btn-outline btn-error btn-sm",title:"清空本日核对流水(不影响已落库的统计数据),清空后可重新观察埋点是否正常进来",onClick:q},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(N.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品 · 渠道商"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[x.value?(o(),a("div",ct,"加载中...")):_.value?(o(),a("div",dt,"加载失败:"+n(_.value),1)):T.value.length?(o(!0),a(f,{key:3},B(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",M(t.level).cls])},n(M(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?A("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",_t,"(无应用名)")),e("span",gt," · "+n(D(t.region)),1),e("span",xt," · "+n(S(t.product_id)),1),e("span",yt," · "+n(t.channel_id||"未分配渠道"),1)]),e("div",bt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",ht," · "+n(t.summary),1)):A("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",wt,[u(n(C(t.snap_ts)),1),j(t)?(o(),a("span",kt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):A("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=Z(Ct,[["__scopeId","data-v-e7a3debc"]]);export{Lt as default};
|
||||
@ -1 +1 @@ |
|||||
import{b as a}from"./CCZrj3X-.js";let i=0;function f(){const o=a("app:toasts",()=>[]);function e(s,t="info",r=3e3){const n=++i;o.value.push({id:n,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(u=>u.id!==n)},r)}return{toasts:o,toast:e,success:(s,t)=>e(s,"success",t),error:(s,t)=>e(s,"error",t),info:(s,t)=>e(s,"info",t),warn:(s,t)=>e(s,"warning",t)}}export{f as u}; |
import{b as a}from"./NtXZuCUg.js";let i=0;function f(){const o=a("app:toasts",()=>[]);function e(s,t="info",r=3e3){const n=++i;o.value.push({id:n,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(u=>u.id!==n)},r)}return{toasts:o,toast:e,success:(s,t)=>e(s,"success",t),error:(s,t)=>e(s,"error",t),info:(s,t)=>e(s,"info",t),warn:(s,t)=>e(s,"warning",t)}}export{f as u}; |
||||
File diff suppressed because one or more lines are too long
@ -1 +1 @@ |
|||||
import{e as y,a9 as h,aa as w,A as g,j as d,k}from"./DMxDLVSv.js";const A="$s";function b(...t){const s=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(s);const[a,o]=t;if(!a||typeof a!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+a);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const i=A+a,r=y(),n=h(r.payload.state,i);if(o&&(r._state[i]??={_default:o}),n.value===void 0&&o){const e=o();if(w(e))return r.payload.state[i]=e,e;n.value=e}return n}function m(){const t=b("app:loading",()=>0),s=g(()=>t.value>0);function a(){t.value++}function o(){t.value=Math.max(0,t.value-1)}return{count:t,loading:s,begin:a,end:o}}async function f(t,s,a){const o=d(),i=k(),r={"Content-Type":"application/json"};o.token&&(r.Authorization=o.token),a&&Object.assign(r,a);const n=await fetch(t,{method:"POST",headers:r,body:JSON.stringify(s)});if(!n.ok)throw new Error(`HTTP error: ${n.status}`);const e=await n.json();if(e.code===18)throw o.logout(),i.push("/"),new Error(e.msg||"Unauthorized");if(e.code!==0)throw new Error(e.msg||"Unknown error");return e.data}const S=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function v(t){return!S.test(t)}function x(){const t=d(),{begin:s,end:a}=m();async function o(n,e){const u={};if(t.currentAppId&&(u["X-App-Id"]=String(t.currentAppId)),!v(n))return f(`/web/api/api_${n}`,e??{},u);s();try{return await f(`/web/api/api_${n}`,e??{},u)}finally{a()}}async function i(n,e){return f(`/console/api/${n}`,e??{})}async function r(n,e){const u=n.type||"application/octet-stream",c=await o("getcostoken",{path:e,filename:n.name,content_type:u}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":u},body:n});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:o,consoleApi:i,uploadFile:r}}export{m as a,b,x as u}; |
import{e as y,a9 as h,aa as w,A as g,j as d,k}from"./DSy_gLdM.js";const A="$s";function b(...t){const s=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(s);const[a,o]=t;if(!a||typeof a!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+a);if(o!==void 0&&typeof o!="function")throw new Error("[nuxt] [useState] init must be a function: "+o);const i=A+a,r=y(),n=h(r.payload.state,i);if(o&&(r._state[i]??={_default:o}),n.value===void 0&&o){const e=o();if(w(e))return r.payload.state[i]=e,e;n.value=e}return n}function m(){const t=b("app:loading",()=>0),s=g(()=>t.value>0);function a(){t.value++}function o(){t.value=Math.max(0,t.value-1)}return{count:t,loading:s,begin:a,end:o}}async function f(t,s,a){const o=d(),i=k(),r={"Content-Type":"application/json"};o.token&&(r.Authorization=o.token),a&&Object.assign(r,a);const n=await fetch(t,{method:"POST",headers:r,body:JSON.stringify(s)});if(!n.ok)throw new Error(`HTTP error: ${n.status}`);const e=await n.json();if(e.code===18)throw o.logout(),i.push("/"),new Error(e.msg||"Unauthorized");if(e.code!==0)throw new Error(e.msg||"Unknown error");return e.data}const S=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function v(t){return!S.test(t)}function x(){const t=d(),{begin:s,end:a}=m();async function o(n,e){const u={};if(t.currentAppId&&(u["X-App-Id"]=String(t.currentAppId)),!v(n))return f(`/web/api/api_${n}`,e??{},u);s();try{return await f(`/web/api/api_${n}`,e??{},u)}finally{a()}}async function i(n,e){return f(`/console/api/${n}`,e??{})}async function r(n,e){const u=n.type||"application/octet-stream",c=await o("getcostoken",{path:e,filename:n.name,content_type:u}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":u},body:n});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:o,consoleApi:i,uploadFile:r}}export{m as a,b,x as u}; |
||||
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@ |
|||||
.type-tag[data-v-4a81d81a]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-4a81d81a]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-4a81d81a]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-4a81d81a]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-4a81d81a]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-4a81d81a]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ag-box[data-v-4a81d81a]{background:#fff;border-radius:18px;padding:24px;width:780px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-4a81d81a]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-4a81d81a]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-4a81d81a]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-4a81d81a]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-4a81d81a]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-4a81d81a]{display:inline-block;margin-left:6px}.ed-tip[data-v-4a81d81a]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-4a81d81a]{color:#dc2626;font-style:normal}.type-row[data-v-4a81d81a]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-4a81d81a]{display:flex;flex-direction:column;gap:3px;padding:11px 12px;border-radius:10px;border:1.5px solid #e2e8f0;background:#fff;cursor:pointer;transition:all .15s;text-align:left}.ttab[data-v-4a81d81a]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-4a81d81a]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-4a81d81a]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-4a81d81a]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-4a81d81a]{font-size:10px;color:#94a3b8}.slot-row[data-v-4a81d81a]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-4a81d81a]{flex:1;min-width:0}.slot-arrow[data-v-4a81d81a]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-4a81d81a]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.voice-row[data-v-4a81d81a]{gap:8px;margin-bottom:6px}.ed-footer[data-v-4a81d81a],.voice-row[data-v-4a81d81a]{display:flex;align-items:center}.ed-footer[data-v-4a81d81a]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-4a81d81a]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-4a81d81a]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-4a81d81a]{display:none}} |
|
||||
@ -0,0 +1 @@ |
|||||
|
.type-tag[data-v-dcf87e76]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-dcf87e76]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-dcf87e76]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-dcf87e76]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-dcf87e76]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-dcf87e76]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ag-box[data-v-dcf87e76]{background:#fff;border-radius:18px;padding:24px;width:780px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-dcf87e76]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-dcf87e76]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-dcf87e76]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-dcf87e76]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-dcf87e76]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-dcf87e76]{display:inline-block;margin-left:6px}.ed-tip[data-v-dcf87e76]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-dcf87e76]{color:#dc2626;font-style:normal}.type-row[data-v-dcf87e76]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-dcf87e76]{display:flex;flex-direction:column;gap:3px;padding:11px 12px;border-radius:10px;border:1.5px solid #e2e8f0;background:#fff;cursor:pointer;transition:all .15s;text-align:left}.ttab[data-v-dcf87e76]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-dcf87e76]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-dcf87e76]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-dcf87e76]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-dcf87e76]{font-size:10px;color:#94a3b8}.slot-row[data-v-dcf87e76]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-dcf87e76]{flex:1;min-width:0}.slot-arrow[data-v-dcf87e76]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-dcf87e76]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.var-row[data-v-dcf87e76],.voice-row[data-v-dcf87e76]{display:flex;align-items:center;gap:8px;margin-bottom:6px}.mcp-grid[data-v-dcf87e76]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px}.mcp-item[data-v-dcf87e76]{display:flex;align-items:center;gap:8px;min-width:0;padding:7px 10px;border:1.5px solid #e2e8f0;border-radius:9px;font-size:12.5px;color:#475569;cursor:pointer;transition:all .15s}.mcp-item[data-v-dcf87e76]:hover{border-color:#c7d2fe;background:#f8fafc}.mcp-item.on[data-v-dcf87e76]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.ed-footer[data-v-dcf87e76]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-dcf87e76]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-dcf87e76]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-dcf87e76]{display:none}} |
||||
@ -1 +1 @@ |
|||||
{"id":"997f9c5b-5ea7-4cda-a9d8-aeefc19242d7","timestamp":1786585621230} |
{"id":"12df8bde-c7e1-423a-8c26-514d561b95ec","timestamp":1786697524151} |
||||
@ -0,0 +1 @@ |
|||||
|
{"id":"12df8bde-c7e1-423a-8c26-514d561b95ec","timestamp":1786697524151,"prerendered":[]} |
||||
@ -1 +0,0 @@ |
|||||
{"id":"997f9c5b-5ea7-4cda-a9d8-aeefc19242d7","timestamp":1786585621230,"prerendered":[]} |
|
||||
@ -1 +0,0 @@ |
|||||
.rule-list[data-v-c0bab860]{background:#fff;border:1px solid #eef2f7;border-radius:14px;overflow:hidden}.rule-head[data-v-c0bab860],.rule-row[data-v-c0bab860]{display:grid;grid-template-columns:92px 1fr 220px 92px 160px;gap:12px;align-items:center;padding:11px 16px}.rule-head[data-v-c0bab860]{font-size:11px;font-weight:700;color:#94a3b8;background:#f8fafc;border-bottom:1px solid #eef2f7}.rule-row[data-v-c0bab860]{border-bottom:1px solid #f6f8fb;cursor:pointer;transition:background .15s}.rule-row[data-v-c0bab860]:last-child{border-bottom:none}.rule-row[data-v-c0bab860]:hover{background:#f8fafc}.rule-row.off[data-v-c0bab860]{opacity:.55}.prio-cell[data-v-c0bab860]{display:flex;align-items:baseline;gap:6px}.prio[data-v-c0bab860]{font-size:15px;font-weight:800;color:#4338ca}.order[data-v-c0bab860]{font-size:10px;color:#cbd5e1}.cond-cell[data-v-c0bab860]{min-width:0}.agent-cell[data-v-c0bab860]{display:flex;align-items:center;gap:6px;min-width:0}.lang-badge[data-v-c0bab860]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.lang-badge.any[data-v-c0bab860]{background:#f1f5f9;color:#64748b;font-style:italic}.type-badge[data-v-c0bab860]{font-size:10px;font-weight:700;padding:2px 7px;border-radius:5px;white-space:nowrap}.editor-panel[data-v-c0bab860]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.region-chip[data-v-c0bab860]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-c0bab860]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-c0bab860]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-c0bab860]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-c0bab860]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-c0bab860]{font-size:11px;color:#b45309;margin-top:8px}.req[data-v-c0bab860]{color:#dc2626;font-style:normal}.any-toggle[data-v-c0bab860]{gap:5px;font-size:11px;cursor:pointer}.any-box[data-v-c0bab860],.any-toggle[data-v-c0bab860]{display:flex;align-items:center;color:#64748b}.any-box[data-v-c0bab860]{height:34px;padding:0 12px;border-radius:8px;border:1.5px dashed #cbd5e1;background:#f8fafc;font-size:12px;font-style:italic}.lang-row[data-v-c0bab860]{display:grid;grid-template-columns:1fr 92px 1fr;align-items:start;gap:12px}.lang-field[data-v-c0bab860]{min-width:0}.dir-col[data-v-c0bab860]{display:flex;flex-direction:column;align-items:center;gap:4px;padding-top:22px}.dir-btn[data-v-c0bab860]{width:46px;height:32px;border-radius:9px;border:1.5px solid #e2e8f0;background:#f8fafc;color:#64748b;font-size:17px;line-height:1;cursor:pointer;transition:all .15s}.dir-btn[data-v-c0bab860]:hover{border-color:#c7d2fe;background:#f5f3ff;color:#4338ca}.dir-btn.on[data-v-c0bab860]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.dir-tip[data-v-c0bab860]{font-size:10px;color:#94a3b8;white-space:nowrap}.agent-preview[data-v-c0bab860]{gap:8px;margin-top:10px;padding:8px 12px;border-radius:9px;background:#f8fafc;border:1px solid #eef2f7}.agent-preview[data-v-c0bab860],.ed-footer[data-v-c0bab860]{display:flex;align-items:center;flex-wrap:wrap}.ed-footer[data-v-c0bab860]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}.ct-overlay[data-v-c0bab860]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ct-box[data-v-c0bab860]{background:#fff;border-radius:20px;padding:28px;width:560px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-c0bab860]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-c0bab860]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;font-size:13px;font-weight:500;color:#475569}.sync-region-item[data-v-c0bab860]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-c0bab860]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.test-result[data-v-c0bab860]{margin-top:14px;padding:12px 14px;border-radius:10px;background:#eef2ff;border:1px solid #c7d2fe}.test-result.miss[data-v-c0bab860]{background:#fffbeb;border-color:#fde68a}@media(max-width:1000px){.rule-head[data-v-c0bab860],.rule-row[data-v-c0bab860]{grid-template-columns:70px 1fr 150px}.rule-head[data-v-c0bab860]>:nth-child(4),.rule-row[data-v-c0bab860]>:nth-child(4){display:none}}@media(max-width:860px){.lang-row[data-v-c0bab860]{grid-template-columns:1fr}.dir-col[data-v-c0bab860]{flex-direction:row;padding-top:0}} |
|
||||
@ -0,0 +1 @@ |
|||||
|
.rule-list[data-v-0fc4ec7d]{background:#fff;border:1px solid #eef2f7;border-radius:14px;overflow:hidden}.rule-head[data-v-0fc4ec7d],.rule-row[data-v-0fc4ec7d]{display:grid;grid-template-columns:92px 1fr 220px 92px 160px;gap:12px;align-items:center;padding:11px 16px}.rule-head[data-v-0fc4ec7d]{font-size:11px;font-weight:700;color:#94a3b8;background:#f8fafc;border-bottom:1px solid #eef2f7}.rule-row[data-v-0fc4ec7d]{border-bottom:1px solid #f6f8fb;cursor:pointer;transition:background .15s}.rule-row[data-v-0fc4ec7d]:last-child{border-bottom:none}.rule-row[data-v-0fc4ec7d]:hover{background:#f8fafc}.rule-row.off[data-v-0fc4ec7d]{opacity:.55}.prio-cell[data-v-0fc4ec7d]{display:flex;align-items:baseline;gap:6px}.prio[data-v-0fc4ec7d]{font-size:15px;font-weight:800;color:#4338ca}.order[data-v-0fc4ec7d]{font-size:10px;color:#cbd5e1}.cond-cell[data-v-0fc4ec7d]{min-width:0}.agent-cell[data-v-0fc4ec7d]{display:flex;align-items:center;gap:6px;min-width:0}.lang-badge[data-v-0fc4ec7d]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.lang-badge.any[data-v-0fc4ec7d]{background:#f1f5f9;color:#64748b;font-style:italic}.type-badge[data-v-0fc4ec7d]{font-size:10px;font-weight:700;padding:2px 7px;border-radius:5px;white-space:nowrap}.editor-panel[data-v-0fc4ec7d]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.region-chip[data-v-0fc4ec7d]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-0fc4ec7d]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-0fc4ec7d]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-0fc4ec7d]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-0fc4ec7d]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-0fc4ec7d]{font-size:11px;color:#b45309;margin-top:8px}.req[data-v-0fc4ec7d]{color:#dc2626;font-style:normal}.any-toggle[data-v-0fc4ec7d]{gap:5px;font-size:11px;cursor:pointer}.any-box[data-v-0fc4ec7d],.any-toggle[data-v-0fc4ec7d]{display:flex;align-items:center;color:#64748b}.any-box[data-v-0fc4ec7d]{height:34px;padding:0 12px;border-radius:8px;border:1.5px dashed #cbd5e1;background:#f8fafc;font-size:12px;font-style:italic}.lang-row[data-v-0fc4ec7d]{display:grid;grid-template-columns:1fr 92px 1fr;align-items:start;gap:12px}.lang-field[data-v-0fc4ec7d]{min-width:0}.dir-col[data-v-0fc4ec7d]{display:flex;flex-direction:column;align-items:center;gap:4px;padding-top:22px}.dir-btn[data-v-0fc4ec7d]{width:46px;height:32px;border-radius:9px;border:1.5px solid #e2e8f0;background:#f8fafc;color:#64748b;font-size:17px;line-height:1;cursor:pointer;transition:all .15s}.dir-btn[data-v-0fc4ec7d]:hover{border-color:#c7d2fe;background:#f5f3ff;color:#4338ca}.dir-btn.on[data-v-0fc4ec7d]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.dir-tip[data-v-0fc4ec7d]{font-size:10px;color:#94a3b8;white-space:nowrap}.agent-preview[data-v-0fc4ec7d]{gap:8px;margin-top:10px;padding:8px 12px;border-radius:9px;background:#f8fafc;border:1px solid #eef2f7}.agent-preview[data-v-0fc4ec7d],.ed-footer[data-v-0fc4ec7d]{display:flex;align-items:center;flex-wrap:wrap}.ed-footer[data-v-0fc4ec7d]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}.ct-overlay[data-v-0fc4ec7d]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ct-box[data-v-0fc4ec7d]{background:#fff;border-radius:20px;padding:28px;width:560px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-0fc4ec7d]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-0fc4ec7d]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;font-size:13px;font-weight:500;color:#475569}.sync-region-item[data-v-0fc4ec7d]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-0fc4ec7d]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.test-result[data-v-0fc4ec7d]{margin-top:14px;padding:12px 14px;border-radius:10px;background:#eef2ff;border:1px solid #c7d2fe}.test-result.miss[data-v-0fc4ec7d]{background:#fffbeb;border-color:#fde68a}@media(max-width:1000px){.rule-head[data-v-0fc4ec7d],.rule-row[data-v-0fc4ec7d]{grid-template-columns:70px 1fr 150px}.rule-head[data-v-0fc4ec7d]>:nth-child(4),.rule-row[data-v-0fc4ec7d]>:nth-child(4){display:none}}@media(max-width:860px){.lang-row[data-v-0fc4ec7d]{grid-template-columns:1fr}.dir-col[data-v-0fc4ec7d]{flex-direction:row;padding-top:0}} |
||||
@ -1 +0,0 @@ |
|||||
.group-tag[data-v-6057a5c9]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.ch-grid[data-v-6057a5c9]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.ch-card[data-v-6057a5c9]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.ch-card[data-v-6057a5c9]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.ch-card.off[data-v-6057a5c9]{opacity:.55}.ch-empty[data-v-6057a5c9]{border-style:dashed;background:#fafbfc;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:92px}.ch-empty[data-v-6057a5c9]:hover{border-color:#c7d2fe;background:#f8fafc}.status-badge[data-v-6057a5c9]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;white-space:nowrap}.ver-row[data-v-6057a5c9]{display:flex;gap:14px;margin-top:10px;flex-wrap:wrap}.ver-box[data-v-6057a5c9]{display:flex;flex-direction:column}.ver-label[data-v-6057a5c9]{font-size:10px;color:#94a3b8}.ver-val[data-v-6057a5c9]{font-size:13px;font-weight:700;color:#1e293b;font-family:SF Mono,Menlo,monospace}.ver-val.warn[data-v-6057a5c9]{color:#b45309}.ver-val.review[data-v-6057a5c9]{color:#7c3aed}.flag[data-v-6057a5c9]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#475569}.flag-warn[data-v-6057a5c9]{background:#fef3c7;color:#b45309}.flag-off[data-v-6057a5c9]{background:#fee2e2;color:#b91c1c}.pay-pill[data-v-6057a5c9]{font-size:10px;font-weight:600;padding:2px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.pay-pill.missing[data-v-6057a5c9]{background:#fef3c7;color:#b45309}.pay-warn[data-v-6057a5c9]{background:#fffbeb;border:1px solid #fde68a;color:#92400e;border-radius:12px;padding:12px 14px;margin-bottom:16px}.warn-pill[data-v-6057a5c9]{display:inline-block;margin-right:8px;padding:1px 8px;border-radius:6px;background:#fef3c7}.scope-tip[data-v-6057a5c9]{background:#f8fafc;border:1px solid #eef2f7;color:#64748b;font-size:12px;border-radius:10px;padding:9px 13px;margin-bottom:16px}.ch-overlay[data-v-6057a5c9]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ch-box[data-v-6057a5c9]{background:#fff;border-radius:18px;padding:24px;width:700px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-6057a5c9]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-6057a5c9]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-6057a5c9]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-6057a5c9]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-6057a5c9]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-6057a5c9]{color:#b45309}.ed-tip[data-v-6057a5c9],.ed-warn[data-v-6057a5c9]{font-size:11px;margin-top:8px}.ed-tip[data-v-6057a5c9]{color:#94a3b8}.req[data-v-6057a5c9]{color:#dc2626;font-style:normal}.link[data-v-6057a5c9]{color:#4f46e5;cursor:pointer;text-decoration:underline}.pay-grid[data-v-6057a5c9]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.pay-item[data-v-6057a5c9]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;font-size:13px;color:#475569;transition:all .15s}.pay-item[data-v-6057a5c9]:hover{border-color:#c7d2fe;background:#f8fafc}.pay-item.checked[data-v-6057a5c9]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.pay-miss[data-v-6057a5c9]{font-size:10px;color:#b45309;background:#fef3c7;padding:1px 5px;border-radius:4px;margin-left:auto}.ed-footer[data-v-6057a5c9]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.pay-grid[data-v-6057a5c9]{grid-template-columns:repeat(2,1fr)}} |
|
||||
@ -0,0 +1 @@ |
|||||
|
.group-tag[data-v-66a7d845]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.ch-grid[data-v-66a7d845]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.ch-card[data-v-66a7d845]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.ch-card[data-v-66a7d845]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.ch-card.off[data-v-66a7d845]{opacity:.55}.ch-empty[data-v-66a7d845]{border-style:dashed;background:#fafbfc;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:92px}.ch-empty[data-v-66a7d845]:hover{border-color:#c7d2fe;background:#f8fafc}.status-badge[data-v-66a7d845]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;white-space:nowrap}.ver-row[data-v-66a7d845]{display:flex;gap:14px;margin-top:10px;flex-wrap:wrap}.ver-box[data-v-66a7d845]{display:flex;flex-direction:column}.ver-label[data-v-66a7d845]{font-size:10px;color:#94a3b8}.ver-val[data-v-66a7d845]{font-size:13px;font-weight:700;color:#1e293b;font-family:SF Mono,Menlo,monospace}.ver-val.warn[data-v-66a7d845]{color:#b45309}.ver-val.review[data-v-66a7d845]{color:#7c3aed}.flag[data-v-66a7d845]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#475569}.flag-warn[data-v-66a7d845]{background:#fef3c7;color:#b45309}.flag-off[data-v-66a7d845]{background:#fee2e2;color:#b91c1c}.pay-pill[data-v-66a7d845]{font-size:10px;font-weight:600;padding:2px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.pay-pill.missing[data-v-66a7d845]{background:#fef3c7;color:#b45309}.pay-warn[data-v-66a7d845]{background:#fffbeb;border:1px solid #fde68a;color:#92400e;border-radius:12px;padding:12px 14px;margin-bottom:16px}.warn-pill[data-v-66a7d845]{display:inline-block;margin-right:8px;padding:1px 8px;border-radius:6px;background:#fef3c7}.scope-tip[data-v-66a7d845]{background:#f8fafc;border:1px solid #eef2f7;color:#64748b;font-size:12px;border-radius:10px;padding:9px 13px;margin-bottom:16px}.ch-overlay[data-v-66a7d845]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ch-box[data-v-66a7d845]{background:#fff;border-radius:18px;padding:24px;width:700px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-66a7d845]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-66a7d845]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-66a7d845]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-66a7d845]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-66a7d845]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-66a7d845]{color:#b45309}.ed-tip[data-v-66a7d845],.ed-warn[data-v-66a7d845]{font-size:11px;margin-top:8px}.ed-tip[data-v-66a7d845]{color:#94a3b8}.req[data-v-66a7d845]{color:#dc2626;font-style:normal}.link[data-v-66a7d845]{color:#4f46e5;cursor:pointer;text-decoration:underline}.pay-grid[data-v-66a7d845]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.pay-item[data-v-66a7d845]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;font-size:13px;color:#475569;transition:all .15s}.pay-item[data-v-66a7d845]:hover{border-color:#c7d2fe;background:#f8fafc}.pay-item.checked[data-v-66a7d845]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.pay-miss[data-v-66a7d845]{font-size:10px;color:#b45309;background:#fef3c7;padding:1px 5px;border-radius:4px;margin-left:auto}.ed-footer[data-v-66a7d845]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.pay-grid[data-v-66a7d845]{grid-template-columns:repeat(2,1fr)}} |
||||
File diff suppressed because one or more lines are too long
@ -1 +1 @@ |
|||||
import{u as a,e as s,h as u,i as r,f as h}from"./DMxDLVSv.js";function i(t){const e=t||s();return e.ssrContext?.head||e.runWithContext(()=>{if(u()){const n=r(h);if(!n)throw new Error("[nuxt] [unhead] Missing Unhead instance.");return n}})}function d(t,e={}){const n=e.head||i(e.nuxt);return a(t,{head:n,...e})}export{d as u}; |
import{u as a,e as s,h as u,i as r,f as h}from"./DSy_gLdM.js";function i(t){const e=t||s();return e.ssrContext?.head||e.runWithContext(()=>{if(u()){const n=r(h);if(!n)throw new Error("[nuxt] [unhead] Missing Unhead instance.");return n}})}function d(t,e={}){const n=e.head||i(e.nuxt);return a(t,{head:n,...e})}export{d as u}; |
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,310 @@ |
|||||
|
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; |
||||
|
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass, ssrRenderComponent } from 'vue/server-renderer'; |
||||
|
import { u as useApi } from './useApi-BNSkSrat.mjs'; |
||||
|
import { u as useToast } from './useToast-MBvLaNjH.mjs'; |
||||
|
import { L as LANG_OPTIONS } from './useLangOptions-CXXbv5NM.mjs'; |
||||
|
import { _ as __nuxt_component_0 } from './LangSelect-Bvw-e1Cn.mjs'; |
||||
|
import { _ as _export_sfc } from './server.mjs'; |
||||
|
import '../nitro/nitro.mjs'; |
||||
|
import 'node:http'; |
||||
|
import 'node:https'; |
||||
|
import 'node:events'; |
||||
|
import 'node:buffer'; |
||||
|
import 'node:fs'; |
||||
|
import 'node:path'; |
||||
|
import 'node:crypto'; |
||||
|
import 'node:url'; |
||||
|
import '../routes/renderer.mjs'; |
||||
|
import 'vue-bundle-renderer/runtime'; |
||||
|
import 'unhead/server'; |
||||
|
import 'devalue'; |
||||
|
import 'unhead/utils'; |
||||
|
import 'pinia'; |
||||
|
import 'perfect-debounce'; |
||||
|
|
||||
|
const CAT_STT = 1; |
||||
|
const CAT_TTS = 2; |
||||
|
const CAT_MT = 3; |
||||
|
const CAT_AST = 4; |
||||
|
const CAT_LLM = 5; |
||||
|
const CAT_STS = 7; |
||||
|
const CAT_LLM_VISION = 9; |
||||
|
const CAT_MCP = 10; |
||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({ |
||||
|
__name: "agents", |
||||
|
__ssrInlineRender: true, |
||||
|
setup(__props) { |
||||
|
const AGENT_TYPES = [ |
||||
|
{ value: "chat", label: "chat-agent 对话", icon: "💬", hint: "STT → LLM → TTS 三段拼接", color: "#b45309", bg: "#fef9c3" }, |
||||
|
{ value: "sts-chat", label: "sts-chat-agent 端到端对话", icon: "⚡", hint: "单个 STS 服务直接完成语音对话", color: "#be185d", bg: "#fce7f3" } |
||||
|
]; |
||||
|
const LEGACY_TYPES = { |
||||
|
translate: { label: "翻译(已下线)", icon: "🧩", color: "#64748b", bg: "#f1f5f9" }, |
||||
|
"ast-translate": { label: "端到端翻译(已下线)", icon: "🚀", color: "#64748b", bg: "#f1f5f9" } |
||||
|
}; |
||||
|
const SLOTS = { |
||||
|
chat: [ |
||||
|
{ key: "stt_svc_id", slot: "STT", label: "语音识别", cats: [CAT_STT], color: "#1664ff" }, |
||||
|
{ key: "llm_svc_id", slot: "LLM", label: "大语言模型", cats: [CAT_LLM, CAT_LLM_VISION], color: "#b45309" }, |
||||
|
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cats: [CAT_TTS], color: "#7c3aed" } |
||||
|
], |
||||
|
translate: [ |
||||
|
{ key: "stt_svc_id", slot: "STT", label: "语音识别", cats: [CAT_STT], color: "#1664ff" }, |
||||
|
{ key: "mt_svc_id", slot: "MT", label: "机器翻译", cats: [CAT_MT], color: "#059669" }, |
||||
|
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cats: [CAT_TTS], color: "#7c3aed" } |
||||
|
], |
||||
|
"sts-chat": [{ key: "sts_svc_id", slot: "STS", label: "端到端语音对话", cats: [CAT_STS], color: "#be185d" }], |
||||
|
"ast-translate": [{ key: "ast_svc_id", slot: "AST", label: "端到端语音翻译", cats: [CAT_AST], color: "#f97316" }] |
||||
|
}; |
||||
|
function slotsOfType(t) { |
||||
|
return SLOTS[t] ?? []; |
||||
|
} |
||||
|
useApi(); |
||||
|
useToast(); |
||||
|
const scopeApp = ref(""); |
||||
|
const scopeApps = ref([]); |
||||
|
const agents2 = ref([]); |
||||
|
const allSvcs = ref([]); |
||||
|
const ttsVoices = ref([]); |
||||
|
const modalOpen = ref(false); |
||||
|
const isEditing = ref(false); |
||||
|
const submitting = ref(false); |
||||
|
function emptyForm() { |
||||
|
return { |
||||
|
app_name: "", |
||||
|
id: "", |
||||
|
name: "", |
||||
|
type: "chat", |
||||
|
description: "", |
||||
|
avatar_url: "", |
||||
|
enable: true, |
||||
|
stt_svc_id: "", |
||||
|
llm_svc_id: "", |
||||
|
tts_svc_id: "", |
||||
|
mt_svc_id: "", |
||||
|
sts_svc_id: "", |
||||
|
ast_svc_id: "", |
||||
|
system_prompt: "", |
||||
|
gender: 0, |
||||
|
greeting_enabled: false, |
||||
|
greeting_text: "", |
||||
|
support_langs: "", |
||||
|
default_lang: "", |
||||
|
voice_map: [], |
||||
|
mcp_svc_ids: [], |
||||
|
variables: [], |
||||
|
sort: 0 |
||||
|
}; |
||||
|
} |
||||
|
const form = reactive(emptyForm()); |
||||
|
const isChatType = computed(() => form.type === "chat" || form.type === "sts-chat"); |
||||
|
const supportedLangOptions = computed(() => { |
||||
|
const codes = (form.support_langs || "").split(",").map((x) => x.trim()).filter(Boolean); |
||||
|
if (!codes.length) return LANG_OPTIONS; |
||||
|
return LANG_OPTIONS.filter((o) => codes.includes(o.code)); |
||||
|
}); |
||||
|
const bySort = (a, b) => (b.sort || 0) - (a.sort || 0) || (a.name || "").localeCompare(b.name || ""); |
||||
|
const grouped = computed(() => { |
||||
|
const groups = AGENT_TYPES.map((t) => ({ |
||||
|
...t, |
||||
|
type: t.value, |
||||
|
items: agents2.value.filter((a) => a.type === t.value).sort(bySort) |
||||
|
})).filter((g) => g.items.length); |
||||
|
for (const [type, meta] of Object.entries(LEGACY_TYPES)) { |
||||
|
const items = agents2.value.filter((a) => a.type === type).sort(bySort); |
||||
|
if (items.length) groups.push({ value: type, type, hint: "已下线的类型,仅供查看与清理", ...meta, items }); |
||||
|
} |
||||
|
return groups; |
||||
|
}); |
||||
|
const voiceSvcId = computed(() => form.type === "sts-chat" ? form.sts_svc_id : form.tts_svc_id); |
||||
|
const voiceProvider = computed(() => allSvcs.value.find((s) => s.id === voiceSvcId.value)?.provider ?? ""); |
||||
|
const voiceTableSupported = computed(() => !!voiceProvider.value && ttsVoices.value.some((v) => v.provider === voiceProvider.value)); |
||||
|
function voiceOptions(language, gender) { |
||||
|
const provider = voiceProvider.value; |
||||
|
if (!provider || !language) return []; |
||||
|
const base = (language.split("-")[0] || "").toLowerCase(); |
||||
|
const hit = ttsVoices.value.filter((v) => { |
||||
|
if (v.provider !== provider) return false; |
||||
|
if (gender && v.gender !== gender) return false; |
||||
|
return v.language.toLowerCase() === language.toLowerCase(); |
||||
|
}); |
||||
|
if (hit.length) return hit; |
||||
|
return ttsVoices.value.filter((v) => { |
||||
|
if (v.provider !== provider) return false; |
||||
|
if (gender && v.gender !== gender) return false; |
||||
|
return (v.language.split("-")[0] || "").toLowerCase() === base; |
||||
|
}); |
||||
|
} |
||||
|
const mcpSvcs = computed(() => svcsByCats([CAT_MCP])); |
||||
|
function svcCats(s) { |
||||
|
return (s.categories || "").split(",").map(Number); |
||||
|
} |
||||
|
function svcsByCats(cats) { |
||||
|
return allSvcs.value.filter((s) => s.enable && svcCats(s).some((c) => cats.includes(c))); |
||||
|
} |
||||
|
function isVisionSvc(s) { |
||||
|
return svcCats(s).includes(CAT_LLM_VISION); |
||||
|
} |
||||
|
function svcName(id) { |
||||
|
if (!id) return "未配置"; |
||||
|
const s = allSvcs.value.find((x) => x.id === id); |
||||
|
return s ? s.name : id; |
||||
|
} |
||||
|
function pipelineOf(a) { |
||||
|
return slotsOfType(a.type).map((s) => ({ slot: s.slot, color: s.color, id: a[s.key] })); |
||||
|
} |
||||
|
return (_ctx, _push, _parent, _attrs) => { |
||||
|
_push(`<div${ssrRenderAttrs(_attrs)} data-v-dcf87e76><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-dcf87e76><div data-v-dcf87e76><h2 class="text-lg font-semibold text-slate-800" data-v-dcf87e76>Agent 配置</h2><p class="text-xs text-slate-400 mt-1" data-v-dcf87e76> 把已配置的第三方服务编排成可下发客户端的智能体。四种类型按需引用不同服务;通话翻译规则只能引用「翻译」与「端到端翻译」两类。 </p></div><div class="flex items-center gap-3" data-v-dcf87e76><span class="text-sm text-slate-500" data-v-dcf87e76>作用域</span><select class="select select-bordered select-sm" data-v-dcf87e76><option value="" data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`); |
||||
|
ssrRenderList(scopeApps.value, (a) => { |
||||
|
_push(`<option${ssrRenderAttr("value", a)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>${ssrInterpolate(a)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select><button class="btn btn-primary btn-sm text-white" data-v-dcf87e76>+ 新建 Agent</button></div></div>`); |
||||
|
if (!agents2.value.length) { |
||||
|
_push(`<div class="text-center py-20 text-slate-300" data-v-dcf87e76><div class="text-5xl mb-3" data-v-dcf87e76>🤖</div><p class="text-sm" data-v-dcf87e76>当前作用域下还没有 Agent</p><p class="text-xs mt-1" data-v-dcf87e76>先在「第三方服务配置」里配好服务,再来把它们组装成 Agent</p></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--[-->`); |
||||
|
ssrRenderList(grouped.value, (g) => { |
||||
|
_push(`<div class="mb-6" data-v-dcf87e76><div class="flex items-center gap-2 mb-3" data-v-dcf87e76><span class="type-tag" style="${ssrRenderStyle({ background: g.bg, color: g.color })}" data-v-dcf87e76>${ssrInterpolate(g.icon)} ${ssrInterpolate(g.label)}</span><span class="text-xs text-slate-400" data-v-dcf87e76>${ssrInterpolate(g.hint)}</span><span class="text-xs text-slate-300" data-v-dcf87e76>·</span><span class="text-xs text-slate-400" data-v-dcf87e76>${ssrInterpolate(g.items.length)} 个</span></div><div class="agent-grid" data-v-dcf87e76><!--[-->`); |
||||
|
ssrRenderList(g.items, (a) => { |
||||
|
_push(`<div class="agent-card" data-v-dcf87e76><div class="flex items-start justify-between gap-2" data-v-dcf87e76><div class="min-w-0" data-v-dcf87e76><div class="font-semibold text-sm text-slate-800 truncate" data-v-dcf87e76>${ssrInterpolate(a.name || a.id)}</div><div class="text-[11px] text-slate-400 mt-0.5 truncate" data-v-dcf87e76>${ssrInterpolate(a.id)}</div></div><div class="flex items-center gap-1 flex-shrink-0" data-v-dcf87e76>`); |
||||
|
if (a.enable) { |
||||
|
_push(`<span class="badge badge-success badge-xs" data-v-dcf87e76>启用</span>`); |
||||
|
} else { |
||||
|
_push(`<span class="badge badge-ghost badge-xs" data-v-dcf87e76>停用</span>`); |
||||
|
} |
||||
|
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-dcf87e76>删除</button></div></div>`); |
||||
|
if (a.description) { |
||||
|
_push(`<p class="text-xs text-slate-500 mt-2 line-clamp-2" data-v-dcf87e76>${ssrInterpolate(a.description)}</p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div class="flex flex-wrap items-center gap-1.5 mt-3" data-v-dcf87e76><!--[-->`); |
||||
|
ssrRenderList(pipelineOf(a), (s) => { |
||||
|
_push(`<span class="svc-pill" style="${ssrRenderStyle({ background: s.color })}" data-v-dcf87e76>${ssrInterpolate(s.slot)}: ${ssrInterpolate(svcName(s.id))}</span>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
if (a.support_langs) { |
||||
|
_push(`<div class="text-[11px] text-slate-400 mt-2 truncate" data-v-dcf87e76> 支持语言:${ssrInterpolate(a.support_langs)}</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--><div class="ag-overlay" style="${ssrRenderStyle(modalOpen.value ? null : { display: "none" })}" data-v-dcf87e76><div class="ag-box" data-v-dcf87e76><div class="flex items-center justify-between mb-4" data-v-dcf87e76><div class="flex items-center gap-3" data-v-dcf87e76><h3 class="text-base font-semibold text-slate-800" data-v-dcf87e76>${ssrInterpolate(isEditing.value ? "编辑 Agent" : "新建 Agent")}</h3><span class="scope-chip" data-v-dcf87e76>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-dcf87e76>✕ 关闭</button></div><section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>类型</div><div class="type-row" data-v-dcf87e76><!--[-->`); |
||||
|
ssrRenderList(AGENT_TYPES, (t) => { |
||||
|
_push(`<button type="button" class="${ssrRenderClass([{ on: form.type === t.value, locked: isEditing.value && form.type !== t.value }, "ttab"])}"${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} data-v-dcf87e76><span class="ttab-title" data-v-dcf87e76>${ssrInterpolate(t.icon)} ${ssrInterpolate(t.label)}</span><span class="ttab-desc" data-v-dcf87e76>${ssrInterpolate(t.hint)}</span></button>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
if (isEditing.value) { |
||||
|
_push(`<p class="ed-tip" data-v-dcf87e76>类型创建后不可更改;需要换类型请新建一个 Agent。</p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</section><section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>基本信息</div><div class="grid grid-cols-2 gap-3" data-v-dcf87e76><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>Agent ID <i class="req" data-v-dcf87e76>*</i></span><input${ssrRenderAttr("value", form.id)}${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} class="input input-bordered input-sm w-full" placeholder="如 trans-cn-en(作用域内唯一,创建后不可改)" data-v-dcf87e76></div><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>名称 <i class="req" data-v-dcf87e76>*</i></span><input${ssrRenderAttr("value", form.name)} class="input input-bordered input-sm w-full" placeholder="展示名,如 中英实时翻译" data-v-dcf87e76></div></div><div class="mt-3" data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>描述</span><input${ssrRenderAttr("value", form.description)} class="input input-bordered input-sm w-full" placeholder="这个 Agent 用在什么场景" data-v-dcf87e76></div><div class="grid grid-cols-3 gap-3 mt-3" data-v-dcf87e76><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>头像 URL</span><input${ssrRenderAttr("value", form.avatar_url)} class="input input-bordered input-sm w-full" placeholder="可留空" data-v-dcf87e76></div><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>排序(越大越靠前)</span><input${ssrRenderAttr("value", form.sort)} type="number" class="input input-bordered input-sm w-full" data-v-dcf87e76></div><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>音色性别偏好</span><select class="select select-bordered select-sm w-full" data-v-dcf87e76><option${ssrRenderAttr("value", 0)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 0) : ssrLooseEqual(form.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 1) : ssrLooseEqual(form.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 2) : ssrLooseEqual(form.gender, 2)) ? " selected" : ""}>女</option></select></div></div></section><section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>服务编排</div><div class="slot-row" data-v-dcf87e76><!--[-->`); |
||||
|
ssrRenderList(slotsOfType(form.type), (s, i) => { |
||||
|
_push(`<!--[--><div class="slot-item" data-v-dcf87e76><span class="stage-tag" style="${ssrRenderStyle({ background: s.color })}" data-v-dcf87e76>${ssrInterpolate(s.slot)}</span><span class="ed-label inline" data-v-dcf87e76>${ssrInterpolate(s.label)}</span><select class="select select-bordered select-sm w-full" data-v-dcf87e76><option value="" disabled data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], "") : ssrLooseEqual(form[s.key], "")) ? " selected" : ""}>${ssrInterpolate(svcsByCats(s.cats).length ? "请选择服务" : "(无可用服务,请先去第三方服务配置里添加)")}</option><!--[-->`); |
||||
|
ssrRenderList(svcsByCats(s.cats), (v) => { |
||||
|
_push(`<option${ssrRenderAttr("value", v.id)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], v.id) : ssrLooseEqual(form[s.key], v.id)) ? " selected" : ""}>${ssrInterpolate(v.name)}${ssrInterpolate(isVisionSvc(v) ? " 🖼" : "")}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select></div>`); |
||||
|
if (i < slotsOfType(form.type).length - 1) { |
||||
|
_push(`<span class="slot-arrow" data-v-dcf87e76>→</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--]-->`); |
||||
|
}); |
||||
|
_push(`<!--]--></div></section><section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>语言与音色</div><div class="grid grid-cols-2 gap-3" data-v-dcf87e76><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>支持语言(多选)</span>`); |
||||
|
_push(ssrRenderComponent(__nuxt_component_0, { |
||||
|
modelValue: form.support_langs, |
||||
|
"onUpdate:modelValue": ($event) => form.support_langs = $event, |
||||
|
multiple: "" |
||||
|
}, null, _parent)); |
||||
|
_push(`</div><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>默认语言</span>`); |
||||
|
_push(ssrRenderComponent(__nuxt_component_0, { |
||||
|
modelValue: form.default_lang, |
||||
|
"onUpdate:modelValue": ($event) => form.default_lang = $event, |
||||
|
options: supportedLangOptions.value |
||||
|
}, null, _parent)); |
||||
|
_push(`</div></div><div class="mt-3" data-v-dcf87e76><div class="flex items-center justify-between mb-1" data-v-dcf87e76><span class="ed-label mb-0" data-v-dcf87e76>音色(按语言+性别配,Agent 切语言时自动换音色)</span><div class="flex gap-1" data-v-dcf87e76><button class="btn btn-ghost btn-xs"${ssrIncludeBooleanAttr(!voiceTableSupported.value) ? " disabled" : ""} data-v-dcf87e76>按支持语言补全</button><button class="btn btn-ghost btn-xs" data-v-dcf87e76>+ 添加一行</button></div></div><p class="ed-tip mb-1" data-v-dcf87e76>`); |
||||
|
if (!voiceSvcId.value) { |
||||
|
_push(`<!--[-->先在上方选好语音服务,这里才能列出可用音色。<!--]-->`); |
||||
|
} else if (voiceTableSupported.value) { |
||||
|
_push(`<!--[--> 候选来自内置音色表(${ssrInterpolate(voiceProvider.value)});同一语言+性别有多个时默认第一个,可在下拉里换。没配到的语言走服务商默认音色。 <!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!--[-->「${ssrInterpolate(voiceProvider.value || "该服务商")}」不在内置音色表里,请手填服务商的音色 id。<!--]-->`); |
||||
|
} |
||||
|
_push(`</p>`); |
||||
|
if (!form.voice_map.length) { |
||||
|
_push(`<div class="text-xs text-slate-300 py-2" data-v-dcf87e76>未设置,全部走服务商默认音色</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--[-->`); |
||||
|
ssrRenderList(form.voice_map, (v, i) => { |
||||
|
_push(`<div class="voice-row" data-v-dcf87e76><select class="select select-bordered select-xs" data-v-dcf87e76><option value="" data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.language) ? ssrLooseContain(v.language, "") : ssrLooseEqual(v.language, "")) ? " selected" : ""}>(语言)</option><!--[-->`); |
||||
|
ssrRenderList(supportedLangOptions.value, (o) => { |
||||
|
_push(`<option${ssrRenderAttr("value", o.code)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.language) ? ssrLooseContain(v.language, o.code) : ssrLooseEqual(v.language, o.code)) ? " selected" : ""}>${ssrInterpolate(o.code)} · ${ssrInterpolate(o.name)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select><select class="select select-bordered select-xs" data-v-dcf87e76><option${ssrRenderAttr("value", 0)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 0) : ssrLooseEqual(v.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 1) : ssrLooseEqual(v.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 2) : ssrLooseEqual(v.gender, 2)) ? " selected" : ""}>女</option></select>`); |
||||
|
if (voiceTableSupported.value && voiceOptions(v.language, v.gender).length) { |
||||
|
_push(`<select class="select select-bordered select-xs flex-1" data-v-dcf87e76><!--[-->`); |
||||
|
ssrRenderList(voiceOptions(v.language, v.gender), (o, oi) => { |
||||
|
_push(`<option${ssrRenderAttr("value", o.voice_id)} data-v-dcf87e76${ssrIncludeBooleanAttr(Array.isArray(v.voice) ? ssrLooseContain(v.voice, o.voice_id) : ssrLooseEqual(v.voice, o.voice_id)) ? " selected" : ""}>${ssrInterpolate(o.name)} · ${ssrInterpolate(o.voice_id)}${ssrInterpolate(oi === 0 ? "(默认)" : "")}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select>`); |
||||
|
} else { |
||||
|
_push(`<input${ssrRenderAttr("value", v.voice)} class="input input-bordered input-xs flex-1" placeholder="音色 id,如 zh-CN-XiaoxiaoNeural" data-v-dcf87e76>`); |
||||
|
} |
||||
|
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-dcf87e76>删除</button></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div></section>`); |
||||
|
if (isChatType.value) { |
||||
|
_push(`<section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>对话设定</div><div data-v-dcf87e76><span class="ed-label" data-v-dcf87e76>系统提示词</span><textarea class="textarea textarea-bordered w-full text-xs" rows="3" placeholder="定义这个智能体的人设与行为" data-v-dcf87e76>${ssrInterpolate(form.system_prompt)}</textarea></div><div class="mt-3" data-v-dcf87e76><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-dcf87e76><input${ssrIncludeBooleanAttr(Array.isArray(form.greeting_enabled) ? ssrLooseContain(form.greeting_enabled, null) : form.greeting_enabled) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-dcf87e76><span data-v-dcf87e76>开场白</span></label>`); |
||||
|
if (form.greeting_enabled) { |
||||
|
_push(`<input${ssrRenderAttr("value", form.greeting_text)} class="input input-bordered input-sm w-full mt-2" placeholder="接通后先说的一句话" data-v-dcf87e76>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div></section>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<section class="ed-section" data-v-dcf87e76><div class="ed-section-title" data-v-dcf87e76>MCP 服务(可选,给 Agent 挂工具)</div>`); |
||||
|
if (!mcpSvcs.value.length) { |
||||
|
_push(`<p class="ed-tip" data-v-dcf87e76>还没有启用的 MCP 服务,先去「第三方服务配置 → MCP 服务」添加。</p>`); |
||||
|
} else { |
||||
|
_push(`<div class="mcp-grid" data-v-dcf87e76><!--[-->`); |
||||
|
ssrRenderList(mcpSvcs.value, (m) => { |
||||
|
_push(`<label class="${ssrRenderClass([{ on: form.mcp_svc_ids.includes(m.id) }, "mcp-item"])}" data-v-dcf87e76><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(form.mcp_svc_ids.includes(m.id)) ? " checked" : ""} data-v-dcf87e76><span class="min-w-0" data-v-dcf87e76><span class="block truncate" data-v-dcf87e76>${ssrInterpolate(m.name)}</span><span class="block truncate text-[10px] text-slate-400 font-mono" data-v-dcf87e76>${ssrInterpolate(m.id)}</span></span></label>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
} |
||||
|
_push(`</section><section class="ed-section" data-v-dcf87e76><div class="flex items-center justify-between mb-1" data-v-dcf87e76><div class="ed-section-title mb-0" data-v-dcf87e76>变量(提示词/开场白里用 {{key}} 占位)</div><button class="btn btn-ghost btn-xs" data-v-dcf87e76>+ 添加变量</button></div>`); |
||||
|
if (!form.variables.length) { |
||||
|
_push(`<div class="text-xs text-slate-300 py-2" data-v-dcf87e76>未定义变量</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--[-->`); |
||||
|
ssrRenderList(form.variables, (v, i) => { |
||||
|
_push(`<div class="var-row" data-v-dcf87e76><input${ssrRenderAttr("value", v.key)} class="input input-bordered input-xs" placeholder="key" data-v-dcf87e76><input${ssrRenderAttr("value", v.label)} class="input input-bordered input-xs" placeholder="展示名" data-v-dcf87e76><input${ssrRenderAttr("value", v.def_value)} class="input input-bordered input-xs flex-1" placeholder="默认值(客户端没传时用它)" data-v-dcf87e76><button class="btn btn-ghost btn-xs text-error" data-v-dcf87e76>删除</button></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></section><div class="ed-footer" data-v-dcf87e76><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-dcf87e76><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-dcf87e76><span data-v-dcf87e76>启用</span></label><div class="flex gap-2" data-v-dcf87e76><button class="btn btn-ghost btn-sm" data-v-dcf87e76>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-dcf87e76>保存</button></div></div></div></div></div>`); |
||||
|
}; |
||||
|
} |
||||
|
}); |
||||
|
const _sfc_setup = _sfc_main.setup; |
||||
|
_sfc_main.setup = (props, ctx) => { |
||||
|
const ssrContext = useSSRContext(); |
||||
|
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/agents.vue"); |
||||
|
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
||||
|
}; |
||||
|
const agents = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-dcf87e76"]]); |
||||
|
|
||||
|
export { agents as default }; |
||||
|
//# sourceMappingURL=agents-Bh_gLb1p.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"agents-Bh_gLb1p.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-Bh_gLb1p.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1,240 +0,0 @@ |
|||||
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; |
|
||||
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass, ssrRenderComponent } from 'vue/server-renderer'; |
|
||||
import { u as useApi } from './useApi-BNSkSrat.mjs'; |
|
||||
import { u as useToast } from './useToast-MBvLaNjH.mjs'; |
|
||||
import { L as LANG_OPTIONS } from './useLangOptions-CXXbv5NM.mjs'; |
|
||||
import { _ as __nuxt_component_0 } from './LangSelect-Bvw-e1Cn.mjs'; |
|
||||
import { _ as _export_sfc } from './server.mjs'; |
|
||||
import '../nitro/nitro.mjs'; |
|
||||
import 'node:http'; |
|
||||
import 'node:https'; |
|
||||
import 'node:events'; |
|
||||
import 'node:buffer'; |
|
||||
import 'node:fs'; |
|
||||
import 'node:path'; |
|
||||
import 'node:crypto'; |
|
||||
import 'node:url'; |
|
||||
import '../routes/renderer.mjs'; |
|
||||
import 'vue-bundle-renderer/runtime'; |
|
||||
import 'unhead/server'; |
|
||||
import 'devalue'; |
|
||||
import 'unhead/utils'; |
|
||||
import 'pinia'; |
|
||||
import 'perfect-debounce'; |
|
||||
|
|
||||
const CAT_STT = 1; |
|
||||
const CAT_TTS = 2; |
|
||||
const CAT_MT = 3; |
|
||||
const CAT_AST = 4; |
|
||||
const CAT_LLM = 5; |
|
||||
const CAT_STS = 7; |
|
||||
const CAT_LLM_VISION = 9; |
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({ |
|
||||
__name: "agents", |
|
||||
__ssrInlineRender: true, |
|
||||
setup(__props) { |
|
||||
const AGENT_TYPES = [ |
|
||||
{ value: "chat", label: "对话", icon: "💬", hint: "STT → LLM → TTS 三段拼接", color: "#b45309", bg: "#fef9c3" }, |
|
||||
{ value: "translate", label: "翻译", icon: "🧩", hint: "STT → MT → TTS 三段拼接", color: "#059669", bg: "#dcfce7" }, |
|
||||
{ value: "sts-chat", label: "端到端对话", icon: "⚡", hint: "单个 STS 服务直接完成语音对话", color: "#be185d", bg: "#fce7f3" }, |
|
||||
{ value: "ast-translate", label: "端到端翻译", icon: "🚀", hint: "单个 AST 服务直接完成语音翻译", color: "#c2410c", bg: "#fff7ed" } |
|
||||
]; |
|
||||
const SLOTS = { |
|
||||
chat: [ |
|
||||
{ key: "stt_svc_id", slot: "STT", label: "语音识别", cats: [CAT_STT], color: "#1664ff" }, |
|
||||
{ key: "llm_svc_id", slot: "LLM", label: "大语言模型", cats: [CAT_LLM, CAT_LLM_VISION], color: "#b45309" }, |
|
||||
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cats: [CAT_TTS], color: "#7c3aed" } |
|
||||
], |
|
||||
translate: [ |
|
||||
{ key: "stt_svc_id", slot: "STT", label: "语音识别", cats: [CAT_STT], color: "#1664ff" }, |
|
||||
{ key: "mt_svc_id", slot: "MT", label: "机器翻译", cats: [CAT_MT], color: "#059669" }, |
|
||||
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cats: [CAT_TTS], color: "#7c3aed" } |
|
||||
], |
|
||||
"sts-chat": [{ key: "sts_svc_id", slot: "STS", label: "端到端语音对话", cats: [CAT_STS], color: "#be185d" }], |
|
||||
"ast-translate": [{ key: "ast_svc_id", slot: "AST", label: "端到端语音翻译", cats: [CAT_AST], color: "#f97316" }] |
|
||||
}; |
|
||||
function slotsOfType(t) { |
|
||||
return SLOTS[t] ?? []; |
|
||||
} |
|
||||
useApi(); |
|
||||
useToast(); |
|
||||
const scopeApp = ref(""); |
|
||||
const scopeApps = ref([]); |
|
||||
const agents2 = ref([]); |
|
||||
const allSvcs = ref([]); |
|
||||
const modalOpen = ref(false); |
|
||||
const isEditing = ref(false); |
|
||||
const submitting = ref(false); |
|
||||
function emptyForm() { |
|
||||
return { |
|
||||
app_name: "", |
|
||||
id: "", |
|
||||
name: "", |
|
||||
type: "translate", |
|
||||
description: "", |
|
||||
avatar_url: "", |
|
||||
enable: true, |
|
||||
stt_svc_id: "", |
|
||||
llm_svc_id: "", |
|
||||
tts_svc_id: "", |
|
||||
mt_svc_id: "", |
|
||||
sts_svc_id: "", |
|
||||
ast_svc_id: "", |
|
||||
system_prompt: "", |
|
||||
gender: 0, |
|
||||
greeting_enabled: false, |
|
||||
greeting_text: "", |
|
||||
support_langs: "", |
|
||||
default_lang: "", |
|
||||
voice_map: [], |
|
||||
sort: 0 |
|
||||
}; |
|
||||
} |
|
||||
const form = reactive(emptyForm()); |
|
||||
const isChatType = computed(() => form.type === "chat" || form.type === "sts-chat"); |
|
||||
const supportedLangOptions = computed(() => { |
|
||||
const codes = (form.support_langs || "").split(",").map((x) => x.trim()).filter(Boolean); |
|
||||
if (!codes.length) return LANG_OPTIONS; |
|
||||
return LANG_OPTIONS.filter((o) => codes.includes(o.code)); |
|
||||
}); |
|
||||
const grouped = computed( |
|
||||
() => AGENT_TYPES.map((t) => ({ |
|
||||
...t, |
|
||||
type: t.value, |
|
||||
items: agents2.value.filter((a) => a.type === t.value).sort((a, b) => (b.sort || 0) - (a.sort || 0) || (a.name || "").localeCompare(b.name || "")) |
|
||||
})).filter((g) => g.items.length) |
|
||||
); |
|
||||
function svcCats(s) { |
|
||||
return (s.categories || "").split(",").map(Number); |
|
||||
} |
|
||||
function svcsByCats(cats) { |
|
||||
return allSvcs.value.filter((s) => s.enable && svcCats(s).some((c) => cats.includes(c))); |
|
||||
} |
|
||||
function isVisionSvc(s) { |
|
||||
return svcCats(s).includes(CAT_LLM_VISION); |
|
||||
} |
|
||||
function svcName(id) { |
|
||||
if (!id) return "未配置"; |
|
||||
const s = allSvcs.value.find((x) => x.id === id); |
|
||||
return s ? s.name : id; |
|
||||
} |
|
||||
function pipelineOf(a) { |
|
||||
return slotsOfType(a.type).map((s) => ({ slot: s.slot, color: s.color, id: a[s.key] })); |
|
||||
} |
|
||||
return (_ctx, _push, _parent, _attrs) => { |
|
||||
_push(`<div${ssrRenderAttrs(_attrs)} data-v-4a81d81a><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-4a81d81a><div data-v-4a81d81a><h2 class="text-lg font-semibold text-slate-800" data-v-4a81d81a>Agent 配置</h2><p class="text-xs text-slate-400 mt-1" data-v-4a81d81a> 把已配置的第三方服务编排成可下发客户端的智能体。四种类型按需引用不同服务;通话翻译规则只能引用「翻译」与「端到端翻译」两类。 </p></div><div class="flex items-center gap-3" data-v-4a81d81a><span class="text-sm text-slate-500" data-v-4a81d81a>作用域</span><select class="select select-bordered select-sm" data-v-4a81d81a><option value="" data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`); |
|
||||
ssrRenderList(scopeApps.value, (a) => { |
|
||||
_push(`<option${ssrRenderAttr("value", a)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>${ssrInterpolate(a)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select><button class="btn btn-primary btn-sm text-white" data-v-4a81d81a>+ 新建 Agent</button></div></div>`); |
|
||||
if (!agents2.value.length) { |
|
||||
_push(`<div class="text-center py-20 text-slate-300" data-v-4a81d81a><div class="text-5xl mb-3" data-v-4a81d81a>🤖</div><p class="text-sm" data-v-4a81d81a>当前作用域下还没有 Agent</p><p class="text-xs mt-1" data-v-4a81d81a>先在「第三方服务配置」里配好服务,再来把它们组装成 Agent</p></div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<!--[-->`); |
|
||||
ssrRenderList(grouped.value, (g) => { |
|
||||
_push(`<div class="mb-6" data-v-4a81d81a><div class="flex items-center gap-2 mb-3" data-v-4a81d81a><span class="type-tag" style="${ssrRenderStyle({ background: g.bg, color: g.color })}" data-v-4a81d81a>${ssrInterpolate(g.icon)} ${ssrInterpolate(g.label)}</span><span class="text-xs text-slate-400" data-v-4a81d81a>${ssrInterpolate(g.hint)}</span><span class="text-xs text-slate-300" data-v-4a81d81a>·</span><span class="text-xs text-slate-400" data-v-4a81d81a>${ssrInterpolate(g.items.length)} 个</span></div><div class="agent-grid" data-v-4a81d81a><!--[-->`); |
|
||||
ssrRenderList(g.items, (a) => { |
|
||||
_push(`<div class="agent-card" data-v-4a81d81a><div class="flex items-start justify-between gap-2" data-v-4a81d81a><div class="min-w-0" data-v-4a81d81a><div class="font-semibold text-sm text-slate-800 truncate" data-v-4a81d81a>${ssrInterpolate(a.name || a.id)}</div><div class="text-[11px] text-slate-400 mt-0.5 truncate" data-v-4a81d81a>${ssrInterpolate(a.id)}</div></div><div class="flex items-center gap-1 flex-shrink-0" data-v-4a81d81a>`); |
|
||||
if (a.enable) { |
|
||||
_push(`<span class="badge badge-success badge-xs" data-v-4a81d81a>启用</span>`); |
|
||||
} else { |
|
||||
_push(`<span class="badge badge-ghost badge-xs" data-v-4a81d81a>停用</span>`); |
|
||||
} |
|
||||
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-4a81d81a>删除</button></div></div>`); |
|
||||
if (a.description) { |
|
||||
_push(`<p class="text-xs text-slate-500 mt-2 line-clamp-2" data-v-4a81d81a>${ssrInterpolate(a.description)}</p>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<div class="flex flex-wrap items-center gap-1.5 mt-3" data-v-4a81d81a><!--[-->`); |
|
||||
ssrRenderList(pipelineOf(a), (s) => { |
|
||||
_push(`<span class="svc-pill" style="${ssrRenderStyle({ background: s.color })}" data-v-4a81d81a>${ssrInterpolate(s.slot)}: ${ssrInterpolate(svcName(s.id))}</span>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div>`); |
|
||||
if (a.support_langs) { |
|
||||
_push(`<div class="text-[11px] text-slate-400 mt-2 truncate" data-v-4a81d81a> 支持语言:${ssrInterpolate(a.support_langs)}</div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div></div>`); |
|
||||
}); |
|
||||
_push(`<!--]--><div class="ag-overlay" style="${ssrRenderStyle(modalOpen.value ? null : { display: "none" })}" data-v-4a81d81a><div class="ag-box" data-v-4a81d81a><div class="flex items-center justify-between mb-4" data-v-4a81d81a><div class="flex items-center gap-3" data-v-4a81d81a><h3 class="text-base font-semibold text-slate-800" data-v-4a81d81a>${ssrInterpolate(isEditing.value ? "编辑 Agent" : "新建 Agent")}</h3><span class="scope-chip" data-v-4a81d81a>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-4a81d81a>✕ 关闭</button></div><section class="ed-section" data-v-4a81d81a><div class="ed-section-title" data-v-4a81d81a>类型</div><div class="type-row" data-v-4a81d81a><!--[-->`); |
|
||||
ssrRenderList(AGENT_TYPES, (t) => { |
|
||||
_push(`<button type="button" class="${ssrRenderClass([{ on: form.type === t.value, locked: isEditing.value && form.type !== t.value }, "ttab"])}"${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} data-v-4a81d81a><span class="ttab-title" data-v-4a81d81a>${ssrInterpolate(t.icon)} ${ssrInterpolate(t.label)}</span><span class="ttab-desc" data-v-4a81d81a>${ssrInterpolate(t.hint)}</span></button>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div>`); |
|
||||
if (isEditing.value) { |
|
||||
_push(`<p class="ed-tip" data-v-4a81d81a>类型创建后不可更改;需要换类型请新建一个 Agent。</p>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</section><section class="ed-section" data-v-4a81d81a><div class="ed-section-title" data-v-4a81d81a>基本信息</div><div class="grid grid-cols-2 gap-3" data-v-4a81d81a><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>Agent ID <i class="req" data-v-4a81d81a>*</i></span><input${ssrRenderAttr("value", form.id)}${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} class="input input-bordered input-sm w-full" placeholder="如 trans-cn-en(作用域内唯一,创建后不可改)" data-v-4a81d81a></div><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>名称 <i class="req" data-v-4a81d81a>*</i></span><input${ssrRenderAttr("value", form.name)} class="input input-bordered input-sm w-full" placeholder="展示名,如 中英实时翻译" data-v-4a81d81a></div></div><div class="mt-3" data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>描述</span><input${ssrRenderAttr("value", form.description)} class="input input-bordered input-sm w-full" placeholder="这个 Agent 用在什么场景" data-v-4a81d81a></div><div class="grid grid-cols-3 gap-3 mt-3" data-v-4a81d81a><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>头像 URL</span><input${ssrRenderAttr("value", form.avatar_url)} class="input input-bordered input-sm w-full" placeholder="可留空" data-v-4a81d81a></div><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>排序(越大越靠前)</span><input${ssrRenderAttr("value", form.sort)} type="number" class="input input-bordered input-sm w-full" data-v-4a81d81a></div><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>音色性别偏好</span><select class="select select-bordered select-sm w-full" data-v-4a81d81a><option${ssrRenderAttr("value", 0)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 0) : ssrLooseEqual(form.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 1) : ssrLooseEqual(form.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 2) : ssrLooseEqual(form.gender, 2)) ? " selected" : ""}>女</option></select></div></div></section><section class="ed-section" data-v-4a81d81a><div class="ed-section-title" data-v-4a81d81a>服务编排</div><div class="slot-row" data-v-4a81d81a><!--[-->`); |
|
||||
ssrRenderList(slotsOfType(form.type), (s, i) => { |
|
||||
_push(`<!--[--><div class="slot-item" data-v-4a81d81a><span class="stage-tag" style="${ssrRenderStyle({ background: s.color })}" data-v-4a81d81a>${ssrInterpolate(s.slot)}</span><span class="ed-label inline" data-v-4a81d81a>${ssrInterpolate(s.label)}</span><select class="select select-bordered select-sm w-full" data-v-4a81d81a><option value="" disabled data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], "") : ssrLooseEqual(form[s.key], "")) ? " selected" : ""}>${ssrInterpolate(svcsByCats(s.cats).length ? "请选择服务" : "(无可用服务,请先去第三方服务配置里添加)")}</option><!--[-->`); |
|
||||
ssrRenderList(svcsByCats(s.cats), (v) => { |
|
||||
_push(`<option${ssrRenderAttr("value", v.id)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], v.id) : ssrLooseEqual(form[s.key], v.id)) ? " selected" : ""}>${ssrInterpolate(v.name)}${ssrInterpolate(isVisionSvc(v) ? " 🖼" : "")}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></div>`); |
|
||||
if (i < slotsOfType(form.type).length - 1) { |
|
||||
_push(`<span class="slot-arrow" data-v-4a81d81a>→</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<!--]-->`); |
|
||||
}); |
|
||||
_push(`<!--]--></div></section><section class="ed-section" data-v-4a81d81a><div class="ed-section-title" data-v-4a81d81a>语言与音色</div><div class="grid grid-cols-2 gap-3" data-v-4a81d81a><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>支持语言(多选)</span>`); |
|
||||
_push(ssrRenderComponent(__nuxt_component_0, { |
|
||||
modelValue: form.support_langs, |
|
||||
"onUpdate:modelValue": ($event) => form.support_langs = $event, |
|
||||
multiple: "" |
|
||||
}, null, _parent)); |
|
||||
_push(`</div><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>默认语言</span>`); |
|
||||
_push(ssrRenderComponent(__nuxt_component_0, { |
|
||||
modelValue: form.default_lang, |
|
||||
"onUpdate:modelValue": ($event) => form.default_lang = $event, |
|
||||
options: supportedLangOptions.value |
|
||||
}, null, _parent)); |
|
||||
_push(`</div></div><div class="mt-3" data-v-4a81d81a><div class="flex items-center justify-between mb-1" data-v-4a81d81a><span class="ed-label mb-0" data-v-4a81d81a>音色覆盖(不填则用 TTS 服务自带默认音色)</span><button class="btn btn-ghost btn-xs" data-v-4a81d81a>+ 添加一行</button></div>`); |
|
||||
if (!form.voice_map.length) { |
|
||||
_push(`<div class="text-xs text-slate-300 py-2" data-v-4a81d81a>未设置音色覆盖</div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<!--[-->`); |
|
||||
ssrRenderList(form.voice_map, (v, i) => { |
|
||||
_push(`<div class="voice-row" data-v-4a81d81a><select class="select select-bordered select-xs" data-v-4a81d81a><option value="" data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(v.language) ? ssrLooseContain(v.language, "") : ssrLooseEqual(v.language, "")) ? " selected" : ""}>(语言)</option><!--[-->`); |
|
||||
ssrRenderList(supportedLangOptions.value, (o) => { |
|
||||
_push(`<option${ssrRenderAttr("value", o.code)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(v.language) ? ssrLooseContain(v.language, o.code) : ssrLooseEqual(v.language, o.code)) ? " selected" : ""}>${ssrInterpolate(o.code)} · ${ssrInterpolate(o.name)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select><select class="select select-bordered select-xs" data-v-4a81d81a><option${ssrRenderAttr("value", 0)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 0) : ssrLooseEqual(v.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 1) : ssrLooseEqual(v.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-4a81d81a${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 2) : ssrLooseEqual(v.gender, 2)) ? " selected" : ""}>女</option></select><input${ssrRenderAttr("value", v.voice)} class="input input-bordered input-xs flex-1" placeholder="音色名,如 zh-CN-XiaoxiaoNeural" data-v-4a81d81a><button class="btn btn-ghost btn-xs text-error" data-v-4a81d81a>删除</button></div>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div></section>`); |
|
||||
if (isChatType.value) { |
|
||||
_push(`<section class="ed-section" data-v-4a81d81a><div class="ed-section-title" data-v-4a81d81a>对话设定</div><div data-v-4a81d81a><span class="ed-label" data-v-4a81d81a>系统提示词</span><textarea class="textarea textarea-bordered w-full text-xs" rows="3" placeholder="定义这个智能体的人设与行为" data-v-4a81d81a>${ssrInterpolate(form.system_prompt)}</textarea></div><div class="mt-3" data-v-4a81d81a><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-4a81d81a><input${ssrIncludeBooleanAttr(Array.isArray(form.greeting_enabled) ? ssrLooseContain(form.greeting_enabled, null) : form.greeting_enabled) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-4a81d81a><span data-v-4a81d81a>开场白</span></label>`); |
|
||||
if (form.greeting_enabled) { |
|
||||
_push(`<input${ssrRenderAttr("value", form.greeting_text)} class="input input-bordered input-sm w-full mt-2" placeholder="接通后先说的一句话" data-v-4a81d81a>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div></section>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<div class="ed-footer" data-v-4a81d81a><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-4a81d81a><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-4a81d81a><span data-v-4a81d81a>启用</span></label><div class="flex gap-2" data-v-4a81d81a><button class="btn btn-ghost btn-sm" data-v-4a81d81a>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-4a81d81a>保存</button></div></div></div></div></div>`); |
|
||||
}; |
|
||||
} |
|
||||
}); |
|
||||
const _sfc_setup = _sfc_main.setup; |
|
||||
_sfc_main.setup = (props, ctx) => { |
|
||||
const ssrContext = useSSRContext(); |
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/agents.vue"); |
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
|
||||
}; |
|
||||
const agents = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-4a81d81a"]]); |
|
||||
|
|
||||
export { agents as default }; |
|
||||
//# sourceMappingURL=agents-DbiFqwig.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"agents-DbiFqwig.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-DbiFqwig.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1,8 @@ |
|||||
|
const agents_vue_vue_type_style_index_0_scoped_dcf87e76_lang = ".type-tag[data-v-dcf87e76]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-dcf87e76]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-dcf87e76]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-dcf87e76]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-dcf87e76]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-dcf87e76]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ag-box[data-v-dcf87e76]{background:#fff;border-radius:18px;padding:24px;width:780px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-dcf87e76]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-dcf87e76]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-dcf87e76]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-dcf87e76]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-dcf87e76]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-dcf87e76]{display:inline-block;margin-left:6px}.ed-tip[data-v-dcf87e76]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-dcf87e76]{color:#dc2626;font-style:normal}.type-row[data-v-dcf87e76]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-dcf87e76]{display:flex;flex-direction:column;gap:3px;padding:11px 12px;border-radius:10px;border:1.5px solid #e2e8f0;background:#fff;cursor:pointer;transition:all .15s;text-align:left}.ttab[data-v-dcf87e76]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-dcf87e76]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-dcf87e76]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-dcf87e76]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-dcf87e76]{font-size:10px;color:#94a3b8}.slot-row[data-v-dcf87e76]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-dcf87e76]{flex:1;min-width:0}.slot-arrow[data-v-dcf87e76]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-dcf87e76]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.var-row[data-v-dcf87e76],.voice-row[data-v-dcf87e76]{display:flex;align-items:center;gap:8px;margin-bottom:6px}.mcp-grid[data-v-dcf87e76]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px}.mcp-item[data-v-dcf87e76]{display:flex;align-items:center;gap:8px;min-width:0;padding:7px 10px;border:1.5px solid #e2e8f0;border-radius:9px;font-size:12.5px;color:#475569;cursor:pointer;transition:all .15s}.mcp-item[data-v-dcf87e76]:hover{border-color:#c7d2fe;background:#f8fafc}.mcp-item.on[data-v-dcf87e76]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.ed-footer[data-v-dcf87e76]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-dcf87e76]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-dcf87e76]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-dcf87e76]{display:none}}"; |
||||
|
|
||||
|
const agentsStyles_CKxmVBlz = [ |
||||
|
agents_vue_vue_type_style_index_0_scoped_dcf87e76_lang |
||||
|
]; |
||||
|
|
||||
|
export { agentsStyles_CKxmVBlz as default }; |
||||
|
//# sourceMappingURL=agents-styles.CKxmVBlz.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"agents-styles.CKxmVBlz.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-styles-1.mjs-C8pM4_Q2.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-styles.CKxmVBlz.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
||||
@ -1,8 +0,0 @@ |
|||||
const agents_vue_vue_type_style_index_0_scoped_4a81d81a_lang = ".type-tag[data-v-4a81d81a]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-4a81d81a]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-4a81d81a]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-4a81d81a]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-4a81d81a]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-4a81d81a]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ag-box[data-v-4a81d81a]{background:#fff;border-radius:18px;padding:24px;width:780px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-4a81d81a]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-4a81d81a]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-4a81d81a]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-4a81d81a]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-4a81d81a]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-4a81d81a]{display:inline-block;margin-left:6px}.ed-tip[data-v-4a81d81a]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-4a81d81a]{color:#dc2626;font-style:normal}.type-row[data-v-4a81d81a]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-4a81d81a]{display:flex;flex-direction:column;gap:3px;padding:11px 12px;border-radius:10px;border:1.5px solid #e2e8f0;background:#fff;cursor:pointer;transition:all .15s;text-align:left}.ttab[data-v-4a81d81a]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-4a81d81a]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-4a81d81a]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-4a81d81a]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-4a81d81a]{font-size:10px;color:#94a3b8}.slot-row[data-v-4a81d81a]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-4a81d81a]{flex:1;min-width:0}.slot-arrow[data-v-4a81d81a]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-4a81d81a]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.voice-row[data-v-4a81d81a]{gap:8px;margin-bottom:6px}.ed-footer[data-v-4a81d81a],.voice-row[data-v-4a81d81a]{display:flex;align-items:center}.ed-footer[data-v-4a81d81a]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-4a81d81a]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-4a81d81a]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-4a81d81a]{display:none}}"; |
|
||||
|
|
||||
const agentsStyles_GXWAwNko = [ |
|
||||
agents_vue_vue_type_style_index_0_scoped_4a81d81a_lang |
|
||||
]; |
|
||||
|
|
||||
export { agentsStyles_GXWAwNko as default }; |
|
||||
//# sourceMappingURL=agents-styles.GXWAwNko.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"agents-styles.GXWAwNko.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-styles-1.mjs-BzkXHx2D.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-styles.GXWAwNko.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"calltranslate-BllxIxWZ.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-BllxIxWZ.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"calltranslate-Typ2E2m-.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-Typ2E2m-.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -0,0 +1,8 @@ |
|||||
|
const calltranslate_vue_vue_type_style_index_0_scoped_0fc4ec7d_lang = ".rule-list[data-v-0fc4ec7d]{background:#fff;border:1px solid #eef2f7;border-radius:14px;overflow:hidden}.rule-head[data-v-0fc4ec7d],.rule-row[data-v-0fc4ec7d]{display:grid;grid-template-columns:92px 1fr 220px 92px 160px;gap:12px;align-items:center;padding:11px 16px}.rule-head[data-v-0fc4ec7d]{font-size:11px;font-weight:700;color:#94a3b8;background:#f8fafc;border-bottom:1px solid #eef2f7}.rule-row[data-v-0fc4ec7d]{border-bottom:1px solid #f6f8fb;cursor:pointer;transition:background .15s}.rule-row[data-v-0fc4ec7d]:last-child{border-bottom:none}.rule-row[data-v-0fc4ec7d]:hover{background:#f8fafc}.rule-row.off[data-v-0fc4ec7d]{opacity:.55}.prio-cell[data-v-0fc4ec7d]{display:flex;align-items:baseline;gap:6px}.prio[data-v-0fc4ec7d]{font-size:15px;font-weight:800;color:#4338ca}.order[data-v-0fc4ec7d]{font-size:10px;color:#cbd5e1}.cond-cell[data-v-0fc4ec7d]{min-width:0}.agent-cell[data-v-0fc4ec7d]{display:flex;align-items:center;gap:6px;min-width:0}.lang-badge[data-v-0fc4ec7d]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.lang-badge.any[data-v-0fc4ec7d]{background:#f1f5f9;color:#64748b;font-style:italic}.type-badge[data-v-0fc4ec7d]{font-size:10px;font-weight:700;padding:2px 7px;border-radius:5px;white-space:nowrap}.editor-panel[data-v-0fc4ec7d]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.region-chip[data-v-0fc4ec7d]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-0fc4ec7d]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-0fc4ec7d]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-0fc4ec7d]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-0fc4ec7d]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-0fc4ec7d]{font-size:11px;color:#b45309;margin-top:8px}.req[data-v-0fc4ec7d]{color:#dc2626;font-style:normal}.any-toggle[data-v-0fc4ec7d]{gap:5px;font-size:11px;cursor:pointer}.any-box[data-v-0fc4ec7d],.any-toggle[data-v-0fc4ec7d]{display:flex;align-items:center;color:#64748b}.any-box[data-v-0fc4ec7d]{height:34px;padding:0 12px;border-radius:8px;border:1.5px dashed #cbd5e1;background:#f8fafc;font-size:12px;font-style:italic}.lang-row[data-v-0fc4ec7d]{display:grid;grid-template-columns:1fr 92px 1fr;align-items:start;gap:12px}.lang-field[data-v-0fc4ec7d]{min-width:0}.dir-col[data-v-0fc4ec7d]{display:flex;flex-direction:column;align-items:center;gap:4px;padding-top:22px}.dir-btn[data-v-0fc4ec7d]{width:46px;height:32px;border-radius:9px;border:1.5px solid #e2e8f0;background:#f8fafc;color:#64748b;font-size:17px;line-height:1;cursor:pointer;transition:all .15s}.dir-btn[data-v-0fc4ec7d]:hover{border-color:#c7d2fe;background:#f5f3ff;color:#4338ca}.dir-btn.on[data-v-0fc4ec7d]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.dir-tip[data-v-0fc4ec7d]{font-size:10px;color:#94a3b8;white-space:nowrap}.agent-preview[data-v-0fc4ec7d]{gap:8px;margin-top:10px;padding:8px 12px;border-radius:9px;background:#f8fafc;border:1px solid #eef2f7}.agent-preview[data-v-0fc4ec7d],.ed-footer[data-v-0fc4ec7d]{display:flex;align-items:center;flex-wrap:wrap}.ed-footer[data-v-0fc4ec7d]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}.ct-overlay[data-v-0fc4ec7d]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ct-box[data-v-0fc4ec7d]{background:#fff;border-radius:20px;padding:28px;width:560px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-0fc4ec7d]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-0fc4ec7d]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;font-size:13px;font-weight:500;color:#475569}.sync-region-item[data-v-0fc4ec7d]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-0fc4ec7d]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.test-result[data-v-0fc4ec7d]{margin-top:14px;padding:12px 14px;border-radius:10px;background:#eef2ff;border:1px solid #c7d2fe}.test-result.miss[data-v-0fc4ec7d]{background:#fffbeb;border-color:#fde68a}@media(max-width:1000px){.rule-head[data-v-0fc4ec7d],.rule-row[data-v-0fc4ec7d]{grid-template-columns:70px 1fr 150px}.rule-head[data-v-0fc4ec7d]>:nth-child(4),.rule-row[data-v-0fc4ec7d]>:nth-child(4){display:none}}@media(max-width:860px){.lang-row[data-v-0fc4ec7d]{grid-template-columns:1fr}.dir-col[data-v-0fc4ec7d]{flex-direction:row;padding-top:0}}"; |
||||
|
|
||||
|
const calltranslateStyles_DejCdNUq = [ |
||||
|
calltranslate_vue_vue_type_style_index_0_scoped_0fc4ec7d_lang |
||||
|
]; |
||||
|
|
||||
|
export { calltranslateStyles_DejCdNUq as default }; |
||||
|
//# sourceMappingURL=calltranslate-styles.DejCdNUq.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"calltranslate-styles.DejCdNUq.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-styles-1.mjs-DXbisy9K.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-styles.DejCdNUq.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
||||
@ -1,8 +0,0 @@ |
|||||
const calltranslate_vue_vue_type_style_index_0_scoped_c0bab860_lang = ".rule-list[data-v-c0bab860]{background:#fff;border:1px solid #eef2f7;border-radius:14px;overflow:hidden}.rule-head[data-v-c0bab860],.rule-row[data-v-c0bab860]{display:grid;grid-template-columns:92px 1fr 220px 92px 160px;gap:12px;align-items:center;padding:11px 16px}.rule-head[data-v-c0bab860]{font-size:11px;font-weight:700;color:#94a3b8;background:#f8fafc;border-bottom:1px solid #eef2f7}.rule-row[data-v-c0bab860]{border-bottom:1px solid #f6f8fb;cursor:pointer;transition:background .15s}.rule-row[data-v-c0bab860]:last-child{border-bottom:none}.rule-row[data-v-c0bab860]:hover{background:#f8fafc}.rule-row.off[data-v-c0bab860]{opacity:.55}.prio-cell[data-v-c0bab860]{display:flex;align-items:baseline;gap:6px}.prio[data-v-c0bab860]{font-size:15px;font-weight:800;color:#4338ca}.order[data-v-c0bab860]{font-size:10px;color:#cbd5e1}.cond-cell[data-v-c0bab860]{min-width:0}.agent-cell[data-v-c0bab860]{display:flex;align-items:center;gap:6px;min-width:0}.lang-badge[data-v-c0bab860]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.lang-badge.any[data-v-c0bab860]{background:#f1f5f9;color:#64748b;font-style:italic}.type-badge[data-v-c0bab860]{font-size:10px;font-weight:700;padding:2px 7px;border-radius:5px;white-space:nowrap}.editor-panel[data-v-c0bab860]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.region-chip[data-v-c0bab860]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-c0bab860]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-c0bab860]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-c0bab860]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-c0bab860]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-c0bab860]{font-size:11px;color:#b45309;margin-top:8px}.req[data-v-c0bab860]{color:#dc2626;font-style:normal}.any-toggle[data-v-c0bab860]{gap:5px;font-size:11px;cursor:pointer}.any-box[data-v-c0bab860],.any-toggle[data-v-c0bab860]{display:flex;align-items:center;color:#64748b}.any-box[data-v-c0bab860]{height:34px;padding:0 12px;border-radius:8px;border:1.5px dashed #cbd5e1;background:#f8fafc;font-size:12px;font-style:italic}.lang-row[data-v-c0bab860]{display:grid;grid-template-columns:1fr 92px 1fr;align-items:start;gap:12px}.lang-field[data-v-c0bab860]{min-width:0}.dir-col[data-v-c0bab860]{display:flex;flex-direction:column;align-items:center;gap:4px;padding-top:22px}.dir-btn[data-v-c0bab860]{width:46px;height:32px;border-radius:9px;border:1.5px solid #e2e8f0;background:#f8fafc;color:#64748b;font-size:17px;line-height:1;cursor:pointer;transition:all .15s}.dir-btn[data-v-c0bab860]:hover{border-color:#c7d2fe;background:#f5f3ff;color:#4338ca}.dir-btn.on[data-v-c0bab860]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.dir-tip[data-v-c0bab860]{font-size:10px;color:#94a3b8;white-space:nowrap}.agent-preview[data-v-c0bab860]{gap:8px;margin-top:10px;padding:8px 12px;border-radius:9px;background:#f8fafc;border:1px solid #eef2f7}.agent-preview[data-v-c0bab860],.ed-footer[data-v-c0bab860]{display:flex;align-items:center;flex-wrap:wrap}.ed-footer[data-v-c0bab860]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}.ct-overlay[data-v-c0bab860]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ct-box[data-v-c0bab860]{background:#fff;border-radius:20px;padding:28px;width:560px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-c0bab860]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-c0bab860]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;font-size:13px;font-weight:500;color:#475569}.sync-region-item[data-v-c0bab860]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-c0bab860]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.test-result[data-v-c0bab860]{margin-top:14px;padding:12px 14px;border-radius:10px;background:#eef2ff;border:1px solid #c7d2fe}.test-result.miss[data-v-c0bab860]{background:#fffbeb;border-color:#fde68a}@media(max-width:1000px){.rule-head[data-v-c0bab860],.rule-row[data-v-c0bab860]{grid-template-columns:70px 1fr 150px}.rule-head[data-v-c0bab860]>:nth-child(4),.rule-row[data-v-c0bab860]>:nth-child(4){display:none}}@media(max-width:860px){.lang-row[data-v-c0bab860]{grid-template-columns:1fr}.dir-col[data-v-c0bab860]{flex-direction:row;padding-top:0}}"; |
|
||||
|
|
||||
const calltranslateStyles_T5wE0P9E = [ |
|
||||
calltranslate_vue_vue_type_style_index_0_scoped_c0bab860_lang |
|
||||
]; |
|
||||
|
|
||||
export { calltranslateStyles_T5wE0P9E as default }; |
|
||||
//# sourceMappingURL=calltranslate-styles.T5wE0P9E.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"calltranslate-styles.T5wE0P9E.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-styles-1.mjs-DvCjyXm1.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-styles.T5wE0P9E.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"channels-CtM7-nvg.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-CtM7-nvg.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"channels-DdtjGoxx.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-DdtjGoxx.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -1,8 +0,0 @@ |
|||||
const channels_vue_vue_type_style_index_0_scoped_6057a5c9_lang = ".group-tag[data-v-6057a5c9]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.ch-grid[data-v-6057a5c9]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.ch-card[data-v-6057a5c9]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.ch-card[data-v-6057a5c9]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.ch-card.off[data-v-6057a5c9]{opacity:.55}.ch-empty[data-v-6057a5c9]{border-style:dashed;background:#fafbfc;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:92px}.ch-empty[data-v-6057a5c9]:hover{border-color:#c7d2fe;background:#f8fafc}.status-badge[data-v-6057a5c9]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;white-space:nowrap}.ver-row[data-v-6057a5c9]{display:flex;gap:14px;margin-top:10px;flex-wrap:wrap}.ver-box[data-v-6057a5c9]{display:flex;flex-direction:column}.ver-label[data-v-6057a5c9]{font-size:10px;color:#94a3b8}.ver-val[data-v-6057a5c9]{font-size:13px;font-weight:700;color:#1e293b;font-family:SF Mono,Menlo,monospace}.ver-val.warn[data-v-6057a5c9]{color:#b45309}.ver-val.review[data-v-6057a5c9]{color:#7c3aed}.flag[data-v-6057a5c9]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#475569}.flag-warn[data-v-6057a5c9]{background:#fef3c7;color:#b45309}.flag-off[data-v-6057a5c9]{background:#fee2e2;color:#b91c1c}.pay-pill[data-v-6057a5c9]{font-size:10px;font-weight:600;padding:2px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.pay-pill.missing[data-v-6057a5c9]{background:#fef3c7;color:#b45309}.pay-warn[data-v-6057a5c9]{background:#fffbeb;border:1px solid #fde68a;color:#92400e;border-radius:12px;padding:12px 14px;margin-bottom:16px}.warn-pill[data-v-6057a5c9]{display:inline-block;margin-right:8px;padding:1px 8px;border-radius:6px;background:#fef3c7}.scope-tip[data-v-6057a5c9]{background:#f8fafc;border:1px solid #eef2f7;color:#64748b;font-size:12px;border-radius:10px;padding:9px 13px;margin-bottom:16px}.ch-overlay[data-v-6057a5c9]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ch-box[data-v-6057a5c9]{background:#fff;border-radius:18px;padding:24px;width:700px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-6057a5c9]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-6057a5c9]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-6057a5c9]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-6057a5c9]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-6057a5c9]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-6057a5c9]{color:#b45309}.ed-tip[data-v-6057a5c9],.ed-warn[data-v-6057a5c9]{font-size:11px;margin-top:8px}.ed-tip[data-v-6057a5c9]{color:#94a3b8}.req[data-v-6057a5c9]{color:#dc2626;font-style:normal}.link[data-v-6057a5c9]{color:#4f46e5;cursor:pointer;text-decoration:underline}.pay-grid[data-v-6057a5c9]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.pay-item[data-v-6057a5c9]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;font-size:13px;color:#475569;transition:all .15s}.pay-item[data-v-6057a5c9]:hover{border-color:#c7d2fe;background:#f8fafc}.pay-item.checked[data-v-6057a5c9]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.pay-miss[data-v-6057a5c9]{font-size:10px;color:#b45309;background:#fef3c7;padding:1px 5px;border-radius:4px;margin-left:auto}.ed-footer[data-v-6057a5c9]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.pay-grid[data-v-6057a5c9]{grid-template-columns:repeat(2,1fr)}}"; |
|
||||
|
|
||||
const channelsStyles_BsiooF6f = [ |
|
||||
channels_vue_vue_type_style_index_0_scoped_6057a5c9_lang |
|
||||
]; |
|
||||
|
|
||||
export { channelsStyles_BsiooF6f as default }; |
|
||||
//# sourceMappingURL=channels-styles.BsiooF6f.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"channels-styles.BsiooF6f.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-styles-1.mjs-Bc-0jlqg.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-styles.BsiooF6f.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
|
||||
@ -0,0 +1,8 @@ |
|||||
|
const channels_vue_vue_type_style_index_0_scoped_66a7d845_lang = ".group-tag[data-v-66a7d845]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.ch-grid[data-v-66a7d845]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.ch-card[data-v-66a7d845]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.ch-card[data-v-66a7d845]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.ch-card.off[data-v-66a7d845]{opacity:.55}.ch-empty[data-v-66a7d845]{border-style:dashed;background:#fafbfc;display:flex;flex-direction:column;justify-content:center;align-items:center;min-height:92px}.ch-empty[data-v-66a7d845]:hover{border-color:#c7d2fe;background:#f8fafc}.status-badge[data-v-66a7d845]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;white-space:nowrap}.ver-row[data-v-66a7d845]{display:flex;gap:14px;margin-top:10px;flex-wrap:wrap}.ver-box[data-v-66a7d845]{display:flex;flex-direction:column}.ver-label[data-v-66a7d845]{font-size:10px;color:#94a3b8}.ver-val[data-v-66a7d845]{font-size:13px;font-weight:700;color:#1e293b;font-family:SF Mono,Menlo,monospace}.ver-val.warn[data-v-66a7d845]{color:#b45309}.ver-val.review[data-v-66a7d845]{color:#7c3aed}.flag[data-v-66a7d845]{font-size:10px;font-weight:600;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#475569}.flag-warn[data-v-66a7d845]{background:#fef3c7;color:#b45309}.flag-off[data-v-66a7d845]{background:#fee2e2;color:#b91c1c}.pay-pill[data-v-66a7d845]{font-size:10px;font-weight:600;padding:2px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.pay-pill.missing[data-v-66a7d845]{background:#fef3c7;color:#b45309}.pay-warn[data-v-66a7d845]{background:#fffbeb;border:1px solid #fde68a;color:#92400e;border-radius:12px;padding:12px 14px;margin-bottom:16px}.warn-pill[data-v-66a7d845]{display:inline-block;margin-right:8px;padding:1px 8px;border-radius:6px;background:#fef3c7}.scope-tip[data-v-66a7d845]{background:#f8fafc;border:1px solid #eef2f7;color:#64748b;font-size:12px;border-radius:10px;padding:9px 13px;margin-bottom:16px}.ch-overlay[data-v-66a7d845]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);padding:24px}.ch-box[data-v-66a7d845]{background:#fff;border-radius:18px;padding:24px;width:700px;max-width:96vw;max-height:90vh;overflow-y:auto;box-shadow:0 24px 80px #0000002e}.scope-chip[data-v-66a7d845]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-66a7d845]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-66a7d845]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-66a7d845]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-66a7d845]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-warn[data-v-66a7d845]{color:#b45309}.ed-tip[data-v-66a7d845],.ed-warn[data-v-66a7d845]{font-size:11px;margin-top:8px}.ed-tip[data-v-66a7d845]{color:#94a3b8}.req[data-v-66a7d845]{color:#dc2626;font-style:normal}.link[data-v-66a7d845]{color:#4f46e5;cursor:pointer;text-decoration:underline}.pay-grid[data-v-66a7d845]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.pay-item[data-v-66a7d845]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;font-size:13px;color:#475569;transition:all .15s}.pay-item[data-v-66a7d845]:hover{border-color:#c7d2fe;background:#f8fafc}.pay-item.checked[data-v-66a7d845]{border-color:#6366f1;background:#eef2ff;color:#4338ca}.pay-miss[data-v-66a7d845]{font-size:10px;color:#b45309;background:#fef3c7;padding:1px 5px;border-radius:4px;margin-left:auto}.ed-footer[data-v-66a7d845]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.pay-grid[data-v-66a7d845]{grid-template-columns:repeat(2,1fr)}}"; |
||||
|
|
||||
|
const channelsStyles_YMd5B91_ = [ |
||||
|
channels_vue_vue_type_style_index_0_scoped_66a7d845_lang |
||||
|
]; |
||||
|
|
||||
|
export { channelsStyles_YMd5B91_ as default }; |
||||
|
//# sourceMappingURL=channels-styles.YMd5B91-.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"channels-styles.YMd5B91-.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-styles-1.mjs-BAM8-7CK.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-styles.YMd5B91-.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,577 @@ |
|||||
|
import { _ as __nuxt_component_0 } from './LangSelect-Bvw-e1Cn.mjs'; |
||||
|
import { defineComponent, ref, computed, reactive, watch, useSSRContext } from 'vue'; |
||||
|
import { ssrRenderAttrs, ssrRenderStyle, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderClass, ssrRenderComponent, ssrRenderDynamicModel } from 'vue/server-renderer'; |
||||
|
import { u as useApi } from './useApi-BNSkSrat.mjs'; |
||||
|
import { u as useToast } from './useToast-MBvLaNjH.mjs'; |
||||
|
import { _ as _export_sfc } from './server.mjs'; |
||||
|
import './useLangOptions-CXXbv5NM.mjs'; |
||||
|
import '../nitro/nitro.mjs'; |
||||
|
import 'node:http'; |
||||
|
import 'node:https'; |
||||
|
import 'node:events'; |
||||
|
import 'node:buffer'; |
||||
|
import 'node:fs'; |
||||
|
import 'node:path'; |
||||
|
import 'node:crypto'; |
||||
|
import 'node:url'; |
||||
|
import '../routes/renderer.mjs'; |
||||
|
import 'vue-bundle-renderer/runtime'; |
||||
|
import 'unhead/server'; |
||||
|
import 'devalue'; |
||||
|
import 'unhead/utils'; |
||||
|
import 'pinia'; |
||||
|
import 'perfect-debounce'; |
||||
|
|
||||
|
const SCAT_MCP = 10; |
||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({ |
||||
|
__name: "serviceconfig", |
||||
|
__ssrInlineRender: true, |
||||
|
setup(__props) { |
||||
|
const REGIONS = [ |
||||
|
{ 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: "印度" } |
||||
|
]; |
||||
|
const SCAT = [ |
||||
|
{ 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" } |
||||
|
]; |
||||
|
const { webApi } = useApi(); |
||||
|
useToast(); |
||||
|
const scopeApp = ref(""); |
||||
|
const scopeApps = ref([]); |
||||
|
function scatInfo(v) { |
||||
|
return SCAT.find((s) => s.v === v) || { short: "?", color: "#999", bg: "#eee", v: 0, label: "" }; |
||||
|
} |
||||
|
function isMcpType() { |
||||
|
if (editType.value === SCAT_MCP) return true; |
||||
|
return !!curSvc.value && parseCats(curSvc.value.categories).includes(SCAT_MCP); |
||||
|
} |
||||
|
function parseCats(s) { |
||||
|
return (s || "").split(",").map((x) => parseInt(x) || 0).filter((x) => x > 0); |
||||
|
} |
||||
|
function encCount(s) { |
||||
|
return (s.fields || []).filter((f) => f.encrypted).length; |
||||
|
} |
||||
|
function regionChip(s) { |
||||
|
const rs = svcRegions.value[s.id] || []; |
||||
|
const names = rs.map((v) => REGIONS.find((x) => x.value === v)?.label || "区域" + v); |
||||
|
if (curRegion.value === 0) { |
||||
|
if (!rs.length) return { text: "全区域通用", cls: "plain", title: "未做任何区域分叉,各区域都用默认配置" }; |
||||
|
return { text: rs.length + " 区域分叉", cls: "has", title: "已分叉:" + names.join("、") }; |
||||
|
} |
||||
|
if (rs.includes(curRegion.value)) { |
||||
|
return { text: "本区域已分叉", cls: "has", title: curRegionLabel.value + "有独立的字段配置" }; |
||||
|
} |
||||
|
return { text: "继承默认", cls: "plain", title: curRegionLabel.value + "未分叉,使用默认配置" }; |
||||
|
} |
||||
|
const VOICE_CATS = [2, 4, 7]; |
||||
|
const voiceRows = ref([]); |
||||
|
const voicesLoading = ref(false); |
||||
|
const isVoiceCat = computed(() => VOICE_CATS.includes(editType.value)); |
||||
|
const voiceLangGroups = computed(() => { |
||||
|
const map = /* @__PURE__ */ new Map(); |
||||
|
for (const v of voiceRows.value) { |
||||
|
if (!map.has(v.language)) map.set(v.language, []); |
||||
|
map.get(v.language).push(v); |
||||
|
} |
||||
|
return Array.from(map, ([lang, items]) => ({ lang, items })); |
||||
|
}); |
||||
|
async function loadVoicesForProvider(provider) { |
||||
|
const p = (provider || "").trim(); |
||||
|
voiceRows.value = []; |
||||
|
if (!p) return; |
||||
|
voicesLoading.value = true; |
||||
|
try { |
||||
|
const d = await webApi("getttsvoices", { provider: p }); |
||||
|
voiceRows.value = d?.voices ?? []; |
||||
|
} catch { |
||||
|
voiceRows.value = []; |
||||
|
} finally { |
||||
|
voicesLoading.value = false; |
||||
|
} |
||||
|
} |
||||
|
const backendReady = ref(true); |
||||
|
const allSvcs = ref([]); |
||||
|
const svcRegions = ref({}); |
||||
|
const curSvc = ref(null); |
||||
|
const curRegion = ref(0); |
||||
|
const svcModalVisible = ref(false); |
||||
|
const detailMode = ref("default"); |
||||
|
const editForm = reactive({ id: "", name: "", provider: "", description: "", enable: false }); |
||||
|
const editType = ref(0); |
||||
|
const editFields = ref([]); |
||||
|
const selectedTemplateId = ref(""); |
||||
|
const wizardStep = ref(1); |
||||
|
const overrideFields = ref([]); |
||||
|
const extraRegionFields = ref([]); |
||||
|
const regionLoading = ref(false); |
||||
|
const templates = ref([]); |
||||
|
const curRegionLabel = computed(() => { |
||||
|
const r = REGIONS.find((x) => x.value === curRegion.value); |
||||
|
return r ? r.label : "区域" + curRegion.value; |
||||
|
}); |
||||
|
const groupedSvcs = computed(() => { |
||||
|
const groups = SCAT.map((sc) => ({ |
||||
|
...sc, |
||||
|
items: allSvcs.value.filter((s) => parseCats(s.categories).includes(sc.v)) |
||||
|
})).filter((g) => g.items.length); |
||||
|
const unclassified = allSvcs.value.filter((s) => !parseCats(s.categories).length); |
||||
|
if (unclassified.length) { |
||||
|
groups.push({ v: 0, label: "未分类", short: "未分类", color: "#64748b", bg: "#f1f5f9", items: unclassified }); |
||||
|
} |
||||
|
return groups; |
||||
|
}); |
||||
|
const folded = reactive({}); |
||||
|
const allFolded = computed(() => groupedSvcs.value.length > 0 && groupedSvcs.value.every((g) => folded[g.v])); |
||||
|
const templatesByCat = computed(() => { |
||||
|
return SCAT.map((sc) => ({ |
||||
|
cat: sc.v, |
||||
|
label: sc.label, |
||||
|
items: templates.value.filter((t) => t.category === sc.v) |
||||
|
})).filter((g) => g.items.length); |
||||
|
}); |
||||
|
const templatesForType = computed(() => templates.value.filter((t) => t.category === editType.value)); |
||||
|
const syncVisible = ref(false); |
||||
|
ref(false); |
||||
|
const syncDesc = ref(""); |
||||
|
const syncScopeNote = ref(""); |
||||
|
const syncTargets = ref([]); |
||||
|
const syncRegionList = computed(() => REGIONS.filter((r) => r.value !== curRegion.value)); |
||||
|
const tplModalVisible = ref(false); |
||||
|
const tplView = ref("list"); |
||||
|
const tplEditing = ref(false); |
||||
|
const tplForm = reactive({ id: "", category: 2, provider: "", name: "", description: "" }); |
||||
|
const tplFields = ref([]); |
||||
|
watch([() => editForm.provider, isVoiceCat, svcModalVisible], ([provider, isVoice, visible]) => { |
||||
|
if (!visible || !isVoice) { |
||||
|
voiceRows.value = []; |
||||
|
return; |
||||
|
} |
||||
|
loadVoicesForProvider(provider); |
||||
|
}, { immediate: false }); |
||||
|
return (_ctx, _push, _parent, _attrs) => { |
||||
|
const _component_LangSelect = __nuxt_component_0; |
||||
|
_push(`<div${ssrRenderAttrs(_attrs)} data-v-e10e0bc9>`); |
||||
|
if (!backendReady.value) { |
||||
|
_push(`<div class="mb-4 rounded-lg px-4 py-3 text-sm" style="${ssrRenderStyle({ "background": "#fffbeb", "border": "1px solid #fde68a", "color": "#92400e" })}" data-v-e10e0bc9> ⚠ 「第三方服务配置」后端接口暂不可用(连接失败),请检查 console 服务是否运行。 </div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div class="flex items-center justify-between mb-5" data-v-e10e0bc9><div data-v-e10e0bc9><h2 class="text-lg font-semibold text-slate-800" data-v-e10e0bc9>第三方服务配置</h2><p class="text-xs text-slate-400 mt-1" data-v-e10e0bc9>按服务类型分组管理已接入的第三方服务(火山引擎、阿里云、Azure 等)。默认展示<b data-v-e10e0bc9>全局默认</b>配置,可切换到具体应用;区域默认<b data-v-e10e0bc9>中国</b>,切换区域后点击卡片可为该区域覆盖字段值。</p></div><div class="flex items-center gap-3" data-v-e10e0bc9><select class="select select-bordered select-sm" data-v-e10e0bc9><option value="" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`); |
||||
|
ssrRenderList(scopeApps.value, (a) => { |
||||
|
_push(`<option${ssrRenderAttr("value", a)} data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>应用:${ssrInterpolate(a)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select><select class="select select-bordered select-sm" data-v-e10e0bc9><option${ssrRenderAttr("value", 0)} data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, 0) : ssrLooseEqual(curRegion.value, 0)) ? " selected" : ""}>默认(全区域)</option><!--[-->`); |
||||
|
ssrRenderList(REGIONS, (r) => { |
||||
|
_push(`<option${ssrRenderAttr("value", r.value)} data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, r.value) : ssrLooseEqual(curRegion.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>${ssrInterpolate(allFolded.value ? "展开全部" : "折叠全部")}</button><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>服务商模板</button><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>+ 添加服务</button></div></div>`); |
||||
|
if (curRegion.value !== 0) { |
||||
|
_push(`<div class="rounded-lg px-3 py-2 mb-4 text-xs" style="${ssrRenderStyle({ "background": "#fefce8", "border": "1px solid #fde047", "color": "#854d0e" })}" data-v-e10e0bc9> ✦ 当前处于「${ssrInterpolate(curRegionLabel.value)}」区域视图:点击服务卡片编辑该区域的字段分叉(覆盖值 / 停用字段 / 区域专属字段)。要改服务本身的默认配置,请切回「默认(全区域)」。 </div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (groupedSvcs.value.length) { |
||||
|
_push(`<div class="flex flex-col gap-6" data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(groupedSvcs.value, (g) => { |
||||
|
_push(`<section data-v-e10e0bc9><div class="group-head" data-v-e10e0bc9><span class="${ssrRenderClass([{ folded: folded[g.v] }, "fold-arrow"])}" data-v-e10e0bc9>▾</span><span class="cat-chip" style="${ssrRenderStyle({ color: g.color, background: g.bg })}" data-v-e10e0bc9>${ssrInterpolate(g.short)}</span><h3 class="text-sm font-semibold text-slate-700" data-v-e10e0bc9>${ssrInterpolate(g.label)}</h3><span class="text-xs text-slate-400" data-v-e10e0bc9>${ssrInterpolate(g.items.length)} 个服务</span><div class="flex-1 h-px bg-slate-100 ml-2" data-v-e10e0bc9></div></div><div class="svc-grid" style="${ssrRenderStyle(!folded[g.v] ? null : { display: "none" })}" data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(g.items, (s) => { |
||||
|
_push(`<div class="${ssrRenderClass([{ off: !s.enable }, "svc-card"])}" data-v-e10e0bc9><div class="card-head" data-v-e10e0bc9><div class="svc-logo" style="${ssrRenderStyle({ background: s.color || "#6366f1" })}" data-v-e10e0bc9>${ssrInterpolate(s.icon || (s.name || "").charAt(0))}</div><div class="head-text" data-v-e10e0bc9><div class="name-line" data-v-e10e0bc9><span class="svc-name"${ssrRenderAttr("title", s.name)} data-v-e10e0bc9>${ssrInterpolate(s.name)}</span><span class="${ssrRenderClass([s.enable ? "on" : "off", "state-chip"])}" data-v-e10e0bc9>${ssrInterpolate(s.enable ? "启用" : "停用")}</span></div><p class="svc-id"${ssrRenderAttr("title", s.id)} data-v-e10e0bc9>${ssrInterpolate(s.id)}</p></div></div><p class="svc-desc"${ssrRenderAttr("title", s.description || "")} data-v-e10e0bc9>${ssrInterpolate(s.description || "—")}</p><div class="meta-row" data-v-e10e0bc9>`); |
||||
|
if (s.provider) { |
||||
|
_push(`<span class="provider-chip"${ssrRenderAttr("title", s.provider)} data-v-e10e0bc9>${ssrInterpolate(s.provider)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<span class="field-count" data-v-e10e0bc9>${ssrInterpolate((s.fields || []).length)} 字段</span>`); |
||||
|
if (encCount(s)) { |
||||
|
_push(`<span class="lock-badge" data-v-e10e0bc9>🔒${ssrInterpolate(encCount(s))}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><div class="region-row" data-v-e10e0bc9><span class="${ssrRenderClass([regionChip(s).cls, "region-chip"])}"${ssrRenderAttr("title", regionChip(s).title)} data-v-e10e0bc9>${ssrInterpolate(regionChip(s).text)}</span></div></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--><div class="svc-card add-card" data-v-e10e0bc9><span class="text-2xl text-slate-300" data-v-e10e0bc9>+</span><span class="text-xs text-slate-400 mt-1" data-v-e10e0bc9>添加${ssrInterpolate(g.short)}服务</span></div></div></section>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
} else { |
||||
|
_push(`<div class="bg-white rounded-2xl border border-slate-100 shadow-sm text-center text-slate-300 py-20" data-v-e10e0bc9><div class="text-5xl mb-3" data-v-e10e0bc9>⚙️</div><p class="text-sm mb-4" data-v-e10e0bc9>尚未配置任何第三方服务</p><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>+ 添加服务</button></div>`); |
||||
|
} |
||||
|
if (svcModalVisible.value) { |
||||
|
_push(`<div class="modal-overlay" data-v-e10e0bc9><div class="svc-box" data-v-e10e0bc9>`); |
||||
|
if (detailMode.value === "default" && curSvc.value) { |
||||
|
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-e10e0bc9><div class="flex items-center gap-3" data-v-e10e0bc9><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-e10e0bc9>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>${ssrInterpolate(curSvc.value.name)}</h3><p class="text-xs text-slate-400 mt-0.5" data-v-e10e0bc9>${ssrInterpolate(curSvc.value.id)}`); |
||||
|
if (editForm.provider) { |
||||
|
_push(`<span data-v-e10e0bc9> · 服务商 ${ssrInterpolate(editForm.provider)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</p></div></div><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-error btn-sm btn-outline" data-v-e10e0bc9>删除服务</button><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>保存</button><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>关闭</button></div></div><div class="divider text-xs text-slate-400 my-3" data-v-e10e0bc9>基本信息</div><div class="grid grid-cols-2 gap-4 mb-4" data-v-e10e0bc9><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" data-v-e10e0bc9></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>启用</span></label><input${ssrIncludeBooleanAttr(Array.isArray(editForm.enable) ? ssrLooseContain(editForm.enable, null) : editForm.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-3" data-v-e10e0bc9></div></div><div class="form-control mb-4" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" data-v-e10e0bc9></div><div class="mb-4" data-v-e10e0bc9><p class="text-sm font-medium text-slate-700 mb-2" data-v-e10e0bc9>服务类型</p>`); |
||||
|
if (editType.value) { |
||||
|
_push(`<span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(editType.value).color, background: scatInfo(editType.value).bg })}" data-v-e10e0bc9>${ssrInterpolate(scatInfo(editType.value).short)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<span class="text-xs text-slate-500 ml-2" data-v-e10e0bc9>${ssrInterpolate(editType.value ? scatInfo(editType.value).label : "未设置")}</span><span class="text-[11px] text-slate-400 ml-2" data-v-e10e0bc9>(类型在创建时确定,不可更改)</span></div>`); |
||||
|
if (isVoiceCat.value) { |
||||
|
_push(`<div class="voice-card" data-v-e10e0bc9><div class="flex items-center justify-between" data-v-e10e0bc9><span class="text-sm font-medium text-slate-700" data-v-e10e0bc9>内置音色表</span><span class="flex items-center gap-2" data-v-e10e0bc9><span class="text-[11px] text-slate-400" data-v-e10e0bc9>`); |
||||
|
if (voicesLoading.value) { |
||||
|
_push(`<!--[-->加载中…<!--]-->`); |
||||
|
} else if (voiceRows.value.length) { |
||||
|
_push(`<!--[-->${ssrInterpolate(editForm.provider)} · ${ssrInterpolate(voiceRows.value.length)} 个音色 / ${ssrInterpolate(voiceLangGroups.value.length)} 种语言<!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!--[-->未覆盖 ${ssrInterpolate(editForm.provider || "该服务商")}<!--]-->`); |
||||
|
} |
||||
|
_push(`</span>`); |
||||
|
if (voiceRows.value.length) { |
||||
|
_push(`<button class="btn btn-ghost btn-xs" data-v-e10e0bc9>填入 languages</button>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</span></div>`); |
||||
|
if (!voicesLoading.value && !voiceRows.value.length) { |
||||
|
_push(`<p class="text-[11px] text-slate-400 mt-1" data-v-e10e0bc9> 内置音色表里没有这家服务商,不影响接入——Agent 配音色时手填服务商的音色 id 即可。 </p>`); |
||||
|
} else if (voiceRows.value.length) { |
||||
|
_push(`<div class="voice-lang-list" data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(voiceLangGroups.value, (g) => { |
||||
|
_push(`<div class="voice-lang-row" data-v-e10e0bc9><span class="voice-lang" data-v-e10e0bc9>${ssrInterpolate(g.lang)}</span><span class="voice-ids" data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(g.items, (v, i) => { |
||||
|
_push(`<span class="voice-pill"${ssrRenderAttr("title", v.name)} data-v-e10e0bc9>${ssrInterpolate(v.gender === 1 ? "♂" : v.gender === 2 ? "♀" : "·")} ${ssrInterpolate(v.voice_id)}`); |
||||
|
if (i === 0) { |
||||
|
_push(`<em data-v-e10e0bc9>默认</em>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</span>`); |
||||
|
}); |
||||
|
_push(`<!--]--></span></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (voiceRows.value.length) { |
||||
|
_push(`<p class="text-[11px] text-slate-400 mt-1" data-v-e10e0bc9> 这 ${ssrInterpolate(voiceLangGroups.value.length)} 种语言就是该服务能说的语言,已作为下方 languages 的预填值——通话翻译、AI 助手排查「这条链路有没有服务支持」看的就是它。 音色本身是代码里的常量表(后端 comm/ttsvoice.go),实际用哪个在 Agent 里按语言+性别选,同组第一个是默认。 </p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div class="divider text-xs text-slate-400 my-3" data-v-e10e0bc9>配置字段(全区域共用)</div>`); |
||||
|
if (isMcpType()) { |
||||
|
_push(`<div class="rounded-lg px-3 py-2 mb-3 text-xs" style="${ssrRenderStyle({ "background": "#f0fdfa", "border": "1px solid #99f6e4", "color": "#0f766e" })}" data-v-e10e0bc9> ✦ MCP 服务与其他第三方服务同表存储(svc_config):这里填的 url/type/tools 为<b data-v-e10e0bc9>全区域默认</b>; 只在某些区域生效的地址,切到对应区域做分叉即可,卡片上会显示已分叉的区域数。 </div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div data-v-e10e0bc9>`); |
||||
|
if (!editFields.value.length) { |
||||
|
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-e10e0bc9>尚无字段,点击下方添加</p>`); |
||||
|
} else { |
||||
|
_push(`<div class="overflow-x-auto" data-v-e10e0bc9><table class="table text-xs" data-v-e10e0bc9><thead data-v-e10e0bc9><tr data-v-e10e0bc9><th class="w-44" data-v-e10e0bc9>字段名</th><th data-v-e10e0bc9>字段描述</th><th class="w-16 text-center" data-v-e10e0bc9>加密</th><th data-v-e10e0bc9>默认值</th><th class="w-12" data-v-e10e0bc9></th></tr></thead><tbody data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(editFields.value, (f, i) => { |
||||
|
_push(`<tr data-v-e10e0bc9><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-e10e0bc9></td><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-e10e0bc9></td><td class="text-center" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-e10e0bc9></td><td data-v-e10e0bc9>`); |
||||
|
if (f.type === "langs") { |
||||
|
_push(ssrRenderComponent(_component_LangSelect, { |
||||
|
modelValue: f.def_value, |
||||
|
"onUpdate:modelValue": ($event) => f.def_value = $event, |
||||
|
multiple: true |
||||
|
}, null, _parent)); |
||||
|
} else if (f.type === "lang") { |
||||
|
_push(ssrRenderComponent(_component_LangSelect, { |
||||
|
modelValue: f.def_value, |
||||
|
"onUpdate:modelValue": ($event) => f.def_value = $event |
||||
|
}, null, _parent)); |
||||
|
} else if (f.encrypted) { |
||||
|
_push(`<!--[--><div class="relative" data-v-e10e0bc9><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-e10e0bc9><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-e10e0bc9>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-e10e0bc9>🔒 加密</span><!--]-->`); |
||||
|
} else if (isMcpType() && f.key === "type") { |
||||
|
_push(`<select class="field-input" data-v-e10e0bc9><option value="0" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "0") : ssrLooseEqual(f.def_value, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "1") : ssrLooseEqual(f.def_value, "1")) ? " selected" : ""}>SSE</option></select>`); |
||||
|
} else { |
||||
|
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-e10e0bc9>`); |
||||
|
} |
||||
|
_push(`</td><td data-v-e10e0bc9><button class="btn btn-ghost btn-xs text-error" data-v-e10e0bc9>×</button></td></tr>`); |
||||
|
}); |
||||
|
_push(`<!--]--></tbody></table></div>`); |
||||
|
} |
||||
|
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-e10e0bc9>+ 添加字段</button></div><!--]-->`); |
||||
|
} else if (detailMode.value === "new") { |
||||
|
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>新增第三方服务</h3><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>取消</button></div><div class="wizard-steps mb-5" data-v-e10e0bc9><div class="${ssrRenderClass([{ on: wizardStep.value >= 1, cur: wizardStep.value === 1 }, "wstep"])}" data-v-e10e0bc9>① 服务类型`); |
||||
|
if (editType.value) { |
||||
|
_push(`<span data-v-e10e0bc9> · ${ssrInterpolate(scatInfo(editType.value).short)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><div class="wline" data-v-e10e0bc9></div><div class="${ssrRenderClass([{ on: wizardStep.value >= 2, cur: wizardStep.value === 2, disabled: !editType.value }, "wstep"])}" data-v-e10e0bc9>② 服务商`); |
||||
|
if (editForm.provider) { |
||||
|
_push(`<span data-v-e10e0bc9> · ${ssrInterpolate(editForm.provider)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><div class="wline" data-v-e10e0bc9></div><div class="${ssrRenderClass([{ on: wizardStep.value >= 3, cur: wizardStep.value === 3, disabled: wizardStep.value < 3 }, "wstep"])}" data-v-e10e0bc9>③ 配置</div></div>`); |
||||
|
if (wizardStep.value === 1) { |
||||
|
_push(`<!--[--><p class="text-sm text-slate-500 mb-3" data-v-e10e0bc9>请选择要接入的服务类型(每个服务归属单一类型,独立配置):</p><div class="type-grid" data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(SCAT, (sc) => { |
||||
|
_push(`<div class="${ssrRenderClass([{ on: editType.value === sc.v }, "type-card"])}" data-v-e10e0bc9><span class="cat-chip" style="${ssrRenderStyle({ color: sc.color, background: sc.bg })}" data-v-e10e0bc9>${ssrInterpolate(sc.short)}</span><span class="text-sm text-slate-700 mt-2" data-v-e10e0bc9>${ssrInterpolate(sc.label)}</span></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div><!--]-->`); |
||||
|
} else if (wizardStep.value === 2) { |
||||
|
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-e10e0bc9><p class="text-sm text-slate-500" data-v-e10e0bc9>为「${ssrInterpolate(scatInfo(editType.value).label)}」选择服务商:</p><button class="btn btn-ghost btn-xs" data-v-e10e0bc9>← 上一步</button></div><div class="type-grid" data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(templatesForType.value, (t) => { |
||||
|
_push(`<div class="${ssrRenderClass([{ on: selectedTemplateId.value === t.id }, "type-card"])}" data-v-e10e0bc9><span class="provider-chip" data-v-e10e0bc9>${ssrInterpolate(t.provider)}</span><span class="text-sm text-slate-700 mt-2" data-v-e10e0bc9>${ssrInterpolate(t.name)}</span><span class="text-[11px] text-slate-400 mt-0.5" data-v-e10e0bc9>${ssrInterpolate((t.fields || []).length)} 字段</span></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--><div class="type-card" data-v-e10e0bc9><span class="provider-chip" style="${ssrRenderStyle({ "background": "#f1f5f9", "color": "#475569" })}" data-v-e10e0bc9>自定义</span><span class="text-sm text-slate-700 mt-2" data-v-e10e0bc9>空白自定义</span><span class="text-[11px] text-slate-400 mt-0.5" data-v-e10e0bc9>手动添加字段</span></div></div>`); |
||||
|
if (!templatesForType.value.length) { |
||||
|
_push(`<p class="text-xs text-slate-400 mt-2" data-v-e10e0bc9>该类型暂无内置模板,可选「空白自定义」,或到「服务商模板」新增。</p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-e10e0bc9><div class="flex items-center gap-2" data-v-e10e0bc9><span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(editType.value).color, background: scatInfo(editType.value).bg })}" data-v-e10e0bc9>${ssrInterpolate(scatInfo(editType.value).short)}</span>`); |
||||
|
if (editForm.provider) { |
||||
|
_push(`<span class="provider-chip" data-v-e10e0bc9>${ssrInterpolate(editForm.provider)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-ghost btn-xs" data-v-e10e0bc9>← 上一步</button><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>创建</button></div></div><div class="grid grid-cols-2 gap-4 mb-4" data-v-e10e0bc9><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务ID * <span class="text-slate-400 text-xs" data-v-e10e0bc9>(唯一,如 tts_azure)</span></span></label><input${ssrRenderAttr("value", editForm.id)} class="input input-bordered font-mono" placeholder="tts_azure" data-v-e10e0bc9></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" placeholder="微软 Azure TTS" data-v-e10e0bc9></div></div><div class="grid grid-cols-2 gap-4 mb-4" data-v-e10e0bc9><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务商标识 <span class="text-slate-400 text-xs" data-v-e10e0bc9>(如 azure/alibaba)</span></span></label><input${ssrRenderAttr("value", editForm.provider)} class="input input-bordered font-mono" placeholder="azure" data-v-e10e0bc9></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>启用</span></label><input${ssrIncludeBooleanAttr(Array.isArray(editForm.enable) ? ssrLooseContain(editForm.enable, null) : editForm.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-3" data-v-e10e0bc9></div></div><div class="form-control mb-4" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text" data-v-e10e0bc9>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" placeholder="简述该服务的用途" data-v-e10e0bc9></div>`); |
||||
|
if (isVoiceCat.value) { |
||||
|
_push(`<div class="voice-card" data-v-e10e0bc9><div class="flex items-center justify-between" data-v-e10e0bc9><span class="text-sm font-medium text-slate-700" data-v-e10e0bc9>内置音色表</span><span class="text-[11px] text-slate-400" data-v-e10e0bc9>`); |
||||
|
if (voicesLoading.value) { |
||||
|
_push(`<!--[-->加载中…<!--]-->`); |
||||
|
} else if (voiceRows.value.length) { |
||||
|
_push(`<!--[-->${ssrInterpolate(editForm.provider)} · ${ssrInterpolate(voiceRows.value.length)} 个音色 / ${ssrInterpolate(voiceLangGroups.value.length)} 种语言<!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!--[-->未覆盖 ${ssrInterpolate(editForm.provider || "该服务商")}<!--]-->`); |
||||
|
} |
||||
|
_push(`</span></div>`); |
||||
|
if (!voicesLoading.value && !voiceRows.value.length) { |
||||
|
_push(`<p class="text-[11px] text-slate-400 mt-1" data-v-e10e0bc9> 内置音色表里没有这家服务商,不影响接入——Agent 配音色时手填服务商的音色 id 即可。 </p>`); |
||||
|
} else if (voiceRows.value.length) { |
||||
|
_push(`<div class="voice-lang-list" data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(voiceLangGroups.value, (g) => { |
||||
|
_push(`<div class="voice-lang-row" data-v-e10e0bc9><span class="voice-lang" data-v-e10e0bc9>${ssrInterpolate(g.lang)}</span><span class="voice-ids" data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(g.items, (v, i) => { |
||||
|
_push(`<span class="voice-pill"${ssrRenderAttr("title", v.name)} data-v-e10e0bc9>${ssrInterpolate(v.gender === 1 ? "♂" : v.gender === 2 ? "♀" : "·")} ${ssrInterpolate(v.voice_id)}`); |
||||
|
if (i === 0) { |
||||
|
_push(`<em data-v-e10e0bc9>默认</em>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</span>`); |
||||
|
}); |
||||
|
_push(`<!--]--></span></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (voiceRows.value.length) { |
||||
|
_push(`<p class="text-[11px] text-slate-400 mt-1" data-v-e10e0bc9> 这 ${ssrInterpolate(voiceLangGroups.value.length)} 种语言就是该服务能说的语言,已作为下方 languages 的预填值——通话翻译、AI 助手排查「这条链路有没有服务支持」看的就是它。 音色本身是代码里的常量表(后端 comm/ttsvoice.go),实际用哪个在 Agent 里按语言+性别选,同组第一个是默认。 </p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div class="divider text-xs text-slate-400 my-3" data-v-e10e0bc9>配置字段</div><div data-v-e10e0bc9>`); |
||||
|
if (!editFields.value.length) { |
||||
|
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-e10e0bc9>尚无字段,选模板自动带出或点击下方添加</p>`); |
||||
|
} else { |
||||
|
_push(`<div class="overflow-x-auto" data-v-e10e0bc9><table class="table text-xs" data-v-e10e0bc9><thead data-v-e10e0bc9><tr data-v-e10e0bc9><th class="w-44" data-v-e10e0bc9>字段名</th><th data-v-e10e0bc9>字段描述</th><th class="w-16 text-center" data-v-e10e0bc9>加密</th><th data-v-e10e0bc9>默认值</th><th class="w-12" data-v-e10e0bc9></th></tr></thead><tbody data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(editFields.value, (f, i) => { |
||||
|
_push(`<tr data-v-e10e0bc9><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-e10e0bc9></td><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-e10e0bc9></td><td class="text-center" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-e10e0bc9></td><td data-v-e10e0bc9>`); |
||||
|
if (f.type === "langs") { |
||||
|
_push(ssrRenderComponent(_component_LangSelect, { |
||||
|
modelValue: f.def_value, |
||||
|
"onUpdate:modelValue": ($event) => f.def_value = $event, |
||||
|
multiple: true |
||||
|
}, null, _parent)); |
||||
|
} else if (f.type === "lang") { |
||||
|
_push(ssrRenderComponent(_component_LangSelect, { |
||||
|
modelValue: f.def_value, |
||||
|
"onUpdate:modelValue": ($event) => f.def_value = $event |
||||
|
}, null, _parent)); |
||||
|
} else if (f.encrypted) { |
||||
|
_push(`<!--[--><div class="relative" data-v-e10e0bc9><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-e10e0bc9><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-e10e0bc9>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-e10e0bc9>🔒 加密</span><!--]-->`); |
||||
|
} else if (isMcpType() && f.key === "type") { |
||||
|
_push(`<select class="field-input" data-v-e10e0bc9><option value="0" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "0") : ssrLooseEqual(f.def_value, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "1") : ssrLooseEqual(f.def_value, "1")) ? " selected" : ""}>SSE</option></select>`); |
||||
|
} else { |
||||
|
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-e10e0bc9>`); |
||||
|
} |
||||
|
_push(`</td><td data-v-e10e0bc9><button class="btn btn-ghost btn-xs text-error" data-v-e10e0bc9>×</button></td></tr>`); |
||||
|
}); |
||||
|
_push(`<!--]--></tbody></table></div>`); |
||||
|
} |
||||
|
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-e10e0bc9>+ 添加字段</button></div><!--]-->`); |
||||
|
} |
||||
|
_push(`<!--]-->`); |
||||
|
} else if (detailMode.value === "region" && curSvc.value) { |
||||
|
_push(`<!--[-->`); |
||||
|
if (regionLoading.value) { |
||||
|
_push(`<div class="text-center py-10 text-slate-400" data-v-e10e0bc9>加载中...</div>`); |
||||
|
} else { |
||||
|
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-e10e0bc9><div class="flex items-center gap-3" data-v-e10e0bc9><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-e10e0bc9>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>${ssrInterpolate(curSvc.value.name)}</h3><span class="badge badge-warning badge-sm mt-0.5" data-v-e10e0bc9>${ssrInterpolate(curRegionLabel.value)} 分叉模式</span></div></div><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>保存分叉</button><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>关闭</button></div></div><div class="rounded-lg px-3 py-2 mb-4 text-xs" style="${ssrRenderStyle({ "background": "#fefce8", "border": "1px solid #fde047", "color": "#854d0e" })}" data-v-e10e0bc9> ✦ 当前编辑「${ssrInterpolate(curRegionLabel.value)}」的字段分叉:默认字段可覆盖值或勾选「不适用」停用;也可新增本区域专属字段。留空的覆盖字段继承默认值,加密字段留空保留已存储密文。 </div><p class="text-sm font-medium text-slate-700 mb-2" data-v-e10e0bc9>默认字段</p><div class="overflow-x-auto" data-v-e10e0bc9><table class="table text-xs" data-v-e10e0bc9><thead data-v-e10e0bc9><tr data-v-e10e0bc9><th class="w-44" data-v-e10e0bc9>字段名</th><th data-v-e10e0bc9>字段描述</th><th class="w-24 text-center" data-v-e10e0bc9>状态</th><th class="w-20 text-center" data-v-e10e0bc9>本区域不适用</th><th data-v-e10e0bc9>有效值</th></tr></thead><tbody data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(overrideFields.value, (f, i) => { |
||||
|
_push(`<tr class="${ssrRenderClass({ "opacity-50": f.disabled })}" data-v-e10e0bc9><td class="font-mono text-slate-700 break-all"${ssrRenderAttr("title", f.key)} data-v-e10e0bc9>${ssrInterpolate(f.key)}</td><td class="text-slate-500" data-v-e10e0bc9>${ssrInterpolate(f.description)}</td><td class="text-center" data-v-e10e0bc9>`); |
||||
|
if (f.disabled) { |
||||
|
_push(`<span class="disabled-badge" data-v-e10e0bc9>停用</span>`); |
||||
|
} else if (f.is_overridden) { |
||||
|
_push(`<span class="override-badge" data-v-e10e0bc9>覆盖</span>`); |
||||
|
} else { |
||||
|
_push(`<span class="inherit-badge" data-v-e10e0bc9>继承</span>`); |
||||
|
} |
||||
|
_push(`</td><td class="text-center" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs"${ssrIncludeBooleanAttr(Array.isArray(f.disabled) ? ssrLooseContain(f.disabled, null) : f.disabled) ? " checked" : ""} data-v-e10e0bc9></td><td data-v-e10e0bc9>`); |
||||
|
if (f.type === "langs") { |
||||
|
_push(ssrRenderComponent(_component_LangSelect, { |
||||
|
modelValue: f._input, |
||||
|
"onUpdate:modelValue": ($event) => f._input = $event, |
||||
|
multiple: true, |
||||
|
disabled: f.disabled |
||||
|
}, null, _parent)); |
||||
|
} else if (f.type === "lang") { |
||||
|
_push(ssrRenderComponent(_component_LangSelect, { |
||||
|
modelValue: f._input, |
||||
|
"onUpdate:modelValue": ($event) => f._input = $event, |
||||
|
disabled: f.disabled |
||||
|
}, null, _parent)); |
||||
|
} else if (f.encrypted) { |
||||
|
_push(`<!--[--><div class="relative" data-v-e10e0bc9><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)}${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""} placeholder="留空继承默认" data-v-e10e0bc9><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-e10e0bc9>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-e10e0bc9>🔒</span><!--]-->`); |
||||
|
} else if (isMcpType() && f.key === "type") { |
||||
|
_push(`<select class="field-input"${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""} data-v-e10e0bc9><option value="" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "") : ssrLooseEqual(f._input, "")) ? " selected" : ""}>继承默认</option><option value="0" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "0") : ssrLooseEqual(f._input, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "1") : ssrLooseEqual(f._input, "1")) ? " selected" : ""}>SSE</option></select>`); |
||||
|
} else { |
||||
|
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)}${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""}${ssrRenderAttr("placeholder", "留空继承:" + (f.value || ""))} data-v-e10e0bc9>`); |
||||
|
} |
||||
|
_push(`</td></tr>`); |
||||
|
}); |
||||
|
_push(`<!--]-->`); |
||||
|
if (!overrideFields.value.length) { |
||||
|
_push(`<tr data-v-e10e0bc9><td colspan="5" class="text-center text-slate-400 py-3" data-v-e10e0bc9>该服务尚无默认字段</td></tr>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</tbody></table></div><div class="divider text-xs text-slate-400 my-3" data-v-e10e0bc9>${ssrInterpolate(curRegionLabel.value)} 专属字段</div><div data-v-e10e0bc9>`); |
||||
|
if (!extraRegionFields.value.length) { |
||||
|
_push(`<p class="text-xs text-slate-400 py-2 text-center" data-v-e10e0bc9>尚无区域专属字段,点击下方添加</p>`); |
||||
|
} else { |
||||
|
_push(`<div class="overflow-x-auto" data-v-e10e0bc9><table class="table text-xs" data-v-e10e0bc9><thead data-v-e10e0bc9><tr data-v-e10e0bc9><th class="w-44" data-v-e10e0bc9>字段名</th><th data-v-e10e0bc9>字段描述</th><th class="w-16 text-center" data-v-e10e0bc9>加密</th><th data-v-e10e0bc9>值</th><th class="w-12" data-v-e10e0bc9></th></tr></thead><tbody data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(extraRegionFields.value, (f, i) => { |
||||
|
_push(`<tr data-v-e10e0bc9><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-e10e0bc9></td><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-e10e0bc9></td><td class="text-center" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-e10e0bc9></td><td data-v-e10e0bc9>`); |
||||
|
if (f.encrypted) { |
||||
|
_push(`<!--[--><div class="relative" data-v-e10e0bc9><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)} placeholder="留空保留原值" data-v-e10e0bc9><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-e10e0bc9>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-e10e0bc9>🔒</span><!--]-->`); |
||||
|
} else { |
||||
|
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)} data-v-e10e0bc9>`); |
||||
|
} |
||||
|
_push(`</td><td data-v-e10e0bc9><button class="btn btn-ghost btn-xs text-error" data-v-e10e0bc9>×</button></td></tr>`); |
||||
|
}); |
||||
|
_push(`<!--]--></tbody></table></div>`); |
||||
|
} |
||||
|
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-e10e0bc9>+ 添加区域专属字段</button></div><!--]-->`); |
||||
|
} |
||||
|
_push(`<!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div class="modal-overlay" style="${ssrRenderStyle([ |
||||
|
{ "z-index": "120" }, |
||||
|
syncVisible.value ? null : { display: "none" } |
||||
|
])}" data-v-e10e0bc9><div class="sync-box" data-v-e10e0bc9><div class="flex items-start gap-3 mb-4" data-v-e10e0bc9><div style="${ssrRenderStyle({ "width": "42px", "height": "42px", "background": "linear-gradient(135deg,#4f46e5,#7c3aed)", "border-radius": "13px", "display": "flex", "align-items": "center", "justify-content": "center", "flex-shrink": "0" })}" data-v-e10e0bc9><svg style="${ssrRenderStyle({ "width": "20px", "height": "20px", "color": "#fff" })}" fill="none" viewBox="0 0 24 24" stroke="currentColor" data-v-e10e0bc9><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" data-v-e10e0bc9></path></svg></div><div data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>同步到其他区域</h3><p class="text-xs text-slate-400 mt-1" data-v-e10e0bc9>${ssrInterpolate(syncDesc.value)}</p></div></div><div class="text-xs px-3 py-2 rounded-lg mb-3" style="${ssrRenderStyle({ "background": "#f0fdf4", "border": "1px solid #bbf7d0", "color": "#15803d" })}" data-v-e10e0bc9>${syncScopeNote.value ?? ""}</div><div class="flex items-center justify-between mb-1" data-v-e10e0bc9><span class="text-xs font-semibold text-slate-500" data-v-e10e0bc9>选择目标区域</span><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-ghost btn-xs" data-v-e10e0bc9>全选</button><button class="btn btn-ghost btn-xs" data-v-e10e0bc9>清空</button></div></div><div class="sync-region-grid" data-v-e10e0bc9><!--[-->`);
|
||||
|
ssrRenderList(syncRegionList.value, (r) => { |
||||
|
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-e10e0bc9><span data-v-e10e0bc9>${ssrInterpolate(r.label)}</span></label>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-e10e0bc9>⚠ 已勾选区域将被当前配置(值覆盖 / 区域专属字段 / 停用字段)整体替换;加密字段密文一并同步。</p><div class="flex gap-3 justify-end" data-v-e10e0bc9><button class="btn btn-ghost" data-v-e10e0bc9>仅保存当前区域</button><button class="btn btn-primary text-white" data-v-e10e0bc9>保存并同步</button></div></div></div><div class="modal-overlay" style="${ssrRenderStyle([ |
||||
|
{ "z-index": "130" }, |
||||
|
tplModalVisible.value ? null : { display: "none" } |
||||
|
])}" data-v-e10e0bc9><div class="tpl-box" data-v-e10e0bc9>`);
|
||||
|
if (tplView.value === "list") { |
||||
|
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-e10e0bc9><div data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>服务商模板</h3><p class="text-xs text-slate-400 mt-1" data-v-e10e0bc9>模板是字段预设,新增服务时可一键带出。内置模板可编辑;删除后重启会被重新补回。</p></div><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>+ 新增模板</button><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>关闭</button></div></div><div class="tpl-list" data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(templatesByCat.value, (g) => { |
||||
|
_push(`<div class="mb-3" data-v-e10e0bc9><p class="text-xs font-semibold text-slate-500 mb-1" data-v-e10e0bc9>${ssrInterpolate(g.label)}</p><!--[-->`); |
||||
|
ssrRenderList(g.items, (t) => { |
||||
|
_push(`<div class="tpl-row" data-v-e10e0bc9><div style="${ssrRenderStyle({ "min-width": "0", "flex": "1" })}" data-v-e10e0bc9><div class="flex items-center gap-2" data-v-e10e0bc9><span class="font-semibold text-sm text-slate-800 truncate" data-v-e10e0bc9>${ssrInterpolate(t.name)}</span><span class="provider-chip" data-v-e10e0bc9>${ssrInterpolate(t.provider)}</span>`); |
||||
|
if (t.builtin) { |
||||
|
_push(`<span class="badge badge-xs badge-ghost" data-v-e10e0bc9>内置</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><p class="text-xs text-slate-400 mt-0.5" data-v-e10e0bc9>${ssrInterpolate(t.id)} · ${ssrInterpolate((t.fields || []).length)} 字段</p></div><div class="flex gap-1" data-v-e10e0bc9><button class="btn btn-ghost btn-xs" data-v-e10e0bc9>编辑</button><button class="btn btn-ghost btn-xs text-error" data-v-e10e0bc9>删除</button></div></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
}); |
||||
|
_push(`<!--]-->`); |
||||
|
if (!templates.value.length) { |
||||
|
_push(`<p class="text-xs text-slate-400 text-center py-6" data-v-e10e0bc9>暂无模板</p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-e10e0bc9><h3 class="text-base font-semibold text-slate-800" data-v-e10e0bc9>${ssrInterpolate(tplEditing.value ? "编辑模板" : "新增模板")}</h3><div class="flex gap-2" data-v-e10e0bc9><button class="btn btn-ghost btn-sm" data-v-e10e0bc9>返回</button><button class="btn btn-primary btn-sm text-white" data-v-e10e0bc9>保存</button></div></div><div class="grid grid-cols-2 gap-3 mb-3" data-v-e10e0bc9><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text text-xs" data-v-e10e0bc9>模板ID *</span></label><input${ssrRenderAttr("value", tplForm.id)}${ssrIncludeBooleanAttr(tplEditing.value) ? " disabled" : ""} class="input input-bordered input-sm font-mono" placeholder="tts_azure" data-v-e10e0bc9></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text text-xs" data-v-e10e0bc9>类别 *</span></label><select class="select select-bordered select-sm" data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(SCAT, (sc) => { |
||||
|
_push(`<option${ssrRenderAttr("value", sc.v)} data-v-e10e0bc9${ssrIncludeBooleanAttr(Array.isArray(tplForm.category) ? ssrLooseContain(tplForm.category, sc.v) : ssrLooseEqual(tplForm.category, sc.v)) ? " selected" : ""}>${ssrInterpolate(sc.label)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text text-xs" data-v-e10e0bc9>服务商标识 *</span></label><input${ssrRenderAttr("value", tplForm.provider)} class="input input-bordered input-sm font-mono" placeholder="azure" data-v-e10e0bc9></div><div class="form-control" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text text-xs" data-v-e10e0bc9>展示名 *</span></label><input${ssrRenderAttr("value", tplForm.name)} class="input input-bordered input-sm" placeholder="微软 Azure TTS" data-v-e10e0bc9></div></div><div class="form-control mb-3" data-v-e10e0bc9><label class="label" data-v-e10e0bc9><span class="label-text text-xs" data-v-e10e0bc9>描述</span></label><input${ssrRenderAttr("value", tplForm.description)} class="input input-bordered input-sm" data-v-e10e0bc9></div><p class="text-sm font-medium text-slate-700 mb-1" data-v-e10e0bc9>字段</p><div class="overflow-x-auto" style="${ssrRenderStyle({ "max-height": "34vh" })}" data-v-e10e0bc9><table class="table text-xs" data-v-e10e0bc9><thead data-v-e10e0bc9><tr data-v-e10e0bc9><th class="w-44" data-v-e10e0bc9>字段名</th><th data-v-e10e0bc9>字段描述</th><th class="w-16 text-center" data-v-e10e0bc9>加密</th><th data-v-e10e0bc9>默认/提示值</th><th class="w-12" data-v-e10e0bc9></th></tr></thead><tbody data-v-e10e0bc9><!--[-->`); |
||||
|
ssrRenderList(tplFields.value, (f, i) => { |
||||
|
_push(`<tr data-v-e10e0bc9><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-e10e0bc9></td><td data-v-e10e0bc9><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-e10e0bc9></td><td class="text-center" data-v-e10e0bc9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-e10e0bc9></td><td data-v-e10e0bc9>`); |
||||
|
if (f.type === "langs") { |
||||
|
_push(ssrRenderComponent(_component_LangSelect, { |
||||
|
modelValue: f.def_value, |
||||
|
"onUpdate:modelValue": ($event) => f.def_value = $event, |
||||
|
multiple: true |
||||
|
}, null, _parent)); |
||||
|
} else if (f.type === "lang") { |
||||
|
_push(ssrRenderComponent(_component_LangSelect, { |
||||
|
modelValue: f.def_value, |
||||
|
"onUpdate:modelValue": ($event) => f.def_value = $event |
||||
|
}, null, _parent)); |
||||
|
} else { |
||||
|
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} placeholder="可留空" data-v-e10e0bc9>`); |
||||
|
} |
||||
|
_push(`</td><td data-v-e10e0bc9><button class="btn btn-ghost btn-xs text-error" data-v-e10e0bc9>×</button></td></tr>`); |
||||
|
}); |
||||
|
_push(`<!--]-->`); |
||||
|
if (!tplFields.value.length) { |
||||
|
_push(`<tr data-v-e10e0bc9><td colspan="5" class="text-center text-slate-400 py-2" data-v-e10e0bc9>尚无字段</td></tr>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</tbody></table></div><button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-e10e0bc9>+ 添加字段</button><!--]-->`); |
||||
|
} |
||||
|
_push(`</div></div></div>`); |
||||
|
}; |
||||
|
} |
||||
|
}); |
||||
|
const _sfc_setup = _sfc_main.setup; |
||||
|
_sfc_main.setup = (props, ctx) => { |
||||
|
const ssrContext = useSSRContext(); |
||||
|
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/serviceconfig.vue"); |
||||
|
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
||||
|
}; |
||||
|
const serviceconfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-e10e0bc9"]]); |
||||
|
|
||||
|
export { serviceconfig as default }; |
||||
|
//# sourceMappingURL=serviceconfig-Bq9We0Qx.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"serviceconfig-Bq9We0Qx.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-Bq9We0Qx.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1,454 +0,0 @@ |
|||||
import { _ as __nuxt_component_0 } from './LangSelect-Bvw-e1Cn.mjs'; |
|
||||
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; |
|
||||
import { ssrRenderAttrs, ssrRenderStyle, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderClass, ssrRenderComponent, ssrRenderDynamicModel } from 'vue/server-renderer'; |
|
||||
import { u as useApi } from './useApi-BNSkSrat.mjs'; |
|
||||
import { u as useToast } from './useToast-MBvLaNjH.mjs'; |
|
||||
import { _ as _export_sfc } from './server.mjs'; |
|
||||
import './useLangOptions-CXXbv5NM.mjs'; |
|
||||
import '../nitro/nitro.mjs'; |
|
||||
import 'node:http'; |
|
||||
import 'node:https'; |
|
||||
import 'node:events'; |
|
||||
import 'node:buffer'; |
|
||||
import 'node:fs'; |
|
||||
import 'node:path'; |
|
||||
import 'node:crypto'; |
|
||||
import 'node:url'; |
|
||||
import '../routes/renderer.mjs'; |
|
||||
import 'vue-bundle-renderer/runtime'; |
|
||||
import 'unhead/server'; |
|
||||
import 'devalue'; |
|
||||
import 'unhead/utils'; |
|
||||
import 'pinia'; |
|
||||
import 'perfect-debounce'; |
|
||||
|
|
||||
const SCAT_MCP = 10; |
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({ |
|
||||
__name: "serviceconfig", |
|
||||
__ssrInlineRender: true, |
|
||||
setup(__props) { |
|
||||
const REGIONS = [ |
|
||||
{ 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: "印度" } |
|
||||
]; |
|
||||
const SCAT = [ |
|
||||
{ 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" } |
|
||||
]; |
|
||||
useApi(); |
|
||||
useToast(); |
|
||||
const scopeApp = ref(""); |
|
||||
const scopeApps = ref([]); |
|
||||
function scatInfo(v) { |
|
||||
return SCAT.find((s) => s.v === v) || { short: "?", color: "#999", bg: "#eee", v: 0, label: "" }; |
|
||||
} |
|
||||
function isMcpType() { |
|
||||
if (editType.value === SCAT_MCP) return true; |
|
||||
return !!curSvc.value && parseCats(curSvc.value.categories).includes(SCAT_MCP); |
|
||||
} |
|
||||
function parseCats(s) { |
|
||||
return (s || "").split(",").map((x) => parseInt(x) || 0).filter((x) => x > 0); |
|
||||
} |
|
||||
function encCount(s) { |
|
||||
return (s.fields || []).filter((f) => f.encrypted).length; |
|
||||
} |
|
||||
function regionChip(s) { |
|
||||
const rs = svcRegions.value[s.id] || []; |
|
||||
const names = rs.map((v) => REGIONS.find((x) => x.value === v)?.label || "区域" + v); |
|
||||
if (curRegion.value === 0) { |
|
||||
if (!rs.length) return { text: "全区域通用", cls: "plain", title: "未做任何区域分叉,各区域都用默认配置" }; |
|
||||
return { text: rs.length + " 区域分叉", cls: "has", title: "已分叉:" + names.join("、") }; |
|
||||
} |
|
||||
if (rs.includes(curRegion.value)) { |
|
||||
return { text: "本区域已分叉", cls: "has", title: curRegionLabel.value + "有独立的字段配置" }; |
|
||||
} |
|
||||
return { text: "继承默认", cls: "plain", title: curRegionLabel.value + "未分叉,使用默认配置" }; |
|
||||
} |
|
||||
const backendReady = ref(true); |
|
||||
const allSvcs = ref([]); |
|
||||
const svcRegions = ref({}); |
|
||||
const curSvc = ref(null); |
|
||||
const curRegion = ref(0); |
|
||||
const svcModalVisible = ref(false); |
|
||||
const detailMode = ref("default"); |
|
||||
const editForm = reactive({ id: "", name: "", provider: "", description: "", enable: false }); |
|
||||
const editType = ref(0); |
|
||||
const editFields = ref([]); |
|
||||
const selectedTemplateId = ref(""); |
|
||||
const wizardStep = ref(1); |
|
||||
const overrideFields = ref([]); |
|
||||
const extraRegionFields = ref([]); |
|
||||
const regionLoading = ref(false); |
|
||||
const templates = ref([]); |
|
||||
const curRegionLabel = computed(() => { |
|
||||
const r = REGIONS.find((x) => x.value === curRegion.value); |
|
||||
return r ? r.label : "区域" + curRegion.value; |
|
||||
}); |
|
||||
const groupedSvcs = computed(() => { |
|
||||
const groups = SCAT.map((sc) => ({ |
|
||||
...sc, |
|
||||
items: allSvcs.value.filter((s) => parseCats(s.categories).includes(sc.v)) |
|
||||
})).filter((g) => g.items.length); |
|
||||
const unclassified = allSvcs.value.filter((s) => !parseCats(s.categories).length); |
|
||||
if (unclassified.length) { |
|
||||
groups.push({ v: 0, label: "未分类", short: "未分类", color: "#64748b", bg: "#f1f5f9", items: unclassified }); |
|
||||
} |
|
||||
return groups; |
|
||||
}); |
|
||||
const templatesByCat = computed(() => { |
|
||||
return SCAT.map((sc) => ({ |
|
||||
cat: sc.v, |
|
||||
label: sc.label, |
|
||||
items: templates.value.filter((t) => t.category === sc.v) |
|
||||
})).filter((g) => g.items.length); |
|
||||
}); |
|
||||
const templatesForType = computed(() => templates.value.filter((t) => t.category === editType.value)); |
|
||||
const syncVisible = ref(false); |
|
||||
ref(false); |
|
||||
const syncDesc = ref(""); |
|
||||
const syncScopeNote = ref(""); |
|
||||
const syncTargets = ref([]); |
|
||||
const syncRegionList = computed(() => REGIONS.filter((r) => r.value !== curRegion.value)); |
|
||||
const tplModalVisible = ref(false); |
|
||||
const tplView = ref("list"); |
|
||||
const tplEditing = ref(false); |
|
||||
const tplForm = reactive({ id: "", category: 2, provider: "", name: "", description: "" }); |
|
||||
const tplFields = ref([]); |
|
||||
return (_ctx, _push, _parent, _attrs) => { |
|
||||
const _component_LangSelect = __nuxt_component_0; |
|
||||
_push(`<div${ssrRenderAttrs(_attrs)} data-v-8fc1a20c>`); |
|
||||
if (!backendReady.value) { |
|
||||
_push(`<div class="mb-4 rounded-lg px-4 py-3 text-sm" style="${ssrRenderStyle({ "background": "#fffbeb", "border": "1px solid #fde68a", "color": "#92400e" })}" data-v-8fc1a20c> ⚠ 「第三方服务配置」后端接口暂不可用(连接失败),请检查 console 服务是否运行。 </div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<div class="flex items-center justify-between mb-5" data-v-8fc1a20c><div data-v-8fc1a20c><h2 class="text-lg font-semibold text-slate-800" data-v-8fc1a20c>第三方服务配置</h2><p class="text-xs text-slate-400 mt-1" data-v-8fc1a20c>按服务类型分组管理已接入的第三方服务(火山引擎、阿里云、Azure 等)。默认展示<b data-v-8fc1a20c>全局默认</b>配置,可切换到具体应用;区域默认<b data-v-8fc1a20c>中国</b>,切换区域后点击卡片可为该区域覆盖字段值。</p></div><div class="flex items-center gap-3" data-v-8fc1a20c><select class="select select-bordered select-sm" data-v-8fc1a20c><option value="" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`); |
|
||||
ssrRenderList(scopeApps.value, (a) => { |
|
||||
_push(`<option${ssrRenderAttr("value", a)} data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>应用:${ssrInterpolate(a)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select><select class="select select-bordered select-sm" data-v-8fc1a20c><option${ssrRenderAttr("value", 0)} data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, 0) : ssrLooseEqual(curRegion.value, 0)) ? " selected" : ""}>默认(全区域)</option><!--[-->`); |
|
||||
ssrRenderList(REGIONS, (r) => { |
|
||||
_push(`<option${ssrRenderAttr("value", r.value)} data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(curRegion.value) ? ssrLooseContain(curRegion.value, r.value) : ssrLooseEqual(curRegion.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>服务商模板</button><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>+ 添加服务</button></div></div>`); |
|
||||
if (curRegion.value !== 0) { |
|
||||
_push(`<div class="rounded-lg px-3 py-2 mb-4 text-xs" style="${ssrRenderStyle({ "background": "#fefce8", "border": "1px solid #fde047", "color": "#854d0e" })}" data-v-8fc1a20c> ✦ 当前处于「${ssrInterpolate(curRegionLabel.value)}」区域视图:点击服务卡片编辑该区域的字段分叉(覆盖值 / 停用字段 / 区域专属字段)。要改服务本身的默认配置,请切回「默认(全区域)」。 </div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
if (groupedSvcs.value.length) { |
|
||||
_push(`<div class="flex flex-col gap-6" data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(groupedSvcs.value, (g) => { |
|
||||
_push(`<section data-v-8fc1a20c><div class="flex items-center gap-2 mb-3" data-v-8fc1a20c><span class="cat-chip" style="${ssrRenderStyle({ color: g.color, background: g.bg })}" data-v-8fc1a20c>${ssrInterpolate(g.short)}</span><h3 class="text-sm font-semibold text-slate-700" data-v-8fc1a20c>${ssrInterpolate(g.label)}</h3><span class="text-xs text-slate-400" data-v-8fc1a20c>${ssrInterpolate(g.items.length)} 个服务</span><div class="flex-1 h-px bg-slate-100 ml-2" data-v-8fc1a20c></div></div><div class="svc-grid" data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(g.items, (s) => { |
|
||||
_push(`<div class="${ssrRenderClass([{ off: !s.enable }, "svc-card"])}" data-v-8fc1a20c><div class="card-head" data-v-8fc1a20c><div class="svc-logo" style="${ssrRenderStyle({ background: s.color || "#6366f1" })}" data-v-8fc1a20c>${ssrInterpolate(s.icon || (s.name || "").charAt(0))}</div><div class="head-text" data-v-8fc1a20c><div class="name-line" data-v-8fc1a20c><span class="svc-name"${ssrRenderAttr("title", s.name)} data-v-8fc1a20c>${ssrInterpolate(s.name)}</span><span class="${ssrRenderClass([s.enable ? "on" : "off", "state-chip"])}" data-v-8fc1a20c>${ssrInterpolate(s.enable ? "启用" : "停用")}</span></div><p class="svc-id"${ssrRenderAttr("title", s.id)} data-v-8fc1a20c>${ssrInterpolate(s.id)}</p></div></div><p class="svc-desc"${ssrRenderAttr("title", s.description || "")} data-v-8fc1a20c>${ssrInterpolate(s.description || "—")}</p><div class="chip-row" data-v-8fc1a20c>`); |
|
||||
if (s.provider) { |
|
||||
_push(`<span class="provider-chip"${ssrRenderAttr("title", s.provider)} data-v-8fc1a20c>${ssrInterpolate(s.provider)}</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<span class="field-count" data-v-8fc1a20c>${ssrInterpolate((s.fields || []).length)} 字段</span>`); |
|
||||
if (encCount(s)) { |
|
||||
_push(`<span class="lock-badge" data-v-8fc1a20c>🔒${ssrInterpolate(encCount(s))}</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<span class="${ssrRenderClass([regionChip(s).cls, "region-chip"])}"${ssrRenderAttr("title", regionChip(s).title)} data-v-8fc1a20c>${ssrInterpolate(regionChip(s).text)}</span></div></div>`); |
|
||||
}); |
|
||||
_push(`<!--]--><div class="svc-card add-card" data-v-8fc1a20c><span class="text-2xl text-slate-300" data-v-8fc1a20c>+</span><span class="text-xs text-slate-400 mt-1" data-v-8fc1a20c>添加${ssrInterpolate(g.short)}服务</span></div></div></section>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div>`); |
|
||||
} else { |
|
||||
_push(`<div class="bg-white rounded-2xl border border-slate-100 shadow-sm text-center text-slate-300 py-20" data-v-8fc1a20c><div class="text-5xl mb-3" data-v-8fc1a20c>⚙️</div><p class="text-sm mb-4" data-v-8fc1a20c>尚未配置任何第三方服务</p><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>+ 添加服务</button></div>`); |
|
||||
} |
|
||||
if (svcModalVisible.value) { |
|
||||
_push(`<div class="modal-overlay" data-v-8fc1a20c><div class="svc-box" data-v-8fc1a20c>`); |
|
||||
if (detailMode.value === "default" && curSvc.value) { |
|
||||
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-8fc1a20c><div class="flex items-center gap-3" data-v-8fc1a20c><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-8fc1a20c>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>${ssrInterpolate(curSvc.value.name)}</h3><p class="text-xs text-slate-400 mt-0.5" data-v-8fc1a20c>${ssrInterpolate(curSvc.value.id)}`); |
|
||||
if (editForm.provider) { |
|
||||
_push(`<span data-v-8fc1a20c> · 服务商 ${ssrInterpolate(editForm.provider)}</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</p></div></div><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-error btn-sm btn-outline" data-v-8fc1a20c>删除服务</button><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>保存</button><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>关闭</button></div></div><div class="divider text-xs text-slate-400 my-3" data-v-8fc1a20c>基本信息</div><div class="grid grid-cols-2 gap-4 mb-4" data-v-8fc1a20c><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" data-v-8fc1a20c></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>启用</span></label><input${ssrIncludeBooleanAttr(Array.isArray(editForm.enable) ? ssrLooseContain(editForm.enable, null) : editForm.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-3" data-v-8fc1a20c></div></div><div class="form-control mb-4" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" data-v-8fc1a20c></div><div class="mb-4" data-v-8fc1a20c><p class="text-sm font-medium text-slate-700 mb-2" data-v-8fc1a20c>服务类型</p>`); |
|
||||
if (editType.value) { |
|
||||
_push(`<span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(editType.value).color, background: scatInfo(editType.value).bg })}" data-v-8fc1a20c>${ssrInterpolate(scatInfo(editType.value).short)}</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<span class="text-xs text-slate-500 ml-2" data-v-8fc1a20c>${ssrInterpolate(editType.value ? scatInfo(editType.value).label : "未设置")}</span><span class="text-[11px] text-slate-400 ml-2" data-v-8fc1a20c>(类型在创建时确定,不可更改)</span></div><div class="divider text-xs text-slate-400 my-3" data-v-8fc1a20c>配置字段(全区域共用)</div>`); |
|
||||
if (isMcpType()) { |
|
||||
_push(`<div class="rounded-lg px-3 py-2 mb-3 text-xs" style="${ssrRenderStyle({ "background": "#f0fdfa", "border": "1px solid #99f6e4", "color": "#0f766e" })}" data-v-8fc1a20c> ✦ MCP 服务与其他第三方服务同表存储(svc_config):这里填的 url/type/tools 为<b data-v-8fc1a20c>全区域默认</b>; 只在某些区域生效的地址,切到对应区域做分叉即可,卡片上会显示已分叉的区域数。 </div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<div data-v-8fc1a20c>`); |
|
||||
if (!editFields.value.length) { |
|
||||
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-8fc1a20c>尚无字段,点击下方添加</p>`); |
|
||||
} else { |
|
||||
_push(`<div class="overflow-x-auto" data-v-8fc1a20c><table class="table text-xs" data-v-8fc1a20c><thead data-v-8fc1a20c><tr data-v-8fc1a20c><th class="w-44" data-v-8fc1a20c>字段名</th><th data-v-8fc1a20c>字段描述</th><th class="w-16 text-center" data-v-8fc1a20c>加密</th><th data-v-8fc1a20c>默认值</th><th class="w-12" data-v-8fc1a20c></th></tr></thead><tbody data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(editFields.value, (f, i) => { |
|
||||
_push(`<tr data-v-8fc1a20c><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-8fc1a20c></td><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-8fc1a20c></td><td class="text-center" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-8fc1a20c></td><td data-v-8fc1a20c>`); |
|
||||
if (f.type === "langs") { |
|
||||
_push(ssrRenderComponent(_component_LangSelect, { |
|
||||
modelValue: f.def_value, |
|
||||
"onUpdate:modelValue": ($event) => f.def_value = $event, |
|
||||
multiple: true |
|
||||
}, null, _parent)); |
|
||||
} else if (f.type === "lang") { |
|
||||
_push(ssrRenderComponent(_component_LangSelect, { |
|
||||
modelValue: f.def_value, |
|
||||
"onUpdate:modelValue": ($event) => f.def_value = $event |
|
||||
}, null, _parent)); |
|
||||
} else if (f.encrypted) { |
|
||||
_push(`<!--[--><div class="relative" data-v-8fc1a20c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-8fc1a20c><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8fc1a20c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8fc1a20c>🔒 加密</span><!--]-->`); |
|
||||
} else if (isMcpType() && f.key === "type") { |
|
||||
_push(`<select class="field-input" data-v-8fc1a20c><option value="0" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "0") : ssrLooseEqual(f.def_value, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "1") : ssrLooseEqual(f.def_value, "1")) ? " selected" : ""}>SSE</option></select>`); |
|
||||
} else { |
|
||||
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-8fc1a20c>`); |
|
||||
} |
|
||||
_push(`</td><td data-v-8fc1a20c><button class="btn btn-ghost btn-xs text-error" data-v-8fc1a20c>×</button></td></tr>`); |
|
||||
}); |
|
||||
_push(`<!--]--></tbody></table></div>`); |
|
||||
} |
|
||||
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-8fc1a20c>+ 添加字段</button></div><!--]-->`); |
|
||||
} else if (detailMode.value === "new") { |
|
||||
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>新增第三方服务</h3><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>取消</button></div><div class="wizard-steps mb-5" data-v-8fc1a20c><div class="${ssrRenderClass([{ on: wizardStep.value >= 1, cur: wizardStep.value === 1 }, "wstep"])}" data-v-8fc1a20c>① 服务类型`); |
|
||||
if (editType.value) { |
|
||||
_push(`<span data-v-8fc1a20c> · ${ssrInterpolate(scatInfo(editType.value).short)}</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div><div class="wline" data-v-8fc1a20c></div><div class="${ssrRenderClass([{ on: wizardStep.value >= 2, cur: wizardStep.value === 2, disabled: !editType.value }, "wstep"])}" data-v-8fc1a20c>② 服务商`); |
|
||||
if (editForm.provider) { |
|
||||
_push(`<span data-v-8fc1a20c> · ${ssrInterpolate(editForm.provider)}</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div><div class="wline" data-v-8fc1a20c></div><div class="${ssrRenderClass([{ on: wizardStep.value >= 3, cur: wizardStep.value === 3, disabled: wizardStep.value < 3 }, "wstep"])}" data-v-8fc1a20c>③ 配置</div></div>`); |
|
||||
if (wizardStep.value === 1) { |
|
||||
_push(`<!--[--><p class="text-sm text-slate-500 mb-3" data-v-8fc1a20c>请选择要接入的服务类型(每个服务归属单一类型,独立配置):</p><div class="type-grid" data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(SCAT, (sc) => { |
|
||||
_push(`<div class="${ssrRenderClass([{ on: editType.value === sc.v }, "type-card"])}" data-v-8fc1a20c><span class="cat-chip" style="${ssrRenderStyle({ color: sc.color, background: sc.bg })}" data-v-8fc1a20c>${ssrInterpolate(sc.short)}</span><span class="text-sm text-slate-700 mt-2" data-v-8fc1a20c>${ssrInterpolate(sc.label)}</span></div>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div><!--]-->`); |
|
||||
} else if (wizardStep.value === 2) { |
|
||||
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-8fc1a20c><p class="text-sm text-slate-500" data-v-8fc1a20c>为「${ssrInterpolate(scatInfo(editType.value).label)}」选择服务商:</p><button class="btn btn-ghost btn-xs" data-v-8fc1a20c>← 上一步</button></div><div class="type-grid" data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(templatesForType.value, (t) => { |
|
||||
_push(`<div class="${ssrRenderClass([{ on: selectedTemplateId.value === t.id }, "type-card"])}" data-v-8fc1a20c><span class="provider-chip" data-v-8fc1a20c>${ssrInterpolate(t.provider)}</span><span class="text-sm text-slate-700 mt-2" data-v-8fc1a20c>${ssrInterpolate(t.name)}</span><span class="text-[11px] text-slate-400 mt-0.5" data-v-8fc1a20c>${ssrInterpolate((t.fields || []).length)} 字段</span></div>`); |
|
||||
}); |
|
||||
_push(`<!--]--><div class="type-card" data-v-8fc1a20c><span class="provider-chip" style="${ssrRenderStyle({ "background": "#f1f5f9", "color": "#475569" })}" data-v-8fc1a20c>自定义</span><span class="text-sm text-slate-700 mt-2" data-v-8fc1a20c>空白自定义</span><span class="text-[11px] text-slate-400 mt-0.5" data-v-8fc1a20c>手动添加字段</span></div></div>`); |
|
||||
if (!templatesForType.value.length) { |
|
||||
_push(`<p class="text-xs text-slate-400 mt-2" data-v-8fc1a20c>该类型暂无内置模板,可选「空白自定义」,或到「服务商模板」新增。</p>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<!--]-->`); |
|
||||
} else { |
|
||||
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-8fc1a20c><div class="flex items-center gap-2" data-v-8fc1a20c><span class="cat-chip" style="${ssrRenderStyle({ color: scatInfo(editType.value).color, background: scatInfo(editType.value).bg })}" data-v-8fc1a20c>${ssrInterpolate(scatInfo(editType.value).short)}</span>`); |
|
||||
if (editForm.provider) { |
|
||||
_push(`<span class="provider-chip" data-v-8fc1a20c>${ssrInterpolate(editForm.provider)}</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-ghost btn-xs" data-v-8fc1a20c>← 上一步</button><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>创建</button></div></div><div class="grid grid-cols-2 gap-4 mb-4" data-v-8fc1a20c><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务ID * <span class="text-slate-400 text-xs" data-v-8fc1a20c>(唯一,如 tts_azure)</span></span></label><input${ssrRenderAttr("value", editForm.id)} class="input input-bordered font-mono" placeholder="tts_azure" data-v-8fc1a20c></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务名称 *</span></label><input${ssrRenderAttr("value", editForm.name)} class="input input-bordered" placeholder="微软 Azure TTS" data-v-8fc1a20c></div></div><div class="grid grid-cols-2 gap-4 mb-4" data-v-8fc1a20c><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务商标识 <span class="text-slate-400 text-xs" data-v-8fc1a20c>(如 azure/alibaba)</span></span></label><input${ssrRenderAttr("value", editForm.provider)} class="input input-bordered font-mono" placeholder="azure" data-v-8fc1a20c></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>启用</span></label><input${ssrIncludeBooleanAttr(Array.isArray(editForm.enable) ? ssrLooseContain(editForm.enable, null) : editForm.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-3" data-v-8fc1a20c></div></div><div class="form-control mb-4" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text" data-v-8fc1a20c>服务描述</span></label><input${ssrRenderAttr("value", editForm.description)} class="input input-bordered" placeholder="简述该服务的用途" data-v-8fc1a20c></div><div class="divider text-xs text-slate-400 my-3" data-v-8fc1a20c>配置字段</div><div data-v-8fc1a20c>`); |
|
||||
if (!editFields.value.length) { |
|
||||
_push(`<p class="text-xs text-slate-400 py-4 text-center" data-v-8fc1a20c>尚无字段,选模板自动带出或点击下方添加</p>`); |
|
||||
} else { |
|
||||
_push(`<div class="overflow-x-auto" data-v-8fc1a20c><table class="table text-xs" data-v-8fc1a20c><thead data-v-8fc1a20c><tr data-v-8fc1a20c><th class="w-44" data-v-8fc1a20c>字段名</th><th data-v-8fc1a20c>字段描述</th><th class="w-16 text-center" data-v-8fc1a20c>加密</th><th data-v-8fc1a20c>默认值</th><th class="w-12" data-v-8fc1a20c></th></tr></thead><tbody data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(editFields.value, (f, i) => { |
|
||||
_push(`<tr data-v-8fc1a20c><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-8fc1a20c></td><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-8fc1a20c></td><td class="text-center" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-8fc1a20c></td><td data-v-8fc1a20c>`); |
|
||||
if (f.type === "langs") { |
|
||||
_push(ssrRenderComponent(_component_LangSelect, { |
|
||||
modelValue: f.def_value, |
|
||||
"onUpdate:modelValue": ($event) => f.def_value = $event, |
|
||||
multiple: true |
|
||||
}, null, _parent)); |
|
||||
} else if (f.type === "lang") { |
|
||||
_push(ssrRenderComponent(_component_LangSelect, { |
|
||||
modelValue: f.def_value, |
|
||||
"onUpdate:modelValue": ($event) => f.def_value = $event |
|
||||
}, null, _parent)); |
|
||||
} else if (f.encrypted) { |
|
||||
_push(`<!--[--><div class="relative" data-v-8fc1a20c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f.def_value, null)} placeholder="留空保留原值" data-v-8fc1a20c><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8fc1a20c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8fc1a20c>🔒 加密</span><!--]-->`); |
|
||||
} else if (isMcpType() && f.key === "type") { |
|
||||
_push(`<select class="field-input" data-v-8fc1a20c><option value="0" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "0") : ssrLooseEqual(f.def_value, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f.def_value) ? ssrLooseContain(f.def_value, "1") : ssrLooseEqual(f.def_value, "1")) ? " selected" : ""}>SSE</option></select>`); |
|
||||
} else { |
|
||||
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} data-v-8fc1a20c>`); |
|
||||
} |
|
||||
_push(`</td><td data-v-8fc1a20c><button class="btn btn-ghost btn-xs text-error" data-v-8fc1a20c>×</button></td></tr>`); |
|
||||
}); |
|
||||
_push(`<!--]--></tbody></table></div>`); |
|
||||
} |
|
||||
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-8fc1a20c>+ 添加字段</button></div><!--]-->`); |
|
||||
} |
|
||||
_push(`<!--]-->`); |
|
||||
} else if (detailMode.value === "region" && curSvc.value) { |
|
||||
_push(`<!--[-->`); |
|
||||
if (regionLoading.value) { |
|
||||
_push(`<div class="text-center py-10 text-slate-400" data-v-8fc1a20c>加载中...</div>`); |
|
||||
} else { |
|
||||
_push(`<!--[--><div class="flex items-center justify-between mb-5" data-v-8fc1a20c><div class="flex items-center gap-3" data-v-8fc1a20c><div class="svc-logo" style="${ssrRenderStyle({ background: curSvc.value.color || "#6366f1", width: "44px", height: "44px", fontSize: "20px" })}" data-v-8fc1a20c>${ssrInterpolate(curSvc.value.icon || (curSvc.value.name || "").charAt(0))}</div><div data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>${ssrInterpolate(curSvc.value.name)}</h3><span class="badge badge-warning badge-sm mt-0.5" data-v-8fc1a20c>${ssrInterpolate(curRegionLabel.value)} 分叉模式</span></div></div><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>保存分叉</button><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>关闭</button></div></div><div class="rounded-lg px-3 py-2 mb-4 text-xs" style="${ssrRenderStyle({ "background": "#fefce8", "border": "1px solid #fde047", "color": "#854d0e" })}" data-v-8fc1a20c> ✦ 当前编辑「${ssrInterpolate(curRegionLabel.value)}」的字段分叉:默认字段可覆盖值或勾选「不适用」停用;也可新增本区域专属字段。留空的覆盖字段继承默认值,加密字段留空保留已存储密文。 </div><p class="text-sm font-medium text-slate-700 mb-2" data-v-8fc1a20c>默认字段</p><div class="overflow-x-auto" data-v-8fc1a20c><table class="table text-xs" data-v-8fc1a20c><thead data-v-8fc1a20c><tr data-v-8fc1a20c><th class="w-44" data-v-8fc1a20c>字段名</th><th data-v-8fc1a20c>字段描述</th><th class="w-24 text-center" data-v-8fc1a20c>状态</th><th class="w-20 text-center" data-v-8fc1a20c>本区域不适用</th><th data-v-8fc1a20c>有效值</th></tr></thead><tbody data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(overrideFields.value, (f, i) => { |
|
||||
_push(`<tr class="${ssrRenderClass({ "opacity-50": f.disabled })}" data-v-8fc1a20c><td class="font-mono text-slate-700 break-all"${ssrRenderAttr("title", f.key)} data-v-8fc1a20c>${ssrInterpolate(f.key)}</td><td class="text-slate-500" data-v-8fc1a20c>${ssrInterpolate(f.description)}</td><td class="text-center" data-v-8fc1a20c>`); |
|
||||
if (f.disabled) { |
|
||||
_push(`<span class="disabled-badge" data-v-8fc1a20c>停用</span>`); |
|
||||
} else if (f.is_overridden) { |
|
||||
_push(`<span class="override-badge" data-v-8fc1a20c>覆盖</span>`); |
|
||||
} else { |
|
||||
_push(`<span class="inherit-badge" data-v-8fc1a20c>继承</span>`); |
|
||||
} |
|
||||
_push(`</td><td class="text-center" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs"${ssrIncludeBooleanAttr(Array.isArray(f.disabled) ? ssrLooseContain(f.disabled, null) : f.disabled) ? " checked" : ""} data-v-8fc1a20c></td><td data-v-8fc1a20c>`); |
|
||||
if (f.type === "langs") { |
|
||||
_push(ssrRenderComponent(_component_LangSelect, { |
|
||||
modelValue: f._input, |
|
||||
"onUpdate:modelValue": ($event) => f._input = $event, |
|
||||
multiple: true, |
|
||||
disabled: f.disabled |
|
||||
}, null, _parent)); |
|
||||
} else if (f.type === "lang") { |
|
||||
_push(ssrRenderComponent(_component_LangSelect, { |
|
||||
modelValue: f._input, |
|
||||
"onUpdate:modelValue": ($event) => f._input = $event, |
|
||||
disabled: f.disabled |
|
||||
}, null, _parent)); |
|
||||
} else if (f.encrypted) { |
|
||||
_push(`<!--[--><div class="relative" data-v-8fc1a20c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)}${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""} placeholder="留空继承默认" data-v-8fc1a20c><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8fc1a20c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8fc1a20c>🔒</span><!--]-->`); |
|
||||
} else if (isMcpType() && f.key === "type") { |
|
||||
_push(`<select class="field-input"${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""} data-v-8fc1a20c><option value="" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "") : ssrLooseEqual(f._input, "")) ? " selected" : ""}>继承默认</option><option value="0" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "0") : ssrLooseEqual(f._input, "0")) ? " selected" : ""}>HTTP</option><option value="1" data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(f._input) ? ssrLooseContain(f._input, "1") : ssrLooseEqual(f._input, "1")) ? " selected" : ""}>SSE</option></select>`); |
|
||||
} else { |
|
||||
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)}${ssrIncludeBooleanAttr(f.disabled) ? " disabled" : ""}${ssrRenderAttr("placeholder", "留空继承:" + (f.value || ""))} data-v-8fc1a20c>`); |
|
||||
} |
|
||||
_push(`</td></tr>`); |
|
||||
}); |
|
||||
_push(`<!--]-->`); |
|
||||
if (!overrideFields.value.length) { |
|
||||
_push(`<tr data-v-8fc1a20c><td colspan="5" class="text-center text-slate-400 py-3" data-v-8fc1a20c>该服务尚无默认字段</td></tr>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</tbody></table></div><div class="divider text-xs text-slate-400 my-3" data-v-8fc1a20c>${ssrInterpolate(curRegionLabel.value)} 专属字段</div><div data-v-8fc1a20c>`); |
|
||||
if (!extraRegionFields.value.length) { |
|
||||
_push(`<p class="text-xs text-slate-400 py-2 text-center" data-v-8fc1a20c>尚无区域专属字段,点击下方添加</p>`); |
|
||||
} else { |
|
||||
_push(`<div class="overflow-x-auto" data-v-8fc1a20c><table class="table text-xs" data-v-8fc1a20c><thead data-v-8fc1a20c><tr data-v-8fc1a20c><th class="w-44" data-v-8fc1a20c>字段名</th><th data-v-8fc1a20c>字段描述</th><th class="w-16 text-center" data-v-8fc1a20c>加密</th><th data-v-8fc1a20c>值</th><th class="w-12" data-v-8fc1a20c></th></tr></thead><tbody data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(extraRegionFields.value, (f, i) => { |
|
||||
_push(`<tr data-v-8fc1a20c><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-8fc1a20c></td><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-8fc1a20c></td><td class="text-center" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-8fc1a20c></td><td data-v-8fc1a20c>`); |
|
||||
if (f.encrypted) { |
|
||||
_push(`<!--[--><div class="relative" data-v-8fc1a20c><input${ssrRenderAttr("type", f._show ? "text" : "password")} class="field-input pr-14"${ssrRenderDynamicModel(f._show ? "text" : "password", f._input, null)} placeholder="留空保留原值" data-v-8fc1a20c><button type="button" class="absolute right-2 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-8fc1a20c>${ssrInterpolate(f._show ? "隐藏" : "显示")}</button></div><span class="lock-badge ml-1" data-v-8fc1a20c>🔒</span><!--]-->`); |
|
||||
} else { |
|
||||
_push(`<input class="field-input"${ssrRenderAttr("value", f._input)} data-v-8fc1a20c>`); |
|
||||
} |
|
||||
_push(`</td><td data-v-8fc1a20c><button class="btn btn-ghost btn-xs text-error" data-v-8fc1a20c>×</button></td></tr>`); |
|
||||
}); |
|
||||
_push(`<!--]--></tbody></table></div>`); |
|
||||
} |
|
||||
_push(`<button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-8fc1a20c>+ 添加区域专属字段</button></div><!--]-->`); |
|
||||
} |
|
||||
_push(`<!--]-->`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div></div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<div class="modal-overlay" style="${ssrRenderStyle([ |
|
||||
{ "z-index": "120" }, |
|
||||
syncVisible.value ? null : { display: "none" } |
|
||||
])}" data-v-8fc1a20c><div class="sync-box" data-v-8fc1a20c><div class="flex items-start gap-3 mb-4" data-v-8fc1a20c><div style="${ssrRenderStyle({ "width": "42px", "height": "42px", "background": "linear-gradient(135deg,#4f46e5,#7c3aed)", "border-radius": "13px", "display": "flex", "align-items": "center", "justify-content": "center", "flex-shrink": "0" })}" data-v-8fc1a20c><svg style="${ssrRenderStyle({ "width": "20px", "height": "20px", "color": "#fff" })}" fill="none" viewBox="0 0 24 24" stroke="currentColor" data-v-8fc1a20c><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" data-v-8fc1a20c></path></svg></div><div data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>同步到其他区域</h3><p class="text-xs text-slate-400 mt-1" data-v-8fc1a20c>${ssrInterpolate(syncDesc.value)}</p></div></div><div class="text-xs px-3 py-2 rounded-lg mb-3" style="${ssrRenderStyle({ "background": "#f0fdf4", "border": "1px solid #bbf7d0", "color": "#15803d" })}" data-v-8fc1a20c>${syncScopeNote.value ?? ""}</div><div class="flex items-center justify-between mb-1" data-v-8fc1a20c><span class="text-xs font-semibold text-slate-500" data-v-8fc1a20c>选择目标区域</span><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-ghost btn-xs" data-v-8fc1a20c>全选</button><button class="btn btn-ghost btn-xs" data-v-8fc1a20c>清空</button></div></div><div class="sync-region-grid" data-v-8fc1a20c><!--[-->`);
|
|
||||
ssrRenderList(syncRegionList.value, (r) => { |
|
||||
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-8fc1a20c><span data-v-8fc1a20c>${ssrInterpolate(r.label)}</span></label>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-8fc1a20c>⚠ 已勾选区域将被当前配置(值覆盖 / 区域专属字段 / 停用字段)整体替换;加密字段密文一并同步。</p><div class="flex gap-3 justify-end" data-v-8fc1a20c><button class="btn btn-ghost" data-v-8fc1a20c>仅保存当前区域</button><button class="btn btn-primary text-white" data-v-8fc1a20c>保存并同步</button></div></div></div><div class="modal-overlay" style="${ssrRenderStyle([ |
|
||||
{ "z-index": "130" }, |
|
||||
tplModalVisible.value ? null : { display: "none" } |
|
||||
])}" data-v-8fc1a20c><div class="tpl-box" data-v-8fc1a20c>`);
|
|
||||
if (tplView.value === "list") { |
|
||||
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-8fc1a20c><div data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>服务商模板</h3><p class="text-xs text-slate-400 mt-1" data-v-8fc1a20c>模板是字段预设,新增服务时可一键带出。内置模板可编辑;删除后重启会被重新补回。</p></div><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>+ 新增模板</button><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>关闭</button></div></div><div class="tpl-list" data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(templatesByCat.value, (g) => { |
|
||||
_push(`<div class="mb-3" data-v-8fc1a20c><p class="text-xs font-semibold text-slate-500 mb-1" data-v-8fc1a20c>${ssrInterpolate(g.label)}</p><!--[-->`); |
|
||||
ssrRenderList(g.items, (t) => { |
|
||||
_push(`<div class="tpl-row" data-v-8fc1a20c><div style="${ssrRenderStyle({ "min-width": "0", "flex": "1" })}" data-v-8fc1a20c><div class="flex items-center gap-2" data-v-8fc1a20c><span class="font-semibold text-sm text-slate-800 truncate" data-v-8fc1a20c>${ssrInterpolate(t.name)}</span><span class="provider-chip" data-v-8fc1a20c>${ssrInterpolate(t.provider)}</span>`); |
|
||||
if (t.builtin) { |
|
||||
_push(`<span class="badge badge-xs badge-ghost" data-v-8fc1a20c>内置</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div><p class="text-xs text-slate-400 mt-0.5" data-v-8fc1a20c>${ssrInterpolate(t.id)} · ${ssrInterpolate((t.fields || []).length)} 字段</p></div><div class="flex gap-1" data-v-8fc1a20c><button class="btn btn-ghost btn-xs" data-v-8fc1a20c>编辑</button><button class="btn btn-ghost btn-xs text-error" data-v-8fc1a20c>删除</button></div></div>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div>`); |
|
||||
}); |
|
||||
_push(`<!--]-->`); |
|
||||
if (!templates.value.length) { |
|
||||
_push(`<p class="text-xs text-slate-400 text-center py-6" data-v-8fc1a20c>暂无模板</p>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div><!--]-->`); |
|
||||
} else { |
|
||||
_push(`<!--[--><div class="flex items-center justify-between mb-4" data-v-8fc1a20c><h3 class="text-base font-semibold text-slate-800" data-v-8fc1a20c>${ssrInterpolate(tplEditing.value ? "编辑模板" : "新增模板")}</h3><div class="flex gap-2" data-v-8fc1a20c><button class="btn btn-ghost btn-sm" data-v-8fc1a20c>返回</button><button class="btn btn-primary btn-sm text-white" data-v-8fc1a20c>保存</button></div></div><div class="grid grid-cols-2 gap-3 mb-3" data-v-8fc1a20c><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text text-xs" data-v-8fc1a20c>模板ID *</span></label><input${ssrRenderAttr("value", tplForm.id)}${ssrIncludeBooleanAttr(tplEditing.value) ? " disabled" : ""} class="input input-bordered input-sm font-mono" placeholder="tts_azure" data-v-8fc1a20c></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text text-xs" data-v-8fc1a20c>类别 *</span></label><select class="select select-bordered select-sm" data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(SCAT, (sc) => { |
|
||||
_push(`<option${ssrRenderAttr("value", sc.v)} data-v-8fc1a20c${ssrIncludeBooleanAttr(Array.isArray(tplForm.category) ? ssrLooseContain(tplForm.category, sc.v) : ssrLooseEqual(tplForm.category, sc.v)) ? " selected" : ""}>${ssrInterpolate(sc.label)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text text-xs" data-v-8fc1a20c>服务商标识 *</span></label><input${ssrRenderAttr("value", tplForm.provider)} class="input input-bordered input-sm font-mono" placeholder="azure" data-v-8fc1a20c></div><div class="form-control" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text text-xs" data-v-8fc1a20c>展示名 *</span></label><input${ssrRenderAttr("value", tplForm.name)} class="input input-bordered input-sm" placeholder="微软 Azure TTS" data-v-8fc1a20c></div></div><div class="form-control mb-3" data-v-8fc1a20c><label class="label" data-v-8fc1a20c><span class="label-text text-xs" data-v-8fc1a20c>描述</span></label><input${ssrRenderAttr("value", tplForm.description)} class="input input-bordered input-sm" data-v-8fc1a20c></div><p class="text-sm font-medium text-slate-700 mb-1" data-v-8fc1a20c>字段</p><div class="overflow-x-auto" style="${ssrRenderStyle({ "max-height": "34vh" })}" data-v-8fc1a20c><table class="table text-xs" data-v-8fc1a20c><thead data-v-8fc1a20c><tr data-v-8fc1a20c><th class="w-44" data-v-8fc1a20c>字段名</th><th data-v-8fc1a20c>字段描述</th><th class="w-16 text-center" data-v-8fc1a20c>加密</th><th data-v-8fc1a20c>默认/提示值</th><th class="w-12" data-v-8fc1a20c></th></tr></thead><tbody data-v-8fc1a20c><!--[-->`); |
|
||||
ssrRenderList(tplFields.value, (f, i) => { |
|
||||
_push(`<tr data-v-8fc1a20c><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.key)} placeholder="key"${ssrRenderAttr("title", f.key)} data-v-8fc1a20c></td><td data-v-8fc1a20c><input class="field-input"${ssrRenderAttr("value", f.description)} placeholder="用途描述" data-v-8fc1a20c></td><td class="text-center" data-v-8fc1a20c><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(Array.isArray(f.encrypted) ? ssrLooseContain(f.encrypted, null) : f.encrypted) ? " checked" : ""} data-v-8fc1a20c></td><td data-v-8fc1a20c>`); |
|
||||
if (f.type === "langs") { |
|
||||
_push(ssrRenderComponent(_component_LangSelect, { |
|
||||
modelValue: f.def_value, |
|
||||
"onUpdate:modelValue": ($event) => f.def_value = $event, |
|
||||
multiple: true |
|
||||
}, null, _parent)); |
|
||||
} else if (f.type === "lang") { |
|
||||
_push(ssrRenderComponent(_component_LangSelect, { |
|
||||
modelValue: f.def_value, |
|
||||
"onUpdate:modelValue": ($event) => f.def_value = $event |
|
||||
}, null, _parent)); |
|
||||
} else { |
|
||||
_push(`<input class="field-input"${ssrRenderAttr("value", f.def_value)} placeholder="可留空" data-v-8fc1a20c>`); |
|
||||
} |
|
||||
_push(`</td><td data-v-8fc1a20c><button class="btn btn-ghost btn-xs text-error" data-v-8fc1a20c>×</button></td></tr>`); |
|
||||
}); |
|
||||
_push(`<!--]-->`); |
|
||||
if (!tplFields.value.length) { |
|
||||
_push(`<tr data-v-8fc1a20c><td colspan="5" class="text-center text-slate-400 py-2" data-v-8fc1a20c>尚无字段</td></tr>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</tbody></table></div><button class="btn btn-ghost btn-sm mt-2 text-primary" data-v-8fc1a20c>+ 添加字段</button><!--]-->`); |
|
||||
} |
|
||||
_push(`</div></div></div>`); |
|
||||
}; |
|
||||
} |
|
||||
}); |
|
||||
const _sfc_setup = _sfc_main.setup; |
|
||||
_sfc_main.setup = (props, ctx) => { |
|
||||
const ssrContext = useSSRContext(); |
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/serviceconfig.vue"); |
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
|
||||
}; |
|
||||
const serviceconfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8fc1a20c"]]); |
|
||||
|
|
||||
export { serviceconfig as default }; |
|
||||
//# sourceMappingURL=serviceconfig-DH60tzBJ.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"serviceconfig-DH60tzBJ.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-DH60tzBJ.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"serviceconfig-styles.BSTefNde.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-styles-1.mjs-DG7WBEIW.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-styles.BSTefNde.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"serviceconfig-styles.BoVuqbov.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-styles-1.mjs-DX7FZj_N.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/serviceconfig-styles.BoVuqbov.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue