293 changed files with 7124 additions and 3022 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
@ -1 +1 @@ |
|||||
import{_ as t,o,c as s,Q as c}from"./CCjf5Io-.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"./Dv-LAQo6.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}; |
||||
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,4 +1,4 @@ |
|||||
import{g as q,B as G,P as K,c as a,a as e,d as u,p as x,q as M,F as f,r as U,v as Y,s as Z,t as n,x as i,z as E,o,n as F,l as I,_ as J}from"./CCjf5Io-.js";import{u as Q}from"./C-6Qe-lq.js";import{u as W}from"./DTVGNZEd.js";import"./42htcooJ.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 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=q({__name:"statlog",setup(Ct){const{webApi:A}=Q(),{success:O,error:R}=W(),z={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?z[l]||l:"-"}const c=i([]),_=i(!1),g=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 B(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function H(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.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await A("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){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function P(){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,B as K,Q as P,c as a,a as e,d as u,p as x,q as M,F as f,r as U,v as Q,s as Y,t as n,x as i,z as E,o,n as F,l as I,_ as Z}from"./Dv-LAQo6.js";import{u as J}from"./mz7Huk5H.js";import{u as W}from"./D7SVvy69.js";import"./D0vUT4uH.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 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=G({__name:"statlog",setup(Ct){const{webApi:A}=J(),{success:O,error:R}=W(),z={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?z[l]||l:"-"}const c=i([]),_=i(!1),g=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 B(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function H(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.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await A("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){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function j(){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 A("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function j(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return G(()=>{v.value=p(0),m()}),K(()=>{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,[x(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,U(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[M,v.value,void 0,{number:!0}]]),x(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),[[M,b.value]]),x(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品"},null,512),[[Y,h.value]]),e("label",st,[x(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:j},null,544),[[Z,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:P},"清空本日")])]),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,[_.value?(o(),a("div",ct,"加载中...")):g.value?(o(),a("div",dt,"加载失败:"+n(g.value),1)):T.value.length?(o(!0),a(f,{key:3},U(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",B(t.level).cls])},n(B(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?I("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(S(t.product_id)),1)]),e("div",yt,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",bt," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=J(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default};
|
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await A("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function q(){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,[x(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,U(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[M,v.value,void 0,{number:!0}]]),x(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),[[M,b.value]]),x(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,[x(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:q},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:j},"清空本日")])]),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,[_.value?(o(),a("div",ct,"加载中...")):g.value?(o(),a("div",dt,"加载失败:"+n(g.value),1)):T.value.length?(o(!0),a(f,{key:3},U(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",B(t.level).cls])},n(B(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?I("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(S(t.product_id)),1)]),e("div",yt,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",bt," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=Z(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default};
|
||||
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"./CA44cC15.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./CCjf5Io-.js";import{u as f}from"./b15UHpcb.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"./OcSe_OeH.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./Dv-LAQo6.js";import{u as f}from"./xRPLHwov.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
@ -1 +1 @@ |
|||||
import{g as h,j as x,k as w,B as y,c as r,a as e,t as d,l as b,m as _,p as v,v as g,n as k,y as B,x as u,o as p,_ as M}from"./CCjf5Io-.js";const A={class:"login-bg flex items-center justify-center px-4"},z={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"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=B({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 f(){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",z,[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:_(f,["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),[[g,o.account]])]),e("div",D,[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),[[g,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=M(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default}; |
import{g as h,j as x,k as w,B as y,c as r,a as e,t as d,l as b,m as _,p as v,v as g,n as k,y as B,x as u,o as p,_ as M}from"./Dv-LAQo6.js";const A={class:"login-bg flex items-center justify-center px-4"},z={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"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=B({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 f(){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",z,[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:_(f,["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),[[g,o.account]])]),e("div",D,[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),[[g,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=M(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default}; |
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
import{L as y,l as x}from"./ChQPCk92.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,z as h,o as s,d as B,_ as N}from"./Dv-LAQo6.js";const L={class:"lang-select"},O={class:"lang-chip-name"},S=["onClick"],j={key:0,class:"lang-empty"},z={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"},A=["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",z,[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,A))]))}}),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
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{e as f,a9 as p,aa as c,z as r}from"./CCjf5Io-.js";const l="$s";function y(...t){const a=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(a);const[n,e]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(e!==void 0&&typeof e!="function")throw new Error("[nuxt] [useState] init must be a function: "+e);const i=l+n,u=f(),s=p(u.payload.state,i);if(e&&(u._state[i]??={_default:e}),s.value===void 0&&e){const o=e();if(c(o))return u.payload.state[i]=o,o;s.value=o}return s}function v(){const t=y("app:loading",()=>0),a=r(()=>t.value>0);function n(){t.value++}function e(){t.value=Math.max(0,t.value-1)}return{count:t,loading:a,begin:n,end:e}}export{y as a,v as u}; |
import{e as f,a9 as p,aa as c,z as r}from"./Dv-LAQo6.js";const l="$s";function y(...t){const a=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(a);const[n,e]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(e!==void 0&&typeof e!="function")throw new Error("[nuxt] [useState] init must be a function: "+e);const i=l+n,u=f(),s=p(u.payload.state,i);if(e&&(u._state[i]??={_default:e}),s.value===void 0&&e){const o=e();if(c(o))return u.payload.state[i]=o,o;s.value=o}return s}function v(){const t=y("app:loading",()=>0),a=r(()=>t.value>0);function n(){t.value++}function e(){t.value=Math.max(0,t.value-1)}return{count:t,loading:a,begin:n,end:e}}export{y as a,v as u}; |
||||
File diff suppressed because one or more lines are too long
@ -1 +1 @@ |
|||||
import{a as u}from"./42htcooJ.js";let i=0;function f(){const o=u("app:toasts",()=>[]);function e(s,t="info",r=3e3){const a=++i;o.value.push({id:a,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(n=>n.id!==a)},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{a as u}from"./D0vUT4uH.js";let i=0;function f(){const o=u("app:toasts",()=>[]);function e(s,t="info",r=3e3){const a=++i;o.value.push({id:a,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(n=>n.id!==a)},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
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
@ -0,0 +1 @@ |
|||||
|
.lang-select[data-v-4903af59]{font-size:12px}.lang-chips[data-v-4903af59]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:4px;min-height:22px}.lang-disabled[data-v-4903af59]{opacity:.5;pointer-events:none}.lang-chip[data-v-4903af59]{display:inline-flex;align-items:center;gap:2px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;background:#ede9fe;color:#6d28d9;padding:1px 6px;border-radius:9999px}.lang-chip-name[data-v-4903af59],.lang-x[data-v-4903af59]{color:#a78bfa;margin-left:3px}.lang-x[data-v-4903af59]{font-weight:700;line-height:1}.lang-x[data-v-4903af59]:hover{color:#6d28d9}.lang-empty[data-v-4903af59]{font-size:11px;color:#94a3b8}.lang-dd[data-v-4903af59]{position:relative}.lang-dd-sum[data-v-4903af59]{cursor:pointer;font-size:12px;color:#7c3aed;list-style:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.lang-dd-sum[data-v-4903af59]::-webkit-details-marker{display:none}.lang-dd-panel[data-v-4903af59]{position:absolute;z-index:30;margin-top:4px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 8px 24px #0f172a24;padding:6px;max-height:260px;overflow-y:auto;width:230px}.lang-opt[data-v-4903af59]{display:flex;align-items:center;gap:6px;padding:3px 6px;border-radius:6px;cursor:pointer}.lang-opt[data-v-4903af59]:hover{background:#f1f5f9}.lang-opt-code[data-v-4903af59]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#334155}.lang-opt-name[data-v-4903af59]{color:#94a3b8} |
||||
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 o,o as s,c as a,a as t,t as r}from"./CCjf5Io-.js";import{u as i}from"./b15UHpcb.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"./Dv-LAQo6.js";import{u as i}from"./xRPLHwov.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
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
.type-tag[data-v-463df649]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-463df649]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-463df649]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-463df649]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-463df649]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-463df649]{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-463df649]{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-463df649]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-463df649]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-463df649]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-463df649]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-463df649]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-463df649]{display:inline-block;margin-left:6px}.ed-tip[data-v-463df649]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-463df649]{color:#dc2626;font-style:normal}.type-row[data-v-463df649]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-463df649]{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-463df649]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-463df649]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-463df649]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-463df649]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-463df649]{font-size:10px;color:#94a3b8}.slot-row[data-v-463df649]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-463df649]{flex:1;min-width:0}.slot-arrow[data-v-463df649]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-463df649]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.voice-row[data-v-463df649]{gap:8px;margin-bottom:6px}.ed-footer[data-v-463df649],.voice-row[data-v-463df649]{display:flex;align-items:center}.ed-footer[data-v-463df649]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-463df649]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-463df649]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-463df649]{display:none}} |
||||
@ -1 +1 @@ |
|||||
{"id":"a9121ad7-d4b4-4265-bf91-57f220ed7baa","timestamp":1784883938543} |
{"id":"671440d9-9ac2-4158-bbf2-60c5639d616e","timestamp":1785336504226} |
||||
@ -0,0 +1 @@ |
|||||
|
{"id":"671440d9-9ac2-4158-bbf2-60c5639d616e","timestamp":1785336504226,"prerendered":[]} |
||||
@ -1 +0,0 @@ |
|||||
{"id":"a9121ad7-d4b4-4265-bf91-57f220ed7baa","timestamp":1784883938543,"prerendered":[]} |
|
||||
@ -1 +0,0 @@ |
|||||
.pair-card[data-v-51f11136]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:16px;cursor:pointer;transition:all .15s}.pair-card[data-v-51f11136]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.lang-badge[data-v-51f11136]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.svc-pill[data-v-51f11136]{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:8px;color:#fff}.mode-badge[data-v-51f11136]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px}.mode-pipeline[data-v-51f11136]{background:#dbeafe;color:#1e40af}.mode-e2e[data-v-51f11136]{background:#fff7ed;color:#c2410c}.editor-panel[data-v-51f11136]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.mtab[data-v-51f11136]{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:10px;border:2px solid transparent;cursor:pointer;transition:all .15s;flex:1}.mtab.on[data-v-51f11136]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.sync-overlay[data-v-51f11136]{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)}.sync-box[data-v-51f11136]{background:#fff;border-radius:20px;padding:28px;width:520px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-51f11136]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-51f11136]{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-51f11136]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-51f11136]{border-color:#6366f1;background:#eef2ff;color:#4338ca} |
|
||||
@ -0,0 +1 @@ |
|||||
|
.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 @@ |
|||||
|
.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)}} |
||||
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{j as w,k as d}from"./CCjf5Io-.js";import{u as h}from"./42htcooJ.js";async function f(o,i,a){const e=w(),u=d(),s={"Content-Type":"application/json"};e.token&&(s.Authorization=e.token),a&&Object.assign(s,a);const t=await fetch(o,{method:"POST",headers:s,body:JSON.stringify(i)});if(!t.ok)throw new Error(`HTTP error: ${t.status}`);const n=await t.json();if(n.code===18)throw e.logout(),u.push("/"),new Error(n.msg||"Unauthorized");if(n.code!==0)throw new Error(n.msg||"Unknown error");return n.data}const y=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function g(o){return!y.test(o)}function A(){const o=w(),{begin:i,end:a}=h();async function e(t,n){const r={};if(o.currentAppId&&(r["X-App-Id"]=String(o.currentAppId)),!g(t))return f(`/web/api/api_${t}`,n??{},r);i();try{return await f(`/web/api/api_${t}`,n??{},r)}finally{a()}}async function u(t,n){return f(`/console/api/${t}`,n??{})}async function s(t,n){const r=t.type||"application/octet-stream",c=await e("getcostoken",{path:n,filename:t.name,content_type:r}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":r},body:t});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:e,consoleApi:u,uploadFile:s}}export{A as u}; |
import{j as w,k as d}from"./Dv-LAQo6.js";import{u as h}from"./D0vUT4uH.js";async function f(o,i,a){const e=w(),u=d(),s={"Content-Type":"application/json"};e.token&&(s.Authorization=e.token),a&&Object.assign(s,a);const t=await fetch(o,{method:"POST",headers:s,body:JSON.stringify(i)});if(!t.ok)throw new Error(`HTTP error: ${t.status}`);const n=await t.json();if(n.code===18)throw e.logout(),u.push("/"),new Error(n.msg||"Unauthorized");if(n.code!==0)throw new Error(n.msg||"Unknown error");return n.data}const y=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function g(o){return!y.test(o)}function A(){const o=w(),{begin:i,end:a}=h();async function e(t,n){const r={};if(o.currentAppId&&(r["X-App-Id"]=String(o.currentAppId)),!g(t))return f(`/web/api/api_${t}`,n??{},r);i();try{return await f(`/web/api/api_${t}`,n??{},r)}finally{a()}}async function u(t,n){return f(`/console/api/${t}`,n??{})}async function s(t,n){const r=t.type||"application/octet-stream",c=await e("getcostoken",{path:n,filename:t.name,content_type:r}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":r},body:t});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:e,consoleApi:u,uploadFile:s}}export{A as u}; |
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
.svc-grid[data-v-4e0895d6]{display:grid;grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:12px}.svc-card[data-v-4e0895d6]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px;cursor:pointer;transition:all .15s}.svc-card[data-v-4e0895d6]:hover{border-color:#c7d2fe;box-shadow:0 6px 18px #6366f11f;transform:translateY(-1px)}.add-card[data-v-4e0895d6]{display:flex;flex-direction:column;align-items:center;justify-content:center;border-style:dashed;border-color:#e2e8f0;background:#fafbff;min-height:120px}.add-card[data-v-4e0895d6]:hover{border-color:#a5b4fc;background:#f5f3ff}.field-count[data-v-4e0895d6]{display:inline-flex;font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px;background:#f1f5f9;color:#64748b}.line-clamp-2[data-v-4e0895d6]{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.svc-logo[data-v-4e0895d6]{width:36px;height:36px;border-radius:9px;display:flex;align-items:center;justify-content:center;font-size:16px;flex-shrink:0;color:#fff;font-weight:700}.cat-chip[data-v-4e0895d6]{font-weight:700;padding:2px 7px}.cat-chip[data-v-4e0895d6],.provider-chip[data-v-4e0895d6]{display:inline-flex;font-size:10px;border-radius:6px}.provider-chip[data-v-4e0895d6]{font-weight:600;padding:1px 7px;background:#eef2ff;color:#4338ca;font-family:SF Mono,Menlo,monospace}.wizard-steps[data-v-4e0895d6]{display:flex;align-items:center;gap:8px}.wstep[data-v-4e0895d6]{font-size:12px;font-weight:600;color:#94a3b8;padding:5px 12px;border-radius:8px;background:#f1f5f9;cursor:pointer;white-space:nowrap}.wstep.on[data-v-4e0895d6]{color:#4338ca;background:#eef2ff}.wstep.cur[data-v-4e0895d6]{color:#fff;background:#6366f1}.wstep.disabled[data-v-4e0895d6]{cursor:not-allowed;opacity:.6}.wline[data-v-4e0895d6]{flex:1;height:1px;background:#e2e8f0}.type-grid[data-v-4e0895d6]{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.type-card[data-v-4e0895d6]{display:flex;flex-direction:column;align-items:flex-start;padding:14px;border-radius:12px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;background:#fff}.type-card[data-v-4e0895d6]:hover{border-color:#c7d2fe;background:#f5f3ff}.type-card.on[data-v-4e0895d6]{border-color:#6366f1;background:#eef2ff;box-shadow:0 4px 12px #6366f11f}.lock-badge[data-v-4e0895d6]{display:inline-flex;align-items:center;gap:3px;background:#fef2f2;color:#dc2626}.inherit-badge[data-v-4e0895d6],.lock-badge[data-v-4e0895d6]{font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px}.inherit-badge[data-v-4e0895d6]{background:#f1f5f9;color:#94a3b8}.override-badge[data-v-4e0895d6]{background:#fef3c7;color:#b45309}.disabled-badge[data-v-4e0895d6],.override-badge[data-v-4e0895d6]{font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px}.disabled-badge[data-v-4e0895d6]{background:#fee2e2;color:#b91c1c}.field-input[data-v-4e0895d6]{border:1px solid #e2e8f0;border-radius:7px;padding:5px 9px;font-size:12.5px;font-family:SF Mono,Menlo,monospace;width:100%}.field-input[data-v-4e0895d6]:focus{border-color:#6366f1;box-shadow:0 0 0 3px #6366f11a;outline:none}.field-input[data-v-4e0895d6]:disabled{background:#f8fafc;color:#cbd5e1}.modal-overlay[data-v-4e0895d6]{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)}.svc-box[data-v-4e0895d6]{padding:26px;width:860px;max-width:96vw;max-height:90vh;overflow:auto}.svc-box[data-v-4e0895d6],.sync-box[data-v-4e0895d6]{background:#fff;border-radius:20px;box-shadow:0 24px 80px #0000002e}.sync-box[data-v-4e0895d6]{padding:28px;width:520px;max-width:95vw}.tpl-box[data-v-4e0895d6]{background:#fff;border-radius:20px;padding:24px;width:620px;max-width:96vw;max-height:88vh;overflow:auto;box-shadow:0 24px 80px #0000002e}.tpl-list[data-v-4e0895d6]{max-height:60vh;overflow:auto}.tpl-row[data-v-4e0895d6]{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:9px;border:1px solid #eef2f7;margin-bottom:6px}.tpl-row[data-v-4e0895d6]:hover{border-color:#c7d2fe;background:#f8fafc}.sync-region-grid[data-v-4e0895d6]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-4e0895d6]{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-4e0895d6]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-4e0895d6]{border-color:#6366f1;background:#eef2ff;color:#4338ca} |
||||
@ -0,0 +1 @@ |
|||||
|
import{g as t,B as n,P as a,c as o,a as s,o as c}from"./Dv-LAQo6.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}; |
||||
@ -1 +1 @@ |
|||||
import{u as a,e as s,h as u,i as r,f as h}from"./CCjf5Io-.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"./Dv-LAQo6.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}; |
||||
@ -0,0 +1,69 @@ |
|||||
|
import { defineComponent, computed, mergeProps, useSSRContext } from 'vue'; |
||||
|
import { ssrRenderAttrs, ssrRenderClass, ssrRenderList, ssrInterpolate, ssrIncludeBooleanAttr, ssrRenderAttr } from 'vue/server-renderer'; |
||||
|
import { L as LANG_OPTIONS, l as langName } from './useLangOptions-DMhiAuTa.mjs'; |
||||
|
import { _ as _export_sfc } from './server.mjs'; |
||||
|
|
||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({ |
||||
|
__name: "LangSelect", |
||||
|
__ssrInlineRender: true, |
||||
|
props: { |
||||
|
modelValue: {}, |
||||
|
multiple: { type: Boolean, default: false }, |
||||
|
disabled: { type: Boolean, default: false }, |
||||
|
options: { default: void 0 } |
||||
|
}, |
||||
|
emits: ["update:modelValue"], |
||||
|
setup(__props, { emit: __emit }) { |
||||
|
const props = __props; |
||||
|
const opts = computed(() => props.options && props.options.length ? props.options : LANG_OPTIONS); |
||||
|
const selected = computed( |
||||
|
() => (props.modelValue || "").split(",").map((s) => s.trim()).filter(Boolean) |
||||
|
); |
||||
|
function nameOf(code) { |
||||
|
return langName(code); |
||||
|
} |
||||
|
return (_ctx, _push, _parent, _attrs) => { |
||||
|
_push(`<div${ssrRenderAttrs(mergeProps({ class: "lang-select" }, _attrs))} data-v-4903af59>`); |
||||
|
if (__props.multiple) { |
||||
|
_push(`<!--[--><div class="${ssrRenderClass([{ "lang-disabled": __props.disabled }, "lang-chips"])}" data-v-4903af59><!--[-->`); |
||||
|
ssrRenderList(selected.value, (code) => { |
||||
|
_push(`<span class="lang-chip" data-v-4903af59>${ssrInterpolate(code)}<span class="lang-chip-name" data-v-4903af59>${ssrInterpolate(nameOf(code))}</span><button type="button" class="lang-x" data-v-4903af59>×</button></span>`); |
||||
|
}); |
||||
|
_push(`<!--]-->`); |
||||
|
if (!selected.value.length) { |
||||
|
_push(`<span class="lang-empty" data-v-4903af59>未选择语言</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
if (!__props.disabled) { |
||||
|
_push(`<details class="lang-dd" data-v-4903af59><summary class="lang-dd-sum" data-v-4903af59>+ 选择语言(已选 ${ssrInterpolate(selected.value.length)})</summary><div class="lang-dd-panel" data-v-4903af59><!--[-->`); |
||||
|
ssrRenderList(opts.value, (o) => { |
||||
|
_push(`<label class="lang-opt" data-v-4903af59><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(selected.value.includes(o.code)) ? " checked" : ""} data-v-4903af59><span class="lang-opt-code" data-v-4903af59>${ssrInterpolate(o.code)}</span><span class="lang-opt-name" data-v-4903af59>${ssrInterpolate(o.name)}</span></label>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div></details>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--]-->`); |
||||
|
} else { |
||||
|
_push(`<select class="select select-bordered select-sm w-full text-xs"${ssrRenderAttr("value", __props.modelValue)}${ssrIncludeBooleanAttr(__props.disabled) ? " disabled" : ""} data-v-4903af59><option value="" data-v-4903af59>(未设置)</option><!--[-->`); |
||||
|
ssrRenderList(opts.value, (o) => { |
||||
|
_push(`<option${ssrRenderAttr("value", o.code)} data-v-4903af59>${ssrInterpolate(o.code)} · ${ssrInterpolate(o.name)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select>`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
}; |
||||
|
} |
||||
|
}); |
||||
|
const _sfc_setup = _sfc_main.setup; |
||||
|
_sfc_main.setup = (props, ctx) => { |
||||
|
const ssrContext = useSSRContext(); |
||||
|
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/LangSelect.vue"); |
||||
|
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
||||
|
}; |
||||
|
const __nuxt_component_0 = /* @__PURE__ */ Object.assign(_export_sfc(_sfc_main, [["__scopeId", "data-v-4903af59"]]), { __name: "LangSelect" }); |
||||
|
|
||||
|
export { __nuxt_component_0 as _ }; |
||||
|
//# sourceMappingURL=LangSelect-C_QPlcDf.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"LangSelect-C_QPlcDf.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/LangSelect-C_QPlcDf.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1,4 +1,8 @@ |
|||||
const LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang = ".lang-select[data-v-4903af59]{font-size:12px}.lang-chips[data-v-4903af59]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:4px;min-height:22px}.lang-disabled[data-v-4903af59]{opacity:.5;pointer-events:none}.lang-chip[data-v-4903af59]{display:inline-flex;align-items:center;gap:2px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;background:#ede9fe;color:#6d28d9;padding:1px 6px;border-radius:9999px}.lang-chip-name[data-v-4903af59],.lang-x[data-v-4903af59]{color:#a78bfa;margin-left:3px}.lang-x[data-v-4903af59]{font-weight:700;line-height:1}.lang-x[data-v-4903af59]:hover{color:#6d28d9}.lang-empty[data-v-4903af59]{font-size:11px;color:#94a3b8}.lang-dd[data-v-4903af59]{position:relative}.lang-dd-sum[data-v-4903af59]{cursor:pointer;font-size:12px;color:#7c3aed;list-style:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.lang-dd-sum[data-v-4903af59]::-webkit-details-marker{display:none}.lang-dd-panel[data-v-4903af59]{position:absolute;z-index:30;margin-top:4px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 8px 24px #0f172a24;padding:6px;max-height:260px;overflow-y:auto;width:230px}.lang-opt[data-v-4903af59]{display:flex;align-items:center;gap:6px;padding:3px 6px;border-radius:6px;cursor:pointer}.lang-opt[data-v-4903af59]:hover{background:#f1f5f9}.lang-opt-code[data-v-4903af59]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#334155}.lang-opt-name[data-v-4903af59]{color:#94a3b8}"; |
const LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang = ".lang-select[data-v-4903af59]{font-size:12px}.lang-chips[data-v-4903af59]{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:4px;min-height:22px}.lang-disabled[data-v-4903af59]{opacity:.5;pointer-events:none}.lang-chip[data-v-4903af59]{display:inline-flex;align-items:center;gap:2px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;background:#ede9fe;color:#6d28d9;padding:1px 6px;border-radius:9999px}.lang-chip-name[data-v-4903af59],.lang-x[data-v-4903af59]{color:#a78bfa;margin-left:3px}.lang-x[data-v-4903af59]{font-weight:700;line-height:1}.lang-x[data-v-4903af59]:hover{color:#6d28d9}.lang-empty[data-v-4903af59]{font-size:11px;color:#94a3b8}.lang-dd[data-v-4903af59]{position:relative}.lang-dd-sum[data-v-4903af59]{cursor:pointer;font-size:12px;color:#7c3aed;list-style:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.lang-dd-sum[data-v-4903af59]::-webkit-details-marker{display:none}.lang-dd-panel[data-v-4903af59]{position:absolute;z-index:30;margin-top:4px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 8px 24px #0f172a24;padding:6px;max-height:260px;overflow-y:auto;width:230px}.lang-opt[data-v-4903af59]{display:flex;align-items:center;gap:6px;padding:3px 6px;border-radius:6px;cursor:pointer}.lang-opt[data-v-4903af59]:hover{background:#f1f5f9}.lang-opt-code[data-v-4903af59]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#334155}.lang-opt-name[data-v-4903af59]{color:#94a3b8}"; |
||||
|
|
||||
export { LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang as L }; |
const LangSelectStyles_Bi81RebM = [ |
||||
//# sourceMappingURL=serviceconfig-styles-1.mjs-BjhBSOse.mjs.map
|
LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang |
||||
|
]; |
||||
|
|
||||
|
export { LangSelectStyles_Bi81RebM as default }; |
||||
|
//# sourceMappingURL=LangSelect-styles.Bi81RebM.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"LangSelect-styles.Bi81RebM.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/LangSelect-styles-1.mjs-BjhBSOse.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/LangSelect-styles.Bi81RebM.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
||||
@ -1,8 +0,0 @@ |
|||||
import { L as LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang } from './serviceconfig-styles-1.mjs-BjhBSOse.mjs'; |
|
||||
|
|
||||
const LangSelectStyles_C7_U3Izz = [ |
|
||||
LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang |
|
||||
]; |
|
||||
|
|
||||
export { LangSelectStyles_C7_U3Izz as default }; |
|
||||
//# sourceMappingURL=LangSelect-styles.C7_U3Izz.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"LangSelect-styles.C7_U3Izz.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/LangSelect-styles.C7_U3Izz.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"_name_-BbBzwp8c.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-BbBzwp8c.js"],"names":["useRoute"],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"_name_-QnyK8Xx9.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-QnyK8Xx9.js"],"names":["useRoute"],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -1,13 +0,0 @@ |
|||||
import { A as AppDeployTab_vue_vue_type_style_index_0_scoped_7b082515_lang } from './_name_-styles-1.mjs-DV0K6DvJ.mjs'; |
|
||||
import { A as AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang } from './_name_-styles-2.mjs-BXCS7H7R.mjs'; |
|
||||
|
|
||||
const _name__vue_vue_type_style_index_0_scoped_3e1700b0_lang = '.hero[data-v-3e1700b0]{background:#fff;border:1px solid #eef2f7;border-radius:16px;padding:20px 22px;margin-bottom:16px;box-shadow:0 1px 2px #0f172a0a,0 4px 16px #0f172a08;display:flex;gap:18px;align-items:center;flex-wrap:wrap}.hero-logo[data-v-3e1700b0]{width:58px;height:58px;border-radius:15px;flex-shrink:0;color:#fff;background:linear-gradient(135deg,#4f46e5,#7c3aed);display:grid;place-items:center;font-weight:800;font-size:24px;box-shadow:0 8px 22px #4f46e54d}.hero-name[data-v-3e1700b0]{font-size:20px;font-weight:700;color:#1e293b;letter-spacing:-.015em;display:flex;align-items:center;gap:9px;flex-wrap:wrap}.kpis[data-v-3e1700b0]{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:18px}.kpi[data-v-3e1700b0]{background:#fff;border:1px solid #eef2f7;border-radius:12px;padding:13px 15px;position:relative;overflow:hidden;box-shadow:0 1px 2px #0f172a0a}.kpi[data-v-3e1700b0]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:#e2e8f0}.kpi.ok[data-v-3e1700b0]:before{background:#16a34a}.kpi.warn[data-v-3e1700b0]:before{background:#d97706}.kpi.accent[data-v-3e1700b0]:before{background:#4f46e5}.kpi-l[data-v-3e1700b0]{font-size:10.5px;color:#94a3b8;letter-spacing:.04em;text-transform:uppercase;font-weight:600}.kpi-v[data-v-3e1700b0]{font-size:22px;font-weight:700;color:#1e293b;margin-top:3px;letter-spacing:-.02em;font-family:SF Mono,Menlo,monospace;font-variant-numeric:tabular-nums}.kpi-v small[data-v-3e1700b0]{font-size:12px;color:#94a3b8;font-weight:500;margin-left:3px}.tablist[data-v-3e1700b0]{display:flex;gap:2px;border-bottom:1px solid #e2e8f0;margin-bottom:18px;overflow-x:auto}.tab[data-v-3e1700b0]{border:0;background:none;font-size:13.5px;color:#64748b;padding:10px 15px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap;display:flex;align-items:center;gap:6px}.tab[data-v-3e1700b0]:hover{color:#1e293b}.tab[aria-selected=true][data-v-3e1700b0]{color:#4338ca;border-bottom-color:#4f46e5;font-weight:600}.tab-n[data-v-3e1700b0]{font-size:10.5px;background:#f8fafc;border:1px solid #eef2f7;color:#64748b;border-radius:20px;padding:0 6px;font-family:SF Mono,Menlo,monospace}.tab[aria-selected=true] .tab-n[data-v-3e1700b0]{background:#eef2ff;color:#4338ca;border-color:transparent}.depbar[data-v-3e1700b0]{gap:10px;flex-wrap:wrap;background:#f8fafc;border:1px solid #eef2f7;border-radius:11px;padding:10px 13px;margin-bottom:16px}.depbar[data-v-3e1700b0],.depchip[data-v-3e1700b0]{display:flex;align-items:center}.depchip[data-v-3e1700b0]{border:1px solid #e2e8f0;background:#fff;border-radius:20px;padding:4px 12px;font-size:12px;cursor:pointer;color:#334155;gap:6px}.depchip[data-v-3e1700b0]:hover{border-color:#0e7490}.depchip[aria-pressed=true][data-v-3e1700b0]{background:#ecfeff;border-color:#0e7490;color:#0e7490;font-weight:600}.depchip .dot[data-v-3e1700b0]{width:6px;height:6px;border-radius:50%;background:#16a34a}.depchip .dot.pending[data-v-3e1700b0]{background:#d97706}.chip[data-v-3e1700b0]{display:inline-flex;align-items:center;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#64748b}.chip-ok[data-v-3e1700b0]{background:#dcfce7;color:#15803d}.chip-mono[data-v-3e1700b0]{font-family:SF Mono,Menlo,monospace;font-weight:600}'; |
|
||||
|
|
||||
const _name_Styles_DbbtUQpB = [ |
|
||||
AppDeployTab_vue_vue_type_style_index_0_scoped_7b082515_lang, |
|
||||
AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang, |
|
||||
_name__vue_vue_type_style_index_0_scoped_3e1700b0_lang |
|
||||
]; |
|
||||
|
|
||||
export { _name_Styles_DbbtUQpB as default }; |
|
||||
//# sourceMappingURL=_name_-styles.DbbtUQpB.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"_name_-styles.DbbtUQpB.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles-3.mjs-7yUQQ2f9.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles.DbbtUQpB.mjs"],"names":["style_0","style_1","style_2"],"mappings":"","x_google_ignoreList":[0,1]} |
|
||||
@ -0,0 +1,13 @@ |
|||||
|
import { A as AppDeployTab_vue_vue_type_style_index_0_scoped_7b082515_lang } from './_name_-styles-1.mjs-DV0K6DvJ.mjs'; |
||||
|
import { A as AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang } from './_name_-styles-2.mjs-BXCS7H7R.mjs'; |
||||
|
|
||||
|
const _name__vue_vue_type_style_index_0_scoped_865381f4_lang = '.hero[data-v-865381f4]{background:#fff;border:1px solid #eef2f7;border-radius:16px;padding:20px 22px;margin-bottom:16px;box-shadow:0 1px 2px #0f172a0a,0 4px 16px #0f172a08;display:flex;gap:18px;align-items:center;flex-wrap:wrap}.hero-logo[data-v-865381f4]{width:58px;height:58px;border-radius:15px;flex-shrink:0;color:#fff;background:linear-gradient(135deg,#4f46e5,#7c3aed);display:grid;place-items:center;font-weight:800;font-size:24px;box-shadow:0 8px 22px #4f46e54d}.hero-name[data-v-865381f4]{font-size:20px;font-weight:700;color:#1e293b;letter-spacing:-.015em;display:flex;align-items:center;gap:9px;flex-wrap:wrap}.kpis[data-v-865381f4]{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:18px}.kpi[data-v-865381f4]{background:#fff;border:1px solid #eef2f7;border-radius:12px;padding:13px 15px;position:relative;overflow:hidden;box-shadow:0 1px 2px #0f172a0a}.kpi[data-v-865381f4]:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:#e2e8f0}.kpi.ok[data-v-865381f4]:before{background:#16a34a}.kpi.warn[data-v-865381f4]:before{background:#d97706}.kpi.accent[data-v-865381f4]:before{background:#4f46e5}.kpi-l[data-v-865381f4]{font-size:10.5px;color:#94a3b8;letter-spacing:.04em;text-transform:uppercase;font-weight:600}.kpi-v[data-v-865381f4]{font-size:22px;font-weight:700;color:#1e293b;margin-top:3px;letter-spacing:-.02em;font-family:SF Mono,Menlo,monospace;font-variant-numeric:tabular-nums}.kpi-v small[data-v-865381f4]{font-size:12px;color:#94a3b8;font-weight:500;margin-left:3px}.tablist[data-v-865381f4]{display:flex;gap:2px;border-bottom:1px solid #e2e8f0;margin-bottom:18px;overflow-x:auto}.tab[data-v-865381f4]{border:0;background:none;font-size:13.5px;color:#64748b;padding:10px 15px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap;display:flex;align-items:center;gap:6px}.tab[data-v-865381f4]:hover{color:#1e293b}.tab[aria-selected=true][data-v-865381f4]{color:#4338ca;border-bottom-color:#4f46e5;font-weight:600}.tab-n[data-v-865381f4]{font-size:10.5px;background:#f8fafc;border:1px solid #eef2f7;color:#64748b;border-radius:20px;padding:0 6px;font-family:SF Mono,Menlo,monospace}.tab[aria-selected=true] .tab-n[data-v-865381f4]{background:#eef2ff;color:#4338ca;border-color:transparent}.depbar[data-v-865381f4]{gap:10px;flex-wrap:wrap;background:#f8fafc;border:1px solid #eef2f7;border-radius:11px;padding:10px 13px;margin-bottom:16px}.depbar[data-v-865381f4],.depchip[data-v-865381f4]{display:flex;align-items:center}.depchip[data-v-865381f4]{border:1px solid #e2e8f0;background:#fff;border-radius:20px;padding:4px 12px;font-size:12px;cursor:pointer;color:#334155;gap:6px}.depchip[data-v-865381f4]:hover{border-color:#0e7490}.depchip[aria-pressed=true][data-v-865381f4]{background:#ecfeff;border-color:#0e7490;color:#0e7490;font-weight:600}.depchip .dot[data-v-865381f4]{width:6px;height:6px;border-radius:50%;background:#16a34a}.depchip .dot.pending[data-v-865381f4]{background:#d97706}.chip[data-v-865381f4]{display:inline-flex;align-items:center;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:5px;background:#f1f5f9;color:#64748b}.chip-ok[data-v-865381f4]{background:#dcfce7;color:#15803d}.chip-mono[data-v-865381f4]{font-family:SF Mono,Menlo,monospace;font-weight:600}'; |
||||
|
|
||||
|
const _name_Styles_Dz82uZcJ = [ |
||||
|
AppDeployTab_vue_vue_type_style_index_0_scoped_7b082515_lang, |
||||
|
AppModuleTab_vue_vue_type_style_index_0_scoped_ff0e4b71_lang, |
||||
|
_name__vue_vue_type_style_index_0_scoped_865381f4_lang |
||||
|
]; |
||||
|
|
||||
|
export { _name_Styles_Dz82uZcJ as default }; |
||||
|
//# sourceMappingURL=_name_-styles.Dz82uZcJ.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"_name_-styles.Dz82uZcJ.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles-3.mjs-Uy9b9kOk.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/_name_-styles.Dz82uZcJ.mjs"],"names":["style_0","style_1","style_2"],"mappings":"","x_google_ignoreList":[0,1]} |
||||
@ -0,0 +1,236 @@ |
|||||
|
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-B-E5eLsI.mjs'; |
||||
|
import { u as useToast } from './useToast-CS21XT61.mjs'; |
||||
|
import { L as LANG_OPTIONS } from './useLangOptions-DMhiAuTa.mjs'; |
||||
|
import { _ as __nuxt_component_0 } from './LangSelect-C_QPlcDf.mjs'; |
||||
|
import { _ as _export_sfc } from './server.mjs'; |
||||
|
import './useLoading-D4zrSa2m.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 _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: "语音识别", cat: CAT_STT, color: "#1664ff" }, |
||||
|
{ key: "llm_svc_id", slot: "LLM", label: "大语言模型", cat: CAT_LLM, color: "#b45309" }, |
||||
|
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cat: CAT_TTS, color: "#7c3aed" } |
||||
|
], |
||||
|
translate: [ |
||||
|
{ key: "stt_svc_id", slot: "STT", label: "语音识别", cat: CAT_STT, color: "#1664ff" }, |
||||
|
{ key: "mt_svc_id", slot: "MT", label: "机器翻译", cat: CAT_MT, color: "#059669" }, |
||||
|
{ key: "tts_svc_id", slot: "TTS", label: "语音合成", cat: CAT_TTS, color: "#7c3aed" } |
||||
|
], |
||||
|
"sts-chat": [{ key: "sts_svc_id", slot: "STS", label: "端到端语音对话", cat: CAT_STS, color: "#be185d" }], |
||||
|
"ast-translate": [{ key: "ast_svc_id", slot: "AST", label: "端到端语音翻译", cat: 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 svcsByCat(cat) { |
||||
|
return allSvcs.value.filter( |
||||
|
(s) => s.enable && (s.categories || "").split(",").map(Number).includes(cat) |
||||
|
); |
||||
|
} |
||||
|
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-463df649><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-463df649><div data-v-463df649><h2 class="text-lg font-semibold text-slate-800" data-v-463df649>Agent 配置</h2><p class="text-xs text-slate-400 mt-1" data-v-463df649> 把已配置的第三方服务编排成可下发客户端的智能体。四种类型按需引用不同服务;通话翻译规则只能引用「翻译」与「端到端翻译」两类。 </p></div><div class="flex items-center gap-3" data-v-463df649><span class="text-sm text-slate-500" data-v-463df649>作用域</span><select class="select select-bordered select-sm" data-v-463df649><option value="" data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`); |
||||
|
ssrRenderList(scopeApps.value, (a) => { |
||||
|
_push(`<option${ssrRenderAttr("value", a)} data-v-463df649${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-463df649>+ 新建 Agent</button></div></div>`); |
||||
|
if (!agents2.value.length) { |
||||
|
_push(`<div class="text-center py-20 text-slate-300" data-v-463df649><div class="text-5xl mb-3" data-v-463df649>🤖</div><p class="text-sm" data-v-463df649>当前作用域下还没有 Agent</p><p class="text-xs mt-1" data-v-463df649>先在「第三方服务配置」里配好服务,再来把它们组装成 Agent</p></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--[-->`); |
||||
|
ssrRenderList(grouped.value, (g) => { |
||||
|
_push(`<div class="mb-6" data-v-463df649><div class="flex items-center gap-2 mb-3" data-v-463df649><span class="type-tag" style="${ssrRenderStyle({ background: g.bg, color: g.color })}" data-v-463df649>${ssrInterpolate(g.icon)} ${ssrInterpolate(g.label)}</span><span class="text-xs text-slate-400" data-v-463df649>${ssrInterpolate(g.hint)}</span><span class="text-xs text-slate-300" data-v-463df649>·</span><span class="text-xs text-slate-400" data-v-463df649>${ssrInterpolate(g.items.length)} 个</span></div><div class="agent-grid" data-v-463df649><!--[-->`); |
||||
|
ssrRenderList(g.items, (a) => { |
||||
|
_push(`<div class="agent-card" data-v-463df649><div class="flex items-start justify-between gap-2" data-v-463df649><div class="min-w-0" data-v-463df649><div class="font-semibold text-sm text-slate-800 truncate" data-v-463df649>${ssrInterpolate(a.name || a.id)}</div><div class="text-[11px] text-slate-400 mt-0.5 truncate" data-v-463df649>${ssrInterpolate(a.id)}</div></div><div class="flex items-center gap-1 flex-shrink-0" data-v-463df649>`); |
||||
|
if (a.enable) { |
||||
|
_push(`<span class="badge badge-success badge-xs" data-v-463df649>启用</span>`); |
||||
|
} else { |
||||
|
_push(`<span class="badge badge-ghost badge-xs" data-v-463df649>停用</span>`); |
||||
|
} |
||||
|
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-463df649>删除</button></div></div>`); |
||||
|
if (a.description) { |
||||
|
_push(`<p class="text-xs text-slate-500 mt-2 line-clamp-2" data-v-463df649>${ssrInterpolate(a.description)}</p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div class="flex flex-wrap items-center gap-1.5 mt-3" data-v-463df649><!--[-->`); |
||||
|
ssrRenderList(pipelineOf(a), (s) => { |
||||
|
_push(`<span class="svc-pill" style="${ssrRenderStyle({ background: s.color })}" data-v-463df649>${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-463df649> 支持语言:${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-463df649><div class="ag-box" data-v-463df649><div class="flex items-center justify-between mb-4" data-v-463df649><div class="flex items-center gap-3" data-v-463df649><h3 class="text-base font-semibold text-slate-800" data-v-463df649>${ssrInterpolate(isEditing.value ? "编辑 Agent" : "新建 Agent")}</h3><span class="scope-chip" data-v-463df649>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-463df649>✕ 关闭</button></div><section class="ed-section" data-v-463df649><div class="ed-section-title" data-v-463df649>类型</div><div class="type-row" data-v-463df649><!--[-->`); |
||||
|
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-463df649><span class="ttab-title" data-v-463df649>${ssrInterpolate(t.icon)} ${ssrInterpolate(t.label)}</span><span class="ttab-desc" data-v-463df649>${ssrInterpolate(t.hint)}</span></button>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
if (isEditing.value) { |
||||
|
_push(`<p class="ed-tip" data-v-463df649>类型创建后不可更改;需要换类型请新建一个 Agent。</p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</section><section class="ed-section" data-v-463df649><div class="ed-section-title" data-v-463df649>基本信息</div><div class="grid grid-cols-2 gap-3" data-v-463df649><div data-v-463df649><span class="ed-label" data-v-463df649>Agent ID <i class="req" data-v-463df649>*</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-463df649></div><div data-v-463df649><span class="ed-label" data-v-463df649>名称 <i class="req" data-v-463df649>*</i></span><input${ssrRenderAttr("value", form.name)} class="input input-bordered input-sm w-full" placeholder="展示名,如 中英实时翻译" data-v-463df649></div></div><div class="mt-3" data-v-463df649><span class="ed-label" data-v-463df649>描述</span><input${ssrRenderAttr("value", form.description)} class="input input-bordered input-sm w-full" placeholder="这个 Agent 用在什么场景" data-v-463df649></div><div class="grid grid-cols-3 gap-3 mt-3" data-v-463df649><div data-v-463df649><span class="ed-label" data-v-463df649>头像 URL</span><input${ssrRenderAttr("value", form.avatar_url)} class="input input-bordered input-sm w-full" placeholder="可留空" data-v-463df649></div><div data-v-463df649><span class="ed-label" data-v-463df649>排序(越大越靠前)</span><input${ssrRenderAttr("value", form.sort)} type="number" class="input input-bordered input-sm w-full" data-v-463df649></div><div data-v-463df649><span class="ed-label" data-v-463df649>音色性别偏好</span><select class="select select-bordered select-sm w-full" data-v-463df649><option${ssrRenderAttr("value", 0)} data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 0) : ssrLooseEqual(form.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(form.gender) ? ssrLooseContain(form.gender, 1) : ssrLooseEqual(form.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-463df649${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-463df649><div class="ed-section-title" data-v-463df649>服务编排</div><div class="slot-row" data-v-463df649><!--[-->`); |
||||
|
ssrRenderList(slotsOfType(form.type), (s, i) => { |
||||
|
_push(`<!--[--><div class="slot-item" data-v-463df649><span class="stage-tag" style="${ssrRenderStyle({ background: s.color })}" data-v-463df649>${ssrInterpolate(s.slot)}</span><span class="ed-label inline" data-v-463df649>${ssrInterpolate(s.label)}</span><select class="select select-bordered select-sm w-full" data-v-463df649><option value="" disabled data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], "") : ssrLooseEqual(form[s.key], "")) ? " selected" : ""}>${ssrInterpolate(svcsByCat(s.cat).length ? "请选择服务" : "(无可用服务,请先去第三方服务配置里添加)")}</option><!--[-->`); |
||||
|
ssrRenderList(svcsByCat(s.cat), (v) => { |
||||
|
_push(`<option${ssrRenderAttr("value", v.id)} data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(form[s.key]) ? ssrLooseContain(form[s.key], v.id) : ssrLooseEqual(form[s.key], v.id)) ? " selected" : ""}>${ssrInterpolate(v.name)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select></div>`); |
||||
|
if (i < slotsOfType(form.type).length - 1) { |
||||
|
_push(`<span class="slot-arrow" data-v-463df649>→</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--]-->`); |
||||
|
}); |
||||
|
_push(`<!--]--></div></section><section class="ed-section" data-v-463df649><div class="ed-section-title" data-v-463df649>语言与音色</div><div class="grid grid-cols-2 gap-3" data-v-463df649><div data-v-463df649><span class="ed-label" data-v-463df649>支持语言(多选)</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-463df649><span class="ed-label" data-v-463df649>默认语言</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-463df649><div class="flex items-center justify-between mb-1" data-v-463df649><span class="ed-label mb-0" data-v-463df649>音色覆盖(不填则用 TTS 服务自带默认音色)</span><button class="btn btn-ghost btn-xs" data-v-463df649>+ 添加一行</button></div>`); |
||||
|
if (!form.voice_map.length) { |
||||
|
_push(`<div class="text-xs text-slate-300 py-2" data-v-463df649>未设置音色覆盖</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--[-->`); |
||||
|
ssrRenderList(form.voice_map, (v, i) => { |
||||
|
_push(`<div class="voice-row" data-v-463df649><select class="select select-bordered select-xs" data-v-463df649><option value="" data-v-463df649${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-463df649${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-463df649><option${ssrRenderAttr("value", 0)} data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 0) : ssrLooseEqual(v.gender, 0)) ? " selected" : ""}>不限</option><option${ssrRenderAttr("value", 1)} data-v-463df649${ssrIncludeBooleanAttr(Array.isArray(v.gender) ? ssrLooseContain(v.gender, 1) : ssrLooseEqual(v.gender, 1)) ? " selected" : ""}>男</option><option${ssrRenderAttr("value", 2)} data-v-463df649${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-463df649><button class="btn btn-ghost btn-xs text-error" data-v-463df649>删除</button></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div></section>`); |
||||
|
if (isChatType.value) { |
||||
|
_push(`<section class="ed-section" data-v-463df649><div class="ed-section-title" data-v-463df649>对话设定</div><div data-v-463df649><span class="ed-label" data-v-463df649>系统提示词</span><textarea class="textarea textarea-bordered w-full text-xs" rows="3" placeholder="定义这个智能体的人设与行为" data-v-463df649>${ssrInterpolate(form.system_prompt)}</textarea></div><div class="mt-3" data-v-463df649><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-463df649><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-463df649><span data-v-463df649>开场白</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-463df649>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div></section>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div class="ed-footer" data-v-463df649><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-463df649><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-463df649><span data-v-463df649>启用</span></label><div class="flex gap-2" data-v-463df649><button class="btn btn-ghost btn-sm" data-v-463df649>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-463df649>保存</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-463df649"]]); |
||||
|
|
||||
|
export { agents as default }; |
||||
|
//# sourceMappingURL=agents-sIgrTlD1.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"agents-sIgrTlD1.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-sIgrTlD1.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -0,0 +1,8 @@ |
|||||
|
const agents_vue_vue_type_style_index_0_scoped_463df649_lang = ".type-tag[data-v-463df649]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px}.agent-grid[data-v-463df649]{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}.agent-card[data-v-463df649]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:14px 16px;cursor:pointer;transition:all .15s}.agent-card[data-v-463df649]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.svc-pill[data-v-463df649]{display:inline-flex;align-items:center;font-size:10px;font-weight:600;padding:2px 8px;border-radius:7px;color:#fff}.ag-overlay[data-v-463df649]{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-463df649]{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-463df649]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:6px;background:#eef2ff;color:#4338ca}.ed-section[data-v-463df649]{padding:14px 0;border-top:1px dashed #eef2f7}.ed-section[data-v-463df649]:first-of-type{padding-top:0;border-top:none}.ed-section-title[data-v-463df649]{font-size:11px;font-weight:700;letter-spacing:.04em;color:#94a3b8;margin-bottom:10px}.ed-label[data-v-463df649]{display:block;font-size:11px;color:#64748b;margin-bottom:4px}.ed-label.inline[data-v-463df649]{display:inline-block;margin-left:6px}.ed-tip[data-v-463df649]{font-size:11px;color:#94a3b8;margin-top:8px}.req[data-v-463df649]{color:#dc2626;font-style:normal}.type-row[data-v-463df649]{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.ttab[data-v-463df649]{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-463df649]:hover:not(:disabled){border-color:#c7d2fe;background:#f8fafc}.ttab.on[data-v-463df649]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.ttab.locked[data-v-463df649]{opacity:.45;cursor:not-allowed}.ttab-title[data-v-463df649]{font-weight:700;font-size:12px;color:#1e293b}.ttab-desc[data-v-463df649]{font-size:10px;color:#94a3b8}.slot-row[data-v-463df649]{display:flex;align-items:flex-end;gap:10px}.slot-item[data-v-463df649]{flex:1;min-width:0}.slot-arrow[data-v-463df649]{color:#cbd5e1;padding-bottom:8px;flex-shrink:0}.stage-tag[data-v-463df649]{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:5px;color:#fff;vertical-align:middle}.voice-row[data-v-463df649]{gap:8px;margin-bottom:6px}.ed-footer[data-v-463df649],.voice-row[data-v-463df649]{display:flex;align-items:center}.ed-footer[data-v-463df649]{justify-content:space-between;gap:12px;padding-top:14px;border-top:1px solid #eef2f7}@media(max-width:860px){.type-row[data-v-463df649]{grid-template-columns:repeat(2,1fr)}.slot-row[data-v-463df649]{flex-direction:column;align-items:stretch}.slot-arrow[data-v-463df649]{display:none}}"; |
||||
|
|
||||
|
const agentsStyles_DrcBfQcb = [ |
||||
|
agents_vue_vue_type_style_index_0_scoped_463df649_lang |
||||
|
]; |
||||
|
|
||||
|
export { agentsStyles_DrcBfQcb as default }; |
||||
|
//# sourceMappingURL=agents-styles.DrcBfQcb.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"agents-styles.DrcBfQcb.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-styles-1.mjs-Dz2nKerr.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/agents-styles.DrcBfQcb.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
||||
@ -0,0 +1,100 @@ |
|||||
|
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; |
||||
|
import { ssrRenderAttrs, ssrRenderStyle, ssrIncludeBooleanAttr, ssrRenderAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrInterpolate } from 'vue/server-renderer'; |
||||
|
import { u as useApi } from './useApi-B-E5eLsI.mjs'; |
||||
|
import { u as useToast } from './useToast-CS21XT61.mjs'; |
||||
|
import './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'; |
||||
|
import './useLoading-D4zrSa2m.mjs'; |
||||
|
|
||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({ |
||||
|
__name: "appconfig", |
||||
|
__ssrInlineRender: true, |
||||
|
setup(__props) { |
||||
|
useApi(); |
||||
|
useToast(); |
||||
|
const view = ref("list"); |
||||
|
const apps = ref([]); |
||||
|
const curApp = ref(0); |
||||
|
const items = ref([]); |
||||
|
const loading = ref(false); |
||||
|
const submitting = ref(false); |
||||
|
const isEditing = ref(false); |
||||
|
const keyword = ref(""); |
||||
|
const form = reactive({ id: 0, group: "", key: "", value: "", description: "" }); |
||||
|
const curAppLabel = computed(() => { |
||||
|
const a = apps.value.find((x) => x.id === curApp.value); |
||||
|
return a ? a.name || a.app_name : ""; |
||||
|
}); |
||||
|
const filteredRows = computed(() => { |
||||
|
const kw = keyword.value.trim().toLowerCase(); |
||||
|
if (!kw) return items.value; |
||||
|
return items.value.filter((c) => ((c.group || "") + (c.key || "")).toLowerCase().includes(kw)); |
||||
|
}); |
||||
|
const groupedRows = computed(() => { |
||||
|
const groups = {}; |
||||
|
filteredRows.value.forEach((c) => { |
||||
|
const g = c.group || ""; |
||||
|
(groups[g] = groups[g] || []).push(c); |
||||
|
}); |
||||
|
const names = Object.keys(groups).sort((a, b) => { |
||||
|
if (a === "") return -1; |
||||
|
if (b === "") return 1; |
||||
|
return a < b ? -1 : 1; |
||||
|
}); |
||||
|
return names.map((g) => ({ key: g, label: g || "未分组", items: groups[g] })); |
||||
|
}); |
||||
|
return (_ctx, _push, _parent, _attrs) => { |
||||
|
_push(`<div${ssrRenderAttrs(_attrs)}><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}"><div class="flex items-center justify-between mb-5"><div><h2 class="text-lg font-semibold text-slate-800">应用环境配置</h2><p class="text-xs text-slate-400 mt-1">应用自有的 key/value 配置(音乐、OSS 等),直接读写所选应用的业务库。结构同「全局环境配置」但不分区域。</p></div><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(!curApp.value) ? " disabled" : ""}>+ 新增配置</button></div><div class="flex items-center gap-3 mb-4"><span class="text-sm text-slate-500">应用</span><select class="select select-bordered select-sm min-w-48"><option${ssrRenderAttr("value", 0)} disabled${ssrIncludeBooleanAttr(Array.isArray(curApp.value) ? ssrLooseContain(curApp.value, 0) : ssrLooseEqual(curApp.value, 0)) ? " selected" : ""}>请选择应用</option><!--[-->`); |
||||
|
ssrRenderList(apps.value, (a) => { |
||||
|
_push(`<option${ssrRenderAttr("value", a.id)}${ssrIncludeBooleanAttr(Array.isArray(curApp.value) ? ssrLooseContain(curApp.value, a.id) : ssrLooseEqual(curApp.value, a.id)) ? " selected" : ""}>${ssrInterpolate(a.name || a.app_name)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select><input${ssrRenderAttr("value", keyword.value)} class="input input-bordered input-sm w-48" placeholder="按分组/键搜索"></div>`); |
||||
|
if (!curApp.value) { |
||||
|
_push(`<div class="bg-white rounded-xl shadow-sm border border-slate-100 text-center text-slate-400 py-16"><div class="text-4xl mb-2">🗂️</div><p class="text-sm">请先在上方选择一个应用</p></div>`); |
||||
|
} else { |
||||
|
_push(`<div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="overflow-x-auto"><table class="table"><thead><tr><th>键</th><th>值</th><th>描述</th><th class="text-right">操作</th></tr></thead><tbody>`); |
||||
|
if (loading.value) { |
||||
|
_push(`<tr><td colspan="4" class="text-center py-8"><span class="loading loading-spinner loading-sm"></span></td></tr>`); |
||||
|
} else if (!filteredRows.value.length) { |
||||
|
_push(`<tr><td colspan="4" class="text-center text-slate-400 py-8">暂无配置</td></tr>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--[-->`); |
||||
|
ssrRenderList(groupedRows.value, (grp) => { |
||||
|
_push(`<!--[--><tr class="bg-slate-100/80"><td colspan="4" class="py-2"><span class="font-semibold text-slate-600 text-sm">▸ ${ssrInterpolate(grp.label)}</span><span class="text-xs text-slate-400 ml-2">${ssrInterpolate(grp.items.length)} 项</span></td></tr><!--[-->`); |
||||
|
ssrRenderList(grp.items, (c) => { |
||||
|
_push(`<tr class="hover"><td class="font-mono text-sm font-medium">${ssrInterpolate(c.key || "")}</td><td class="text-sm text-slate-500 max-w-xs truncate"${ssrRenderAttr("title", c.value || "")}>${ssrInterpolate(c.value || "")}</td><td class="text-sm text-slate-400">${ssrInterpolate(c.description || "")}</td><td class="text-right"><div class="inline-flex gap-1"><button class="btn btn-ghost btn-xs">编辑</button><button class="btn btn-ghost btn-xs text-red-500">删除</button></div></td></tr>`); |
||||
|
}); |
||||
|
_push(`<!--]--><!--]-->`); |
||||
|
}); |
||||
|
_push(`<!--]--></tbody></table></div></div>`); |
||||
|
} |
||||
|
_push(`</div><div style="${ssrRenderStyle(view.value === "form" ? null : { display: "none" })}"><div class="flex items-center gap-3 mb-5"><button class="btn btn-ghost btn-sm">← 返回列表</button><h2 class="text-lg font-semibold text-slate-800">${ssrInterpolate(isEditing.value ? "编辑配置" : "新增配置")}</h2><span class="text-xs text-slate-400">应用:${ssrInterpolate(curAppLabel.value)}</span></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl"><form><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">分组 (group)</span></label><input${ssrRenderAttr("value", form.group)} type="text" class="input input-bordered w-full" placeholder="如 music / oss / other"></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">键 (key) *</span></label><input${ssrRenderAttr("value", form.key)} type="text" class="input input-bordered w-full" required placeholder="如 oss_access_key"></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">值 (value)</span></label><textarea class="textarea textarea-bordered w-full font-mono text-sm" rows="3">${ssrInterpolate(form.value)}</textarea></div><div class="form-control mb-6"><label class="label"><span class="label-text font-medium">描述</span></label><input${ssrRenderAttr("value", form.description)} type="text" class="input input-bordered w-full"></div><div class="flex gap-3"><button type="button" class="btn btn-ghost">取消</button><button type="submit" class="btn btn-primary text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""}>保存</button></div></form></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/appconfig.vue"); |
||||
|
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
||||
|
}; |
||||
|
|
||||
|
export { _sfc_main as default }; |
||||
|
//# sourceMappingURL=appconfig-BTmHA76P.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"appconfig-BTmHA76P.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/appconfig-BTmHA76P.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1,211 +0,0 @@ |
|||||
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; |
|
||||
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrInterpolate, ssrRenderClass } from 'vue/server-renderer'; |
|
||||
import { u as useApi } from './useApi-B-E5eLsI.mjs'; |
|
||||
import { u as useToast } from './useToast-CS21XT61.mjs'; |
|
||||
import { _ as _export_sfc } from './server.mjs'; |
|
||||
import './useLoading-D4zrSa2m.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_STT = 1; |
|
||||
const SCAT_TTS = 2; |
|
||||
const SCAT_MT = 3; |
|
||||
const SCAT_AST = 4; |
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({ |
|
||||
__name: "calltranslate", |
|
||||
__ssrInlineRender: true, |
|
||||
setup(__props) { |
|
||||
const LANGS = [ |
|
||||
{ c: "zh", n: "中文" }, |
|
||||
{ c: "en", n: "英文" }, |
|
||||
{ c: "ja", n: "日语" }, |
|
||||
{ c: "ko", n: "韩语" }, |
|
||||
{ c: "fr", n: "法语" }, |
|
||||
{ c: "de", n: "德语" }, |
|
||||
{ c: "es", n: "西班牙语" }, |
|
||||
{ c: "pt", n: "葡萄牙语" }, |
|
||||
{ c: "ru", n: "俄语" }, |
|
||||
{ c: "ar", n: "阿拉伯语" }, |
|
||||
{ c: "th", n: "泰语" }, |
|
||||
{ c: "vi", n: "越南语" }, |
|
||||
{ c: "id", n: "印尼语" }, |
|
||||
{ c: "ms", n: "马来语" }, |
|
||||
{ c: "hi", n: "印地语" } |
|
||||
]; |
|
||||
function langName(c) { |
|
||||
const x = LANGS.find((l) => l.c === c); |
|
||||
return x ? x.n : c || ""; |
|
||||
} |
|
||||
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: "印度" } |
|
||||
]; |
|
||||
useApi(); |
|
||||
useToast(); |
|
||||
const backendReady = ref(true); |
|
||||
const allSvcs = ref([]); |
|
||||
const pairs = ref([]); |
|
||||
const curRegion = ref(REGIONS.length ? REGIONS[0].value : 1); |
|
||||
const editorOpen = ref(false); |
|
||||
const editingPair = ref(null); |
|
||||
ref(0); |
|
||||
const ed = reactive({ |
|
||||
src: "zh", |
|
||||
dst: "en", |
|
||||
bidir: false, |
|
||||
mode: 0, |
|
||||
asr: "", |
|
||||
mt: "", |
|
||||
tts: "", |
|
||||
ast: "", |
|
||||
enable: true |
|
||||
}); |
|
||||
function svcsByCat(cat) { |
|
||||
return allSvcs.value.filter( |
|
||||
(s) => s.enable && (s.categories || "").split(",").map(Number).indexOf(cat) >= 0 |
|
||||
); |
|
||||
} |
|
||||
function svcName(id) { |
|
||||
const s = allSvcs.value.find((x) => x.id === id); |
|
||||
return s ? s.name : id || "未配置"; |
|
||||
} |
|
||||
const syncOpen = ref(false); |
|
||||
const syncDesc = ref(""); |
|
||||
const syncTargets = ref([]); |
|
||||
const syncRegions = computed(() => REGIONS.filter((r) => r.value !== curRegion.value)); |
|
||||
return (_ctx, _push, _parent, _attrs) => { |
|
||||
_push(`<div${ssrRenderAttrs(_attrs)} data-v-51f11136>`); |
|
||||
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-51f11136> ⚠ 「通话翻译配置」的后端接口尚未迁移到当前 console 服务,功能暂不可用。 </div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<div class="flex items-center justify-between mb-5" data-v-51f11136><div data-v-51f11136><h2 class="text-lg font-semibold text-slate-800" data-v-51f11136>通话翻译配置</h2><p class="text-xs text-slate-400 mt-1" data-v-51f11136>按区域和语言对配置翻译服务。支持三段式(ASR→MT→TTS)和端到端 AST 两种模式。</p></div><div class="flex items-center gap-3" data-v-51f11136><span class="text-sm text-slate-500" data-v-51f11136>区域</span><select class="select select-bordered select-sm" data-v-51f11136><!--[-->`); |
|
||||
ssrRenderList(REGIONS, (r) => { |
|
||||
_push(`<option${ssrRenderAttr("value", r.value)} data-v-51f11136${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-primary btn-sm text-white" data-v-51f11136>+ 新增语言对</button></div></div><div class="editor-panel" style="${ssrRenderStyle(editorOpen.value ? null : { display: "none" })}" data-v-51f11136><div class="flex items-center justify-between mb-4" data-v-51f11136><h3 class="font-semibold text-slate-800 text-sm" data-v-51f11136>${ssrInterpolate(editingPair.value ? "编辑语言对" : "新增语言对")}</h3><button class="btn btn-ghost btn-xs" data-v-51f11136>✕ 关闭</button></div><div class="grid grid-cols-3 gap-4 mb-4" data-v-51f11136><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>源语言 *</span></label><select class="select select-bordered select-sm" data-v-51f11136><!--[-->`); |
|
||||
ssrRenderList(LANGS, (l) => { |
|
||||
_push(`<option${ssrRenderAttr("value", l.c)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.src) ? ssrLooseContain(ed.src, l.c) : ssrLooseEqual(ed.src, l.c)) ? " selected" : ""}>${ssrInterpolate(l.n)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></div><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>目标语言 *</span></label><select class="select select-bordered select-sm" data-v-51f11136><!--[-->`); |
|
||||
ssrRenderList(LANGS, (l) => { |
|
||||
_push(`<option${ssrRenderAttr("value", l.c)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.dst) ? ssrLooseContain(ed.dst, l.c) : ssrLooseEqual(ed.dst, l.c)) ? " selected" : ""}>${ssrInterpolate(l.n)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></div><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>双向</span></label><input${ssrIncludeBooleanAttr(Array.isArray(ed.bidir) ? ssrLooseContain(ed.bidir, null) : ed.bidir) ? " checked" : ""} type="checkbox" class="toggle toggle-primary mt-1" data-v-51f11136></div></div><div class="flex gap-3 mb-4" data-v-51f11136><div class="${ssrRenderClass([{ on: ed.mode === 0 }, "mtab"])}" data-v-51f11136><div data-v-51f11136><div class="font-bold text-sm" data-v-51f11136>🧩 三段式拼接</div><div class="text-xs text-slate-400 mt-0.5" data-v-51f11136>ASR → MT → TTS</div></div></div><div class="${ssrRenderClass([{ on: ed.mode === 1 }, "mtab"])}" data-v-51f11136><div data-v-51f11136><div class="font-bold text-sm" data-v-51f11136>⚡ 端到端 AST</div><div class="text-xs text-slate-400 mt-0.5" data-v-51f11136>单服务直接完成语音翻译</div></div></div></div><div data-v-51f11136>`); |
|
||||
if (ed.mode === 0) { |
|
||||
_push(`<div class="grid grid-cols-3 gap-4" data-v-51f11136><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>语音识别(ASR)</span></label><select class="select select-bordered select-sm" data-v-51f11136>`); |
|
||||
if (!svcsByCat(SCAT_STT).length) { |
|
||||
_push(`<option value="" data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.asr) ? ssrLooseContain(ed.asr, "") : ssrLooseEqual(ed.asr, "")) ? " selected" : ""}>(无可用服务)</option>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<!--[-->`); |
|
||||
ssrRenderList(svcsByCat(SCAT_STT), (s) => { |
|
||||
_push(`<option${ssrRenderAttr("value", s.id)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.asr) ? ssrLooseContain(ed.asr, s.id) : ssrLooseEqual(ed.asr, s.id)) ? " selected" : ""}>${ssrInterpolate(s.name)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></div><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>机器翻译(MT)</span></label><select class="select select-bordered select-sm" data-v-51f11136>`); |
|
||||
if (!svcsByCat(SCAT_MT).length) { |
|
||||
_push(`<option value="" data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.mt) ? ssrLooseContain(ed.mt, "") : ssrLooseEqual(ed.mt, "")) ? " selected" : ""}>(无可用服务)</option>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<!--[-->`); |
|
||||
ssrRenderList(svcsByCat(SCAT_MT), (s) => { |
|
||||
_push(`<option${ssrRenderAttr("value", s.id)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.mt) ? ssrLooseContain(ed.mt, s.id) : ssrLooseEqual(ed.mt, s.id)) ? " selected" : ""}>${ssrInterpolate(s.name)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></div><div class="form-control" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>语音合成(TTS)</span></label><select class="select select-bordered select-sm" data-v-51f11136>`); |
|
||||
if (!svcsByCat(SCAT_TTS).length) { |
|
||||
_push(`<option value="" data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.tts) ? ssrLooseContain(ed.tts, "") : ssrLooseEqual(ed.tts, "")) ? " selected" : ""}>(无可用服务)</option>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<!--[-->`); |
|
||||
ssrRenderList(svcsByCat(SCAT_TTS), (s) => { |
|
||||
_push(`<option${ssrRenderAttr("value", s.id)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.tts) ? ssrLooseContain(ed.tts, s.id) : ssrLooseEqual(ed.tts, s.id)) ? " selected" : ""}>${ssrInterpolate(s.name)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></div></div>`); |
|
||||
} else { |
|
||||
_push(`<div class="form-control max-w-xs" data-v-51f11136><label class="label py-1" data-v-51f11136><span class="label-text text-xs" data-v-51f11136>端到端语音翻译服务(AST)</span></label><select class="select select-bordered select-sm" data-v-51f11136>`); |
|
||||
if (!svcsByCat(SCAT_AST).length) { |
|
||||
_push(`<option value="" data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.ast) ? ssrLooseContain(ed.ast, "") : ssrLooseEqual(ed.ast, "")) ? " selected" : ""}>(无可用服务)</option>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<!--[-->`); |
|
||||
ssrRenderList(svcsByCat(SCAT_AST), (s) => { |
|
||||
_push(`<option${ssrRenderAttr("value", s.id)} data-v-51f11136${ssrIncludeBooleanAttr(Array.isArray(ed.ast) ? ssrLooseContain(ed.ast, s.id) : ssrLooseEqual(ed.ast, s.id)) ? " selected" : ""}>${ssrInterpolate(s.name)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></div>`); |
|
||||
} |
|
||||
_push(`</div><div class="flex items-center justify-between pt-4 border-t border-slate-100 mt-4" data-v-51f11136><label class="flex items-center gap-2 text-sm" data-v-51f11136><input${ssrIncludeBooleanAttr(Array.isArray(ed.enable) ? ssrLooseContain(ed.enable, null) : ed.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-51f11136> 启用 </label><div class="flex gap-2" data-v-51f11136><button class="btn btn-ghost btn-sm" data-v-51f11136>取消</button><button class="btn btn-primary btn-sm text-white" data-v-51f11136>保存</button></div></div></div><div class="grid grid-cols-1 gap-4" style="${ssrRenderStyle({ "grid-template-columns": "repeat(auto-fill,minmax(360px,1fr))" })}" data-v-51f11136>`); |
|
||||
if (!pairs.value.length) { |
|
||||
_push(`<div class="col-span-full text-center py-20 text-slate-300" data-v-51f11136><div class="text-5xl mb-3" data-v-51f11136>🌐</div><p class="text-sm" data-v-51f11136>当前区域暂无语言对配置</p></div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<!--[-->`); |
|
||||
ssrRenderList(pairs.value, (p) => { |
|
||||
_push(`<div class="pair-card" data-v-51f11136><div class="flex items-center justify-between" data-v-51f11136><div class="flex items-center gap-2" data-v-51f11136><span class="lang-badge" data-v-51f11136>${ssrInterpolate(langName(p.src_lang))}</span><span class="text-slate-400 font-bold text-lg" data-v-51f11136>${ssrInterpolate(p.bidir ? "⇄" : "→")}</span><span class="lang-badge" data-v-51f11136>${ssrInterpolate(langName(p.dst_lang))}</span></div><div class="flex items-center gap-2" data-v-51f11136>`); |
|
||||
if (p.mode === 0) { |
|
||||
_push(`<span class="mode-badge mode-pipeline" data-v-51f11136>三段式拼接</span>`); |
|
||||
} else { |
|
||||
_push(`<span class="mode-badge mode-e2e" data-v-51f11136>端到端 AST</span>`); |
|
||||
} |
|
||||
if (p.enable) { |
|
||||
_push(`<span class="badge badge-success badge-xs" data-v-51f11136>启用</span>`); |
|
||||
} else { |
|
||||
_push(`<span class="badge badge-ghost badge-xs" data-v-51f11136>停用</span>`); |
|
||||
} |
|
||||
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-51f11136>删除</button></div></div>`); |
|
||||
if (p.mode === 0) { |
|
||||
_push(`<div class="flex flex-wrap items-center gap-2 mt-3" data-v-51f11136><span class="svc-pill" style="${ssrRenderStyle({ "background": "#1664ff" })}" data-v-51f11136>ASR: ${ssrInterpolate(svcName(p.asr_svc_id))}</span><span class="text-slate-300 text-sm" data-v-51f11136>→</span><span class="svc-pill" style="${ssrRenderStyle({ "background": "#059669" })}" data-v-51f11136>MT: ${ssrInterpolate(svcName(p.mt_svc_id))}</span><span class="text-slate-300 text-sm" data-v-51f11136>→</span><span class="svc-pill" style="${ssrRenderStyle({ "background": "#7c3aed" })}" data-v-51f11136>TTS: ${ssrInterpolate(svcName(p.tts_svc_id))}</span></div>`); |
|
||||
} else { |
|
||||
_push(`<div class="flex items-center gap-2 mt-3" data-v-51f11136><span class="svc-pill" style="${ssrRenderStyle({ "background": "#f97316" })}" data-v-51f11136>AST: ${ssrInterpolate(svcName(p.ast_svc_id))}</span></div>`); |
|
||||
} |
|
||||
_push(`</div>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div><div class="sync-overlay" style="${ssrRenderStyle(syncOpen.value ? null : { display: "none" })}" data-v-51f11136><div class="sync-box" data-v-51f11136><div class="flex items-start gap-3 mb-4" data-v-51f11136><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-51f11136><svg style="${ssrRenderStyle({ "width": "20px", "height": "20px", "color": "#fff" })}" fill="none" viewBox="0 0 24 24" stroke="currentColor" data-v-51f11136><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-51f11136></path></svg></div><div data-v-51f11136><h3 class="text-base font-semibold text-slate-800" data-v-51f11136>同步到其他区域</h3><p class="text-xs text-slate-400 mt-1" data-v-51f11136>${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-51f11136> ✦ 同步内容:服务组合(模式 + 各段服务)将被复制到目标区域。 </div><div class="flex items-center justify-between mb-1" data-v-51f11136><span class="text-xs font-semibold text-slate-500" data-v-51f11136>选择目标区域</span><div class="flex gap-2" data-v-51f11136><button class="btn btn-ghost btn-xs" data-v-51f11136>全选</button><button class="btn btn-ghost btn-xs" data-v-51f11136>清空</button></div></div><div class="sync-region-grid" data-v-51f11136><!--[-->`); |
|
||||
ssrRenderList(syncRegions.value, (r) => { |
|
||||
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-51f11136><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-51f11136><span data-v-51f11136>${ssrInterpolate(r.label)}</span></label>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-51f11136>⚠ 目标区域相同语言对已存在则覆盖,否则新建。</p><div class="flex gap-3 justify-end" data-v-51f11136><button class="btn btn-ghost" data-v-51f11136>仅保存当前区域</button><button class="btn btn-primary text-white" data-v-51f11136>保存并同步</button></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/calltranslate.vue"); |
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
|
||||
}; |
|
||||
const calltranslate = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-51f11136"]]); |
|
||||
|
|
||||
export { calltranslate as default }; |
|
||||
//# sourceMappingURL=calltranslate--sRmJf-u.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"calltranslate--sRmJf-u.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate--sRmJf-u.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1,267 @@ |
|||||
|
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; |
||||
|
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderComponent, ssrRenderClass } from 'vue/server-renderer'; |
||||
|
import { u as useApi } from './useApi-B-E5eLsI.mjs'; |
||||
|
import { u as useToast } from './useToast-CS21XT61.mjs'; |
||||
|
import { l as langName } from './useLangOptions-DMhiAuTa.mjs'; |
||||
|
import { _ as __nuxt_component_0 } from './LangSelect-C_QPlcDf.mjs'; |
||||
|
import { _ as _export_sfc } from './server.mjs'; |
||||
|
import './useLoading-D4zrSa2m.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 LANG_ANY = "*"; |
||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({ |
||||
|
__name: "calltranslate", |
||||
|
__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: "印度" } |
||||
|
]; |
||||
|
function regionLabel(v) { |
||||
|
return REGIONS.find((x) => x.value === v)?.label ?? "区域" + v; |
||||
|
} |
||||
|
const TRANS_TYPES = { |
||||
|
translate: { label: "🧩 三段式翻译", color: "#059669", bg: "#dcfce7" }, |
||||
|
"ast-translate": { label: "🚀 端到端翻译", color: "#c2410c", bg: "#fff7ed" } |
||||
|
}; |
||||
|
function typeLabel(t) { |
||||
|
return t && TRANS_TYPES[t] ? TRANS_TYPES[t].label : t || "未知"; |
||||
|
} |
||||
|
function typeStyle(t) { |
||||
|
const s = t ? TRANS_TYPES[t] : void 0; |
||||
|
return s ? { background: s.bg, color: s.color } : { background: "#f1f5f9", color: "#64748b" }; |
||||
|
} |
||||
|
useApi(); |
||||
|
useToast(); |
||||
|
const scopeApp = ref(""); |
||||
|
const scopeApps = ref([]); |
||||
|
const curRegion = ref(REGIONS[0].value); |
||||
|
const rules = ref([]); |
||||
|
const agents = ref([]); |
||||
|
const editorOpen = ref(false); |
||||
|
const editing = ref(null); |
||||
|
ref(null); |
||||
|
ref(0); |
||||
|
const ed = reactive({ |
||||
|
name: "", |
||||
|
srcLangs: "", |
||||
|
dstLangs: "", |
||||
|
srcAny: false, |
||||
|
dstAny: false, |
||||
|
bidir: true, |
||||
|
region: 0, |
||||
|
priority: 100, |
||||
|
agentId: "", |
||||
|
remark: "", |
||||
|
enable: true |
||||
|
}); |
||||
|
const transAgents = computed(() => agents.value.filter((a) => a.type in TRANS_TYPES)); |
||||
|
const agentGroups = computed( |
||||
|
() => Object.keys(TRANS_TYPES).map((t) => ({ |
||||
|
type: t, |
||||
|
label: TRANS_TYPES[t].label, |
||||
|
items: transAgents.value.filter((a) => a.type === t) |
||||
|
})).filter((g) => g.items.length) |
||||
|
); |
||||
|
const curAgent = computed(() => agents.value.find((a) => a.id === ed.agentId) || null); |
||||
|
const langWarn = computed(() => { |
||||
|
const a = curAgent.value; |
||||
|
if (!a || !a.support_langs) return ""; |
||||
|
const sup = a.support_langs.split(",").map((x) => x.trim()).filter(Boolean); |
||||
|
if (!sup.length) return ""; |
||||
|
const picked = [ |
||||
|
...ed.srcAny ? [] : ed.srcLangs.split(","), |
||||
|
...ed.dstAny ? [] : ed.dstLangs.split(",") |
||||
|
].map((x) => x.trim()).filter(Boolean); |
||||
|
const miss = picked.filter((c) => !sup.includes(c)); |
||||
|
if (!miss.length) return ""; |
||||
|
return `Agent「${a.name || a.id}」未声明支持:${miss.join("、")}`; |
||||
|
}); |
||||
|
function isAny(s) { |
||||
|
return (s || "").trim() === LANG_ANY; |
||||
|
} |
||||
|
function langsLabel(s) { |
||||
|
if (isAny(s)) return "任意语言"; |
||||
|
const arr = (s || "").split(",").map((x) => x.trim()).filter(Boolean); |
||||
|
if (!arr.length) return "—"; |
||||
|
if (arr.length <= 3) return arr.map((c) => langName(c)).join("、"); |
||||
|
return arr.slice(0, 3).map((c) => langName(c)).join("、") + ` 等 ${arr.length} 种`; |
||||
|
} |
||||
|
function agentName(id) { |
||||
|
return agents.value.find((a) => a.id === id)?.name || id || "未配置"; |
||||
|
} |
||||
|
function agentType(id) { |
||||
|
return agents.value.find((a) => a.id === id)?.type || ""; |
||||
|
} |
||||
|
const syncOpen = ref(false); |
||||
|
const syncDesc = ref(""); |
||||
|
const syncTargets = ref([]); |
||||
|
const syncRegions = computed(() => REGIONS.filter((r) => r.value !== ed.region)); |
||||
|
const testOpen = ref(false); |
||||
|
const testSrc = ref("zh-CN"); |
||||
|
const testDst = ref("en-US"); |
||||
|
const testResult = ref(null); |
||||
|
return (_ctx, _push, _parent, _attrs) => { |
||||
|
_push(`<div${ssrRenderAttrs(_attrs)} data-v-c0bab860><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-c0bab860><div data-v-c0bab860><h2 class="text-lg font-semibold text-slate-800" data-v-c0bab860>通话翻译规则</h2><p class="text-xs text-slate-400 mt-1" data-v-c0bab860> 一条规则覆盖「多源语言 × 多目标语言」,命中后走它指定的 Agent。多条规则按优先级从高到低匹配,第一条命中的生效。 </p></div><div class="flex items-center gap-3 flex-wrap" data-v-c0bab860><span class="text-sm text-slate-500" data-v-c0bab860>作用域</span><select class="select select-bordered select-sm" data-v-c0bab860><option value="" data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认</option><!--[-->`); |
||||
|
ssrRenderList(scopeApps.value, (a) => { |
||||
|
_push(`<option${ssrRenderAttr("value", a)} data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, a) : ssrLooseEqual(scopeApp.value, a)) ? " selected" : ""}>${ssrInterpolate(a)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select><span class="text-sm text-slate-500" data-v-c0bab860>区域</span><select class="select select-bordered select-sm" data-v-c0bab860><!--[-->`); |
||||
|
ssrRenderList(REGIONS, (r) => { |
||||
|
_push(`<option${ssrRenderAttr("value", r.value)} data-v-c0bab860${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-c0bab860>🔍 选路试算</button><button class="btn btn-primary btn-sm text-white" data-v-c0bab860>+ 新增规则</button></div></div><div class="editor-panel" style="${ssrRenderStyle(editorOpen.value ? null : { display: "none" })}" data-v-c0bab860><div class="flex items-center justify-between mb-5" data-v-c0bab860><div class="flex items-center gap-3" data-v-c0bab860><h3 class="font-semibold text-slate-800 text-sm" data-v-c0bab860>${ssrInterpolate(editing.value ? "编辑规则" : "新增规则")}</h3><span class="region-chip" data-v-c0bab860>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-c0bab860>✕ 关闭</button></div><section class="ed-section" data-v-c0bab860><div class="ed-section-title" data-v-c0bab860>匹配条件</div><div class="lang-row" data-v-c0bab860><div class="lang-field" data-v-c0bab860><div class="flex items-center justify-between" data-v-c0bab860><span class="ed-label" data-v-c0bab860>源语言</span><label class="any-toggle" data-v-c0bab860><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(ed.srcAny) ? " checked" : ""} data-v-c0bab860> 任意语言 </label></div>`); |
||||
|
if (ed.srcAny) { |
||||
|
_push(`<div class="any-box" data-v-c0bab860>任意源语言</div>`); |
||||
|
} else { |
||||
|
_push(ssrRenderComponent(__nuxt_component_0, { |
||||
|
modelValue: ed.srcLangs, |
||||
|
"onUpdate:modelValue": ($event) => ed.srcLangs = $event, |
||||
|
multiple: "" |
||||
|
}, null, _parent)); |
||||
|
} |
||||
|
_push(`</div><div class="dir-col" data-v-c0bab860><button type="button" class="${ssrRenderClass([{ on: ed.bidir }, "dir-btn"])}"${ssrRenderAttr("title", ed.bidir ? "点击改为单向" : "点击改为双向(反向也走这条规则)")} data-v-c0bab860>${ssrInterpolate(ed.bidir ? "⇄" : "→")}</button><span class="dir-tip" data-v-c0bab860>${ssrInterpolate(ed.bidir ? "双向互译" : "单向翻译")}</span></div><div class="lang-field" data-v-c0bab860><div class="flex items-center justify-between" data-v-c0bab860><span class="ed-label" data-v-c0bab860>目标语言</span><label class="any-toggle" data-v-c0bab860><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(ed.dstAny) ? " checked" : ""} data-v-c0bab860> 任意语言 </label></div>`); |
||||
|
if (ed.dstAny) { |
||||
|
_push(`<div class="any-box" data-v-c0bab860>任意目标语言</div>`); |
||||
|
} else { |
||||
|
_push(ssrRenderComponent(__nuxt_component_0, { |
||||
|
modelValue: ed.dstLangs, |
||||
|
"onUpdate:modelValue": ($event) => ed.dstLangs = $event, |
||||
|
multiple: "" |
||||
|
}, null, _parent)); |
||||
|
} |
||||
|
_push(`</div></div><div class="grid grid-cols-3 gap-3 mt-3" data-v-c0bab860><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>生效区域</span><select class="select select-bordered select-sm w-full" data-v-c0bab860><option${ssrRenderAttr("value", 0)} data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(ed.region) ? ssrLooseContain(ed.region, 0) : ssrLooseEqual(ed.region, 0)) ? " selected" : ""}>全部区域(兜底)</option><!--[-->`); |
||||
|
ssrRenderList(REGIONS, (r) => { |
||||
|
_push(`<option${ssrRenderAttr("value", r.value)} data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(ed.region) ? ssrLooseContain(ed.region, r.value) : ssrLooseEqual(ed.region, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select></div><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>优先级(越大越先匹配)</span><input${ssrRenderAttr("value", ed.priority)} type="number" class="input input-bordered input-sm w-full" data-v-c0bab860></div><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>规则名(便于识别)</span><input${ssrRenderAttr("value", ed.name)} class="input input-bordered input-sm w-full" placeholder="如 中日韩端到端" data-v-c0bab860></div></div></section><section class="ed-section" data-v-c0bab860><div class="ed-section-title" data-v-c0bab860>命中后使用的 Agent</div><div class="grid grid-cols-2 gap-3" data-v-c0bab860><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>翻译 Agent <i class="req" data-v-c0bab860>*</i></span><select class="select select-bordered select-sm w-full" data-v-c0bab860><option value="" disabled data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(ed.agentId) ? ssrLooseContain(ed.agentId, "") : ssrLooseEqual(ed.agentId, "")) ? " selected" : ""}>${ssrInterpolate(transAgents.value.length ? "请选择 Agent" : "(无可用 Agent,请先去 Agent 配置里创建)")}</option><!--[-->`); |
||||
|
ssrRenderList(agentGroups.value, (g) => { |
||||
|
_push(`<optgroup${ssrRenderAttr("label", g.label)} data-v-c0bab860><!--[-->`); |
||||
|
ssrRenderList(g.items, (a) => { |
||||
|
_push(`<option${ssrRenderAttr("value", a.id)} data-v-c0bab860${ssrIncludeBooleanAttr(Array.isArray(ed.agentId) ? ssrLooseContain(ed.agentId, a.id) : ssrLooseEqual(ed.agentId, a.id)) ? " selected" : ""}>${ssrInterpolate(a.name || a.id)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></optgroup>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select></div><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>备注</span><input${ssrRenderAttr("value", ed.remark)} class="input input-bordered input-sm w-full" placeholder="可留空" data-v-c0bab860></div></div>`); |
||||
|
if (curAgent.value) { |
||||
|
_push(`<div class="agent-preview" data-v-c0bab860><span class="type-badge" style="${ssrRenderStyle(typeStyle(curAgent.value.type))}" data-v-c0bab860>${ssrInterpolate(typeLabel(curAgent.value.type))}</span><span class="text-xs text-slate-500" data-v-c0bab860>${ssrInterpolate(curAgent.value.description || "(无描述)")}</span>`); |
||||
|
if (curAgent.value.support_langs) { |
||||
|
_push(`<span class="text-[11px] text-slate-400" data-v-c0bab860>支持:${ssrInterpolate(curAgent.value.support_langs)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (!curAgent.value.enable) { |
||||
|
_push(`<span class="text-[11px] text-amber-600" data-v-c0bab860>⚠ 该 Agent 当前为停用状态</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (langWarn.value) { |
||||
|
_push(`<p class="ed-warn" data-v-c0bab860>⚠ ${ssrInterpolate(langWarn.value)}</p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</section><div class="ed-footer" data-v-c0bab860><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-c0bab860><input${ssrIncludeBooleanAttr(Array.isArray(ed.enable) ? ssrLooseContain(ed.enable, null) : ed.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-c0bab860><span data-v-c0bab860>启用</span><span class="text-xs text-slate-400" data-v-c0bab860>停用的规则不参与选路</span></label><div class="flex gap-2" data-v-c0bab860><button class="btn btn-ghost btn-sm" data-v-c0bab860>取消</button><button class="btn btn-outline btn-sm" data-v-c0bab860>保存并同步…</button><button class="btn btn-primary btn-sm text-white" data-v-c0bab860>保存</button></div></div></div>`); |
||||
|
if (!rules.value.length) { |
||||
|
_push(`<div class="text-center py-20 text-slate-300" data-v-c0bab860><div class="text-5xl mb-3" data-v-c0bab860>🌐</div><p class="text-sm" data-v-c0bab860>当前区域还没有翻译规则</p><p class="text-xs mt-1" data-v-c0bab860>建议先加一条「任意 → 任意」的兜底规则,再往上叠精确规则</p></div>`); |
||||
|
} else { |
||||
|
_push(`<div class="rule-list" data-v-c0bab860><div class="rule-head" data-v-c0bab860><span data-v-c0bab860>优先级</span><span data-v-c0bab860>匹配条件</span><span data-v-c0bab860>Agent</span><span data-v-c0bab860>区域</span><span class="text-right" data-v-c0bab860>操作</span></div><!--[-->`); |
||||
|
ssrRenderList(rules.value, (r, i) => { |
||||
|
_push(`<div class="${ssrRenderClass([{ off: !r.enable }, "rule-row"])}" data-v-c0bab860><div class="prio-cell" data-v-c0bab860><span class="prio" data-v-c0bab860>${ssrInterpolate(r.priority)}</span><span class="order" data-v-c0bab860>#${ssrInterpolate(i + 1)}</span></div><div class="cond-cell" data-v-c0bab860><div class="flex items-center gap-2 flex-wrap" data-v-c0bab860><span class="${ssrRenderClass([{ any: isAny(r.src_langs) }, "lang-badge"])}" data-v-c0bab860>${ssrInterpolate(langsLabel(r.src_langs))}</span><span class="text-slate-400 font-bold" data-v-c0bab860>${ssrInterpolate(r.bidir ? "⇄" : "→")}</span><span class="${ssrRenderClass([{ any: isAny(r.dst_langs) }, "lang-badge"])}" data-v-c0bab860>${ssrInterpolate(langsLabel(r.dst_langs))}</span></div>`); |
||||
|
if (r.name || r.remark) { |
||||
|
_push(`<div class="text-[11px] text-slate-400 mt-1" data-v-c0bab860>${ssrInterpolate(r.name)}`); |
||||
|
if (r.remark) { |
||||
|
_push(`<span data-v-c0bab860> · ${ssrInterpolate(r.remark)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><div class="agent-cell" data-v-c0bab860><span class="type-badge" style="${ssrRenderStyle(typeStyle(agentType(r.agent_id)))}" data-v-c0bab860>${ssrInterpolate(typeLabel(agentType(r.agent_id)))}</span><span class="text-xs text-slate-700" data-v-c0bab860>${ssrInterpolate(agentName(r.agent_id))}</span></div><div class="text-xs text-slate-500" data-v-c0bab860>${ssrInterpolate(r.region === 0 ? "全部区域" : regionLabel(r.region))}</div><div class="text-right" data-v-c0bab860>`); |
||||
|
if (r.enable) { |
||||
|
_push(`<span class="badge badge-success badge-xs mr-2" data-v-c0bab860>启用</span>`); |
||||
|
} else { |
||||
|
_push(`<span class="badge badge-ghost badge-xs mr-2" data-v-c0bab860>停用</span>`); |
||||
|
} |
||||
|
_push(`<button class="btn btn-ghost btn-xs text-error" data-v-c0bab860>删除</button></div></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
} |
||||
|
_push(`<div class="ct-overlay" style="${ssrRenderStyle(testOpen.value ? null : { display: "none" })}" data-v-c0bab860><div class="ct-box" data-v-c0bab860><h3 class="text-base font-semibold text-slate-800 mb-1" data-v-c0bab860>选路试算</h3><p class="text-xs text-slate-400 mb-4" data-v-c0bab860>用后端运行时同一套匹配逻辑,算一遍这个方向实际会走哪条规则。</p><div class="grid grid-cols-2 gap-3" data-v-c0bab860><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>源语言</span>`); |
||||
|
_push(ssrRenderComponent(__nuxt_component_0, { |
||||
|
modelValue: testSrc.value, |
||||
|
"onUpdate:modelValue": ($event) => testSrc.value = $event |
||||
|
}, null, _parent)); |
||||
|
_push(`</div><div data-v-c0bab860><span class="ed-label" data-v-c0bab860>目标语言</span>`); |
||||
|
_push(ssrRenderComponent(__nuxt_component_0, { |
||||
|
modelValue: testDst.value, |
||||
|
"onUpdate:modelValue": ($event) => testDst.value = $event |
||||
|
}, null, _parent)); |
||||
|
_push(`</div></div>`); |
||||
|
if (testResult.value) { |
||||
|
_push(`<div class="${ssrRenderClass([{ miss: !testResult.value.matched }, "test-result"])}" data-v-c0bab860>`); |
||||
|
if (testResult.value.matched) { |
||||
|
_push(`<!--[--><div class="text-sm font-semibold text-slate-800 mb-1" data-v-c0bab860> 命中规则:${ssrInterpolate(testResult.value.rule?.name || "#" + testResult.value.rule?.id)}(优先级 ${ssrInterpolate(testResult.value.rule?.priority)}) </div><div class="text-xs text-slate-600" data-v-c0bab860>${ssrInterpolate(langsLabel(testResult.value.rule?.src_langs))} ${ssrInterpolate(testResult.value.rule?.bidir ? "⇄" : "→")} ${ssrInterpolate(langsLabel(testResult.value.rule?.dst_langs))} · Agent:${ssrInterpolate(testResult.value.agent?.name || testResult.value.rule?.agent_id)} `); |
||||
|
if (testResult.value.agent) { |
||||
|
_push(`<span data-v-c0bab860>(${ssrInterpolate(typeLabel(testResult.value.agent.type))})</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><!--]-->`); |
||||
|
} else { |
||||
|
_push(`<div class="text-sm text-amber-700" data-v-c0bab860>没有任何规则命中 —— 这个方向的通话翻译会不可用,建议补一条兜底规则。</div>`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div class="flex gap-3 justify-end mt-5" data-v-c0bab860><button class="btn btn-ghost" data-v-c0bab860>关闭</button><button class="btn btn-primary text-white" data-v-c0bab860>试算</button></div></div></div><div class="ct-overlay" style="${ssrRenderStyle(syncOpen.value ? null : { display: "none" })}" data-v-c0bab860><div class="ct-box" data-v-c0bab860><h3 class="text-base font-semibold text-slate-800 mb-1" data-v-c0bab860>同步到其他区域</h3><p class="text-xs text-slate-400 mb-3" data-v-c0bab860>${ssrInterpolate(syncDesc.value)}</p><div class="text-xs px-3 py-2 rounded-lg mb-3" style="${ssrRenderStyle({ "background": "#f0fdf4", "border": "1px solid #bbf7d0", "color": "#15803d" })}" data-v-c0bab860> ✦ 同步内容:语言条件、Agent、优先级、启停状态一并复制到目标区域。 </div><div class="flex items-center justify-between mb-1" data-v-c0bab860><span class="text-xs font-semibold text-slate-500" data-v-c0bab860>选择目标区域</span><div class="flex gap-2" data-v-c0bab860><button class="btn btn-ghost btn-xs" data-v-c0bab860>全选</button><button class="btn btn-ghost btn-xs" data-v-c0bab860>清空</button></div></div><div class="sync-region-grid" data-v-c0bab860><!--[-->`); |
||||
|
ssrRenderList(syncRegions.value, (r) => { |
||||
|
_push(`<label class="${ssrRenderClass([{ checked: syncTargets.value.includes(r.value) }, "sync-region-item"])}" data-v-c0bab860><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(syncTargets.value.includes(r.value)) ? " checked" : ""} data-v-c0bab860><span data-v-c0bab860>${ssrInterpolate(r.label)}</span></label>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div><p class="text-[11px] text-slate-400 mb-5" data-v-c0bab860>⚠ 目标区域已有「同 Agent + 同语言条件」的规则则覆盖,否则新建。</p><div class="flex gap-3 justify-end" data-v-c0bab860><button class="btn btn-ghost" data-v-c0bab860>取消</button><button class="btn btn-primary text-white"${ssrIncludeBooleanAttr(!syncTargets.value.length) ? " disabled" : ""} data-v-c0bab860> 保存并同步${ssrInterpolate(syncTargets.value.length ? "(" + syncTargets.value.length + " 个区域)" : "")}</button></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/calltranslate.vue"); |
||||
|
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
||||
|
}; |
||||
|
const calltranslate = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c0bab860"]]); |
||||
|
|
||||
|
export { calltranslate as default }; |
||||
|
//# sourceMappingURL=calltranslate-D-FgQw8P.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"calltranslate-D-FgQw8P.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-D-FgQw8P.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -0,0 +1,8 @@ |
|||||
|
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
|
||||
@ -0,0 +1 @@ |
|||||
|
{"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]} |
||||
@ -1,8 +0,0 @@ |
|||||
const calltranslate_vue_vue_type_style_index_0_scoped_51f11136_lang = ".pair-card[data-v-51f11136]{background:#fff;border:1px solid #eef2f7;border-radius:14px;padding:16px;cursor:pointer;transition:all .15s}.pair-card[data-v-51f11136]:hover{border-color:#c7d2fe;box-shadow:0 4px 14px #6366f114}.lang-badge[data-v-51f11136]{font-size:12px;font-weight:700;padding:3px 10px;border-radius:8px;background:#eef2ff;color:#4338ca}.svc-pill[data-v-51f11136]{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:8px;color:#fff}.mode-badge[data-v-51f11136]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px}.mode-pipeline[data-v-51f11136]{background:#dbeafe;color:#1e40af}.mode-e2e[data-v-51f11136]{background:#fff7ed;color:#c2410c}.editor-panel[data-v-51f11136]{background:#fff;border-radius:16px;border:1px solid #c7d2fe;box-shadow:0 8px 32px #6366f11a;padding:22px;margin-bottom:16px}.mtab[data-v-51f11136]{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:10px;border:2px solid transparent;cursor:pointer;transition:all .15s;flex:1}.mtab.on[data-v-51f11136]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff)}.sync-overlay[data-v-51f11136]{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)}.sync-box[data-v-51f11136]{background:#fff;border-radius:20px;padding:28px;width:520px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-51f11136]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-51f11136]{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-51f11136]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-51f11136]{border-color:#6366f1;background:#eef2ff;color:#4338ca}"; |
|
||||
|
|
||||
const calltranslateStyles_hpAJUqsK = [ |
|
||||
calltranslate_vue_vue_type_style_index_0_scoped_51f11136_lang |
|
||||
]; |
|
||||
|
|
||||
export { calltranslateStyles_hpAJUqsK as default }; |
|
||||
//# sourceMappingURL=calltranslate-styles.hpAJUqsK.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"calltranslate-styles.hpAJUqsK.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-styles-1.mjs-DA2j2DKH.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-styles.hpAJUqsK.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
|
||||
@ -0,0 +1,274 @@ |
|||||
|
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; |
||||
|
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass } from 'vue/server-renderer'; |
||||
|
import { u as useApi } from './useApi-B-E5eLsI.mjs'; |
||||
|
import { u as useToast } from './useToast-CS21XT61.mjs'; |
||||
|
import { _ as _export_sfc, b as useRouter } from './server.mjs'; |
||||
|
import './useLoading-D4zrSa2m.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 _sfc_main = /* @__PURE__ */ defineComponent({ |
||||
|
__name: "channels", |
||||
|
__ssrInlineRender: true, |
||||
|
setup(__props) { |
||||
|
const CHANNELS = { |
||||
|
1: "华为", |
||||
|
2: "小米", |
||||
|
3: "OPPO", |
||||
|
4: "VIVO", |
||||
|
5: "荣耀", |
||||
|
100: "官方包", |
||||
|
101: "App Store", |
||||
|
102: "Google Play" |
||||
|
}; |
||||
|
function channelName(v) { |
||||
|
return CHANNELS[v] ?? "渠道" + v; |
||||
|
} |
||||
|
const CHANNEL_GROUPS = [ |
||||
|
{ label: "中国厂商", icon: "📱", color: "#0369a1", bg: "#dbeafe", channels: [1, 2, 3, 4, 5] }, |
||||
|
{ label: "全球商店", icon: "🌍", color: "#c2410c", bg: "#fff7ed", channels: [101, 102] }, |
||||
|
{ label: "官方渠道", icon: "🏠", color: "#059669", bg: "#dcfce7", channels: [100] } |
||||
|
]; |
||||
|
const STATUS = [ |
||||
|
{ v: 0, label: "草稿(不下发)", color: "#64748b", bg: "#f1f5f9" }, |
||||
|
{ v: 1, label: "已上架", color: "#059669", bg: "#dcfce7" }, |
||||
|
{ v: 2, label: "审核中", color: "#b45309", bg: "#fef9c3" }, |
||||
|
{ v: 3, label: "已下架", color: "#be123c", bg: "#ffe4e6" } |
||||
|
]; |
||||
|
function statusLabel(v) { |
||||
|
return STATUS.find((s) => s.v === v)?.label ?? "未知"; |
||||
|
} |
||||
|
function statusStyle(v) { |
||||
|
const s = STATUS.find((x) => x.v === v); |
||||
|
return s ? { background: s.bg, color: s.color } : {}; |
||||
|
} |
||||
|
const PAY_CHANNELS = [ |
||||
|
{ key: "wxpay", label: "微信支付", module: "wechatpay" }, |
||||
|
{ key: "alipay", label: "支付宝", module: "alipay" }, |
||||
|
{ key: "paypal", label: "PayPal", module: "paypal" }, |
||||
|
{ key: "apple", label: "Apple 内购", module: "appleiap" }, |
||||
|
{ key: "google", label: "Google 内购", module: "googleiap" } |
||||
|
]; |
||||
|
function payLabel(k) { |
||||
|
return PAY_CHANNELS.find((p) => p.key === k)?.label ?? k; |
||||
|
} |
||||
|
useApi(); |
||||
|
useToast(); |
||||
|
useRouter(); |
||||
|
const scopeApp = ref(""); |
||||
|
const scopeApps = ref([]); |
||||
|
const items = ref([]); |
||||
|
const payConfigured = ref([]); |
||||
|
const payChecked_ = ref(false); |
||||
|
const modalOpen = ref(false); |
||||
|
const isEditing = ref(false); |
||||
|
const submitting = ref(false); |
||||
|
function emptyForm() { |
||||
|
return { |
||||
|
row_id: 0, |
||||
|
app_name: "", |
||||
|
channel: 0, |
||||
|
version: "", |
||||
|
min_version: "", |
||||
|
force_update: false, |
||||
|
changelog: "", |
||||
|
address: "", |
||||
|
review_version: "", |
||||
|
status: 1, |
||||
|
description: "", |
||||
|
tourists: false, |
||||
|
allowskipdevicebinding: false, |
||||
|
paychannels: "", |
||||
|
enable: true |
||||
|
}; |
||||
|
} |
||||
|
const form = reactive(emptyForm()); |
||||
|
const groups = computed( |
||||
|
() => CHANNEL_GROUPS.map((g) => ({ |
||||
|
...g, |
||||
|
items: items.value.filter((c) => g.channels.includes(c.channel)).sort((a, b) => a.channel - b.channel), |
||||
|
missing: g.channels.filter((ch) => !items.value.some((c) => c.channel === ch)) |
||||
|
})) |
||||
|
); |
||||
|
function payList(c) { |
||||
|
return (c.paychannels || "").split(",").map((x) => x.trim()).filter(Boolean); |
||||
|
} |
||||
|
function payMissing(key) { |
||||
|
if (!payChecked_.value) return false; |
||||
|
const mod = PAY_CHANNELS.find((p) => p.key === key)?.module; |
||||
|
return !!mod && !payConfigured.value.includes(mod); |
||||
|
} |
||||
|
const payWarnings = computed(() => { |
||||
|
if (!payChecked_.value) return []; |
||||
|
const map = {}; |
||||
|
for (const c of items.value) { |
||||
|
if (!c.enable) continue; |
||||
|
for (const p of payList(c)) { |
||||
|
if (!payMissing(p)) continue; |
||||
|
(map[p] = map[p] || []).push(channelName(c.channel)); |
||||
|
} |
||||
|
} |
||||
|
return Object.keys(map).map((k) => ({ key: k, label: payLabel(k), channels: map[k] })); |
||||
|
}); |
||||
|
const versionWarn = computed(() => { |
||||
|
if (form.force_update && !form.min_version.trim()) return "开启强制更新时必须填「最低支持版本」,否则挡不住任何人"; |
||||
|
if (form.min_version.trim() && form.version.trim() && cmpVer(form.min_version, form.version) > 0) { |
||||
|
return "「最低支持版本」高于「当前线上版本」,会把所有线上用户判定为需强更却无更高版本可更"; |
||||
|
} |
||||
|
return ""; |
||||
|
}); |
||||
|
function cmpVer(a, b) { |
||||
|
const as = a.trim().split("."), bs = b.trim().split("."); |
||||
|
const n = Math.max(as.length, bs.length); |
||||
|
for (let i = 0; i < n; i++) { |
||||
|
const x = parseInt(as[i] ?? "0") || 0; |
||||
|
const y = parseInt(bs[i] ?? "0") || 0; |
||||
|
if (x !== y) return x < y ? -1 : 1; |
||||
|
} |
||||
|
return 0; |
||||
|
} |
||||
|
function payChecked(key) { |
||||
|
return payList(form).includes(key); |
||||
|
} |
||||
|
return (_ctx, _push, _parent, _attrs) => { |
||||
|
_push(`<div${ssrRenderAttrs(_attrs)} data-v-6057a5c9><div class="flex items-center justify-between mb-5 flex-wrap gap-3" data-v-6057a5c9><div data-v-6057a5c9><h2 class="text-lg font-semibold text-slate-800" data-v-6057a5c9>渠道分发</h2><p class="text-xs text-slate-400 mt-1" data-v-6057a5c9> 管理各应用在各分发渠道上的版本、强制更新与能力开关。支付渠道在这里控制「开放哪几种支付入口」,商户凭据在应用的业务功能配置里填。 </p></div><div class="flex items-center gap-3" data-v-6057a5c9><span class="text-sm text-slate-500" data-v-6057a5c9>应用</span><select class="select select-bordered select-sm" data-v-6057a5c9><option value="" data-v-6057a5c9${ssrIncludeBooleanAttr(Array.isArray(scopeApp.value) ? ssrLooseContain(scopeApp.value, "") : ssrLooseEqual(scopeApp.value, "")) ? " selected" : ""}>全局默认(所有应用兜底)</option><!--[-->`); |
||||
|
ssrRenderList(scopeApps.value, (a) => { |
||||
|
_push(`<option${ssrRenderAttr("value", a)} data-v-6057a5c9${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-6057a5c9>+ 添加渠道</button></div></div>`); |
||||
|
if (payWarnings.value.length) { |
||||
|
_push(`<div class="pay-warn" data-v-6057a5c9><div class="flex items-start gap-2" data-v-6057a5c9><span data-v-6057a5c9>⚠</span><div class="flex-1" data-v-6057a5c9><div class="text-sm font-semibold" data-v-6057a5c9>以下支付方式已在渠道里开放,但商户凭据还没配:</div><div class="text-xs mt-1" data-v-6057a5c9><!--[-->`); |
||||
|
ssrRenderList(payWarnings.value, (w) => { |
||||
|
_push(`<span class="warn-pill" data-v-6057a5c9>${ssrInterpolate(w.label)}(${ssrInterpolate(w.channels.join("、"))})</span>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div></div><button class="btn btn-xs btn-ghost" data-v-6057a5c9>去配置 →</button></div></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (!scopeApp.value) { |
||||
|
_push(`<div class="scope-tip" data-v-6057a5c9> 当前是<b data-v-6057a5c9>全局默认</b>作用域:这里配的渠道对所有应用生效,应用自己配了同渠道则以应用的为准。 </div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--[-->`); |
||||
|
ssrRenderList(groups.value, (g) => { |
||||
|
_push(`<div class="mb-6" data-v-6057a5c9><div class="flex items-center gap-2 mb-3" data-v-6057a5c9><span class="group-tag" style="${ssrRenderStyle({ background: g.bg, color: g.color })}" data-v-6057a5c9>${ssrInterpolate(g.icon)} ${ssrInterpolate(g.label)}</span><span class="text-xs text-slate-400" data-v-6057a5c9>${ssrInterpolate(g.items.length)} / ${ssrInterpolate(g.channels.length)} 已配置</span></div><div class="ch-grid" data-v-6057a5c9><!--[-->`); |
||||
|
ssrRenderList(g.items, (c) => { |
||||
|
_push(`<div class="${ssrRenderClass([{ off: !c.enable }, "ch-card"])}" data-v-6057a5c9><div class="flex items-start justify-between gap-2" data-v-6057a5c9><div class="min-w-0" data-v-6057a5c9><div class="font-semibold text-sm text-slate-800" data-v-6057a5c9>${ssrInterpolate(channelName(c.channel))}</div><div class="text-[11px] text-slate-400 mt-0.5" data-v-6057a5c9>渠道号 ${ssrInterpolate(c.channel)}</div></div><span class="status-badge" style="${ssrRenderStyle(statusStyle(c.status))}" data-v-6057a5c9>${ssrInterpolate(statusLabel(c.status))}</span></div><div class="ver-row" data-v-6057a5c9><div class="ver-box" data-v-6057a5c9><span class="ver-label" data-v-6057a5c9>线上版本</span><span class="ver-val" data-v-6057a5c9>${ssrInterpolate(c.version || "—")}</span></div><div class="ver-box" data-v-6057a5c9><span class="ver-label" data-v-6057a5c9>最低支持</span><span class="${ssrRenderClass([{ warn: c.force_update }, "ver-val"])}" data-v-6057a5c9>${ssrInterpolate(c.min_version || "—")}</span></div>`); |
||||
|
if (c.review_version) { |
||||
|
_push(`<div class="ver-box" data-v-6057a5c9><span class="ver-label" data-v-6057a5c9>审核中</span><span class="ver-val review" data-v-6057a5c9>${ssrInterpolate(c.review_version)}</span></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><div class="flex flex-wrap items-center gap-1.5 mt-2" data-v-6057a5c9>`); |
||||
|
if (c.force_update) { |
||||
|
_push(`<span class="flag flag-warn" data-v-6057a5c9>强制更新</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (c.tourists) { |
||||
|
_push(`<span class="flag" data-v-6057a5c9>游客登录</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (c.allowskipdevicebinding) { |
||||
|
_push(`<span class="flag" data-v-6057a5c9>可跳过绑定</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (!c.enable) { |
||||
|
_push(`<span class="flag flag-off" data-v-6057a5c9>已停用</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
if (payList(c).length) { |
||||
|
_push(`<div class="flex flex-wrap items-center gap-1.5 mt-2" data-v-6057a5c9><!--[-->`); |
||||
|
ssrRenderList(payList(c), (p) => { |
||||
|
_push(`<span class="${ssrRenderClass([{ missing: payMissing(p) }, "pay-pill"])}"${ssrRenderAttr("title", payMissing(p) ? "该支付方式的商户凭据尚未配置" : "")} data-v-6057a5c9>${ssrInterpolate(payLabel(p))}${ssrInterpolate(payMissing(p) ? " ⚠" : "")}</span>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (c.address) { |
||||
|
_push(`<div class="text-[11px] text-slate-400 mt-2 truncate" data-v-6057a5c9>${ssrInterpolate(c.address)}</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
}); |
||||
|
_push(`<!--]--><!--[-->`); |
||||
|
ssrRenderList(g.missing, (ch) => { |
||||
|
_push(`<div class="ch-card ch-empty" data-v-6057a5c9><div class="text-sm text-slate-400" data-v-6057a5c9>${ssrInterpolate(channelName(ch))}</div><div class="text-[11px] text-slate-300 mt-1" data-v-6057a5c9>未配置 · 点击添加</div></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--><div class="ch-overlay" style="${ssrRenderStyle(modalOpen.value ? null : { display: "none" })}" data-v-6057a5c9><div class="ch-box" data-v-6057a5c9><div class="flex items-center justify-between mb-4" data-v-6057a5c9><div class="flex items-center gap-3" data-v-6057a5c9><h3 class="text-base font-semibold text-slate-800" data-v-6057a5c9>${ssrInterpolate(isEditing.value ? "编辑渠道" : "添加渠道")}</h3><span class="scope-chip" data-v-6057a5c9>${ssrInterpolate(scopeApp.value || "全局默认")}</span></div><button class="btn btn-ghost btn-xs" data-v-6057a5c9>✕ 关闭</button></div><section class="ed-section" data-v-6057a5c9><div class="ed-section-title" data-v-6057a5c9>渠道</div><div class="grid grid-cols-2 gap-3" data-v-6057a5c9><div data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>分发渠道 <i class="req" data-v-6057a5c9>*</i></span><select${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} class="select select-bordered select-sm w-full" data-v-6057a5c9><option${ssrRenderAttr("value", 0)} disabled data-v-6057a5c9${ssrIncludeBooleanAttr(Array.isArray(form.channel) ? ssrLooseContain(form.channel, 0) : ssrLooseEqual(form.channel, 0)) ? " selected" : ""}>请选择渠道</option><!--[-->`); |
||||
|
ssrRenderList(CHANNEL_GROUPS, (g) => { |
||||
|
_push(`<optgroup${ssrRenderAttr("label", g.label)} data-v-6057a5c9><!--[-->`); |
||||
|
ssrRenderList(g.channels, (ch) => { |
||||
|
_push(`<option${ssrRenderAttr("value", ch)} data-v-6057a5c9${ssrIncludeBooleanAttr(Array.isArray(form.channel) ? ssrLooseContain(form.channel, ch) : ssrLooseEqual(form.channel, ch)) ? " selected" : ""}>${ssrInterpolate(channelName(ch))}(${ssrInterpolate(ch)})</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></optgroup>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select></div><div data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>上架状态</span><select class="select select-bordered select-sm w-full" data-v-6057a5c9><!--[-->`); |
||||
|
ssrRenderList(STATUS, (s) => { |
||||
|
_push(`<option${ssrRenderAttr("value", s.v)} data-v-6057a5c9${ssrIncludeBooleanAttr(Array.isArray(form.status) ? ssrLooseContain(form.status, s.v) : ssrLooseEqual(form.status, s.v)) ? " selected" : ""}>${ssrInterpolate(s.label)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select></div></div><div class="mt-3" data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>描述</span><input${ssrRenderAttr("value", form.description)} class="input input-bordered input-sm w-full" placeholder="这个渠道包的说明" data-v-6057a5c9></div></section><section class="ed-section" data-v-6057a5c9><div class="ed-section-title" data-v-6057a5c9>版本</div><div class="grid grid-cols-3 gap-3" data-v-6057a5c9><div data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>当前线上版本</span><input${ssrRenderAttr("value", form.version)} class="input input-bordered input-sm w-full" placeholder="如 1.4.2" data-v-6057a5c9></div><div data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>最低支持版本</span><input${ssrRenderAttr("value", form.min_version)} class="input input-bordered input-sm w-full" placeholder="低于它的客户端需更新" data-v-6057a5c9></div><div data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>审核中版本</span><input${ssrRenderAttr("value", form.review_version)} class="input input-bordered input-sm w-full" placeholder="过审后清空" data-v-6057a5c9></div></div><label class="flex items-center gap-2 text-sm cursor-pointer mt-3" data-v-6057a5c9><input${ssrIncludeBooleanAttr(Array.isArray(form.force_update) ? ssrLooseContain(form.force_update, null) : form.force_update) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-6057a5c9><span data-v-6057a5c9>强制更新</span><span class="text-xs text-slate-400" data-v-6057a5c9>低于「最低支持版本」的客户端必须更新才能继续使用</span></label>`); |
||||
|
if (versionWarn.value) { |
||||
|
_push(`<p class="ed-warn" data-v-6057a5c9>⚠ ${ssrInterpolate(versionWarn.value)}</p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div class="mt-3" data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>下载地址</span><input${ssrRenderAttr("value", form.address)} class="input input-bordered input-sm w-full" placeholder="应用商店链接或 apk 直链" data-v-6057a5c9></div><div class="mt-3" data-v-6057a5c9><span class="ed-label" data-v-6057a5c9>更新日志</span><textarea class="textarea textarea-bordered w-full text-xs" rows="3" placeholder="本次更新内容,会下发给客户端展示" data-v-6057a5c9>${ssrInterpolate(form.changelog)}</textarea></div></section><section class="ed-section" data-v-6057a5c9><div class="ed-section-title" data-v-6057a5c9>能力开关</div><div class="flex flex-col gap-2" data-v-6057a5c9><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-6057a5c9><input${ssrIncludeBooleanAttr(Array.isArray(form.tourists) ? ssrLooseContain(form.tourists, null) : form.tourists) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-6057a5c9><span data-v-6057a5c9>允许游客登录</span></label><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-6057a5c9><input${ssrIncludeBooleanAttr(Array.isArray(form.allowskipdevicebinding) ? ssrLooseContain(form.allowskipdevicebinding, null) : form.allowskipdevicebinding) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-6057a5c9><span data-v-6057a5c9>允许跳过设备绑定</span></label></div></section><section class="ed-section" data-v-6057a5c9><div class="ed-section-title" data-v-6057a5c9>支付渠道</div><div class="pay-grid" data-v-6057a5c9><!--[-->`); |
||||
|
ssrRenderList(PAY_CHANNELS, (p) => { |
||||
|
_push(`<label class="${ssrRenderClass([{ checked: payChecked(p.key) }, "pay-item"])}" data-v-6057a5c9><input type="checkbox" class="checkbox checkbox-xs checkbox-primary"${ssrIncludeBooleanAttr(payChecked(p.key)) ? " checked" : ""} data-v-6057a5c9><span data-v-6057a5c9>${ssrInterpolate(p.label)}</span>`); |
||||
|
if (payChecked(p.key) && payMissing(p.key)) { |
||||
|
_push(`<span class="pay-miss" data-v-6057a5c9>未配凭据</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</label>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div><p class="ed-tip" data-v-6057a5c9> 这里只决定「这个渠道开放哪几种支付入口」;商户号、密钥等凭据在 `); |
||||
|
if (scopeApp.value) { |
||||
|
_push(`<a class="link" data-v-6057a5c9>应用「${ssrInterpolate(scopeApp.value)}」→ 业务功能配置 → 支付</a>`); |
||||
|
} else { |
||||
|
_push(`<span data-v-6057a5c9>各应用的「业务功能配置 → 支付」</span>`); |
||||
|
} |
||||
|
_push(` 里填。 </p></section><div class="ed-footer" data-v-6057a5c9><label class="flex items-center gap-2 text-sm cursor-pointer" data-v-6057a5c9><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="checkbox checkbox-sm checkbox-primary" data-v-6057a5c9><span data-v-6057a5c9>启用</span><span class="text-xs text-slate-400" data-v-6057a5c9>停用后该渠道配置不下发客户端</span></label><div class="flex gap-2" data-v-6057a5c9>`); |
||||
|
if (isEditing.value) { |
||||
|
_push(`<button class="btn btn-ghost btn-sm text-error mr-auto" data-v-6057a5c9>删除</button>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<button class="btn btn-ghost btn-sm" data-v-6057a5c9>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-6057a5c9>保存</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/channels.vue"); |
||||
|
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
||||
|
}; |
||||
|
const channels = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-6057a5c9"]]); |
||||
|
|
||||
|
export { channels as default }; |
||||
|
//# sourceMappingURL=channels-CRuax8yi.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"channels-CRuax8yi.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/channels-CRuax8yi.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -0,0 +1,8 @@ |
|||||
|
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
|
||||
@ -0,0 +1 @@ |
|||||
|
{"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]} |
||||
File diff suppressed because one or more lines are too long
@ -1,124 +0,0 @@ |
|||||
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; |
|
||||
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrInterpolate, ssrRenderClass } from 'vue/server-renderer'; |
|
||||
import { u as useApi } from './useApi-B-E5eLsI.mjs'; |
|
||||
import { u as useToast } from './useToast-CS21XT61.mjs'; |
|
||||
import './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'; |
|
||||
import './useLoading-D4zrSa2m.mjs'; |
|
||||
|
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({ |
|
||||
__name: "mcpconfig", |
|
||||
__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: "印度" } |
|
||||
]; |
|
||||
function regionLabel(v) { |
|
||||
const n = Number(v) || 0; |
|
||||
const r = REGIONS.find((x) => x.value === n); |
|
||||
if (r) return r.label; |
|
||||
return n === 0 ? "通用" : "区域" + n; |
|
||||
} |
|
||||
const TYPE_LABELS = { 0: "HTTP", 1: "SSE" }; |
|
||||
function typeLabel(t) { |
|
||||
const n = Number(t) || 0; |
|
||||
return TYPE_LABELS[n] || String(t ?? "HTTP"); |
|
||||
} |
|
||||
useApi(); |
|
||||
useToast(); |
|
||||
const view = ref("list"); |
|
||||
const servers = ref([]); |
|
||||
const loading = ref(false); |
|
||||
const submitting = ref(false); |
|
||||
const isEditing = ref(false); |
|
||||
const regionFilter = ref(1); |
|
||||
const kwFilter = ref(""); |
|
||||
const form = reactive({ |
|
||||
id: "", |
|
||||
name: "", |
|
||||
region: 1, |
|
||||
type: 0, |
|
||||
url: "", |
|
||||
tools: "", |
|
||||
description: "", |
|
||||
enable: true |
|
||||
}); |
|
||||
const filteredRows = computed(() => { |
|
||||
const kw = kwFilter.value.trim().toLowerCase(); |
|
||||
if (!kw) return servers.value; |
|
||||
return servers.value.filter((s) => ((s.id || "") + (s.name || "")).toLowerCase().includes(kw)); |
|
||||
}); |
|
||||
return (_ctx, _push, _parent, _attrs) => { |
|
||||
_push(`<div${ssrRenderAttrs(_attrs)}><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}"><div class="flex items-center justify-between mb-5"><div><h2 class="text-lg font-semibold text-slate-800">MCP 配置</h2><p class="text-xs text-slate-400 mt-1">MCP(模型上下文协议)服务器,按区域分组,所有应用共享。修改后各服务约 10 分钟内自动同步。</p></div><button class="btn btn-primary btn-sm text-white">+ 新增 MCP 服务</button></div><div class="flex items-center gap-3 mb-4"><span class="text-sm text-slate-500">区域筛选</span><select class="select select-bordered select-sm"><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(regionFilter.value) ? ssrLooseContain(regionFilter.value, 0) : ssrLooseEqual(regionFilter.value, 0)) ? " selected" : ""}>全部区域</option><!--[-->`); |
|
||||
ssrRenderList(REGIONS, (r) => { |
|
||||
_push(`<option${ssrRenderAttr("value", r.value)}${ssrIncludeBooleanAttr(Array.isArray(regionFilter.value) ? ssrLooseContain(regionFilter.value, r.value) : ssrLooseEqual(regionFilter.value, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select><input${ssrRenderAttr("value", kwFilter.value)} class="input input-bordered input-sm w-48" placeholder="按ID/名称搜索"></div><div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="overflow-x-auto"><table class="table table-zebra"><thead><tr><th>服务ID</th><th>名称</th><th>区域</th><th>类型</th><th>地址</th><th>工具</th><th>状态</th><th class="text-right">操作</th></tr></thead><tbody>`); |
|
||||
if (loading.value) { |
|
||||
_push(`<tr><td colspan="8" class="text-center py-8"><span class="loading loading-spinner loading-sm"></span></td></tr>`); |
|
||||
} else if (!filteredRows.value.length) { |
|
||||
_push(`<tr><td colspan="8" class="text-center text-slate-400 py-8">暂无 MCP 服务</td></tr>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<!--[-->`); |
|
||||
ssrRenderList(filteredRows.value, (s) => { |
|
||||
_push(`<tr><td class="font-mono text-sm font-medium">${ssrInterpolate(s.id || "")}</td><td class="text-sm">${ssrInterpolate(s.name || "")}</td><td><span class="badge badge-ghost badge-sm">${ssrInterpolate(regionLabel(s.region))}</span></td><td><span class="badge badge-sm badge-outline">${ssrInterpolate(typeLabel(s.type))}</span></td><td class="text-sm text-slate-500 max-w-xs truncate"${ssrRenderAttr("title", s.url || "")}>${ssrInterpolate(s.url || "")}</td><td class="text-sm text-slate-400">`); |
|
||||
if (s.tools && s.tools.trim()) { |
|
||||
_push(`<span>${ssrInterpolate(s.tools)}</span>`); |
|
||||
} else { |
|
||||
_push(`<span class="text-slate-300">全部</span>`); |
|
||||
} |
|
||||
_push(`</td><td>`); |
|
||||
if (s.enable) { |
|
||||
_push(`<span class="badge badge-success badge-sm text-white">启用</span>`); |
|
||||
} else { |
|
||||
_push(`<span class="badge badge-ghost badge-sm">停用</span>`); |
|
||||
} |
|
||||
_push(`</td><td class="text-right"><div class="inline-flex gap-1"><button class="btn btn-ghost btn-xs">编辑</button><button class="btn btn-ghost btn-xs text-red-500">删除</button></div></td></tr>`); |
|
||||
}); |
|
||||
_push(`<!--]--></tbody></table></div></div></div><div style="${ssrRenderStyle(view.value === "form" ? null : { display: "none" })}"><div class="flex items-center gap-3 mb-5"><button class="btn btn-ghost btn-sm">← 返回列表</button><h2 class="text-lg font-semibold text-slate-800">${ssrInterpolate(isEditing.value ? "编辑 MCP 服务" : "新增 MCP 服务")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl"><form><div class="grid grid-cols-2 gap-4"><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">服务ID *</span></label><input${ssrRenderAttr("value", form.id)} type="text" class="${ssrRenderClass([{ "bg-slate-100": isEditing.value }, "input input-bordered w-full"])}"${ssrIncludeBooleanAttr(isEditing.value) ? " readonly" : ""} required placeholder="如 gaode_map"><span class="text-xs text-slate-400 mt-1">${ssrInterpolate(isEditing.value ? "编辑模式下不可修改" : "唯一标识,创建后不可修改")}</span></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">名称</span></label><input${ssrRenderAttr("value", form.name)} type="text" class="input input-bordered w-full"></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">区域 *</span></label><select class="select select-bordered w-full"><!--[-->`); |
|
||||
ssrRenderList(REGIONS, (r) => { |
|
||||
_push(`<option${ssrRenderAttr("value", r.value)}${ssrIncludeBooleanAttr(Array.isArray(form.region) ? ssrLooseContain(form.region, r.value) : ssrLooseEqual(form.region, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">类型</span></label><select class="select select-bordered w-full"><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(form.type) ? ssrLooseContain(form.type, 0) : ssrLooseEqual(form.type, 0)) ? " selected" : ""}>HTTP</option><option${ssrRenderAttr("value", 1)}${ssrIncludeBooleanAttr(Array.isArray(form.type) ? ssrLooseContain(form.type, 1) : ssrLooseEqual(form.type, 1)) ? " selected" : ""}>SSE</option></select></div></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">服务地址 (url)</span></label><input${ssrRenderAttr("value", form.url)} type="text" class="input input-bordered w-full font-mono text-sm" placeholder="https://..."></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">启用工具 (tools)</span></label><input${ssrRenderAttr("value", form.tools)} type="text" class="input input-bordered w-full" placeholder="逗号分隔,留空表示全部启用"></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">描述</span></label><input${ssrRenderAttr("value", form.description)} type="text" class="input input-bordered w-full"></div><div class="form-control mb-6"><label class="label cursor-pointer justify-start gap-3"><input${ssrIncludeBooleanAttr(Array.isArray(form.enable) ? ssrLooseContain(form.enable, null) : form.enable) ? " checked" : ""} type="checkbox" class="toggle toggle-primary"><span class="label-text font-medium">启用该服务</span></label></div><div class="flex gap-3"><button type="button" class="btn btn-ghost">取消</button><button type="submit" class="btn btn-primary text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""}>保存</button></div></form></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/mcpconfig.vue"); |
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
|
||||
}; |
|
||||
|
|
||||
export { _sfc_main as default }; |
|
||||
//# sourceMappingURL=mcpconfig-CcWVtnKl.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"mcpconfig-CcWVtnKl.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/mcpconfig-CcWVtnKl.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1,21 @@ |
|||||
|
import { defineComponent, mergeProps, useSSRContext } from 'vue'; |
||||
|
import { ssrRenderAttrs } from 'vue/server-renderer'; |
||||
|
|
||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({ |
||||
|
__name: "mcpconfig", |
||||
|
__ssrInlineRender: true, |
||||
|
setup(__props) { |
||||
|
return (_ctx, _push, _parent, _attrs) => { |
||||
|
_push(`<div${ssrRenderAttrs(mergeProps({ class: "py-16 text-center text-slate-400" }, _attrs))}><span class="loading loading-spinner loading-sm"></span><p class="text-sm mt-3">MCP 配置已并入「第三方服务配置」,正在跳转…</p></div>`); |
||||
|
}; |
||||
|
} |
||||
|
}); |
||||
|
const _sfc_setup = _sfc_main.setup; |
||||
|
_sfc_main.setup = (props, ctx) => { |
||||
|
const ssrContext = useSSRContext(); |
||||
|
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/mcpconfig.vue"); |
||||
|
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
||||
|
}; |
||||
|
|
||||
|
export { _sfc_main as default }; |
||||
|
//# sourceMappingURL=mcpconfig-O3oMJUPy.mjs.map
|
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue