421 changed files with 8758 additions and 2019 deletions
@ -1 +1 @@ |
|||||
{"id":"dev","timestamp":1782719244117} |
{"id":"dev","timestamp":1782957264073} |
||||
@ -0,0 +1 @@ |
|||||
|
{} |
||||
@ -1 +1 @@ |
|||||
{"id":"dev","timestamp":1782719244117,"prerendered":[]} |
{"id":"dev","timestamp":1782957264073,"prerendered":[]} |
||||
@ -1,9 +0,0 @@ |
|||||
{ |
|
||||
"pid": 9287, |
|
||||
"startedAt": 1782719243662, |
|
||||
"command": "dev", |
|
||||
"cwd": "/Users/liwei/work/go/yunyan/yunyan-sas/apps/admin", |
|
||||
"port": 3000, |
|
||||
"hostname": "::1", |
|
||||
"url": "http://[::1]:3000" |
|
||||
} |
|
||||
File diff suppressed because one or more lines are too long
@ -1 +1 @@ |
|||||
import{_ as t,o,c as s,I as c}from"./96IDI_OR.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"./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}; |
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
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
File diff suppressed because one or more lines are too long
@ -0,0 +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+`」的接收流水吗?
|
||||
|
|
||||
|
只清除本核对面板的记录,不影响已落库的统计数据。 |
||||
|
清空后可重新触发埋点,观察是否正常进来。`))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};
|
||||
@ -1 +1 @@ |
|||||
import{_ as s}from"./0ubqzWuP.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./96IDI_OR.js";import{u as f}from"./C5ETpaZb.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"./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}; |
||||
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{e as f,a3 as r,a4 as c}from"./96IDI_OR.js";const p="$s";function l(...o){const n=typeof o[o.length-1]=="string"?o.pop():void 0;typeof o[0]!="string"&&o.unshift(n);const[e,t]=o;if(!e||typeof e!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+e);if(t!==void 0&&typeof t!="function")throw new Error("[nuxt] [useState] init must be a function: "+t);const s=p+e,i=f(),u=r(i.payload.state,s);if(t&&(i._state[s]??={_default:t}),u.value===void 0&&t){const a=t();if(c(a))return i.payload.state[s]=a,a;u.value=a}return u}let y=0;function d(){const o=l("app:toasts",()=>[]);function n(e,t="info",s=3e3){const i=++y;o.value.push({id:i,type:t,msg:e}),s>0&&setTimeout(()=>{o.value=o.value.filter(u=>u.id!==i)},s)}return{toasts:o,toast:n,success:(e,t)=>n(e,"success",t),error:(e,t)=>n(e,"error",t),info:(e,t)=>n(e,"info",t),warn:(e,t)=>n(e,"warning",t)}}export{d as u}; |
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@ |
|||||
import{g as h,y as x,z as w,j as y,c as r,a as e,t as d,l as b,A as _,k as v,m as g,n as k,x as A,s as u,o as p,_ as M}from"./96IDI_OR.js";const z={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=A({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",z,[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=M(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"./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}; |
||||
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{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}; |
||||
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{y as p,z as d}from"./96IDI_OR.js";async function c(s,a,i){const r=p(),n=d(),t={"Content-Type":"application/json"};r.token&&(t.Authorization=r.token),i&&Object.assign(t,i);const o=await fetch(s,{method:"POST",headers:t,body:JSON.stringify(a)});if(!o.ok)throw new Error(`HTTP error: ${o.status}`);const e=await o.json();if(e.code===18)throw r.logout(),n.push("/"),new Error(e.msg||"Unauthorized");if(e.code!==0)throw new Error(e.msg||"Unknown error");return e.data}function h(){const s=p();async function a(n,t){const o={};return s.currentAppId&&(o["X-App-Id"]=String(s.currentAppId)),c(`/web/api/api_${n}`,t??{},o)}async function i(n,t){return c(`/console/api/${n}`,t??{})}async function r(n,t){const o=await a("getcostoken",{path:t}),e=o.upload_url||o.url||"",u=await fetch(e,{method:"PUT",headers:{"Content-Type":n.type||"application/octet-stream"},body:n});if(!u.ok)throw new Error(`Upload failed: ${u.status}`);return e.split("?")[0]}return{webApi:a,consoleApi:i,uploadFile:r}}export{h as u}; |
|
||||
@ -1 +1 @@ |
|||||
import{u as a,e as s,h as u,i as r,f as h}from"./96IDI_OR.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"./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}; |
||||
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 o,o as s,c as a,a as t,t as r}from"./96IDI_OR.js";import{u as i}from"./C5ETpaZb.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"./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}; |
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
.app-avatar[data-v-a2d8388e]{width:48px;height:48px;border-radius:13px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:20px;flex-shrink:0;box-shadow:0 6px 18px #4f46e54d}.lock-tag[data-v-a2d8388e]{font-size:10px;font-weight:600;color:#dc2626;background:#fef2f2;padding:1px 5px;border-radius:5px} |
||||
@ -0,0 +1 @@ |
|||||
|
.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} |
||||
@ -1 +1 @@ |
|||||
{"id":"ec4737f4-4bc1-4016-bf94-c7164a1b5e0d","timestamp":1782351561646} |
{"id":"1539df2f-ed1e-4567-85ef-b3b4ac8648ab","timestamp":1782995062558} |
||||
@ -0,0 +1 @@ |
|||||
|
{"id":"1539df2f-ed1e-4567-85ef-b3b4ac8648ab","timestamp":1782995062558,"prerendered":[]} |
||||
@ -1 +0,0 @@ |
|||||
{"id":"ec4737f4-4bc1-4016-bf94-c7164a1b5e0d","timestamp":1782351561646,"prerendered":[]} |
|
||||
@ -1 +0,0 @@ |
|||||
.panel[data-v-d169bdaa]{background:#fff;border:1px solid #f1f5f9;border-radius:16px;box-shadow:0 1px 2px #0000000a;overflow:hidden}.panel-head[data-v-d169bdaa]{padding:12px 18px;gap:10px;border-bottom:1px solid #f8fafc;flex-wrap:wrap}.panel-dot[data-v-d169bdaa],.panel-head[data-v-d169bdaa]{display:flex;align-items:center}.panel-dot[data-v-d169bdaa]{width:30px;height:30px;border-radius:9px;justify-content:center;flex-shrink:0}.stat-box[data-v-d169bdaa]{padding:10px 12px;border-radius:10px;background:#fafbfc}.stat-label[data-v-d169bdaa]{font-size:11px;color:#94a3b8;margin-bottom:3px}.stat-val[data-v-d169bdaa]{font-size:20px;font-weight:700;color:#1e293b;line-height:1.1;letter-spacing:-.02em}.sec-title[data-v-d169bdaa]{display:flex;align-items:center;gap:10px;margin:0 0 14px}.sec-title .bar[data-v-d169bdaa]{width:4px;height:18px;border-radius:3px}.sec-title h2[data-v-d169bdaa]{font-size:15px;font-weight:700;color:#0f172a;letter-spacing:-.01em}.sec-title .sub[data-v-d169bdaa]{font-size:12px;color:#94a3b8}.sec-title .tag[data-v-d169bdaa]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:999px}.sec-title.muted .bar[data-v-d169bdaa]{height:14px;opacity:.6}.sec-title.muted h2[data-v-d169bdaa]{font-size:13px;font-weight:600;color:#94a3b8}.sec-title.hero .bar[data-v-d169bdaa]{width:5px;height:22px}.sec-title.hero h2[data-v-d169bdaa]{font-size:18px;font-weight:800;color:#0f172a}.cum-card[data-v-d169bdaa]{gap:11px;background:#f8fafc;border:1px solid #eef2f7;border-radius:12px;padding:10px 13px}.cum-card[data-v-d169bdaa],.cum-card .ico[data-v-d169bdaa]{display:flex;align-items:center}.cum-card .ico[data-v-d169bdaa]{width:30px;height:30px;border-radius:9px;justify-content:center;flex-shrink:0;font-size:14px;filter:saturate(.65);opacity:.85}.cum-card .body[data-v-d169bdaa]{min-width:0}.cum-card .lbl[data-v-d169bdaa]{font-size:11.5px;color:#94a3b8;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cum-card .val[data-v-d169bdaa]{font-size:17px;font-weight:700;color:#64748b;line-height:1.3;letter-spacing:-.01em;margin-top:1px}.today-wrap[data-v-d169bdaa]{background:linear-gradient(180deg,#e8f1ff,#f5f9ff);border:1px solid #d6e4ff;border-radius:22px;padding:20px;box-shadow:0 1px 3px #0d6efd0d}.today-card[data-v-d169bdaa]{position:relative;background:#fff;border:1px solid #e6eefb;border-radius:18px;padding:17px 19px;box-shadow:0 6px 18px #0d6efd14;transition:transform .18s ease,box-shadow .18s ease;overflow:hidden}.today-card[data-v-d169bdaa]:hover{transform:translateY(-3px);box-shadow:0 14px 32px #0d6efd26}.today-card .accent[data-v-d169bdaa]{position:absolute;left:0;top:0;bottom:0;width:5px}.today-card-top[data-v-d169bdaa]{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.today-card .lbl[data-v-d169bdaa]{font-size:13px;color:#475569;font-weight:600}.today-card .ico[data-v-d169bdaa]{width:42px;height:42px;border-radius:13px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:20px}.today-card .val[data-v-d169bdaa]{font-size:31px;font-weight:800;color:#0f172a;line-height:1.05;letter-spacing:-.02em}.today-card .foot[data-v-d169bdaa]{margin-top:9px;font-size:12px;color:#94a3b8;display:flex;align-items:center;gap:6px}.delta[data-v-d169bdaa]{display:inline-flex;align-items:center;gap:2px;font-weight:700;padding:2px 7px;border-radius:7px;font-size:11.5px}.delta.up[data-v-d169bdaa]{color:#059669;background:#ecfdf5}.delta.down[data-v-d169bdaa]{color:#dc2626;background:#fef2f2}.delta.flat[data-v-d169bdaa],.tbtn[data-v-d169bdaa]{color:#64748b;background:#f1f5f9}.tbtn[data-v-d169bdaa]{font-size:11px;padding:3px 9px;border-radius:7px;line-height:1.4}.tbtn[data-v-d169bdaa]:hover{background:#e2e8f0}.tbtn-on[data-v-d169bdaa]{background:#1e293b;color:#fff} |
|
||||
@ -0,0 +1 @@ |
|||||
|
.panel[data-v-7dbe8712]{background:#fff;border:1px solid #f1f5f9;border-radius:16px;box-shadow:0 1px 2px #0000000a;overflow:hidden}.panel-head[data-v-7dbe8712]{padding:12px 18px;gap:10px;border-bottom:1px solid #f8fafc;flex-wrap:wrap}.panel-dot[data-v-7dbe8712],.panel-head[data-v-7dbe8712]{display:flex;align-items:center}.panel-dot[data-v-7dbe8712]{width:30px;height:30px;border-radius:9px;justify-content:center;flex-shrink:0}.stat-box[data-v-7dbe8712]{padding:10px 12px;border-radius:10px;background:#fafbfc}.stat-label[data-v-7dbe8712]{font-size:11px;color:#94a3b8;margin-bottom:3px}.stat-val[data-v-7dbe8712]{font-size:20px;font-weight:700;color:#1e293b;line-height:1.1;letter-spacing:-.02em}.sec-title[data-v-7dbe8712]{display:flex;align-items:center;gap:10px;margin:0 0 14px}.sec-title .bar[data-v-7dbe8712]{width:4px;height:18px;border-radius:3px}.sec-title h2[data-v-7dbe8712]{font-size:15px;font-weight:700;color:#0f172a;letter-spacing:-.01em}.sec-title .sub[data-v-7dbe8712]{font-size:12px;color:#94a3b8}.sec-title .tag[data-v-7dbe8712]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:999px}.sec-title.muted .bar[data-v-7dbe8712]{height:14px;opacity:.6}.sec-title.muted h2[data-v-7dbe8712]{font-size:13px;font-weight:600;color:#94a3b8}.sec-title.hero .bar[data-v-7dbe8712]{width:5px;height:22px}.sec-title.hero h2[data-v-7dbe8712]{font-size:18px;font-weight:800;color:#0f172a}.cum-card[data-v-7dbe8712]{gap:11px;background:#f8fafc;border:1px solid #eef2f7;border-radius:12px;padding:10px 13px}.cum-card[data-v-7dbe8712],.cum-card .ico[data-v-7dbe8712]{display:flex;align-items:center}.cum-card .ico[data-v-7dbe8712]{width:30px;height:30px;border-radius:9px;justify-content:center;flex-shrink:0;font-size:14px;filter:saturate(.65);opacity:.85}.cum-card .body[data-v-7dbe8712]{min-width:0}.cum-card .lbl[data-v-7dbe8712]{font-size:11.5px;color:#94a3b8;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cum-card .val[data-v-7dbe8712]{font-size:17px;font-weight:700;color:#64748b;line-height:1.3;letter-spacing:-.01em;margin-top:1px}.today-wrap[data-v-7dbe8712]{background:linear-gradient(180deg,#e8f1ff,#f5f9ff);border:1px solid #d6e4ff;border-radius:22px;padding:20px;box-shadow:0 1px 3px #0d6efd0d}.today-card[data-v-7dbe8712]{position:relative;background:#fff;border:1px solid #e6eefb;border-radius:18px;padding:17px 19px;box-shadow:0 6px 18px #0d6efd14;transition:transform .18s ease,box-shadow .18s ease;overflow:hidden}.today-card[data-v-7dbe8712]:hover{transform:translateY(-3px);box-shadow:0 14px 32px #0d6efd26}.today-card .accent[data-v-7dbe8712]{position:absolute;left:0;top:0;bottom:0;width:5px}.today-card-top[data-v-7dbe8712]{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.today-card .lbl[data-v-7dbe8712]{font-size:13px;color:#475569;font-weight:600}.today-card .ico[data-v-7dbe8712]{width:42px;height:42px;border-radius:13px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:20px}.today-card .val[data-v-7dbe8712]{font-size:31px;font-weight:800;color:#0f172a;line-height:1.05;letter-spacing:-.02em}.today-card .foot[data-v-7dbe8712]{margin-top:9px;font-size:12px;color:#94a3b8;display:flex;align-items:center;gap:6px}.delta[data-v-7dbe8712]{display:inline-flex;align-items:center;gap:2px;font-weight:700;padding:2px 7px;border-radius:7px;font-size:11.5px}.delta.up[data-v-7dbe8712]{color:#059669;background:#ecfdf5}.delta.down[data-v-7dbe8712]{color:#dc2626;background:#fef2f2}.delta.flat[data-v-7dbe8712],.tbtn[data-v-7dbe8712]{color:#64748b;background:#f1f5f9}.tbtn[data-v-7dbe8712]{font-size:11px;padding:3px 9px;border-radius:7px;line-height:1.4}.tbtn[data-v-7dbe8712]:hover{background:#e2e8f0}.tbtn-on[data-v-7dbe8712]{background:#1e293b;color:#fff} |
||||
@ -0,0 +1 @@ |
|||||
|
.fade-enter-active[data-v-c1ace0c2],.fade-leave-active[data-v-c1ace0c2]{transition:opacity .15s ease}.fade-enter-from[data-v-c1ace0c2],.fade-leave-to[data-v-c1ace0c2]{opacity:0} |
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
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}; |
||||
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 @@ |
|||||
.svc-item[data-v-97419e3c]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:10px;border:1px solid #eef2f7;background:#fff;cursor:pointer;transition:all .15s}.svc-item[data-v-97419e3c]:hover{border-color:#c7d2fe;background:#f5f3ff}.svc-item.active[data-v-97419e3c]{border-color:#6366f1;background:linear-gradient(135deg,#eef2ff,#f5f3ff);box-shadow:0 4px 12px #6366f11f}.svc-logo[data-v-97419e3c]{width:36px;height:36px;border-radius:9px;display:flex;align-items:center;justify-content:center;font-size:16px;flex-shrink:0;color:#fff;font-weight:700}.cat-chip[data-v-97419e3c]{font-weight:700;padding:2px 7px}.cat-chip[data-v-97419e3c],.lock-badge[data-v-97419e3c]{display:inline-flex;font-size:10px;border-radius:6px}.lock-badge[data-v-97419e3c]{align-items:center;gap:3px;font-weight:600;padding:1px 7px;background:#fef2f2;color:#dc2626}.inherit-badge[data-v-97419e3c]{background:#f1f5f9;color:#94a3b8}.inherit-badge[data-v-97419e3c],.override-badge[data-v-97419e3c]{font-size:10px;font-weight:600;padding:1px 7px;border-radius:6px}.override-badge[data-v-97419e3c]{background:#fef3c7;color:#b45309}.field-input[data-v-97419e3c]{border:1px solid #e2e8f0;border-radius:7px;padding:5px 9px;font-size:12.5px;font-family:SF Mono,Menlo,monospace;width:100%}.field-input[data-v-97419e3c]:focus{border-color:#6366f1;box-shadow:0 0 0 3px #6366f11a;outline:none}.sync-overlay[data-v-97419e3c]{position:fixed;inset:0;background:#0f172a73;z-index:100;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.sync-box[data-v-97419e3c]{background:#fff;border-radius:20px;padding:28px;width:520px;max-width:95vw;box-shadow:0 24px 80px #0000002e}.sync-region-grid[data-v-97419e3c]{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin:14px 0}.sync-region-item[data-v-97419e3c]{display:flex;align-items:center;gap:7px;padding:8px 10px;border-radius:9px;border:1.5px solid #e2e8f0;cursor:pointer;transition:all .15s;font-size:13px;font-weight:500;color:#475569}.sync-region-item[data-v-97419e3c]:hover{border-color:#c7d2fe;background:#f5f3ff}.sync-region-item.checked[data-v-97419e3c]{border-color:#6366f1;background:#eef2ff;color:#4338ca} |
|
||||
@ -0,0 +1 @@ |
|||||
|
.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} |
||||
File diff suppressed because one or more lines are too long
@ -1,4 +0,0 @@ |
|||||
import{g as G,j as K,H 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,C as E,o,n as F,l as I,_ as J}from"./96IDI_OR.js";import{u as Q}from"./Do83zqYq.js";import{u as W}from"./CVUxyiJx.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=G({__name:"statlog",setup(Ct){const{webApi:A}=Q(),{success:H,error:O}=W(),R={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?R[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 j(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+S(t.product_id)+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await A("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function q(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗?
|
|
||||
|
|
||||
只清除本核对面板的记录,不影响已落库的统计数据。 |
|
||||
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await A("clearstatlogs",{day:l});H("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){O("清空失败:"+(r?.message||"网络异常"))}}function z(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return K(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[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:z},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:q},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(N.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[_.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?I("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(S(t.product_id)),1)]),e("div",yt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",bt," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),j(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Dt=J(kt,[["__scopeId","data-v-742ee359"]]);export{Dt as default};
|
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
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}; |
||||
@ -0,0 +1,8 @@ |
|||||
|
import { L as LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang } from './serviceconfig-styles-1.mjs-BjhBSOse.mjs'; |
||||
|
|
||||
|
const LangSelectStyles_C7_U3Izz = [ |
||||
|
LangSelect_vue_vue_type_style_index_0_scoped_4903af59_lang |
||||
|
]; |
||||
|
|
||||
|
export { LangSelectStyles_C7_U3Izz as default }; |
||||
|
//# sourceMappingURL=LangSelect-styles.C7_U3Izz.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"LangSelect-styles.C7_U3Izz.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/LangSelect-styles.C7_U3Izz.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"accounts-BlBS367g.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/accounts-BlBS367g.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"accounts-Bou39dJh.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/accounts-Bou39dJh.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1,192 @@ |
|||||
|
import { defineComponent, computed, reactive, ref, useSSRContext } from 'vue'; |
||||
|
import { ssrRenderAttrs, ssrRenderStyle, ssrInterpolate, ssrIncludeBooleanAttr, ssrRenderAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderClass, ssrRenderDynamicModel } from 'vue/server-renderer'; |
||||
|
import { u as useApi } from './useApi-B6h53Mkt.mjs'; |
||||
|
import { u as useToast } from './useToast-C76a6bSX.mjs'; |
||||
|
import { _ as _export_sfc, a as useRoute$1, b as useRouter } from './server.mjs'; |
||||
|
import './auth-QFkCoU1C.mjs'; |
||||
|
import 'pinia'; |
||||
|
import './useLoading-D6mc40Wj.mjs'; |
||||
|
import './state-DQnwRar-.mjs'; |
||||
|
import '../nitro/nitro.mjs'; |
||||
|
import 'node:http'; |
||||
|
import 'node:https'; |
||||
|
import 'node:events'; |
||||
|
import 'node:buffer'; |
||||
|
import 'node:fs'; |
||||
|
import 'node:path'; |
||||
|
import 'node:crypto'; |
||||
|
import 'node:url'; |
||||
|
import '../routes/renderer.mjs'; |
||||
|
import 'vue-bundle-renderer/runtime'; |
||||
|
import 'unhead/server'; |
||||
|
import 'devalue'; |
||||
|
import 'unhead/utils'; |
||||
|
import 'perfect-debounce'; |
||||
|
|
||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({ |
||||
|
__name: "appconfig", |
||||
|
__ssrInlineRender: true, |
||||
|
setup(__props) { |
||||
|
useApi(); |
||||
|
useToast(); |
||||
|
const route = useRoute$1(); |
||||
|
useRouter(); |
||||
|
const appId = computed(() => Number(route.query.id) || 0); |
||||
|
const appName = computed(() => route.query.name || "未指定应用"); |
||||
|
const appInitial = computed(() => (dep.app_name || appName.value || "A").charAt(0).toUpperCase()); |
||||
|
const dep = reactive({ id: 0, app_name: "", status: "", name: "", region: "", env_id: 0, base_url: "", service_dsn: "" }); |
||||
|
const envs = ref([]); |
||||
|
const envId = ref(0); |
||||
|
const envSaving = ref(false); |
||||
|
const catalog = ref([]); |
||||
|
const curModule = ref(""); |
||||
|
const values = reactive({}); |
||||
|
const dataModules = reactive(/* @__PURE__ */ new Set()); |
||||
|
const show = reactive({}); |
||||
|
const loading = ref(false); |
||||
|
const saving = ref(false); |
||||
|
const dbError = ref(""); |
||||
|
const curDef = computed(() => catalog.value.find((m) => m.module === curModule.value) || null); |
||||
|
const cur = computed(() => values[curModule.value] || {}); |
||||
|
const groups = computed(() => { |
||||
|
const order = []; |
||||
|
const map = /* @__PURE__ */ new Map(); |
||||
|
for (const m of catalog.value) { |
||||
|
if (!map.has(m.group)) { |
||||
|
map.set(m.group, []); |
||||
|
order.push(m.group); |
||||
|
} |
||||
|
map.get(m.group).push(m); |
||||
|
} |
||||
|
return order.map((name) => ({ name, modules: map.get(name) })); |
||||
|
}); |
||||
|
function dbName(dsn) { |
||||
|
const m = (dsn || "").match(/\/([^/?]+)\?/); |
||||
|
return m ? m[1] : dsn ? "(自定义)" : "—"; |
||||
|
} |
||||
|
return (_ctx, _push, _parent, _attrs) => { |
||||
|
_push(`<div${ssrRenderAttrs(_attrs)} data-v-a2d8388e><div class="flex items-center gap-2 mb-4" data-v-a2d8388e><button class="btn btn-ghost btn-sm" data-v-a2d8388e>← 返回应用列表</button><span class="text-slate-300" data-v-a2d8388e>/</span><h2 class="text-lg font-semibold text-slate-800" data-v-a2d8388e>应用服务配置</h2></div><div class="rounded-xl px-5 py-4 mb-5" style="${ssrRenderStyle({ "background": "linear-gradient(135deg,#eef2ff,#faf5ff)", "border": "1px solid #e0e7ff" })}" data-v-a2d8388e><div class="flex items-center gap-4" data-v-a2d8388e><div class="app-avatar" data-v-a2d8388e>${ssrInterpolate(appInitial.value)}</div><div class="flex-1 min-w-0" data-v-a2d8388e><div class="flex items-center gap-2 flex-wrap" data-v-a2d8388e><span class="text-base font-bold text-slate-800" data-v-a2d8388e>${ssrInterpolate(dep.name || appName.value)}</span><span class="badge badge-sm" style="${ssrRenderStyle({ "background": "#e0e7ff", "color": "#4338ca", "border": "none" })}" data-v-a2d8388e>#${ssrInterpolate(appId.value)}</span>`); |
||||
|
if (dep.app_name) { |
||||
|
_push(`<span class="badge badge-ghost badge-sm" data-v-a2d8388e>应用:${ssrInterpolate(dep.app_name)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (dep.region) { |
||||
|
_push(`<span class="badge badge-ghost badge-sm" data-v-a2d8388e>${ssrInterpolate(dep.region)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (dep.status === "pending") { |
||||
|
_push(`<span class="badge badge-warning badge-sm text-amber-900" data-v-a2d8388e>待部署</span>`); |
||||
|
} else { |
||||
|
_push(`<span class="badge badge-success badge-sm text-white" data-v-a2d8388e>已接入</span>`); |
||||
|
} |
||||
|
_push(`</div><div class="text-[11px] text-slate-500 mt-1 flex flex-wrap gap-x-4 gap-y-0.5" data-v-a2d8388e>`); |
||||
|
if (dep.base_url) { |
||||
|
_push(`<span data-v-a2d8388e>地址:<span class="font-mono" data-v-a2d8388e>${ssrInterpolate(dep.base_url)}</span></span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<span data-v-a2d8388e>业务库:<span class="font-mono" data-v-a2d8388e>${ssrInterpolate(dbName(dep.service_dsn))}</span></span></div></div></div><div class="flex items-center gap-2 mt-3 pt-3 border-t border-indigo-100" data-v-a2d8388e><span class="text-xs text-slate-500 shrink-0" data-v-a2d8388e>部署环境</span><select class="select select-bordered select-sm w-64"${ssrIncludeBooleanAttr(envSaving.value) ? " disabled" : ""} data-v-a2d8388e><option${ssrRenderAttr("value", 0)} data-v-a2d8388e${ssrIncludeBooleanAttr(Array.isArray(envId.value) ? ssrLooseContain(envId.value, 0) : ssrLooseEqual(envId.value, 0)) ? " selected" : ""}>未绑定</option><!--[-->`); |
||||
|
ssrRenderList(envs.value, (e) => { |
||||
|
_push(`<option${ssrRenderAttr("value", e.id)} data-v-a2d8388e${ssrIncludeBooleanAttr(Array.isArray(envId.value) ? ssrLooseContain(envId.value, e.id) : ssrLooseEqual(envId.value, e.id)) ? " selected" : ""}>${ssrInterpolate(e.name)}(${ssrInterpolate(e.code || "-")})</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select>`); |
||||
|
if (envSaving.value) { |
||||
|
_push(`<span class="loading loading-spinner loading-xs text-indigo-400" data-v-a2d8388e></span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<span class="text-[11px] text-slate-400" data-v-a2d8388e>切换后即时保存。</span></div></div><div class="bg-white rounded-2xl border border-slate-100 shadow-sm p-5" data-v-a2d8388e><div class="mb-3" data-v-a2d8388e><h3 class="text-base font-semibold text-slate-800" data-v-a2d8388e>业务功能配置</h3><p class="text-[11px] text-slate-400 mt-0.5" data-v-a2d8388e> 登录 / 短信 / 邮件 / 支付等应用独立配置,保存在<b data-v-a2d8388e>该部署的业务库</b>(不进公共库)。密钥字段加密落库,显示时脱敏。 </p></div>`); |
||||
|
if (dbError.value) { |
||||
|
_push(`<div class="alert alert-warning py-2 text-sm mb-3" data-v-a2d8388e><span data-v-a2d8388e>无法连接应用业务库:${ssrInterpolate(dbError.value)}<br data-v-a2d8388e><span class="text-xs opacity-70" data-v-a2d8388e>待部署的应用先完成部署、或检查业务库 DSN 连通后再配置。</span></span></div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (loading.value) { |
||||
|
_push(`<div class="py-12 text-center" data-v-a2d8388e><span class="loading loading-spinner loading-sm" data-v-a2d8388e></span></div>`); |
||||
|
} else { |
||||
|
_push(`<div class="flex gap-5" data-v-a2d8388e><aside class="w-48 shrink-0" data-v-a2d8388e><!--[-->`); |
||||
|
ssrRenderList(groups.value, (grp) => { |
||||
|
_push(`<div class="mb-3" data-v-a2d8388e><div class="text-[11px] font-semibold text-slate-400 px-2 mb-1" data-v-a2d8388e>${ssrInterpolate(grp.name)}</div><!--[-->`); |
||||
|
ssrRenderList(grp.modules, (m) => { |
||||
|
_push(`<button class="${ssrRenderClass([curModule.value === m.module ? "bg-indigo-50 text-indigo-700 font-medium" : "text-slate-600 hover:bg-slate-50", "w-full flex items-center justify-between text-left px-3 py-2 rounded-lg text-sm mb-0.5 transition-colors"])}" data-v-a2d8388e><span data-v-a2d8388e>${ssrInterpolate(m.name)}</span>`); |
||||
|
if (dataModules.has(m.module)) { |
||||
|
_push(`<span class="w-1.5 h-1.5 rounded-full bg-emerald-400 inline-block" data-v-a2d8388e></span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</button>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></aside><section class="flex-1 min-w-0" data-v-a2d8388e>`); |
||||
|
if (curDef.value) { |
||||
|
_push(`<!--[--><div class="flex items-center justify-between mb-3" data-v-a2d8388e><div data-v-a2d8388e><div class="text-sm font-semibold text-slate-800" data-v-a2d8388e>${ssrInterpolate(curDef.value.name)}</div>`); |
||||
|
if (curDef.value.desc) { |
||||
|
_push(`<div class="text-[11px] text-slate-400 mt-0.5" data-v-a2d8388e>${ssrInterpolate(curDef.value.desc)}</div>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div><div class="flex items-center gap-2" data-v-a2d8388e>`); |
||||
|
if (dataModules.has(curModule.value)) { |
||||
|
_push(`<button class="btn btn-ghost btn-xs text-rose-500"${ssrIncludeBooleanAttr(saving.value) ? " disabled" : ""} data-v-a2d8388e>清空</button>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(saving.value || dbError.value !== "") ? " disabled" : ""} data-v-a2d8388e>${ssrInterpolate(saving.value ? "保存中…" : "保存")}</button></div></div><div class="grid grid-cols-1 gap-3 max-w-2xl" data-v-a2d8388e><!--[-->`); |
||||
|
ssrRenderList(curDef.value.fields, (f) => { |
||||
|
_push(`<div class="form-control" data-v-a2d8388e><label class="label py-0.5" data-v-a2d8388e><span class="label-text text-sm" data-v-a2d8388e>${ssrInterpolate(f.label)} `); |
||||
|
if (f.required) { |
||||
|
_push(`<span class="text-rose-400" data-v-a2d8388e>*</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
if (f.secret) { |
||||
|
_push(`<span class="lock-tag ml-1" data-v-a2d8388e>🔒</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`<span class="text-[10px] font-normal text-slate-300 ml-1 font-mono" data-v-a2d8388e>${ssrInterpolate(f.key)}</span></span></label>`); |
||||
|
if (f.type === "bool") { |
||||
|
_push(`<label class="cursor-pointer flex items-center gap-2" data-v-a2d8388e><input type="checkbox" class="toggle toggle-sm toggle-primary"${ssrIncludeBooleanAttr(cur.value[f.key] === "true") ? " checked" : ""} data-v-a2d8388e><span class="text-xs text-slate-500" data-v-a2d8388e>${ssrInterpolate(cur.value[f.key] === "true" ? "开启" : "关闭")}</span></label>`); |
||||
|
} else if (f.type === "select") { |
||||
|
_push(`<select class="select select-bordered select-sm w-full" data-v-a2d8388e><option value="" data-v-a2d8388e${ssrIncludeBooleanAttr(Array.isArray(cur.value[f.key]) ? ssrLooseContain(cur.value[f.key], "") : ssrLooseEqual(cur.value[f.key], "")) ? " selected" : ""}>请选择</option><!--[-->`); |
||||
|
ssrRenderList(f.options, (o) => { |
||||
|
_push(`<option${ssrRenderAttr("value", o.value)} data-v-a2d8388e${ssrIncludeBooleanAttr(Array.isArray(cur.value[f.key]) ? ssrLooseContain(cur.value[f.key], o.value) : ssrLooseEqual(cur.value[f.key], o.value)) ? " selected" : ""}>${ssrInterpolate(o.label)}</option>`); |
||||
|
}); |
||||
|
_push(`<!--]--></select>`); |
||||
|
} else if (f.type === "textarea") { |
||||
|
_push(`<textarea class="textarea textarea-bordered w-full font-mono text-xs" rows="3"${ssrRenderAttr("placeholder", f.secret ? "留空/保持 [encrypted] 则不变" : f.placeholder || "")} data-v-a2d8388e>${ssrInterpolate(cur.value[f.key])}</textarea>`); |
||||
|
} else if (f.type === "password") { |
||||
|
_push(`<div class="relative" data-v-a2d8388e><input${ssrRenderDynamicModel(show[f.key] ? "text" : "password", cur.value[f.key], null)}${ssrRenderAttr("type", show[f.key] ? "text" : "password")} class="input input-bordered input-sm w-full font-mono text-xs pr-14"${ssrRenderAttr("placeholder", "留空/保持 [encrypted] 则不变")} data-v-a2d8388e><button type="button" class="absolute right-3 top-1/2 -translate-y-1/2 text-xs text-slate-400 hover:text-slate-700" data-v-a2d8388e>${ssrInterpolate(show[f.key] ? "隐藏" : "显示")}</button></div>`); |
||||
|
} else { |
||||
|
_push(`<input${ssrRenderAttr("value", cur.value[f.key])} type="text" class="input input-bordered input-sm w-full font-mono text-xs"${ssrRenderAttr("placeholder", f.placeholder || "")} data-v-a2d8388e>`); |
||||
|
} |
||||
|
if (f.desc) { |
||||
|
_push(`<span class="text-[11px] text-slate-400 mt-0.5" data-v-a2d8388e>${ssrInterpolate(f.desc)}</span>`); |
||||
|
} else { |
||||
|
_push(`<!---->`); |
||||
|
} |
||||
|
_push(`</div>`); |
||||
|
}); |
||||
|
_push(`<!--]--></div><!--]-->`); |
||||
|
} else { |
||||
|
_push(`<div class="py-10 text-center text-slate-400 text-sm" data-v-a2d8388e>暂无可配置的业务模块。</div>`); |
||||
|
} |
||||
|
_push(`</section></div>`); |
||||
|
} |
||||
|
_push(`</div></div>`); |
||||
|
}; |
||||
|
} |
||||
|
}); |
||||
|
const _sfc_setup = _sfc_main.setup; |
||||
|
_sfc_main.setup = (props, ctx) => { |
||||
|
const ssrContext = useSSRContext(); |
||||
|
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/appconfig.vue"); |
||||
|
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; |
||||
|
}; |
||||
|
const appconfig = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-a2d8388e"]]); |
||||
|
|
||||
|
export { appconfig as default }; |
||||
|
//# sourceMappingURL=appconfig-b7qb0UVr.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"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]} |
||||
@ -0,0 +1,8 @@ |
|||||
|
const appconfig_vue_vue_type_style_index_0_scoped_a2d8388e_lang = ".app-avatar[data-v-a2d8388e]{width:48px;height:48px;border-radius:13px;background:linear-gradient(135deg,#4f46e5,#7c3aed);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:20px;flex-shrink:0;box-shadow:0 6px 18px #4f46e54d}.lock-tag[data-v-a2d8388e]{font-size:10px;font-weight:600;color:#dc2626;background:#fef2f2;padding:1px 5px;border-radius:5px}"; |
||||
|
|
||||
|
const appconfigStyles_C960WaXM = [ |
||||
|
appconfig_vue_vue_type_style_index_0_scoped_a2d8388e_lang |
||||
|
]; |
||||
|
|
||||
|
export { appconfigStyles_C960WaXM as default }; |
||||
|
//# sourceMappingURL=appconfig-styles.C960WaXM.mjs.map
|
||||
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"appconfig-styles.C960WaXM.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/appconfig-styles-1.mjs-D6A0tq1Y.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/appconfig-styles.C960WaXM.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]} |
||||
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"apps-DL1E6wot.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/apps-DL1E6wot.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
@ -0,0 +1,273 @@ |
|||||
|
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
|
||||
@ -0,0 +1 @@ |
|||||
|
{"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,8 @@ |
|||||
|
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
|
||||
@ -0,0 +1 @@ |
|||||
|
{"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 @@ |
|||||
|
{"version":3,"file":"calltranslate-B1hhAqN7.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-B1hhAqN7.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"calltranslate-C6glzS4R.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-C6glzS4R.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@ |
|||||
|
{"version":3,"file":"code-BQgGcfFH.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/code-BQgGcfFH.js"],"names":[],"mappings":"","x_google_ignoreList":[0]} |
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"file":"code-Bi0p3nMD.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/code-Bi0p3nMD.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