Browse Source

上传发布版本

main
liwei1dao 2 months ago
parent
commit
59e54eb575
  1. 13
      CLAUDE.md
  2. 2
      apps/admin/.nuxt/components.d.ts
  3. 1
      apps/admin/.nuxt/imports.d.ts
  4. 1
      apps/admin/.nuxt/manifest/meta/be000b5b-b015-49af-b965-1b4d373c9fb5.json
  5. 2
      apps/admin/.nuxt/tailwind/postcss.mjs
  6. 2
      apps/admin/.nuxt/tsconfig.app.json
  7. 2
      apps/admin/.nuxt/tsconfig.json
  8. 2
      apps/admin/.nuxt/tsconfig.shared.json
  9. 2
      apps/admin/.nuxt/types/components.d.ts
  10. 17
      apps/admin/.nuxt/types/imports.d.ts
  11. 2
      apps/admin/.output/nitro.json
  12. 4
      apps/admin/.output/public/_nuxt/AL6uUoB7.js
  13. 2
      apps/admin/.output/public/_nuxt/B7NGm2dJ.js
  14. 2
      apps/admin/.output/public/_nuxt/BIcyFk-G.js
  15. 2
      apps/admin/.output/public/_nuxt/BXUzoo8t.js
  16. 2
      apps/admin/.output/public/_nuxt/Bg9fagxx.js
  17. 2
      apps/admin/.output/public/_nuxt/BgfmgSoF.js
  18. 1
      apps/admin/.output/public/_nuxt/BqXDZ2AY.js
  19. 2
      apps/admin/.output/public/_nuxt/BspH28f-.js
  20. 1
      apps/admin/.output/public/_nuxt/BuGAg23m.js
  21. 2
      apps/admin/.output/public/_nuxt/BxVxeVBU.js
  22. 2
      apps/admin/.output/public/_nuxt/Bz71n8Et.js
  23. 4
      apps/admin/.output/public/_nuxt/C-NJnooU.js
  24. 2
      apps/admin/.output/public/_nuxt/CAc-j08b.js
  25. 2
      apps/admin/.output/public/_nuxt/CBvSq8ZW.js
  26. 2
      apps/admin/.output/public/_nuxt/CCXUc8Lq.js
  27. 2
      apps/admin/.output/public/_nuxt/CCixCNzH.js
  28. 1
      apps/admin/.output/public/_nuxt/CIEw-zYq.js
  29. 4
      apps/admin/.output/public/_nuxt/CSjlBIfC.js
  30. 2
      apps/admin/.output/public/_nuxt/CbX7ORWo.js
  31. 2
      apps/admin/.output/public/_nuxt/Cf3nxYW9.js
  32. 1
      apps/admin/.output/public/_nuxt/ChQPCk92.js
  33. 4
      apps/admin/.output/public/_nuxt/Cj-iqGsV.js
  34. 1
      apps/admin/.output/public/_nuxt/CmmnvhJf.js
  35. 1
      apps/admin/.output/public/_nuxt/D3-sOQuQ.js
  36. 2
      apps/admin/.output/public/_nuxt/D3cHTYFX.js
  37. 2
      apps/admin/.output/public/_nuxt/D4CduUmj.js
  38. 1
      apps/admin/.output/public/_nuxt/DD3V9C6_.js
  39. 2
      apps/admin/.output/public/_nuxt/DTQY3iF_.js
  40. 1
      apps/admin/.output/public/_nuxt/DTdW2vzI.js
  41. 2
      apps/admin/.output/public/_nuxt/D_urMdl7.js
  42. 1
      apps/admin/.output/public/_nuxt/Dcjzwjeu.js
  43. 2
      apps/admin/.output/public/_nuxt/Dfh2Yz3-.js
  44. 1
      apps/admin/.output/public/_nuxt/DgF_fRjV.js
  45. 2
      apps/admin/.output/public/_nuxt/DlR-ZWzp.js
  46. 2
      apps/admin/.output/public/_nuxt/DnO2rKuV.js
  47. 2
      apps/admin/.output/public/_nuxt/KMPBF1C_.js
  48. 1
      apps/admin/.output/public/_nuxt/WmWvk3I3.js
  49. 1
      apps/admin/.output/public/_nuxt/accounts.D2VFobOs.css
  50. 1
      apps/admin/.output/public/_nuxt/accounts.vxGnCxY1.css
  51. 2
      apps/admin/.output/public/_nuxt/biHViw9u.js
  52. 2
      apps/admin/.output/public/_nuxt/builds/latest.json
  53. 1
      apps/admin/.output/public/_nuxt/builds/meta/195ddb9e-078c-4238-82de-ba95840a71bc.json
  54. 1
      apps/admin/.output/public/_nuxt/builds/meta/24e01d06-12c5-401a-ad62-3d0500cb591f.json
  55. 2
      apps/admin/.output/public/_nuxt/dashboard.CBzhf2U_.css
  56. 2
      apps/admin/.output/public/_nuxt/dk_MSV25.js
  57. 2
      apps/admin/.output/public/_nuxt/eNlViwMf.js
  58. 1
      apps/admin/.output/public/_nuxt/entry.BR7WYV0V.css
  59. 1
      apps/admin/.output/public/_nuxt/entry.CEp6wLn7.css
  60. 29
      apps/admin/.output/public/_nuxt/hxUtDe_P.js
  61. 1
      apps/admin/.output/public/_nuxt/meettemplates.DBfDdqB2.css
  62. 2
      apps/admin/.output/public/_nuxt/mydnAiU4.js
  63. 29
      apps/admin/.output/public/_nuxt/r_MxzKf2.js
  64. 1
      apps/admin/.output/public/_nuxt/statlog.C1q_3yEh.css
  65. 1
      apps/admin/.output/public/_nuxt/statlog.DNW5XZ2N.css
  66. 2
      apps/admin/.output/public/_nuxt/uNE_hR3V.js
  67. 2
      apps/admin/.output/public/_nuxt/uNuDPE5V.js
  68. 2
      apps/admin/.output/public/_nuxt/zmPJ0MLk.js
  69. 4
      apps/admin/.output/server/chunks/build/LangSelect-Bvw-e1Cn.mjs
  70. 1
      apps/admin/.output/server/chunks/build/LangSelect-Bvw-e1Cn.mjs.map
  71. 1
      apps/admin/.output/server/chunks/build/LangSelect-C_QPlcDf.mjs.map
  72. 199
      apps/admin/.output/server/chunks/build/accounts-C1hb7WMW.mjs
  73. 1
      apps/admin/.output/server/chunks/build/accounts-C1hb7WMW.mjs.map
  74. 184
      apps/admin/.output/server/chunks/build/accounts-Do2bLhnl.mjs
  75. 1
      apps/admin/.output/server/chunks/build/accounts-Do2bLhnl.mjs.map
  76. 8
      apps/admin/.output/server/chunks/build/accounts-styles.BDB5hjDL.mjs
  77. 1
      apps/admin/.output/server/chunks/build/accounts-styles.BDB5hjDL.mjs.map
  78. 8
      apps/admin/.output/server/chunks/build/accounts-styles.E9MHodaB.mjs
  79. 1
      apps/admin/.output/server/chunks/build/accounts-styles.E9MHodaB.mjs.map
  80. 1
      apps/admin/.output/server/chunks/build/agents-C12ARvzr.mjs.map
  81. 6
      apps/admin/.output/server/chunks/build/agents-CIlOwJNK.mjs
  82. 1
      apps/admin/.output/server/chunks/build/agents-CIlOwJNK.mjs.map
  83. 1
      apps/admin/.output/server/chunks/build/calltranslate-D-FgQw8P.mjs.map
  84. 6
      apps/admin/.output/server/chunks/build/calltranslate-_E_BEUJD.mjs
  85. 1
      apps/admin/.output/server/chunks/build/calltranslate-_E_BEUJD.mjs.map
  86. 2
      apps/admin/.output/server/chunks/build/client.precomputed.mjs
  87. 1
      apps/admin/.output/server/chunks/build/dashboard-CXdhxG8p.mjs.map
  88. 77
      apps/admin/.output/server/chunks/build/dashboard-DNJrSuH-.mjs
  89. 1
      apps/admin/.output/server/chunks/build/dashboard-DNJrSuH-.mjs.map
  90. 11
      apps/admin/.output/server/chunks/build/dashboard-styles.8Bs-G9zJ.mjs
  91. 1
      apps/admin/.output/server/chunks/build/dashboard-styles.8Bs-G9zJ.mjs.map
  92. 11
      apps/admin/.output/server/chunks/build/dashboard-styles.CHktdCkV.mjs
  93. 1
      apps/admin/.output/server/chunks/build/dashboard-styles.CHktdCkV.mjs.map
  94. 190
      apps/admin/.output/server/chunks/build/dealers-D0gf3N66.mjs
  95. 1
      apps/admin/.output/server/chunks/build/dealers-D0gf3N66.mjs.map
  96. 1
      apps/admin/.output/server/chunks/build/device-B1tPcS6i.mjs.map
  97. 36
      apps/admin/.output/server/chunks/build/device-C1RxH3sw.mjs
  98. 1
      apps/admin/.output/server/chunks/build/device-C1RxH3sw.mjs.map
  99. 1
      apps/admin/.output/server/chunks/build/factory-BCjt3r8_.mjs.map
  100. 17
      apps/admin/.output/server/chunks/build/factory-Bvr021eV.mjs

13
CLAUDE.md

@ -77,9 +77,16 @@ cd deploy/console && ./prod-deploy.sh 0.2.1 yunyan # 第 2 个参数选生产
- `along` → 8.133.166.29(阿里云,x86_64/Docker 24.0.9),目录 `/home/work/starpivot/{app,admin,console}`,密钥 `~/.ssh/along.pem`
该机已自带 postgres:16 / redis:7 / mysql / NPM / gitea / docker-registry,配 `.env` 时优先复用,别另起一套
**生产镜像名也按公司区分**,映射同在 `registry-profiles.sh` 的 `prod_image_name()`(build 与 deploy 共用一份,防漂移):
admin/console 两家都用 `starpivot-*`(与 `docker-compose.yml` 里写死的 image/container_name 一致);
只有云雁的 app 仍是 `voitrans-a11`(上海机正跑着 7 个该镜像的容器,改名 compose 会认不出)。
**生产镜像名统一为 `starpivot-<服务>`**(admin/console/app 三个服务、两家公司都一样),映射在
`registry-profiles.sh` 的 `prod_image_name()`——build 与 deploy 共用这一份,别在各脚本里写死。
compose 的 image 由脚本注入 `IMAGE_NAME` 变量,同样不写死。
⚠️ app 的旧名 `voitrans-a11` 已于 2026-08-10 废弃,仓库里该名下的旧 tag(如 0.1.2)**不会自动搬到新名**,
换名后首次上线要重新 `./prod-build.sh <version>` 推一版;服务器上手工维护的 `docker-compose.yml`
也要同步成新模板(脚本只下发 `.example`,不覆盖真实文件)。
注意 `voitrans-a11` 这个串还用在**别的语义**上,那些不能动:`confs/*.yaml` 的 `CLUSTER_TAG`(etcd 集群标签,
改了服务互相发现不到)、`home.yaml` 的 `ANALYZE_APP_NAME`(须与 console 注册表应用名一致)、
`prod-deploy.sh` APPS 里的远端目录 `/home/work/voitrans-a11`。
admin/console 的 `prod-deploy.sh` 已改为**多生产环境档案**(`env_profile()`,同 `dev-deploy.sh` 的写法):
- `yunyan` → 139.224.212.237(上海阿里云,与业务后端 app 同机),目录 `/home/work/starpivot/{admin,console}`,密钥 `~/Documents/key/aliyun_shanghai.pem`

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

