Bladeren bron

项目初始化

lichunlei 6 dagen geleden
commit
13d2024098
100 gewijzigde bestanden met toevoegingen van 27259 en 0 verwijderingen
  1. BIN
      .DS_Store
  2. 1 0
      .vscode/settings.json
  3. 10 0
      AdminFrontEnd/.browserslistrc
  4. 153 0
      AdminFrontEnd/.drone.yml
  5. 17 0
      AdminFrontEnd/.editorconfig
  6. 19 0
      AdminFrontEnd/.env
  7. 9 0
      AdminFrontEnd/.env.development
  8. 9 0
      AdminFrontEnd/.env.production
  9. 9 0
      AdminFrontEnd/.env.test
  10. 6 0
      AdminFrontEnd/.gitattributes
  11. 42 0
      AdminFrontEnd/.gitignore
  12. 10 0
      AdminFrontEnd/.prettierignore
  13. 9 0
      AdminFrontEnd/.vscode/extensions.json
  14. 9 0
      AdminFrontEnd/.vscode/mcp.json
  15. 65 0
      AdminFrontEnd/.vscode/settings.json
  16. 37 0
      AdminFrontEnd/config/plugins/index.ts
  17. 26 0
      AdminFrontEnd/config/plugins/plugin_autoImport.ts
  18. 178 0
      AdminFrontEnd/config/plugins/plugin_backup.ts
  19. 60 0
      AdminFrontEnd/config/plugins/plugin_envType.ts
  20. 17 0
      AdminFrontEnd/config/plugins/plugin_icons.ts
  21. 112 0
      AdminFrontEnd/config/plugins/plugin_svg.ts
  22. 41 0
      AdminFrontEnd/config/plugins/plugins_autoComponent.ts
  23. 16 0
      AdminFrontEnd/config/proxy.ts
  24. 101 0
      AdminFrontEnd/eslint.config.mjs
  25. 127 0
      AdminFrontEnd/package.json
  26. 6977 0
      AdminFrontEnd/pnpm-lock.yaml
  27. 21 0
      AdminFrontEnd/prettier.config.mjs
  28. BIN
      AdminFrontEnd/public/favicon.ico
  29. 223 0
      AdminFrontEnd/public/index.html
  30. 63 0
      AdminFrontEnd/rsbuild.config.ts
  31. 88 0
      AdminFrontEnd/src/App.vue
  32. 310 0
      AdminFrontEnd/src/api/app-manage/index.ts
  33. 609 0
      AdminFrontEnd/src/api/app-manage/model.d.ts
  34. 23 0
      AdminFrontEnd/src/api/auths/dept/index.ts
  35. 23 0
      AdminFrontEnd/src/api/auths/dept/model.d.ts
  36. 221 0
      AdminFrontEnd/src/api/auths/menu/icon-migration.ts
  37. 19 0
      AdminFrontEnd/src/api/auths/menu/index.ts
  38. 8682 0
      AdminFrontEnd/src/api/auths/menu/menu-tree.json
  39. 46 0
      AdminFrontEnd/src/api/auths/menu/model.d.ts
  40. 26 0
      AdminFrontEnd/src/api/auths/post/index.ts
  41. 22 0
      AdminFrontEnd/src/api/auths/post/model.d.ts
  42. 25 0
      AdminFrontEnd/src/api/auths/role/index.ts
  43. 22 0
      AdminFrontEnd/src/api/auths/role/model.d.ts
  44. 54 0
      AdminFrontEnd/src/api/auths/user/index.ts
  45. 82 0
      AdminFrontEnd/src/api/auths/user/model.d.ts
  46. 157 0
      AdminFrontEnd/src/api/database-manage/index.ts
  47. 538 0
      AdminFrontEnd/src/api/database-manage/model.d.ts
  48. 101 0
      AdminFrontEnd/src/api/interface-manage/index.ts
  49. 445 0
      AdminFrontEnd/src/api/interface-manage/model.d.ts
  50. 93 0
      AdminFrontEnd/src/api/market/index.ts
  51. 552 0
      AdminFrontEnd/src/api/market/model.d.ts
  52. 266 0
      AdminFrontEnd/src/api/project/index.ts
  53. 662 0
      AdminFrontEnd/src/api/project/model.d.ts
  54. 402 0
      AdminFrontEnd/src/api/resource/index.ts
  55. 1624 0
      AdminFrontEnd/src/api/resource/model.d.ts
  56. 76 0
      AdminFrontEnd/src/api/system/index.ts
  57. 281 0
      AdminFrontEnd/src/api/system/model.d.ts
  58. 21 0
      AdminFrontEnd/src/api/typings.d.ts
  59. 193 0
      AdminFrontEnd/src/api/workflow/index.ts
  60. 217 0
      AdminFrontEnd/src/api/workflow/model.d.ts
  61. BIN
      AdminFrontEnd/src/assets/404.gif
  62. 0 0
      AdminFrontEnd/src/assets/analysis.svg
  63. BIN
      AdminFrontEnd/src/assets/images/bg/login-bg.png
  64. BIN
      AdminFrontEnd/src/assets/images/logo/login-pic.png
  65. BIN
      AdminFrontEnd/src/assets/images/logo/logo.png
  66. 1 0
      AdminFrontEnd/src/assets/svg/android.svg
  67. 4 0
      AdminFrontEnd/src/assets/svg/close.svg
  68. 4 0
      AdminFrontEnd/src/assets/svg/connect.svg
  69. 39 0
      AdminFrontEnd/src/assets/svg/dark.svg
  70. 8 0
      AdminFrontEnd/src/assets/svg/disbursement.svg
  71. 1 0
      AdminFrontEnd/src/assets/svg/disconnect.svg
  72. 1 0
      AdminFrontEnd/src/assets/svg/empty.svg
  73. 4 0
      AdminFrontEnd/src/assets/svg/error.svg
  74. 1 0
      AdminFrontEnd/src/assets/svg/exit.svg
  75. 4 0
      AdminFrontEnd/src/assets/svg/filePencil.svg
  76. 1 0
      AdminFrontEnd/src/assets/svg/ios.svg
  77. 39 0
      AdminFrontEnd/src/assets/svg/light.svg
  78. 1 0
      AdminFrontEnd/src/assets/svg/linux.svg
  79. 1 0
      AdminFrontEnd/src/assets/svg/lock-mic.svg
  80. 17 0
      AdminFrontEnd/src/assets/svg/login-bgSvg.svg
  81. 0 0
      AdminFrontEnd/src/assets/svg/login-box-bg.svg
  82. 48 0
      AdminFrontEnd/src/assets/svg/logo.svg
  83. 1 0
      AdminFrontEnd/src/assets/svg/macos.svg
  84. 2 0
      AdminFrontEnd/src/assets/svg/mic.svg
  85. 1 0
      AdminFrontEnd/src/assets/svg/moon.svg
  86. 39 0
      AdminFrontEnd/src/assets/svg/realDark.svg
  87. 39 0
      AdminFrontEnd/src/assets/svg/sidemenu.svg
  88. 1 0
      AdminFrontEnd/src/assets/svg/sun.svg
  89. 39 0
      AdminFrontEnd/src/assets/svg/topmenu.svg
  90. 1 0
      AdminFrontEnd/src/assets/svg/wait.svg
  91. 1 0
      AdminFrontEnd/src/assets/svg/windows.svg
  92. 948 0
      AdminFrontEnd/src/components/business/ai-render/Chat.vue
  93. 135 0
      AdminFrontEnd/src/components/business/ai-render/Renderer.vue
  94. 351 0
      AdminFrontEnd/src/components/business/ai-render/index.vue
  95. 158 0
      AdminFrontEnd/src/components/business/ai-render/use-ai-response-viewport.ts
  96. 795 0
      AdminFrontEnd/src/components/business/api-source-modal/ApiSourceModal.vue
  97. 3 0
      AdminFrontEnd/src/components/business/api-source-modal/index.ts
  98. 249 0
      AdminFrontEnd/src/components/business/database-select/DataBaseSelect.vue
  99. 70 0
      AdminFrontEnd/src/components/business/database-select/FieldModal.vue
  100. 5 0
      AdminFrontEnd/src/components/business/database-select/type.ts

BIN
.DS_Store


+ 1 - 0
.vscode/settings.json

@@ -0,0 +1 @@
+{}

+ 10 - 0
AdminFrontEnd/.browserslistrc

@@ -0,0 +1,10 @@
+[production]
+chrome >= 87
+edge >= 88
+firefox >= 78
+safari >= 14
+
+[development]
+last 1 chrome version
+last 1 firefox version
+last 1 safari version

+ 153 - 0
AdminFrontEnd/.drone.yml

@@ -0,0 +1,153 @@
+##############################
+# 测试环境部署
+##############################
+kind: pipeline
+type: docker
+name: test-omega-admin
+
+volumes: # 声明数据卷
+  - name: node_modules # 数据卷名称
+    # Host Volume, 挂载到宿主机上的卷轴
+    host:
+      # 宿主机的绝对路径
+      path: /home/ABServer/drone/cache/node_modules/test-omega-admin
+  - name: targetDir
+    host:
+      path: /home/ABServer/drone/webroot/test-omega-admin
+  - name: shellDir
+    host:
+      path: /home/ABServer/drone/config/shell
+  - name: configDir
+    host:
+      path: /home/ABServer/drone/config/ossConfig
+  - name: timezone
+    host:
+      path: /etc/localtime
+
+clone:
+  disable: false
+
+steps:
+  - name: build-project
+    image: node:22-alpine
+    pull: if-not-exists
+    depends_on: [clone] # 依赖的步骤
+    volumes: # 挂载数据卷
+      - name: node_modules # 数据卷名称
+        path: /drone/src/node_modules/ # 容器内目录 绝对路径
+      - name: timezone
+        path: /etc/localtime
+    commands: # 执行命令
+      - npm config set registry https://registry.npmmirror.com # 切换淘宝镜像
+      - npm install -g pnpm@10.33.0
+      - pnpm install --frozen-lockfile # 安装node_modules包
+      - rm -rf dist
+      - pnpm build:test # 执行编译
+      - ls -al
+    when:
+      status:
+        - success # 当前步骤成功时执行
+
+  - name: deploy-project
+    image: eclipse/alpine_jdk8
+    user: root
+    pull: if-not-exists
+    depends_on: [build-project] # 依赖的步骤
+    volumes: # 挂载数据卷
+      - name: targetDir
+        path: /deploy-target
+      - name: shellDir
+        path: /config/shell
+      - name: configDir
+        path: /root
+    commands: # 执行命令
+      - ls -al /drone/src/
+      - cp -r /drone/src/dist/* /deploy-target/
+      - chmod +x /config/shell/install.sh && /config/shell/install.sh
+      - ossutil64 cp -rf /deploy-target/ oss://test-omega-admin
+
+trigger:
+  branch:
+    include:
+      - test-omega-admin
+  event:
+    include:
+      - push
+
+##############################
+# 生产环境部署
+##############################
+---
+
+kind: pipeline
+type: docker
+name: release-omega-admin
+
+volumes: # 声明数据卷
+  - name: node_modules # 数据卷名称
+    # Host Volume, 挂载到宿主机上的卷轴
+    host:
+      # 宿主机的绝对路径
+      path: /home/ABServer/drone/cache/node_modules/release-omega-admin
+  - name: targetDir
+    host:
+      path: /home/ABServer/drone/webroot/release-omega-admin  
+  - name: shellDir
+    host:
+      path: /home/ABServer/drone/config/shell
+  - name: configDir
+    host:
+      path: /home/ABServer/drone/config/ossConfig
+  - name: timezone
+    host:
+      path: /etc/localtime
+
+clone:
+  disable: false
+
+steps:
+  - name: build-project
+    image: node:22-alpine
+    pull: if-not-exists
+    depends_on: [clone] # 依赖的步骤
+    volumes: # 挂载数据卷
+      - name: node_modules # 数据卷名称
+        path: /drone/src/node_modules/ # 容器内目录 绝对路径
+      - name: timezone
+        path: /etc/localtime
+    commands: # 执行命令
+      - npm config set registry https://registry.npmmirror.com # 切换淘宝镜像
+      - npm install -g pnpm@10.33.0
+      - pnpm install --frozen-lockfile # 安装node_modules包
+      - rm -rf dist
+      - pnpm build # 执行编译
+      - ls -al
+    when:
+      status:
+        - success # 当前步骤成功时执行
+
+  - name: deploy-project
+    image: eclipse/alpine_jdk8
+    user: root
+    pull: if-not-exists
+    depends_on: [build-project] # 依赖的步骤
+    volumes: # 挂载数据卷
+      - name: targetDir
+        path: /deploy-target
+      - name: shellDir
+        path: /config/shell
+      - name: configDir
+        path: /root
+    commands: # 执行命令
+      - ls -al /drone/src/
+      - cp -r /drone/src/dist/* /deploy-target/
+      - chmod +x /config/shell/install.sh && /config/shell/install.sh
+      - ossutil64 cp -rf /deploy-target/ oss://omega-admin
+
+trigger:
+  branch:
+    include:
+      - release-omega-admin
+  event:
+    include:
+      - push

+ 17 - 0
AdminFrontEnd/.editorconfig

@@ -0,0 +1,17 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_style = space
+indent_size = 2
+tab_width = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+max_line_length = 80
+
+[*.md]
+trim_trailing_whitespace = false
+
+[Makefile]
+indent_style = tab

+ 19 - 0
AdminFrontEnd/.env

@@ -0,0 +1,19 @@
+# 网站标题
+VUE_APP_TITLE = 'Omega Admin'
+
+# 本地存储加解密需要用到的key
+VUE_APP_STORAGE_ENCRYPT_KEY = 'omega_admin_keyyy_@2025'
+
+# 是否开启mock数据,生产环境中为false
+VUE_APP_IS_MOCK = false
+
+# mock数据的接口地址(使用的是apifox)
+VUE_APP_MOCK_API = 'https://m1.apifoxmock.com/m1/7213306-6939523-default'
+
+# api 加密密钥
+VUE_APP_API_ENCRYPT_KEY = '9PlXJbfJZCjGEQU28MILdJGK7woTdwKP'
+VUE_APP_API_ENCRYPT_IV = 'oVJJRjlZPU6mRgab'
+
+# 登录 `auth` HTTP Basic Auth
+VUE_APP_AUTH_USERNAME = 'admin'
+VUE_APP_AUTH_PSW = 'kmdlqkyuvl'

+ 9 - 0
AdminFrontEnd/.env.development

@@ -0,0 +1,9 @@
+# 只在开发模式中被载入
+
+VUE_APP_TITLE = 'dev Omega Admin'
+
+# 打包是否移除console
+VUE_APP_DROP_CONSOLE = false
+
+# 配置中心接口地址
+VUE_APP_CONFIG_API = "https://test-omega-gateway.kexiaoshuang.com"

+ 9 - 0
AdminFrontEnd/.env.production

@@ -0,0 +1,9 @@
+# 只在生产模式中被载入
+
+VUE_APP_TITLE = 'Omega Admin'
+
+# 打包是否移除console
+VUE_APP_DROP_CONSOLE = false
+
+# 配置中心接口地址
+VUE_APP_CONFIG_API = "https://omega-gateway.kexiaoshuang.com"

+ 9 - 0
AdminFrontEnd/.env.test

@@ -0,0 +1,9 @@
+# 只在开发模式中被载入
+
+VUE_APP_TITLE = 'test Omega Admin'
+
+# 打包是否移除console
+VUE_APP_DROP_CONSOLE = false
+
+# 配置中心接口地址
+VUE_APP_CONFIG_API = "https://test-omega-gateway.kexiaoshuang.com"

+ 6 - 0
AdminFrontEnd/.gitattributes

@@ -0,0 +1,6 @@
+* text=auto eol=lf
+*.ts linguist-detectable=false
+*.css linguist-detectable=false
+*.scss linguist-detectable=false
+*.js linguist-detectable=true
+*.vue linguist-detectable=true

+ 42 - 0
AdminFrontEnd/.gitignore

@@ -0,0 +1,42 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+.npmrc
+.cache
+.github
+.rsbuild
+.rspack_cache
+
+tests/server/static
+tests/server/static/upload
+
+.local
+# local env files
+.env.local
+.env.*.local
+.eslintcache
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+*pnpm-debug.log*
+
+# Editor directories and files
+.idea
+# .vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+# auto generate file
+types/auto-imports.d.ts
+types/components.d.ts
+/src/oldApi/
+
+openspec
+AGENTS.*
+.codesight/*

+ 10 - 0
AdminFrontEnd/.prettierignore

@@ -0,0 +1,10 @@
+dist
+dist-ssr
+coverage
+node_modules
+.rsbuild
+.rspack_cache
+.cache
+public
+code-style
+pnpm-lock.yaml

+ 9 - 0
AdminFrontEnd/.vscode/extensions.json

@@ -0,0 +1,9 @@
+{
+  "recommendations": [
+    "antfu.iconify",
+    "bradlc.vscode-tailwindcss",
+    "dbaeumer.vscode-eslint",
+    "esbenp.prettier-vscode",
+    "stylelint.vscode-stylelint"
+  ]
+}

+ 9 - 0
AdminFrontEnd/.vscode/mcp.json

@@ -0,0 +1,9 @@
+{
+  "servers": {
+    "shadcn": {
+      "command": "npx",
+      "args": ["shadcn-vue@latest", "mcp"]
+    }
+  },
+  "inputs": []
+}

+ 65 - 0
AdminFrontEnd/.vscode/settings.json

@@ -0,0 +1,65 @@
+{
+  "explorer.fileNesting.enabled": true,
+  "explorer.fileNesting.expand": false,
+  "explorer.fileNesting.patterns": {
+    "*.ts": "$(capture).test.ts, $(capture).test.tsx",
+    "*.tsx": "$(capture).test.ts, $(capture).test.tsx",
+    "*.env": "$(capture).env.*",
+    "package.json": "pnpm-lock.yaml,pnpm-workspace.yaml,LICENSE,.gitattributes,.gitignore,.gitpod.yml,CNAME,README*,.npmrc,.browserslistrc",
+    "tsconfig.json": "tsconfig.*",
+    "eslint.config.*": "prettier.config.*,stylelint.config.*"
+  },
+  "editor.defaultFormatter": "esbenp.prettier-vscode",
+  "editor.formatOnSave": true,
+  "editor.codeActionsOnSave": {
+    "source.fixAll.eslint": "explicit",
+    "source.fixAll.stylelint": "explicit"
+  },
+  "[css]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[html]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[javascript]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[javascriptreact]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[json]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[jsonc]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[less]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[scss]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[typescript]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[typescriptreact]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "[vue]": {
+    "editor.defaultFormatter": "esbenp.prettier-vscode"
+  },
+  "css.lint.unknownAtRules": "ignore",
+  "scss.lint.unknownAtRules": "ignore",
+  "less.lint.unknownAtRules": "ignore",
+  "eslint.validate": [
+    "javascript",
+    "javascriptreact",
+    "typescript",
+    "typescriptreact",
+    "vue"
+  ],
+  "stylelint.validate": ["css", "scss", "vue"],
+  "js/ts.tsdk.path": "node_modules/typescript/lib",
+  "commentTranslate.multiLineMerge": false,
+  "tailwindCSS.lint.suggestCanonicalClasses": "ignore"
+}

+ 37 - 0
AdminFrontEnd/config/plugins/index.ts

@@ -0,0 +1,37 @@
+import type { RsbuildPlugins } from '@rsbuild/core'
+import { pluginBabel } from '@rsbuild/plugin-babel'
+import { pluginImageCompress } from '@rsbuild/plugin-image-compress'
+import { pluginSass } from '@rsbuild/plugin-sass'
+import { pluginTailwindcss } from '@rsbuild/plugin-tailwindcss'
+import { pluginVue } from '@rsbuild/plugin-vue'
+import { pluginVueJsx } from '@rsbuild/plugin-vue-jsx'
+
+import autoImport from './plugin_autoImport'
+import envType from './plugin_envType'
+import pluginIcons from './plugin_icons'
+import { pluginSvgSpriteLoader } from './plugin_svg'
+import autoComponent from './plugins_autoComponent'
+
+export function createRsbuildPlugins(isBuild: boolean): RsbuildPlugins {
+  const plugins = [
+    pluginBabel({
+      include: /\.(?:jsx|tsx)$/,
+    }),
+    pluginVue(),
+    pluginVueJsx(),
+    pluginTailwindcss(),
+    pluginSass(),
+    // 按需加载组件,自动引入组件
+    autoComponent(),
+    // 按需加载,自动引入api
+    autoImport(),
+    pluginIcons(),
+    envType({ dts: 'types/env.d.ts' }),
+    pluginImageCompress(),
+    pluginSvgSpriteLoader({
+      path: 'src/assets/svg',
+    }),
+  ]
+
+  return plugins
+}

+ 26 - 0
AdminFrontEnd/config/plugins/plugin_autoImport.ts

@@ -0,0 +1,26 @@
+/**
+ * @name AutoImportDeps
+ * @description 按需加载,自动引入
+ */
+
+import type { RsbuildPlugin } from '@rsbuild/core'
+import AutoImport from 'unplugin-auto-import/rspack'
+import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+
+const plugin = () =>
+  AutoImport({
+    dts: 'types/auto-imports.d.ts',
+    dirs: ['src/hooks/*'],
+    imports: ['vue', 'vue-router'],
+    vueTemplate: true,
+    resolvers: [ElementPlusResolver()],
+  })
+
+export default (): RsbuildPlugin => ({
+  name: 'rsbuild:unplugin-auto-import',
+  setup(api) {
+    api.modifyRspackConfig((config) => {
+      config.plugins.push(plugin())
+    })
+  },
+})

+ 178 - 0
AdminFrontEnd/config/plugins/plugin_backup.ts

@@ -0,0 +1,178 @@
+// import { logger, type RsbuildPlugin } from '@rsbuild/core'
+// import path from 'path'
+// import fs from 'fs'
+// import readline from 'readline'
+// import * as tar from 'tar'
+
+// const __dirname = process.cwd()
+// // 是否打的是正式环境的包
+// const isProd = process.env.npm_lifecycle_event === 'build'
+// /**
+//  * @name backupDist
+//  * @description 打包完成后备份dist目录,只会备份production环境的打包文件
+//  */
+// export const pluginBackup = (): RsbuildPlugin => ({
+//   name: 'plugin-backup-dist',
+//   setup(api) {
+//     const { version } = require(path.resolve(process.cwd(), 'package.json'))
+
+//     api.onCloseBuild(() => {
+//       if (!isProd) {
+//         logger.warn('非正式环境打包,不执行备份操作')
+//         return
+//       }
+
+//       // 判断是否存在dist-backup目录,不存在则创建
+//       const distDir = path.resolve(__dirname, 'dist')
+//       const distBackupDir = path.resolve(__dirname, 'dist-backup')
+
+//       if (!fs.existsSync(distDir)) {
+//         logger.error('dist目录不存在,备份失败!')
+//         return
+//       }
+
+//       fs.mkdirSync(path.resolve(distBackupDir, version), { recursive: true })
+
+//       logger.warn('打包完成,开始备份dist目录')
+
+//       // 备份dist目录
+//       fileToGz(
+//         distDir,
+//         path.resolve(
+//           distBackupDir,
+//           version,
+//           `dist-${dateFormat(new Date())}.gz`,
+//         ),
+//       ).then(() => {
+//         logger.success('dist备份完成')
+//         copyFile(version)
+//       })
+//     })
+
+//     api.onAfterBuild(() => {
+//       outputLog()
+//     })
+//   },
+// })
+
+// function fileToGz(fromPath: string, toPath: string) {
+//   return new Promise((resolve, reject) => {
+//     const output = fs.createWriteStream(toPath)
+//     let totalSize = 0
+//     let processedSize = 0
+
+//     const calculateSize = (dir: string): number => {
+//       let size = 0
+//       const files = fs.readdirSync(dir)
+//       for (const file of files) {
+//         const filePath = path.join(dir, file)
+//         const stat = fs.statSync(filePath)
+//         if (stat.isDirectory()) {
+//           size += calculateSize(filePath)
+//         } else {
+//           size += stat.size
+//         }
+//       }
+//       return size
+//     }
+
+//     totalSize = calculateSize(fromPath)
+
+//     tar
+//       .create(
+//         {
+//           gzip: true,
+//           cwd: fromPath,
+//           onWriteEntry(entry) {
+//             processedSize += entry.stat?.size || 0
+//             const progress = Math.ceil((processedSize / totalSize) * 100)
+//             readline.cursorTo(process.stdout, 0)
+//             readline.clearLine(process.stdout, 0)
+//             process.stdout.write(`压缩进度:${progress}%\r`)
+//           },
+//         },
+//         ['.'],
+//       )
+//       .pipe(output)
+//       .on('close', () => {
+//         resolve(true)
+//       })
+//       .on('error', (err: Error) => {
+//         logger.error(`打包失败: ${err.message}`)
+//         reject(err)
+//       })
+//   })
+// }
+
+// function copyFile(version) {
+//   // 判断是否存在dist-file目录,不存在则创建
+//   const distBackupDir = path.resolve(__dirname, 'dist-file')
+//   // 新建版本文件夹及备份文件夹
+//   fs.mkdirSync(path.resolve(distBackupDir, 'dist-backup'), { recursive: true })
+//   fs.mkdirSync(path.resolve(distBackupDir, version), { recursive: true })
+//   //复制 dist 文件夹内容
+//   getFiles(
+//     path.resolve(__dirname, 'dist'),
+//     path.resolve(__dirname, `dist-file/${version}`),
+//   )
+//   //复制 dist-backup 文件夹内容
+//   getFiles(
+//     path.resolve(__dirname, 'dist-backup'),
+//     path.resolve(__dirname, `dist-file/dist-backup`),
+//   )
+//   logger.success('服务器打包文件夹创建成功')
+// }
+
+// function getFiles(OriginFilePath, CopyFilePath) {
+//   fs.readdir(OriginFilePath, { withFileTypes: true }, (err, files) => {
+//     for (const file of files) {
+//       //判断是否是文件夹,不是则直接复制文件到newFile中
+//       if (!file.isDirectory()) {
+//         const OriginFile = path.resolve(OriginFilePath, file.name)
+//         const CopyFile = path.resolve(CopyFilePath, file.name)
+//         fs.copyFileSync(OriginFile, CopyFile)
+//       } else {
+//         //如果是文件夹就递归变量把最新的文件夹路径传过去
+//         const CopyDirPath = path.resolve(CopyFilePath, file.name)
+//         const OriginDirPath = path.resolve(OriginFilePath, file.name)
+//         fs.mkdir(CopyDirPath, (err) => {})
+//         getFiles(OriginDirPath, CopyDirPath)
+//       }
+//     }
+//   })
+// }
+
+// /* 日期格式化 */
+// function dateFormat(dateInput: Date, format: string = 'yyyy-MM-dd-HH:mm:ss') {
+//   if (!dateInput) return ''
+
+//   const components: Record<string, any> = {
+//     yyyy: dateInput.getFullYear(),
+//     MM: dateInput.getMonth() + 1,
+//     dd: dateInput.getDate(),
+//     HH: dateInput.getHours(),
+//     mm: dateInput.getMinutes(),
+//     ss: dateInput.getSeconds(),
+//   }
+
+//   format = format.replace(/(yyyy|MM|dd|HH|mm|ss)/g, (match, p1) => {
+//     return components[p1].toString().padStart(2, '0')
+//   })
+
+//   return format
+// }
+
+// function outputLog() {
+//   const buildType = {
+//     build: 'APP正式包',
+//     'build:web': 'WEB正式环境包',
+//     'build:test': 'APP测试环境包',
+//     'build:webTest': 'WEB测试环境包',
+//   }
+
+//   const npmEvent = process.env.npm_lifecycle_event
+
+//   logger.info(`打包类型: ${npmEvent ? buildType[npmEvent] : npmEvent}`)
+//   logger.info(`打包时间:${new Date().toLocaleString()}`)
+//   console.log(`\r`)
+// }

+ 60 - 0
AdminFrontEnd/config/plugins/plugin_envType.ts

@@ -0,0 +1,60 @@
+import {
+  loadEnv,
+  type RsbuildPlugin,
+  type RsbuildPluginAPI,
+} from '@rsbuild/core'
+
+const { parsed } = loadEnv({
+  prefixes: ['VUE_APP_'],
+})
+
+import { writeFile } from 'fs/promises'
+import path from 'path'
+
+interface Options {
+  /**
+   * 生成的 d.ts 文件路径(相对项目根目录或绝对路径)
+   * @default "env.d.ts"
+   */
+  dts?: string
+}
+
+export default function EnvTypes(options: Options = {}): RsbuildPlugin {
+  const { dts = 'env.d.ts' } = options
+  const gen = async (api: RsbuildPluginAPI) => {
+    try {
+      const { rootPath } = api.context
+
+      const keys = new Set<string>()
+
+      Object.entries(parsed || {}).forEach(([key]) => {
+        if (key) keys.add(key)
+      })
+
+      // 若未扫描到任何变量则仍写出文件以保持一致
+      const sorted = Array.from(keys).sort()
+      const lines =
+        sorted.length > 0
+          ? sorted.map((k) => `  readonly ${k}: string`).join('\n')
+          : '  // 找不到带前缀的env变量'
+
+      const target = path.isAbsolute(dts) ? dts : path.join(rootPath, dts)
+
+      const content = `/// <reference types="@rsbuild/core/types" /> \n\n /** 由rsbuild:env-type自动生成。请勿手动编辑 */\n\ninterface ImportMetaEnv {\n${lines}\n}\n\ninterface ImportMeta {\n  readonly env: ImportMetaEnv\n}\n`
+      await writeFile(target, content, 'utf-8')
+    } catch (e) {
+      // 静默失败,避免阻断构建
+      console.warn('[rsbuild:env-type] generate failed:', e)
+    }
+  }
+
+  return {
+    name: 'rsbuild:env-type',
+    setup(api) {
+      // 开发启动前生成
+      api.onBeforeStartDevServer(async () => {
+        await gen(api)
+      })
+    },
+  }
+}

+ 17 - 0
AdminFrontEnd/config/plugins/plugin_icons.ts

@@ -0,0 +1,17 @@
+import type { RsbuildPlugin } from '@rsbuild/core'
+import Icons from 'unplugin-icons/rspack'
+
+const plugin = () =>
+  Icons({
+    autoInstall: true,
+    compiler: 'vue3',
+  })
+
+export default (): RsbuildPlugin => ({
+  name: 'rsbuild:unplugin-icons',
+  setup(api) {
+    api.modifyRspackConfig((config) => {
+      config.plugins.push(plugin())
+    })
+  },
+})

+ 112 - 0
AdminFrontEnd/config/plugins/plugin_svg.ts

@@ -0,0 +1,112 @@
+/**
+ * @description: 注册svg图标
+ */
+import { readdirSync, readFileSync } from 'node:fs'
+import { join } from 'node:path'
+
+import type { RsbuildPlugin } from '@rsbuild/core'
+
+export type SvgSpriteLoaderOptions = {
+  path: string
+  // default: icon-[name]
+  symbolId?: string
+}
+
+// 正则表达式定义
+const svgTitle = /<svg([^>]*)>/
+const clearHeightWidth = /(width|height)="([^"]*)"/g
+const hasViewBox = /viewBox="[^"]*"/
+const clearReturn = /[\r\n]/g
+
+// 查找并处理 SVG 文件
+function svgFind(directoryPath: string, idPrefix: string): string[] {
+  const svgs: string[] = []
+  const directs = readdirSync(directoryPath, { withFileTypes: true })
+
+  for (const dirent of directs) {
+    if (dirent.isDirectory()) {
+      svgs.push(...svgFind(join(directoryPath, dirent.name, '/'), idPrefix))
+    } else if (dirent.name.endsWith('.svg')) {
+      const svgContent = readFileSync(join(directoryPath, dirent.name), 'utf-8')
+        .replace(clearReturn, '')
+        .replace(svgTitle, ($1, $2: string) => {
+          let width = 0
+          let height = 0
+          let content = $2.replace(
+            clearHeightWidth,
+            (match: string, prop: string, value: number) => {
+              if (prop === 'width') width = value
+              else if (prop === 'height') height = value
+              return '' // 移除匹配的宽度和高度属性
+            },
+          )
+
+          // 添加 viewBox 属性,如果不存在
+          if (!hasViewBox.test(content)) {
+            content += `viewBox="0 0 ${width} ${height}"`
+          }
+
+          const name = idPrefix.replace(
+            '[name]',
+            dirent.name.replace('.svg', ''),
+          )
+          return `<symbol id="${name}" ${content}>`
+        })
+        .replace('</svg>', '</symbol>')
+        .replaceAll('prefix_', () => {
+          return idPrefix.replace('[name]', dirent.name.replace('.svg', ''))
+        })
+
+      svgs.push(svgContent)
+    }
+  }
+
+  return svgs
+}
+
+// 创建 SVG 字符串
+function createSvg(path: string, prefix: string): string {
+  if (path === '') return ''
+
+  const res = svgFind(path, prefix)
+
+  return res.join('')
+}
+
+export const pluginSvgSpriteLoader = (
+  options: SvgSpriteLoaderOptions,
+): RsbuildPlugin => ({
+  name: 'plugin-svg-sprite-loader',
+
+  setup(api) {
+    const str = createSvg(options.path, options.symbolId || 'icon-[name]')
+    api.modifyRsbuildConfig((config) => {
+      // 监听svg文件夹的变化
+      const watchFilesConfig = {
+        type: 'reload-server' as any,
+        paths: [options.path],
+      }
+
+      if (config.dev)
+        if (Array.isArray(config.dev?.watchFiles)) {
+          config.dev.watchFiles.push(watchFilesConfig)
+        } else {
+          config.dev.watchFiles = [watchFilesConfig]
+        }
+    })
+
+    api.modifyHTMLTags(({ headTags, bodyTags }) => {
+      bodyTags.unshift({
+        tag: 'svg',
+        attrs: {
+          xmlns: 'http://www.w3.org/2000/svg',
+          'xmlns:xlink': 'http://www.w3.org/1999/xlink',
+          style: 'position: absolute; width: 0; height: 0',
+        },
+        children: str,
+      })
+
+      return { headTags, bodyTags }
+    })
+  },
+})

+ 41 - 0
AdminFrontEnd/config/plugins/plugins_autoComponent.ts

@@ -0,0 +1,41 @@
+/**
+ * @name  AutoRegistryComponents
+ * @description 按需加载,自动引入组件
+ */
+
+import type { RsbuildPlugin } from '@rsbuild/core'
+import IconsResolver from 'unplugin-icons/resolver'
+import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
+import Components from 'unplugin-vue-components/rspack'
+
+const plugin = () =>
+  Components({
+    dts: 'types/components.d.ts',
+    types: [
+      {
+        from: 'vue-router',
+        names: ['RouterLink', 'RouterView'],
+      },
+    ],
+    resolvers: [ElementPlusResolver(), IconsResolver({ prefix: 'Icon' })],
+    globs: [
+      'src/components/common/*/*.{vue,tsx}',
+      'src/components/business/*/*.{vue,tsx}',
+    ],
+
+    // 确保扫描 .vue 和 .tsx 文件
+    extensions: ['vue', 'tsx'],
+    deep: false,
+    directoryAsNamespace: false,
+    globalNamespaces: [],
+    directives: true,
+  })
+
+export default (): RsbuildPlugin => ({
+  name: 'rsbuild:unplugin-vue-components',
+  setup(api) {
+    api.modifyRspackConfig((config) => {
+      config.plugins.push(plugin())
+    })
+  },
+})

+ 16 - 0
AdminFrontEnd/config/proxy.ts

@@ -0,0 +1,16 @@
+// import type { ProxyOptions } from '@rsbuild/core'
+
+// type ProxyTargetList = Record<string, ProxyOptions>
+
+// const proxy = (env: Record<string, any>): ProxyTargetList => {
+//   const { VUE_APP_MOCK_API, VUE_APP_BASE_API, VUE_APP_IS_MOCK } = env
+//   return {
+//     '/dev-api': {
+//       target: VUE_APP_IS_MOCK === 'true' ? VUE_APP_MOCK_API : VUE_APP_BASE_API,
+//       changeOrigin: true,
+//       pathRewrite: (path) => path.replace(/^\/dev-api/, ''),
+//     },
+//   }
+// }
+
+// export default proxy

+ 101 - 0
AdminFrontEnd/eslint.config.mjs

@@ -0,0 +1,101 @@
+import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'
+import {
+  configureVueProject,
+  defineConfigWithVueTs,
+  vueTsConfigs,
+} from '@vue/eslint-config-typescript'
+import { globalIgnores } from 'eslint/config'
+import simpleImportSort from 'eslint-plugin-simple-import-sort'
+import pluginVue from 'eslint-plugin-vue'
+
+configureVueProject({ scriptLangs: ['ts', 'tsx'] })
+
+export default defineConfigWithVueTs(
+  {
+    name: 'app/files-to-lint',
+    files: ['**/*.{js,mjs,cjs,ts,mts,tsx,vue}'],
+  },
+  {
+    name: 'app/linter-options',
+    linterOptions: {
+      reportUnusedDisableDirectives: false,
+    },
+  },
+
+  globalIgnores([
+    '**/dist/**',
+    '**/dist-ssr/**',
+    '**/coverage/**',
+    '**/node_modules/**',
+    '**/.rsbuild/**',
+    '**/.rspack_cache/**',
+    '**/.cache/**',
+    '**/public/**',
+    '**/.github/**',
+    '**/.husky/**',
+    '**/.vscode/**',
+    '**/.idea/**',
+    '**/code-style/**',
+    '**/docs/**',
+    '**/bin/**',
+    '**/src/mock/**',
+    '**/*.md',
+    '**/*.woff',
+    '**/*.ttf',
+    '**/Dockerfile',
+    '**/commitlint.config.js',
+  ]),
+
+  pluginVue.configs['flat/essential'],
+  vueTsConfigs.recommended,
+  skipFormatting,
+  {
+    name: 'app/rules',
+    plugins: {
+      'simple-import-sort': simpleImportSort,
+    },
+    rules: {
+      '@typescript-eslint/ban-ts-comment': 'off',
+      '@typescript-eslint/no-empty-object-type': 'off',
+      '@typescript-eslint/no-explicit-any': 'off',
+      '@typescript-eslint/no-require-imports': 'off',
+      '@typescript-eslint/no-this-alias': 'off',
+      '@typescript-eslint/no-unused-expressions': 'off',
+      '@typescript-eslint/no-unused-vars': 'off',
+      '@typescript-eslint/no-unsafe-function-type': 'off',
+      'no-async-promise-executor': 'off',
+      'no-unused-vars': 'off',
+      'prefer-const': 'off',
+      'simple-import-sort/exports': 'warn',
+      'simple-import-sort/imports': [
+        'warn',
+        {
+          groups: [['^\\u0000'], ['^node:'], ['^@?\\w'], ['^@/'], ['^\\.']],
+        },
+      ],
+      'vue/attributes-order': [
+        'warn',
+        {
+          alphabetical: false,
+          order: [
+            'DEFINITION',
+            'LIST_RENDERING',
+            'CONDITIONALS',
+            'RENDER_MODIFIERS',
+            'GLOBAL',
+            ['UNIQUE', 'SLOT'],
+            'TWO_WAY_BINDING',
+            'OTHER_DIRECTIVES',
+            'OTHER_ATTR',
+            'EVENTS',
+            'CONTENT',
+          ],
+        },
+      ],
+      'vue/multi-word-component-names': 'off',
+      'vue/no-dupe-keys': 'warn',
+      'vue/no-undef-properties': 'error',
+      'vue/no-unused-properties': 'warn',
+    },
+  },
+)

+ 127 - 0
AdminFrontEnd/package.json

@@ -0,0 +1,127 @@
+{
+  "name": "omega-admin",
+  "version": "1.0.0",
+  "type": "module",
+  "scripts": {
+    "build": "rsbuild build",
+    "build:test": "rsbuild build --env-mode test",
+    "check": "pnpm run lint && pnpm run format:check",
+    "dev": "rsbuild dev",
+    "format": "prettier --write .",
+    "format:check": "prettier --check .",
+    "lint": "eslint . && stylelint \"**/*.{css,scss,vue}\"",
+    "lint:fix": "eslint . --fix && stylelint \"**/*.{css,scss,vue}\" --fix && prettier --write .",
+    "preview": "rsbuild preview",
+    "type:check": "vue-tsc --noEmit --skipLibCheck --project tsconfig.app.json"
+  },
+  "dependencies": {
+    "@ai-sdk/openai-compatible": "3.0.0-beta.14",
+    "@codemirror/autocomplete": "^6.20.0",
+    "@codemirror/commands": "^6.10.1",
+    "@codemirror/lang-css": "^6.3.1",
+    "@codemirror/lang-html": "^6.4.11",
+    "@codemirror/lang-java": "^6.0.2",
+    "@codemirror/lang-javascript": "^6.2.4",
+    "@codemirror/lang-json": "^6.0.2",
+    "@codemirror/lang-python": "^6.2.1",
+    "@codemirror/lang-sql": "^6.10.0",
+    "@codemirror/lang-vue": "0.1.3",
+    "@codemirror/language": "^6.12.1",
+    "@codemirror/search": "6.6.0",
+    "@codemirror/state": "^6.5.4",
+    "@codemirror/theme-one-dark": "^6.1.3",
+    "@codemirror/view": "^6.39.12",
+    "@element-plus/icons-vue": "^2.3.2",
+    "@iconify/vue": "^5.0.1",
+    "@json-render/codegen": "0.19.0",
+    "@json-render/core": "^0.19.0",
+    "@json-render/devtools": "^0.19.0",
+    "@json-render/vue": "^0.19.0",
+    "@json-render/yaml": "^0.19.0",
+    "@vue-flow/background": "^1.3.2",
+    "@vue-flow/core": "^1.48.1",
+    "@vue-flow/minimap": "^1.5.4",
+    "@vue-flow/node-resizer": "^1.5.0",
+    "@vue/compiler-dom": "3.5.27",
+    "@vueuse/core": "~13.9.0",
+    "ai": "7.0.0-beta.62",
+    "codemirror": "^6.0.2",
+    "core-js": "^3.49.0",
+    "countup.js": "^2.9.0",
+    "crypto-js": "^4.2.0",
+    "dagre": "^0.8.5",
+    "dayjs": "~1.11.19",
+    "default-passive-events": "^4.0.0",
+    "disable-devtool": "^0.3.9",
+    "echarts": "^6.0.0",
+    "element-plus": "^2.13.1",
+    "html-to-image": "^1.11.13",
+    "motion": "^12.29.2",
+    "motion-v": "^2.2.0",
+    "nanoid": "^5.1.7",
+    "nprogress": "1.0.0-1",
+    "pinia": "~3.0.4",
+    "pinia-plugin-persistedstate": "^4.7.1",
+    "sanitize.css": "^13.0.0",
+    "secure-ls": "^2.0.0",
+    "sql-formatter": "^15.7.0",
+    "swapy": "^1.0.5",
+    "vue": "~3.5.38",
+    "vue-element-plus-x": "^2.0.3",
+    "vue-router": "~4.6.4",
+    "write-excel-file": "^4.0.6",
+    "yaml": "^2.8.3",
+    "zipson": "^0.2.12",
+    "zod": "^4.3.6"
+  },
+  "devDependencies": {
+    "@eslint/js": "^10.0.1",
+    "@iconify-json/ep": "^1.2.4",
+    "@iconify-json/line-md": "^1.2.14",
+    "@iconify-json/mingcute": "^1.2.7",
+    "@iconify-json/svg-spinners": "^1.2.4",
+    "@iconify-json/tabler": "^1.2.26",
+    "@rsbuild/core": "^2.0.15",
+    "@rsbuild/plugin-babel": "^2.0.0",
+    "@rsbuild/plugin-image-compress": "^1.3.4",
+    "@rsbuild/plugin-sass": "^2.0.0",
+    "@rsbuild/plugin-tailwindcss": "^2.0.3",
+    "@rsbuild/plugin-vue": "^2.0.0",
+    "@rsbuild/plugin-vue-jsx": "^2.0.1",
+    "@types/dagre": "^0.7.53",
+    "@types/node": "^22.19.7",
+    "@vue/compiler-sfc": "3.5.38",
+    "@vue/eslint-config-prettier": "^10.2.0",
+    "@vue/eslint-config-typescript": "^14.9.0",
+    "@vue/tsconfig": "^0.7.0",
+    "eslint": "^10.5.0",
+    "eslint-plugin-simple-import-sort": "^13.0.0",
+    "eslint-plugin-vue": "^10.9.2",
+    "postcss": "~8.5.14",
+    "postcss-html": "^1.8.1",
+    "postcss-scss": "^4.0.9",
+    "prettier": "3.8.4",
+    "prettier-plugin-css-order": "^2.2.0",
+    "prettier-plugin-packagejson": "^3.0.2",
+    "prettier-plugin-tailwindcss": "^0.8.0",
+    "stylelint": "^17.13.0",
+    "stylelint-config-standard": "^40.0.0",
+    "stylelint-config-standard-scss": "^17.0.0",
+    "stylelint-config-standard-vue": "^1.0.0",
+    "tailwindcss": "4.3.1",
+    "terser": "~5.44.1",
+    "typescript": "~5.8.3",
+    "typescript-eslint": "^8.62.0",
+    "unplugin-auto-import": "^21.0.0",
+    "unplugin-icons": "^23.0.1",
+    "unplugin-vue-components": "~31.0.0",
+    "vue-eslint-parser": "^10.4.1",
+    "vue-tsc": "^3.3.5"
+  },
+  "packageManager": "pnpm@10.33.0",
+  "engines": {
+    "node": "^20.19.0 || ^22.13.0 || >=24"
+  },
+  "target": "web",
+  "__npminstall_done": false
+}

+ 6977 - 0
AdminFrontEnd/pnpm-lock.yaml

@@ -0,0 +1,6977 @@
+lockfileVersion: '9.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+importers:
+
+  .:
+    dependencies:
+      '@ai-sdk/openai-compatible':
+        specifier: 3.0.0-beta.14
+        version: 3.0.0-beta.14(zod@4.4.3)
+      '@codemirror/autocomplete':
+        specifier: ^6.20.0
+        version: 6.20.0
+      '@codemirror/commands':
+        specifier: ^6.10.1
+        version: 6.10.1
+      '@codemirror/lang-css':
+        specifier: ^6.3.1
+        version: 6.3.1
+      '@codemirror/lang-html':
+        specifier: ^6.4.11
+        version: 6.4.11
+      '@codemirror/lang-java':
+        specifier: ^6.0.2
+        version: 6.0.2
+      '@codemirror/lang-javascript':
+        specifier: ^6.2.4
+        version: 6.2.4
+      '@codemirror/lang-json':
+        specifier: ^6.0.2
+        version: 6.0.2
+      '@codemirror/lang-python':
+        specifier: ^6.2.1
+        version: 6.2.1
+      '@codemirror/lang-sql':
+        specifier: ^6.10.0
+        version: 6.10.0
+      '@codemirror/lang-vue':
+        specifier: 0.1.3
+        version: 0.1.3
+      '@codemirror/language':
+        specifier: ^6.12.1
+        version: 6.12.1
+      '@codemirror/search':
+        specifier: 6.6.0
+        version: 6.6.0
+      '@codemirror/state':
+        specifier: ^6.5.4
+        version: 6.5.4
+      '@codemirror/theme-one-dark':
+        specifier: ^6.1.3
+        version: 6.1.3
+      '@codemirror/view':
+        specifier: ^6.39.12
+        version: 6.39.12
+      '@element-plus/icons-vue':
+        specifier: ^2.3.2
+        version: 2.3.2(vue@3.5.38(typescript@5.8.3))
+      '@iconify/vue':
+        specifier: ^5.0.1
+        version: 5.0.1(vue@3.5.38(typescript@5.8.3))
+      '@json-render/codegen':
+        specifier: 0.19.0
+        version: 0.19.0(zod@4.4.3)
+      '@json-render/core':
+        specifier: ^0.19.0
+        version: 0.19.0(zod@4.4.3)
+      '@json-render/devtools':
+        specifier: ^0.19.0
+        version: 0.19.0(zod@4.4.3)
+      '@json-render/vue':
+        specifier: ^0.19.0
+        version: 0.19.0(vue@3.5.38(typescript@5.8.3))(zod@4.4.3)
+      '@json-render/yaml':
+        specifier: ^0.19.0
+        version: 0.19.0(zod@4.4.3)
+      '@vue-flow/background':
+        specifier: ^1.3.2
+        version: 1.3.2(@vue-flow/core@1.48.1(vue@3.5.38(typescript@5.8.3)))(vue@3.5.38(typescript@5.8.3))
+      '@vue-flow/core':
+        specifier: ^1.48.1
+        version: 1.48.1(vue@3.5.38(typescript@5.8.3))
+      '@vue-flow/minimap':
+        specifier: ^1.5.4
+        version: 1.5.4(@vue-flow/core@1.48.1(vue@3.5.38(typescript@5.8.3)))(vue@3.5.38(typescript@5.8.3))
+      '@vue-flow/node-resizer':
+        specifier: ^1.5.0
+        version: 1.5.0(@vue-flow/core@1.48.1(vue@3.5.38(typescript@5.8.3)))(vue@3.5.38(typescript@5.8.3))
+      '@vue/compiler-dom':
+        specifier: 3.5.27
+        version: 3.5.27
+      '@vueuse/core':
+        specifier: ~13.9.0
+        version: 13.9.0(vue@3.5.38(typescript@5.8.3))
+      ai:
+        specifier: 7.0.0-beta.62
+        version: 7.0.0-beta.62(zod@4.4.3)
+      codemirror:
+        specifier: ^6.0.2
+        version: 6.0.2
+      core-js:
+        specifier: ^3.49.0
+        version: 3.49.0
+      countup.js:
+        specifier: ^2.9.0
+        version: 2.9.0
+      crypto-js:
+        specifier: ^4.2.0
+        version: 4.2.0
+      dagre:
+        specifier: ^0.8.5
+        version: 0.8.5
+      dayjs:
+        specifier: ~1.11.19
+        version: 1.11.19
+      default-passive-events:
+        specifier: ^4.0.0
+        version: 4.0.0
+      disable-devtool:
+        specifier: ^0.3.9
+        version: 0.3.9
+      echarts:
+        specifier: ^6.0.0
+        version: 6.0.0
+      element-plus:
+        specifier: ^2.13.1
+        version: 2.14.0(vue@3.5.38(typescript@5.8.3))
+      html-to-image:
+        specifier: ^1.11.13
+        version: 1.11.13
+      motion:
+        specifier: ^12.29.2
+        version: 12.29.2
+      motion-v:
+        specifier: ^2.2.0
+        version: 2.3.0(@vueuse/core@13.9.0(vue@3.5.38(typescript@5.8.3)))(vue@3.5.38(typescript@5.8.3))
+      nanoid:
+        specifier: ^5.1.7
+        version: 5.1.11
+      nprogress:
+        specifier: 1.0.0-1
+        version: 1.0.0-1
+      pinia:
+        specifier: ~3.0.4
+        version: 3.0.4(typescript@5.8.3)(vue@3.5.38(typescript@5.8.3))
+      pinia-plugin-persistedstate:
+        specifier: ^4.7.1
+        version: 4.7.1(pinia@3.0.4(typescript@5.8.3)(vue@3.5.38(typescript@5.8.3)))
+      sanitize.css:
+        specifier: ^13.0.0
+        version: 13.0.0
+      secure-ls:
+        specifier: ^2.0.0
+        version: 2.0.0
+      sql-formatter:
+        specifier: ^15.7.0
+        version: 15.7.0
+      swapy:
+        specifier: ^1.0.5
+        version: 1.0.5
+      vue:
+        specifier: ~3.5.38
+        version: 3.5.38(typescript@5.8.3)
+      vue-element-plus-x:
+        specifier: ^2.0.3
+        version: 2.0.3(element-plus@2.14.0(vue@3.5.38(typescript@5.8.3)))(rollup@4.53.1)(vue@3.5.38(typescript@5.8.3))
+      vue-router:
+        specifier: ~4.6.4
+        version: 4.6.4(vue@3.5.38(typescript@5.8.3))
+      write-excel-file:
+        specifier: ^4.0.6
+        version: 4.1.1
+      yaml:
+        specifier: ^2.8.3
+        version: 2.9.0
+      zipson:
+        specifier: ^0.2.12
+        version: 0.2.12
+      zod:
+        specifier: ^4.3.6
+        version: 4.4.3
+    devDependencies:
+      '@eslint/js':
+        specifier: ^10.0.1
+        version: 10.0.1(eslint@10.5.0(jiti@2.7.0))
+      '@iconify-json/ep':
+        specifier: ^1.2.4
+        version: 1.2.4
+      '@iconify-json/line-md':
+        specifier: ^1.2.14
+        version: 1.2.14
+      '@iconify-json/mingcute':
+        specifier: ^1.2.7
+        version: 1.2.7
+      '@iconify-json/svg-spinners':
+        specifier: ^1.2.4
+        version: 1.2.4
+      '@iconify-json/tabler':
+        specifier: ^1.2.26
+        version: 1.2.26
+      '@rsbuild/core':
+        specifier: ^2.0.15
+        version: 2.0.15(core-js@3.49.0)
+      '@rsbuild/plugin-babel':
+        specifier: ^2.0.0
+        version: 2.0.0(@rsbuild/core@2.0.15(core-js@3.49.0))
+      '@rsbuild/plugin-image-compress':
+        specifier: ^1.3.4
+        version: 1.3.4(@rsbuild/core@2.0.15(core-js@3.49.0))
+      '@rsbuild/plugin-sass':
+        specifier: ^2.0.0
+        version: 2.0.0(@rsbuild/core@2.0.15(core-js@3.49.0))
+      '@rsbuild/plugin-tailwindcss':
+        specifier: ^2.0.3
+        version: 2.0.3(@rsbuild/core@2.0.15(core-js@3.49.0))(@rspack/core@2.0.8(@swc/helpers@0.5.23))
+      '@rsbuild/plugin-vue':
+        specifier: ^2.0.0
+        version: 2.0.0(@rsbuild/core@2.0.15(core-js@3.49.0))(@rspack/core@2.0.8(@swc/helpers@0.5.23))(@vue/compiler-sfc@3.5.38)(vue@3.5.38(typescript@5.8.3))
+      '@rsbuild/plugin-vue-jsx':
+        specifier: ^2.0.1
+        version: 2.0.1(@babel/core@7.29.7)(@rsbuild/core@2.0.15(core-js@3.49.0))
+      '@types/dagre':
+        specifier: ^0.7.53
+        version: 0.7.53
+      '@types/node':
+        specifier: ^22.19.7
+        version: 22.19.7
+      '@vue/compiler-sfc':
+        specifier: 3.5.38
+        version: 3.5.38
+      '@vue/eslint-config-prettier':
+        specifier: ^10.2.0
+        version: 10.2.0(@types/eslint@9.6.1)(eslint@10.5.0(jiti@2.7.0))(prettier@3.8.4)
+      '@vue/eslint-config-typescript':
+        specifier: ^14.9.0
+        version: 14.9.0(eslint-plugin-vue@10.9.2(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3))(eslint@10.5.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.5.0(jiti@2.7.0))))(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      '@vue/tsconfig':
+        specifier: ^0.7.0
+        version: 0.7.0(typescript@5.8.3)(vue@3.5.38(typescript@5.8.3))
+      eslint:
+        specifier: ^10.5.0
+        version: 10.5.0(jiti@2.7.0)
+      eslint-plugin-simple-import-sort:
+        specifier: ^13.0.0
+        version: 13.0.0(eslint@10.5.0(jiti@2.7.0))
+      eslint-plugin-vue:
+        specifier: ^10.9.2
+        version: 10.9.2(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3))(eslint@10.5.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.5.0(jiti@2.7.0)))
+      postcss:
+        specifier: ~8.5.14
+        version: 8.5.14
+      postcss-html:
+        specifier: ^1.8.1
+        version: 1.8.1
+      postcss-scss:
+        specifier: ^4.0.9
+        version: 4.0.9(postcss@8.5.14)
+      prettier:
+        specifier: 3.8.4
+        version: 3.8.4
+      prettier-plugin-css-order:
+        specifier: ^2.2.0
+        version: 2.2.0(postcss@8.5.14)(prettier@3.8.4)
+      prettier-plugin-packagejson:
+        specifier: ^3.0.2
+        version: 3.0.2(prettier@3.8.4)
+      prettier-plugin-tailwindcss:
+        specifier: ^0.8.0
+        version: 0.8.0(prettier-plugin-css-order@2.2.0(postcss@8.5.14)(prettier@3.8.4))(prettier@3.8.4)
+      stylelint:
+        specifier: ^17.13.0
+        version: 17.13.0(typescript@5.8.3)
+      stylelint-config-standard:
+        specifier: ^40.0.0
+        version: 40.0.0(stylelint@17.13.0(typescript@5.8.3))
+      stylelint-config-standard-scss:
+        specifier: ^17.0.0
+        version: 17.0.0(postcss@8.5.14)(stylelint@17.13.0(typescript@5.8.3))
+      stylelint-config-standard-vue:
+        specifier: ^1.0.0
+        version: 1.0.0(postcss-html@1.8.1)(stylelint@17.13.0(typescript@5.8.3))
+      tailwindcss:
+        specifier: 4.3.1
+        version: 4.3.1
+      terser:
+        specifier: ~5.44.1
+        version: 5.44.1
+      typescript:
+        specifier: ~5.8.3
+        version: 5.8.3
+      typescript-eslint:
+        specifier: ^8.62.0
+        version: 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      unplugin-auto-import:
+        specifier: ^21.0.0
+        version: 21.0.0(@vueuse/core@13.9.0(vue@3.5.38(typescript@5.8.3)))
+      unplugin-icons:
+        specifier: ^23.0.1
+        version: 23.0.1(@vue/compiler-sfc@3.5.38)
+      unplugin-vue-components:
+        specifier: ~31.0.0
+        version: 31.0.0(vue@3.5.38(typescript@5.8.3))
+      vue-eslint-parser:
+        specifier: ^10.4.1
+        version: 10.4.1(eslint@10.5.0(jiti@2.7.0))
+      vue-tsc:
+        specifier: ^3.3.5
+        version: 3.3.5(typescript@5.8.3)
+
+packages:
+
+  '@ai-sdk/gateway@4.0.0-beta.32':
+    resolution: {integrity: sha512-4ejLAJCRwwd02qpdEJUmhsFw5bAESWYV2bXekPW/Q8CbqEiEiRpqj1fy1KBnFWzelPu5hsiCS9zrb6ORf0u2BA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      zod: ^3.25.76 || ^4.1.8
+
+  '@ai-sdk/openai-compatible@3.0.0-beta.14':
+    resolution: {integrity: sha512-2apttYn16ijMW8JIJ31ICTfPl6AdizO8yjMLcCohEeciFpVfzk99vZTCyTHGPI1HfYdSp1HYYJTdPlSxpH5QZQ==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      zod: ^3.25.76 || ^4.1.8
+
+  '@ai-sdk/provider-utils@5.0.0-beta.10':
+    resolution: {integrity: sha512-gq5M4+93dSIznbYa32EhHR4bQsOwG6dRLKjcQu8KQrXieEmdVnkdSfvzrVygRPg3CQR5YeyMYwheJbdelgI/lw==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      zod: ^3.25.76 || ^4.1.8
+
+  '@ai-sdk/provider@4.0.0-beta.6':
+    resolution: {integrity: sha512-dpm638wg8dhC/eU9S0r+urhLKDyrkLCbhw8ewc8HijUKkIuM9xPUy2mx1rO80CFMbK2ZO2UoZp/b7BgfGpH8KA==}
+    engines: {node: '>=18'}
+
+  '@alloc/quick-lru@5.2.0':
+    resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+    engines: {node: '>=10'}
+
+  '@antfu/install-pkg@1.1.0':
+    resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
+
+  '@babel/code-frame@7.28.6':
+    resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/code-frame@7.29.7':
+    resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/compat-data@7.28.6':
+    resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/compat-data@7.29.7':
+    resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/core@7.28.6':
+    resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/core@7.29.7':
+    resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/generator@7.28.6':
+    resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/generator@7.29.7':
+    resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-annotate-as-pure@7.29.7':
+    resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-compilation-targets@7.28.6':
+    resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-compilation-targets@7.29.7':
+    resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-create-class-features-plugin@7.29.7':
+    resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-globals@7.28.0':
+    resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-globals@7.29.7':
+    resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-member-expression-to-functions@7.29.7':
+    resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-imports@7.28.6':
+    resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-imports@7.29.7':
+    resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-transforms@7.28.6':
+    resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-module-transforms@7.29.7':
+    resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-optimise-call-expression@7.29.7':
+    resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-plugin-utils@7.28.6':
+    resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-plugin-utils@7.29.7':
+    resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-replace-supers@7.29.7':
+    resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
+    resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-string-parser@7.27.1':
+    resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-string-parser@7.29.7':
+    resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-identifier@7.28.5':
+    resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-identifier@7.29.7':
+    resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-option@7.27.1':
+    resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-option@7.29.7':
+    resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helpers@7.28.6':
+    resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helpers@7.29.7':
+    resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/parser@7.28.6':
+    resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  '@babel/parser@7.29.7':
+    resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  '@babel/plugin-proposal-decorators@7.29.7':
+    resolution: {integrity: sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-decorators@7.29.7':
+    resolution: {integrity: sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-jsx@7.27.1':
+    resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-jsx@7.29.7':
+    resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-typescript@7.29.7':
+    resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-class-properties@7.29.7':
+    resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-modules-commonjs@7.29.7':
+    resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-typescript@7.29.7':
+    resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/preset-typescript@7.29.7':
+    resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/template@7.28.6':
+    resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/template@7.29.7':
+    resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/traverse@7.28.6':
+    resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/traverse@7.29.7':
+    resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/types@7.28.6':
+    resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/types@7.29.7':
+    resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==}
+    engines: {node: '>=6.9.0'}
+
+  '@bufbuild/protobuf@2.10.0':
+    resolution: {integrity: sha512-fdRs9PSrBF7QUntpZpq6BTw58fhgGJojgg39m9oFOJGZT+nip9b0so5cYY1oWl5pvemDLr0cPPsH46vwThEbpQ==}
+
+  '@cacheable/memory@2.0.9':
+    resolution: {integrity: sha512-HdMx6DoGywB30vacDbBsITbIX4pgFqj1zsrV58jZBUw3klzkNoXhj7qOqAgledhxG7YZI5rBSJg7Zp8/VG0DuA==}
+
+  '@cacheable/utils@2.4.1':
+    resolution: {integrity: sha512-eiFgzCbIneyMlLOmNG4g9xzF7Hv3Mga4LjxjcSC/ues6VYq2+gUbQI8JqNuw/ZM8tJIeIaBGpswAsqV2V7ApgA==}
+
+  '@codemirror/autocomplete@6.20.0':
+    resolution: {integrity: sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==}
+
+  '@codemirror/commands@6.10.1':
+    resolution: {integrity: sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==}
+
+  '@codemirror/lang-css@6.3.1':
+    resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==}
+
+  '@codemirror/lang-html@6.4.11':
+    resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==}
+
+  '@codemirror/lang-java@6.0.2':
+    resolution: {integrity: sha512-m5Nt1mQ/cznJY7tMfQTJchmrjdjQ71IDs+55d1GAa8DGaB8JXWsVCkVT284C3RTASaY43YknrK2X3hPO/J3MOQ==}
+
+  '@codemirror/lang-javascript@6.2.4':
+    resolution: {integrity: sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==}
+
+  '@codemirror/lang-json@6.0.2':
+    resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==}
+
+  '@codemirror/lang-python@6.2.1':
+    resolution: {integrity: sha512-IRjC8RUBhn9mGR9ywecNhB51yePWCGgvHfY1lWN/Mrp3cKuHr0isDKia+9HnvhiWNnMpbGhWrkhuWOc09exRyw==}
+
+  '@codemirror/lang-sql@6.10.0':
+    resolution: {integrity: sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==}
+
+  '@codemirror/lang-vue@0.1.3':
+    resolution: {integrity: sha512-QSKdtYTDRhEHCfo5zOShzxCmqKJvgGrZwDQSdbvCRJ5pRLWBS7pD/8e/tH44aVQT6FKm0t6RVNoSUWHOI5vNug==}
+
+  '@codemirror/language@6.12.1':
+    resolution: {integrity: sha512-Fa6xkSiuGKc8XC8Cn96T+TQHYj4ZZ7RdFmXA3i9xe/3hLHfwPZdM+dqfX0Cp0zQklBKhVD8Yzc8LS45rkqcwpQ==}
+
+  '@codemirror/lint@6.9.3':
+    resolution: {integrity: sha512-y3YkYhdnhjDBAe0VIA0c4wVoFOvnp8CnAvfLqi0TqotIv92wIlAAP7HELOpLBsKwjAX6W92rSflA6an/2zBvXw==}
+
+  '@codemirror/search@6.6.0':
+    resolution: {integrity: sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==}
+
+  '@codemirror/state@6.5.4':
+    resolution: {integrity: sha512-8y7xqG/hpB53l25CIoit9/ngxdfoG+fx+V3SHBrinnhOtLvKHRyAJJuHzkWrR4YXXLX8eXBsejgAAxHUOdW1yw==}
+
+  '@codemirror/theme-one-dark@6.1.3':
+    resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==}
+
+  '@codemirror/view@6.39.12':
+    resolution: {integrity: sha512-f+/VsHVn/kOA9lltk/GFzuYwVVAKmOnNjxbrhkk3tPHntFqjWeI2TbIXx006YkBkqC10wZ4NsnWXCQiFPeAISQ==}
+
+  '@csstools/css-calc@3.2.1':
+    resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      '@csstools/css-parser-algorithms': ^4.0.0
+      '@csstools/css-tokenizer': ^4.0.0
+
+  '@csstools/css-parser-algorithms@4.0.0':
+    resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      '@csstools/css-tokenizer': ^4.0.0
+
+  '@csstools/css-syntax-patches-for-csstree@1.1.5':
+    resolution: {integrity: sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==}
+    peerDependencies:
+      css-tree: ^3.2.1
+    peerDependenciesMeta:
+      css-tree:
+        optional: true
+
+  '@csstools/css-tokenizer@4.0.0':
+    resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==}
+    engines: {node: '>=20.19.0'}
+
+  '@csstools/media-query-list-parser@5.0.0':
+    resolution: {integrity: sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      '@csstools/css-parser-algorithms': ^4.0.0
+      '@csstools/css-tokenizer': ^4.0.0
+
+  '@csstools/selector-resolve-nested@4.0.0':
+    resolution: {integrity: sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      postcss-selector-parser: ^7.1.1
+
+  '@csstools/selector-specificity@6.0.0':
+    resolution: {integrity: sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      postcss-selector-parser: ^7.1.1
+
+  '@ctrl/tinycolor@4.2.0':
+    resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==}
+    engines: {node: '>=14'}
+
+  '@element-plus/icons-vue@2.3.2':
+    resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  '@emnapi/core@1.10.0':
+    resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==}
+
+  '@emnapi/core@1.7.0':
+    resolution: {integrity: sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==}
+
+  '@emnapi/runtime@1.10.0':
+    resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
+
+  '@emnapi/runtime@1.7.0':
+    resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==}
+
+  '@emnapi/wasi-threads@1.1.0':
+    resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
+
+  '@emnapi/wasi-threads@1.2.1':
+    resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
+
+  '@eslint-community/eslint-utils@4.9.1':
+    resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+  '@eslint-community/regexpp@4.12.2':
+    resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+  '@eslint/config-array@0.23.5':
+    resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==}
+    engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+  '@eslint/config-helpers@0.6.0':
+    resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==}
+    engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+  '@eslint/core@1.2.1':
+    resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==}
+    engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+  '@eslint/js@10.0.1':
+    resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==}
+    engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+    peerDependencies:
+      eslint: ^10.0.0
+    peerDependenciesMeta:
+      eslint:
+        optional: true
+
+  '@eslint/object-schema@3.0.5':
+    resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==}
+    engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+  '@eslint/plugin-kit@0.7.2':
+    resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==}
+    engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+  '@floating-ui/core@1.7.3':
+    resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
+
+  '@floating-ui/dom@1.7.4':
+    resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
+
+  '@floating-ui/utils@0.2.10':
+    resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
+
+  '@humanfs/core@0.19.2':
+    resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
+    engines: {node: '>=18.18.0'}
+
+  '@humanfs/node@0.16.8':
+    resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==}
+    engines: {node: '>=18.18.0'}
+
+  '@humanfs/types@0.15.0':
+    resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==}
+    engines: {node: '>=18.18.0'}
+
+  '@humanwhocodes/module-importer@1.0.1':
+    resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+    engines: {node: '>=12.22'}
+
+  '@humanwhocodes/retry@0.4.3':
+    resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+    engines: {node: '>=18.18'}
+
+  '@iconify-json/ep@1.2.4':
+    resolution: {integrity: sha512-dtKOueYp1CRxAUW+GayIiuHqOlELfO0W3QiHOH4NjvKtBn2uxZbByIKQ+7B1Hj+AgZrhWTie3QKYkZn+VQVZrw==}
+
+  '@iconify-json/line-md@1.2.14':
+    resolution: {integrity: sha512-ZlgQyMcptcni3wEua+ij9hXEuYmlHKlf38/fZT4Qhds07naE9NeEmE0tqWMHAtkir+r9VRTTz3jXzwXWkLZiCg==}
+
+  '@iconify-json/mingcute@1.2.7':
+    resolution: {integrity: sha512-bp4z6F53KAQp99aSL7qPCHL7HWUNGMNKIhfo/dx9pwVHiad/WusUbTOFXEZfpA44syJPzSOxa3O6Pwiq7qZz1g==}
+
+  '@iconify-json/svg-spinners@1.2.4':
+    resolution: {integrity: sha512-ayn0pogFPwJA1WFZpDnoq9/hjDxN+keeCMyThaX4d3gSJ3y0mdKUxIA/b1YXWGtY9wVtZmxwcvOIeEieG4+JNg==}
+
+  '@iconify-json/tabler@1.2.26':
+    resolution: {integrity: sha512-92G+ZD70AZgeJf07JfQzH+isnai6DwPcMBuF/qL1F+xAxdXCJzGd3w2RmsRvOmB+w1ImmWEEDms50QivQIjd6g==}
+
+  '@iconify/types@2.0.0':
+    resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+  '@iconify/utils@3.1.0':
+    resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==}
+
+  '@iconify/vue@5.0.1':
+    resolution: {integrity: sha512-aumwwooJlFJ5H5qYWB6ZTAyM0C8hpfcSVLB9/a3qnH1GGvIJ+FEbpEs4s/HfErYe/M5qZeLjwmESR5fFm3lXEw==}
+    peerDependencies:
+      vue: '>=3.0.0'
+
+  '@jridgewell/gen-mapping@0.3.13':
+    resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+  '@jridgewell/remapping@2.3.5':
+    resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+  '@jridgewell/resolve-uri@3.1.2':
+    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/source-map@0.3.11':
+    resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
+  '@jridgewell/sourcemap-codec@1.5.5':
+    resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+  '@jridgewell/trace-mapping@0.3.31':
+    resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+  '@json-render/codegen@0.19.0':
+    resolution: {integrity: sha512-Ks/mz3pQ9RtSvI12PqOXvhx8U7MvQjLJJYB4Vd+08W/AnpTxa8eeH9uDMWRyxt0abiWjBQQRDaqDodyfzYExgg==}
+
+  '@json-render/core@0.19.0':
+    resolution: {integrity: sha512-vvcyZ+10EDZKbEyB1J2kXOGfDaiZR2LurZGSqi2r5STHyKr+Te85DWaBxTwRGgM7U1LtIvNx85BzzjElRKoAIg==}
+    peerDependencies:
+      zod: ^4.0.0
+
+  '@json-render/devtools@0.19.0':
+    resolution: {integrity: sha512-ECToHJCDUIwrlpRi6kX5mEqOsDIZ5k3XMARiJVey36qPi3z53W2yJsNpujBiQZHTTY44iEtIi93JxDptKk1gdg==}
+
+  '@json-render/vue@0.19.0':
+    resolution: {integrity: sha512-WWvjQnsYJsHvc61Y18z3n0feFIGDrL00ltezh4d2FGs9yrpNXhw3bZVvAi1jB7yq8/rB7nC2VF/CVu+Qg56Wgg==}
+    peerDependencies:
+      vue: ^3.5.0
+      zod: ^4.0.0
+
+  '@json-render/yaml@0.19.0':
+    resolution: {integrity: sha512-MeLRNo9KVne6Q/6VWBgmmaCJ5IaSJppjINARDt+J3gMOIbxOMTLA55DywH54dhR28SviLH/JV3O+zGnMp8SngA==}
+
+  '@keyv/bigmap@1.3.1':
+    resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==}
+    engines: {node: '>= 18'}
+    peerDependencies:
+      keyv: ^5.6.0
+
+  '@keyv/serialize@1.1.1':
+    resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
+
+  '@lezer/common@1.5.0':
+    resolution: {integrity: sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==}
+
+  '@lezer/css@1.3.0':
+    resolution: {integrity: sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==}
+
+  '@lezer/highlight@1.2.3':
+    resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==}
+
+  '@lezer/html@1.3.13':
+    resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==}
+
+  '@lezer/java@1.1.3':
+    resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==}
+
+  '@lezer/javascript@1.5.4':
+    resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==}
+
+  '@lezer/json@1.0.3':
+    resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==}
+
+  '@lezer/lr@1.4.8':
+    resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==}
+
+  '@lezer/python@1.1.18':
+    resolution: {integrity: sha512-31FiUrU7z9+d/ElGQLJFXl+dKOdx0jALlP3KEOsGTex8mvj+SoE1FgItcHWK/axkxCHGUSpqIHt6JAWfWu9Rhg==}
+
+  '@marijn/find-cluster-break@1.0.2':
+    resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
+
+  '@napi-rs/image-android-arm64@1.11.2':
+    resolution: {integrity: sha512-EUkTeYEayZn9IyzXcn8m5t0MCsiN08+SsPJBhWQR05pQiiuonBRAYuZWB3hJDVHKfKKXogzMRShcTAE70NXGzA==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [android]
+
+  '@napi-rs/image-darwin-arm64@1.11.2':
+    resolution: {integrity: sha512-RLnv2bbvkDwaROZHqUEozSto5nE3mhlIS9U2WGHJwepYUneq0gMumibtzp7YjEl6coEgqKnUDoATzRnUovkHqw==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@napi-rs/image-darwin-x64@1.11.2':
+    resolution: {integrity: sha512-uptDhysXHSB3OTetz15CVeqf0LyeXpUnzqmVFhQimdzTEDkG7CyasUWNM29DOn2XTlZESdwAvg+2YUiQqt0wqA==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@napi-rs/image-freebsd-x64@1.11.2':
+    resolution: {integrity: sha512-W6Sk8MKjS95OVZ0TWurUttF0Kt/chRuZkFKF4iPAbwcW/tk92sIJlBi+7VNMvpjVr8xLTbPkzaPIs2jes19Tbg==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@napi-rs/image-linux-arm-gnueabihf@1.11.2':
+    resolution: {integrity: sha512-Oj2l9DWig3d3wEmkX4j6Ecg3H2ElT+n5u5TZ47xm0vEZT0QBb4dcqhVvWx6RTn4rLLU4sxAlwEtb3SR2UmpZwQ==}
+    engines: {node: '>= 10'}
+    cpu: [arm]
+    os: [linux]
+
+  '@napi-rs/image-linux-arm64-gnu@1.11.2':
+    resolution: {integrity: sha512-/ntkbFvrP4ERrGFJ32PupmYuZxhCoqfSN9y9Nao86kGdxCASjS2zecufDw2IjgUhD8CBigD1o9aoA74lKQbuOw==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@napi-rs/image-linux-arm64-musl@1.11.2':
+    resolution: {integrity: sha512-8N+PlYpTVMEAyaOHqpx3wtur34TxBvF0YI4i9Cv0zJttzlNgsUOZjFCxVOeH+QVzvz+XOqTb4BR1vYpethFqVQ==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@napi-rs/image-linux-x64-gnu@1.11.2':
+    resolution: {integrity: sha512-0F/nDFW2UcidE9qh6+M8Ew4a8GIraX2C71xuvYb+dIEAT4lFoqfNWatxKBOmnZFWpsrO/taRhWUBFXJlG7uOyw==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@napi-rs/image-linux-x64-musl@1.11.2':
+    resolution: {integrity: sha512-AZEXCQUfmrZXiPQHfTgQE0xTsz4Ox4p15Q5IUM02sCZTvNLKflbE+WmJ2dEIh78q6V2QomUKDVTx7Q6pCZylIw==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@napi-rs/image-wasm32-wasi@1.11.2':
+    resolution: {integrity: sha512-JM/ZFveVEGIBFyIberr1RTp7FHZHAbZFwCLZ7eNbUE5ujpufExkvICAB2uW4a02ZqTwdXTuI2CxmdrUhhN/XkQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [wasm32]
+
+  '@napi-rs/image-win32-arm64-msvc@1.11.2':
+    resolution: {integrity: sha512-JTWYu5m+a+Pi8nN3jI6c5NJV5gJvpSYoN0kBml2QMQWVktwcDQ2pC1yiTzmDSa+FnFsT57BcSm5S6yhj+42wjQ==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@napi-rs/image-win32-ia32-msvc@1.11.2':
+    resolution: {integrity: sha512-tjTiyeoGD+vk6nt2fagT00+SVV6uvkAsC6CK72up0YQcKTNYBbnpM6K/yUmSDtB708brjo+xtMJ5rwYEpsyeRQ==}
+    engines: {node: '>= 10'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@napi-rs/image-win32-x64-msvc@1.11.2':
+    resolution: {integrity: sha512-HhGEXPHyuf7EeWgSct1/0B4vy7KckALgI4HCwv2PHisvKcp/v/hcPTMHPCkfwtEe7uBDAugcEuEaMaKZnTP9jQ==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [win32]
+
+  '@napi-rs/image@1.11.2':
+    resolution: {integrity: sha512-i5zlU1EgNBlgRjxMC1CgClZlHyGGnR1upLV64s8t5N+w9/lB7plHcb+rBJ5YmSP9Mho5RvLQpZ/ScaoJNNcnNg==}
+    engines: {node: '>= 10'}
+
+  '@napi-rs/wasm-runtime@1.0.7':
+    resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==}
+
+  '@napi-rs/wasm-runtime@1.1.4':
+    resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==}
+    peerDependencies:
+      '@emnapi/core': ^1.7.1
+      '@emnapi/runtime': ^1.7.1
+
+  '@nodelib/fs.scandir@2.1.5':
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.stat@2.0.5':
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.walk@1.2.8':
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+
+  '@parcel/watcher-android-arm64@2.5.1':
+    resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  '@parcel/watcher-darwin-arm64@2.5.1':
+    resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@parcel/watcher-darwin-x64@2.5.1':
+    resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@parcel/watcher-freebsd-x64@2.5.1':
+    resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@parcel/watcher-linux-arm-glibc@2.5.1':
+    resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+    libc: [glibc]
+
+  '@parcel/watcher-linux-arm-musl@2.5.1':
+    resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+    libc: [musl]
+
+  '@parcel/watcher-linux-arm64-glibc@2.5.1':
+    resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@parcel/watcher-linux-arm64-musl@2.5.1':
+    resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@parcel/watcher-linux-x64-glibc@2.5.1':
+    resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@parcel/watcher-linux-x64-musl@2.5.1':
+    resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@parcel/watcher-win32-arm64@2.5.1':
+    resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@parcel/watcher-win32-ia32@2.5.1':
+    resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@parcel/watcher-win32-x64@2.5.1':
+    resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  '@parcel/watcher@2.5.1':
+    resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
+    engines: {node: '>= 10.0.0'}
+
+  '@pkgr/core@0.3.6':
+    resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+
+  '@rollup/rollup-android-arm-eabi@4.53.1':
+    resolution: {integrity: sha512-bxZtughE4VNVJlL1RdoSE545kc4JxL7op57KKoi59/gwuU5rV6jLWFXXc8jwgFoT6vtj+ZjO+Z2C5nrY0Cl6wA==}
+    cpu: [arm]
+    os: [android]
+
+  '@rollup/rollup-android-arm64@4.53.1':
+    resolution: {integrity: sha512-44a1hreb02cAAfAKmZfXVercPFaDjqXCK+iKeVOlJ9ltvnO6QqsBHgKVPTu+MJHSLLeMEUbeG2qiDYgbFPU48g==}
+    cpu: [arm64]
+    os: [android]
+
+  '@rollup/rollup-darwin-arm64@4.53.1':
+    resolution: {integrity: sha512-usmzIgD0rf1syoOZ2WZvy8YpXK5G1V3btm3QZddoGSa6mOgfXWkkv+642bfUUldomgrbiLQGrPryb7DXLovPWQ==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rollup/rollup-darwin-x64@4.53.1':
+    resolution: {integrity: sha512-is3r/k4vig2Gt8mKtTlzzyaSQ+hd87kDxiN3uDSDwggJLUV56Umli6OoL+/YZa/KvtdrdyNfMKHzL/P4siOOmg==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rollup/rollup-freebsd-arm64@4.53.1':
+    resolution: {integrity: sha512-QJ1ksgp/bDJkZB4daldVmHaEQkG4r8PUXitCOC2WRmRaSaHx5RwPoI3DHVfXKwDkB+Sk6auFI/+JHacTekPRSw==}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@rollup/rollup-freebsd-x64@4.53.1':
+    resolution: {integrity: sha512-J6ma5xgAzvqsnU6a0+jgGX/gvoGokqpkx6zY4cWizRrm0ffhHDpJKQgC8dtDb3+MqfZDIqs64REbfHDMzxLMqQ==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.53.1':
+    resolution: {integrity: sha512-JzWRR41o2U3/KMNKRuZNsDUAcAVUYhsPuMlx5RUldw0E4lvSIXFUwejtYz1HJXohUmqs/M6BBJAUBzKXZVddbg==}
+    cpu: [arm]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-arm-musleabihf@4.53.1':
+    resolution: {integrity: sha512-L8kRIrnfMrEoHLHtHn+4uYA52fiLDEDyezgxZtGUTiII/yb04Krq+vk3P2Try+Vya9LeCE9ZHU8CXD6J9EhzHQ==}
+    cpu: [arm]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-linux-arm64-gnu@4.53.1':
+    resolution: {integrity: sha512-ysAc0MFRV+WtQ8li8hi3EoFi7us6d1UzaS/+Dp7FYZfg3NdDljGMoVyiIp6Ucz7uhlYDBZ/zt6XI0YEZbUO11Q==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-arm64-musl@4.53.1':
+    resolution: {integrity: sha512-UV6l9MJpDbDZZ/fJvqNcvO1PcivGEf1AvKuTcHoLjVZVFeAMygnamCTDikCVMRnA+qJe+B3pSbgX2+lBMqgBhA==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-linux-loong64-gnu@4.53.1':
+    resolution: {integrity: sha512-UDUtelEprkA85g95Q+nj3Xf0M4hHa4DiJ+3P3h4BuGliY4NReYYqwlc0Y8ICLjN4+uIgCEvaygYlpf0hUj90Yg==}
+    cpu: [loong64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-ppc64-gnu@4.53.1':
+    resolution: {integrity: sha512-vrRn+BYhEtNOte/zbc2wAUQReJXxEx2URfTol6OEfY2zFEUK92pkFBSXRylDM7aHi+YqEPJt9/ABYzmcrS4SgQ==}
+    cpu: [ppc64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-riscv64-gnu@4.53.1':
+    resolution: {integrity: sha512-gto/1CxHyi4A7YqZZNznQYrVlPSaodOBPKM+6xcDSCMVZN/Fzb4K+AIkNz/1yAYz9h3Ng+e2fY9H6bgawVq17w==}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-riscv64-musl@4.53.1':
+    resolution: {integrity: sha512-KZ6Vx7jAw3aLNjFR8eYVcQVdFa/cvBzDNRFM3z7XhNNunWjA03eUrEwJYPk0G8V7Gs08IThFKcAPS4WY/ybIrQ==}
+    cpu: [riscv64]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-linux-s390x-gnu@4.53.1':
+    resolution: {integrity: sha512-HvEixy2s/rWNgpwyKpXJcHmE7om1M89hxBTBi9Fs6zVuLU4gOrEMQNbNsN/tBVIMbLyysz/iwNiGtMOpLAOlvA==}
+    cpu: [s390x]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-x64-gnu@4.53.1':
+    resolution: {integrity: sha512-E/n8x2MSjAQgjj9IixO4UeEUeqXLtiA7pyoXCFYLuXpBA/t2hnbIdxHfA7kK9BFsYAoNU4st1rHYdldl8dTqGA==}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rollup/rollup-linux-x64-musl@4.53.1':
+    resolution: {integrity: sha512-IhJ087PbLOQXCN6Ui/3FUkI9pWNZe/Z7rEIVOzMsOs1/HSAECCvSZ7PkIbkNqL/AZn6WbZvnoVZw/qwqYMo4/w==}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@rollup/rollup-openharmony-arm64@4.53.1':
+    resolution: {integrity: sha512-0++oPNgLJHBblreu0SFM7b3mAsBJBTY0Ksrmu9N6ZVrPiTkRgda52mWR7TKhHAsUb9noCjFvAw9l6ZO1yzaVbA==}
+    cpu: [arm64]
+    os: [openharmony]
+
+  '@rollup/rollup-win32-arm64-msvc@4.53.1':
+    resolution: {integrity: sha512-VJXivz61c5uVdbmitLkDlbcTk9Or43YC2QVLRkqp86QoeFSqI81bNgjhttqhKNMKnQMWnecOCm7lZz4s+WLGpQ==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rollup/rollup-win32-ia32-msvc@4.53.1':
+    resolution: {integrity: sha512-NmZPVTUOitCXUH6erJDzTQ/jotYw4CnkMDjCYRxNHVD9bNyfrGoIse684F9okwzKCV4AIHRbUkeTBc9F2OOH5Q==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@rollup/rollup-win32-x64-gnu@4.53.1':
+    resolution: {integrity: sha512-2SNj7COIdAf6yliSpLdLG8BEsp5lgzRehgfkP0Av8zKfQFKku6JcvbobvHASPJu4f3BFxej5g+HuQPvqPhHvpQ==}
+    cpu: [x64]
+    os: [win32]
+
+  '@rollup/rollup-win32-x64-msvc@4.53.1':
+    resolution: {integrity: sha512-rLarc1Ofcs3DHtgSzFO31pZsCh8g05R2azN1q3fF+H423Co87My0R+tazOEvYVKXSLh8C4LerMK41/K7wlklcg==}
+    cpu: [x64]
+    os: [win32]
+
+  '@rsbuild/core@2.0.15':
+    resolution: {integrity: sha512-O8vmMhZu1YImO6jOqt/K/vlJSvkq7UtSq5YM1DIlcEd9LW8Gf6/dkQ1B2KPI6F+hSMFBnTTTumdcIowSLCw97g==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    hasBin: true
+    peerDependencies:
+      core-js: '>= 3.0.0'
+    peerDependenciesMeta:
+      core-js:
+        optional: true
+
+  '@rsbuild/plugin-babel@1.2.1':
+    resolution: {integrity: sha512-6Zad7Ff/RUNc91AtftemJcJ1wcZRGOiwuJy349qlLJl9F++oRYwUhx+MxLSpNnVeIywWx2mKdZZBtD1hLqfj9w==}
+    peerDependencies:
+      '@rsbuild/core': ^1.0.0 || ^2.0.0-0
+    peerDependenciesMeta:
+      '@rsbuild/core':
+        optional: true
+
+  '@rsbuild/plugin-babel@2.0.0':
+    resolution: {integrity: sha512-JSiKJhsebDItVYPLY4dpZ0vw2Acvqv4jQtuAIDri+o6qBYzCzDXP936F6REiitVNTWh3H2rCyT8eM/WADTuFow==}
+    peerDependencies:
+      '@rsbuild/core': ^2.0.0
+    peerDependenciesMeta:
+      '@rsbuild/core':
+        optional: true
+
+  '@rsbuild/plugin-image-compress@1.3.4':
+    resolution: {integrity: sha512-1cPaTlLeIfZF0Gz1hRGeWPVglhaVpl7MWHhYROkrwz1LvHS73eRKEVG4JTmlj03ZiwOx4IX6jgX7QDdwSvizog==}
+    peerDependencies:
+      '@rsbuild/core': ^1.0.0 || ^2.0.0-0
+    peerDependenciesMeta:
+      '@rsbuild/core':
+        optional: true
+
+  '@rsbuild/plugin-sass@2.0.0':
+    resolution: {integrity: sha512-MS50LoIbQKjYAGvfjs/owsXPvw93LoPZuZ6EWZ4g/HhgLk/uHugHAGY0Q47d0zHk3f2JYDOHWLrWPm4j2wA8Lw==}
+    peerDependencies:
+      '@rsbuild/core': ^2.0.0
+    peerDependenciesMeta:
+      '@rsbuild/core':
+        optional: true
+
+  '@rsbuild/plugin-tailwindcss@2.0.3':
+    resolution: {integrity: sha512-sl7mN0fyoP0W+zEyFR2xEMVAS2cZPlOAqsXwI8Ei9tUSvV7V4G8Xw2WBVCOQ/B4KEFfJ6H1+TEuPlAzHLEfc4g==}
+    peerDependencies:
+      '@rsbuild/core': ^2.0.0
+    peerDependenciesMeta:
+      '@rsbuild/core':
+        optional: true
+
+  '@rsbuild/plugin-vue-jsx@2.0.1':
+    resolution: {integrity: sha512-PEGr2cUJkkU9w9YGhiwSQy2pNw4D6elSi2ZWxmsFLdZQ1u0DEojaMxNV/BZZMvFMeRSAs0DMAHQM5lRdhGam1w==}
+    peerDependencies:
+      '@rsbuild/core': ^1.0.0 || ^2.0.0-0
+    peerDependenciesMeta:
+      '@rsbuild/core':
+        optional: true
+
+  '@rsbuild/plugin-vue@2.0.0':
+    resolution: {integrity: sha512-x+oOV+gG6e65542VtcRncVEoCzbAw/IB6aAAgMJJ4xJ1QO08nZSwGPqtjeYXv9Uo+7lC5lP2yLIDnCbys8wsqg==}
+    peerDependencies:
+      '@rsbuild/core': ^2.0.0
+    peerDependenciesMeta:
+      '@rsbuild/core':
+        optional: true
+
+  '@rspack/binding-darwin-arm64@2.0.8':
+    resolution: {integrity: sha512-vCgbgH7B7qom+uID+RCZsTCOYFb9wC4/4+1U6rMfytrXGVJ72eNQs2tbdjOl0lb18CT3N/n+VkWynUiLk84GwA==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rspack/binding-darwin-x64@2.0.8':
+    resolution: {integrity: sha512-satPm2PD4B7jDTVlVAdvMVdUszwLvWUEnUDzLb77mvVkezKNDZmuhb+e8s+FfKs8hJpNbZ9VAejuA2rr8o985w==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rspack/binding-linux-arm64-gnu@2.0.8':
+    resolution: {integrity: sha512-pSI+npPQE/uDtiboqvcOIRJbEV2+B+H1xffmko/gw50la92oTUW60kVULFwsb6L0+GVCzIcwX3yq60GtYIn+Ug==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rspack/binding-linux-arm64-musl@2.0.8':
+    resolution: {integrity: sha512-igjJ43yxWQ72GZqjDDZSSHax9/Vg+6rLMmOvFglTJUkQpB4Tyvu/YjW+WRjYj2xRw6blOjLxUSJWASvuSqqlvg==}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@rspack/binding-linux-x64-gnu@2.0.8':
+    resolution: {integrity: sha512-zrkoEOnqj1hOEBO5T2I/2Ts2HSJsYFh1qXwMpK4dMJFGGNWDfNeUa6/LF5uq3VINF3JUl7RL47AgrucoSZJXPA==}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@rspack/binding-linux-x64-musl@2.0.8':
+    resolution: {integrity: sha512-6CtDaGZjNDvJd9TBp7a9zABbrPORO21W96+3ZcGBn0YNUPUk4ARxIxrTTpeJ/1F41QDM8AYIkGDdqEYMqTYBsA==}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@rspack/binding-wasm32-wasi@2.0.8':
+    resolution: {integrity: sha512-Yf4SiqTUroT5Ju+te0YAY2xxKOb35tECsO21v7hYyGa705wrgoAK/MmF7enOvs9GR1iZIqgiLD/wxsIxl8GjJw==}
+    cpu: [wasm32]
+
+  '@rspack/binding-win32-arm64-msvc@2.0.8':
+    resolution: {integrity: sha512-8NCuiQsAhXrwRBy57QZoypqrws/zLBkaQVGiB8hksr6v++8hNigNjqpQARLbd0iyMuHsQQ++8+auGk6xlDXmzw==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rspack/binding-win32-ia32-msvc@2.0.8':
+    resolution: {integrity: sha512-bxiekytbX7V9KFAra+HkwtNWC6pYfHEBBZFpiT0xUs3mCFOmAAFVBsBSQsoCP9AdCEXoMAvNdnrHNw3iov4OZw==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@rspack/binding-win32-x64-msvc@2.0.8':
+    resolution: {integrity: sha512-7zPs8YCe/ZVJTwd+5lpB0CP0tkn2pONf/T1ycmVY76u21Nrwt8mXQGc/2yH2eWP4B7fikYBr3hGr7mpR2fajqQ==}
+    cpu: [x64]
+    os: [win32]
+
+  '@rspack/binding@2.0.8':
+    resolution: {integrity: sha512-3uZ+y8aQxq33ty2srMxg2Nu0XuBI6vVrG50rkDaXqwWqOohfgGUSfFuQK7EnSUNy4aFUQlCG6NHialQHJov0wg==}
+
+  '@rspack/core@2.0.8':
+    resolution: {integrity: sha512-+NLGJf8gZxihDmMFzjlly3toc2SMjeDmuvz0/Cai9AMdV4F+Pqcnt2BA9V4e3SY2jmhJQtPwgyyLtR1RiJO77g==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    peerDependencies:
+      '@module-federation/runtime-tools': ^0.24.1 || ^2.0.0
+      '@swc/helpers': ^0.5.23
+    peerDependenciesMeta:
+      '@module-federation/runtime-tools':
+        optional: true
+      '@swc/helpers':
+        optional: true
+
+  '@rspack/lite-tapable@1.1.0':
+    resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==}
+
+  '@sindresorhus/merge-streams@4.0.0':
+    resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
+    engines: {node: '>=18'}
+
+  '@standard-schema/spec@1.1.0':
+    resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
+  '@swc/helpers@0.5.23':
+    resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==}
+
+  '@sxzz/popperjs-es@2.11.8':
+    resolution: {integrity: sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==}
+
+  '@tailwindcss/node@4.3.1':
+    resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==}
+
+  '@tailwindcss/oxide-android-arm64@4.3.1':
+    resolution: {integrity: sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==}
+    engines: {node: '>= 20'}
+    cpu: [arm64]
+    os: [android]
+
+  '@tailwindcss/oxide-darwin-arm64@4.3.1':
+    resolution: {integrity: sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==}
+    engines: {node: '>= 20'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@tailwindcss/oxide-darwin-x64@4.3.1':
+    resolution: {integrity: sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==}
+    engines: {node: '>= 20'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@tailwindcss/oxide-freebsd-x64@4.3.1':
+    resolution: {integrity: sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==}
+    engines: {node: '>= 20'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
+    resolution: {integrity: sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==}
+    engines: {node: '>= 20'}
+    cpu: [arm]
+    os: [linux]
+
+  '@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
+    resolution: {integrity: sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==}
+    engines: {node: '>= 20'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  '@tailwindcss/oxide-linux-arm64-musl@4.3.1':
+    resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==}
+    engines: {node: '>= 20'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  '@tailwindcss/oxide-linux-x64-gnu@4.3.1':
+    resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==}
+    engines: {node: '>= 20'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  '@tailwindcss/oxide-linux-x64-musl@4.3.1':
+    resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==}
+    engines: {node: '>= 20'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  '@tailwindcss/oxide-wasm32-wasi@4.3.1':
+    resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [wasm32]
+    bundledDependencies:
+      - '@napi-rs/wasm-runtime'
+      - '@emnapi/core'
+      - '@emnapi/runtime'
+      - '@tybys/wasm-util'
+      - '@emnapi/wasi-threads'
+      - tslib
+
+  '@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
+    resolution: {integrity: sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==}
+    engines: {node: '>= 20'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@tailwindcss/oxide-win32-x64-msvc@4.3.1':
+    resolution: {integrity: sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==}
+    engines: {node: '>= 20'}
+    cpu: [x64]
+    os: [win32]
+
+  '@tailwindcss/oxide@4.3.1':
+    resolution: {integrity: sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==}
+    engines: {node: '>= 20'}
+
+  '@tailwindcss/webpack@4.3.1':
+    resolution: {integrity: sha512-HM33EjYPbkMlBGcYoVA/pk/hML3wAn2JOnjF79eDWVLuktOhRczDwWsSBQBOWV6LLBVAgGZS/pZ519OHUF8vKg==}
+    peerDependencies:
+      '@rspack/core': ^1.0.0 || ^2.0.0
+      webpack: ^5.0.0
+    peerDependenciesMeta:
+      '@rspack/core':
+        optional: true
+      webpack:
+        optional: true
+
+  '@tybys/wasm-util@0.10.1':
+    resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
+  '@types/babel__core@7.20.5':
+    resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+  '@types/babel__generator@7.27.0':
+    resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
+
+  '@types/babel__template@7.4.4':
+    resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+  '@types/babel__traverse@7.28.0':
+    resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
+
+  '@types/dagre@0.7.53':
+    resolution: {integrity: sha512-f4gkWqzPZvYmKhOsDnhq/R8mO4UMcKdxZo+i5SCkOU1wvGeHJeUXGIHeE9pnwGyPMDof1Vx5ZQo4nxpeg2TTVQ==}
+
+  '@types/eslint@9.6.1':
+    resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+
+  '@types/esrecurse@4.3.1':
+    resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
+
+  '@types/estree@1.0.8':
+    resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+  '@types/json-schema@7.0.15':
+    resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+  '@types/lodash-es@4.17.12':
+    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+  '@types/lodash@4.17.24':
+    resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==}
+
+  '@types/node@22.19.7':
+    resolution: {integrity: sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==}
+
+  '@types/web-bluetooth@0.0.20':
+    resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
+
+  '@types/web-bluetooth@0.0.21':
+    resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
+
+  '@typescript-eslint/eslint-plugin@8.62.0':
+    resolution: {integrity: sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      '@typescript-eslint/parser': ^8.62.0
+      eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+      typescript: '>=4.8.4 <6.1.0'
+
+  '@typescript-eslint/parser@8.62.0':
+    resolution: {integrity: sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+      typescript: '>=4.8.4 <6.1.0'
+
+  '@typescript-eslint/project-service@8.62.0':
+    resolution: {integrity: sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '>=4.8.4 <6.1.0'
+
+  '@typescript-eslint/scope-manager@8.62.0':
+    resolution: {integrity: sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/tsconfig-utils@8.62.0':
+    resolution: {integrity: sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '>=4.8.4 <6.1.0'
+
+  '@typescript-eslint/type-utils@8.62.0':
+    resolution: {integrity: sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+      typescript: '>=4.8.4 <6.1.0'
+
+  '@typescript-eslint/types@8.62.0':
+    resolution: {integrity: sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/typescript-estree@8.62.0':
+    resolution: {integrity: sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '>=4.8.4 <6.1.0'
+
+  '@typescript-eslint/utils@8.62.0':
+    resolution: {integrity: sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+      typescript: '>=4.8.4 <6.1.0'
+
+  '@typescript-eslint/visitor-keys@8.62.0':
+    resolution: {integrity: sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@vercel/oidc@3.2.0':
+    resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==}
+    engines: {node: '>= 20'}
+
+  '@volar/language-core@2.4.28':
+    resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==}
+
+  '@volar/source-map@2.4.28':
+    resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==}
+
+  '@volar/typescript@2.4.28':
+    resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==}
+
+  '@vue-flow/background@1.3.2':
+    resolution: {integrity: sha512-eJPhDcLj1wEo45bBoqTXw1uhl0yK2RaQGnEINqvvBsAFKh/camHJd5NPmOdS1w+M9lggc9igUewxaEd3iCQX2w==}
+    peerDependencies:
+      '@vue-flow/core': ^1.23.0
+      vue: ^3.3.0
+
+  '@vue-flow/core@1.48.1':
+    resolution: {integrity: sha512-3IxaMBLvWRbznZ4CuK0kVhp4Y4lCDQx9nhi48Swp6PwPw29KNhmiKd2kaBogYeWjGLb/tLjlE9V0s3jEmKCYWw==}
+    peerDependencies:
+      vue: ^3.3.0
+
+  '@vue-flow/minimap@1.5.4':
+    resolution: {integrity: sha512-l4C+XTAXnRxsRpUdN7cAVFBennC1sVRzq4bDSpVK+ag7tdMczAnhFYGgbLkUw3v3sY6gokyWwMl8CDonp8eB2g==}
+    peerDependencies:
+      '@vue-flow/core': ^1.23.0
+      vue: ^3.3.0
+
+  '@vue-flow/node-resizer@1.5.0':
+    resolution: {integrity: sha512-FmvOZ6+yVrBEf+8oJcCU20PUZ105QsyM01iiP4vTKHGJ01hzoh9d0/wP9iJkxkIpvBU59CyOHyTKQZlDr4qDhA==}
+    peerDependencies:
+      '@vue-flow/core': ^1.23.0
+      vue: ^3.3.0
+
+  '@vue/babel-helper-vue-transform-on@1.5.0':
+    resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==}
+
+  '@vue/babel-helper-vue-transform-on@2.0.1':
+    resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==}
+
+  '@vue/babel-plugin-jsx@1.5.0':
+    resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    peerDependenciesMeta:
+      '@babel/core':
+        optional: true
+
+  '@vue/babel-plugin-jsx@2.0.1':
+    resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    peerDependenciesMeta:
+      '@babel/core':
+        optional: true
+
+  '@vue/babel-plugin-resolve-type@1.5.0':
+    resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@vue/babel-plugin-resolve-type@2.0.1':
+    resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@vue/compiler-core@3.5.27':
+    resolution: {integrity: sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==}
+
+  '@vue/compiler-core@3.5.38':
+    resolution: {integrity: sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==}
+
+  '@vue/compiler-dom@3.5.27':
+    resolution: {integrity: sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==}
+
+  '@vue/compiler-dom@3.5.38':
+    resolution: {integrity: sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==}
+
+  '@vue/compiler-sfc@3.5.38':
+    resolution: {integrity: sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==}
+
+  '@vue/compiler-ssr@3.5.38':
+    resolution: {integrity: sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==}
+
+  '@vue/devtools-api@6.6.4':
+    resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
+  '@vue/devtools-api@7.7.7':
+    resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==}
+
+  '@vue/devtools-kit@7.7.7':
+    resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==}
+
+  '@vue/devtools-shared@7.7.7':
+    resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==}
+
+  '@vue/eslint-config-prettier@10.2.0':
+    resolution: {integrity: sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw==}
+    peerDependencies:
+      eslint: '>= 8.21.0'
+      prettier: '>= 3.0.0'
+
+  '@vue/eslint-config-typescript@14.9.0':
+    resolution: {integrity: sha512-E3j9hDlfVf10F30MRcLTPY2IIhWIx1nsvkVukk14kTcuA+oBVot9zsP1hzsO+PAMDxV3Fd9FimBJtUBNBL5KFA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    hasBin: true
+    peerDependencies:
+      eslint: ^9.10.0 || ^10.0.0
+      eslint-plugin-vue: ^9.28.0 || ^10.0.0
+      typescript: '>=4.8.4'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  '@vue/language-core@3.3.5':
+    resolution: {integrity: sha512-UkKu5nhX89fg4VhlG/FOeI10G3cj/7radKT/cy9BT4Q9qJmJlSTAc/dP63Xqs29aypN4f39xUV6PsLNk/dcD6g==}
+
+  '@vue/reactivity@3.5.38':
+    resolution: {integrity: sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==}
+
+  '@vue/runtime-core@3.5.38':
+    resolution: {integrity: sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==}
+
+  '@vue/runtime-dom@3.5.38':
+    resolution: {integrity: sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==}
+
+  '@vue/server-renderer@3.5.38':
+    resolution: {integrity: sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==}
+    peerDependencies:
+      vue: 3.5.38
+
+  '@vue/shared@3.5.27':
+    resolution: {integrity: sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==}
+
+  '@vue/shared@3.5.38':
+    resolution: {integrity: sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==}
+
+  '@vue/tsconfig@0.7.0':
+    resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==}
+    peerDependencies:
+      typescript: 5.x
+      vue: ^3.4.0
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+      vue:
+        optional: true
+
+  '@vueuse/core@10.11.1':
+    resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==}
+
+  '@vueuse/core@13.9.0':
+    resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==}
+    peerDependencies:
+      vue: ^3.5.0
+
+  '@vueuse/core@14.3.0':
+    resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==}
+    peerDependencies:
+      vue: ^3.5.0
+
+  '@vueuse/metadata@10.11.1':
+    resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==}
+
+  '@vueuse/metadata@13.9.0':
+    resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==}
+
+  '@vueuse/metadata@14.3.0':
+    resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==}
+
+  '@vueuse/shared@10.11.1':
+    resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==}
+
+  '@vueuse/shared@13.9.0':
+    resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==}
+    peerDependencies:
+      vue: ^3.5.0
+
+  '@vueuse/shared@14.3.0':
+    resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==}
+    peerDependencies:
+      vue: ^3.5.0
+
+  acorn-jsx@5.3.2:
+    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+  acorn@8.15.0:
+    resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  acorn@8.17.0:
+    resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  ai@7.0.0-beta.62:
+    resolution: {integrity: sha512-zeeS+n7+mfDJDrfhW8XBPHbcuhXFU0vPO3FV7/pXjfNyBLpbDOftDodXTHrZMeiLiSEPXO4HsJ3zZj4fikqWQA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      zod: ^3.25.76 || ^4.1.8
+
+  ajv@6.15.0:
+    resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
+
+  ajv@8.17.1:
+    resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+  alien-signals@3.2.1:
+    resolution: {integrity: sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==}
+
+  ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  ansi-regex@6.2.2:
+    resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+    engines: {node: '>=12'}
+
+  ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+
+  argparse@2.0.1:
+    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+  astral-regex@2.0.0:
+    resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+    engines: {node: '>=8'}
+
+  async-validator@4.2.5:
+    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+  babel-plugin-vue-jsx-hmr@1.0.0:
+    resolution: {integrity: sha512-XRq+XTD4bub6HkavELMhihvLX2++JkSBAxRXlqQK32b+Tb0S9PEqxrDSMpOEZ1iGyOaJZj9Y0uU/FzICdyL9MA==}
+
+  balanced-match@4.0.4:
+    resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+    engines: {node: 18 || 20 || >=22}
+
+  baseline-browser-mapping@2.9.19:
+    resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==}
+    hasBin: true
+
+  big.js@5.2.2:
+    resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+
+  birpc@2.8.0:
+    resolution: {integrity: sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==}
+
+  boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+  brace-expansion@5.0.6:
+    resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==}
+    engines: {node: 18 || 20 || >=22}
+
+  braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
+
+  browserslist@4.28.1:
+    resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+
+  buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+  cacheable@2.3.5:
+    resolution: {integrity: sha512-EQfaKe09tl615iNvq/TBRWTFf1AKJNXYQSsMx0Z3EI0nA+pVsVPS8wJhnRlkbdacKPh1d0qVIhwTc2zsQNFEEg==}
+
+  callsites@3.1.0:
+    resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+    engines: {node: '>=6'}
+
+  caniuse-lite@1.0.30001766:
+    resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==}
+
+  chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
+
+  chokidar@5.0.0:
+    resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+    engines: {node: '>= 20.19.0'}
+
+  cliui@8.0.1:
+    resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+    engines: {node: '>=12'}
+
+  codemirror@6.0.2:
+    resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==}
+
+  color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+
+  color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+  colord@2.9.3:
+    resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+
+  colorjs.io@0.5.2:
+    resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==}
+
+  commander@2.20.3:
+    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+  commander@7.2.0:
+    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+    engines: {node: '>= 10'}
+
+  confbox@0.1.8:
+    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+  confbox@0.2.2:
+    resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+
+  convert-source-map@2.0.0:
+    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+  copy-anything@4.0.5:
+    resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
+    engines: {node: '>=18'}
+
+  core-js@3.49.0:
+    resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==}
+
+  cosmiconfig@9.0.2:
+    resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      typescript: '>=4.9.5'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  countup.js@2.9.0:
+    resolution: {integrity: sha512-llqrvyXztRFPp6+i8jx25phHWcVWhrHO4Nlt0uAOSKHB8778zzQswa4MU3qKBvkXfJKftRYFJuVHez67lyKdHg==}
+
+  crelt@1.0.6:
+    resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
+
+  cross-spawn@7.0.6:
+    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+    engines: {node: '>= 8'}
+
+  crypto-js@4.2.0:
+    resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
+
+  css-declaration-sorter@7.4.0:
+    resolution: {integrity: sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==}
+    engines: {node: ^14 || ^16 || >=18}
+    peerDependencies:
+      postcss: ^8.0.9
+
+  css-functions-list@3.3.3:
+    resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==}
+    engines: {node: '>=12'}
+
+  css-select@5.2.2:
+    resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
+
+  css-tree@2.2.1:
+    resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+  css-tree@2.3.1:
+    resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+  css-tree@3.2.1:
+    resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+  css-what@6.2.2:
+    resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+    engines: {node: '>= 6'}
+
+  cssesc@3.0.0:
+    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  csso@5.0.5:
+    resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+  csstype@3.2.3:
+    resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+  d3-color@3.1.0:
+    resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+    engines: {node: '>=12'}
+
+  d3-dispatch@3.0.1:
+    resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
+    engines: {node: '>=12'}
+
+  d3-drag@3.0.0:
+    resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
+    engines: {node: '>=12'}
+
+  d3-ease@3.0.1:
+    resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+    engines: {node: '>=12'}
+
+  d3-interpolate@3.0.1:
+    resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+    engines: {node: '>=12'}
+
+  d3-selection@3.0.0:
+    resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
+    engines: {node: '>=12'}
+
+  d3-timer@3.0.1:
+    resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+    engines: {node: '>=12'}
+
+  d3-transition@3.0.1:
+    resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      d3-selection: 2 - 3
+
+  d3-zoom@3.0.0:
+    resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
+    engines: {node: '>=12'}
+
+  dagre@0.8.5:
+    resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==}
+
+  dayjs@1.11.19:
+    resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}
+
+  dayjs@1.11.20:
+    resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==}
+
+  debug@4.4.3:
+    resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  deep-is@0.1.4:
+    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+  deepmerge@4.3.1:
+    resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+    engines: {node: '>=0.10.0'}
+
+  default-passive-events@4.0.0:
+    resolution: {integrity: sha512-0whk/GqfDOjc0AJIpacXUSqX6kV9TjL3GFSXIxFvuXQYcK+bEdJ6rpJnAEfP4YYMYWibM+jhlwmdlVrlifoepg==}
+
+  define-lazy-prop@2.0.0:
+    resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+    engines: {node: '>=8'}
+
+  defu@6.1.4:
+    resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+  detect-indent@7.0.2:
+    resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==}
+    engines: {node: '>=12.20'}
+
+  detect-libc@1.0.3:
+    resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+    engines: {node: '>=0.10'}
+    hasBin: true
+
+  detect-libc@2.1.2:
+    resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+    engines: {node: '>=8'}
+
+  detect-newline@4.0.1:
+    resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  diff@8.0.4:
+    resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==}
+    engines: {node: '>=0.3.1'}
+
+  disable-devtool@0.3.9:
+    resolution: {integrity: sha512-WHCpC8f93Cn2DnTeaq57NFLcdw4921sovh1ammnp/2o8Snb704HK/Vw1/D2D1Pihc0zc8/mVKb5nchHtoadObQ==}
+
+  discontinuous-range@1.0.0:
+    resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==}
+
+  dom-serializer@2.0.0:
+    resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+  domelementtype@2.3.0:
+    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+  domhandler@5.0.3:
+    resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+    engines: {node: '>= 4'}
+
+  domutils@3.2.2:
+    resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+  echarts@6.0.0:
+    resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==}
+
+  electron-to-chromium@1.5.279:
+    resolution: {integrity: sha512-0bblUU5UNdOt5G7XqGiJtpZMONma6WAfq9vsFmtn9x1+joAObr6x1chfqyxFSDCAFwFhCQDrqeAr6MYdpwJ9Hg==}
+
+  element-plus@2.14.0:
+    resolution: {integrity: sha512-POgH+TtoreaEKWqYYAVQyE6i8rQMEFqAEublyF29dBA5yASWPLKY6EzfeqBTr2Uv26mPss4vSrMrNPyaK7LX5w==}
+    peerDependencies:
+      vue: ^3.3.7
+
+  emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+  emojis-list@3.0.0:
+    resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+    engines: {node: '>= 4'}
+
+  enhanced-resolve@5.21.6:
+    resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==}
+    engines: {node: '>=10.13.0'}
+
+  entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+
+  entities@7.0.1:
+    resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
+    engines: {node: '>=0.12'}
+
+  env-paths@2.2.1:
+    resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+    engines: {node: '>=6'}
+
+  error-ex@1.3.4:
+    resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+
+  escalade@3.2.0:
+    resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+    engines: {node: '>=6'}
+
+  escape-string-regexp@4.0.0:
+    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+    engines: {node: '>=10'}
+
+  escape-string-regexp@5.0.0:
+    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+    engines: {node: '>=12'}
+
+  eslint-config-prettier@10.1.8:
+    resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
+    hasBin: true
+    peerDependencies:
+      eslint: '>=7.0.0'
+
+  eslint-plugin-prettier@5.5.6:
+    resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      '@types/eslint': '>=8.0.0'
+      eslint: '>=8.0.0'
+      eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0'
+      prettier: '>=3.0.0'
+    peerDependenciesMeta:
+      '@types/eslint':
+        optional: true
+      eslint-config-prettier:
+        optional: true
+
+  eslint-plugin-simple-import-sort@13.0.0:
+    resolution: {integrity: sha512-McAc+/Nlvcg4byY/CABGH8kqnefWBj8s3JA2okEtz8ixbECQgU46p0HkTUKa4YS7wvgGceimlc34p1nXqbWqtA==}
+    peerDependencies:
+      eslint: '>=5.0.0'
+
+  eslint-plugin-vue@10.9.2:
+    resolution: {integrity: sha512-4g7ZP3pYcuqd7Zp0pzUKcos0W+RkjBz4EGdhJ92FcYk6v03Ti/GK5NwjgsjxHK+98eXDbHeK7VtX1az7/8doZA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
+      '@typescript-eslint/parser': ^7.0.0 || ^8.0.0
+      eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+      vue-eslint-parser: ^10.3.0
+    peerDependenciesMeta:
+      '@stylistic/eslint-plugin':
+        optional: true
+      '@typescript-eslint/parser':
+        optional: true
+
+  eslint-scope@9.1.2:
+    resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==}
+    engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+  eslint-visitor-keys@3.4.3:
+    resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  eslint-visitor-keys@5.0.1:
+    resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
+    engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+  eslint@10.5.0:
+    resolution: {integrity: sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==}
+    engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+    hasBin: true
+    peerDependencies:
+      jiti: '*'
+    peerDependenciesMeta:
+      jiti:
+        optional: true
+
+  espree@11.2.0:
+    resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==}
+    engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+  esquery@1.7.0:
+    resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
+    engines: {node: '>=0.10'}
+
+  esrecurse@4.3.0:
+    resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+    engines: {node: '>=4.0'}
+
+  estraverse@5.3.0:
+    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+    engines: {node: '>=4.0'}
+
+  estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+  estree-walker@3.0.3:
+    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+  esutils@2.0.3:
+    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+    engines: {node: '>=0.10.0'}
+
+  eventsource-parser@3.1.0:
+    resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==}
+    engines: {node: '>=18.0.0'}
+
+  exsolve@1.0.7:
+    resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
+
+  fast-deep-equal@3.1.3:
+    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+  fast-diff@1.3.0:
+    resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
+  fast-glob@3.3.3:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+    engines: {node: '>=8.6.0'}
+
+  fast-json-stable-stringify@2.1.0:
+    resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+  fast-levenshtein@2.0.6:
+    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+  fast-uri@3.1.0:
+    resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+
+  fastest-levenshtein@1.0.16:
+    resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
+    engines: {node: '>= 4.9.1'}
+
+  fastq@1.20.1:
+    resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+
+  fdir@6.5.0:
+    resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+    engines: {node: '>=12.0.0'}
+    peerDependencies:
+      picomatch: ^3 || ^4
+    peerDependenciesMeta:
+      picomatch:
+        optional: true
+
+  fflate@0.8.3:
+    resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==}
+
+  file-entry-cache@11.1.3:
+    resolution: {integrity: sha512-oMbq0PD6VIiIwMF6LIa7MEwd/l9huKwmqRKXqmrkqIZv8CvRbfowL+L0ryAl8h//HfAS0zS+4SbYoRyAoA6BJA==}
+
+  file-entry-cache@8.0.0:
+    resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+    engines: {node: '>=16.0.0'}
+
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  find-up@5.0.0:
+    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+    engines: {node: '>=10'}
+
+  flat-cache@4.0.1:
+    resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+    engines: {node: '>=16'}
+
+  flat-cache@6.1.22:
+    resolution: {integrity: sha512-N2dnzVJIphnNsjHcrxGW7DePckJ6haPrSFqpsBUhHYgwtKGVq4JrBGielEGD2fCVnsGm1zlBVZ8wGhkyuetgug==}
+
+  flatted@3.4.2:
+    resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
+
+  framer-motion@12.29.2:
+    resolution: {integrity: sha512-lSNRzBJk4wuIy0emYQ/nfZ7eWhqud2umPKw2QAQki6uKhZPKm2hRQHeQoHTG9MIvfobb+A/LbEWPJU794ZUKrg==}
+    peerDependencies:
+      '@emotion/is-prop-valid': '*'
+      react: ^18.0.0 || ^19.0.0
+      react-dom: ^18.0.0 || ^19.0.0
+    peerDependenciesMeta:
+      '@emotion/is-prop-valid':
+        optional: true
+      react:
+        optional: true
+      react-dom:
+        optional: true
+
+  framer-motion@12.40.0:
+    resolution: {integrity: sha512-uaBd3qC1v3KQqBEjwTUd183K6PbS+j0yR9w9VmEOLWA/tnUcSn8Xa3uck7t4dgpDoUss8xQTcj8W2L07lrnLFg==}
+    peerDependencies:
+      '@emotion/is-prop-valid': '*'
+      react: ^18.0.0 || ^19.0.0
+      react-dom: ^18.0.0 || ^19.0.0
+    peerDependenciesMeta:
+      '@emotion/is-prop-valid':
+        optional: true
+      react:
+        optional: true
+      react-dom:
+        optional: true
+
+  fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+
+  gensync@1.0.0-beta.2:
+    resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+    engines: {node: '>=6.9.0'}
+
+  get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+
+  get-east-asian-width@1.6.0:
+    resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==}
+    engines: {node: '>=18'}
+
+  git-hooks-list@4.2.1:
+    resolution: {integrity: sha512-WNvqJjOxxs/8ZP9+DWdwWJ7cDsd60NHf39XnD82pDVrKO5q7xfPqpkK6hwEAmBa/ZSEE4IOoR75EzbbIuwGlMw==}
+
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  glob-parent@6.0.2:
+    resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+    engines: {node: '>=10.13.0'}
+
+  global-modules@2.0.0:
+    resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
+    engines: {node: '>=6'}
+
+  global-prefix@3.0.0:
+    resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
+    engines: {node: '>=6'}
+
+  globby@16.2.0:
+    resolution: {integrity: sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==}
+    engines: {node: '>=20'}
+
+  globjoin@0.1.4:
+    resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
+
+  graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  graphlib@2.1.8:
+    resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==}
+
+  has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  has-flag@5.0.1:
+    resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==}
+    engines: {node: '>=12'}
+
+  hashery@1.5.1:
+    resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==}
+    engines: {node: '>=20'}
+
+  hey-listen@1.0.8:
+    resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==}
+
+  hookable@5.5.3:
+    resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
+  hookified@1.15.1:
+    resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==}
+
+  hookified@2.2.0:
+    resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==}
+
+  html-tags@5.1.0:
+    resolution: {integrity: sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==}
+    engines: {node: '>=20.10'}
+
+  html-to-image@1.11.13:
+    resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==}
+
+  htmlparser2@8.0.2:
+    resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
+
+  ignore@5.3.2:
+    resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+    engines: {node: '>= 4'}
+
+  ignore@7.0.5:
+    resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+    engines: {node: '>= 4'}
+
+  immutable@5.1.7:
+    resolution: {integrity: sha512-47Xb+LFbZ/ZIjQMj6Q5J3IfK7PJFuqRdFOC9FpGgRTK6U2dAEVmkR9hp58qU4FpYux5YXpneDwkj2EP6lppzFA==}
+
+  import-fresh@3.3.1:
+    resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+    engines: {node: '>=6'}
+
+  import-meta-resolve@4.2.0:
+    resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
+
+  imurmurhash@0.1.4:
+    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+    engines: {node: '>=0.8.19'}
+
+  ini@1.3.8:
+    resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+  is-arrayish@0.2.1:
+    resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+  is-docker@2.2.1:
+    resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+    engines: {node: '>=8'}
+    hasBin: true
+
+  is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+
+  is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  is-path-inside@4.0.0:
+    resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==}
+    engines: {node: '>=12'}
+
+  is-plain-obj@4.1.0:
+    resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+    engines: {node: '>=12'}
+
+  is-plain-object@5.0.0:
+    resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+    engines: {node: '>=0.10.0'}
+
+  is-what@5.5.0:
+    resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==}
+    engines: {node: '>=18'}
+
+  is-wsl@2.2.0:
+    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+    engines: {node: '>=8'}
+
+  isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  jiti@2.7.0:
+    resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
+    hasBin: true
+
+  js-tokens@4.0.0:
+    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+  js-tokens@9.0.1:
+    resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+  js-yaml@4.2.0:
+    resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==}
+    hasBin: true
+
+  jsesc@3.1.0:
+    resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  json-buffer@3.0.1:
+    resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+  json-parse-even-better-errors@2.3.1:
+    resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+  json-schema-traverse@0.4.1:
+    resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+  json-schema-traverse@1.0.0:
+    resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+  json-schema@0.4.0:
+    resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+
+  json-stable-stringify-without-jsonify@1.0.1:
+    resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+  json5@2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  keyv@4.5.4:
+    resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+  keyv@5.6.0:
+    resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==}
+
+  kind-of@6.0.3:
+    resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+    engines: {node: '>=0.10.0'}
+
+  known-css-properties@0.37.0:
+    resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==}
+
+  levn@0.4.1:
+    resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+    engines: {node: '>= 0.8.0'}
+
+  lightningcss-android-arm64@1.32.0:
+    resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  lightningcss-darwin-arm64@1.32.0:
+    resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  lightningcss-darwin-x64@1.32.0:
+    resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  lightningcss-freebsd-x64@1.32.0:
+    resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  lightningcss-linux-arm-gnueabihf@1.32.0:
+    resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  lightningcss-linux-arm64-gnu@1.32.0:
+    resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [glibc]
+
+  lightningcss-linux-arm64-musl@1.32.0:
+    resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: [musl]
+
+  lightningcss-linux-x64-gnu@1.32.0:
+    resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [glibc]
+
+  lightningcss-linux-x64-musl@1.32.0:
+    resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: [musl]
+
+  lightningcss-win32-arm64-msvc@1.32.0:
+    resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  lightningcss-win32-x64-msvc@1.32.0:
+    resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  lightningcss@1.32.0:
+    resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
+    engines: {node: '>= 12.0.0'}
+
+  lines-and-columns@1.2.4:
+    resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+  loader-utils@2.0.4:
+    resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
+    engines: {node: '>=8.9.0'}
+
+  local-pkg@1.1.2:
+    resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
+    engines: {node: '>=14'}
+
+  locate-path@6.0.0:
+    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+    engines: {node: '>=10'}
+
+  lodash-es@4.18.1:
+    resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==}
+
+  lodash-unified@1.0.3:
+    resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
+    peerDependencies:
+      '@types/lodash-es': '*'
+      lodash: '*'
+      lodash-es: '*'
+
+  lodash.truncate@4.4.2:
+    resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+
+  lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+  lodash@4.18.1:
+    resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==}
+
+  lru-cache@5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+  lz-string@1.5.0:
+    resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+    hasBin: true
+
+  magic-string@0.30.21:
+    resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
+  mathml-tag-names@4.0.0:
+    resolution: {integrity: sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==}
+
+  mdn-data@2.0.28:
+    resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+  mdn-data@2.0.30:
+    resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+
+  mdn-data@2.27.1:
+    resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
+
+  memoize-one@6.0.0:
+    resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+
+  meow@14.1.0:
+    resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==}
+    engines: {node: '>=20'}
+
+  merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
+  micromatch@4.0.8:
+    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+    engines: {node: '>=8.6'}
+
+  minimatch@10.2.5:
+    resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
+    engines: {node: 18 || 20 || >=22}
+
+  mitt@3.0.1:
+    resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
+  mlly@1.8.0:
+    resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
+
+  moo@0.5.2:
+    resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==}
+
+  motion-dom@12.29.2:
+    resolution: {integrity: sha512-/k+NuycVV8pykxyiTCoFzIVLA95Nb1BFIVvfSu9L50/6K6qNeAYtkxXILy/LRutt7AzaYDc2myj0wkCVVYAPPA==}
+
+  motion-dom@12.40.0:
+    resolution: {integrity: sha512-HxU3ZaBwNPVQUBQf1xxgq+7JrPNZvjLVxgbpEZL7RrWJnsxOf0/OM+yrHG9ogLQ31Do/r57Oz2gQWPK+6q62mg==}
+
+  motion-utils@12.29.2:
+    resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==}
+
+  motion-utils@12.39.0:
+    resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==}
+
+  motion-v@2.3.0:
+    resolution: {integrity: sha512-J0CCfXtICCni9RjotDUBOs57xNpYI9yyBSohEOxaRHrmjwOtlw291fhRu/mdgEdSasys96R028YDDOAtWBbRaA==}
+    peerDependencies:
+      '@vueuse/core': '>=10.0.0'
+      vue: '>=3.0.0'
+
+  motion@12.29.2:
+    resolution: {integrity: sha512-jMpHdAzEDF1QQ055cB+1lOBLdJ6ialVWl6QQzpJI2OvmHequ7zFVHM2mx0HNAy+Tu4omUlApfC+4vnkX0geEOg==}
+    peerDependencies:
+      '@emotion/is-prop-valid': '*'
+      react: ^18.0.0 || ^19.0.0
+      react-dom: ^18.0.0 || ^19.0.0
+    peerDependenciesMeta:
+      '@emotion/is-prop-valid':
+        optional: true
+      react:
+        optional: true
+      react-dom:
+        optional: true
+
+  ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  muggle-string@0.4.1:
+    resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+  nanoid@3.3.11:
+    resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  nanoid@3.3.12:
+    resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  nanoid@5.1.11:
+    resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==}
+    engines: {node: ^18 || >=20}
+    hasBin: true
+
+  natural-compare@1.4.0:
+    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+  nearley@2.20.1:
+    resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==}
+    hasBin: true
+
+  node-addon-api@7.1.1:
+    resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
+  node-releases@2.0.27:
+    resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+
+  normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
+  normalize-wheel-es@1.2.0:
+    resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
+
+  nprogress@1.0.0-1:
+    resolution: {integrity: sha512-Gr/Km0nIMbR7hOB0fjGx7nR0oRjTy9M61dXiQL5bfTBq0cQ+hNgt6gxE062j7Bxm+L/IjNVOr41iu2hrDeuedw==}
+
+  nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+  obug@2.1.1:
+    resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
+
+  open@8.4.2:
+    resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+    engines: {node: '>=12'}
+
+  optionator@0.9.4:
+    resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+    engines: {node: '>= 0.8.0'}
+
+  p-limit@3.1.0:
+    resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+    engines: {node: '>=10'}
+
+  p-locate@5.0.0:
+    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+    engines: {node: '>=10'}
+
+  package-manager-detector@1.5.0:
+    resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==}
+
+  parent-module@1.0.1:
+    resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+    engines: {node: '>=6'}
+
+  parse-json@5.2.0:
+    resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+    engines: {node: '>=8'}
+
+  path-browserify@1.0.1:
+    resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+  path-exists@4.0.0:
+    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+    engines: {node: '>=8'}
+
+  path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  pathe@2.0.3:
+    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+  perfect-debounce@1.0.0:
+    resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
+  picocolors@1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+  picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  picomatch@4.0.3:
+    resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+    engines: {node: '>=12'}
+
+  picomatch@4.0.4:
+    resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
+    engines: {node: '>=12'}
+
+  pinia-plugin-persistedstate@4.7.1:
+    resolution: {integrity: sha512-WHOqh2esDlR3eAaknPbqXrkkj0D24h8shrDPqysgCFR6ghqP/fpFfJmMPJp0gETHsvrh9YNNg6dQfo2OEtDnIQ==}
+    peerDependencies:
+      '@nuxt/kit': '>=3.0.0'
+      '@pinia/nuxt': '>=0.10.0'
+      pinia: '>=3.0.0'
+    peerDependenciesMeta:
+      '@nuxt/kit':
+        optional: true
+      '@pinia/nuxt':
+        optional: true
+      pinia:
+        optional: true
+
+  pinia@3.0.4:
+    resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==}
+    peerDependencies:
+      typescript: '>=4.5.0'
+      vue: ^3.5.11
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  pkg-types@1.3.1:
+    resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+  pkg-types@2.3.0:
+    resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+
+  postcss-html@1.8.1:
+    resolution: {integrity: sha512-OLF6P7qctfAWayOhLpcVnTGqVeJzu2W3WpIYelfz2+JV5oGxfkcEvweN9U4XpeqE0P98dcD9ssusGwlF0TK0uQ==}
+    engines: {node: ^12 || >=14}
+
+  postcss-less@6.0.0:
+    resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      postcss: ^8.3.5
+
+  postcss-media-query-parser@0.2.3:
+    resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
+
+  postcss-resolve-nested-selector@0.1.6:
+    resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==}
+
+  postcss-safe-parser@6.0.0:
+    resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
+    engines: {node: '>=12.0'}
+    peerDependencies:
+      postcss: ^8.3.3
+
+  postcss-safe-parser@7.0.1:
+    resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==}
+    engines: {node: '>=18.0'}
+    peerDependencies:
+      postcss: ^8.4.31
+
+  postcss-scss@4.0.9:
+    resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==}
+    engines: {node: '>=12.0'}
+    peerDependencies:
+      postcss: ^8.4.29
+
+  postcss-selector-parser@7.1.4:
+    resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==}
+    engines: {node: '>=4'}
+
+  postcss-value-parser@4.2.0:
+    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+  postcss@8.5.14:
+    resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  postcss@8.5.15:
+    resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  prelude-ls@1.2.1:
+    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+    engines: {node: '>= 0.8.0'}
+
+  prettier-linter-helpers@1.0.1:
+    resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==}
+    engines: {node: '>=6.0.0'}
+
+  prettier-plugin-css-order@2.2.0:
+    resolution: {integrity: sha512-GCkwEgQ2roT7le+zpUFQThPDO4x5EXcZmY9Rj6rvO++I/nATTGBWdZdsooha/BlvIBbZclJzXsgJdlKWrys9+w==}
+    engines: {node: '>=16'}
+    peerDependencies:
+      prettier: 3.x
+
+  prettier-plugin-packagejson@3.0.2:
+    resolution: {integrity: sha512-kmoj3hEynXwoHDo8ZhmWAIjRBoQWCDUVackiWfSDWdgD0rS3LGB61T9zoVbume/cotYdCoadUh4sqViAmXvpBQ==}
+    peerDependencies:
+      prettier: ^3
+    peerDependenciesMeta:
+      prettier:
+        optional: true
+
+  prettier-plugin-tailwindcss@0.8.0:
+    resolution: {integrity: sha512-V8ITGH87yuBDF6JpEZTOVlUz/saAwqb8f3HRgUj8Lh+tGCcrmorhsLpYqzygwFwK0PE2Ib6Mv3M7T/uE2tZV1g==}
+    engines: {node: '>=20.19'}
+    peerDependencies:
+      '@ianvs/prettier-plugin-sort-imports': '*'
+      '@prettier/plugin-hermes': '*'
+      '@prettier/plugin-oxc': '*'
+      '@prettier/plugin-pug': '*'
+      '@shopify/prettier-plugin-liquid': '*'
+      '@trivago/prettier-plugin-sort-imports': '*'
+      '@zackad/prettier-plugin-twig': '*'
+      prettier: ^3.0
+      prettier-plugin-astro: '*'
+      prettier-plugin-css-order: '*'
+      prettier-plugin-jsdoc: '*'
+      prettier-plugin-marko: '*'
+      prettier-plugin-multiline-arrays: '*'
+      prettier-plugin-organize-attributes: '*'
+      prettier-plugin-organize-imports: '*'
+      prettier-plugin-sort-imports: '*'
+      prettier-plugin-svelte: '*'
+    peerDependenciesMeta:
+      '@ianvs/prettier-plugin-sort-imports':
+        optional: true
+      '@prettier/plugin-hermes':
+        optional: true
+      '@prettier/plugin-oxc':
+        optional: true
+      '@prettier/plugin-pug':
+        optional: true
+      '@shopify/prettier-plugin-liquid':
+        optional: true
+      '@trivago/prettier-plugin-sort-imports':
+        optional: true
+      '@zackad/prettier-plugin-twig':
+        optional: true
+      prettier-plugin-astro:
+        optional: true
+      prettier-plugin-css-order:
+        optional: true
+      prettier-plugin-jsdoc:
+        optional: true
+      prettier-plugin-marko:
+        optional: true
+      prettier-plugin-multiline-arrays:
+        optional: true
+      prettier-plugin-organize-attributes:
+        optional: true
+      prettier-plugin-organize-imports:
+        optional: true
+      prettier-plugin-sort-imports:
+        optional: true
+      prettier-plugin-svelte:
+        optional: true
+
+  prettier@3.8.4:
+    resolution: {integrity: sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  punycode@2.3.1:
+    resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+    engines: {node: '>=6'}
+
+  qified@0.10.1:
+    resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==}
+    engines: {node: '>=20'}
+
+  quansync@0.2.11:
+    resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
+  queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  radash@12.1.1:
+    resolution: {integrity: sha512-h36JMxKRqrAxVD8201FrCpyeNuUY9Y5zZwujr20fFO77tpUtGa6EZzfKw/3WaiBX95fq7+MpsuMLNdSnORAwSA==}
+    engines: {node: '>=14.18.0'}
+
+  railroad-diagrams@1.0.0:
+    resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==}
+
+  randexp@0.4.6:
+    resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==}
+    engines: {node: '>=0.12'}
+
+  readdirp@5.0.0:
+    resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
+    engines: {node: '>= 20.19.0'}
+
+  reduce-configs@1.1.2:
+    resolution: {integrity: sha512-AgBP55V8FC7NaqoOP2RCbTpu6LE+YuX3LUZkNAoitcfyS3/PIC8Obg/TJrBzTkJ+lDvZv0TTAeDpLkzjTtYlbw==}
+
+  reduce-configs@2.0.1:
+    resolution: {integrity: sha512-H9KTCWTEb1YM1OoOz0f6TeGZYlW82sIT1viNg3W8CjjY0pD3WI4MHs8GifKt5FKTVIfHh/DenfJqqY+FP9jF2A==}
+
+  require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+
+  require-from-string@2.0.2:
+    resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+    engines: {node: '>=0.10.0'}
+
+  resolve-from@4.0.0:
+    resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+    engines: {node: '>=4'}
+
+  ret@0.1.15:
+    resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+    engines: {node: '>=0.12'}
+
+  reusify@1.1.0:
+    resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+  rfdc@1.4.1:
+    resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+  rollup-plugin-visualizer@6.0.11:
+    resolution: {integrity: sha512-TBwVHVY7buHjIKVLqr9scTVFwqZqMXINcCphPwIWKPDCOBIa+jCQfafvbjRJDZgXdq/A996Dy6yGJ/+/NtAXDQ==}
+    engines: {node: '>=18'}
+    hasBin: true
+    peerDependencies:
+      rolldown: 1.x || ^1.0.0-beta
+      rollup: 2.x || 3.x || 4.x
+    peerDependenciesMeta:
+      rolldown:
+        optional: true
+      rollup:
+        optional: true
+
+  rollup@4.53.1:
+    resolution: {integrity: sha512-n2I0V0lN3E9cxxMqBCT3opWOiQBzRN7UG60z/WDKqdX2zHUS/39lezBcsckZFsV6fUTSnfqI7kHf60jDAPGKug==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
+
+  rspack-vue-loader@17.5.1:
+    resolution: {integrity: sha512-1pXdeqYM95P0T8DO2ZcOCBnfMp62W5IG2c0RICn1rFYjHcja41IYSQLzcdc1uePEq0n4JZwvfR2lVs8wRZuwzA==}
+    peerDependencies:
+      '@rspack/core': ^1.0.0 || ^2.0.0-0
+      '@vue/compiler-sfc': '*'
+      vue: '*'
+    peerDependenciesMeta:
+      '@rspack/core':
+        optional: true
+      '@vue/compiler-sfc':
+        optional: true
+      vue:
+        optional: true
+
+  run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+  rxjs@7.8.2:
+    resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
+
+  sanitize.css@13.0.0:
+    resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==}
+
+  sass-embedded-all-unknown@1.100.0:
+    resolution: {integrity: sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==}
+    cpu: ['!arm', '!arm64', '!riscv64', '!x64']
+
+  sass-embedded-android-arm64@1.100.0:
+    resolution: {integrity: sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  sass-embedded-android-arm@1.100.0:
+    resolution: {integrity: sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm]
+    os: [android]
+
+  sass-embedded-android-riscv64@1.100.0:
+    resolution: {integrity: sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==}
+    engines: {node: '>=14.0.0'}
+    cpu: [riscv64]
+    os: [android]
+
+  sass-embedded-android-x64@1.100.0:
+    resolution: {integrity: sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [android]
+
+  sass-embedded-darwin-arm64@1.100.0:
+    resolution: {integrity: sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  sass-embedded-darwin-x64@1.100.0:
+    resolution: {integrity: sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  sass-embedded-linux-arm64@1.100.0:
+    resolution: {integrity: sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: glibc
+
+  sass-embedded-linux-arm@1.100.0:
+    resolution: {integrity: sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm]
+    os: [linux]
+    libc: glibc
+
+  sass-embedded-linux-musl-arm64@1.100.0:
+    resolution: {integrity: sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    libc: musl
+
+  sass-embedded-linux-musl-arm@1.100.0:
+    resolution: {integrity: sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm]
+    os: [linux]
+    libc: musl
+
+  sass-embedded-linux-musl-riscv64@1.100.0:
+    resolution: {integrity: sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [riscv64]
+    os: [linux]
+    libc: musl
+
+  sass-embedded-linux-musl-x64@1.100.0:
+    resolution: {integrity: sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: musl
+
+  sass-embedded-linux-riscv64@1.100.0:
+    resolution: {integrity: sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [riscv64]
+    os: [linux]
+    libc: glibc
+
+  sass-embedded-linux-x64@1.100.0:
+    resolution: {integrity: sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [linux]
+    libc: glibc
+
+  sass-embedded-unknown-all@1.100.0:
+    resolution: {integrity: sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==}
+    os: ['!android', '!darwin', '!linux', '!win32']
+
+  sass-embedded-win32-arm64@1.100.0:
+    resolution: {integrity: sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  sass-embedded-win32-x64@1.100.0:
+    resolution: {integrity: sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  sass-embedded@1.100.0:
+    resolution: {integrity: sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==}
+    engines: {node: '>=16.0.0'}
+    hasBin: true
+
+  sass@1.100.0:
+    resolution: {integrity: sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==}
+    engines: {node: '>=20.19.0'}
+    hasBin: true
+
+  sax@1.6.0:
+    resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==}
+    engines: {node: '>=11.0.0'}
+
+  scule@1.3.0:
+    resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+  secure-ls@2.0.0:
+    resolution: {integrity: sha512-Wgtnw0QSm0v7gVKv11nOoeyGS65EThGXnBB7jfd4IhZd2eq3B4AMPcXAL5qJ1h55+Qolun7TONTwX7H5m6e2pQ==}
+    engines: {node: '>=8.0'}
+
+  semver@6.3.1:
+    resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+    hasBin: true
+
+  semver@7.8.5:
+    resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  shebang-command@2.0.0:
+    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+    engines: {node: '>=8'}
+
+  shebang-regex@3.0.0:
+    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+    engines: {node: '>=8'}
+
+  signal-exit@4.1.0:
+    resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+    engines: {node: '>=14'}
+
+  slash@5.1.0:
+    resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
+    engines: {node: '>=14.16'}
+
+  slice-ansi@4.0.0:
+    resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+    engines: {node: '>=10'}
+
+  sort-object-keys@2.1.0:
+    resolution: {integrity: sha512-SOiEnthkJKPv2L6ec6HMwhUcN0/lppkeYuN1x63PbyPRrgSPIuBJCiYxYyvWRTtjMlOi14vQUCGUJqS6PLVm8g==}
+
+  sort-package-json@3.7.1:
+    resolution: {integrity: sha512-ssk1HG7whF8N/T1IsNAQrtHG5Cbdi0rAgRJZXYBr9hF5xaHnBNzUx/W6LcthEW7FhOwvZssbESZuO+GxssqAyA==}
+    engines: {node: '>=20'}
+    hasBin: true
+
+  source-map-js@1.2.1:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
+
+  source-map-support@0.5.21:
+    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+  source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+
+  source-map@0.7.6:
+    resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+    engines: {node: '>= 12'}
+
+  speakingurl@14.0.1:
+    resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
+    engines: {node: '>=0.10.0'}
+
+  sql-formatter@15.7.0:
+    resolution: {integrity: sha512-o2yiy7fYXK1HvzA8P6wwj8QSuwG3e/XcpWht/jIxkQX99c0SVPw0OXdLSV9fHASPiYB09HLA0uq8hokGydi/QA==}
+    hasBin: true
+
+  string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+
+  string-width@8.2.1:
+    resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==}
+    engines: {node: '>=20'}
+
+  strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+
+  strip-ansi@7.2.0:
+    resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
+    engines: {node: '>=12'}
+
+  strip-literal@3.1.0:
+    resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
+
+  style-mod@4.1.3:
+    resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==}
+
+  stylelint-config-html@1.1.0:
+    resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==}
+    engines: {node: ^12 || >=14}
+    peerDependencies:
+      postcss-html: ^1.0.0
+      stylelint: '>=14.0.0'
+
+  stylelint-config-recommended-scss@17.0.1:
+    resolution: {integrity: sha512-x5DVehzJudcwF0od3sGpgkln2PLLranFE7twwbp7dqDINCyZvwzFkMc6TLhNOvazRiVBJYATQLouJY0xPGB8WA==}
+    engines: {node: '>=20'}
+    peerDependencies:
+      postcss: ^8.3.3
+      stylelint: ^17.0.0
+    peerDependenciesMeta:
+      postcss:
+        optional: true
+
+  stylelint-config-recommended-vue@1.6.1:
+    resolution: {integrity: sha512-lLW7hTIMBiTfjenGuDq2kyHA6fBWd/+Df7MO4/AWOxiFeXP9clbpKgg27kHfwA3H7UNMGC7aeP3mNlZB5LMmEQ==}
+    engines: {node: ^12 || >=14}
+    peerDependencies:
+      postcss-html: ^1.0.0
+      stylelint: '>=14.0.0'
+
+  stylelint-config-recommended@18.0.0:
+    resolution: {integrity: sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      stylelint: ^17.0.0
+
+  stylelint-config-standard-scss@17.0.0:
+    resolution: {integrity: sha512-uLJS6xgOCBw5EMsDW7Ukji8l28qRoMnkRch15s0qwZpskXvWt9oPzMmcYM307m9GN4MxuWLsQh4I6hU9yI53cQ==}
+    engines: {node: '>=20'}
+    peerDependencies:
+      postcss: ^8.3.3
+      stylelint: ^17.0.0
+    peerDependenciesMeta:
+      postcss:
+        optional: true
+
+  stylelint-config-standard-vue@1.0.0:
+    resolution: {integrity: sha512-wAzU7p6DSlo04pWfCbOcaMq09Nojt0FEsbdxhCBTdC7IguD9ZVl7FP/bvyA0HAHjZGC4JkW7m6WiQaoVMDSuFw==}
+    engines: {node: ^12 || >=14}
+    peerDependencies:
+      postcss-html: ^1.0.0
+      stylelint: '>=14.0.0'
+
+  stylelint-config-standard@40.0.0:
+    resolution: {integrity: sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      stylelint: ^17.0.0
+
+  stylelint-scss@7.2.0:
+    resolution: {integrity: sha512-6E79Bachv0Iz0gqRUZgdqdXCsiq26DWBWIBNHYtjTmAp3wJu6cp/I37VfW7BPntmh2puF3bY09XWl4HZGrLhzw==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      stylelint: ^16.8.2 || ^17.0.0
+
+  stylelint@17.13.0:
+    resolution: {integrity: sha512-G1WYzMerp7ihOaIe9VJCHLt12MoAD2QLf1AFerYP37+BCRBUK5UCpq8e/mN+zCIaJPKQcaxhE4WlPmqdiOx/gw==}
+    engines: {node: '>=20.19.0'}
+    hasBin: true
+
+  superjson@2.2.5:
+    resolution: {integrity: sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==}
+    engines: {node: '>=16'}
+
+  supports-color@10.2.2:
+    resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==}
+    engines: {node: '>=18'}
+
+  supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
+
+  supports-color@8.1.1:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+
+  supports-hyperlinks@4.5.0:
+    resolution: {integrity: sha512-ZW2OvfeCXrNTbLakPUzjQG922EeGCOteFSVoek5DKStTh898wf7zgtuFlzQN8HfZCxC3Eh02yJVrRW51hADf+w==}
+    engines: {node: '>=20'}
+
+  svg-tags@1.0.0:
+    resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
+
+  svgo@3.3.3:
+    resolution: {integrity: sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
+
+  swapy@1.0.5:
+    resolution: {integrity: sha512-XEzy5HCw7yESb7QajKTBJ+NA/BL0kAKlE7XhSMPZawF740X4ws/5CFtXRsVDQ+EztISC759a9+DJM9mxjz4hXg==}
+
+  sync-child-process@1.0.2:
+    resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==}
+    engines: {node: '>=16.0.0'}
+
+  sync-message-port@1.1.3:
+    resolution: {integrity: sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==}
+    engines: {node: '>=16.0.0'}
+
+  synckit@0.11.13:
+    resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+
+  table@6.9.0:
+    resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
+    engines: {node: '>=10.0.0'}
+
+  tailwindcss@4.3.1:
+    resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==}
+
+  tapable@2.3.3:
+    resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
+    engines: {node: '>=6'}
+
+  terser@5.44.1:
+    resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  tinyexec@1.0.2:
+    resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
+    engines: {node: '>=18'}
+
+  tinyglobby@0.2.15:
+    resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+    engines: {node: '>=12.0.0'}
+
+  to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+
+  ts-api-utils@2.5.0:
+    resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
+    engines: {node: '>=18.12'}
+    peerDependencies:
+      typescript: '>=4.8.4'
+
+  ts-md5@2.0.1:
+    resolution: {integrity: sha512-yF35FCoEOFBzOclSkMNEUbFQZuv89KEQ+5Xz03HrMSGUGB1+r+El+JiGOFwsP4p9RFNzwlrydYoTLvPOuICl9w==}
+    engines: {node: '>=18'}
+
+  tslib@2.3.0:
+    resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
+
+  tslib@2.8.1:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+  type-check@0.4.0:
+    resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+    engines: {node: '>= 0.8.0'}
+
+  typescript-api-pro@0.0.6:
+    resolution: {integrity: sha512-wRA64AFESZkwyqukGgQJAbzF1E77CCYbydy74TwtQ5QopcXql6DsY00E1aCsCSkdH+NyEwOJsb8L5UoaRvndgg==}
+
+  typescript-eslint@8.62.0:
+    resolution: {integrity: sha512-8QxXi+ZACKX0kaqO4gY8kn0RSD9gFfaHDWwjqtEN48aWCBkX4MJaufWN+c3BzlrXLOxfywDL8CaoqUwcRq4j4Q==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+      typescript: '>=4.8.4 <6.1.0'
+
+  typescript@5.8.3:
+    resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
+    engines: {node: '>=14.17'}
+    hasBin: true
+
+  ufo@1.6.1:
+    resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
+
+  undici-types@6.21.0:
+    resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+  unicorn-magic@0.4.0:
+    resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==}
+    engines: {node: '>=20'}
+
+  unimport@5.6.0:
+    resolution: {integrity: sha512-8rqAmtJV8o60x46kBAJKtHpJDJWkA2xcBqWKPI14MgUb05o1pnpnCnXSxedUXyeq7p8fR5g3pTo2BaswZ9lD9A==}
+    engines: {node: '>=18.12.0'}
+
+  unplugin-auto-import@21.0.0:
+    resolution: {integrity: sha512-vWuC8SwqJmxZFYwPojhOhOXDb5xFhNNcEVb9K/RFkyk/3VnfaOjzitWN7v+8DEKpMjSsY2AEGXNgt6I0yQrhRQ==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      '@nuxt/kit': ^4.0.0
+      '@vueuse/core': '*'
+    peerDependenciesMeta:
+      '@nuxt/kit':
+        optional: true
+      '@vueuse/core':
+        optional: true
+
+  unplugin-icons@23.0.1:
+    resolution: {integrity: sha512-rv0XEJepajKzDLvRUWASM8K+8+/CCfZn2jtogXqg6RIp7kpatRc/aFrVJn8ANQA09e++lPEEv9yX8cC9enc+QQ==}
+    peerDependencies:
+      '@svgr/core': '>=7.0.0'
+      '@svgx/core': ^1.0.1
+      '@vue/compiler-sfc': ^3.0.2
+      svelte: ^3.0.0 || ^4.0.0 || ^5.0.0
+    peerDependenciesMeta:
+      '@svgr/core':
+        optional: true
+      '@svgx/core':
+        optional: true
+      '@vue/compiler-sfc':
+        optional: true
+      svelte:
+        optional: true
+
+  unplugin-utils@0.3.1:
+    resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==}
+    engines: {node: '>=20.19.0'}
+
+  unplugin-vue-components@31.0.0:
+    resolution: {integrity: sha512-4ULwfTZTLuWJ7+S9P7TrcStYLsSRkk6vy2jt/WTfgUEUb0nW9//xxmrfhyHUEVpZ2UKRRwfRb8Yy15PDbVZf+Q==}
+    engines: {node: '>=20.19.0'}
+    peerDependencies:
+      '@nuxt/kit': ^3.2.2 || ^4.0.0
+      vue: ^3.0.0
+    peerDependenciesMeta:
+      '@nuxt/kit':
+        optional: true
+
+  unplugin@2.3.11:
+    resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==}
+    engines: {node: '>=18.12.0'}
+
+  update-browserslist-db@1.2.3:
+    resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+
+  uri-js@4.4.1:
+    resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+  util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+  varint@6.0.0:
+    resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
+
+  virtua@0.49.1:
+    resolution: {integrity: sha512-6f79msqg3jzNFdqJiS0FSzhRN1EHlDhR7EvW7emp6z5qQ22VdsReiDHflkpMEMhoAyUuYr69nwT0aagiM7NrUg==}
+    peerDependencies:
+      react: '>=16.14.0'
+      react-dom: '>=16.14.0'
+      solid-js: '>=1.0'
+      svelte: '>=5.0'
+      vue: '>=3.2'
+    peerDependenciesMeta:
+      react:
+        optional: true
+      react-dom:
+        optional: true
+      solid-js:
+        optional: true
+      svelte:
+        optional: true
+      vue:
+        optional: true
+
+  vscode-uri@3.1.0:
+    resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
+
+  vue-component-type-helpers@3.2.9:
+    resolution: {integrity: sha512-S3BiWYaLSzHxTpln665ELSrMR9UYmrIDUmhik7nVZxmJjTKL2/a+ew1hvGxksKelivm0ujjWfG1fYOiU/2e8rA==}
+
+  vue-demi@0.14.10:
+    resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
+    engines: {node: '>=12'}
+    hasBin: true
+    peerDependencies:
+      '@vue/composition-api': ^1.0.0-rc.1
+      vue: ^3.0.0-0 || ^2.6.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+
+  vue-element-plus-x@2.0.3:
+    resolution: {integrity: sha512-rWsIvozmZkJQLo0aV84YDQkfBf73AlooDZYWskg7I0EMJfLtau5CoPJkJaT76Qkbr9LUCnFIhLiAEFP/bOV/8w==}
+    peerDependencies:
+      element-plus: ^2.9.7
+      vue: ^3.5.17
+
+  vue-eslint-parser@10.4.1:
+    resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+
+  vue-router@4.6.4:
+    resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==}
+    peerDependencies:
+      vue: ^3.5.0
+
+  vue-tsc@3.3.5:
+    resolution: {integrity: sha512-Rzh/G2MmNlMSAMTiQEjDrsb4dgB/jbtEM47rVN2NtidF1dfb/q4w4QvpQBtW5+y3y5H27Hjh7deVwk+YB02fNg==}
+    hasBin: true
+    peerDependencies:
+      typescript: '>=5.0.0'
+
+  vue@3.5.38:
+    resolution: {integrity: sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  w3c-keyname@2.2.8:
+    resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
+
+  webpack-virtual-modules@0.6.2:
+    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+  which@1.3.1:
+    resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+    hasBin: true
+
+  which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+
+  word-wrap@1.2.5:
+    resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+    engines: {node: '>=0.10.0'}
+
+  wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+
+  write-excel-file@4.1.1:
+    resolution: {integrity: sha512-MUnCnNtQrcZek832ZcU24uU0rSphFmKPD1DvIjXOlygVb93CV7Tme6H3jUTkxsMmjB2W7HIzERzjqTi5kui71A==}
+    engines: {node: '>=18'}
+
+  write-file-atomic@7.0.1:
+    resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==}
+    engines: {node: ^20.17.0 || >=22.9.0}
+
+  x-sender@1.4.3:
+    resolution: {integrity: sha512-Bk1N97HDGpxfTeJba1clzqNA4kfw4+HbFeW5dmyWJ7DUC7zdJsK+A+GSkZHsTOvkc4HhT+beuq4BxQVd4VxJwg==}
+
+  xml-name-validator@4.0.0:
+    resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+    engines: {node: '>=12'}
+
+  y18n@5.0.8:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+
+  yallist@3.1.1:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+  yaml@2.9.0:
+    resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
+    engines: {node: '>= 14.6'}
+    hasBin: true
+
+  yargs-parser@21.1.1:
+    resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+    engines: {node: '>=12'}
+
+  yargs@17.7.2:
+    resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+    engines: {node: '>=12'}
+
+  yocto-queue@0.1.0:
+    resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+    engines: {node: '>=10'}
+
+  zipson@0.2.12:
+    resolution: {integrity: sha512-+u+fyZQXJUJDTf4NGCChW+LoWGqCrhwHAfvtCtcmE0e40KmQt4YSP4l3TOay1WjRNv+VfODgBD/vNwaSSGnDwA==}
+
+  zod@4.4.3:
+    resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
+
+  zrender@6.0.0:
+    resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==}
+
+snapshots:
+
+  '@ai-sdk/gateway@4.0.0-beta.32(zod@4.4.3)':
+    dependencies:
+      '@ai-sdk/provider': 4.0.0-beta.6
+      '@ai-sdk/provider-utils': 5.0.0-beta.10(zod@4.4.3)
+      '@vercel/oidc': 3.2.0
+      zod: 4.4.3
+
+  '@ai-sdk/openai-compatible@3.0.0-beta.14(zod@4.4.3)':
+    dependencies:
+      '@ai-sdk/provider': 4.0.0-beta.6
+      '@ai-sdk/provider-utils': 5.0.0-beta.10(zod@4.4.3)
+      zod: 4.4.3
+
+  '@ai-sdk/provider-utils@5.0.0-beta.10(zod@4.4.3)':
+    dependencies:
+      '@ai-sdk/provider': 4.0.0-beta.6
+      '@standard-schema/spec': 1.1.0
+      eventsource-parser: 3.1.0
+      zod: 4.4.3
+
+  '@ai-sdk/provider@4.0.0-beta.6':
+    dependencies:
+      json-schema: 0.4.0
+
+  '@alloc/quick-lru@5.2.0': {}
+
+  '@antfu/install-pkg@1.1.0':
+    dependencies:
+      package-manager-detector: 1.5.0
+      tinyexec: 1.0.2
+
+  '@babel/code-frame@7.28.6':
+    dependencies:
+      '@babel/helper-validator-identifier': 7.28.5
+      js-tokens: 4.0.0
+      picocolors: 1.1.1
+
+  '@babel/code-frame@7.29.7':
+    dependencies:
+      '@babel/helper-validator-identifier': 7.29.7
+      js-tokens: 4.0.0
+      picocolors: 1.1.1
+
+  '@babel/compat-data@7.28.6': {}
+
+  '@babel/compat-data@7.29.7': {}
+
+  '@babel/core@7.28.6':
+    dependencies:
+      '@babel/code-frame': 7.28.6
+      '@babel/generator': 7.28.6
+      '@babel/helper-compilation-targets': 7.28.6
+      '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6)
+      '@babel/helpers': 7.28.6
+      '@babel/parser': 7.29.7
+      '@babel/template': 7.28.6
+      '@babel/traverse': 7.28.6
+      '@babel/types': 7.29.7
+      '@jridgewell/remapping': 2.3.5
+      convert-source-map: 2.0.0
+      debug: 4.4.3
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/core@7.29.7':
+    dependencies:
+      '@babel/code-frame': 7.29.7
+      '@babel/generator': 7.29.7
+      '@babel/helper-compilation-targets': 7.29.7
+      '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
+      '@babel/helpers': 7.29.7
+      '@babel/parser': 7.29.7
+      '@babel/template': 7.29.7
+      '@babel/traverse': 7.29.7
+      '@babel/types': 7.29.7
+      '@jridgewell/remapping': 2.3.5
+      convert-source-map: 2.0.0
+      debug: 4.4.3
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/generator@7.28.6':
+    dependencies:
+      '@babel/parser': 7.29.7
+      '@babel/types': 7.29.7
+      '@jridgewell/gen-mapping': 0.3.13
+      '@jridgewell/trace-mapping': 0.3.31
+      jsesc: 3.1.0
+
+  '@babel/generator@7.29.7':
+    dependencies:
+      '@babel/parser': 7.29.7
+      '@babel/types': 7.29.7
+      '@jridgewell/gen-mapping': 0.3.13
+      '@jridgewell/trace-mapping': 0.3.31
+      jsesc: 3.1.0
+
+  '@babel/helper-annotate-as-pure@7.29.7':
+    dependencies:
+      '@babel/types': 7.29.7
+
+  '@babel/helper-compilation-targets@7.28.6':
+    dependencies:
+      '@babel/compat-data': 7.28.6
+      '@babel/helper-validator-option': 7.27.1
+      browserslist: 4.28.1
+      lru-cache: 5.1.1
+      semver: 6.3.1
+
+  '@babel/helper-compilation-targets@7.29.7':
+    dependencies:
+      '@babel/compat-data': 7.29.7
+      '@babel/helper-validator-option': 7.29.7
+      browserslist: 4.28.1
+      lru-cache: 5.1.1
+      semver: 6.3.1
+
+  '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-annotate-as-pure': 7.29.7
+      '@babel/helper-member-expression-to-functions': 7.29.7
+      '@babel/helper-optimise-call-expression': 7.29.7
+      '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7)
+      '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
+      '@babel/traverse': 7.29.7
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-globals@7.28.0': {}
+
+  '@babel/helper-globals@7.29.7': {}
+
+  '@babel/helper-member-expression-to-functions@7.29.7':
+    dependencies:
+      '@babel/traverse': 7.29.7
+      '@babel/types': 7.29.7
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-imports@7.28.6':
+    dependencies:
+      '@babel/traverse': 7.28.6
+      '@babel/types': 7.29.7
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-imports@7.29.7':
+    dependencies:
+      '@babel/traverse': 7.29.7
+      '@babel/types': 7.29.7
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)':
+    dependencies:
+      '@babel/core': 7.28.6
+      '@babel/helper-module-imports': 7.28.6
+      '@babel/helper-validator-identifier': 7.29.7
+      '@babel/traverse': 7.28.6
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-module-imports': 7.29.7
+      '@babel/helper-validator-identifier': 7.29.7
+      '@babel/traverse': 7.29.7
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-optimise-call-expression@7.29.7':
+    dependencies:
+      '@babel/types': 7.29.7
+
+  '@babel/helper-plugin-utils@7.28.6': {}
+
+  '@babel/helper-plugin-utils@7.29.7': {}
+
+  '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-member-expression-to-functions': 7.29.7
+      '@babel/helper-optimise-call-expression': 7.29.7
+      '@babel/traverse': 7.29.7
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
+    dependencies:
+      '@babel/traverse': 7.29.7
+      '@babel/types': 7.29.7
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-string-parser@7.27.1': {}
+
+  '@babel/helper-string-parser@7.29.7': {}
+
+  '@babel/helper-validator-identifier@7.28.5': {}
+
+  '@babel/helper-validator-identifier@7.29.7': {}
+
+  '@babel/helper-validator-option@7.27.1': {}
+
+  '@babel/helper-validator-option@7.29.7': {}
+
+  '@babel/helpers@7.28.6':
+    dependencies:
+      '@babel/template': 7.28.6
+      '@babel/types': 7.29.7
+
+  '@babel/helpers@7.29.7':
+    dependencies:
+      '@babel/template': 7.29.7
+      '@babel/types': 7.29.7
+
+  '@babel/parser@7.28.6':
+    dependencies:
+      '@babel/types': 7.28.6
+
+  '@babel/parser@7.29.7':
+    dependencies:
+      '@babel/types': 7.29.7
+
+  '@babel/plugin-proposal-decorators@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7)
+      '@babel/helper-plugin-utils': 7.29.7
+      '@babel/plugin-syntax-decorators': 7.29.7(@babel/core@7.29.7)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-syntax-decorators@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-plugin-utils': 7.29.7
+
+  '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.6)':
+    dependencies:
+      '@babel/core': 7.28.6
+      '@babel/helper-plugin-utils': 7.28.6
+
+  '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-plugin-utils': 7.28.6
+
+  '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-plugin-utils': 7.29.7
+
+  '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-plugin-utils': 7.29.7
+
+  '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7)
+      '@babel/helper-plugin-utils': 7.29.7
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
+      '@babel/helper-plugin-utils': 7.29.7
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-annotate-as-pure': 7.29.7
+      '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7)
+      '@babel/helper-plugin-utils': 7.29.7
+      '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
+      '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/helper-plugin-utils': 7.29.7
+      '@babel/helper-validator-option': 7.29.7
+      '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7)
+      '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7)
+      '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/template@7.28.6':
+    dependencies:
+      '@babel/code-frame': 7.28.6
+      '@babel/parser': 7.29.7
+      '@babel/types': 7.29.7
+
+  '@babel/template@7.29.7':
+    dependencies:
+      '@babel/code-frame': 7.29.7
+      '@babel/parser': 7.29.7
+      '@babel/types': 7.29.7
+
+  '@babel/traverse@7.28.6':
+    dependencies:
+      '@babel/code-frame': 7.28.6
+      '@babel/generator': 7.28.6
+      '@babel/helper-globals': 7.28.0
+      '@babel/parser': 7.29.7
+      '@babel/template': 7.28.6
+      '@babel/types': 7.29.7
+      debug: 4.4.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/traverse@7.29.7':
+    dependencies:
+      '@babel/code-frame': 7.29.7
+      '@babel/generator': 7.29.7
+      '@babel/helper-globals': 7.29.7
+      '@babel/parser': 7.29.7
+      '@babel/template': 7.29.7
+      '@babel/types': 7.29.7
+      debug: 4.4.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/types@7.28.6':
+    dependencies:
+      '@babel/helper-string-parser': 7.27.1
+      '@babel/helper-validator-identifier': 7.28.5
+
+  '@babel/types@7.29.7':
+    dependencies:
+      '@babel/helper-string-parser': 7.29.7
+      '@babel/helper-validator-identifier': 7.29.7
+
+  '@bufbuild/protobuf@2.10.0': {}
+
+  '@cacheable/memory@2.0.9':
+    dependencies:
+      '@cacheable/utils': 2.4.1
+      '@keyv/bigmap': 1.3.1(keyv@5.6.0)
+      hookified: 1.15.1
+      keyv: 5.6.0
+
+  '@cacheable/utils@2.4.1':
+    dependencies:
+      hashery: 1.5.1
+      keyv: 5.6.0
+
+  '@codemirror/autocomplete@6.20.0':
+    dependencies:
+      '@codemirror/language': 6.12.1
+      '@codemirror/state': 6.5.4
+      '@codemirror/view': 6.39.12
+      '@lezer/common': 1.5.0
+
+  '@codemirror/commands@6.10.1':
+    dependencies:
+      '@codemirror/language': 6.12.1
+      '@codemirror/state': 6.5.4
+      '@codemirror/view': 6.39.12
+      '@lezer/common': 1.5.0
+
+  '@codemirror/lang-css@6.3.1':
+    dependencies:
+      '@codemirror/autocomplete': 6.20.0
+      '@codemirror/language': 6.12.1
+      '@codemirror/state': 6.5.4
+      '@lezer/common': 1.5.0
+      '@lezer/css': 1.3.0
+
+  '@codemirror/lang-html@6.4.11':
+    dependencies:
+      '@codemirror/autocomplete': 6.20.0
+      '@codemirror/lang-css': 6.3.1
+      '@codemirror/lang-javascript': 6.2.4
+      '@codemirror/language': 6.12.1
+      '@codemirror/state': 6.5.4
+      '@codemirror/view': 6.39.12
+      '@lezer/common': 1.5.0
+      '@lezer/css': 1.3.0
+      '@lezer/html': 1.3.13
+
+  '@codemirror/lang-java@6.0.2':
+    dependencies:
+      '@codemirror/language': 6.12.1
+      '@lezer/java': 1.1.3
+
+  '@codemirror/lang-javascript@6.2.4':
+    dependencies:
+      '@codemirror/autocomplete': 6.20.0
+      '@codemirror/language': 6.12.1
+      '@codemirror/lint': 6.9.3
+      '@codemirror/state': 6.5.4
+      '@codemirror/view': 6.39.12
+      '@lezer/common': 1.5.0
+      '@lezer/javascript': 1.5.4
+
+  '@codemirror/lang-json@6.0.2':
+    dependencies:
+      '@codemirror/language': 6.12.1
+      '@lezer/json': 1.0.3
+
+  '@codemirror/lang-python@6.2.1':
+    dependencies:
+      '@codemirror/autocomplete': 6.20.0
+      '@codemirror/language': 6.12.1
+      '@codemirror/state': 6.5.4
+      '@lezer/common': 1.5.0
+      '@lezer/python': 1.1.18
+
+  '@codemirror/lang-sql@6.10.0':
+    dependencies:
+      '@codemirror/autocomplete': 6.20.0
+      '@codemirror/language': 6.12.1
+      '@codemirror/state': 6.5.4
+      '@lezer/common': 1.5.0
+      '@lezer/highlight': 1.2.3
+      '@lezer/lr': 1.4.8
+
+  '@codemirror/lang-vue@0.1.3':
+    dependencies:
+      '@codemirror/lang-html': 6.4.11
+      '@codemirror/lang-javascript': 6.2.4
+      '@codemirror/language': 6.12.1
+      '@lezer/common': 1.5.0
+      '@lezer/highlight': 1.2.3
+      '@lezer/lr': 1.4.8
+
+  '@codemirror/language@6.12.1':
+    dependencies:
+      '@codemirror/state': 6.5.4
+      '@codemirror/view': 6.39.12
+      '@lezer/common': 1.5.0
+      '@lezer/highlight': 1.2.3
+      '@lezer/lr': 1.4.8
+      style-mod: 4.1.3
+
+  '@codemirror/lint@6.9.3':
+    dependencies:
+      '@codemirror/state': 6.5.4
+      '@codemirror/view': 6.39.12
+      crelt: 1.0.6
+
+  '@codemirror/search@6.6.0':
+    dependencies:
+      '@codemirror/state': 6.5.4
+      '@codemirror/view': 6.39.12
+      crelt: 1.0.6
+
+  '@codemirror/state@6.5.4':
+    dependencies:
+      '@marijn/find-cluster-break': 1.0.2
+
+  '@codemirror/theme-one-dark@6.1.3':
+    dependencies:
+      '@codemirror/language': 6.12.1
+      '@codemirror/state': 6.5.4
+      '@codemirror/view': 6.39.12
+      '@lezer/highlight': 1.2.3
+
+  '@codemirror/view@6.39.12':
+    dependencies:
+      '@codemirror/state': 6.5.4
+      crelt: 1.0.6
+      style-mod: 4.1.3
+      w3c-keyname: 2.2.8
+
+  '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
+    dependencies:
+      '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
+      '@csstools/css-tokenizer': 4.0.0
+
+  '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)':
+    dependencies:
+      '@csstools/css-tokenizer': 4.0.0
+
+  '@csstools/css-syntax-patches-for-csstree@1.1.5(css-tree@3.2.1)':
+    optionalDependencies:
+      css-tree: 3.2.1
+
+  '@csstools/css-tokenizer@4.0.0': {}
+
+  '@csstools/media-query-list-parser@5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
+    dependencies:
+      '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
+      '@csstools/css-tokenizer': 4.0.0
+
+  '@csstools/selector-resolve-nested@4.0.0(postcss-selector-parser@7.1.4)':
+    dependencies:
+      postcss-selector-parser: 7.1.4
+
+  '@csstools/selector-specificity@6.0.0(postcss-selector-parser@7.1.4)':
+    dependencies:
+      postcss-selector-parser: 7.1.4
+
+  '@ctrl/tinycolor@4.2.0': {}
+
+  '@element-plus/icons-vue@2.3.2(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      vue: 3.5.38(typescript@5.8.3)
+
+  '@emnapi/core@1.10.0':
+    dependencies:
+      '@emnapi/wasi-threads': 1.2.1
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/core@1.7.0':
+    dependencies:
+      '@emnapi/wasi-threads': 1.1.0
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/runtime@1.10.0':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/runtime@1.7.0':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/wasi-threads@1.1.0':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/wasi-threads@1.2.1':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@eslint-community/eslint-utils@4.9.1(eslint@10.5.0(jiti@2.7.0))':
+    dependencies:
+      eslint: 10.5.0(jiti@2.7.0)
+      eslint-visitor-keys: 3.4.3
+
+  '@eslint-community/regexpp@4.12.2': {}
+
+  '@eslint/config-array@0.23.5':
+    dependencies:
+      '@eslint/object-schema': 3.0.5
+      debug: 4.4.3
+      minimatch: 10.2.5
+    transitivePeerDependencies:
+      - supports-color
+
+  '@eslint/config-helpers@0.6.0':
+    dependencies:
+      '@eslint/core': 1.2.1
+
+  '@eslint/core@1.2.1':
+    dependencies:
+      '@types/json-schema': 7.0.15
+
+  '@eslint/js@10.0.1(eslint@10.5.0(jiti@2.7.0))':
+    optionalDependencies:
+      eslint: 10.5.0(jiti@2.7.0)
+
+  '@eslint/object-schema@3.0.5': {}
+
+  '@eslint/plugin-kit@0.7.2':
+    dependencies:
+      '@eslint/core': 1.2.1
+      levn: 0.4.1
+
+  '@floating-ui/core@1.7.3':
+    dependencies:
+      '@floating-ui/utils': 0.2.10
+
+  '@floating-ui/dom@1.7.4':
+    dependencies:
+      '@floating-ui/core': 1.7.3
+      '@floating-ui/utils': 0.2.10
+
+  '@floating-ui/utils@0.2.10': {}
+
+  '@humanfs/core@0.19.2':
+    dependencies:
+      '@humanfs/types': 0.15.0
+
+  '@humanfs/node@0.16.8':
+    dependencies:
+      '@humanfs/core': 0.19.2
+      '@humanfs/types': 0.15.0
+      '@humanwhocodes/retry': 0.4.3
+
+  '@humanfs/types@0.15.0': {}
+
+  '@humanwhocodes/module-importer@1.0.1': {}
+
+  '@humanwhocodes/retry@0.4.3': {}
+
+  '@iconify-json/ep@1.2.4':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify-json/line-md@1.2.14':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify-json/mingcute@1.2.7':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify-json/svg-spinners@1.2.4':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify-json/tabler@1.2.26':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify/types@2.0.0': {}
+
+  '@iconify/utils@3.1.0':
+    dependencies:
+      '@antfu/install-pkg': 1.1.0
+      '@iconify/types': 2.0.0
+      mlly: 1.8.0
+
+  '@iconify/vue@5.0.1(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      '@iconify/types': 2.0.0
+      vue: 3.5.38(typescript@5.8.3)
+
+  '@jridgewell/gen-mapping@0.3.13':
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.5
+      '@jridgewell/trace-mapping': 0.3.31
+
+  '@jridgewell/remapping@2.3.5':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.13
+      '@jridgewell/trace-mapping': 0.3.31
+
+  '@jridgewell/resolve-uri@3.1.2': {}
+
+  '@jridgewell/source-map@0.3.11':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.13
+      '@jridgewell/trace-mapping': 0.3.31
+
+  '@jridgewell/sourcemap-codec@1.5.5': {}
+
+  '@jridgewell/trace-mapping@0.3.31':
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.2
+      '@jridgewell/sourcemap-codec': 1.5.5
+
+  '@json-render/codegen@0.19.0(zod@4.4.3)':
+    dependencies:
+      '@json-render/core': 0.19.0(zod@4.4.3)
+    transitivePeerDependencies:
+      - zod
+
+  '@json-render/core@0.19.0(zod@4.4.3)':
+    dependencies:
+      zod: 4.4.3
+
+  '@json-render/devtools@0.19.0(zod@4.4.3)':
+    dependencies:
+      '@json-render/core': 0.19.0(zod@4.4.3)
+    transitivePeerDependencies:
+      - zod
+
+  '@json-render/vue@0.19.0(vue@3.5.38(typescript@5.8.3))(zod@4.4.3)':
+    dependencies:
+      '@json-render/core': 0.19.0(zod@4.4.3)
+      vue: 3.5.38(typescript@5.8.3)
+      zod: 4.4.3
+
+  '@json-render/yaml@0.19.0(zod@4.4.3)':
+    dependencies:
+      '@json-render/core': 0.19.0(zod@4.4.3)
+      diff: 8.0.4
+      yaml: 2.9.0
+    transitivePeerDependencies:
+      - zod
+
+  '@keyv/bigmap@1.3.1(keyv@5.6.0)':
+    dependencies:
+      hashery: 1.5.1
+      hookified: 1.15.1
+      keyv: 5.6.0
+
+  '@keyv/serialize@1.1.1': {}
+
+  '@lezer/common@1.5.0': {}
+
+  '@lezer/css@1.3.0':
+    dependencies:
+      '@lezer/common': 1.5.0
+      '@lezer/highlight': 1.2.3
+      '@lezer/lr': 1.4.8
+
+  '@lezer/highlight@1.2.3':
+    dependencies:
+      '@lezer/common': 1.5.0
+
+  '@lezer/html@1.3.13':
+    dependencies:
+      '@lezer/common': 1.5.0
+      '@lezer/highlight': 1.2.3
+      '@lezer/lr': 1.4.8
+
+  '@lezer/java@1.1.3':
+    dependencies:
+      '@lezer/common': 1.5.0
+      '@lezer/highlight': 1.2.3
+      '@lezer/lr': 1.4.8
+
+  '@lezer/javascript@1.5.4':
+    dependencies:
+      '@lezer/common': 1.5.0
+      '@lezer/highlight': 1.2.3
+      '@lezer/lr': 1.4.8
+
+  '@lezer/json@1.0.3':
+    dependencies:
+      '@lezer/common': 1.5.0
+      '@lezer/highlight': 1.2.3
+      '@lezer/lr': 1.4.8
+
+  '@lezer/lr@1.4.8':
+    dependencies:
+      '@lezer/common': 1.5.0
+
+  '@lezer/python@1.1.18':
+    dependencies:
+      '@lezer/common': 1.5.0
+      '@lezer/highlight': 1.2.3
+      '@lezer/lr': 1.4.8
+
+  '@marijn/find-cluster-break@1.0.2': {}
+
+  '@napi-rs/image-android-arm64@1.11.2':
+    optional: true
+
+  '@napi-rs/image-darwin-arm64@1.11.2':
+    optional: true
+
+  '@napi-rs/image-darwin-x64@1.11.2':
+    optional: true
+
+  '@napi-rs/image-freebsd-x64@1.11.2':
+    optional: true
+
+  '@napi-rs/image-linux-arm-gnueabihf@1.11.2':
+    optional: true
+
+  '@napi-rs/image-linux-arm64-gnu@1.11.2':
+    optional: true
+
+  '@napi-rs/image-linux-arm64-musl@1.11.2':
+    optional: true
+
+  '@napi-rs/image-linux-x64-gnu@1.11.2':
+    optional: true
+
+  '@napi-rs/image-linux-x64-musl@1.11.2':
+    optional: true
+
+  '@napi-rs/image-wasm32-wasi@1.11.2':
+    dependencies:
+      '@napi-rs/wasm-runtime': 1.0.7
+    optional: true
+
+  '@napi-rs/image-win32-arm64-msvc@1.11.2':
+    optional: true
+
+  '@napi-rs/image-win32-ia32-msvc@1.11.2':
+    optional: true
+
+  '@napi-rs/image-win32-x64-msvc@1.11.2':
+    optional: true
+
+  '@napi-rs/image@1.11.2':
+    optionalDependencies:
+      '@napi-rs/image-android-arm64': 1.11.2
+      '@napi-rs/image-darwin-arm64': 1.11.2
+      '@napi-rs/image-darwin-x64': 1.11.2
+      '@napi-rs/image-freebsd-x64': 1.11.2
+      '@napi-rs/image-linux-arm-gnueabihf': 1.11.2
+      '@napi-rs/image-linux-arm64-gnu': 1.11.2
+      '@napi-rs/image-linux-arm64-musl': 1.11.2
+      '@napi-rs/image-linux-x64-gnu': 1.11.2
+      '@napi-rs/image-linux-x64-musl': 1.11.2
+      '@napi-rs/image-wasm32-wasi': 1.11.2
+      '@napi-rs/image-win32-arm64-msvc': 1.11.2
+      '@napi-rs/image-win32-ia32-msvc': 1.11.2
+      '@napi-rs/image-win32-x64-msvc': 1.11.2
+
+  '@napi-rs/wasm-runtime@1.0.7':
+    dependencies:
+      '@emnapi/core': 1.7.0
+      '@emnapi/runtime': 1.7.0
+      '@tybys/wasm-util': 0.10.1
+    optional: true
+
+  '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)':
+    dependencies:
+      '@emnapi/core': 1.10.0
+      '@emnapi/runtime': 1.10.0
+      '@tybys/wasm-util': 0.10.1
+    optional: true
+
+  '@nodelib/fs.scandir@2.1.5':
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+
+  '@nodelib/fs.stat@2.0.5': {}
+
+  '@nodelib/fs.walk@1.2.8':
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.20.1
+
+  '@parcel/watcher-android-arm64@2.5.1':
+    optional: true
+
+  '@parcel/watcher-darwin-arm64@2.5.1':
+    optional: true
+
+  '@parcel/watcher-darwin-x64@2.5.1':
+    optional: true
+
+  '@parcel/watcher-freebsd-x64@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-arm-glibc@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-arm-musl@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-arm64-glibc@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-arm64-musl@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-x64-glibc@2.5.1':
+    optional: true
+
+  '@parcel/watcher-linux-x64-musl@2.5.1':
+    optional: true
+
+  '@parcel/watcher-win32-arm64@2.5.1':
+    optional: true
+
+  '@parcel/watcher-win32-ia32@2.5.1':
+    optional: true
+
+  '@parcel/watcher-win32-x64@2.5.1':
+    optional: true
+
+  '@parcel/watcher@2.5.1':
+    dependencies:
+      detect-libc: 1.0.3
+      is-glob: 4.0.3
+      micromatch: 4.0.8
+      node-addon-api: 7.1.1
+    optionalDependencies:
+      '@parcel/watcher-android-arm64': 2.5.1
+      '@parcel/watcher-darwin-arm64': 2.5.1
+      '@parcel/watcher-darwin-x64': 2.5.1
+      '@parcel/watcher-freebsd-x64': 2.5.1
+      '@parcel/watcher-linux-arm-glibc': 2.5.1
+      '@parcel/watcher-linux-arm-musl': 2.5.1
+      '@parcel/watcher-linux-arm64-glibc': 2.5.1
+      '@parcel/watcher-linux-arm64-musl': 2.5.1
+      '@parcel/watcher-linux-x64-glibc': 2.5.1
+      '@parcel/watcher-linux-x64-musl': 2.5.1
+      '@parcel/watcher-win32-arm64': 2.5.1
+      '@parcel/watcher-win32-ia32': 2.5.1
+      '@parcel/watcher-win32-x64': 2.5.1
+    optional: true
+
+  '@pkgr/core@0.3.6': {}
+
+  '@rollup/rollup-android-arm-eabi@4.53.1':
+    optional: true
+
+  '@rollup/rollup-android-arm64@4.53.1':
+    optional: true
+
+  '@rollup/rollup-darwin-arm64@4.53.1':
+    optional: true
+
+  '@rollup/rollup-darwin-x64@4.53.1':
+    optional: true
+
+  '@rollup/rollup-freebsd-arm64@4.53.1':
+    optional: true
+
+  '@rollup/rollup-freebsd-x64@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-arm-musleabihf@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-gnu@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-musl@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-loong64-gnu@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-ppc64-gnu@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-gnu@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-musl@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-s390x-gnu@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-x64-gnu@4.53.1':
+    optional: true
+
+  '@rollup/rollup-linux-x64-musl@4.53.1':
+    optional: true
+
+  '@rollup/rollup-openharmony-arm64@4.53.1':
+    optional: true
+
+  '@rollup/rollup-win32-arm64-msvc@4.53.1':
+    optional: true
+
+  '@rollup/rollup-win32-ia32-msvc@4.53.1':
+    optional: true
+
+  '@rollup/rollup-win32-x64-gnu@4.53.1':
+    optional: true
+
+  '@rollup/rollup-win32-x64-msvc@4.53.1':
+    optional: true
+
+  '@rsbuild/core@2.0.15(core-js@3.49.0)':
+    dependencies:
+      '@rspack/core': 2.0.8(@swc/helpers@0.5.23)
+      '@swc/helpers': 0.5.23
+    optionalDependencies:
+      core-js: 3.49.0
+    transitivePeerDependencies:
+      - '@module-federation/runtime-tools'
+
+  '@rsbuild/plugin-babel@1.2.1(@rsbuild/core@2.0.15(core-js@3.49.0))':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7)
+      '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7)
+      '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
+      '@types/babel__core': 7.20.5
+      reduce-configs: 1.1.2
+    optionalDependencies:
+      '@rsbuild/core': 2.0.15(core-js@3.49.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@rsbuild/plugin-babel@2.0.0(@rsbuild/core@2.0.15(core-js@3.49.0))':
+    dependencies:
+      '@babel/core': 7.29.7
+      '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7)
+      '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7)
+      '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
+      '@types/babel__core': 7.20.5
+      reduce-configs: 1.1.2
+    optionalDependencies:
+      '@rsbuild/core': 2.0.15(core-js@3.49.0)
+    transitivePeerDependencies:
+      - supports-color
+
+  '@rsbuild/plugin-image-compress@1.3.4(@rsbuild/core@2.0.15(core-js@3.49.0))':
+    dependencies:
+      '@napi-rs/image': 1.11.2
+      svgo: 3.3.3
+    optionalDependencies:
+      '@rsbuild/core': 2.0.15(core-js@3.49.0)
+
+  '@rsbuild/plugin-sass@2.0.0(@rsbuild/core@2.0.15(core-js@3.49.0))':
+    dependencies:
+      deepmerge: 4.3.1
+      loader-utils: 2.0.4
+      postcss: 8.5.15
+      reduce-configs: 2.0.1
+      sass-embedded: 1.100.0
+    optionalDependencies:
+      '@rsbuild/core': 2.0.15(core-js@3.49.0)
+
+  '@rsbuild/plugin-tailwindcss@2.0.3(@rsbuild/core@2.0.15(core-js@3.49.0))(@rspack/core@2.0.8(@swc/helpers@0.5.23))':
+    dependencies:
+      '@tailwindcss/webpack': 4.3.1(@rspack/core@2.0.8(@swc/helpers@0.5.23))
+    optionalDependencies:
+      '@rsbuild/core': 2.0.15(core-js@3.49.0)
+    transitivePeerDependencies:
+      - '@rspack/core'
+      - webpack
+
+  '@rsbuild/plugin-vue-jsx@2.0.1(@babel/core@7.29.7)(@rsbuild/core@2.0.15(core-js@3.49.0))':
+    dependencies:
+      '@rsbuild/plugin-babel': 1.2.1(@rsbuild/core@2.0.15(core-js@3.49.0))
+      '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.7)
+      babel-plugin-vue-jsx-hmr: 1.0.0
+    optionalDependencies:
+      '@rsbuild/core': 2.0.15(core-js@3.49.0)
+    transitivePeerDependencies:
+      - '@babel/core'
+      - supports-color
+
+  '@rsbuild/plugin-vue@2.0.0(@rsbuild/core@2.0.15(core-js@3.49.0))(@rspack/core@2.0.8(@swc/helpers@0.5.23))(@vue/compiler-sfc@3.5.38)(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      rspack-vue-loader: 17.5.1(@rspack/core@2.0.8(@swc/helpers@0.5.23))(@vue/compiler-sfc@3.5.38)(vue@3.5.38(typescript@5.8.3))
+    optionalDependencies:
+      '@rsbuild/core': 2.0.15(core-js@3.49.0)
+    transitivePeerDependencies:
+      - '@rspack/core'
+      - '@vue/compiler-sfc'
+      - vue
+
+  '@rspack/binding-darwin-arm64@2.0.8':
+    optional: true
+
+  '@rspack/binding-darwin-x64@2.0.8':
+    optional: true
+
+  '@rspack/binding-linux-arm64-gnu@2.0.8':
+    optional: true
+
+  '@rspack/binding-linux-arm64-musl@2.0.8':
+    optional: true
+
+  '@rspack/binding-linux-x64-gnu@2.0.8':
+    optional: true
+
+  '@rspack/binding-linux-x64-musl@2.0.8':
+    optional: true
+
+  '@rspack/binding-wasm32-wasi@2.0.8':
+    dependencies:
+      '@emnapi/core': 1.10.0
+      '@emnapi/runtime': 1.10.0
+      '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)
+    optional: true
+
+  '@rspack/binding-win32-arm64-msvc@2.0.8':
+    optional: true
+
+  '@rspack/binding-win32-ia32-msvc@2.0.8':
+    optional: true
+
+  '@rspack/binding-win32-x64-msvc@2.0.8':
+    optional: true
+
+  '@rspack/binding@2.0.8':
+    optionalDependencies:
+      '@rspack/binding-darwin-arm64': 2.0.8
+      '@rspack/binding-darwin-x64': 2.0.8
+      '@rspack/binding-linux-arm64-gnu': 2.0.8
+      '@rspack/binding-linux-arm64-musl': 2.0.8
+      '@rspack/binding-linux-x64-gnu': 2.0.8
+      '@rspack/binding-linux-x64-musl': 2.0.8
+      '@rspack/binding-wasm32-wasi': 2.0.8
+      '@rspack/binding-win32-arm64-msvc': 2.0.8
+      '@rspack/binding-win32-ia32-msvc': 2.0.8
+      '@rspack/binding-win32-x64-msvc': 2.0.8
+
+  '@rspack/core@2.0.8(@swc/helpers@0.5.23)':
+    dependencies:
+      '@rspack/binding': 2.0.8
+    optionalDependencies:
+      '@swc/helpers': 0.5.23
+
+  '@rspack/lite-tapable@1.1.0': {}
+
+  '@sindresorhus/merge-streams@4.0.0': {}
+
+  '@standard-schema/spec@1.1.0': {}
+
+  '@swc/helpers@0.5.23':
+    dependencies:
+      tslib: 2.8.1
+
+  '@sxzz/popperjs-es@2.11.8': {}
+
+  '@tailwindcss/node@4.3.1':
+    dependencies:
+      '@jridgewell/remapping': 2.3.5
+      enhanced-resolve: 5.21.6
+      jiti: 2.7.0
+      lightningcss: 1.32.0
+      magic-string: 0.30.21
+      source-map-js: 1.2.1
+      tailwindcss: 4.3.1
+
+  '@tailwindcss/oxide-android-arm64@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-darwin-arm64@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-darwin-x64@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-freebsd-x64@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-linux-arm64-musl@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-linux-x64-gnu@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-linux-x64-musl@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-wasm32-wasi@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide-win32-x64-msvc@4.3.1':
+    optional: true
+
+  '@tailwindcss/oxide@4.3.1':
+    optionalDependencies:
+      '@tailwindcss/oxide-android-arm64': 4.3.1
+      '@tailwindcss/oxide-darwin-arm64': 4.3.1
+      '@tailwindcss/oxide-darwin-x64': 4.3.1
+      '@tailwindcss/oxide-freebsd-x64': 4.3.1
+      '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.1
+      '@tailwindcss/oxide-linux-arm64-gnu': 4.3.1
+      '@tailwindcss/oxide-linux-arm64-musl': 4.3.1
+      '@tailwindcss/oxide-linux-x64-gnu': 4.3.1
+      '@tailwindcss/oxide-linux-x64-musl': 4.3.1
+      '@tailwindcss/oxide-wasm32-wasi': 4.3.1
+      '@tailwindcss/oxide-win32-arm64-msvc': 4.3.1
+      '@tailwindcss/oxide-win32-x64-msvc': 4.3.1
+
+  '@tailwindcss/webpack@4.3.1(@rspack/core@2.0.8(@swc/helpers@0.5.23))':
+    dependencies:
+      '@alloc/quick-lru': 5.2.0
+      '@tailwindcss/node': 4.3.1
+      '@tailwindcss/oxide': 4.3.1
+      tailwindcss: 4.3.1
+    optionalDependencies:
+      '@rspack/core': 2.0.8(@swc/helpers@0.5.23)
+
+  '@tybys/wasm-util@0.10.1':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@types/babel__core@7.20.5':
+    dependencies:
+      '@babel/parser': 7.29.7
+      '@babel/types': 7.29.7
+      '@types/babel__generator': 7.27.0
+      '@types/babel__template': 7.4.4
+      '@types/babel__traverse': 7.28.0
+
+  '@types/babel__generator@7.27.0':
+    dependencies:
+      '@babel/types': 7.29.7
+
+  '@types/babel__template@7.4.4':
+    dependencies:
+      '@babel/parser': 7.29.7
+      '@babel/types': 7.29.7
+
+  '@types/babel__traverse@7.28.0':
+    dependencies:
+      '@babel/types': 7.29.7
+
+  '@types/dagre@0.7.53': {}
+
+  '@types/eslint@9.6.1':
+    dependencies:
+      '@types/estree': 1.0.8
+      '@types/json-schema': 7.0.15
+    optional: true
+
+  '@types/esrecurse@4.3.1': {}
+
+  '@types/estree@1.0.8': {}
+
+  '@types/json-schema@7.0.15': {}
+
+  '@types/lodash-es@4.17.12':
+    dependencies:
+      '@types/lodash': 4.17.24
+
+  '@types/lodash@4.17.24': {}
+
+  '@types/node@22.19.7':
+    dependencies:
+      undici-types: 6.21.0
+
+  '@types/web-bluetooth@0.0.20': {}
+
+  '@types/web-bluetooth@0.0.21': {}
+
+  '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3))(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)':
+    dependencies:
+      '@eslint-community/regexpp': 4.12.2
+      '@typescript-eslint/parser': 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      '@typescript-eslint/scope-manager': 8.62.0
+      '@typescript-eslint/type-utils': 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      '@typescript-eslint/visitor-keys': 8.62.0
+      eslint: 10.5.0(jiti@2.7.0)
+      ignore: 7.0.5
+      natural-compare: 1.4.0
+      ts-api-utils: 2.5.0(typescript@5.8.3)
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)':
+    dependencies:
+      '@typescript-eslint/scope-manager': 8.62.0
+      '@typescript-eslint/types': 8.62.0
+      '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.8.3)
+      '@typescript-eslint/visitor-keys': 8.62.0
+      debug: 4.4.3
+      eslint: 10.5.0(jiti@2.7.0)
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/project-service@8.62.0(typescript@5.8.3)':
+    dependencies:
+      '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@5.8.3)
+      '@typescript-eslint/types': 8.62.0
+      debug: 4.4.3
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/scope-manager@8.62.0':
+    dependencies:
+      '@typescript-eslint/types': 8.62.0
+      '@typescript-eslint/visitor-keys': 8.62.0
+
+  '@typescript-eslint/tsconfig-utils@8.62.0(typescript@5.8.3)':
+    dependencies:
+      typescript: 5.8.3
+
+  '@typescript-eslint/type-utils@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)':
+    dependencies:
+      '@typescript-eslint/types': 8.62.0
+      '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      debug: 4.4.3
+      eslint: 10.5.0(jiti@2.7.0)
+      ts-api-utils: 2.5.0(typescript@5.8.3)
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/types@8.62.0': {}
+
+  '@typescript-eslint/typescript-estree@8.62.0(typescript@5.8.3)':
+    dependencies:
+      '@typescript-eslint/project-service': 8.62.0(typescript@5.8.3)
+      '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@5.8.3)
+      '@typescript-eslint/types': 8.62.0
+      '@typescript-eslint/visitor-keys': 8.62.0
+      debug: 4.4.3
+      minimatch: 10.2.5
+      semver: 7.8.5
+      tinyglobby: 0.2.15
+      ts-api-utils: 2.5.0(typescript@5.8.3)
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/utils@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)':
+    dependencies:
+      '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0(jiti@2.7.0))
+      '@typescript-eslint/scope-manager': 8.62.0
+      '@typescript-eslint/types': 8.62.0
+      '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.8.3)
+      eslint: 10.5.0(jiti@2.7.0)
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/visitor-keys@8.62.0':
+    dependencies:
+      '@typescript-eslint/types': 8.62.0
+      eslint-visitor-keys: 5.0.1
+
+  '@vercel/oidc@3.2.0': {}
+
+  '@volar/language-core@2.4.28':
+    dependencies:
+      '@volar/source-map': 2.4.28
+
+  '@volar/source-map@2.4.28': {}
+
+  '@volar/typescript@2.4.28':
+    dependencies:
+      '@volar/language-core': 2.4.28
+      path-browserify: 1.0.1
+      vscode-uri: 3.1.0
+
+  '@vue-flow/background@1.3.2(@vue-flow/core@1.48.1(vue@3.5.38(typescript@5.8.3)))(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      '@vue-flow/core': 1.48.1(vue@3.5.38(typescript@5.8.3))
+      vue: 3.5.38(typescript@5.8.3)
+
+  '@vue-flow/core@1.48.1(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      '@vueuse/core': 10.11.1(vue@3.5.38(typescript@5.8.3))
+      d3-drag: 3.0.0
+      d3-interpolate: 3.0.1
+      d3-selection: 3.0.0
+      d3-zoom: 3.0.0
+      vue: 3.5.38(typescript@5.8.3)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+
+  '@vue-flow/minimap@1.5.4(@vue-flow/core@1.48.1(vue@3.5.38(typescript@5.8.3)))(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      '@vue-flow/core': 1.48.1(vue@3.5.38(typescript@5.8.3))
+      d3-selection: 3.0.0
+      d3-zoom: 3.0.0
+      vue: 3.5.38(typescript@5.8.3)
+
+  '@vue-flow/node-resizer@1.5.0(@vue-flow/core@1.48.1(vue@3.5.38(typescript@5.8.3)))(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      '@vue-flow/core': 1.48.1(vue@3.5.38(typescript@5.8.3))
+      d3-drag: 3.0.0
+      d3-selection: 3.0.0
+      vue: 3.5.38(typescript@5.8.3)
+
+  '@vue/babel-helper-vue-transform-on@1.5.0': {}
+
+  '@vue/babel-helper-vue-transform-on@2.0.1': {}
+
+  '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.6)':
+    dependencies:
+      '@babel/helper-module-imports': 7.28.6
+      '@babel/helper-plugin-utils': 7.28.6
+      '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.6)
+      '@babel/template': 7.28.6
+      '@babel/traverse': 7.28.6
+      '@babel/types': 7.29.7
+      '@vue/babel-helper-vue-transform-on': 1.5.0
+      '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.6)
+      '@vue/shared': 3.5.38
+    optionalDependencies:
+      '@babel/core': 7.28.6
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/helper-module-imports': 7.28.6
+      '@babel/helper-plugin-utils': 7.28.6
+      '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.7)
+      '@babel/template': 7.28.6
+      '@babel/traverse': 7.28.6
+      '@babel/types': 7.29.7
+      '@vue/babel-helper-vue-transform-on': 2.0.1
+      '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.7)
+      '@vue/shared': 3.5.38
+    optionalDependencies:
+      '@babel/core': 7.29.7
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.6)':
+    dependencies:
+      '@babel/code-frame': 7.28.6
+      '@babel/core': 7.28.6
+      '@babel/helper-module-imports': 7.28.6
+      '@babel/helper-plugin-utils': 7.28.6
+      '@babel/parser': 7.29.7
+      '@vue/compiler-sfc': 3.5.38
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.7)':
+    dependencies:
+      '@babel/code-frame': 7.28.6
+      '@babel/core': 7.29.7
+      '@babel/helper-module-imports': 7.28.6
+      '@babel/helper-plugin-utils': 7.28.6
+      '@babel/parser': 7.29.7
+      '@vue/compiler-sfc': 3.5.38
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/compiler-core@3.5.27':
+    dependencies:
+      '@babel/parser': 7.28.6
+      '@vue/shared': 3.5.27
+      entities: 7.0.1
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
+  '@vue/compiler-core@3.5.38':
+    dependencies:
+      '@babel/parser': 7.29.7
+      '@vue/shared': 3.5.38
+      entities: 7.0.1
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
+  '@vue/compiler-dom@3.5.27':
+    dependencies:
+      '@vue/compiler-core': 3.5.27
+      '@vue/shared': 3.5.27
+
+  '@vue/compiler-dom@3.5.38':
+    dependencies:
+      '@vue/compiler-core': 3.5.38
+      '@vue/shared': 3.5.38
+
+  '@vue/compiler-sfc@3.5.38':
+    dependencies:
+      '@babel/parser': 7.29.7
+      '@vue/compiler-core': 3.5.38
+      '@vue/compiler-dom': 3.5.38
+      '@vue/compiler-ssr': 3.5.38
+      '@vue/shared': 3.5.38
+      estree-walker: 2.0.2
+      magic-string: 0.30.21
+      postcss: 8.5.15
+      source-map-js: 1.2.1
+
+  '@vue/compiler-ssr@3.5.38':
+    dependencies:
+      '@vue/compiler-dom': 3.5.38
+      '@vue/shared': 3.5.38
+
+  '@vue/devtools-api@6.6.4': {}
+
+  '@vue/devtools-api@7.7.7':
+    dependencies:
+      '@vue/devtools-kit': 7.7.7
+
+  '@vue/devtools-kit@7.7.7':
+    dependencies:
+      '@vue/devtools-shared': 7.7.7
+      birpc: 2.8.0
+      hookable: 5.5.3
+      mitt: 3.0.1
+      perfect-debounce: 1.0.0
+      speakingurl: 14.0.1
+      superjson: 2.2.5
+
+  '@vue/devtools-shared@7.7.7':
+    dependencies:
+      rfdc: 1.4.1
+
+  '@vue/eslint-config-prettier@10.2.0(@types/eslint@9.6.1)(eslint@10.5.0(jiti@2.7.0))(prettier@3.8.4)':
+    dependencies:
+      eslint: 10.5.0(jiti@2.7.0)
+      eslint-config-prettier: 10.1.8(eslint@10.5.0(jiti@2.7.0))
+      eslint-plugin-prettier: 5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.5.0(jiti@2.7.0)))(eslint@10.5.0(jiti@2.7.0))(prettier@3.8.4)
+      prettier: 3.8.4
+    transitivePeerDependencies:
+      - '@types/eslint'
+
+  '@vue/eslint-config-typescript@14.9.0(eslint-plugin-vue@10.9.2(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3))(eslint@10.5.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.5.0(jiti@2.7.0))))(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)':
+    dependencies:
+      '@typescript-eslint/utils': 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      eslint: 10.5.0(jiti@2.7.0)
+      eslint-plugin-vue: 10.9.2(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3))(eslint@10.5.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.5.0(jiti@2.7.0)))
+      fast-glob: 3.3.3
+      typescript-eslint: 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      vue-eslint-parser: 10.4.1(eslint@10.5.0(jiti@2.7.0))
+    optionalDependencies:
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/language-core@3.3.5':
+    dependencies:
+      '@volar/language-core': 2.4.28
+      '@vue/compiler-dom': 3.5.27
+      '@vue/shared': 3.5.27
+      alien-signals: 3.2.1
+      muggle-string: 0.4.1
+      path-browserify: 1.0.1
+      picomatch: 4.0.4
+
+  '@vue/reactivity@3.5.38':
+    dependencies:
+      '@vue/shared': 3.5.38
+
+  '@vue/runtime-core@3.5.38':
+    dependencies:
+      '@vue/reactivity': 3.5.38
+      '@vue/shared': 3.5.38
+
+  '@vue/runtime-dom@3.5.38':
+    dependencies:
+      '@vue/reactivity': 3.5.38
+      '@vue/runtime-core': 3.5.38
+      '@vue/shared': 3.5.38
+      csstype: 3.2.3
+
+  '@vue/server-renderer@3.5.38(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      '@vue/compiler-ssr': 3.5.38
+      '@vue/shared': 3.5.38
+      vue: 3.5.38(typescript@5.8.3)
+
+  '@vue/shared@3.5.27': {}
+
+  '@vue/shared@3.5.38': {}
+
+  '@vue/tsconfig@0.7.0(typescript@5.8.3)(vue@3.5.38(typescript@5.8.3))':
+    optionalDependencies:
+      typescript: 5.8.3
+      vue: 3.5.38(typescript@5.8.3)
+
+  '@vueuse/core@10.11.1(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      '@types/web-bluetooth': 0.0.20
+      '@vueuse/metadata': 10.11.1
+      '@vueuse/shared': 10.11.1(vue@3.5.38(typescript@5.8.3))
+      vue-demi: 0.14.10(vue@3.5.38(typescript@5.8.3))
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  '@vueuse/core@13.9.0(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      '@types/web-bluetooth': 0.0.21
+      '@vueuse/metadata': 13.9.0
+      '@vueuse/shared': 13.9.0(vue@3.5.38(typescript@5.8.3))
+      vue: 3.5.38(typescript@5.8.3)
+
+  '@vueuse/core@14.3.0(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      '@types/web-bluetooth': 0.0.21
+      '@vueuse/metadata': 14.3.0
+      '@vueuse/shared': 14.3.0(vue@3.5.38(typescript@5.8.3))
+      vue: 3.5.38(typescript@5.8.3)
+
+  '@vueuse/metadata@10.11.1': {}
+
+  '@vueuse/metadata@13.9.0': {}
+
+  '@vueuse/metadata@14.3.0': {}
+
+  '@vueuse/shared@10.11.1(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      vue-demi: 0.14.10(vue@3.5.38(typescript@5.8.3))
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  '@vueuse/shared@13.9.0(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      vue: 3.5.38(typescript@5.8.3)
+
+  '@vueuse/shared@14.3.0(vue@3.5.38(typescript@5.8.3))':
+    dependencies:
+      vue: 3.5.38(typescript@5.8.3)
+
+  acorn-jsx@5.3.2(acorn@8.17.0):
+    dependencies:
+      acorn: 8.17.0
+
+  acorn@8.15.0: {}
+
+  acorn@8.17.0: {}
+
+  ai@7.0.0-beta.62(zod@4.4.3):
+    dependencies:
+      '@ai-sdk/gateway': 4.0.0-beta.32(zod@4.4.3)
+      '@ai-sdk/provider': 4.0.0-beta.6
+      '@ai-sdk/provider-utils': 5.0.0-beta.10(zod@4.4.3)
+      zod: 4.4.3
+
+  ajv@6.15.0:
+    dependencies:
+      fast-deep-equal: 3.1.3
+      fast-json-stable-stringify: 2.1.0
+      json-schema-traverse: 0.4.1
+      uri-js: 4.4.1
+
+  ajv@8.17.1:
+    dependencies:
+      fast-deep-equal: 3.1.3
+      fast-uri: 3.1.0
+      json-schema-traverse: 1.0.0
+      require-from-string: 2.0.2
+
+  alien-signals@3.2.1: {}
+
+  ansi-regex@5.0.1: {}
+
+  ansi-regex@6.2.2: {}
+
+  ansi-styles@4.3.0:
+    dependencies:
+      color-convert: 2.0.1
+
+  argparse@2.0.1: {}
+
+  astral-regex@2.0.0: {}
+
+  async-validator@4.2.5: {}
+
+  babel-plugin-vue-jsx-hmr@1.0.0:
+    dependencies:
+      '@babel/core': 7.28.6
+      '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.6)
+    transitivePeerDependencies:
+      - supports-color
+
+  balanced-match@4.0.4: {}
+
+  baseline-browser-mapping@2.9.19: {}
+
+  big.js@5.2.2: {}
+
+  birpc@2.8.0: {}
+
+  boolbase@1.0.0: {}
+
+  brace-expansion@5.0.6:
+    dependencies:
+      balanced-match: 4.0.4
+
+  braces@3.0.3:
+    dependencies:
+      fill-range: 7.1.1
+
+  browserslist@4.28.1:
+    dependencies:
+      baseline-browser-mapping: 2.9.19
+      caniuse-lite: 1.0.30001766
+      electron-to-chromium: 1.5.279
+      node-releases: 2.0.27
+      update-browserslist-db: 1.2.3(browserslist@4.28.1)
+
+  buffer-from@1.1.2: {}
+
+  cacheable@2.3.5:
+    dependencies:
+      '@cacheable/memory': 2.0.9
+      '@cacheable/utils': 2.4.1
+      hookified: 1.15.1
+      keyv: 5.6.0
+      qified: 0.10.1
+
+  callsites@3.1.0: {}
+
+  caniuse-lite@1.0.30001766: {}
+
+  chalk@4.1.2:
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
+  chokidar@5.0.0:
+    dependencies:
+      readdirp: 5.0.0
+
+  cliui@8.0.1:
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 7.0.0
+
+  codemirror@6.0.2:
+    dependencies:
+      '@codemirror/autocomplete': 6.20.0
+      '@codemirror/commands': 6.10.1
+      '@codemirror/language': 6.12.1
+      '@codemirror/lint': 6.9.3
+      '@codemirror/search': 6.6.0
+      '@codemirror/state': 6.5.4
+      '@codemirror/view': 6.39.12
+
+  color-convert@2.0.1:
+    dependencies:
+      color-name: 1.1.4
+
+  color-name@1.1.4: {}
+
+  colord@2.9.3: {}
+
+  colorjs.io@0.5.2: {}
+
+  commander@2.20.3: {}
+
+  commander@7.2.0: {}
+
+  confbox@0.1.8: {}
+
+  confbox@0.2.2: {}
+
+  convert-source-map@2.0.0: {}
+
+  copy-anything@4.0.5:
+    dependencies:
+      is-what: 5.5.0
+
+  core-js@3.49.0: {}
+
+  cosmiconfig@9.0.2(typescript@5.8.3):
+    dependencies:
+      env-paths: 2.2.1
+      import-fresh: 3.3.1
+      js-yaml: 4.2.0
+      parse-json: 5.2.0
+    optionalDependencies:
+      typescript: 5.8.3
+
+  countup.js@2.9.0: {}
+
+  crelt@1.0.6: {}
+
+  cross-spawn@7.0.6:
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
+  crypto-js@4.2.0: {}
+
+  css-declaration-sorter@7.4.0(postcss@8.5.14):
+    dependencies:
+      postcss: 8.5.14
+
+  css-functions-list@3.3.3: {}
+
+  css-select@5.2.2:
+    dependencies:
+      boolbase: 1.0.0
+      css-what: 6.2.2
+      domhandler: 5.0.3
+      domutils: 3.2.2
+      nth-check: 2.1.1
+
+  css-tree@2.2.1:
+    dependencies:
+      mdn-data: 2.0.28
+      source-map-js: 1.2.1
+
+  css-tree@2.3.1:
+    dependencies:
+      mdn-data: 2.0.30
+      source-map-js: 1.2.1
+
+  css-tree@3.2.1:
+    dependencies:
+      mdn-data: 2.27.1
+      source-map-js: 1.2.1
+
+  css-what@6.2.2: {}
+
+  cssesc@3.0.0: {}
+
+  csso@5.0.5:
+    dependencies:
+      css-tree: 2.2.1
+
+  csstype@3.2.3: {}
+
+  d3-color@3.1.0: {}
+
+  d3-dispatch@3.0.1: {}
+
+  d3-drag@3.0.0:
+    dependencies:
+      d3-dispatch: 3.0.1
+      d3-selection: 3.0.0
+
+  d3-ease@3.0.1: {}
+
+  d3-interpolate@3.0.1:
+    dependencies:
+      d3-color: 3.1.0
+
+  d3-selection@3.0.0: {}
+
+  d3-timer@3.0.1: {}
+
+  d3-transition@3.0.1(d3-selection@3.0.0):
+    dependencies:
+      d3-color: 3.1.0
+      d3-dispatch: 3.0.1
+      d3-ease: 3.0.1
+      d3-interpolate: 3.0.1
+      d3-selection: 3.0.0
+      d3-timer: 3.0.1
+
+  d3-zoom@3.0.0:
+    dependencies:
+      d3-dispatch: 3.0.1
+      d3-drag: 3.0.0
+      d3-interpolate: 3.0.1
+      d3-selection: 3.0.0
+      d3-transition: 3.0.1(d3-selection@3.0.0)
+
+  dagre@0.8.5:
+    dependencies:
+      graphlib: 2.1.8
+      lodash: 4.17.21
+
+  dayjs@1.11.19: {}
+
+  dayjs@1.11.20: {}
+
+  debug@4.4.3:
+    dependencies:
+      ms: 2.1.3
+
+  deep-is@0.1.4: {}
+
+  deepmerge@4.3.1: {}
+
+  default-passive-events@4.0.0: {}
+
+  define-lazy-prop@2.0.0: {}
+
+  defu@6.1.4: {}
+
+  detect-indent@7.0.2: {}
+
+  detect-libc@1.0.3:
+    optional: true
+
+  detect-libc@2.1.2: {}
+
+  detect-newline@4.0.1: {}
+
+  diff@8.0.4: {}
+
+  disable-devtool@0.3.9: {}
+
+  discontinuous-range@1.0.0: {}
+
+  dom-serializer@2.0.0:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+      entities: 4.5.0
+
+  domelementtype@2.3.0: {}
+
+  domhandler@5.0.3:
+    dependencies:
+      domelementtype: 2.3.0
+
+  domutils@3.2.2:
+    dependencies:
+      dom-serializer: 2.0.0
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+
+  echarts@6.0.0:
+    dependencies:
+      tslib: 2.3.0
+      zrender: 6.0.0
+
+  electron-to-chromium@1.5.279: {}
+
+  element-plus@2.14.0(vue@3.5.38(typescript@5.8.3)):
+    dependencies:
+      '@ctrl/tinycolor': 4.2.0
+      '@element-plus/icons-vue': 2.3.2(vue@3.5.38(typescript@5.8.3))
+      '@floating-ui/dom': 1.7.4
+      '@popperjs/core': '@sxzz/popperjs-es@2.11.8'
+      '@types/lodash': 4.17.24
+      '@types/lodash-es': 4.17.12
+      '@vueuse/core': 14.3.0(vue@3.5.38(typescript@5.8.3))
+      async-validator: 4.2.5
+      dayjs: 1.11.20
+      lodash: 4.18.1
+      lodash-es: 4.18.1
+      lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1)
+      memoize-one: 6.0.0
+      normalize-wheel-es: 1.2.0
+      vue: 3.5.38(typescript@5.8.3)
+      vue-component-type-helpers: 3.2.9
+
+  emoji-regex@8.0.0: {}
+
+  emojis-list@3.0.0: {}
+
+  enhanced-resolve@5.21.6:
+    dependencies:
+      graceful-fs: 4.2.11
+      tapable: 2.3.3
+
+  entities@4.5.0: {}
+
+  entities@7.0.1: {}
+
+  env-paths@2.2.1: {}
+
+  error-ex@1.3.4:
+    dependencies:
+      is-arrayish: 0.2.1
+
+  escalade@3.2.0: {}
+
+  escape-string-regexp@4.0.0: {}
+
+  escape-string-regexp@5.0.0: {}
+
+  eslint-config-prettier@10.1.8(eslint@10.5.0(jiti@2.7.0)):
+    dependencies:
+      eslint: 10.5.0(jiti@2.7.0)
+
+  eslint-plugin-prettier@5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@10.5.0(jiti@2.7.0)))(eslint@10.5.0(jiti@2.7.0))(prettier@3.8.4):
+    dependencies:
+      eslint: 10.5.0(jiti@2.7.0)
+      prettier: 3.8.4
+      prettier-linter-helpers: 1.0.1
+      synckit: 0.11.13
+    optionalDependencies:
+      '@types/eslint': 9.6.1
+      eslint-config-prettier: 10.1.8(eslint@10.5.0(jiti@2.7.0))
+
+  eslint-plugin-simple-import-sort@13.0.0(eslint@10.5.0(jiti@2.7.0)):
+    dependencies:
+      eslint: 10.5.0(jiti@2.7.0)
+
+  eslint-plugin-vue@10.9.2(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3))(eslint@10.5.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.5.0(jiti@2.7.0))):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0(jiti@2.7.0))
+      eslint: 10.5.0(jiti@2.7.0)
+      natural-compare: 1.4.0
+      nth-check: 2.1.1
+      postcss-selector-parser: 7.1.4
+      semver: 7.8.5
+      vue-eslint-parser: 10.4.1(eslint@10.5.0(jiti@2.7.0))
+      xml-name-validator: 4.0.0
+    optionalDependencies:
+      '@typescript-eslint/parser': 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+
+  eslint-scope@9.1.2:
+    dependencies:
+      '@types/esrecurse': 4.3.1
+      '@types/estree': 1.0.8
+      esrecurse: 4.3.0
+      estraverse: 5.3.0
+
+  eslint-visitor-keys@3.4.3: {}
+
+  eslint-visitor-keys@5.0.1: {}
+
+  eslint@10.5.0(jiti@2.7.0):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0(jiti@2.7.0))
+      '@eslint-community/regexpp': 4.12.2
+      '@eslint/config-array': 0.23.5
+      '@eslint/config-helpers': 0.6.0
+      '@eslint/core': 1.2.1
+      '@eslint/plugin-kit': 0.7.2
+      '@humanfs/node': 0.16.8
+      '@humanwhocodes/module-importer': 1.0.1
+      '@humanwhocodes/retry': 0.4.3
+      '@types/estree': 1.0.8
+      ajv: 6.15.0
+      cross-spawn: 7.0.6
+      debug: 4.4.3
+      escape-string-regexp: 4.0.0
+      eslint-scope: 9.1.2
+      eslint-visitor-keys: 5.0.1
+      espree: 11.2.0
+      esquery: 1.7.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 8.0.0
+      find-up: 5.0.0
+      glob-parent: 6.0.2
+      ignore: 5.3.2
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      json-stable-stringify-without-jsonify: 1.0.1
+      minimatch: 10.2.5
+      natural-compare: 1.4.0
+      optionator: 0.9.4
+    optionalDependencies:
+      jiti: 2.7.0
+    transitivePeerDependencies:
+      - supports-color
+
+  espree@11.2.0:
+    dependencies:
+      acorn: 8.17.0
+      acorn-jsx: 5.3.2(acorn@8.17.0)
+      eslint-visitor-keys: 5.0.1
+
+  esquery@1.7.0:
+    dependencies:
+      estraverse: 5.3.0
+
+  esrecurse@4.3.0:
+    dependencies:
+      estraverse: 5.3.0
+
+  estraverse@5.3.0: {}
+
+  estree-walker@2.0.2: {}
+
+  estree-walker@3.0.3:
+    dependencies:
+      '@types/estree': 1.0.8
+
+  esutils@2.0.3: {}
+
+  eventsource-parser@3.1.0: {}
+
+  exsolve@1.0.7: {}
+
+  fast-deep-equal@3.1.3: {}
+
+  fast-diff@1.3.0: {}
+
+  fast-glob@3.3.3:
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.8
+
+  fast-json-stable-stringify@2.1.0: {}
+
+  fast-levenshtein@2.0.6: {}
+
+  fast-uri@3.1.0: {}
+
+  fastest-levenshtein@1.0.16: {}
+
+  fastq@1.20.1:
+    dependencies:
+      reusify: 1.1.0
+
+  fdir@6.5.0(picomatch@4.0.3):
+    optionalDependencies:
+      picomatch: 4.0.3
+
+  fflate@0.8.3: {}
+
+  file-entry-cache@11.1.3:
+    dependencies:
+      flat-cache: 6.1.22
+
+  file-entry-cache@8.0.0:
+    dependencies:
+      flat-cache: 4.0.1
+
+  fill-range@7.1.1:
+    dependencies:
+      to-regex-range: 5.0.1
+
+  find-up@5.0.0:
+    dependencies:
+      locate-path: 6.0.0
+      path-exists: 4.0.0
+
+  flat-cache@4.0.1:
+    dependencies:
+      flatted: 3.4.2
+      keyv: 4.5.4
+
+  flat-cache@6.1.22:
+    dependencies:
+      cacheable: 2.3.5
+      flatted: 3.4.2
+      hookified: 1.15.1
+
+  flatted@3.4.2: {}
+
+  framer-motion@12.29.2:
+    dependencies:
+      motion-dom: 12.29.2
+      motion-utils: 12.29.2
+      tslib: 2.8.1
+
+  framer-motion@12.40.0:
+    dependencies:
+      motion-dom: 12.40.0
+      motion-utils: 12.39.0
+      tslib: 2.8.1
+
+  fsevents@2.3.3:
+    optional: true
+
+  gensync@1.0.0-beta.2: {}
+
+  get-caller-file@2.0.5: {}
+
+  get-east-asian-width@1.6.0: {}
+
+  git-hooks-list@4.2.1: {}
+
+  glob-parent@5.1.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  glob-parent@6.0.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  global-modules@2.0.0:
+    dependencies:
+      global-prefix: 3.0.0
+
+  global-prefix@3.0.0:
+    dependencies:
+      ini: 1.3.8
+      kind-of: 6.0.3
+      which: 1.3.1
+
+  globby@16.2.0:
+    dependencies:
+      '@sindresorhus/merge-streams': 4.0.0
+      fast-glob: 3.3.3
+      ignore: 7.0.5
+      is-path-inside: 4.0.0
+      slash: 5.1.0
+      unicorn-magic: 0.4.0
+
+  globjoin@0.1.4: {}
+
+  graceful-fs@4.2.11: {}
+
+  graphlib@2.1.8:
+    dependencies:
+      lodash: 4.17.21
+
+  has-flag@4.0.0: {}
+
+  has-flag@5.0.1: {}
+
+  hashery@1.5.1:
+    dependencies:
+      hookified: 1.15.1
+
+  hey-listen@1.0.8: {}
+
+  hookable@5.5.3: {}
+
+  hookified@1.15.1: {}
+
+  hookified@2.2.0: {}
+
+  html-tags@5.1.0: {}
+
+  html-to-image@1.11.13: {}
+
+  htmlparser2@8.0.2:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+      domutils: 3.2.2
+      entities: 4.5.0
+
+  ignore@5.3.2: {}
+
+  ignore@7.0.5: {}
+
+  immutable@5.1.7: {}
+
+  import-fresh@3.3.1:
+    dependencies:
+      parent-module: 1.0.1
+      resolve-from: 4.0.0
+
+  import-meta-resolve@4.2.0: {}
+
+  imurmurhash@0.1.4: {}
+
+  ini@1.3.8: {}
+
+  is-arrayish@0.2.1: {}
+
+  is-docker@2.2.1: {}
+
+  is-extglob@2.1.1: {}
+
+  is-fullwidth-code-point@3.0.0: {}
+
+  is-glob@4.0.3:
+    dependencies:
+      is-extglob: 2.1.1
+
+  is-number@7.0.0: {}
+
+  is-path-inside@4.0.0: {}
+
+  is-plain-obj@4.1.0: {}
+
+  is-plain-object@5.0.0: {}
+
+  is-what@5.5.0: {}
+
+  is-wsl@2.2.0:
+    dependencies:
+      is-docker: 2.2.1
+
+  isexe@2.0.0: {}
+
+  jiti@2.7.0: {}
+
+  js-tokens@4.0.0: {}
+
+  js-tokens@9.0.1: {}
+
+  js-yaml@4.2.0:
+    dependencies:
+      argparse: 2.0.1
+
+  jsesc@3.1.0: {}
+
+  json-buffer@3.0.1: {}
+
+  json-parse-even-better-errors@2.3.1: {}
+
+  json-schema-traverse@0.4.1: {}
+
+  json-schema-traverse@1.0.0: {}
+
+  json-schema@0.4.0: {}
+
+  json-stable-stringify-without-jsonify@1.0.1: {}
+
+  json5@2.2.3: {}
+
+  keyv@4.5.4:
+    dependencies:
+      json-buffer: 3.0.1
+
+  keyv@5.6.0:
+    dependencies:
+      '@keyv/serialize': 1.1.1
+
+  kind-of@6.0.3: {}
+
+  known-css-properties@0.37.0: {}
+
+  levn@0.4.1:
+    dependencies:
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+
+  lightningcss-android-arm64@1.32.0:
+    optional: true
+
+  lightningcss-darwin-arm64@1.32.0:
+    optional: true
+
+  lightningcss-darwin-x64@1.32.0:
+    optional: true
+
+  lightningcss-freebsd-x64@1.32.0:
+    optional: true
+
+  lightningcss-linux-arm-gnueabihf@1.32.0:
+    optional: true
+
+  lightningcss-linux-arm64-gnu@1.32.0:
+    optional: true
+
+  lightningcss-linux-arm64-musl@1.32.0:
+    optional: true
+
+  lightningcss-linux-x64-gnu@1.32.0:
+    optional: true
+
+  lightningcss-linux-x64-musl@1.32.0:
+    optional: true
+
+  lightningcss-win32-arm64-msvc@1.32.0:
+    optional: true
+
+  lightningcss-win32-x64-msvc@1.32.0:
+    optional: true
+
+  lightningcss@1.32.0:
+    dependencies:
+      detect-libc: 2.1.2
+    optionalDependencies:
+      lightningcss-android-arm64: 1.32.0
+      lightningcss-darwin-arm64: 1.32.0
+      lightningcss-darwin-x64: 1.32.0
+      lightningcss-freebsd-x64: 1.32.0
+      lightningcss-linux-arm-gnueabihf: 1.32.0
+      lightningcss-linux-arm64-gnu: 1.32.0
+      lightningcss-linux-arm64-musl: 1.32.0
+      lightningcss-linux-x64-gnu: 1.32.0
+      lightningcss-linux-x64-musl: 1.32.0
+      lightningcss-win32-arm64-msvc: 1.32.0
+      lightningcss-win32-x64-msvc: 1.32.0
+
+  lines-and-columns@1.2.4: {}
+
+  loader-utils@2.0.4:
+    dependencies:
+      big.js: 5.2.2
+      emojis-list: 3.0.0
+      json5: 2.2.3
+
+  local-pkg@1.1.2:
+    dependencies:
+      mlly: 1.8.0
+      pkg-types: 2.3.0
+      quansync: 0.2.11
+
+  locate-path@6.0.0:
+    dependencies:
+      p-locate: 5.0.0
+
+  lodash-es@4.18.1: {}
+
+  lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1):
+    dependencies:
+      '@types/lodash-es': 4.17.12
+      lodash: 4.18.1
+      lodash-es: 4.18.1
+
+  lodash.truncate@4.4.2: {}
+
+  lodash@4.17.21: {}
+
+  lodash@4.18.1: {}
+
+  lru-cache@5.1.1:
+    dependencies:
+      yallist: 3.1.1
+
+  lz-string@1.5.0: {}
+
+  magic-string@0.30.21:
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.5
+
+  mathml-tag-names@4.0.0: {}
+
+  mdn-data@2.0.28: {}
+
+  mdn-data@2.0.30: {}
+
+  mdn-data@2.27.1: {}
+
+  memoize-one@6.0.0: {}
+
+  meow@14.1.0: {}
+
+  merge2@1.4.1: {}
+
+  micromatch@4.0.8:
+    dependencies:
+      braces: 3.0.3
+      picomatch: 2.3.1
+
+  minimatch@10.2.5:
+    dependencies:
+      brace-expansion: 5.0.6
+
+  mitt@3.0.1: {}
+
+  mlly@1.8.0:
+    dependencies:
+      acorn: 8.15.0
+      pathe: 2.0.3
+      pkg-types: 1.3.1
+      ufo: 1.6.1
+
+  moo@0.5.2: {}
+
+  motion-dom@12.29.2:
+    dependencies:
+      motion-utils: 12.29.2
+
+  motion-dom@12.40.0:
+    dependencies:
+      motion-utils: 12.39.0
+
+  motion-utils@12.29.2: {}
+
+  motion-utils@12.39.0: {}
+
+  motion-v@2.3.0(@vueuse/core@13.9.0(vue@3.5.38(typescript@5.8.3)))(vue@3.5.38(typescript@5.8.3)):
+    dependencies:
+      '@vueuse/core': 13.9.0(vue@3.5.38(typescript@5.8.3))
+      framer-motion: 12.40.0
+      hey-listen: 1.0.8
+      motion-dom: 12.40.0
+      motion-utils: 12.39.0
+      vue: 3.5.38(typescript@5.8.3)
+    transitivePeerDependencies:
+      - '@emotion/is-prop-valid'
+      - react
+      - react-dom
+
+  motion@12.29.2:
+    dependencies:
+      framer-motion: 12.29.2
+      tslib: 2.8.1
+
+  ms@2.1.3: {}
+
+  muggle-string@0.4.1: {}
+
+  nanoid@3.3.11: {}
+
+  nanoid@3.3.12: {}
+
+  nanoid@5.1.11: {}
+
+  natural-compare@1.4.0: {}
+
+  nearley@2.20.1:
+    dependencies:
+      commander: 2.20.3
+      moo: 0.5.2
+      railroad-diagrams: 1.0.0
+      randexp: 0.4.6
+
+  node-addon-api@7.1.1:
+    optional: true
+
+  node-releases@2.0.27: {}
+
+  normalize-path@3.0.0: {}
+
+  normalize-wheel-es@1.2.0: {}
+
+  nprogress@1.0.0-1: {}
+
+  nth-check@2.1.1:
+    dependencies:
+      boolbase: 1.0.0
+
+  obug@2.1.1: {}
+
+  open@8.4.2:
+    dependencies:
+      define-lazy-prop: 2.0.0
+      is-docker: 2.2.1
+      is-wsl: 2.2.0
+
+  optionator@0.9.4:
+    dependencies:
+      deep-is: 0.1.4
+      fast-levenshtein: 2.0.6
+      levn: 0.4.1
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+      word-wrap: 1.2.5
+
+  p-limit@3.1.0:
+    dependencies:
+      yocto-queue: 0.1.0
+
+  p-locate@5.0.0:
+    dependencies:
+      p-limit: 3.1.0
+
+  package-manager-detector@1.5.0: {}
+
+  parent-module@1.0.1:
+    dependencies:
+      callsites: 3.1.0
+
+  parse-json@5.2.0:
+    dependencies:
+      '@babel/code-frame': 7.28.6
+      error-ex: 1.3.4
+      json-parse-even-better-errors: 2.3.1
+      lines-and-columns: 1.2.4
+
+  path-browserify@1.0.1: {}
+
+  path-exists@4.0.0: {}
+
+  path-key@3.1.1: {}
+
+  pathe@2.0.3: {}
+
+  perfect-debounce@1.0.0: {}
+
+  picocolors@1.1.1: {}
+
+  picomatch@2.3.1: {}
+
+  picomatch@4.0.3: {}
+
+  picomatch@4.0.4: {}
+
+  pinia-plugin-persistedstate@4.7.1(pinia@3.0.4(typescript@5.8.3)(vue@3.5.38(typescript@5.8.3))):
+    dependencies:
+      defu: 6.1.4
+    optionalDependencies:
+      pinia: 3.0.4(typescript@5.8.3)(vue@3.5.38(typescript@5.8.3))
+
+  pinia@3.0.4(typescript@5.8.3)(vue@3.5.38(typescript@5.8.3)):
+    dependencies:
+      '@vue/devtools-api': 7.7.7
+      vue: 3.5.38(typescript@5.8.3)
+    optionalDependencies:
+      typescript: 5.8.3
+
+  pkg-types@1.3.1:
+    dependencies:
+      confbox: 0.1.8
+      mlly: 1.8.0
+      pathe: 2.0.3
+
+  pkg-types@2.3.0:
+    dependencies:
+      confbox: 0.2.2
+      exsolve: 1.0.7
+      pathe: 2.0.3
+
+  postcss-html@1.8.1:
+    dependencies:
+      htmlparser2: 8.0.2
+      js-tokens: 9.0.1
+      postcss: 8.5.15
+      postcss-safe-parser: 6.0.0(postcss@8.5.15)
+
+  postcss-less@6.0.0(postcss@8.5.14):
+    dependencies:
+      postcss: 8.5.14
+
+  postcss-media-query-parser@0.2.3: {}
+
+  postcss-resolve-nested-selector@0.1.6: {}
+
+  postcss-safe-parser@6.0.0(postcss@8.5.15):
+    dependencies:
+      postcss: 8.5.15
+
+  postcss-safe-parser@7.0.1(postcss@8.5.15):
+    dependencies:
+      postcss: 8.5.15
+
+  postcss-scss@4.0.9(postcss@8.5.14):
+    dependencies:
+      postcss: 8.5.14
+
+  postcss-selector-parser@7.1.4:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
+  postcss-value-parser@4.2.0: {}
+
+  postcss@8.5.14:
+    dependencies:
+      nanoid: 3.3.11
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  postcss@8.5.15:
+    dependencies:
+      nanoid: 3.3.12
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  prelude-ls@1.2.1: {}
+
+  prettier-linter-helpers@1.0.1:
+    dependencies:
+      fast-diff: 1.3.0
+
+  prettier-plugin-css-order@2.2.0(postcss@8.5.14)(prettier@3.8.4):
+    dependencies:
+      css-declaration-sorter: 7.4.0(postcss@8.5.14)
+      postcss-less: 6.0.0(postcss@8.5.14)
+      postcss-scss: 4.0.9(postcss@8.5.14)
+      prettier: 3.8.4
+    transitivePeerDependencies:
+      - postcss
+
+  prettier-plugin-packagejson@3.0.2(prettier@3.8.4):
+    dependencies:
+      sort-package-json: 3.7.1
+    optionalDependencies:
+      prettier: 3.8.4
+
+  prettier-plugin-tailwindcss@0.8.0(prettier-plugin-css-order@2.2.0(postcss@8.5.14)(prettier@3.8.4))(prettier@3.8.4):
+    dependencies:
+      prettier: 3.8.4
+    optionalDependencies:
+      prettier-plugin-css-order: 2.2.0(postcss@8.5.14)(prettier@3.8.4)
+
+  prettier@3.8.4: {}
+
+  punycode@2.3.1: {}
+
+  qified@0.10.1:
+    dependencies:
+      hookified: 2.2.0
+
+  quansync@0.2.11: {}
+
+  queue-microtask@1.2.3: {}
+
+  radash@12.1.1: {}
+
+  railroad-diagrams@1.0.0: {}
+
+  randexp@0.4.6:
+    dependencies:
+      discontinuous-range: 1.0.0
+      ret: 0.1.15
+
+  readdirp@5.0.0: {}
+
+  reduce-configs@1.1.2: {}
+
+  reduce-configs@2.0.1: {}
+
+  require-directory@2.1.1: {}
+
+  require-from-string@2.0.2: {}
+
+  resolve-from@4.0.0: {}
+
+  ret@0.1.15: {}
+
+  reusify@1.1.0: {}
+
+  rfdc@1.4.1: {}
+
+  rollup-plugin-visualizer@6.0.11(rollup@4.53.1):
+    dependencies:
+      open: 8.4.2
+      picomatch: 4.0.3
+      source-map: 0.7.6
+      yargs: 17.7.2
+    optionalDependencies:
+      rollup: 4.53.1
+
+  rollup@4.53.1:
+    dependencies:
+      '@types/estree': 1.0.8
+    optionalDependencies:
+      '@rollup/rollup-android-arm-eabi': 4.53.1
+      '@rollup/rollup-android-arm64': 4.53.1
+      '@rollup/rollup-darwin-arm64': 4.53.1
+      '@rollup/rollup-darwin-x64': 4.53.1
+      '@rollup/rollup-freebsd-arm64': 4.53.1
+      '@rollup/rollup-freebsd-x64': 4.53.1
+      '@rollup/rollup-linux-arm-gnueabihf': 4.53.1
+      '@rollup/rollup-linux-arm-musleabihf': 4.53.1
+      '@rollup/rollup-linux-arm64-gnu': 4.53.1
+      '@rollup/rollup-linux-arm64-musl': 4.53.1
+      '@rollup/rollup-linux-loong64-gnu': 4.53.1
+      '@rollup/rollup-linux-ppc64-gnu': 4.53.1
+      '@rollup/rollup-linux-riscv64-gnu': 4.53.1
+      '@rollup/rollup-linux-riscv64-musl': 4.53.1
+      '@rollup/rollup-linux-s390x-gnu': 4.53.1
+      '@rollup/rollup-linux-x64-gnu': 4.53.1
+      '@rollup/rollup-linux-x64-musl': 4.53.1
+      '@rollup/rollup-openharmony-arm64': 4.53.1
+      '@rollup/rollup-win32-arm64-msvc': 4.53.1
+      '@rollup/rollup-win32-ia32-msvc': 4.53.1
+      '@rollup/rollup-win32-x64-gnu': 4.53.1
+      '@rollup/rollup-win32-x64-msvc': 4.53.1
+      fsevents: 2.3.3
+    optional: true
+
+  rspack-vue-loader@17.5.1(@rspack/core@2.0.8(@swc/helpers@0.5.23))(@vue/compiler-sfc@3.5.38)(vue@3.5.38(typescript@5.8.3)):
+    dependencies:
+      '@rspack/lite-tapable': 1.1.0
+      chalk: 4.1.2
+    optionalDependencies:
+      '@rspack/core': 2.0.8(@swc/helpers@0.5.23)
+      '@vue/compiler-sfc': 3.5.38
+      vue: 3.5.38(typescript@5.8.3)
+
+  run-parallel@1.2.0:
+    dependencies:
+      queue-microtask: 1.2.3
+
+  rxjs@7.8.2:
+    dependencies:
+      tslib: 2.8.1
+
+  sanitize.css@13.0.0: {}
+
+  sass-embedded-all-unknown@1.100.0:
+    dependencies:
+      sass: 1.100.0
+    optional: true
+
+  sass-embedded-android-arm64@1.100.0:
+    optional: true
+
+  sass-embedded-android-arm@1.100.0:
+    optional: true
+
+  sass-embedded-android-riscv64@1.100.0:
+    optional: true
+
+  sass-embedded-android-x64@1.100.0:
+    optional: true
+
+  sass-embedded-darwin-arm64@1.100.0:
+    optional: true
+
+  sass-embedded-darwin-x64@1.100.0:
+    optional: true
+
+  sass-embedded-linux-arm64@1.100.0:
+    optional: true
+
+  sass-embedded-linux-arm@1.100.0:
+    optional: true
+
+  sass-embedded-linux-musl-arm64@1.100.0:
+    optional: true
+
+  sass-embedded-linux-musl-arm@1.100.0:
+    optional: true
+
+  sass-embedded-linux-musl-riscv64@1.100.0:
+    optional: true
+
+  sass-embedded-linux-musl-x64@1.100.0:
+    optional: true
+
+  sass-embedded-linux-riscv64@1.100.0:
+    optional: true
+
+  sass-embedded-linux-x64@1.100.0:
+    optional: true
+
+  sass-embedded-unknown-all@1.100.0:
+    dependencies:
+      sass: 1.100.0
+    optional: true
+
+  sass-embedded-win32-arm64@1.100.0:
+    optional: true
+
+  sass-embedded-win32-x64@1.100.0:
+    optional: true
+
+  sass-embedded@1.100.0:
+    dependencies:
+      '@bufbuild/protobuf': 2.10.0
+      colorjs.io: 0.5.2
+      immutable: 5.1.7
+      rxjs: 7.8.2
+      supports-color: 8.1.1
+      sync-child-process: 1.0.2
+      varint: 6.0.0
+    optionalDependencies:
+      sass-embedded-all-unknown: 1.100.0
+      sass-embedded-android-arm: 1.100.0
+      sass-embedded-android-arm64: 1.100.0
+      sass-embedded-android-riscv64: 1.100.0
+      sass-embedded-android-x64: 1.100.0
+      sass-embedded-darwin-arm64: 1.100.0
+      sass-embedded-darwin-x64: 1.100.0
+      sass-embedded-linux-arm: 1.100.0
+      sass-embedded-linux-arm64: 1.100.0
+      sass-embedded-linux-musl-arm: 1.100.0
+      sass-embedded-linux-musl-arm64: 1.100.0
+      sass-embedded-linux-musl-riscv64: 1.100.0
+      sass-embedded-linux-musl-x64: 1.100.0
+      sass-embedded-linux-riscv64: 1.100.0
+      sass-embedded-linux-x64: 1.100.0
+      sass-embedded-unknown-all: 1.100.0
+      sass-embedded-win32-arm64: 1.100.0
+      sass-embedded-win32-x64: 1.100.0
+
+  sass@1.100.0:
+    dependencies:
+      chokidar: 5.0.0
+      immutable: 5.1.7
+      source-map-js: 1.2.1
+    optionalDependencies:
+      '@parcel/watcher': 2.5.1
+    optional: true
+
+  sax@1.6.0: {}
+
+  scule@1.3.0: {}
+
+  secure-ls@2.0.0:
+    dependencies:
+      crypto-js: 4.2.0
+      lz-string: 1.5.0
+
+  semver@6.3.1: {}
+
+  semver@7.8.5: {}
+
+  shebang-command@2.0.0:
+    dependencies:
+      shebang-regex: 3.0.0
+
+  shebang-regex@3.0.0: {}
+
+  signal-exit@4.1.0: {}
+
+  slash@5.1.0: {}
+
+  slice-ansi@4.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      astral-regex: 2.0.0
+      is-fullwidth-code-point: 3.0.0
+
+  sort-object-keys@2.1.0: {}
+
+  sort-package-json@3.7.1:
+    dependencies:
+      detect-indent: 7.0.2
+      detect-newline: 4.0.1
+      git-hooks-list: 4.2.1
+      is-plain-obj: 4.1.0
+      semver: 7.8.5
+      sort-object-keys: 2.1.0
+      tinyglobby: 0.2.15
+
+  source-map-js@1.2.1: {}
+
+  source-map-support@0.5.21:
+    dependencies:
+      buffer-from: 1.1.2
+      source-map: 0.6.1
+
+  source-map@0.6.1: {}
+
+  source-map@0.7.6: {}
+
+  speakingurl@14.0.1: {}
+
+  sql-formatter@15.7.0:
+    dependencies:
+      argparse: 2.0.1
+      nearley: 2.20.1
+
+  string-width@4.2.3:
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+
+  string-width@8.2.1:
+    dependencies:
+      get-east-asian-width: 1.6.0
+      strip-ansi: 7.2.0
+
+  strip-ansi@6.0.1:
+    dependencies:
+      ansi-regex: 5.0.1
+
+  strip-ansi@7.2.0:
+    dependencies:
+      ansi-regex: 6.2.2
+
+  strip-literal@3.1.0:
+    dependencies:
+      js-tokens: 9.0.1
+
+  style-mod@4.1.3: {}
+
+  stylelint-config-html@1.1.0(postcss-html@1.8.1)(stylelint@17.13.0(typescript@5.8.3)):
+    dependencies:
+      postcss-html: 1.8.1
+      stylelint: 17.13.0(typescript@5.8.3)
+
+  stylelint-config-recommended-scss@17.0.1(postcss@8.5.14)(stylelint@17.13.0(typescript@5.8.3)):
+    dependencies:
+      postcss-scss: 4.0.9(postcss@8.5.14)
+      stylelint: 17.13.0(typescript@5.8.3)
+      stylelint-config-recommended: 18.0.0(stylelint@17.13.0(typescript@5.8.3))
+      stylelint-scss: 7.2.0(stylelint@17.13.0(typescript@5.8.3))
+    optionalDependencies:
+      postcss: 8.5.14
+
+  stylelint-config-recommended-vue@1.6.1(postcss-html@1.8.1)(stylelint@17.13.0(typescript@5.8.3)):
+    dependencies:
+      postcss-html: 1.8.1
+      semver: 7.8.5
+      stylelint: 17.13.0(typescript@5.8.3)
+      stylelint-config-html: 1.1.0(postcss-html@1.8.1)(stylelint@17.13.0(typescript@5.8.3))
+      stylelint-config-recommended: 18.0.0(stylelint@17.13.0(typescript@5.8.3))
+
+  stylelint-config-recommended@18.0.0(stylelint@17.13.0(typescript@5.8.3)):
+    dependencies:
+      stylelint: 17.13.0(typescript@5.8.3)
+
+  stylelint-config-standard-scss@17.0.0(postcss@8.5.14)(stylelint@17.13.0(typescript@5.8.3)):
+    dependencies:
+      stylelint: 17.13.0(typescript@5.8.3)
+      stylelint-config-recommended-scss: 17.0.1(postcss@8.5.14)(stylelint@17.13.0(typescript@5.8.3))
+      stylelint-config-standard: 40.0.0(stylelint@17.13.0(typescript@5.8.3))
+    optionalDependencies:
+      postcss: 8.5.14
+
+  stylelint-config-standard-vue@1.0.0(postcss-html@1.8.1)(stylelint@17.13.0(typescript@5.8.3)):
+    dependencies:
+      postcss-html: 1.8.1
+      stylelint: 17.13.0(typescript@5.8.3)
+      stylelint-config-html: 1.1.0(postcss-html@1.8.1)(stylelint@17.13.0(typescript@5.8.3))
+      stylelint-config-recommended-vue: 1.6.1(postcss-html@1.8.1)(stylelint@17.13.0(typescript@5.8.3))
+      stylelint-config-standard: 40.0.0(stylelint@17.13.0(typescript@5.8.3))
+
+  stylelint-config-standard@40.0.0(stylelint@17.13.0(typescript@5.8.3)):
+    dependencies:
+      stylelint: 17.13.0(typescript@5.8.3)
+      stylelint-config-recommended: 18.0.0(stylelint@17.13.0(typescript@5.8.3))
+
+  stylelint-scss@7.2.0(stylelint@17.13.0(typescript@5.8.3)):
+    dependencies:
+      '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
+      '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
+      '@csstools/css-syntax-patches-for-csstree': 1.1.5(css-tree@3.2.1)
+      '@csstools/css-tokenizer': 4.0.0
+      css-tree: 3.2.1
+      is-plain-object: 5.0.0
+      known-css-properties: 0.37.0
+      postcss-media-query-parser: 0.2.3
+      postcss-resolve-nested-selector: 0.1.6
+      postcss-selector-parser: 7.1.4
+      postcss-value-parser: 4.2.0
+      stylelint: 17.13.0(typescript@5.8.3)
+
+  stylelint@17.13.0(typescript@5.8.3):
+    dependencies:
+      '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
+      '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
+      '@csstools/css-syntax-patches-for-csstree': 1.1.5(css-tree@3.2.1)
+      '@csstools/css-tokenizer': 4.0.0
+      '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
+      '@csstools/selector-resolve-nested': 4.0.0(postcss-selector-parser@7.1.4)
+      '@csstools/selector-specificity': 6.0.0(postcss-selector-parser@7.1.4)
+      colord: 2.9.3
+      cosmiconfig: 9.0.2(typescript@5.8.3)
+      css-functions-list: 3.3.3
+      css-tree: 3.2.1
+      debug: 4.4.3
+      fast-glob: 3.3.3
+      fastest-levenshtein: 1.0.16
+      file-entry-cache: 11.1.3
+      global-modules: 2.0.0
+      globby: 16.2.0
+      globjoin: 0.1.4
+      html-tags: 5.1.0
+      ignore: 7.0.5
+      import-meta-resolve: 4.2.0
+      mathml-tag-names: 4.0.0
+      meow: 14.1.0
+      micromatch: 4.0.8
+      normalize-path: 3.0.0
+      picocolors: 1.1.1
+      postcss: 8.5.15
+      postcss-safe-parser: 7.0.1(postcss@8.5.15)
+      postcss-selector-parser: 7.1.4
+      postcss-value-parser: 4.2.0
+      string-width: 8.2.1
+      supports-hyperlinks: 4.5.0
+      svg-tags: 1.0.0
+      table: 6.9.0
+      write-file-atomic: 7.0.1
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  superjson@2.2.5:
+    dependencies:
+      copy-anything: 4.0.5
+
+  supports-color@10.2.2: {}
+
+  supports-color@7.2.0:
+    dependencies:
+      has-flag: 4.0.0
+
+  supports-color@8.1.1:
+    dependencies:
+      has-flag: 4.0.0
+
+  supports-hyperlinks@4.5.0:
+    dependencies:
+      has-flag: 5.0.1
+      supports-color: 10.2.2
+
+  svg-tags@1.0.0: {}
+
+  svgo@3.3.3:
+    dependencies:
+      commander: 7.2.0
+      css-select: 5.2.2
+      css-tree: 2.3.1
+      css-what: 6.2.2
+      csso: 5.0.5
+      picocolors: 1.1.1
+      sax: 1.6.0
+
+  swapy@1.0.5: {}
+
+  sync-child-process@1.0.2:
+    dependencies:
+      sync-message-port: 1.1.3
+
+  sync-message-port@1.1.3: {}
+
+  synckit@0.11.13:
+    dependencies:
+      '@pkgr/core': 0.3.6
+
+  table@6.9.0:
+    dependencies:
+      ajv: 8.17.1
+      lodash.truncate: 4.4.2
+      slice-ansi: 4.0.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  tailwindcss@4.3.1: {}
+
+  tapable@2.3.3: {}
+
+  terser@5.44.1:
+    dependencies:
+      '@jridgewell/source-map': 0.3.11
+      acorn: 8.15.0
+      commander: 2.20.3
+      source-map-support: 0.5.21
+
+  tinyexec@1.0.2: {}
+
+  tinyglobby@0.2.15:
+    dependencies:
+      fdir: 6.5.0(picomatch@4.0.3)
+      picomatch: 4.0.3
+
+  to-regex-range@5.0.1:
+    dependencies:
+      is-number: 7.0.0
+
+  ts-api-utils@2.5.0(typescript@5.8.3):
+    dependencies:
+      typescript: 5.8.3
+
+  ts-md5@2.0.1: {}
+
+  tslib@2.3.0: {}
+
+  tslib@2.8.1: {}
+
+  type-check@0.4.0:
+    dependencies:
+      prelude-ls: 1.2.1
+
+  typescript-api-pro@0.0.6: {}
+
+  typescript-eslint@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3):
+    dependencies:
+      '@typescript-eslint/eslint-plugin': 8.62.0(@typescript-eslint/parser@8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3))(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      '@typescript-eslint/parser': 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.8.3)
+      '@typescript-eslint/utils': 8.62.0(eslint@10.5.0(jiti@2.7.0))(typescript@5.8.3)
+      eslint: 10.5.0(jiti@2.7.0)
+      typescript: 5.8.3
+    transitivePeerDependencies:
+      - supports-color
+
+  typescript@5.8.3: {}
+
+  ufo@1.6.1: {}
+
+  undici-types@6.21.0: {}
+
+  unicorn-magic@0.4.0: {}
+
+  unimport@5.6.0:
+    dependencies:
+      acorn: 8.15.0
+      escape-string-regexp: 5.0.0
+      estree-walker: 3.0.3
+      local-pkg: 1.1.2
+      magic-string: 0.30.21
+      mlly: 1.8.0
+      pathe: 2.0.3
+      picomatch: 4.0.3
+      pkg-types: 2.3.0
+      scule: 1.3.0
+      strip-literal: 3.1.0
+      tinyglobby: 0.2.15
+      unplugin: 2.3.11
+      unplugin-utils: 0.3.1
+
+  unplugin-auto-import@21.0.0(@vueuse/core@13.9.0(vue@3.5.38(typescript@5.8.3))):
+    dependencies:
+      local-pkg: 1.1.2
+      magic-string: 0.30.21
+      picomatch: 4.0.3
+      unimport: 5.6.0
+      unplugin: 2.3.11
+      unplugin-utils: 0.3.1
+    optionalDependencies:
+      '@vueuse/core': 13.9.0(vue@3.5.38(typescript@5.8.3))
+
+  unplugin-icons@23.0.1(@vue/compiler-sfc@3.5.38):
+    dependencies:
+      '@antfu/install-pkg': 1.1.0
+      '@iconify/utils': 3.1.0
+      local-pkg: 1.1.2
+      obug: 2.1.1
+      unplugin: 2.3.11
+    optionalDependencies:
+      '@vue/compiler-sfc': 3.5.38
+
+  unplugin-utils@0.3.1:
+    dependencies:
+      pathe: 2.0.3
+      picomatch: 4.0.3
+
+  unplugin-vue-components@31.0.0(vue@3.5.38(typescript@5.8.3)):
+    dependencies:
+      chokidar: 5.0.0
+      local-pkg: 1.1.2
+      magic-string: 0.30.21
+      mlly: 1.8.0
+      obug: 2.1.1
+      picomatch: 4.0.3
+      tinyglobby: 0.2.15
+      unplugin: 2.3.11
+      unplugin-utils: 0.3.1
+      vue: 3.5.38(typescript@5.8.3)
+
+  unplugin@2.3.11:
+    dependencies:
+      '@jridgewell/remapping': 2.3.5
+      acorn: 8.15.0
+      picomatch: 4.0.3
+      webpack-virtual-modules: 0.6.2
+
+  update-browserslist-db@1.2.3(browserslist@4.28.1):
+    dependencies:
+      browserslist: 4.28.1
+      escalade: 3.2.0
+      picocolors: 1.1.1
+
+  uri-js@4.4.1:
+    dependencies:
+      punycode: 2.3.1
+
+  util-deprecate@1.0.2: {}
+
+  varint@6.0.0: {}
+
+  virtua@0.49.1(vue@3.5.38(typescript@5.8.3)):
+    optionalDependencies:
+      vue: 3.5.38(typescript@5.8.3)
+
+  vscode-uri@3.1.0: {}
+
+  vue-component-type-helpers@3.2.9: {}
+
+  vue-demi@0.14.10(vue@3.5.38(typescript@5.8.3)):
+    dependencies:
+      vue: 3.5.38(typescript@5.8.3)
+
+  vue-element-plus-x@2.0.3(element-plus@2.14.0(vue@3.5.38(typescript@5.8.3)))(rollup@4.53.1)(vue@3.5.38(typescript@5.8.3)):
+    dependencies:
+      '@element-plus/icons-vue': 2.3.2(vue@3.5.38(typescript@5.8.3))
+      '@vueuse/core': 13.9.0(vue@3.5.38(typescript@5.8.3))
+      deepmerge: 4.3.1
+      element-plus: 2.14.0(vue@3.5.38(typescript@5.8.3))
+      radash: 12.1.1
+      rollup-plugin-visualizer: 6.0.11(rollup@4.53.1)
+      ts-md5: 2.0.1
+      typescript-api-pro: 0.0.6
+      virtua: 0.49.1(vue@3.5.38(typescript@5.8.3))
+      vue: 3.5.38(typescript@5.8.3)
+      x-sender: 1.4.3
+    transitivePeerDependencies:
+      - react
+      - react-dom
+      - rolldown
+      - rollup
+      - solid-js
+      - svelte
+
+  vue-eslint-parser@10.4.1(eslint@10.5.0(jiti@2.7.0)):
+    dependencies:
+      debug: 4.4.3
+      eslint: 10.5.0(jiti@2.7.0)
+      eslint-scope: 9.1.2
+      eslint-visitor-keys: 5.0.1
+      espree: 11.2.0
+      esquery: 1.7.0
+      semver: 7.8.5
+    transitivePeerDependencies:
+      - supports-color
+
+  vue-router@4.6.4(vue@3.5.38(typescript@5.8.3)):
+    dependencies:
+      '@vue/devtools-api': 6.6.4
+      vue: 3.5.38(typescript@5.8.3)
+
+  vue-tsc@3.3.5(typescript@5.8.3):
+    dependencies:
+      '@volar/typescript': 2.4.28
+      '@vue/language-core': 3.3.5
+      typescript: 5.8.3
+
+  vue@3.5.38(typescript@5.8.3):
+    dependencies:
+      '@vue/compiler-dom': 3.5.38
+      '@vue/compiler-sfc': 3.5.38
+      '@vue/runtime-dom': 3.5.38
+      '@vue/server-renderer': 3.5.38(vue@3.5.38(typescript@5.8.3))
+      '@vue/shared': 3.5.38
+    optionalDependencies:
+      typescript: 5.8.3
+
+  w3c-keyname@2.2.8: {}
+
+  webpack-virtual-modules@0.6.2: {}
+
+  which@1.3.1:
+    dependencies:
+      isexe: 2.0.0
+
+  which@2.0.2:
+    dependencies:
+      isexe: 2.0.0
+
+  word-wrap@1.2.5: {}
+
+  wrap-ansi@7.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  write-excel-file@4.1.1:
+    dependencies:
+      fflate: 0.8.3
+
+  write-file-atomic@7.0.1:
+    dependencies:
+      signal-exit: 4.1.0
+
+  x-sender@1.4.3: {}
+
+  xml-name-validator@4.0.0: {}
+
+  y18n@5.0.8: {}
+
+  yallist@3.1.1: {}
+
+  yaml@2.9.0: {}
+
+  yargs-parser@21.1.1: {}
+
+  yargs@17.7.2:
+    dependencies:
+      cliui: 8.0.1
+      escalade: 3.2.0
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      string-width: 4.2.3
+      y18n: 5.0.8
+      yargs-parser: 21.1.1
+
+  yocto-queue@0.1.0: {}
+
+  zipson@0.2.12: {}
+
+  zod@4.4.3: {}
+
+  zrender@6.0.0:
+    dependencies:
+      tslib: 2.3.0

+ 21 - 0
AdminFrontEnd/prettier.config.mjs

@@ -0,0 +1,21 @@
+/** @type {import('prettier').Config & import('prettier-plugin-tailwindcss').PluginOptions} */
+export default {
+  arrowParens: 'always',
+  bracketSameLine: false,
+  bracketSpacing: true,
+  jsxSingleQuote: true,
+  plugins: [
+    'prettier-plugin-css-order',
+    'prettier-plugin-packagejson',
+    'prettier-plugin-tailwindcss',
+  ],
+  printWidth: 80,
+  quoteProps: 'as-needed',
+  semi: false,
+  singleAttributePerLine: false,
+  singleQuote: true,
+  tabWidth: 2,
+  tailwindStylesheet: './src/styles/tailwind.css',
+  trailingComma: 'all',
+  useTabs: false,
+}

BIN
AdminFrontEnd/public/favicon.ico


+ 223 - 0
AdminFrontEnd/public/index.html

@@ -0,0 +1,223 @@
+<!doctype html>
+<html lang="zh-CN">
+
+<head>
+  <meta charset="UTF-8" />
+  <meta name="referrer" content="origin" />
+  <link rel="icon" href="/favicon.ico" />
+  <meta name="viewport" content="user-scalable=yes" />
+
+</head>
+
+<body>
+  <div id="app">
+    <style>
+      body {
+        padding: 0;
+        margin: 0;
+        overflow: hidden;
+      }
+
+      .loading {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        width: 100vw;
+        height: 100vh;
+        overflow: hidden;
+      }
+
+      .blobs {
+        position: absolute;
+        width: 300px;
+        height: 300px;
+        overflow: hidden;
+        border-radius: 70px;
+        transform-style: preserve-3d;
+      }
+
+      .blobs .blob-center {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        width: 30px;
+        height: 30px;
+        background: #2b4bf1;
+        border-radius: 50%;
+        box-shadow: 0 -10px 40px -5px #2b4bf1;
+        transform: scale(0.9) translate(-50%, -50%);
+        transform-origin: left top;
+        transform-style: preserve-3d;
+        animation: blob-grow_2 linear 3.4s infinite;
+      }
+
+      .blob {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        width: 30px;
+        height: 30px;
+        background: #2b4bf1;
+        border-radius: 50%;
+        opacity: 0;
+        transform: scale(0.9) translate(-50%, -50%);
+        transform-origin: center top;
+        animation: blobs_2 ease-out 3.4s infinite;
+      }
+
+      .blob:nth-child(1) {
+        animation-delay: 0.2s;
+      }
+
+      .blob:nth-child(2) {
+        animation-delay: 0.4s;
+      }
+
+      .blob:nth-child(3) {
+        animation-delay: 0.6s;
+      }
+
+      .blob:nth-child(4) {
+        animation-delay: 0.8s;
+      }
+
+      .blob:nth-child(5) {
+        animation-delay: 1s;
+      }
+
+      /* stylelint-disable-next-line keyframes-name-pattern */
+      @keyframes blobs_2 {
+        0% {
+          opacity: 0;
+          transform: scale(0) translate(calc(-330px - 50%), -50%);
+        }
+
+        1% {
+          opacity: 1;
+        }
+
+        35%,
+        65% {
+          opacity: 1;
+          transform: scale(0.9) translate(-50%, -50%);
+        }
+
+        99% {
+          opacity: 1;
+        }
+
+        100% {
+          opacity: 0;
+          transform: scale(0) translate(calc(330px - 50%), -50%);
+        }
+      }
+
+      /* stylelint-disable-next-line keyframes-name-pattern */
+      @keyframes blob-grow_2 {
+        0% {
+          transform: scale(0) translate(-50%, -50%);
+        }
+
+        39% {
+          transform: scale(0) translate(-50%, -50%);
+        }
+
+        40%,
+        42% {
+          transform: scale(1, 0.9) translate(-50%, -50%);
+        }
+
+        43%,
+        44% {
+          transform: scale(1.2, 1.1) translate(-50%, -50%);
+        }
+
+        45%,
+        46% {
+          transform: scale(1.3, 1.2) translate(-50%, -50%);
+        }
+
+        47%,
+        48% {
+          transform: scale(1.4, 1.3) translate(-50%, -50%);
+        }
+
+        52% {
+          transform: scale(1.5, 1.4) translate(-50%, -50%);
+        }
+
+        54% {
+          transform: scale(1.7, 1.6) translate(-50%, -50%);
+        }
+
+        58% {
+          transform: scale(1.8, 1.7) translate(-50%, -50%);
+        }
+
+        68%,
+        70% {
+          transform: scale(1.7, 1.5) translate(-50%, -50%);
+        }
+
+        78% {
+          transform: scale(1.6, 1.4) translate(-50%, -50%);
+        }
+
+        80%,
+        81% {
+          transform: scale(1.5, 1.4) translate(-50%, -50%);
+        }
+
+        82%,
+        83% {
+          transform: scale(1.4, 1.3) translate(-50%, -50%);
+        }
+
+        84%,
+        85% {
+          transform: scale(1.3, 1.2) translate(-50%, -50%);
+        }
+
+        86%,
+        87% {
+          transform: scale(1.2, 1.1) translate(-50%, -50%);
+        }
+
+        90%,
+        91% {
+          transform: scale(1, 0.9) translate(-50%, -50%);
+        }
+
+        92%,
+        100% {
+          transform: scale(0) translate(-50%, -50%);
+        }
+      }
+    </style>
+    <div class="loading">
+      <div class="blobs">
+        <div class="blob-center"></div>
+        <div class="blob"></div>
+        <div class="blob"></div>
+        <div class="blob"></div>
+        <div class="blob"></div>
+        <div class="blob"></div>
+        <div class="blob"></div>
+      </div>
+      <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
+        <defs>
+          <filter id="goo">
+            <feGaussianBlur in="SourceGraphic" stdDeviation="10" result="blur"></feGaussianBlur>
+            <feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 18 -7" result="goo">
+            </feColorMatrix>
+            <feBlend in="SourceGraphic" in2="goo"></feBlend>
+          </filter>
+        </defs>
+      </svg>
+    </div>
+
+
+  </div>
+</body>
+
+</html>

+ 63 - 0
AdminFrontEnd/rsbuild.config.ts

@@ -0,0 +1,63 @@
+import { defineConfig, loadEnv } from '@rsbuild/core'
+
+import { createRsbuildPlugins } from './config/plugins/index'
+
+// import proxy from './config/proxy'
+
+const { publicVars, parsed } = loadEnv({
+  prefixes: ['VUE_APP_'],
+})
+
+const isBuild = process.env.NODE_ENV === 'production'
+const shouldDropConsole = !parsed.VUE_APP_DROP_CONSOLE
+  ? isBuild
+  : parsed.VUE_APP_DROP_CONSOLE === 'true'
+
+export default defineConfig({
+  /* 入口文件 */
+  source: {
+    entry: {
+      index: './src/main',
+    },
+    /* 注入环境变量 */
+    define: publicVars,
+  },
+  html: {
+    template: 'public/index.html',
+    title: parsed.VUE_APP_TITLE,
+  },
+  server: {
+    port: 9906,
+    // proxy: {
+    //   '/v1/admin': {
+    //     target: 'http://192.168.10.31:8080',
+    //     changeOrigin: true,
+    //   },
+    // },
+  },
+  tools: {
+    rspack: {
+      ignoreWarnings: [/Conflicting order/],
+      experiments: {
+        nativeWatcher: true,
+      },
+    },
+  },
+  plugins: createRsbuildPlugins(isBuild),
+  output: {
+    polyfill: 'entry',
+    cleanDistPath: isBuild,
+    legalComments: 'none',
+  },
+  performance: {
+    printFileSize: {
+      compressed: false,
+    },
+    /* 打包时候移除console */
+    removeConsole: shouldDropConsole,
+  },
+  splitChunks: {
+    preset: 'default',
+    maxInitialSize: 3000 * 1024,
+  },
+})

+ 88 - 0
AdminFrontEnd/src/App.vue

@@ -0,0 +1,88 @@
+<template>
+  <div>
+    <RouterView #default="{ Component }">
+      <component :is="Component" />
+    </RouterView>
+    <LockPage />
+  </div>
+</template>
+
+<script setup lang="tsx">
+import 'dayjs/locale/zh-cn'
+
+import { ElButton, ElNotification } from 'element-plus'
+import { RouterView, useRoute } from 'vue-router'
+
+import LockPage from '@/components/common/lock-page/LockPage.vue'
+import { createBreakpointListen } from '@/hooks/event/useBreakpoint'
+// import DisableDevtool from 'disable-devtool'
+import { useSettingStore } from '@/store/modules/layoutSetting'
+import { useUrlStore } from '@/store/modules/url'
+import { useUserStore } from '@/store/modules/user'
+import { setElementPrimaryColor } from '@/theme'
+import { checkUpdate } from '@/utils/checkUpdate'
+import { createPolling } from '@/utils/polling'
+
+/* 创建全局breakpoint事件 */
+createBreakpointListen()
+useUrlStore().updateUrl()
+const userStore = useUserStore()
+
+const route = useRoute()
+
+watchEffect(() => {
+  if (route.meta?.title) {
+    document.title = `${route.meta.title} - ${import.meta.env.VUE_APP_TITLE}`
+  }
+})
+
+// /* 禁止查看控制台 */
+// DisableDevtool({
+//   disableMenu: false,
+//   disableIframeParents: true,
+//   ignore: () => {
+//     if (import.meta.env.MODE === 'development') return true
+//     if (userStore.userInfo.user_id === 1) return true
+//     return false
+//   },
+// })
+
+const { layoutSetting } = useSettingStore()
+setElementPrimaryColor(layoutSetting.colorPrimary)
+
+const { start } = createPolling(
+  async () => {
+    await checkUpdate(() => {
+      ElNotification({
+        title: '系统更新',
+        type: 'warning',
+        message: () => (
+          <div class='app-update-message'>
+            <div class='mb-[2px]'>检测到新版本,请刷新页面。</div>
+            <ElButton
+              type='primary'
+              size='small'
+              onClick={() => window.location.reload()}
+            >
+              立即刷新
+            </ElButton>
+          </div>
+        ),
+        duration: 0,
+        showClose: true,
+      })
+    })
+  },
+  {
+    immediate: true,
+    // 20分钟检查一次
+    interval: 20 * 60 * 1000,
+    onError: (error) => {
+      console.warn('检查系统更新失败:', error)
+    },
+  },
+)
+start()
+</script>
+
+<style lang="scss"></style>

+ 310 - 0
AdminFrontEnd/src/api/app-manage/index.ts

@@ -0,0 +1,310 @@
+import { http } from '@/utils/http/request'
+
+export const FETCH_APP = new (class extends http {
+  page(params: API_APP.P.IPage) {
+    return this.request<API.PageResult<API_APP.R.IPage[]>>(
+      'omegaConfig.appBottomNavslist',
+      params,
+    )
+  }
+
+  add(params: API_APP.P.IAdd) {
+    return this.request('omegaConfig.appBottomNavsadd', params)
+  }
+
+  update(params: API_APP.P.IAdd & { id: ID }) {
+    return this.request('omegaConfig.appBottomNavsupdate', params)
+  }
+
+  detail(params: { id: ID }) {
+    return this.request<API_APP.R.IDetail>(
+      'omegaConfig.appBottomNavsquery',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaConfig.appBottomNavsdelete', id)
+  }
+
+  syncToNew(params: API_APP.P.ISyncToNew) {
+    return this.request('omegaConfig.appBottomNavscopy', params)
+  }
+})()
+
+export const FETCH_APP_PAGE = new (class extends http {
+  page(params: API_APP_PAGE.P.IPage) {
+    return this.request<API.PageResult<API_APP_PAGE.R.IPage[]>>(
+      'omegaConfig.pageUpdateInfolist',
+      params,
+    )
+  }
+
+  /* 同步文件 */
+  syncFile(params: API_APP_PAGE.P.ISync) {
+    return this.request('omegaConfig.pageUpdateInfoupdateTemplate', params)
+  }
+
+  /* 同步配置到新版本 */
+  syncToNew(params: API_APP_PAGE.P.ISyncToNew) {
+    return this.request('omegaConfig.pageUpdateInfocopy', params)
+  }
+
+  /* 编辑 */
+  update(params: API_APP_PAGE.P.IUpdate) {
+    return this.request('omegaConfig.pageUpdateInfoupdate', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaConfig.pageUpdateInfodelete', id)
+  }
+
+  /* 更新版本号 */
+  updateVersion(params: { id: ID }) {
+    return this.request('omegaConfig.pageUpdateInfoupVersion', params)
+  }
+
+  /* 详情 */
+  detail(params: { id: ID }) {
+    return this.request<API_APP_PAGE.R.IDetail>(
+      'omegaConfig.pageUpdateInfoquery',
+      params,
+    )
+  }
+})()
+
+export const FETCH_APP_RESOURCE = new (class extends http {
+  page(params: API_APP_RESOURCE.P.IPage) {
+    return this.request<API.PageResult<API_APP_RESOURCE.R.IPage[]>>(
+      'omegaConfig.fileUpdateInfolist',
+      params,
+    )
+  }
+
+  /* 同步文件 */
+  syncFile(params: API_APP_RESOURCE.P.ISync) {
+    return this.request('omegaConfig.fileUpdateInfoupdateFile', params)
+  }
+
+  /* 同步配置到新版本 */
+  syncToNew(params: API_APP_RESOURCE.P.ISyncToNew) {
+    return this.request('omegaConfig.fileUpdateInfocopy', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaConfig.fileUpdateInfodelete', id)
+  }
+
+  /* 更新版本号 */
+  updateVersion(params: { id: ID }) {
+    return this.request('omegaConfig.fileUpdateInfoupVersion', params)
+  }
+})()
+
+export const FETCH_APP_VERSION = new (class extends http {
+  page(params: API_APP_VERSION.P.IPage) {
+    return this.request<API.PageResult<API_APP_VERSION.R.IPage[]>>(
+      'omegaConfig.appVersionlist',
+      params,
+    )
+  }
+
+  add(params: API_APP_VERSION.P.IAdd) {
+    return this.request('omegaConfig.appVersionadd', params)
+  }
+
+  update(params: API_APP_VERSION.P.IAdd & { deptId: number }) {
+    return this.request('omegaConfig.appVersionupdate', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaConfig.appVersiondelete', id)
+  }
+
+  detail({ id }: { id: ID }) {
+    return this.request<API_APP_VERSION.R.IDetail>(
+      'omegaConfig.appVersioninfo',
+      id,
+    )
+  }
+})()
+
+export const FETCH_APP_STATIC = new (class extends http {
+  /* 列表查询 */
+  page(params: API_APP_STATIC.P.IPage) {
+    return this.request<API.PageResult<API_APP_STATIC.R.IPage[]>>(
+      'omegaSource.appProjectStaticgetAppProjectStaticList',
+      params,
+    )
+  }
+
+  /* 新增 */
+  add(params: API_APP_STATIC.P.IAdd) {
+    return this.request(
+      'omegaSource.appProjectStaticaddAppProjectStatic',
+      params,
+    )
+  }
+
+  /* 修改 */
+  update(params: API_APP_STATIC.P.IUpdate) {
+    return this.request(
+      'omegaSource.appProjectStaticupdateAppProjectStatic',
+      params,
+    )
+  }
+
+  /* 详情 */
+  detail(params: { id: ID }) {
+    return this.request<API_APP_STATIC.R.IDetail>(
+      'omegaSource.appProjectStaticgetAppProjectStaticQuery',
+      params,
+    )
+  }
+
+  /* 删除 */
+  delete({ id }: { id: ID }) {
+    return this.request(
+      'omegaSource.appProjectStaticdeleteAppProjectStatic',
+      id,
+    )
+  }
+})()
+
+export const FETCH_APP_PAGE_STYLE = new (class extends http {
+  /* 列表查询 */
+  page(params: API_APP_PAGE_STYLE.P.IPage) {
+    return this.request<API.PageResult<API_APP_PAGE_STYLE.R.IPage[]>>(
+      'omegaSource.appProjectPagegetAppProjectPageList',
+      params,
+    )
+  }
+
+  /* 新增 */
+  add(params: API_APP_PAGE_STYLE.P.IAdd) {
+    return this.request('omegaSource.appProjectPageaddAppProjectPage', params)
+  }
+
+  /* 修改 */
+  update(params: API_APP_PAGE_STYLE.P.IUpdate) {
+    return this.request(
+      'omegaSource.appProjectPageupdateAppProjectPage',
+      params,
+    )
+  }
+
+  /* 详情 */
+  detail(params: { id: ID }) {
+    return this.request<API_APP_PAGE_STYLE.R.IDetail>(
+      'omegaSource.appProjectPagegetAppProjectPageQuery',
+      params,
+    )
+  }
+
+  /* 删除 */
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.appProjectPagedeleteAppProjectPage', id)
+  }
+})()
+
+export const FETCH_APP_PROJECT_BOTTOM = new (class extends http {
+  /* 列表查询 */
+  page(params: API_APP_PROJECT_BOTTOM.P.IPage) {
+    return this.request<API.PageResult<API_APP_PROJECT_BOTTOM.R.IPage[]>>(
+      'omegaSource.appProjectBottomgetAppProjectBottomList',
+      params,
+    )
+  }
+
+  /* 新增 */
+  add(params: API_APP_PROJECT_BOTTOM.P.IAdd) {
+    return this.request(
+      'omegaSource.appProjectBottomaddAppProjectBottom',
+      params,
+    )
+  }
+
+  /* 修改 */
+  update(params: API_APP_PROJECT_BOTTOM.P.IUpdate[]) {
+    return this.request(
+      'omegaSource.appProjectBottomupdateAppProjectBottom',
+      params,
+    )
+  }
+
+  /* 详情 */
+  detail(params: { id: ID }) {
+    return this.request<API_APP_PROJECT_BOTTOM.R.IDetail>(
+      'omegaSource.appProjectBottomgetAppProjectBottomQuery',
+      params,
+    )
+  }
+
+  /* 删除 */
+  delete({ id }: { id: ID }) {
+    return this.request(
+      'omegaSource.appProjectBottomdeleteAppProjectBottom',
+      id,
+    )
+  }
+})()
+
+export const FETCH_APP_DEFAULT_STYLE = new (class extends http {
+  /* 编辑 */
+  update(params: API_APP_DEFAULT_STYLE.P.IUpdate) {
+    return this.request(
+      'omegaSource.appProjectPageStyleupdateAppProjectPageStyle',
+      params,
+    )
+  }
+
+  /* 详情 */
+  detail(params: API_APP_DEFAULT_STYLE.P.IDetail) {
+    return this.request<API_APP_DEFAULT_STYLE.R.IDetail>(
+      'omegaSource.appProjectPageStylegetAppProjectPageStyleQuery',
+      params,
+    )
+  }
+})()
+
+export const FETCH_APP_PROJECT_VERSION = new (class extends http {
+  /* 版本列表 */
+  page(params: API_APP_PROJECT_VERSION.P.IPage) {
+    return this.request<API.PageResult<API_APP_PROJECT_VERSION.R.IPage[]>>(
+      'omegaSource.appProjectVersiongetAppProjectVersionList',
+      params,
+    )
+  }
+
+  /* 详情 */
+  query(params: { id: ID; appId: ID }) {
+    return this.request<API_APP_PROJECT_VERSION.R.IDetail>(
+      'omegaSource.appProjectVersiongetAppProjectVersionQuery',
+      params,
+    )
+  }
+
+  /* 删除 */
+  delete({ id }: { id: ID }) {
+    return this.request(
+      'omegaSource.appProjectVersiondeleteAppProjectVersion',
+      id,
+    )
+  }
+
+  /* 新增 */
+  add(params: API_APP_PROJECT_VERSION.P.IAdd) {
+    return this.request(
+      'omegaSource.appProjectVersionaddAppProjectVersion',
+      params,
+    )
+  }
+
+  /* 修改 */
+  update(params: API_APP_PROJECT_VERSION.P.IUpdate) {
+    return this.request(
+      'omegaSource.appProjectVersionupdateAppProjectVersion',
+      params,
+    )
+  }
+})()

+ 609 - 0
AdminFrontEnd/src/api/app-manage/model.d.ts

@@ -0,0 +1,609 @@
+declare namespace API_APP {
+  namespace P {
+    interface IPage {
+      kind: string
+      appVersion: string
+    }
+
+    interface IAdd {
+      kind: string
+      title: string
+      selectIcon: string
+      normalIcon: string
+      selectTextColor: string
+      normalTextColor: string
+      pageName: string
+      noPageHint: string
+      backgroudColor: string
+      style: string
+      scrollerAnimationImages: string
+      pagPath: string
+      showTitle: string
+      customerKind: string
+      appVersion: string
+      pagLocalPath: string
+      pagDefaultIcon: string
+      iconSize: string
+      statusBarColor: string
+      pagFlag: string
+    }
+
+    interface ISyncToNew {
+      sourceVersion: string //来源版本号
+      addVersion: string //新增版本号
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      title: string
+      selectIcon: string
+      normalIcon: string
+      selectTextColor: string
+      normalTextColor: string
+      pageName: string
+      noPageHint: string
+      backgroudColor: string
+      style: string
+      id: number
+      customerKind: string
+    }
+
+    interface IDetail {
+      id: number
+      title: string
+      selectIcon: string
+      normalIcon: string
+      selectTextColor: string
+      normalTextColor: string
+      pageName: string
+      noPageHint: string
+      backgroudColor: string
+      style: string
+      showTitle: boolean
+      pagLocalPath: string
+      pagDefaultIcon: string
+      iconSize: number
+      statusBarColor: string
+      pagFlag: boolean
+      customerKind: string
+    }
+  }
+}
+
+declare namespace API_APP_PAGE {
+  namespace P {
+    interface IPage {
+      kind: string
+      appVersion: string
+      title: string
+      modulePath: string
+    }
+
+    interface ISync {
+      kind: string
+      appVersion: string
+    }
+
+    interface ISyncToNew {
+      sourceVersion: string //来源版本号
+      addVersion: string //新增版本号
+    }
+
+    interface IUpdate {
+      // 模板更新版本
+      moduleVersion: number
+      // 模板路径
+      modulePath: string
+      // 背景色
+      backgroudColor: string
+      // 前景色
+      textColor: string
+      // 苹果状态栏
+      statusBarStyle: string | number
+      // 是否显示标题
+      showTitle: boolean
+      // 标题
+      title: string
+      // 是否显示滚动条
+      showScrollBar: boolean
+      // 是否侧滑返回
+      skidFlag: boolean
+      // 左侧按钮1
+      leftBtn1: string
+      // 左侧按钮2
+      leftBtn2: string
+      // 右侧按钮1
+      rightBtn1: string
+      // 右侧按钮2
+      rightBtn2: string
+      // 左侧按钮1点击事件
+      leftAction1: string
+      // 左侧按钮2点击事件
+      leftAction2: string
+      // 右侧按钮1点击事件
+      rightAction1: string
+      // 右侧按钮2点击事件
+      rightAction2: string
+      // 是否读取网页标题
+      webTitle: boolean
+      // 下级页面
+      gotoPages: ID[]
+      // 是否强制更新
+      mustUpdate: boolean
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      moduleVersion: number
+      modulePath: string
+      title: string
+      id: number
+    }
+
+    interface IDetail {
+      moduleVersion: number
+      modulePath: string
+      backgroudColor: string
+      textColor: string
+      statusBarStyle: string
+      showTitle: boolean
+      title: string
+      showScrollBar: boolean
+      skidFlag: boolean
+      leftBtn1: string
+      leftBtn2: string
+      rightBtn1: string
+      rightBtn2: string
+      leftAction1: string
+      leftAction2: string
+      rightAction1: string
+      rightAction2: string
+      gotoPages: string
+      mustUpdate: boolean
+      id: number
+      kind: string
+      webTitle: boolean
+    }
+  }
+}
+
+declare namespace API_APP_RESOURCE {
+  namespace P {
+    interface IPage {
+      kind: string
+      appVersion: string
+    }
+
+    interface ISync {
+      kind: string
+      appVersion: string
+    }
+
+    interface ISyncToNew {
+      sourceVersion: string //来源版本号
+      addVersion: string //新增版本号
+    }
+
+    interface IUpdate {
+      // 模板更新版本
+      moduleVersion: number
+      // 模板路径
+      modulePath: string
+      // 背景色
+      backgroudColor: string
+      // 前景色
+      textColor: string
+      // 苹果状态栏
+      statusBarStyle: string | number
+      // 是否显示标题
+      showTitle: boolean
+      // 标题
+      title: string
+      // 是否显示滚动条
+      showScrollBar: boolean
+      // 是否侧滑返回
+      skidFlag: boolean
+      // 左侧按钮1
+      leftBtn1: string
+      // 左侧按钮2
+      leftBtn2: string
+      // 右侧按钮1
+      rightBtn1: string
+      // 右侧按钮2
+      rightBtn2: string
+      // 左侧按钮1点击事件
+      leftAction1: string
+      // 左侧按钮2点击事件
+      leftAction2: string
+      // 右侧按钮1点击事件
+      rightAction1: string
+      // 右侧按钮2点击事件
+      rightAction2: string
+      // 是否读取网页标题
+      webTitle: boolean
+      // 下级页面
+      gotoPages: ID[]
+      // 是否强制更新
+      mustUpdate: boolean
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      versionNum: number
+      path: string
+      fileName: string
+      id: number
+    }
+  }
+}
+
+declare namespace API_APP_VERSION {
+  namespace P {
+    interface IPage {
+      kind: string
+      appVersion: string
+    }
+
+    interface IAdd {
+      terminalKind: string //终端类型
+      versionNum: string //版本号
+      title: string //标题
+      info: string //更新信息
+      confirmText: string //确定按钮文字
+      cancelText: string //取消按钮文字
+      downloadUrl: string //更新地址
+      kind: string //分类
+    }
+  }
+  namespace R {
+    interface IPage {
+      terminalKind: string
+      versionNum: string
+      title: string
+      confirmText: string
+      cancelText: string
+      downloadUrl: string
+      id: number
+    }
+
+    interface IDetail {
+      id: number
+      terminalKind: string
+      versionNum: string
+      title: string
+      confirmText: string
+      cancelText: string
+      downloadUrl: string
+      info: string
+    }
+  }
+}
+
+declare namespace API_APP_STATIC {
+  namespace P {
+    interface IPage {
+      pageSize: number
+      pageNum: number
+      versionId: ID
+      appId: ID
+      fileType?: string
+    }
+
+    interface IAdd {
+      filePath: string
+      versionId: ID
+      appId: ID
+    }
+
+    interface IUpdate {
+      fileName: string
+      id: ID
+      versionId: ID
+      appId: ID
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      versionNum: number
+      filePath: string
+      fileName: string
+      fileSize: number
+      id: number
+    }
+
+    interface IDetail {
+      versionNum: number
+      filePath: string
+      fileName: string
+      fileSize: number
+      fileType: string
+      id: number
+    }
+  }
+}
+
+declare namespace API_APP_PAGE_STYLE {
+  namespace P {
+    interface IPage {
+      pageSize: number
+      pageNum: number
+      versionId: ID
+      appId?: ID
+    }
+
+    interface IAdd {
+      moduleVersion: number
+      webTitle: boolean
+      mustUpdate: boolean
+      gotoPages: string
+      versionId: ID
+      rightBtn: string
+      // {
+      //   btnText: string
+      //   btnIcon: string
+      //   btnAction: string
+      // }[]
+      leftBtn: string
+      skidFlag: boolean
+      showScrollBar: boolean
+      title: string
+      showTitle: boolean
+      statusBarStyle: string
+      textColor: string
+      backgroudColor: string
+      modulePath: string
+      appId: ID
+      titlePosition: string
+      moduleFile: string
+    }
+
+    interface IUpdate {
+      moduleVersion: number
+      webTitle: boolean
+      id: ID
+      mustUpdate: boolean
+      gotoPages: string
+      versionId: ID
+      rightBtn: string
+      leftBtn: string
+      skidFlag: boolean
+      showScrollBar: boolean
+      title: string
+      showTitle: boolean
+      statusBarStyle: string
+      textColor: string
+      backgroudColor: string
+      modulePath: string
+      appId: ID
+      titlePosition: string
+      moduleFile: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      title: string
+      modulePath: string
+      id: ID
+    }
+
+    interface IDetail {
+      moduleVersion: number
+      webTitle: boolean
+      mustUpdate: boolean
+      gotoPages: string
+      versionId: ID
+      rightBtn: string
+      leftBtn: string
+      skidFlag: boolean
+      showScrollBar: boolean
+      title: string
+      showTitle: boolean
+      statusBarStyle: string
+      textColor: string
+      backgroudColor: string
+      modulePath: string
+      appId: number
+      titlePosition: string
+      moduleFile: string
+      moduleContent: string
+
+      updateTime: string
+      createTime: string
+      createBy: string
+      updateBy: string
+    }
+  }
+}
+
+declare namespace API_APP_PROJECT_BOTTOM {
+  namespace P {
+    interface IPage {
+      pageSize: number
+      pageNum: number
+      versionId?: ID
+      appId?: ID
+    }
+
+    interface IAdd {
+      title: string
+      selectIcon: string
+      normalIcon: string
+      selectTextColor: string
+      normalTextColor: string
+      pageName: string
+      noPageHint: string
+      backgroudColor: string
+      style: string
+      pagPath: string
+      showTitle: boolean
+      pagLocalPath: string
+      pagDefaultIcon: string
+      iconSize: number
+      statusBarColor: string
+      pagFlag: boolean
+      versionId: ID
+      appId: ID
+    }
+
+    interface IUpdate {
+      // id: ID
+      title: string
+      selectIcon: string
+      normalIcon: string
+      selectTextColor: string
+      normalTextColor: string
+      pageName: string
+      backgroudColor: string
+      style: string
+      showTitle: boolean
+      pagLocalPath: string
+      pagDefaultIcon: string
+      iconSize: number
+      statusBarColor: string
+      pagFlag: boolean
+      versionId: ID
+      appId: ID
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      title: string
+      selectIcon: string
+      normalIcon: string
+      selectTextColor: string
+      normalTextColor: string
+      pageName: string
+      noPageHint: string
+      backgroudColor: string
+      style: string
+      scrollerAnimationImages: string
+      pagPath: string
+      showTitle: boolean
+      pagLocalPath: string
+      pagDefaultIcon: string
+      iconSize: number
+      statusBarColor: string
+      id: number
+      pagFlag: boolean
+    }
+
+    interface IDetail {
+      title: string
+      selectIcon: string
+      normalIcon: string
+      selectTextColor: string
+      normalTextColor: string
+      pageName: string
+      noPageHint: string
+      backgroudColor: string
+      style: string
+      scrollerAnimationImages: string
+      pagPath: string
+      showTitle: boolean
+      pagLocalPath: string
+      pagDefaultIcon: string
+      iconSize: number
+      statusBarColor: string
+      pagFlag: boolean
+      versionId: ID
+      appId: number
+    }
+  }
+}
+
+declare namespace API_APP_DEFAULT_STYLE {
+  namespace P {
+    interface IUpdate {
+      appId: ID
+      backgroudColor: string
+      textColor: string
+      statusBarStyle: string
+      showTitle: boolean
+      showScrollBar: boolean
+      skidFlag: boolean
+      titlePosition: string
+      mustUpdate: boolean
+    }
+
+    interface IDetail {
+      appId: ID
+      versionId: ID
+    }
+  }
+
+  namespace R {
+    interface IDetail {
+      appId: ID
+      backgroudColor: string
+      textColor: string
+      statusBarStyle: string
+      showTitle: boolean
+      showScrollBar: boolean
+      skidFlag: boolean
+      titlePosition: string
+      mustUpdate: boolean
+    }
+  }
+}
+
+declare namespace API_APP_PROJECT_VERSION {
+  namespace P {
+    interface IPage {
+      pageSize: number
+      pageNum: number
+      appId?: ID
+    }
+    interface IAdd {
+      versionCode: string
+      versionName: string
+      frontendVersion: string
+      staticFile: string
+    }
+    interface IUpdate {
+      id: ID
+      appId: ID
+      versionCode: string
+      versionName: string
+      frontendVersion: string
+      staticFile: string
+    }
+    interface IDelete {
+      id: ID
+      appId: ID
+    }
+    interface IDetail {
+      id: ID
+      appId?: ID
+    }
+  }
+  namespace R {
+    interface IPage {
+      id: ID
+      staticFile: string
+
+      createTime: string
+      updateTime: string
+      createBy: string
+      updateBy: string
+      versionCode: string
+      versionName: string
+      frontendVersion: string
+    }
+    interface IDetail {
+      id: ID
+      createTime: string
+      updateTime: string
+      createBy: string
+      updateBy: string
+      versionCode: string
+      versionName: string
+      frontendVersion: string
+    }
+  }
+}

+ 23 - 0
AdminFrontEnd/src/api/auths/dept/index.ts

@@ -0,0 +1,23 @@
+import { http } from '@/utils/http/request'
+
+export const FETCH_DEPT = new (class extends http {
+  page(params?: API_DEPT_P.IPage) {
+    return this.request<API_DEPT_R.IPage[]>('omegaConfig.depttree', params)
+  }
+
+  list() {
+    return this.request<API_DEPT_R.IPage[]>('omegaConfig.deptlist')
+  }
+
+  add(params: API_DEPT_P.IAdd) {
+    return this.request('omegaConfig.deptadd', params)
+  }
+
+  update(params: API_DEPT_P.IAdd & { deptId: number }) {
+    return this.request('omegaConfig.deptupdate', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaConfig.deptremoveById', id)
+  }
+})()

+ 23 - 0
AdminFrontEnd/src/api/auths/dept/model.d.ts

@@ -0,0 +1,23 @@
+declare namespace API_DEPT_P {
+  interface IPage {
+    deptName?: string
+  }
+
+  interface IAdd {
+    name: string
+    parentId: number
+    sortOrder: number
+  }
+}
+declare namespace API_DEPT_R {
+  interface IPage {
+    id: number
+    name: string
+    parentId: number
+    menuType: any
+    sortOrder: number
+    permission: any
+    children: IDepts[]
+    deptId: ID
+  }
+}

+ 221 - 0
AdminFrontEnd/src/api/auths/menu/icon-migration.ts

@@ -0,0 +1,221 @@
+// 使用ai生成对应图标后,手动调用这个函数更新菜单图标
+// // 预览,不更新,默认 dryRun: true
+// const preview = await updateMenuIconsByName()
+
+// // 真正批量更新
+// const result = await updateMenuIconsByName({
+//   dryRun: false,
+//   concurrency: 4,
+// })
+
+import { FETCH_MENU } from './index'
+
+type MenuItem = API_MENU_R.menus & {
+  children?: MenuItem[]
+  enName?: string | null
+}
+
+type UpdateMenuIconsOptions = {
+  dryRun?: boolean
+  concurrency?: number
+  menus?: MenuItem[]
+}
+
+type MenuIconUpdateItem = {
+  menuId: ID
+  name: string
+  from: string
+  to: string
+}
+
+const MENU_NAME_ICON_MAP: Record<string, string> = {
+  APIController: 'tabler:api-app',
+  ApiController: 'tabler:api-app',
+  ApiGroup: 'tabler:folder-code',
+  ApiInfo: 'tabler:api',
+  ApiInfoParam: 'tabler:list-details',
+  AppModule: 'tabler:puzzle',
+  AppModuleAndroidCode: 'tabler:brand-android',
+  AppModuleFile: 'tabler:file-stack',
+  AppModuleIosCode: 'tabler:brand-apple',
+  AppProject: 'tabler:device-mobile-code',
+  AppProjectBottom: 'tabler:layout-bottombar',
+  AppProjectPage: 'tabler:file-description',
+  AppProjectPageStyle: 'tabler:palette',
+  AppProjectParam: 'tabler:adjustments-code',
+  AppProjectStatic: 'tabler:file-stack',
+  AppProjectVersion: 'tabler:versions',
+  Application: 'tabler:apps',
+  BackgroundProject: 'tabler:background',
+  BackgroundProjectMenu: 'tabler:menu-2',
+  BackgroundProjectMenuPage: 'tabler:file-description',
+  BusinessModule: 'tabler:briefcase',
+  DatabaseField: 'tabler:forms',
+  DatabaseFieldTabs: 'tabler:layout-navbar',
+  DatabaseInfo: 'tabler:database',
+  DatabaseMakeLog: 'tabler:file-code',
+  DatabaseOperateLog: 'tabler:file-database',
+  DatabaseTable: 'tabler:table',
+  Developer: 'tabler:code',
+  Environment: 'tabler:cloud-cog',
+  FeatureModule: 'tabler:puzzle',
+  LogicLogRecord: 'tabler:file-analytics',
+  LogicNode: 'tabler:hierarchy',
+  LogicNodeKind: 'tabler:category-2',
+  LogicProject: 'tabler:route',
+  MakeData: 'tabler:database-plus',
+  MakeTemplate: 'tabler:template',
+  MakeTemplateGategory: 'tabler:category',
+  Middleware: 'tabler:plug-connected',
+  Project: 'tabler:folder-code',
+  ProjectApiVersion: 'tabler:api-app',
+  ProjectBusinessModule: 'tabler:briefcase',
+  ProjectGroup: 'tabler:folders',
+  ProjectMember: 'tabler:users-group',
+  ProjectRole: 'tabler:user-cog',
+  ProjectService: 'tabler:server',
+  ProjectWorker: 'tabler:users',
+  Server: 'tabler:server-cog',
+  SysDict: 'tabler:book',
+  SysDictItem: 'tabler:list-details',
+  SysLog: 'tabler:file-analytics',
+  SysPublicParam: 'tabler:adjustments',
+  TestProject: 'tabler:flask',
+  APP模块管理: 'tabler:device-mobile-code',
+  中间件配置: 'tabler:plug-connected',
+  参数管理: 'tabler:adjustments',
+  字典管理: 'tabler:book',
+  岗位管理: 'tabler:id-badge-2',
+  应用端配置: 'tabler:apps',
+  接口管理: 'tabler:api-app',
+  操作日志: 'tabler:file-analytics',
+  数据库管理: 'tabler:database',
+  数据库配置: 'tabler:database-cog',
+  服务器配置: 'tabler:server-cog',
+  权限管理: 'tabler:shield-lock',
+  环境配置: 'tabler:cloud-cog',
+  用户管理: 'tabler:users',
+  系统管理: 'tabler:settings-cog',
+  菜单管理: 'tabler:menu-2',
+  角色管理: 'tabler:user-shield',
+  资源配置管理: 'tabler:folder-cog',
+  部门管理: 'tabler:building-community',
+  项目管理: 'tabler:folder-code',
+  市场管理: 'tabler:building-store',
+  模板配置: 'tabler:template',
+  节点管理: 'tabler:hierarchy',
+}
+
+function flattenMenus(menus: MenuItem[]) {
+  const result: MenuItem[] = []
+  const walk = (items: MenuItem[]) => {
+    items.forEach((item) => {
+      result.push(item)
+      if (item.children?.length) walk(item.children)
+    })
+  }
+
+  walk(menus)
+  return result
+}
+
+function hasLegacyIcon(item: MenuItem) {
+  return typeof item.icon === 'string' && item.icon.trim().length > 0
+}
+
+export function resolveMenuIconByName(item: Pick<MenuItem, 'name'>) {
+  return MENU_NAME_ICON_MAP[item.name] || 'tabler:menu-2'
+}
+
+export function collectMenuIconUpdates(menus: MenuItem[]) {
+  return flattenMenus(menus)
+    .filter(hasLegacyIcon)
+    .map((item) => ({
+      item,
+      icon: resolveMenuIconByName(item),
+    }))
+    .filter(({ item, icon }) => item.icon !== icon)
+}
+
+async function runWithConcurrency<T>(
+  items: T[],
+  concurrency: number,
+  worker: (item: T) => Promise<void>,
+) {
+  const queue = [...items]
+  const workers = Array.from(
+    { length: Math.min(Math.max(concurrency, 1), queue.length) },
+    async () => {
+      while (queue.length) {
+        const item = queue.shift()
+        if (!item) continue
+        await worker(item)
+      }
+    },
+  )
+
+  await Promise.all(workers)
+}
+
+export async function updateMenuIconsByName(
+  options: UpdateMenuIconsOptions = {},
+) {
+  const { dryRun = true, concurrency = 4 } = options
+  const menus =
+    options.menus || ((await FETCH_MENU.menus()).data as unknown as MenuItem[])
+  const updates = collectMenuIconUpdates(menus)
+
+  const preview: MenuIconUpdateItem[] = updates.map(({ item, icon }) => ({
+    menuId: item.menuId,
+    name: item.name,
+    from: item.icon,
+    to: icon,
+  }))
+
+  if (dryRun) {
+    return {
+      dryRun,
+      total: preview.length,
+      updates: preview,
+      success: [] as MenuIconUpdateItem[],
+      failed: [] as Array<MenuIconUpdateItem & { error: unknown }>,
+    }
+  }
+
+  const success: MenuIconUpdateItem[] = []
+  const failed: Array<MenuIconUpdateItem & { error: unknown }> = []
+
+  await runWithConcurrency(updates, concurrency, async ({ item, icon }) => {
+    const current: MenuIconUpdateItem = {
+      menuId: item.menuId,
+      name: item.name,
+      from: item.icon,
+      to: icon,
+    }
+
+    try {
+      const { error } = await FETCH_MENU.update({
+        ...item,
+        icon,
+        menuId: item.menuId,
+      })
+
+      if (error) {
+        failed.push({ ...current, error })
+        return
+      }
+
+      success.push(current)
+    } catch (error) {
+      failed.push({ ...current, error })
+    }
+  })
+
+  return {
+    dryRun,
+    total: preview.length,
+    updates: preview,
+    success,
+    failed,
+  }
+}

+ 19 - 0
AdminFrontEnd/src/api/auths/menu/index.ts

@@ -0,0 +1,19 @@
+import { http } from '@/utils/http/request'
+
+export const FETCH_MENU = new (class extends http {
+  menus() {
+    return this.request<API_MENU_R.menus[]>('omegaConfig.menulist')
+  }
+
+  add(params: API_MENU_R.menus) {
+    return this.request('omegaConfig.menuadd', params)
+  }
+
+  update(params: API_MENU_R.menus & { menuId: ID }) {
+    return this.request('omegaConfig.menuupdate', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaConfig.menuremoveById', id)
+  }
+})()

+ 8682 - 0
AdminFrontEnd/src/api/auths/menu/menu-tree.json

@@ -0,0 +1,8682 @@
+[
+  {
+    "menuId": 6,
+    "name": "权限管理",
+    "enName": null,
+    "permission": "",
+    "path": "/permission",
+    "viewPath": "system/permission/user/index.vue",
+    "parentId": 0,
+    "icon": "yanzhengma",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-09 16:44:20",
+    "updateBy": "admin",
+    "updateTime": "2025-11-11 14:28:21",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 7,
+    "name": "菜单管理",
+    "enName": null,
+    "permission": "",
+    "path": "/system/permission/menu",
+    "viewPath": "permission/menu/index.vue",
+    "parentId": 6,
+    "icon": "zhuxingtu",
+    "visible": "1",
+    "sortOrder": 1,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-09 16:48:26",
+    "updateBy": "admin",
+    "updateTime": "2025-10-15 16:17:02",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 8,
+    "name": "部门管理",
+    "enName": null,
+    "permission": "",
+    "path": "/system/permission/dept",
+    "viewPath": "permission/dept/index.vue",
+    "parentId": 6,
+    "icon": "yanzhengma",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-09 17:28:06",
+    "updateBy": "admin",
+    "updateTime": "2025-10-15 16:17:18",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 9,
+    "name": "角色管理",
+    "enName": null,
+    "permission": "",
+    "path": "/system/permission/role",
+    "viewPath": "permission/role/index.vue",
+    "parentId": 6,
+    "icon": "yanzhengma",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-09 17:28:43",
+    "updateBy": "admin",
+    "updateTime": "2025-10-15 16:17:49",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 10,
+    "name": "岗位管理",
+    "enName": null,
+    "permission": "",
+    "path": "/system/permission/post",
+    "viewPath": "permission/post/index.vue",
+    "parentId": 6,
+    "icon": "yanzhengma",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-09 17:29:14",
+    "updateBy": "admin",
+    "updateTime": "2025-10-15 16:18:05",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 11,
+    "name": "用户管理",
+    "enName": null,
+    "permission": "",
+    "path": "/system/permission/user",
+    "viewPath": "permission/user/index.vue",
+    "parentId": 6,
+    "icon": "yanzhengma",
+    "visible": "1",
+    "sortOrder": 2,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-09 17:29:49",
+    "updateBy": "admin",
+    "updateTime": "2025-10-15 16:18:14",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 14,
+    "name": "资源配置管理",
+    "enName": null,
+    "permission": "",
+    "path": "/resource",
+    "viewPath": "",
+    "parentId": 0,
+    "icon": "wangpan",
+    "visible": "1",
+    "sortOrder": 1,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-10 15:41:01",
+    "updateBy": "admin",
+    "updateTime": "2025-10-15 16:04:00",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 15,
+    "name": "应用端配置",
+    "enName": null,
+    "permission": "",
+    "path": "/application-config",
+    "viewPath": "resource/application-config/index.vue",
+    "parentId": 14,
+    "icon": "wangpan",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-10 15:41:47",
+    "updateBy": "admin",
+    "updateTime": "2025-10-10 15:41:47",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 17,
+    "name": "环境配置",
+    "enName": null,
+    "permission": "",
+    "path": "/resource/env-config",
+    "viewPath": "resource/env-config/index.vue",
+    "parentId": 14,
+    "icon": "canshushezhi",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 14:29:38",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 14:29:38",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 18,
+    "name": "服务器配置",
+    "enName": null,
+    "permission": "",
+    "path": "/resource/server-config",
+    "viewPath": "resource/server-config/index.vue",
+    "parentId": 14,
+    "icon": "dingshirenwuguanli",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "1",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 14:30:00",
+    "updateBy": "admin",
+    "updateTime": "2025-11-17 16:58:22",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 19,
+    "name": "数据库配置",
+    "enName": null,
+    "permission": "",
+    "path": "/resource/data-config",
+    "viewPath": "resource/data-config/index.vue",
+    "parentId": 14,
+    "icon": "gailan",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 14:31:02",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 14:31:02",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 20,
+    "name": "中间件配置",
+    "enName": null,
+    "permission": "",
+    "path": "/resource/middle-config",
+    "viewPath": "resource/middle-config/index.vue",
+    "parentId": 14,
+    "icon": "zaixianyonghujiankong",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 14:31:16",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 14:31:16",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 21,
+    "name": "Project",
+    "enName": "Project",
+    "permission": null,
+    "path": "/Project",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 22,
+    "name": "项目",
+    "enName": "project",
+    "permission": null,
+    "path": "/Project/project/index",
+    "viewPath": null,
+    "parentId": 21,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 23,
+    "name": "新增",
+    "enName": null,
+    "permission": "Project_addProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 22,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 24,
+    "name": "修改",
+    "enName": null,
+    "permission": "Project_updateProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 22,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 25,
+    "name": "删除",
+    "enName": null,
+    "permission": "Project_deleteProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 22,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 26,
+    "name": "FeatureModule",
+    "enName": "FeatureModule",
+    "permission": null,
+    "path": "/FeatureModule",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 27,
+    "name": "功能模块",
+    "enName": "featureModule",
+    "permission": null,
+    "path": "/FeatureModule/featureModule/index",
+    "viewPath": null,
+    "parentId": 26,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 28,
+    "name": "新增",
+    "enName": null,
+    "permission": "FeatureModule_addFeatureModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 27,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 29,
+    "name": "修改",
+    "enName": null,
+    "permission": "FeatureModule_updateFeatureModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 27,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 30,
+    "name": "删除",
+    "enName": null,
+    "permission": "FeatureModule_deleteFeatureModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 27,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 31,
+    "name": "BusinessModule",
+    "enName": "BusinessModule",
+    "permission": null,
+    "path": "/BusinessModule",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 32,
+    "name": "业务模块",
+    "enName": "businessModule",
+    "permission": null,
+    "path": "/BusinessModule/businessModule/index",
+    "viewPath": null,
+    "parentId": 31,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 33,
+    "name": "新增",
+    "enName": null,
+    "permission": "BusinessModule_addBusinessModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 32,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 34,
+    "name": "修改",
+    "enName": null,
+    "permission": "BusinessModule_updateBusinessModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 32,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 35,
+    "name": "删除",
+    "enName": null,
+    "permission": "BusinessModule_deleteBusinessModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 32,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 36,
+    "name": "ProjectGroup",
+    "enName": "ProjectGroup",
+    "permission": null,
+    "path": "/ProjectGroup",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 37,
+    "name": "项目分组",
+    "enName": "projectGroup",
+    "permission": null,
+    "path": "/ProjectGroup/projectGroup/index",
+    "viewPath": null,
+    "parentId": 36,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 38,
+    "name": "新增",
+    "enName": null,
+    "permission": "ProjectGroup_addProjectGroup",
+    "path": null,
+    "viewPath": null,
+    "parentId": 37,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 39,
+    "name": "修改",
+    "enName": null,
+    "permission": "ProjectGroup_updateProjectGroup",
+    "path": null,
+    "viewPath": null,
+    "parentId": 37,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 40,
+    "name": "删除",
+    "enName": null,
+    "permission": "ProjectGroup_deleteProjectGroup",
+    "path": null,
+    "viewPath": null,
+    "parentId": 37,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 41,
+    "name": "ProjectMember",
+    "enName": "ProjectMember",
+    "permission": null,
+    "path": "/ProjectMember",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 42,
+    "name": "项目成员",
+    "enName": "projectMember",
+    "permission": null,
+    "path": "/ProjectMember/projectMember/index",
+    "viewPath": null,
+    "parentId": 41,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 43,
+    "name": "新增",
+    "enName": null,
+    "permission": "ProjectMember_addProjectMember",
+    "path": null,
+    "viewPath": null,
+    "parentId": 42,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 44,
+    "name": "修改",
+    "enName": null,
+    "permission": "ProjectMember_updateProjectMember",
+    "path": null,
+    "viewPath": null,
+    "parentId": 42,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 45,
+    "name": "删除",
+    "enName": null,
+    "permission": "ProjectMember_deleteProjectMember",
+    "path": null,
+    "viewPath": null,
+    "parentId": 42,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 46,
+    "name": "Developer",
+    "enName": "Developer",
+    "permission": null,
+    "path": "/Developer",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 47,
+    "name": "开发者",
+    "enName": "developer",
+    "permission": null,
+    "path": "/Developer/developer/index",
+    "viewPath": null,
+    "parentId": 46,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 48,
+    "name": "新增",
+    "enName": null,
+    "permission": "Developer_addDeveloper",
+    "path": null,
+    "viewPath": null,
+    "parentId": 47,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 49,
+    "name": "修改",
+    "enName": null,
+    "permission": "Developer_updateDeveloper",
+    "path": null,
+    "viewPath": null,
+    "parentId": 47,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 50,
+    "name": "删除",
+    "enName": null,
+    "permission": "Developer_deleteDeveloper",
+    "path": null,
+    "viewPath": null,
+    "parentId": 47,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 51,
+    "name": "ProjectService",
+    "enName": "ProjectService",
+    "permission": null,
+    "path": "/ProjectService",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 52,
+    "name": "项目服务",
+    "enName": "projectService",
+    "permission": null,
+    "path": "/ProjectService/projectService/index",
+    "viewPath": null,
+    "parentId": 51,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 53,
+    "name": "新增",
+    "enName": null,
+    "permission": "ProjectService_addProjectService",
+    "path": null,
+    "viewPath": null,
+    "parentId": 52,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 54,
+    "name": "修改",
+    "enName": null,
+    "permission": "ProjectService_updateProjectService",
+    "path": null,
+    "viewPath": null,
+    "parentId": 52,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 55,
+    "name": "删除",
+    "enName": null,
+    "permission": "ProjectService_deleteProjectService",
+    "path": null,
+    "viewPath": null,
+    "parentId": 52,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:04",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:04",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 56,
+    "name": "ProjectApiVersion",
+    "enName": "ProjectApiVersion",
+    "permission": null,
+    "path": "/ProjectApiVersion",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 57,
+    "name": "项目接口版本",
+    "enName": "projectApiVersion",
+    "permission": null,
+    "path": "/ProjectApiVersion/projectApiVersion/index",
+    "viewPath": null,
+    "parentId": 56,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 58,
+    "name": "新增",
+    "enName": null,
+    "permission": "ProjectApiVersion_addProjectApiVersion",
+    "path": null,
+    "viewPath": null,
+    "parentId": 57,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 59,
+    "name": "修改",
+    "enName": null,
+    "permission": "ProjectApiVersion_updateProjectApiVersion",
+    "path": null,
+    "viewPath": null,
+    "parentId": 57,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 60,
+    "name": "删除",
+    "enName": null,
+    "permission": "ProjectApiVersion_deleteProjectApiVersion",
+    "path": null,
+    "viewPath": null,
+    "parentId": 57,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 61,
+    "name": "ProjectBusinessModule",
+    "enName": "ProjectBusinessModule",
+    "permission": null,
+    "path": "/ProjectBusinessModule",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 62,
+    "name": "项目业务模块",
+    "enName": "projectBusinessModule",
+    "permission": null,
+    "path": "/ProjectBusinessModule/projectBusinessModule/index",
+    "viewPath": null,
+    "parentId": 61,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 63,
+    "name": "新增",
+    "enName": null,
+    "permission": "ProjectBusinessModule_addProjectBusinessModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 62,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 64,
+    "name": "修改",
+    "enName": null,
+    "permission": "ProjectBusinessModule_updateProjectBusinessModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 62,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 65,
+    "name": "删除",
+    "enName": null,
+    "permission": "ProjectBusinessModule_deleteProjectBusinessModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 62,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 66,
+    "name": "ProjectRole",
+    "enName": "ProjectRole",
+    "permission": null,
+    "path": "/ProjectRole",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 67,
+    "name": "项目角色",
+    "enName": "projectRole",
+    "permission": null,
+    "path": "/ProjectRole/projectRole/index",
+    "viewPath": null,
+    "parentId": 66,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 68,
+    "name": "新增",
+    "enName": null,
+    "permission": "ProjectRole_addProjectRole",
+    "path": null,
+    "viewPath": null,
+    "parentId": 67,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 69,
+    "name": "修改",
+    "enName": null,
+    "permission": "ProjectRole_updateProjectRole",
+    "path": null,
+    "viewPath": null,
+    "parentId": 67,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 70,
+    "name": "删除",
+    "enName": null,
+    "permission": "ProjectRole_deleteProjectRole",
+    "path": null,
+    "viewPath": null,
+    "parentId": 67,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 71,
+    "name": "ProjectWorker",
+    "enName": "ProjectWorker",
+    "permission": null,
+    "path": "/ProjectWorker",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 72,
+    "name": "项目人员",
+    "enName": "projectWorker",
+    "permission": null,
+    "path": "/ProjectWorker/projectWorker/index",
+    "viewPath": null,
+    "parentId": 71,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 73,
+    "name": "新增",
+    "enName": null,
+    "permission": "ProjectWorker_addProjectWorker",
+    "path": null,
+    "viewPath": null,
+    "parentId": 72,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 74,
+    "name": "修改",
+    "enName": null,
+    "permission": "ProjectWorker_updateProjectWorker",
+    "path": null,
+    "viewPath": null,
+    "parentId": 72,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 75,
+    "name": "删除",
+    "enName": null,
+    "permission": "ProjectWorker_deleteProjectWorker",
+    "path": null,
+    "viewPath": null,
+    "parentId": 72,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 76,
+    "name": "SysDictItem",
+    "enName": "SysDictItem",
+    "permission": null,
+    "path": "/SysDictItem",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 77,
+    "name": "字典项",
+    "enName": "sysDictItem",
+    "permission": null,
+    "path": "/SysDictItem/sysDictItem/index",
+    "viewPath": null,
+    "parentId": 76,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 78,
+    "name": "新增",
+    "enName": null,
+    "permission": "SysDictItem_addSysDictItem",
+    "path": null,
+    "viewPath": null,
+    "parentId": 77,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 79,
+    "name": "修改",
+    "enName": null,
+    "permission": "SysDictItem_updateSysDictItem",
+    "path": null,
+    "viewPath": null,
+    "parentId": 77,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 80,
+    "name": "删除",
+    "enName": null,
+    "permission": "SysDictItem_deleteSysDictItem",
+    "path": null,
+    "viewPath": null,
+    "parentId": 77,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 81,
+    "name": "Application",
+    "enName": "Application",
+    "permission": null,
+    "path": "/Application",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 82,
+    "name": "应用端配置",
+    "enName": "application",
+    "permission": null,
+    "path": "/Application/application/index",
+    "viewPath": null,
+    "parentId": 81,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 83,
+    "name": "新增",
+    "enName": null,
+    "permission": "Application_addApplication",
+    "path": null,
+    "viewPath": null,
+    "parentId": 82,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 84,
+    "name": "修改",
+    "enName": null,
+    "permission": "Application_updateApplication",
+    "path": null,
+    "viewPath": null,
+    "parentId": 82,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 85,
+    "name": "删除",
+    "enName": null,
+    "permission": "Application_deleteApplication",
+    "path": null,
+    "viewPath": null,
+    "parentId": 82,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 86,
+    "name": "Environment",
+    "enName": "Environment",
+    "permission": null,
+    "path": "/Environment",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 87,
+    "name": "环境配置",
+    "enName": "environment",
+    "permission": null,
+    "path": "/Environment/environment/index",
+    "viewPath": null,
+    "parentId": 86,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 88,
+    "name": "新增",
+    "enName": null,
+    "permission": "Environment_addEnvironment",
+    "path": null,
+    "viewPath": null,
+    "parentId": 87,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 89,
+    "name": "修改",
+    "enName": null,
+    "permission": "Environment_updateEnvironment",
+    "path": null,
+    "viewPath": null,
+    "parentId": 87,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 90,
+    "name": "删除",
+    "enName": null,
+    "permission": "Environment_deleteEnvironment",
+    "path": null,
+    "viewPath": null,
+    "parentId": 87,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 91,
+    "name": "Server",
+    "enName": "Server",
+    "permission": null,
+    "path": "/Server",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 92,
+    "name": "服务器配置",
+    "enName": "server",
+    "permission": null,
+    "path": "/Server/server/index",
+    "viewPath": null,
+    "parentId": 91,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 93,
+    "name": "新增",
+    "enName": null,
+    "permission": "Server_addServer",
+    "path": null,
+    "viewPath": null,
+    "parentId": 92,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 94,
+    "name": "修改",
+    "enName": null,
+    "permission": "Server_updateServer",
+    "path": null,
+    "viewPath": null,
+    "parentId": 92,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 95,
+    "name": "删除",
+    "enName": null,
+    "permission": "Server_deleteServer",
+    "path": null,
+    "viewPath": null,
+    "parentId": 92,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 96,
+    "name": "DatabaseInfo",
+    "enName": "DatabaseInfo",
+    "permission": null,
+    "path": "/DatabaseInfo",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 97,
+    "name": "数据库配置",
+    "enName": "databaseInfo",
+    "permission": null,
+    "path": "/DatabaseInfo/databaseInfo/index",
+    "viewPath": null,
+    "parentId": 96,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 98,
+    "name": "新增",
+    "enName": null,
+    "permission": "DatabaseInfo_addDatabaseInfo",
+    "path": null,
+    "viewPath": null,
+    "parentId": 97,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 99,
+    "name": "修改",
+    "enName": null,
+    "permission": "DatabaseInfo_updateDatabaseInfo",
+    "path": null,
+    "viewPath": null,
+    "parentId": 97,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 100,
+    "name": "删除",
+    "enName": null,
+    "permission": "DatabaseInfo_deleteDatabaseInfo",
+    "path": null,
+    "viewPath": null,
+    "parentId": 97,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:05",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:05",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 101,
+    "name": "Middleware",
+    "enName": "Middleware",
+    "permission": null,
+    "path": "/Middleware",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:06",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:06",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 102,
+    "name": "中间件配置",
+    "enName": "middleware",
+    "permission": null,
+    "path": "/Middleware/middleware/index",
+    "viewPath": null,
+    "parentId": 101,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:06",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:06",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 103,
+    "name": "新增",
+    "enName": null,
+    "permission": "Middleware_addMiddleware",
+    "path": null,
+    "viewPath": null,
+    "parentId": 102,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:06",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:06",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 104,
+    "name": "修改",
+    "enName": null,
+    "permission": "Middleware_updateMiddleware",
+    "path": null,
+    "viewPath": null,
+    "parentId": 102,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:06",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:06",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 105,
+    "name": "删除",
+    "enName": null,
+    "permission": "Middleware_deleteMiddleware",
+    "path": null,
+    "viewPath": null,
+    "parentId": 102,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-11 15:22:06",
+    "updateBy": "admin",
+    "updateTime": "2025-10-11 15:22:06",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 106,
+    "name": "系统管理",
+    "enName": null,
+    "permission": "",
+    "path": "/system",
+    "viewPath": "",
+    "parentId": 0,
+    "icon": "canshushezhi",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-13 15:34:29",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 17:32:56",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 107,
+    "name": "字典管理",
+    "enName": null,
+    "permission": "",
+    "path": "/system/dict",
+    "viewPath": "system/dict/index.vue",
+    "parentId": 106,
+    "icon": "canshushezhi",
+    "visible": "1",
+    "sortOrder": 255,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-13 15:35:23",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 17:35:47",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 108,
+    "name": "SysDict",
+    "enName": "SysDict",
+    "permission": null,
+    "path": "/SysDict",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-13 16:28:22",
+    "updateBy": "admin",
+    "updateTime": "2025-10-13 16:28:22",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 109,
+    "name": "字典类型",
+    "enName": "sysDict",
+    "permission": null,
+    "path": "/SysDict/sysDict/index",
+    "viewPath": null,
+    "parentId": 108,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-13 16:28:22",
+    "updateBy": "admin",
+    "updateTime": "2025-10-13 16:28:22",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 110,
+    "name": "新增",
+    "enName": null,
+    "permission": "SysDict_addSysDict",
+    "path": null,
+    "viewPath": null,
+    "parentId": 109,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-13 16:28:22",
+    "updateBy": "admin",
+    "updateTime": "2025-10-13 16:28:22",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 111,
+    "name": "修改",
+    "enName": null,
+    "permission": "SysDict_updateSysDict",
+    "path": null,
+    "viewPath": null,
+    "parentId": 109,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-13 16:28:22",
+    "updateBy": "admin",
+    "updateTime": "2025-10-13 16:28:22",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 112,
+    "name": "删除",
+    "enName": null,
+    "permission": "SysDict_deleteSysDict",
+    "path": null,
+    "viewPath": null,
+    "parentId": 109,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-13 16:28:22",
+    "updateBy": "admin",
+    "updateTime": "2025-10-13 16:28:22",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 118,
+    "name": "SysLog",
+    "enName": "SysLog",
+    "permission": null,
+    "path": "/SysLog",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-16 15:02:52",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 15:02:52",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 119,
+    "name": "日志表",
+    "enName": "sysLog",
+    "permission": null,
+    "path": "/SysLog/sysLog/index",
+    "viewPath": null,
+    "parentId": 118,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-16 15:02:52",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 15:02:52",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 120,
+    "name": "新增",
+    "enName": null,
+    "permission": "SysLog_addSysLog",
+    "path": null,
+    "viewPath": null,
+    "parentId": 119,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-16 15:02:52",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 15:02:52",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 121,
+    "name": "修改",
+    "enName": null,
+    "permission": "SysLog_updateSysLog",
+    "path": null,
+    "viewPath": null,
+    "parentId": 119,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-16 15:02:52",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 15:02:52",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 122,
+    "name": "删除",
+    "enName": null,
+    "permission": "SysLog_deleteSysLog",
+    "path": null,
+    "viewPath": null,
+    "parentId": 119,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-16 15:02:52",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 15:02:52",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 123,
+    "name": "SysPublicParam",
+    "enName": "SysPublicParam",
+    "permission": null,
+    "path": "/SysPublicParam",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-16 15:02:52",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 15:02:52",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 124,
+    "name": "公共参数配置表",
+    "enName": "sysPublicParam",
+    "permission": null,
+    "path": "/SysPublicParam/sysPublicParam/index",
+    "viewPath": null,
+    "parentId": 123,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-10-16 15:02:52",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 15:02:52",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 125,
+    "name": "新增",
+    "enName": null,
+    "permission": "SysPublicParam_addSysPublicParam",
+    "path": null,
+    "viewPath": null,
+    "parentId": 124,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-16 15:02:52",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 15:02:52",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 126,
+    "name": "修改",
+    "enName": null,
+    "permission": "SysPublicParam_updateSysPublicParam",
+    "path": null,
+    "viewPath": null,
+    "parentId": 124,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-16 15:02:52",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 15:02:52",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 127,
+    "name": "删除",
+    "enName": null,
+    "permission": "SysPublicParam_deleteSysPublicParam",
+    "path": null,
+    "viewPath": null,
+    "parentId": 124,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-16 15:02:52",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 15:02:52",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 128,
+    "name": "操作日志",
+    "enName": null,
+    "permission": "",
+    "path": "/system/log",
+    "viewPath": "system/log/index.vue",
+    "parentId": 106,
+    "icon": "zujianshiyong",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-16 17:38:27",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 17:38:27",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 129,
+    "name": "参数管理",
+    "enName": null,
+    "permission": "",
+    "path": "/system/params",
+    "viewPath": "system/params/index.vue",
+    "parentId": 106,
+    "icon": "rizhi1",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-10-16 17:40:34",
+    "updateBy": "admin",
+    "updateTime": "2025-10-16 17:40:48",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 130,
+    "name": "项目管理",
+    "enName": null,
+    "permission": "",
+    "path": "/project/manage",
+    "viewPath": "project/manage/index.vue",
+    "parentId": 0,
+    "icon": "tabler:settings",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-10 16:59:31",
+    "updateBy": "admin",
+    "updateTime": "2026-06-23 10:09:51",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 132,
+    "name": "项目详情",
+    "enName": null,
+    "permission": "",
+    "path": "/project/manage/details",
+    "viewPath": "project/manage-details/index.vue",
+    "parentId": 130,
+    "icon": "",
+    "visible": "0",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-11 11:37:43",
+    "updateBy": "admin",
+    "updateTime": "2026-05-20 10:10:17",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 133,
+    "name": "DatabaseTable",
+    "enName": "DatabaseTable",
+    "permission": null,
+    "path": "/DatabaseTable",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 134,
+    "name": "数据表",
+    "enName": "databaseTable",
+    "permission": null,
+    "path": "/DatabaseTable/databaseTable/index",
+    "viewPath": null,
+    "parentId": 133,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 135,
+    "name": "新增",
+    "enName": null,
+    "permission": "DatabaseTable_addDatabaseTable",
+    "path": null,
+    "viewPath": null,
+    "parentId": 134,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 136,
+    "name": "修改",
+    "enName": null,
+    "permission": "DatabaseTable_updateDatabaseTable",
+    "path": null,
+    "viewPath": null,
+    "parentId": 134,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 137,
+    "name": "删除",
+    "enName": null,
+    "permission": "DatabaseTable_deleteDatabaseTable",
+    "path": null,
+    "viewPath": null,
+    "parentId": 134,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 138,
+    "name": "DatabaseField",
+    "enName": "DatabaseField",
+    "permission": null,
+    "path": "/DatabaseField",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 139,
+    "name": "数据字段",
+    "enName": "databaseField",
+    "permission": null,
+    "path": "/DatabaseField/databaseField/index",
+    "viewPath": null,
+    "parentId": 138,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 140,
+    "name": "新增",
+    "enName": null,
+    "permission": "DatabaseField_addDatabaseField",
+    "path": null,
+    "viewPath": null,
+    "parentId": 139,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 141,
+    "name": "修改",
+    "enName": null,
+    "permission": "DatabaseField_updateDatabaseField",
+    "path": null,
+    "viewPath": null,
+    "parentId": 139,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 142,
+    "name": "删除",
+    "enName": null,
+    "permission": "DatabaseField_deleteDatabaseField",
+    "path": null,
+    "viewPath": null,
+    "parentId": 139,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 143,
+    "name": "DatabaseFieldTabs",
+    "enName": "DatabaseFieldTabs",
+    "permission": null,
+    "path": "/DatabaseFieldTabs",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 144,
+    "name": "数据字段选项卡",
+    "enName": "databaseFieldTabs",
+    "permission": null,
+    "path": "/DatabaseFieldTabs/databaseFieldTabs/index",
+    "viewPath": null,
+    "parentId": 143,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 145,
+    "name": "新增",
+    "enName": null,
+    "permission": "DatabaseFieldTabs_addDatabaseFieldTabs",
+    "path": null,
+    "viewPath": null,
+    "parentId": 144,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 146,
+    "name": "修改",
+    "enName": null,
+    "permission": "DatabaseFieldTabs_updateDatabaseFieldTabs",
+    "path": null,
+    "viewPath": null,
+    "parentId": 144,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 147,
+    "name": "删除",
+    "enName": null,
+    "permission": "DatabaseFieldTabs_deleteDatabaseFieldTabs",
+    "path": null,
+    "viewPath": null,
+    "parentId": 144,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 148,
+    "name": "DatabaseOperateLog",
+    "enName": "DatabaseOperateLog",
+    "permission": null,
+    "path": "/DatabaseOperateLog",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 149,
+    "name": "数据库操作日志",
+    "enName": "databaseOperateLog",
+    "permission": null,
+    "path": "/DatabaseOperateLog/databaseOperateLog/index",
+    "viewPath": null,
+    "parentId": 148,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 150,
+    "name": "新增",
+    "enName": null,
+    "permission": "DatabaseOperateLog_addDatabaseOperateLog",
+    "path": null,
+    "viewPath": null,
+    "parentId": 149,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 151,
+    "name": "修改",
+    "enName": null,
+    "permission": "DatabaseOperateLog_updateDatabaseOperateLog",
+    "path": null,
+    "viewPath": null,
+    "parentId": 149,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 152,
+    "name": "删除",
+    "enName": null,
+    "permission": "DatabaseOperateLog_deleteDatabaseOperateLog",
+    "path": null,
+    "viewPath": null,
+    "parentId": 149,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 153,
+    "name": "DatabaseMakeLog",
+    "enName": "DatabaseMakeLog",
+    "permission": null,
+    "path": "/DatabaseMakeLog",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 154,
+    "name": "数据库生成日志",
+    "enName": "databaseMakeLog",
+    "permission": null,
+    "path": "/DatabaseMakeLog/databaseMakeLog/index",
+    "viewPath": null,
+    "parentId": 153,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 155,
+    "name": "新增",
+    "enName": null,
+    "permission": "DatabaseMakeLog_addDatabaseMakeLog",
+    "path": null,
+    "viewPath": null,
+    "parentId": 154,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 156,
+    "name": "修改",
+    "enName": null,
+    "permission": "DatabaseMakeLog_updateDatabaseMakeLog",
+    "path": null,
+    "viewPath": null,
+    "parentId": 154,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 157,
+    "name": "删除",
+    "enName": null,
+    "permission": "DatabaseMakeLog_deleteDatabaseMakeLog",
+    "path": null,
+    "viewPath": null,
+    "parentId": 154,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 158,
+    "name": "ApiGroup",
+    "enName": "ApiGroup",
+    "permission": null,
+    "path": "/ApiGroup",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 159,
+    "name": "接口分组",
+    "enName": "apiGroup",
+    "permission": null,
+    "path": "/ApiGroup/apiGroup/index",
+    "viewPath": null,
+    "parentId": 158,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 160,
+    "name": "新增",
+    "enName": null,
+    "permission": "ApiGroup_addApiGroup",
+    "path": null,
+    "viewPath": null,
+    "parentId": 159,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 161,
+    "name": "修改",
+    "enName": null,
+    "permission": "ApiGroup_updateApiGroup",
+    "path": null,
+    "viewPath": null,
+    "parentId": 159,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 162,
+    "name": "删除",
+    "enName": null,
+    "permission": "ApiGroup_deleteApiGroup",
+    "path": null,
+    "viewPath": null,
+    "parentId": 159,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 163,
+    "name": "ApiInfo",
+    "enName": "ApiInfo",
+    "permission": null,
+    "path": "/ApiInfo",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 164,
+    "name": "接口信息",
+    "enName": "apiInfo",
+    "permission": null,
+    "path": "/ApiInfo/apiInfo/index",
+    "viewPath": null,
+    "parentId": 163,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 165,
+    "name": "新增",
+    "enName": null,
+    "permission": "ApiInfo_addApiInfo",
+    "path": null,
+    "viewPath": null,
+    "parentId": 164,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 166,
+    "name": "修改",
+    "enName": null,
+    "permission": "ApiInfo_updateApiInfo",
+    "path": null,
+    "viewPath": null,
+    "parentId": 164,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 167,
+    "name": "删除",
+    "enName": null,
+    "permission": "ApiInfo_deleteApiInfo",
+    "path": null,
+    "viewPath": null,
+    "parentId": 164,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 168,
+    "name": "ApiInfoParam",
+    "enName": "ApiInfoParam",
+    "permission": null,
+    "path": "/ApiInfoParam",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 169,
+    "name": "接口信息参数",
+    "enName": "apiInfoParam",
+    "permission": null,
+    "path": "/ApiInfoParam/apiInfoParam/index",
+    "viewPath": null,
+    "parentId": 168,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 170,
+    "name": "新增",
+    "enName": null,
+    "permission": "ApiInfoParam_addApiInfoParam",
+    "path": null,
+    "viewPath": null,
+    "parentId": 169,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 171,
+    "name": "修改",
+    "enName": null,
+    "permission": "ApiInfoParam_updateApiInfoParam",
+    "path": null,
+    "viewPath": null,
+    "parentId": 169,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 172,
+    "name": "删除",
+    "enName": null,
+    "permission": "ApiInfoParam_deleteApiInfoParam",
+    "path": null,
+    "viewPath": null,
+    "parentId": 169,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 173,
+    "name": "AppModule",
+    "enName": "AppModule",
+    "permission": null,
+    "path": "/AppModule",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 174,
+    "name": "APP功能模块",
+    "enName": "appModule",
+    "permission": null,
+    "path": "/AppModule/appModule/index",
+    "viewPath": null,
+    "parentId": 173,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 175,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppModule_addAppModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 174,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 176,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppModule_updateAppModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 174,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 177,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppModule_deleteAppModule",
+    "path": null,
+    "viewPath": null,
+    "parentId": 174,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 178,
+    "name": "AppModuleAndroidCode",
+    "enName": "AppModuleAndroidCode",
+    "permission": null,
+    "path": "/AppModuleAndroidCode",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 179,
+    "name": "APP功能模块安卓代码",
+    "enName": "appModuleAndroidCode",
+    "permission": null,
+    "path": "/AppModuleAndroidCode/appModuleAndroidCode/index",
+    "viewPath": null,
+    "parentId": 178,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 180,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppModuleAndroidCode_addAppModuleAndroidCode",
+    "path": null,
+    "viewPath": null,
+    "parentId": 179,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 181,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppModuleAndroidCode_updateAppModuleAndroidCode",
+    "path": null,
+    "viewPath": null,
+    "parentId": 179,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 182,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppModuleAndroidCode_deleteAppModuleAndroidCode",
+    "path": null,
+    "viewPath": null,
+    "parentId": 179,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:23",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:23",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 183,
+    "name": "AppModuleFile",
+    "enName": "AppModuleFile",
+    "permission": null,
+    "path": "/AppModuleFile",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 184,
+    "name": "APP功能模块文件",
+    "enName": "appModuleFile",
+    "permission": null,
+    "path": "/AppModuleFile/appModuleFile/index",
+    "viewPath": null,
+    "parentId": 183,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 185,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppModuleFile_addAppModuleFile",
+    "path": null,
+    "viewPath": null,
+    "parentId": 184,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 186,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppModuleFile_updateAppModuleFile",
+    "path": null,
+    "viewPath": null,
+    "parentId": 184,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 187,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppModuleFile_deleteAppModuleFile",
+    "path": null,
+    "viewPath": null,
+    "parentId": 184,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 188,
+    "name": "AppModuleIosCode",
+    "enName": "AppModuleIosCode",
+    "permission": null,
+    "path": "/AppModuleIosCode",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 189,
+    "name": "APP功能模块IOS代码",
+    "enName": "appModuleIosCode",
+    "permission": null,
+    "path": "/AppModuleIosCode/appModuleIosCode/index",
+    "viewPath": null,
+    "parentId": 188,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 190,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppModuleIosCode_addAppModuleIosCode",
+    "path": null,
+    "viewPath": null,
+    "parentId": 189,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 191,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppModuleIosCode_updateAppModuleIosCode",
+    "path": null,
+    "viewPath": null,
+    "parentId": 189,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 192,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppModuleIosCode_deleteAppModuleIosCode",
+    "path": null,
+    "viewPath": null,
+    "parentId": 189,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 193,
+    "name": "AppProject",
+    "enName": "AppProject",
+    "permission": null,
+    "path": "/AppProject",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 194,
+    "name": "APP项目",
+    "enName": "appProject",
+    "permission": null,
+    "path": "/AppProject/appProject/index",
+    "viewPath": null,
+    "parentId": 193,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 195,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppProject_addAppProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 194,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 196,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppProject_updateAppProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 194,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 197,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppProject_deleteAppProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 194,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 198,
+    "name": "AppProjectParam",
+    "enName": "AppProjectParam",
+    "permission": null,
+    "path": "/AppProjectParam",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 199,
+    "name": "APP项目对应参数",
+    "enName": "appProjectParam",
+    "permission": null,
+    "path": "/AppProjectParam/appProjectParam/index",
+    "viewPath": null,
+    "parentId": 198,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 200,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppProjectParam_addAppProjectParam",
+    "path": null,
+    "viewPath": null,
+    "parentId": 199,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 201,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppProjectParam_updateAppProjectParam",
+    "path": null,
+    "viewPath": null,
+    "parentId": 199,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 202,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppProjectParam_deleteAppProjectParam",
+    "path": null,
+    "viewPath": null,
+    "parentId": 199,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 203,
+    "name": "AppProjectVersion",
+    "enName": "AppProjectVersion",
+    "permission": null,
+    "path": "/AppProjectVersion",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 204,
+    "name": "APP项目版本",
+    "enName": "appProjectVersion",
+    "permission": null,
+    "path": "/AppProjectVersion/appProjectVersion/index",
+    "viewPath": null,
+    "parentId": 203,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 205,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppProjectVersion_addAppProjectVersion",
+    "path": null,
+    "viewPath": null,
+    "parentId": 204,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 206,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppProjectVersion_updateAppProjectVersion",
+    "path": null,
+    "viewPath": null,
+    "parentId": 204,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 207,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppProjectVersion_deleteAppProjectVersion",
+    "path": null,
+    "viewPath": null,
+    "parentId": 204,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-12 15:34:24",
+    "updateBy": "admin",
+    "updateTime": "2025-11-12 15:34:24",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 208,
+    "name": "市场管理",
+    "enName": null,
+    "permission": "",
+    "path": "market",
+    "viewPath": "",
+    "parentId": 0,
+    "icon": "ziduanguanli",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-11-17 11:16:14",
+    "updateBy": "admin",
+    "updateTime": "2025-11-17 11:16:14",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 209,
+    "name": "APP模块管理",
+    "enName": null,
+    "permission": "",
+    "path": "/market/modal",
+    "viewPath": "market/modal/index.vue",
+    "parentId": 208,
+    "icon": "zhuomian",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-17 11:16:35",
+    "updateBy": "admin",
+    "updateTime": "2026-06-23 07:14:46",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 210,
+    "name": "接口管理",
+    "enName": null,
+    "permission": "",
+    "path": "/interface/manage",
+    "viewPath": "interface/manage/index.vue",
+    "parentId": 0,
+    "icon": "jintiaojingling",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-18 17:00:07",
+    "updateBy": "admin",
+    "updateTime": "2026-05-18 04:27:06",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 211,
+    "name": "数据库管理",
+    "enName": null,
+    "permission": "",
+    "path": "/database/manage",
+    "viewPath": "database/manage/index.vue",
+    "parentId": 0,
+    "icon": "wangpankongjian",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-20 10:32:42",
+    "updateBy": "admin",
+    "updateTime": "2026-05-20 09:55:46",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 212,
+    "name": "数据库详情",
+    "enName": null,
+    "permission": "",
+    "path": "/database/manage/details",
+    "viewPath": "database/manage-details/index.vue",
+    "parentId": 211,
+    "icon": "",
+    "visible": "0",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-11-24 17:32:38",
+    "updateBy": "admin",
+    "updateTime": "2026-05-20 09:07:48",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 213,
+    "name": "AppProjectBottom",
+    "enName": "AppProjectBottom",
+    "permission": null,
+    "path": "/AppProjectBottom",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 214,
+    "name": "APP底部导航",
+    "enName": "appProjectBottom",
+    "permission": null,
+    "path": "/AppProjectBottom/appProjectBottom/index",
+    "viewPath": null,
+    "parentId": 213,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 215,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppProjectBottom_addAppProjectBottom",
+    "path": null,
+    "viewPath": null,
+    "parentId": 214,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 216,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppProjectBottom_updateAppProjectBottom",
+    "path": null,
+    "viewPath": null,
+    "parentId": 214,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 217,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppProjectBottom_deleteAppProjectBottom",
+    "path": null,
+    "viewPath": null,
+    "parentId": 214,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 218,
+    "name": "AppProjectStatic",
+    "enName": "AppProjectStatic",
+    "permission": null,
+    "path": "/AppProjectStatic",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 219,
+    "name": "APP静态资源",
+    "enName": "appProjectStatic",
+    "permission": null,
+    "path": "/AppProjectStatic/appProjectStatic/index",
+    "viewPath": null,
+    "parentId": 218,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 220,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppProjectStatic_addAppProjectStatic",
+    "path": null,
+    "viewPath": null,
+    "parentId": 219,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 221,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppProjectStatic_updateAppProjectStatic",
+    "path": null,
+    "viewPath": null,
+    "parentId": 219,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 222,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppProjectStatic_deleteAppProjectStatic",
+    "path": null,
+    "viewPath": null,
+    "parentId": 219,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 223,
+    "name": "AppProjectPage",
+    "enName": "AppProjectPage",
+    "permission": null,
+    "path": "/AppProjectPage",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 224,
+    "name": "APP页面模板",
+    "enName": "appProjectPage",
+    "permission": null,
+    "path": "/AppProjectPage/appProjectPage/index",
+    "viewPath": null,
+    "parentId": 223,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 225,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppProjectPage_addAppProjectPage",
+    "path": null,
+    "viewPath": null,
+    "parentId": 224,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 226,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppProjectPage_updateAppProjectPage",
+    "path": null,
+    "viewPath": null,
+    "parentId": 224,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 227,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppProjectPage_deleteAppProjectPage",
+    "path": null,
+    "viewPath": null,
+    "parentId": 224,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 228,
+    "name": "AppProjectPageStyle",
+    "enName": "AppProjectPageStyle",
+    "permission": null,
+    "path": "/AppProjectPageStyle",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 229,
+    "name": "APP页面模板默认样式",
+    "enName": "appProjectPageStyle",
+    "permission": null,
+    "path": "/AppProjectPageStyle/appProjectPageStyle/index",
+    "viewPath": null,
+    "parentId": 228,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 230,
+    "name": "新增",
+    "enName": null,
+    "permission": "AppProjectPageStyle_addAppProjectPageStyle",
+    "path": null,
+    "viewPath": null,
+    "parentId": 229,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 231,
+    "name": "修改",
+    "enName": null,
+    "permission": "AppProjectPageStyle_updateAppProjectPageStyle",
+    "path": null,
+    "viewPath": null,
+    "parentId": 229,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 232,
+    "name": "删除",
+    "enName": null,
+    "permission": "AppProjectPageStyle_deleteAppProjectPageStyle",
+    "path": null,
+    "viewPath": null,
+    "parentId": 229,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-08 18:27:41",
+    "updateBy": "admin",
+    "updateTime": "2025-12-08 18:27:41",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 233,
+    "name": "模板配置",
+    "enName": null,
+    "permission": "",
+    "path": "/resource/template-config",
+    "viewPath": "resource/template-config/index.vue",
+    "parentId": 14,
+    "icon": "ant-design",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "0",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-11 15:56:02",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 15:56:02",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 234,
+    "name": "MakeTemplateGategory",
+    "enName": "MakeTemplateGategory",
+    "permission": null,
+    "path": "/MakeTemplateGategory",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 235,
+    "name": "生成模板分类",
+    "enName": "makeTemplateGategory",
+    "permission": null,
+    "path": "/MakeTemplateGategory/makeTemplateGategory/index",
+    "viewPath": null,
+    "parentId": 234,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 236,
+    "name": "新增",
+    "enName": null,
+    "permission": "MakeTemplateGategory_addMakeTemplateGategory",
+    "path": null,
+    "viewPath": null,
+    "parentId": 235,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 237,
+    "name": "修改",
+    "enName": null,
+    "permission": "MakeTemplateGategory_updateMakeTemplateGategory",
+    "path": null,
+    "viewPath": null,
+    "parentId": 235,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 238,
+    "name": "删除",
+    "enName": null,
+    "permission": "MakeTemplateGategory_deleteMakeTemplateGategory",
+    "path": null,
+    "viewPath": null,
+    "parentId": 235,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 239,
+    "name": "MakeTemplate",
+    "enName": "MakeTemplate",
+    "permission": null,
+    "path": "/MakeTemplate",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 240,
+    "name": "生成模板",
+    "enName": "makeTemplate",
+    "permission": null,
+    "path": "/MakeTemplate/makeTemplate/index",
+    "viewPath": null,
+    "parentId": 239,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 241,
+    "name": "新增",
+    "enName": null,
+    "permission": "MakeTemplate_addMakeTemplate",
+    "path": null,
+    "viewPath": null,
+    "parentId": 240,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 242,
+    "name": "修改",
+    "enName": null,
+    "permission": "MakeTemplate_updateMakeTemplate",
+    "path": null,
+    "viewPath": null,
+    "parentId": 240,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 243,
+    "name": "删除",
+    "enName": null,
+    "permission": "MakeTemplate_deleteMakeTemplate",
+    "path": null,
+    "viewPath": null,
+    "parentId": 240,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 244,
+    "name": "LogicProject",
+    "enName": "LogicProject",
+    "permission": null,
+    "path": "/LogicProject",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 245,
+    "name": "逻辑项",
+    "enName": "logicProject",
+    "permission": null,
+    "path": "/LogicProject/logicProject/index",
+    "viewPath": null,
+    "parentId": 244,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 246,
+    "name": "新增",
+    "enName": null,
+    "permission": "LogicProject_addLogicProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 245,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 247,
+    "name": "修改",
+    "enName": null,
+    "permission": "LogicProject_updateLogicProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 245,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 248,
+    "name": "删除",
+    "enName": null,
+    "permission": "LogicProject_deleteLogicProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 245,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-11 16:28:03",
+    "updateBy": "admin",
+    "updateTime": "2025-12-11 16:28:03",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 249,
+    "name": "LogicNodeKind",
+    "enName": "LogicNodeKind",
+    "permission": null,
+    "path": "/LogicNodeKind",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-22 11:25:12",
+    "updateBy": "admin",
+    "updateTime": "2025-12-22 11:25:12",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 250,
+    "name": "逻辑节点分类",
+    "enName": "logicNodeKind",
+    "permission": null,
+    "path": "/LogicNodeKind/logicNodeKind/index",
+    "viewPath": null,
+    "parentId": 249,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-22 11:25:12",
+    "updateBy": "admin",
+    "updateTime": "2025-12-22 11:25:12",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 251,
+    "name": "新增",
+    "enName": null,
+    "permission": "LogicNodeKind_addLogicNodeKind",
+    "path": null,
+    "viewPath": null,
+    "parentId": 250,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-22 11:25:12",
+    "updateBy": "admin",
+    "updateTime": "2025-12-22 11:25:12",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 252,
+    "name": "修改",
+    "enName": null,
+    "permission": "LogicNodeKind_updateLogicNodeKind",
+    "path": null,
+    "viewPath": null,
+    "parentId": 250,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-22 11:25:12",
+    "updateBy": "admin",
+    "updateTime": "2025-12-22 11:25:12",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 253,
+    "name": "删除",
+    "enName": null,
+    "permission": "LogicNodeKind_deleteLogicNodeKind",
+    "path": null,
+    "viewPath": null,
+    "parentId": 250,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-22 11:25:12",
+    "updateBy": "admin",
+    "updateTime": "2025-12-22 11:25:12",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 254,
+    "name": "LogicNode",
+    "enName": "LogicNode",
+    "permission": null,
+    "path": "/LogicNode",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-22 11:25:12",
+    "updateBy": "admin",
+    "updateTime": "2025-12-22 11:25:12",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 255,
+    "name": "逻辑节点",
+    "enName": "logicNode",
+    "permission": null,
+    "path": "/LogicNode/logicNode/index",
+    "viewPath": null,
+    "parentId": 254,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2025-12-22 11:25:12",
+    "updateBy": "admin",
+    "updateTime": "2025-12-22 11:25:12",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 256,
+    "name": "新增",
+    "enName": null,
+    "permission": "LogicNode_addLogicNode",
+    "path": null,
+    "viewPath": null,
+    "parentId": 255,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-22 11:25:12",
+    "updateBy": "admin",
+    "updateTime": "2025-12-22 11:25:12",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 257,
+    "name": "修改",
+    "enName": null,
+    "permission": "LogicNode_updateLogicNode",
+    "path": null,
+    "viewPath": null,
+    "parentId": 255,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-22 11:25:12",
+    "updateBy": "admin",
+    "updateTime": "2025-12-22 11:25:12",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 258,
+    "name": "删除",
+    "enName": null,
+    "permission": "LogicNode_deleteLogicNode",
+    "path": null,
+    "viewPath": null,
+    "parentId": 255,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2025-12-22 11:25:12",
+    "updateBy": "admin",
+    "updateTime": "2025-12-22 11:25:12",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 259,
+    "name": "节点管理",
+    "enName": null,
+    "permission": "",
+    "path": "/resource/node-config",
+    "viewPath": "resource/node-config/index.vue",
+    "parentId": 14,
+    "icon": "yingyongzhongxin",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": "0",
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-02-03 14:01:30",
+    "updateBy": "admin",
+    "updateTime": "2026-05-18 04:04:24",
+    "delFlag": "0",
+    "isExt": 0,
+    "openMode": 1,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 260,
+    "name": "ApiController",
+    "enName": "ApiController",
+    "permission": null,
+    "path": "/ApiController",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-02-04 11:57:47",
+    "updateBy": "admin",
+    "updateTime": "2026-02-04 11:57:47",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 261,
+    "name": "接口控制器",
+    "enName": "apiController",
+    "permission": null,
+    "path": "/ApiController/apiController/index",
+    "viewPath": null,
+    "parentId": 260,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-02-04 11:57:47",
+    "updateBy": "admin",
+    "updateTime": "2026-02-04 11:57:47",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 262,
+    "name": "新增",
+    "enName": null,
+    "permission": "ApiController_addApiController",
+    "path": null,
+    "viewPath": null,
+    "parentId": 261,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-02-04 11:57:47",
+    "updateBy": "admin",
+    "updateTime": "2026-02-04 11:57:47",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 263,
+    "name": "修改",
+    "enName": null,
+    "permission": "ApiController_updateApiController",
+    "path": null,
+    "viewPath": null,
+    "parentId": 261,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-02-04 11:57:47",
+    "updateBy": "admin",
+    "updateTime": "2026-02-04 11:57:47",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 264,
+    "name": "删除",
+    "enName": null,
+    "permission": "ApiController_deleteApiController",
+    "path": null,
+    "viewPath": null,
+    "parentId": 261,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-02-04 11:57:47",
+    "updateBy": "admin",
+    "updateTime": "2026-02-04 11:57:47",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 265,
+    "name": "MakeData",
+    "enName": "MakeData",
+    "permission": null,
+    "path": "/MakeData",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-04-27 11:18:30",
+    "updateBy": "admin",
+    "updateTime": "2026-04-27 11:18:30",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 266,
+    "name": "生成数据存档",
+    "enName": "makeData",
+    "permission": null,
+    "path": "/MakeData/makeData/index",
+    "viewPath": null,
+    "parentId": 265,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-04-27 11:18:30",
+    "updateBy": "admin",
+    "updateTime": "2026-04-27 11:18:30",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 267,
+    "name": "新增",
+    "enName": null,
+    "permission": "MakeData_addMakeData",
+    "path": null,
+    "viewPath": null,
+    "parentId": 266,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-04-27 11:18:30",
+    "updateBy": "admin",
+    "updateTime": "2026-04-27 11:18:30",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 268,
+    "name": "修改",
+    "enName": null,
+    "permission": "MakeData_updateMakeData",
+    "path": null,
+    "viewPath": null,
+    "parentId": 266,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-04-27 11:18:30",
+    "updateBy": "admin",
+    "updateTime": "2026-04-27 11:18:30",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 269,
+    "name": "删除",
+    "enName": null,
+    "permission": "MakeData_deleteMakeData",
+    "path": null,
+    "viewPath": null,
+    "parentId": 266,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-04-27 11:18:30",
+    "updateBy": "admin",
+    "updateTime": "2026-04-27 11:18:30",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 270,
+    "name": "LogicLogRecord",
+    "enName": "LogicLogRecord",
+    "permission": null,
+    "path": "/LogicLogRecord",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-05-18 09:45:13",
+    "updateBy": "admin",
+    "updateTime": "2026-05-18 09:45:13",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 271,
+    "name": "逻辑执行日志",
+    "enName": "logicLogRecord",
+    "permission": null,
+    "path": "/LogicLogRecord/logicLogRecord/index",
+    "viewPath": null,
+    "parentId": 270,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-05-18 09:45:13",
+    "updateBy": "admin",
+    "updateTime": "2026-05-18 09:45:13",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 272,
+    "name": "新增",
+    "enName": null,
+    "permission": "LogicLogRecord_addLogicLogRecord",
+    "path": null,
+    "viewPath": null,
+    "parentId": 271,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-05-18 09:45:13",
+    "updateBy": "admin",
+    "updateTime": "2026-05-18 09:45:13",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 273,
+    "name": "修改",
+    "enName": null,
+    "permission": "LogicLogRecord_updateLogicLogRecord",
+    "path": null,
+    "viewPath": null,
+    "parentId": 271,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-05-18 09:45:13",
+    "updateBy": "admin",
+    "updateTime": "2026-05-18 09:45:13",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 274,
+    "name": "删除",
+    "enName": null,
+    "permission": "LogicLogRecord_deleteLogicLogRecord",
+    "path": null,
+    "viewPath": null,
+    "parentId": 271,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-05-18 09:45:13",
+    "updateBy": "admin",
+    "updateTime": "2026-05-18 09:45:13",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 275,
+    "name": "BackgroundProject",
+    "enName": "BackgroundProject",
+    "permission": null,
+    "path": "/BackgroundProject",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:49",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:49",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 276,
+    "name": "后台项目",
+    "enName": "backgroundProject",
+    "permission": null,
+    "path": "/BackgroundProject/backgroundProject/index",
+    "viewPath": null,
+    "parentId": 275,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:49",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:49",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 277,
+    "name": "新增",
+    "enName": null,
+    "permission": "BackgroundProject_addBackgroundProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 276,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:49",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:49",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 278,
+    "name": "修改",
+    "enName": null,
+    "permission": "BackgroundProject_updateBackgroundProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 276,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:49",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:49",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 279,
+    "name": "删除",
+    "enName": null,
+    "permission": "BackgroundProject_deleteBackgroundProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 276,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:49",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:49",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 280,
+    "name": "BackgroundProjectMenu",
+    "enName": "BackgroundProjectMenu",
+    "permission": null,
+    "path": "/BackgroundProjectMenu",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:49",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:49",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 281,
+    "name": "后台项目菜单",
+    "enName": "backgroundProjectMenu",
+    "permission": null,
+    "path": "/BackgroundProjectMenu/backgroundProjectMenu/index",
+    "viewPath": null,
+    "parentId": 280,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:49",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:49",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 282,
+    "name": "新增",
+    "enName": null,
+    "permission": "BackgroundProjectMenu_addBackgroundProjectMenu",
+    "path": null,
+    "viewPath": null,
+    "parentId": 281,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:49",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:49",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 283,
+    "name": "修改",
+    "enName": null,
+    "permission": "BackgroundProjectMenu_updateBackgroundProjectMenu",
+    "path": null,
+    "viewPath": null,
+    "parentId": 281,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:50",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:50",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 284,
+    "name": "删除",
+    "enName": null,
+    "permission": "BackgroundProjectMenu_deleteBackgroundProjectMenu",
+    "path": null,
+    "viewPath": null,
+    "parentId": 281,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:50",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:50",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 285,
+    "name": "BackgroundProjectMenuPage",
+    "enName": "BackgroundProjectMenuPage",
+    "permission": null,
+    "path": "/BackgroundProjectMenuPage",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:50",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:50",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 286,
+    "name": "后台项目菜单页面文件",
+    "enName": "backgroundProjectMenuPage",
+    "permission": null,
+    "path": "/BackgroundProjectMenuPage/backgroundProjectMenuPage/index",
+    "viewPath": null,
+    "parentId": 285,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:50",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:50",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 287,
+    "name": "新增",
+    "enName": null,
+    "permission": "BackgroundProjectMenuPage_addBackgroundProjectMenuPage",
+    "path": null,
+    "viewPath": null,
+    "parentId": 286,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:50",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:50",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 288,
+    "name": "修改",
+    "enName": null,
+    "permission": "BackgroundProjectMenuPage_updateBackgroundProjectMenuPage",
+    "path": null,
+    "viewPath": null,
+    "parentId": 286,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:50",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:50",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 289,
+    "name": "删除",
+    "enName": null,
+    "permission": "BackgroundProjectMenuPage_deleteBackgroundProjectMenuPage",
+    "path": null,
+    "viewPath": null,
+    "parentId": 286,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-10 08:48:50",
+    "updateBy": "admin",
+    "updateTime": "2026-06-10 08:48:50",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 290,
+    "name": "TestProject",
+    "enName": "TestProject",
+    "permission": null,
+    "path": "/TestProject",
+    "viewPath": null,
+    "parentId": -1,
+    "icon": "ep:coffee",
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-06-11 04:00:09",
+    "updateBy": "admin",
+    "updateTime": "2026-06-11 04:00:09",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 291,
+    "name": "测试项目",
+    "enName": "testProject",
+    "permission": null,
+    "path": "/TestProject/testProject/index",
+    "viewPath": null,
+    "parentId": 290,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "0",
+    "createBy": "admin",
+    "createTime": "2026-06-11 04:00:09",
+    "updateBy": "admin",
+    "updateTime": "2026-06-11 04:00:09",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 292,
+    "name": "新增",
+    "enName": null,
+    "permission": "TestProject_addTestProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 291,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-11 04:00:09",
+    "updateBy": "admin",
+    "updateTime": "2026-06-11 04:00:09",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 293,
+    "name": "修改",
+    "enName": null,
+    "permission": "TestProject_updateTestProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 291,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-11 04:00:09",
+    "updateBy": "admin",
+    "updateTime": "2026-06-11 04:00:09",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  },
+  {
+    "menuId": 294,
+    "name": "删除",
+    "enName": null,
+    "permission": "TestProject_deleteTestProject",
+    "path": null,
+    "viewPath": null,
+    "parentId": 291,
+    "icon": null,
+    "visible": "1",
+    "sortOrder": 0,
+    "keepAlive": "1",
+    "embedded": null,
+    "menuType": "1",
+    "createBy": "admin",
+    "createTime": "2026-06-11 04:00:09",
+    "updateBy": "admin",
+    "updateTime": "2026-06-11 04:00:09",
+    "delFlag": null,
+    "isExt": 0,
+    "openMode": 0,
+    "id": 0,
+    "children": [],
+    "subNum": 0,
+    "hasChildren": false,
+    "title": null,
+    "roles": null,
+    "auths": null,
+    "isShow": false,
+    "isKeepAlive": false
+  }
+]

+ 46 - 0
AdminFrontEnd/src/api/auths/menu/model.d.ts

@@ -0,0 +1,46 @@
+// 请求参数的数据类型定义
+declare namespace API_MENU_P {}
+
+// 请求返回的数据类型定义
+declare namespace API_MENU_R {
+  interface menus {
+    /*id */
+    menuId: ID
+
+    /*上级菜单ID */
+    parentId?: number | string
+
+    /*菜单标题 */
+    name: string
+
+    /*路由地址 */
+    path: string
+
+    /*组件路径 */
+    viewPath: string
+
+    /*类型  0:目录   1:菜单   2:权限 */
+    menuType: 0 | 1 | 2
+
+    /*菜单图标 */
+    icon: string
+
+    /*授权标识(多个用逗号分隔,如:sys:menu:list,sys:menu:save) */
+    permission: string
+
+    /*排序 */
+    sortOrder: number
+
+    /*是否缓存 1是 0否 */
+    keepAlive: 1 | 0
+
+    /*是否显示 1是 0否 */
+    visible: '1' | '0'
+
+    /*是否外链 1是 0否*/
+    isExt: 1 | 0
+
+    /*外链打开方式 1: 新窗口打开 2: iframe */
+    openMode: 1 | 2
+  }
+}

+ 26 - 0
AdminFrontEnd/src/api/auths/post/index.ts

@@ -0,0 +1,26 @@
+import { http } from '@/utils/http/request'
+
+export const FETCH_POST = new (class extends http {
+  page(params) {
+    return this.request<API.PageResult<API_POST_R.IPage[]>>(
+      'omegaConfig.postpage',
+      params,
+    )
+  }
+
+  list() {
+    return this.request<API_POST_R.IPage[]>('omegaConfig.postlist')
+  }
+
+  add(params: API_POST_P.IAdd) {
+    return this.request('omegaConfig.postadd', params)
+  }
+
+  update(params: API_POST_P.IAdd & { postId: number }) {
+    return this.request('omegaConfig.postupdate', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaConfig.postremoveById', id)
+  }
+})()

+ 22 - 0
AdminFrontEnd/src/api/auths/post/model.d.ts

@@ -0,0 +1,22 @@
+declare namespace API_POST_P {
+  interface IAdd {
+    postCode: string
+    postName: string
+    postSort: string
+    remark: string
+  }
+}
+declare namespace API_POST_R {
+  interface IPage {
+    postId: number
+    postCode: string
+    postName: string
+    postSort: number
+    remark: string
+    delFlag: string
+    createTime: string
+    createBy: string
+    updateTime: string
+    updateBy: string
+  }
+}

+ 25 - 0
AdminFrontEnd/src/api/auths/role/index.ts

@@ -0,0 +1,25 @@
+import { http } from '@/utils/http/request'
+
+export const FETCH_ROLE = new (class extends http {
+  page(params) {
+    return this.request<API.PageResult<API_ROLE_R.IPage[]>>(
+      'omegaConfig.rolepage',
+      params,
+    )
+  }
+
+  list() {
+    return this.request<API_ROLE_R.IPage[]>('omegaConfig.rolelist')
+  }
+
+  add(params: API_ROLE_P.IAdd) {
+    return this.request('omegaConfig.roleadd', params)
+  }
+
+  update(params: API_ROLE_P.IAdd & { roleId: number }) {
+    return this.request('omegaConfig.roleupdate', params)
+  }
+  delete({ id }: { id: ID }) {
+    return this.request('omegaConfig.roleremoveById', id)
+  }
+})()

+ 22 - 0
AdminFrontEnd/src/api/auths/role/model.d.ts

@@ -0,0 +1,22 @@
+declare namespace API_ROLE_P {
+  interface IAdd {
+    roleName: string
+    roleCode: string
+    roleDesc: string
+  }
+}
+
+declare namespace API_ROLE_R {
+  type IPage = {
+    roleId: number
+    roleName: string
+    roleCode: string
+    roleDesc: string
+    createBy: string
+    updateBy: string
+    createTime: string
+    updateTime: null | string
+    delFlag: string
+    userNum: number
+  }
+}

+ 54 - 0
AdminFrontEnd/src/api/auths/user/index.ts

@@ -0,0 +1,54 @@
+import { http } from '@/utils/http/request'
+
+// TODO: 这里的接口地址需要更改
+const BASE_LOGIN_URL = `${import.meta.env.VUE_APP_CONFIG_API}/v1/admin/sysServer/oauth2/token`
+// 登录特殊请求
+export class FETCH_USER {
+  /* 登录 */
+  static login(data: API_USER_P.ILogin) {
+    return http.request<API_USER_R.login>(BASE_LOGIN_URL, data, {
+      method: 'post',
+      onFetchBefore(init) {
+        init.url =
+          init.url +
+          `?scope=server&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer`
+        init.headers!['Authorization'] =
+          `Basic ${btoa(`${import.meta.env.VUE_APP_AUTH_USERNAME}:${import.meta.env.VUE_APP_AUTH_PSW}`)}`
+      },
+    })
+  }
+  /* 刷新token */
+  static refreshToken(data: { refreshToken: string }) {
+    return http.request<API_USER_R.login>(BASE_LOGIN_URL, data, {
+      method: 'post',
+      onFetchBefore(init) {
+        init.url = init.url + `?scope=server&grant_type=refresh_token`
+        init.headers!['Authorization'] =
+          `Basic ${btoa(`${import.meta.env.VUE_APP_AUTH_USERNAME}:${import.meta.env.VUE_APP_AUTH_PSW}`)}`
+      },
+    })
+  }
+
+  /* 获取用户列表 */
+  static page(params?: API_USER_P.IPage) {
+    return http.request<API.PageResult<API_USER_R.IPage[]>>(
+      'omegaConfig.userpage',
+      params,
+    )
+  }
+
+  /* 新增用户 */
+  static add(params: API_USER_P.IAdd) {
+    return http.request('omegaConfig.useradd', params)
+  }
+
+  /* 更新用户 */
+  static update(params: API_USER_P.IAdd & { userId: number }) {
+    return http.request('omegaConfig.userupdate', params)
+  }
+
+  /* 删除用户 */
+  static delete({ id }: { id: ID }) {
+    return http.request('omegaConfig.userremoveById', id)
+  }
+}

+ 82 - 0
AdminFrontEnd/src/api/auths/user/model.d.ts

@@ -0,0 +1,82 @@
+// 请求参数的数据类型定义
+declare namespace API_USER_P {
+  interface ILogin {
+    username: string
+    password: string
+  }
+
+  interface IPage {
+    username: string
+    phone: string
+    deptId: string
+  }
+
+  interface IAdd {
+    username: string
+    password: string
+    phone: string
+    nickname: string
+    name: string
+    email: string
+    role: string
+    post: string
+    deptId: string
+    avatar: string
+  }
+}
+
+// 请求返回的数据类型定义
+declare namespace API_USER_R {
+  interface login {
+    access_token: string
+    refresh_token: string
+    username: string
+    exp: string
+    user_id: number
+  }
+
+  interface IPage {
+    userId: string
+    username: string
+    password: string
+    salt: null
+    wxOpenid: null
+    qqOpenid: null
+    giteeOpenId: null
+    oscOpenId: null
+    createTime: string
+    updateTime: null | string
+    delFlag: null
+    lockFlag: string
+    phone: string
+    avatar: string
+    deptId: string
+    deptName: string
+    roleList: {
+      roleId: string
+      roleName: string
+      roleCode: string
+      roleDesc: string
+      createBy: null
+      updateBy: null
+      createTime: string
+      updateTime: null
+      delFlag: string
+    }[]
+    postList: {
+      postId: string
+      postCode: string
+      postName: string
+      postSort: number
+      remark: string
+      createBy: null
+      updateBy: null
+      delFlag: string
+      createTime: string
+      updateTime: string
+    }[]
+    nickname: null
+    name: string
+    email: string
+  }
+}

+ 157 - 0
AdminFrontEnd/src/api/database-manage/index.ts

@@ -0,0 +1,157 @@
+import { http } from '@/utils/http/request'
+import type { FetchOptions } from '@/utils/http/type'
+
+/* 数据字段 */
+export const FETCH_DATABASE_FIELD = new (class extends http {
+  page(params?: API_DATABASE_FIELD.P.IPage, options?: FetchOptions) {
+    return this.request<API.PageResult<API_DATABASE_FIELD.R.IPage[]>>(
+      'omegaSource.databaseFieldgetDatabaseFieldList',
+      params,
+      options,
+    )
+  }
+
+  add(params: API_DATABASE_FIELD.P.IAdd) {
+    return this.request('omegaSource.databaseFieldaddDatabaseField', params)
+  }
+
+  update(params: API_DATABASE_FIELD.P.IUpdate) {
+    return this.request('omegaSource.databaseFieldupdateDatabaseField', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.databaseFielddeleteDatabaseField', id)
+  }
+
+  /* 批量删除 */
+  batchDelete(params: { idList: ID[] }) {
+    return this.request(
+      'omegaSource.databaseFieldbatchDeleteDatabaseField',
+      params,
+    )
+  }
+
+  query(params: { id: ID }) {
+    return this.request<API_DATABASE_FIELD.R.IQuery>(
+      'omegaSource.databaseFieldgetDatabaseFieldQuery',
+      params,
+    )
+  }
+
+  updateAttr(params: API_DATABASE_FIELD.P.IUpdateAttr[]) {
+    return this.request(
+      'omegaSource.databaseFieldupdateDatabaseFieldAttr',
+      params,
+    )
+  }
+
+  copy(params: API_DATABASE_FIELD.P.ICopy) {
+    return this.request('omegaSource.databaseFieldcopyDatabaseField', params)
+  }
+
+  make(params: { id: ID[] }) {
+    return this.request<API_DATABASE_TABLE.R.IMake>(
+      'omegaSource.databaseFieldmakeDatabaseField',
+      params,
+    )
+  }
+
+  /* 字段类型列表 */
+  typeList(
+    params: API_DATABASE_FIELD.P.ITypeList,
+    fetchOptions?: FetchOptions,
+  ) {
+    return this.request<string[]>(
+      'omegaSource.databaseFieldgetDatabaseFieldTypeList',
+      params,
+      fetchOptions,
+    )
+  }
+})()
+
+/* 数据字段选项卡 */
+export const FETCH_DATABASE_FIELD_TABS = new (class extends http {
+  page(params?: API_DATABASE_FIELD_TABS.P.IPage) {
+    return this.request<API.PageResult<API_DATABASE_FIELD_TABS.R.IPage[]>>(
+      'omegaSource.databaseFieldTabsgetDatabaseFieldTabsList',
+      params,
+    )
+  }
+
+  add(params: API_DATABASE_FIELD_TABS.P.IAdd) {
+    return this.request(
+      'omegaSource.databaseFieldTabsaddDatabaseFieldTabs',
+      params,
+    )
+  }
+
+  update(params: API_DATABASE_FIELD_TABS.P.IUpdate) {
+    return this.request(
+      'omegaSource.databaseFieldTabsupdateDatabaseFieldTabs',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request(
+      'omegaSource.databaseFieldTabsdeleteDatabaseFieldTabs',
+      id,
+    )
+  }
+
+  query(params: { id: ID }) {
+    return this.request<API_DATABASE_FIELD_TABS.R.IQuery>(
+      'omegaSource.databaseFieldTabsgetDatabaseFieldTabsQuery',
+      params,
+    )
+  }
+})()
+
+/* 数据表 */
+export const FETCH_DATABASE_TABLE = new (class extends http {
+  page(params?: API_DATABASE_TABLE.P.IPage, options?: FetchOptions) {
+    return this.request<API.PageResult<API_DATABASE_TABLE.R.IPage[]>>(
+      'omegaSource.databaseTablegetDatabaseTableList',
+      params,
+      options,
+    )
+  }
+
+  pageByIds(params?: API_DATABASE_TABLE.P.IPageByIds) {
+    return this.request<API.PageResult<API_DATABASE_TABLE.R.IPage[]>>(
+      'omegaSource.databaseTablegetDatabaseTableListByIds',
+      params,
+    )
+  }
+
+  add(params: API_DATABASE_TABLE.P.IAdd) {
+    return this.request('omegaSource.databaseTableaddDatabaseTable', params)
+  }
+
+  update(params: API_DATABASE_TABLE.P.IUpdate) {
+    return this.request('omegaSource.databaseTableupdateDatabaseTable', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.databaseTabledeleteDatabaseTable', id)
+  }
+
+  query(params: { id: ID }, options?: FetchOptions) {
+    return this.request<API_DATABASE_TABLE.R.IQuery>(
+      'omegaSource.databaseTablegetDatabaseTableQuery',
+      params,
+      options,
+    )
+  }
+
+  copy(params: API_DATABASE_TABLE.P.ICopy) {
+    return this.request('omegaSource.databaseTablecopyDatabaseTable', params)
+  }
+
+  make(params: { id: ID[] }) {
+    return this.request<API_DATABASE_TABLE.R.IMake>(
+      'omegaSource.databaseTablemakeDatabaseTable',
+      params,
+    )
+  }
+})()

+ 538 - 0
AdminFrontEnd/src/api/database-manage/model.d.ts

@@ -0,0 +1,538 @@
+declare namespace API_DATABASE_FIELD {
+  namespace P {
+    /**
+     * 列表查询参数
+     */
+    interface IPage {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 数据库
+       */
+      databaseId?: number
+      /**
+       * 数据表
+       */
+      tableId?: ID
+      /**
+       * 选项卡
+       */
+      tabId?: number
+      /**
+       * 字段标题
+       */
+      fieldTitle?: string
+      /**
+       * 字段名
+       */
+      fieldName?: string
+      /**
+       * 字段类型
+       */
+      fieldType?: string
+    }
+
+    /**
+     * 添加参数
+     */
+    interface IAdd {
+      /**
+       * 自动增长
+       */
+      autoIncrement: boolean
+      /**
+       * 检查重复
+       */
+      checkRepeat: boolean
+      /**
+       * 数据库
+       */
+      databaseId: number
+      /**
+       * 编辑类型
+       */
+      editType: string
+      /**
+       * 导出标记
+       */
+      exportFlag: boolean
+      /**
+       * 字段默认值
+       */
+      fieldDefaultValue: string
+      /**
+       * 字段说明
+       */
+      fieldDetail: string
+      /**
+       * 字段长度
+       */
+      fieldLength: string
+      /**
+       * 字段名
+       */
+      fieldName: string
+      /**
+       * 字段标题
+       */
+      fieldTitle: string
+      /**
+       * 字段类型
+       */
+      fieldType: string
+      /**
+       * 导入标记
+       */
+      importFlag: boolean
+      /**
+       * 关联数据字段ID
+       */
+      linkFieldId: ID
+      /**
+       * 关联数据表ID
+       */
+      linkTableId: ID
+      /**
+       * 列表编辑
+       */
+      listEditFlag: boolean
+      /**
+       * 列表编辑提示文字
+       */
+      listEditPlaceholder: string
+      /**
+       * 主键
+       */
+      primaryKey: boolean
+      /**
+       * 是否编辑
+       */
+      showEdit: boolean
+      /**
+       * 列表显示
+       */
+      showList: boolean
+      /**
+       * 查询条件
+       */
+      showQuery: boolean
+      /**
+       * 分表字段
+       */
+      splitFlag: boolean
+      /**
+       * 统计条件字段
+       */
+      statCondition: boolean
+      /**
+       * 统计数据字段
+       */
+      statData: boolean
+      /**
+       * 选项卡
+       */
+      tabId: number
+      /**
+       * 数据表
+       */
+      tableId: number
+      /**
+       * 验证属性
+       */
+      validateAttribute: string
+      /* 接口数据源 */
+      apiId: ID
+    }
+
+    /**
+     * 更新参数
+     */
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: number
+    }
+
+    /**
+     * 修改字段属性参数
+     */
+    interface IUpdateAttr {
+      /**
+       * 导出标记
+       */
+      exportFlag: boolean
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 导入标记
+       */
+      importFlag: boolean
+      /**
+       * 是否编辑
+       */
+      showEdit: boolean
+      /**
+       * 列表显示
+       */
+      showList: boolean
+      /**
+       * 查询条件
+       */
+      showQuery: boolean
+    }
+
+    /**
+     * 克隆字段参数
+     */
+    interface ICopy {
+      /**
+       * 来源字段ID
+       */
+      sourceFieldId: ID[]
+      /**
+       * 目标表ID
+       */
+      targetTableId: number
+    }
+
+    /**
+     * 字段类型列表参数
+     */
+    interface ITypeList {
+      /**
+       * 数据库
+       */
+      databaseId: ID
+    }
+  }
+
+  namespace R {
+    /**
+     * 列表返回数据
+     */
+    interface IPage {
+      /**
+       * 数据库
+       */
+      databaseId?: number
+      /**
+       * 导出标记
+       */
+      exportFlag?: boolean
+      /**
+       * 字段长度
+       */
+      fieldLength?: string
+      /**
+       * 字段名
+       */
+      fieldName?: string
+      /**
+       * 字段标题
+       */
+      fieldTitle?: string
+      /**
+       * 字段类型
+       */
+      fieldType?: string
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 导入标记
+       */
+      importFlag?: boolean
+      /**
+       * 是否编辑
+       */
+      showEdit?: boolean
+      /**
+       * 列表显示
+       */
+      showList?: boolean
+      /**
+       * 查询条件
+       */
+      showQuery?: boolean
+      /**
+       * 选项卡
+       */
+      tabId?: number
+      /**
+       * 数据表
+       */
+      tableId?: number
+    }
+
+    /**
+     * 详情返回数据
+     */
+    interface IQuery extends IPage {}
+  }
+}
+
+declare namespace API_DATABASE_FIELD_TABS {
+  namespace P {
+    /**
+     * 列表查询参数
+     */
+    interface IPage {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 名称
+       */
+      tabName?: string
+      /**
+       * 数据库
+       */
+      databaseId?: number
+      /**
+       * 数据表
+       */
+      tableId?: number
+    }
+
+    /**
+     * 添加参数
+     */
+    interface IAdd {
+      /**
+       * 名称
+       */
+      tabName: string
+      /**
+       * 数据库
+       */
+      databaseId: number
+      /**
+       * 数据表
+       */
+      tableId: number
+    }
+
+    /**
+     * 更新参数
+     */
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: number
+    }
+  }
+
+  namespace R {
+    /**
+     * 列表返回数据
+     */
+    interface IPage {
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 名称
+       */
+      tabName: string
+      /**
+       * 数据库
+       */
+      databaseId: number
+      /**
+       * 数据表
+       */
+      tableId: number
+    }
+
+    /**
+     * 详情返回数据
+     */
+    interface IQuery extends IPage {}
+  }
+}
+
+declare namespace API_DATABASE_TABLE {
+  namespace P {
+    /**
+     * 列表查询参数
+     */
+    interface IPage {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 数据库
+       */
+      databaseId?: ID
+      /**
+       * 表标题
+       */
+      tableTitle?: string
+      /**
+       * 表名
+       */
+      tableName?: string
+    }
+
+    /**
+     * 根据服务ID查询列表参数
+     */
+    interface IPageByIds {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 服务ID
+       */
+      serviceId?: number
+    }
+
+    /**
+     * 添加参数
+     */
+    interface IAdd {
+      /**
+       * 数据库
+       */
+      databaseId: number
+      /**
+       * 表标题
+       */
+      tableTitle: string
+      /**
+       * 表名
+       */
+      tableName: string
+      /**
+       * 默认字段
+       */
+      defaultField: boolean
+      /**
+       * 导出功能
+       */
+      exportModule: boolean
+      /**
+       * 导入功能
+       */
+      importModule: boolean
+      /**
+       * 统计功能
+       */
+      statModule: boolean
+      /**
+       * 分表类型
+       */
+      splitKind: number
+    }
+
+    /**
+     * 更新参数
+     */
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: number
+    }
+
+    /**
+     * 克隆表参数
+     */
+    interface ICopy {
+      /**
+       * 来源表ID
+       */
+      sourceTableId: ID[]
+      /**
+       * 目标库ID
+       */
+      targetDatabaseId: ID
+    }
+  }
+
+  namespace R {
+    /**
+     * 列表返回数据
+     */
+    interface IPage {
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 数据库
+       */
+      databaseId: number
+      /**
+       * 表标题
+       */
+      tableTitle: string
+      /**
+       * 表名
+       */
+      tableName: string
+      /**
+       * 默认字段
+       */
+      defaultField: boolean
+      /**
+       * 导出功能
+       */
+      exportModule: boolean
+      /**
+       * 导入功能
+       */
+      importModule: boolean
+      /**
+       * 统计功能
+       */
+      statModule: boolean
+      /**
+       * 分表类型
+       */
+      splitKind: number
+    }
+
+    /**
+     * 详情返回数据
+     */
+    interface IQuery extends IPage {}
+
+    /**
+     * 生成SQL返回数据
+     */
+    interface IMake {
+      /**
+       * SQL内容
+       */
+      makeObjectId: ID
+    }
+  }
+}

+ 101 - 0
AdminFrontEnd/src/api/interface-manage/index.ts

@@ -0,0 +1,101 @@
+import { http } from '@/utils/http/request'
+
+/* 接口信息 */
+export const FETCH_API_INFO = new (class extends http {
+  page(params?: API_API_INFO.P.IPage) {
+    return this.request<API.PageResult<API_API_INFO.R.IPage[]>>(
+      'omegaSource.apiInfogetApiInfoList',
+      params,
+    )
+  }
+
+  add(params: API_API_INFO.P.IAdd) {
+    return this.request('omegaSource.apiInfoaddApiInfo', params)
+  }
+
+  update(params: API_API_INFO.P.IUpdate) {
+    return this.request('omegaSource.apiInfoupdateApiInfo', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.apiInfodeleteApiInfo', id)
+  }
+
+  batchDelete(params: { idList: ID[] }) {
+    return this.request('omegaSource.apiInfobatchDeleteApiInfo', params)
+  }
+
+  query(params: { id: ID }) {
+    return this.request<API_API_INFO.R.IQuery>(
+      'omegaSource.apiInfogetApiInfoQuery',
+      params,
+    )
+  }
+
+  init(params: API_API_INFO.P.IInit) {
+    return this.request('omegaSource.apiInfoinitApiInfo', params)
+  }
+
+  copy(params: API_API_INFO.P.ICopy) {
+    return this.request('omegaSource.apiInfocopyApiInfo', params)
+  }
+
+  downloadJson(params: API_API_INFO.P.IDownloadJson) {
+    return this.request<API_API_INFO.R.IDownloadJson>(
+      'omegaSource.apiInfodownloadJson',
+      params,
+    )
+  }
+
+  // omegaSource.ApiInfogetApiInfoListByProId
+  pageByProId(params: API_API_INFO.P.IPageByProId) {
+    return this.request<API.PageResult<API_API_INFO.R.IPageByProId[]>>(
+      'omegaSource.apiInfogetApiInfoListByProId',
+      params,
+    )
+  }
+
+  listControllers(params: API.PageParams<API_API_INFO.P.IListControllers>) {
+    return this.request<API_API_INFO.R.IListControllers[]>(
+      'omegaSource.apiControllergetApiControllerList',
+      params,
+    )
+  }
+})()
+
+/* 接口分组 */
+export const FETCH_API_GROUP = new (class extends http {
+  page(params?: API_API_GROUP.P.IPage) {
+    return this.request<API.PageResult<API_API_GROUP.R.IPage[]>>(
+      'omegaSource.apiGroupgetApiGroupList',
+      params,
+    )
+  }
+
+  add(params: API_API_GROUP.P.IAdd) {
+    return this.request('omegaSource.apiGroupaddApiGroup', params)
+  }
+
+  update(params: API_API_GROUP.P.IUpdate) {
+    return this.request('omegaSource.apiGroupupdateApiGroup', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.apiGroupdeleteApiGroup', id)
+  }
+
+  query(params: { id: ID }) {
+    return this.request<API_API_GROUP.R.IQuery>(
+      'omegaSource.apiGroupgetApiGroupQuery',
+      params,
+    )
+  }
+
+  syncToSystem(params: API_API_GROUP.P.ISyncToSystem) {
+    return this.request('omegaSource.apiGroupsycnApiToSystem', params)
+  }
+
+  makeApiDoc(params: API_API_GROUP.P.ISyncOrMake) {
+    return this.request('omegaSource.apiGroupmakeApiDoc', params)
+  }
+})()

+ 445 - 0
AdminFrontEnd/src/api/interface-manage/model.d.ts

@@ -0,0 +1,445 @@
+declare namespace API_API_INFO {
+  namespace P {
+    /**
+     * 列表查询参数
+     */
+    interface IPage {
+      /**
+       * 服务ID
+       */
+      serviceId?: number
+      /**
+       * 接口分组ID
+       */
+      groupId?: number
+      /**
+       * 板块名称
+       */
+      tabName?: string
+      /**
+       * 接口名称
+       */
+      apiName?: string
+      /**
+       * 接口类型
+       */
+      apiKind?: number
+    }
+
+    /**
+     * 添加参数
+     */
+    interface IAdd {
+      /**
+       * 服务ID
+       */
+      serviceId: number
+      /**
+       * 接口分组ID
+       */
+      groupId: number
+      /**
+       * 板块名称
+       */
+      tabName: string
+      /**
+       * 接口名称
+       */
+      apiName: string
+      /**
+       * 控制器文件路径
+       */
+      controllerFilePath: string
+      /**
+       * 使用场景
+       */
+      usageScenarios: number
+      /**
+       * 接口类型
+       */
+      apiKind: number
+      /**
+       * 方法名
+       */
+      methodName: string
+      /**
+       * 接口表述
+       */
+      apiDetail: string
+      /* 接口信息 */
+      apiParam: string
+      /* 关联表ID */
+      linkTableId: ID
+      /* 是否分页 */
+      pageFlag: boolean
+    }
+
+    /**
+     * 更新参数
+     */
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: number
+    }
+
+    /**
+     * 初始化接口参数
+     */
+    interface IInit {
+      /**
+       * 数据表ID
+       */
+      sourceTableId: ID[]
+      groupId?: ID
+    }
+
+    /**
+     * 克隆接口参数
+     */
+    interface ICopy {
+      /**
+       * 来源接口ID
+       */
+      sourceApiId: string
+      /**
+       * 目标接口分组ID
+       */
+      targetApiGroupId: number
+    }
+
+    interface IDownloadJson {
+      /**
+       * 接口ID
+       */
+      apiId: string
+    }
+
+    interface IPageByProId {
+      projectId: ID
+    }
+
+    interface IListControllers {
+      /**
+       * 服务ID
+       */
+      serviceId?: ID
+    }
+  }
+
+  namespace R {
+    type IDownloadJson = string
+
+    /**
+     * 列表返回数据
+     */
+    interface IPage {
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 创建时间
+       */
+      createTime?: string
+      /**
+       * 创建人
+       */
+      createBy?: string
+      /**
+       * 板块名称
+       */
+      tabName: string
+      /**
+       * 接口名称
+       */
+      apiName: string
+      /**
+       * 控制器文件路径
+       */
+      controllerFilePath: string
+      /**
+       * 使用场景
+       */
+      usageScenarios: number
+      /**
+       * 接口类型
+       */
+      apiKind: number
+      /**
+       * 方法名
+       */
+      methodName: string
+    }
+
+    /**
+     * 详情返回数据
+     */
+    interface IQuery {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 服务ID
+       */
+      serviceId: number
+      /**
+       * 接口分组ID
+       */
+      groupId: number
+      /**
+       * 板块名称
+       */
+      tabName: string
+      /**
+       * 接口名称
+       */
+      apiName: string
+      /**
+       * 控制器文件路径
+       */
+      controllerFilePath: string
+      /**
+       * 使用场景
+       */
+      usageScenarios: number
+      /**
+       * 接口类型
+       */
+      apiKind: number
+      /**
+       * 方法名
+       */
+      methodName: string
+      /**
+       * 接口表述
+       */
+      apiDetail: string
+
+      apiParam: Partial<{
+        id?: ID
+        customFlag?: boolean // 区分是否为手动添加的字段
+        fieldTitle: string
+        fieldName: string
+        fieldType: string
+        reqParam: boolean
+        resParam: boolean
+        resType: 'fieldValue' | 'count' | 'sum' | 'avg' | 'max' | 'min' //返回类型(字段值-fieldValue,数量-count,加和-sum,平均值-avg,最大值-max,最小值-min)
+        checkAttribute: (
+          | 'required'
+          | 'phone'
+          | 'email'
+          | 'url'
+          | 'number'
+          | 'int'
+          | 'identity'
+        )[]
+        sortMode?: string
+        linkTableId?: ID
+        editType?: string
+        fieldDetail: string
+        linkParam: Omit<
+          (typeof API_API_INFO.R.IQuery)['apiParam'][number],
+          'linkParam'
+        >[]
+      }>[]
+    }
+
+    interface IPageByProId {
+      /**
+       * 接口名称
+       */
+      apiName?: string
+      /**
+       * ID
+       */
+      id?: number
+      /**
+       * 板块名称
+       */
+      tabName?: string
+    }
+
+    interface IListControllers {
+      /**
+       * 服务ID
+       */
+      controllerFilePath?: string
+    }
+  }
+}
+
+declare namespace API_API_GROUP {
+  namespace P {
+    /**
+     * 列表查询参数
+     */
+    interface IPage {
+      /**
+       * 服务ID
+       */
+      serviceId?: number
+      /**
+       * 分组名称
+       */
+      groupName?: string
+      /**
+       * 应用端ID
+       */
+      appId?: number
+    }
+
+    /**
+     * 添加参数
+     */
+    interface IAdd {
+      /**
+       * 服务ID
+       */
+      serviceId: number
+      /**
+       * 分组名称
+       */
+      groupName: string
+      groupTitle: string
+      /**
+       * 控制器文件根目录
+       */
+      controllerRootPath?: string
+      /**
+       * 应用端ID
+       */
+      appId: number
+      /**
+       * 接口初始化表ID
+       */
+      initTableId: string
+      // 接口地址测试
+      apiHostDev: string
+      // 接口地址生成
+      apiHost: string
+    }
+
+    /**
+     * 更新参数
+     */
+    interface IUpdate {
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 服务ID
+       */
+      serviceId: number
+      /**
+       * 分组名称
+       */
+      groupName: string
+      groupTitle?: string
+      /**
+       * 控制器文件根目录
+       */
+      controllerRootPath?: string
+      /**
+       * 应用端ID
+       */
+      appId: number
+      // 接口地址测试
+      apiHostDev: string
+      // 接口地址生成
+      apiHost: string
+    }
+
+    /**
+     * 同步/生成文档参数
+     */
+    interface ISyncOrMake {
+      /**
+       * 服务ID
+       */
+      serviceId: ID
+      /**
+       * 分组ID,生成文档时可选,传了则只生成该分组下的接口文档,不传则生成整个服务的接口文档
+       */
+      groupId?: ID
+    }
+
+    interface ISyncToSystem {
+      /**
+       * 环境: test-测试,dis-生产
+       */
+      env: 'test' | 'dis'
+      /**
+       * 项目ID
+       */
+      projectId: number
+      /**
+       * 服务ID
+       */
+      serviceId: number
+    }
+  }
+
+  namespace R {
+    /**
+     * 列表返回数据
+     */
+    interface IPage {
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 创建时间
+       */
+      createTime?: string
+      /**
+       * 创建人
+       */
+      createBy?: string
+      /**
+       * 分组名称
+       */
+      groupName: string
+      groupTitle: string
+      /**
+       * 控制器文件根目录
+       */
+      controllerRootPath?: string
+      /**
+       * 应用端ID
+       */
+      appId: number
+    }
+
+    /**
+     * 详情返回数据
+     */
+    interface IQuery {
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 服务ID
+       */
+      serviceId: number
+      /**
+       * 分组名称
+       */
+      groupName: string
+      groupTitle?: string
+      /**
+       * 控制器文件根目录
+       */
+      controllerRootPath?: string
+      /**
+       * 应用端ID
+       */
+      appId: number
+    }
+  }
+}

+ 93 - 0
AdminFrontEnd/src/api/market/index.ts

@@ -0,0 +1,93 @@
+import { http } from '@/utils/http/request'
+
+/* APP功能模块 */
+export const FETCH_APP_MODULE = new (class extends http {
+  page(params?: API.PageParams<API_APP_MODULE.P.IPage>) {
+    return this.request<API.PageResult<API_APP_MODULE.R.IPage[]>>(
+      'omegaSource.appModulegetAppModuleList',
+      params,
+    )
+  }
+
+  add(params: API_APP_MODULE.P.IAdd) {
+    return this.request('omegaSource.appModuleaddAppModule', params)
+  }
+
+  update(params: API_APP_MODULE.P.IUpdate) {
+    return this.request('omegaSource.appModuleupdateAppModule', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.appModuledeleteAppModule', id)
+  }
+
+  query(params: { id: ID }) {
+    return this.request<API_APP_MODULE.R.IQuery>(
+      'omegaSource.appModulegetAppModuleQuery',
+      params,
+    )
+  }
+})()
+
+/* APP功能模块IOS代码 */
+export const FETCH_APP_MODULE_IOS_CODE = new (class extends http {
+  update(params: API_APP_MODULE_IOS_CODE.P.IUpdate) {
+    return this.request(
+      'omegaSource.appModuleIosCodeupdateAppModuleIosCode',
+      params,
+    )
+  }
+
+  query(params: { moduleId: ID }) {
+    return this.request<API_APP_MODULE_IOS_CODE.R.IQuery>(
+      'omegaSource.appModuleIosCodegetAppModuleIosCodeQuery',
+      params,
+    )
+  }
+})()
+
+/* APP功能模块安卓代码 */
+export const FETCH_APP_MODULE_ANDROID_CODE = new (class extends http {
+  update(params: API_APP_MODULE_ANDROID_CODE.P.IUpdate) {
+    return this.request(
+      'omegaSource.appModuleAndroidCodeupdateAppModuleAndroidCode',
+      params,
+    )
+  }
+
+  query(params?: { moduleId?: ID }) {
+    return this.request<API_APP_MODULE_ANDROID_CODE.R.IQuery>(
+      'omegaSource.appModuleAndroidCodegetAppModuleAndroidCodeQuery',
+      params,
+    )
+  }
+})()
+
+/* APP功能模块文件 */
+export const FETCH_APP_MODULE_FILE = new (class extends http {
+  page(params?: API_APP_MODULE_FILE.P.IPage) {
+    return this.request<API.PageResult<API_APP_MODULE_FILE.R.IPage[]>>(
+      'omegaSource.appModuleFilegetAppModuleFileList',
+      params,
+    )
+  }
+
+  add(params: API_APP_MODULE_FILE.P.IAdd) {
+    return this.request('omegaSource.appModuleFileaddAppModuleFile', params)
+  }
+
+  update(params: API_APP_MODULE_FILE.P.IUpdate) {
+    return this.request('omegaSource.appModuleFileupdateAppModuleFile', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.appModuleFiledeleteAppModuleFile', id)
+  }
+
+  query(params: { id: ID }) {
+    return this.request<API_APP_MODULE_FILE.R.IQuery>(
+      'omegaSource.appModuleFilegetAppModuleFileQuery',
+      params,
+    )
+  }
+})()

+ 552 - 0
AdminFrontEnd/src/api/market/model.d.ts

@@ -0,0 +1,552 @@
+declare namespace API_APP_MODULE {
+  namespace P {
+    /**
+     * 列表查询参数
+     */
+    interface IPage {
+      /**
+       * 使用厂商
+       */
+      factoryOwner: string
+      /**
+       * 模块介绍
+       */
+      moduleDetail: string
+      /**
+       * 模块功能
+       */
+      moduleFeature: string
+      /**
+       * 模块名称
+       */
+      moduleName: string
+      /**
+       * 状态
+       */
+      status: number
+      /**
+       * 支付系统
+       */
+      systemSupport: string
+    }
+
+    /**
+     * 添加参数
+     */
+    interface IAdd {
+      /**
+       * 使用厂商
+       */
+      factoryOwner: string
+      /**
+       * 模块介绍
+       */
+      moduleDetail: string
+      /**
+       * 模块功能
+       */
+      moduleFeature: string
+      /**
+       * 模块名称
+       */
+      moduleName: string
+      /**
+       * 状态
+       */
+      status: number
+      /**
+       * 支付系统
+       */
+      systemSupport: string
+    }
+
+    /**
+     * 更新参数
+     */
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: number
+    }
+  }
+
+  namespace R {
+    /**
+     * 列表返回数据
+     */
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime?: string
+      /**
+       * 更新时间
+       */
+      updateTime?: string
+      /**
+       * 创建人
+       */
+      createBy?: string
+      /**
+       * 更新人
+       */
+      updateBy?: string
+
+      /**
+       * 使用厂商
+       */
+      factoryOwner: string
+      /**
+       * 模块介绍
+       */
+      moduleDetail: string
+      /**
+       * 模块功能
+       */
+      moduleFeature: string
+      /**
+       * 模块名称
+       */
+      moduleName: string
+      /**
+       * 状态
+       */
+      status: number
+      /**
+       * 系统
+       */
+      systemSupport: string[]
+    }
+
+    /**
+     * 详情返回数据
+     */
+    interface IQuery {
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 更新时间
+       */
+      updateTime: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 更新人
+       */
+      updateBy: string
+      /**
+       * 模块名称
+       */
+      moduleName: string
+      /**
+       * 模块介绍
+       */
+      moduleDetail: string
+    }
+  }
+}
+
+declare namespace API_APP_MODULE_IOS_CODE {
+  namespace P {
+    interface IAdd {
+      /**
+       * 功能模块ID
+       */
+      moduleId: number
+      /**
+       * 调用代码
+       */
+      invokeCode: string
+      /**
+       * 方法代码
+       */
+      webCode: string
+      /**
+       * 要引用的系统框架
+       */
+      systemFramework: string
+      /**
+       * 权限代码
+       */
+      rightCode: string
+      /**
+       * 要引用的系统库
+       */
+      systemLib: string
+      /**
+       * 项目索引代码
+       */
+      projectIndexCode: string
+      /**
+       * AppDelegate引用
+       */
+      appDelegate: string
+      /**
+       * AppDelegate启动初始代码
+       */
+      appDelegateLaunchCode: string
+      /**
+       * AppDelegate代理代码
+       */
+      appDelegateCode: string
+      /**
+       * entitlements代码
+       */
+      entitlementsCode: string
+      /**
+       * AppDelegate引用继承
+       */
+      appDelegateAdd: string
+      /**
+       * AppDelegate启动初始异步代码
+       */
+      appDelegateLaunchAsyncCode: string
+    }
+    /**
+     * 更新参数
+     */
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: ID
+    }
+  }
+
+  namespace R {
+    /**
+     * 详情返回数据
+     */
+    interface IQuery {
+      /**
+       * 功能模块ID
+       */
+      moduleId: number
+      /**
+       * 调用代码
+       */
+      invokeCode: string
+      /**
+       * 方法代码
+       */
+      webCode: string
+      /**
+       * 要引用的系统框架
+       */
+      systemFramework: string
+      /**
+       * 权限代码
+       */
+      rightCode: string
+      /**
+       * 要引用的系统库
+       */
+      systemLib: string
+      /**
+       * 项目索引代码
+       */
+      projectIndexCode: string
+      /**
+       * AppDelegate引用
+       */
+      appDelegate: string
+      /**
+       * AppDelegate启动初始代码
+       */
+      appDelegateLaunchCode: string
+      /**
+       * AppDelegate代理代码
+       */
+      appDelegateCode: string
+      /**
+       * entitlements代码
+       */
+      entitlementsCode: string
+      /**
+       * AppDelegate引用继承
+       */
+      appDelegateAdd: string
+      /**
+       * AppDelegate启动初始异步代码
+       */
+      appDelegateLaunchAsyncCode: string
+    }
+  }
+}
+
+declare namespace API_APP_MODULE_ANDROID_CODE {
+  namespace P {
+    interface IAdd {
+      /**
+       * 功能模块ID
+       */
+      moduleId: number
+      /**
+       * 主界面方法代码
+       */
+      mainActivityCode: string
+      /**
+       * 内页方法代码
+       */
+      publicWebCode: string
+      /**
+       * 回调方法代码
+       */
+      callBackCode: string
+      /**
+       * 权限代码
+       */
+      rightCode: string
+      /**
+       * 初始化代码
+       */
+      initCode: string
+      /**
+       * Gradle包导入代码
+       */
+      gradleImportCode: string
+      /**
+       * 主界面回调方法代码
+       */
+      mainCallBackCode: string
+      /**
+       * Web包导入代码
+       */
+      webImportCode: string
+      /**
+       * Fragment包导入代码
+       */
+      fragmentImportCode: string
+      /**
+       * MainActivity包导入代码
+       */
+      mainActivityImportCode: string
+      /**
+       * PublicActivity包导入代码
+       */
+      publicWebActivityImportCode: string
+      /**
+       * MainApplication包导入代码
+       */
+      mainApplicationImportCode: string
+      /**
+       * String参数配置代码
+       */
+      stringsParamCode: string
+      /**
+       * Manifets参数配置代码
+       */
+      manifetsParamCode: string
+    }
+    /**
+     * 更新参数
+     */
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: ID
+    }
+  }
+
+  namespace R {
+    /**
+     * 详情返回数据
+     */
+    interface IQuery {
+      /**
+       * 功能模块ID
+       */
+      moduleId: number
+      /**
+       * 主界面方法代码
+       */
+      mainActivityCode: string
+      /**
+       * 内页方法代码
+       */
+      publicWebCode: string
+      /**
+       * 回调方法代码
+       */
+      callBackCode: string
+      /**
+       * 权限代码
+       */
+      rightCode: string
+      /**
+       * 初始化代码
+       */
+      initCode: string
+      /**
+       * Gradle包导入代码
+       */
+      gradleImportCode: string
+      /**
+       * 主界面回调方法代码
+       */
+      mainCallBackCode: string
+      /**
+       * Web包导入代码
+       */
+      webImportCode: string
+      /**
+       * Fragment包导入代码
+       */
+      fragmentImportCode: string
+      /**
+       * MainActivity包导入代码
+       */
+      mainActivityImportCode: string
+      /**
+       * PublicActivity包导入代码
+       */
+      publicWebActivityImportCode: string
+      /**
+       * MainApplication包导入代码
+       */
+      mainApplicationImportCode: string
+      /**
+       * String参数配置代码
+       */
+      stringsParamCode: string
+      /**
+       * Manifets参数配置代码
+       */
+      manifetsParamCode: string
+    }
+  }
+}
+
+declare namespace API_APP_MODULE_FILE {
+  namespace P {
+    /**
+     * 列表查询参数
+     */
+    interface IPage {
+      /**
+       * 功能模块ID
+       */
+      moduleId?: number
+      /**
+       * APP类型
+       */
+      appType?: string
+    }
+
+    /**
+     * 添加参数
+     */
+    interface IAdd {
+      /**
+       * 功能模块ID
+       */
+      moduleId: ID
+      /**
+       * APP类型
+       */
+      appType: string
+      /**
+       * 模板文件路径
+       */
+      sourcePath: string
+      /**
+       * 生成文件路径
+       */
+      makePath: string
+    }
+
+    /**
+     * 更新参数
+     */
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: ID
+    }
+  }
+
+  namespace R {
+    /**
+     * 列表返回数据
+     */
+    interface IPage {
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 创建时间
+       */
+      createTime?: string
+      /**
+       * 更新时间
+       */
+      updateTime?: string
+      /**
+       * 创建人
+       */
+      createBy?: string
+      /**
+       * 更新人
+       */
+      updateBy?: string
+      /**
+       * 功能模块ID
+       */
+      moduleId: number
+      /**
+       * APP类型
+       */
+      appType: string
+      /**
+       * 模板文件路径
+       */
+      sourcePath: string
+      /**
+       * 生成文件路径
+       */
+      makePath: string
+    }
+
+    /**
+     * 详情返回数据
+     */
+    interface IQuery {
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 功能模块ID
+       */
+      moduleId: number
+      /**
+       * APP类型
+       */
+      appType: string
+      /**
+       * 模板文件路径
+       */
+      sourcePath: string
+      /**
+       * 生成文件路径
+       */
+      makePath: string
+    }
+  }
+}

+ 266 - 0
AdminFrontEnd/src/api/project/index.ts

@@ -0,0 +1,266 @@
+import { http } from '@/utils/http/request'
+import type { FetchOptions } from '@/utils/http/type'
+
+/* 项目分组管理 */
+export const FETCH_PROJECT_GROUP = new (class extends http {
+  page() {
+    return this.request<API.PageResult<API_PROJECT_GROUP.R.IPage[]>>(
+      'omegaProject.projectGroupgetProjectGroupList',
+      { pageNum: 1, pageSize: 1000 },
+    )
+  }
+
+  add(params: API_PROJECT_GROUP.P.IAdd) {
+    return this.request('omegaProject.projectGroupaddProjectGroup', params)
+  }
+
+  update(params: API_PROJECT_GROUP.P.IAdd) {
+    return this.request('omegaProject.projectGroupupdateProjectGroup', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaProject.projectGroupdeleteProjectGroup', id)
+  }
+})()
+
+/* 项目管理 */
+export const FETCH_PROJECT = new (class extends http {
+  page(params?: API.PageParams<API_PROJECT.P.IPage>) {
+    return this.request<API.PageResult<API_PROJECT.R.IPage[]>>(
+      'omegaProject.projectgetProjectList',
+      params,
+    )
+  }
+
+  add(params: API_PROJECT.P.IAdd) {
+    return this.request('omegaProject.projectaddProject', params)
+  }
+
+  update(params: API_PROJECT.P.IAdd) {
+    return this.request('omegaProject.projectupdateProject', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaProject.projectdeleteProject', id)
+  }
+
+  query(params: { id: ID }) {
+    return this.request<API_PROJECT.R.IQuery>(
+      'omegaProject.projectgetProjectQuery',
+      params,
+    )
+  }
+
+  linkServe(params: API_PROJECT.P.ILinkServe) {
+    return this.request('omegaProject.projectServicelinkProjectServer', params)
+  }
+
+  unlinkServer({ id }: { id: ID }) {
+    return this.request('omegaProject.projectServiceremoveProjectServer', id)
+  }
+
+  /* 根据项目id查询关联的服务器 */
+  queryLinkServer(params: { serverIdList: ID }) {
+    return this.request<API.PageResult<API_PROJECT.R.IQueryLinkServer>>(
+      'omegaSource.servergetServerListByIds',
+      params,
+    )
+  }
+})()
+
+/* 项目业务模块 */
+export const FETCH_PROJECT_MODULE = new (class extends http {
+  page(params: { projectId: ID }) {
+    return this.request<API.PageResult<API_PROJECT_MODULE.R.IPage[]>>(
+      'omegaProject.projectBusinessModulegetProjectBusinessModuleList',
+      params,
+    )
+  }
+
+  add(params: API_PROJECT_MODULE.P.IAdd) {
+    return this.request(
+      'omegaProject.projectBusinessModuleaddProjectBusinessModule',
+      params,
+    )
+  }
+
+  update(params: API_PROJECT_MODULE.P.IAdd) {
+    return this.request(
+      'omegaProject.projectBusinessModuleupdateProjectBusinessModule',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request(
+      'omegaProject.projectBusinessModuledeleteProjectBusinessModule',
+      id,
+    )
+  }
+
+  query(params?: any) {
+    return this.request(
+      'omegaProject.projectBusinessModulegetProjectBusinessModuleQuery',
+      params,
+    )
+  }
+})()
+
+/* 项目人员 */
+export const FETCH_PROJECT_WORKER = new (class extends http {
+  page(params?: any) {
+    return this.request<API.PageResult<API_PROJECT_WORKER.R.IPage[]>>(
+      'omegaProject.projectWorkergetProjectWorkerList',
+      params,
+    )
+  }
+
+  add(params: API_PROJECT_WORKER.P.IAdd) {
+    return this.request('omegaProject.projectWorkeraddProjectWorker', params)
+  }
+
+  update(params: API_PROJECT_WORKER.P.IAdd) {
+    return this.request('omegaProject.projectWorkerupdateProjectWorker', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaProject.projectWorkerdeleteProjectWorker', id)
+  }
+
+  query(params?: any) {
+    return this.request(
+      'omegaProject.projectWorkergetProjectWorkerQuery',
+      params,
+    )
+  }
+})()
+
+/* 项目接口版本 */
+export const FETCH_PROJECT_API_VERSION = new (class extends http {
+  page(params?: any) {
+    return this.request<API.PageResult<API_PROJECT_API_VERSION.R.IPage[]>>(
+      'omegaProject.projectApiVersiongetProjectApiVersionList',
+      params,
+    )
+  }
+
+  add(params: API_PROJECT_API_VERSION.P.IAdd) {
+    return this.request(
+      'omegaProject.projectApiVersionaddProjectApiVersion',
+      params,
+    )
+  }
+
+  update(params: API_PROJECT_API_VERSION.P.IAdd) {
+    return this.request(
+      'omegaProject.projectApiVersionupdateProjectApiVersion',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request(
+      'omegaProject.projectApiVersiondeleteProjectApiVersion',
+      id,
+    )
+  }
+
+  query(params?: any) {
+    return this.request(
+      'omegaProject.projectApiVersiongetProjectApiVersionQuery',
+      params,
+    )
+  }
+})()
+
+/* 项目服务 */
+export const FETCH_PROJECT_SERVICE = new (class extends http {
+  page(params: any, options?: FetchOptions) {
+    return this.request<API.PageResult<API_PROJECT_SERVICE.R.IPage[]>>(
+      'omegaProject.projectServicegetProjectServiceList',
+      params,
+      options,
+    )
+  }
+
+  add(params: API_PROJECT_SERVICE.P.IAdd) {
+    return this.request('omegaProject.projectServiceaddProjectService', params)
+  }
+
+  update(params: API_PROJECT_SERVICE.P.IAdd) {
+    return this.request(
+      'omegaProject.projectServiceupdateProjectService',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaProject.projectServicedeleteProjectService', id)
+  }
+
+  query(params?: any) {
+    return this.request(
+      'omegaProject.projectServicegetProjectServiceQuery',
+      params,
+    )
+  }
+
+  linkDatabase(params: API_PROJECT_SERVICE.P.ILinkDatabase) {
+    return this.request('omegaProject.projectServicelinkProjectService', params)
+  }
+})()
+
+/* 项目角色 */
+export const FETCH_PROJECT_ROLE = new (class extends http {
+  page(params?: any) {
+    return this.request<API.PageResult<API_PROJECT_ROLE.R.IPage[]>>(
+      'omegaProject.projectRolegetProjectRoleList',
+      params,
+    )
+  }
+
+  add(params: API_PROJECT_ROLE.P.IAdd) {
+    return this.request('omegaProject.projectRoleaddProjectRole', params)
+  }
+
+  update(params: API_PROJECT_ROLE.P.IAdd) {
+    return this.request('omegaProject.projectRoleupdateProjectRole', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaProject.projectRoledeleteProjectRole', id)
+  }
+
+  query(params?: any) {
+    return this.request('omegaProject.projectRolegetProjectRoleQuery', params)
+  }
+})()
+
+/* APP项目管理 */
+export const FETCH_PROJECT_APP = new (class extends http {
+  page(params: API_PROJECT_APP.P.IPage) {
+    return this.request<API.PageResult<API_PROJECT_APP.R.IPage[]>>(
+      'omegaSource.appProjectgetAppProjectList',
+      params,
+    )
+  }
+
+  add(params: API_PROJECT_APP.P.IAdd) {
+    return this.request('omegaSource.appProjectaddAppProject', params)
+  }
+
+  update(params: API_PROJECT_APP.P.IUpdate) {
+    return this.request('omegaSource.appProjectupdateAppProject', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.appProjectdeleteAppProject', id)
+  }
+
+  query(params: { id: ID }) {
+    return this.request<API_PROJECT_APP.R.IQuery>(
+      'omegaSource.appProjectgetAppProjectQuery',
+      params,
+    )
+  }
+})()

+ 662 - 0
AdminFrontEnd/src/api/project/model.d.ts

@@ -0,0 +1,662 @@
+declare namespace API_PROJECT_GROUP {
+  namespace P {
+    interface IAdd {
+      /**
+       * 分组名称
+       */
+      groupName: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * 分组名称
+       */
+      groupName: string
+      /**
+       * ID
+       */
+      id?: number
+    }
+  }
+}
+
+declare namespace API_PROJECT {
+  namespace P {
+    interface IPage {
+      /**
+       * 后端开发语言
+       */
+      backendLanguage: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 微服务标记
+       */
+      microServiceFlag: boolean
+      /**
+       * 项目分组
+       */
+      projectGroupId: number
+      /**
+       * 项目名称
+       */
+      projectName: string
+      /**
+       * 状态
+       */
+      status: number
+      /**
+       * 更新人
+       */
+      updateBy: string
+    }
+    interface IAdd {
+      id?: ID
+      /**
+       * 应用端
+       */
+      appType: number
+      /**
+       * 后端开发语言
+       */
+      backendLanguage: string
+      /**
+       * 业务模块
+       */
+      businessList: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 使用功能
+       */
+      featureList: string
+      /**
+       * LOGO
+       */
+      logo: string
+      /**
+       * 微服务标记
+       */
+      microServiceFlag: boolean
+      /**
+       * 项目介绍
+       */
+      projectDetail: string
+      /**
+       * 项目分组
+       */
+      projectGroupId: number
+      /**
+       * 项目名称
+       */
+      projectName: string
+      /**
+       * 状态
+       */
+      status: number
+      /**
+       * 更新人
+       */
+      updateBy: string
+      /**
+       * api数据同步地址测试
+       */
+      apiListNoticeHostDev: string
+      /**
+       * api数据同步地址生产
+       */
+      apiListNoticeHost: string
+      /**
+       * 网关地址测试
+       */
+      gatewayHostDev: string
+      /**
+       * 网关地址生成
+       */
+      gatewayHost: string
+
+      // 加密方式
+      encryptKind: string
+      // 加密参数
+      encryptParam: string
+    }
+
+    interface ILinkServe {
+      /**
+       * 项目ID
+       */
+      projectId: ID
+      /**
+       * 服务器
+       */
+      serverList: ID[]
+      /**
+       * 服务ID
+       */
+      serviceId: number
+    }
+  }
+
+  namespace R {
+    interface IQueryLinkServer {
+      /**
+       * 云平台名称
+       */
+      cloudName?: string
+      /**
+       * 地址
+       */
+      hostAddress?: string
+      /**
+       * ID
+       */
+      id?: ID
+      /**
+       * 操作系统
+       */
+      operatingSystem?: string
+      /**
+       * 操作系统版本
+       */
+      operationSystemVersion?: string
+      /**
+       * 端口
+       */
+      port?: number
+      /**
+       * 项目ID
+       */
+      projectId?: ID
+      /**
+       * 服务器名称
+       */
+      serverName?: string
+      /**
+       * 服务器类型
+       */
+      serverType?: number
+      /**
+       * 账号
+       */
+      username?: string
+    }
+
+    interface IQuery {
+      id: ID
+      projectName: string
+      projectDetail: string
+      microServiceFlag: boolean
+      createBy: string
+      updateBy: null
+      appType: number
+      backendLanguage: null
+      projectGroupId: number
+      status: number
+      /**
+       * api数据同步地址测试
+       */
+      apiListNoticeHostDev: string
+      /**
+       * api数据同步地址生产
+       */
+      apiListNoticeHost: string
+      /**
+       * 网关地址测试
+       */
+      gatewayHostDev: string
+      /**
+       * 网关地址生成
+       */
+      gatewayHost: string
+      // 加密方式
+      encryptKind: string
+      // 加密参数
+      encryptParam: string
+    }
+
+    interface IPage {
+      /**
+       * 应用端
+       */
+      appType?: number
+      /**
+       * 后端开发语言
+       */
+      backendLanguage?: string
+      /**
+       * 创建人
+       */
+      createBy?: string
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 微服务标记
+       */
+      microServiceFlag?: boolean
+      /**
+       * 项目分组
+       */
+      projectGroupId?: number
+      /**
+       * 项目名称
+       */
+      projectName?: string
+      /**
+       * 状态
+       */
+      status?: number
+      /**
+       * 更新人
+       */
+      updateBy?: string
+    }
+  }
+}
+
+declare namespace API_PROJECT_MODULE {
+  namespace P {
+    interface IAdd {
+      /**
+       * 业务模块ID
+       */
+      businessModuleId: ID
+      /**
+       * 项目ID
+       */
+      projectId: ID
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * 业务模块ID
+       */
+      businessModuleId?: number
+      /**
+       * ID
+       */
+      id?: number
+      /**
+       * 项目ID
+       */
+      projectId?: number
+    }
+  }
+}
+
+declare namespace API_PROJECT_WORKER {
+  namespace P {
+    interface IAdd {
+      // 根据 OpenAPI 添加字段
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      id?: number
+      // 其他字段
+    }
+  }
+}
+
+declare namespace API_PROJECT_API_VERSION {
+  namespace P {
+    interface IAdd {
+      /**
+       * 应用端
+       */
+      appId: number
+      /**
+       * 域名
+       */
+      domainName: string
+      /**
+       * 使用环境
+       */
+      envId: number
+      /**
+       * 版本号
+       */
+      versionNumber: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * 应用端
+       */
+      appId?: number
+      /**
+       * 域名
+       */
+      domainName?: string
+      /**
+       * 使用环境
+       */
+      envId?: number
+      /**
+       * ID
+       */
+      id?: number
+      /**
+       * 版本号
+       */
+      versionNumber?: string
+    }
+  }
+}
+
+declare namespace API_PROJECT_SERVICE {
+  namespace P {
+    interface IAdd {
+      /**
+       * 应用端
+       */
+      appId: number
+      /**
+       * 数据库
+       */
+      databaseList: string
+      /**
+       * 开发语言
+       */
+      devLanguage: string
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 服务器
+       */
+      serverList: string
+      /**
+       * 服务名称
+       */
+      serviceName: string
+      serviceTitle: string
+      packageName: string
+    }
+
+    interface IPage {
+      /**
+       * 开发语言
+       */
+      devLanguage: string
+      /**
+       * 服务名称
+       */
+      serviceName: string
+      /**
+       * 包名
+       */
+      packageName: string
+    }
+
+    interface ILinkDatabase {
+      /**
+       * 数据库
+       */
+      databaseList: string[]
+      /**
+       * ID
+       */
+      id: ID
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * 应用端
+       */
+      appId?: number
+      /**
+       * 开发语言
+       */
+      devLanguage?: string
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 服务器
+       */
+      serverList?: ID[]
+      /**
+       * 服务名称
+       */
+      serviceName?: string
+      databaseList?: ID[]
+      serviceTitle?: string
+    }
+  }
+}
+
+declare namespace API_PROJECT_ROLE {
+  namespace P {
+    interface IAdd {
+      // 根据 OpenAPI 添加字段
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      id?: number
+      // 其他字段
+    }
+  }
+}
+
+declare namespace API_PROJECT_APP {
+  namespace P {
+    /**
+     * 列表查询参数
+     */
+    interface IPage {
+      /**
+       * APP名称
+       */
+      appName?: string
+      /**
+       * APP终端类型
+       */
+      appKind?: string
+    }
+
+    /**
+     * 添加参数
+     */
+    interface IAdd {
+      /**
+       * APP名称
+       */
+      appName: string
+      /**
+       * APP介绍
+       */
+      appDetail: string
+      /**
+       * APP终端类型
+       */
+      appKind: string
+      /**
+       * 包名
+       */
+      packageName: string
+      /**
+       * APP图标
+       */
+      appIcon: string
+      /**
+       * APP启动图
+       */
+      appStartBg: string
+      /**
+       * APP启动介绍图
+       */
+      appStartListPhoto: string
+      /**
+       * 请求接口主机头
+       */
+      apiHost: string
+      /**
+       * 静态文件
+       */
+      staticFile: string
+      /**
+       * 首次加载界面
+       */
+      initPage: string
+    }
+
+    /**
+     * 更新参数
+     */
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: ID
+    }
+  }
+
+  namespace R {
+    /**
+     * 列表返回数据
+     */
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime?: string
+      /**
+       * 更新时间
+       */
+      updateTime?: string
+      /**
+       * 创建人
+       */
+      createBy?: string
+      /**
+       * 更新人
+       */
+      updateBy?: string
+      /**
+       * APP名称
+       */
+      appName: string
+      /**
+       * APP终端类型
+       */
+      appKind: string
+      /**
+       * 包名
+       */
+      packageName: string
+      /**
+       * APP图标
+       */
+      appIcon: string
+      /**
+       * APP启动图
+       */
+      appStartBg: string
+      /**
+       * APP启动介绍图
+       */
+      appStartListPhoto: string
+      /**
+       * 请求接口主机头
+       */
+      apiHost: string
+      /**
+       * 静态文件
+       */
+      staticFile: string
+      /**
+       * 首次加载界面
+       */
+      initPage: string
+    }
+
+    /**
+     * 详情返回数据
+     */
+    interface IQuery {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 更新时间
+       */
+      updateTime: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 更新人
+       */
+      updateBy: string
+      /**
+       * APP名称
+       */
+      appName: string
+      /**
+       * APP介绍
+       */
+      appDetail: string
+      /**
+       * APP终端类型
+       */
+      appKind: string
+      /**
+       * 包名
+       */
+      packageName: string
+      /**
+       * APP图标
+       */
+      appIcon: string
+      /**
+       * APP启动图
+       */
+      appStartBg: string
+      /**
+       * APP启动介绍图
+       */
+      appStartListPhoto: string
+      /**
+       * 请求接口主机头
+       */
+      apiHost: string
+      /**
+       * 静态文件
+       */
+      staticFile: string
+      /**
+       * 首次加载界面
+       */
+      initPage: string
+    }
+  }
+}

+ 402 - 0
AdminFrontEnd/src/api/resource/index.ts

@@ -0,0 +1,402 @@
+import { http } from '@/utils/http/request'
+import type { FetchOptions } from '@/utils/http/type'
+
+/* 应用端 */
+export const FETCH_APPLICATION = new (class extends http {
+  page(params?: API_APPLICATION.P.IPage) {
+    return this.request<API.PageResult<API_APPLICATION.R.IPage[]>>(
+      'omegaSource.applicationgetApplicationList',
+      params,
+    )
+  }
+
+  add(params: API_APPLICATION.P.IAdd) {
+    return this.request('omegaSource.applicationaddApplication', params)
+  }
+
+  update(params: API_APPLICATION.P.IAdd) {
+    return this.request('omegaSource.applicationupdateApplication', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.applicationdeleteApplication', id)
+  }
+})()
+
+/* 中间件配置 */
+export const FETCH_MIDDLE = new (class extends http {
+  page(params?: API_MIDDLE.P.IPage) {
+    return this.request<API.PageResult<API_MIDDLE.R.IPage[]>>(
+      'omegaSource.middlewaregetMiddlewareList',
+      params,
+    )
+  }
+
+  add(params: API_MIDDLE.P.IAdd) {
+    return this.request('omegaSource.middlewareaddMiddleware', params)
+  }
+
+  update(params: API_MIDDLE.P.IAdd) {
+    return this.request('omegaSource.middlewareupdateMiddleware', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.middlewaredeleteMiddleware', id)
+  }
+})()
+
+/* 数据库配置 */
+export const FETCH_DATA = new (class extends http {
+  page(params?: API.PageParams<API_DATA.P.IPage>) {
+    return this.request<API.PageResult<API_DATA.R.IPage[]>>(
+      'omegaSource.databaseInfogetDatabaseInfoList',
+      params,
+    )
+  }
+
+  add(params: API_DATA.P.IAdd) {
+    return this.request('omegaSource.databaseInfoaddDatabaseInfo', params)
+  }
+
+  update(params: { id: ID } & API_DATA.P.IAdd) {
+    return this.request('omegaSource.databaseInfoupdateDatabaseInfo', params)
+  }
+
+  query(params: { id: ID }, options?: FetchOptions) {
+    return this.request<API_DATA.R.IQuery>(
+      'omegaSource.databaseInfogetDatabaseInfoQuery',
+      params,
+      options,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.databaseInfodeleteDatabaseInfo', id)
+  }
+
+  pageByIds(params?: API_DATA.P.IPageByIds) {
+    return this.request<API.PageResult<API_DATA.R.IPageByIds[]>>(
+      'omegaSource.databaseInfogetDatabaseInfoListByIds',
+      params,
+    )
+  }
+
+  clone(params: API_DATA.P.IClone) {
+    return this.request('omegaSource.databaseInfocopyDatabaseInfo', params)
+  }
+
+  genSql(params: { id: ID }) {
+    return this.request('omegaSource.databaseInfomakeDatabaseInfo', params)
+  }
+})()
+
+/* 服务器配置 */
+export const FETCH_SERVER = new (class extends http {
+  page(params?: API_SERVER.P.IPage) {
+    return this.request<API.PageResult<API_SERVER.R.IPage[]>>(
+      'omegaSource.servergetServerList',
+      params,
+    )
+  }
+
+  add(params: API_SERVER.P.IAdd) {
+    return this.request('omegaSource.serveraddServer', params)
+  }
+
+  update(params: API_SERVER.P.IAdd) {
+    return this.request('omegaSource.serverupdateServer', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.serverdeleteServer', id)
+  }
+})()
+
+/* 环境配置 */
+export const FETCH_ENV = new (class extends http {
+  page(params?: API_ENV.P.IPage) {
+    return this.request<API.PageResult<API_ENV.R.IPage[]>>(
+      'omegaSource.environmentgetEnvironmentList',
+      params,
+    )
+  }
+
+  add(params: API_ENV.P.IAdd) {
+    return this.request('omegaSource.environmentaddEnvironment', params)
+  }
+
+  update(params: API_ENV.P.IAdd) {
+    return this.request('omegaSource.environmentupdateEnvironment', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.environmentdeleteEnvironment', id)
+  }
+})()
+
+/* 生成模板 */
+export const FETCH_MAKE_TEMPLATE = new (class extends http {
+  page(params: API_MAKE_TEMPLATE.P.IPage) {
+    return this.request<API.PageResult<API_MAKE_TEMPLATE.R.IPage[]>>(
+      'omegaMake.makeTemplategetMakeTemplateList',
+      params,
+    )
+  }
+
+  add(params: API_MAKE_TEMPLATE.P.IAdd) {
+    return this.request('omegaMake.makeTemplateaddMakeTemplate', params)
+  }
+
+  update(params: API_MAKE_TEMPLATE.P.IUpdate) {
+    return this.request('omegaMake.makeTemplateupdateMakeTemplate', params)
+  }
+
+  detail(params: { id: ID }) {
+    return this.request<API_MAKE_TEMPLATE.R.IDetail>(
+      'omegaMake.makeTemplategetMakeTemplateQuery',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaMake.makeTemplatedeleteMakeTemplate', id)
+  }
+})()
+
+/* 生成模板分类 */
+export const FETCH_MAKE_TEMPLATE_CATEGORY = new (class extends http {
+  page(params: API_MAKE_TEMPLATE_CATEGORY.P.IPage) {
+    return this.request<API.PageResult<API_MAKE_TEMPLATE_CATEGORY.R.IPage[]>>(
+      'omegaMake.makeTemplateGategorygetMakeTemplateGategoryList',
+      params,
+    )
+  }
+
+  add(params: API_MAKE_TEMPLATE_CATEGORY.P.IAdd) {
+    return this.request(
+      'omegaMake.makeTemplateGategoryaddMakeTemplateGategory',
+      params,
+    )
+  }
+
+  update(params: API_MAKE_TEMPLATE_CATEGORY.P.IUpdate) {
+    return this.request(
+      'omegaMake.makeTemplateGategoryupdateMakeTemplateGategory',
+      params,
+    )
+  }
+
+  detail(params: { id: ID }) {
+    return this.request<API_MAKE_TEMPLATE_CATEGORY.R.IDetail>(
+      'omegaMake.makeTemplateGategorygetMakeTemplateGategoryQuery',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request(
+      'omegaMake.makeTemplateGategorydeleteMakeTemplateGategory',
+      id,
+    )
+  }
+})()
+
+/* 数据库生成日志 */
+export const FETCH_DATABASE_MAKE_LOG = new (class extends http {
+  page(params: API_DATABASE_MAKE_LOG.P.IPage, fetchOptions?: FetchOptions) {
+    return this.request<API.PageResult<API_DATABASE_MAKE_LOG.R.IPage[]>>(
+      'omegaSource.databaseMakeLoggetDatabaseMakeLogList',
+      params,
+      fetchOptions,
+    )
+  }
+
+  detail(params: { id: ID }, fetchOptions?: FetchOptions) {
+    return this.request<API_DATABASE_MAKE_LOG.R.IDetail>(
+      'omegaSource.databaseMakeLoggetDatabaseMakeLogQuery',
+      params,
+      fetchOptions,
+    )
+  }
+})()
+
+/* 接口分组树 */
+export const FETCH_SOURCE_API_GROUP = new (class extends http {
+  tree(params?: API_SOURCE_API_GROUP.P.ITree) {
+    return this.request<API_SOURCE_API_GROUP.R.ITree[]>(
+      'omegaSource.apiGroupgetApiTree',
+      params,
+    )
+  }
+})()
+
+/* 后台项目 */
+export const FETCH_BACKGROUND_PROJECT = new (class extends http {
+  page(params: API_BACKGROUND_PROJECT.P.IPage) {
+    return this.request<API.PageResult<API_BACKGROUND_PROJECT.R.IPage[]>>(
+      'omegaSource.backgroundProjectgetBackgroundProjectList',
+      params,
+    )
+  }
+
+  add(params: API_BACKGROUND_PROJECT.P.IAdd) {
+    return this.request(
+      'omegaSource.backgroundProjectaddBackgroundProject',
+      params,
+    )
+  }
+
+  update(params: API_BACKGROUND_PROJECT.P.IUpdate) {
+    return this.request(
+      'omegaSource.backgroundProjectupdateBackgroundProject',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request(
+      'omegaSource.backgroundProjectdeleteBackgroundProject',
+      id,
+    )
+  }
+
+  query(params: { id: ID }) {
+    return this.request<API_BACKGROUND_PROJECT.R.IDetail>(
+      'omegaSource.backgroundProjectgetBackgroundProjectQuery',
+      params,
+    )
+  }
+})()
+
+/* 后台项目菜单 */
+export const FETCH_BACKGROUND_PROJECT_MENU = new (class extends http {
+  page(params: API_BACKGROUND_PROJECT_MENU.P.IPage) {
+    return this.request<API.PageResult<API_BACKGROUND_PROJECT_MENU.R.IPage[]>>(
+      'omegaSource.backgroundProjectMenugetBackgroundProjectMenuList',
+      params,
+    )
+  }
+
+  add(params: API_BACKGROUND_PROJECT_MENU.P.IAdd) {
+    return this.request(
+      'omegaSource.backgroundProjectMenuaddBackgroundProjectMenu',
+      params,
+    )
+  }
+
+  update(params: API_BACKGROUND_PROJECT_MENU.P.IUpdate) {
+    return this.request(
+      'omegaSource.backgroundProjectMenuupdateBackgroundProjectMenu',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request(
+      'omegaSource.backgroundProjectMenudeleteBackgroundProjectMenu',
+      id,
+    )
+  }
+
+  query(params: { id: ID }) {
+    return this.request<API_BACKGROUND_PROJECT_MENU.R.IDetail>(
+      'omegaSource.backgroundProjectMenugetBackgroundProjectMenuQuery',
+      params,
+    )
+  }
+})()
+
+/* 服务器脚本 */
+export const FETCH_SERVER_SCRIPT = new (class extends http {
+  page(params: API_SERVER_SCRIPT.P.IPage) {
+    return this.request<API.PageResult<API_SERVER_SCRIPT.R.IPage[]>>(
+      'omegaSource.serverScriptgetServerScriptList',
+      params,
+    )
+  }
+
+  add(params: API_SERVER_SCRIPT.P.IAdd) {
+    return this.request('omegaSource.serverScriptaddServerScript', params)
+  }
+
+  update(params: API_SERVER_SCRIPT.P.IUpdate) {
+    return this.request('omegaSource.serverScriptupdateServerScript', params)
+  }
+
+  detail(params: { id: ID }) {
+    return this.request<API_SERVER_SCRIPT.R.IDetail>(
+      'omegaSource.serverScriptgetServerScriptQuery',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaSource.serverScriptdeleteServerScript', id)
+  }
+})()
+
+/* 服务器脚本分类 */
+export const FETCH_SERVER_SCRIPT_KIND = new (class extends http {
+  page(params: API_SERVER_SCRIPT_KIND.P.IPage) {
+    return this.request<API.PageResult<API_SERVER_SCRIPT_KIND.R.IPage[]>>(
+      'omegaSource.serverScriptKindgetServerScriptKindList',
+      params,
+    )
+  }
+
+  add(params: API_SERVER_SCRIPT_KIND.P.IAdd) {
+    return this.request(
+      'omegaSource.serverScriptKindaddServerScriptKind',
+      params,
+    )
+  }
+
+  update(params: API_SERVER_SCRIPT_KIND.P.IUpdate) {
+    return this.request(
+      'omegaSource.serverScriptKindupdateServerScriptKind',
+      params,
+    )
+  }
+
+  detail(params: { id: ID }) {
+    return this.request<API_SERVER_SCRIPT_KIND.R.IDetail>(
+      'omegaSource.serverScriptKindgetServerScriptKindQuery',
+      params,
+    )
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request(
+      'omegaSource.serverScriptKinddeleteServerScriptKind',
+      id,
+    )
+  }
+
+  tree(params: API_SERVER_SCRIPT_KIND.P.ITree) {
+    return this.request<API_SERVER_SCRIPT_KIND.R.ITree[]>(
+      'omegaSource.serverScriptKindgetServerScriptTree',
+      params,
+    )
+  }
+})()
+
+/* 服务器脚本执行日志 */
+export const FETCH_SERVER_SCRIPT_LOG = new (class extends http {
+  page(params: API_SERVER_SCRIPT_LOG.P.IPage) {
+    return this.request<API.PageResult<API_SERVER_SCRIPT_LOG.R.IPage[]>>(
+      'omegaSource.serverScriptLoggetServerScriptLogList',
+      params,
+    )
+  }
+
+  detail(params: { id: ID }) {
+    return this.request<API_SERVER_SCRIPT_LOG.R.IDetail>(
+      'omegaSource.serverScriptLoggetServerScriptLogQuery',
+      params,
+    )
+  }
+
+  run(params: API_SERVER_SCRIPT_LOG.P.IRun) {
+    return this.request('omegaSource.serverScriptLogdoServerScript', params)
+  }
+})()

+ 1624 - 0
AdminFrontEnd/src/api/resource/model.d.ts

@@ -0,0 +1,1624 @@
+declare namespace API_APPLICATION {
+  namespace P {
+    interface IPage {
+      appName: string
+    }
+
+    interface IAdd {
+      /**
+       * 应用端名称
+       */
+      appName: string
+      /**
+       * 项目ID
+       */
+      projectId: number
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * 应用端名称
+       */
+      appName: string
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 项目ID
+       */
+      projectId: number
+    }
+  }
+}
+
+declare namespace API_MIDDLE {
+  namespace P {
+    interface IPage {
+      midName: string
+    }
+
+    interface IAdd {
+      /**
+       * 配置文件
+       */
+      configFile: string
+      /**
+       * 名称
+       */
+      midName: string
+      /**
+       * 类型
+       */
+      midType: string
+      /**
+       * 项目ID
+       */
+      projectId: number
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 名称
+       */
+      midName: string
+      /**
+       * 类型
+       */
+      midType: string
+      /**
+       * 项目ID
+       */
+      projectId: number
+    }
+  }
+}
+
+declare namespace API_DATA {
+  namespace P {
+    interface IClone {
+      /**
+       * 来源数据库ID
+       */
+      sourceDatabaseIdList: string
+      /**
+       * 目标服务ID
+       */
+      targetServiceId: number
+    }
+
+    interface IPage {
+      /**
+       * 数据库名称
+       */
+      dbName: string
+      /**
+       * 地址
+       */
+      hostAddress: string
+      projectId: ID
+    }
+
+    interface IAdd {
+      /**
+       * 数据库名称
+       */
+      dbName: string
+      /**
+       * 数据库名称
+       */
+      dbTitle: string
+      /**
+       * 数据库类型
+       */
+      dbType: string
+      /**
+       * 开发地址
+       */
+      devHostAddress: string
+      /**
+       * 开发端口
+       */
+      devPort: number
+      /**
+       * 开发密码
+       */
+      devPwd: string
+      /**
+       * 开发账号
+       */
+      devUsername: string
+      /**
+       * 应用环境ID
+       */
+      envId: number
+      /**
+       * 地址
+       */
+      hostAddress: string
+      /**
+       * 端口
+       */
+      port: number
+      /**
+       * 项目ID
+       */
+      projectId: number
+      /**
+       * 密码
+       */
+      pwd: string
+      /**
+       * 服务器ID
+       */
+      serverId: number
+      /**
+       * 账号
+       */
+      username: string
+    }
+
+    interface IPageByIds {
+      dbIdList: ID[]
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      id: ID
+
+      /**
+       * 数据库名称
+       */
+      dbName: string
+      /**
+       * 数据库名称
+       */
+      dbTitle: string
+      /**
+       * 数据库类型
+       */
+      dbType: string
+      /**
+       * 开发地址
+       */
+      devHostAddress: string
+      /**
+       * 开发端口
+       */
+      devPort: number
+      /**
+       * 开发密码
+       */
+      devPwd: string
+      /**
+       * 开发账号
+       */
+      devUsername: string
+      /**
+       * 应用环境ID
+       */
+      envId: number
+      /**
+       * 地址
+       */
+      hostAddress: string
+      /**
+       * 端口
+       */
+      port: number
+      /**
+       * 项目ID
+       */
+      projectId: number
+      /**
+       * 密码
+       */
+      pwd: string
+      /**
+       * 服务器ID
+       */
+      serverId: number
+      /**
+       * 账号
+       */
+      username: string
+    }
+
+    interface IPageByIds {
+      id: ID
+      /**
+       * 数据库名称
+       */
+      dbName: string
+      /**
+       * 数据库名称
+       */
+      dbTitle: string
+      /**
+       * 数据库类型
+       */
+      dbType: string
+      /**
+       * 开发地址
+       */
+      devHostAddress: string
+      /**
+       * 开发端口
+       */
+      devPort: number
+      /**
+       * 开发密码
+       */
+      devPwd: string
+      /**
+       * 开发账号
+       */
+      devUsername: string
+      /**
+       * 应用环境ID
+       */
+      envId: number
+      /**
+       * 地址
+       */
+      hostAddress: string
+      /**
+       * 端口
+       */
+      port: number
+      /**
+       * 项目ID
+       */
+      projectId: number
+      /**
+       * 密码
+       */
+      pwd: string
+      /**
+       * 服务器ID
+       */
+      serverId: number
+      /**
+       * 账号
+       */
+      username: string
+    }
+
+    interface IQuery extends IPage {}
+  }
+}
+
+declare namespace API_SERVER {
+  namespace P {
+    interface IPage {
+      /**
+       * 云平台名称
+       */
+      cloudName: string
+      /**
+       * 地址
+       */
+      hostAddress: string
+      /**
+       * 服务器名称
+       */
+      serverName: string
+    }
+
+    interface IAdd {
+      /**
+       * 云平台名称
+       */
+      cloudName: string
+      /**
+       * 地址
+       */
+      hostAddress: string
+      /**
+       * 操作系统
+       */
+      operatingSystem: string
+      /**
+       * 操作系统版本
+       */
+      operationSystemVersion: string
+      /**
+       * 端口
+       */
+      port: number
+      /**
+       * 项目ID
+       */
+      projectId: number
+      /**
+       * 密码
+       */
+      pwd: string
+      /**
+       * 服务器名称
+       */
+      serverName: string
+      /**
+       * 服务器类型
+       */
+      serverType: number
+      /**
+       * 账号
+       */
+      username: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * 云平台名称
+       */
+      cloudName: string
+      /**
+       * 地址
+       */
+      hostAddress: string
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 操作系统
+       */
+      operatingSystem: string
+      /**
+       * 操作系统版本
+       */
+      operationSystemVersion: string
+      /**
+       * 端口
+       */
+      port: number
+      /**
+       * 项目ID
+       */
+      projectId: number
+      /**
+       * 服务器名称
+       */
+      serverName: string
+      /**
+       * 服务器类型
+       */
+      serverType: number
+      /**
+       * 账号
+       */
+      username: string
+    }
+  }
+}
+
+declare namespace API_ENV {
+  namespace P {
+    interface IPage {
+      /**
+       * 应用端ID
+       */
+      appId: number
+      /**
+       * 开发语言
+       */
+      devLanguage: string
+      /**
+       * 环境名称
+       */
+      envName: string
+    }
+
+    interface IAdd {
+      /**
+       * 应用端ID
+       */
+      appId: number
+      /**
+       * 配置文件
+       */
+      configFile: string
+      /**
+       * 开发语言
+       */
+      devLanguage: string
+      /**
+       * 环境名称
+       */
+      envName: string
+      /**
+       * 项目ID
+       */
+      projectId: number
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * 应用端ID
+       */
+      appId: number
+      /**
+       * 开发语言
+       */
+      devLanguage: string
+      /**
+       * 环境名称
+       */
+      envName: string
+      /**
+       * ID
+       */
+      id: number
+      /**
+       * 项目ID
+       */
+      projectId: number
+    }
+  }
+}
+
+declare namespace API_MAKE_TEMPLATE {
+  namespace P {
+    interface IPage {
+      pageSize: number
+      pageNum: number
+      /**
+       * 分类ID
+       */
+      gategoryId?: number
+      /**
+       * 模板名称
+       */
+      templateName?: string
+    }
+
+    interface IAdd {
+      /**
+       * 分类ID
+       */
+      gategoryId: number
+      /**
+       * 模板名称
+       */
+      templateName: string
+      /**
+       * 模板介绍
+       */
+      templateDetail: string
+      /**
+       * 模板内容
+       */
+      templateContent: string
+    }
+
+    interface IUpdate {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 分类ID
+       */
+      gategoryId?: number
+      /**
+       * 模板名称
+       */
+      templateName?: string
+      /**
+       * 模板介绍
+       */
+      templateDetail?: string
+      /**
+       * 模板内容
+       */
+      templateContent?: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 分类ID
+       */
+      gategoryId: number
+      /**
+       * 模板名称
+       */
+      templateName: string
+      /**
+       * 模板介绍
+       */
+      templateDetail: string
+      /**
+       * 模板内容
+       */
+      templateContent: string
+      /* 生成路径 */
+      makePath: string
+    }
+
+    interface IDetail {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 分类ID
+       */
+      gategoryId: number
+      /**
+       * 模板名称
+       */
+      templateName: string
+      /**
+       * 模板介绍
+       */
+      templateDetail: string
+      /**
+       * 模板内容
+       */
+      templateContent: string
+    }
+  }
+}
+
+declare namespace API_MAKE_TEMPLATE_CATEGORY {
+  namespace P {
+    interface IPage {
+      pageSize: number
+      pageNum: number
+      /**
+       * 分类名称
+       */
+      gategoryName?: string
+    }
+
+    interface IAdd {
+      /**
+       * 分类名称
+       */
+      gategoryName: string
+      /**
+       * 父级ID
+       */
+      parentId: number
+      /**
+       * 分类介绍
+       */
+      gategoryDetail: string
+    }
+
+    interface IUpdate {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 分类名称
+       */
+      gategoryName?: string
+      /**
+       * 父级ID
+       */
+      parentId?: number
+      /**
+       * 分类介绍
+       */
+      gategoryDetail?: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 分类名称
+       */
+      gategoryName: string
+      /**
+       * 分类介绍
+       */
+      gategoryDetail: string
+      /**
+       * 子集
+       */
+      children: string
+    }
+
+    interface IDetail {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 分类名称
+       */
+      gategoryName: string
+      /**
+       * 父级ID
+       */
+      parentId: number
+    }
+  }
+}
+
+declare namespace API_DATABASE_MAKE_LOG {
+  namespace P {
+    interface IPage {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 生成对象 1数据库,2数据表,3数据字段
+       */
+      makeObject?: 1 | 2 | 3
+      /**
+       * 生成对象ID
+       */
+      makeObjectId?: ID
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 创建人
+       */
+      createBy: string
+    }
+
+    interface IDetail {
+      /**
+       * 生成内容
+       */
+      makeContent: string
+    }
+  }
+}
+
+declare namespace API_SOURCE_API_GROUP {
+  namespace P {
+    interface ITree {
+      /**
+       * 项目ID
+       */
+      projectId: ID
+    }
+  }
+
+  namespace R {
+    type IParamMatrix = IField[][]
+
+    interface ITree {
+      serviceId: number
+      projectId: number
+      serviceName: string
+      serviceTitle: string
+      apiGroups: IGroup[]
+    }
+
+    interface IGroup {
+      id: number
+      serviceId: number
+      groupName: string
+      groupNameUpper: string
+      groupTitle: string
+      apiHostDev: string
+      apiHost: string
+      apiInfos: IApi[]
+    }
+
+    interface IApi {
+      id: number
+      serviceId: number
+      groupId: number
+      tabName: string
+      apiName: string
+      apiKind: number
+      apiMethod: string
+      methodName: string
+      methodNameUpper: string
+      methodNameFirstUpper: string
+      apiDetail: string | null
+      requestParam: IParamMatrix
+      responseParam: IParamMatrix
+      linkTableId: number
+      linkTableTitle: null
+      linkTableName: null
+      linkTableNameUpper: string
+      linkTableNameFirstUpper: string
+      pageFlag: boolean
+      apiPath: string
+      apiKey: string
+    }
+
+    interface IField extends IFieldBase {
+      editType: string
+      checkAttribute: unknown[] | null
+      fieldDetail: string | null
+      linkTablePrimaryKeyName: string
+      linkParam: ILinkField[] | null
+    }
+
+    interface ILinkField extends IFieldBase {
+      editType: string | null
+      checkAttribute: null
+      fieldDetail: null
+      linkTablePrimaryKeyName: null
+      linkParam: ILinkField[] | null
+    }
+
+    interface IFieldBase {
+      id: number
+      fieldTitle: string
+      fieldName: string
+      fieldNameUpper: string
+      fieldNameFirstUpper: string
+      fieldType: string
+      editTypeData: null
+      reqParam: boolean
+      resParam: boolean
+      customFlag: boolean
+      resType: string
+      checkAttributeString: string
+      sortMode: null
+      linkTableId: number
+      linkTableTitle: null
+      linkTableName: null
+      linkTableNameUpper: string
+      linkTableNameFirstUpper: string
+      linkParamCount: number
+    }
+  }
+}
+
+declare namespace API_BACKGROUND_PROJECT {
+  namespace P {
+    interface IPage {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 所属项目ID
+       */
+      projectId?: ID
+      /**
+       * 后台项目标题
+       */
+      projectTitle?: string
+      /**
+       * 后台项目名称
+       */
+      projectName?: string
+    }
+
+    interface IAdd {
+      /**
+       * 所属项目ID
+       */
+      projectId: ID
+      /**
+       * 后台项目标题
+       */
+      projectTitle: string
+      /**
+       * 后台项目名称
+       */
+      projectName: string
+      /**
+       * 后台项目简介
+       */
+      projectDetail: string
+    }
+
+    interface IUpdate {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 后台项目标题
+       */
+      projectTitle: string
+      /**
+       * 后台项目名称
+       */
+      projectName: string
+      /**
+       * 后台项目简介
+       */
+      projectDetail: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 所属项目ID
+       */
+      projectId: ID
+      /**
+       * 后台项目标题
+       */
+      projectTitle: string
+      /**
+       * 后台项目名称
+       */
+      projectName: string
+      /**
+       * 后台项目简介
+       */
+      projectDetail: string
+    }
+
+    interface IDetail {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 版本号
+       */
+      version: number
+      /**
+       * 删除标记
+       */
+      delFlag: number
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 更新时间
+       */
+      updateTime: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 更新人
+       */
+      updateBy: string
+      /**
+       * 所属项目ID
+       */
+      projectId: ID
+      /**
+       * 后台项目标题
+       */
+      projectTitle: string
+      /**
+       * 后台项目名称
+       */
+      projectName: string
+      /**
+       * 后台项目简介
+       */
+      projectDetail: string
+    }
+  }
+}
+
+declare namespace API_BACKGROUND_PROJECT_MENU {
+  namespace P {
+    interface IPage {
+      menuData: string // json
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 后台项目ID
+       */
+      bgProjectId?: ID
+      /**
+       * 菜单标题
+       */
+      menuTitle?: string
+      /**
+       * 菜单名称
+       */
+      menuName?: string
+    }
+
+    interface IAdd {
+      menuData: string // json
+      /**
+       * 所属项目ID
+       */
+      projectId: ID
+      /**
+       * 后台项目ID
+       */
+      bgProjectId: ID
+      /**
+       * 菜单标题
+       */
+      menuTitle: string
+      /**
+       * 菜单名称
+       */
+      menuName: string
+      /**
+       * 菜单简介
+       */
+      menuDetail: string
+    }
+
+    interface IUpdate {
+      menuData: string // json
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 所属项目ID
+       */
+      projectId: any
+      /**
+       * 后台项目ID
+       */
+      bgProjectId: ID
+      /**
+       * 菜单标题
+       */
+      menuTitle: string
+      /**
+       * 菜单名称
+       */
+      menuName: string
+      /**
+       * 菜单简介
+       */
+      menuDetail: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 所属项目ID
+       */
+      projectId: ID
+      /**
+       * 后台项目ID
+       */
+      bgProjectId: ID
+      /**
+       * 菜单标题
+       */
+      menuTitle: string
+      /**
+       * 菜单名称
+       */
+      menuName: string
+      /**
+       * 菜单简介
+       */
+      menuDetail: string
+    }
+
+    interface IDetail {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 版本号
+       */
+      version: number
+      /**
+       * 删除标记
+       */
+      delFlag: number
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 更新时间
+       */
+      updateTime: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 更新人
+       */
+      updateBy: string
+      /**
+       * 所属项目ID
+       */
+      projectId: ID
+      /**
+       * 后台项目ID
+       */
+      bgProjectId: ID
+      /**
+       * 菜单标题
+       */
+      menuTitle: string
+      /**
+       * 菜单名称
+       */
+      menuName: string
+      /**
+       * 菜单简介
+       */
+      menuDetail: string
+    }
+  }
+}
+
+declare namespace API_BACKGROUND_PROJECT_MENU_PAGE {
+  namespace P {
+    interface IPage {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 菜单ID
+       */
+      menuId?: ID
+      /**
+       * 页面标题
+       */
+      pageTitle?: string
+      /**
+       * 页面名称
+       */
+      pageName?: string
+    }
+
+    interface IAdd {
+      /**
+       * 所属项目ID
+       */
+      projectId: ID
+      /**
+       * 后台项目ID
+       */
+      bgProjectId: ID
+      /**
+       * 菜单ID
+       */
+      menuId: ID
+      /**
+       * 页面标题
+       */
+      pageTitle: string
+      /**
+       * 页面名称
+       */
+      pageName: string
+      /**
+       * 页面简介
+       */
+      pageDetail: string
+    }
+
+    interface IUpdate {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 页面标题
+       */
+      pageTitle: string
+      /**
+       * 页面名称
+       */
+      pageName: string
+      /**
+       * 页面简介
+       */
+      pageDetail: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 所属项目ID
+       */
+      projectId: ID
+      /**
+       * 后台项目ID
+       */
+      bgProjectId: ID
+      /**
+       * 菜单ID
+       */
+      menuId: ID
+      /**
+       * 页面标题
+       */
+      pageTitle: string
+      /**
+       * 页面名称
+       */
+      pageName: string
+      /**
+       * 页面简介
+       */
+      pageDetail: string
+    }
+
+    interface IDetail {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 版本号
+       */
+      version: number
+      /**
+       * 删除标记
+       */
+      delFlag: number
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 更新时间
+       */
+      updateTime: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 更新人
+       */
+      updateBy: string
+      /**
+       * 所属项目ID
+       */
+      projectId: ID
+      /**
+       * 后台项目ID
+       */
+      bgProjectId: ID
+      /**
+       * 菜单ID
+       */
+      menuId: ID
+      /**
+       * 页面标题
+       */
+      pageTitle: string
+      /**
+       * 页面名称
+       */
+      pageName: string
+      /**
+       * 页面简介
+       */
+      pageDetail: string
+    }
+  }
+}
+
+declare namespace API_SERVER_SCRIPT {
+  namespace P {
+    interface IPage {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 脚本名称
+       */
+      scriptName?: string
+      /**
+       * 脚本文件名
+       */
+      scriptFileName?: string
+      /**
+       * 代码类型
+       */
+      codeType?: string
+    }
+
+    interface IAdd {
+      /**
+       * 脚本名称
+       */
+      scriptName: string
+      /**
+       * 脚本文件名
+       */
+      scriptFileName: string
+      /**
+       * 存放路径
+       */
+      savePath: string
+      /**
+       * 代码类型
+       */
+      codeType: string
+      /**
+       * 远程仓库代码
+       */
+      remoteCodeFlag: boolean
+      /**
+       * 脚本内容
+       */
+      scriptContent: string
+      /**
+       * 脚本参数
+       */
+      scriptParam: string
+      /**
+       * 脚本说明
+       */
+      scriptDetail: string
+    }
+
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: ID
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 脚本名称
+       */
+      scriptName: string
+      /**
+       * 脚本文件名
+       */
+      scriptFileName: string
+      /**
+       * 存放路径
+       */
+      savePath: string
+      /**
+       * 代码类型
+       */
+      codeType: string
+      /**
+       * 远程仓库代码
+       */
+      remoteCodeFlag: boolean
+    }
+
+    interface IDetail {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 脚本名称
+       */
+      scriptName: string
+      /**
+       * 脚本文件名
+       */
+      scriptFileName: string
+      /**
+       * 存放路径
+       */
+      savePath: string
+      /**
+       * 代码类型
+       */
+      codeType: string
+      /**
+       * 远程仓库代码
+       */
+      remoteCodeFlag: boolean
+    }
+  }
+}
+
+declare namespace API_SERVER_SCRIPT_KIND {
+  namespace P {
+    interface IPage {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 分类名称
+       */
+      kindName?: string
+      /**
+       * 分类编码
+       */
+      kindCode?: string
+    }
+
+    interface IAdd {
+      /**
+       * 分类名称
+       */
+      kindName: string
+      /**
+       * 分类编码
+       */
+      kindCode: string
+    }
+
+    interface IUpdate extends IAdd {
+      /**
+       * ID
+       */
+      id: ID
+    }
+
+    interface ITree {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 分类名称
+       */
+      kindName: string
+      /**
+       * 分类编码
+       */
+      kindCode: string
+    }
+
+    interface IDetail {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 分类名称
+       */
+      kindName: string
+      /**
+       * 分类编码
+       */
+      kindCode: string
+    }
+
+    interface ITree {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 分类名称
+       */
+      kindName: string
+      /**
+       * 分类编码
+       */
+      kindCode: string
+      /**
+       * 脚本列表
+       */
+      scriptList: {
+        id: number
+        scriptName: string
+      }[]
+    }
+  }
+}
+
+declare namespace API_SERVER_SCRIPT_LOG {
+  namespace P {
+    interface IPage {
+      /**
+       * 每页数量
+       */
+      pageSize: number
+      /**
+       * 页码(第几页)
+       */
+      pageNum: number
+      /**
+       * 服务器ID
+       */
+      serverId?: ID
+    }
+
+    interface IRun {
+      /**
+       * 服务器ID列表
+       */
+      serverIdList: string
+      /**
+       * 脚本ID列表
+       */
+      scriptIdList: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 请求ID
+       */
+      requestId: string
+      /**
+       * 请求参数
+       */
+      requestParam: string
+      /**
+       * 服务器ID
+       */
+      serverId: ID
+    }
+
+    interface IDetail {
+      /**
+       * ID
+       */
+      id: ID
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 请求ID
+       */
+      requestId: string
+      /**
+       * 请求参数
+       */
+      requestParam: string
+      /**
+       * 服务器ID
+       */
+      serverId: ID
+      /**
+       * 执行日志文件名
+       */
+      logicLogFilePath: string
+    }
+
+    interface IRun {}
+  }
+}

+ 76 - 0
AdminFrontEnd/src/api/system/index.ts

@@ -0,0 +1,76 @@
+import { http } from '@/utils/http/request'
+
+export const FETCH_DICT_TYPE = new (class extends http {
+  page() {
+    return this.request<API.PageResult<API_DICT_TYPE.R.IPage[]>>(
+      'omegaAdmin.sysDictgetSysDictList',
+      {
+        pageNum: 1,
+        pageSize: 1000,
+      },
+    )
+  }
+
+  add(params: API_DICT_TYPE.P.IAdd) {
+    return this.request('omegaAdmin.sysDictaddSysDict', params)
+  }
+
+  update(params: API_DICT_TYPE.P.IAdd & { deptId: number }) {
+    return this.request('omegaAdmin.sysDictupdateSysDict', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaAdmin.sysDictdeleteSysDict', id)
+  }
+})()
+
+export const FETCH_DICT = new (class extends http {
+  page(params: API_DICT.P.IPage) {
+    return this.request<API_DICT.R.IPage[]>(
+      'omegaAdmin.sysDictItemgetSysDictItemList',
+      params,
+    )
+  }
+
+  add(params: API_DICT.P.IAdd) {
+    return this.request('omegaAdmin.sysDictItemaddSysDictItem', params)
+  }
+
+  update(params: API_DICT.P.IAdd & { deptId: number }) {
+    return this.request('omegaAdmin.sysDictItemupdateSysDictItem', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaAdmin.sysDictItemdeleteSysDictItem', id)
+  }
+})()
+
+export const FETCH_PARAM = new (class extends http {
+  page(params: API_PARAM.P.IPage) {
+    return this.request<API.PageResult<API_PARAM.R.IPage[]>>(
+      'omegaAdmin.sysPublicParamgetsysPublicParamList',
+      params,
+    )
+  }
+
+  add(params: API_PARAM.P.IAdd) {
+    return this.request('omegaAdmin.sysPublicParamaddsysPublicParam', params)
+  }
+
+  update(params: API_PARAM.P.IAdd & { id: number }) {
+    return this.request('omegaAdmin.sysPublicParamupdatesysPublicParam', params)
+  }
+
+  delete({ id }: { id: ID }) {
+    return this.request('omegaAdmin.sysPublicParamdeletesysPublicParam', id)
+  }
+})()
+
+export const FETCH_LOG = new (class extends http {
+  page(params: API_LOG.P.IPage) {
+    return this.request<API.PageResult<API_LOG.R.IPage[]>>(
+      'omegaAdmin.sysLoggetSysLogList',
+      params,
+    )
+  }
+})()

+ 281 - 0
AdminFrontEnd/src/api/system/model.d.ts

@@ -0,0 +1,281 @@
+declare namespace API_DICT_TYPE {
+  namespace P {
+    interface IAdd {
+      id: ID
+      /**
+       * 描述
+       */
+      description: string
+      /**
+       * 类型
+       */
+      dictType: string
+      /**
+       * 备注
+       */
+      remarks: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 描述
+       */
+      description: string
+      /**
+       * 类型
+       */
+      dictType: string
+      id: string
+      /**
+       * 备注
+       */
+      remarks: string
+      /**
+       * 修改人
+       */
+      updateBy: string
+      /**
+       * 更新时间
+       */
+      updateTime: string
+    }
+  }
+}
+
+declare namespace API_DICT {
+  namespace P {
+    interface IAdd {
+      id: string
+      dictId: string
+      label: string
+      dictType: string
+      description: string
+      sortOrder: number
+      createBy: string
+      updateBy: string
+      createTime: string
+      updateTime: string
+      remarks: string
+      delFlag: string
+      itemValue: string
+    }
+
+    interface IPage {
+      dictId: ID
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      id: string
+      dictId: string
+      label: string
+      dictType: string
+      description: string
+      sortOrder: number
+      createBy: string
+      updateBy: string
+      createTime: string
+      updateTime: string
+      remarks: string
+      delFlag: string
+      value: string
+    }
+  }
+}
+
+declare namespace API_PARAM {
+  namespace P {
+    interface IAdd {
+      /**
+       * 键
+       */
+      publicKey: string
+      /**
+       * 名称
+       */
+      publicName: string
+      /**
+       * 类型,0未知,1系统,2业务
+       */
+      publicType: string
+      /**
+       * 值
+       */
+      publicValue: string
+      /**
+       * 系统标识,0非系统,1系统
+       */
+      systemFlag: string
+      /**
+       * 校验码
+       */
+      validateCode: string
+    }
+    interface IPage {
+      /**
+       * 键
+       */
+      publicKey: string
+      /**
+       * 名称
+       */
+      publicName: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 删除标记,0未删除,1已删除
+       */
+      delFlag: string
+      /**
+       * 编号
+       */
+      id: number
+      /**
+       * 键
+       */
+      publicKey: string
+      /**
+       * 名称
+       */
+      publicName: string
+      /**
+       * 类型,0未知,1系统,2业务
+       */
+      publicType: string
+      /**
+       * 值
+       */
+      publicValue: string
+      /**
+       * 状态,0禁用,1启用
+       */
+      status: string
+      /**
+       * 系统标识,0非系统,1系统
+       */
+      systemFlag: string
+      /**
+       * 修改人
+       */
+      updateBy: string
+      /**
+       * 更新时间
+       */
+      updateTime: string
+      /**
+       * 校验码
+       */
+      validateCode: string
+    }
+  }
+}
+
+declare namespace API_LOG {
+  namespace P {
+    interface IPage {
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 请求方法
+       */
+      method: string
+      /**
+       * 日志标题
+       */
+      title: string
+      /**
+       * 修改人
+       */
+      updateBy: string
+      /**
+       * 更新时间
+       */
+      updateTime: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      /**
+       * 创建人
+       */
+      createBy: string
+      /**
+       * 创建时间
+       */
+      createTime: string
+      /**
+       * 删除标志
+       */
+      delFlag: string
+      /**
+       * 编号
+       */
+      id: number
+      /**
+       * 日志类型
+       */
+      logType: string
+      /**
+       * 请求方法
+       */
+      method: string
+      /**
+       * 远程地址
+       */
+      remoteAddr: string
+      /**
+       * 请求URI
+       */
+      requestUri: string
+      /**
+       * 服务ID
+       */
+      serviceId: string
+      /**
+       * 执行时间
+       */
+      time: number
+      /**
+       * 日志标题
+       */
+      title: string
+      /**
+       * 修改人
+       */
+      updateBy: string
+      /**
+       * 更新时间
+       */
+      updateTime: string
+    }
+  }
+}

+ 21 - 0
AdminFrontEnd/src/api/typings.d.ts

@@ -0,0 +1,21 @@
+declare namespace API {
+  /** 表格分页返回数据结构 */
+  type PaginationResult = {
+    total: number
+    pageNum: number
+    pageSize: number
+  }
+
+  /** 通过表格返回结果 */
+  type PageResult<T = any, P = PaginationResult> = {
+    records: T
+  } & { [K in keyof P]: P[K] }
+
+  /** 表格分页请求参数 */
+  type PageParams<T = any> = {
+    pageSize: number
+    pageNum: number
+  } & {
+    [P in keyof T]?: T[P]
+  }
+}

+ 193 - 0
AdminFrontEnd/src/api/workflow/index.ts

@@ -0,0 +1,193 @@
+import { http } from '@/utils/http/request'
+
+// 逻辑节点 API
+export const FETCH_LOGIC_NODE = new (class extends http {
+  // 列表查询
+  page(params: API_LOGIC_NODE.P.IPage) {
+    return this.request<API.PageResult<API_LOGIC_NODE.R.IPage[]>>(
+      'omegaLogic.logicNodegetLogicNodeList',
+      params,
+    )
+  }
+
+  // 新增
+  add(params: API_LOGIC_NODE.P.IAdd) {
+    return this.request('omegaLogic.logicNodeaddLogicNode', params)
+  }
+
+  // 修改
+  update(params: API_LOGIC_NODE.P.IUpdate) {
+    return this.request('omegaLogic.logicNodeupdateLogicNode', params)
+  }
+
+  // 详情
+  detail(params: { id: ID }) {
+    return this.request<API_LOGIC_NODE.R.IDetail>(
+      'omegaLogic.logicNodegetLogicNodeQuery',
+      params,
+    )
+  }
+
+  // 删除
+  delete({ id }: { id: ID }) {
+    return this.request('omegaLogic.logicNodedeleteLogicNode', id)
+  }
+})()
+
+// 逻辑节点分类 API
+export const FETCH_LOGIC_NODE_KIND = new (class extends http {
+  // 列表查询
+  page(params: API_LOGIC_NODE_KIND.P.IPage) {
+    return this.request<API.PageResult<API_LOGIC_NODE_KIND.R.IPage[]>>(
+      'omegaLogic.logicNodeKindgetLogicNodeKindList',
+      params,
+    )
+  }
+
+  // 新增
+  add(params: API_LOGIC_NODE_KIND.P.IAdd) {
+    return this.request('omegaLogic.logicNodeKindaddLogicNodeKind', params)
+  }
+
+  // 修改
+  update(params: API_LOGIC_NODE_KIND.P.IUpdate) {
+    return this.request('omegaLogic.logicNodeKindupdateLogicNodeKind', params)
+  }
+
+  // 详情
+  detail(params: { id: ID }) {
+    return this.request<API_LOGIC_NODE_KIND.R.IDetail>(
+      'omegaLogic.logicNodeKindgetLogicNodeKindQuery',
+      params,
+    )
+  }
+
+  // 删除
+  delete({ id }: { id: ID }) {
+    return this.request('omegaLogic.logicNodeKinddeleteLogicNodeKind', id)
+  }
+
+  // 节点分类数据
+  nodeTree(params: API_LOGIC_NODE_KIND.P.IPage) {
+    return this.request<API_LOGIC_NODE_KIND.R.INodeTree[]>(
+      'omegaLogic.logicNodeKindgetLogicNodeTree',
+      {
+        pageNum: 1,
+        pageSize: 1000,
+        ...params,
+      },
+    )
+  }
+})()
+
+// 逻辑项 API
+export const FETCH_LOGIC_PROJECT = new (class extends http {
+  // 列表查询
+  page(params: API_LOGIC_PROJECT.P.IPage) {
+    return this.request<API_LOGIC_PROJECT.R.IPage[]>(
+      'omegaLogic.logicProjectgetLogicProjectList',
+      params,
+    )
+  }
+
+  // 新增
+  add(params: API_LOGIC_PROJECT.P.IAdd) {
+    return this.request('omegaLogic.logicProjectaddLogicProject', params)
+  }
+
+  // 修改
+  update(params: API_LOGIC_PROJECT.P.IUpdate) {
+    return this.request('omegaLogic.logicProjectupdateLogicProject', params)
+  }
+
+  // 详情
+  detail(params: { id: ID }) {
+    return this.request<API_LOGIC_PROJECT.R.IDetail>(
+      'omegaLogic.logicProjectgetLogicProjectQuery',
+      params,
+    )
+  }
+
+  // 删除
+  delete({ id }: { id: ID }) {
+    return this.request('omegaLogic.logicProjectdeleteLogicProject', id)
+  }
+
+  // 复制逻辑
+  copy(params: API_LOGIC_PROJECT.P.ICopy) {
+    return this.request('omegaLogic.logicProjectcopyLogicProject', params)
+  }
+  // 启动逻辑
+  run(params: API_LOGIC_PROJECT.P.IRun) {
+    return this.request<API_LOGIC_PROJECT.R.IRun>(
+      'omegaLogic.logicProjectrunLogicProject',
+      params,
+    )
+  }
+})()
+
+// 逻辑执行日志 API
+export const FETCH_LOGIC_LOG_RECORD = new (class extends http {
+  // 列表查询
+  page(params: API_LOGIC_LOG_RECORD.P.IPage) {
+    return this.request<API.PageResult<API_LOGIC_LOG_RECORD.R.IPage[]>>(
+      'omegaLogic.logicLogRecordgetLogicLogRecordList',
+      params,
+    )
+  }
+
+  // 详情
+  detail(params: API_LOGIC_LOG_RECORD.P.IDetail) {
+    return this.request<API_LOGIC_LOG_RECORD.R.IDetail>(
+      'omegaLogic.logicLogRecordgetLogicLogRecordQuery',
+      params,
+    )
+  }
+})()
+
+// 测试项目 API
+export const FETCH_TEST_PROJECT = new (class extends http {
+  // 列表查询
+  page(params: API_LOGIC_PROJECT.P.IPage) {
+    return this.request<API.PageResult<API_LOGIC_PROJECT.R.IPage[]>>(
+      'omegaLogic.testProjectgetTestProjectList',
+      params,
+    )
+  }
+
+  // 新增
+  add(params: API_LOGIC_PROJECT.P.IAdd) {
+    return this.request('omegaLogic.testProjectaddTestProject', params)
+  }
+
+  // 修改
+  update(params: API_LOGIC_PROJECT.P.IUpdate) {
+    return this.request('omegaLogic.testProjectupdateTestProject', params)
+  }
+
+  // 详情
+  detail(params: { id: ID }) {
+    return this.request<API_LOGIC_PROJECT.R.IDetail>(
+      'omegaLogic.testProjectgetTestProjectQuery',
+      params,
+    )
+  }
+
+  // 删除
+  delete({ id }: { id: ID }) {
+    return this.request('omegaLogic.testProjectdeleteTestProject', id)
+  }
+
+  // 复制
+  copy(params: API_LOGIC_PROJECT.P.ICopy) {
+    return this.request('omegaLogic.testProjectcopyTestProject', params)
+  }
+
+  // 启动
+  run(params: API_LOGIC_PROJECT.P.IRun) {
+    return this.request<API_LOGIC_PROJECT.R.IRun>(
+      'omegaLogic.testProjectrunTestProject',
+      params,
+    )
+  }
+})()

+ 217 - 0
AdminFrontEnd/src/api/workflow/model.d.ts

@@ -0,0 +1,217 @@
+// 逻辑节点 API 类型定义
+declare namespace API_LOGIC_NODE {
+  namespace P {
+    interface IPage {
+      pageSize: number
+      pageNum: number
+      nodeKind?: number
+    }
+
+    interface IAdd {
+      nodeName: string
+      nodeDetail: string
+      nodeTemplate: string
+      nodeKind: number
+      testNodeFlag: boolean
+    }
+
+    interface IUpdate {
+      id: ID
+      nodeName: string
+      nodeDetail: string
+      nodeTemplate: string
+      nodeKind: number
+      testNodeFlag: boolean
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      id: number
+      nodeName: string
+      nodeKind: number
+    }
+
+    interface IDetail {
+      id: number
+      nodeName: string
+      nodeDetail: string
+      nodeTemplate: string
+      nodeKind: number
+      testNodeFlag: boolean
+    }
+  }
+}
+
+// 逻辑节点分类 API 类型定义
+declare namespace API_LOGIC_NODE_KIND {
+  namespace P {
+    interface IPage {
+      pageSize?: number
+      pageNum?: number
+      testNodeFlag?: boolean
+    }
+
+    interface IAdd {
+      kindName: string
+      kindDetail: string
+      testNodeFlag: boolean
+    }
+
+    interface IUpdate {
+      id: ID
+      kindName: string
+      kindDetail: string
+      testNodeFlag: boolean
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      id: ID
+      kindName: string
+    }
+
+    interface IDetail {
+      id: ID
+      kindName: string
+      kindDetail: string
+      testNodeFlag: boolean
+    }
+
+    interface INodeTree {
+      /**
+       * ID
+       */
+      id?: number
+      /**
+       * 分类介绍
+       */
+      kindDetail?: string
+      /**
+       * 分类名称
+       */
+      kindName?: string
+      logicNodeList?: {
+        /**
+         * 节点介绍
+         */
+        nodeDetail?: string
+        /**
+         * 节点分类
+         */
+        nodeKind?: number
+        /**
+         * 节点名称
+         */
+        nodeName?: string
+        /**
+         * 配置模板
+         */
+        nodeTemplate?: string
+      }[]
+    }
+  }
+}
+
+// 逻辑项 API 类型定义
+declare namespace API_LOGIC_PROJECT {
+  namespace P {
+    interface IPage {
+      pageSize: number
+      pageNum: number
+      projectName?: string
+      projectId?: ID
+    }
+
+    interface IAdd {
+      projectName: string
+      projectDetail: string
+      serviceId: number
+      setData: string
+      projectId?: ID
+    }
+
+    interface IUpdate {
+      id: ID
+      projectName: string
+      projectDetail: string
+      serviceId: number
+      setData: string
+      projectId?: ID
+    }
+
+    interface ICopy {
+      idList: ID[]
+    }
+
+    interface IRun {
+      id: ID
+      requestData: string
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      id: number
+      projectName: string
+      projectDetail: string
+      serviceId: number
+    }
+
+    interface IDetail {
+      id: number
+      createTime: string
+      updateTime: string
+      createBy: string
+      updateBy: string
+      projectName: string
+      projectDetail: string
+      serviceId: number
+      setData: string
+    }
+
+    interface IRun {
+      status: number
+      info: string
+      data: Record<string, any>
+    }
+  }
+}
+
+// 逻辑执行日志 API 类型定义
+declare namespace API_LOGIC_LOG_RECORD {
+  namespace P {
+    interface IPage {
+      pageSize: number
+      pageNum: number
+      logicId?: ID
+    }
+
+    interface IDetail {
+      id: ID
+    }
+  }
+
+  namespace R {
+    interface IPage {
+      id: ID
+      createTime: string
+      requestId: string
+      requestParam: string
+      logicProjectName: string
+      logicId: ID
+      logicLogFilePath: string
+    }
+
+    interface IDetail {
+      id: ID
+      createTime: string
+      requestId: string
+      requestParam: string
+      logicProjectName: string
+      logicId: ID
+      logicLogFilePath: string
+    }
+  }
+}

BIN
AdminFrontEnd/src/assets/404.gif


File diff suppressed because it is too large
+ 0 - 0
AdminFrontEnd/src/assets/analysis.svg


BIN
AdminFrontEnd/src/assets/images/bg/login-bg.png


BIN
AdminFrontEnd/src/assets/images/logo/login-pic.png


BIN
AdminFrontEnd/src/assets/images/logo/logo.png


+ 1 - 0
AdminFrontEnd/src/assets/svg/android.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none"><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M16.764 9.907a9.3 9.3 0 0 1 1.777 1.46a9.8 9.8 0 0 1 2.005 3.158c.343.873.564 1.791.655 2.727c.054.55-.399.998-.951.998H3.75c-.552 0-1.005-.449-.951-.998c.091-.936.312-1.854.655-2.727a9.8 9.8 0 0 1 2.005-3.157a9.3 9.3 0 0 1 1.777-1.461m9.528 0a9 9 0 0 0-1.224-.65a8.85 8.85 0 0 0-3.54-.74a8.85 8.85 0 0 0-3.54.74a9 9 0 0 0-1.224.65m9.528 0L18.49 6.75M7.236 9.907L5.51 6.75"/><circle cx="8.75" cy="14.063" r="1.25" fill="currentColor"/><circle cx="15.25" cy="14.063" r="1.25" fill="currentColor"/></g></svg>

+ 4 - 0
AdminFrontEnd/src/assets/svg/close.svg

@@ -0,0 +1,4 @@
+<svg t="1702373113638" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4219">
+	<path d="M572.16 512l183.467-183.04a42.667 42.667 0 1 0-60.587-60.587L512 451.84 328.96 268.373a42.667 42.667 0 0 0-60.587 60.587L451.84 512 268.373 695.04a42.667 42.667 0 0 0 0 60.587 42.667 42.667 0 0 0 60.587 0L512 572.16l183.04 183.467a42.667 42.667 0 0 0 60.587 0 42.667 42.667 0 0 0 0-60.587z" p-id="4220">
+	</path>
+</svg>

+ 4 - 0
AdminFrontEnd/src/assets/svg/connect.svg

@@ -0,0 +1,4 @@
+<svg t="1702370856713" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5328" width="200" height="200">
+	<path d="M871.673333 770.813333l-165.933333-165.94a53.4 53.4 0 0 0-75.426667 0l-37.713333 37.713334c-21.333333 21.333333-90.413333 0.1-150.846667-60.34S360.046667 452.76 381.413333 431.4l37.713334-37.713333a53.4 53.4 0 0 0 0-75.426667l-165.94-165.933333a53.393333 53.393333 0 0 0-75.42 0l-37.713334 37.713333c-27.866667 27.866667-44.84 64.52-50.46 108.946667-5.213333 41.206667-0.406667 87.42 14.28 137.333333C133.333333 536.586667 199.773333 642 290.9 733.1S487.42 890.666667 587.653333 920.126667c36.926667 10.86 71.813333 16.32 104.146667 16.32a264.333333 264.333333 0 0 0 33.213333-2.04c44.426667-5.62 81.08-22.593333 108.946667-50.46l37.713333-37.713334a53.393333 53.393333 0 0 0 0-75.42z" p-id="5329">
+	</path>
+</svg>

+ 39 - 0
AdminFrontEnd/src/assets/svg/dark.svg

@@ -0,0 +1,39 @@
+
+<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
+    xmlns="http://www.w3.org/2000/svg"
+    xmlns:xlink="http://www.w3.org/1999/xlink">
+    <defs>
+        <filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
+            <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
+        <filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
+            <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+        </filter>
+    </defs>
+    <g id="配置面板" width="48" height="40" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="setting-copy-2" width="48" height="40" transform="translate(-1190.000000, -136.000000)">
+            <g id="Group-8" width="48" height="40" transform="translate(1167.000000, 0.000000)">
+                <g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
+                    <mask id="mask-3" fill="white">
+                        <use xlink:href="#path-2"></use>
+                    </mask>
+                    <g id="Rectangle-18">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
+                        <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
+                    </g>
+                    <rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
+                    <rect id="Rectangle-18" fill="#303648" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 8 - 0
AdminFrontEnd/src/assets/svg/disbursement.svg

@@ -0,0 +1,8 @@
+<svg t="1702374262334" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5422" width="200" height="200">
+	<path d="M556.8 303.9c0 22.6 18.3 41 41 41h278.5c22.6 0 41-18.3 41-41 0-22.6-18.3-41-41-41H597.7c-22.6 0.1-40.9 18.4-40.9 41z" p-id="5423">
+	</path>
+	<path d="M735.4 163.2c-16 16-16 41.9 0 57.9l111.8 111.8c16 16 41.9 16 57.9 0s16-41.9 0-57.9L793.3 163.2c-15.9-16-41.9-16-57.9 0z" p-id="5424">
+	</path>
+	<path d="M735.4 444.7c16 16 41.9 16 57.9 0l111.8-111.8c16-16 16-41.9 0-57.9s-41.9-16-57.9 0L735.4 386.8c-16 15.9-16 41.9 0 57.9zM922 834.6c1.8-3.2 3.2-6.7 4.1-10.4 4.8-17 7.4-34.9 7.4-53.5 0-108.8-88.2-197-197-197-92.3 0-169.8 63.6-191.2 149.3C423.5 668.6 329 563.4 289.4 433.8c84.6-22.1 147.1-99 147.1-190.6v-0.9-0.9c0-108.1-87.7-195.8-195.8-195.8-27.3 0-53.3 5.6-76.9 15.7-71.2 29.8-121.3 100-121.3 182 0 2.8 0.1 5.6 0.2 8.4-0.1 4.8-0.2 9.6-0.2 14.4 0 387.5 314.2 700.6 701.7 700.6 2.9 0 5.8-0.2 8.6-0.2 3.4-0.1 6.8-0.7 9.9-1.7 74.4-9.8 135.5-61.3 159.3-130.2z" p-id="5425">
+	</path>
+</svg>

+ 1 - 0
AdminFrontEnd/src/assets/svg/disconnect.svg

@@ -0,0 +1 @@
+<svg t="1702370863570" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5471" width="200" height="200"><path d="M982.666667 505.946667c-25.446667-32.82-61.526667-62.1-107.22-87.026667C783.693333 368.886667 662.206667 341.333333 533.333333 341.333333s-250.36 27.553333-342.086666 77.586667C145.553333 443.846667 109.473333 473.126667 84 505.946667 56.58 541.333333 42.666667 579.26 42.666667 618.666667v53.333333a53.393333 53.393333 0 0 0 53.333333 53.333333h234.666667a53.393333 53.393333 0 0 0 53.333333-53.333333v-53.333333c0-30.213333 63.866667-64 149.333333-64s149.333333 33.786667 149.333334 64v53.333333a53.393333 53.393333 0 0 0 53.333333 53.333333h234.666667a53.393333 53.393333 0 0 0 53.333333-53.333333v-53.333333c0-39.406667-13.913333-77.333333-41.333333-112.72z" fill="#5C5C66" p-id="5472"></path></svg>

File diff suppressed because it is too large
+ 1 - 0
AdminFrontEnd/src/assets/svg/empty.svg


+ 4 - 0
AdminFrontEnd/src/assets/svg/error.svg

@@ -0,0 +1,4 @@
+<svg style="background: #fff; border-radius: 50%;" t="1702371019974" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2875" width="200" height="200">
+	<path d="M512 85.333333c235.637333 0 426.666667 191.029333 426.666667 426.666667S747.637333 938.666667 512 938.666667 85.333333 747.637333 85.333333 512 276.362667 85.333333 512 85.333333z m-86.474667 296.96a30.570667 30.570667 0 1 0-43.232 43.232L468.768 512l-86.474667 86.474667a30.570667 30.570667 0 1 0 43.232 43.232L512 555.232l86.474667 86.474667a30.570667 30.570667 0 1 0 43.232-43.232L555.232 512l86.474667-86.474667a30.570667 30.570667 0 1 0-43.232-43.232L512 468.768z" fill="#fa541c" p-id="2876">
+	</path>
+</svg>

+ 1 - 0
AdminFrontEnd/src/assets/svg/exit.svg

@@ -0,0 +1 @@
+<svg t="1702458870432" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="16493" width="200" height="200"><path d="M698.592 222.272a42.656 42.656 0 1 1 43.968-73.12A447.712 447.712 0 0 1 960 533.344c0 247.424-200.576 448-448 448s-448-200.576-448-448C64 374.08 147.84 229.28 281.888 148.864A42.656 42.656 0 0 1 325.76 222.08a362.4 362.4 0 0 0-176.416 311.296C149.344 733.632 311.68 896 512 896c200.32 0 362.656-162.368 362.656-362.656 0-128.832-67.648-245.888-176.064-311.04zM512 42.656c23.552 0 42.656 19.104 42.656 42.688v341.312a42.656 42.656 0 1 1-85.312 0V85.344c0-23.584 19.104-42.688 42.656-42.688z" fill="#fff" p-id="16494"></path></svg>

+ 4 - 0
AdminFrontEnd/src/assets/svg/filePencil.svg

@@ -0,0 +1,4 @@
+<svg t="1702370889779" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5614" width="200" height="200">
+	<path d="M693.333333 298.666667a53.393333 53.393333 0 0 1-53.333333-53.333334V42.666667H181.333333a53.393333 53.393333 0 0 0-53.333333 53.333333v832a53.393333 53.393333 0 0 0 53.333333 53.333333h661.333334a53.393333 53.393333 0 0 0 53.333333-53.333333V298.666667z m-416-42.666667h213.333334a21.333333 21.333333 0 0 1 0 42.666667H277.333333a21.333333 21.333333 0 0 1 0-42.666667z m-21.333333 192a21.333333 21.333333 0 0 1 21.333333-21.333333h128a21.333333 21.333333 0 0 1 0 42.666666H277.333333a21.333333 21.333333 0 0 1-21.333333-21.333333z m430.326667 72.833333l-269.713334 269.72-114.14 16.306667 16.306667-114.14 269.72-269.713333a42.713333 42.713333 0 0 1 60.333333 0l37.493334 37.493333a42.713333 42.713333 0 0 1 0 60.333333zM682.666667 245.333333V55.42c1.066667 0.913333 2.12 1.86 3.126666 2.866667l194.586667 194.586666c1.006667 1.006667 1.953333 2.06 2.866667 3.126667H693.333333a10.666667 10.666667 0 0 1-10.666666-10.666667z" fill="#5C5C66" p-id="5615">
+	</path>
+</svg>

+ 1 - 0
AdminFrontEnd/src/assets/svg/ios.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="1"><path stroke-width="1.5" d="M10.102 7.78a4 4 0 0 0-1.185-.161c-1.918 0-4.167 1.695-4.167 5.359c0 3.36 2.358 7.21 3.801 7.822c.328.14.731.227 1.084.193c.707-.07 1.348-.421 2.023-.622c.228-.038.5-.074.719-.075c.24-.002.51.06.774.12c.715.164 1.505.65 2.255.577c.267-.026.633-.187.746-.239l.07-.03c.85-.343 1.988-1.826 2.759-3.703c.162-.396-.052-.833-.404-1.077c-.999-.694-1.663-1.934-1.663-3.195c0-.969.313-1.854.907-2.523l.02-.023a8 8 0 0 1 .45-.5c.255-.248.326-.645.082-.904c-.808-.854-1.832-1.277-2.764-1.277a3.6 3.6 0 0 0-1.106.156c-.138.033-.778.192-1.222.355c-.257.071-.635.167-.81.21a.7.7 0 0 1-.192.023c-.735-.024-1.47-.303-2.177-.487Z" clip-rule="evenodd"/><path fill="currentColor" d="M13.86 5.178c-.733.878-1.975 1.047-1.975 1.047s-.05-1.256.684-2.135s1.976-1.046 1.976-1.046s.05 1.256-.684 2.134Z"/></g></svg>

+ 39 - 0
AdminFrontEnd/src/assets/svg/light.svg

@@ -0,0 +1,39 @@
+
+<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
+    xmlns="http://www.w3.org/2000/svg"
+    xmlns:xlink="http://www.w3.org/1999/xlink">
+    <defs>
+        <filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
+            <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
+        <filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
+            <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+        </filter>
+    </defs>
+    <g id="配置面板" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="setting-copy-2" transform="translate(-1254.000000, -136.000000)">
+            <g id="Group-8" transform="translate(1167.000000, 0.000000)">
+                <g id="Group-5" filter="url(#filter-1)" transform="translate(89.000000, 137.000000)">
+                    <mask id="mask-3" fill="white">
+                        <use xlink:href="#path-2"></use>
+                    </mask>
+                    <g id="Rectangle-18">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
+                        <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
+                    </g>
+                    <rect id="Rectangle-18" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
+                    <rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 1 - 0
AdminFrontEnd/src/assets/svg/linux.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none"><rect width="1.48" height="1.48" x="12.671" y="5.713" fill="currentColor" rx=".74"/><rect width="1.48" height="1.48" x="10.381" y="5.713" fill="currentColor" rx=".74"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M14.603 20.846a1.916 1.916 0 0 0 3.253.436l1.852-2.308a.69.69 0 0 0-.193-1.03l-1.538-.888m-3.374 3.79a5.9 5.9 0 0 1-2.337.476a5.9 5.9 0 0 1-2.453-.526m4.79.05a1.92 1.92 0 0 1-.028-1.457l.89-2.29m-5.652 3.697a1.916 1.916 0 0 1-2.474 1.074L4.58 20.795a.69.69 0 0 1-.347-.989l1.661-2.878a.69.69 0 0 1 .542-.343m3.377 4.21a1.92 1.92 0 0 0-.58-2.207l-.02-.017m-2.777-1.986a6 6 0 0 1-.125-1.218a5.92 5.92 0 0 1 1.16-3.531c.809-1.098 1.588-2.313 1.588-3.677V6.206a3.206 3.206 0 1 1 6.413 0V8.16c0 1.364.78 2.58 1.589 3.676a5.93 5.93 0 0 1 1.16 3.532c0 .586-.085 1.153-.244 1.688m-11.541-.47a.7.7 0 0 1 .488.15l2.288 1.836m8.766-1.516l-1.341-.774a.69.69 0 0 0-.989.348l-.182.47m0 0c-.106-2.161-1.498-4.939-3.2-4.939c-1.771 0-3.207 3.007-3.207 5.197c0 .423.054.831.153 1.214"/><path fill="currentColor" d="M11.08 8.272a.6.6 0 0 0-.46.984l1.185 1.423a.6.6 0 0 0 .922 0l1.185-1.423a.6.6 0 0 0-.461-.984z"/></g></svg>

+ 1 - 0
AdminFrontEnd/src/assets/svg/lock-mic.svg

@@ -0,0 +1 @@
+  <svg viewBox="0 0 640 512" height="1em" xmlns="http://www.w3.org/2000/svg" class="microphone-slash"><path d="M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L472.1 344.7c15.2-26 23.9-56.3 23.9-88.7V216c0-13.3-10.7-24-24-24s-24 10.7-24 24v40c0 21.2-5.1 41.1-14.2 58.7L416 300.8V96c0-53-43-96-96-96s-96 43-96 96v54.3L38.8 5.1zM344 430.4c20.4-2.8 39.7-9.1 57.3-18.2l-43.1-33.9C346.1 382 333.3 384 320 384c-70.7 0-128-57.3-128-128v-8.7L144.7 210c-.5 1.9-.7 3.9-.7 6v40c0 89.1 66.2 162.7 152 174.4V464H248c-13.3 0-24 10.7-24 24s10.7 24 24 24h72 72c13.3 0 24-10.7 24-24s-10.7-24-24-24H344V430.4z"></path></svg>

+ 17 - 0
AdminFrontEnd/src/assets/svg/login-bgSvg.svg

@@ -0,0 +1,17 @@
+<svg style="fill: red;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="6395" height="1079" viewBox="0 0 6395 1079">
+  <defs>
+    <clipPath id="clip-path">
+      <rect  width="6395" height="1079" transform="translate(-5391)" fill="#fff"/>
+    </clipPath>
+    <linearGradient id="linear-gradient" x1="0.747" y1="0.222" x2="0.973" y2="0.807" gradientUnits="objectBoundingBox">
+      <stop offset="0" stop-color="#1890FF"/>
+      <stop offset="1" stop-color="#1890FF"/>
+    </linearGradient>
+  </defs>
+  <g id="Mask_Group_1" data-name="Mask Group 1" transform="translate(5391)" clip-path="url(#clip-path)">
+    <g id="Group_118" data-name="Group 118" transform="translate(-419.333 -1.126)">
+      <path id="Path_142" data-name="Path 142" d="M6271.734-6.176s-222.478,187.809-55.349,583.254c44.957,106.375,81.514,205.964,84.521,277,8.164,192.764-156.046,268.564-156.046,268.564l-653.53-26.8L5475.065-21.625Z" transform="translate(-4876.383 0)" fill="#f1f5f8"/>
+      <path id="Union_6" data-name="Union 6" d="M-2631.1,1081.8v-1.6H-8230.9V.022H-2631.1V0H-1871.4s-187.845,197.448-91.626,488.844c49.167,148.9,96.309,256.289,104.683,362.118,7.979,100.852-57.98,201.711-168.644,254.286-65.858,31.29-144.552,42.382-223.028,42.383C-2441.2,1147.632-2631.1,1081.8-2631.1,1081.8Z" transform="translate(3259.524 0.803)" fill="url(#linear-gradient)"/>
+    </g>
+  </g>
+</svg>

File diff suppressed because it is too large
+ 0 - 0
AdminFrontEnd/src/assets/svg/login-box-bg.svg


+ 48 - 0
AdminFrontEnd/src/assets/svg/logo.svg

@@ -0,0 +1,48 @@
+<svg width="182" height="166" xmlns="http://www.w3.org/2000/svg">
+ <!-- Generator: Sketch 54 (76480) - https://sketchapp.com -->
+ <title>未命名</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+  <linearGradient x1="0.00542331488%" y1="50.0074349%" x2="100.011743%" y2="50.0074349%" id="linearGradient-1">
+   <stop stop-color="#3668E7" offset="0.3030465%"/>
+   <stop stop-color="#44BAE1" offset="100%"/>
+  </linearGradient>
+  <linearGradient x1="0.0117592657%" y1="50.0044985%" x2="100.006481%" y2="50.0044985%" id="linearGradient-2">
+   <stop stop-color="#44BCE1" offset="0%"/>
+   <stop stop-color="#44BAE1" offset="36.72%"/>
+   <stop stop-color="#43B2E2" offset="54.5%"/>
+   <stop stop-color="#41A5E2" offset="68.19%"/>
+   <stop stop-color="#3F93E4" offset="79.8%"/>
+   <stop stop-color="#3C7BE5" offset="89.99%"/>
+   <stop stop-color="#385EE7" offset="99.21%"/>
+   <stop stop-color="#385BE7" offset="100%"/>
+  </linearGradient>
+  <linearGradient x1="0.0148416278%" y1="50.0005568%" x2="100.005996%" y2="50.0005568%" id="linearGradient-3">
+   <stop stop-color="#44BCE1" offset="0%"/>
+   <stop stop-color="#43B6E1" offset="14.76%"/>
+   <stop stop-color="#41A4E2" offset="34.89%"/>
+   <stop stop-color="#3E88E4" offset="58.12%"/>
+   <stop stop-color="#3960E7" offset="83.49%"/>
+   <stop stop-color="#385BE7" offset="86.36%"/>
+  </linearGradient>
+ </defs>
+ <g>
+  <title>background</title>
+  <rect x="-1" y="-1" width="184" height="168" id="canvas_background" fill="none"/>
+ </g>
+ <g>
+  <title>Layer 1</title>
+  <g id="logo3-01的副本" fill-rule="nonzero" stroke="null" transform="rotate(-1 88.74440002441469,82.13372802734358) ">
+   <g id="图层_2" stroke="null" transform="rotate(-1 88.74440002441469,82.13372802734358) ">
+    <g id="XMLID_5_" stroke="null">
+     <g id="编组" stroke="null">
+      <path d="m85.59977,58.69808c-18.60016,1.68406 -33.15083,17.00902 -33.15083,35.70211c0,19.80456 16.36951,35.83683 36.51396,35.83683c0,0 74.57221,12.15893 56.93295,-76.69217c10.15802,16.70589 19.42378,33.51283 19.42378,33.51283c0,0 22.64964,38.36292 -2.47087,61.80507c0,0 -14.585,13.40513 -41.55865,13.40513c-7.41261,0 -16.30088,0 -25.36073,0c-47.22107,-8.15086 -51.20191,-49.17461 -51.20191,-49.17461c-3.26018,-52.74481 40.8723,-54.5636 40.8723,-54.5636l0,0.16841z" id="路径" fill="url(#linearGradient-1)" stroke="null" stroke-width="0"/>
+      <path d="m145.89585,53.54485c17.63926,88.8511 -56.93295,76.69217 -56.93295,76.69217c20.17877,0 36.51396,-16.03227 36.51396,-35.83683c0,-3.33445 -0.48045,-6.56784 -1.33839,-9.63284c0,0 0,-0.03368 0,-0.03368c-0.37749,-1.91983 -6.0399,-28.3596 -33.52833,-38.63238c-12.52593,-4.68169 -26.35594,-4.34488 -38.91619,0.20209c-8.81963,3.19972 -19.18356,8.75712 -26.83639,18.32259l19.04629,-32.90656c4.35833,-7.51092 10.05506,-14.17981 16.98722,-19.50144c12.11413,-9.22866 31.19473,-16.97534 52.91779,-0.97676c0,0 6.52035,3.63758 19.86991,23.13901c3.84358,5.62477 8.13328,12.3947 12.21708,19.16463z" id="路径" fill="url(#linearGradient-2)" stroke="null" stroke-width="0"/>
+      <path d="m124.13847,84.73367c0.85794,3.06499 1.33839,6.29839 1.33839,9.63284c0,19.80456 -16.36951,35.83683 -36.51396,35.83683c-20.14445,0 -36.51396,-16.03227 -36.51396,-35.83683c0,-18.69309 14.55067,-34.01805 33.15083,-35.70212c1.09817,-0.10104 2.23065,-0.13472 3.36313,-0.13472c16.747,0 30.88587,11.08113 35.17557,26.204c0,0 0,0 0,0z" id="路径" fill="#FFFFFF" stroke="null" stroke-width="0"/>
+      <path d="m44.72747,113.09327c0,0 3.94653,41.02375 51.20191,49.17461c-15.47726,0 -31.332,0 -40.63208,0c-10.39824,0 -20.69353,-2.35769 -29.85634,-7.20779c-12.21708,-6.50048 -24.64006,-18.38995 -22.3751,-39.44073c1.64725,-15.32496 20.79649,-49.24196 20.79649,-49.24196l0.99521,-1.71775c0,0 0,0 0,-0.03368c7.61851,-9.59915 17.98244,-15.12287 26.83639,-18.32259c12.56025,-4.54697 26.39026,-4.88378 38.91619,-0.20209c27.48843,10.30646 33.15084,36.74623 33.52833,38.63238c-4.2897,-15.08919 -18.42857,-26.17032 -35.17557,-26.17032c-1.13249,0 -2.26497,0.06736 -3.36313,0.13472l0,-0.13472c0,-0.03368 -44.13248,1.78511 -40.8723,54.52992z" id="路径" fill="url(#linearGradient-3)" stroke="null" stroke-width="0"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+</svg>

+ 1 - 0
AdminFrontEnd/src/assets/svg/macos.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M9.063 3.5H12A1.5 1.5 0 0 1 13.5 5v6a1.5 1.5 0 0 1-1.5 1.5h-1.441l-.029-.03c-.75-.75-.78-1.425-.78-3.22A.75.75 0 0 0 9 8.5H7.753c.018-1.895.162-3.441 1.31-5m-1.777 0H4A1.5 1.5 0 0 0 2.5 5v6A1.5 1.5 0 0 0 4 12.5h4.714c-.38-.76-.45-1.574-.462-2.5H7a.75.75 0 0 1-.75-.75v-.07c0-1.89 0-3.791 1.036-5.68M1 5a3 3 0 0 1 3-3h8a3 3 0 0 1 3 3v6a3 3 0 0 1-3 3H4a3 3 0 0 1-3-3zm9.25 2.25a.75.75 0 0 0 1.5 0v-1a.75.75 0 0 0-1.5 0zM4.75 8A.75.75 0 0 1 4 7.25v-1a.75.75 0 0 1 1.5 0v1a.75.75 0 0 1-.75.75" clip-rule="evenodd"/></svg>

+ 2 - 0
AdminFrontEnd/src/assets/svg/mic.svg

@@ -0,0 +1,2 @@
+    <svg viewBox="0 0 384 512" xmlns="http://www.w3.org/2000/svg" class="microphone"><path d="M192 0C139 0 96 43 96 96V256c0 53 43 96 96 96s96-43 96-96V96c0-53-43-96-96-96zM64 216c0-13.3-10.7-24-24-24s-24 10.7-24 24v40c0 89.1 66.2 162.7 152 174.4V464H120c-13.3 0-24 10.7-24 24s10.7 24 24 24h72 72c13.3 0 24-10.7 24-24s-10.7-24-24-24H216V430.4c85.8-11.7 152-85.3 152-174.4V216c0-13.3-10.7-24-24-24s-24 10.7-24 24v40c0 70.7-57.3 128-128 128s-128-57.3-128-128V216z"></path></svg>
+

+ 1 - 0
AdminFrontEnd/src/assets/svg/moon.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 256 256"><path fill="currentColor" d="M233.54 142.23a8 8 0 0 0-8-2a88.08 88.08 0 0 1-109.8-109.8a8 8 0 0 0-10-10a104.84 104.84 0 0 0-52.91 37A104 104 0 0 0 136 224a103.09 103.09 0 0 0 62.52-20.88a104.84 104.84 0 0 0 37-52.91a8 8 0 0 0-1.98-7.98m-44.64 48.11A88 88 0 0 1 65.66 67.11a89 89 0 0 1 31.4-26A106 106 0 0 0 96 56a104.11 104.11 0 0 0 104 104a106 106 0 0 0 14.92-1.06a89 89 0 0 1-26.02 31.4"/></svg>

+ 39 - 0
AdminFrontEnd/src/assets/svg/realDark.svg

@@ -0,0 +1,39 @@
+
+<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
+    xmlns="http://www.w3.org/2000/svg"
+    xmlns:xlink="http://www.w3.org/1999/xlink">
+    <defs>
+        <filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
+            <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
+        <filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
+            <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+        </filter>
+    </defs>
+    <g id="配置面板" width="48" height="40" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="setting-copy-2" width="48" height="40" transform="translate(-1190.000000, -136.000000)">
+            <g id="Group-8" width="48" height="40" transform="translate(1167.000000, 0.000000)">
+                <g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
+                    <mask id="mask-3" fill="white">
+                        <use xlink:href="#path-2"></use>
+                    </mask>
+                    <g id="Rectangle-18">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
+                        <use fill="#001529d9" fill-rule="evenodd" xlink:href="#path-2"></use>
+                    </g>
+                    <rect id="Rectangle-11" fill="#001529d9" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
+                    <rect id="Rectangle-18" fill="#001529a6" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 39 - 0
AdminFrontEnd/src/assets/svg/sidemenu.svg

@@ -0,0 +1,39 @@
+
+<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
+    xmlns="http://www.w3.org/2000/svg"
+    xmlns:xlink="http://www.w3.org/1999/xlink">
+    <defs>
+        <filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
+            <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
+        <filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
+            <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+        </filter>
+    </defs>
+    <g id="配置面板" width="48" height="40" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="setting-copy-2" width="48" height="40" transform="translate(-1190.000000, -136.000000)">
+            <g id="Group-8" width="48" height="40" transform="translate(1167.000000, 0.000000)">
+                <g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
+                    <mask id="mask-3" fill="white">
+                        <use xlink:href="#path-2"></use>
+                    </mask>
+                    <g id="Rectangle-18">
+                        <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
+                        <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
+                    </g>
+                    <rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
+                    <rect id="Rectangle-18" fill="#303648" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 1 - 0
AdminFrontEnd/src/assets/svg/sun.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 16 16"><path fill="currentColor" d="M8 11a3 3 0 1 1 0-6a3 3 0 0 1 0 6m0 1a4 4 0 1 0 0-8a4 4 0 0 0 0 8M8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0m0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13m8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5M3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8m10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0m-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0m9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707M4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708"/></svg>

+ 39 - 0
AdminFrontEnd/src/assets/svg/topmenu.svg

@@ -0,0 +1,39 @@
+
+<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
+    xmlns="http://www.w3.org/2000/svg"
+    xmlns:xlink="http://www.w3.org/1999/xlink">
+    <defs>
+        <filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
+            <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
+            <feMerge>
+                <feMergeNode in="shadowMatrixOuter1"></feMergeNode>
+                <feMergeNode in="SourceGraphic"></feMergeNode>
+            </feMerge>
+        </filter>
+        <rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
+        <filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
+            <feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
+            <feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
+            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
+        </filter>
+    </defs>
+    <g id="配置面板" width="48" height="40" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="setting-copy-2" width="48" height="40" transform="translate(-1190.000000, -136.000000)">
+            <g id="Group-8" width="48" height="40" transform="translate(1167.000000, 0.000000)">
+                <g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
+                    <mask id="mask-3" fill="white">
+                        <use xlink:href="#path-2"></use>
+                    </mask>
+                    <g id="Rectangle-18">
+                        <use fill="white" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
+                        <use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
+                    </g>
+                    <rect id="Rectangle-18" fill="#f0f2f5" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
+                    <rect id="Rectangle-11" fill="#001529" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 1 - 0
AdminFrontEnd/src/assets/svg/wait.svg

@@ -0,0 +1 @@
+<svg t="1702370939820" style="background: #fff; border-radius: 50%;" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7737" width="200" height="200"><path d="M511.999 1.28C229.946 1.28 1.28 229.946 1.28 511.999s228.666 510.719 510.719 510.719 510.719-228.666 510.719-510.719S794.052 1.28 511.999 1.28zM242.687 597.153c-37.518 0-67.968-30.45-67.968-67.968s30.45-67.968 67.968-67.968 67.968 30.45 67.968 67.968S280.206 597.153 242.687 597.153zM514.559 597.153c-37.518 0-67.968-30.45-67.968-67.968s30.45-67.968 67.968-67.968c37.518 0 67.968 30.45 67.968 67.968S552.077 597.153 514.559 597.153zM786.43 597.153c-37.518 0-67.968-30.45-67.968-67.968s30.45-67.968 67.968-67.968 67.968 30.45 67.968 67.968S823.948 597.153 786.43 597.153z" fill="#1890ff" p-id="7738"></path></svg>

+ 1 - 0
AdminFrontEnd/src/assets/svg/windows.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><path fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="3.833" d="m6.75 11.063l12.938-1.725v12.075H6.75zm18.112-2.218L41.25 6.75v14.663H24.862zm0 18.605l16.388.383V41.25l-16.388-2.683zM6.75 26.588l12.938.311V37.8L6.75 35.62z"/></svg>

+ 948 - 0
AdminFrontEnd/src/components/business/ai-render/Chat.vue

@@ -0,0 +1,948 @@
+<script setup lang="ts">
+import { Delete, Paperclip, Refresh } from '@element-plus/icons-vue'
+import type { Spec } from '@json-render/core'
+import type { FileUIPart } from 'ai'
+import { computed, ref, watch } from 'vue'
+import { BubbleList, FilesCard, Thinking, XSender } from 'vue-element-plus-x'
+import type { FilesCardProps } from 'vue-element-plus-x/types/FilesCard'
+
+import ApiSourceModal from '@/components/business/api-source-modal'
+import {
+  type UIGenerationApiContext,
+  type UIGenerationVersion,
+  useUIGeneration,
+} from '@/lib/json-render/use-fetch-ai'
+
+import { useAiResponseViewport } from './use-ai-response-viewport'
+
+type SenderModelValue = {
+  html?: string
+  text?: string
+}
+
+type XSenderExposed = {
+  getModelValue: () => SenderModelValue
+  setText: (text: string) => void
+  clear: () => void
+}
+
+const props = defineProps<{
+  projectId?: ID
+  versions?: UIGenerationVersion[]
+}>()
+
+const emit = defineEmits<{
+  onSpec: [spec: Spec | undefined]
+  'update:versions': [versions: UIGenerationVersion[]]
+}>()
+
+const {
+  clearVersions,
+  error,
+  isStreaming,
+  selectedVersion,
+  selectedVersionId,
+  selectVersion,
+  spec,
+  stop,
+  submit,
+  versions,
+  setVersions,
+} = useUIGeneration({
+  initialVersions: props.versions,
+  onVersionsChange: (nextVersions) => {
+    emit('update:versions', nextVersions)
+  },
+})
+
+const senderValue = ref<SenderModelValue>({ html: '', text: '' })
+const senderRef = ref<XSenderExposed>()
+const pendingFiles = ref<FileUIPart[]>([])
+const pendingFileCards = ref<FilesCardProps[]>([])
+const pendingApiContext = ref<UIGenerationApiContext>()
+const apiSourceVisible = ref(false)
+const inputError = ref('')
+const fileInputRef = ref<HTMLInputElement>()
+
+const uploadAccept = ''
+const uploadMaxFiles = 5
+const uploadMaxFileSize = 8 * 1024 * 1024
+
+watch(
+  spec,
+  (nextSpec) => {
+    if (!nextSpec) return
+
+    emit('onSpec', nextSpec)
+  },
+  { immediate: true },
+)
+
+watch(
+  () => props.versions,
+  (nextVersions) => {
+    if (nextVersions && nextVersions !== versions.value) {
+      setVersions(nextVersions)
+    }
+  },
+)
+
+const promptText = computed(() => senderValue.value.text?.trim() ?? '')
+const hasPendingInput = computed(() => {
+  return (
+    Boolean(promptText.value) ||
+    pendingFiles.value.length > 0 ||
+    Boolean(pendingApiContext.value?.selectedApis.length)
+  )
+})
+const submitDisabled = computed(
+  () => !hasPendingInput.value && !isStreaming.value,
+)
+const hasVersions = computed(() => versions.value.length > 0)
+const showSelectedReasoning = computed(() => {
+  return (
+    Boolean(selectedVersion.value?.reasoning) ||
+    (selectedVersion.value
+      ? getDisplayVersionStatus(selectedVersion.value) === 'generating'
+      : false)
+  )
+})
+const currentBaseVersionLabel = computed(() => {
+  if (!selectedVersion.value) return null
+
+  if (getDisplayVersionStatus(selectedVersion.value) === 'error') {
+    return selectedVersion.value.parentVersionId
+      ? getVersionLabel(selectedVersion.value.parentVersionId)
+      : null
+  }
+
+  return getVersionLabel(selectedVersion.value.id)
+})
+const pendingApiCount = computed(
+  () => pendingApiContext.value?.selectedApis.length ?? 0,
+)
+
+const versionGroups = computed(() => {
+  const reversedVersions = [...versions.value].reverse()
+  const generatingVersions = reversedVersions.filter((version) => {
+    return getDisplayVersionStatus(version) === 'generating'
+  })
+  const historyVersions = reversedVersions.filter((version) => {
+    return getDisplayVersionStatus(version) !== 'generating'
+  })
+
+  return [
+    { title: '进行中', versions: generatingVersions },
+    { title: '历史版本', versions: historyVersions },
+  ].filter((group) => group.versions.length > 0)
+})
+
+const bubbleList = computed(() => {
+  if (!selectedVersion.value) return []
+
+  const version = selectedVersion.value
+  const displayStatus = getDisplayVersionStatus(version)
+  const response =
+    version.response ||
+    (displayStatus === 'generating'
+      ? '正在解析模型输出并生成界面结构...'
+      : '暂无模型输出。')
+
+  return [
+    {
+      id: `${version.id}-prompt`,
+      placement: 'end' as const,
+      content: version.prompt,
+      variant: 'filled' as const,
+      maxWidth: '88%',
+    },
+    {
+      id: `${version.id}-response`,
+      placement: 'start' as const,
+      content: version.errorMessage || response,
+      loading: displayStatus === 'generating' && !version.response,
+      variant: version.errorMessage
+        ? ('outlined' as const)
+        : ('filled' as const),
+      maxWidth: '92%',
+    },
+  ]
+})
+
+const {
+  setResponseScrollElement,
+  thinkingStatus,
+  isThinking,
+  thinkingLabelText,
+  thinkingElapsedText,
+  showBackBottom: showResponseBackBottom,
+  syncScrollState: syncResponseScrollState,
+  backToBottom: handleBackToBottom,
+} = useAiResponseViewport({
+  selectedVersion,
+  isStreaming,
+  getDisplayVersionStatus,
+})
+
+function getCurrentSenderValue() {
+  return senderRef.value?.getModelValue() ?? senderValue.value
+}
+
+function syncSenderValue() {
+  senderValue.value = getCurrentSenderValue()
+}
+
+function setSenderText(text: string) {
+  senderValue.value = { html: text, text }
+  senderRef.value?.setText(text)
+}
+
+async function handleSubmit() {
+  if (isStreaming.value) {
+    stop()
+    return
+  }
+
+  if (!hasPendingInput.value) return
+
+  try {
+    inputError.value = ''
+    const currentSenderValue = getCurrentSenderValue()
+    const currentPromptText = currentSenderValue.text?.trim() ?? ''
+    const submittedFiles = [...pendingFiles.value]
+    const submittedApiContext = pendingApiContext.value
+
+    if (
+      !currentPromptText &&
+      submittedFiles.length === 0 &&
+      !submittedApiContext?.selectedApis.length
+    ) {
+      return
+    }
+
+    senderValue.value = { html: '', text: '' }
+    senderRef.value?.clear()
+    pendingFiles.value = []
+    pendingFileCards.value = []
+    pendingApiContext.value = undefined
+    if (fileInputRef.value) fileInputRef.value.value = ''
+
+    await submit(currentPromptText, {
+      files: submittedFiles,
+      apiContext: submittedApiContext,
+    })
+  } catch (caughtError) {
+    console.error('Failed to generate UI', caughtError)
+  }
+}
+
+function openApiSourceModal() {
+  if (!props.projectId) {
+    inputError.value = '缺少项目ID,暂时无法选择接口。'
+    return
+  }
+
+  inputError.value = ''
+  apiSourceVisible.value = true
+}
+
+function handleApiContextConfirm(context: UIGenerationApiContext) {
+  pendingApiContext.value = context
+  if (!getCurrentSenderValue().text?.trim()) {
+    setSenderText(buildApiContextDescription(context))
+  }
+  inputError.value = ''
+}
+
+function removePendingApiContext() {
+  pendingApiContext.value = undefined
+}
+
+function buildApiContextDescription(context: UIGenerationApiContext) {
+  const apiNames = context.selectedApis
+    .map((api) => api.apiName || api.methodName || api.apiKey)
+    .filter(Boolean)
+    .slice(0, 4)
+    .join('、')
+  const suffix =
+    context.selectedApis.length > 4
+      ? `等 ${context.selectedApis.length} 个接口`
+      : `${context.selectedApis.length} 个接口`
+
+  return `请根据已选择的${suffix}${apiNames ? `(${apiNames})` : ''}生成一个完整的业务管理页面,包含列表查询、表单操作、详情回填和必要的交互反馈。`
+}
+
+function openFilePicker() {
+  fileInputRef.value?.click()
+}
+
+async function handleFileChange(event: Event) {
+  const input = event.target as HTMLInputElement
+  const files = Array.from(input.files ?? [])
+  await appendFiles(files)
+  input.value = ''
+}
+
+async function handlePastedFile(firstFile: File, fileList: FileList) {
+  const files = Array.from(fileList ?? [])
+  await appendFiles(files.length ? files : [firstFile])
+}
+
+async function appendFiles(files: File[]) {
+  if (!files.length) return
+
+  const remainCount = uploadMaxFiles - pendingFiles.value.length
+  if (remainCount <= 0) {
+    inputError.value = `最多上传 ${uploadMaxFiles} 个文件。`
+    return
+  }
+
+  const nextFiles = files.slice(0, remainCount)
+  const validFiles = nextFiles.filter((file) => file.size <= uploadMaxFileSize)
+  if (validFiles.length !== nextFiles.length) {
+    inputError.value = '单个文件不能超过 8MB。'
+  } else if (files.length > remainCount) {
+    inputError.value = `最多上传 ${uploadMaxFiles} 个文件,超出的文件已忽略。`
+  } else {
+    inputError.value = ''
+  }
+
+  const convertedFiles = await Promise.all(validFiles.map(toFileUIPart))
+  pendingFiles.value = [...pendingFiles.value, ...convertedFiles]
+  pendingFileCards.value = [
+    ...pendingFileCards.value,
+    ...validFiles.map(toFilesCard),
+  ]
+}
+
+function toFileUIPart(file: File): Promise<FileUIPart> {
+  return new Promise((resolve, reject) => {
+    const reader = new FileReader()
+    reader.onload = () => {
+      resolve({
+        type: 'file',
+        filename: file.name,
+        mediaType: file.type || 'application/octet-stream',
+        url: String(reader.result || ''),
+      })
+    }
+    reader.onerror = () => reject(reader.error)
+    reader.readAsDataURL(file)
+  })
+}
+
+function toFilesCard(file: File): FilesCardProps {
+  return {
+    uid: `${file.name}-${file.lastModified}-${file.size}`,
+    name: file.name,
+    fileSize: file.size,
+    fileType: getFileCardType(file),
+    description: file.type || 'application/octet-stream',
+    showDelIcon: true,
+    status: 'done',
+    maxWidth: '100%',
+  }
+}
+
+function getFileCardType(file: File): FilesCardProps['fileType'] {
+  const filename = file.name.toLowerCase()
+  const type = file.type.toLowerCase()
+  if (type.startsWith('image/')) return 'image'
+  if (type.startsWith('audio/')) return 'audio'
+  if (type.startsWith('video/')) return 'video'
+  if (filename.endsWith('.pdf')) return 'pdf'
+  if (/\.(doc|docx)$/.test(filename)) return 'word'
+  if (/\.(xls|xlsx|csv)$/.test(filename)) return 'excel'
+  if (/\.(ppt|pptx)$/.test(filename)) return 'ppt'
+  if (/\.(md|markdown)$/.test(filename)) return 'mark'
+  if (/\.(txt)$/.test(filename)) return 'txt'
+  if (/\.(zip|rar|7z)$/.test(filename)) return 'zip'
+  if (/\.(json|js|jsx|ts|tsx|vue|html|css|sql|py|java)$/.test(filename)) {
+    return 'code'
+  }
+  return 'file'
+}
+
+function removePendingFile(file: FilesCardProps) {
+  const index = pendingFileCards.value.findIndex(
+    (item) => item.uid === file.uid,
+  )
+  if (index < 0) return
+
+  pendingFileCards.value = pendingFileCards.value.filter((_, itemIndex) => {
+    return itemIndex !== index
+  })
+  pendingFiles.value = pendingFiles.value.filter((_, itemIndex) => {
+    return itemIndex !== index
+  })
+}
+
+function getVersionLabel(versionId: string) {
+  const index = versions.value.findIndex((version) => version.id === versionId)
+  return `v${index + 1}`
+}
+
+function getParentVersionLabel(version: UIGenerationVersion) {
+  if (!version.parentVersionId) return null
+  return getVersionLabel(version.parentVersionId)
+}
+
+function getVersionStatusText(version: UIGenerationVersion) {
+  const displayStatus = getDisplayVersionStatus(version)
+  if (displayStatus === 'generating') return '生成中'
+  if (displayStatus === 'error') return '失败'
+  return '完成'
+}
+
+function getReasoningContent(version: UIGenerationVersion) {
+  return version.reasoning || '模型正在分析界面结构、布局关系和交互要求...'
+}
+
+function getVersionStatusClass(version: UIGenerationVersion) {
+  const displayStatus = getDisplayVersionStatus(version)
+  if (displayStatus === 'generating') return 'is-generating'
+  if (displayStatus === 'error') return 'is-error'
+  return 'is-success'
+}
+
+function getDisplayVersionStatus(version: UIGenerationVersion) {
+  if (
+    version.status === 'generating' &&
+    (!isStreaming.value || selectedVersionId.value !== version.id)
+  ) {
+    return version.errorMessage ? 'error' : 'complete'
+  }
+
+  return version.status
+}
+
+async function handleRegenerate() {
+  if (!selectedVersion.value) return
+
+  try {
+    await submit(selectedVersion.value.prompt, {
+      files: selectedVersion.value.files,
+      apiContext: selectedVersion.value.apiContext,
+    })
+  } catch (caughtError) {
+    console.error('Failed to regenerate UI', caughtError)
+  }
+}
+
+async function submitAdjustment(options: {
+  prompt: string
+  focusKey: string
+  baseSpec?: Spec
+}) {
+  const trimmedPrompt = options.prompt.trim()
+  if (!trimmedPrompt) return
+
+  inputError.value = ''
+  await submit(trimmedPrompt, {
+    focusKey: options.focusKey,
+    mode: 'local-priority',
+    baseSpec: options.baseSpec,
+  })
+}
+
+defineExpose({
+  submitAdjustment,
+})
+</script>
+
+<template>
+  <div class="ai-chat-panel">
+    <section class="ai-version-card">
+      <div class="ai-section-head">
+        <div>
+          <p class="ai-section-title">生成版本</p>
+          <p class="ai-section-subtitle">
+            {{ hasVersions ? `${versions.length} 个版本` : '暂无版本' }}
+          </p>
+        </div>
+        <ElButton
+          :disabled="!hasVersions || isStreaming"
+          :icon="Delete"
+          link
+          type="danger"
+          @click="clearVersions"
+        >
+          清空
+        </ElButton>
+      </div>
+
+      <div v-if="hasVersions" class="ai-conversations">
+        <div
+          v-for="group in versionGroups"
+          :key="group.title"
+          class="ai-version-group"
+        >
+          <p class="ai-version-group-title">{{ group.title }}</p>
+          <div class="flex-1 overflow-auto">
+            <button
+              v-for="version in group.versions"
+              :key="version.id"
+              class="ai-version-item"
+              :class="{
+                active: selectedVersionId === version.id,
+                [getVersionStatusClass(version)]: true,
+              }"
+              type="button"
+              @click="selectVersion(version.id)"
+            >
+              <span class="ai-version-row">
+                <span class="ai-version-status-dot"></span>
+                <span class="ai-version-label">
+                  {{ getVersionLabel(version.id) }}
+                </span>
+                <span class="ai-version-status">
+                  {{ getVersionStatusText(version) }}
+                </span>
+              </span>
+              <span class="ai-version-prompt">{{ version.prompt }}</span>
+              <span
+                v-if="getParentVersionLabel(version)"
+                class="ai-version-parent"
+              >
+                基于 {{ getParentVersionLabel(version) }}
+              </span>
+            </button>
+          </div>
+        </div>
+      </div>
+      <ElEmpty
+        v-else
+        class="ai-empty"
+        description="还没有生成版本"
+        :image-size="64"
+      />
+    </section>
+
+    <section class="ai-response-card">
+      <template v-if="selectedVersion">
+        <div class="ai-section-head">
+          <div>
+            <p class="ai-section-title">模型返回</p>
+            <p class="ai-section-subtitle">
+              {{
+                getParentVersionLabel(selectedVersion)
+                  ? `基于 ${getParentVersionLabel(selectedVersion)}`
+                  : '当前选中版本'
+              }}
+            </p>
+          </div>
+          <ElButton
+            :disabled="isStreaming"
+            :icon="Refresh"
+            size="small"
+            @click="handleRegenerate"
+          >
+            重新生成
+          </ElButton>
+        </div>
+
+        <div class="ai-response-scroll-wrap">
+          <div
+            :ref="setResponseScrollElement"
+            class="ai-response-scroll"
+            @scroll="syncResponseScrollState"
+          >
+            <div class="mb-3">
+              <BubbleList
+                :list="bubbleList"
+                item-key="id"
+                :auto-scroll="false"
+                :show-back-button="false"
+              />
+            </div>
+            <Thinking
+              v-if="showSelectedReasoning"
+              auto-collapse
+              :content="getReasoningContent(selectedVersion)"
+              :status="thinkingStatus"
+              max-width="100%"
+              :model-value="true"
+            >
+              <template #label>
+                <span class="ai-thinking-label">
+                  <span>{{ thinkingLabelText }}</span>
+                  <span v-if="isThinking" class="ai-thinking-duration">
+                    {{ thinkingElapsedText }}
+                  </span>
+                </span>
+              </template>
+            </Thinking>
+          </div>
+          <ElButton
+            v-if="showResponseBackBottom"
+            class="ai-response-back-bottom"
+            circle
+            size="small"
+            @click="handleBackToBottom"
+          >
+            <IconTablerArrowDown class="size-4" />
+          </ElButton>
+        </div>
+      </template>
+
+      <ElEmpty
+        v-else
+        class="ai-response-empty"
+        description="输入页面需求后,这里会展示版本详情和模型返回结果"
+        :image-size="88"
+      />
+    </section>
+
+    <ElAlert
+      v-if="error"
+      :closable="false"
+      type="error"
+      :title="error.message"
+    />
+
+    <section>
+      <div v-if="pendingFileCards.length" class="ai-files">
+        <FilesCard
+          v-for="file in pendingFileCards"
+          :key="file.uid"
+          v-bind="file"
+          @delete="removePendingFile"
+        />
+      </div>
+
+      <div v-if="pendingApiContext" class="ai-api-context">
+        <div class="min-w-0">
+          <p class="ai-api-context-title">
+            已选择 {{ pendingApiCount }} 个接口
+          </p>
+          <p class="ai-api-context-desc">
+            {{
+              pendingApiContext.selectedApis
+                .map((api) => api.apiName || api.methodName || api.apiKey)
+                .filter(Boolean)
+                .slice(0, 3)
+                .join('、')
+            }}
+            <template v-if="pendingApiCount > 3">
+              等 {{ pendingApiCount }} 个接口
+            </template>
+          </p>
+        </div>
+        <ElButton link type="danger" @click="removePendingApiContext">
+          移除
+        </ElButton>
+      </div>
+
+      <p v-if="currentBaseVersionLabel && !error" class="ai-base-version">
+        下一次生成将基于 {{ currentBaseVersionLabel }}。
+      </p>
+
+      <div class="bg-white">
+        <XSender
+          ref="senderRef"
+          v-model="senderValue"
+          :custom-style="{ maxHeight: '200px' }"
+          variant="updown"
+          placeholder="描述你想生成的界面..."
+          :loading="isStreaming"
+          :disabled="isStreaming && !hasPendingInput"
+          clearable
+          @change="syncSenderValue"
+          @submit="handleSubmit"
+          @cancel="stop"
+          @paste-file="handlePastedFile"
+        />
+      </div>
+      <input
+        ref="fileInputRef"
+        class="hidden"
+        multiple
+        type="file"
+        :accept="uploadAccept"
+        @change="handleFileChange"
+      />
+
+      <div class="ai-sender-actions">
+        <div class="flex items-center gap-2">
+          <ElButton size="small" @click="openApiSourceModal">
+            <template #icon>
+              <IconTablerApi class="size-4" />
+            </template>
+            接口
+          </ElButton>
+          <ElButton size="small" :icon="Paperclip" @click="openFilePicker"
+            >附件</ElButton
+          >
+        </div>
+        <p v-if="inputError" class="ai-input-error">{{ inputError }}</p>
+      </div>
+    </section>
+
+    <ApiSourceModal
+      v-model="apiSourceVisible"
+      :project-id="projectId"
+      @confirm="handleApiContextConfirm"
+    />
+  </div>
+</template>
+
+<style scoped lang="scss">
+.ai-chat-panel {
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+  padding: 14px;
+  width: 100%;
+  height: 100%;
+  min-height: 420px;
+  overflow: hidden;
+}
+
+.ai-version-card,
+.ai-response-card {
+  border: 1px solid var(--el-border-color-lighter);
+  border-radius: 8px;
+  background: var(--el-bg-color);
+}
+
+.ai-version-card {
+  padding: 12px;
+  min-height: 280px;
+  overflow: hidden;
+}
+
+.ai-section-head {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  gap: 12px;
+  margin-bottom: 10px;
+}
+
+.ai-section-title {
+  margin: 0;
+  font-weight: 600;
+  font-size: 14px;
+  line-height: 20px;
+}
+
+.ai-section-subtitle,
+.ai-base-version,
+.ai-sender-tip,
+.ai-input-error {
+  margin: 0;
+  color: var(--el-text-color-secondary);
+  font-size: 12px;
+  line-height: 18px;
+}
+
+.ai-input-error {
+  color: var(--el-color-danger);
+}
+
+.ai-conversations {
+  height: 300px;
+}
+
+.ai-version-group {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+}
+
+.ai-version-group + .ai-version-group {
+  margin-top: 10px;
+}
+
+.ai-version-group-title {
+  position: sticky;
+  top: 0;
+  z-index: 1;
+  margin: 0 0 6px;
+  background: var(--el-bg-color);
+  padding: 4px 2px;
+  color: var(--el-text-color-secondary);
+  font-size: 12px;
+  line-height: 18px;
+}
+
+.ai-version-item {
+  display: flex;
+  flex-direction: column;
+  gap: 5px;
+  appearance: none;
+  transition:
+    background-color 0.15s ease,
+    border-color 0.15s ease,
+    color 0.15s ease;
+  cursor: pointer;
+  margin-bottom: 8px;
+  border: 1px solid transparent;
+  border-radius: 8px;
+  background: var(--fill-color-2);
+  padding: 9px 10px;
+  width: 100%;
+  color: var(--el-text-color-regular);
+  text-align: left;
+
+  &:hover {
+    border-color: var(--el-border-color-light);
+    background: var(--el-fill-color-light);
+  }
+
+  &.active {
+    border-color: var(--el-color-primary-light-5);
+    background: var(--el-color-primary-light-9);
+    color: var(--el-color-primary);
+  }
+}
+
+.ai-version-row {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  min-width: 0;
+  font-size: 12px;
+  line-height: 18px;
+}
+
+.ai-version-status-dot {
+  flex: none;
+  border-radius: 50%;
+  background: var(--el-color-success);
+  width: 7px;
+  height: 7px;
+}
+
+.ai-version-item.is-generating .ai-version-status-dot {
+  background: var(--el-color-warning);
+}
+
+.ai-version-item.is-error .ai-version-status-dot {
+  background: var(--el-color-danger);
+}
+
+.ai-version-label {
+  font-weight: 600;
+}
+
+.ai-version-status {
+  color: var(--el-text-color-secondary);
+}
+
+.ai-version-prompt {
+  display: -webkit-box;
+  opacity: 0.88;
+  overflow: hidden;
+  color: currentcolor;
+  font-size: 13px;
+  line-height: 19px;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 2;
+}
+
+.ai-version-parent {
+  color: var(--el-text-color-secondary);
+  font-size: 11px;
+  line-height: 16px;
+}
+
+.ai-empty {
+  padding: 10px 0 0;
+}
+
+.ai-response-card {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  padding: 12px;
+  min-height: 0;
+  overflow: hidden;
+}
+
+.ai-response-empty {
+  height: 100%;
+  min-height: 200px;
+}
+
+.ai-response-scroll-wrap {
+  position: relative;
+  flex: 1;
+  min-height: 0;
+}
+
+.ai-response-scroll {
+  height: 100%;
+  overflow: auto;
+}
+
+.ai-response-back-bottom {
+  position: absolute;
+  right: 14px;
+  bottom: 14px;
+  z-index: 2;
+  box-shadow: var(--el-box-shadow-light);
+}
+
+.ai-thinking-label {
+  display: inline-flex;
+  align-items: center;
+  gap: 6px;
+}
+
+.ai-thinking-duration {
+  color: var(--el-text-color-secondary);
+  font-variant-numeric: tabular-nums;
+}
+
+.ai-files {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
+  gap: 8px;
+  margin-bottom: 10px;
+}
+
+.ai-api-context {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  gap: 10px;
+  margin-bottom: 10px;
+  border: 1px solid var(--el-color-primary-light-7);
+  border-radius: 8px;
+  background: var(--el-color-primary-light-9);
+  padding: 9px 10px;
+}
+
+.ai-api-context-title,
+.ai-api-context-desc {
+  margin: 0;
+  line-height: 18px;
+}
+
+.ai-api-context-title {
+  color: var(--el-color-primary);
+  font-weight: 600;
+  font-size: 13px;
+}
+
+.ai-api-context-desc {
+  overflow: hidden;
+  color: var(--el-text-color-secondary);
+  font-size: 12px;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.ai-base-version {
+  margin-bottom: 8px;
+}
+
+.ai-sender-actions {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  gap: 12px;
+  margin-top: 10px;
+}
+</style>

+ 135 - 0
AdminFrontEnd/src/components/business/ai-render/Renderer.vue

@@ -0,0 +1,135 @@
+<script setup lang="ts">
+import {
+  ActionProvider,
+  Renderer,
+  type Spec,
+  useStateStore,
+  ValidationProvider,
+  VisibilityProvider,
+} from '@json-render/vue'
+import { ref, watch } from 'vue'
+
+import {
+  configureRunCodeHelpers,
+  createJsonRenderActions,
+} from '@/lib/json-render/actions'
+import { catalog } from '@/lib/json-render/catalog'
+import { JsonRenderDevtools } from '@/lib/json-render/component/JsonRenderDevtools'
+import {
+  components,
+  createJsonRenderRegistry,
+} from '@/lib/json-render/registry'
+import { http } from '@/utils/http/request'
+
+const props = defineProps<{
+  spec: Spec | undefined
+  deferWriteRequests?: boolean
+  devtoolsTeleportTo?: string | HTMLElement
+  devtoolsPlacement?: 'inline' | 'overlay'
+  submitAiAdjust?: (payload: {
+    selectedKey: string
+    prompt: string
+  }) => void | Promise<void>
+}>()
+
+const emit = defineEmits<{
+  'update:spec': [spec: Spec]
+  'ai-adjust': [payload: { selectedKey: string; prompt: string }]
+}>()
+
+const stateApi = useStateStore()
+const devtoolsRef = ref<InstanceType<typeof JsonRenderDevtools>>()
+
+function isWriteRequest(match: string | undefined) {
+  if (!match) return false
+
+  return /(add|update|delete|remove|copy|make|save|submit|create)/i.test(match)
+}
+
+const guardedRequest = ((match, params, options) => {
+  if (props.deferWriteRequests && isWriteRequest(match)) {
+    console.info(
+      '[json-render] defer write request during AI generation:',
+      match,
+    )
+    return Promise.resolve({})
+  }
+
+  return http.request(match, params, options)
+}) as typeof http.request
+
+const createRegistrySetState =
+  () =>
+  (updater: (prev: Record<string, unknown>) => Record<string, unknown>) => {
+    const previousState = stateApi.getSnapshot() as Record<string, unknown>
+    const nextState = updater(previousState)
+
+    if (!nextState || typeof nextState !== 'object') return
+
+    for (const [key, value] of Object.entries(nextState)) {
+      stateApi.set(`/${key}`, value)
+    }
+  }
+
+const jsonRenderActions = createJsonRenderActions(stateApi, {
+  request: guardedRequest,
+  shouldExecuteRequest: ({ match }) => {
+    return !props.deferWriteRequests || !isWriteRequest(match)
+  },
+})
+const { executeAction, registry } = createJsonRenderRegistry(catalog, {
+  components,
+  actions: jsonRenderActions as any,
+})
+
+configureRunCodeHelpers(() => ({
+  request: guardedRequest,
+  executeAction: async (actionName, params) => {
+    await executeAction(
+      actionName,
+      params,
+      createRegistrySetState(),
+      stateApi.getSnapshot(),
+    )
+  },
+}))
+
+const devtoolsStateStore = {
+  get: stateApi.get,
+  set: stateApi.set,
+  update: stateApi.update,
+  getSnapshot: stateApi.getSnapshot,
+  subscribe: (listener: () => void) => {
+    return watch(stateApi.state, () => listener())
+  },
+}
+
+function openDevtools() {
+  devtoolsRef.value?.openPanel()
+}
+
+defineExpose({
+  openDevtools,
+})
+console.log('props.spec ==> ', props.spec)
+</script>
+
+<template>
+  <ActionProvider :handlers="jsonRenderActions">
+    <VisibilityProvider>
+      <ValidationProvider>
+        <Renderer :spec="props.spec" :registry="registry" />
+        <JsonRenderDevtools
+          ref="devtoolsRef"
+          :spec="props.spec"
+          :state-store="devtoolsStateStore"
+          :teleport-to="props.devtoolsTeleportTo"
+          :placement="props.devtoolsPlacement"
+          :submit-ai-adjust="props.submitAiAdjust"
+          @update:spec="emit('update:spec', $event)"
+          @ai-adjust="emit('ai-adjust', $event)"
+        />
+      </ValidationProvider>
+    </VisibilityProvider>
+  </ActionProvider>
+</template>

+ 351 - 0
AdminFrontEnd/src/components/business/ai-render/index.vue

@@ -0,0 +1,351 @@
+<script setup lang="ts">
+import { type Spec, StateProvider } from '@json-render/vue'
+import { computed, nextTick, ref, watch } from 'vue'
+
+import OmegaCodeEditor from '@/components/common/omega-code-editor/OmegaCodeEditor.vue'
+import { normalizeSpecForRendering } from '@/lib/json-render/render-spec'
+import { demoSpec } from '@/lib/json-render/spec'
+import type { UIGenerationVersion } from '@/lib/json-render/use-fetch-ai'
+import {
+  generateVueSfcFromSpec,
+  parseControlledVueSfcToSpec,
+  validateVueSfcSource,
+} from '@/lib/json-render/vue-sfc'
+
+import Chat from './Chat.vue'
+import JsonRenderer from './Renderer.vue'
+
+type OmegaCodeEditorExposed = {
+  format: () => Promise<boolean> | boolean
+}
+
+type JsonRendererExposed = {
+  openDevtools: () => void
+}
+
+type ChatExposed = {
+  submitAdjustment: (options: {
+    prompt: string
+    focusKey: string
+    baseSpec?: Spec
+  }) => Promise<void>
+}
+
+defineProps<{
+  projectId?: any
+  devtoolsTeleportTo?: string | HTMLElement
+  devtoolsPlacement?: 'inline' | 'overlay'
+}>()
+
+const generationVersions = defineModel<UIGenerationVersion[]>('versions', {
+  default: () => [],
+})
+
+const spec = ref<Spec>(demoSpec)
+const stateVersion = ref(0)
+const activeTab = ref<'preview' | 'code'>('preview')
+const code = ref('')
+const codeError = ref('')
+const codeWarning = ref('')
+const isValidatingCode = ref(false)
+const codeEditorRef = ref<OmegaCodeEditorExposed>()
+const rendererRef = ref<JsonRendererExposed>()
+const chatRef = ref<ChatExposed>()
+const hasAutoFormattedOnFirstCodeView = ref(false)
+const isChatCollapsed = ref(false)
+let isSyncingCodeFromSpec = false
+let suppressNextCodeSync = false
+let parseTimer: ReturnType<typeof setTimeout> | undefined
+let parseVersion = 0
+
+const layoutStyle = computed(() => ({
+  gridTemplateColumns: isChatCollapsed.value
+    ? '48px minmax(0, 1fr)'
+    : '420px minmax(0, 1fr)',
+}))
+const isAiGenerating = computed(() =>
+  generationVersions.value.some((version) => version.status === 'generating'),
+)
+const renderSpec = computed(() => normalizeSpecForRendering(spec.value))
+const initialState = computed(() => renderSpec.value?.state ?? {})
+const codeErrorTitle = computed(() => {
+  const trimmed = codeError.value.trim()
+  if (!trimmed) return ''
+
+  const firstLine = trimmed
+    .split('\n')
+    .find((line) => line.trim())
+    ?.trim()
+  return /^\w+Error:/.test(trimmed)
+    ? firstLine || '代码解析失败'
+    : `ParseError: ${firstLine || 'Preview.vue 解析失败'}`
+})
+
+function handleSpecChange(nextSpec: Spec | undefined) {
+  if (!nextSpec) return
+
+  spec.value = nextSpec
+  if (isAiGenerating.value) return
+
+  stateVersion.value += 1
+}
+
+function handlePreviewSpecChange(nextSpec: Spec | undefined) {
+  if (!nextSpec) return
+  spec.value = nextSpec
+}
+
+async function syncCodeFromSpec(nextSpec: Spec | undefined) {
+  if (!nextSpec) return
+
+  await nextTick()
+  isSyncingCodeFromSpec = true
+  code.value = generateVueSfcFromSpec(nextSpec)
+  queueMicrotask(() => {
+    isSyncingCodeFromSpec = false
+  })
+}
+
+async function validateCode(nextCode: string) {
+  const currentParseVersion = ++parseVersion
+  isValidatingCode.value = true
+
+  try {
+    const result = await validateVueSfcSource(nextCode)
+    if (currentParseVersion !== parseVersion) return
+
+    if (result.errors.length) {
+      codeError.value = result.errors.join('\n')
+      codeWarning.value = ''
+      return
+    }
+
+    const parseResult = await parseControlledVueSfcToSpec(
+      nextCode,
+      renderSpec.value ?? spec.value,
+    )
+    if (currentParseVersion !== parseVersion) return
+
+    if (parseResult.errors.length || !parseResult.spec) {
+      codeError.value = parseResult.errors.join('\n')
+      codeWarning.value = ''
+      return
+    }
+
+    codeError.value = ''
+    codeWarning.value = parseResult.warnings.join('\n')
+    suppressNextCodeSync = true
+    spec.value = parseResult.spec
+    stateVersion.value += 1
+  } catch (error) {
+    if (currentParseVersion !== parseVersion) return
+    codeError.value = error instanceof Error ? error.message : String(error)
+  } finally {
+    if (currentParseVersion === parseVersion) {
+      isValidatingCode.value = false
+    }
+  }
+}
+
+function scheduleCodeValidate(nextCode: string) {
+  if (parseTimer) clearTimeout(parseTimer)
+
+  parseTimer = setTimeout(() => {
+    void validateCode(nextCode)
+  }, 500)
+}
+
+watch(
+  renderSpec,
+  (nextSpec) => {
+    if (!nextSpec) return
+
+    if (suppressNextCodeSync) {
+      suppressNextCodeSync = false
+      return
+    }
+
+    void syncCodeFromSpec(nextSpec)
+  },
+  { immediate: true },
+)
+
+watch(code, (nextCode) => {
+  if (isSyncingCodeFromSpec) return
+  scheduleCodeValidate(nextCode)
+})
+
+watch(activeTab, async (nextTab) => {
+  if (nextTab !== 'code' || hasAutoFormattedOnFirstCodeView.value) return
+
+  await syncCodeFromSpec(renderSpec.value)
+  hasAutoFormattedOnFirstCodeView.value = true
+  await nextTick()
+  // await codeEditorRef.value?.format()
+})
+
+watch(isAiGenerating, (nextValue, previousValue) => {
+  if (previousValue && !nextValue) {
+    stateVersion.value += 1
+  }
+})
+
+function openDevtools() {
+  rendererRef.value?.openDevtools()
+}
+
+function refreshPreview() {
+  stateVersion.value += 1
+}
+
+function toggleChatCollapsed() {
+  isChatCollapsed.value = !isChatCollapsed.value
+}
+
+async function handleAiAdjust(payload: {
+  selectedKey: string
+  prompt: string
+}) {
+  await chatRef.value?.submitAdjustment({
+    prompt: payload.prompt,
+    focusKey: payload.selectedKey,
+    baseSpec: renderSpec.value,
+  })
+}
+</script>
+
+<template>
+  <div class="grid size-full gap-4" :style="layoutStyle">
+    <section
+      class="flex min-h-[420px] flex-col overflow-hidden border border-slate-200 bg-slate-50 transition-[width] duration-200"
+      :class="{ 'cursor-pointer bg-white': isChatCollapsed }"
+      @click="isChatCollapsed && toggleChatCollapsed()"
+    >
+      <template v-if="isChatCollapsed">
+        <button
+          class="flex h-full w-full cursor-pointer flex-col items-center gap-3 px-2 py-4 text-slate-500 hover:bg-slate-100 hover:text-slate-800"
+          type="button"
+          @click.stop="toggleChatCollapsed"
+        >
+          <IconTablerChevronRight class="size-5" />
+          <span class="vertical-rl text-xs font-medium tracking-wider"
+            >会话</span
+          >
+        </button>
+      </template>
+      <template v-else>
+        <div
+          class="flex items-center justify-between border-b border-slate-200 bg-white/80 px-4 py-3"
+        >
+          <span class="text-sm font-medium text-slate-700">会话</span>
+          <ElButton circle @click.stop="toggleChatCollapsed">
+            <template #icon>
+              <IconTablerChevronLeft class="size-4" />
+            </template>
+          </ElButton>
+        </div>
+        <Chat
+          ref="chatRef"
+          v-model:versions="generationVersions"
+          :project-id="projectId"
+          class="min-h-0 flex-1"
+          @onSpec="handleSpecChange"
+        />
+      </template>
+    </section>
+    <section
+      class="flex min-h-[420px] flex-col overflow-hidden border border-slate-200 bg-slate-50"
+    >
+      <div
+        class="flex items-center justify-between border-b border-slate-200 bg-white/80 px-4 py-3"
+      >
+        <ElSegmented
+          v-model="activeTab"
+          :options="[
+            { label: 'Preview', value: 'preview' },
+            { label: 'Code', value: 'code' },
+          ]"
+        />
+        <span v-if="activeTab === 'code'" class="text-xs text-slate-500">
+          {{ (isValidatingCode && '校验中...') || '' }}
+        </span>
+        <div v-else class="flex items-center gap-2">
+          <ElButton size="small" @click="refreshPreview">
+            <template #icon>
+              <IconTablerRefresh></IconTablerRefresh>
+            </template>
+            刷新
+          </ElButton>
+          <ElButton size="small" type="primary" @click="openDevtools">
+            <template #icon>
+              <IconTablerEdit></IconTablerEdit>
+            </template>
+            编辑
+          </ElButton>
+        </div>
+      </div>
+
+      <div
+        v-show="activeTab === 'preview'"
+        class="min-h-0 flex-1 overflow-auto"
+      >
+        <StateProvider :key="stateVersion" :initial-state="initialState">
+          <JsonRenderer
+            ref="rendererRef"
+            :spec="renderSpec"
+            :defer-write-requests="isAiGenerating"
+            :devtools-teleport-to="devtoolsTeleportTo"
+            :devtools-placement="devtoolsPlacement"
+            :submit-ai-adjust="handleAiAdjust"
+            @update:spec="handlePreviewSpecChange"
+          />
+        </StateProvider>
+      </div>
+
+      <div
+        v-show="activeTab === 'code'"
+        class="flex min-h-0 flex-1 flex-col gap-3 p-4"
+      >
+        <ElAlert
+          v-if="codeWarning"
+          :closable="false"
+          show-icon
+          type="info"
+          title="部分代码未参与回写"
+        >
+          <pre class="text-xs leading-5 whitespace-pre-wrap">{{
+            codeWarning
+          }}</pre>
+        </ElAlert>
+        <ElAlert
+          v-if="codeError"
+          :closable="false"
+          show-icon
+          type="error"
+          :title="codeErrorTitle"
+        >
+          <pre
+            class="max-h-[220px] overflow-auto px-1 py-2 text-xs leading-5 whitespace-pre-wrap"
+            >{{ codeError }}</pre
+          >
+        </ElAlert>
+        <OmegaCodeEditor
+          ref="codeEditorRef"
+          v-model="code"
+          language="vue"
+          theme="dark"
+          height="100%"
+          min-height="360px"
+          autofocus
+        />
+      </div>
+    </section>
+  </div>
+</template>
+
+<style scoped>
+.vertical-rl {
+  writing-mode: vertical-rl;
+  text-orientation: mixed;
+}
+</style>

+ 158 - 0
AdminFrontEnd/src/components/business/ai-render/use-ai-response-viewport.ts

@@ -0,0 +1,158 @@
+import {
+  computed,
+  type ComputedRef,
+  nextTick,
+  onBeforeUnmount,
+  type Ref,
+  ref,
+  watch,
+} from 'vue'
+
+import type { UIGenerationVersion } from '@/lib/json-render/use-fetch-ai'
+
+type VersionStatus = UIGenerationVersion['status']
+
+// 统一管理模型返回区域的视口行为:思考计时、贴底自动滚动和手动回到底部。
+export function useAiResponseViewport(options: {
+  selectedVersion: ComputedRef<UIGenerationVersion | undefined>
+  isStreaming: Ref<boolean> | ComputedRef<boolean>
+  getDisplayVersionStatus: (version: UIGenerationVersion) => VersionStatus
+}) {
+  const responseScrollRef = ref<HTMLElement>()
+  const elapsedSeconds = ref(0)
+  const isPinnedToBottom = ref(true)
+  // 小距离仍视为贴底,避免 token 流式输出时因亚像素布局抖动频繁显示按钮。
+  const threshold = 72
+  let timer: ReturnType<typeof setInterval> | undefined
+
+  const thinkingStatus = computed(() => {
+    const version = options.selectedVersion.value
+    if (!version) return 'start'
+
+    const status = options.getDisplayVersionStatus(version)
+    if (status === 'generating') return 'thinking'
+    if (status === 'error') return 'error'
+    return 'end'
+  })
+
+  const isThinking = computed(() => thinkingStatus.value === 'thinking')
+  const labelText = computed(() => {
+    if (thinkingStatus.value === 'error') return '思考失败'
+    if (thinkingStatus.value === 'end') return '思考完成'
+    return '思考中'
+  })
+  const elapsedText = computed(() => formatDuration(elapsedSeconds.value))
+  const showBackBottom = computed(
+    () => Boolean(options.selectedVersion.value) && !isPinnedToBottom.value,
+  )
+
+  watch(
+    () => [
+      options.selectedVersion.value?.id,
+      options.selectedVersion.value?.status,
+      options.selectedVersion.value?.createdAt,
+      options.isStreaming.value,
+    ],
+    syncTimer,
+    { immediate: true },
+  )
+
+  watch(
+    () => [
+      options.selectedVersion.value?.id,
+      options.selectedVersion.value?.reasoning,
+      options.selectedVersion.value?.response,
+    ],
+    () => {
+      // 只有用户仍在底部附近时,才跟随流式输出自动滚动。
+      void scrollToBottom()
+    },
+    { flush: 'post' },
+  )
+
+  watch(
+    () => options.selectedVersion.value?.id,
+    () => {
+      isPinnedToBottom.value = true
+      void scrollToBottom({ force: true })
+    },
+    { flush: 'post' },
+  )
+
+  onBeforeUnmount(stopTimer)
+
+  function syncScrollState() {
+    const container = responseScrollRef.value
+    isPinnedToBottom.value = container
+      ? container.scrollHeight - container.scrollTop - container.clientHeight <=
+        threshold
+      : true
+  }
+
+  function setResponseScrollElement(element: Element | null) {
+    responseScrollRef.value =
+      element instanceof HTMLElement ? element : undefined
+  }
+
+  function backToBottom() {
+    isPinnedToBottom.value = true
+    void scrollToBottom({ force: true })
+  }
+
+  async function scrollToBottom(options: { force?: boolean } = {}) {
+    if (!options.force && !isPinnedToBottom.value) return
+
+    await nextTick()
+    const container = responseScrollRef.value
+    if (!container) return
+    // Vue 应用流式内容期间,用户可能已经手动向上滚动,需要再次确认。
+    if (!options.force && !isPinnedToBottom.value) return
+
+    container.scrollTop = container.scrollHeight
+    isPinnedToBottom.value = true
+  }
+
+  function syncTimer() {
+    stopTimer()
+
+    if (!isThinking.value || !options.selectedVersion.value) {
+      elapsedSeconds.value = 0
+      return
+    }
+
+    updateElapsed()
+    timer = setInterval(updateElapsed, 1000)
+  }
+
+  function stopTimer() {
+    if (!timer) return
+    clearInterval(timer)
+    timer = undefined
+  }
+
+  function updateElapsed() {
+    const createdAt = options.selectedVersion.value?.createdAt
+    elapsedSeconds.value = createdAt
+      ? Math.max(0, Math.floor((Date.now() - createdAt) / 1000))
+      : 0
+  }
+
+  return {
+    responseScrollRef,
+    setResponseScrollElement,
+    thinkingStatus,
+    isThinking,
+    thinkingLabelText: labelText,
+    thinkingElapsedText: elapsedText,
+    showBackBottom,
+    syncScrollState,
+    backToBottom,
+  }
+}
+
+function formatDuration(totalSeconds: number) {
+  const minutes = Math.floor(totalSeconds / 60)
+  const seconds = totalSeconds % 60
+
+  return `${minutes}:${String(seconds).padStart(2, '0')}`
+}

+ 795 - 0
AdminFrontEnd/src/components/business/api-source-modal/ApiSourceModal.vue

@@ -0,0 +1,795 @@
+<script setup lang="ts">
+import { computed, nextTick, ref, watch } from 'vue'
+
+import { FETCH_SOURCE_API_GROUP } from '@/api/resource'
+import type {
+  UIGenerationApiContext,
+  UIGenerationApiFieldContext,
+} from '@/lib/json-render/use-fetch-ai'
+
+type ApiTreeService = API_SOURCE_API_GROUP.R.ITree
+type ApiTreeGroup = API_SOURCE_API_GROUP.R.IGroup
+type ApiTreeApi = API_SOURCE_API_GROUP.R.IApi
+type ApiTreeField =
+  | API_SOURCE_API_GROUP.R.IField
+  | API_SOURCE_API_GROUP.R.ILinkField
+
+interface TreeNode {
+  id: string
+  label: string
+  kind: 'service' | 'group' | 'tab' | 'api'
+  method?: string
+  apiKind?: number
+  apiPath?: string
+  apiKey?: string
+  tabName?: string
+  requestCount?: number
+  responseCount?: number
+  disabled?: boolean
+  children?: TreeNode[]
+}
+
+const props = withDefaults(
+  defineProps<{
+    projectId?: ID
+    multiple?: boolean
+  }>(),
+  {
+    multiple: true,
+  },
+)
+
+const emit = defineEmits<{
+  confirm: [context: UIGenerationApiContext]
+}>()
+
+const visible = defineModel<boolean>({ default: false })
+
+const treeRef = ref()
+const loading = ref(false)
+const services = ref<ApiTreeService[]>([])
+const checkedApiKeys = ref<string[]>([])
+const keyword = ref('')
+
+const treeProps = {
+  label: 'label',
+  children: 'children',
+  disabled: 'disabled',
+}
+
+const apiKeyPrefix = 'api:'
+const apiKindLabelMap: Record<number, string> = {
+  1: '查询',
+  2: '详情/统计',
+  3: '提交',
+  4: '更新',
+  5: '删除',
+}
+
+const apiIndex = computed(() => {
+  const map = new Map<
+    string,
+    {
+      service: ApiTreeService
+      group: ApiTreeGroup
+      api: ApiTreeApi
+    }
+  >()
+
+  services.value.forEach((service) => {
+    service.apiGroups?.forEach((group) => {
+      group.apiInfos?.forEach((api) => {
+        map.set(getApiTreeKey(api), { service, group, api })
+      })
+    })
+  })
+
+  return map
+})
+
+const treeData = computed<TreeNode[]>(() =>
+  services.value.map((service) => {
+    const apiTotal = (service.apiGroups || []).reduce(
+      (total, group) => total + (group.apiInfos || []).length,
+      0,
+    )
+
+    return {
+      id: `service:${service.serviceId}:${service.projectId}`,
+      kind: 'service',
+      label:
+        service.serviceTitle ||
+        service.serviceName ||
+        `服务 ${service.serviceId}`,
+      disabled: true,
+      requestCount: apiTotal,
+      children: (service.apiGroups || []).map((group) => {
+        const tabs = groupApisByTab(group.apiInfos || [])
+
+        return {
+          id: `group:${group.id}`,
+          kind: 'group',
+          label: group.groupTitle || group.groupName || `分组 ${group.id}`,
+          disabled: true,
+          requestCount: group.apiInfos?.length || 0,
+          children: tabs.map(([tabName, apis]) => ({
+            id: `tab:${group.id}:${tabName}`,
+            kind: 'tab',
+            label: tabName || '未分组接口',
+            tabName,
+            disabled: !props.multiple,
+            requestCount: apis.length,
+            children: apis.map((api) => ({
+              id: getApiTreeKey(api),
+              kind: 'api',
+              label: getApiLabel(api),
+              method: api.apiMethod,
+              apiKind: api.apiKind,
+              apiPath: api.apiPath,
+              apiKey: api.apiKey,
+              tabName: api.tabName,
+              requestCount: api.requestParam?.length || 0,
+              responseCount: api.responseParam?.length || 0,
+            })),
+          })),
+        }
+      }),
+    }
+  }),
+)
+
+const selectedApis = computed(() =>
+  checkedApiKeys.value.flatMap((key) => {
+    const indexed = apiIndex.value.get(key)
+    return indexed ? [indexed] : []
+  }),
+)
+const selectedApisInDisplayOrder = computed(() =>
+  [...selectedApis.value].reverse(),
+)
+
+const selectedCount = computed(() => selectedApis.value.length)
+const canConfirm = computed(
+  () => Boolean(props.projectId) && selectedCount.value > 0,
+)
+const apiTotal = computed(() => apiIndex.value.size)
+const fieldTotal = computed(() =>
+  selectedApis.value.reduce((total, { api }) => {
+    return (
+      total + (api.requestParam?.length || 0) + (api.responseParam?.length || 0)
+    )
+  }, 0),
+)
+
+watch(visible, (nextVisible) => {
+  if (!nextVisible) return
+  void loadTree()
+})
+
+watch(keyword, (nextKeyword) => {
+  treeRef.value?.filter(nextKeyword)
+})
+
+function getApiTreeKey(api: Pick<ApiTreeApi, 'id'>) {
+  return `${apiKeyPrefix}${api.id}`
+}
+
+function getApiLabel(api: ApiTreeApi) {
+  return api.apiName || api.methodName || `接口 ${api.id}`
+}
+
+function filterNode(value: string, data: TreeNode) {
+  if (!value) return true
+  const normalizedValue = value.toLowerCase()
+
+  return [
+    data.label,
+    data.method,
+    data.apiPath,
+    data.apiKey,
+    data.tabName,
+    data.apiKind ? getApiKindLabel(data.apiKind) : '',
+  ]
+    .filter(Boolean)
+    .some((item) => String(item).toLowerCase().includes(normalizedValue))
+}
+
+async function loadTree() {
+  if (!props.projectId) {
+    services.value = []
+    checkedApiKeys.value = []
+    return
+  }
+
+  loading.value = true
+  try {
+    const { data, error } = await FETCH_SOURCE_API_GROUP.tree({
+      projectId: props.projectId,
+    })
+
+    if (error) {
+      services.value = []
+      return
+    }
+
+    services.value = data || []
+    await nextTick()
+    treeRef.value?.setCheckedKeys(checkedApiKeys.value)
+  } finally {
+    loading.value = false
+  }
+}
+
+function handleCheck(
+  data: TreeNode,
+  checkedInfo: { checkedKeys: Array<string | number> },
+) {
+  const keys = checkedInfo.checkedKeys
+    .map(String)
+    .filter((key) => key.startsWith(apiKeyPrefix))
+
+  if (!props.multiple) {
+    const isChecked = keys.includes(data.id)
+    const nextKeys = data.kind === 'api' && isChecked ? [data.id] : []
+
+    checkedApiKeys.value = nextKeys
+    treeRef.value?.setCheckedKeys(nextKeys)
+    return
+  }
+
+  checkedApiKeys.value = keys
+}
+
+function removeSelectedApi(key: string) {
+  checkedApiKeys.value = checkedApiKeys.value.filter((item) => item !== key)
+  treeRef.value?.setCheckedKeys(checkedApiKeys.value)
+}
+
+function clearSelectedApis() {
+  checkedApiKeys.value = []
+  treeRef.value?.setCheckedKeys([])
+}
+
+function normalizeField(field: ApiTreeField): UIGenerationApiFieldContext {
+  return {
+    id: field.id,
+    fieldTitle: field.fieldTitle,
+    fieldName: field.fieldName,
+    fieldNameUpper: field.fieldNameUpper,
+    fieldNameFirstUpper: field.fieldNameFirstUpper,
+    fieldType: field.fieldType,
+    editType: field.editType,
+    editTypeData: field.editTypeData,
+    reqParam: field.reqParam,
+    resParam: field.resParam,
+    resType: field.resType,
+    required:
+      field.checkAttributeString?.includes('required') ||
+      (Array.isArray(field.checkAttribute) &&
+        field.checkAttribute.includes('required')),
+    checkAttribute: field.checkAttribute,
+    checkAttributeString: field.checkAttributeString,
+    fieldDetail: field.fieldDetail,
+    linkTableId: field.linkTableId,
+    linkTableName: field.linkTableName,
+    linkTableTitle: field.linkTableTitle,
+    linkTablePrimaryKeyName: field.linkTablePrimaryKeyName,
+    linkParam: normalizeParamList(field.linkParam),
+  }
+}
+
+function normalizeParamList(params: unknown) {
+  if (!Array.isArray(params)) return []
+
+  const fields = params.flatMap((item) => {
+    if (Array.isArray(item)) return item
+    return [item]
+  })
+
+  return fields.filter(isApiField).map(normalizeField)
+}
+
+function isApiField(field: unknown): field is ApiTreeField {
+  return Boolean(
+    field &&
+    typeof field === 'object' &&
+    'fieldName' in field &&
+    'fieldTitle' in field,
+  )
+}
+
+function groupApisByTab(apis: ApiTreeApi[]) {
+  const tabMap = new Map<string, ApiTreeApi[]>()
+
+  apis.forEach((api) => {
+    const tabName = api.tabName || '未分组接口'
+    tabMap.set(tabName, [...(tabMap.get(tabName) || []), api])
+  })
+
+  return Array.from(tabMap.entries())
+}
+
+function getApiKindLabel(apiKind: number | undefined) {
+  if (!apiKind) return '接口'
+  return apiKindLabelMap[apiKind] || `类型 ${apiKind}`
+}
+
+function getMethodClass(method: string | undefined) {
+  return `is-${(method || 'api').toLowerCase()}`
+}
+
+function buildContext(): UIGenerationApiContext {
+  return {
+    projectId: props.projectId,
+    generatedAt: Date.now(),
+    selectedApis: selectedApis.value.map(({ service, group, api }) => ({
+      id: api.id,
+      serviceId: api.serviceId,
+      serviceName: service.serviceName,
+      serviceTitle: service.serviceTitle,
+      groupId: api.groupId,
+      groupName: group.groupName,
+      groupTitle: group.groupTitle,
+      tabName: api.tabName,
+      apiName: api.apiName,
+      apiDetail: api.apiDetail,
+      apiKind: api.apiKind,
+      apiMethod: api.apiMethod,
+      apiPath: api.apiPath,
+      apiKey: api.apiKey,
+      methodName: api.methodName,
+      pageFlag: api.pageFlag,
+      linkTableId: api.linkTableId,
+      linkTableName: api.linkTableName,
+      linkTableTitle: api.linkTableTitle,
+      requestParam: normalizeParamList(api.requestParam),
+      responseParam: normalizeParamList(api.responseParam),
+    })),
+  }
+}
+
+function handleConfirm() {
+  if (!props.projectId) {
+    ElMessage.warning('缺少项目ID,无法加载接口')
+    return
+  }
+
+  if (!selectedCount.value) {
+    ElMessage.warning('请先选择接口')
+    return
+  }
+
+  emit('confirm', buildContext())
+  visible.value = false
+}
+</script>
+
+<template>
+  <ElDialog
+    v-model="visible"
+    title="选择接口"
+    destroy-on-close
+    style="width: 55vw; min-width: 800px"
+    :close-on-click-modal="false"
+  >
+    <div class="api-source-modal">
+      <ElAlert
+        v-if="!projectId"
+        class="mb-3!"
+        :closable="false"
+        type="warning"
+        title="当前页面缺少项目ID,暂时无法选择接口"
+      />
+
+      <div class="api-source-summary">
+        <div>
+          <p class="api-source-summary-title">接口来源</p>
+          <p class="api-source-summary-desc">
+            共 {{ apiTotal }} 个接口,已选择 {{ selectedCount }} 个,字段
+            {{ fieldTotal }} 个
+          </p>
+        </div>
+        <ElButton :loading="loading" @click="loadTree">
+          <template #icon>
+            <IconTablerRefresh class="size-4" />
+          </template>
+          刷新
+        </ElButton>
+      </div>
+
+      <div class="api-source-toolbar">
+        <ElInput
+          v-model="keyword"
+          clearable
+          placeholder="搜索接口名称、路径、apiKey、模块"
+        >
+          <template #prefix>
+            <IconTablerSearch class="size-4" />
+          </template>
+        </ElInput>
+      </div>
+
+      <div class="api-source-content">
+        <div v-loading="loading" class="api-source-tree">
+          <ElEmpty
+            v-if="!loading && treeData.length === 0"
+            description="暂无接口数据"
+          />
+          <ElTree
+            v-else
+            ref="treeRef"
+            node-key="id"
+            show-checkbox
+            default-expand-all
+            :data="treeData"
+            :props="treeProps"
+            :filter-node-method="filterNode"
+            @check="handleCheck"
+          >
+            <template #default="{ node, data }">
+              <span class="api-source-node" :class="`is-${data.kind}`">
+                <IconTablerApi v-if="data.kind === 'api'" class="size-4" />
+                <IconTablerFolder
+                  v-else-if="data.kind === 'group' || data.kind === 'tab'"
+                  class="size-4"
+                />
+                <IconTablerServer v-else class="size-4" />
+
+                <span
+                  v-if="data.method"
+                  class="api-method-tag"
+                  :class="getMethodClass(data.method)"
+                >
+                  {{ data.method }}
+                </span>
+                <span class="api-node-main line-1">
+                  <span class="api-node-title mr-3 align-middle">{{
+                    node.label
+                  }}</span>
+                  <span
+                    v-if="data.apiPath"
+                    class="api-node-subtitle align-middle"
+                  >
+                    {{ data.apiPath }}
+                  </span>
+                </span>
+                <span v-if="data.apiKind" class="api-kind-tag">
+                  {{ getApiKindLabel(data.apiKind) }}
+                </span>
+                <span v-if="data.kind !== 'api'" class="api-count-tag">
+                  {{ data.requestCount }} 个接口
+                </span>
+              </span>
+            </template>
+          </ElTree>
+        </div>
+
+        <aside class="api-source-selected">
+          <div class="api-selected-head">
+            <div>
+              <p class="api-selected-title">已选接口</p>
+              <p class="api-selected-desc">
+                {{ selectedCount }} 个接口,{{ fieldTotal }} 个字段
+              </p>
+            </div>
+            <ElButton
+              link
+              type="danger"
+              :disabled="selectedCount === 0"
+              @click="clearSelectedApis"
+            >
+              清空
+            </ElButton>
+          </div>
+
+          <ElEmpty
+            v-if="selectedCount === 0"
+            class="api-selected-empty"
+            description="从左侧选择接口"
+            :image-size="72"
+          />
+
+          <TransitionGroup
+            v-else
+            class="api-selected-list"
+            name="api-selected"
+            tag="div"
+          >
+            <div
+              v-for="item in selectedApisInDisplayOrder"
+              :key="getApiTreeKey(item.api)"
+              class="api-selected-item"
+            >
+              <div class="api-selected-item-head mb-1">
+                <span
+                  class="api-method-tag"
+                  :class="getMethodClass(item.api.apiMethod)"
+                >
+                  {{ item.api.apiMethod || 'API' }}
+                </span>
+                <span class="api-selected-name">
+                  {{ item.api.apiName || item.api.methodName }}
+                </span>
+                <ElButton
+                  link
+                  type="danger"
+                  @click="removeSelectedApi(getApiTreeKey(item.api))"
+                >
+                  移除
+                </ElButton>
+              </div>
+              <p class="api-selected-meta">
+                {{ item.api.tabName || item.group.groupTitle }} /
+                {{ getApiKindLabel(item.api.apiKind) }}
+              </p>
+              <p class="api-selected-path">{{ item.api.apiPath }}</p>
+            </div>
+          </TransitionGroup>
+        </aside>
+      </div>
+    </div>
+
+    <template #footer>
+      <div class="api-source-footer">
+        <span class="api-source-count">已选择 {{ selectedCount }} 个接口</span>
+        <span>
+          <ElButton @click="visible = false">取消</ElButton>
+          <ElButton
+            type="primary"
+            :disabled="!canConfirm"
+            @click="handleConfirm"
+          >
+            确定选择
+          </ElButton>
+        </span>
+      </div>
+    </template>
+  </ElDialog>
+</template>
+
+<style scoped lang="scss">
+.api-source-modal {
+  display: flex;
+  flex-direction: column;
+  min-height: 560px;
+}
+
+.api-source-summary {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  gap: 12px;
+  margin-bottom: 12px;
+  border: 1px solid var(--el-border-color-lighter);
+  border-radius: 8px;
+  background: var(--fill-color-3);
+  padding: 12px 14px;
+}
+
+.api-source-summary-title,
+.api-source-summary-desc,
+.api-selected-title,
+.api-selected-desc,
+.api-selected-meta,
+.api-selected-path {
+  margin: 0;
+}
+
+.api-source-summary-title,
+.api-selected-title {
+  color: var(--el-text-color-primary);
+  font-weight: 600;
+  font-size: 14px;
+  line-height: 20px;
+}
+
+.api-source-summary-desc,
+.api-selected-desc,
+.api-selected-meta,
+.api-selected-path {
+  color: var(--el-text-color-secondary);
+  font-size: 12px;
+  line-height: 18px;
+}
+
+.api-source-toolbar {
+  display: flex;
+  gap: 10px;
+  margin-bottom: 12px;
+}
+
+.api-source-content {
+  display: grid;
+  grid-template-columns: minmax(0, 1fr) 350px;
+  flex: 1;
+  gap: 12px;
+  min-height: 0;
+}
+
+.api-source-tree {
+  border: 1px solid var(--el-border-color-lighter);
+  border-radius: 8px;
+  background: var(--el-bg-color);
+  padding: 8px;
+  min-height: 430px;
+  max-height: 60vh;
+  overflow: auto;
+}
+
+.api-source-node {
+  display: inline-flex;
+  align-items: center;
+  gap: 6px;
+  padding: 2px 0;
+  width: 100%;
+  min-width: 0;
+}
+
+.api-node-main {
+  flex: 1;
+  min-width: 0;
+}
+
+.api-node-title {
+  color: var(--text-color-2);
+  font-size: 13px;
+  line-height: 18px;
+  white-space: nowrap;
+}
+
+.api-node-subtitle {
+  color: var(--text-color-3);
+  font-size: 11px;
+  line-height: 16px;
+  white-space: nowrap;
+}
+
+.api-method-tag,
+.api-kind-tag,
+.api-count-tag {
+  display: inline-flex;
+  flex: none;
+  justify-content: center;
+  align-items: center;
+  border-radius: 4px;
+  padding: 0 6px;
+  height: 20px;
+  font-weight: 600;
+  font-size: 11px;
+  line-height: 20px;
+}
+
+.api-method-tag {
+  background: var(--el-color-primary-light-9);
+  color: var(--el-color-primary);
+}
+
+.api-method-tag.is-post {
+  background: var(--el-color-success-light-9);
+  color: var(--el-color-success);
+}
+
+.api-method-tag.is-put {
+  background: var(--el-color-warning-light-9);
+  color: var(--el-color-warning);
+}
+
+.api-method-tag.is-delete {
+  background: var(--el-color-danger-light-9);
+  color: var(--el-color-danger);
+}
+
+.api-kind-tag {
+  background: var(--el-fill-color-light);
+  color: var(--el-text-color-regular);
+}
+
+.api-count-tag {
+  background: var(--el-fill-color-lighter);
+  color: var(--el-text-color-secondary);
+}
+
+.api-source-selected {
+  display: flex;
+  flex-direction: column;
+  border: 1px solid var(--el-border-color-lighter);
+  border-radius: 8px;
+  background: var(--el-bg-color);
+  min-height: 430px;
+  max-height: 60vh;
+  overflow: hidden;
+}
+
+.api-selected-head {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  gap: 8px;
+  border-bottom: 1px solid var(--el-border-color-lighter);
+  padding: 12px;
+}
+
+.api-selected-empty {
+  flex: 1;
+}
+
+.api-selected-list {
+  position: relative;
+  flex: 1;
+  padding: 8px;
+  min-height: 0;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+.api-selected-item {
+  margin-bottom: 8px;
+  border: 1px solid var(--el-border-color-lighter);
+  border-radius: 8px;
+  background: var(--el-fill-color-extra-light);
+  padding: 10px;
+}
+
+.api-selected-move,
+.api-selected-enter-active,
+.api-selected-leave-active {
+  transition:
+    opacity 0.24s ease,
+    transform 0.24s cubic-bezier(0.2, 0.8, 0.2, 1);
+}
+
+.api-selected-enter-from {
+  transform: translateY(-10px) scale(0.98);
+  opacity: 0;
+}
+
+.api-selected-leave-active {
+  position: absolute;
+  right: 8px;
+  left: 8px;
+  z-index: 0;
+  pointer-events: none;
+}
+
+.api-selected-leave-to {
+  transform: translateX(16px) scale(0.98);
+  opacity: 0;
+}
+
+.api-selected-item-head {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  min-width: 0;
+}
+
+.api-selected-name {
+  flex: 1;
+  min-width: 0;
+  overflow: hidden;
+  color: var(--el-text-color-primary);
+  font-weight: 600;
+  font-size: 13px;
+  line-height: 20px;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.api-selected-path {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.api-source-footer {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  gap: 12px;
+}
+
+.api-source-count {
+  color: var(--el-text-color-secondary);
+  font-size: 12px;
+}
+</style>

+ 3 - 0
AdminFrontEnd/src/components/business/api-source-modal/index.ts

@@ -0,0 +1,3 @@
+import ApiSourceModal from './ApiSourceModal.vue'
+
+export default ApiSourceModal

+ 249 - 0
AdminFrontEnd/src/components/business/database-select/DataBaseSelect.vue

@@ -0,0 +1,249 @@
+<script lang="ts" setup>
+import { FETCH_DATABASE_TABLE } from '@/api/database-manage'
+import { FETCH_PROJECT_SERVICE } from '@/api/project'
+import { FETCH_DATA } from '@/api/resource'
+import type { TableColumn } from '@/components/common/omega-table'
+import { useDbFieldTypeOptions } from '@/views/database/manage-details/hooks/useDbFieldTypeOptions'
+
+import FieldModal from './FieldModal.vue'
+import type { DatabaseFormData } from './type'
+
+const props = defineProps<{
+  projectId?: ID
+}>()
+
+const emits = defineEmits<{
+  (e: 'add', payload: DatabaseFormData): void
+}>()
+
+const formData = reactive<DatabaseFormData>({
+  serviceId: '',
+  dbId: '',
+})
+const { fieldTypeOptions } = useDbFieldTypeOptions(() => formData.dbId)
+
+const {
+  request: serviceReq,
+  data: service,
+  onFetchFinally,
+} = FETCH_PROJECT_SERVICE.page(
+  () => ({
+    pageNum: 1,
+    pageSize: 500,
+    projectId: props.projectId,
+  }),
+  {
+    immediate: false,
+  },
+)
+
+serviceReq()
+const serviceList = computed(() =>
+  (service.value?.records || []).map((item) => ({
+    ...item,
+    label: `${item.serviceTitle} (${item.serviceName})`,
+    value: item.id,
+  })),
+)
+onFetchFinally(() => {
+  const firstItem = serviceList.value[0]
+  if (firstItem) {
+    formData.serviceId = firstItem.value
+    serveceChange(firstItem.value)
+  }
+})
+
+const databaseList = ref<API_DATA.R.IPageByIds[]>()
+const databaseLoading = ref(false)
+
+async function fetchDatabaseList(dbIdList: ID[]) {
+  databaseLoading.value = true
+  const { data: databaseList } = await FETCH_DATA.pageByIds({
+    pageNum: 1,
+    pageSize: 500,
+    dbIdList,
+  })
+  databaseLoading.value = false
+
+  return databaseList.records || []
+}
+
+async function serveceChange(id: ID) {
+  const selected = serviceList.value.find((item) => item.id === id)
+  databaseList.value = await fetchDatabaseList(selected?.databaseList || [])
+  formData.dbId = databaseList.value[0]?.id || ''
+}
+
+const dbTableColumns = computed(
+  () =>
+    [
+      {
+        label: '名称',
+        prop: 'tableTitle',
+        formItem: {
+          type: 'input',
+        },
+      },
+      {
+        label: '表名',
+        prop: 'tableName',
+        formItem: {
+          type: 'input',
+        },
+      },
+      {
+        label: '操作',
+        prop: 'ACTION',
+        width: 150,
+        actions: (row) => {
+          return [
+            {
+              type: 'primary',
+              label: '详情',
+              onClick: () => {
+                formData.dbTableId = row.id
+                showPopup.field = true
+              },
+            },
+            {
+              type: 'primary',
+              label: '添加',
+              onClick: () => {
+                formData.dbTableId = row.id
+                emits('add', formData)
+              },
+            },
+          ]
+        },
+      },
+    ] as TableColumn[],
+)
+
+const { OmegaTable, reload } = useTable()
+
+async function getDbTableData(params: any) {
+  if (!formData.dbId) return []
+  const { data } = await FETCH_DATABASE_TABLE.page({
+    ...params,
+    databaseId: formData.dbId,
+  })
+  return data
+}
+
+watch(
+  () => formData.dbId,
+  () => {
+    reload()
+  },
+)
+
+const showPopup = reactive({
+  field: false,
+})
+</script>
+
+<template>
+  <div class="side-change-container flex h-[70vh]">
+    <ElCard shadow="never" class="mr-[14px] h-[100%] w-[240px]">
+      <div class="flex-column h-[100%] items-center">
+        <ElSelect
+          v-model="formData.serviceId"
+          placeholder="选择服务"
+          :options="serviceList"
+          @change="serveceChange"
+        ></ElSelect>
+        <ElDivider></ElDivider>
+        <ul
+          v-loading="databaseLoading"
+          class="side-list w-[100%] flex-1 overflow-y-auto"
+        >
+          <template v-if="databaseList && databaseList.length !== 0">
+            <li
+              v-for="option in databaseList"
+              :key="option.id"
+              class="side-item line-1 text-2"
+              :class="{
+                active: formData.dbId === option.id,
+              }"
+              @click="
+                () => {
+                  formData.dbId = option.id
+                }
+              "
+            >
+              <IconTablerDatabase class="mr-2 align-middle" />
+              <span class="align-middle">{{ option.dbName }}</span>
+            </li>
+          </template>
+          <template v-else>
+            <ElEmpty :image-size="120" description="暂无数据库"> </ElEmpty>
+          </template>
+        </ul>
+      </div>
+    </ElCard>
+    <div class="content">
+      <ElCard shadow="never" class="h-[100%]">
+        <OmegaTable
+          :card="false"
+          :columns="dbTableColumns"
+          :immediate="false"
+          @dataRequest="getDbTableData"
+        >
+        </OmegaTable>
+      </ElCard>
+    </div>
+    <FieldModal
+      v-model="showPopup.field"
+      :field-type-options="fieldTypeOptions"
+      :tableId="formData.dbTableId"
+    ></FieldModal>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+:deep(.el-form-item__label-wrap) {
+  align-items: center;
+
+  .el-form-item__label {
+    margin-bottom: 0;
+  }
+}
+
+.side-change-container {
+  overflow: hidden;
+
+  .content {
+    flex: 1;
+    height: 100%;
+    overflow: hidden;
+  }
+}
+
+.side-list {
+  display: flex;
+  flex-direction: column;
+  gap: 8px 0;
+  margin: 0;
+  padding: 0;
+  width: 100%;
+  list-style: none;
+}
+
+.side-item {
+  transition: background-color 0.3s;
+  border-radius: 5px;
+  padding: 6px 15px;
+  font-size: 14px;
+  white-space: nowrap;
+
+  &:hover {
+    cursor: pointer;
+    background-color: var(--el-color-primary-light-9);
+  }
+
+  &.active {
+    background-color: var(--el-color-primary-light-9);
+    color: var(--base-primary);
+  }
+}
+</style>

+ 70 - 0
AdminFrontEnd/src/components/business/database-select/FieldModal.vue

@@ -0,0 +1,70 @@
+<script lang="ts" setup>
+import { FETCH_DATABASE_FIELD } from '@/api/database-manage'
+import type { TableColumn } from '@/components/common/omega-table'
+import { enumToOptions } from '@/utils'
+import type { DatabaseFieldTypeOption } from '@/views/database/manage-details/hooks/useDbFieldTypeOptions'
+
+import type { DatabaseFormData } from './type'
+
+const { OmegaTable: FieldTable } = useTable()
+
+const props = withDefaults(
+  defineProps<{
+    fieldTypeOptions?: DatabaseFieldTypeOption[]
+    tableId?: DatabaseFormData['dbTableId']
+  }>(),
+  {
+    fieldTypeOptions: () => [],
+  },
+)
+
+async function getFieldTableData(params: any) {
+  if (!props.tableId) return []
+  const { data } = await FETCH_DATABASE_FIELD.page({
+    ...params,
+    tableId: props.tableId,
+  })
+  return data
+}
+
+const fieldTableColumns = computed(
+  () =>
+    [
+      {
+        label: '字段名称',
+        prop: 'fieldTitle',
+        formItem: {
+          type: 'input',
+        },
+      },
+      {
+        label: '字段名',
+        prop: 'fieldName',
+        formItem: {
+          type: 'input',
+        },
+      },
+      {
+        label: '字段类型',
+        prop: 'fieldType',
+        formItem: {
+          type: 'select',
+          options: props.fieldTypeOptions,
+        },
+      },
+    ] as TableColumn[],
+)
+</script>
+
+<template>
+  <OmegaModal title="字段列表" :show-action="false" destroy-on-close>
+    <FieldTable
+      :card="false"
+      :columns="fieldTableColumns"
+      :show-tool-bar="false"
+      @data-request="getFieldTableData"
+    />
+  </OmegaModal>
+</template>
+
+<style lang="scss" scoped></style>

+ 5 - 0
AdminFrontEnd/src/components/business/database-select/type.ts

@@ -0,0 +1,5 @@
+export interface DatabaseFormData {
+  serviceId: ID
+  dbId: ID
+  dbTableId?: ID
+}

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