333 changed files with 1828 additions and 1362 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@ |
|||||
import{C as l,z as d}from"./CTAruH_8.js";import{u as h}from"./D9HxoMhB.js";async function c(n,a,i){const e=l(),u=d(),s={"Content-Type":"application/json"};e.token&&(s.Authorization=e.token),i&&Object.assign(s,i);const t=await fetch(n,{method:"POST",headers:s,body:JSON.stringify(a)});if(!t.ok)throw new Error(`HTTP error: ${t.status}`);const o=await t.json();if(o.code===18)throw e.logout(),u.push("/"),new Error(o.msg||"Unauthorized");if(o.code!==0)throw new Error(o.msg||"Unknown error");return o.data}const w=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function y(n){return!w.test(n)}function k(){const n=l(),{begin:a,end:i}=h();async function e(t,o){const r={};if(n.currentAppId&&(r["X-App-Id"]=String(n.currentAppId)),!y(t))return c(`/web/api/api_${t}`,o??{},r);a();try{return await c(`/web/api/api_${t}`,o??{},r)}finally{i()}}async function u(t,o){return c(`/console/api/${t}`,o??{})}async function s(t,o){const r=await e("getcostoken",{path:o}),p=r.upload_url||r.url||"",f=await fetch(p,{method:"PUT",headers:{"Content-Type":t.type||"application/octet-stream"},body:t});if(!f.ok)throw new Error(`Upload failed: ${f.status}`);return p.split("?")[0]}return{webApi:e,consoleApi:u,uploadFile:s}}export{k 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
@ -1 +1 @@ |
|||||
import{_ as t,o,c as s,L as c}from"./CTAruH_8.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,L as c}from"./CfpW9SkI.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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,4 +1,4 @@ |
|||||
import{g as z,j as G,K as P,c as a,a as e,d as u,k as x,p as U,F as f,r as B,m as Y,q as Z,t as n,s as i,A as E,o,n as F,l as A,_ as J}from"./CTAruH_8.js";import{u as Q}from"./9B2ftqmN.js";import{u as W}from"./lLLegusN.js";import"./D9HxoMhB.js";import"./yUUyh6cG.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=z({__name:"statlog",setup(Ct){const{webApi:I}=Q(),{success:O,error:R}=W(),j={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?j[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 M(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 I("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function K(){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 z,j as G,K as P,c as a,a as e,d as u,k as x,p as U,F as f,r as B,m as Y,q as Z,t as n,s as i,A as E,o,n as F,l as A,_ as J}from"./CfpW9SkI.js";import{u as Q}from"./DSu8q42f.js";import{u as W}from"./CMwGY1Mu.js";import"./DL330dAC.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=z({__name:"statlog",setup(Ct){const{webApi:I}=Q(),{success:O,error:R}=W(),j={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?j[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 M(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 I("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function K(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗?
|
||||
|
|
||||
只清除本核对面板的记录,不影响已落库的统计数据。 |
只清除本核对面板的记录,不影响已落库的统计数据。 |
||||
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await I("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function q(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return G(()=>{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,B(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[U,v.value,void 0,{number:!0}]]),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),[[U,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:q},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:K},"清空本日")])]),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},B(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",M(t.level).cls])},n(M(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?A("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",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)):A("",!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)):A("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Nt=J(kt,[["__scopeId","data-v-742ee359"]]);export{Nt as default};
|
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await I("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function q(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return G(()=>{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,B(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[U,v.value,void 0,{number:!0}]]),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),[[U,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:q},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:K},"清空本日")])]),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},B(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",M(t.level).cls])},n(M(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?A("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",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)):A("",!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)):A("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=J(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default};
|
||||
@ -0,0 +1 @@ |
|||||
|
import{a as u}from"./DL330dAC.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
@ -1 +1 @@ |
|||||
import{_ as o,o as s,c as a,a as t,t as r}from"./CTAruH_8.js";import{u as i}from"./DpWhlKu2.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"./CfpW9SkI.js";import{u as i}from"./tlYhbUA5.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
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 +0,0 @@ |
|||||
import{u}from"./yUUyh6cG.js";import{A as e}from"./CTAruH_8.js";function r(){const n=u("app:loading",()=>0),o=e(()=>n.value>0);function a(){n.value++}function t(){n.value=Math.max(0,n.value-1)}return{count:n,loading:o,begin:a,end:t}}export{r as u}; |
|
||||
@ -1 +1 @@ |
|||||
import{g as h,C as x,z as w,j as y,c as r,a as e,t as d,l as b,D as _,k as v,m as g,n as k,x as M,s as u,o as p,_ as z}from"./CTAruH_8.js";const A={class:"login-bg flex items-center justify-center px-4"},B={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=M({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function 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",B,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(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=z(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default}; |
import{g as h,C as x,z as w,j as y,c as r,a as e,t as d,l as b,D as _,k as v,m as g,n as k,x as M,s as u,o as p,_ as z}from"./CfpW9SkI.js";const A={class:"login-bg flex items-center justify-center px-4"},B={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=M({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function 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",B,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(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=z(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default}; |
||||
@ -0,0 +1 @@ |
|||||
|
import{e as f,a5 as p,a6 as c,A as r}from"./CfpW9SkI.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
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
import{C as w,z as d}from"./CfpW9SkI.js";import{u as h}from"./DL330dAC.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 k(){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{k 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
@ -1 +0,0 @@ |
|||||
.app-card[data-v-f8779360]{background:#fff;border:1px solid #eef2f7;border-radius:14px;box-shadow:0 1px 2px #00000008;overflow:hidden}.app-card.orphan[data-v-f8779360]{border-color:#fde68a}.app-head[data-v-f8779360]{display:flex;align-items:center;gap:12px;padding:13px 16px;cursor:pointer;background:linear-gradient(90deg,#f5f7ff,#fff);border-left:4px solid #6366f1;transition:background .15s}.app-card.orphan .app-head[data-v-f8779360]{background:linear-gradient(90deg,#fffbeb,#fff);border-left-color:#f59e0b}.app-head[data-v-f8779360]:hover{background:linear-gradient(90deg,#eef2ff,#fff)}.chev[data-v-f8779360]{color:#94a3b8;font-size:12px;width:16px;flex-shrink:0}.app-logo[data-v-f8779360]{width:38px;height:38px;border-radius:10px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;font-weight:700;font-size:17px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.app-logo.orphan-logo[data-v-f8779360]{background:#f59e0b}.app-name[data-v-f8779360]{font-size:15px;font-weight:700;color:#1e293b}.chip-app[data-v-f8779360]{font-size:10px;padding:1px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.chip-app[data-v-f8779360],.chip-dep[data-v-f8779360]{display:inline-flex;font-weight:700}.chip-dep[data-v-f8779360]{font-size:9px;padding:1px 6px;border-radius:5px;background:#ecfeff;color:#0e7490}.chip-mono[data-v-f8779360]{color:#475569;font-family:SF Mono,Menlo,monospace}.chip-count[data-v-f8779360],.chip-mono[data-v-f8779360]{display:inline-flex;font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px;background:#f1f5f9}.chip-count[data-v-f8779360]{color:#64748b}.app-body[data-v-f8779360]{padding:4px 12px 10px;border-top:1px solid #f1f5f9;background:#fcfcfd}.dep-row td[data-v-f8779360]{vertical-align:middle} |
|
||||
@ -0,0 +1 @@ |
|||||
|
.app-card[data-v-955faaec]{background:#fff;border:1px solid #eef2f7;border-radius:14px;box-shadow:0 1px 2px #00000008;overflow:hidden}.app-card.orphan[data-v-955faaec]{border-color:#fde68a}.app-head[data-v-955faaec]{display:flex;align-items:center;gap:12px;padding:13px 16px;cursor:pointer;background:linear-gradient(90deg,#f5f7ff,#fff);border-left:4px solid #6366f1;transition:background .15s}.app-card.orphan .app-head[data-v-955faaec]{background:linear-gradient(90deg,#fffbeb,#fff);border-left-color:#f59e0b}.app-head[data-v-955faaec]:hover{background:linear-gradient(90deg,#eef2ff,#fff)}.chev[data-v-955faaec]{color:#94a3b8;font-size:12px;width:16px;flex-shrink:0}.app-logo[data-v-955faaec]{width:38px;height:38px;border-radius:10px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;font-weight:700;font-size:17px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.app-logo.orphan-logo[data-v-955faaec]{background:#f59e0b}.app-name[data-v-955faaec]{font-size:15px;font-weight:700;color:#1e293b}.chip-app[data-v-955faaec]{font-size:10px;padding:1px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.chip-app[data-v-955faaec],.chip-dep[data-v-955faaec]{display:inline-flex;font-weight:700}.chip-dep[data-v-955faaec]{font-size:9px;padding:1px 6px;border-radius:5px;background:#ecfeff;color:#0e7490}.chip-mono[data-v-955faaec]{color:#475569;font-family:SF Mono,Menlo,monospace}.chip-count[data-v-955faaec],.chip-mono[data-v-955faaec]{display:inline-flex;font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px;background:#f1f5f9}.chip-count[data-v-955faaec]{color:#64748b}.app-body[data-v-955faaec]{padding:4px 12px 10px;border-top:1px solid #f1f5f9;background:#fcfcfd}.dep-row td[data-v-955faaec]{vertical-align:middle} |
||||
@ -1 +1 @@ |
|||||
{"id":"1539df2f-ed1e-4567-85ef-b3b4ac8648ab","timestamp":1782995062558} |
{"id":"1b101b0e-fb32-40fd-adf2-8e9d1b2f43f3","timestamp":1783406859699} |
||||
@ -1 +0,0 @@ |
|||||
{"id":"1539df2f-ed1e-4567-85ef-b3b4ac8648ab","timestamp":1782995062558,"prerendered":[]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"id":"1b101b0e-fb32-40fd-adf2-8e9d1b2f43f3","timestamp":1783406859699,"prerendered":[]} |
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@ |
|||||
import{u as a}from"./yUUyh6cG.js";let i=0;function f(){const o=a("app:toasts",()=>[]);function e(s,t="info",r=3e3){const u=++i;o.value.push({id:u,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(n=>n.id!==u)},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}; |
|
||||
@ -0,0 +1 @@ |
|||||
|
.cat-item[data-v-af95cc3b]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:11px;border:1px solid #eef2f7;background:#fff;cursor:pointer;transition:all .15s}.cat-item[data-v-af95cc3b]:hover{border-color:#c7d2fe;background:#f5f3ff}.cat-item.active[data-v-af95cc3b]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff);box-shadow:0 4px 12px #6366f11f}.cat-icon[data-v-af95cc3b]{width:32px;height:32px;border-radius:9px;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.dot-on[data-v-af95cc3b]{width:7px;height:7px;border-radius:50%;background:#10b981;box-shadow:0 0 0 3px #10b98126;flex-shrink:0}.provider-card[data-v-af95cc3b]{padding:12px 14px;border-radius:13px;border:1.5px solid #eef2f7;background:#fff;cursor:pointer;transition:all .15s}.provider-card[data-v-af95cc3b]:hover{border-color:#c7d2fe}.provider-card.active[data-v-af95cc3b]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#faf5ff);box-shadow:0 4px 14px #6366f11f}.provider-card.is-default[data-v-af95cc3b]{box-shadow:inset 0 0 0 1.5px #10b981}.provider-logo[data-v-af95cc3b]{width:34px;height:34px;border-radius:9px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:800;font-size:12px;letter-spacing:-.02em}.default-badge[data-v-af95cc3b]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;background:#dcfce7;color:#15803d}.default-pick[data-v-af95cc3b]{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;color:#94a3b8;cursor:pointer;padding:3px 8px;border-radius:7px;border:1px solid #eef2f7;transition:all .15s}.default-pick[data-v-af95cc3b]:hover{border-color:#c7d2fe;color:#6366f1}.default-pick.on[data-v-af95cc3b]{color:#15803d;background:#dcfce7;border-color:#bbf7d0}.lock-tag[data-v-af95cc3b]{font-size:10px;font-weight:600;color:#dc2626;background:#fef2f2;padding:1px 6px;border-radius:5px}.rule-box[data-v-af95cc3b]{background:#f8fafc;border:1px solid #eef2f7;border-radius:11px;padding:10px 14px} |
||||
@ -1 +0,0 @@ |
|||||
.cat-item[data-v-96602b99]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:11px;border:1px solid #eef2f7;background:#fff;cursor:pointer;transition:all .15s}.cat-item[data-v-96602b99]:hover{border-color:#c7d2fe;background:#f5f3ff}.cat-item.active[data-v-96602b99]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff);box-shadow:0 4px 12px #6366f11f}.cat-icon[data-v-96602b99]{width:32px;height:32px;border-radius:9px;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.dot-on[data-v-96602b99]{width:7px;height:7px;border-radius:50%;background:#10b981;box-shadow:0 0 0 3px #10b98126;flex-shrink:0}.provider-card[data-v-96602b99]{padding:12px 14px;border-radius:13px;border:1.5px solid #eef2f7;background:#fff;cursor:pointer;transition:all .15s}.provider-card[data-v-96602b99]:hover{border-color:#c7d2fe}.provider-card.active[data-v-96602b99]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#faf5ff);box-shadow:0 4px 14px #6366f11f}.provider-card.is-default[data-v-96602b99]{box-shadow:inset 0 0 0 1.5px #10b981}.provider-logo[data-v-96602b99]{width:34px;height:34px;border-radius:9px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:800;font-size:12px;letter-spacing:-.02em}.default-badge[data-v-96602b99]{font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;background:#dcfce7;color:#15803d}.default-pick[data-v-96602b99]{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;color:#94a3b8;cursor:pointer;padding:3px 8px;border-radius:7px;border:1px solid #eef2f7;transition:all .15s}.default-pick[data-v-96602b99]:hover{border-color:#c7d2fe;color:#6366f1}.default-pick.on[data-v-96602b99]{color:#15803d;background:#dcfce7;border-color:#bbf7d0}.lock-tag[data-v-96602b99]{font-size:10px;font-weight:600;color:#dc2626;background:#fef2f2;padding:1px 6px;border-radius:5px}.rule-box[data-v-96602b99]{background:#f8fafc;border:1px solid #eef2f7;border-radius:11px;padding:10px 14px} |
|
||||
@ -1 +1 @@ |
|||||
import{u as a,e as s,h as u,i as r,f as h}from"./CTAruH_8.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"./CfpW9SkI.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}; |
||||
@ -1 +1 @@ |
|||||
import{_ as s}from"./CnkSDgVO.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./CTAruH_8.js";import{u as f}from"./DpWhlKu2.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"./R6fio73R.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./CfpW9SkI.js";import{u as f}from"./tlYhbUA5.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 +0,0 @@ |
|||||
import{e as f,a5 as p,a6 as r}from"./CTAruH_8.js";const y="$s";function l(...e){const a=typeof e[e.length-1]=="string"?e.pop():void 0;typeof e[0]!="string"&&e.unshift(a);const[n,t]=e;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(t!==void 0&&typeof t!="function")throw new Error("[nuxt] [useState] init must be a function: "+t);const i=y+n,s=f(),u=p(s.payload.state,i);if(t&&(s._state[i]??={_default:t}),u.value===void 0&&t){const o=t();if(r(o))return s.payload.state[i]=o,o;u.value=o}return u}export{l as u}; |
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"accounts-BlBS367g.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/accounts-BlBS367g.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"accounts-DMzzARF9.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/accounts-DMzzARF9.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"appconfig-DgyZbLy-.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/appconfig-DgyZbLy-.js"],"names":["useRoute"],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"appconfig-b7qb0UVr.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/appconfig-b7qb0UVr.js"],"names":["useRoute"],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -1,273 +0,0 @@ |
|||||
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; |
|
||||
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrRenderClass, ssrInterpolate, ssrIncludeBooleanAttr, ssrRenderAttr, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer'; |
|
||||
import { u as useApi } from './useApi-B6h53Mkt.mjs'; |
|
||||
import { u as useToast } from './useToast-C76a6bSX.mjs'; |
|
||||
import { u as useAuthStore } from './auth-QFkCoU1C.mjs'; |
|
||||
import { _ as _export_sfc, b as useRouter } from './server.mjs'; |
|
||||
import './useLoading-D6mc40Wj.mjs'; |
|
||||
import './state-DQnwRar-.mjs'; |
|
||||
import 'pinia'; |
|
||||
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 'perfect-debounce'; |
|
||||
|
|
||||
const ORPHAN_KEY = "__orphan__"; |
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({ |
|
||||
__name: "apps", |
|
||||
__ssrInlineRender: true, |
|
||||
setup(__props) { |
|
||||
useApi(); |
|
||||
useToast(); |
|
||||
useAuthStore(); |
|
||||
useRouter(); |
|
||||
const view = ref("list"); |
|
||||
const products = ref([]); |
|
||||
const apps2 = ref([]); |
|
||||
const envs = ref([]); |
|
||||
const loading = ref(false); |
|
||||
const envSavingId = ref(0); |
|
||||
const expanded = reactive({}); |
|
||||
const regionOptions = ["中国", "美国", "东亚", "东南亚", "南亚", "中东", "欧洲", "俄罗斯", "非洲", "南美", "北美", "大洋洲", "巴西", "印度"]; |
|
||||
const groups = computed(() => { |
|
||||
const byName = /* @__PURE__ */ new Map(); |
|
||||
for (const d of apps2.value) { |
|
||||
const name = d.app_name || ""; |
|
||||
if (!byName.has(name)) byName.set(name, []); |
|
||||
byName.get(name).push(d); |
|
||||
} |
|
||||
const known = new Set(products.value.map((p) => p.name)); |
|
||||
const res = products.value.map((p) => ({ key: p.name, product: p, deployments: byName.get(p.name) || [] })); |
|
||||
const orphan = []; |
|
||||
for (const [name, ds] of byName) { |
|
||||
if (name === "" || !known.has(name)) orphan.push(...ds); |
|
||||
} |
|
||||
if (orphan.length) res.push({ key: ORPHAN_KEY, product: null, deployments: orphan }); |
|
||||
return res; |
|
||||
}); |
|
||||
function isExpanded(key) { |
|
||||
return expanded[key] !== false; |
|
||||
} |
|
||||
function dbName(dsn) { |
|
||||
const m = (dsn || "").match(/\/([^/?]+)\?/); |
|
||||
return m ? m[1] : "-"; |
|
||||
} |
|
||||
const pIsEditing = ref(false); |
|
||||
const pForm = reactive({ id: 0, name: "", image_name: "", remark: "", enabled: true }); |
|
||||
const dIsEditing = ref(false); |
|
||||
const dMode = ref("existing"); |
|
||||
const dForm = reactive({ id: 0, app_name: "", name: "", region: "", env_id: 0, base_url: "", service_dsn: "", deploy_dir: "", image_name: "", image_tag: "", remark: "", enabled: true }); |
|
||||
const availableRegions = computed(() => { |
|
||||
const used = new Set( |
|
||||
apps2.value.filter((d) => d.app_name === dForm.app_name && d.id !== dForm.id).map((d) => d.region).filter(Boolean) |
|
||||
); |
|
||||
return regionOptions.filter((r) => !used.has(r)); |
|
||||
}); |
|
||||
const testPassed = ref(false); |
|
||||
const testing = ref(false); |
|
||||
const testResult = reactive({ show: false, apiOk: false, apiMsg: "", dbOk: false, dbMsg: "" }); |
|
||||
ref(null); |
|
||||
const az = reactive({ |
|
||||
appId: 0, |
|
||||
appLabel: "", |
|
||||
start: "", |
|
||||
end: "", |
|
||||
resultShow: false, |
|
||||
resultClass: "", |
|
||||
mode: "", |
|
||||
steps: [], |
|
||||
curIndex: 0, |
|
||||
curTotal: 0, |
|
||||
curName: "", |
|
||||
pct: 0, |
|
||||
errMsg: "", |
|
||||
report: null, |
|
||||
running: false, |
|
||||
btnText: "开始分析" |
|
||||
}); |
|
||||
ref(null); |
|
||||
ref(null); |
|
||||
const up = reactive({ |
|
||||
id: 0, |
|
||||
label: "", |
|
||||
envName: "", |
|
||||
deployDir: "", |
|
||||
tag: "", |
|
||||
log: "", |
|
||||
show: false, |
|
||||
running: false, |
|
||||
ok: false, |
|
||||
canRun: false, |
|
||||
btnText: "开始升级" |
|
||||
}); |
|
||||
return (_ctx, _push, _parent, _attrs) => { |
|
||||
_push(`<div${ssrRenderAttrs(_attrs)} data-v-f8779360><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}" data-v-f8779360><div class="flex items-center justify-between mb-5" data-v-f8779360><div data-v-f8779360><h2 class="text-lg font-semibold text-slate-800" data-v-f8779360>应用管理</h2><p class="text-sm text-slate-400 mt-1" data-v-f8779360><span class="chip-app" data-v-f8779360>应用</span> 是一个产品(如 Voitrans);其下挂多条 <span class="chip-dep" data-v-f8779360>部署</span>(各区域一份)。 卡片 = 应用;卡片内表格 = 该应用的区域部署。 </p></div><button class="btn btn-primary btn-sm text-white" data-v-f8779360>+ 添加应用</button></div>`); |
|
||||
if (loading.value) { |
|
||||
_push(`<div class="bg-white rounded-xl border border-slate-100 py-14 text-center" data-v-f8779360><span class="loading loading-spinner loading-sm" data-v-f8779360></span></div>`); |
|
||||
} else if (!groups.value.length) { |
|
||||
_push(`<div class="bg-white rounded-xl border border-slate-100 py-14 text-center text-slate-400" data-v-f8779360>暂无应用,先「添加应用」</div>`); |
|
||||
} else { |
|
||||
_push(`<div class="space-y-4" data-v-f8779360><!--[-->`); |
|
||||
ssrRenderList(groups.value, (g) => { |
|
||||
_push(`<div class="${ssrRenderClass([{ orphan: !g.product }, "app-card"])}" data-v-f8779360><div class="app-head" data-v-f8779360><button class="chev" data-v-f8779360>${ssrInterpolate(isExpanded(g.key) ? "▾" : "▸")}</button><div class="${ssrRenderClass([{ "orphan-logo": !g.product }, "app-logo"])}" data-v-f8779360>${ssrInterpolate(g.product ? (g.product.name || "?").charAt(0).toUpperCase() : "?")}</div><div class="min-w-0 flex-1" data-v-f8779360><div class="flex items-center gap-2 flex-wrap" data-v-f8779360><span class="chip-app" data-v-f8779360>应用</span><span class="app-name" data-v-f8779360>${ssrInterpolate(g.product ? g.product.name : "未分组部署")}</span>`); |
|
||||
if (g.product) { |
|
||||
_push(`<span class="${ssrRenderClass([g.product.enabled ? "badge-success" : "badge-ghost", "badge badge-xs"])}" data-v-f8779360>${ssrInterpolate(g.product.enabled ? "启用" : "停用")}</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
if (g.product && g.product.image_name) { |
|
||||
_push(`<span class="chip-mono" data-v-f8779360>🐳 ${ssrInterpolate(g.product.image_name)}</span>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<span class="chip-count" data-v-f8779360>${ssrInterpolate(g.deployments.length)} 个部署</span></div><p class="text-xs text-slate-400 mt-0.5 truncate" data-v-f8779360>${ssrInterpolate(g.product ? g.product.remark || "—" : "未填所属应用名、或应用已删除的历史部署;编辑部署可归位到某个应用")}</p></div>`); |
|
||||
if (g.product) { |
|
||||
_push(`<div class="flex gap-1 shrink-0" data-v-f8779360><button class="btn btn-primary btn-xs text-white" data-v-f8779360>+ 部署</button><button class="btn btn-ghost btn-xs" data-v-f8779360>编辑应用</button><button class="btn btn-ghost btn-xs text-red-500" data-v-f8779360>删除</button></div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div><div class="app-body" style="${ssrRenderStyle(isExpanded(g.key) ? null : { display: "none" })}" data-v-f8779360>`); |
|
||||
if (!g.deployments.length) { |
|
||||
_push(`<div class="text-center text-slate-300 py-5 text-xs" data-v-f8779360> 该应用暂无部署`); |
|
||||
if (g.product) { |
|
||||
_push(`<!--[-->,点右上「+ 部署」添加<!--]-->`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div>`); |
|
||||
} else { |
|
||||
_push(`<div class="overflow-x-auto" data-v-f8779360><table class="table table-sm text-sm" data-v-f8779360><thead data-v-f8779360><tr class="text-slate-400" data-v-f8779360><th data-v-f8779360>部署</th><th data-v-f8779360>区域</th><th data-v-f8779360>环境</th><th data-v-f8779360>状态</th><th data-v-f8779360>业务库</th><th data-v-f8779360>启用</th><th class="text-right" data-v-f8779360>操作</th></tr></thead><tbody data-v-f8779360><!--[-->`); |
|
||||
ssrRenderList(g.deployments, (a) => { |
|
||||
_push(`<tr class="dep-row hover" data-v-f8779360><td data-v-f8779360><span class="chip-dep" data-v-f8779360>部署</span><span class="font-medium text-slate-700 ml-1" data-v-f8779360>${ssrInterpolate(a.name || "部署#" + a.id)}</span><span class="text-xs text-slate-400 ml-1 font-mono" data-v-f8779360>#${ssrInterpolate(a.id)}</span></td><td data-v-f8779360>${ssrInterpolate(a.region || "—")}</td><td data-v-f8779360><select class="select select-bordered select-xs w-36 text-xs"${ssrIncludeBooleanAttr(envSavingId.value === a.id) ? " disabled" : ""} data-v-f8779360><option${ssrRenderAttr("value", 0)} data-v-f8779360${ssrIncludeBooleanAttr(Array.isArray(a.env_id) ? ssrLooseContain(a.env_id, 0) : ssrLooseEqual(a.env_id, 0)) ? " selected" : ""}>未绑定</option><!--[-->`); |
|
||||
ssrRenderList(envs.value, (e) => { |
|
||||
_push(`<option${ssrRenderAttr("value", e.id)} data-v-f8779360${ssrIncludeBooleanAttr(Array.isArray(a.env_id) ? ssrLooseContain(a.env_id, e.id) : ssrLooseEqual(a.env_id, e.id)) ? " selected" : ""}>${ssrInterpolate(e.name)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></td><td data-v-f8779360>`); |
|
||||
if (a.status === "pending") { |
|
||||
_push(`<span class="badge badge-warning badge-sm text-amber-900" data-v-f8779360>待部署</span>`); |
|
||||
} else { |
|
||||
_push(`<span class="badge badge-success badge-sm text-white" data-v-f8779360>已接入</span>`); |
|
||||
} |
|
||||
_push(`</td><td class="font-mono text-xs" data-v-f8779360>${ssrInterpolate(dbName(a.service_dsn))}</td><td data-v-f8779360>`); |
|
||||
if (a.enabled) { |
|
||||
_push(`<span class="text-green-600" data-v-f8779360>是</span>`); |
|
||||
} else { |
|
||||
_push(`<span class="text-slate-400" data-v-f8779360>否</span>`); |
|
||||
} |
|
||||
_push(`</td><td class="text-right" data-v-f8779360><div class="flex gap-1 justify-end" data-v-f8779360>`); |
|
||||
if (a.status !== "pending") { |
|
||||
_push(`<!--[--><button class="btn btn-ghost btn-xs text-indigo-600" data-v-f8779360>服务配置</button><button class="btn btn-ghost btn-xs text-slate-500" data-v-f8779360>编辑</button><button class="btn btn-ghost btn-xs text-amber-600" data-v-f8779360>升级</button><button class="btn btn-ghost btn-xs text-emerald-600" data-v-f8779360>分析</button><button class="btn btn-ghost btn-xs text-indigo-500" data-v-f8779360>发事件</button><!--]-->`); |
|
||||
} else { |
|
||||
_push(`<button class="btn btn-ghost btn-xs text-amber-600" data-v-f8779360>编辑</button>`); |
|
||||
} |
|
||||
_push(`<button class="btn btn-ghost btn-xs text-red-500" data-v-f8779360>删除</button></div></td></tr>`); |
|
||||
}); |
|
||||
_push(`<!--]--></tbody></table></div>`); |
|
||||
} |
|
||||
_push(`</div></div>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div>`); |
|
||||
} |
|
||||
_push(`</div><div style="${ssrRenderStyle(view.value === "productForm" ? null : { display: "none" })}" data-v-f8779360><div class="flex items-center gap-3 mb-5" data-v-f8779360><button class="btn btn-ghost btn-sm" data-v-f8779360>← 返回</button><h2 class="text-lg font-semibold text-slate-800" data-v-f8779360>${ssrInterpolate(pIsEditing.value ? "编辑应用" : "添加应用")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-xl" data-v-f8779360><form data-v-f8779360><div class="form-control" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>应用名 *</span></label><input${ssrRenderAttr("value", pForm.name)} type="text" class="input input-bordered w-full" required placeholder="如 Voitrans" data-v-f8779360><span class="text-xs text-slate-400 mt-1" data-v-f8779360>账号作用域按应用名绑定,尽量与统计/账号里一致。</span></div><div class="form-control mt-4" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>默认镜像名</span></label><input${ssrRenderAttr("value", pForm.image_name)} type="text" class="input input-bordered w-full" placeholder="voitrans-a11(部署时用,可留空)" data-v-f8779360></div><div class="form-control mt-4" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>备注</span></label><input${ssrRenderAttr("value", pForm.remark)} type="text" class="input input-bordered w-full" data-v-f8779360></div><div class="flex items-center gap-2 mt-4" data-v-f8779360><label class="flex items-center gap-2 cursor-pointer" data-v-f8779360><input${ssrIncludeBooleanAttr(Array.isArray(pForm.enabled) ? ssrLooseContain(pForm.enabled, null) : pForm.enabled) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-f8779360><span class="text-sm" data-v-f8779360>启用</span></label></div><div class="flex gap-3 mt-6" data-v-f8779360><button type="button" class="btn btn-ghost" data-v-f8779360>取消</button><button type="submit" class="btn btn-primary text-white" data-v-f8779360>保存</button></div></form></div></div><div style="${ssrRenderStyle(view.value === "deployForm" ? null : { display: "none" })}" data-v-f8779360><div class="flex items-center gap-3 mb-5" data-v-f8779360><button class="btn btn-ghost btn-sm" data-v-f8779360>← 返回</button><h2 class="text-lg font-semibold text-slate-800" data-v-f8779360>${ssrInterpolate(dIsEditing.value ? "编辑部署" : "添加部署")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-3xl" data-v-f8779360><form data-v-f8779360>`); |
|
||||
if (!dIsEditing.value) { |
|
||||
_push(`<div class="tabs tabs-boxed bg-slate-100 w-fit mb-5" data-v-f8779360><a class="${ssrRenderClass([dMode.value === "existing" ? "tab-active" : "", "tab"])}" data-v-f8779360>添加现有</a><a class="${ssrRenderClass([dMode.value === "deploy" ? "tab-active" : "", "tab"])}" data-v-f8779360>部署到目标环境</a></div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<p class="${ssrRenderClass([dIsEditing.value ? "" : "-mt-3", "text-xs text-slate-400 mb-4"])}" data-v-f8779360>`); |
|
||||
if (dIsEditing.value) { |
|
||||
_push(`<!--[-->编辑该区域部署的配置(镜像 Tag / 部署目录 / 环境节点 等);改好后回列表点「升级」执行远程部署(拉新镜像并重启)。<!--]-->`); |
|
||||
} else if (dMode.value === "existing") { |
|
||||
_push(`<!--[-->把「已经部署好的应用区域」加进来:填地址与业务库 DSN,测试通过后保存。<!--]-->`); |
|
||||
} else { |
|
||||
_push(`<!--[-->选一个「部署目标环境」,先建关联并标记<b data-v-f8779360>待部署</b>;保存后回列表点「升级」执行远程部署。<!--]-->`); |
|
||||
} |
|
||||
_push(`</p><div class="grid grid-cols-2 gap-4" data-v-f8779360><div class="form-control" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>所属应用</span></label><input${ssrRenderAttr("value", dForm.app_name)} type="text" class="input input-bordered w-full bg-slate-100" readonly data-v-f8779360></div><div class="form-control" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>部署名称 *</span></label><input${ssrRenderAttr("value", dForm.name)} type="text" class="input input-bordered w-full" required placeholder="如 Voitrans(国内)" data-v-f8779360></div></div><div class="grid grid-cols-2 gap-4 mt-4" data-v-f8779360><div class="form-control" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>区域</span></label><select class="select select-bordered w-full" data-v-f8779360><option value="" data-v-f8779360${ssrIncludeBooleanAttr(Array.isArray(dForm.region) ? ssrLooseContain(dForm.region, "") : ssrLooseEqual(dForm.region, "")) ? " selected" : ""}>未指定</option><!--[-->`); |
|
||||
ssrRenderList(availableRegions.value, (r) => { |
|
||||
_push(`<option${ssrRenderAttr("value", r)} data-v-f8779360${ssrIncludeBooleanAttr(Array.isArray(dForm.region) ? ssrLooseContain(dForm.region, r) : ssrLooseEqual(dForm.region, r)) ? " selected" : ""}>${ssrInterpolate(r)}</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select><span class="text-xs text-slate-400 mt-1" data-v-f8779360>已部署的区域不再出现(一个应用每区域一份部署)。</span></div><div class="form-control" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>部署环境${ssrInterpolate(dMode.value === "deploy" ? " *" : "")}</span></label><select class="select select-bordered w-full" data-v-f8779360><option${ssrRenderAttr("value", 0)} data-v-f8779360${ssrIncludeBooleanAttr(Array.isArray(dForm.env_id) ? ssrLooseContain(dForm.env_id, 0) : ssrLooseEqual(dForm.env_id, 0)) ? " selected" : ""}>${ssrInterpolate(dMode.value === "deploy" ? "请选择目标环境" : "未关联")}</option><!--[-->`); |
|
||||
ssrRenderList(envs.value, (e) => { |
|
||||
_push(`<option${ssrRenderAttr("value", e.id)} data-v-f8779360${ssrIncludeBooleanAttr(Array.isArray(dForm.env_id) ? ssrLooseContain(dForm.env_id, e.id) : ssrLooseEqual(dForm.env_id, e.id)) ? " selected" : ""}>${ssrInterpolate(e.name)}(${ssrInterpolate(e.code || "-")})</option>`); |
|
||||
}); |
|
||||
_push(`<!--]--></select></div></div><div class="grid grid-cols-3 gap-4 mt-4" data-v-f8779360><div class="form-control" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>部署目录</span></label><input${ssrRenderAttr("value", dForm.deploy_dir)} type="text" class="input input-bordered w-full font-mono text-xs" placeholder="/home/work/voitrans-a11" data-v-f8779360></div><div class="form-control" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>镜像名</span></label><input${ssrRenderAttr("value", dForm.image_name)} type="text" class="input input-bordered w-full" placeholder="voitrans-a11(默认取应用)" data-v-f8779360></div><div class="form-control" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>镜像 Tag</span></label><input${ssrRenderAttr("value", dForm.image_tag)} type="text" class="input input-bordered w-full" placeholder="0.1.1 / latest" data-v-f8779360></div></div><div class="form-control mt-4" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>业务库 DSN${ssrInterpolate(dMode.value === "existing" ? " *" : "")}</span></label><input${ssrRenderAttr("value", dForm.service_dsn)} type="text" class="input input-bordered w-full font-mono text-xs" placeholder="root:pwd@tcp(host:3306)/earphone?charset=utf8mb4&parseTime=True&loc=Local" data-v-f8779360><span class="text-xs text-slate-400 mt-1" data-v-f8779360>用于读取业务数据(重置设备码时清 userdevice/product_stat)</span></div>`); |
|
||||
if (dMode.value === "existing") { |
|
||||
_push(`<!--[--><div class="form-control mt-4" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>应用地址 *</span></label><input${ssrRenderAttr("value", dForm.base_url)} type="text" class="input input-bordered w-full" placeholder="https://api.xxx.com/" data-v-f8779360><span class="text-xs text-slate-400 mt-1" data-v-f8779360>用于通知应用业务服务事件(如配置更新)</span></div><div class="mt-4 text-sm" style="${ssrRenderStyle(testResult.show ? null : { display: "none" })}" data-v-f8779360><div class="${ssrRenderClass(testResult.apiOk ? "text-green-700" : "text-red-600")}" data-v-f8779360><span class="${ssrRenderClass(testResult.apiOk ? "text-green-600" : "text-red-500")}" data-v-f8779360>${ssrInterpolate(testResult.apiOk ? "✓" : "✗")}</span> 应用地址:${ssrInterpolate(testResult.apiMsg)}</div><div class="${ssrRenderClass(testResult.dbOk ? "text-green-700" : "text-red-600")}" data-v-f8779360><span class="${ssrRenderClass(testResult.dbOk ? "text-green-600" : "text-red-500")}" data-v-f8779360>${ssrInterpolate(testResult.dbOk ? "✓" : "✗")}</span> 业务库:${ssrInterpolate(testResult.dbMsg)}</div></div><!--]-->`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<div class="form-control mt-4" data-v-f8779360><label class="label" data-v-f8779360><span class="label-text font-medium" data-v-f8779360>备注</span></label><input${ssrRenderAttr("value", dForm.remark)} type="text" class="input input-bordered w-full" data-v-f8779360></div><div class="flex items-center gap-2 mt-4" data-v-f8779360><label class="flex items-center gap-2 cursor-pointer" data-v-f8779360><input${ssrIncludeBooleanAttr(Array.isArray(dForm.enabled) ? ssrLooseContain(dForm.enabled, null) : dForm.enabled) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-f8779360><span class="text-sm" data-v-f8779360>启用</span></label></div><div class="flex gap-3 mt-6" data-v-f8779360><button type="button" class="btn btn-ghost" data-v-f8779360>取消</button>`); |
|
||||
if (dMode.value === "existing") { |
|
||||
_push(`<button type="button" class="btn btn-outline"${ssrIncludeBooleanAttr(testing.value) ? " disabled" : ""} data-v-f8779360>${ssrInterpolate(testing.value ? "测试中..." : "测试连接")}</button>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`<button type="submit" class="btn btn-primary text-white"${ssrIncludeBooleanAttr(!dIsEditing.value && dMode.value === "existing" && !testPassed.value) ? " disabled" : ""} data-v-f8779360>保存</button></div>`); |
|
||||
if (!dIsEditing.value && dMode.value === "existing") { |
|
||||
_push(`<p class="text-xs text-slate-400 mt-2" data-v-f8779360>需先「测试连接」通过(应用地址可达 + 业务库可连)才能保存。</p>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</form></div></div><dialog class="modal" data-v-f8779360><div class="modal-box" data-v-f8779360><h3 class="font-bold text-lg" data-v-f8779360>分析历史数据</h3><p class="text-sm text-slate-500 mt-1" data-v-f8779360>${ssrInterpolate(az.appLabel)}</p><div class="text-xs text-amber-700 mt-3 bg-amber-50 border border-amber-100 rounded-lg p-3 leading-relaxed" data-v-f8779360> 扫描该应用业务库,按 <b data-v-f8779360>天 + 产品 + 区域</b> 生成历史统计(新增用户 / 订单 / 资源发放·使用 / 激活绑定设备),汇入 console 主库。<br data-v-f8779360> · <b data-v-f8779360>分析前会先清理该应用+区域在所选区间内的旧统计行</b>,避免数据重叠。<br data-v-f8779360> · 登录、活跃用户、AI对话等无每日原始记录,历史无法还原(由实时管道往后采集)。<br data-v-f8779360> · 仅对实时管道上线前的区间运行。留空 = 全部历史。大库可能耗时。 </div><div class="grid grid-cols-2 gap-3 mt-4" data-v-f8779360><div data-v-f8779360><label class="text-xs text-slate-500" data-v-f8779360>起始日(含)</label><input${ssrRenderAttr("value", az.start)} type="date" class="input input-bordered input-sm w-full" data-v-f8779360></div><div data-v-f8779360><label class="text-xs text-slate-500" data-v-f8779360>结束日(含)</label><input${ssrRenderAttr("value", az.end)} type="date" class="input input-bordered input-sm w-full" data-v-f8779360></div></div><div class="${ssrRenderClass([az.resultClass, "text-sm mt-3"])}" style="${ssrRenderStyle(az.resultShow ? null : { display: "none" })}" data-v-f8779360>`); |
|
||||
if (az.mode === "progress") { |
|
||||
_push(`<div class="bg-slate-50 border border-slate-200 rounded-lg p-3" data-v-f8779360><div class="flex justify-between items-center text-xs mb-1.5" data-v-f8779360><span class="text-slate-600" data-v-f8779360>`); |
|
||||
if (az.curName) { |
|
||||
_push(`<!--[--><span class="loading loading-spinner loading-xs" data-v-f8779360></span> 正在:${ssrInterpolate(az.curName)} (${ssrInterpolate(az.curIndex)}/${ssrInterpolate(az.curTotal)}) <!--]-->`); |
|
||||
} else { |
|
||||
_push(`<!--[-->准备中...<!--]-->`); |
|
||||
} |
|
||||
_push(`</span><span class="font-mono text-slate-400" data-v-f8779360>${ssrInterpolate(az.pct)}%</span></div><progress class="progress progress-primary w-full h-2"${ssrRenderAttr("value", az.pct)} max="100" data-v-f8779360></progress><div class="mt-2 text-xs space-y-0.5" data-v-f8779360><!--[-->`); |
|
||||
ssrRenderList(az.steps, (nm, i) => { |
|
||||
_push(`<div class="${ssrRenderClass(i === az.curIndex - 1 ? "text-slate-600" : "text-green-600")}" data-v-f8779360>`); |
|
||||
if (i === az.curIndex - 1) { |
|
||||
_push(`<!--[--><span class="loading loading-spinner loading-xs" data-v-f8779360></span> ${ssrInterpolate(nm)}<!--]-->`); |
|
||||
} else { |
|
||||
_push(`<!--[-->✓ ${ssrInterpolate(nm)}<!--]-->`); |
|
||||
} |
|
||||
_push(`</div>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div></div>`); |
|
||||
} else if (az.mode === "error") { |
|
||||
_push(`<div class="text-red-600" data-v-f8779360>✗ ${ssrInterpolate(az.errMsg)}</div>`); |
|
||||
} else if (az.mode === "done" && az.report) { |
|
||||
_push(`<div class="bg-green-50 border border-green-100 rounded-lg p-3" data-v-f8779360><div class="font-semibold text-green-700 mb-2" data-v-f8779360>✓ 分析完成</div><div class="grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-slate-600 mb-2" data-v-f8779360><div data-v-f8779360>应用:<b data-v-f8779360>${ssrInterpolate(az.report.app_name || "")}</b></div><div data-v-f8779360>区域:${ssrInterpolate(az.report.region || "未指定")}</div><div data-v-f8779360>区间:${ssrInterpolate((az.report.start_day || "不限") + " ~ " + (az.report.end_day || "不限"))}</div><div data-v-f8779360>清理旧行:${ssrInterpolate(az.report.cleared_rows || 0)}</div><div data-v-f8779360>写入天数:<b data-v-f8779360>${ssrInterpolate(az.report.days_written || 0)}</b></div><div data-v-f8779360>写入行数:${ssrInterpolate(az.report.rows_written || 0)}</div></div><div class="border-t border-green-100 pt-2 text-xs" data-v-f8779360><!--[-->`); |
|
||||
ssrRenderList(az.report.steps || [], (s, i) => { |
|
||||
_push(`<div class="flex justify-between py-0.5" data-v-f8779360><span class="text-slate-500" data-v-f8779360>${ssrInterpolate(s.name)}</span><span class="font-mono text-slate-700" data-v-f8779360>${ssrInterpolate((s.groups || 0) + " 组")}</span></div>`); |
|
||||
}); |
|
||||
_push(`<!--]--></div></div>`); |
|
||||
} else { |
|
||||
_push(`<!---->`); |
|
||||
} |
|
||||
_push(`</div><div class="modal-action" data-v-f8779360><button class="btn btn-ghost btn-sm" data-v-f8779360>关闭</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(az.running) ? " disabled" : ""} data-v-f8779360>${ssrInterpolate(az.btnText)}</button></div></div><form method="dialog" class="modal-backdrop" data-v-f8779360><button data-v-f8779360>close</button></form></dialog><dialog class="modal" data-v-f8779360><div class="modal-box max-w-2xl" data-v-f8779360><h3 class="font-bold text-lg" data-v-f8779360>升级部署</h3><p class="text-sm text-slate-500 mt-1" data-v-f8779360>${ssrInterpolate(up.label)}</p><div class="text-xs text-amber-700 mt-3 bg-amber-50 border border-amber-100 rounded-lg p-3 leading-relaxed" data-v-f8779360> 将 <b data-v-f8779360>SSH 连接到该部署绑定的环境节点</b>,进入部署目录执行:<span class="font-mono" data-v-f8779360>docker login → compose pull → up -d 重启 → 清理旧镜像</span>。<br data-v-f8779360> · 需服务器上已维护好 <span class="font-mono" data-v-f8779360>docker-compose.yml / .env / confs</span>(本操作不上传真实配置)。<br data-v-f8779360> · 会<b data-v-f8779360>重启该部署的容器</b>,请确认无误后再执行。 </div><div class="grid grid-cols-1 gap-2 mt-4 text-xs" data-v-f8779360><div class="flex" data-v-f8779360><span class="w-20 text-slate-400 shrink-0" data-v-f8779360>环境节点</span><span class="${ssrRenderClass(up.envName ? "font-medium text-slate-700" : "font-medium text-red-500")}" data-v-f8779360>${ssrInterpolate(up.envName || "未绑定 —— 请先在「编辑」里选择环境节点")}</span></div><div class="flex" data-v-f8779360><span class="w-20 text-slate-400 shrink-0" data-v-f8779360>部署目录</span><span class="${ssrRenderClass(up.deployDir ? "font-mono text-slate-700" : "font-medium text-red-500")}" data-v-f8779360>${ssrInterpolate(up.deployDir || "未填 —— 请先在「编辑」里填写远端部署目录")}</span></div></div><div class="mt-3" data-v-f8779360><label class="text-xs text-slate-500" data-v-f8779360>镜像 Tag(留空 = latest)</label><input${ssrRenderAttr("value", up.tag)} type="text" class="input input-bordered input-sm w-full font-mono" placeholder="latest"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-f8779360></div><div class="mt-3" style="${ssrRenderStyle(up.show ? null : { display: "none" })}" data-v-f8779360><div class="flex items-center gap-2 text-xs mb-1" data-v-f8779360>`); |
|
||||
if (up.running) { |
|
||||
_push(`<span class="loading loading-spinner loading-xs text-amber-500" data-v-f8779360></span>`); |
|
||||
} else if (up.ok) { |
|
||||
_push(`<span class="text-green-600 font-semibold" data-v-f8779360>✓ 部署完成</span>`); |
|
||||
} else { |
|
||||
_push(`<span class="text-red-600 font-semibold" data-v-f8779360>✗ 部署失败</span>`); |
|
||||
} |
|
||||
_push(`<span class="text-slate-400" data-v-f8779360>${ssrInterpolate(up.running ? "执行中…" : "")}</span></div><pre class="bg-slate-900 text-slate-100 text-[11px] leading-relaxed rounded-lg p-3 h-64 overflow-auto font-mono whitespace-pre-wrap" data-v-f8779360>${ssrInterpolate(up.log || "(等待输出…)")}</pre></div><div class="modal-action" data-v-f8779360><button class="btn btn-ghost btn-sm"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-f8779360>关闭</button><button class="btn btn-warning btn-sm"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-f8779360>${ssrInterpolate(up.btnText)}</button></div></div><form method="dialog" class="modal-backdrop" data-v-f8779360><button${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-f8779360>close</button></form></dialog></div>`); |
|
||||
}; |
|
||||
} |
|
||||
}); |
|
||||
const _sfc_setup = _sfc_main.setup; |
|
||||
_sfc_main.setup = (props, ctx) => { |
|
||||
const ssrContext = useSSRContext(); |
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/apps.vue"); |
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
|
||||
}; |
|
||||
const apps = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f8779360"]]); |
|
||||
|
|
||||
export { apps as default }; |
|
||||
//# sourceMappingURL=apps-DkgvJNjV.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"apps-DkgvJNjV.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/apps-DkgvJNjV.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1,310 @@ |
|||||
|
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; |
||||
|
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrRenderClass, ssrInterpolate, ssrIncludeBooleanAttr, ssrRenderAttr, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer'; |
||||
|
import { u as useApi } from './useApi-DMQewX5_.mjs'; |
||||
|
import { u as useToast } from './useToast-CS21XT61.mjs'; |
||||
|
import { u as useAuthStore } from './auth-QFkCoU1C.mjs'; |
||||
|
import { _ as _export_sfc, b as useRouter } from './server.mjs'; |
||||
|
import './useLoading-D4zrSa2m.mjs'; |
||||
|
import 'pinia'; |
||||
|
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 'perfect-debounce'; |
||||
|
|
||||
|
const ORPHAN_KEY = "__orphan__"; |
||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({ |
||||
|
__name: "apps", |
||||
|
__ssrInlineRender: true, |
||||
|
setup(__props) { |
||||
|
useApi(); |
||||
|
useToast(); |
||||
|
useAuthStore(); |
||||
|
useRouter(); |
||||
|
const view = ref("list"); |
||||
|
const products = ref([]); |
||||
|
const apps2 = ref([]); |
||||
|
const envs = ref([]); |
||||
|
const loading = ref(false); |
||||
|
const envSavingId = ref(0); |
||||
|
const expanded = reactive({}); |
||||
|
const regionOptions = ["中国", "美国", "东亚", "东南亚", "南亚", "中东", "欧洲", "俄罗斯", "非洲", "南美", "北美", "大洋洲", "巴西", "印度"]; |
||||
|
const groups = computed(() => { |
||||
|
const byName = /* @__PURE__ */ new Map(); |
||||
|
for (const d of apps2.value) { |
||||
|
const name = d.app_name || ""; |
||||
|
if (!byName.has(name)) byName.set(name, []); |
||||
|
byName.get(name).push(d); |
||||
|
} |
||||
|
const known = new Set(products.value.map((p) => p.name)); |
||||
|
const res = products.value.map((p) => ({ key: p.name, product: p, deployments: byName.get(p.name) || [] })); |
||||
|
const orphan = []; |
||||
|
for (const [name, ds] of byName) { |
||||
|
if (name === "" || !known.has(name)) orphan.push(...ds); |
||||
|
} |
||||
|
if (orphan.length) res.push({ key: ORPHAN_KEY, product: null, deployments: orphan }); |
||||
|
return res; |
||||
|
}); |
||||
|
function isExpanded(key) { |
||||
|
return expanded[key] !== false; |
||||
|
} |
||||
|
function dbName(dsn) { |
||||
|
const m = (dsn || "").match(/\/([^/?]+)\?/); |
||||
|
return m ? m[1] : "-"; |
||||
|
} |
||||
|
function isPinnedVer(tag) { |
||||
|
const t = (tag || "").trim(); |
||||
|
return !!t && t !== "latest"; |
||||
|
} |
||||
|
const pIsEditing = ref(false); |
||||
|
const pForm = reactive({ id: 0, name: "", image_name: "", remark: "", enabled: true }); |
||||
|
const dIsEditing = ref(false); |
||||
|
const dMode = ref("existing"); |
||||
|
const dForm = reactive({ id: 0, app_name: "", name: "", region: "", env_id: 0, base_url: "", service_dsn: "", deploy_dir: "", image_name: "", image_tag: "", remark: "", enabled: true }); |
||||
|
const availableRegions = computed(() => { |
||||
|
const used = new Set( |
||||
|
apps2.value.filter((d) => d.app_name === dForm.app_name && d.id !== dForm.id).map((d) => d.region).filter(Boolean) |
||||
|
); |
||||
|
return regionOptions.filter((r) => !used.has(r)); |
||||
|
}); |
||||
|
const testPassed = ref(false); |
||||
|
const testing = ref(false); |
||||
|
const testResult = reactive({ show: false, apiOk: false, apiMsg: "", dbOk: false, dbMsg: "" }); |
||||
|
ref(null); |
||||
|
const az = reactive({ |
||||
|
appId: 0, |
||||
|
appLabel: "", |
||||
|
start: "", |
||||
|
end: "", |
||||
|
resultShow: false, |
||||
|
resultClass: "", |
||||
|
mode: "", |
||||
|
steps: [], |
||||
|
curIndex: 0, |
||||
|
curTotal: 0, |
||||
|
curName: "", |
||||
|
pct: 0, |
||||
|
errMsg: "", |
||||
|
report: null, |
||||
|
running: false, |
||||
|
btnText: "开始分析" |
||||
|
}); |
||||
|
ref(null); |
||||
|
ref(null); |
||||
|
const up = reactive({ |
||||
|
id: 0, |
||||
|
label: "", |
||||
|
envName: "", |
||||
|
deployDir: "", |
||||
|
tag: "", |
||||
|
tags: [], |
||||
|
// 从仓库拉取的可用版本
|
||||
|
tagMode: "list", |
||||
|
tagsLoading: false, |
||||
|
tagsError: "", |
||||
|
log: "", |
||||
|
show: false, |
||||
|
running: false, |
||||
|
ok: false, |
||||
|
canRun: false, |
||||
|
btnText: "开始升级" |
||||
|
}); |
||||
|
return (_ctx, _push, _parent, _attrs) => { |
||||
|
_push(`<div${ssrRenderAttrs(_attrs)} data-v-955faaec><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}" data-v-955faaec><div class="flex items-center justify-between mb-5" data-v-955faaec><div data-v-955faaec><h2 class="text-lg font-semibold text-slate-800" data-v-955faaec>应用管理</h2><p class="text-sm text-slate-400 mt-1" data-v-955faaec><span class="chip-app" data-v-955faaec>应用</span> 是一个产品(如 Voitrans);其下挂多条 <span class="chip-dep" data-v-955faaec>部署</span>(各区域一份)。 卡片 = 应用;卡片内表格 = 该应用的区域部署。 </p></div><button class="btn btn-primary btn-sm text-white" data-v-955faaec>+ 添加应用</button></div>`); |
||||
|
if (loading.value) { |
||||
|
_push(`<div class="bg-white rounded-xl border border-slate-100 py-14 text-center" data-v-955faaec><span class="loading loading-spinner loading-sm" data-v-955faaec></span></div>`); |
||||
|
} else if (!groups.value.length) { |
||||
|
_push(`<div class="bg-white rounded-xl border border-slate-100 py-14 text-center text-slate-400" data-v-955faaec>暂无应用,先「添加应用」</div>`); |
||||
|
} else { |
||||
|
_push(`<div class="space-y-4" data-v-955faaec><!--[-->`); |
||||
|
ssrRenderList(groups.value, (g) => { |
||||
|
_push(`<div class="${ssrRenderClass([{ orphan: !g.product }, "app-card"])}" data-v-955faaec><div class="app-head" data-v-955faaec><button class="chev" data-v-955faaec>${ssrInterpolate(isExpanded(g.key) ? "▾" : "▸")}</button><div class="${ssrRenderClass([{ "orphan-logo": !g.product }, "app-logo"])}" data-v-955faaec>${ssrInterpolate(g.product ? (g.product.name || "?").charAt(0).toUpperCase() : "?")}</div><div class="min-w-0 flex-1" data-v-955faaec><div class="flex items-center gap-2 flex-wrap" data-v-955faaec><span class="chip-app" data-v-955faaec>应用</span><span class="app-name" data-v-955faaec>${ssrInterpolate(g.product ? g.product.name : "未分组部署")}</span>`); |
||||
|
if (g.product) { |
||||
|
_push(`<span class="${ssrRenderClass([g.product.enabled ? "badge-success" : "badge-ghost", "badge badge-xs"])}" data-v-955faaec>${ssrInterpolate(g.product.enabled ? "启用" : "停用")}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (g.product && g.product.image_name) { |
||||
|
_push(`<span class="chip-mono" data-v-955faaec>🐳 ${ssrInterpolate(g.product.image_name)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<span class="chip-count" data-v-955faaec>${ssrInterpolate(g.deployments.length)} 个部署</span></div><p class="text-xs text-slate-400 mt-0.5 truncate" data-v-955faaec>${ssrInterpolate(g.product ? g.product.remark || "—" : "未填所属应用名、或应用已删除的历史部署;编辑部署可归位到某个应用")}</p></div>`); |
||||
|
if (g.product) { |
||||
|
_push(`<div class="flex gap-1 shrink-0" data-v-955faaec><button class="btn btn-primary btn-xs text-white" data-v-955faaec>+ 部署</button><button class="btn btn-ghost btn-xs" data-v-955faaec>编辑应用</button><button class="btn btn-ghost btn-xs text-red-500" data-v-955faaec>删除</button></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><div class="app-body" style="${ssrRenderStyle(isExpanded(g.key) ? null : { display: "none" })}" data-v-955faaec>`); |
||||
|
if (!g.deployments.length) { |
||||
|
_push(`<div class="text-center text-slate-300 py-5 text-xs" data-v-955faaec> 该应用暂无部署`); |
||||
|
if (g.product) { |
||||
|
_push(`<!--[-->,点右上「+ 部署」添加<!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
} else { |
||||
|
_push(`<div class="overflow-x-auto" data-v-955faaec><table class="table table-sm text-sm" data-v-955faaec><thead data-v-955faaec><tr class="text-slate-400" data-v-955faaec><th data-v-955faaec>部署</th><th data-v-955faaec>区域</th><th data-v-955faaec>环境</th><th data-v-955faaec>状态</th><th data-v-955faaec>当前版本</th><th data-v-955faaec>业务库</th><th data-v-955faaec>启用</th><th class="text-right" data-v-955faaec>操作</th></tr></thead><tbody data-v-955faaec><!--[-->`); |
||||
|
ssrRenderList(g.deployments, (a) => { |
||||
|
_push(`<tr class="dep-row hover" data-v-955faaec><td data-v-955faaec><span class="chip-dep" data-v-955faaec>部署</span><span class="font-medium text-slate-700 ml-1" data-v-955faaec>${ssrInterpolate(a.name || "部署#" + a.id)}</span><span class="text-xs text-slate-400 ml-1 font-mono" data-v-955faaec>#${ssrInterpolate(a.id)}</span></td><td data-v-955faaec>${ssrInterpolate(a.region || "—")}</td><td data-v-955faaec><select class="select select-bordered select-xs w-36 text-xs"${ssrIncludeBooleanAttr(envSavingId.value === a.id) ? " disabled" : ""} data-v-955faaec><option${ssrRenderAttr("value", 0)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(a.env_id) ? ssrLooseContain(a.env_id, 0) : ssrLooseEqual(a.env_id, 0)) ? " selected" : ""}>未绑定</option><!--[-->`); |
||||
|
ssrRenderList(envs.value, (e) => { |
||||
|
_push(`<option${ssrRenderAttr("value", e.id)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(a.env_id) ? ssrLooseContain(a.env_id, e.id) : ssrLooseEqual(a.env_id, e.id)) ? " selected" : ""}>${ssrInterpolate(e.name)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select></td><td data-v-955faaec>`); |
||||
|
if (a.status === "pending") { |
||||
|
_push(`<span class="badge badge-warning badge-sm text-amber-900" data-v-955faaec>待部署</span>`); |
||||
|
} else { |
||||
|
_push(`<span class="badge badge-success badge-sm text-white" data-v-955faaec>已接入</span>`); |
||||
|
} |
||||
|
_push(`</td><td data-v-955faaec>`); |
||||
|
if (isPinnedVer(a.image_tag)) { |
||||
|
_push(`<span class="chip-mono text-emerald-700" data-v-955faaec>${ssrInterpolate(a.image_tag)}</span>`); |
||||
|
} else { |
||||
|
_push(`<span class="text-amber-600 text-xs font-mono" title="未固定版本,升级时建议选明确版本号(如 0.1.1)" data-v-955faaec>${ssrInterpolate(a.image_tag || "latest")} ⚠</span>`); |
||||
|
} |
||||
|
_push(`</td><td class="font-mono text-xs" data-v-955faaec>${ssrInterpolate(dbName(a.service_dsn))}</td><td data-v-955faaec>`); |
||||
|
if (a.enabled) { |
||||
|
_push(`<span class="text-green-600" data-v-955faaec>是</span>`); |
||||
|
} else { |
||||
|
_push(`<span class="text-slate-400" data-v-955faaec>否</span>`); |
||||
|
} |
||||
|
_push(`</td><td class="text-right" data-v-955faaec><div class="flex gap-1 justify-end" data-v-955faaec>`); |
||||
|
if (a.status !== "pending") { |
||||
|
_push(`<!--[--><button class="btn btn-ghost btn-xs text-indigo-600" data-v-955faaec>服务配置</button><button class="btn btn-ghost btn-xs text-slate-500" data-v-955faaec>编辑</button><button class="btn btn-ghost btn-xs text-amber-600" data-v-955faaec>升级</button><button class="btn btn-ghost btn-xs text-emerald-600" data-v-955faaec>分析</button><button class="btn btn-ghost btn-xs text-indigo-500" data-v-955faaec>发事件</button><!--]-->`); |
||||
|
} else { |
||||
|
_push(`<button class="btn btn-ghost btn-xs text-amber-600" data-v-955faaec>编辑</button>`); |
||||
|
} |
||||
|
_push(`<button class="btn btn-ghost btn-xs text-red-500" data-v-955faaec>删除</button></div></td></tr>`); |
||||
|
}); |
||||
|
_push(`<!--]--></tbody></table></div>`); |
||||
|
} |
||||
|
_push(`</div></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
} |
||||
|
_push(`</div><div style="${ssrRenderStyle(view.value === "productForm" ? null : { display: "none" })}" data-v-955faaec><div class="flex items-center gap-3 mb-5" data-v-955faaec><button class="btn btn-ghost btn-sm" data-v-955faaec>← 返回</button><h2 class="text-lg font-semibold text-slate-800" data-v-955faaec>${ssrInterpolate(pIsEditing.value ? "编辑应用" : "添加应用")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-xl" data-v-955faaec><form data-v-955faaec><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>应用名 *</span></label><input${ssrRenderAttr("value", pForm.name)} type="text" class="input input-bordered w-full" required placeholder="如 Voitrans" data-v-955faaec><span class="text-xs text-slate-400 mt-1" data-v-955faaec>账号作用域按应用名绑定,尽量与统计/账号里一致。</span></div><div class="form-control mt-4" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>默认镜像名</span></label><input${ssrRenderAttr("value", pForm.image_name)} type="text" class="input input-bordered w-full" placeholder="voitrans-a11(部署时用,可留空)" data-v-955faaec></div><div class="form-control mt-4" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>备注</span></label><input${ssrRenderAttr("value", pForm.remark)} type="text" class="input input-bordered w-full" data-v-955faaec></div><div class="flex items-center gap-2 mt-4" data-v-955faaec><label class="flex items-center gap-2 cursor-pointer" data-v-955faaec><input${ssrIncludeBooleanAttr(Array.isArray(pForm.enabled) ? ssrLooseContain(pForm.enabled, null) : pForm.enabled) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-955faaec><span class="text-sm" data-v-955faaec>启用</span></label></div><div class="flex gap-3 mt-6" data-v-955faaec><button type="button" class="btn btn-ghost" data-v-955faaec>取消</button><button type="submit" class="btn btn-primary text-white" data-v-955faaec>保存</button></div></form></div></div><div style="${ssrRenderStyle(view.value === "deployForm" ? null : { display: "none" })}" data-v-955faaec><div class="flex items-center gap-3 mb-5" data-v-955faaec><button class="btn btn-ghost btn-sm" data-v-955faaec>← 返回</button><h2 class="text-lg font-semibold text-slate-800" data-v-955faaec>${ssrInterpolate(dIsEditing.value ? "编辑部署" : "添加部署")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-3xl" data-v-955faaec><form data-v-955faaec>`); |
||||
|
if (!dIsEditing.value) { |
||||
|
_push(`<div class="tabs tabs-boxed bg-slate-100 w-fit mb-5" data-v-955faaec><a class="${ssrRenderClass([dMode.value === "existing" ? "tab-active" : "", "tab"])}" data-v-955faaec>添加现有</a><a class="${ssrRenderClass([dMode.value === "deploy" ? "tab-active" : "", "tab"])}" data-v-955faaec>部署到目标环境</a></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<p class="${ssrRenderClass([dIsEditing.value ? "" : "-mt-3", "text-xs text-slate-400 mb-4"])}" data-v-955faaec>`); |
||||
|
if (dIsEditing.value) { |
||||
|
_push(`<!--[-->编辑该区域部署的配置(镜像 Tag / 部署目录 / 环境节点 等);改好后回列表点「升级」执行远程部署(拉新镜像并重启)。<!--]-->`); |
||||
|
} else if (dMode.value === "existing") { |
||||
|
_push(`<!--[-->把「已经部署好的应用区域」加进来:填地址与业务库 DSN,测试通过后保存。<!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!--[-->选一个「部署目标环境」,先建关联并标记<b data-v-955faaec>待部署</b>;保存后回列表点「升级」执行远程部署。<!--]-->`); |
||||
|
} |
||||
|
_push(`</p><div class="grid grid-cols-2 gap-4" data-v-955faaec><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>所属应用</span></label><input${ssrRenderAttr("value", dForm.app_name)} type="text" class="input input-bordered w-full bg-slate-100" readonly data-v-955faaec></div><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>部署名称 *</span></label><input${ssrRenderAttr("value", dForm.name)} type="text" class="input input-bordered w-full" required placeholder="如 Voitrans(国内)" data-v-955faaec></div></div><div class="grid grid-cols-2 gap-4 mt-4" data-v-955faaec><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>区域</span></label><select class="select select-bordered w-full" data-v-955faaec><option value="" data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(dForm.region) ? ssrLooseContain(dForm.region, "") : ssrLooseEqual(dForm.region, "")) ? " selected" : ""}>未指定</option><!--[-->`); |
||||
|
ssrRenderList(availableRegions.value, (r) => { |
||||
|
_push(`<option${ssrRenderAttr("value", r)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(dForm.region) ? ssrLooseContain(dForm.region, r) : ssrLooseEqual(dForm.region, r)) ? " selected" : ""}>${ssrInterpolate(r)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select><span class="text-xs text-slate-400 mt-1" data-v-955faaec>已部署的区域不再出现(一个应用每区域一份部署)。</span></div><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>部署环境${ssrInterpolate(dMode.value === "deploy" ? " *" : "")}</span></label><select class="select select-bordered w-full" data-v-955faaec><option${ssrRenderAttr("value", 0)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(dForm.env_id) ? ssrLooseContain(dForm.env_id, 0) : ssrLooseEqual(dForm.env_id, 0)) ? " selected" : ""}>${ssrInterpolate(dMode.value === "deploy" ? "请选择目标环境" : "未关联")}</option><!--[-->`); |
||||
|
ssrRenderList(envs.value, (e) => { |
||||
|
_push(`<option${ssrRenderAttr("value", e.id)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(dForm.env_id) ? ssrLooseContain(dForm.env_id, e.id) : ssrLooseEqual(dForm.env_id, e.id)) ? " selected" : ""}>${ssrInterpolate(e.name)}(${ssrInterpolate(e.code || "-")})</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select></div></div><div class="grid grid-cols-3 gap-4 mt-4" data-v-955faaec><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>部署目录</span></label><input${ssrRenderAttr("value", dForm.deploy_dir)} type="text" class="input input-bordered w-full font-mono text-xs" placeholder="/home/work/voitrans-a11" data-v-955faaec></div><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>镜像名</span></label><input${ssrRenderAttr("value", dForm.image_name)} type="text" class="input input-bordered w-full" placeholder="voitrans-a11(默认取应用)" data-v-955faaec></div><div class="form-control" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>镜像 Tag</span></label><input${ssrRenderAttr("value", dForm.image_tag)} type="text" class="input input-bordered w-full" placeholder="0.1.1 / latest" data-v-955faaec></div></div><div class="form-control mt-4" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>业务库 DSN${ssrInterpolate(dMode.value === "existing" ? " *" : "")}</span></label><input${ssrRenderAttr("value", dForm.service_dsn)} type="text" class="input input-bordered w-full font-mono text-xs" placeholder="root:pwd@tcp(host:3306)/earphone?charset=utf8mb4&parseTime=True&loc=Local" data-v-955faaec><span class="text-xs text-slate-400 mt-1" data-v-955faaec>用于读取业务数据(重置设备码时清 userdevice/product_stat)</span></div>`); |
||||
|
if (dMode.value === "existing") { |
||||
|
_push(`<!--[--><div class="form-control mt-4" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>应用地址 *</span></label><input${ssrRenderAttr("value", dForm.base_url)} type="text" class="input input-bordered w-full" placeholder="https://api.xxx.com/" data-v-955faaec><span class="text-xs text-slate-400 mt-1" data-v-955faaec>用于通知应用业务服务事件(如配置更新)</span></div><div class="mt-4 text-sm" style="${ssrRenderStyle(testResult.show ? null : { display: "none" })}" data-v-955faaec><div class="${ssrRenderClass(testResult.apiOk ? "text-green-700" : "text-red-600")}" data-v-955faaec><span class="${ssrRenderClass(testResult.apiOk ? "text-green-600" : "text-red-500")}" data-v-955faaec>${ssrInterpolate(testResult.apiOk ? "✓" : "✗")}</span> 应用地址:${ssrInterpolate(testResult.apiMsg)}</div><div class="${ssrRenderClass(testResult.dbOk ? "text-green-700" : "text-red-600")}" data-v-955faaec><span class="${ssrRenderClass(testResult.dbOk ? "text-green-600" : "text-red-500")}" data-v-955faaec>${ssrInterpolate(testResult.dbOk ? "✓" : "✗")}</span> 业务库:${ssrInterpolate(testResult.dbMsg)}</div></div><!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<div class="form-control mt-4" data-v-955faaec><label class="label" data-v-955faaec><span class="label-text font-medium" data-v-955faaec>备注</span></label><input${ssrRenderAttr("value", dForm.remark)} type="text" class="input input-bordered w-full" data-v-955faaec></div><div class="flex items-center gap-2 mt-4" data-v-955faaec><label class="flex items-center gap-2 cursor-pointer" data-v-955faaec><input${ssrIncludeBooleanAttr(Array.isArray(dForm.enabled) ? ssrLooseContain(dForm.enabled, null) : dForm.enabled) ? " checked" : ""} type="checkbox" class="toggle toggle-primary toggle-sm" data-v-955faaec><span class="text-sm" data-v-955faaec>启用</span></label></div><div class="flex gap-3 mt-6" data-v-955faaec><button type="button" class="btn btn-ghost" data-v-955faaec>取消</button>`); |
||||
|
if (dMode.value === "existing") { |
||||
|
_push(`<button type="button" class="btn btn-outline"${ssrIncludeBooleanAttr(testing.value) ? " disabled" : ""} data-v-955faaec>${ssrInterpolate(testing.value ? "测试中..." : "测试连接")}</button>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<button type="submit" class="btn btn-primary text-white"${ssrIncludeBooleanAttr(!dIsEditing.value && dMode.value === "existing" && !testPassed.value) ? " disabled" : ""} data-v-955faaec>保存</button></div>`); |
||||
|
if (!dIsEditing.value && dMode.value === "existing") { |
||||
|
_push(`<p class="text-xs text-slate-400 mt-2" data-v-955faaec>需先「测试连接」通过(应用地址可达 + 业务库可连)才能保存。</p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</form></div></div><dialog class="modal" data-v-955faaec><div class="modal-box" data-v-955faaec><h3 class="font-bold text-lg" data-v-955faaec>分析历史数据</h3><p class="text-sm text-slate-500 mt-1" data-v-955faaec>${ssrInterpolate(az.appLabel)}</p><div class="text-xs text-amber-700 mt-3 bg-amber-50 border border-amber-100 rounded-lg p-3 leading-relaxed" data-v-955faaec> 扫描该应用业务库,按 <b data-v-955faaec>天 + 产品 + 区域</b> 生成历史统计(新增用户 / 订单 / 资源发放·使用 / 激活绑定设备),汇入 console 主库。<br data-v-955faaec> · <b data-v-955faaec>分析前会先清理该应用+区域在所选区间内的旧统计行</b>,避免数据重叠。<br data-v-955faaec> · 登录、活跃用户、AI对话等无每日原始记录,历史无法还原(由实时管道往后采集)。<br data-v-955faaec> · 仅对实时管道上线前的区间运行。留空 = 全部历史。大库可能耗时。 </div><div class="grid grid-cols-2 gap-3 mt-4" data-v-955faaec><div data-v-955faaec><label class="text-xs text-slate-500" data-v-955faaec>起始日(含)</label><input${ssrRenderAttr("value", az.start)} type="date" class="input input-bordered input-sm w-full" data-v-955faaec></div><div data-v-955faaec><label class="text-xs text-slate-500" data-v-955faaec>结束日(含)</label><input${ssrRenderAttr("value", az.end)} type="date" class="input input-bordered input-sm w-full" data-v-955faaec></div></div><div class="${ssrRenderClass([az.resultClass, "text-sm mt-3"])}" style="${ssrRenderStyle(az.resultShow ? null : { display: "none" })}" data-v-955faaec>`); |
||||
|
if (az.mode === "progress") { |
||||
|
_push(`<div class="bg-slate-50 border border-slate-200 rounded-lg p-3" data-v-955faaec><div class="flex justify-between items-center text-xs mb-1.5" data-v-955faaec><span class="text-slate-600" data-v-955faaec>`); |
||||
|
if (az.curName) { |
||||
|
_push(`<!--[--><span class="loading loading-spinner loading-xs" data-v-955faaec></span> 正在:${ssrInterpolate(az.curName)} (${ssrInterpolate(az.curIndex)}/${ssrInterpolate(az.curTotal)}) <!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!--[-->准备中...<!--]-->`); |
||||
|
} |
||||
|
_push(`</span><span class="font-mono text-slate-400" data-v-955faaec>${ssrInterpolate(az.pct)}%</span></div><progress class="progress progress-primary w-full h-2"${ssrRenderAttr("value", az.pct)} max="100" data-v-955faaec></progress><div class="mt-2 text-xs space-y-0.5" data-v-955faaec><!--[-->`); |
||||
|
ssrRenderList(az.steps, (nm, i) => { |
||||
|
_push(`<div class="${ssrRenderClass(i === az.curIndex - 1 ? "text-slate-600" : "text-green-600")}" data-v-955faaec>`); |
||||
|
if (i === az.curIndex - 1) { |
||||
|
_push(`<!--[--><span class="loading loading-spinner loading-xs" data-v-955faaec></span> ${ssrInterpolate(nm)}<!--]-->`); |
||||
|
} else { |
||||
|
_push(`<!--[-->✓ ${ssrInterpolate(nm)}<!--]-->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div></div>`); |
||||
|
} else if (az.mode === "error") { |
||||
|
_push(`<div class="text-red-600" data-v-955faaec>✗ ${ssrInterpolate(az.errMsg)}</div>`); |
||||
|
} else if (az.mode === "done" && az.report) { |
||||
|
_push(`<div class="bg-green-50 border border-green-100 rounded-lg p-3" data-v-955faaec><div class="font-semibold text-green-700 mb-2" data-v-955faaec>✓ 分析完成</div><div class="grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-slate-600 mb-2" data-v-955faaec><div data-v-955faaec>应用:<b data-v-955faaec>${ssrInterpolate(az.report.app_name || "")}</b></div><div data-v-955faaec>区域:${ssrInterpolate(az.report.region || "未指定")}</div><div data-v-955faaec>区间:${ssrInterpolate((az.report.start_day || "不限") + " ~ " + (az.report.end_day || "不限"))}</div><div data-v-955faaec>清理旧行:${ssrInterpolate(az.report.cleared_rows || 0)}</div><div data-v-955faaec>写入天数:<b data-v-955faaec>${ssrInterpolate(az.report.days_written || 0)}</b></div><div data-v-955faaec>写入行数:${ssrInterpolate(az.report.rows_written || 0)}</div></div><div class="border-t border-green-100 pt-2 text-xs" data-v-955faaec><!--[-->`); |
||||
|
ssrRenderList(az.report.steps || [], (s, i) => { |
||||
|
_push(`<div class="flex justify-between py-0.5" data-v-955faaec><span class="text-slate-500" data-v-955faaec>${ssrInterpolate(s.name)}</span><span class="font-mono text-slate-700" data-v-955faaec>${ssrInterpolate((s.groups || 0) + " 组")}</span></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><div class="modal-action" data-v-955faaec><button class="btn btn-ghost btn-sm" data-v-955faaec>关闭</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(az.running) ? " disabled" : ""} data-v-955faaec>${ssrInterpolate(az.btnText)}</button></div></div><form method="dialog" class="modal-backdrop" data-v-955faaec><button data-v-955faaec>close</button></form></dialog><dialog class="modal" data-v-955faaec><div class="modal-box max-w-2xl" data-v-955faaec><h3 class="font-bold text-lg" data-v-955faaec>升级部署</h3><p class="text-sm text-slate-500 mt-1" data-v-955faaec>${ssrInterpolate(up.label)}</p><div class="text-xs text-amber-700 mt-3 bg-amber-50 border border-amber-100 rounded-lg p-3 leading-relaxed" data-v-955faaec> 将 <b data-v-955faaec>SSH 连接到该部署绑定的环境节点</b>,进入部署目录执行:<span class="font-mono" data-v-955faaec>docker login → compose pull → up -d 重启 → 清理旧镜像</span>。<br data-v-955faaec> · 需服务器上已维护好 <span class="font-mono" data-v-955faaec>docker-compose.yml / .env / confs</span>(本操作不上传真实配置)。<br data-v-955faaec> · 会<b data-v-955faaec>重启该部署的容器</b>,请确认无误后再执行。 </div><div class="grid grid-cols-1 gap-2 mt-4 text-xs" data-v-955faaec><div class="flex" data-v-955faaec><span class="w-20 text-slate-400 shrink-0" data-v-955faaec>环境节点</span><span class="${ssrRenderClass(up.envName ? "font-medium text-slate-700" : "font-medium text-red-500")}" data-v-955faaec>${ssrInterpolate(up.envName || "未绑定 —— 请先在「编辑」里选择环境节点")}</span></div><div class="flex" data-v-955faaec><span class="w-20 text-slate-400 shrink-0" data-v-955faaec>部署目录</span><span class="${ssrRenderClass(up.deployDir ? "font-mono text-slate-700" : "font-medium text-red-500")}" data-v-955faaec>${ssrInterpolate(up.deployDir || "未填 —— 请先在「编辑」里填写远端部署目录")}</span></div></div><div class="mt-3" data-v-955faaec><div class="flex items-center justify-between mb-1" data-v-955faaec><label class="text-xs text-slate-500" data-v-955faaec>镜像版本 Tag</label><button type="button" class="text-xs text-indigo-500 hover:underline"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-955faaec>${ssrInterpolate(up.tagMode === "list" ? "手动输入…" : "从仓库选择")}</button></div>`); |
||||
|
if (up.tagMode === "list") { |
||||
|
_push(`<div class="flex gap-2" data-v-955faaec><select class="select select-bordered select-sm flex-1 font-mono"${ssrIncludeBooleanAttr(up.running || up.tagsLoading) ? " disabled" : ""} data-v-955faaec><option value="" data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(up.tag) ? ssrLooseContain(up.tag, "") : ssrLooseEqual(up.tag, "")) ? " selected" : ""}>${ssrInterpolate(up.tagsLoading ? "加载可用版本中…" : "请选择版本")}</option>`); |
||||
|
if (up.tag && !up.tags.includes(up.tag)) { |
||||
|
_push(`<option${ssrRenderAttr("value", up.tag)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(up.tag) ? ssrLooseContain(up.tag, up.tag) : ssrLooseEqual(up.tag, up.tag)) ? " selected" : ""}>${ssrInterpolate(up.tag)}(当前记录)</option>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<!--[-->`); |
||||
|
ssrRenderList(up.tags, (t) => { |
||||
|
_push(`<option${ssrRenderAttr("value", t)} data-v-955faaec${ssrIncludeBooleanAttr(Array.isArray(up.tag) ? ssrLooseContain(up.tag, t) : ssrLooseEqual(up.tag, t)) ? " selected" : ""}>${ssrInterpolate(t)}${ssrInterpolate(t === "latest" ? " · 不固定,不推荐" : "")}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select><button type="button" class="btn btn-ghost btn-sm"${ssrIncludeBooleanAttr(up.running || up.tagsLoading) ? " disabled" : ""} data-v-955faaec>刷新</button></div>`); |
||||
|
} else { |
||||
|
_push(`<input${ssrRenderAttr("value", up.tag)} type="text" class="input input-bordered input-sm w-full font-mono" placeholder="0.1.1"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-955faaec>`); |
||||
|
} |
||||
|
if (up.tagsError) { |
||||
|
_push(`<p class="text-xs text-amber-600 mt-1" data-v-955faaec>拉取仓库版本失败:${ssrInterpolate(up.tagsError)}(可点上方「手动输入」直接填版本号,或点「刷新」重试)</p>`); |
||||
|
} else if (up.tag === "latest" || up.tag === "") { |
||||
|
_push(`<p class="text-xs text-amber-600 mt-1" data-v-955faaec>⚠ 未固定版本,升级后列表无法体现具体版本号,建议选明确版本(如 0.1.1)。</p>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><div class="mt-3" style="${ssrRenderStyle(up.show ? null : { display: "none" })}" data-v-955faaec><div class="flex items-center gap-2 text-xs mb-1" data-v-955faaec>`); |
||||
|
if (up.running) { |
||||
|
_push(`<span class="loading loading-spinner loading-xs text-amber-500" data-v-955faaec></span>`); |
||||
|
} else if (up.ok) { |
||||
|
_push(`<span class="text-green-600 font-semibold" data-v-955faaec>✓ 部署完成</span>`); |
||||
|
} else { |
||||
|
_push(`<span class="text-red-600 font-semibold" data-v-955faaec>✗ 部署失败</span>`); |
||||
|
} |
||||
|
_push(`<span class="text-slate-400" data-v-955faaec>${ssrInterpolate(up.running ? "执行中…" : "")}</span></div><pre class="bg-slate-900 text-slate-100 text-[11px] leading-relaxed rounded-lg p-3 h-64 overflow-auto font-mono whitespace-pre-wrap" data-v-955faaec>${ssrInterpolate(up.log || "(等待输出…)")}</pre></div><div class="modal-action" data-v-955faaec><button class="btn btn-ghost btn-sm"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-955faaec>关闭</button><button class="btn btn-warning btn-sm"${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-955faaec>${ssrInterpolate(up.btnText)}</button></div></div><form method="dialog" class="modal-backdrop" data-v-955faaec><button${ssrIncludeBooleanAttr(up.running) ? " disabled" : ""} data-v-955faaec>close</button></form></dialog></div>`); |
||||
|
}; |
||||
|
} |
||||
|
}); |
||||
|
const _sfc_setup = _sfc_main.setup; |
||||
|
_sfc_main.setup = (props, ctx) => { |
||||
|
const ssrContext = useSSRContext(); |
||||
|
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/apps.vue"); |
||||
|
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
||||
|
}; |
||||
|
const apps = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-955faaec"]]); |
||||
|
|
||||
|
export { apps as default }; |
||||
|
//# sourceMappingURL=apps-M35AvXEe.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"apps-M35AvXEe.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/apps-M35AvXEe.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1,8 +0,0 @@ |
|||||
const apps_vue_vue_type_style_index_0_scoped_f8779360_lang = ".app-card[data-v-f8779360]{background:#fff;border:1px solid #eef2f7;border-radius:14px;box-shadow:0 1px 2px #00000008;overflow:hidden}.app-card.orphan[data-v-f8779360]{border-color:#fde68a}.app-head[data-v-f8779360]{display:flex;align-items:center;gap:12px;padding:13px 16px;cursor:pointer;background:linear-gradient(90deg,#f5f7ff,#fff);border-left:4px solid #6366f1;transition:background .15s}.app-card.orphan .app-head[data-v-f8779360]{background:linear-gradient(90deg,#fffbeb,#fff);border-left-color:#f59e0b}.app-head[data-v-f8779360]:hover{background:linear-gradient(90deg,#eef2ff,#fff)}.chev[data-v-f8779360]{color:#94a3b8;font-size:12px;width:16px;flex-shrink:0}.app-logo[data-v-f8779360]{width:38px;height:38px;border-radius:10px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;font-weight:700;font-size:17px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.app-logo.orphan-logo[data-v-f8779360]{background:#f59e0b}.app-name[data-v-f8779360]{font-size:15px;font-weight:700;color:#1e293b}.chip-app[data-v-f8779360]{font-size:10px;padding:1px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.chip-app[data-v-f8779360],.chip-dep[data-v-f8779360]{display:inline-flex;font-weight:700}.chip-dep[data-v-f8779360]{font-size:9px;padding:1px 6px;border-radius:5px;background:#ecfeff;color:#0e7490}.chip-mono[data-v-f8779360]{color:#475569;font-family:SF Mono,Menlo,monospace}.chip-count[data-v-f8779360],.chip-mono[data-v-f8779360]{display:inline-flex;font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px;background:#f1f5f9}.chip-count[data-v-f8779360]{color:#64748b}.app-body[data-v-f8779360]{padding:4px 12px 10px;border-top:1px solid #f1f5f9;background:#fcfcfd}.dep-row td[data-v-f8779360]{vertical-align:middle}"; |
|
||||
|
|
||||
const appsStyles__bNp0Sh6 = [ |
|
||||
apps_vue_vue_type_style_index_0_scoped_f8779360_lang |
|
||||
]; |
|
||||
|
|
||||
export { appsStyles__bNp0Sh6 as default }; |
|
||||
//# sourceMappingURL=apps-styles._bNp0Sh6.mjs.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"apps-styles._bNp0Sh6.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/apps-styles-1.mjs-BfSytJy7.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/apps-styles._bNp0Sh6.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
|
||||
@ -0,0 +1,8 @@ |
|||||
|
const apps_vue_vue_type_style_index_0_scoped_955faaec_lang = ".app-card[data-v-955faaec]{background:#fff;border:1px solid #eef2f7;border-radius:14px;box-shadow:0 1px 2px #00000008;overflow:hidden}.app-card.orphan[data-v-955faaec]{border-color:#fde68a}.app-head[data-v-955faaec]{display:flex;align-items:center;gap:12px;padding:13px 16px;cursor:pointer;background:linear-gradient(90deg,#f5f7ff,#fff);border-left:4px solid #6366f1;transition:background .15s}.app-card.orphan .app-head[data-v-955faaec]{background:linear-gradient(90deg,#fffbeb,#fff);border-left-color:#f59e0b}.app-head[data-v-955faaec]:hover{background:linear-gradient(90deg,#eef2ff,#fff)}.chev[data-v-955faaec]{color:#94a3b8;font-size:12px;width:16px;flex-shrink:0}.app-logo[data-v-955faaec]{width:38px;height:38px;border-radius:10px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;font-weight:700;font-size:17px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.app-logo.orphan-logo[data-v-955faaec]{background:#f59e0b}.app-name[data-v-955faaec]{font-size:15px;font-weight:700;color:#1e293b}.chip-app[data-v-955faaec]{font-size:10px;padding:1px 8px;border-radius:6px;background:#eef2ff;color:#4338ca}.chip-app[data-v-955faaec],.chip-dep[data-v-955faaec]{display:inline-flex;font-weight:700}.chip-dep[data-v-955faaec]{font-size:9px;padding:1px 6px;border-radius:5px;background:#ecfeff;color:#0e7490}.chip-mono[data-v-955faaec]{color:#475569;font-family:SF Mono,Menlo,monospace}.chip-count[data-v-955faaec],.chip-mono[data-v-955faaec]{display:inline-flex;font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px;background:#f1f5f9}.chip-count[data-v-955faaec]{color:#64748b}.app-body[data-v-955faaec]{padding:4px 12px 10px;border-top:1px solid #f1f5f9;background:#fcfcfd}.dep-row td[data-v-955faaec]{vertical-align:middle}"; |
||||
|
|
||||
|
const appsStyles_ohrc3N5k = [ |
||||
|
apps_vue_vue_type_style_index_0_scoped_955faaec_lang |
||||
|
]; |
||||
|
|
||||
|
export { appsStyles_ohrc3N5k as default }; |
||||
|
//# sourceMappingURL=apps-styles.ohrc3N5k.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"apps-styles.ohrc3N5k.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/apps-styles-1.mjs-B1MkzUEk.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/apps-styles.ohrc3N5k.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"calltranslate-B1hhAqN7.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-B1hhAqN7.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"calltranslate-Bavowmkg.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-Bavowmkg.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"code-BQgGcfFH.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/code-BQgGcfFH.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"code-RXZTcCgt.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/code-RXZTcCgt.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"dashboard-BeG8w5Q7.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-BeG8w5Q7.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"dashboard-C1ojHDcl.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-C1ojHDcl.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"default-DDIg74_f.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/default-DDIg74_f.js"],"names":["useRoute"],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"default-Vvv7KKiT.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/default-Vvv7KKiT.js"],"names":["useRoute"],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"device-CfQFMgWh.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/device-CfQFMgWh.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"device-CraC512i.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/device-CraC512i.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"environments-COih38_P.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/environments-COih38_P.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"environments-SWB_O04K.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/environments-SWB_O04K.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"factory-C8vqM9Rd.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/factory-C8vqM9Rd.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"factory-L6nRQ1NO.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/factory-L6nRQ1NO.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"globalconfig-B_Ujsbj7.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/globalconfig-B_Ujsbj7.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"globalconfig-VTDKVQk0.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/globalconfig-VTDKVQk0.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"mcpconfig-BqT6PWeV.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/mcpconfig-BqT6PWeV.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"mcpconfig-CBH98Fue.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/mcpconfig-CBH98Fue.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue