Browse Source

上传最新代码

main
liwei1dao 2 months ago
parent
commit
7660f33258
  1. 9
      CLAUDE.md
  2. 2
      apps/admin/.output/nitro.json
  3. 2
      apps/admin/.output/public/_nuxt/B0TjgAkR.js
  4. 2
      apps/admin/.output/public/_nuxt/BIXaKwU_.js
  5. 2
      apps/admin/.output/public/_nuxt/BJhUngVd.js
  6. 2
      apps/admin/.output/public/_nuxt/BMQvQYtl.js
  7. 2
      apps/admin/.output/public/_nuxt/BRt-3vKG.js
  8. 2
      apps/admin/.output/public/_nuxt/Bf3Eg9kO.js
  9. 2
      apps/admin/.output/public/_nuxt/Bpb__dU6.js
  10. 2
      apps/admin/.output/public/_nuxt/BqjD6jMG.js
  11. 2
      apps/admin/.output/public/_nuxt/BuCQ8FwD.js
  12. 2
      apps/admin/.output/public/_nuxt/C-2gsgTH.js
  13. 2
      apps/admin/.output/public/_nuxt/C2WfoPPr.js
  14. 2
      apps/admin/.output/public/_nuxt/C6twYRfy.js
  15. 2
      apps/admin/.output/public/_nuxt/CRsHkMZx.js
  16. 1
      apps/admin/.output/public/_nuxt/C_VX9uKy.js
  17. 2
      apps/admin/.output/public/_nuxt/CcYro5R2.js
  18. 2
      apps/admin/.output/public/_nuxt/CglQi8MB.js
  19. 2
      apps/admin/.output/public/_nuxt/CvHBDjjq.js
  20. 2
      apps/admin/.output/public/_nuxt/CyqrlMkw.js
  21. 2
      apps/admin/.output/public/_nuxt/D-lUY2ZC.js
  22. 2
      apps/admin/.output/public/_nuxt/DACw1I5K.js
  23. 2
      apps/admin/.output/public/_nuxt/DG0IG_4u.js
  24. 2
      apps/admin/.output/public/_nuxt/DGSd_XG-.js
  25. 2
      apps/admin/.output/public/_nuxt/Db4U27_j.js
  26. 2
      apps/admin/.output/public/_nuxt/Ddg4glGj.js
  27. 2
      apps/admin/.output/public/_nuxt/DuRQSWLc.js
  28. 2
      apps/admin/.output/public/_nuxt/DwmKnEeH.js
  29. 2
      apps/admin/.output/public/_nuxt/FVTAbpot.js
  30. 2
      apps/admin/.output/public/_nuxt/G5UJCii2.js
  31. 1
      apps/admin/.output/public/_nuxt/GZG--rps.js
  32. 2
      apps/admin/.output/public/_nuxt/OLpUuA7c.js
  33. 1
      apps/admin/.output/public/_nuxt/PN667bHc.js
  34. 2
      apps/admin/.output/public/_nuxt/VVFxpwIU.js
  35. 2
      apps/admin/.output/public/_nuxt/builds/latest.json
  36. 1
      apps/admin/.output/public/_nuxt/builds/meta/1c187759-8384-4449-899e-e6f5237cf6d9.json
  37. 1
      apps/admin/.output/public/_nuxt/builds/meta/1ce432df-603d-4010-810b-770972167d80.json
  38. 1
      apps/admin/.output/public/_nuxt/dashboard.CT4jXDd_.css
  39. 1
      apps/admin/.output/public/_nuxt/dashboard.bI0rfjl_.css
  40. 1
      apps/admin/.output/public/_nuxt/entry.BR7WYV0V.css
  41. 1
      apps/admin/.output/public/_nuxt/entry.Nq-dPCOq.css
  42. 1
      apps/admin/.output/public/_nuxt/k7DeUBTv.js
  43. 2
      apps/admin/.output/public/_nuxt/l8H0VyaU.js
  44. 6
      apps/admin/.output/public/_nuxt/mElhLwm2.js
  45. 2
      apps/admin/.output/public/_nuxt/ncAT-iHw.js
  46. 2
      apps/admin/.output/public/_nuxt/qig5Qp6S.js
  47. 1
      apps/admin/.output/public/_nuxt/svcinspect.H9TdRqZ5.css
  48. 8
      apps/admin/.output/server/chunks/build/SvcAlertBanner-styles.C9CJuYwV.mjs
  49. 1
      apps/admin/.output/server/chunks/build/SvcAlertBanner-styles.C9CJuYwV.mjs.map
  50. 2
      apps/admin/.output/server/chunks/build/client.precomputed.mjs
  51. 180
      apps/admin/.output/server/chunks/build/dashboard-CXdhxG8p.mjs
  52. 1
      apps/admin/.output/server/chunks/build/dashboard-CXdhxG8p.mjs.map
  53. 1
      apps/admin/.output/server/chunks/build/dashboard-CeM8vxnU.mjs.map
  54. 4
      apps/admin/.output/server/chunks/build/dashboard-styles-1.mjs-CFxtv9Pt.mjs
  55. 1
      apps/admin/.output/server/chunks/build/dashboard-styles-1.mjs-CFxtv9Pt.mjs.map
  56. 11
      apps/admin/.output/server/chunks/build/dashboard-styles.8Bs-G9zJ.mjs
  57. 1
      apps/admin/.output/server/chunks/build/dashboard-styles.8Bs-G9zJ.mjs.map
  58. 8
      apps/admin/.output/server/chunks/build/dashboard-styles.CGuiyPm5.mjs
  59. 1
      apps/admin/.output/server/chunks/build/dashboard-styles.CGuiyPm5.mjs.map
  60. 90
      apps/admin/.output/server/chunks/build/server.mjs
  61. 12
      apps/admin/.output/server/chunks/build/styles.mjs
  62. 62
      apps/admin/.output/server/chunks/build/svchealth-8zW8U1Ef.mjs
  63. 1
      apps/admin/.output/server/chunks/build/svchealth-8zW8U1Ef.mjs.map
  64. 145
      apps/admin/.output/server/chunks/build/svcinspect-ApAZbGUu.mjs
  65. 1
      apps/admin/.output/server/chunks/build/svcinspect-ApAZbGUu.mjs.map
  66. 8
      apps/admin/.output/server/chunks/build/svcinspect-styles.DpDXXkHn.mjs
  67. 1
      apps/admin/.output/server/chunks/build/svcinspect-styles.DpDXXkHn.mjs.map
  68. 459
      apps/admin/.output/server/chunks/nitro/nitro.mjs
  69. 116
      apps/admin/app/components/SvcAlertBanner.vue
  70. 3
      apps/admin/app/pages/dashboard.vue
  71. 244
      apps/admin/app/pages/svcinspect.vue
  72. 1
      apps/admin/app/utils/menus.ts
  73. 80
      apps/admin/app/utils/svchealth.ts
  74. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/components.d.ts
  75. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/B0TjgAkR.js
  76. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BIXaKwU_.js
  77. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BJhUngVd.js
  78. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BMQvQYtl.js
  79. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BRt-3vKG.js
  80. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Bf3Eg9kO.js
  81. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Bpb__dU6.js
  82. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BqjD6jMG.js
  83. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BuCQ8FwD.js
  84. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C-2gsgTH.js
  85. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C2WfoPPr.js
  86. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C6twYRfy.js
  87. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CRsHkMZx.js
  88. 1
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C_VX9uKy.js
  89. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CcYro5R2.js
  90. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CglQi8MB.js
  91. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CvHBDjjq.js
  92. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CyqrlMkw.js
  93. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/D-lUY2ZC.js
  94. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DACw1I5K.js
  95. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DG0IG_4u.js
  96. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DGSd_XG-.js
  97. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Db4U27_j.js
  98. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Ddg4glGj.js
  99. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DuRQSWLc.js
  100. 2
      apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DwmKnEeH.js

9
CLAUDE.md

@ -64,13 +64,20 @@ cd deploy/console && ./dev-deploy.sh # 不带参数 → 交互选环
# 生产:先构建带版本号的镜像,再部署 # 生产:先构建带版本号的镜像,再部署
cd deploy/console && ./prod-build.sh 0.2.1 yunyan # 第 2 个参数选公司(yunyan|lingpu),省略则交互选 cd deploy/console && ./prod-build.sh 0.2.1 yunyan # 第 2 个参数选公司(yunyan|lingpu),省略则交互选
cd deploy/console && ./prod-deploy.sh 0.2.1 # 用 COMPANY=lingpu 前缀可换仓库,须与构建时一致 cd deploy/console && ./prod-deploy.sh 0.2.1 yunyan # 第 2 个参数选生产环境,须与构建时所选公司一致;省略则交互选
``` ```
**镜像仓库按公司区分**,地址/账号统一在 [deploy/registry-profiles.sh](deploy/registry-profiles.sh)(换仓库只改这一处,各脚本 source 它): **镜像仓库按公司区分**,地址/账号统一在 [deploy/registry-profiles.sh](deploy/registry-profiles.sh)(换仓库只改这一处,各脚本 source 它):
- `yunyan` → `registry.voitrans.net`(仓库实体在广州机 8.138.86.223) - `yunyan` → `registry.voitrans.net`(仓库实体在广州机 8.138.86.223)
- `lingpu` → `registry.lingpu.net`(灵谱香港机) - `lingpu` → `registry.lingpu.net`(灵谱香港机)
**生产镜像名也按公司区分**,映射同在 `registry-profiles.sh` 的 `prod_image_name()`(build 与 deploy 共用一份,防漂移):
云雁沿用历史名 `yunyan-admin`/`console-a11`/`voitrans-a11`;灵谱用 `starpivot-*` 新名。
admin/console 的 `prod-deploy.sh` 已改为**多生产环境档案**(`env_profile()`,同 `dev-deploy.sh` 的写法):
- `yunyan` → 47.253.88.66(美国阿里云),目录 `/home/work/yunyan-admin`、`/home/work/console-a11`
- `lingpu` → 8.166.114.65(广州阿里云),目录 `/home/work/starpivot/{admin,console}`,密钥 `~/.ssh/lingpu-gz.pem`
`dev-deploy.sh <环境>` 只做镜像部署:构建推送 → 远端 pull 重启,**不上传** 服务器上的真实 `.env` / `confs/*.yaml`(只下发 `*.example` 模板)。 `dev-deploy.sh <环境>` 只做镜像部署:构建推送 → 远端 pull 重启,**不上传** 服务器上的真实 `.env` / `confs/*.yaml`(只下发 `*.example` 模板)。
## 后端架构(lego 框架) ## 后端架构(lego 框架)

2
apps/admin/.output/nitro.json

@ -1,5 +1,5 @@
{ {
"date": "2026-07-31T11:02:02.337Z", "date": "2026-08-03T09:06:00.336Z",
"preset": "node-server", "preset": "node-server",
"framework": { "framework": {
"name": "nuxt", "name": "nuxt",

2
apps/admin/.output/public/_nuxt/C1u1NIe5.js → apps/admin/.output/public/_nuxt/B0TjgAkR.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CO60jE1q.js → apps/admin/.output/public/_nuxt/BIXaKwU_.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BtOu2QXF.js → apps/admin/.output/public/_nuxt/BJhUngVd.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BPYtLuIu.js → apps/admin/.output/public/_nuxt/BMQvQYtl.js

@ -1 +1 @@
import{_ as o,o as s,c as a,a as t,t as r}from"./Ccu6Xgpt.js";import{u as i}from"./oiJG5Pzc.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"./mElhLwm2.js";import{u as i}from"./OLpUuA7c.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};

2
apps/admin/.output/public/_nuxt/B8Fu162H.js → apps/admin/.output/public/_nuxt/BRt-3vKG.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DSpyBzHW.js → apps/admin/.output/public/_nuxt/Bf3Eg9kO.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/D-7b2ops.js → apps/admin/.output/public/_nuxt/Bpb__dU6.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BOUWbQhH.js → apps/admin/.output/public/_nuxt/BqjD6jMG.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/C3hsc2UX.js → apps/admin/.output/public/_nuxt/BuCQ8FwD.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CFdmUKvC.js → apps/admin/.output/public/_nuxt/C-2gsgTH.js

@ -1 +1 @@
import{g as h,j as x,k as w,B as y,c as r,a as e,t as d,l as b,m as _,p as v,v as g,n as k,y as B,x as u,o as p,_ as M}from"./Ccu6Xgpt.js";const A={class:"login-bg flex items-center justify-center px-4"},z={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=B({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function f(){l.value=!0,n.value="";try{const s=await $fetch("/web/api/api_login",{method:"POST",body:{account:o.account,password:o.password}});s.code===0&&s.data?(a.setLoginData(s.data),c.push("/dashboard")):n.value=s.msg||"登录失败"}catch{n.value="网络错误,请检查连接"}finally{l.value=!1}}return(s,t)=>(p(),r("div",A,[e("div",z,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(f,["prevent"])},[e("div",j,[t[5]||(t[5]=e("label",{class:"login-label"},"账号",-1)),v(e("input",{"onUpdate:modelValue":t[0]||(t[0]=i=>o.account=i),type:"text",class:"login-input",placeholder:"请输入管理员账号",autocomplete:"username",required:""},null,512),[[g,o.account]])]),e("div",D,[t[6]||(t[6]=e("label",{class:"login-label"},"密码",-1)),v(e("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>o.password=i),type:"password",class:"login-input",placeholder:"请输入密码",autocomplete:"current-password",required:""},null,512),[[g,o.password]])]),e("button",{type:"submit",class:k(["login-btn",{loading:l.value}])},d(l.value?"登录中...":"登 录"),3)],32),t[7]||(t[7]=e("p",{style:{"text-align":"center","font-size":"11px",color:"#94A3B8","margin-top":"24px"}}," © 2025 Admin Console · v1.0.1 ",-1))])]))}}),O=M(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default}; import{g as h,j as x,k as w,B as y,c as r,a as e,t as d,l as b,m as _,p as v,v as g,n as k,y as B,x as u,o as p,_ as M}from"./mElhLwm2.js";const A={class:"login-bg flex items-center justify-center px-4"},z={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=B({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function f(){l.value=!0,n.value="";try{const s=await $fetch("/web/api/api_login",{method:"POST",body:{account:o.account,password:o.password}});s.code===0&&s.data?(a.setLoginData(s.data),c.push("/dashboard")):n.value=s.msg||"登录失败"}catch{n.value="网络错误,请检查连接"}finally{l.value=!1}}return(s,t)=>(p(),r("div",A,[e("div",z,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(f,["prevent"])},[e("div",j,[t[5]||(t[5]=e("label",{class:"login-label"},"账号",-1)),v(e("input",{"onUpdate:modelValue":t[0]||(t[0]=i=>o.account=i),type:"text",class:"login-input",placeholder:"请输入管理员账号",autocomplete:"username",required:""},null,512),[[g,o.account]])]),e("div",D,[t[6]||(t[6]=e("label",{class:"login-label"},"密码",-1)),v(e("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>o.password=i),type:"password",class:"login-input",placeholder:"请输入密码",autocomplete:"current-password",required:""},null,512),[[g,o.password]])]),e("button",{type:"submit",class:k(["login-btn",{loading:l.value}])},d(l.value?"登录中...":"登 录"),3)],32),t[7]||(t[7]=e("p",{style:{"text-align":"center","font-size":"11px",color:"#94A3B8","margin-top":"24px"}}," © 2025 Admin Console · v1.0.1 ",-1))])]))}}),O=M(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default};

2
apps/admin/.output/public/_nuxt/aWlcN8xt.js → apps/admin/.output/public/_nuxt/C2WfoPPr.js

@ -1 +1 @@
import{g as t,B as n,P as a,c as o,a as s,o as c}from"./Ccu6Xgpt.js";const i={class:"py-16 text-center text-slate-400"},m=t({__name:"mcpconfig",setup(l){return n(()=>{a("/serviceconfig")}),(r,e)=>(c(),o("div",i,[...e[0]||(e[0]=[s("span",{class:"loading loading-spinner loading-sm"},null,-1),s("p",{class:"text-sm mt-3"},"MCP 配置已并入「第三方服务配置」,正在跳转…",-1)])]))}});export{m as default}; import{g as t,B as n,P as a,c as o,a as s,o as c}from"./mElhLwm2.js";const i={class:"py-16 text-center text-slate-400"},m=t({__name:"mcpconfig",setup(l){return n(()=>{a("/serviceconfig")}),(r,e)=>(c(),o("div",i,[...e[0]||(e[0]=[s("span",{class:"loading loading-spinner loading-sm"},null,-1),s("p",{class:"text-sm mt-3"},"MCP 配置已并入「第三方服务配置」,正在跳转…",-1)])]))}});export{m as default};

2
apps/admin/.output/public/_nuxt/Um-KoueI.js → apps/admin/.output/public/_nuxt/C6twYRfy.js

@ -1 +1 @@
import{j as w,k as d}from"./Ccu6Xgpt.js";import{u as h}from"./CH2ZVAK2.js";async function f(o,i,a){const e=w(),u=d(),s={"Content-Type":"application/json"};e.token&&(s.Authorization=e.token),a&&Object.assign(s,a);const t=await fetch(o,{method:"POST",headers:s,body:JSON.stringify(i)});if(!t.ok)throw new Error(`HTTP error: ${t.status}`);const n=await t.json();if(n.code===18)throw e.logout(),u.push("/"),new Error(n.msg||"Unauthorized");if(n.code!==0)throw new Error(n.msg||"Unknown error");return n.data}const y=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function g(o){return!y.test(o)}function A(){const o=w(),{begin:i,end:a}=h();async function e(t,n){const r={};if(o.currentAppId&&(r["X-App-Id"]=String(o.currentAppId)),!g(t))return f(`/web/api/api_${t}`,n??{},r);i();try{return await f(`/web/api/api_${t}`,n??{},r)}finally{a()}}async function u(t,n){return f(`/console/api/${t}`,n??{})}async function s(t,n){const r=t.type||"application/octet-stream",c=await e("getcostoken",{path:n,filename:t.name,content_type:r}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":r},body:t});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:e,consoleApi:u,uploadFile:s}}export{A as u}; import{j as w,k as d}from"./mElhLwm2.js";import{u as h}from"./qig5Qp6S.js";async function f(o,i,a){const e=w(),u=d(),s={"Content-Type":"application/json"};e.token&&(s.Authorization=e.token),a&&Object.assign(s,a);const t=await fetch(o,{method:"POST",headers:s,body:JSON.stringify(i)});if(!t.ok)throw new Error(`HTTP error: ${t.status}`);const n=await t.json();if(n.code===18)throw e.logout(),u.push("/"),new Error(n.msg||"Unauthorized");if(n.code!==0)throw new Error(n.msg||"Unknown error");return n.data}const y=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function g(o){return!y.test(o)}function A(){const o=w(),{begin:i,end:a}=h();async function e(t,n){const r={};if(o.currentAppId&&(r["X-App-Id"]=String(o.currentAppId)),!g(t))return f(`/web/api/api_${t}`,n??{},r);i();try{return await f(`/web/api/api_${t}`,n??{},r)}finally{a()}}async function u(t,n){return f(`/console/api/${t}`,n??{})}async function s(t,n){const r=t.type||"application/octet-stream",c=await e("getcostoken",{path:n,filename:t.name,content_type:r}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":r},body:t});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:e,consoleApi:u,uploadFile:s}}export{A as u};

2
apps/admin/.output/public/_nuxt/BQIhlerM.js → apps/admin/.output/public/_nuxt/CRsHkMZx.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/C_VX9uKy.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BgemqguF.js → apps/admin/.output/public/_nuxt/CcYro5R2.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/szhsDUYv.js → apps/admin/.output/public/_nuxt/CglQi8MB.js

@ -1 +1 @@
import{L as y,l as x}from"./ChQPCk92.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,z as h,o as s,d as B,_ as N}from"./Ccu6Xgpt.js";const L={class:"lang-select"},O={class:"lang-chip-name"},S=["onClick"],j={key:0,class:"lang-empty"},z={key:0,class:"lang-dd"},F={class:"lang-dd-sum"},I={class:"lang-dd-panel"},T=["checked","onChange"],$={class:"lang-opt-code"},w={class:"lang-opt-name"},A=["value","disabled"],D=["value"],E=V({__name:"LangSelect",props:{modelValue:{},multiple:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},options:{default:void 0}},emits:["update:modelValue"],setup(c,{emit:f}){const d=c,m=f,p=h(()=>d.options&&d.options.length?d.options:y),i=h(()=>(d.modelValue||"").split(",").map(a=>a.trim()).filter(Boolean));function v(a){return x(a)}function _(a){if(d.disabled)return;const n=i.value.slice(),e=n.indexOf(a);e>=0?n.splice(e,1):n.push(a),m("update:modelValue",n.join(","))}function b(a){m("update:modelValue",a.target.value)}return(a,n)=>(s(),t("div",L,[c.multiple?(s(),t(u,{key:0},[l("div",{class:C(["lang-chips",{"lang-disabled":c.disabled}])},[(s(!0),t(u,null,r(i.value,e=>(s(),t("span",{key:e,class:"lang-chip"},[B(o(e),1),l("span",O,o(v(e)),1),l("button",{type:"button",class:"lang-x",onClick:k=>_(e)},"×",8,S)]))),128)),i.value.length?g("",!0):(s(),t("span",j,"未选择语言"))],2),c.disabled?g("",!0):(s(),t("details",z,[l("summary",F,"+ 选择语言(已选 "+o(i.value.length)+")",1),l("div",I,[(s(!0),t(u,null,r(p.value,e=>(s(),t("label",{key:e.code,class:"lang-opt"},[l("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:i.value.includes(e.code),onChange:k=>_(e.code)},null,40,T),l("span",$,o(e.code),1),l("span",w,o(e.name),1)]))),128))])]))],64)):(s(),t("select",{key:1,class:"select select-bordered select-sm w-full text-xs",value:c.modelValue,disabled:c.disabled,onChange:b},[n[0]||(n[0]=l("option",{value:""},"(未设置)",-1)),(s(!0),t(u,null,r(p.value,e=>(s(),t("option",{key:e.code,value:e.code},o(e.code)+" · "+o(e.name),9,D))),128))],40,A))]))}}),q=Object.assign(N(E,[["__scopeId","data-v-4903af59"]]),{__name:"LangSelect"});export{q as _}; import{L as y,l as x}from"./ChQPCk92.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,z as h,o as s,d as B,_ as N}from"./mElhLwm2.js";const L={class:"lang-select"},O={class:"lang-chip-name"},S=["onClick"],j={key:0,class:"lang-empty"},z={key:0,class:"lang-dd"},F={class:"lang-dd-sum"},I={class:"lang-dd-panel"},T=["checked","onChange"],$={class:"lang-opt-code"},w={class:"lang-opt-name"},A=["value","disabled"],D=["value"],E=V({__name:"LangSelect",props:{modelValue:{},multiple:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},options:{default:void 0}},emits:["update:modelValue"],setup(c,{emit:f}){const d=c,m=f,p=h(()=>d.options&&d.options.length?d.options:y),i=h(()=>(d.modelValue||"").split(",").map(a=>a.trim()).filter(Boolean));function v(a){return x(a)}function _(a){if(d.disabled)return;const n=i.value.slice(),e=n.indexOf(a);e>=0?n.splice(e,1):n.push(a),m("update:modelValue",n.join(","))}function b(a){m("update:modelValue",a.target.value)}return(a,n)=>(s(),t("div",L,[c.multiple?(s(),t(u,{key:0},[l("div",{class:C(["lang-chips",{"lang-disabled":c.disabled}])},[(s(!0),t(u,null,r(i.value,e=>(s(),t("span",{key:e,class:"lang-chip"},[B(o(e),1),l("span",O,o(v(e)),1),l("button",{type:"button",class:"lang-x",onClick:k=>_(e)},"×",8,S)]))),128)),i.value.length?g("",!0):(s(),t("span",j,"未选择语言"))],2),c.disabled?g("",!0):(s(),t("details",z,[l("summary",F,"+ 选择语言(已选 "+o(i.value.length)+")",1),l("div",I,[(s(!0),t(u,null,r(p.value,e=>(s(),t("label",{key:e.code,class:"lang-opt"},[l("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:i.value.includes(e.code),onChange:k=>_(e.code)},null,40,T),l("span",$,o(e.code),1),l("span",w,o(e.name),1)]))),128))])]))],64)):(s(),t("select",{key:1,class:"select select-bordered select-sm w-full text-xs",value:c.modelValue,disabled:c.disabled,onChange:b},[n[0]||(n[0]=l("option",{value:""},"(未设置)",-1)),(s(!0),t(u,null,r(p.value,e=>(s(),t("option",{key:e.code,value:e.code},o(e.code)+" · "+o(e.name),9,D))),128))],40,A))]))}}),q=Object.assign(N(E,[["__scopeId","data-v-4903af59"]]),{__name:"LangSelect"});export{q as _};

2
apps/admin/.output/public/_nuxt/CCYeqIml.js → apps/admin/.output/public/_nuxt/CvHBDjjq.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/zsrSRWp_.js → apps/admin/.output/public/_nuxt/CyqrlMkw.js

@ -1 +1 @@
import{_ as t,o,c as s,R as c}from"./Ccu6Xgpt.js";const r={},a={class:"min-h-screen","data-theme":"corporate"};function n(e,_){return o(),s("div",a,[c(e.$slots,"default")])}const l=t(r,[["render",n]]);export{l as default}; import{_ as t,o,c as s,R as c}from"./mElhLwm2.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};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CAgv4ClK.js → apps/admin/.output/public/_nuxt/D-lUY2ZC.js

@ -1,4 +1,4 @@
import{g as G,B as K,Q as P,c as a,a as e,d as u,p as x,q as M,F as f,r as U,v as Q,s as Y,t as n,x as i,z as E,o,n as F,l as I,_ as Z}from"./Ccu6Xgpt.js";import{u as J}from"./Um-KoueI.js";import{u as W}from"./DvwKXRUn.js";import"./CH2ZVAK2.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=G({__name:"statlog",setup(Ct){const{webApi:A}=J(),{success:O,error:R}=W(),z={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?z[l]||l:"-"}const c=i([]),_=i(!1),g=i(""),L=i("-"),N=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function S(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const V=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function B(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function H(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+S(t.product_id)+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await A("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function j(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗? import{g as G,B as K,Q as P,c as a,a as e,d as u,p as x,q as M,F as f,r as U,v as Q,s as Y,t as n,x as i,z as E,o,n as F,l as I,_ as Z}from"./mElhLwm2.js";import{u as J}from"./C6twYRfy.js";import{u as W}from"./FVTAbpot.js";import"./qig5Qp6S.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=G({__name:"statlog",setup(Ct){const{webApi:A}=J(),{success:O,error:R}=W(),z={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?z[l]||l:"-"}const c=i([]),_=i(!1),g=i(""),L=i("-"),N=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function S(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const V=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function B(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function H(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+S(t.product_id)+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await A("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function j(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗?
只清除本核对面板的记录,不影响已落库的统计数据。 只清除本核对面板的记录,不影响已落库的统计数据。
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await A("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function q(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return K(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[x(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,U(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[M,v.value,void 0,{number:!0}]]),x(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[M,b.value]]),x(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品"},null,512),[[Q,h.value]]),e("label",st,[x(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:q},null,544),[[Y,w.value]]),s[5]||(s[5]=u(" 自动刷新 ",-1))]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:m},"刷新"),e("button",{class:"btn btn-outline btn-error btn-sm",title:"清空本日核对流水(不影响已落库的统计数据),清空后可重新观察埋点是否正常进来",onClick:j},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(N.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[_.value?(o(),a("div",ct,"加载中...")):g.value?(o(),a("div",dt,"加载失败:"+n(g.value),1)):T.value.length?(o(!0),a(f,{key:3},U(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",B(t.level).cls])},n(B(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?I("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(S(t.product_id)),1)]),e("div",yt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",bt," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=Z(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default}; 清空后可重新触发埋点,观察是否正常进来。`))try{const r=await A("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function q(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return K(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[x(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,U(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[M,v.value,void 0,{number:!0}]]),x(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[M,b.value]]),x(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品"},null,512),[[Q,h.value]]),e("label",st,[x(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:q},null,544),[[Y,w.value]]),s[5]||(s[5]=u(" 自动刷新 ",-1))]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:m},"刷新"),e("button",{class:"btn btn-outline btn-error btn-sm",title:"清空本日核对流水(不影响已落库的统计数据),清空后可重新观察埋点是否正常进来",onClick:j},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(N.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[_.value?(o(),a("div",ct,"加载中...")):g.value?(o(),a("div",dt,"加载失败:"+n(g.value),1)):T.value.length?(o(!0),a(f,{key:3},U(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",B(t.level).cls])},n(B(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?I("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(S(t.product_id)),1)]),e("div",yt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",bt," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=Z(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DdRUm5PD.js → apps/admin/.output/public/_nuxt/DACw1I5K.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Sgx9LvLK.js → apps/admin/.output/public/_nuxt/DG0IG_4u.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CGLKuRNo.js → apps/admin/.output/public/_nuxt/DGSd_XG-.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DNpGoo60.js → apps/admin/.output/public/_nuxt/Db4U27_j.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/vijQW-l0.js → apps/admin/.output/public/_nuxt/Ddg4glGj.js

@ -1 +1 @@
import{_ as s}from"./DiXjRAbV.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./Ccu6Xgpt.js";import{u as f}from"./oiJG5Pzc.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"./DuRQSWLc.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./mElhLwm2.js";import{u as f}from"./OLpUuA7c.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};

2
apps/admin/.output/public/_nuxt/DiXjRAbV.js → apps/admin/.output/public/_nuxt/DuRQSWLc.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DazkwkSm.js → apps/admin/.output/public/_nuxt/DwmKnEeH.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DvwKXRUn.js → apps/admin/.output/public/_nuxt/FVTAbpot.js

@ -1 +1 @@
import{a as u}from"./CH2ZVAK2.js";let i=0;function f(){const o=u("app:toasts",()=>[]);function e(s,t="info",r=3e3){const a=++i;o.value.push({id:a,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(n=>n.id!==a)},r)}return{toasts:o,toast:e,success:(s,t)=>e(s,"success",t),error:(s,t)=>e(s,"error",t),info:(s,t)=>e(s,"info",t),warn:(s,t)=>e(s,"warning",t)}}export{f as u}; import{a as u}from"./qig5Qp6S.js";let i=0;function f(){const o=u("app:toasts",()=>[]);function e(s,t="info",r=3e3){const a=++i;o.value.push({id:a,type:t,msg:s}),r>0&&setTimeout(()=>{o.value=o.value.filter(n=>n.id!==a)},r)}return{toasts:o,toast:e,success:(s,t)=>e(s,"success",t),error:(s,t)=>e(s,"error",t),info:(s,t)=>e(s,"info",t),warn:(s,t)=>e(s,"warning",t)}}export{f as u};

2
apps/admin/.output/public/_nuxt/C37X9GaT.js → apps/admin/.output/public/_nuxt/G5UJCii2.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/GZG--rps.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/oiJG5Pzc.js → apps/admin/.output/public/_nuxt/OLpUuA7c.js

@ -1 +1 @@
import{u as a,e as s,h as u,i as r,f as h}from"./Ccu6Xgpt.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"./mElhLwm2.js";function i(t){const e=t||s();return e.ssrContext?.head||e.runWithContext(()=>{if(u()){const n=r(h);if(!n)throw new Error("[nuxt] [unhead] Missing Unhead instance.");return n}})}function d(t,e={}){const n=e.head||i(e.nuxt);return a(t,{head:n,...e})}export{d as u};

1
apps/admin/.output/public/_nuxt/PN667bHc.js

@ -0,0 +1 @@
const a={1:"中国",2:"美国",3:"东亚",4:"东南亚",5:"南亚",6:"中东",7:"欧洲",8:"俄罗斯",9:"非洲",10:"南美",11:"北美",12:"大洋洲",13:"巴西",14:"印度"},o={1:"STT",2:"TTS",3:"MT",4:"AST",5:"文本LLM",6:"存储",7:"STS",8:"录音识别",9:"多媒体LLM",10:"MCP"},l={error:{label:"不可用",color:"#be123c",bg:"#ffe4e6"},warn:{label:"有隐患",color:"#b45309",bg:"#fef3c7"},ok:{label:"正常",color:"#047857",bg:"#d1fae5"},skip:{label:"已停用",color:"#64748b",bg:"#f1f5f9"}},s={credential:{label:"凭据已验证",hint:"已用真实凭据调通服务商接口"},reachable:{label:"仅连通性",hint:"地址可达,但未验证凭据是否有效"},none:{label:"未探测",hint:"暂无该服务商的探针,可用性未经验证"}};function i(r){const e=r.config_issues||[],n=e.filter(t=>t.startsWith("[致命] "));return n.length?n.map(t=>t.replace("[致命] ","")).join(";"):r.status==="error"?r.probe_msg||"巡检失败":e.length?e.join(";"):r.probe_kind==="none"?r.probe_msg||"未验证可用性":r.probe_msg||""}function f(r){if(!r)return"尚未执行";const e=Date.now()-r;return e<6e4?"刚刚":e<36e5?`${Math.floor(e/6e4)} 分钟前`:e<864e5?`${Math.floor(e/36e5)} 小时前`:new Date(r).toLocaleString("zh-CN",{hour12:!1})}function b(r){return(r||"").split(",").map(e=>Number(e.trim())).filter(e=>!Number.isNaN(e)&&e>0)}export{o as C,s as P,a as R,l as S,i as a,f as h,b as p};

2
apps/admin/.output/public/_nuxt/B3qpHAjq.js → apps/admin/.output/public/_nuxt/VVFxpwIU.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/builds/latest.json

@ -1 +1 @@
{"id":"1c187759-8384-4449-899e-e6f5237cf6d9","timestamp":1785495714123} {"id":"1ce432df-603d-4010-810b-770972167d80","timestamp":1785747952724}

1
apps/admin/.output/public/_nuxt/builds/meta/1c187759-8384-4449-899e-e6f5237cf6d9.json

@ -1 +0,0 @@
{"id":"1c187759-8384-4449-899e-e6f5237cf6d9","timestamp":1785495714123,"prerendered":[]}

1
apps/admin/.output/public/_nuxt/builds/meta/1ce432df-603d-4010-810b-770972167d80.json

@ -0,0 +1 @@
{"id":"1ce432df-603d-4010-810b-770972167d80","timestamp":1785747952724,"prerendered":[]}

1
apps/admin/.output/public/_nuxt/dashboard.CT4jXDd_.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/dashboard.bI0rfjl_.css

@ -1 +0,0 @@
.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}

1
apps/admin/.output/public/_nuxt/entry.BR7WYV0V.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/entry.Nq-dPCOq.css

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/k7DeUBTv.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/Dtlyyukj.js → apps/admin/.output/public/_nuxt/l8H0VyaU.js

File diff suppressed because one or more lines are too long

6
apps/admin/.output/public/_nuxt/Ccu6Xgpt.js → apps/admin/.output/public/_nuxt/mElhLwm2.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BFWR6QZ6.js → apps/admin/.output/public/_nuxt/ncAT-iHw.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CH2ZVAK2.js → apps/admin/.output/public/_nuxt/qig5Qp6S.js

@ -1 +1 @@
import{e as f,a9 as p,aa as c,z as r}from"./Ccu6Xgpt.js";const l="$s";function y(...t){const a=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(a);const[n,e]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(e!==void 0&&typeof e!="function")throw new Error("[nuxt] [useState] init must be a function: "+e);const i=l+n,u=f(),s=p(u.payload.state,i);if(e&&(u._state[i]??={_default:e}),s.value===void 0&&e){const o=e();if(c(o))return u.payload.state[i]=o,o;s.value=o}return s}function v(){const t=y("app:loading",()=>0),a=r(()=>t.value>0);function n(){t.value++}function e(){t.value=Math.max(0,t.value-1)}return{count:t,loading:a,begin:n,end:e}}export{y as a,v as u}; import{e as f,a9 as p,aa as c,z as r}from"./mElhLwm2.js";const l="$s";function y(...t){const a=typeof t[t.length-1]=="string"?t.pop():void 0;typeof t[0]!="string"&&t.unshift(a);const[n,e]=t;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(e!==void 0&&typeof e!="function")throw new Error("[nuxt] [useState] init must be a function: "+e);const i=l+n,u=f(),s=p(u.payload.state,i);if(e&&(u._state[i]??={_default:e}),s.value===void 0&&e){const o=e();if(c(o))return u.payload.state[i]=o,o;s.value=o}return s}function v(){const t=y("app:loading",()=>0),a=r(()=>t.value>0);function n(){t.value++}function e(){t.value=Math.max(0,t.value-1)}return{count:t,loading:a,begin:n,end:e}}export{y as a,v as u};

1
apps/admin/.output/public/_nuxt/svcinspect.H9TdRqZ5.css

@ -0,0 +1 @@
.panel[data-v-a9764f3a]{background:#fff;border:1px solid #f1f5f9;border-radius:16px;box-shadow:0 1px 2px #0000000a;overflow:hidden}.panel-head[data-v-a9764f3a]{padding:12px 18px;gap:10px;border-bottom:1px solid #f8fafc;flex-wrap:wrap}.panel-head[data-v-a9764f3a],.sum-card[data-v-a9764f3a]{display:flex;align-items:center}.sum-card[data-v-a9764f3a]{gap:11px;background:#f8fafc;border:1px solid #eef2f7;border-radius:12px;padding:10px 13px;cursor:pointer;transition:all .15s}.sum-card[data-v-a9764f3a]:hover{border-color:#cbd5e1}.sum-card.on[data-v-a9764f3a]{border-color:#0f172a;background:#fff;box-shadow:inset 0 0 0 1px #0f172a}.sum-ico[data-v-a9764f3a]{width:30px;height:30px;border-radius:9px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:14px}.sum-lbl[data-v-a9764f3a]{font-size:11.5px;color:#94a3b8;line-height:1.2}.sum-val[data-v-a9764f3a]{font-size:19px;font-weight:700;line-height:1.3;letter-spacing:-.01em}.st-badge[data-v-a9764f3a]{font-size:11px;font-weight:700;padding:2px 9px;border-radius:999px;white-space:nowrap}.streak[data-v-a9764f3a]{font-size:10.5px;color:#be123c;margin-top:3px;font-weight:600}.chip[data-v-a9764f3a]{display:inline-block;font-size:11px;padding:1px 7px;border-radius:999px;background:#f1f5f9;color:#64748b;margin-right:4px;white-space:nowrap}.chip-scope[data-v-a9764f3a]{background:#e0e7ff;color:#4338ca}.chip-region[data-v-a9764f3a]{background:#cffafe;color:#0e7490}.pk-credential[data-v-a9764f3a]{background:#d1fae5;color:#047857}.pk-reachable[data-v-a9764f3a]{background:#fef3c7;color:#b45309}.pk-none[data-v-a9764f3a]{background:#f1f5f9;color:#94a3b8}.reason-cell[data-v-a9764f3a]{max-width:420px;font-size:12px;line-height:1.5}.issue-list[data-v-a9764f3a]{margin-top:3px}.issue[data-v-a9764f3a]{font-size:11px;color:#94a3b8}

8
apps/admin/.output/server/chunks/build/SvcAlertBanner-styles.C9CJuYwV.mjs

@ -0,0 +1,8 @@
import { S as SvcAlertBanner_vue_vue_type_style_index_0_scoped_3dd2fb7c_lang } from './dashboard-styles-1.mjs-CFxtv9Pt.mjs';
const SvcAlertBannerStyles_C9CJuYwV = [
SvcAlertBanner_vue_vue_type_style_index_0_scoped_3dd2fb7c_lang
];
export { SvcAlertBannerStyles_C9CJuYwV as default };
//# sourceMappingURL=SvcAlertBanner-styles.C9CJuYwV.mjs.map

1
apps/admin/.output/server/chunks/build/SvcAlertBanner-styles.C9CJuYwV.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"SvcAlertBanner-styles.C9CJuYwV.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/SvcAlertBanner-styles.C9CJuYwV.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0]}

2
apps/admin/.output/server/chunks/build/client.precomputed.mjs

File diff suppressed because one or more lines are too long

180
apps/admin/.output/server/chunks/build/dashboard-CeM8vxnU.mjs → apps/admin/.output/server/chunks/build/dashboard-CXdhxG8p.mjs

@ -1,7 +1,9 @@
import { defineComponent, computed, reactive, ref, useSSRContext } from 'vue'; import { _ as __nuxt_component_0$1 } from './nuxt-link-BsKoUOa0.mjs';
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass } from 'vue/server-renderer'; import { defineComponent, computed, reactive, ref, mergeProps, unref, withCtx, createTextVNode, useSSRContext } from 'vue';
import { _ as _export_sfc, a as useAuthStore } from './server.mjs'; import { ssrRenderAttrs, ssrRenderComponent, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs'; import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { h as healthLastRunText, R as REGION_LABEL, a as healthReason } from './svchealth-8zW8U1Ef.mjs';
import { _ as _export_sfc, a as useAuthStore } from './server.mjs';
import '../nitro/nitro.mjs'; import '../nitro/nitro.mjs';
import 'node:http'; import 'node:http';
import 'node:https'; import 'node:https';
@ -11,6 +13,7 @@ import 'node:fs';
import 'node:path'; import 'node:path';
import 'node:crypto'; import 'node:crypto';
import 'node:url'; import 'node:url';
import './useLoading-D4zrSa2m.mjs';
import '../routes/renderer.mjs'; import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime'; import 'vue-bundle-renderer/runtime';
import 'unhead/server'; import 'unhead/server';
@ -18,8 +21,128 @@ import 'devalue';
import 'unhead/utils'; import 'unhead/utils';
import 'pinia'; import 'pinia';
import 'perfect-debounce'; import 'perfect-debounce';
import './useLoading-D4zrSa2m.mjs';
const LIMIT = 12;
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
__name: "SvcAlertBanner",
__ssrInlineRender: true,
setup(__props, { expose: __expose }) {
const { webApi } = useApi();
const alerts = ref([]);
const errorCount = ref(0);
const warnCount = ref(0);
const lastRun = ref(0);
const expanded = ref(false);
const truncated = ref(false);
const lastRunText = computed(() => healthLastRunText(lastRun.value));
function scopeText(a) {
const app = a.app_name ? a.app_name : "全局";
return a.region ? `${app} · ${REGION_LABEL[a.region] || "区域" + a.region}` : app;
}
function reasonOf(a) {
return healthReason(a);
}
async function load() {
try {
const res = await webApi("getsvcalerts", { limit: LIMIT });
alerts.value = res.alerts || [];
errorCount.value = res.error_count || 0;
warnCount.value = res.warn_count || 0;
lastRun.value = res.last_run || 0;
truncated.value = errorCount.value + warnCount.value > alerts.value.length;
expanded.value = errorCount.value > 0;
} catch {
alerts.value = [];
errorCount.value = 0;
warnCount.value = 0;
}
}
__expose({ load });
return (_ctx, _push, _parent, _attrs) => {
const _component_NuxtLink = __nuxt_component_0$1;
if (errorCount.value + warnCount.value > 0) {
_push(`<div${ssrRenderAttrs(mergeProps({
class: ["alert-banner", errorCount.value > 0 ? "lv-error" : "lv-warn"]
}, _attrs))} data-v-3dd2fb7c><div class="ab-head" data-v-3dd2fb7c><span class="ab-ico" data-v-3dd2fb7c>${ssrInterpolate(errorCount.value > 0 ? "🚨" : "⚠️")}</span><div class="ab-title" data-v-3dd2fb7c><strong data-v-3dd2fb7c>${ssrInterpolate(errorCount.value > 0 ? `${errorCount.value} 项第三方服务不可用` : `${warnCount.value} 项第三方服务存在隐患`)}</strong>`);
if (errorCount.value > 0 && warnCount.value > 0) {
_push(`<span class="ab-sub" data-v-3dd2fb7c>,另有 ${ssrInterpolate(warnCount.value)} 项隐患</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="ab-sub" data-v-3dd2fb7c> · 最近巡检 ${ssrInterpolate(unref(lastRunText))}</span></div><button class="ab-btn" data-v-3dd2fb7c>${ssrInterpolate(expanded.value ? "收起" : "展开详情")}</button>`);
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/svcinspect",
class: "ab-btn ab-btn-primary"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`前往巡检`);
} else {
return [
createTextVNode("前往巡检")
];
}
}),
_: 1
}, _parent));
_push(`</div>`);
if (expanded.value) {
_push(`<div class="ab-list" data-v-3dd2fb7c><!--[-->`);
ssrRenderList(alerts.value, (a) => {
_push(`<div class="ab-item" data-v-3dd2fb7c><span class="${ssrRenderClass([a.status === "error" ? "d-error" : "d-warn", "ab-dot"])}" data-v-3dd2fb7c></span><span class="ab-name" data-v-3dd2fb7c>${ssrInterpolate(a.name || a.svc_id)}</span>`);
if (a.provider) {
_push(`<span class="ab-chip" data-v-3dd2fb7c>${ssrInterpolate(a.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`<span class="ab-chip ab-chip-scope" data-v-3dd2fb7c>${ssrInterpolate(scopeText(a))}</span><span class="ab-msg" data-v-3dd2fb7c>${ssrInterpolate(reasonOf(a))}</span>`);
if (a.fail_streak > 1) {
_push(`<span class="ab-streak" data-v-3dd2fb7c>连续失败 ${ssrInterpolate(a.fail_streak)} 次</span>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
});
_push(`<!--]-->`);
if (truncated.value) {
_push(`<div class="ab-more" data-v-3dd2fb7c> 仅显示前 ${ssrInterpolate(alerts.value.length)} 条,其余请到`);
_push(ssrRenderComponent(_component_NuxtLink, {
to: "/svcinspect",
class: "ab-link"
}, {
default: withCtx((_, _push2, _parent2, _scopeId) => {
if (_push2) {
_push2(`服务巡检`);
} else {
return [
createTextVNode("服务巡检")
];
}
}),
_: 1
}, _parent));
_push(`查看 </div>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
} else {
_push(`<!---->`);
}
};
}
});
const _sfc_setup$1 = _sfc_main$1.setup;
_sfc_main$1.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/SvcAlertBanner.vue");
return _sfc_setup$1 ? _sfc_setup$1(props, ctx) : void 0;
};
const __nuxt_component_0 = /* @__PURE__ */ Object.assign(_export_sfc(_sfc_main$1, [["__scopeId", "data-v-3dd2fb7c"]]), { __name: "SvcAlertBanner" });
const _sfc_main = /* @__PURE__ */ defineComponent({ const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "dashboard", __name: "dashboard",
__ssrInlineRender: true, __ssrInlineRender: true,
@ -199,53 +322,56 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
return fmtStat((panelStats.value[p.key] || {})[s[0]], s[2], s[3]); return fmtStat((panelStats.value[p.key] || {})[s[0]], s[2], s[3]);
} }
return (_ctx, _push, _parent, _attrs) => { return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-7dbe8712><div class="panel p-4 mb-5" data-v-7dbe8712><div class="flex flex-wrap items-end gap-3" data-v-7dbe8712><div class="form-control" data-v-7dbe8712><label class="label py-1" data-v-7dbe8712><span class="label-text text-xs text-slate-500" data-v-7dbe8712>应用</span></label><select class="select select-bordered select-sm w-40" data-v-7dbe8712><option value="" data-v-7dbe8712${ssrIncludeBooleanAttr(Array.isArray(filters.app) ? ssrLooseContain(filters.app, "") : ssrLooseEqual(filters.app, "")) ? " selected" : ""}>全部应用</option><!--[-->`); const _component_SvcAlertBanner = __nuxt_component_0;
_push(`<div${ssrRenderAttrs(_attrs)} data-v-0c034b8c>`);
_push(ssrRenderComponent(_component_SvcAlertBanner, null, null, _parent));
_push(`<div class="panel p-4 mb-5" data-v-0c034b8c><div class="flex flex-wrap items-end gap-3" data-v-0c034b8c><div class="form-control" data-v-0c034b8c><label class="label py-1" data-v-0c034b8c><span class="label-text text-xs text-slate-500" data-v-0c034b8c>应用</span></label><select class="select select-bordered select-sm w-40" data-v-0c034b8c><option value="" data-v-0c034b8c${ssrIncludeBooleanAttr(Array.isArray(filters.app) ? ssrLooseContain(filters.app, "") : ssrLooseEqual(filters.app, "")) ? " selected" : ""}>全部应用</option><!--[-->`);
ssrRenderList(appOptions.value, (a) => { ssrRenderList(appOptions.value, (a) => {
_push(`<option${ssrRenderAttr("value", a.value)} data-v-7dbe8712${ssrIncludeBooleanAttr(Array.isArray(filters.app) ? ssrLooseContain(filters.app, a.value) : ssrLooseEqual(filters.app, a.value)) ? " selected" : ""}>${ssrInterpolate(a.label)}</option>`); _push(`<option${ssrRenderAttr("value", a.value)} data-v-0c034b8c${ssrIncludeBooleanAttr(Array.isArray(filters.app) ? ssrLooseContain(filters.app, a.value) : ssrLooseEqual(filters.app, a.value)) ? " selected" : ""}>${ssrInterpolate(a.label)}</option>`);
}); });
_push(`<!--]--></select></div><div class="form-control" data-v-7dbe8712><label class="label py-1" data-v-7dbe8712><span class="label-text text-xs text-slate-500" data-v-7dbe8712>区域</span></label><select class="select select-bordered select-sm w-32" data-v-7dbe8712><option value="" data-v-7dbe8712${ssrIncludeBooleanAttr(Array.isArray(filters.region) ? ssrLooseContain(filters.region, "") : ssrLooseEqual(filters.region, "")) ? " selected" : ""}>全部区域</option><!--[-->`); _push(`<!--]--></select></div><div class="form-control" data-v-0c034b8c><label class="label py-1" data-v-0c034b8c><span class="label-text text-xs text-slate-500" data-v-0c034b8c>区域</span></label><select class="select select-bordered select-sm w-32" data-v-0c034b8c><option value="" data-v-0c034b8c${ssrIncludeBooleanAttr(Array.isArray(filters.region) ? ssrLooseContain(filters.region, "") : ssrLooseEqual(filters.region, "")) ? " selected" : ""}>全部区域</option><!--[-->`);
ssrRenderList(regionOptions.value, (r) => { ssrRenderList(regionOptions.value, (r) => {
_push(`<option${ssrRenderAttr("value", r.value)} data-v-7dbe8712${ssrIncludeBooleanAttr(Array.isArray(filters.region) ? ssrLooseContain(filters.region, r.value) : ssrLooseEqual(filters.region, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`); _push(`<option${ssrRenderAttr("value", r.value)} data-v-0c034b8c${ssrIncludeBooleanAttr(Array.isArray(filters.region) ? ssrLooseContain(filters.region, r.value) : ssrLooseEqual(filters.region, r.value)) ? " selected" : ""}>${ssrInterpolate(r.label)}</option>`);
}); });
_push(`<!--]--></select></div><div class="form-control" data-v-7dbe8712><label class="label py-1" data-v-7dbe8712><span class="label-text text-xs text-slate-500" data-v-7dbe8712>产品</span></label><select class="select select-bordered select-sm w-48" data-v-7dbe8712><option value="" data-v-7dbe8712${ssrIncludeBooleanAttr(Array.isArray(filters.product) ? ssrLooseContain(filters.product, "") : ssrLooseEqual(filters.product, "")) ? " selected" : ""}>全部产品</option><!--[-->`); _push(`<!--]--></select></div><div class="form-control" data-v-0c034b8c><label class="label py-1" data-v-0c034b8c><span class="label-text text-xs text-slate-500" data-v-0c034b8c>产品</span></label><select class="select select-bordered select-sm w-48" data-v-0c034b8c><option value="" data-v-0c034b8c${ssrIncludeBooleanAttr(Array.isArray(filters.product) ? ssrLooseContain(filters.product, "") : ssrLooseEqual(filters.product, "")) ? " selected" : ""}>全部产品</option><!--[-->`);
ssrRenderList(productOptions.value, (p) => { ssrRenderList(productOptions.value, (p) => {
_push(`<option${ssrRenderAttr("value", p.value)} data-v-7dbe8712${ssrIncludeBooleanAttr(Array.isArray(filters.product) ? ssrLooseContain(filters.product, p.value) : ssrLooseEqual(filters.product, p.value)) ? " selected" : ""}>${ssrInterpolate(p.label)}</option>`); _push(`<option${ssrRenderAttr("value", p.value)} data-v-0c034b8c${ssrIncludeBooleanAttr(Array.isArray(filters.product) ? ssrLooseContain(filters.product, p.value) : ssrLooseEqual(filters.product, p.value)) ? " selected" : ""}>${ssrInterpolate(p.label)}</option>`);
}); });
_push(`<!--]--></select></div><button class="btn btn-primary btn-sm text-white" data-v-7dbe8712>查询</button><span class="text-xs text-slate-400 ml-auto self-center" data-v-7dbe8712>顶部为全量总览;各版面右上角可单独选时间周期</span></div></div><div class="sec-title muted" data-v-7dbe8712><span class="bar" style="${ssrRenderStyle({ "background": "#cbd5e1" })}" data-v-7dbe8712></span><h2 data-v-7dbe8712>累计数据</h2><span class="sub" data-v-7dbe8712>全量累计 · 随筛选条件变化</span></div><div class="grid grid-cols-2 md:grid-cols-4 gap-3 mb-8" data-v-7dbe8712><!--[-->`); _push(`<!--]--></select></div><button class="btn btn-primary btn-sm text-white" data-v-0c034b8c>查询</button><span class="text-xs text-slate-400 ml-auto self-center" data-v-0c034b8c>顶部为全量总览;各版面右上角可单独选时间周期</span></div></div><div class="sec-title muted" data-v-0c034b8c><span class="bar" style="${ssrRenderStyle({ "background": "#cbd5e1" })}" data-v-0c034b8c></span><h2 data-v-0c034b8c>累计数据</h2><span class="sub" data-v-0c034b8c>全量累计 · 随筛选条件变化</span></div><div class="grid grid-cols-2 md:grid-cols-4 gap-3 mb-8" data-v-0c034b8c><!--[-->`);
ssrRenderList(globalCards.value, (c) => { ssrRenderList(globalCards.value, (c) => {
_push(`<div class="cum-card" data-v-7dbe8712><span class="ico" style="${ssrRenderStyle({ background: cardStyle(c[0])[1] })}" data-v-7dbe8712>${ssrInterpolate(cardStyle(c[0])[0])}</span><div class="body" data-v-7dbe8712><div class="lbl" data-v-7dbe8712>${ssrInterpolate(c[1])}</div><div class="val" data-v-7dbe8712>${ssrInterpolate(globalVal(c))}</div></div></div>`); _push(`<div class="cum-card" data-v-0c034b8c><span class="ico" style="${ssrRenderStyle({ background: cardStyle(c[0])[1] })}" data-v-0c034b8c>${ssrInterpolate(cardStyle(c[0])[0])}</span><div class="body" data-v-0c034b8c><div class="lbl" data-v-0c034b8c>${ssrInterpolate(c[1])}</div><div class="val" data-v-0c034b8c>${ssrInterpolate(globalVal(c))}</div></div></div>`);
}); });
_push(`<!--]--></div><div class="today-wrap mb-8" data-v-7dbe8712><div class="sec-title hero" style="${ssrRenderStyle({ "margin-bottom": "16px" })}" data-v-7dbe8712><span class="bar" style="${ssrRenderStyle({ "background": "linear-gradient(180deg,#0EA5E9,#22D3EE)" })}" data-v-7dbe8712></span><h2 data-v-7dbe8712>今日数据</h2><span class="tag" style="${ssrRenderStyle({ "color": "#0369a1", "background": "#dbeafe" })}" data-v-7dbe8712>${ssrInterpolate(todayTag.value)}</span><span class="sub" data-v-7dbe8712>今日 0 点至现在 · 含较昨日同比(设备类无日期维度,仅见累计)</span></div><div class="grid grid-cols-2 md:grid-cols-4 gap-4" data-v-7dbe8712><!--[-->`); _push(`<!--]--></div><div class="today-wrap mb-8" data-v-0c034b8c><div class="sec-title hero" style="${ssrRenderStyle({ "margin-bottom": "16px" })}" data-v-0c034b8c><span class="bar" style="${ssrRenderStyle({ "background": "linear-gradient(180deg,#0EA5E9,#22D3EE)" })}" data-v-0c034b8c></span><h2 data-v-0c034b8c>今日数据</h2><span class="tag" style="${ssrRenderStyle({ "color": "#0369a1", "background": "#dbeafe" })}" data-v-0c034b8c>${ssrInterpolate(todayTag.value)}</span><span class="sub" data-v-0c034b8c>今日 0 点至现在 · 含较昨日同比(设备类无日期维度,仅见累计)</span></div><div class="grid grid-cols-2 md:grid-cols-4 gap-4" data-v-0c034b8c><!--[-->`);
ssrRenderList(todayCards.value, (c) => { ssrRenderList(todayCards.value, (c) => {
_push(`<div class="today-card" data-v-7dbe8712><span class="accent" style="${ssrRenderStyle({ background: cardStyle(c[0])[2] })}" data-v-7dbe8712></span><div class="today-card-top" data-v-7dbe8712><span class="lbl" data-v-7dbe8712>${ssrInterpolate(c[1])}</span><span class="ico" style="${ssrRenderStyle({ background: cardStyle(c[0])[1] })}" data-v-7dbe8712>${ssrInterpolate(cardStyle(c[0])[0])}</span></div><div class="val" data-v-7dbe8712>${ssrInterpolate(todayVal(c))}</div><div class="foot" data-v-7dbe8712>`); _push(`<div class="today-card" data-v-0c034b8c><span class="accent" style="${ssrRenderStyle({ background: cardStyle(c[0])[2] })}" data-v-0c034b8c></span><div class="today-card-top" data-v-0c034b8c><span class="lbl" data-v-0c034b8c>${ssrInterpolate(c[1])}</span><span class="ico" style="${ssrRenderStyle({ background: cardStyle(c[0])[1] })}" data-v-0c034b8c>${ssrInterpolate(cardStyle(c[0])[0])}</span></div><div class="val" data-v-0c034b8c>${ssrInterpolate(todayVal(c))}</div><div class="foot" data-v-0c034b8c>`);
if (todayDelta(c).type === "new") { if (todayDelta(c).type === "new") {
_push(`<span class="delta up" data-v-7dbe8712>新</span>`); _push(`<span class="delta up" data-v-0c034b8c>新</span>`);
} else if (todayDelta(c).type !== "none") { } else if (todayDelta(c).type !== "none") {
_push(`<span class="${ssrRenderClass([todayDelta(c).type, "delta"])}" data-v-7dbe8712>${ssrInterpolate(todayDelta(c).arrow)} ${ssrInterpolate(todayDelta(c).abs)}%</span>`); _push(`<span class="${ssrRenderClass([todayDelta(c).type, "delta"])}" data-v-0c034b8c>${ssrInterpolate(todayDelta(c).arrow)} ${ssrInterpolate(todayDelta(c).abs)}%</span>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
_push(`<span data-v-7dbe8712>较昨日</span></div></div>`); _push(`<span data-v-0c034b8c>较昨日</span></div></div>`);
}); });
_push(`<!--]--></div></div><div class="sec-title" data-v-7dbe8712><span class="bar" style="${ssrRenderStyle({ "background": "linear-gradient(180deg,#10B981,#22D3EE)" })}" data-v-7dbe8712></span><h2 data-v-7dbe8712>趋势分析</h2><span class="sub" data-v-7dbe8712>各版面右上角可独立选择时间周期</span></div><div class="grid grid-cols-1 xl:grid-cols-2 gap-6" data-v-7dbe8712><!--[-->`); _push(`<!--]--></div></div><div class="sec-title" data-v-0c034b8c><span class="bar" style="${ssrRenderStyle({ "background": "linear-gradient(180deg,#10B981,#22D3EE)" })}" data-v-0c034b8c></span><h2 data-v-0c034b8c>趋势分析</h2><span class="sub" data-v-0c034b8c>各版面右上角可独立选择时间周期</span></div><div class="grid grid-cols-1 xl:grid-cols-2 gap-6" data-v-0c034b8c><!--[-->`);
ssrRenderList(panels.value, (p) => { ssrRenderList(panels.value, (p) => {
_push(`<div class="panel" data-v-7dbe8712><div class="panel-head" data-v-7dbe8712><span class="panel-dot" style="${ssrRenderStyle({ background: p.tint })}" data-v-7dbe8712><svg width="17" height="17" fill="none" viewBox="0 0 24 24"${ssrRenderAttr("stroke", p.color)} data-v-7dbe8712><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"${ssrRenderAttr("d", p.icon)} data-v-7dbe8712></path></svg></span><span class="font-semibold text-slate-700 text-sm" data-v-7dbe8712>${ssrInterpolate(p.title)}</span>`); _push(`<div class="panel" data-v-0c034b8c><div class="panel-head" data-v-0c034b8c><span class="panel-dot" style="${ssrRenderStyle({ background: p.tint })}" data-v-0c034b8c><svg width="17" height="17" fill="none" viewBox="0 0 24 24"${ssrRenderAttr("stroke", p.color)} data-v-0c034b8c><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"${ssrRenderAttr("d", p.icon)} data-v-0c034b8c></path></svg></span><span class="font-semibold text-slate-700 text-sm" data-v-0c034b8c>${ssrInterpolate(p.title)}</span>`);
if (p.key === "device") { if (p.key === "device") {
_push(`<span class="ml-auto text-xs text-slate-400" data-v-7dbe8712>当前累计 · 无日期维度</span>`); _push(`<span class="ml-auto text-xs text-slate-400" data-v-0c034b8c>当前累计 · 无日期维度</span>`);
} else { } else {
_push(`<div class="ml-auto flex items-center gap-1" data-v-7dbe8712><!--[-->`); _push(`<div class="ml-auto flex items-center gap-1" data-v-0c034b8c><!--[-->`);
ssrRenderList(rangeBtns, (d) => { ssrRenderList(rangeBtns, (d) => {
_push(`<button class="${ssrRenderClass([{ "tbtn-on": d[0] === panelDays[p.key] }, "tbtn"])}" data-v-7dbe8712>${ssrInterpolate(d[1])}</button>`); _push(`<button class="${ssrRenderClass([{ "tbtn-on": d[0] === panelDays[p.key] }, "tbtn"])}" data-v-0c034b8c>${ssrInterpolate(d[1])}</button>`);
}); });
_push(`<!--]--></div>`); _push(`<!--]--></div>`);
} }
_push(`</div><div class="px-5 py-4" data-v-7dbe8712><div class="grid grid-cols-2 sm:grid-cols-3 gap-2.5" data-v-7dbe8712><!--[-->`); _push(`</div><div class="px-5 py-4" data-v-0c034b8c><div class="grid grid-cols-2 sm:grid-cols-3 gap-2.5" data-v-0c034b8c><!--[-->`);
ssrRenderList(p.stats, (s) => { ssrRenderList(p.stats, (s) => {
_push(`<div class="stat-box" data-v-7dbe8712><div class="stat-label" data-v-7dbe8712>${ssrInterpolate(s[1])}</div><div class="stat-val" data-v-7dbe8712>${ssrInterpolate(panelStatVal(p, s))}</div></div>`); _push(`<div class="stat-box" data-v-0c034b8c><div class="stat-label" data-v-0c034b8c>${ssrInterpolate(s[1])}</div><div class="stat-val" data-v-0c034b8c>${ssrInterpolate(panelStatVal(p, s))}</div></div>`);
}); });
_push(`<!--]--></div>`); _push(`<!--]--></div>`);
if (p.key !== "device") { if (p.key !== "device") {
_push(`<div style="${ssrRenderStyle({ "height": "170px", "margin-top": "1rem" })}" data-v-7dbe8712><canvas data-v-7dbe8712></canvas></div>`); _push(`<div style="${ssrRenderStyle({ "height": "170px", "margin-top": "1rem" })}" data-v-0c034b8c><canvas data-v-0c034b8c></canvas></div>`);
} else { } else {
_push(`<!---->`); _push(`<!---->`);
} }
@ -261,7 +387,7 @@ _sfc_main.setup = (props, ctx) => {
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/dashboard.vue"); (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/dashboard.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0; return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
}; };
const dashboard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-7dbe8712"]]); const dashboard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-0c034b8c"]]);
export { dashboard as default }; export { dashboard as default };
//# sourceMappingURL=dashboard-CeM8vxnU.mjs.map //# sourceMappingURL=dashboard-CXdhxG8p.mjs.map

1
apps/admin/.output/server/chunks/build/dashboard-CXdhxG8p.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"dashboard-CXdhxG8p.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-CXdhxG8p.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

1
apps/admin/.output/server/chunks/build/dashboard-CeM8vxnU.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"dashboard-CeM8vxnU.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-CeM8vxnU.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

4
apps/admin/.output/server/chunks/build/dashboard-styles-1.mjs-CFxtv9Pt.mjs

@ -0,0 +1,4 @@
const SvcAlertBanner_vue_vue_type_style_index_0_scoped_3dd2fb7c_lang = ".alert-banner[data-v-3dd2fb7c]{border-radius:14px;padding:12px 16px;margin-bottom:18px;border:1px solid}.lv-error[data-v-3dd2fb7c]{background:linear-gradient(180deg,#fff1f2,#fff7f7);border-color:#fecdd3}.lv-warn[data-v-3dd2fb7c]{background:linear-gradient(180deg,#fffbeb,#fffdf5);border-color:#fde68a}.ab-head[data-v-3dd2fb7c]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.ab-ico[data-v-3dd2fb7c]{font-size:17px;line-height:1}.ab-title[data-v-3dd2fb7c]{font-size:13px;color:#334155;flex:1;min-width:200px}.lv-error .ab-title strong[data-v-3dd2fb7c]{color:#be123c}.lv-warn .ab-title strong[data-v-3dd2fb7c]{color:#b45309}.ab-sub[data-v-3dd2fb7c]{color:#94a3b8;font-size:12px}.ab-btn[data-v-3dd2fb7c]{font-size:12px;padding:4px 11px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;color:#475569;white-space:nowrap}.ab-btn[data-v-3dd2fb7c]:hover{background:#f8fafc}.ab-btn-primary[data-v-3dd2fb7c]{background:#0f172a;border-color:#0f172a;color:#fff}.ab-btn-primary[data-v-3dd2fb7c]:hover{background:#1e293b}.ab-list[data-v-3dd2fb7c]{margin-top:10px;padding-top:10px;border-top:1px dashed rgba(148,163,184,.4);display:flex;flex-direction:column;gap:6px}.ab-item[data-v-3dd2fb7c]{display:flex;align-items:center;gap:8px;font-size:12.5px;color:#475569;flex-wrap:wrap}.ab-dot[data-v-3dd2fb7c]{width:7px;height:7px;border-radius:50%;flex-shrink:0}.d-error[data-v-3dd2fb7c]{background:#f43f5e}.d-warn[data-v-3dd2fb7c]{background:#f59e0b}.ab-name[data-v-3dd2fb7c]{font-weight:600;color:#1e293b}.ab-chip[data-v-3dd2fb7c]{font-size:11px;padding:1px 7px;border-radius:999px;background:#f1f5f9;color:#64748b}.ab-chip-scope[data-v-3dd2fb7c]{background:#e0e7ff;color:#4338ca}.ab-msg[data-v-3dd2fb7c]{color:#64748b;flex:1;min-width:160px}.ab-streak[data-v-3dd2fb7c]{font-size:11px;color:#be123c;font-weight:600}.ab-more[data-v-3dd2fb7c]{font-size:12px;color:#94a3b8;padding-top:2px}.ab-link[data-v-3dd2fb7c]{color:#4338ca;text-decoration:underline;margin:0 2px}";
export { SvcAlertBanner_vue_vue_type_style_index_0_scoped_3dd2fb7c_lang as S };
//# sourceMappingURL=dashboard-styles-1.mjs-CFxtv9Pt.mjs.map

1
apps/admin/.output/server/chunks/build/dashboard-styles-1.mjs-CFxtv9Pt.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"dashboard-styles-1.mjs-CFxtv9Pt.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-styles-1.mjs-CFxtv9Pt.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

11
apps/admin/.output/server/chunks/build/dashboard-styles.8Bs-G9zJ.mjs

@ -0,0 +1,11 @@
import { S as SvcAlertBanner_vue_vue_type_style_index_0_scoped_3dd2fb7c_lang } from './dashboard-styles-1.mjs-CFxtv9Pt.mjs';
const dashboard_vue_vue_type_style_index_0_scoped_0c034b8c_lang = ".panel[data-v-0c034b8c]{background:#fff;border:1px solid #f1f5f9;border-radius:16px;box-shadow:0 1px 2px #0000000a;overflow:hidden}.panel-head[data-v-0c034b8c]{padding:12px 18px;gap:10px;border-bottom:1px solid #f8fafc;flex-wrap:wrap}.panel-dot[data-v-0c034b8c],.panel-head[data-v-0c034b8c]{display:flex;align-items:center}.panel-dot[data-v-0c034b8c]{width:30px;height:30px;border-radius:9px;justify-content:center;flex-shrink:0}.stat-box[data-v-0c034b8c]{padding:10px 12px;border-radius:10px;background:#fafbfc}.stat-label[data-v-0c034b8c]{font-size:11px;color:#94a3b8;margin-bottom:3px}.stat-val[data-v-0c034b8c]{font-size:20px;font-weight:700;color:#1e293b;line-height:1.1;letter-spacing:-.02em}.sec-title[data-v-0c034b8c]{display:flex;align-items:center;gap:10px;margin:0 0 14px}.sec-title .bar[data-v-0c034b8c]{width:4px;height:18px;border-radius:3px}.sec-title h2[data-v-0c034b8c]{font-size:15px;font-weight:700;color:#0f172a;letter-spacing:-.01em}.sec-title .sub[data-v-0c034b8c]{font-size:12px;color:#94a3b8}.sec-title .tag[data-v-0c034b8c]{font-size:11px;font-weight:600;padding:2px 9px;border-radius:999px}.sec-title.muted .bar[data-v-0c034b8c]{height:14px;opacity:.6}.sec-title.muted h2[data-v-0c034b8c]{font-size:13px;font-weight:600;color:#94a3b8}.sec-title.hero .bar[data-v-0c034b8c]{width:5px;height:22px}.sec-title.hero h2[data-v-0c034b8c]{font-size:18px;font-weight:800;color:#0f172a}.cum-card[data-v-0c034b8c]{gap:11px;background:#f8fafc;border:1px solid #eef2f7;border-radius:12px;padding:10px 13px}.cum-card[data-v-0c034b8c],.cum-card .ico[data-v-0c034b8c]{display:flex;align-items:center}.cum-card .ico[data-v-0c034b8c]{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-0c034b8c]{min-width:0}.cum-card .lbl[data-v-0c034b8c]{font-size:11.5px;color:#94a3b8;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cum-card .val[data-v-0c034b8c]{font-size:17px;font-weight:700;color:#64748b;line-height:1.3;letter-spacing:-.01em;margin-top:1px}.today-wrap[data-v-0c034b8c]{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-0c034b8c]{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-0c034b8c]:hover{transform:translateY(-3px);box-shadow:0 14px 32px #0d6efd26}.today-card .accent[data-v-0c034b8c]{position:absolute;left:0;top:0;bottom:0;width:5px}.today-card-top[data-v-0c034b8c]{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.today-card .lbl[data-v-0c034b8c]{font-size:13px;color:#475569;font-weight:600}.today-card .ico[data-v-0c034b8c]{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-0c034b8c]{font-size:31px;font-weight:800;color:#0f172a;line-height:1.05;letter-spacing:-.02em}.today-card .foot[data-v-0c034b8c]{margin-top:9px;font-size:12px;color:#94a3b8;display:flex;align-items:center;gap:6px}.delta[data-v-0c034b8c]{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-0c034b8c]{color:#059669;background:#ecfdf5}.delta.down[data-v-0c034b8c]{color:#dc2626;background:#fef2f2}.delta.flat[data-v-0c034b8c],.tbtn[data-v-0c034b8c]{color:#64748b;background:#f1f5f9}.tbtn[data-v-0c034b8c]{font-size:11px;padding:3px 9px;border-radius:7px;line-height:1.4}.tbtn[data-v-0c034b8c]:hover{background:#e2e8f0}.tbtn-on[data-v-0c034b8c]{background:#1e293b;color:#fff}";
const dashboardStyles_8BsG9zJ = [
SvcAlertBanner_vue_vue_type_style_index_0_scoped_3dd2fb7c_lang,
dashboard_vue_vue_type_style_index_0_scoped_0c034b8c_lang
];
export { dashboardStyles_8BsG9zJ as default };
//# sourceMappingURL=dashboard-styles.8Bs-G9zJ.mjs.map

1
apps/admin/.output/server/chunks/build/dashboard-styles.8Bs-G9zJ.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"dashboard-styles.8Bs-G9zJ.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-styles-2.mjs-CRINJjkO.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-styles.8Bs-G9zJ.mjs"],"names":["style_0","style_1"],"mappings":"","x_google_ignoreList":[0,1]}

8
apps/admin/.output/server/chunks/build/dashboard-styles.CGuiyPm5.mjs

@ -1,8 +0,0 @@
const dashboard_vue_vue_type_style_index_0_scoped_7dbe8712_lang = ".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}";
const dashboardStyles_CGuiyPm5 = [
dashboard_vue_vue_type_style_index_0_scoped_7dbe8712_lang
];
export { dashboardStyles_CGuiyPm5 as default };
//# sourceMappingURL=dashboard-styles.CGuiyPm5.mjs.map

1
apps/admin/.output/server/chunks/build/dashboard-styles.CGuiyPm5.mjs.map

@ -1 +0,0 @@
{"version":3,"file":"dashboard-styles.CGuiyPm5.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-styles-1.mjs-Cr2VlWVR.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/dashboard-styles.CGuiyPm5.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

90
apps/admin/.output/server/chunks/build/server.mjs

@ -1919,26 +1919,27 @@ global.__VUE_PROD_DEVTOOLS__ = false;
function toArray$1(value) { function toArray$1(value) {
return Array.isArray(value) ? value : [value]; return Array.isArray(value) ? value : [value];
} }
const __nuxt_page_meta$m = { title: "应用详情" }; const __nuxt_page_meta$n = { title: "应用详情" };
const __nuxt_page_meta$l = { title: "后台账号" }; const __nuxt_page_meta$m = { title: "后台账号" };
const __nuxt_page_meta$k = { title: "Agent 配置" }; const __nuxt_page_meta$l = { title: "Agent 配置" };
const __nuxt_page_meta$j = { title: "应用环境配置" }; const __nuxt_page_meta$k = { title: "应用环境配置" };
const __nuxt_page_meta$i = { title: "应用中心" }; const __nuxt_page_meta$j = { title: "应用中心" };
const __nuxt_page_meta$h = { title: "通话翻译规则" }; const __nuxt_page_meta$i = { title: "通话翻译规则" };
const __nuxt_page_meta$g = { title: "渠道分发" }; const __nuxt_page_meta$h = { title: "渠道分发" };
const __nuxt_page_meta$f = { title: "公码管理" }; const __nuxt_page_meta$g = { title: "公码管理" };
const __nuxt_page_meta$e = { title: "数据概览" }; const __nuxt_page_meta$f = { title: "数据概览" };
const __nuxt_page_meta$d = { title: "生产管理" }; const __nuxt_page_meta$e = { title: "生产管理" };
const __nuxt_page_meta$c = { title: "环境节点" }; const __nuxt_page_meta$d = { title: "环境节点" };
const __nuxt_page_meta$b = { title: "品牌商管理" }; const __nuxt_page_meta$c = { title: "品牌商管理" };
const __nuxt_page_meta$a = { title: "全局环境配置" }; const __nuxt_page_meta$b = { title: "全局环境配置" };
const __nuxt_page_meta$9 = { title: "MCP配置" }; const __nuxt_page_meta$a = { title: "MCP配置" };
const __nuxt_page_meta$8 = { title: "会议记录服务" }; const __nuxt_page_meta$9 = { title: "会议记录服务" };
const __nuxt_page_meta$7 = { title: "会议模板" }; const __nuxt_page_meta$8 = { title: "会议模板" };
const __nuxt_page_meta$6 = { title: "产品管理" }; const __nuxt_page_meta$7 = { title: "产品管理" };
const __nuxt_page_meta$5 = { title: "方案商管理" }; const __nuxt_page_meta$6 = { title: "方案商管理" };
const __nuxt_page_meta$4 = { title: "第三方服务配置" }; const __nuxt_page_meta$5 = { title: "第三方服务配置" };
const __nuxt_page_meta$3 = { title: "统计日志" }; const __nuxt_page_meta$4 = { title: "统计日志" };
const __nuxt_page_meta$3 = { title: "服务巡检" };
const __nuxt_page_meta$2 = { title: "系统配置" }; const __nuxt_page_meta$2 = { title: "系统配置" };
const __nuxt_page_meta$1 = { title: "用户查询" }; const __nuxt_page_meta$1 = { title: "用户查询" };
const __nuxt_page_meta = { layout: "auth" }; const __nuxt_page_meta = { layout: "auth" };
@ -1946,123 +1947,129 @@ const _routes = [
{ {
name: "apps-name", name: "apps-name",
path: "/apps/:name()", path: "/apps/:name()",
meta: __nuxt_page_meta$m || {}, meta: __nuxt_page_meta$n || {},
component: () => import('./_name_-BbBzwp8c.mjs') component: () => import('./_name_-BbBzwp8c.mjs')
}, },
{ {
name: "accounts", name: "accounts",
path: "/accounts", path: "/accounts",
meta: __nuxt_page_meta$l || {}, meta: __nuxt_page_meta$m || {},
component: () => import('./accounts-Do2bLhnl.mjs') component: () => import('./accounts-Do2bLhnl.mjs')
}, },
{ {
name: "agents", name: "agents",
path: "/agents", path: "/agents",
meta: __nuxt_page_meta$k || {}, meta: __nuxt_page_meta$l || {},
component: () => import('./agents-sIgrTlD1.mjs') component: () => import('./agents-sIgrTlD1.mjs')
}, },
{ {
name: "appconfig", name: "appconfig",
path: "/appconfig", path: "/appconfig",
meta: __nuxt_page_meta$j || {}, meta: __nuxt_page_meta$k || {},
component: () => import('./appconfig-C6Zn9BWM.mjs') component: () => import('./appconfig-C6Zn9BWM.mjs')
}, },
{ {
name: "apps", name: "apps",
path: "/apps", path: "/apps",
meta: __nuxt_page_meta$i || {}, meta: __nuxt_page_meta$j || {},
component: () => import('./index-DKWThDpn.mjs') component: () => import('./index-DKWThDpn.mjs')
}, },
{ {
name: "calltranslate", name: "calltranslate",
path: "/calltranslate", path: "/calltranslate",
meta: __nuxt_page_meta$h || {}, meta: __nuxt_page_meta$i || {},
component: () => import('./calltranslate-D-FgQw8P.mjs') component: () => import('./calltranslate-D-FgQw8P.mjs')
}, },
{ {
name: "channels", name: "channels",
path: "/channels", path: "/channels",
meta: __nuxt_page_meta$g || {}, meta: __nuxt_page_meta$h || {},
component: () => import('./channels-CRuax8yi.mjs') component: () => import('./channels-CRuax8yi.mjs')
}, },
{ {
name: "code", name: "code",
path: "/code", path: "/code",
meta: __nuxt_page_meta$f || {}, meta: __nuxt_page_meta$g || {},
component: () => import('./code-BZlgiQix.mjs') component: () => import('./code-BZlgiQix.mjs')
}, },
{ {
name: "dashboard", name: "dashboard",
path: "/dashboard", path: "/dashboard",
meta: __nuxt_page_meta$e || {}, meta: __nuxt_page_meta$f || {},
component: () => import('./dashboard-CeM8vxnU.mjs') component: () => import('./dashboard-CXdhxG8p.mjs')
}, },
{ {
name: "device", name: "device",
path: "/device", path: "/device",
meta: __nuxt_page_meta$d || {}, meta: __nuxt_page_meta$e || {},
component: () => import('./device-B1tPcS6i.mjs') component: () => import('./device-B1tPcS6i.mjs')
}, },
{ {
name: "environments", name: "environments",
path: "/environments", path: "/environments",
meta: __nuxt_page_meta$c || {}, meta: __nuxt_page_meta$d || {},
component: () => import('./environments-DOoKTF6a.mjs') component: () => import('./environments-DOoKTF6a.mjs')
}, },
{ {
name: "factory", name: "factory",
path: "/factory", path: "/factory",
meta: __nuxt_page_meta$b || {}, meta: __nuxt_page_meta$c || {},
component: () => import('./factory-BCjt3r8_.mjs') component: () => import('./factory-BCjt3r8_.mjs')
}, },
{ {
name: "globalconfig", name: "globalconfig",
path: "/globalconfig", path: "/globalconfig",
meta: __nuxt_page_meta$a || {}, meta: __nuxt_page_meta$b || {},
component: () => import('./globalconfig-socqNHol.mjs') component: () => import('./globalconfig-socqNHol.mjs')
}, },
{ {
name: "mcpconfig", name: "mcpconfig",
path: "/mcpconfig", path: "/mcpconfig",
meta: __nuxt_page_meta$9 || {}, meta: __nuxt_page_meta$a || {},
component: () => import('./mcpconfig-O3oMJUPy.mjs') component: () => import('./mcpconfig-O3oMJUPy.mjs')
}, },
{ {
name: "meetingsvc", name: "meetingsvc",
path: "/meetingsvc", path: "/meetingsvc",
meta: __nuxt_page_meta$8 || {}, meta: __nuxt_page_meta$9 || {},
component: () => import('./meetingsvc-Dcq0cJyO.mjs') component: () => import('./meetingsvc-Dcq0cJyO.mjs')
}, },
{ {
name: "meettemplates", name: "meettemplates",
path: "/meettemplates", path: "/meettemplates",
meta: __nuxt_page_meta$7 || {}, meta: __nuxt_page_meta$8 || {},
component: () => import('./meettemplates-3onnOzNE.mjs') component: () => import('./meettemplates-3onnOzNE.mjs')
}, },
{ {
name: "product", name: "product",
path: "/product", path: "/product",
meta: __nuxt_page_meta$6 || {}, meta: __nuxt_page_meta$7 || {},
component: () => import('./product-ZlfAs6Rj.mjs') component: () => import('./product-ZlfAs6Rj.mjs')
}, },
{ {
name: "provider", name: "provider",
path: "/provider", path: "/provider",
meta: __nuxt_page_meta$5 || {}, meta: __nuxt_page_meta$6 || {},
component: () => import('./provider-CtaUaxlt.mjs') component: () => import('./provider-CtaUaxlt.mjs')
}, },
{ {
name: "serviceconfig", name: "serviceconfig",
path: "/serviceconfig", path: "/serviceconfig",
meta: __nuxt_page_meta$4 || {}, meta: __nuxt_page_meta$5 || {},
component: () => import('./serviceconfig-BN6iazID.mjs') component: () => import('./serviceconfig-BN6iazID.mjs')
}, },
{ {
name: "statlog", name: "statlog",
path: "/statlog", path: "/statlog",
meta: __nuxt_page_meta$3 || {}, meta: __nuxt_page_meta$4 || {},
component: () => import('./statlog-5z1Dy_jV.mjs') component: () => import('./statlog-5z1Dy_jV.mjs')
}, },
{
name: "svcinspect",
path: "/svcinspect",
meta: __nuxt_page_meta$3 || {},
component: () => import('./svcinspect-ApAZbGUu.mjs')
},
{ {
name: "systemconfig", name: "systemconfig",
path: "/systemconfig", path: "/systemconfig",
@ -2835,6 +2842,7 @@ const MENU_GROUPS = [
{ id: "appconfig", label: "应用环境配置", to: "/appconfig", icon: "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4" }, { id: "appconfig", label: "应用环境配置", to: "/appconfig", icon: "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4" },
{ id: "meettemplate", label: "会议模板", to: "/meettemplates", icon: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" }, { id: "meettemplate", label: "会议模板", to: "/meettemplates", icon: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" },
{ id: "svcconfig", label: "第三方服务配置", to: "/serviceconfig", icon: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z" }, { id: "svcconfig", label: "第三方服务配置", to: "/serviceconfig", icon: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z" },
{ id: "svcinspect", label: "服务巡检", to: "/svcinspect", icon: "M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z" },
{ id: "agents", label: "Agent 配置", to: "/agents", icon: "M12 3a2 2 0 012 2v1h3a2 2 0 012 2v3a2 2 0 01-2 2h-1v3a2 2 0 01-2 2H8a2 2 0 01-2-2v-3H5a2 2 0 01-2-2V8a2 2 0 012-2h3V5a2 2 0 012-2zM9 13h.01M15 13h.01" }, { id: "agents", label: "Agent 配置", to: "/agents", icon: "M12 3a2 2 0 012 2v1h3a2 2 0 012 2v3a2 2 0 01-2 2h-1v3a2 2 0 01-2 2H8a2 2 0 01-2-2v-3H5a2 2 0 01-2-2V8a2 2 0 012-2h3V5a2 2 0 012-2zM9 13h.01M15 13h.01" },
{ id: "meetingsvc", label: "会议记录服务", to: "/meetingsvc", icon: "M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" }, { id: "meetingsvc", label: "会议记录服务", to: "/meetingsvc", icon: "M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" },
{ id: "calltranslate", label: "通话翻译配置", to: "/calltranslate", icon: "M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129" } { id: "calltranslate", label: "通话翻译配置", to: "/calltranslate", icon: "M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129" }

12
apps/admin/.output/server/chunks/build/styles.mjs

@ -1,21 +1,23 @@
const interopDefault = r => r.default || r || []; const interopDefault = r => r.default || r || [];
const styles = { const styles = {
"../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/error-404.vue": () => import('./error-404-styles.Dw8OeZuk.mjs').then(interopDefault),
"../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/error-500.vue": () => import('./error-500-styles.CsxdYB__.mjs').then(interopDefault), "../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/error-500.vue": () => import('./error-500-styles.CsxdYB__.mjs').then(interopDefault),
"../node_modules/.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/error-404.vue": () => import('./error-404-styles.Dw8OeZuk.mjs').then(interopDefault),
"pages/apps/[name].vue": () => import('./_name_-styles.Dz82uZcJ.mjs').then(interopDefault), "pages/apps/[name].vue": () => import('./_name_-styles.Dz82uZcJ.mjs').then(interopDefault),
"components/AppDeployTab.vue": () => import('./AppDeployTab-styles.CUK7XFMF.mjs').then(interopDefault), "components/AppDeployTab.vue": () => import('./AppDeployTab-styles.CUK7XFMF.mjs').then(interopDefault),
"components/AppModuleTab.vue": () => import('./AppModuleTab-styles._m-oVrlE.mjs').then(interopDefault), "components/AppModuleTab.vue": () => import('./AppModuleTab-styles._m-oVrlE.mjs').then(interopDefault),
"pages/accounts.vue": () => import('./accounts-styles.E9MHodaB.mjs').then(interopDefault), "pages/accounts.vue": () => import('./accounts-styles.E9MHodaB.mjs').then(interopDefault),
"pages/calltranslate.vue": () => import('./calltranslate-styles.T5wE0P9E.mjs').then(interopDefault),
"pages/apps/index.vue": () => import('./index-styles.pMqqe5sq.mjs').then(interopDefault), "pages/apps/index.vue": () => import('./index-styles.pMqqe5sq.mjs').then(interopDefault),
"pages/agents.vue": () => import('./agents-styles.DrcBfQcb.mjs').then(interopDefault), "pages/agents.vue": () => import('./agents-styles.DrcBfQcb.mjs').then(interopDefault),
"pages/dashboard.vue": () => import('./dashboard-styles.8Bs-G9zJ.mjs').then(interopDefault),
"components/SvcAlertBanner.vue": () => import('./SvcAlertBanner-styles.C9CJuYwV.mjs').then(interopDefault),
"pages/channels.vue": () => import('./channels-styles.BsiooF6f.mjs').then(interopDefault), "pages/channels.vue": () => import('./channels-styles.BsiooF6f.mjs').then(interopDefault),
"pages/calltranslate.vue": () => import('./calltranslate-styles.T5wE0P9E.mjs').then(interopDefault), "pages/statlog.vue": () => import('./statlog-styles.CjrRv6cK.mjs').then(interopDefault),
"pages/dashboard.vue": () => import('./dashboard-styles.CGuiyPm5.mjs').then(interopDefault),
"pages/meetingsvc.vue": () => import('./meetingsvc-styles.CM1HF5Dg.mjs').then(interopDefault), "pages/meetingsvc.vue": () => import('./meetingsvc-styles.CM1HF5Dg.mjs').then(interopDefault),
"pages/index.vue": () => import('./index-styles.DNbAzSQY.mjs').then(interopDefault),
"pages/serviceconfig.vue": () => import('./serviceconfig-styles.pHiXruL3.mjs').then(interopDefault), "pages/serviceconfig.vue": () => import('./serviceconfig-styles.pHiXruL3.mjs').then(interopDefault),
"pages/statlog.vue": () => import('./statlog-styles.CjrRv6cK.mjs').then(interopDefault), "pages/svcinspect.vue": () => import('./svcinspect-styles.DpDXXkHn.mjs').then(interopDefault),
"pages/systemconfig.vue": () => import('./systemconfig-styles.DqxAqW2L.mjs').then(interopDefault), "pages/systemconfig.vue": () => import('./systemconfig-styles.DqxAqW2L.mjs').then(interopDefault),
"pages/index.vue": () => import('./index-styles.DNbAzSQY.mjs').then(interopDefault),
"layouts/default.vue": () => import('./default-styles.BZwnP0YX.mjs').then(interopDefault), "layouts/default.vue": () => import('./default-styles.BZwnP0YX.mjs').then(interopDefault),
"components/AppLoading.vue": () => import('./default-styles.BZwnP0YX.mjs').then(interopDefault), "components/AppLoading.vue": () => import('./default-styles.BZwnP0YX.mjs').then(interopDefault),
"components/LangSelect.vue": () => import('./LangSelect-styles.Bi81RebM.mjs').then(interopDefault) "components/LangSelect.vue": () => import('./LangSelect-styles.Bi81RebM.mjs').then(interopDefault)

62
apps/admin/.output/server/chunks/build/svchealth-8zW8U1Ef.mjs

@ -0,0 +1,62 @@
const REGION_LABEL = {
1: "中国",
2: "美国",
3: "东亚",
4: "东南亚",
5: "南亚",
6: "中东",
7: "欧洲",
8: "俄罗斯",
9: "非洲",
10: "南美",
11: "北美",
12: "大洋洲",
13: "巴西",
14: "印度"
};
const CAT_LABEL = {
1: "STT",
2: "TTS",
3: "MT",
4: "AST",
5: "文本LLM",
6: "存储",
7: "STS",
8: "录音识别",
9: "多媒体LLM",
10: "MCP"
};
const STATUS_META = {
error: { label: "不可用", color: "#be123c", bg: "#ffe4e6" },
warn: { label: "有隐患", color: "#b45309", bg: "#fef3c7" },
ok: { label: "正常", color: "#047857", bg: "#d1fae5" },
skip: { label: "已停用", color: "#64748b", bg: "#f1f5f9" }
};
const PROBE_META = {
credential: { label: "凭据已验证", hint: "已用真实凭据调通服务商接口" },
reachable: { label: "仅连通性", hint: "地址可达,但未验证凭据是否有效" },
none: { label: "未探测", hint: "暂无该服务商的探针,可用性未经验证" }
};
function healthReason(h) {
const issues = h.config_issues || [];
const fatal = issues.filter((s) => s.startsWith("[致命] "));
if (fatal.length) return fatal.map((s) => s.replace("[致命] ", "")).join(";");
if (h.status === "error") return h.probe_msg || "巡检失败";
if (issues.length) return issues.join(";");
if (h.probe_kind === "none") return h.probe_msg || "未验证可用性";
return h.probe_msg || "";
}
function healthLastRunText(ms) {
if (!ms) return "尚未执行";
const diff = Date.now() - ms;
if (diff < 6e4) return "刚刚";
if (diff < 36e5) return `${Math.floor(diff / 6e4)} 分钟前`;
if (diff < 864e5) return `${Math.floor(diff / 36e5)} 小时前`;
return new Date(ms).toLocaleString("zh-CN", { hour12: false });
}
function parseCats(categories) {
return (categories || "").split(",").map((s) => Number(s.trim())).filter((n) => !Number.isNaN(n) && n > 0);
}
export { CAT_LABEL as C, PROBE_META as P, REGION_LABEL as R, STATUS_META as S, healthReason as a, healthLastRunText as h, parseCats as p };
//# sourceMappingURL=svchealth-8zW8U1Ef.mjs.map

1
apps/admin/.output/server/chunks/build/svchealth-8zW8U1Ef.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"svchealth-8zW8U1Ef.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/svchealth-8zW8U1Ef.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

145
apps/admin/.output/server/chunks/build/svcinspect-ApAZbGUu.mjs

@ -0,0 +1,145 @@
import { defineComponent, ref, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrInterpolate, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderAttr, ssrRenderList, ssrRenderClass, ssrRenderStyle } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { h as healthLastRunText, S as STATUS_META, R as REGION_LABEL, p as parseCats, C as CAT_LABEL, P as PROBE_META, a as healthReason } from './svchealth-8zW8U1Ef.mjs';
import { _ as _export_sfc } from './server.mjs';
import './useLoading-D4zrSa2m.mjs';
import '../nitro/nitro.mjs';
import 'node:http';
import 'node:https';
import 'node:events';
import 'node:buffer';
import 'node:fs';
import 'node:path';
import 'node:crypto';
import 'node:url';
import '../routes/renderer.mjs';
import 'vue-bundle-renderer/runtime';
import 'unhead/server';
import 'devalue';
import 'unhead/utils';
import 'pinia';
import 'perfect-debounce';
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "svcinspect",
__ssrInlineRender: true,
setup(__props) {
useApi();
useToast();
const rows = ref([]);
const summary = ref({ total: 0, ok: 0, warn: 0, error: 0, skip: 0 });
const lastRun = ref(0);
const busy = ref(false);
const filterStatus = ref("");
const keyword = ref("");
const lastRunText = computed(() => healthLastRunText(lastRun.value));
const summaryCards = computed(() => [
{ key: "error", label: "不可用", value: summary.value.error, ico: "🚨", color: "#be123c", bg: "#ffe4e6" },
{ key: "warn", label: "有隐患", value: summary.value.warn, ico: "⚠️", color: "#b45309", bg: "#fef3c7" },
{ key: "ok", label: "正常", value: summary.value.ok, ico: "✅", color: "#047857", bg: "#d1fae5" },
{ key: "skip", label: "已停用", value: summary.value.skip, ico: "⏸️", color: "#64748b", bg: "#f1f5f9" },
{ key: "", label: "巡检配置总数", value: summary.value.total, ico: "📋", color: "#334155", bg: "#e2e8f0" }
]);
const filtered = computed(() => {
const kw = keyword.value.trim().toLowerCase();
return rows.value.filter((h) => {
if (filterStatus.value && h.status !== filterStatus.value) return false;
if (!kw) return true;
return `${h.name} ${h.svc_id} ${h.provider} ${h.app_name}`.toLowerCase().includes(kw);
});
});
function meta(s) {
return STATUS_META[s] || STATUS_META.skip;
}
function probeMeta(k) {
return PROBE_META[k] || PROBE_META.none;
}
function regionLabel(r) {
return REGION_LABEL[r] || `区域 ${r}`;
}
function catLabel(c) {
return CAT_LABEL[c] || `类别 ${c}`;
}
function cats(s) {
return parseCats(s);
}
function reason(h) {
return healthReason(h);
}
function timeText(ms) {
return healthLastRunText(ms);
}
function issuesOf(h) {
const all = (h.config_issues || []).map((s) => s.replace("[致命] ", ""));
const shown = reason(h);
return all.filter((s) => s !== shown && !shown.includes(s));
}
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-a9764f3a><div class="panel p-4 mb-5" data-v-a9764f3a><div class="flex flex-wrap items-center gap-3" data-v-a9764f3a><div class="flex items-center gap-2 mr-2" data-v-a9764f3a><h2 class="text-base font-bold text-slate-800" data-v-a9764f3a>服务巡检</h2><span class="text-xs text-slate-400" data-v-a9764f3a> 定时校验第三方服务配置并探测可用性 · 最近巡检 ${ssrInterpolate(lastRunText.value)}</span></div><div class="ml-auto flex items-center gap-2" data-v-a9764f3a><select class="select select-bordered select-sm w-32" data-v-a9764f3a><option value="" data-v-a9764f3a${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, "") : ssrLooseEqual(filterStatus.value, "")) ? " selected" : ""}>全部状态</option><option value="error" data-v-a9764f3a${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, "error") : ssrLooseEqual(filterStatus.value, "error")) ? " selected" : ""}>仅不可用</option><option value="warn" data-v-a9764f3a${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, "warn") : ssrLooseEqual(filterStatus.value, "warn")) ? " selected" : ""}>仅有隐患</option><option value="ok" data-v-a9764f3a${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, "ok") : ssrLooseEqual(filterStatus.value, "ok")) ? " selected" : ""}>仅正常</option><option value="skip" data-v-a9764f3a${ssrIncludeBooleanAttr(Array.isArray(filterStatus.value) ? ssrLooseContain(filterStatus.value, "skip") : ssrLooseEqual(filterStatus.value, "skip")) ? " selected" : ""}>仅已停用</option></select><input${ssrRenderAttr("value", keyword.value)} class="input input-bordered input-sm w-44" placeholder="搜索服务名/ID/服务商" data-v-a9764f3a><button class="btn btn-sm"${ssrIncludeBooleanAttr(busy.value) ? " disabled" : ""} data-v-a9764f3a>刷新</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(busy.value) ? " disabled" : ""} data-v-a9764f3a>${ssrInterpolate(busy.value ? "巡检中…" : "立即巡检")}</button></div></div><div class="grid grid-cols-2 md:grid-cols-5 gap-3 mt-4" data-v-a9764f3a><!--[-->`);
ssrRenderList(summaryCards.value, (s) => {
_push(`<div class="${ssrRenderClass([{ on: filterStatus.value === s.key }, "sum-card"])}" data-v-a9764f3a><span class="sum-ico" style="${ssrRenderStyle({ background: s.bg, color: s.color })}" data-v-a9764f3a>${ssrInterpolate(s.ico)}</span><div data-v-a9764f3a><div class="sum-lbl" data-v-a9764f3a>${ssrInterpolate(s.label)}</div><div class="sum-val" style="${ssrRenderStyle({ color: s.color })}" data-v-a9764f3a>${ssrInterpolate(s.value)}</div></div></div>`);
});
_push(`<!--]--></div></div><div class="panel" data-v-a9764f3a><div class="panel-head" data-v-a9764f3a><span class="font-semibold text-slate-700 text-sm" data-v-a9764f3a>巡检明细</span><span class="text-xs text-slate-400" data-v-a9764f3a>共 ${ssrInterpolate(filtered.value.length)} 份配置</span><span class="ml-auto text-xs text-slate-400" data-v-a9764f3a> 一个服务在不同区域可能配着不同凭据,故按「服务 × 区域」分别巡检 </span></div><div class="overflow-x-auto" data-v-a9764f3a><table class="table w-full" data-v-a9764f3a><thead data-v-a9764f3a><tr data-v-a9764f3a><th data-v-a9764f3a>状态</th><th data-v-a9764f3a>服务</th><th data-v-a9764f3a>作用域 / 区域</th><th data-v-a9764f3a>类别</th><th data-v-a9764f3a>探测方式</th><th data-v-a9764f3a>巡检结论</th><th class="text-right" data-v-a9764f3a>耗时</th><th data-v-a9764f3a>检查时间</th><th data-v-a9764f3a></th></tr></thead><tbody data-v-a9764f3a><!--[-->`);
ssrRenderList(filtered.value, (h) => {
_push(`<tr data-v-a9764f3a><td data-v-a9764f3a><span class="st-badge" style="${ssrRenderStyle({ background: meta(h.status).bg, color: meta(h.status).color })}" data-v-a9764f3a>${ssrInterpolate(meta(h.status).label)}</span>`);
if (h.fail_streak > 1) {
_push(`<div class="streak" data-v-a9764f3a>连续 ${ssrInterpolate(h.fail_streak)} 次</div>`);
} else {
_push(`<!---->`);
}
_push(`</td><td data-v-a9764f3a><div class="font-semibold text-slate-700" data-v-a9764f3a>${ssrInterpolate(h.name || h.svc_id)}</div><div class="text-xs text-slate-400 font-mono" data-v-a9764f3a>${ssrInterpolate(h.svc_id)}`);
if (h.provider) {
_push(`<span data-v-a9764f3a> · ${ssrInterpolate(h.provider)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div></td><td data-v-a9764f3a><span class="chip chip-scope" data-v-a9764f3a>${ssrInterpolate(h.app_name || "全局默认")}</span>`);
if (h.region) {
_push(`<span class="chip chip-region" data-v-a9764f3a>${ssrInterpolate(regionLabel(h.region))}</span>`);
} else {
_push(`<span class="chip" data-v-a9764f3a>默认配置</span>`);
}
_push(`</td><td data-v-a9764f3a><!--[-->`);
ssrRenderList(cats(h.categories), (c) => {
_push(`<span class="chip" data-v-a9764f3a>${ssrInterpolate(catLabel(c))}</span>`);
});
_push(`<!--]-->`);
if (!cats(h.categories).length) {
_push(`<span class="text-xs text-slate-300" data-v-a9764f3a>—</span>`);
} else {
_push(`<!---->`);
}
_push(`</td><td data-v-a9764f3a><span class="${ssrRenderClass(["pk-" + h.probe_kind, "chip"])}"${ssrRenderAttr("title", probeMeta(h.probe_kind).hint)} data-v-a9764f3a>${ssrInterpolate(probeMeta(h.probe_kind).label)}</span></td><td class="reason-cell" data-v-a9764f3a><div class="${ssrRenderClass(h.status === "error" ? "text-rose-600" : "text-slate-500")}" data-v-a9764f3a>${ssrInterpolate(reason(h) || "—")}</div>`);
if (issuesOf(h).length) {
_push(`<div class="issue-list" data-v-a9764f3a><!--[-->`);
ssrRenderList(issuesOf(h), (i, idx) => {
_push(`<div class="issue" data-v-a9764f3a>· ${ssrInterpolate(i)}</div>`);
});
_push(`<!--]--></div>`);
} else {
_push(`<!---->`);
}
_push(`</td><td class="text-right text-xs text-slate-400" data-v-a9764f3a>${ssrInterpolate(h.probe_kind === "none" ? "—" : h.latency_ms + " ms")}</td><td class="text-xs text-slate-400" data-v-a9764f3a>${ssrInterpolate(timeText(h.checked_at))}</td><td data-v-a9764f3a><button class="btn btn-xs"${ssrIncludeBooleanAttr(busy.value) ? " disabled" : ""} data-v-a9764f3a>重测</button></td></tr>`);
});
_push(`<!--]-->`);
if (!filtered.value.length) {
_push(`<tr data-v-a9764f3a><td colspan="9" class="text-center text-slate-400 py-8" data-v-a9764f3a>${ssrInterpolate(rows.value.length ? "当前筛选下没有匹配的记录" : "暂无巡检记录,点击右上角「立即巡检」执行一次")}</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`</tbody></table></div></div></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/svcinspect.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const svcinspect = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-a9764f3a"]]);
export { svcinspect as default };
//# sourceMappingURL=svcinspect-ApAZbGUu.mjs.map

1
apps/admin/.output/server/chunks/build/svcinspect-ApAZbGUu.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"svcinspect-ApAZbGUu.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/svcinspect-ApAZbGUu.js"],"names":[],"mappings":"","x_google_ignoreList":[0]}

8
apps/admin/.output/server/chunks/build/svcinspect-styles.DpDXXkHn.mjs

@ -0,0 +1,8 @@
const svcinspect_vue_vue_type_style_index_0_scoped_a9764f3a_lang = ".panel[data-v-a9764f3a]{background:#fff;border:1px solid #f1f5f9;border-radius:16px;box-shadow:0 1px 2px #0000000a;overflow:hidden}.panel-head[data-v-a9764f3a]{padding:12px 18px;gap:10px;border-bottom:1px solid #f8fafc;flex-wrap:wrap}.panel-head[data-v-a9764f3a],.sum-card[data-v-a9764f3a]{display:flex;align-items:center}.sum-card[data-v-a9764f3a]{gap:11px;background:#f8fafc;border:1px solid #eef2f7;border-radius:12px;padding:10px 13px;cursor:pointer;transition:all .15s}.sum-card[data-v-a9764f3a]:hover{border-color:#cbd5e1}.sum-card.on[data-v-a9764f3a]{border-color:#0f172a;background:#fff;box-shadow:inset 0 0 0 1px #0f172a}.sum-ico[data-v-a9764f3a]{width:30px;height:30px;border-radius:9px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:14px}.sum-lbl[data-v-a9764f3a]{font-size:11.5px;color:#94a3b8;line-height:1.2}.sum-val[data-v-a9764f3a]{font-size:19px;font-weight:700;line-height:1.3;letter-spacing:-.01em}.st-badge[data-v-a9764f3a]{font-size:11px;font-weight:700;padding:2px 9px;border-radius:999px;white-space:nowrap}.streak[data-v-a9764f3a]{font-size:10.5px;color:#be123c;margin-top:3px;font-weight:600}.chip[data-v-a9764f3a]{display:inline-block;font-size:11px;padding:1px 7px;border-radius:999px;background:#f1f5f9;color:#64748b;margin-right:4px;white-space:nowrap}.chip-scope[data-v-a9764f3a]{background:#e0e7ff;color:#4338ca}.chip-region[data-v-a9764f3a]{background:#cffafe;color:#0e7490}.pk-credential[data-v-a9764f3a]{background:#d1fae5;color:#047857}.pk-reachable[data-v-a9764f3a]{background:#fef3c7;color:#b45309}.pk-none[data-v-a9764f3a]{background:#f1f5f9;color:#94a3b8}.reason-cell[data-v-a9764f3a]{max-width:420px;font-size:12px;line-height:1.5}.issue-list[data-v-a9764f3a]{margin-top:3px}.issue[data-v-a9764f3a]{font-size:11px;color:#94a3b8}";
const svcinspectStyles_DpDXXkHn = [
svcinspect_vue_vue_type_style_index_0_scoped_a9764f3a_lang
];
export { svcinspectStyles_DpDXXkHn as default };
//# sourceMappingURL=svcinspect-styles.DpDXXkHn.mjs.map

1
apps/admin/.output/server/chunks/build/svcinspect-styles.DpDXXkHn.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"svcinspect-styles.DpDXXkHn.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/svcinspect-styles-1.mjs-DPmNZDYJ.js","../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/svcinspect-styles.DpDXXkHn.mjs"],"names":["style_0"],"mappings":"","x_google_ignoreList":[0,1]}

459
apps/admin/.output/server/chunks/nitro/nitro.mjs

@ -4028,7 +4028,7 @@ function _expandFromEnv(value) {
const _inlineRuntimeConfig = { const _inlineRuntimeConfig = {
"app": { "app": {
"baseURL": "/", "baseURL": "/",
"buildId": "1c187759-8384-4449-899e-e6f5237cf6d9", "buildId": "1ce432df-603d-4010-810b-770972167d80",
"buildAssetsDir": "/_nuxt/", "buildAssetsDir": "/_nuxt/",
"cdnURL": "" "cdnURL": ""
}, },
@ -4507,383 +4507,404 @@ const plugins = [
]; ];
const assets = { const assets = {
"/_nuxt/B3qpHAjq.js": { "/_nuxt/B0TjgAkR.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"3a84-EdHfaOmepsLOAvNIZGKmhIvjduI\"", "etag": "\"1874-0TVWWcvy86s6fmh3RPtDnI24IqY\"",
"mtime": "2026-07-31T11:02:00.273Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 14980, "size": 6260,
"path": "../public/_nuxt/B3qpHAjq.js" "path": "../public/_nuxt/B0TjgAkR.js"
}, },
"/_nuxt/BFWR6QZ6.js": { "/_nuxt/BIXaKwU_.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"1a10-VVZ+E7bT7V0LBaGyHY6syOxbmk4\"", "etag": "\"2221-6rCN+b04yTrogz3ccYLAJJRKtak\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 6672, "size": 8737,
"path": "../public/_nuxt/BFWR6QZ6.js" "path": "../public/_nuxt/BIXaKwU_.js"
}, },
"/_nuxt/B8Fu162H.js": { "/_nuxt/BJhUngVd.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"ab56-GJILUtVhrIrmAQ5hgXGtot56Ngc\"", "etag": "\"9dfe-6ghqXre5+A4LVv+bYSjycjDxujo\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 43862, "size": 40446,
"path": "../public/_nuxt/B8Fu162H.js" "path": "../public/_nuxt/BJhUngVd.js"
}, },
"/_nuxt/BPYtLuIu.js": { "/_nuxt/BMQvQYtl.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"d96-EuNzL01mjiHF04gJT9Y//hOtKIQ\"", "etag": "\"d96-+XiAR31ZSoqhZByaMAAITyflnfQ\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 3478, "size": 3478,
"path": "../public/_nuxt/BPYtLuIu.js" "path": "../public/_nuxt/BMQvQYtl.js"
}, },
"/_nuxt/BOUWbQhH.js": { "/_nuxt/BRt-3vKG.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"4592-uz+NSsvhUUQFGtz1hcKEbQ9WaS8\"", "etag": "\"ab56-l2XQKNNKzC2imTdpENBitWXQ83s\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 17810, "size": 43862,
"path": "../public/_nuxt/BOUWbQhH.js" "path": "../public/_nuxt/BRt-3vKG.js"
},
"/_nuxt/BQIhlerM.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"4d8a-DePckmpFF2g2oXxtgjAOIwMpo2g\"",
"mtime": "2026-07-31T11:02:00.274Z",
"size": 19850,
"path": "../public/_nuxt/BQIhlerM.js"
},
"/_nuxt/C37X9GaT.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"337c-J2oFG1UJzt7LPcTKuHDrzLSbrAk\"",
"mtime": "2026-07-31T11:02:00.274Z",
"size": 13180,
"path": "../public/_nuxt/C37X9GaT.js"
}, },
"/_nuxt/BgemqguF.js": { "/_nuxt/Bpb__dU6.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"4efb-iM/kvjJuTsHTX5t342xH43pQzig\"", "etag": "\"22ee-n6vSAPLtqPKyzpJLXThMoODgAjA\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 20219, "size": 8942,
"path": "../public/_nuxt/BgemqguF.js" "path": "../public/_nuxt/Bpb__dU6.js"
}, },
"/_nuxt/BtOu2QXF.js": { "/_nuxt/Bf3Eg9kO.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"9dfe-SPXSiVovEEaRft/564FEsio4C9M\"", "etag": "\"2037-qgc+kw87XZHtvLH7K+zrsiY70pk\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 40446, "size": 8247,
"path": "../public/_nuxt/BtOu2QXF.js" "path": "../public/_nuxt/Bf3Eg9kO.js"
}, },
"/_nuxt/C1u1NIe5.js": { "/_nuxt/BqjD6jMG.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"1874-jrbgW56tkZu1xev6uZNup/vzYFQ\"", "etag": "\"4592-ypS4bD6MFQ8Gx9Ansdil4hprmpc\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 6260, "size": 17810,
"path": "../public/_nuxt/C1u1NIe5.js" "path": "../public/_nuxt/BqjD6jMG.js"
}, },
"/_nuxt/C3hsc2UX.js": { "/_nuxt/BuCQ8FwD.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"1bda-CjpyAwOIS6Rd4U+eb+Kh+Atgwzk\"", "etag": "\"1bda-JuIJHhuB50/PIGj5K7fbz6+HC2s\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 7130, "size": 7130,
"path": "../public/_nuxt/C3hsc2UX.js" "path": "../public/_nuxt/BuCQ8FwD.js"
}, },
"/_nuxt/CAgv4ClK.js": { "/_nuxt/C-2gsgTH.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"1bbe-KC15eURvD0Z2VuNMXYC7gXnZ8p0\"", "etag": "\"b1f-RaBAecwSqbgmGQZYVLA85pF5RX8\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 7102, "size": 2847,
"path": "../public/_nuxt/CAgv4ClK.js" "path": "../public/_nuxt/C-2gsgTH.js"
}, },
"/_nuxt/CFdmUKvC.js": { "/_nuxt/C2WfoPPr.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"b1f-9Nyf4VrjCKqf9Ug6CYUEKE6v/mw\"", "etag": "\"1a5-khtazNarA+tNzBkGO++C7VCLYns\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 2847, "size": 421,
"path": "../public/_nuxt/CFdmUKvC.js" "path": "../public/_nuxt/C2WfoPPr.js"
}, },
"/_nuxt/CCYeqIml.js": { "/_nuxt/C6twYRfy.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"2f8d-xbTYnf+PUCDbqHr+7RLWYxZWKP4\"", "etag": "\"58b-1IayW5wwFlj3mlTzatL2Q+LGr3U\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 12173, "size": 1419,
"path": "../public/_nuxt/CCYeqIml.js" "path": "../public/_nuxt/C6twYRfy.js"
}, },
"/_nuxt/CGLKuRNo.js": { "/_nuxt/CRsHkMZx.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"925d-Moe7UGFtSjRrXgDAHVk/a2YNeDc\"", "etag": "\"4d8a-r3YPhm/FZeMZQZPTN25ItYcZguw\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 37469, "size": 19850,
"path": "../public/_nuxt/CGLKuRNo.js" "path": "../public/_nuxt/CRsHkMZx.js"
}, },
"/_nuxt/CH2ZVAK2.js": { "/_nuxt/CcYro5R2.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"2e5-LU07q0qs3YGjedzayaThX5PZ0uQ\"", "etag": "\"4efb-3bw2qPPZudkwFEFDFA+TDN+9T30\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 741, "size": 20219,
"path": "../public/_nuxt/CH2ZVAK2.js" "path": "../public/_nuxt/CcYro5R2.js"
}, },
"/_nuxt/CO60jE1q.js": { "/_nuxt/CglQi8MB.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"2221-6N6hI79TwkI9sq6CfofGKTTm8tM\"", "etag": "\"868-x7P/t+i7+atMIz04wD/0Q2Fsq5E\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 8737, "size": 2152,
"path": "../public/_nuxt/CO60jE1q.js" "path": "../public/_nuxt/CglQi8MB.js"
}, },
"/_nuxt/ChQPCk92.js": { "/_nuxt/ChQPCk92.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"3d7-bVlkH5HnpdHdWIG2sqCldjh0OqM\"", "etag": "\"3d7-bVlkH5HnpdHdWIG2sqCldjh0OqM\"",
"mtime": "2026-07-31T11:02:00.274Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 983, "size": 983,
"path": "../public/_nuxt/ChQPCk92.js" "path": "../public/_nuxt/ChQPCk92.js"
}, },
"/_nuxt/D-7b2ops.js": { "/_nuxt/C_VX9uKy.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"22ee-WhZvnpQ7K6qthkJ1jX8BEzmDTkA\"", "etag": "\"4066-kyfOpKjj/3aMitL3zTgxP+EAOA8\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 8942, "size": 16486,
"path": "../public/_nuxt/D-7b2ops.js" "path": "../public/_nuxt/C_VX9uKy.js"
},
"/_nuxt/CyqrlMkw.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"df-OU6eEIAx0jXEFOUOSjdFijbsDkw\"",
"mtime": "2026-08-03T09:05:58.396Z",
"size": 223,
"path": "../public/_nuxt/CyqrlMkw.js"
},
"/_nuxt/CvHBDjjq.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"2f8d-YfWp/X3pnynUAkLoDIAnN2Dgsp8\"",
"mtime": "2026-08-03T09:05:58.396Z",
"size": 12173,
"path": "../public/_nuxt/CvHBDjjq.js"
}, },
"/_nuxt/DNpGoo60.js": { "/_nuxt/D-lUY2ZC.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"1a81-o6OLc2mVNRaTlMMDdoP9NJTl0pM\"", "etag": "\"1bbe-JV4LjMn0QDLKVDnt2tH32Tzb83A\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.396Z",
"size": 7102,
"path": "../public/_nuxt/D-lUY2ZC.js"
},
"/_nuxt/DACw1I5K.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"3a38-FcNQz6Rr0OWKgGFSyjdnAa+t9H0\"",
"mtime": "2026-08-03T09:05:58.396Z",
"size": 14904,
"path": "../public/_nuxt/DACw1I5K.js"
},
"/_nuxt/DG0IG_4u.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"324a-G/30BU0NKpk3L3E/3K+Cq4K14UM\"",
"mtime": "2026-08-03T09:05:58.396Z",
"size": 12874,
"path": "../public/_nuxt/DG0IG_4u.js"
},
"/_nuxt/Db4U27_j.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1a81-4Y6FALsFB0PyGFBGg9SCZP3P0dI\"",
"mtime": "2026-08-03T09:05:58.396Z",
"size": 6785, "size": 6785,
"path": "../public/_nuxt/DNpGoo60.js" "path": "../public/_nuxt/Db4U27_j.js"
}, },
"/_nuxt/Ccu6Xgpt.js": { "/_nuxt/DGSd_XG-.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"31f04-LwNFWdzC+1Y0LEzA1lyW2oW6Eag\"", "etag": "\"925d-k51YRlIFm1WhKTQDk8Vr2XsERr0\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 204548, "size": 37469,
"path": "../public/_nuxt/Ccu6Xgpt.js" "path": "../public/_nuxt/DGSd_XG-.js"
}, },
"/_nuxt/DSpyBzHW.js": { "/_nuxt/Ddg4glGj.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"2037-vpVFtr6Ja7/AeZk7pkjRTjY8D+4\"", "etag": "\"ecf-NAUQ/qgmO5kG6E/Ym1KO/ywfOD4\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 8247, "size": 3791,
"path": "../public/_nuxt/DSpyBzHW.js" "path": "../public/_nuxt/Ddg4glGj.js"
}, },
"/_nuxt/DazkwkSm.js": { "/_nuxt/DuRQSWLc.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"39a6-TTXpbMWzMH9L+Ozg2vm/dt/4XnU\"", "etag": "\"161c-U8dRYiGCDgql7elD2QoJlOg5xWY\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 5660,
"path": "../public/_nuxt/DuRQSWLc.js"
},
"/_nuxt/DwmKnEeH.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"39a6-FpTR3LbcJDNvyvlyVNm7HE0Heq4\"",
"mtime": "2026-08-03T09:05:58.397Z",
"size": 14758, "size": 14758,
"path": "../public/_nuxt/DazkwkSm.js" "path": "../public/_nuxt/DwmKnEeH.js"
}, },
"/_nuxt/DdRUm5PD.js": { "/_nuxt/FVTAbpot.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"3a38-S60NryMqSS8SbXWBN6qqsEqdgak\"", "etag": "\"17a-8kh3vArQnUkbPOiAVWWpc/xLZnE\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 14904, "size": 378,
"path": "../public/_nuxt/DdRUm5PD.js" "path": "../public/_nuxt/FVTAbpot.js"
}, },
"/_nuxt/DiXjRAbV.js": { "/_nuxt/G5UJCii2.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"161c-gm57dKywj1DwK5KlKjowZIePWik\"", "etag": "\"337c-jXEBi3TAUdl1TiUYcRCIlppk+UQ\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 5660, "size": 13180,
"path": "../public/_nuxt/DiXjRAbV.js" "path": "../public/_nuxt/G5UJCii2.js"
}, },
"/_nuxt/Dtlyyukj.js": { "/_nuxt/GZG--rps.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"256c-F5yGMJrbVxk9GHL5kfu/Cskzx4c\"", "etag": "\"1a83-nVOgt9CFKjKKtq7ZqQlJbpIzmL0\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 9580, "size": 6787,
"path": "../public/_nuxt/Dtlyyukj.js" "path": "../public/_nuxt/GZG--rps.js"
}, },
"/_nuxt/LangSelect.Dkm6e8RK.css": { "/_nuxt/LangSelect.Dkm6e8RK.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"5c3-C4SkCgblTC2eBbJlNpFMUPfZZW8\"", "etag": "\"5c3-C4SkCgblTC2eBbJlNpFMUPfZZW8\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 1475, "size": 1475,
"path": "../public/_nuxt/LangSelect.Dkm6e8RK.css" "path": "../public/_nuxt/LangSelect.Dkm6e8RK.css"
}, },
"/_nuxt/DvwKXRUn.js": { "/_nuxt/OLpUuA7c.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"17a-7imcoHjWVnUn641HZ3NBnBhDVJU\"", "etag": "\"146-QuwP7VIOncv2Rj6D1Vfb8ntlCWI\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 378, "size": 326,
"path": "../public/_nuxt/DvwKXRUn.js" "path": "../public/_nuxt/OLpUuA7c.js"
}, },
"/_nuxt/Sgx9LvLK.js": { "/_nuxt/PN667bHc.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"324a-3i72Em616aJUbjNlIIbnqFc2I4Q\"", "etag": "\"58d-Ep7a34IW34moz3HCr5MkNYgtj58\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 12874, "size": 1421,
"path": "../public/_nuxt/Sgx9LvLK.js" "path": "../public/_nuxt/PN667bHc.js"
}, },
"/_nuxt/Um-KoueI.js": { "/_nuxt/VVFxpwIU.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"58b-byCXqJZUEAGT4orU3KT2iBPaJMU\"", "etag": "\"3a84-m8nuxY0nuIQB5db+87P0SCdRzY8\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 1419, "size": 14980,
"path": "../public/_nuxt/Um-KoueI.js" "path": "../public/_nuxt/VVFxpwIU.js"
}, },
"/_nuxt/_name_.B5yFMG3g.css": { "/_nuxt/_name_.B5yFMG3g.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"1a66-PDbmlnPJP0bTaSWoPPpQSN3ew/k\"", "etag": "\"1a66-PDbmlnPJP0bTaSWoPPpQSN3ew/k\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 6758, "size": 6758,
"path": "../public/_nuxt/_name_.B5yFMG3g.css" "path": "../public/_nuxt/_name_.B5yFMG3g.css"
}, },
"/_nuxt/aWlcN8xt.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"1a5-jogOkxFgWG2PidDGF1zEs+XNiPk\"",
"mtime": "2026-07-31T11:02:00.275Z",
"size": 421,
"path": "../public/_nuxt/aWlcN8xt.js"
},
"/_nuxt/accounts.vxGnCxY1.css": { "/_nuxt/accounts.vxGnCxY1.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"13a-18ifK9iGrWdARqUkEGJ49mKNMlI\"", "etag": "\"13a-18ifK9iGrWdARqUkEGJ49mKNMlI\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 314, "size": 314,
"path": "../public/_nuxt/accounts.vxGnCxY1.css" "path": "../public/_nuxt/accounts.vxGnCxY1.css"
}, },
"/_nuxt/agents.-kjpROzC.css": { "/_nuxt/agents.-kjpROzC.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"c07-DtTrCb/0z2FTH0M/xGNfaiUA464\"", "etag": "\"c07-DtTrCb/0z2FTH0M/xGNfaiUA464\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 3079, "size": 3079,
"path": "../public/_nuxt/agents.-kjpROzC.css" "path": "../public/_nuxt/agents.-kjpROzC.css"
}, },
"/_nuxt/calltranslate.CJXjjd14.css": { "/_nuxt/calltranslate.CJXjjd14.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"12bf-GWJtFmiGpAneLOM6lhOF8Yczqoc\"", "etag": "\"12bf-GWJtFmiGpAneLOM6lhOF8Yczqoc\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 4799, "size": 4799,
"path": "../public/_nuxt/calltranslate.CJXjjd14.css" "path": "../public/_nuxt/calltranslate.CJXjjd14.css"
}, },
"/_nuxt/channels.4kXMd4_X.css": { "/_nuxt/channels.4kXMd4_X.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"fab-xNgT+6RhPcM6WuuTH+FQBwmlYkk\"", "etag": "\"fab-xNgT+6RhPcM6WuuTH+FQBwmlYkk\"",
"mtime": "2026-07-31T11:02:00.275Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 4011, "size": 4011,
"path": "../public/_nuxt/channels.4kXMd4_X.css" "path": "../public/_nuxt/channels.4kXMd4_X.css"
}, },
"/_nuxt/dashboard.bI0rfjl_.css": { "/_nuxt/dashboard.CT4jXDd_.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"ec6-xLzfcTmKGF6JNWdYkGROjwovQsY\"", "etag": "\"1674-0u9/7z1ElLa3Aat996LHpwiBQ9Y\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 3782, "size": 5748,
"path": "../public/_nuxt/dashboard.bI0rfjl_.css" "path": "../public/_nuxt/dashboard.CT4jXDd_.css"
}, },
"/_nuxt/default.miyQHb0v.css": { "/_nuxt/default.miyQHb0v.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"b2-O1zVvoAVcFlJDT9d+8Mq5HKgSwA\"", "etag": "\"b2-O1zVvoAVcFlJDT9d+8Mq5HKgSwA\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 178, "size": 178,
"path": "../public/_nuxt/default.miyQHb0v.css" "path": "../public/_nuxt/default.miyQHb0v.css"
}, },
"/_nuxt/entry.Nq-dPCOq.css": {
"type": "text/css; charset=utf-8",
"etag": "\"183c0-FB6S40o6yR8CHsdGpoo6hM88IW8\"",
"mtime": "2026-07-31T11:02:00.276Z",
"size": 99264,
"path": "../public/_nuxt/entry.Nq-dPCOq.css"
},
"/_nuxt/error-404.Dm-MYrAh.css": { "/_nuxt/error-404.Dm-MYrAh.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"97e-/v6mv+rmcBtKGiHr88cRdQNod1s\"", "etag": "\"97e-/v6mv+rmcBtKGiHr88cRdQNod1s\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.397Z",
"size": 2430, "size": 2430,
"path": "../public/_nuxt/error-404.Dm-MYrAh.css" "path": "../public/_nuxt/error-404.Dm-MYrAh.css"
}, },
"/_nuxt/entry.BR7WYV0V.css": {
"type": "text/css; charset=utf-8",
"etag": "\"184d8-A6/29WUlnBYe0VZZ0y9JEEZyJt4\"",
"mtime": "2026-08-03T09:05:58.397Z",
"size": 99544,
"path": "../public/_nuxt/entry.BR7WYV0V.css"
},
"/_nuxt/error-500.DM8oqBl3.css": { "/_nuxt/error-500.DM8oqBl3.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"773-fnDg7l3rvJ5f8Hx4TwZqMlSCEdI\"", "etag": "\"773-fnDg7l3rvJ5f8Hx4TwZqMlSCEdI\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.398Z",
"size": 1907, "size": 1907,
"path": "../public/_nuxt/error-500.DM8oqBl3.css" "path": "../public/_nuxt/error-500.DM8oqBl3.css"
}, },
"/_nuxt/index.4nAkFRy2.css": {
"type": "text/css; charset=utf-8",
"etag": "\"9bb-oLx1eNvSlE3Mf6e/ODXe5npQc6w\"",
"mtime": "2026-07-31T11:02:00.276Z",
"size": 2491,
"path": "../public/_nuxt/index.4nAkFRy2.css"
},
"/_nuxt/index.BXNugdH5.css": { "/_nuxt/index.BXNugdH5.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"c9d-iEqnsYCjM8QWRpOi0SjOz5c/OsY\"", "etag": "\"c9d-iEqnsYCjM8QWRpOi0SjOz5c/OsY\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.398Z",
"size": 3229, "size": 3229,
"path": "../public/_nuxt/index.BXNugdH5.css" "path": "../public/_nuxt/index.BXNugdH5.css"
}, },
"/_nuxt/k7DeUBTv.js": { "/_nuxt/index.4nAkFRy2.css": {
"type": "text/css; charset=utf-8",
"etag": "\"9bb-oLx1eNvSlE3Mf6e/ODXe5npQc6w\"",
"mtime": "2026-08-03T09:05:58.398Z",
"size": 2491,
"path": "../public/_nuxt/index.4nAkFRy2.css"
},
"/_nuxt/l8H0VyaU.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"36c1-I82IY73n8BhrCHZ1IHozQtxVJEo\"", "etag": "\"256c-7iNN7IzEmvDECd6vOPJz236J7pQ\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.398Z",
"size": 14017, "size": 9580,
"path": "../public/_nuxt/k7DeUBTv.js" "path": "../public/_nuxt/l8H0VyaU.js"
}, },
"/_nuxt/meetingsvc.Cnu-3MbB.css": { "/_nuxt/meetingsvc.Cnu-3MbB.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"1181-i/bAxNjFIbxMsmYOCjcYf5QXrXY\"", "etag": "\"1181-i/bAxNjFIbxMsmYOCjcYf5QXrXY\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.398Z",
"size": 4481, "size": 4481,
"path": "../public/_nuxt/meetingsvc.Cnu-3MbB.css" "path": "../public/_nuxt/meetingsvc.Cnu-3MbB.css"
}, },
"/_nuxt/oiJG5Pzc.js": { "/_nuxt/ncAT-iHw.js": {
"type": "text/javascript; charset=utf-8", "type": "text/javascript; charset=utf-8",
"etag": "\"146-LnEg35qytvxkZbhhPe6TM+2U4Wo\"", "etag": "\"1a10-tcOdKP3+fXzUyUWv6qGEACIYcWk\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.398Z",
"size": 326, "size": 6672,
"path": "../public/_nuxt/oiJG5Pzc.js" "path": "../public/_nuxt/ncAT-iHw.js"
},
"/_nuxt/mElhLwm2.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"321da-nIceHuaujHDSXFqv+Yu/fBQjDUQ\"",
"mtime": "2026-08-03T09:05:58.398Z",
"size": 205274,
"path": "../public/_nuxt/mElhLwm2.js"
},
"/_nuxt/qig5Qp6S.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"2e5-rP4ybTE3PHFe5sQ+1dX/9D0NoRE\"",
"mtime": "2026-08-03T09:05:58.398Z",
"size": 741,
"path": "../public/_nuxt/qig5Qp6S.js"
}, },
"/_nuxt/serviceconfig.D1-cnJwZ.css": { "/_nuxt/serviceconfig.D1-cnJwZ.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"11f9-1SPPT0dmRmZGXJYCHUYqKbT0mYs\"", "etag": "\"11f9-1SPPT0dmRmZGXJYCHUYqKbT0mYs\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.398Z",
"size": 4601, "size": 4601,
"path": "../public/_nuxt/serviceconfig.D1-cnJwZ.css" "path": "../public/_nuxt/serviceconfig.D1-cnJwZ.css"
}, },
"/_nuxt/statlog.C1q_3yEh.css": { "/_nuxt/statlog.C1q_3yEh.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"4f1-raISk2zkJ3RyYjmALXSajiW6ngA\"", "etag": "\"4f1-raISk2zkJ3RyYjmALXSajiW6ngA\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.398Z",
"size": 1265, "size": 1265,
"path": "../public/_nuxt/statlog.C1q_3yEh.css" "path": "../public/_nuxt/statlog.C1q_3yEh.css"
}, },
"/_nuxt/svcinspect.H9TdRqZ5.css": {
"type": "text/css; charset=utf-8",
"etag": "\"709-X1szhhs8D9fMma7X8BsLOY0a31w\"",
"mtime": "2026-08-03T09:05:58.398Z",
"size": 1801,
"path": "../public/_nuxt/svcinspect.H9TdRqZ5.css"
},
"/_nuxt/systemconfig.MaL8_AEr.css": { "/_nuxt/systemconfig.MaL8_AEr.css": {
"type": "text/css; charset=utf-8", "type": "text/css; charset=utf-8",
"etag": "\"5f6-qMlVehTadQhvspNSgWfTP18KCiE\"", "etag": "\"5f6-qMlVehTadQhvspNSgWfTP18KCiE\"",
"mtime": "2026-07-31T11:02:00.276Z", "mtime": "2026-08-03T09:05:58.398Z",
"size": 1526, "size": 1526,
"path": "../public/_nuxt/systemconfig.MaL8_AEr.css" "path": "../public/_nuxt/systemconfig.MaL8_AEr.css"
}, },
"/_nuxt/szhsDUYv.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"868-HpZaPWp2c9wVoF1u4qTo6F5jG5U\"",
"mtime": "2026-07-31T11:02:00.276Z",
"size": 2152,
"path": "../public/_nuxt/szhsDUYv.js"
},
"/_nuxt/vijQW-l0.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"ecf-SAR098nDz3tWYI2xJVKlkBI4gDk\"",
"mtime": "2026-07-31T11:02:00.276Z",
"size": 3791,
"path": "../public/_nuxt/vijQW-l0.js"
},
"/_nuxt/zsrSRWp_.js": {
"type": "text/javascript; charset=utf-8",
"etag": "\"df-uMhmcvoZ1REHZAIcmCs2OrX5uQo\"",
"mtime": "2026-07-31T11:02:00.276Z",
"size": 223,
"path": "../public/_nuxt/zsrSRWp_.js"
},
"/_nuxt/builds/latest.json": { "/_nuxt/builds/latest.json": {
"type": "application/json", "type": "application/json",
"etag": "\"47-cpx0eg58tm1rjPX5MDZ/nYnmd2w\"", "etag": "\"47-nZ5PO4GQjZUiqgb1NlI0hPipY74\"",
"mtime": "2026-07-31T11:02:00.265Z", "mtime": "2026-08-03T09:05:58.390Z",
"size": 71, "size": 71,
"path": "../public/_nuxt/builds/latest.json" "path": "../public/_nuxt/builds/latest.json"
}, },
"/_nuxt/builds/meta/1c187759-8384-4449-899e-e6f5237cf6d9.json": { "/_nuxt/builds/meta/1ce432df-603d-4010-810b-770972167d80.json": {
"type": "application/json", "type": "application/json",
"etag": "\"58-MprsAzGqBN2PWYVg5euxlkrocPs\"", "etag": "\"58-FCGyY9ZbpaXLeBwDDD6Xx30+ZuI\"",
"mtime": "2026-07-31T11:02:00.262Z", "mtime": "2026-08-03T09:05:58.388Z",
"size": 88, "size": 88,
"path": "../public/_nuxt/builds/meta/1c187759-8384-4449-899e-e6f5237cf6d9.json" "path": "../public/_nuxt/builds/meta/1ce432df-603d-4010-810b-770972167d80.json"
} }
}; };

116
apps/admin/app/components/SvcAlertBanner.vue

@ -0,0 +1,116 @@
<template>
<!-- 仪表盘顶部第三方服务异常告警条。没有异常时整块不渲染,不占首屏。 -->
<div v-if="errorCount + warnCount > 0" class="alert-banner" :class="errorCount > 0 ? 'lv-error' : 'lv-warn'">
<div class="ab-head">
<span class="ab-ico">{{ errorCount > 0 ? '🚨' : '⚠️' }}</span>
<div class="ab-title">
<strong>
{{ errorCount > 0 ? `${errorCount} 项第三方服务不可用` : `${warnCount} 项第三方服务存在隐患` }}
</strong>
<span v-if="errorCount > 0 && warnCount > 0" class="ab-sub">,另有 {{ warnCount }} 项隐患</span>
<span class="ab-sub"> · 最近巡检 {{ lastRunText }}</span>
</div>
<button class="ab-btn" @click="expanded = !expanded">{{ expanded ? '收起' : '展开详情' }}</button>
<NuxtLink to="/svcinspect" class="ab-btn ab-btn-primary">前往巡检</NuxtLink>
</div>
<div v-if="expanded" class="ab-list">
<div v-for="a in alerts" :key="`${a.app_name}/${a.svc_id}/${a.region}`" class="ab-item">
<span class="ab-dot" :class="a.status === 'error' ? 'd-error' : 'd-warn'"></span>
<span class="ab-name">{{ a.name || a.svc_id }}</span>
<span v-if="a.provider" class="ab-chip">{{ a.provider }}</span>
<span class="ab-chip ab-chip-scope">{{ scopeText(a) }}</span>
<span class="ab-msg">{{ reasonOf(a) }}</span>
<span v-if="a.fail_streak > 1" class="ab-streak">连续失败 {{ a.fail_streak }} 次</span>
</div>
<div v-if="truncated" class="ab-more">
仅显示前 {{ alerts.length }} 条,其余请到<NuxtLink to="/svcinspect" class="ab-link">服务巡检</NuxtLink>查看
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { useApi } from '~/composables/useApi'
import { REGION_LABEL, healthReason, healthLastRunText, type SvcHealth } from '~/utils/svchealth'
const { webApi } = useApi()
const alerts = ref<SvcHealth[]>([])
const errorCount = ref(0)
const warnCount = ref(0)
const lastRun = ref(0)
const expanded = ref(false)
const truncated = ref(false)
const LIMIT = 12
const lastRunText = computed(() => healthLastRunText(lastRun.value))
function scopeText(a: SvcHealth): string {
const app = a.app_name ? a.app_name : '全局'
return a.region ? `${app} · ${REGION_LABEL[a.region] || '区域' + a.region}` : app
}
function reasonOf(a: SvcHealth): string {
return healthReason(a)
}
async function load() {
try {
const res = await webApi<{
alerts: SvcHealth[]
error_count: number
warn_count: number
last_run: number
}>('getsvcalerts', { limit: LIMIT })
alerts.value = res.alerts || []
errorCount.value = res.error_count || 0
warnCount.value = res.warn_count || 0
lastRun.value = res.last_run || 0
truncated.value = errorCount.value + warnCount.value > alerts.value.length
// 有明确不可用的服务时默认展开——这类问题需要马上看见是哪几个,而不是再点一次。
expanded.value = errorCount.value > 0
} catch {
// 巡检数据拿不到不应该拖垮整个仪表盘,静默降级为「无告警」。
alerts.value = []
errorCount.value = 0
warnCount.value = 0
}
}
onMounted(load)
defineExpose({ load })
</script>
<style scoped>
.alert-banner { border-radius:14px; padding:12px 16px; margin-bottom:18px; border:1px solid; }
.lv-error { background:linear-gradient(180deg,#fff1f2 0%,#fff7f7 100%); border-color:#fecdd3; }
.lv-warn { background:linear-gradient(180deg,#fffbeb 0%,#fffdf5 100%); border-color:#fde68a; }
.ab-head { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.ab-ico { font-size:17px; line-height:1; }
.ab-title { font-size:13px; color:#334155; flex:1; min-width:200px; }
.lv-error .ab-title strong { color:#be123c; }
.lv-warn .ab-title strong { color:#b45309; }
.ab-sub { color:#94a3b8; font-size:12px; }
.ab-btn { font-size:12px; padding:4px 11px; border-radius:8px; border:1px solid #e2e8f0; background:#fff; color:#475569; white-space:nowrap; }
.ab-btn:hover { background:#f8fafc; }
.ab-btn-primary { background:#0f172a; border-color:#0f172a; color:#fff; }
.ab-btn-primary:hover { background:#1e293b; }
.ab-list { margin-top:10px; padding-top:10px; border-top:1px dashed rgba(148,163,184,.4); display:flex; flex-direction:column; gap:6px; }
.ab-item { display:flex; align-items:center; gap:8px; font-size:12.5px; color:#475569; flex-wrap:wrap; }
.ab-dot { width:7px; height:7px; border-radius:50%; flex-shrink:0; }
.d-error { background:#f43f5e; }
.d-warn { background:#f59e0b; }
.ab-name { font-weight:600; color:#1e293b; }
.ab-chip { font-size:11px; padding:1px 7px; border-radius:999px; background:#f1f5f9; color:#64748b; }
.ab-chip-scope { background:#e0e7ff; color:#4338ca; }
.ab-msg { color:#64748b; flex:1; min-width:160px; }
.ab-streak { font-size:11px; color:#be123c; font-weight:600; }
.ab-more { font-size:12px; color:#94a3b8; padding-top:2px; }
.ab-link { color:#4338ca; text-decoration:underline; margin:0 2px; }
</style>

3
apps/admin/app/pages/dashboard.vue

@ -1,5 +1,8 @@
<template> <template>
<div> <div>
<!-- 第三方服务异常报警:巡检发现不可用/有隐患的服务时才出现,置于最顶部 -->
<SvcAlertBanner />
<!-- 全局筛选条(应用/区域/产品,时间由各版面单独控制)--> <!-- 全局筛选条(应用/区域/产品,时间由各版面单独控制)-->
<div class="panel p-4 mb-5"> <div class="panel p-4 mb-5">
<div class="flex flex-wrap items-end gap-3"> <div class="flex flex-wrap items-end gap-3">

244
apps/admin/app/pages/svcinspect.vue

@ -0,0 +1,244 @@
<template>
<div>
<!-- 顶部:汇总 + 操作 -->
<div class="panel p-4 mb-5">
<div class="flex flex-wrap items-center gap-3">
<div class="flex items-center gap-2 mr-2">
<h2 class="text-base font-bold text-slate-800">服务巡检</h2>
<span class="text-xs text-slate-400">
定时校验第三方服务配置并探测可用性 · 最近巡检 {{ lastRunText }}
</span>
</div>
<div class="ml-auto flex items-center gap-2">
<select v-model="filterStatus" class="select select-bordered select-sm w-32">
<option value="">全部状态</option>
<option value="error">仅不可用</option>
<option value="warn">仅有隐患</option>
<option value="ok">仅正常</option>
<option value="skip">仅已停用</option>
</select>
<input v-model="keyword" class="input input-bordered input-sm w-44" placeholder="搜索服务名/ID/服务商" />
<button class="btn btn-sm" :disabled="busy" @click="load">刷新</button>
<button class="btn btn-primary btn-sm text-white" :disabled="busy" @click="runAll">
{{ busy ? '巡检中…' : '立即巡检' }}
</button>
</div>
</div>
<div class="grid grid-cols-2 md:grid-cols-5 gap-3 mt-4">
<div v-for="s in summaryCards" :key="s.key" class="sum-card" :class="{ on: filterStatus === s.key }"
@click="filterStatus = filterStatus === s.key ? '' : s.key">
<span class="sum-ico" :style="{ background: s.bg, color: s.color }">{{ s.ico }}</span>
<div>
<div class="sum-lbl">{{ s.label }}</div>
<div class="sum-val" :style="{ color: s.color }">{{ s.value }}</div>
</div>
</div>
</div>
</div>
<!-- 巡检明细 -->
<div class="panel">
<div class="panel-head">
<span class="font-semibold text-slate-700 text-sm">巡检明细</span>
<span class="text-xs text-slate-400">共 {{ filtered.length }} 份配置</span>
<span class="ml-auto text-xs text-slate-400">
一个服务在不同区域可能配着不同凭据,故按「服务 × 区域」分别巡检
</span>
</div>
<div class="overflow-x-auto">
<table class="table w-full">
<thead>
<tr>
<th>状态</th>
<th>服务</th>
<th>作用域 / 区域</th>
<th>类别</th>
<th>探测方式</th>
<th>巡检结论</th>
<th class="text-right">耗时</th>
<th>检查时间</th>
<th></th>
</tr>
</thead>
<tbody>
<tr v-for="h in filtered" :key="rowKey(h)">
<td>
<span class="st-badge" :style="{ background: meta(h.status).bg, color: meta(h.status).color }">
{{ meta(h.status).label }}
</span>
<div v-if="h.fail_streak > 1" class="streak">连续 {{ h.fail_streak }} 次</div>
</td>
<td>
<div class="font-semibold text-slate-700">{{ h.name || h.svc_id }}</div>
<div class="text-xs text-slate-400 font-mono">
{{ h.svc_id }}<span v-if="h.provider"> · {{ h.provider }}</span>
</div>
</td>
<td>
<span class="chip chip-scope">{{ h.app_name || '全局默认' }}</span>
<span v-if="h.region" class="chip chip-region">{{ regionLabel(h.region) }}</span>
<span v-else class="chip">默认配置</span>
</td>
<td>
<span v-for="c in cats(h.categories)" :key="c" class="chip">{{ catLabel(c) }}</span>
<span v-if="!cats(h.categories).length" class="text-xs text-slate-300">—</span>
</td>
<td>
<span class="chip" :class="'pk-' + h.probe_kind" :title="probeMeta(h.probe_kind).hint">
{{ probeMeta(h.probe_kind).label }}
</span>
</td>
<td class="reason-cell">
<div :class="h.status === 'error' ? 'text-rose-600' : 'text-slate-500'">{{ reason(h) || '—' }}</div>
<div v-if="issuesOf(h).length" class="issue-list">
<div v-for="(i, idx) in issuesOf(h)" :key="idx" class="issue">· {{ i }}</div>
</div>
</td>
<td class="text-right text-xs text-slate-400">
{{ h.probe_kind === 'none' ? '—' : h.latency_ms + ' ms' }}
</td>
<td class="text-xs text-slate-400">{{ timeText(h.checked_at) }}</td>
<td>
<button class="btn btn-xs" :disabled="busy" @click="runOne(h)">重测</button>
</td>
</tr>
<tr v-if="!filtered.length">
<td colspan="9" class="text-center text-slate-400 py-8">
{{ rows.length ? '当前筛选下没有匹配的记录' : '暂无巡检记录,点击右上角「立即巡检」执行一次' }}
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import { useApi } from '~/composables/useApi'
import { useToast } from '~/composables/useToast'
import {
REGION_LABEL, CAT_LABEL, STATUS_META, PROBE_META,
healthReason, healthLastRunText, parseCats, type SvcHealth,
} from '~/utils/svchealth'
definePageMeta({ title: '服务巡检' })
const { webApi } = useApi()
const toast = useToast()
const rows = ref<SvcHealth[]>([])
const summary = ref({ total: 0, ok: 0, warn: 0, error: 0, skip: 0 })
const lastRun = ref(0)
const busy = ref(false)
const filterStatus = ref('')
const keyword = ref('')
const lastRunText = computed(() => healthLastRunText(lastRun.value))
const summaryCards = computed(() => [
{ key: 'error', label: '不可用', value: summary.value.error, ico: '🚨', color: '#be123c', bg: '#ffe4e6' },
{ key: 'warn', label: '有隐患', value: summary.value.warn, ico: '⚠️', color: '#b45309', bg: '#fef3c7' },
{ key: 'ok', label: '正常', value: summary.value.ok, ico: '✅', color: '#047857', bg: '#d1fae5' },
{ key: 'skip', label: '已停用', value: summary.value.skip, ico: '⏸️', color: '#64748b', bg: '#f1f5f9' },
{ key: '', label: '巡检配置总数', value: summary.value.total, ico: '📋', color: '#334155', bg: '#e2e8f0' },
])
const filtered = computed(() => {
const kw = keyword.value.trim().toLowerCase()
return rows.value.filter((h) => {
if (filterStatus.value && h.status !== filterStatus.value) return false
if (!kw) return true
return `${h.name} ${h.svc_id} ${h.provider} ${h.app_name}`.toLowerCase().includes(kw)
})
})
function rowKey(h: SvcHealth) { return `${h.app_name}/${h.svc_id}/${h.region}` }
function meta(s: string) { return STATUS_META[s] || STATUS_META.skip }
function probeMeta(k: string) { return PROBE_META[k] || PROBE_META.none }
function regionLabel(r: number) { return REGION_LABEL[r] || `区域 ${r}` }
function catLabel(c: number) { return CAT_LABEL[c] || `类别 ${c}` }
function cats(s: string) { return parseCats(s) }
function reason(h: SvcHealth) { return healthReason(h) }
function timeText(ms: number) { return healthLastRunText(ms) }
// 摘要行已经展示了最要紧的一条原因,这里补充列出其余配置问题,避免重复刷屏。
function issuesOf(h: SvcHealth): string[] {
const all = (h.config_issues || []).map((s) => s.replace('[致命] ', ''))
const shown = reason(h)
return all.filter((s) => s !== shown && !shown.includes(s))
}
async function load() {
try {
const res = await webApi<{
items: SvcHealth[]
summary: typeof summary.value
last_run: number
running: boolean
}>('getsvchealth', {})
rows.value = res.items || []
summary.value = res.summary || { total: 0, ok: 0, warn: 0, error: 0, skip: 0 }
lastRun.value = res.last_run || 0
} catch (e: any) {
toast.error(e?.message || '加载巡检结果失败')
}
}
async function runAll() {
busy.value = true
try {
const res = await webApi<{ count: number }>('runsvcinspect', {})
toast.success(`巡检完成,已检查 ${res.count} 份配置`)
await load()
} catch (e: any) {
toast.error(e?.message || '巡检失败')
} finally {
busy.value = false
}
}
async function runOne(h: SvcHealth) {
busy.value = true
try {
await webApi('runsvcinspect', { app_name: h.app_name, svc_id: h.svc_id })
toast.success(`已重新检测:${h.name || h.svc_id}`)
await load()
} catch (e: any) {
toast.error(e?.message || '检测失败')
} finally {
busy.value = false
}
}
onMounted(load)
</script>
<style scoped>
.panel { background:#fff; border:1px solid #f1f5f9; border-radius:16px; box-shadow:0 1px 2px rgba(0,0,0,0.04); overflow:hidden; }
.panel-head { padding:12px 18px; display:flex; align-items:center; gap:10px; border-bottom:1px solid #f8fafc; flex-wrap:wrap; }
.sum-card { display:flex; align-items:center; gap:11px; background:#f8fafc; border:1px solid #eef2f7; border-radius:12px; padding:10px 13px; cursor:pointer; transition:all .15s; }
.sum-card:hover { border-color:#cbd5e1; }
.sum-card.on { border-color:#0f172a; background:#fff; box-shadow:0 0 0 1px #0f172a inset; }
.sum-ico { width:30px; height:30px; border-radius:9px; display:flex; align-items:center; justify-content:center; flex-shrink:0; font-size:14px; }
.sum-lbl { font-size:11.5px; color:#94a3b8; line-height:1.2; }
.sum-val { font-size:19px; font-weight:700; line-height:1.3; letter-spacing:-0.01em; }
.st-badge { font-size:11px; font-weight:700; padding:2px 9px; border-radius:999px; white-space:nowrap; }
.streak { font-size:10.5px; color:#be123c; margin-top:3px; font-weight:600; }
.chip { display:inline-block; font-size:11px; padding:1px 7px; border-radius:999px; background:#f1f5f9; color:#64748b; margin-right:4px; white-space:nowrap; }
.chip-scope { background:#e0e7ff; color:#4338ca; }
.chip-region { background:#cffafe; color:#0e7490; }
.pk-credential { background:#d1fae5; color:#047857; }
.pk-reachable { background:#fef3c7; color:#b45309; }
.pk-none { background:#f1f5f9; color:#94a3b8; }
.reason-cell { max-width:420px; font-size:12px; line-height:1.5; }
.issue-list { margin-top:3px; }
.issue { font-size:11px; color:#94a3b8; }
</style>

1
apps/admin/app/utils/menus.ts

@ -46,6 +46,7 @@ export const MENU_GROUPS: MenuGroup[] = [
{ id: 'appconfig', label: '应用环境配置', to: '/appconfig', icon: 'M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4' }, { id: 'appconfig', label: '应用环境配置', to: '/appconfig', icon: 'M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4' },
{ id: 'meettemplate', label: '会议模板', to: '/meettemplates', icon: 'M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z' }, { id: 'meettemplate', label: '会议模板', to: '/meettemplates', icon: 'M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z' },
{ id: 'svcconfig', label: '第三方服务配置', to: '/serviceconfig', icon: 'M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z' }, { id: 'svcconfig', label: '第三方服务配置', to: '/serviceconfig', icon: 'M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z' },
{ id: 'svcinspect', label: '服务巡检', to: '/svcinspect', icon: 'M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z' },
{ id: 'agents', label: 'Agent 配置', to: '/agents', icon: 'M12 3a2 2 0 012 2v1h3a2 2 0 012 2v3a2 2 0 01-2 2h-1v3a2 2 0 01-2 2H8a2 2 0 01-2-2v-3H5a2 2 0 01-2-2V8a2 2 0 012-2h3V5a2 2 0 012-2zM9 13h.01M15 13h.01' }, { id: 'agents', label: 'Agent 配置', to: '/agents', icon: 'M12 3a2 2 0 012 2v1h3a2 2 0 012 2v3a2 2 0 01-2 2h-1v3a2 2 0 01-2 2H8a2 2 0 01-2-2v-3H5a2 2 0 01-2-2V8a2 2 0 012-2h3V5a2 2 0 012-2zM9 13h.01M15 13h.01' },
{ id: 'meetingsvc', label: '会议记录服务', to: '/meetingsvc', icon: 'M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10' }, { id: 'meetingsvc', label: '会议记录服务', to: '/meetingsvc', icon: 'M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10' },
{ id: 'calltranslate', label: '通话翻译配置', to: '/calltranslate', icon: 'M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129' }, { id: 'calltranslate', label: '通话翻译配置', to: '/calltranslate', icon: 'M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129' },

80
apps/admin/app/utils/svchealth.ts

@ -0,0 +1,80 @@
// 第三方服务巡检(svc_health)的前端共享类型与展示辅助。
// 巡检页(pages/svcinspect.vue) 与仪表盘告警条(components/SvcAlertBanner.vue) 共用,
// 保证两处对「状态怎么叫、原因怎么写、区域怎么显示」的口径完全一致。
// 与后端 comm/svchealth.go 的 SvcHealth 字段一一对应。
export interface SvcHealth {
app_name: string
svc_id: string
region: number // 0=服务默认配置,>0=该区域的覆盖配置
name: string
provider: string
categories: string
enable: boolean
status: 'ok' | 'warn' | 'error' | 'skip'
config_issues: string[] | null
probe_kind: 'none' | 'reachable' | 'credential'
probe_ok: boolean
probe_msg: string
latency_ms: number
fail_streak: number
last_ok_at: number
checked_at: number
duration_ms: number
}
// 区域枚举(与 pb.Region、serviceconfig.vue 的 REGIONS 一致)。
export const REGION_LABEL: Record<number, string> = {
1: '中国', 2: '美国', 3: '东亚', 4: '东南亚', 5: '南亚', 6: '中东', 7: '欧洲',
8: '俄罗斯', 9: '非洲', 10: '南美', 11: '北美', 12: '大洋洲', 13: '巴西', 14: '印度',
}
// 服务类别(与后端 svcCatXxx、serviceconfig.vue 的 SCAT 一致)。
export const CAT_LABEL: Record<number, string> = {
1: 'STT', 2: 'TTS', 3: 'MT', 4: 'AST', 5: '文本LLM',
6: '存储', 7: 'STS', 8: '录音识别', 9: '多媒体LLM', 10: 'MCP',
}
export const STATUS_META: Record<string, { label: string; color: string; bg: string }> = {
error: { label: '不可用', color: '#be123c', bg: '#ffe4e6' },
warn: { label: '有隐患', color: '#b45309', bg: '#fef3c7' },
ok: { label: '正常', color: '#047857', bg: '#d1fae5' },
skip: { label: '已停用', color: '#64748b', bg: '#f1f5f9' },
}
// 探测方式的人话说明。核心是让「未探测」不被误读成「已验证通过」。
export const PROBE_META: Record<string, { label: string; hint: string }> = {
credential: { label: '凭据已验证', hint: '已用真实凭据调通服务商接口' },
reachable: { label: '仅连通性', hint: '地址可达,但未验证凭据是否有效' },
none: { label: '未探测', hint: '暂无该服务商的探针,可用性未经验证' },
}
// healthReason 一句话说清「为什么是这个状态」,供告警条与表格摘要列使用。
// 优先级:致命配置问题 > 探测失败原因 > 非致命隐患 > 探测结论。
export function healthReason(h: SvcHealth): string {
const issues = h.config_issues || []
const fatal = issues.filter((s) => s.startsWith('[致命] '))
if (fatal.length) return fatal.map((s) => s.replace('[致命] ', '')).join(';')
if (h.status === 'error') return h.probe_msg || '巡检失败'
if (issues.length) return issues.join(';')
if (h.probe_kind === 'none') return h.probe_msg || '未验证可用性'
return h.probe_msg || ''
}
// healthLastRunText 把巡检时间戳渲染成「刚刚 / N 分钟前 / N 小时前 / 日期」。
export function healthLastRunText(ms: number): string {
if (!ms) return '尚未执行'
const diff = Date.now() - ms
if (diff < 60_000) return '刚刚'
if (diff < 3_600_000) return `${Math.floor(diff / 60_000)} 分钟前`
if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)} 小时前`
return new Date(ms).toLocaleString('zh-CN', { hour12: false })
}
// parseCats 把逗号分隔的 categories 解析成类别数值数组。
export function parseCats(categories: string): number[] {
return (categories || '')
.split(',')
.map((s) => Number(s.trim()))
.filter((n) => !Number.isNaN(n) && n > 0)
}

2
apps/admin/node_modules/.cache/nuxt/.nuxt/components.d.ts

@ -19,6 +19,7 @@ export const AppLoading: typeof import("../../../../app/components/AppLoading.vu
export const AppModuleTab: typeof import("../../../../app/components/AppModuleTab.vue")['default'] export const AppModuleTab: typeof import("../../../../app/components/AppModuleTab.vue")['default']
export const AppToast: typeof import("../../../../app/components/AppToast.vue")['default'] export const AppToast: typeof import("../../../../app/components/AppToast.vue")['default']
export const LangSelect: typeof import("../../../../app/components/LangSelect.vue")['default'] export const LangSelect: typeof import("../../../../app/components/LangSelect.vue")['default']
export const SvcAlertBanner: typeof import("../../../../app/components/SvcAlertBanner.vue")['default']
export const NuxtWelcome: typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/welcome.vue")['default'] export const NuxtWelcome: typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/welcome.vue")['default']
export const NuxtLayout: typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-layout")['default'] export const NuxtLayout: typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-layout")['default']
export const NuxtErrorBoundary: typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-error-boundary.vue")['default'] export const NuxtErrorBoundary: typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-error-boundary.vue")['default']
@ -48,6 +49,7 @@ export const LazyAppLoading: LazyComponent<typeof import("../../../../app/compon
export const LazyAppModuleTab: LazyComponent<typeof import("../../../../app/components/AppModuleTab.vue")['default']> export const LazyAppModuleTab: LazyComponent<typeof import("../../../../app/components/AppModuleTab.vue")['default']>
export const LazyAppToast: LazyComponent<typeof import("../../../../app/components/AppToast.vue")['default']> export const LazyAppToast: LazyComponent<typeof import("../../../../app/components/AppToast.vue")['default']>
export const LazyLangSelect: LazyComponent<typeof import("../../../../app/components/LangSelect.vue")['default']> export const LazyLangSelect: LazyComponent<typeof import("../../../../app/components/LangSelect.vue")['default']>
export const LazySvcAlertBanner: LazyComponent<typeof import("../../../../app/components/SvcAlertBanner.vue")['default']>
export const LazyNuxtWelcome: LazyComponent<typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/welcome.vue")['default']> export const LazyNuxtWelcome: LazyComponent<typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/welcome.vue")['default']>
export const LazyNuxtLayout: LazyComponent<typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-layout")['default']> export const LazyNuxtLayout: LazyComponent<typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-layout")['default']>
export const LazyNuxtErrorBoundary: LazyComponent<typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-error-boundary.vue")['default']> export const LazyNuxtErrorBoundary: LazyComponent<typeof import("../../../.pnpm/nuxt@4.4.8_@babel+plugin-syntax-jsx@7.29.7_@babel+core@7.29.7__@babel+plugin-syntax-typ_25b4a4016600149c0331b87503aafc6b/node_modules/nuxt/dist/app/components/nuxt-error-boundary.vue")['default']>

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C1u1NIe5.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/B0TjgAkR.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CO60jE1q.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BIXaKwU_.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BtOu2QXF.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BJhUngVd.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BPYtLuIu.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BMQvQYtl.js

@ -1 +1 @@
import{_ as o,o as s,c as a,a as t,t as r}from"./Ccu6Xgpt.js";import{u as i}from"./oiJG5Pzc.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"./mElhLwm2.js";import{u as i}from"./OLpUuA7c.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};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/B8Fu162H.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BRt-3vKG.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DSpyBzHW.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Bf3Eg9kO.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/D-7b2ops.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Bpb__dU6.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BOUWbQhH.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BqjD6jMG.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C3hsc2UX.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BuCQ8FwD.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CFdmUKvC.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C-2gsgTH.js

@ -1 +1 @@
import{g as h,j as x,k as w,B as y,c as r,a as e,t as d,l as b,m as _,p as v,v as g,n as k,y as B,x as u,o as p,_ as M}from"./Ccu6Xgpt.js";const A={class:"login-bg flex items-center justify-center px-4"},z={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=B({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function f(){l.value=!0,n.value="";try{const s=await $fetch("/web/api/api_login",{method:"POST",body:{account:o.account,password:o.password}});s.code===0&&s.data?(a.setLoginData(s.data),c.push("/dashboard")):n.value=s.msg||"登录失败"}catch{n.value="网络错误,请检查连接"}finally{l.value=!1}}return(s,t)=>(p(),r("div",A,[e("div",z,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(f,["prevent"])},[e("div",j,[t[5]||(t[5]=e("label",{class:"login-label"},"账号",-1)),v(e("input",{"onUpdate:modelValue":t[0]||(t[0]=i=>o.account=i),type:"text",class:"login-input",placeholder:"请输入管理员账号",autocomplete:"username",required:""},null,512),[[g,o.account]])]),e("div",D,[t[6]||(t[6]=e("label",{class:"login-label"},"密码",-1)),v(e("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>o.password=i),type:"password",class:"login-input",placeholder:"请输入密码",autocomplete:"current-password",required:""},null,512),[[g,o.password]])]),e("button",{type:"submit",class:k(["login-btn",{loading:l.value}])},d(l.value?"登录中...":"登 录"),3)],32),t[7]||(t[7]=e("p",{style:{"text-align":"center","font-size":"11px",color:"#94A3B8","margin-top":"24px"}}," © 2025 Admin Console · v1.0.1 ",-1))])]))}}),O=M(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default}; import{g as h,j as x,k as w,B as y,c as r,a as e,t as d,l as b,m as _,p as v,v as g,n as k,y as B,x as u,o as p,_ as M}from"./mElhLwm2.js";const A={class:"login-bg flex items-center justify-center px-4"},z={class:"login-card"},C={class:"text-center"},S={style:{"font-size":"22px","font-weight":"700",color:"#0F172A",margin:"0 0 4px"}},T={key:0,class:"login-error show"},V={style:{width:"16px",height:"16px","flex-shrink":"0"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},j={style:{"margin-bottom":"16px"}},D={style:{"margin-bottom":"24px"}},q=h({__name:"index",setup(L){const a=x(),c=w(),o=B({account:"",password:""}),l=u(!1),n=u(""),m=u("Admin");y(async()=>{if(a.restore(),a.token){c.push("/dashboard");return}try{const t=(await $fetch("/web/api/api_getsiteinfo",{method:"POST",body:{}}))?.data?.sitename;t&&(m.value=t+" Admin",a.setSiteTitle(t))}catch{}});async function f(){l.value=!0,n.value="";try{const s=await $fetch("/web/api/api_login",{method:"POST",body:{account:o.account,password:o.password}});s.code===0&&s.data?(a.setLoginData(s.data),c.push("/dashboard")):n.value=s.msg||"登录失败"}catch{n.value="网络错误,请检查连接"}finally{l.value=!1}}return(s,t)=>(p(),r("div",A,[e("div",z,[e("div",C,[t[2]||(t[2]=e("div",{class:"logo-icon"},[e("svg",{class:"h-7 w-7 text-white",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),e("h1",S,d(m.value),1),t[3]||(t[3]=e("p",{style:{"font-size":"13px",color:"#94A3B8",margin:"0 0 32px"}},"管理控制台",-1))]),n.value?(p(),r("div",T,[(p(),r("svg",V,[...t[4]||(t[4]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("span",null,d(n.value),1)])):b("",!0),e("form",{onSubmit:_(f,["prevent"])},[e("div",j,[t[5]||(t[5]=e("label",{class:"login-label"},"账号",-1)),v(e("input",{"onUpdate:modelValue":t[0]||(t[0]=i=>o.account=i),type:"text",class:"login-input",placeholder:"请输入管理员账号",autocomplete:"username",required:""},null,512),[[g,o.account]])]),e("div",D,[t[6]||(t[6]=e("label",{class:"login-label"},"密码",-1)),v(e("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>o.password=i),type:"password",class:"login-input",placeholder:"请输入密码",autocomplete:"current-password",required:""},null,512),[[g,o.password]])]),e("button",{type:"submit",class:k(["login-btn",{loading:l.value}])},d(l.value?"登录中...":"登 录"),3)],32),t[7]||(t[7]=e("p",{style:{"text-align":"center","font-size":"11px",color:"#94A3B8","margin-top":"24px"}}," © 2025 Admin Console · v1.0.1 ",-1))])]))}}),O=M(q,[["__scopeId","data-v-3a3bca03"]]);export{O as default};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/aWlcN8xt.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C2WfoPPr.js

@ -1 +1 @@
import{g as t,B as n,P as a,c as o,a as s,o as c}from"./Ccu6Xgpt.js";const i={class:"py-16 text-center text-slate-400"},m=t({__name:"mcpconfig",setup(l){return n(()=>{a("/serviceconfig")}),(r,e)=>(c(),o("div",i,[...e[0]||(e[0]=[s("span",{class:"loading loading-spinner loading-sm"},null,-1),s("p",{class:"text-sm mt-3"},"MCP 配置已并入「第三方服务配置」,正在跳转…",-1)])]))}});export{m as default}; import{g as t,B as n,P as a,c as o,a as s,o as c}from"./mElhLwm2.js";const i={class:"py-16 text-center text-slate-400"},m=t({__name:"mcpconfig",setup(l){return n(()=>{a("/serviceconfig")}),(r,e)=>(c(),o("div",i,[...e[0]||(e[0]=[s("span",{class:"loading loading-spinner loading-sm"},null,-1),s("p",{class:"text-sm mt-3"},"MCP 配置已并入「第三方服务配置」,正在跳转…",-1)])]))}});export{m as default};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Um-KoueI.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C6twYRfy.js

@ -1 +1 @@
import{j as w,k as d}from"./Ccu6Xgpt.js";import{u as h}from"./CH2ZVAK2.js";async function f(o,i,a){const e=w(),u=d(),s={"Content-Type":"application/json"};e.token&&(s.Authorization=e.token),a&&Object.assign(s,a);const t=await fetch(o,{method:"POST",headers:s,body:JSON.stringify(i)});if(!t.ok)throw new Error(`HTTP error: ${t.status}`);const n=await t.json();if(n.code===18)throw e.logout(),u.push("/"),new Error(n.msg||"Unauthorized");if(n.code!==0)throw new Error(n.msg||"Unknown error");return n.data}const y=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function g(o){return!y.test(o)}function A(){const o=w(),{begin:i,end:a}=h();async function e(t,n){const r={};if(o.currentAppId&&(r["X-App-Id"]=String(o.currentAppId)),!g(t))return f(`/web/api/api_${t}`,n??{},r);i();try{return await f(`/web/api/api_${t}`,n??{},r)}finally{a()}}async function u(t,n){return f(`/console/api/${t}`,n??{})}async function s(t,n){const r=t.type||"application/octet-stream",c=await e("getcostoken",{path:n,filename:t.name,content_type:r}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":r},body:t});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:e,consoleApi:u,uploadFile:s}}export{A as u}; import{j as w,k as d}from"./mElhLwm2.js";import{u as h}from"./qig5Qp6S.js";async function f(o,i,a){const e=w(),u=d(),s={"Content-Type":"application/json"};e.token&&(s.Authorization=e.token),a&&Object.assign(s,a);const t=await fetch(o,{method:"POST",headers:s,body:JSON.stringify(i)});if(!t.ok)throw new Error(`HTTP error: ${t.status}`);const n=await t.json();if(n.code===18)throw e.logout(),u.push("/"),new Error(n.msg||"Unauthorized");if(n.code!==0)throw new Error(n.msg||"Unknown error");return n.data}const y=/^(get|list|load|query|fetch|search|count|stat|export|check)/i;function g(o){return!y.test(o)}function A(){const o=w(),{begin:i,end:a}=h();async function e(t,n){const r={};if(o.currentAppId&&(r["X-App-Id"]=String(o.currentAppId)),!g(t))return f(`/web/api/api_${t}`,n??{},r);i();try{return await f(`/web/api/api_${t}`,n??{},r)}finally{a()}}async function u(t,n){return f(`/console/api/${t}`,n??{})}async function s(t,n){const r=t.type||"application/octet-stream",c=await e("getcostoken",{path:n,filename:t.name,content_type:r}),p=c.upload_url||c.url||"";if(!p)throw new Error("未获取到上传地址:请确认已在【第三方服务配置→存储】配置并启用「阿里云 OSS」");const l=await fetch(p,{method:"PUT",headers:{"Content-Type":r},body:t});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return c.url||p.split("?")[0]}return{webApi:e,consoleApi:u,uploadFile:s}}export{A as u};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BQIhlerM.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CRsHkMZx.js

File diff suppressed because one or more lines are too long

1
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C_VX9uKy.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/BgemqguF.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CcYro5R2.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/szhsDUYv.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CglQi8MB.js

@ -1 +1 @@
import{L as y,l as x}from"./ChQPCk92.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,z as h,o as s,d as B,_ as N}from"./Ccu6Xgpt.js";const L={class:"lang-select"},O={class:"lang-chip-name"},S=["onClick"],j={key:0,class:"lang-empty"},z={key:0,class:"lang-dd"},F={class:"lang-dd-sum"},I={class:"lang-dd-panel"},T=["checked","onChange"],$={class:"lang-opt-code"},w={class:"lang-opt-name"},A=["value","disabled"],D=["value"],E=V({__name:"LangSelect",props:{modelValue:{},multiple:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},options:{default:void 0}},emits:["update:modelValue"],setup(c,{emit:f}){const d=c,m=f,p=h(()=>d.options&&d.options.length?d.options:y),i=h(()=>(d.modelValue||"").split(",").map(a=>a.trim()).filter(Boolean));function v(a){return x(a)}function _(a){if(d.disabled)return;const n=i.value.slice(),e=n.indexOf(a);e>=0?n.splice(e,1):n.push(a),m("update:modelValue",n.join(","))}function b(a){m("update:modelValue",a.target.value)}return(a,n)=>(s(),t("div",L,[c.multiple?(s(),t(u,{key:0},[l("div",{class:C(["lang-chips",{"lang-disabled":c.disabled}])},[(s(!0),t(u,null,r(i.value,e=>(s(),t("span",{key:e,class:"lang-chip"},[B(o(e),1),l("span",O,o(v(e)),1),l("button",{type:"button",class:"lang-x",onClick:k=>_(e)},"×",8,S)]))),128)),i.value.length?g("",!0):(s(),t("span",j,"未选择语言"))],2),c.disabled?g("",!0):(s(),t("details",z,[l("summary",F,"+ 选择语言(已选 "+o(i.value.length)+")",1),l("div",I,[(s(!0),t(u,null,r(p.value,e=>(s(),t("label",{key:e.code,class:"lang-opt"},[l("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:i.value.includes(e.code),onChange:k=>_(e.code)},null,40,T),l("span",$,o(e.code),1),l("span",w,o(e.name),1)]))),128))])]))],64)):(s(),t("select",{key:1,class:"select select-bordered select-sm w-full text-xs",value:c.modelValue,disabled:c.disabled,onChange:b},[n[0]||(n[0]=l("option",{value:""},"(未设置)",-1)),(s(!0),t(u,null,r(p.value,e=>(s(),t("option",{key:e.code,value:e.code},o(e.code)+" · "+o(e.name),9,D))),128))],40,A))]))}}),q=Object.assign(N(E,[["__scopeId","data-v-4903af59"]]),{__name:"LangSelect"});export{q as _}; import{L as y,l as x}from"./ChQPCk92.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,z as h,o as s,d as B,_ as N}from"./mElhLwm2.js";const L={class:"lang-select"},O={class:"lang-chip-name"},S=["onClick"],j={key:0,class:"lang-empty"},z={key:0,class:"lang-dd"},F={class:"lang-dd-sum"},I={class:"lang-dd-panel"},T=["checked","onChange"],$={class:"lang-opt-code"},w={class:"lang-opt-name"},A=["value","disabled"],D=["value"],E=V({__name:"LangSelect",props:{modelValue:{},multiple:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},options:{default:void 0}},emits:["update:modelValue"],setup(c,{emit:f}){const d=c,m=f,p=h(()=>d.options&&d.options.length?d.options:y),i=h(()=>(d.modelValue||"").split(",").map(a=>a.trim()).filter(Boolean));function v(a){return x(a)}function _(a){if(d.disabled)return;const n=i.value.slice(),e=n.indexOf(a);e>=0?n.splice(e,1):n.push(a),m("update:modelValue",n.join(","))}function b(a){m("update:modelValue",a.target.value)}return(a,n)=>(s(),t("div",L,[c.multiple?(s(),t(u,{key:0},[l("div",{class:C(["lang-chips",{"lang-disabled":c.disabled}])},[(s(!0),t(u,null,r(i.value,e=>(s(),t("span",{key:e,class:"lang-chip"},[B(o(e),1),l("span",O,o(v(e)),1),l("button",{type:"button",class:"lang-x",onClick:k=>_(e)},"×",8,S)]))),128)),i.value.length?g("",!0):(s(),t("span",j,"未选择语言"))],2),c.disabled?g("",!0):(s(),t("details",z,[l("summary",F,"+ 选择语言(已选 "+o(i.value.length)+")",1),l("div",I,[(s(!0),t(u,null,r(p.value,e=>(s(),t("label",{key:e.code,class:"lang-opt"},[l("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:i.value.includes(e.code),onChange:k=>_(e.code)},null,40,T),l("span",$,o(e.code),1),l("span",w,o(e.name),1)]))),128))])]))],64)):(s(),t("select",{key:1,class:"select select-bordered select-sm w-full text-xs",value:c.modelValue,disabled:c.disabled,onChange:b},[n[0]||(n[0]=l("option",{value:""},"(未设置)",-1)),(s(!0),t(u,null,r(p.value,e=>(s(),t("option",{key:e.code,value:e.code},o(e.code)+" · "+o(e.name),9,D))),128))],40,A))]))}}),q=Object.assign(N(E,[["__scopeId","data-v-4903af59"]]),{__name:"LangSelect"});export{q as _};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CCYeqIml.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CvHBDjjq.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/zsrSRWp_.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CyqrlMkw.js

@ -1 +1 @@
import{_ as t,o,c as s,R as c}from"./Ccu6Xgpt.js";const r={},a={class:"min-h-screen","data-theme":"corporate"};function n(e,_){return o(),s("div",a,[c(e.$slots,"default")])}const l=t(r,[["render",n]]);export{l as default}; import{_ as t,o,c as s,R as c}from"./mElhLwm2.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};

2
apps/admin/.output/public/_nuxt/CAgv4ClK.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/D-lUY2ZC.js

@ -1,4 +1,4 @@
import{g as G,B as K,Q as P,c as a,a as e,d as u,p as x,q as M,F as f,r as U,v as Q,s as Y,t as n,x as i,z as E,o,n as F,l as I,_ as Z}from"./Ccu6Xgpt.js";import{u as J}from"./Um-KoueI.js";import{u as W}from"./DvwKXRUn.js";import"./CH2ZVAK2.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=G({__name:"statlog",setup(Ct){const{webApi:A}=J(),{success:O,error:R}=W(),z={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?z[l]||l:"-"}const c=i([]),_=i(!1),g=i(""),L=i("-"),N=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function S(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const V=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function B(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function H(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+S(t.product_id)+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await A("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function j(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗? import{g as G,B as K,Q as P,c as a,a as e,d as u,p as x,q as M,F as f,r as U,v as Q,s as Y,t as n,x as i,z as E,o,n as F,l as I,_ as Z}from"./mElhLwm2.js";import{u as J}from"./C6twYRfy.js";import{u as W}from"./FVTAbpot.js";import"./qig5Qp6S.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},gt={key:1,class:"muted"},xt={class:"muted"},_t={class:"muted"},yt={class:"muted"},bt={key:0,class:"muted"},ht={class:"t"},wt={key:0,class:"late"},kt=G({__name:"statlog",setup(Ct){const{webApi:A}=J(),{success:O,error:R}=W(),z={cn:"中国",us:"美国",ea:"东亚",sea:"东南亚",sa:"南亚",me:"中东",eu:"欧洲",ru:"俄罗斯",af:"非洲",sam:"南美",nam:"北美",oc:"大洋洲",br:"巴西",in:"印度"};function D(l){return l?z[l]||l:"-"}const c=i([]),_=i(!1),g=i(""),L=i("-"),N=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function S(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const V=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function B(l){return l==="error"?{cls:"lv-error",txt:"解析失败"}:l==="warn"?{cls:"lv-warn",txt:"未落库"}:{cls:"lv-info",txt:"已落库"}}function H(l){return!!(l.snap_ts&&l.ts&&l.ts-l.snap_ts>120)}const T=E(()=>{const l=b.value,s=h.value.trim().toLowerCase();return c.value.filter(t=>!(l&&t.level!==l||s&&((t.app||"")+" "+(t.region||"")+" "+D(t.region)+" "+(t.product_id||"")+" "+S(t.product_id)+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){_.value=!0,g.value="";try{const l=await A("getstatlogs",{day:v.value||0});c.value=l?.entries||[],L.value=l?.total!=null?l.total:c.value.length,N.value=c.value.length?C(c.value[0].ts):"--"}catch(l){g.value=l?.message||"网络异常"}finally{_.value=!1}}async function j(){const l=v.value||0,s=V.value.find(r=>r.value===l),t=s?s.label:""+l;if(window.confirm("确定清空「"+t+`」的接收流水吗?
只清除本核对面板的记录,不影响已落库的统计数据。 只清除本核对面板的记录,不影响已落库的统计数据。
清空后可重新触发埋点,观察是否正常进来。`))try{const r=await A("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function q(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return K(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[x(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,U(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[M,v.value,void 0,{number:!0}]]),x(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[M,b.value]]),x(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品"},null,512),[[Q,h.value]]),e("label",st,[x(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:q},null,544),[[Y,w.value]]),s[5]||(s[5]=u(" 自动刷新 ",-1))]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:m},"刷新"),e("button",{class:"btn btn-outline btn-error btn-sm",title:"清空本日核对流水(不影响已落库的统计数据),清空后可重新观察埋点是否正常进来",onClick:j},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(N.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[_.value?(o(),a("div",ct,"加载中...")):g.value?(o(),a("div",dt,"加载失败:"+n(g.value),1)):T.value.length?(o(!0),a(f,{key:3},U(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",B(t.level).cls])},n(B(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?I("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(S(t.product_id)),1)]),e("div",yt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",bt," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=Z(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default}; 清空后可重新触发埋点,观察是否正常进来。`))try{const r=await A("clearstatlogs",{day:l});O("已清空 "+(r&&r.cleared!=null?r.cleared:0)+" 条"),m()}catch(r){R("清空失败:"+(r?.message||"网络异常"))}}function q(){w.value?(d=X(m,15e3),y.value="· 每 15 秒自动刷新"):(d&&clearInterval(d),d=null,y.value="")}return K(()=>{v.value=p(0),m()}),P(()=>{d&&clearInterval(d)}),(l,s)=>(o(),a("div",null,[e("div",$,[s[6]||(s[6]=e("div",null,[e("h2",{class:"text-lg font-bold text-slate-700"},"统计日志"),e("p",{class:"text-xs text-slate-400 mt-0.5"},[u("console 从 NATS 收到的「当日统计快照」接收流水(最新在前,按接收时间分天存 Redis)。各业务部署每个同步周期/启动时/0点 推送一次当日绝对快照,console 收到后覆盖落库。用于核对每个部署是否在正常汇报;带 "),e("span",{class:"unreg"},"未注册"),u(" 的应用快照已收到但"),e("b",null,"不会落库"),u("(应用名需与 console 注册表完全一致)。")])],-1)),e("div",tt,[x(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,U(V.value,t=>(o(),a("option",{key:t.value,value:t.value},n(t.label),9,et))),128))],544),[[M,v.value,void 0,{number:!0}]]),x(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[M,b.value]]),x(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品"},null,512),[[Q,h.value]]),e("label",st,[x(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange:q},null,544),[[Y,w.value]]),s[5]||(s[5]=u(" 自动刷新 ",-1))]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:m},"刷新"),e("button",{class:"btn btn-outline btn-error btn-sm",title:"清空本日核对流水(不影响已落库的统计数据),清空后可重新观察埋点是否正常进来",onClick:j},"清空本日")])]),e("div",lt,[e("span",null,[s[7]||(s[7]=u("该日保留 ",-1)),e("b",nt,n(L.value),1),s[8]||(s[8]=u(" 条",-1))]),e("span",null,[s[9]||(s[9]=u("当前显示 ",-1)),e("b",at,n(T.value.length),1),s[10]||(s[10]=u(" 条",-1))]),e("span",null,[s[11]||(s[11]=u("最近接收 ",-1)),e("b",ot,n(N.value),1)]),e("span",rt,n(y.value),1)]),e("div",ut,[s[12]||(s[12]=e("div",{id:"logHead"},[e("div",null,"接收时间"),e("div",null,"级别"),e("div",null,"应用 · 区域 · 产品"),e("div",null,"统计日"),e("div",null,"指标摘要 / 说明"),e("div",null,"快照时间")],-1)),e("div",it,[_.value?(o(),a("div",ct,"加载中...")):g.value?(o(),a("div",dt,"加载失败:"+n(g.value),1)):T.value.length?(o(!0),a(f,{key:3},U(T.value,(t,r)=>(o(),a("div",{key:r,class:"logrow"},[e("div",pt,n(C(t.ts)),1),e("div",null,[e("span",{class:F(["lv",B(t.level).cls])},n(B(t.level).txt),3)]),e("div",null,[t.app?(o(),a(f,{key:0},[e("span",mt,n(t.app),1),t.registered?I("",!0):(o(),a("span",ft,"未注册"))],64)):(o(),a("span",gt,"(无应用名)")),e("span",xt," · "+n(D(t.region)),1),e("span",_t," · "+n(S(t.product_id)),1)]),e("div",yt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",bt," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",ht,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",wt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Lt=Z(kt,[["__scopeId","data-v-742ee359"]]);export{Lt as default};

2
apps/admin/.output/public/_nuxt/DdRUm5PD.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DACw1I5K.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/Sgx9LvLK.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DG0IG_4u.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/CGLKuRNo.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DGSd_XG-.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DNpGoo60.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Db4U27_j.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/vijQW-l0.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/Ddg4glGj.js

@ -1 +1 @@
import{_ as s}from"./DiXjRAbV.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./Ccu6Xgpt.js";import{u as f}from"./oiJG5Pzc.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"./DuRQSWLc.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./mElhLwm2.js";import{u as f}from"./OLpUuA7c.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};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DiXjRAbV.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DuRQSWLc.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DazkwkSm.js → apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DwmKnEeH.js

File diff suppressed because one or more lines are too long

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save