@ -19,6 +19,7 @@ export const AppLoading: typeof import("../app/components/AppLoading.vue")['defa
export const AppModuleTab: typeof import("../app/components/AppModuleTab.vue")['default']
export const AppToast: typeof import("../app/components/AppToast.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("../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/welcome.vue")['default']
export const NuxtLayout: typeof import("../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/nuxt-layout")['default']
export const NuxtErrorBoundary: typeof import("../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/nuxt-error-boundary.vue")['default']
@ -48,6 +49,7 @@ export const LazyAppLoading: LazyComponent<typeof import("../app/components/AppL
export const LazyAppModuleTab: LazyComponent<typeof import("../app/components/AppModuleTab.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 LazySvcAlertBanner: LazyComponent<typeof import("../app/components/SvcAlertBanner.vue")['default']>
export const LazyNuxtWelcome: LazyComponent<typeof import("../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/welcome.vue")['default']>
export const LazyNuxtLayout: LazyComponent<typeof import("../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/nuxt-layout")['default']>
export const LazyNuxtErrorBoundary: LazyComponent<typeof import("../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/nuxt-error-boundary.vue")['default']>

1
apps/admin/.nuxt/imports.d.ts

@ -36,5 +36,6 @@ export { LANG_OPTIONS, langName, LangOption } from '../app/composables/useLangOp
export { useLoading } from '../app/composables/useLoading';
export { useToast, ToastType, Toast } from '../app/composables/useToast';
export { MENU_GROUPS, ALL_MENU_IDS, DEFAULT_ADMIN_ACCESS, menuItemByPath, MenuItem, MenuGroup } from '../app/utils/menus';
export { REGION_LABEL, CAT_LABEL, STATUS_META, PROBE_META, healthReason, healthLastRunText, parseCats, SvcHealth } from '../app/utils/svchealth';
export { IDENTITY_LABELS, useAuthStore } from '../app/stores/auth';
export { defineStore, acceptHMRUpdate, usePinia, storeToRefs } from '../node_modules/.pnpm/@pinia+nuxt@0.11.3_magicast@0.5.3_pinia@3.0.4_typescript@5.9.3_vue@3.5.38_typescript@5.9.3__/node_modules/@pinia/nuxt/dist/runtime/composables';

1
apps/admin/.nuxt/manifest/meta/be000b5b-b015-49af-b965-1b4d373c9fb5.json

@ -0,0 +1 @@
{}

2
apps/admin/.nuxt/tailwind/postcss.mjs

@ -1,4 +1,4 @@
// generated by the @nuxtjs/tailwindcss <https://github.com/nuxt-modules/tailwindcss> module at 7/29/2026, 10:48:13 PM
// generated by the @nuxtjs/tailwindcss <https://github.com/nuxt-modules/tailwindcss> module at 8/8/2026, 11:27:28 AM
import "@nuxtjs/tailwindcss/config-ctx"
import configMerger from "@nuxtjs/tailwindcss/merger";

2
apps/admin/.nuxt/tsconfig.app.json

@ -107,7 +107,7 @@
"./imports"
],
"#app-manifest": [
"./manifest/meta/12d3d743-ea92-4f1a-b2b5-c47534e2a158.json"
"./manifest/meta/be000b5b-b015-49af-b965-1b4d373c9fb5.json"
],
"#components": [
"./components"

2
apps/admin/.nuxt/tsconfig.json

@ -107,7 +107,7 @@
"./imports"
],
"#app-manifest": [
"./manifest/meta/12d3d743-ea92-4f1a-b2b5-c47534e2a158.json"
"./manifest/meta/be000b5b-b015-49af-b965-1b4d373c9fb5.json"
],
"#components": [
"./components"

2
apps/admin/.nuxt/tsconfig.shared.json

@ -107,7 +107,7 @@
"./imports"
],
"#app-manifest": [
"./manifest/meta/12d3d743-ea92-4f1a-b2b5-c47534e2a158.json"
"./manifest/meta/be000b5b-b015-49af-b965-1b4d373c9fb5.json"
],
"#build": [
"."

2
apps/admin/.nuxt/types/components.d.ts

@ -19,6 +19,7 @@ interface _GlobalComponents {
AppModuleTab: typeof import("../../app/components/AppModuleTab.vue")['default']
AppToast: typeof import("../../app/components/AppToast.vue")['default']
LangSelect: typeof import("../../app/components/LangSelect.vue")['default']
SvcAlertBanner: typeof import("../../app/components/SvcAlertBanner.vue")['default']
NuxtWelcome: typeof import("../../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/welcome.vue")['default']
NuxtLayout: typeof import("../../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/nuxt-layout")['default']
NuxtErrorBoundary: typeof import("../../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/nuxt-error-boundary.vue")['default']
@ -48,6 +49,7 @@ interface _GlobalComponents {
LazyAppModuleTab: LazyComponent<typeof import("../../app/components/AppModuleTab.vue")['default']>
LazyAppToast: LazyComponent<typeof import("../../app/components/AppToast.vue")['default']>
LazyLangSelect: LazyComponent<typeof import("../../app/components/LangSelect.vue")['default']>
LazySvcAlertBanner: LazyComponent<typeof import("../../app/components/SvcAlertBanner.vue")['default']>
LazyNuxtWelcome: LazyComponent<typeof import("../../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/welcome.vue")['default']>
LazyNuxtLayout: LazyComponent<typeof import("../../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/nuxt-layout")['default']>
LazyNuxtErrorBoundary: LazyComponent<typeof import("../../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/nuxt-error-boundary.vue")['default']>

17
apps/admin/.nuxt/types/imports.d.ts

@ -2,10 +2,14 @@
export {}
declare global {
const ALL_MENU_IDS: typeof import('../../app/utils/menus').ALL_MENU_IDS
const CAT_LABEL: typeof import('../../app/utils/svchealth').CAT_LABEL
const DEFAULT_ADMIN_ACCESS: typeof import('../../app/utils/menus').DEFAULT_ADMIN_ACCESS
const IDENTITY_LABELS: typeof import('../../app/stores/auth').IDENTITY_LABELS
const LANG_OPTIONS: typeof import('../../app/composables/useLangOptions').LANG_OPTIONS
const MENU_GROUPS: typeof import('../../app/utils/menus').MENU_GROUPS
const PROBE_META: typeof import('../../app/utils/svchealth').PROBE_META
const REGION_LABEL: typeof import('../../app/utils/svchealth').REGION_LABEL
const STATUS_META: typeof import('../../app/utils/svchealth').STATUS_META
const abortNavigation: typeof import('../../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/composables/router').abortNavigation
const acceptHMRUpdate: typeof import('../../node_modules/.pnpm/@pinia+nuxt@0.11.3_magicast@0.5.3_pinia@3.0.4_typescript@5.9.3_vue@3.5.38_typescript@5.9.3__/node_modules/@pinia/nuxt/dist/runtime/composables').acceptHMRUpdate
const addRouteMiddleware: typeof import('../../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/composables/router').addRouteMiddleware
@ -40,6 +44,8 @@ declare global {
const getRouteRules: typeof import('../../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/composables/manifest').getRouteRules
const h: typeof import('vue').h
const hasInjectionContext: typeof import('vue').hasInjectionContext
const healthLastRunText: typeof import('../../app/utils/svchealth').healthLastRunText
const healthReason: typeof import('../../app/utils/svchealth').healthReason
const inject: typeof import('vue').inject
const injectHead: typeof import('../../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/composables/head').injectHead
const isNuxtError: typeof import('../../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/composables/error').isNuxtError
@ -75,6 +81,7 @@ declare global {
const onUnmounted: typeof import('vue').onUnmounted
const onUpdated: typeof import('vue').onUpdated
const onWatcherCleanup: typeof import('vue').onWatcherCleanup
const parseCats: typeof import('../../app/utils/svchealth').parseCats
const prefetchComponents: typeof import('../../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/composables/preload').prefetchComponents
const preloadComponents: typeof import('../../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/composables/preload').preloadComponents
const preloadPayload: typeof import('../../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/composables/payload').preloadPayload
@ -223,16 +230,23 @@ declare global {
// @ts-ignore
export type { MenuItem, MenuGroup } from '../../app/utils/menus'
import('../../app/utils/menus')
// @ts-ignore
export type { SvcHealth } from '../../app/utils/svchealth'
import('../../app/utils/svchealth')
}
// for vue template auto import
import { UnwrapRef } from 'vue'
declare module 'vue' {
interface ComponentCustomProperties {
readonly ALL_MENU_IDS: UnwrapRef<typeof import('../../app/utils/menus')['ALL_MENU_IDS']>
readonly CAT_LABEL: UnwrapRef<typeof import('../../app/utils/svchealth')['CAT_LABEL']>
readonly DEFAULT_ADMIN_ACCESS: UnwrapRef<typeof import('../../app/utils/menus')['DEFAULT_ADMIN_ACCESS']>
readonly IDENTITY_LABELS: UnwrapRef<typeof import('../../app/stores/auth')['IDENTITY_LABELS']>
readonly LANG_OPTIONS: UnwrapRef<typeof import('../../app/composables/useLangOptions')['LANG_OPTIONS']>
readonly MENU_GROUPS: UnwrapRef<typeof import('../../app/utils/menus')['MENU_GROUPS']>
readonly PROBE_META: UnwrapRef<typeof import('../../app/utils/svchealth')['PROBE_META']>
readonly REGION_LABEL: UnwrapRef<typeof import('../../app/utils/svchealth')['REGION_LABEL']>
readonly STATUS_META: UnwrapRef<typeof import('../../app/utils/svchealth')['STATUS_META']>
readonly abortNavigation: UnwrapRef<typeof import('../../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/composables/router')['abortNavigation']>
readonly acceptHMRUpdate: UnwrapRef<typeof import('../../node_modules/.pnpm/@pinia+nuxt@0.11.3_magicast@0.5.3_pinia@3.0.4_typescript@5.9.3_vue@3.5.38_typescript@5.9.3__/node_modules/@pinia/nuxt/dist/runtime/composables')['acceptHMRUpdate']>
readonly addRouteMiddleware: UnwrapRef<typeof import('../../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/composables/router')['addRouteMiddleware']>
@ -267,6 +281,8 @@ declare module 'vue' {
readonly getRouteRules: UnwrapRef<typeof import('../../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/composables/manifest')['getRouteRules']>
readonly h: UnwrapRef<typeof import('vue')['h']>
readonly hasInjectionContext: UnwrapRef<typeof import('vue')['hasInjectionContext']>
readonly healthLastRunText: UnwrapRef<typeof import('../../app/utils/svchealth')['healthLastRunText']>
readonly healthReason: UnwrapRef<typeof import('../../app/utils/svchealth')['healthReason']>
readonly inject: UnwrapRef<typeof import('vue')['inject']>
readonly injectHead: UnwrapRef<typeof import('../../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/composables/head')['injectHead']>
readonly isNuxtError: UnwrapRef<typeof import('../../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/composables/error')['isNuxtError']>
@ -302,6 +318,7 @@ declare module 'vue' {
readonly onUnmounted: UnwrapRef<typeof import('vue')['onUnmounted']>
readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']>
readonly onWatcherCleanup: UnwrapRef<typeof import('vue')['onWatcherCleanup']>
readonly parseCats: UnwrapRef<typeof import('../../app/utils/svchealth')['parseCats']>
readonly prefetchComponents: UnwrapRef<typeof import('../../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/composables/preload')['prefetchComponents']>
readonly preloadComponents: UnwrapRef<typeof import('../../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/composables/preload')['preloadComponents']>
readonly preloadPayload: UnwrapRef<typeof import('../../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/composables/payload')['preloadPayload']>

2
apps/admin/.output/nitro.json

@ -1,5 +1,5 @@
{
"date": "2026-08-06T10:48:06.050Z",
"date": "2026-08-10T03:14:32.463Z",
"preset": "node-server",
"framework": {
"name": "nuxt",

4
apps/admin/.output/public/_nuxt/AL6uUoB7.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/a5exfo9k.js → apps/admin/.output/public/_nuxt/B7NGm2dJ.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/0C81UldQ.js → apps/admin/.output/public/_nuxt/BIcyFk-G.js

@ -1 +1 @@
import{_ as t,o,c as s,R as c}from"./CSjlBIfC.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"./AL6uUoB7.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/Dc2nKS93.js → apps/admin/.output/public/_nuxt/BXUzoo8t.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"./CSjlBIfC.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"./DD3V9C6_.js";import{g as V,c as t,F as u,a as l,n as C,r,l as g,t as o,z as h,o as s,d as B,_ as N}from"./AL6uUoB7.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/hXX2NJw2.js → apps/admin/.output/public/_nuxt/Bg9fagxx.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CX31_Ko0.js → apps/admin/.output/public/_nuxt/BgfmgSoF.js

@ -1 +1 @@
import{j as w,k as d}from"./CSjlBIfC.js";import{u as h}from"./CgE-6DOq.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"./AL6uUoB7.js";import{u as h}from"./mydnAiU4.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};

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

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/BOeuA5fk.js → apps/admin/.output/public/_nuxt/BspH28f-.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"./CSjlBIfC.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"./AL6uUoB7.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};

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

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/hv_H8fds.js → apps/admin/.output/public/_nuxt/BxVxeVBU.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DSJrmuXT.js → apps/admin/.output/public/_nuxt/Bz71n8Et.js

File diff suppressed because one or more lines are too long

4
apps/admin/.output/public/_nuxt/C-NJnooU.js

@ -1,4 +0,0 @@
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"./CSjlBIfC.js";import{u as J}from"./CX31_Ko0.js";import{u as W}from"./QmZ_XupB.js";import"./CgE-6DOq.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};

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/2SfDgkhQ.js → apps/admin/.output/public/_nuxt/CAc-j08b.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/DEBoYqVm.js → apps/admin/.output/public/_nuxt/CBvSq8ZW.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/DYuOZo9E.js → apps/admin/.output/public/_nuxt/CCXUc8Lq.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/D1rGIbQk.js → apps/admin/.output/public/_nuxt/CCixCNzH.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/CIEw-zYq.js

File diff suppressed because one or more lines are too long

4
apps/admin/.output/public/_nuxt/CSjlBIfC.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/omoEWMdu.js → apps/admin/.output/public/_nuxt/CbX7ORWo.js

@ -1 +1 @@
import{_ as s}from"./D1rGIbQk.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./CSjlBIfC.js";import{u as f}from"./CDbX0LeJ.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"./CCixCNzH.js";import{_ as a,o as i,c as u,a as t,t as n,b as c,w as l,d}from"./AL6uUoB7.js";import{u as f}from"./eNlViwMf.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/IkD0WKHv.js → apps/admin/.output/public/_nuxt/Cf3nxYW9.js

File diff suppressed because one or more lines are too long

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

@ -1 +0,0 @@
const o=[{code:"zh-CN",name:"中文(简体)"},{code:"zh-TW",name:"中文(繁体)"},{code:"zh-HK",name:"中文(香港)"},{code:"yue-HK",name:"粤语"},{code:"en-US",name:"英语(美国)"},{code:"en-GB",name:"英语(英国)"},{code:"ja-JP",name:"日语"},{code:"ko-KR",name:"韩语"},{code:"id-ID",name:"印尼语"},{code:"es-ES",name:"西班牙语(西)"},{code:"es-MX",name:"西班牙语(墨)"},{code:"pt-BR",name:"葡萄牙语(巴西)"},{code:"pt-PT",name:"葡萄牙语(葡)"},{code:"de-DE",name:"德语"},{code:"fr-FR",name:"法语"},{code:"it-IT",name:"意大利语"},{code:"nl-NL",name:"荷兰语"},{code:"pl-PL",name:"波兰语"},{code:"ru-RU",name:"俄语"},{code:"uk-UA",name:"乌克兰语"},{code:"tr-TR",name:"土耳其语"},{code:"vi-VN",name:"越南语"},{code:"th-TH",name:"泰语"},{code:"ms-MY",name:"马来语"},{code:"fil-PH",name:"菲律宾语"},{code:"ar-SA",name:"阿拉伯语"}];function c(e){const n=o.find(a=>a.code===e);return n?n.name:e}export{o as L,c as l};

4
apps/admin/.output/public/_nuxt/Cj-iqGsV.js

@ -0,0 +1,4 @@
import{g as G,B as K,Q as P,c as a,a as e,d as u,p as g,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"./AL6uUoB7.js";import{u as J}from"./BgfmgSoF.js";import{u as W}from"./D_urMdl7.js";import"./mydnAiU4.js";const X=globalThis.setInterval,$={class:"flex items-center justify-between mb-4 flex-wrap gap-3"},tt={class:"flex items-center gap-2 flex-wrap"},et=["value"],st={class:"flex items-center gap-1 text-xs text-slate-500 cursor-pointer"},lt={class:"flex items-center gap-4 mb-3 text-xs text-slate-500"},nt={class:"text-slate-700"},at={class:"text-slate-700"},ot={class:"text-slate-700"},rt={class:"muted"},ut={class:"panel overflow-hidden"},it={id:"logBody",style:{"max-height":"calc(100vh - 230px)","overflow-y":"auto"}},ct={key:0,class:"text-center text-slate-400 py-10"},dt={key:1,class:"text-center text-red-400 py-10"},vt={key:2,class:"text-center text-slate-400 py-10"},pt={class:"t"},mt={class:"app-name"},ft={key:0,class:"unreg",title:"该应用名未在 console 注册,快照已收到但不会写入统计库"},_t={key:1,class:"muted"},gt={class:"muted"},xt={class:"muted"},yt={class:"muted"},bt={class:"muted"},ht={key:0,class:"muted"},wt={class:"t"},kt={key:0,class:"late"},Ct=G({__name:"statlog",setup(Tt){const{webApi: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([]),x=i(!1),_=i(""),L=i("-"),N=i("-"),y=i(""),v=i(0),b=i(""),h=i(""),w=i(!1);let d=null;function p(l=0){const s=new Date(Date.now()+l*864e5),t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).format(s);return parseInt(t.replace(/-/g,""),10)}function k(l){const s=""+l;return s.length===8?s.slice(0,4)+"-"+s.slice(4,6)+"-"+s.slice(6,8):s}function C(l){if(!l)return"--";const s=new Date(l*1e3),t=r=>r<10?"0"+r:""+r;return t(s.getHours())+":"+t(s.getMinutes())+":"+t(s.getSeconds())}function S(l){return l?"0x"+(l>>>0).toString(16).toUpperCase():"全部"}const V=E(()=>[{value:p(0),label:"今天 "+k(p(0))},{value:p(-1),label:"昨天 "+k(p(-1))}]);function 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.channel_id||"")+" "+(t.stat_day||"")).toLowerCase().indexOf(s)<0))});async function m(){x.value=!0,_.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){_.value=l?.message||"网络异常"}finally{x.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,[g(e("select",{"onUpdate:modelValue":s[0]||(s[0]=t=>v.value=t),class:"select select-bordered select-sm",onChange:m},[(o(!0),a(f,null,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}]]),g(e("select",{"onUpdate:modelValue":s[1]||(s[1]=t=>b.value=t),class:"select select-bordered select-sm"},[...s[4]||(s[4]=[e("option",{value:""},"全部级别",-1),e("option",{value:"info"},"已落库",-1),e("option",{value:"warn"},"未落库",-1),e("option",{value:"error"},"解析失败",-1)])],512),[[M,b.value]]),g(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>h.value=t),class:"input input-bordered input-sm w-44",placeholder:"筛选 应用/区域/产品/渠道商"},null,512),[[Q,h.value]]),e("label",st,[g(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>w.value=t),type:"checkbox",class:"checkbox checkbox-xs",onChange: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,[x.value?(o(),a("div",ct,"加载中...")):_.value?(o(),a("div",dt,"加载失败:"+n(_.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",_t,"(无应用名)")),e("span",gt," · "+n(D(t.region)),1),e("span",xt," · "+n(S(t.product_id)),1),e("span",yt," · "+n(t.channel_id||"未分配渠道"),1)]),e("div",bt,n(t.stat_day?k(t.stat_day):"-"),1),e("div",null,[t.msg?(o(),a(f,{key:0},[e("span",{class:F(t.level==="error"?"text-red-600":"text-amber-600")},n(t.msg),3),t.summary?(o(),a("span",ht," · "+n(t.summary),1)):I("",!0)],64)):(o(),a(f,{key:1},[u(n(t.summary||"无增量"),1)],64))]),e("div",wt,[u(n(C(t.snap_ts)),1),H(t)?(o(),a("span",kt,"迟到"+n(t.ts-t.snap_ts)+"s",1)):I("",!0)])]))),128)):(o(),a("div",vt,n(c.value.length?"无匹配记录":"该日暂无接收记录"),1))])])]))}}),Nt=Z(Ct,[["__scopeId","data-v-e7a3debc"]]);export{Nt as default};

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

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/D3-sOQuQ.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/SxV4xvpk.js → apps/admin/.output/public/_nuxt/D3cHTYFX.js

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/xcfsMt0Y.js → apps/admin/.output/public/_nuxt/D4CduUmj.js

File diff suppressed because one or more lines are too long

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

@ -0,0 +1 @@
const a=[{code:"zh-CN",name:"中文(简体)"},{code:"zh-TW",name:"中文(繁体)"},{code:"zh-HK",name:"中文(香港)"},{code:"yue-HK",name:"粤语"},{code:"en-US",name:"英语(美国)"},{code:"en-GB",name:"英语(英国)"},{code:"ja-JP",name:"日语"},{code:"ko-KR",name:"韩语"},{code:"id-ID",name:"印尼语"},{code:"es-ES",name:"西班牙语(西)"},{code:"es-MX",name:"西班牙语(墨)"},{code:"pt-BR",name:"葡萄牙语(巴西)"},{code:"pt-PT",name:"葡萄牙语(葡)"},{code:"de-DE",name:"德语"},{code:"fr-FR",name:"法语"},{code:"it-IT",name:"意大利语"},{code:"nl-NL",name:"荷兰语"},{code:"pl-PL",name:"波兰语"},{code:"ru-RU",name:"俄语"},{code:"uk-UA",name:"乌克兰语"},{code:"tr-TR",name:"土耳其语"},{code:"vi-VN",name:"越南语"},{code:"th-TH",name:"泰语"},{code:"ms-MY",name:"马来语"},{code:"fil-PH",name:"菲律宾语"},{code:"ar-SA",name:"阿拉伯语"}],o={"bg-BG":"保加利亚语","cs-CZ":"捷克语","da-DK":"丹麦语","el-GR":"希腊语","et-EE":"爱沙尼亚语","fa-IR":"波斯语","fi-FI":"芬兰语","hi-IN":"印地语","hr-HR":"克罗地亚语","hu-HU":"匈牙利语","is-IS":"冰岛语","lt-LT":"立陶宛语","lv-LV":"拉脱维亚语","nb-NO":"挪威语","ro-RO":"罗马尼亚语","sk-SK":"斯洛伐克语","sl-SI":"斯洛文尼亚语","sr-RS":"塞尔维亚语","sv-SE":"瑞典语","tl-PH":"菲律宾语","he-IL":"希伯来语","bn-BD":"孟加拉语","ta-IN":"泰米尔语","ur-PK":"乌尔都语","ca-ES":"加泰罗尼亚语","sw-KE":"斯瓦希里语","af-ZA":"南非荷兰语","mk-MK":"马其顿语"};function d(e){const n=a.find(c=>c.code===e);return n?n.name:o[e]||e}const m=[...a,...Object.entries(o).map(([e,n])=>({code:e,name:n}))].sort((e,n)=>e.code<n.code?-1:1);export{m as A,a as L,d as l};

2
apps/admin/.output/public/_nuxt/DTQY3iF_.js

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/QmZ_XupB.js → apps/admin/.output/public/_nuxt/D_urMdl7.js

@ -1 +1 @@
import{a as u}from"./CgE-6DOq.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"./mydnAiU4.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};

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

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/w2gB9CpJ.js → apps/admin/.output/public/_nuxt/Dfh2Yz3-.js

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/C0oOyOZM.js → apps/admin/.output/public/_nuxt/DlR-ZWzp.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/C-IO5Zsk.js → apps/admin/.output/public/_nuxt/DnO2rKuV.js

@ -1 +1 @@
import{g as t,B as n,P as a,c as o,a as s,o as c}from"./CSjlBIfC.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"./AL6uUoB7.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/WFs8pQQC.js → apps/admin/.output/public/_nuxt/KMPBF1C_.js

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/accounts.D2VFobOs.css

@ -0,0 +1 @@
.chk[data-v-11e40be5]{display:flex;align-items:center;gap:6px;padding:5px 9px;border:1px solid #e2e8f0;border-radius:8px;font-size:12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chk[data-v-11e40be5]:hover{background:#f8fafc}.chk input[data-v-11e40be5]{width:14px;height:14px}

1
apps/admin/.output/public/_nuxt/accounts.vxGnCxY1.css

@ -1 +0,0 @@
.chk[data-v-06dca20b]{display:flex;align-items:center;gap:6px;padding:5px 9px;border:1px solid #e2e8f0;border-radius:8px;font-size:12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chk[data-v-06dca20b]:hover{background:#f8fafc}.chk input[data-v-06dca20b]{width:14px;height:14px}

2
apps/admin/.output/public/_nuxt/DlCThPMw.js → apps/admin/.output/public/_nuxt/biHViw9u.js

File diff suppressed because one or more lines are too long

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

@ -1 +1 @@
{"id":"24e01d06-12c5-401a-ad62-3d0500cb591f","timestamp":1786013273786}
{"id":"195ddb9e-078c-4238-82de-ba95840a71bc","timestamp":1786331664123}

1
apps/admin/.output/public/_nuxt/builds/meta/195ddb9e-078c-4238-82de-ba95840a71bc.json

@ -0,0 +1 @@
{"id":"195ddb9e-078c-4238-82de-ba95840a71bc","timestamp":1786331664123,"prerendered":[]}

1
apps/admin/.output/public/_nuxt/builds/meta/24e01d06-12c5-401a-ad62-3d0500cb591f.json

@ -1 +0,0 @@
{"id":"24e01d06-12c5-401a-ad62-3d0500cb591f","timestamp":1786013273786,"prerendered":[]}

2
apps/admin/node_modules/.cache/nuxt/.nuxt/dist/client/_nuxt/dashboard.CT4jXDd_.css → apps/admin/.output/public/_nuxt/dashboard.CBzhf2U_.css

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/Bw873H05.js → apps/admin/.output/public/_nuxt/dk_MSV25.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CDbX0LeJ.js → apps/admin/.output/public/_nuxt/eNlViwMf.js

@ -1 +1 @@
import{u as a,e as s,h as u,i as r,f as h}from"./CSjlBIfC.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"./AL6uUoB7.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/entry.BR7WYV0V.css

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

29
apps/admin/.output/public/_nuxt/hxUtDe_P.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/meettemplates.DBfDdqB2.css

@ -0,0 +1 @@
.panel[data-v-5eb39361]{background:#fff;border:1px solid #f1f5f9;border-radius:16px;box-shadow:0 1px 2px #0000000a}.tpl-grid[data-v-5eb39361]{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.tpl-card[data-v-5eb39361]{background:#fff;border:1px solid #eef2f7;border-radius:16px;padding:16px;cursor:pointer;transition:all .15s;display:flex;flex-direction:column;gap:10px;box-shadow:0 1px 2px #0000000a}.tpl-card[data-v-5eb39361]:hover{border-color:#c7d2fe;box-shadow:0 6px 18px #0f172a14;transform:translateY(-1px)}.tc-top[data-v-5eb39361]{display:flex;align-items:flex-start;gap:11px}.tc-ico[data-v-5eb39361]{width:40px;height:40px;border-radius:11px;flex-shrink:0;overflow:hidden;background:linear-gradient(135deg,#eef2ff,#e0e7ff);color:#4338ca;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:17px}.tc-ico img[data-v-5eb39361]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.tc-title[data-v-5eb39361]{font-weight:600;font-size:14.5px;color:#1e293b;line-height:1.35}.tc-tid[data-v-5eb39361],.tc-title[data-v-5eb39361]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tc-tid[data-v-5eb39361]{font-size:11px;color:#94a3b8;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-top:2px}.tc-desc[data-v-5eb39361]{font-size:12.5px;color:#64748b;line-height:1.55;min-height:39px;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.tc-tags[data-v-5eb39361]{gap:4px;min-height:20px}.tc-foot[data-v-5eb39361],.tc-tags[data-v-5eb39361]{display:flex;flex-wrap:wrap}.tc-foot[data-v-5eb39361]{align-items:center;gap:6px;padding-top:9px;border-top:1px solid #f8fafc}.tc-go[data-v-5eb39361]{font-size:11.5px;color:#6366f1;font-weight:600}.chip[data-v-5eb39361]{display:inline-block;font-size:11px;padding:1px 7px;border-radius:999px;background:#f1f5f9;color:#64748b;white-space:nowrap}.chip-type[data-v-5eb39361]{background:#e0e7ff;color:#4338ca}.chip-lang[data-v-5eb39361]{background:#cffafe;color:#0e7490}.chip-warn[data-v-5eb39361]{background:#fef3c7;color:#b45309}.chip-primary[data-v-5eb39361]{background:#d1fae5;color:#047857}.lang-pill[data-v-5eb39361]{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;padding:3px 9px;border-radius:999px;border:1px solid #e2e8f0;background:#f8fafc;color:#64748b;cursor:pointer;transition:all .12s;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.lang-pill[data-v-5eb39361]:hover{border-color:#c7d2fe;color:#4338ca}.lang-pill.on[data-v-5eb39361]{background:#4338ca;border-color:#4338ca;color:#fff}.lang-pill.primary[data-v-5eb39361]:not(.on){background:#ecfdf5;border-color:#a7f3d0;color:#047857}.lp-name[data-v-5eb39361]{font-family:inherit;opacity:.75;font-size:11px}.lang-pill.on .lp-name[data-v-5eb39361]{opacity:.9}.lang-picker[data-v-5eb39361]{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:3px;max-height:260px;overflow-y:auto;border:1px solid #eef2f7;border-radius:10px;padding:8px}.lang-opt[data-v-5eb39361]{display:flex;align-items:center;gap:6px;padding:3px 5px;border-radius:6px;cursor:pointer;font-size:12px}.lang-opt[data-v-5eb39361]:hover{background:#f8fafc}.lo-code[data-v-5eb39361]{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#475569}.lo-name[data-v-5eb39361]{color:#94a3b8;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

2
apps/admin/.output/public/_nuxt/CgE-6DOq.js → apps/admin/.output/public/_nuxt/mydnAiU4.js

@ -1 +1 @@
import{e as f,a9 as p,aa as c,z as r}from"./CSjlBIfC.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"./AL6uUoB7.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};

29
apps/admin/.output/public/_nuxt/r_MxzKf2.js

File diff suppressed because one or more lines are too long

1
apps/admin/.output/public/_nuxt/statlog.C1q_3yEh.css

@ -1 +0,0 @@
.panel[data-v-742ee359]{background:#fff;border:1px solid #f1f5f9;border-radius:16px;box-shadow:0 1px 2px #0000000a}.logrow[data-v-742ee359]{display:grid;grid-template-columns:80px 64px 210px 92px 1fr 104px;gap:10px;align-items:start;padding:6px 12px;border-bottom:1px solid #f1f5f9;font-size:12px}.logrow[data-v-742ee359]:hover{background:#f8fafc}.logrow .t[data-v-742ee359]{font-family:ui-monospace,Menlo,monospace;color:#64748b}.lv[data-v-742ee359]{font-size:10px;font-weight:700;padding:1px 6px;border-radius:6px;white-space:nowrap}.lv-info[data-v-742ee359]{background:#dcfce7;color:#15803d}.lv-warn[data-v-742ee359]{background:#fef9c3;color:#a16207}.lv-error[data-v-742ee359]{background:#fee2e2;color:#b91c1c}.late[data-v-742ee359]{font-size:10px;color:#a16207;background:#fef3c7;border-radius:5px;padding:0 4px;margin-left:4px}.muted[data-v-742ee359]{color:#94a3b8}.app-name[data-v-742ee359]{font-weight:600;color:#0f172a}.unreg[data-v-742ee359]{font-size:10px;color:#b45309;background:#fef3c7;border-radius:5px;padding:0 5px;margin-left:5px;white-space:nowrap}#logHead[data-v-742ee359]{display:grid;grid-template-columns:80px 64px 210px 92px 1fr 104px;gap:10px;padding:7px 12px;font-size:11px;color:#94a3b8;border-bottom:1px solid #e2e8f0;background:#f8fafc}

1
apps/admin/.output/public/_nuxt/statlog.DNW5XZ2N.css

@ -0,0 +1 @@
.panel[data-v-e7a3debc]{background:#fff;border:1px solid #f1f5f9;border-radius:16px;box-shadow:0 1px 2px #0000000a}.logrow[data-v-e7a3debc]{display:grid;grid-template-columns:80px 64px 210px 92px 1fr 104px;gap:10px;align-items:start;padding:6px 12px;border-bottom:1px solid #f1f5f9;font-size:12px}.logrow[data-v-e7a3debc]:hover{background:#f8fafc}.logrow .t[data-v-e7a3debc]{font-family:ui-monospace,Menlo,monospace;color:#64748b}.lv[data-v-e7a3debc]{font-size:10px;font-weight:700;padding:1px 6px;border-radius:6px;white-space:nowrap}.lv-info[data-v-e7a3debc]{background:#dcfce7;color:#15803d}.lv-warn[data-v-e7a3debc]{background:#fef9c3;color:#a16207}.lv-error[data-v-e7a3debc]{background:#fee2e2;color:#b91c1c}.late[data-v-e7a3debc]{font-size:10px;color:#a16207;background:#fef3c7;border-radius:5px;padding:0 4px;margin-left:4px}.muted[data-v-e7a3debc]{color:#94a3b8}.app-name[data-v-e7a3debc]{font-weight:600;color:#0f172a}.unreg[data-v-e7a3debc]{font-size:10px;color:#b45309;background:#fef3c7;border-radius:5px;padding:0 5px;margin-left:5px;white-space:nowrap}#logHead[data-v-e7a3debc]{display:grid;grid-template-columns:80px 64px 210px 92px 1fr 104px;gap:10px;padding:7px 12px;font-size:11px;color:#94a3b8;border-bottom:1px solid #e2e8f0;background:#f8fafc}

2
apps/admin/.output/public/_nuxt/CzMCfc-v.js → apps/admin/.output/public/_nuxt/uNE_hR3V.js

File diff suppressed because one or more lines are too long

2
apps/admin/.output/public/_nuxt/CUrW23xA.js → apps/admin/.output/public/_nuxt/uNuDPE5V.js

@ -1 +1 @@
import{_ as o,o as s,c as a,a as t,t as r}from"./CSjlBIfC.js";import{u as i}from"./CDbX0LeJ.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"./AL6uUoB7.js";import{u as i}from"./eNlViwMf.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/kX8FbUD0.js → apps/admin/.output/public/_nuxt/zmPJ0MLk.js

File diff suppressed because one or more lines are too long

4
apps/admin/.output/server/chunks/build/LangSelect-C_QPlcDf.mjs → apps/admin/.output/server/chunks/build/LangSelect-Bvw-e1Cn.mjs

@ -1,6 +1,6 @@
import { defineComponent, computed, mergeProps, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderClass, ssrRenderList, ssrInterpolate, ssrIncludeBooleanAttr, ssrRenderAttr } from 'vue/server-renderer';
import { L as LANG_OPTIONS, l as langName } from './useLangOptions-DMhiAuTa.mjs';
import { L as LANG_OPTIONS, l as langName } from './useLangOptions-CXXbv5NM.mjs';
import { _ as _export_sfc } from './server.mjs';
const _sfc_main = /* @__PURE__ */ defineComponent({
@ -66,4 +66,4 @@ _sfc_main.setup = (props, ctx) => {
const __nuxt_component_0 = /* @__PURE__ */ Object.assign(_export_sfc(_sfc_main, [["__scopeId", "data-v-4903af59"]]), { __name: "LangSelect" });
export { __nuxt_component_0 as _ };
//# sourceMappingURL=LangSelect-C_QPlcDf.mjs.map
//# sourceMappingURL=LangSelect-Bvw-e1Cn.mjs.map

1
apps/admin/.output/server/chunks/build/LangSelect-Bvw-e1Cn.mjs.map

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

1
apps/admin/.output/server/chunks/build/LangSelect-C_QPlcDf.mjs.map

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

199
apps/admin/.output/server/chunks/build/accounts-C1hb7WMW.mjs

@ -0,0 +1,199 @@
import { defineComponent, ref, reactive, computed, watch, unref, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrInterpolate, ssrRenderClass, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { _ as _export_sfc, D as DEFAULT_ADMIN_ACCESS, M as MENU_GROUPS } 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: "accounts",
__ssrInlineRender: true,
setup(__props) {
useApi();
useToast();
const ROLE = { 1: "超管", 2: "管理员", 3: "品牌商", 4: "运营", 5: "渠道商" };
const ROLE_CLS = { 1: "badge-error", 2: "badge-primary", 3: "badge-warning", 4: "badge-info", 5: "badge-accent" };
const REGIONS = [["cn", "中国"], ["us", "美国"], ["ea", "东亚"], ["sea", "东南亚"], ["sa", "南亚"], ["me", "中东"], ["eu", "欧洲"], ["ru", "俄罗斯"], ["af", "非洲"], ["sam", "南美"], ["nam", "北美"], ["oc", "大洋洲"], ["br", "巴西"], ["in", "印度"]];
const view = ref("list");
const rows = ref([]);
const apps = ref([]);
const loading = ref(false);
const submitting = ref(false);
const editId = ref(0);
const form = reactive({
username: "",
password: "",
identity: 2,
enabled: "1",
remark: "",
brandid: 0,
channelid: ""
});
const channels = ref([]);
const accountChannelOptions = computed(
() => form.brandid ? channels.value.filter((ch) => ch.brandid === form.brandid) : []
);
const sel = reactive({
access: [],
apps: [],
regions: [],
products: []
});
const brands = ref([]);
const productGroups = ref([]);
const prodLoading = ref(false);
function fromCsv(s) {
return (s || "").split(",").map((x) => x.trim()).filter((x) => x);
}
function scopeParts(a) {
const parts = [];
if (a.apps) parts.push("应用:" + fromCsv(a.apps).length);
if (a.regions) parts.push("区域:" + fromCsv(a.regions).length);
if (a.products) parts.push("产品:" + fromCsv(a.products).length);
if (a.access) parts.push("页面:" + fromCsv(a.access).length);
return parts;
}
watch(() => form.identity, (idt) => {
if (idt === 2 && sel.access.length === 0) sel.access = DEFAULT_ADMIN_ACCESS.slice();
});
ref(null);
ref(0);
const topup = reactive({
name: "",
cur: "",
vipday: 0,
trademin: 0,
meetmin: 0
});
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-11e40be5><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}" data-v-11e40be5><div class="flex items-center justify-between mb-4" data-v-11e40be5><div data-v-11e40be5><h2 class="text-lg font-bold text-slate-700" data-v-11e40be5>后台账号</h2><p class="text-xs text-slate-400 mt-0.5" data-v-11e40be5>超管 / 管理员 / 代理 / 运营。代理·运营可绑定应用·区域·产品,登录后仪表盘按绑定限制。</p></div><button class="btn btn-primary btn-sm text-white" data-v-11e40be5>+ 新建账号</button></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 overflow-hidden" data-v-11e40be5><table class="table table-sm" data-v-11e40be5><thead data-v-11e40be5><tr class="text-slate-500" data-v-11e40be5><th data-v-11e40be5>ID</th><th data-v-11e40be5>用户名</th><th data-v-11e40be5>角色</th><th data-v-11e40be5>状态</th><th data-v-11e40be5>绑定作用域</th><th data-v-11e40be5>备注</th><th class="text-right" data-v-11e40be5>操作</th></tr></thead><tbody data-v-11e40be5>`);
if (loading.value) {
_push(`<tr data-v-11e40be5><td colspan="7" class="text-center text-slate-400 py-8" data-v-11e40be5>加载中...</td></tr>`);
} else if (!rows.value.length) {
_push(`<tr data-v-11e40be5><td colspan="7" class="text-center text-slate-400 py-8" data-v-11e40be5>暂无账号(引导超管不在此列)</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(rows.value, (a) => {
_push(`<tr data-v-11e40be5><td class="font-mono" data-v-11e40be5>${ssrInterpolate(a.id)}</td><td class="font-medium" data-v-11e40be5>${ssrInterpolate(a.username || "")}</td><td data-v-11e40be5><span class="${ssrRenderClass([ROLE_CLS[a.identity] || "", "badge badge-sm"])}" data-v-11e40be5>${ssrInterpolate(ROLE[a.identity] || a.identity)}</span></td><td data-v-11e40be5>`);
if (a.enabled) {
_push(`<span class="text-green-600 text-xs" data-v-11e40be5>启用</span>`);
} else {
_push(`<span class="text-slate-400 text-xs" data-v-11e40be5>停用</span>`);
}
_push(`</td><td data-v-11e40be5>`);
if (a.identity === 3 || a.identity === 4) {
_push(`<!--[-->`);
if (scopeParts(a).length) {
_push(`<span class="text-xs text-slate-500" data-v-11e40be5>${ssrInterpolate(scopeParts(a).join(" · "))}</span>`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-11e40be5>未绑定(不限)</span>`);
}
_push(`<!--]-->`);
} else if (a.identity === 2) {
_push(`<!--[-->`);
if (a.access) {
_push(`<span class="text-xs text-slate-500" data-v-11e40be5>菜单:${ssrInterpolate(fromCsv(a.access).length)}</span>`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-11e40be5>默认(除SaaS/系统管理)</span>`);
}
_push(`<!--]-->`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-11e40be5>全部权限</span>`);
}
if (a.identity === 3) {
_push(`<div class="text-[11px] text-emerald-600 mt-0.5" data-v-11e40be5> 余额 VIP${ssrInterpolate(a.balance_vipday || 0)}天 · 翻译${ssrInterpolate(a.balance_trademin || 0)}分 · 会议${ssrInterpolate(a.balance_meetmin || 0)}分 </div>`);
} else {
_push(`<!---->`);
}
_push(`</td><td class="text-xs text-slate-500" data-v-11e40be5>${ssrInterpolate(a.remark || "")}</td><td data-v-11e40be5><div class="flex gap-1 justify-end" data-v-11e40be5>`);
if (a.identity === 3) {
_push(`<button class="btn btn-ghost btn-xs text-emerald-600" data-v-11e40be5>充值</button>`);
} else {
_push(`<!---->`);
}
_push(`<button class="btn btn-ghost btn-xs" data-v-11e40be5>编辑</button><button class="btn btn-ghost btn-xs text-amber-600" data-v-11e40be5>改密</button><button class="btn btn-ghost btn-xs text-red-500" data-v-11e40be5>删除</button></div></td></tr>`);
});
_push(`<!--]--></tbody></table></div></div><div style="${ssrRenderStyle(view.value === "form" ? null : { display: "none" })}" data-v-11e40be5><div class="flex items-center gap-3 mb-5" data-v-11e40be5><button class="btn btn-ghost btn-sm" data-v-11e40be5>← 返回列表</button><h2 class="text-lg font-semibold text-slate-800" data-v-11e40be5>${ssrInterpolate(editId.value ? "编辑账号 #" + editId.value : "新建账号")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl" data-v-11e40be5><div class="grid grid-cols-2 gap-3" data-v-11e40be5><div data-v-11e40be5><label class="text-xs text-slate-500" data-v-11e40be5>用户名</label><input${ssrRenderAttr("value", form.username)}${ssrIncludeBooleanAttr(!!editId.value) ? " disabled" : ""} class="input input-bordered input-sm w-full" placeholder="登录用户名" data-v-11e40be5></div><div style="${ssrRenderStyle(!editId.value ? null : { display: "none" })}" data-v-11e40be5><label class="text-xs text-slate-500" data-v-11e40be5>密码</label><input${ssrRenderAttr("value", form.password)} type="password" class="input input-bordered input-sm w-full" placeholder="登录密码" data-v-11e40be5></div><div data-v-11e40be5><label class="text-xs text-slate-500" data-v-11e40be5>角色</label><select class="select select-bordered select-sm w-full" data-v-11e40be5><option${ssrRenderAttr("value", 2)} data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 2) : ssrLooseEqual(form.identity, 2)) ? " selected" : ""}>管理员(默认除 SaaS/系统管理外全部)</option><option${ssrRenderAttr("value", 3)} data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 3) : ssrLooseEqual(form.identity, 3)) ? " selected" : ""}>品牌商(绑定品牌商,见名下全部渠道商)</option><option${ssrRenderAttr("value", 5)} data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 5) : ssrLooseEqual(form.identity, 5)) ? " selected" : ""}>渠道商(绑定单个渠道商,只见自己数据)</option><option${ssrRenderAttr("value", 4)} data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 4) : ssrLooseEqual(form.identity, 4)) ? " selected" : ""}>运营(内部,按绑定限制)</option><option${ssrRenderAttr("value", 1)} data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 1) : ssrLooseEqual(form.identity, 1)) ? " selected" : ""}>超管(全部权限)</option></select></div><div data-v-11e40be5><label class="text-xs text-slate-500" data-v-11e40be5>状态</label><select class="select select-bordered select-sm w-full" data-v-11e40be5><option value="1" data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.enabled) ? ssrLooseContain(form.enabled, "1") : ssrLooseEqual(form.enabled, "1")) ? " selected" : ""}>启用</option><option value="0" data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.enabled) ? ssrLooseContain(form.enabled, "0") : ssrLooseEqual(form.enabled, "0")) ? " selected" : ""}>停用</option></select></div><div class="col-span-2" data-v-11e40be5><label class="text-xs text-slate-500" data-v-11e40be5>备注</label><input${ssrRenderAttr("value", form.remark)} class="input input-bordered input-sm w-full" placeholder="可选" data-v-11e40be5></div></div><div class="mt-4 border-t border-slate-100 pt-4" style="${ssrRenderStyle(form.identity !== 1 ? null : { display: "none" })}" data-v-11e40be5><div class="flex items-center justify-between mb-1" data-v-11e40be5><div class="text-sm font-semibold text-slate-600" data-v-11e40be5>菜单权限</div><div class="flex gap-1" data-v-11e40be5><button type="button" class="btn btn-ghost btn-xs" data-v-11e40be5>管理员默认</button><button type="button" class="btn btn-ghost btn-xs" data-v-11e40be5>全选</button><button type="button" class="btn btn-ghost btn-xs" data-v-11e40be5>清空</button></div></div><p class="text-xs text-slate-400 mb-3" data-v-11e40be5>管理员默认开放除「SaaS 管理 / 系统管理」以外的全部菜单(权限留空时按默认生效);代理/运营需显式勾选。</p><!--[-->`);
ssrRenderList(unref(MENU_GROUPS), (g) => {
_push(`<div class="mb-2.5" data-v-11e40be5><div class="text-xs text-slate-500 mb-1.5" data-v-11e40be5>${ssrInterpolate(g.label)}`);
if (g.restricted) {
_push(`<span class="text-amber-500 ml-1" data-v-11e40be5>(管理员默认不开放)</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="flex flex-wrap gap-2" data-v-11e40be5><!--[-->`);
ssrRenderList(g.items, (m) => {
_push(`<label class="chk" data-v-11e40be5><input${ssrIncludeBooleanAttr(Array.isArray(sel.access) ? ssrLooseContain(sel.access, m.id) : sel.access) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", m.id)} data-v-11e40be5>${ssrInterpolate(m.label)}</label>`);
});
_push(`<!--]--></div></div>`);
});
_push(`<!--]--></div><div class="mt-4 border-t border-slate-100 pt-4" style="${ssrRenderStyle(form.identity === 3 || form.identity === 5 ? null : { display: "none" })}" data-v-11e40be5><div class="text-sm font-semibold text-slate-600 mb-2" data-v-11e40be5> 归属绑定 <span class="text-xs text-slate-400 font-normal" data-v-11e40be5>(品牌商账号只绑品牌商;渠道商账号两者都要绑)</span></div><div class="grid grid-cols-2 gap-3" data-v-11e40be5><div data-v-11e40be5><label class="text-xs text-slate-500" data-v-11e40be5>所属品牌商 *</label><select class="select select-bordered select-sm w-full" data-v-11e40be5><option${ssrRenderAttr("value", 0)} data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.brandid) ? ssrLooseContain(form.brandid, 0) : ssrLooseEqual(form.brandid, 0)) ? " selected" : ""}>请选择品牌商</option><!--[-->`);
ssrRenderList(brands.value, (b) => {
_push(`<option${ssrRenderAttr("value", b.id)} data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.brandid) ? ssrLooseContain(form.brandid, b.id) : ssrLooseEqual(form.brandid, b.id)) ? " selected" : ""}>${ssrInterpolate(b.brand)}</option>`);
});
_push(`<!--]--></select></div><div style="${ssrRenderStyle(form.identity === 5 ? null : { display: "none" })}" data-v-11e40be5><label class="text-xs text-slate-500" data-v-11e40be5>所属渠道商 *</label><select class="select select-bordered select-sm w-full"${ssrIncludeBooleanAttr(!accountChannelOptions.value.length) ? " disabled" : ""} data-v-11e40be5><option value="" data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.channelid) ? ssrLooseContain(form.channelid, "") : ssrLooseEqual(form.channelid, "")) ? " selected" : ""}>${ssrInterpolate(form.brandid ? accountChannelOptions.value.length ? "请选择渠道商" : "该品牌商暂无渠道商" : "请先选择品牌商")}</option><!--[-->`);
ssrRenderList(accountChannelOptions.value, (ch) => {
_push(`<option${ssrRenderAttr("value", ch.id)} data-v-11e40be5${ssrIncludeBooleanAttr(Array.isArray(form.channelid) ? ssrLooseContain(form.channelid, ch.id) : ssrLooseEqual(form.channelid, ch.id)) ? " selected" : ""}>${ssrInterpolate(ch.name)} (${ssrInterpolate(ch.id)})</option>`);
});
_push(`<!--]--></select></div></div><p class="text-xs text-slate-400 mt-2" data-v-11e40be5> 数据隔离由后端强制:品牌商账号只能看到本品牌商及其名下渠道商的数据,渠道商账号只能看到自己渠道的数据。 </p></div><div class="mt-4 border-t border-slate-100 pt-4" style="${ssrRenderStyle(form.identity === 3 || form.identity === 4 ? null : { display: "none" })}" data-v-11e40be5><div class="text-sm font-semibold text-slate-600 mb-2" data-v-11e40be5>作用域绑定 <span class="text-xs text-slate-400 font-normal" data-v-11e40be5>(代理/运营生效;限制仪表盘数据范围)</span></div><div class="mb-3" data-v-11e40be5><div class="text-xs text-slate-500 mb-1.5" data-v-11e40be5>绑定应用 <span class="text-slate-300" data-v-11e40be5>(仪表盘只显示这些应用数据;不勾=不限)</span></div><div class="flex flex-wrap gap-2" data-v-11e40be5>`);
if (apps.value.length) {
_push(`<!--[-->`);
ssrRenderList(apps.value, (a) => {
_push(`<label class="chk" data-v-11e40be5><input${ssrIncludeBooleanAttr(Array.isArray(sel.apps) ? ssrLooseContain(sel.apps, a.name) : sel.apps) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", a.name)} data-v-11e40be5>${ssrInterpolate(a.name || "应用#" + a.id)}</label>`);
});
_push(`<!--]-->`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-11e40be5>无注册应用</span>`);
}
_push(`</div></div><div class="mb-3" data-v-11e40be5><div class="text-xs text-slate-500 mb-1.5" data-v-11e40be5>绑定区域 <span class="text-slate-300" data-v-11e40be5>(不勾=不限)</span></div><div class="flex flex-wrap gap-2" data-v-11e40be5><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<label class="chk" data-v-11e40be5><input${ssrIncludeBooleanAttr(Array.isArray(sel.regions) ? ssrLooseContain(sel.regions, r[0]) : sel.regions) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", r[0])} data-v-11e40be5>${ssrInterpolate(r[1])}</label>`);
});
_push(`<!--]--></div></div><div data-v-11e40be5><div class="text-xs text-slate-500 mb-1.5" data-v-11e40be5>绑定产品 <span class="text-slate-300" data-v-11e40be5>(按厂家分组;仪表盘只显示这些产品数据;不勾=不限)</span></div><div class="max-h-56 overflow-y-auto pr-1 border border-slate-100 rounded-lg p-2" data-v-11e40be5>`);
if (prodLoading.value) {
_push(`<span class="text-xs text-slate-300" data-v-11e40be5>加载产品中...</span>`);
} else if (!productGroups.value.length) {
_push(`<span class="text-xs text-slate-300" data-v-11e40be5>无产品</span>`);
} else {
_push(`<!--[-->`);
ssrRenderList(productGroups.value, (g) => {
_push(`<div class="mb-2 last:mb-0" data-v-11e40be5><div class="text-[11px] font-semibold text-slate-500 mb-1 sticky top-0 bg-white py-0.5" data-v-11e40be5>🏭 ${ssrInterpolate(g.label)}</div><div class="flex flex-wrap gap-2" data-v-11e40be5><!--[-->`);
ssrRenderList(g.products, (p) => {
_push(`<label class="chk" data-v-11e40be5><input${ssrIncludeBooleanAttr(Array.isArray(sel.products) ? ssrLooseContain(sel.products, String(p.id)) : sel.products) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", String(p.id))} data-v-11e40be5>${ssrInterpolate((p.devicename || "产品") + " #" + p.id)}</label>`);
});
_push(`<!--]--></div></div>`);
});
_push(`<!--]-->`);
}
_push(`</div></div></div><div class="flex gap-3 justify-end mt-6" data-v-11e40be5><button class="btn btn-ghost btn-sm" data-v-11e40be5>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-11e40be5>保存</button></div></div></div><dialog class="modal" data-v-11e40be5><div class="modal-box max-w-md" data-v-11e40be5><h3 class="font-bold text-lg mb-1" data-v-11e40be5>充值 / 调整资源点</h3><p class="text-xs text-slate-400 mb-3" data-v-11e40be5>代理:<span class="font-medium text-slate-600" data-v-11e40be5>${ssrInterpolate(topup.name)}</span>。填增量(可填负数下调),当前余额:<span class="text-emerald-600" data-v-11e40be5>${ssrInterpolate(topup.cur)}</span></p><div class="grid grid-cols-3 gap-3" data-v-11e40be5><div data-v-11e40be5><label class="text-xs text-slate-500" data-v-11e40be5>VIP天数</label><input${ssrRenderAttr("value", topup.vipday)} type="number" class="input input-bordered input-sm w-full" data-v-11e40be5></div><div data-v-11e40be5><label class="text-xs text-slate-500" data-v-11e40be5>翻译分钟</label><input${ssrRenderAttr("value", topup.trademin)} type="number" class="input input-bordered input-sm w-full" data-v-11e40be5></div><div data-v-11e40be5><label class="text-xs text-slate-500" data-v-11e40be5>会议分钟</label><input${ssrRenderAttr("value", topup.meetmin)} type="number" class="input input-bordered input-sm w-full" data-v-11e40be5></div></div><div class="modal-action" data-v-11e40be5><button class="btn btn-ghost btn-sm" data-v-11e40be5>取消</button><button class="btn btn-primary btn-sm text-white" data-v-11e40be5>确认</button></div></div><form method="dialog" class="modal-backdrop" data-v-11e40be5><button data-v-11e40be5>close</button></form></dialog></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/accounts.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const accounts = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-11e40be5"]]);
export { accounts as default };
//# sourceMappingURL=accounts-C1hb7WMW.mjs.map

1
apps/admin/.output/server/chunks/build/accounts-C1hb7WMW.mjs.map

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

184
apps/admin/.output/server/chunks/build/accounts-Do2bLhnl.mjs

@ -1,184 +0,0 @@
import { defineComponent, ref, reactive, watch, unref, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderList, ssrInterpolate, ssrRenderClass, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { _ as _export_sfc, D as DEFAULT_ADMIN_ACCESS, M as MENU_GROUPS } 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: "accounts",
__ssrInlineRender: true,
setup(__props) {
useApi();
useToast();
const ROLE = { 1: "超管", 2: "管理员", 3: "代理", 4: "运营" };
const ROLE_CLS = { 1: "badge-error", 2: "badge-primary", 3: "badge-warning", 4: "badge-info" };
const REGIONS = [["cn", "中国"], ["us", "美国"], ["ea", "东亚"], ["sea", "东南亚"], ["sa", "南亚"], ["me", "中东"], ["eu", "欧洲"], ["ru", "俄罗斯"], ["af", "非洲"], ["sam", "南美"], ["nam", "北美"], ["oc", "大洋洲"], ["br", "巴西"], ["in", "印度"]];
const view = ref("list");
const rows = ref([]);
const apps = ref([]);
const loading = ref(false);
const submitting = ref(false);
const editId = ref(0);
const form = reactive({
username: "",
password: "",
identity: 2,
enabled: "1",
remark: ""
});
const sel = reactive({
access: [],
apps: [],
regions: [],
products: []
});
const productGroups = ref([]);
const prodLoading = ref(false);
function fromCsv(s) {
return (s || "").split(",").map((x) => x.trim()).filter((x) => x);
}
function scopeParts(a) {
const parts = [];
if (a.apps) parts.push("应用:" + fromCsv(a.apps).length);
if (a.regions) parts.push("区域:" + fromCsv(a.regions).length);
if (a.products) parts.push("产品:" + fromCsv(a.products).length);
if (a.access) parts.push("页面:" + fromCsv(a.access).length);
return parts;
}
watch(() => form.identity, (idt) => {
if (idt === 2 && sel.access.length === 0) sel.access = DEFAULT_ADMIN_ACCESS.slice();
});
ref(null);
ref(0);
const topup = reactive({
name: "",
cur: "",
vipday: 0,
trademin: 0,
meetmin: 0
});
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)} data-v-06dca20b><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}" data-v-06dca20b><div class="flex items-center justify-between mb-4" data-v-06dca20b><div data-v-06dca20b><h2 class="text-lg font-bold text-slate-700" data-v-06dca20b>后台账号</h2><p class="text-xs text-slate-400 mt-0.5" data-v-06dca20b>超管 / 管理员 / 代理 / 运营。代理·运营可绑定应用·区域·产品,登录后仪表盘按绑定限制。</p></div><button class="btn btn-primary btn-sm text-white" data-v-06dca20b>+ 新建账号</button></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 overflow-hidden" data-v-06dca20b><table class="table table-sm" data-v-06dca20b><thead data-v-06dca20b><tr class="text-slate-500" data-v-06dca20b><th data-v-06dca20b>ID</th><th data-v-06dca20b>用户名</th><th data-v-06dca20b>角色</th><th data-v-06dca20b>状态</th><th data-v-06dca20b>绑定作用域</th><th data-v-06dca20b>备注</th><th class="text-right" data-v-06dca20b>操作</th></tr></thead><tbody data-v-06dca20b>`);
if (loading.value) {
_push(`<tr data-v-06dca20b><td colspan="7" class="text-center text-slate-400 py-8" data-v-06dca20b>加载中...</td></tr>`);
} else if (!rows.value.length) {
_push(`<tr data-v-06dca20b><td colspan="7" class="text-center text-slate-400 py-8" data-v-06dca20b>暂无账号(引导超管不在此列)</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(rows.value, (a) => {
_push(`<tr data-v-06dca20b><td class="font-mono" data-v-06dca20b>${ssrInterpolate(a.id)}</td><td class="font-medium" data-v-06dca20b>${ssrInterpolate(a.username || "")}</td><td data-v-06dca20b><span class="${ssrRenderClass([ROLE_CLS[a.identity] || "", "badge badge-sm"])}" data-v-06dca20b>${ssrInterpolate(ROLE[a.identity] || a.identity)}</span></td><td data-v-06dca20b>`);
if (a.enabled) {
_push(`<span class="text-green-600 text-xs" data-v-06dca20b>启用</span>`);
} else {
_push(`<span class="text-slate-400 text-xs" data-v-06dca20b>停用</span>`);
}
_push(`</td><td data-v-06dca20b>`);
if (a.identity === 3 || a.identity === 4) {
_push(`<!--[-->`);
if (scopeParts(a).length) {
_push(`<span class="text-xs text-slate-500" data-v-06dca20b>${ssrInterpolate(scopeParts(a).join(" · "))}</span>`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-06dca20b>未绑定(不限)</span>`);
}
_push(`<!--]-->`);
} else if (a.identity === 2) {
_push(`<!--[-->`);
if (a.access) {
_push(`<span class="text-xs text-slate-500" data-v-06dca20b>菜单:${ssrInterpolate(fromCsv(a.access).length)}</span>`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-06dca20b>默认(除SaaS/系统管理)</span>`);
}
_push(`<!--]-->`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-06dca20b>全部权限</span>`);
}
if (a.identity === 3) {
_push(`<div class="text-[11px] text-emerald-600 mt-0.5" data-v-06dca20b> 余额 VIP${ssrInterpolate(a.balance_vipday || 0)}天 · 翻译${ssrInterpolate(a.balance_trademin || 0)}分 · 会议${ssrInterpolate(a.balance_meetmin || 0)}分 </div>`);
} else {
_push(`<!---->`);
}
_push(`</td><td class="text-xs text-slate-500" data-v-06dca20b>${ssrInterpolate(a.remark || "")}</td><td data-v-06dca20b><div class="flex gap-1 justify-end" data-v-06dca20b>`);
if (a.identity === 3) {
_push(`<button class="btn btn-ghost btn-xs text-emerald-600" data-v-06dca20b>充值</button>`);
} else {
_push(`<!---->`);
}
_push(`<button class="btn btn-ghost btn-xs" data-v-06dca20b>编辑</button><button class="btn btn-ghost btn-xs text-amber-600" data-v-06dca20b>改密</button><button class="btn btn-ghost btn-xs text-red-500" data-v-06dca20b>删除</button></div></td></tr>`);
});
_push(`<!--]--></tbody></table></div></div><div style="${ssrRenderStyle(view.value === "form" ? null : { display: "none" })}" data-v-06dca20b><div class="flex items-center gap-3 mb-5" data-v-06dca20b><button class="btn btn-ghost btn-sm" data-v-06dca20b>← 返回列表</button><h2 class="text-lg font-semibold text-slate-800" data-v-06dca20b>${ssrInterpolate(editId.value ? "编辑账号 #" + editId.value : "新建账号")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl" data-v-06dca20b><div class="grid grid-cols-2 gap-3" data-v-06dca20b><div data-v-06dca20b><label class="text-xs text-slate-500" data-v-06dca20b>用户名</label><input${ssrRenderAttr("value", form.username)}${ssrIncludeBooleanAttr(!!editId.value) ? " disabled" : ""} class="input input-bordered input-sm w-full" placeholder="登录用户名" data-v-06dca20b></div><div style="${ssrRenderStyle(!editId.value ? null : { display: "none" })}" data-v-06dca20b><label class="text-xs text-slate-500" data-v-06dca20b>密码</label><input${ssrRenderAttr("value", form.password)} type="password" class="input input-bordered input-sm w-full" placeholder="登录密码" data-v-06dca20b></div><div data-v-06dca20b><label class="text-xs text-slate-500" data-v-06dca20b>角色</label><select class="select select-bordered select-sm w-full" data-v-06dca20b><option${ssrRenderAttr("value", 2)} data-v-06dca20b${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 2) : ssrLooseEqual(form.identity, 2)) ? " selected" : ""}>管理员(默认除 SaaS/系统管理外全部)</option><option${ssrRenderAttr("value", 3)} data-v-06dca20b${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 3) : ssrLooseEqual(form.identity, 3)) ? " selected" : ""}>代理(外部,按绑定限制)</option><option${ssrRenderAttr("value", 4)} data-v-06dca20b${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 4) : ssrLooseEqual(form.identity, 4)) ? " selected" : ""}>运营(内部,按绑定限制)</option><option${ssrRenderAttr("value", 1)} data-v-06dca20b${ssrIncludeBooleanAttr(Array.isArray(form.identity) ? ssrLooseContain(form.identity, 1) : ssrLooseEqual(form.identity, 1)) ? " selected" : ""}>超管(全部权限)</option></select></div><div data-v-06dca20b><label class="text-xs text-slate-500" data-v-06dca20b>状态</label><select class="select select-bordered select-sm w-full" data-v-06dca20b><option value="1" data-v-06dca20b${ssrIncludeBooleanAttr(Array.isArray(form.enabled) ? ssrLooseContain(form.enabled, "1") : ssrLooseEqual(form.enabled, "1")) ? " selected" : ""}>启用</option><option value="0" data-v-06dca20b${ssrIncludeBooleanAttr(Array.isArray(form.enabled) ? ssrLooseContain(form.enabled, "0") : ssrLooseEqual(form.enabled, "0")) ? " selected" : ""}>停用</option></select></div><div class="col-span-2" data-v-06dca20b><label class="text-xs text-slate-500" data-v-06dca20b>备注</label><input${ssrRenderAttr("value", form.remark)} class="input input-bordered input-sm w-full" placeholder="可选" data-v-06dca20b></div></div><div class="mt-4 border-t border-slate-100 pt-4" style="${ssrRenderStyle(form.identity !== 1 ? null : { display: "none" })}" data-v-06dca20b><div class="flex items-center justify-between mb-1" data-v-06dca20b><div class="text-sm font-semibold text-slate-600" data-v-06dca20b>菜单权限</div><div class="flex gap-1" data-v-06dca20b><button type="button" class="btn btn-ghost btn-xs" data-v-06dca20b>管理员默认</button><button type="button" class="btn btn-ghost btn-xs" data-v-06dca20b>全选</button><button type="button" class="btn btn-ghost btn-xs" data-v-06dca20b>清空</button></div></div><p class="text-xs text-slate-400 mb-3" data-v-06dca20b>管理员默认开放除「SaaS 管理 / 系统管理」以外的全部菜单(权限留空时按默认生效);代理/运营需显式勾选。</p><!--[-->`);
ssrRenderList(unref(MENU_GROUPS), (g) => {
_push(`<div class="mb-2.5" data-v-06dca20b><div class="text-xs text-slate-500 mb-1.5" data-v-06dca20b>${ssrInterpolate(g.label)}`);
if (g.restricted) {
_push(`<span class="text-amber-500 ml-1" data-v-06dca20b>(管理员默认不开放)</span>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="flex flex-wrap gap-2" data-v-06dca20b><!--[-->`);
ssrRenderList(g.items, (m) => {
_push(`<label class="chk" data-v-06dca20b><input${ssrIncludeBooleanAttr(Array.isArray(sel.access) ? ssrLooseContain(sel.access, m.id) : sel.access) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", m.id)} data-v-06dca20b>${ssrInterpolate(m.label)}</label>`);
});
_push(`<!--]--></div></div>`);
});
_push(`<!--]--></div><div class="mt-4 border-t border-slate-100 pt-4" style="${ssrRenderStyle(form.identity === 3 || form.identity === 4 ? null : { display: "none" })}" data-v-06dca20b><div class="text-sm font-semibold text-slate-600 mb-2" data-v-06dca20b>作用域绑定 <span class="text-xs text-slate-400 font-normal" data-v-06dca20b>(代理/运营生效;限制仪表盘数据范围)</span></div><div class="mb-3" data-v-06dca20b><div class="text-xs text-slate-500 mb-1.5" data-v-06dca20b>绑定应用 <span class="text-slate-300" data-v-06dca20b>(仪表盘只显示这些应用数据;不勾=不限)</span></div><div class="flex flex-wrap gap-2" data-v-06dca20b>`);
if (apps.value.length) {
_push(`<!--[-->`);
ssrRenderList(apps.value, (a) => {
_push(`<label class="chk" data-v-06dca20b><input${ssrIncludeBooleanAttr(Array.isArray(sel.apps) ? ssrLooseContain(sel.apps, a.name) : sel.apps) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", a.name)} data-v-06dca20b>${ssrInterpolate(a.name || "应用#" + a.id)}</label>`);
});
_push(`<!--]-->`);
} else {
_push(`<span class="text-xs text-slate-300" data-v-06dca20b>无注册应用</span>`);
}
_push(`</div></div><div class="mb-3" data-v-06dca20b><div class="text-xs text-slate-500 mb-1.5" data-v-06dca20b>绑定区域 <span class="text-slate-300" data-v-06dca20b>(不勾=不限)</span></div><div class="flex flex-wrap gap-2" data-v-06dca20b><!--[-->`);
ssrRenderList(REGIONS, (r) => {
_push(`<label class="chk" data-v-06dca20b><input${ssrIncludeBooleanAttr(Array.isArray(sel.regions) ? ssrLooseContain(sel.regions, r[0]) : sel.regions) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", r[0])} data-v-06dca20b>${ssrInterpolate(r[1])}</label>`);
});
_push(`<!--]--></div></div><div data-v-06dca20b><div class="text-xs text-slate-500 mb-1.5" data-v-06dca20b>绑定产品 <span class="text-slate-300" data-v-06dca20b>(按厂家分组;仪表盘只显示这些产品数据;不勾=不限)</span></div><div class="max-h-56 overflow-y-auto pr-1 border border-slate-100 rounded-lg p-2" data-v-06dca20b>`);
if (prodLoading.value) {
_push(`<span class="text-xs text-slate-300" data-v-06dca20b>加载产品中...</span>`);
} else if (!productGroups.value.length) {
_push(`<span class="text-xs text-slate-300" data-v-06dca20b>无产品</span>`);
} else {
_push(`<!--[-->`);
ssrRenderList(productGroups.value, (g) => {
_push(`<div class="mb-2 last:mb-0" data-v-06dca20b><div class="text-[11px] font-semibold text-slate-500 mb-1 sticky top-0 bg-white py-0.5" data-v-06dca20b>🏭 ${ssrInterpolate(g.label)}</div><div class="flex flex-wrap gap-2" data-v-06dca20b><!--[-->`);
ssrRenderList(g.products, (p) => {
_push(`<label class="chk" data-v-06dca20b><input${ssrIncludeBooleanAttr(Array.isArray(sel.products) ? ssrLooseContain(sel.products, String(p.id)) : sel.products) ? " checked" : ""} type="checkbox"${ssrRenderAttr("value", String(p.id))} data-v-06dca20b>${ssrInterpolate((p.devicename || "产品") + " #" + p.id)}</label>`);
});
_push(`<!--]--></div></div>`);
});
_push(`<!--]-->`);
}
_push(`</div></div></div><div class="flex gap-3 justify-end mt-6" data-v-06dca20b><button class="btn btn-ghost btn-sm" data-v-06dca20b>取消</button><button class="btn btn-primary btn-sm text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""} data-v-06dca20b>保存</button></div></div></div><dialog class="modal" data-v-06dca20b><div class="modal-box max-w-md" data-v-06dca20b><h3 class="font-bold text-lg mb-1" data-v-06dca20b>充值 / 调整资源点</h3><p class="text-xs text-slate-400 mb-3" data-v-06dca20b>代理:<span class="font-medium text-slate-600" data-v-06dca20b>${ssrInterpolate(topup.name)}</span>。填增量(可填负数下调),当前余额:<span class="text-emerald-600" data-v-06dca20b>${ssrInterpolate(topup.cur)}</span></p><div class="grid grid-cols-3 gap-3" data-v-06dca20b><div data-v-06dca20b><label class="text-xs text-slate-500" data-v-06dca20b>VIP天数</label><input${ssrRenderAttr("value", topup.vipday)} type="number" class="input input-bordered input-sm w-full" data-v-06dca20b></div><div data-v-06dca20b><label class="text-xs text-slate-500" data-v-06dca20b>翻译分钟</label><input${ssrRenderAttr("value", topup.trademin)} type="number" class="input input-bordered input-sm w-full" data-v-06dca20b></div><div data-v-06dca20b><label class="text-xs text-slate-500" data-v-06dca20b>会议分钟</label><input${ssrRenderAttr("value", topup.meetmin)} type="number" class="input input-bordered input-sm w-full" data-v-06dca20b></div></div><div class="modal-action" data-v-06dca20b><button class="btn btn-ghost btn-sm" data-v-06dca20b>取消</button><button class="btn btn-primary btn-sm text-white" data-v-06dca20b>确认</button></div></div><form method="dialog" class="modal-backdrop" data-v-06dca20b><button data-v-06dca20b>close</button></form></dialog></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/accounts.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const accounts = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-06dca20b"]]);
export { accounts as default };
//# sourceMappingURL=accounts-Do2bLhnl.mjs.map

1
apps/admin/.output/server/chunks/build/accounts-Do2bLhnl.mjs.map

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

8
apps/admin/.output/server/chunks/build/accounts-styles.BDB5hjDL.mjs

@ -0,0 +1,8 @@
const accounts_vue_vue_type_style_index_0_scoped_11e40be5_lang = ".chk[data-v-11e40be5]{display:flex;align-items:center;gap:6px;padding:5px 9px;border:1px solid #e2e8f0;border-radius:8px;font-size:12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chk[data-v-11e40be5]:hover{background:#f8fafc}.chk input[data-v-11e40be5]{width:14px;height:14px}";
const accountsStyles_BDB5hjDL = [
accounts_vue_vue_type_style_index_0_scoped_11e40be5_lang
];
export { accountsStyles_BDB5hjDL as default };
//# sourceMappingURL=accounts-styles.BDB5hjDL.mjs.map

1
apps/admin/.output/server/chunks/build/accounts-styles.BDB5hjDL.mjs.map

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

8
apps/admin/.output/server/chunks/build/accounts-styles.E9MHodaB.mjs

@ -1,8 +0,0 @@
const accounts_vue_vue_type_style_index_0_scoped_06dca20b_lang = ".chk[data-v-06dca20b]{display:flex;align-items:center;gap:6px;padding:5px 9px;border:1px solid #e2e8f0;border-radius:8px;font-size:12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chk[data-v-06dca20b]:hover{background:#f8fafc}.chk input[data-v-06dca20b]{width:14px;height:14px}";
const accountsStyles_E9MHodaB = [
accounts_vue_vue_type_style_index_0_scoped_06dca20b_lang
];
export { accountsStyles_E9MHodaB as default };
//# sourceMappingURL=accounts-styles.E9MHodaB.mjs.map

1
apps/admin/.output/server/chunks/build/accounts-styles.E9MHodaB.mjs.map

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

1
apps/admin/.output/server/chunks/build/agents-C12ARvzr.mjs.map

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

6
apps/admin/.output/server/chunks/build/agents-C12ARvzr.mjs → apps/admin/.output/server/chunks/build/agents-CIlOwJNK.mjs

@ -2,8 +2,8 @@ import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderClass, ssrRenderComponent } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { L as LANG_OPTIONS } from './useLangOptions-DMhiAuTa.mjs';
import { _ as __nuxt_component_0 } from './LangSelect-C_QPlcDf.mjs';
import { L as LANG_OPTIONS } from './useLangOptions-CXXbv5NM.mjs';
import { _ as __nuxt_component_0 } from './LangSelect-Bvw-e1Cn.mjs';
import { _ as _export_sfc } from './server.mjs';
import './useLoading-D4zrSa2m.mjs';
import '../nitro/nitro.mjs';
@ -238,4 +238,4 @@ _sfc_main.setup = (props, ctx) => {
const agents = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-4a81d81a"]]);
export { agents as default };
//# sourceMappingURL=agents-C12ARvzr.mjs.map
//# sourceMappingURL=agents-CIlOwJNK.mjs.map

1
apps/admin/.output/server/chunks/build/agents-CIlOwJNK.mjs.map

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

1
apps/admin/.output/server/chunks/build/calltranslate-D-FgQw8P.mjs.map

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

6
apps/admin/.output/server/chunks/build/calltranslate-D-FgQw8P.mjs → apps/admin/.output/server/chunks/build/calltranslate-_E_BEUJD.mjs

@ -2,8 +2,8 @@ import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrRenderAttr, ssrInterpolate, ssrRenderStyle, ssrRenderComponent, ssrRenderClass } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { l as langName } from './useLangOptions-DMhiAuTa.mjs';
import { _ as __nuxt_component_0 } from './LangSelect-C_QPlcDf.mjs';
import { l as langName } from './useLangOptions-CXXbv5NM.mjs';
import { _ as __nuxt_component_0 } from './LangSelect-Bvw-e1Cn.mjs';
import { _ as _export_sfc } from './server.mjs';
import './useLoading-D4zrSa2m.mjs';
import '../nitro/nitro.mjs';
@ -264,4 +264,4 @@ _sfc_main.setup = (props, ctx) => {
const calltranslate = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c0bab860"]]);
export { calltranslate as default };
//# sourceMappingURL=calltranslate-D-FgQw8P.mjs.map
//# sourceMappingURL=calltranslate-_E_BEUJD.mjs.map

1
apps/admin/.output/server/chunks/build/calltranslate-_E_BEUJD.mjs.map

@ -0,0 +1 @@
{"version":3,"file":"calltranslate-_E_BEUJD.mjs","sources":["../../../../node_modules/.cache/nuxt/.nuxt/dist/server/_nuxt/calltranslate-_E_BEUJD.js"],"names":[],"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

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

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

77
apps/admin/.output/server/chunks/build/dashboard-CXdhxG8p.mjs → apps/admin/.output/server/chunks/build/dashboard-DNJrSuH-.mjs

@ -1,5 +1,5 @@
import { _ as __nuxt_component_0$1 } from './nuxt-link-BsKoUOa0.mjs';
import { defineComponent, computed, reactive, ref, mergeProps, unref, withCtx, createTextVNode, useSSRContext } from 'vue';
import { defineComponent, computed, reactive, ref, unref, mergeProps, withCtx, createTextVNode, useSSRContext } from 'vue';
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 { h as healthLastRunText, R as REGION_LABEL, a as healthReason } from './svchealth-8zW8U1Ef.mjs';
@ -251,7 +251,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
lines: [["trade_count", "翻译次数", "#8B5CF6"], ["trade_second", "翻译时长(秒)", "#A78BFA"]]
}
];
const IS_AGENT = computed(() => auth.identity === 3);
const IS_AGENT = computed(() => auth.identity === 3 && !auth.brandid);
const IS_SCOPED = computed(() => auth.isBrandAccount || auth.isDealer);
computed(() => auth.apps);
const BOUND_REGIONS = computed(() => auth.regions);
computed(() => auth.products.map((p) => parseInt(p)).filter((n) => !isNaN(n)));
@ -260,8 +261,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
const todayCards = computed(() => IS_AGENT.value ? TODAY_CARDS_ALL.filter((c) => !HIDE_FOR_AGENT.includes(c[0])) : TODAY_CARDS_ALL);
const panels = computed(() => IS_AGENT.value ? PANELS_ALL.filter((p) => p.key !== "user" && p.key !== "qrcode") : PANELS_ALL);
const rangeBtns = [[7, "7天"], [30, "30天"], [90, "90天"], [0, "全部"]];
const filters = reactive({ app: "", region: "", product: "" });
const filters = reactive({ app: "", region: "", product: "", channel: "" });
const appOptions = ref([]);
const channelOptions = ref([]);
const productOptions = ref([]);
const regionOptions = computed(() => {
if (IS_AGENT.value && BOUND_REGIONS.value.length) {
@ -323,55 +325,76 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
}
return (_ctx, _push, _parent, _attrs) => {
const _component_SvcAlertBanner = __nuxt_component_0;
_push(`<div${ssrRenderAttrs(_attrs)} data-v-0c034b8c>`);
_push(`<div${ssrRenderAttrs(_attrs)} data-v-aff3efc7>`);
_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><!--[-->`);
_push(`<div class="panel p-4 mb-5" data-v-aff3efc7><div class="flex flex-wrap items-end gap-3" data-v-aff3efc7>`);
if (!IS_SCOPED.value) {
_push(`<div class="form-control" data-v-aff3efc7><label class="label py-1" data-v-aff3efc7><span class="label-text text-xs text-slate-500" data-v-aff3efc7>应用</span></label><select class="select select-bordered select-sm w-40" data-v-aff3efc7><option value="" data-v-aff3efc7${ssrIncludeBooleanAttr(Array.isArray(filters.app) ? ssrLooseContain(filters.app, "") : ssrLooseEqual(filters.app, "")) ? " selected" : ""}>全部应用</option><!--[-->`);
ssrRenderList(appOptions.value, (a) => {
_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(`<option${ssrRenderAttr("value", a.value)} data-v-aff3efc7${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-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><!--[-->`);
_push(`<!--]--></select></div>`);
} else {
_push(`<!---->`);
}
if (!IS_SCOPED.value) {
_push(`<div class="form-control" data-v-aff3efc7><label class="label py-1" data-v-aff3efc7><span class="label-text text-xs text-slate-500" data-v-aff3efc7>区域</span></label><select class="select select-bordered select-sm w-32" data-v-aff3efc7><option value="" data-v-aff3efc7${ssrIncludeBooleanAttr(Array.isArray(filters.region) ? ssrLooseContain(filters.region, "") : ssrLooseEqual(filters.region, "")) ? " selected" : ""}>全部区域</option><!--[-->`);
ssrRenderList(regionOptions.value, (r) => {
_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(`<option${ssrRenderAttr("value", r.value)} data-v-aff3efc7${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-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><!--[-->`);
_push(`<!--]--></select></div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="form-control" data-v-aff3efc7><label class="label py-1" data-v-aff3efc7><span class="label-text text-xs text-slate-500" data-v-aff3efc7>产品</span></label><select class="select select-bordered select-sm w-48" data-v-aff3efc7><option value="" data-v-aff3efc7${ssrIncludeBooleanAttr(Array.isArray(filters.product) ? ssrLooseContain(filters.product, "") : ssrLooseEqual(filters.product, "")) ? " selected" : ""}>全部产品</option><!--[-->`);
ssrRenderList(productOptions.value, (p) => {
_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(`<option${ssrRenderAttr("value", p.value)} data-v-aff3efc7${ssrIncludeBooleanAttr(Array.isArray(filters.product) ? ssrLooseContain(filters.product, p.value) : ssrLooseEqual(filters.product, p.value)) ? " selected" : ""}>${ssrInterpolate(p.label)}</option>`);
});
_push(`<!--]--></select></div>`);
if (!unref(auth).isDealer) {
_push(`<div class="form-control" data-v-aff3efc7><label class="label py-1" data-v-aff3efc7><span class="label-text text-xs text-slate-500" data-v-aff3efc7>渠道商</span></label><select class="select select-bordered select-sm w-48" data-v-aff3efc7><option value="" data-v-aff3efc7${ssrIncludeBooleanAttr(Array.isArray(filters.channel) ? ssrLooseContain(filters.channel, "") : ssrLooseEqual(filters.channel, "")) ? " selected" : ""}>全部渠道商</option><option value="__none__" data-v-aff3efc7${ssrIncludeBooleanAttr(Array.isArray(filters.channel) ? ssrLooseContain(filters.channel, "__none__") : ssrLooseEqual(filters.channel, "__none__")) ? " selected" : ""}>未分配渠道</option><!--[-->`);
ssrRenderList(channelOptions.value, (ch) => {
_push(`<option${ssrRenderAttr("value", ch.value)} data-v-aff3efc7${ssrIncludeBooleanAttr(Array.isArray(filters.channel) ? ssrLooseContain(filters.channel, ch.value) : ssrLooseEqual(filters.channel, ch.value)) ? " selected" : ""}>${ssrInterpolate(ch.label)}</option>`);
});
_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><!--[-->`);
_push(`<!--]--></select></div>`);
} else {
_push(`<!---->`);
}
_push(`<button class="btn btn-primary btn-sm text-white" data-v-aff3efc7>查询</button><span class="text-xs text-slate-400 ml-auto self-center" data-v-aff3efc7>顶部为全量总览;各版面右上角可单独选时间周期</span></div></div><div class="sec-title muted" data-v-aff3efc7><span class="bar" style="${ssrRenderStyle({ "background": "#cbd5e1" })}" data-v-aff3efc7></span><h2 data-v-aff3efc7>累计数据</h2><span class="sub" data-v-aff3efc7>全量累计 · 随筛选条件变化</span></div><div class="grid grid-cols-2 md:grid-cols-4 gap-3 mb-8" data-v-aff3efc7><!--[-->`);
ssrRenderList(globalCards.value, (c) => {
_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 class="cum-card" data-v-aff3efc7><span class="ico" style="${ssrRenderStyle({ background: cardStyle(c[0])[1] })}" data-v-aff3efc7>${ssrInterpolate(cardStyle(c[0])[0])}</span><div class="body" data-v-aff3efc7><div class="lbl" data-v-aff3efc7>${ssrInterpolate(c[1])}</div><div class="val" data-v-aff3efc7>${ssrInterpolate(globalVal(c))}</div></div></div>`);
});
_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><!--[-->`);
_push(`<!--]--></div><div class="today-wrap mb-8" data-v-aff3efc7><div class="sec-title hero" style="${ssrRenderStyle({ "margin-bottom": "16px" })}" data-v-aff3efc7><span class="bar" style="${ssrRenderStyle({ "background": "linear-gradient(180deg,#0EA5E9,#22D3EE)" })}" data-v-aff3efc7></span><h2 data-v-aff3efc7>今日数据</h2><span class="tag" style="${ssrRenderStyle({ "color": "#0369a1", "background": "#dbeafe" })}" data-v-aff3efc7>${ssrInterpolate(todayTag.value)}</span><span class="sub" data-v-aff3efc7>今日 0 点至现在 · 含较昨日同比(设备类无日期维度,仅见累计)</span></div><div class="grid grid-cols-2 md:grid-cols-4 gap-4" data-v-aff3efc7><!--[-->`);
ssrRenderList(todayCards.value, (c) => {
_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>`);
_push(`<div class="today-card" data-v-aff3efc7><span class="accent" style="${ssrRenderStyle({ background: cardStyle(c[0])[2] })}" data-v-aff3efc7></span><div class="today-card-top" data-v-aff3efc7><span class="lbl" data-v-aff3efc7>${ssrInterpolate(c[1])}</span><span class="ico" style="${ssrRenderStyle({ background: cardStyle(c[0])[1] })}" data-v-aff3efc7>${ssrInterpolate(cardStyle(c[0])[0])}</span></div><div class="val" data-v-aff3efc7>${ssrInterpolate(todayVal(c))}</div><div class="foot" data-v-aff3efc7>`);
if (todayDelta(c).type === "new") {
_push(`<span class="delta up" data-v-0c034b8c>新</span>`);
_push(`<span class="delta up" data-v-aff3efc7>新</span>`);
} else if (todayDelta(c).type !== "none") {
_push(`<span class="${ssrRenderClass([todayDelta(c).type, "delta"])}" data-v-0c034b8c>${ssrInterpolate(todayDelta(c).arrow)} ${ssrInterpolate(todayDelta(c).abs)}%</span>`);
_push(`<span class="${ssrRenderClass([todayDelta(c).type, "delta"])}" data-v-aff3efc7>${ssrInterpolate(todayDelta(c).arrow)} ${ssrInterpolate(todayDelta(c).abs)}%</span>`);
} else {
_push(`<!---->`);
}
_push(`<span data-v-0c034b8c>较昨日</span></div></div>`);
_push(`<span data-v-aff3efc7>较昨日</span></div></div>`);
});
_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><!--[-->`);
_push(`<!--]--></div></div><div class="sec-title" data-v-aff3efc7><span class="bar" style="${ssrRenderStyle({ "background": "linear-gradient(180deg,#10B981,#22D3EE)" })}" data-v-aff3efc7></span><h2 data-v-aff3efc7>趋势分析</h2><span class="sub" data-v-aff3efc7>各版面右上角可独立选择时间周期</span></div><div class="grid grid-cols-1 xl:grid-cols-2 gap-6" data-v-aff3efc7><!--[-->`);
ssrRenderList(panels.value, (p) => {
_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>`);
_push(`<div class="panel" data-v-aff3efc7><div class="panel-head" data-v-aff3efc7><span class="panel-dot" style="${ssrRenderStyle({ background: p.tint })}" data-v-aff3efc7><svg width="17" height="17" fill="none" viewBox="0 0 24 24"${ssrRenderAttr("stroke", p.color)} data-v-aff3efc7><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"${ssrRenderAttr("d", p.icon)} data-v-aff3efc7></path></svg></span><span class="font-semibold text-slate-700 text-sm" data-v-aff3efc7>${ssrInterpolate(p.title)}</span>`);
if (p.key === "device") {
_push(`<span class="ml-auto text-xs text-slate-400" data-v-0c034b8c>当前累计 · 无日期维度</span>`);
_push(`<span class="ml-auto text-xs text-slate-400" data-v-aff3efc7>当前累计 · 无日期维度</span>`);
} else {
_push(`<div class="ml-auto flex items-center gap-1" data-v-0c034b8c><!--[-->`);
_push(`<div class="ml-auto flex items-center gap-1" data-v-aff3efc7><!--[-->`);
ssrRenderList(rangeBtns, (d) => {
_push(`<button class="${ssrRenderClass([{ "tbtn-on": d[0] === panelDays[p.key] }, "tbtn"])}" data-v-0c034b8c>${ssrInterpolate(d[1])}</button>`);
_push(`<button class="${ssrRenderClass([{ "tbtn-on": d[0] === panelDays[p.key] }, "tbtn"])}" data-v-aff3efc7>${ssrInterpolate(d[1])}</button>`);
});
_push(`<!--]--></div>`);
}
_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><!--[-->`);
_push(`</div><div class="px-5 py-4" data-v-aff3efc7><div class="grid grid-cols-2 sm:grid-cols-3 gap-2.5" data-v-aff3efc7><!--[-->`);
ssrRenderList(p.stats, (s) => {
_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 class="stat-box" data-v-aff3efc7><div class="stat-label" data-v-aff3efc7>${ssrInterpolate(s[1])}</div><div class="stat-val" data-v-aff3efc7>${ssrInterpolate(panelStatVal(p, s))}</div></div>`);
});
_push(`<!--]--></div>`);
if (p.key !== "device") {
_push(`<div style="${ssrRenderStyle({ "height": "170px", "margin-top": "1rem" })}" data-v-0c034b8c><canvas data-v-0c034b8c></canvas></div>`);
_push(`<div style="${ssrRenderStyle({ "height": "170px", "margin-top": "1rem" })}" data-v-aff3efc7><canvas data-v-aff3efc7></canvas></div>`);
} else {
_push(`<!---->`);
}
@ -387,7 +410,7 @@ _sfc_main.setup = (props, ctx) => {
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/dashboard.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
const dashboard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-0c034b8c"]]);
const dashboard = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-aff3efc7"]]);
export { dashboard as default };
//# sourceMappingURL=dashboard-CXdhxG8p.mjs.map
//# sourceMappingURL=dashboard-DNJrSuH-.mjs.map

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

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

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

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

@ -1 +0,0 @@
{"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]}

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

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

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

190
apps/admin/.output/server/chunks/build/dealers-D0gf3N66.mjs

@ -0,0 +1,190 @@
import { defineComponent, computed, ref, reactive, unref, useSSRContext } from 'vue';
import { ssrRenderAttrs, ssrRenderStyle, ssrRenderAttr, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderList, ssrInterpolate, ssrRenderClass } from 'vue/server-renderer';
import { u as useApi } from './useApi-B-E5eLsI.mjs';
import { u as useToast } from './useToast-CS21XT61.mjs';
import { a as useAuthStore } 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: "dealers",
__ssrInlineRender: true,
setup(__props) {
useApi();
useToast();
const auth = useAuthStore();
const canAudit = computed(() => auth.isAdmin);
const view = ref("list");
const rows = ref([]);
const brands = ref([]);
const loading = ref(false);
const submitting = ref(false);
const isEditing = ref(false);
const filters = reactive({ brandid: 0, status: -1, keyword: "" });
const form = reactive({ id: "", name: "", brandid: 0, sharepct: 0, contact: "", contactmails: "", remark: "" });
const STATUS_LABELS = { 0: "待审核", 1: "启用", 2: "停用", 3: "驳回" };
const STATUS_CLASS = {
0: "badge-warning",
1: "badge-success",
2: "badge-ghost",
3: "badge-error"
};
function statusLabel(s) {
return STATUS_LABELS[s] ?? String(s);
}
function statusClass(s) {
return STATUS_CLASS[s] ?? "badge-ghost";
}
function ratePct(rate) {
return ((Number(rate) || 0) / 100).toFixed(2) + "%";
}
function brandName(id) {
const b = brands.value.find((x) => x.id === id);
return b ? b.brand : id ? "品牌商#" + Number(id).toString(16).toUpperCase() : "-";
}
function fmtTime(ts) {
if (!ts) return "-";
const d = new Date(ts * 1e3);
const p = (n) => ("0" + n).slice(-2);
return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}`;
}
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)}><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}"><div class="flex items-center justify-between mb-5"><h2 class="text-lg font-semibold text-slate-800">渠道商列表</h2>`);
if (!unref(auth).isDealer) {
_push(`<button class="btn btn-primary btn-sm text-white">+ 新增渠道商</button>`);
} else {
_push(`<!---->`);
}
_push(`</div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-4 mb-4"><div class="flex flex-wrap items-end gap-3">`);
if (!unref(auth).isBrandAccount && !unref(auth).isDealer) {
_push(`<div class="form-control"><label class="label py-1"><span class="label-text text-xs text-slate-500">品牌商</span></label><select class="select select-bordered select-sm w-48"><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(filters.brandid) ? ssrLooseContain(filters.brandid, 0) : ssrLooseEqual(filters.brandid, 0)) ? " selected" : ""}>全部品牌商</option><!--[-->`);
ssrRenderList(brands.value, (b) => {
_push(`<option${ssrRenderAttr("value", b.id)}${ssrIncludeBooleanAttr(Array.isArray(filters.brandid) ? ssrLooseContain(filters.brandid, b.id) : ssrLooseEqual(filters.brandid, b.id)) ? " selected" : ""}>${ssrInterpolate(b.brand)}</option>`);
});
_push(`<!--]--></select></div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="form-control"><label class="label py-1"><span class="label-text text-xs text-slate-500">状态</span></label><select class="select select-bordered select-sm w-36"><option${ssrRenderAttr("value", -1)}${ssrIncludeBooleanAttr(Array.isArray(filters.status) ? ssrLooseContain(filters.status, -1) : ssrLooseEqual(filters.status, -1)) ? " selected" : ""}>全部状态</option><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(filters.status) ? ssrLooseContain(filters.status, 0) : ssrLooseEqual(filters.status, 0)) ? " selected" : ""}>待审核</option><option${ssrRenderAttr("value", 1)}${ssrIncludeBooleanAttr(Array.isArray(filters.status) ? ssrLooseContain(filters.status, 1) : ssrLooseEqual(filters.status, 1)) ? " selected" : ""}>启用</option><option${ssrRenderAttr("value", 2)}${ssrIncludeBooleanAttr(Array.isArray(filters.status) ? ssrLooseContain(filters.status, 2) : ssrLooseEqual(filters.status, 2)) ? " selected" : ""}>停用</option><option${ssrRenderAttr("value", 3)}${ssrIncludeBooleanAttr(Array.isArray(filters.status) ? ssrLooseContain(filters.status, 3) : ssrLooseEqual(filters.status, 3)) ? " selected" : ""}>驳回</option></select></div><div class="form-control"><label class="label py-1"><span class="label-text text-xs text-slate-500">搜索</span></label><input${ssrRenderAttr("value", filters.keyword)} type="text" class="input input-bordered input-sm w-52" placeholder="名称 / 渠道商ID"></div><button class="btn btn-sm btn-primary text-white">查询</button><button class="btn btn-sm btn-ghost">重置</button></div></div><div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="overflow-x-auto"><table class="table table-zebra"><thead><tr><th>渠道商ID</th><th>名称</th><th>所属品牌商</th><th>分成比例</th><th>联系方式</th><th>状态</th><th>创建时间</th><th>操作</th></tr></thead><tbody>`);
if (loading.value) {
_push(`<tr><td colspan="8" class="text-center py-8"><span class="loading loading-spinner loading-sm"></span></td></tr>`);
} else if (!rows.value.length) {
_push(`<tr><td colspan="8" class="text-center text-slate-400 py-8">暂无数据</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(rows.value, (ch) => {
_push(`<tr><td class="font-mono text-sm font-semibold">${ssrInterpolate(ch.id)}</td><td class="font-medium">${ssrInterpolate(ch.name)}</td><td><span class="badge badge-ghost badge-sm">${ssrInterpolate(brandName(ch.brandid))}</span></td><td class="text-sm">${ssrInterpolate(ratePct(ch.sharerate))}</td><td class="text-sm text-slate-500">`);
if (ch.contact) {
_push(`<div>${ssrInterpolate(ch.contact)}</div>`);
} else {
_push(`<!---->`);
}
if (ch.contactmails) {
_push(`<div class="text-xs text-slate-400">${ssrInterpolate(ch.contactmails)}</div>`);
} else {
_push(`<!---->`);
}
if (!ch.contact && !ch.contactmails) {
_push(`<span class="text-slate-300">-</span>`);
} else {
_push(`<!---->`);
}
_push(`</td><td><span class="${ssrRenderClass([statusClass(ch.status), "badge badge-sm"])}">${ssrInterpolate(statusLabel(ch.status))}</span>`);
if (ch.status === 3 && ch.auditremark) {
_push(`<div class="text-xs text-slate-400 mt-1">${ssrInterpolate(ch.auditremark)}</div>`);
} else {
_push(`<!---->`);
}
_push(`</td><td class="text-sm text-slate-500">${ssrInterpolate(fmtTime(ch.createtime))}</td><td><div class="flex flex-wrap gap-1"><button class="btn btn-ghost btn-xs">编辑</button>`);
if (canAudit.value) {
_push(`<!--[-->`);
if (ch.status !== 1) {
_push(`<button class="btn btn-ghost btn-xs text-emerald-600">${ssrInterpolate(ch.status === 0 ? "通过" : "启用")}</button>`);
} else {
_push(`<!---->`);
}
if (ch.status === 1) {
_push(`<button class="btn btn-ghost btn-xs text-amber-600">停用</button>`);
} else {
_push(`<!---->`);
}
if (ch.status === 0) {
_push(`<button class="btn btn-ghost btn-xs text-red-500">驳回</button>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
} else {
_push(`<!---->`);
}
if (!unref(auth).isDealer) {
_push(`<button class="btn btn-ghost btn-xs text-red-500">删除</button>`);
} else {
_push(`<!---->`);
}
_push(`</div></td></tr>`);
});
_push(`<!--]--></tbody></table></div></div><p class="text-xs text-slate-400 mt-3">`);
if (unref(auth).isBrandAccount) {
_push(`<!--[--> 这里只显示贵品牌商名下的渠道商。新增后为「待审核」,需平台审核通过(状态=启用)才能用于生产授权码;分成比例由平台设置。 <!--]-->`);
} else {
_push(`<!--[--> 渠道商新增后需超管/管理员审核通过(状态=启用)才能用于生产授权码;已有生产批次的渠道商不能删除,只能停用。 <!--]-->`);
}
_push(`</p></div><div style="${ssrRenderStyle(view.value === "form" ? null : { display: "none" })}"><div class="flex items-center gap-3 mb-5"><button class="btn btn-ghost btn-sm">← 返回列表</button><h2 class="text-lg font-semibold text-slate-800">${ssrInterpolate(isEditing.value ? "编辑渠道商" : "新增渠道商")}</h2></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-6 max-w-2xl"><form>`);
if (isEditing.value) {
_push(`<div class="form-control mb-4"><label class="label"><span class="label-text font-medium">渠道商ID</span></label><input${ssrRenderAttr("value", form.id)} type="text" class="input input-bordered w-full font-mono" disabled><span class="label-text-alt text-slate-400 mt-1">短码由系统生成,创建后不可修改</span></div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="form-control mb-4"><label class="label"><span class="label-text font-medium">渠道商名称 *</span></label><input${ssrRenderAttr("value", form.name)} type="text" class="input input-bordered w-full" required></div>`);
if (!unref(auth).isBrandAccount) {
_push(`<div class="form-control mb-4"><label class="label"><span class="label-text font-medium">所属品牌商 *</span></label><select class="select select-bordered w-full"${ssrIncludeBooleanAttr(isEditing.value) ? " disabled" : ""} required><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(form.brandid) ? ssrLooseContain(form.brandid, 0) : ssrLooseEqual(form.brandid, 0)) ? " selected" : ""}>请选择品牌商</option><!--[-->`);
ssrRenderList(brands.value, (b) => {
_push(`<option${ssrRenderAttr("value", b.id)}${ssrIncludeBooleanAttr(Array.isArray(form.brandid) ? ssrLooseContain(form.brandid, b.id) : ssrLooseEqual(form.brandid, b.id)) ? " selected" : ""}>${ssrInterpolate(b.brand)}</option>`);
});
_push(`<!--]--></select>`);
if (isEditing.value) {
_push(`<span class="label-text-alt text-slate-400 mt-1">归属品牌商创建后不可修改</span>`);
} else {
_push(`<!---->`);
}
_push(`</div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="form-control mb-4"><label class="label"><span class="label-text font-medium">分成比例(%)</span></label><input${ssrRenderAttr("value", form.sharepct)} type="number" step="0.01" min="0" max="100" class="input input-bordered w-full"${ssrIncludeBooleanAttr(!canAudit.value) ? " disabled" : ""}><span class="label-text-alt text-slate-400 mt-1"> 从所属品牌商的分成里再切;仅超管/管理员可设置。 </span></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">联系人 / 电话</span></label><input${ssrRenderAttr("value", form.contact)} type="text" class="input input-bordered w-full"></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">联系邮箱</span></label><input${ssrRenderAttr("value", form.contactmails)} type="text" class="input input-bordered w-full" placeholder="多个邮箱用逗号分隔"></div><div class="form-control mb-6"><label class="label"><span class="label-text font-medium">备注</span></label><textarea class="textarea textarea-bordered w-full" rows="3">${ssrInterpolate(form.remark)}</textarea></div><div class="flex gap-3"><button type="button" class="btn btn-ghost">取消</button><button type="submit" class="btn btn-primary text-white"${ssrIncludeBooleanAttr(submitting.value) ? " disabled" : ""}>保存</button></div>`);
if (!isEditing.value && !canAudit.value) {
_push(`<p class="text-xs text-amber-600 mt-3"> 提交后为「待审核」状态,须超管/管理员通过后才能用于生产。 </p>`);
} else {
_push(`<!---->`);
}
_push(`</form></div></div></div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/dealers.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export { _sfc_main as default };
//# sourceMappingURL=dealers-D0gf3N66.mjs.map

1
apps/admin/.output/server/chunks/build/dealers-D0gf3N66.mjs.map

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

1
apps/admin/.output/server/chunks/build/device-B1tPcS6i.mjs.map

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

36
apps/admin/.output/server/chunks/build/device-B1tPcS6i.mjs → apps/admin/.output/server/chunks/build/device-C1RxH3sw.mjs

@ -32,6 +32,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
const canCreate = computed(() => auth.identity > 0 && auth.identity <= 2);
const tab = ref("codes");
const brands = ref([]);
const channels = ref([]);
const products = ref([]);
const allProducts = ref([]);
const notes = ref([]);
@ -40,6 +41,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
const devPage = ref(0);
const devPageSize = ref(200);
const filterBrand = ref(0);
const filterChannel = ref("");
const filterProduct = ref(0);
const filterStart = ref("");
const filterEnd = ref("");
@ -66,6 +68,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
ref(null);
const createMode = ref("production");
const cBrand = ref(0);
const cChannel = ref("");
const cProduct = ref(0);
const cBindmac = ref(false);
const cNumber = ref(null);
@ -91,6 +94,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
const filterProductOptions = computed(() => {
return filterBrand.value ? products.value.filter((p) => p.brandid === filterBrand.value) : products.value;
});
const filterChannelOptions = computed(() => {
return filterBrand.value ? channels.value.filter((ch) => ch.brandid === filterBrand.value) : channels.value;
});
const createChannelOptions = computed(() => {
return cBrand.value ? channels.value.filter((ch) => ch.brandid === cBrand.value && ch.status === 1) : [];
});
const createProductOptions = computed(() => {
return cBrand.value ? products.value.filter((p) => p.brandid === cBrand.value) : [];
});
@ -115,6 +124,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
const b = brands.value.find((x) => x.id === id);
return b ? b.brand : String(id || "");
}
function nameOfChannel(id) {
if (!id) return "未分配";
const ch = channels.value.find((x) => x.id === id);
return ch ? ch.name + " (" + ch.id + ")" : id;
}
function nameOfProduct(id) {
const p = allProducts.value.find((x) => x.id === id);
return p ? p.devicename : String(id || "");
@ -147,6 +161,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
ssrRenderList(brands.value, (b) => {
_push(`<option${ssrRenderAttr("value", b.id)}${ssrIncludeBooleanAttr(Array.isArray(filterBrand.value) ? ssrLooseContain(filterBrand.value, b.id) : ssrLooseEqual(filterBrand.value, b.id)) ? " selected" : ""}>${ssrInterpolate(b.brand || "")}</option>`);
});
_push(`<!--]--></select><select class="select select-bordered select-sm" style="${ssrRenderStyle({ "min-width": "160px" })}"><option value=""${ssrIncludeBooleanAttr(Array.isArray(filterChannel.value) ? ssrLooseContain(filterChannel.value, "") : ssrLooseEqual(filterChannel.value, "")) ? " selected" : ""}>全部渠道商</option><!--[-->`);
ssrRenderList(filterChannelOptions.value, (ch) => {
_push(`<option${ssrRenderAttr("value", ch.id)}${ssrIncludeBooleanAttr(Array.isArray(filterChannel.value) ? ssrLooseContain(filterChannel.value, ch.id) : ssrLooseEqual(filterChannel.value, ch.id)) ? " selected" : ""}>${ssrInterpolate(ch.name)} (${ssrInterpolate(ch.id)})</option>`);
});
_push(`<!--]--></select><select class="select select-bordered select-sm" style="${ssrRenderStyle({ "min-width": "180px" })}"><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(filterProduct.value) ? ssrLooseContain(filterProduct.value, 0) : ssrLooseEqual(filterProduct.value, 0)) ? " selected" : ""}>请选择产品</option><!--[-->`);
ssrRenderList(filterProductOptions.value, (p) => {
_push(`<option${ssrRenderAttr("value", p.id)}${ssrIncludeBooleanAttr(Array.isArray(filterProduct.value) ? ssrLooseContain(filterProduct.value, p.id) : ssrLooseEqual(filterProduct.value, p.id)) ? " selected" : ""}>${ssrInterpolate(p.devicename || "")}</option>`);
@ -180,17 +198,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
});
_push(`<!--]-->`);
}
_push(`</tbody></table></div><div class="flex items-center justify-between px-5 py-3 border-t border-slate-100"><span class="text-xs text-slate-500">${ssrInterpolate(filterProduct.value ? "共 " + devTotal.value + " 条" : "-")}</span><div class="flex items-center gap-2"><button class="btn btn-ghost btn-xs"${ssrIncludeBooleanAttr(devPage.value <= 0 || !filterProduct.value) ? " disabled" : ""}>上一页</button><span class="text-xs text-slate-500">${ssrInterpolate(pgInfoText.value)}</span><button class="btn btn-ghost btn-xs"${ssrIncludeBooleanAttr(!filterProduct.value || devPage.value + 1 >= totalPages.value) ? " disabled" : ""}>下一页</button></div></div></div><div style="${ssrRenderStyle(tab.value === "batches" ? null : { display: "none" })}"><div class="grid grid-cols-3 gap-4 mb-5"><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-5"><div class="text-xs text-slate-400 mb-1">命中批次数</div><div class="text-2xl font-bold text-slate-800">${ssrInterpolate(statBatch.value)}</div></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-5"><div class="text-xs text-slate-400 mb-1">生产授权码总数</div><div class="text-2xl font-bold text-indigo-600">${ssrInterpolate(statDevices.value)}</div></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-5"><div class="text-xs text-slate-400 mb-1">最近一次生产时间</div><div class="text-base font-semibold text-slate-700">${ssrInterpolate(statLast.value)}</div></div></div><div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="flex items-center justify-between px-5 py-3 border-b border-slate-100 flex-wrap gap-2"><h3 class="text-sm font-semibold text-slate-700">生产记录(按批次)<span class="text-xs text-slate-400 font-normal ml-2">点击记录查看该批次授权码</span></h3><div class="flex items-end gap-2 flex-wrap"><div class="form-control"><label class="label py-0"><span class="label-text text-xs">起始时间</span></label><input${ssrRenderAttr("value", filterStart.value)} type="date" class="input input-bordered input-xs"></div><div class="form-control"><label class="label py-0"><span class="label-text text-xs">结束时间</span></label><input${ssrRenderAttr("value", filterEnd.value)} type="date" class="input input-bordered input-xs"></div><button class="btn btn-primary btn-xs text-white">查询</button><span class="text-xs text-slate-400">${ssrInterpolate(notesCountText.value)}</span><button class="btn btn-ghost btn-xs">导出CSV</button></div></div><div class="overflow-x-auto" style="${ssrRenderStyle({ "max-height": "480px" })}"><table class="table table-pin-rows text-sm"><thead><tr><th class="w-40">生产时间</th><th>品牌商</th><th>产品</th><th>批次号</th><th>序号区间</th><th>起始MAC</th><th>结束MAC</th><th class="text-right">数量</th><th>操作</th></tr></thead><tbody>`);
_push(`</tbody></table></div><div class="flex items-center justify-between px-5 py-3 border-t border-slate-100"><span class="text-xs text-slate-500">${ssrInterpolate(filterProduct.value ? "共 " + devTotal.value + " 条" : "-")}</span><div class="flex items-center gap-2"><button class="btn btn-ghost btn-xs"${ssrIncludeBooleanAttr(devPage.value <= 0 || !filterProduct.value) ? " disabled" : ""}>上一页</button><span class="text-xs text-slate-500">${ssrInterpolate(pgInfoText.value)}</span><button class="btn btn-ghost btn-xs"${ssrIncludeBooleanAttr(!filterProduct.value || devPage.value + 1 >= totalPages.value) ? " disabled" : ""}>下一页</button></div></div></div><div style="${ssrRenderStyle(tab.value === "batches" ? null : { display: "none" })}"><div class="grid grid-cols-3 gap-4 mb-5"><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-5"><div class="text-xs text-slate-400 mb-1">命中批次数</div><div class="text-2xl font-bold text-slate-800">${ssrInterpolate(statBatch.value)}</div></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-5"><div class="text-xs text-slate-400 mb-1">生产授权码总数</div><div class="text-2xl font-bold text-indigo-600">${ssrInterpolate(statDevices.value)}</div></div><div class="bg-white rounded-xl shadow-sm border border-slate-100 p-5"><div class="text-xs text-slate-400 mb-1">最近一次生产时间</div><div class="text-base font-semibold text-slate-700">${ssrInterpolate(statLast.value)}</div></div></div><div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="flex items-center justify-between px-5 py-3 border-b border-slate-100 flex-wrap gap-2"><h3 class="text-sm font-semibold text-slate-700">生产记录(按批次)<span class="text-xs text-slate-400 font-normal ml-2">点击记录查看该批次授权码</span></h3><div class="flex items-end gap-2 flex-wrap"><div class="form-control"><label class="label py-0"><span class="label-text text-xs">起始时间</span></label><input${ssrRenderAttr("value", filterStart.value)} type="date" class="input input-bordered input-xs"></div><div class="form-control"><label class="label py-0"><span class="label-text text-xs">结束时间</span></label><input${ssrRenderAttr("value", filterEnd.value)} type="date" class="input input-bordered input-xs"></div><button class="btn btn-primary btn-xs text-white">查询</button><span class="text-xs text-slate-400">${ssrInterpolate(notesCountText.value)}</span><button class="btn btn-ghost btn-xs">导出CSV</button></div></div><div class="overflow-x-auto" style="${ssrRenderStyle({ "max-height": "480px" })}"><table class="table table-pin-rows text-sm"><thead><tr><th class="w-40">生产时间</th><th>品牌商</th><th>渠道商</th><th>产品</th><th>批次号</th><th>序号区间</th><th>起始MAC</th><th>结束MAC</th><th class="text-right">数量</th><th>操作</th></tr></thead><tbody>`);
if (notesLoading.value) {
_push(`<tr><td colspan="9" class="text-center text-slate-400 py-8">加载中…</td></tr>`);
_push(`<tr><td colspan="10" class="text-center text-slate-400 py-8">加载中…</td></tr>`);
} else if (notesError.value) {
_push(`<tr><td colspan="9" class="text-center text-red-400 py-8">查询失败: ${ssrInterpolate(notesError.value)}</td></tr>`);
_push(`<tr><td colspan="10" class="text-center text-red-400 py-8">查询失败: ${ssrInterpolate(notesError.value)}</td></tr>`);
} else if (!notes.value.length) {
_push(`<tr><td colspan="9" class="text-center text-slate-400 py-8">暂无数据</td></tr>`);
_push(`<tr><td colspan="10" class="text-center text-slate-400 py-8">暂无数据</td></tr>`);
} else {
_push(`<!--[-->`);
ssrRenderList(notes.value, (n, i) => {
_push(`<tr class="hover cursor-pointer"><td class="text-xs text-slate-500 whitespace-nowrap">${ssrInterpolate(fmtTime(n.ts))}</td><td class="text-xs">${ssrInterpolate(nameOfBrand(n.brandid))}</td><td class="text-xs">${ssrInterpolate(nameOfProduct(n.productid))}</td><td class="font-mono text-xs font-medium text-indigo-600">${ssrInterpolate(n.batchno || "")}</td><td class="font-mono text-xs">${ssrInterpolate(serialRange(n))}</td><td class="font-mono text-xs">${ssrInterpolate(n.startmac || "")}</td><td class="font-mono text-xs">${ssrInterpolate(n.endmac || "")}</td><td class="text-right font-medium">${ssrInterpolate(n.devicenum || 0)}</td><td><div class="flex gap-1"><button class="btn btn-ghost btn-xs text-indigo-500">查看授权码</button>`);
_push(`<tr class="hover cursor-pointer"><td class="text-xs text-slate-500 whitespace-nowrap">${ssrInterpolate(fmtTime(n.ts))}</td><td class="text-xs">${ssrInterpolate(nameOfBrand(n.brandid))}</td><td class="text-xs">${ssrInterpolate(nameOfChannel(n.channelid))}</td><td class="text-xs">${ssrInterpolate(nameOfProduct(n.productid))}</td><td class="font-mono text-xs font-medium text-indigo-600">${ssrInterpolate(n.batchno || "")}</td><td class="font-mono text-xs">${ssrInterpolate(serialRange(n))}</td><td class="font-mono text-xs">${ssrInterpolate(n.startmac || "")}</td><td class="font-mono text-xs">${ssrInterpolate(n.endmac || "")}</td><td class="text-right font-medium">${ssrInterpolate(n.devicenum || 0)}</td><td><div class="flex gap-1"><button class="btn btn-ghost btn-xs text-indigo-500">查看授权码</button>`);
if (isSuperAdmin.value) {
_push(`<button class="btn btn-ghost btn-xs text-red-500">撤销</button>`);
} else {
@ -204,6 +222,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
ssrRenderList(brands.value, (b) => {
_push(`<option${ssrRenderAttr("value", b.id)}${ssrIncludeBooleanAttr(Array.isArray(cBrand.value) ? ssrLooseContain(cBrand.value, b.id) : ssrLooseEqual(cBrand.value, b.id)) ? " selected" : ""}>${ssrInterpolate((b.brand || "") + " (" + hexId(b.id) + ")")}</option>`);
});
_push(`<!--]--></select></div><div class="form-control"><label class="label"><span class="label-text font-medium">渠道商 *</span></label><select class="select select-bordered select-sm w-full" required${ssrIncludeBooleanAttr(!createChannelOptions.value.length) ? " disabled" : ""}><option value=""${ssrIncludeBooleanAttr(Array.isArray(cChannel.value) ? ssrLooseContain(cChannel.value, "") : ssrLooseEqual(cChannel.value, "")) ? " selected" : ""}>${ssrInterpolate(cBrand.value ? createChannelOptions.value.length ? "请选择渠道商" : "该品牌商暂无已启用渠道商" : "请先选择品牌商")}</option><!--[-->`);
ssrRenderList(createChannelOptions.value, (ch) => {
_push(`<option${ssrRenderAttr("value", ch.id)}${ssrIncludeBooleanAttr(Array.isArray(cChannel.value) ? ssrLooseContain(cChannel.value, ch.id) : ssrLooseEqual(cChannel.value, ch.id)) ? " selected" : ""}>${ssrInterpolate(ch.name + " (" + ch.id + ")")}</option>`);
});
_push(`<!--]--></select></div><div class="form-control"><label class="label"><span class="label-text font-medium">产品 *</span></label><select class="select select-bordered select-sm w-full" required${ssrIncludeBooleanAttr(!createProductOptions.value.length) ? " disabled" : ""}><option${ssrRenderAttr("value", 0)}${ssrIncludeBooleanAttr(Array.isArray(cProduct.value) ? ssrLooseContain(cProduct.value, 0) : ssrLooseEqual(cProduct.value, 0)) ? " selected" : ""}>${ssrInterpolate(cBrand.value ? "请选择产品" : "请先选择品牌商")}</option><!--[-->`);
ssrRenderList(createProductOptions.value, (p) => {
_push(`<option${ssrRenderAttr("value", p.id)}${ssrIncludeBooleanAttr(Array.isArray(cProduct.value) ? ssrLooseContain(cProduct.value, p.id) : ssrLooseEqual(cProduct.value, p.id)) ? " selected" : ""}>${ssrInterpolate((p.devicename || "") + " (" + hexId(p.id) + ")")}</option>`);
@ -234,7 +256,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
}
_push(`下一步:确认生产方案 </button></div></form></div><form method="dialog" class="modal-backdrop"><button>close</button></form></dialog><dialog class="modal"><div class="modal-box max-w-lg"><h3 class="font-bold text-lg mb-3">确认生产方案</h3><div class="bg-amber-50 border border-amber-200 rounded-lg p-3 text-xs text-amber-700 mb-4"> 请核对以下生产方案。确认后立即提交服务端生产,批次一经生成只能整批撤销、不可修改。 </div>`);
if (preview.value) {
_push(`<div class="rounded-lg border border-slate-200 bg-slate-50 px-4 py-3 font-mono text-sm leading-7 mb-4"><div>生产批次(BatchNo):<b class="text-indigo-600">${ssrInterpolate(preview.value.batchno || "生产时分配")}</b></div><div>品牌商:${ssrInterpolate(preview.value.brandname)}</div><div>服务ID(CID):0x${ssrInterpolate(previewCid.value)}</div><div>品牌ID(BID):0x${ssrInterpolate(hexId(preview.value.brandid).padStart(4, "0"))}</div><div>产品ID(PID):0x${ssrInterpolate(hexId(preview.value.productid).padStart(4, "0"))}</div><div>产品名称:${ssrInterpolate(preview.value.productname)}</div><div>授权码类型:${ssrInterpolate(preview.value.codetype)}</div><div>生产数量:<b class="text-indigo-600">${ssrInterpolate(preview.value.total)}</b> 个`);
_push(`<div class="rounded-lg border border-slate-200 bg-slate-50 px-4 py-3 font-mono text-sm leading-7 mb-4"><div>生产批次(BatchNo):<b class="text-indigo-600">${ssrInterpolate(preview.value.batchno || "生产时分配")}</b></div><div>品牌商:${ssrInterpolate(preview.value.brandname)}</div><div>渠道商:${ssrInterpolate(preview.value.channelname)}(${ssrInterpolate(preview.value.channelid)})</div><div>服务ID(CID):0x${ssrInterpolate(previewCid.value)}</div><div>品牌ID(BID):0x${ssrInterpolate(hexId(preview.value.brandid).padStart(4, "0"))}</div><div>产品ID(PID):0x${ssrInterpolate(hexId(preview.value.productid).padStart(4, "0"))}</div><div>产品名称:${ssrInterpolate(preview.value.productname)}</div><div>授权码类型:${ssrInterpolate(preview.value.codetype)}</div><div>生产数量:<b class="text-indigo-600">${ssrInterpolate(preview.value.total)}</b> 个`);
if (preview.value.codecount > 1) {
_push(`<!--[-->(每副 ${ssrInterpolate(preview.value.codecount)} 份)<!--]-->`);
} else {
@ -280,4 +302,4 @@ _sfc_main.setup = (props, ctx) => {
};
export { _sfc_main as default };
//# sourceMappingURL=device-B1tPcS6i.mjs.map
//# sourceMappingURL=device-C1RxH3sw.mjs.map

1
apps/admin/.output/server/chunks/build/device-C1RxH3sw.mjs.map

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

1
apps/admin/.output/server/chunks/build/factory-BCjt3r8_.mjs.map

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

17
apps/admin/.output/server/chunks/build/factory-BCjt3r8_.mjs → apps/admin/.output/server/chunks/build/factory-Bvr021eV.mjs

@ -35,7 +35,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
const isEditing = ref(false);
const emails = ref([]);
const newEmail = ref("");
const form = reactive({ id: 0, brand: "", providerid: 0, description: "" });
const form = reactive({ id: 0, brand: "", providerid: 0, description: "", sharepct: 0 });
function ratePct(rate) {
return ((Number(rate) || 0) / 100).toFixed(2) + "%";
}
function hexId(id) {
return id ? Number(id).toString(16).toUpperCase() : "";
}
@ -48,17 +51,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
return p ? p.name : "方案商#" + pid;
}
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)}><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}"><div class="flex items-center justify-between mb-5"><h2 class="text-lg font-semibold text-slate-800">品牌商列表</h2><button class="btn btn-primary btn-sm text-white">+ 新增品牌商</button></div><div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="overflow-x-auto"><table class="table table-zebra"><thead><tr><th>ID</th><th>品牌名称</th><th>归属方案商</th><th>联系邮箱</th><th>产品</th><th>操作</th></tr></thead><tbody>`);
_push(`<div${ssrRenderAttrs(_attrs)}><div style="${ssrRenderStyle(view.value === "list" ? null : { display: "none" })}"><div class="flex items-center justify-between mb-5"><h2 class="text-lg font-semibold text-slate-800">品牌商列表</h2><button class="btn btn-primary btn-sm text-white">+ 新增品牌商</button></div><div class="bg-white rounded-xl shadow-sm border border-slate-100"><div class="overflow-x-auto"><table class="table table-zebra"><thead><tr><th>ID</th><th>品牌名称</th><th>归属方案商</th><th>分成比例</th><th>联系邮箱</th><th>产品</th><th>操作</th></tr></thead><tbody>`);
if (loading.value) {
_push(`<tr><td colspan="6" class="text-center py-8"><span class="loading loading-spinner loading-sm"></span></td></tr>`);
_push(`<tr><td colspan="7" class="text-center py-8"><span class="loading loading-spinner loading-sm"></span></td></tr>`);
} else if (!rows.value.length) {
_push(`<tr><td colspan="6" class="text-center text-slate-400 py-8">暂无数据</td></tr>`);
_push(`<tr><td colspan="7" class="text-center text-slate-400 py-8">暂无数据</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`<!--[-->`);
ssrRenderList(rows.value, (b) => {
_push(`<tr><td class="font-mono text-sm">${ssrInterpolate(hexId(b.id))}</td><td class="font-medium">${ssrInterpolate(b.brand)}</td><td><span class="badge badge-ghost badge-sm">${ssrInterpolate(providerName(b.providerid))}</span></td><td class="text-sm">`);
_push(`<tr><td class="font-mono text-sm">${ssrInterpolate(hexId(b.id))}</td><td class="font-medium">${ssrInterpolate(b.brand)}</td><td><span class="badge badge-ghost badge-sm">${ssrInterpolate(providerName(b.providerid))}</span></td><td class="text-sm">${ssrInterpolate(ratePct(b.sharerate))}</td><td class="text-sm">`);
if (mailList(b.contactmails).length) {
_push(`<!--[-->`);
ssrRenderList(mailList(b.contactmails), (e, i) => {
@ -74,7 +77,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
ssrRenderList(providers.value, (p) => {
_push(`<option${ssrRenderAttr("value", p.id)}${ssrIncludeBooleanAttr(Array.isArray(form.providerid) ? ssrLooseContain(form.providerid, p.id) : ssrLooseEqual(form.providerid, p.id)) ? " selected" : ""}>${ssrInterpolate(p.name)}</option>`);
});
_push(`<!--]--></select></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">描述</span></label><textarea class="textarea textarea-bordered w-full" rows="3">${ssrInterpolate(form.description)}</textarea></div><div class="form-control mb-6"><label class="label"><span class="label-text font-medium">联系邮箱</span></label><div class="space-y-2">`);
_push(`<!--]--></select></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">分成比例(%)</span></label><input${ssrRenderAttr("value", form.sharepct)} type="number" step="0.01" min="0" max="100" class="input input-bordered w-full"><span class="label-text-alt text-slate-400 mt-1">平台从订单实付里分给该品牌商的总提成;其名下渠道商再从这份里切自己的比例。</span></div><div class="form-control mb-4"><label class="label"><span class="label-text font-medium">描述</span></label><textarea class="textarea textarea-bordered w-full" rows="3">${ssrInterpolate(form.description)}</textarea></div><div class="form-control mb-6"><label class="label"><span class="label-text font-medium">联系邮箱</span></label><div class="space-y-2">`);
if (!emails.value.length) {
_push(`<p class="text-xs text-slate-400">暂无邮箱</p>`);
} else {
@ -96,4 +99,4 @@ _sfc_main.setup = (props, ctx) => {
};
export { _sfc_main as default };
//# sourceMappingURL=factory-BCjt3r8_.mjs.map
//# sourceMappingURL=factory-Bvr021eV.mjs.map

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

Loading…
Cancel
Save