瀏覽代碼

数据看板开发中

liuguofeng 5 月之前
當前提交
6d4bfd3262
共有 100 個文件被更改,包括 6406 次插入0 次删除
  1. 24 0
      datadas/mydatadas/.gitignore
  2. 3 0
      datadas/mydatadas/.vscode/extensions.json
  3. 5 0
      datadas/mydatadas/README.md
  4. 13 0
      datadas/mydatadas/index.html
  5. 2757 0
      datadas/mydatadas/package-lock.json
  6. 28 0
      datadas/mydatadas/package.json
  7. 1 0
      datadas/mydatadas/public/vite.svg
  8. 13 0
      datadas/mydatadas/src/App.vue
  9. 5 0
      datadas/mydatadas/src/action/README.md
  10. 145 0
      datadas/mydatadas/src/action/formatUserData.js
  11. 28 0
      datadas/mydatadas/src/action/messagePrompt.js
  12. 19 0
      datadas/mydatadas/src/action/powerTools.js
  13. 36 0
      datadas/mydatadas/src/action/storageManage.js
  14. 263 0
      datadas/mydatadas/src/action/tagListTools.js
  15. 0 0
      datadas/mydatadas/src/assets/img-list/401.svg
  16. 0 0
      datadas/mydatadas/src/assets/img-list/404.svg
  17. 二進制
      datadas/mydatadas/src/assets/login-imgs/code.png
  18. 0 0
      datadas/mydatadas/src/assets/login-imgs/code.svg
  19. 二進制
      datadas/mydatadas/src/assets/login-imgs/img-1.gif
  20. 二進制
      datadas/mydatadas/src/assets/login-imgs/img-2.gif
  21. 70 0
      datadas/mydatadas/src/assets/login-imgs/login-bg-1.svg
  22. 71 0
      datadas/mydatadas/src/assets/login-imgs/login-bg-2.svg
  23. 6 0
      datadas/mydatadas/src/assets/login-imgs/login-bg-3.svg
  24. 二進制
      datadas/mydatadas/src/assets/login-imgs/login-bg-4.png
  25. 二進制
      datadas/mydatadas/src/assets/login-imgs/login-bg.jpg
  26. 0 0
      datadas/mydatadas/src/assets/login-imgs/login-bg.svg
  27. 二進制
      datadas/mydatadas/src/assets/logo.png
  28. 1 0
      datadas/mydatadas/src/assets/vue.svg
  29. 5 0
      datadas/mydatadas/src/common/README.md
  30. 61 0
      datadas/mydatadas/src/common/debounceAndThrottle.js
  31. 106 0
      datadas/mydatadas/src/common/fileSelectTools.js
  32. 8 0
      datadas/mydatadas/src/common/guid.js
  33. 23 0
      datadas/mydatadas/src/common/numberTools.js
  34. 368 0
      datadas/mydatadas/src/common/otherTools.js
  35. 20 0
      datadas/mydatadas/src/common/plugInstall.js
  36. 24 0
      datadas/mydatadas/src/common/rem.js
  37. 32 0
      datadas/mydatadas/src/common/requestAnimationFrameExpand.js
  38. 58 0
      datadas/mydatadas/src/common/rollTolls.js
  39. 66 0
      datadas/mydatadas/src/common/simpleAnimation.js
  40. 59 0
      datadas/mydatadas/src/common/treeTools.js
  41. 44 0
      datadas/mydatadas/src/common/verifiedTools.js
  42. 5 0
      datadas/mydatadas/src/components/README.md
  43. 161 0
      datadas/mydatadas/src/components/autoScalContainer.vue
  44. 172 0
      datadas/mydatadas/src/components/autoScalContainerV2.vue
  45. 97 0
      datadas/mydatadas/src/components/cropperImg.vue
  46. 267 0
      datadas/mydatadas/src/components/definDropdown.vue
  47. 376 0
      datadas/mydatadas/src/components/definScrollbar.vue
  48. 95 0
      datadas/mydatadas/src/components/dictTags.vue
  49. 181 0
      datadas/mydatadas/src/components/difinCollapse.vue
  50. 110 0
      datadas/mydatadas/src/components/echartContainer.vue
  51. 92 0
      datadas/mydatadas/src/components/iconSlect.vue
  52. 74 0
      datadas/mydatadas/src/components/keepAliveRouter.vue
  53. 163 0
      datadas/mydatadas/src/components/myTabs.vue
  54. 74 0
      datadas/mydatadas/src/components/shadowHtml.vue
  55. 10 0
      datadas/mydatadas/src/components/svgIcon/README.md
  56. 45 0
      datadas/mydatadas/src/components/svgIcon/common.js
  57. 0 0
      datadas/mydatadas/src/components/svgIcon/imgs/baidu.svg
  58. 1 0
      datadas/mydatadas/src/components/svgIcon/imgs/behance.svg
  59. 1 0
      datadas/mydatadas/src/components/svgIcon/imgs/facebook-messenger.svg
  60. 0 0
      datadas/mydatadas/src/components/svgIcon/imgs/gaode.svg
  61. 1 0
      datadas/mydatadas/src/components/svgIcon/imgs/gitee.svg
  62. 二進制
      datadas/mydatadas/src/components/svgIcon/imgs/logo.png
  63. 1 0
      datadas/mydatadas/src/components/svgIcon/imgs/tengxunQQ.svg
  64. 1 0
      datadas/mydatadas/src/components/svgIcon/imgs/test-1.svg
  65. 1 0
      datadas/mydatadas/src/components/svgIcon/imgs/twitter.svg
  66. 1 0
      datadas/mydatadas/src/components/svgIcon/imgs/vk.svg
  67. 1 0
      datadas/mydatadas/src/components/svgIcon/imgs/vue.svg
  68. 0 0
      datadas/mydatadas/src/components/svgIcon/imgs/wangyiyunyinle.svg
  69. 1 0
      datadas/mydatadas/src/components/svgIcon/imgs/whatsapp.svg
  70. 1 0
      datadas/mydatadas/src/components/svgIcon/imgs/zhihu.svg
  71. 81 0
      datadas/mydatadas/src/components/svgIcon/index.vue
  72. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/Directory-tree.svg
  73. 3 0
      datadas/mydatadas/src/components/svgIcon/svgs/Navbar-full.svg
  74. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/aligncenter-fill.svg
  75. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/alignleft-fill.svg
  76. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/alignright-fill.svg
  77. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/all-fill.svg
  78. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/all.svg
  79. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/arrow-left.svg
  80. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/arrow-right.svg
  81. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/borderbottom-fill.svg
  82. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/bordertop-fill.svg
  83. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/borderverticle-fill.svg
  84. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/cat-code.svg
  85. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/chart-area.svg
  86. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/chart-bar.svg
  87. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/chart-line.svg
  88. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/chart-relation.svg
  89. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/chart-scatter-plot.svg
  90. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/cog-fill.svg
  91. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/collection-fill.svg
  92. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/comment-lines.svg
  93. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/commentdots-fill.svg
  94. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/commentlines-fill.svg
  95. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/compress-alt.svg
  96. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/database-plus.svg
  97. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/database.svg
  98. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/delete.svg
  99. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/download.svg
  100. 1 0
      datadas/mydatadas/src/components/svgIcon/svgs/expand-alt.svg

+ 24 - 0
datadas/mydatadas/.gitignore

@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 3 - 0
datadas/mydatadas/.vscode/extensions.json

@@ -0,0 +1,3 @@
+{
+  "recommendations": ["Vue.volar"]
+}

+ 5 - 0
datadas/mydatadas/README.md

@@ -0,0 +1,5 @@
+# Vue 3 + Vite
+
+This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
+
+Learn more about IDE Support for Vue in the [Vue Docs Scaling up Guide](https://vuejs.org/guide/scaling-up/tooling.html#ide-support).

+ 13 - 0
datadas/mydatadas/index.html

@@ -0,0 +1,13 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <!-- <link rel="icon" type="image/svg+xml" href="/vite.svg" /> -->
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>数据看板管理</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.js"></script>
+  </body>
+</html>

+ 2757 - 0
datadas/mydatadas/package-lock.json

@@ -0,0 +1,2757 @@
+{
+  "name": "mydatadas",
+  "version": "0.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "mydatadas",
+      "version": "0.0.0",
+      "dependencies": {
+        "axios": "^1.7.9",
+        "element-plus": "^2.9.0",
+        "file-saver": "^2.0.5",
+        "qs": "^6.13.1",
+        "sass": "^1.82.0",
+        "sass-loader": "^16.0.4",
+        "vue": "^3.5.13",
+        "vue-i18n": "^10.0.5",
+        "vue-router": "^4.5.0"
+      },
+      "devDependencies": {
+        "@vitejs/plugin-vue": "^5.2.1",
+        "unplugin-auto-import": "^0.18.6",
+        "unplugin-vue-components": "^0.27.5",
+        "vite": "^6.0.1"
+      }
+    },
+    "node_modules/@antfu/utils": {
+      "version": "0.7.10",
+      "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.10.tgz",
+      "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.26.3",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.3.tgz",
+      "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
+      "dependencies": {
+        "@babel/types": "^7.26.3"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.26.3",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.26.3.tgz",
+      "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@ctrl/tinycolor": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@element-plus/icons-vue": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
+      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
+      "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
+      "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
+      "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
+      "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
+      "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
+      "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
+      "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
+      "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
+      "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
+      "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
+      "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
+      "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
+      "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
+      "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
+      "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
+      "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
+      "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
+      "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
+      "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
+      "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
+      "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
+      "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
+      "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
+      "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@floating-ui/core": {
+      "version": "1.6.8",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.8.tgz",
+      "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
+      "dependencies": {
+        "@floating-ui/utils": "^0.2.8"
+      }
+    },
+    "node_modules/@floating-ui/dom": {
+      "version": "1.6.12",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.12.tgz",
+      "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==",
+      "dependencies": {
+        "@floating-ui/core": "^1.6.0",
+        "@floating-ui/utils": "^0.2.8"
+      }
+    },
+    "node_modules/@floating-ui/utils": {
+      "version": "0.2.8",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.8.tgz",
+      "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig=="
+    },
+    "node_modules/@intlify/core-base": {
+      "version": "10.0.5",
+      "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-10.0.5.tgz",
+      "integrity": "sha512-F3snDTQs0MdvnnyzTDTVkOYVAZOE/MHwRvF7mn7Jw1yuih4NrFYLNYIymGlLmq4HU2iIdzYsZ7f47bOcwY73XQ==",
+      "dependencies": {
+        "@intlify/message-compiler": "10.0.5",
+        "@intlify/shared": "10.0.5"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/message-compiler": {
+      "version": "10.0.5",
+      "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-10.0.5.tgz",
+      "integrity": "sha512-6GT1BJ852gZ0gItNZN2krX5QAmea+cmdjMvsWohArAZ3GmHdnNANEcF9JjPXAMRtQ6Ux5E269ymamg/+WU6tQA==",
+      "dependencies": {
+        "@intlify/shared": "10.0.5",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/shared": {
+      "version": "10.0.5",
+      "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-10.0.5.tgz",
+      "integrity": "sha512-bmsP4L2HqBF6i6uaMqJMcFBONVjKt+siGluRq4Ca4C0q7W2eMaVZr8iCgF9dKbcVXutftkC7D6z2SaSMmLiDyA==",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@parcel/watcher": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.0.tgz",
+      "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==",
+      "hasInstallScript": true,
+      "optional": true,
+      "dependencies": {
+        "detect-libc": "^1.0.3",
+        "is-glob": "^4.0.3",
+        "micromatch": "^4.0.5",
+        "node-addon-api": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      },
+      "optionalDependencies": {
+        "@parcel/watcher-android-arm64": "2.5.0",
+        "@parcel/watcher-darwin-arm64": "2.5.0",
+        "@parcel/watcher-darwin-x64": "2.5.0",
+        "@parcel/watcher-freebsd-x64": "2.5.0",
+        "@parcel/watcher-linux-arm-glibc": "2.5.0",
+        "@parcel/watcher-linux-arm-musl": "2.5.0",
+        "@parcel/watcher-linux-arm64-glibc": "2.5.0",
+        "@parcel/watcher-linux-arm64-musl": "2.5.0",
+        "@parcel/watcher-linux-x64-glibc": "2.5.0",
+        "@parcel/watcher-linux-x64-musl": "2.5.0",
+        "@parcel/watcher-win32-arm64": "2.5.0",
+        "@parcel/watcher-win32-ia32": "2.5.0",
+        "@parcel/watcher-win32-x64": "2.5.0"
+      }
+    },
+    "node_modules/@parcel/watcher-android-arm64": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz",
+      "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-arm64": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz",
+      "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-darwin-x64": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz",
+      "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-freebsd-x64": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz",
+      "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm-glibc": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz",
+      "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm-musl": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz",
+      "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-glibc": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz",
+      "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-arm64-musl": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz",
+      "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-glibc": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz",
+      "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-linux-x64-musl": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz",
+      "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-arm64": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz",
+      "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-ia32": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz",
+      "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@parcel/watcher-win32-x64": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
+      "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/parcel"
+      }
+    },
+    "node_modules/@popperjs/core": {
+      "name": "@sxzz/popperjs-es",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/popperjs"
+      }
+    },
+    "node_modules/@rollup/pluginutils": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.3.tgz",
+      "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "^1.0.0",
+        "estree-walker": "^2.0.2",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "peerDependencies": {
+        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+      },
+      "peerDependenciesMeta": {
+        "rollup": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@rollup/pluginutils/node_modules/picomatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz",
+      "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz",
+      "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz",
+      "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz",
+      "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-arm64": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz",
+      "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-x64": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz",
+      "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz",
+      "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz",
+      "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz",
+      "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz",
+      "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz",
+      "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz",
+      "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz",
+      "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz",
+      "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz",
+      "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz",
+      "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz",
+      "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz",
+      "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz",
+      "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz",
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+      "dev": true
+    },
+    "node_modules/@types/lodash": {
+      "version": "4.17.13",
+      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.13.tgz",
+      "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg=="
+    },
+    "node_modules/@types/lodash-es": {
+      "version": "4.17.12",
+      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+      "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+      "dependencies": {
+        "@types/lodash": "*"
+      }
+    },
+    "node_modules/@types/web-bluetooth": {
+      "version": "0.0.16",
+      "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
+    },
+    "node_modules/@vitejs/plugin-vue": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
+      "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==",
+      "dev": true,
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^5.0.0 || ^6.0.0",
+        "vue": "^3.2.25"
+      }
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
+      "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
+      "dependencies": {
+        "@babel/parser": "^7.25.3",
+        "@vue/shared": "3.5.13",
+        "entities": "^4.5.0",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
+      "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
+      "dependencies": {
+        "@vue/compiler-core": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
+      "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
+      "dependencies": {
+        "@babel/parser": "^7.25.3",
+        "@vue/compiler-core": "3.5.13",
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.11",
+        "postcss": "^8.4.48",
+        "source-map-js": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
+      "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz",
+      "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
+      "dependencies": {
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
+      "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
+      "dependencies": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/shared": "3.5.13"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
+      "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
+      "dependencies": {
+        "@vue/reactivity": "3.5.13",
+        "@vue/runtime-core": "3.5.13",
+        "@vue/shared": "3.5.13",
+        "csstype": "^3.1.3"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
+      "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.5.13",
+        "@vue/shared": "3.5.13"
+      },
+      "peerDependencies": {
+        "vue": "3.5.13"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz",
+      "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
+    },
+    "node_modules/@vueuse/core": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
+      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+      "dependencies": {
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.13.0",
+        "@vueuse/shared": "9.13.0",
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/core/node_modules/vue-demi": {
+      "version": "0.14.10",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/metadata": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
+      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
+      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+      "dependencies": {
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared/node_modules/vue-demi": {
+      "version": "0.14.10",
+      "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.14.0",
+      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz",
+      "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dev": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/async-validator": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
+      "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "node_modules/axios": {
+      "version": "1.7.9",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz",
+      "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+      "devOptional": true,
+      "dependencies": {
+        "fill-range": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz",
+      "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "es-define-property": "^1.0.0",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
+      "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.1.tgz",
+      "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+      "dependencies": {
+        "readdirp": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 14.16.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/confbox": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz",
+      "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+      "dev": true
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.13",
+      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+    },
+    "node_modules/debug": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
+      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+      "dev": true,
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+      "optional": true,
+      "bin": {
+        "detect-libc": "bin/detect-libc.js"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/dunder-proto": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.0.tgz",
+      "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/element-plus": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.0.tgz",
+      "integrity": "sha512-ccOFXKsauo2dtokAr4OX7gZsb7TuAoVxA2zGRZo5o2yyDDBLBaZxOoFQPoxITSLcHbBfQuNDGK5Iag5hnyKkZA==",
+      "dependencies": {
+        "@ctrl/tinycolor": "^3.4.1",
+        "@element-plus/icons-vue": "^2.3.1",
+        "@floating-ui/dom": "^1.0.1",
+        "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
+        "@types/lodash": "^4.14.182",
+        "@types/lodash-es": "^4.17.6",
+        "@vueuse/core": "^9.1.0",
+        "async-validator": "^4.2.5",
+        "dayjs": "^1.11.13",
+        "escape-html": "^1.0.3",
+        "lodash": "^4.17.21",
+        "lodash-es": "^4.17.21",
+        "lodash-unified": "^1.0.2",
+        "memoize-one": "^6.0.0",
+        "normalize-wheel-es": "^1.2.0"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/esbuild": {
+      "version": "0.24.0",
+      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.0.tgz",
+      "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
+      "dev": true,
+      "hasInstallScript": true,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.24.0",
+        "@esbuild/android-arm": "0.24.0",
+        "@esbuild/android-arm64": "0.24.0",
+        "@esbuild/android-x64": "0.24.0",
+        "@esbuild/darwin-arm64": "0.24.0",
+        "@esbuild/darwin-x64": "0.24.0",
+        "@esbuild/freebsd-arm64": "0.24.0",
+        "@esbuild/freebsd-x64": "0.24.0",
+        "@esbuild/linux-arm": "0.24.0",
+        "@esbuild/linux-arm64": "0.24.0",
+        "@esbuild/linux-ia32": "0.24.0",
+        "@esbuild/linux-loong64": "0.24.0",
+        "@esbuild/linux-mips64el": "0.24.0",
+        "@esbuild/linux-ppc64": "0.24.0",
+        "@esbuild/linux-riscv64": "0.24.0",
+        "@esbuild/linux-s390x": "0.24.0",
+        "@esbuild/linux-x64": "0.24.0",
+        "@esbuild/netbsd-x64": "0.24.0",
+        "@esbuild/openbsd-arm64": "0.24.0",
+        "@esbuild/openbsd-x64": "0.24.0",
+        "@esbuild/sunos-x64": "0.24.0",
+        "@esbuild/win32-arm64": "0.24.0",
+        "@esbuild/win32-ia32": "0.24.0",
+        "@esbuild/win32-x64": "0.24.0"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+    },
+    "node_modules/fast-glob": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
+      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.2",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.4"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fastq": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz",
+      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+      "dev": true,
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+    },
+    "node_modules/fill-range": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+      "devOptional": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.9",
+      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz",
+      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz",
+      "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.5.tgz",
+      "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.0",
+        "dunder-proto": "^1.0.0",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/immutable": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.0.3.tgz",
+      "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw=="
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "devOptional": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "devOptional": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "devOptional": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz",
+      "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+      "dev": true
+    },
+    "node_modules/local-pkg": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.1.tgz",
+      "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==",
+      "dev": true,
+      "dependencies": {
+        "mlly": "^1.7.3",
+        "pkg-types": "^1.2.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "node_modules/lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+    },
+    "node_modules/lodash-unified": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
+      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+      "peerDependencies": {
+        "@types/lodash-es": "*",
+        "lodash": "*",
+        "lodash-es": "*"
+      }
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.14",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.14.tgz",
+      "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0"
+      }
+    },
+    "node_modules/memoize-one": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
+      "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+      "devOptional": true,
+      "dependencies": {
+        "braces": "^3.0.3",
+        "picomatch": "^2.3.1"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/mlly": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.3.tgz",
+      "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^8.14.0",
+        "pathe": "^1.1.2",
+        "pkg-types": "^1.2.1",
+        "ufo": "^1.5.4"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "dev": true
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.8",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.8.tgz",
+      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+    },
+    "node_modules/node-addon-api": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz",
+      "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+      "optional": true
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/normalize-wheel-es": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.3",
+      "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.3.tgz",
+      "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/pathe": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz",
+      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+      "dev": true
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "devOptional": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pkg-types": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.2.1.tgz",
+      "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==",
+      "dev": true,
+      "dependencies": {
+        "confbox": "^0.1.8",
+        "mlly": "^1.7.2",
+        "pathe": "^1.1.2"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.49",
+      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz",
+      "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
+    "node_modules/qs": {
+      "version": "6.13.1",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.1.tgz",
+      "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==",
+      "dependencies": {
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/readdirp": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.0.2.tgz",
+      "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+      "engines": {
+        "node": ">= 14.16.0"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://paulmillr.com/funding/"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true,
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "4.28.1",
+      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.28.1.tgz",
+      "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "1.0.6"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.28.1",
+        "@rollup/rollup-android-arm64": "4.28.1",
+        "@rollup/rollup-darwin-arm64": "4.28.1",
+        "@rollup/rollup-darwin-x64": "4.28.1",
+        "@rollup/rollup-freebsd-arm64": "4.28.1",
+        "@rollup/rollup-freebsd-x64": "4.28.1",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.28.1",
+        "@rollup/rollup-linux-arm-musleabihf": "4.28.1",
+        "@rollup/rollup-linux-arm64-gnu": "4.28.1",
+        "@rollup/rollup-linux-arm64-musl": "4.28.1",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.28.1",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1",
+        "@rollup/rollup-linux-riscv64-gnu": "4.28.1",
+        "@rollup/rollup-linux-s390x-gnu": "4.28.1",
+        "@rollup/rollup-linux-x64-gnu": "4.28.1",
+        "@rollup/rollup-linux-x64-musl": "4.28.1",
+        "@rollup/rollup-win32-arm64-msvc": "4.28.1",
+        "@rollup/rollup-win32-ia32-msvc": "4.28.1",
+        "@rollup/rollup-win32-x64-msvc": "4.28.1",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/sass": {
+      "version": "1.82.0",
+      "resolved": "https://registry.npmmirror.com/sass/-/sass-1.82.0.tgz",
+      "integrity": "sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q==",
+      "dependencies": {
+        "chokidar": "^4.0.0",
+        "immutable": "^5.0.2",
+        "source-map-js": ">=0.6.2 <2.0.0"
+      },
+      "bin": {
+        "sass": "sass.js"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      },
+      "optionalDependencies": {
+        "@parcel/watcher": "^2.4.1"
+      }
+    },
+    "node_modules/sass-loader": {
+      "version": "16.0.4",
+      "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-16.0.4.tgz",
+      "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==",
+      "dependencies": {
+        "neo-async": "^2.6.2"
+      },
+      "engines": {
+        "node": ">= 18.12.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "@rspack/core": "0.x || 1.x",
+        "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
+        "sass": "^1.3.0",
+        "sass-embedded": "*",
+        "webpack": "^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@rspack/core": {
+          "optional": true
+        },
+        "node-sass": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "webpack": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/scule": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz",
+      "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+      "dev": true
+    },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/strip-literal": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.1.tgz",
+      "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==",
+      "dev": true,
+      "dependencies": {
+        "js-tokens": "^9.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/tinyglobby": {
+      "version": "0.2.10",
+      "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.10.tgz",
+      "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==",
+      "dev": true,
+      "dependencies": {
+        "fdir": "^6.4.2",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/tinyglobby/node_modules/fdir": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.2.tgz",
+      "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==",
+      "dev": true,
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/tinyglobby/node_modules/picomatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "devOptional": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/ufo": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz",
+      "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
+      "dev": true
+    },
+    "node_modules/unimport": {
+      "version": "3.14.4",
+      "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.14.4.tgz",
+      "integrity": "sha512-90jQsiS2D0vIrWg4U58do7B5Hr4q0qt9o/rS0TrDMzrvNuAQ7XF1sQ47Pe2zjVlvFWNkoPBb/2l2GJFy5XjqDg==",
+      "dev": true,
+      "dependencies": {
+        "@rollup/pluginutils": "^5.1.3",
+        "acorn": "^8.14.0",
+        "escape-string-regexp": "^5.0.0",
+        "estree-walker": "^3.0.3",
+        "local-pkg": "^0.5.1",
+        "magic-string": "^0.30.14",
+        "mlly": "^1.7.3",
+        "pathe": "^1.1.2",
+        "picomatch": "^4.0.2",
+        "pkg-types": "^1.2.1",
+        "scule": "^1.3.0",
+        "strip-literal": "^2.1.1",
+        "tinyglobby": "^0.2.10",
+        "unplugin": "^1.16.0"
+      }
+    },
+    "node_modules/unimport/node_modules/estree-walker": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz",
+      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "^1.0.0"
+      }
+    },
+    "node_modules/unimport/node_modules/picomatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz",
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "dev": true,
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/unplugin": {
+      "version": "1.16.0",
+      "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.16.0.tgz",
+      "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^8.14.0",
+        "webpack-virtual-modules": "^0.6.2"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/unplugin-auto-import": {
+      "version": "0.18.6",
+      "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.18.6.tgz",
+      "integrity": "sha512-LMFzX5DtkTj/3wZuyG5bgKBoJ7WSgzqSGJ8ppDRdlvPh45mx6t6w3OcbExQi53n3xF5MYkNGPNR/HYOL95KL2A==",
+      "dev": true,
+      "dependencies": {
+        "@antfu/utils": "^0.7.10",
+        "@rollup/pluginutils": "^5.1.3",
+        "fast-glob": "^3.3.2",
+        "local-pkg": "^0.5.1",
+        "magic-string": "^0.30.14",
+        "minimatch": "^9.0.5",
+        "unimport": "^3.13.4",
+        "unplugin": "^1.16.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@nuxt/kit": "^3.2.2",
+        "@vueuse/core": "*"
+      },
+      "peerDependenciesMeta": {
+        "@nuxt/kit": {
+          "optional": true
+        },
+        "@vueuse/core": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unplugin-vue-components": {
+      "version": "0.27.5",
+      "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.27.5.tgz",
+      "integrity": "sha512-m9j4goBeNwXyNN8oZHHxvIIYiG8FQ9UfmKWeNllpDvhU7btKNNELGPt+o3mckQKuPwrE7e0PvCsx+IWuDSD9Vg==",
+      "dev": true,
+      "dependencies": {
+        "@antfu/utils": "^0.7.10",
+        "@rollup/pluginutils": "^5.1.3",
+        "chokidar": "^3.6.0",
+        "debug": "^4.3.7",
+        "fast-glob": "^3.3.2",
+        "local-pkg": "^0.5.1",
+        "magic-string": "^0.30.14",
+        "minimatch": "^9.0.5",
+        "mlly": "^1.7.3",
+        "unplugin": "^1.16.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@babel/parser": "^7.15.8",
+        "@nuxt/kit": "^3.2.2",
+        "vue": "2 || 3"
+      },
+      "peerDependenciesMeta": {
+        "@babel/parser": {
+          "optional": true
+        },
+        "@nuxt/kit": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/unplugin-vue-components/node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/unplugin-vue-components/node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/vite": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmmirror.com/vite/-/vite-6.0.3.tgz",
+      "integrity": "sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==",
+      "dev": true,
+      "dependencies": {
+        "esbuild": "^0.24.0",
+        "postcss": "^8.4.49",
+        "rollup": "^4.23.0"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+        "jiti": ">=1.21.0",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "sass-embedded": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.16.0",
+        "tsx": "^4.8.1",
+        "yaml": "^2.4.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "jiti": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue": {
+      "version": "3.5.13",
+      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz",
+      "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.13",
+        "@vue/compiler-sfc": "3.5.13",
+        "@vue/runtime-dom": "3.5.13",
+        "@vue/server-renderer": "3.5.13",
+        "@vue/shared": "3.5.13"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-i18n": {
+      "version": "10.0.5",
+      "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-10.0.5.tgz",
+      "integrity": "sha512-9/gmDlCblz3i8ypu/afiIc/SUIfTTE1mr0mZhb9pk70xo2csHAM9mp2gdQ3KD2O0AM3Hz/5ypb+FycTj/lHlPQ==",
+      "dependencies": {
+        "@intlify/core-base": "10.0.5",
+        "@intlify/shared": "10.0.5",
+        "@vue/devtools-api": "^6.5.0"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/vue-router": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.0.tgz",
+      "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.6.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/webpack-virtual-modules": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+      "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+      "dev": true
+    }
+  }
+}

+ 28 - 0
datadas/mydatadas/package.json

@@ -0,0 +1,28 @@
+{
+  "name": "mydatadas",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "axios": "^1.7.9",
+    "element-plus": "^2.9.0",
+    "file-saver": "^2.0.5",
+    "qs": "^6.13.1",
+    "sass": "^1.82.0",
+    "sass-loader": "^16.0.4",
+    "vue": "^3.5.13",
+    "vue-i18n": "^10.0.5",
+    "vue-router": "^4.5.0"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-vue": "^5.2.1",
+    "unplugin-auto-import": "^0.18.6",
+    "unplugin-vue-components": "^0.27.5",
+    "vite": "^6.0.1"
+  }
+}

+ 1 - 0
datadas/mydatadas/public/vite.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 13 - 0
datadas/mydatadas/src/App.vue

@@ -0,0 +1,13 @@
+<script setup>
+
+</script>
+
+<template>
+  <div>
+    <router-view></router-view>
+  </div>
+</template>
+
+<style scoped>
+
+</style>

+ 5 - 0
datadas/mydatadas/src/action/README.md

@@ -0,0 +1,5 @@
+一些可以集成得行为方法,函数
+
+像什么处理登录后的权限目录列表呀,什么权限验证呀啥的
+
+相当于一个操作的集合

+ 145 - 0
datadas/mydatadas/src/action/formatUserData.js

@@ -0,0 +1,145 @@
+/**
+ * 格式化用户的一些数据
+ * 在这里可以接口请求用户的一些数据
+ */
+import { userDataStore } from '@/store/user';
+import { sysMeluConfigNameMap, sysMeluConfigPathMap } from '@/router/common';
+import { toTree, unfoldTreeList } from '@/common/treeTools';
+import { getNanoid } from '@/common/guid';
+import { deepCopyObj } from '@/common/otherTools';
+import userApi from '@/http/user';
+import { formatTagsByUserMenuConfig } from '@/action/tagListTools';
+
+/**
+ * url 转 path
+ * 防止链接带参数时的一些匹配错误
+ */
+function urlToPath(url) {
+    try {
+        return new URL(location.origin + url).pathname;
+    } catch {
+        return url;
+    }
+}
+/**
+ * 转换用户menu
+ * 目的是分出用于显示的和用户判断目录权限的
+ * 用于判断权限的包含配置信息
+ *  */
+function transUserMenu(menuList) {
+    let userMenuConfigNameMap = {};
+    let userMenuConfigPathMap = {};
+    let userMenuList = [];
+    let userMenuSignMap = {};
+    /**
+     * 将树形结构展开
+     * 需要换成一维数组来过滤不要展示的目录
+     *  */
+    menuList = unfoldTreeList(menuList, {
+        childsKey: 'childs',
+        setParentKey: 'parentSign',
+        getParentKey: 'sign',
+        forEachFn(item) {
+            /** 添加唯一标识以便区分 */
+            item.sign = getNanoid();
+        },
+    });
+    /** 遍历用户目录,生成用户配置 */
+    menuList.forEach((item) => {
+        delete item.childs;
+        /**
+         * 根据用户自己的配置生成配置MAP
+         * 添加以path为优先,name次之的配置信息(因为一个name路由可以产生多个path)
+         *  */
+        let path = item.path;
+        let name = item.name;
+        if (!!path && !name) {
+            /** 有路由地址,但没目录名称 */
+            path = urlToPath(path);
+            userMenuConfigPathMap[path] = item;
+        }
+        if (!path && !!name) {
+            /** 没路由地址,但有菜单名称 */
+            let sysMenuConfig = sysMeluConfigNameMap[name] || {};
+            item.path = sysMenuConfig.path;
+            userMenuConfigNameMap[name] = item;
+        }
+        if (!!path && !!name) {
+            /**
+             * 有路由地址,有菜单名称
+             * 以路由为准
+             *  */
+            path = urlToPath(path);
+            userMenuConfigPathMap[path] = item;
+        }
+        userMenuSignMap[item.sign] = item;
+    });
+    /** 用作展示的目录可以过滤掉不显示的 */
+    userMenuList = menuList.filter((item) => !item.hidden);
+    userMenuList = toTree(userMenuList, {
+        pKey: 'parentSign',
+        key: 'sign',
+        childsKey: 'childs',
+        isNew: true,
+    });
+    return {
+        userMenuList,
+        userMenuConfigNameMap,
+        userMenuConfigPathMap,
+        userMenuSignMap,
+    };
+}
+/**
+ * 获取用户详细数据
+ */
+export function getUserData() {
+    return Promise.resolve().then(async () => {
+        const userData = userDataStore();
+        let userInfo = userData.userInfo || {};
+        /** 获取用户信息 */
+        let userInfo_ = await userApi
+            .getUserInfo()
+            .then((res) => {
+                return res.data || {};
+            })
+            .catch(() => {
+                return {};
+            });
+        console.log('获取用户信息成功', userInfo_);
+        /** 写入基本信息  */
+        userData.setUserInfo(Object.assign({}, userInfo, userInfo_));
+        /**
+         * 获取用户目录列表
+         * name表示对应的系统目录,有name才有此系统目录的权限
+         * 有path的可直接跳转
+         * 没path的,根据name获取映射的系统菜单属性进行跳转
+         *  */
+        let menuList = await userApi
+            .getMenuList()
+            .then((res) => {
+                return res.data || {};
+            })
+            .catch(() => {
+                return [];
+            });
+        console.log('获取用户目录成功', deepCopyObj(menuList));
+        let transData = transUserMenu(menuList);
+        /** 写入展示菜单数据 */
+        userData.setUserMenuList(transData.userMenuList);
+        /** 写入权限菜单数据 */
+        userData.setUserMenuConfigNameMap(transData.userMenuConfigNameMap);
+        userData.setUserMenuConfigPathMap(transData.userMenuConfigPathMap);
+        userData.setUserMenuSignMap(transData.userMenuSignMap);
+        console.log('格式化用户目录成功', transData.userMenuList);
+        if (Object.keys(userData.tagsMap).length > 0) {
+            formatTagsByUserMenuConfig();
+            console.log('格式化标签成功', userData.tagsMap);
+        }
+    });
+}
+/** 用户退出登录 */
+export function logout() {
+    const userData = userDataStore();
+    userData.setUserInfo({});
+    userData.setUserMenuList([]);
+}

+ 28 - 0
datadas/mydatadas/src/action/messagePrompt.js

@@ -0,0 +1,28 @@
+/**
+ * 消息提示的部分方法,目前使用的是elment plus的消息提示,可使用其他替换
+ */
+import { ElMessage, ElMessageBox } from 'element-plus';
+/**
+ * element 部分样式 其他组件已使用按需引入插件
+ *  */
+import 'element-plus/es/components/message/style/css';
+import 'element-plus/es/components/message-box/style/css';
+
+/** 成功的消息 */
+export function messageSuccess(...params) {
+    return ElMessage.success(...params);
+}
+/** 失败的消息 */
+export function messageError(...params) {
+    return ElMessage.error(...params);
+}
+/** alert */
+export function alert(...params) {
+    return ElMessageBox.alert(...params);
+}
+export function confirm(...params) {
+    return ElMessageBox.confirm(...params);
+}
+export function prompt(...params) {
+    return ElMessageBox.prompt(...params);
+}

+ 19 - 0
datadas/mydatadas/src/action/powerTools.js

@@ -0,0 +1,19 @@
+/**
+ * 权限验证相关函数
+ *  */
+import { userDataStore } from '@/store/user';
+
+/**
+ * 按钮权限过滤
+ * 判断本次登录用户是否有该权限
+ * permi:String
+ *  */
+export function hasPermi(permi) {
+    let userData = userDataStore();
+    let userInfo = userData.userInfo || {};
+    let permissionList = userData.permissionList || [];
+    // 如果没有登录凭证的话表示都无权限
+    if (!userInfo.token) return false;
+    // return permissionList.includes(permi);
+    return true;
+}

+ 36 - 0
datadas/mydatadas/src/action/storageManage.js

@@ -0,0 +1,36 @@
+/**
+ * 缓存对象管理
+ * 防止对象过多
+ */
+import StorageS from 'storages-js';
+
+/**
+ * 所有实例
+ * 公共管理
+ *  */
+const allStorage = {};
+function createS(key, value) {
+    if (!allStorage[key]) {
+        allStorage[key] = new StorageS(key, value, { modelName: 'local' });
+    }
+    return allStorage[key];
+}
+
+/** 保存用户的基本信息 */
+const userStorage = (value) => {
+    return createS('user-container', value);
+};
+/** 保存标签页的标签信息 */
+const tagsMapStorage = (value) => {
+    return createS('tags-map-container', value);
+};
+/** 保存memu的隐藏信息信息 */
+const showMenuStorage = (value) => {
+    return createS('show-menu-container', value);
+};
+
+export default {
+    userStorage,
+    showMenuStorage,
+    tagsMapStorage,
+};

+ 263 - 0
datadas/mydatadas/src/action/tagListTools.js

@@ -0,0 +1,263 @@
+/**
+ * 标签数组的操作
+ * 包含刷新当前标签页,操作标签数组,添加删除标签数组
+ */
+import { userDataStore } from '@/store/user';
+import router from '@/router';
+import { deepCopyObj } from '@/common/otherTools';
+import { sysMeluConfigNameMap, sysMeluConfigPathMap } from '@/router/common';
+
+/** 从所有标签中找到相应的tag */
+export function findTag(path) {
+    let userData = userDataStore();
+    let tagsMap = userData.tagsMap;
+    let target;
+    Object.values(tagsMap).find((item) => {
+        if (!item || item.length == 0) return false;
+        target = item.find((item_) => {
+            return item_.path == path;
+        });
+        return !!target;
+    });
+    return target;
+}
+/**
+ * 获取标签
+ */
+export function getTag({ path, layoutName } = {}) {
+    let userData = userDataStore();
+    let tagsMap = userData.tagsMap;
+    let tagList = tagsMap[layoutName || ''] || [];
+    let target = tagList.find((item) => {
+        return item.path == path;
+    });
+    return target;
+}
+/**
+ * 删除标签,可批量删除
+ * 参数 标签唯一标识 数组
+ */
+export function deleteTags({ paths, layoutName } = {}) {
+    let userData = userDataStore();
+    /** 深度克隆一份,表示不利用自身的属性监听,干干净净 */
+    let tagsMap = deepCopyObj(userData.tagsMap);
+    let tagList = tagsMap[layoutName || ''] || [];
+    if (!paths) return;
+    /** 不是数组的转换一下,方便操作 */
+    if (!Array.isArray(paths)) {
+        paths = [paths];
+    }
+    tagList = tagList.filter((item) => {
+        return !paths.includes(item.path);
+    });
+    tagsMap[layoutName || ''] = tagList;
+    userData.setTagsMap(tagsMap);
+}
+/**
+ * 修改标签
+ * 参数是一个tag对象数据
+ *  */
+export function updateTag({ tag, layoutName } = {}) {
+    let userData = userDataStore();
+    /** 深度克隆一份,表示不利用自身的属性监听,干干净净 */
+    let tagsMap = deepCopyObj(userData.tagsMap);
+    let tagList = tagsMap[layoutName || ''] || [];
+    if (!tag || !tag.path) return;
+    let target = tagList.find((item) => {
+        return item.path == tag.path;
+    });
+    if (!target) return;
+    /** 只修改有的属性 */
+    Object.keys(tag).forEach((key) => {
+        target[key] = tag[key];
+    });
+    userData.setTagsMap(tagsMap);
+}
+/**
+ * 格式化标签列表
+ * 与目录重新建立关系,相当于更新了一下标签
+ *  */
+export function formatTagsByUserMenuConfig() {
+    let userData = userDataStore();
+    /** 深度克隆一份,表示不利用自身的属性监听,干干净净 */
+    let tagsMap = deepCopyObj(userData.tagsMap);
+    let pathMap = {};
+    Object.keys(tagsMap).forEach((key) => {
+        let tagList = tagsMap[key] || [];
+        const tagList_ = [];
+        tagList.forEach((item) => {
+            let toPath = item.path;
+            let toName = item.name;
+            let toFullPath = item.fullPath;
+            if (pathMap[toPath]) return;
+            /** 获取该路由对应的系统配置 */
+            let sysMenuConfig = sysMeluConfigPathMap[toPath] || sysMeluConfigNameMap[toName];
+            if (!sysMenuConfig) return;
+            /** 获取该路由对应的用户配置 */
+            const userMenuConfig =
+                userData.userMenuConfigPathMap[toPath] || userData.userMenuConfigNameMap[toName];
+            if (!userMenuConfig) return;
+            /** 合并该配置(用户配置优先),并将它用作标签 */
+            const menuConfig = Object.assign(item, sysMenuConfig, userMenuConfig, {
+                path: toPath,
+                fullPath: toFullPath,
+            });
+            tagList_.push(menuConfig);
+            pathMap[toPath] = true;
+        });
+        tagsMap[key] = tagList_;
+    });
+    userData.setTagsMap(tagsMap);
+}
+/**
+ * 刷新指定标签页
+ * path 标签唯一标识
+ * refreshAll 是否刷新全部标签
+ *  */
+export function refreshTag({ path, refreshAll = false, layoutName }) {
+    let userData = userDataStore();
+    let tagsMap = deepCopyObj(userData.tagsMap);
+    let tagList = tagsMap[layoutName || ''] || [];
+    let tagList_1 = deepCopyObj(tagList);
+    tagList_1.forEach((item) => {
+        item.isCache = false;
+    });
+    let target = tagList.find((item) => {
+        return item.path == path;
+    });
+    if (!target) return;
+    if (!target.redirectName) {
+        /** 没有刷新地址的跳回原地址 */
+        router.push(target.fullPath);
+        return;
+    }
+    let isCache = target.isCache;
+    /** 取消缓存 */
+    if (refreshAll) {
+        tagsMap[layoutName || ''] = tagList_1;
+        userData.setTagsMap(tagsMap);
+    } else {
+        target.isCache = false;
+        tagsMap[layoutName || ''] = tagList;
+        userData.setTagsMap(tagsMap);
+    }
+    /** 路由解析完后还原该标签的缓存属性 */
+    let myAfterEach = router.afterEach(() => {
+        if (!target) return;
+        target.isCache = isCache;
+        target = null;
+        tagsMap[layoutName || ''] = tagList;
+        userData.setTagsMap(deepCopyObj(tagsMap));
+        /** 注销此函数 */
+        myAfterEach();
+        myAfterEach = null;
+    });
+    /** 跳转到重定向页面 */
+    router.push({
+        name: target.redirectName,
+        params: {
+            path: target.fullPath,
+        },
+    });
+}
+/**
+ * 关闭除了当前的所有其他标签
+ * 固定的除外
+ *  */
+export function deleteOtherTags({ path, layoutName, excludePaths = [] }) {
+    let userData = userDataStore();
+    /** 深度克隆一份,表示不利用自身的属性监听,干干净净 */
+    let tagsMap = userData.tagsMap;
+    let tagList = tagsMap[layoutName || ''] || [];
+    let paths = tagList
+        .filter((item) => {
+            if (excludePaths.includes(item.path)) return false; // 排除path
+            return item.path != path && !item.fixed;
+        })
+        .map((item) => item.path);
+    deleteTags({ paths, layoutName });
+}
+/**
+ * 关闭除了当前的左边的所有其他标签
+ * 固定的除外
+ *  */
+export function deleteLeftTags({ path, layoutName, excludePaths = [] }) {
+    let userData = userDataStore();
+    /** 深度克隆一份,表示不利用自身的属性监听,干干净净 */
+    let tagsMap = userData.tagsMap;
+    let tagList = tagsMap[layoutName || ''] || [];
+    let index = tagList.findIndex((item) => {
+        return item.path == path;
+    });
+    let paths = tagList
+        .filter((item, index_) => {
+            if (excludePaths.includes(item.path)) return false; // 排除path
+            return index_ < index && !item.fixed;
+        })
+        .map((item) => item.path);
+    deleteTags({ paths, layoutName });
+}
+/**
+ * 关闭除了当前的左边的所有其他标签
+ * 固定的除外
+ *  */
+export function deleteRightTags({ path, layoutName, excludePaths = [] }) {
+    let userData = userDataStore();
+    /** 深度克隆一份,表示不利用自身的属性监听,干干净净 */
+    let tagsMap = userData.tagsMap;
+    let tagList = tagsMap[layoutName || ''] || [];
+    let index = tagList.findIndex((item) => {
+        return item.path == path;
+    });
+    let paths = tagList
+        .filter((item, index_) => {
+            if (excludePaths.includes(item.path)) return false; // 排除path
+            return index_ > index && !item.fixed;
+        })
+        .map((item) => item.path);
+    deleteTags({ paths, layoutName });
+}
+/**
+ * 获取历史记录里最近的一个标签(不在标签列表中的过滤掉)
+ */
+export function getLatelyHisTag({ layoutName }) {
+    let userData = userDataStore();
+    /** 深度克隆一份,表示不利用自身的属性监听,干干净净 */
+    let tagsMap = userData.tagsMap;
+    let tagList = tagsMap[layoutName || ''] || [];
+    let sortNumber = -1;
+    let target;
+    tagList.forEach((item) => {
+        let sortNumber_ = item.sortNumber || 0;
+        if (sortNumber_ > sortNumber) {
+            sortNumber = sortNumber_;
+            target = item;
+        }
+    });
+    return target;
+}
+/** 获取右边的一个实例 */
+export function getRight({ path, layoutName }) {
+    let userData = userDataStore();
+    /** 深度克隆一份,表示不利用自身的属性监听,干干净净 */
+    let tagsMap = userData.tagsMap;
+    let tagList = tagsMap[layoutName || ''] || [];
+    let index = tagList.findIndex((item) => {
+        return item.path == path;
+    });
+    if (index == -1) return;
+    let target = tagList[index + 1];
+    return target;
+}
+export function getLeft({ path, layoutName }) {
+    let userData = userDataStore();
+    /** 深度克隆一份,表示不利用自身的属性监听,干干净净 */
+    let tagsMap = userData.tagsMap;
+    let tagList = tagsMap[layoutName || ''] || [];
+    let index = tagList.findIndex((item) => {
+        return item.path == path;
+    });
+    if (index == -1) return;
+    let target = tagList[index - 1];
+    return target;
+}

File diff suppressed because it is too large
+ 0 - 0
datadas/mydatadas/src/assets/img-list/401.svg


File diff suppressed because it is too large
+ 0 - 0
datadas/mydatadas/src/assets/img-list/404.svg


二進制
datadas/mydatadas/src/assets/login-imgs/code.png


File diff suppressed because it is too large
+ 0 - 0
datadas/mydatadas/src/assets/login-imgs/code.svg


二進制
datadas/mydatadas/src/assets/login-imgs/img-1.gif


二進制
datadas/mydatadas/src/assets/login-imgs/img-2.gif


+ 70 - 0
datadas/mydatadas/src/assets/login-imgs/login-bg-1.svg

@@ -0,0 +1,70 @@
+<?xml
+version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
+    <title>Group 21</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
+            <g id="Group-21" transform="translate(77.000000, 73.000000)">
+                <g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
+                    <ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"></ellipse>
+                    <ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"></ellipse>
+                    <path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path>
+                    <path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path>
+                    <path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
+                    <path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
+                    <g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6">
+                        <ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"></ellipse>
+                        <path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path>
+                    </g>
+                </g>
+                <g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
+                    <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"></ellipse>
+                    <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"></ellipse>
+                    <ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"></ellipse>
+                    <ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"></ellipse>
+                    <path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"></path>
+                    <g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6">
+                        <ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse>
+                        <path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path>
+                    </g>
+                    <ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"></ellipse>
+                    <ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"></ellipse>
+                    <ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"></ellipse>
+                    <path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path>
+                </g>
+                <g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
+                    <ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"></ellipse>
+                    <g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
+                        <ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"></ellipse>
+                        <path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"></path>
+                    </g>
+                    <path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"></path>
+                    <ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"></ellipse>
+                    <ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"></ellipse>
+                    <path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"></path>
+                </g>
+                <g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
+                    <g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9">
+                        <circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle>
+                        <path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path>
+                    </g>
+                    <circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle>
+                    <path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"></path>
+                    <path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"></path>
+                    <polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline>
+                    <path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"></path>
+                    <path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"></path>
+                    <path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"></path>
+                    <circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle>
+                    <circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle>
+                    <circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle>
+                    <circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"></circle>
+                    <circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

File diff suppressed because it is too large
+ 71 - 0
datadas/mydatadas/src/assets/login-imgs/login-bg-2.svg


File diff suppressed because it is too large
+ 6 - 0
datadas/mydatadas/src/assets/login-imgs/login-bg-3.svg


二進制
datadas/mydatadas/src/assets/login-imgs/login-bg-4.png


二進制
datadas/mydatadas/src/assets/login-imgs/login-bg.jpg


File diff suppressed because it is too large
+ 0 - 0
datadas/mydatadas/src/assets/login-imgs/login-bg.svg


二進制
datadas/mydatadas/src/assets/logo.png


+ 1 - 0
datadas/mydatadas/src/assets/vue.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

+ 5 - 0
datadas/mydatadas/src/common/README.md

@@ -0,0 +1,5 @@
+一些公共的函数,方法
+
+基本上就是一些类似纯函数的方法,工具函数,一般不做修改,只管调用就是了
+
+意思就是说这个文件夹放的都是只管调用不用修改的函数文件

+ 61 - 0
datadas/mydatadas/src/common/debounceAndThrottle.js

@@ -0,0 +1,61 @@
+/*jshint esversion: 9 */
+/*
+ 防抖和节流工具函数 一篇文字
+ */
+// 防抖(immediate=true代表只执行第一次和最后一次)
+export function debounceFn(fn, delay, immediate) {
+    delay = delay || 200;
+    var timer;
+    return function () {
+        const that = this;
+        const args = arguments;
+        if (timer === undefined && immediate) {
+            //如果是第一次则执行
+            timer = setTimeout(() => {
+                timer = undefined;
+            }, delay);
+            fn.apply(that, args);
+        } else {
+            clearTimeout(timer);
+            timer = setTimeout(function () {
+                timer = undefined;
+                fn.apply(that, args);
+            }, delay);
+        }
+    };
+}
+// 节流
+export function throttleFn(fn, interval) {
+    var last;
+    var timer;
+    interval = interval || 200;
+    return function () {
+        var th = this;
+        var args = arguments;
+        var now = +new Date();
+        if (last && now - last < interval) {
+            clearTimeout(timer);
+            timer = setTimeout(function () {
+                last = now;
+                fn.apply(th, args);
+            }, interval);
+        } else {
+            last = now;
+            fn.apply(th, args);
+        }
+    };
+}
+/**
+ * 节流 1
+ * 另一种方式
+ *  */
+export function throttleFn_1(fun, time = 150) {
+    let t1 = 0; //初始时间
+    return function () {
+        let t2 = new Date().getTime(); //当前时间
+        if (t2 - t1 > time) {
+            fun.apply(this, arguments);
+            t1 = t2;
+        }
+    };
+}

+ 106 - 0
datadas/mydatadas/src/common/fileSelectTools.js

@@ -0,0 +1,106 @@
+/**
+ * 简单的处理文件选择的工具函数
+ */
+import mime from 'mime';
+/**
+ * 文件选择
+ *  */
+export function chooseFile(params) {
+    params = params || {};
+    // 是否多选
+    let multiple = !!params.multiple;
+    // 所选文件类型
+    let accept = params.accept;
+    return new Promise((r, j) => {
+        // 创建隐藏的 input 元素来触发文件选择对话框
+        const hiddenInput = document.createElement('input');
+        hiddenInput.type = 'file';
+        hiddenInput.accept = accept;
+        if (multiple) {
+            hiddenInput.multiple = 'true';
+        }
+        hiddenInput.style.display = 'none';
+        document.body.appendChild(hiddenInput);
+        // 当文件选择完成后,获取文件信息并显示在页面上
+        hiddenInput.onchange = function (event) {
+            let files = event.target.files || [];
+            if (multiple) {
+                r(files);
+            } else {
+                r(files[0]);
+            }
+            // 清除隐藏的 input 元素
+            hiddenInput.remove();
+        };
+        hiddenInput.onabort = function (event) {
+            j(event);
+        };
+        // 触发文件选择对话框
+        hiddenInput.click();
+    });
+}
+/**
+ * 根据文件名获取文件mime类型
+ */
+export function getMime(name) {
+    return mime.getType(name || '');
+}
+/**
+ * 根据文件名获取文件Extension
+ */
+export function getMimeExtension(type) {
+    return mime.getExtension(type || '');
+}
+/**
+ * 获取文件后缀
+ * @param {*} filePath
+ */
+export function getSuffix(filePath) {
+    filePath = filePath || '';
+    var startIndex = filePath.lastIndexOf('.');
+    if (startIndex != -1) {
+        return `.${filePath.substring(startIndex + 1, filePath.length).toLowerCase()}`;
+    } else {
+        return '';
+    }
+}
+/** 格式化文件大小显示 */
+export function formatFileSize(fileSize) {
+    //格式化文件大小
+    if (!fileSize) return fileSize;
+    if (typeof fileSize !== 'number') return fileSize;
+    var temp;
+    if (fileSize < 1024) {
+        return fileSize + 'B';
+    } else if (fileSize < 1024 * 1024) {
+        temp = fileSize / 1024;
+        temp = temp.toFixed(2);
+        return temp + 'KB';
+    } else if (fileSize < 1024 * 1024 * 1024) {
+        temp = fileSize / (1024 * 1024);
+        temp = temp.toFixed(2);
+        return temp + 'MB';
+    } else {
+        temp = fileSize / (1024 * 1024 * 1024);
+        temp = temp.toFixed(2);
+        return temp + 'GB';
+    }
+}
+/**
+ * 格式转换方法
+ *  */
+export function base64ToFile(base64Data, fileName) {
+    const byteCharacters = atob(base64Data.split(',')[1]);
+    const byteArrays = [];
+    for (let offset = 0; offset < byteCharacters.length; offset += 512) {
+        const slice = byteCharacters.slice(offset, offset + 512);
+        const byteNumbers = new Array(slice.length);
+        for (let i = 0; i < slice.length; i++) {
+            byteNumbers[i] = slice.charCodeAt(i);
+        }
+        const byteArray = new Uint8Array(byteNumbers);
+        byteArrays.push(byteArray);
+    }
+    const blob = new Blob(byteArrays, { type: 'image/jpeg' });
+    return new File([blob], fileName, { type: 'image/jpeg' });
+}

+ 8 - 0
datadas/mydatadas/src/common/guid.js

@@ -0,0 +1,8 @@
+/**
+ * 前端生成唯一标识 (guid)
+ */
+import { nanoid } from 'nanoid';
+
+export function getNanoid() {
+    return nanoid();
+}

+ 23 - 0
datadas/mydatadas/src/common/numberTools.js

@@ -0,0 +1,23 @@
+/**
+ *
+ * 生成从minNum到maxNum的随机数
+ */
+export function randomNum(minNum, maxNum) {
+    switch (arguments.length) {
+        case 1:
+            return parseInt(Math.random() * minNum + 1, 10);
+        case 2:
+            return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
+        default:
+            return 0;
+    }
+}
+/**
+ * 数字四舍五入
+ * value:number
+ * length:number
+ */
+export function numberToFixed(value, length = 0) {
+    value = Number(value);
+    return Number(Number.prototype.toFixed.call(value, length));
+}

+ 368 - 0
datadas/mydatadas/src/common/otherTools.js

@@ -0,0 +1,368 @@
+/**
+ * 一些常用的其他函数工具
+ */
+export function setBaseSize(baseSize) {
+    baseSize = Number(baseSize) || 16;
+    let fontSize = Math.round(baseSize) + 'px';
+    if (document.documentElement.style.fontSize == fontSize) return;
+    document.documentElement.style.fontSize = fontSize;
+}
+/**是否是pc端 */
+export function isPc() {
+    let userAgent = navigator.userAgent;
+    let Agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod'];
+    return !Agents.some((i) => {
+        return userAgent.includes(i);
+    });
+}
+/** 
+ * 对象属性合并(浅合并) 
+ * return obj
+ *  example 1
+ *  const needMergeFiled = [ 
+        ['name','name1'],
+    ];
+    mergeObjProperty(formData.form,clue,needMergeFiled);
+    example 2,合并所有键时才可以指定排除键,以及以待合并的对象属性为遍历对象
+    mergeObjProperty({},{a:1,b:2},{
+        mergeAll:true,
+        excludeKeyList:['a'],
+        mergeKeyList:[['test','b']],
+    });
+ */
+export function mergeObjProperty(target, fixedTarget, option = {}) {
+    let mergeKeyList = []; //需要合并的key  ['123']或者[['123']]
+    let excludeKeyList = []; //合并时需要排除的 key
+    let mergeAll = false; //是否合并fixed对象的所有key
+    if (Array.isArray(option)) {
+        mergeKeyList = option;
+    } else {
+        mergeKeyList = option.mergeKeyList || [];
+        excludeKeyList = option.excludeKeyList || [];
+        mergeAll = !!option.mergeAll;
+    }
+    if (mergeAll) {
+        const mergeKeyMap = mergeKeyList.reduce((c, item) => {
+            if (!Array.isArray(item)) {
+                item = [item];
+            }
+            const key = item[1] || item[0];
+            c[key] = item[0];
+            return c;
+        }, {});
+        Object.keys(fixedTarget).forEach((item) => {
+            if (excludeKeyList.includes(item)) return;
+            if (mergeKeyMap[item]) {
+                target[mergeKeyMap[item]] = fixedTarget[item];
+            } else {
+                target[item] = fixedTarget[item];
+            }
+        });
+    } else {
+        mergeKeyList.forEach((item) => {
+            if (!Array.isArray(item)) {
+                item = [item];
+            }
+            if (item.length == 1) {
+                target[item[0]] = fixedTarget[item[0]];
+            } else {
+                target[item[0]] = fixedTarget[item[1]];
+            }
+        });
+    }
+    return target;
+}
+/**
+ * 深度复制一个对象
+ * 最简单的实现方式
+ */
+export function deepCopyObj(obj) {
+    return JSON.parse(JSON.stringify(obj));
+}
+/**
+ * copy value
+ * 数据粘贴板复制
+ */
+export function copyValue(value) {
+    var save = function (e) {
+        e.clipboardData.setData('text/plain', value);
+        e.preventDefault(); //阻止默认行为
+    };
+    document.addEventListener('copy', save);
+    document.execCommand('copy');
+    document.removeEventListener('copy', save);
+}
+/**
+ * 数字四舍五入
+ * value:number
+ * length:number
+ */
+export function numberToFixed(value, length = 0) {
+    value = Number(value);
+    return Number(Number.prototype.toFixed.call(value, length));
+}
+/**
+ * 判断文件是否可预览
+ * @param {*} fileName
+ */
+export function getFilePreviewState(fileName) {
+    let types = fileName.split('.');
+    let type = types[types.length - 1];
+    return 'png|jpg|pdf'.indexOf(type) !== -1;
+}
+/** 是空的*/
+export function isEmpty(value) {
+    return !value && value !== 0;
+}
+/** 
+ * 根据配置信息初始化对象
+ * 如果 option 有该属性则使用该属性,没有则初始化
+ * configMap example
+ *  const configMap = {
+        //配置信息,初始化时使用
+        open: {
+            default: false,
+        },
+        title: {
+            default: '入库',
+        },
+        afterTitle: {
+            default: '',
+        },
+        isShow: {
+            //是否只是展示
+            default: false,
+        },
+    };
+ */
+export function initDataByConfig(data = {}, configOption = {}, configMap = {}) {
+    configOption = configOption || {};
+    Object.keys(configMap).forEach((key) => {
+        //初始化一些配置信息
+        if (Object.prototype.hasOwnProperty.call(configOption, key)) {
+            data[key] = configOption[key];
+        } else {
+            if (typeof configMap[key].default == 'function') {
+                data[key] = configMap[key].default();
+            } else {
+                data[key] = configMap[key].default;
+            }
+        }
+    });
+    return data;
+}
+/** 
+ * 数组分组
+ *  例子
+    let list = [{test:1},{test:2}];
+    groupList(list,['test']);  根据 test 字段分组
+ *  例子2
+    let list = [{test:1},{test:2}];
+    groupList(list,['test',(item,index)=>{return 1}],{
+        isDetailed:true,
+        groupPretreat(list){
+            list.push({});
+            return list;
+        },
+    });
+ */
+export function groupList(list = [], rule = [], options = {}) {
+    let {
+        forEach, //循环时的回调,避免使用时多次调用forEach浪费性能
+        isDetailed = false, //表示是详细的,会返回详细的数据
+        groupForEach,
+        groupPretreat,
+        groupByValue = false, //只是根据值分组,相同的值分为一组
+        reduce, //归纳,可用作统计相应数据
+        reduceValue, //初始值
+    } = options;
+    const map_ = new Map();
+    const dataList_ = [];
+    list.forEach((item, index) => {
+        if (forEach) {
+            forEach(item, index);
+        }
+        if (reduce) {
+            reduceValue = reduce(reduceValue, item, index);
+        }
+        const sign = groupByValue
+            ? item
+            : `
+            ${rule
+                .map((key) => {
+                    // 分组标识可以是数组或函数
+                    if (typeof key == 'function') {
+                        return key(item, index);
+                    }
+                    return item[key];
+                })
+                .join('--&&--')}
+        `;
+        if (map_.has(sign)) {
+            map_.get(sign).push(item);
+        } else {
+            const list_ = [];
+            list_.push(item);
+            map_.set(sign, list_);
+            dataList_.push(list_);
+        }
+    });
+    map_.clear();
+    const detailData = {
+        list: [], //平铺后的list
+        groupList: [],
+    };
+    dataList_.forEach((list, index) => {
+        if (groupForEach) {
+            groupForEach(list, index);
+        }
+        if (groupPretreat) {
+            list = groupPretreat(list, index);
+        }
+        detailData.groupList.push(list);
+        detailData.list.push(...list);
+    });
+    if (!isDetailed) return detailData.groupList;
+    return detailData;
+}
+/**
+ *
+ * 生成从minNum到maxNum的随机数
+ */
+export function randomNum(minNum, maxNum) {
+    switch (arguments.length) {
+        case 1:
+            return parseInt(Math.random() * minNum + 1, 10);
+        case 2:
+            return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
+        default:
+            return 0;
+    }
+}
+/**
+ * 加载脚本,样式
+ *  */
+export function loadScript(url, type) {
+    return new Promise((r, j) => {
+        let el;
+        switch (type) {
+            case 'css':
+                el = document.createElement('link');
+                el.rel = 'stylesheet';
+                el.href = url;
+                break;
+            case 'js':
+                el = document.createElement('script');
+                el.type = 'text/javascript';
+                el.src = url;
+                break;
+        }
+        document.head.appendChild(el);
+        el.onload = () => {
+            r();
+        };
+        el.onerror = () => {
+            j();
+        };
+    });
+}
+/** 根据链接获取网站图标 */
+export function getIcon(link) {
+    if (!link) return link;
+    let urlReg = /[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/;
+    let _list = urlReg.exec(link);
+    if (_list && _list.length > 0) {
+        return 'https://' + _list[0] + '/favicon.ico';
+    } else {
+        return link;
+    }
+}
+/** 是否是生产环境 */
+export function isProdoction() {
+    return import.meta.env.PROD;
+}
+/** 是否是生产环境 */
+export function isProd() {
+    return import.meta.env.PROD;
+}
+/**
+ * 获取dict单个数据
+ */
+export function getDictItem(dictList, value, option = {}) {
+    const { valueKey = 'value', isCongruence = false } = option;
+    return dictList.find((item) => {
+        /** 是否用全等操作 */
+        if (isCongruence) {
+            return item[valueKey] === value;
+        } else {
+            return item[valueKey] == value;
+        }
+    });
+}
+/**
+ * 获取dict的value对应的label
+ */
+export function getDictItemLabel(target, value, option = {}) {
+    const {
+        valueKey = 'value',
+        lebelKey = 'label',
+        showValue = true,
+        isCongruence = false,
+    } = option;
+    let item = getDictItem(target, value, { valueKey: valueKey, isCongruence: isCongruence });
+    if (item) {
+        return item[lebelKey];
+    } else if (showValue) {
+        //如果没找到item的化直接返回value
+        return value;
+    } else {
+        return '';
+    }
+}
+/** 全屏事件 */
+export function toggleFullScreen() {
+    var elem = document.documentElement; // 获取文档根元素
+    if (
+        !document.fullscreenElement && // 当前不在全屏模式
+        !document.mozFullScreenElement &&
+        !document.webkitFullscreenElement &&
+        !document.msFullscreenElement
+    ) {
+        // 也适用于IE/Edge
+        if (elem.requestFullscreen) {
+            elem.requestFullscreen();
+        } else if (elem.mozRequestFullScreen) {
+            // Firefox
+            elem.mozRequestFullScreen();
+        } else if (elem.webkitRequestFullscreen) {
+            // Chrome, Safari, and Opera
+            elem.webkitRequestFullscreen();
+        } else if (elem.msRequestFullscreen) {
+            // IE/Edge
+            elem.msRequestFullscreen();
+        }
+    } else {
+        // 当前在全屏模式,退出全屏
+        if (document.exitFullscreen) {
+            document.exitFullscreen();
+        } else if (document.mozCancelFullScreen) {
+            // Firefox
+            document.mozCancelFullScreen();
+        } else if (document.webkitExitFullscreen) {
+            // Chrome, Safari, and Opera
+            document.webkitExitFullscreen();
+        } else if (document.msExitFullscreen) {
+            // IE/Edge
+            document.msExitFullscreen();
+        }
+    }
+}
+/** 获取数据的类型 */
+export function getTypeOf(value) {
+    return Object.prototype.toString.call(value);
+}
+/** 去除首尾空格 */
+export function toTrim(str) {
+    str = (str || '').replace(/^\s+|\s+$/g, '');
+    return str;
+}

+ 20 - 0
datadas/mydatadas/src/common/plugInstall.js

@@ -0,0 +1,20 @@
+/**
+ * 插件安装
+ * 防止循环依赖
+ */
+
+const allPlug = {};
+
+export default {
+    /** 插件安装 */
+    install(name, instance) {
+        allPlug[name] = instance;
+    },
+    /** 卸载 */
+    unInstall(name) {
+        delete allPlug[name];
+    },
+    get(name) {
+        return allPlug[name];
+    },
+};

+ 24 - 0
datadas/mydatadas/src/common/rem.js

@@ -0,0 +1,24 @@
+/*jshint esversion: 9 */
+/*
+ * 一篇文字
+ * 全局像素计算方法,设置基础的font-size,当宽度改变时按照倍数相应改变
+ */
+
+/** 设置font-size */
+let fontSize = undefined;
+export function setRem(fontSize_) {
+    if (!fontSize_) return;
+    fontSize = fontSize_;
+    if (document.documentElement.style.fontSize == fontSize) return;
+    document.documentElement.style.fontSize = fontSize;
+}
+
+setRem();
+
+/** 计算的时机 */
+window.addEventListener('resize', () => {
+    setRem();
+});
+setInterval(() => {
+    setRem();
+}, 300);

+ 32 - 0
datadas/mydatadas/src/common/requestAnimationFrameExpand.js

@@ -0,0 +1,32 @@
+/**
+ * requestAnimationFrame兼容性扩展,两方面工作:
+ * 1、把各浏览器前缀进行统一
+ * 2、在浏览器没有requestAnimationFrame方法时将其指向setTimeout方法
+ * */
+(function () {
+    var lastTime = 0;
+    var vendors = ['webkit', 'moz', 'o', 'ms'];
+    for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+        window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
+        // Webkit中此取消方法的名字变了
+        window.cancelAnimationFrame =
+            window[vendors[x] + 'CancelAnimationFrame'] ||
+            window[vendors[x] + 'CancelRequestAnimationFrame'];
+    }
+    if (!window.requestAnimationFrame) {
+        window.requestAnimationFrame = function (callback) {
+            var currTime = new Date().getTime();
+            var timeToCall = Math.max(0, 16.7 - (currTime - lastTime));
+            var id = window.setTimeout(function () {
+                callback(currTime + timeToCall);
+            }, timeToCall);
+            lastTime = currTime + timeToCall;
+            return id;
+        };
+    }
+    if (!window.cancelAnimationFrame) {
+        window.cancelAnimationFrame = function (id) {
+            clearTimeout(id);
+        };
+    }
+})();

+ 58 - 0
datadas/mydatadas/src/common/rollTolls.js

@@ -0,0 +1,58 @@
+/*jshint esversion: 9 */
+/*
+ * 简单的页面滚动工具 一篇文字
+ */
+
+/**
+ * 从开始的位置移动到结束的位置(匀速,固定时间)
+ */
+export function simpleRoll(params = {}) {
+    let top = undefined;
+    let left = undefined;
+    /** 如果不传值则不做处理top位置 */
+    if (params.hasOwnProperty('top')) {
+        top = Number(params.top) || 0;
+    }
+    if (params.hasOwnProperty('left')) {
+        left = Number(params.left) || 0;
+    }
+    let time = Number(params.time) || 0;
+    let target = params.target;
+    if (!target) {
+        console.warn('请传入滚动容器元素');
+        return;
+    }
+    let hasLeft = left !== undefined;
+    let hasTop = top !== undefined;
+    if (!hasLeft && !hasTop) {
+        console.warn('请传入top || left值');
+        return;
+    }
+    let startTime = Date.now();
+    let scrollTop = target.scrollTop || 0;
+    let scrollLeft = target.scrollLeft || 0;
+    let lengthY = top - scrollTop;
+    let lengthX = left - scrollLeft;
+    requestAnimationFrame(function func() {
+        /** 时间进度 */
+        let schedule = (Date.now() - startTime) / time;
+        // 到达指定时间了,停止执行
+        if (schedule >= 1) {
+            if (hasLeft) {
+                target.scrollLeft = lengthX + scrollLeft;
+            }
+            if (hasTop) {
+                target.scrollTop = lengthY + scrollTop;
+            }
+            return;
+        }
+        /** 此时的位置 */
+        if (hasTop) {
+            target.scrollTop = lengthY * schedule + scrollTop;
+        }
+        if (hasLeft) {
+            target.scrollLeft = lengthX * schedule + scrollLeft;
+        }
+        requestAnimationFrame(func);
+    });
+}

+ 66 - 0
datadas/mydatadas/src/common/simpleAnimation.js

@@ -0,0 +1,66 @@
+/*jshint esversion: 9 */
+/**
+ * 简单动画,使用requestAnimationFrame每帧执行
+ */
+class Task {
+    constructor(fn) {
+        Task.symbolNumber = Task.symbolNumber || 0; //计数器,用来区分
+        Task.symbolNumber++;
+        this.func = fn;
+        this.symbol = Symbol(Task.symbolNumber);
+        if (typeof this.func === 'function') {
+            this.func(); //首次执行
+        }
+    }
+}
+const instanceList = []; //控制器实例列表
+export class TaskControl {
+    //任务控制器
+    constructor() {
+        this.taskList = [];
+        this.symbolIndex = {}; //标记索引
+        instanceList.push(this);
+    }
+    /**
+     * 添加一个任务
+     */
+    add(fn) {
+        const task = new Task(fn);
+        this.taskList.push(task);
+        this.symbolIndex[task.symbol] = task;
+        return task.symbol;
+    }
+    /**
+     * 清除一个任务
+     */
+    clear(symbol) {
+        const task = this.symbolIndex[symbol];
+        if (!task) return;
+        delete this.symbolIndex[symbol];
+        this.taskList.splice(this.taskList.indexOf(task));
+        return task.func;
+    }
+    /**
+     * 清除所有任务
+     */
+    clearAll() {
+        this.taskList = [];
+        this.symbolIndex = {};
+    }
+}
+/**
+ * 开始执行,每一帧都执行
+ */
+if (typeof requestAnimationFrame != 'undefined') {
+    requestAnimationFrame(function func() {
+        instanceList.forEach((instance) => {
+            const taskList = instance.taskList;
+            taskList.forEach((task) => {
+                let fn = task.func;
+                if (typeof fn !== 'function') return;
+                fn();
+            });
+        });
+        requestAnimationFrame(func);
+    });
+}

+ 59 - 0
datadas/mydatadas/src/common/treeTools.js

@@ -0,0 +1,59 @@
+/*jshint esversion: 9 */
+/**
+ * 用于处理目录的工具
+ */
+
+/**
+ * 将目录转换为树形结构
+ */
+export function toTree(
+    list = [],
+    option = { key: 'id', pKey: 'pid', isNew: true, childsKey: 'childs' },
+) {
+    const { key, pKey, isNew, childsKey } = option;
+    if (isNew) {
+        list = JSON.parse(JSON.stringify(list));
+    }
+    const idMap = {};
+    const tree = [];
+    list.forEach((item) => {
+        idMap[item[key]] = item;
+    });
+    list.forEach((item) => {
+        if (idMap[item[pKey]]) {
+            idMap[item[pKey]][childsKey] = idMap[item[pKey]][childsKey] || [];
+            idMap[item[pKey]][childsKey].push(item);
+        } else {
+            tree.push(item);
+        }
+    });
+    return tree;
+}
+/**
+ * 展开树形list结构为一维list
+ * @param treeList:array
+ * @param option:object
+ */
+export function unfoldTreeList(treeList, option = {}) {
+    const {
+        childsKey = 'children', //需要获取子元素的 key
+        setParentKey = 'parentId', //需要赋值的父元素 key
+        getParentKey = 'id', //获取父元素 key
+        forEachFn = null, //循环时的回调
+    } = option;
+    const deptOneList = [];
+    const deepForEach = (target) => {
+        deptOneList.push(target);
+        forEachFn && forEachFn(target);
+        if (target[childsKey]) {
+            target[childsKey].forEach((item_) => {
+                item_[setParentKey] = target[getParentKey];
+                deepForEach(item_);
+            });
+        }
+    };
+    treeList.forEach((item) => {
+        deepForEach(item);
+    });
+    return deptOneList;
+}

+ 44 - 0
datadas/mydatadas/src/common/verifiedTools.js

@@ -0,0 +1,44 @@
+/**
+ * 验证工具
+ * 用作验证数据
+ */
+
+/**
+ * verifiedData
+ * 验证一个数据的合法性
+ * data:object
+ * options:object
+ * 例子
+ *  verifiedData({number:0},{
+        number:{
+            state:true,
+            validate(value,option){
+                return true; 
+            },
+        },
+    });
+ */
+export function verifiedData(data = {}, options = {}) {
+    const failList = [];
+    if (Array.isArray(options)) {
+        options.forEach((item) => {
+            if (!item || !item.validate || !item.key) return;
+            const validateFn = item.validate;
+            if (!!validateFn(data[item.key], item)) return;
+            failList.push(item);
+        });
+    } else {
+        const keys = Object.keys(options);
+        keys.forEach((item) => {
+            const option = options[item];
+            if (!option || !option.validate) return;
+            const validateFn = option.validate;
+            if (!!validateFn(data[item], option)) return;
+            failList.push({
+                ...option,
+                key: item,
+            });
+        });
+    }
+    return failList.length == 0 ? undefined : failList;
+}

+ 5 - 0
datadas/mydatadas/src/components/README.md

@@ -0,0 +1,5 @@
+全局公共组件放置的地方
+
+组件不代表一定是需要复用的,也可以是逻辑分开,只是减少单个文件的代码数的
+
+组件提供的方法也可外部调用,灵活

+ 161 - 0
datadas/mydatadas/src/components/autoScalContainer.vue

@@ -0,0 +1,161 @@
+<template>
+    <div class="auto-scal-container" ref="AutoScalContainerRef">
+        <div ref="DomRef" class="auto-scal-container-inner">
+            <slot></slot>
+        </div>
+    </div>
+</template>
+
+<script>
+/**
+ * 自动缩放容器
+ * 使用transform进行缩放
+ *  */
+import {
+    defineComponent,
+    ref,
+    getCurrentInstance,
+    reactive,
+    toRef,
+    computed,
+    onMounted,
+    onActivated,
+    watch,
+    onBeforeUnmount,
+} from 'vue';
+
+export default defineComponent({
+    props: {
+        width: {
+            type: Number,
+            default: 1920,
+        },
+        height: {
+            type: Number,
+            default: 1080,
+        },
+        /** 内部容器的宽高比例 */
+        ratio: {
+            type: Number,
+            default: 1920 / 1080,
+        },
+        /**
+         * fit,原理同img的object-fit
+         * contain : 被替换的内容将被缩放,以在填充元素的内容框时保持其宽高比。
+         * cover : 被替换的内容在保持其宽高比的同时填充元素的整个内容框。如果对象的宽高比与内容框不相匹配,该对象将被剪裁以适应内容框。
+         *  */
+        fit: {
+            type: String,
+            default: 'contain',
+        },
+    },
+    emits: ['onResizeScreen'],
+    setup(props, { emit }) {
+        const DomRef = ref(null); //组件实例
+        const AutoScalContainerRef = ref(null); //组件实例
+        const dataContainer = reactive({
+            height: toRef(props, 'height'),
+            width: toRef(props, 'width'),
+            ratio: toRef(props, 'ratio'),
+            fit: toRef(props, 'fit'),
+        });
+        /** 是否是文档上 */
+        function isActive() {
+            if (!DomRef.value) return false;
+            return DomRef.value.getRootNode() === document;
+        }
+        /** 自动缩放 */
+        function autoResizeScreen() {
+            if (!AutoScalContainerRef.value) return;
+            if (!DomRef.value) return;
+            if (!isActive) return;
+            let rect = AutoScalContainerRef.value.getBoundingClientRect();
+            let clientWidth = rect.width;
+            let clientHeight = rect.height;
+            var width = dataContainer.width;
+            var height = dataContainer.height;
+            let left = 0;
+            let top = 0;
+            let scale = 0;
+            /** 使用外部传入的比例或者传入的宽高计算比例 */
+            let ratio = dataContainer.ratio || width / height;
+            // 获取比例  可视化区域的宽高比与 屏幕的宽高比  来进行对应屏幕的缩放
+            if (dataContainer.fit == 'contain') {
+                if (clientWidth / clientHeight > ratio) {
+                    scale = clientHeight / height;
+                    top = 0;
+                    left = (clientWidth - width * scale) / 2;
+                } else {
+                    scale = clientWidth / width;
+                    left = 0;
+                    top = (clientHeight - height * scale) / 2;
+                }
+            }
+            if (dataContainer.fit == 'cover') {
+                if (clientWidth / clientHeight > ratio) {
+                    scale = clientWidth / width;
+                } else {
+                    scale = clientHeight / height;
+                }
+            }
+            // 防止组件销毁后还执行设置状态s
+            Object.assign(DomRef.value.style, {
+                transform: `scale(${scale})`,
+                left: `${left}px`,
+                top: `${top}px`,
+            });
+            /** 向外部通知已经计算缩放 */
+            emit('onResizeScreen');
+        }
+        /** 防抖 */
+        let timer_1;
+        function fnContainer() {
+            clearTimeout(timer_1);
+            // timer_1 = setTimeout(()=>{
+            autoResizeScreen();
+            // },16);
+        }
+        let timer = setInterval(() => {
+            fnContainer();
+        }, 300);
+        onMounted(() => {
+            autoResizeScreen();
+        });
+        window.addEventListener('resize', fnContainer);
+        onBeforeUnmount(() => {
+            window.removeEventListener('resize', fnContainer);
+            window.clearInterval(timer);
+        });
+        return {
+            dataContainer,
+            DomRef,
+            AutoScalContainerRef,
+        };
+    },
+});
+</script>
+
+<style lang="scss" scoped>
+.auto-scal-container {
+    width: 100%;
+    height: 100%;
+    position: relative;
+    overflow: auto;
+    /** 隐藏滚动条 */
+    -ms-overflow-style: none;
+    scrollbar-width: none;
+    &::-webkit-scrollbar {
+        display: none;
+    }
+    > .auto-scal-container-inner {
+        overflow: hidden;
+        transform-origin: left top;
+        z-index: 999;
+        width: max-content;
+        height: max-content;
+        position: absolute;
+        top: 0;
+        left: 0;
+    }
+}
+</style>

+ 172 - 0
datadas/mydatadas/src/components/autoScalContainerV2.vue

@@ -0,0 +1,172 @@
+<template>
+    <div class="auto-scal-container" ref="AutoScalContainerRef">
+        <div ref="DomRef" class="auto-scal-container-inner">
+            <slot></slot>
+        </div>
+    </div>
+</template>
+
+<script>
+/**
+ * 自动缩放容器,改变宽高进行缩放
+ * 容器内显示指定的比例
+ *  */
+import {
+    defineComponent,
+    ref,
+    getCurrentInstance,
+    reactive,
+    toRef,
+    computed,
+    onMounted,
+    onActivated,
+    watch,
+    onBeforeUnmount,
+} from 'vue';
+
+export default defineComponent({
+    props: {
+        width: {
+            type: Number,
+            default: 1920,
+        },
+        height: {
+            type: Number,
+            default: 1080,
+        },
+        /** 内部容器的宽高比例 */
+        ratio: {
+            type: Number,
+            default: 1920 / 1080,
+        },
+        /**
+         * fit,原理同img的object-fit
+         * contain : 被替换的内容将被缩放,以在填充元素的内容框时保持其宽高比。
+         * cover : 被替换的内容在保持其宽高比的同时填充元素的整个内容框。如果对象的宽高比与内容框不相匹配,该对象将被剪裁以适应内容框。
+         *  */
+        fit: {
+            type: String,
+            default: 'contain',
+        },
+    },
+    emits: ['onResizeScreen'],
+    setup(props, { emit }) {
+        const DomRef = ref(null); //组件实例
+        const AutoScalContainerRef = ref(null); //组件实例
+        const dataContainer = reactive({
+            height: toRef(props, 'height'),
+            width: toRef(props, 'width'),
+            ratio: toRef(props, 'ratio'),
+            fit: toRef(props, 'fit'),
+        });
+        /** 是否是文档上 */
+        function isActive() {
+            if (!DomRef.value) return false;
+            return DomRef.value.getRootNode() === document;
+        }
+        /** 自动缩放 */
+        function autoResizeScreen() {
+            if (!AutoScalContainerRef.value) return;
+            if (!DomRef.value) return;
+            if (!isActive) return;
+            let rect = AutoScalContainerRef.value.getBoundingClientRect();
+            let clientWidth = rect.width;
+            let clientHeight = rect.height;
+            let width = dataContainer.width;
+            let height = dataContainer.height;
+            let domWidth = 0;
+            let domHeight = 0;
+            let domTop = 0;
+            let domLeft = 0;
+            /** 使用外部传入的比例或者传入的宽高计算比例 */
+            let ratio = dataContainer.ratio || width / height;
+            // 获取比例  可视化区域的宽高比与 屏幕的宽高比  来进行对应屏幕的缩放
+            if (dataContainer.fit == 'contain') {
+                if (clientWidth / clientHeight > ratio) {
+                    domHeight = clientHeight;
+                    domWidth = ratio * domHeight;
+                    domTop = 0;
+                    domLeft = (clientWidth - domWidth) / 2;
+                } else {
+                    domWidth = clientWidth;
+                    domHeight = domWidth / ratio;
+                    domTop = (clientHeight - domHeight) / 2;
+                    domLeft = 0;
+                }
+            }
+            if (dataContainer.fit == 'cover') {
+                if (clientWidth / clientHeight > ratio) {
+                    domWidth = clientWidth;
+                    domHeight = domWidth / ratio;
+                } else {
+                    domHeight = clientHeight;
+                    domWidth = ratio * domHeight;
+                }
+            }
+            // 防止组件销毁后还执行设置状态s
+            Object.assign(DomRef.value.style, {
+                width: `${domWidth}px`,
+                height: `${domHeight}px`,
+                top: `${domTop}px`,
+                left: `${domLeft}px`,
+            });
+            /** 向外部通知已经计算缩放 */
+            emit('onResizeScreen', {
+                width: domWidth,
+                height: domHeight,
+            });
+        }
+        /** 防抖 */
+        let timer_1;
+        function fnContainer() {
+            clearTimeout(timer_1);
+            // timer_1 = setTimeout(()=>{
+            autoResizeScreen();
+            // },16);
+        }
+        let timer = setInterval(() => {
+            fnContainer();
+        }, 300);
+        onMounted(() => {
+            autoResizeScreen();
+        });
+        window.addEventListener('resize', fnContainer);
+        onBeforeUnmount(() => {
+            window.removeEventListener('resize', fnContainer);
+            window.clearInterval(timer);
+        });
+        return {
+            dataContainer,
+            DomRef,
+            AutoScalContainerRef,
+        };
+    },
+});
+</script>
+
+<style lang="scss" scoped>
+.auto-scal-container {
+    width: 100%;
+    height: 100%;
+    position: relative;
+    display: flex;
+    justify-content: flex-start;
+    align-items: flex-start;
+    overflow: auto;
+    /** 隐藏滚动条 */
+    -ms-overflow-style: none;
+    scrollbar-width: none;
+    &::-webkit-scrollbar {
+        display: none;
+    }
+    > .auto-scal-container-inner {
+        position: absolute;
+        overflow: hidden;
+        transform-origin: left top;
+        width: 0;
+        height: 0;
+        top: 0;
+        left: 0;
+    }
+}
+</style>

+ 97 - 0
datadas/mydatadas/src/components/cropperImg.vue

@@ -0,0 +1,97 @@
+<script>
+/**
+ * 头像裁剪组件,由外部传入配置,然后将裁剪数据向外部抛出
+ * https://www.npmjs.com/package/cropperjs
+ *  */
+import {
+    defineComponent,
+    ref,
+    getCurrentInstance,
+    reactive,
+    toRef,
+    computed,
+    onMounted,
+    onActivated,
+    watch,
+    nextTick,
+} from 'vue';
+import Cropper from 'cropperjs';
+import 'cropperjs/dist/cropper.css';
+
+export default defineComponent({
+    name: 'CropperImg',
+    emits: ['onCrop'],
+    setup(_, { emit }) {
+        const ImgRef = ref(null);
+        const dataContainer = reactive({
+            imgUrl: '',
+        });
+        const otherDataContainer = {
+            imgCanvas: null,
+            cropperInstance: null,
+        };
+        /**
+         * 初始化数据
+         * 由外部调用,传入配置
+         *  */
+        function initData(option) {
+            option = option || {};
+            if (!ImgRef.value) return;
+            dataContainer.imgUrl = option.imgUrl;
+            /** 如果已经初始化了则销毁 */
+            if (otherDataContainer.cropperInstance) {
+                otherDataContainer.cropperInstance.destroy();
+            }
+            nextTick(() => {
+                let timer;
+                let cropperInstance = new Cropper(ImgRef.value, {
+                    aspectRatio: 1 / 1,
+                    viewMode: 1, // 设置裁剪框的显示模式
+                    ...option,
+                    crop(event) {
+                        /** 添加防抖,防止卡顿 */
+                        clearTimeout(timer);
+                        timer = setTimeout(() => {
+                            otherDataContainer.imgCanvas = cropperInstance.getCroppedCanvas();
+                            /** 向外部抛出 */
+                            emit('onCrop', {
+                                canvas: otherDataContainer.imgCanvas,
+                            });
+                        }, 30);
+                    },
+                });
+                otherDataContainer.cropperInstance = cropperInstance;
+                window.test = cropperInstance;
+            });
+        }
+        return {
+            dataContainer,
+            ImgRef,
+            initData,
+        };
+    },
+});
+</script>
+
+<template>
+    <div class="cropper-img-cp-container">
+        <img class="img" ref="ImgRef" :src="dataContainer.imgUrl" />
+    </div>
+</template>
+
+<style lang="scss" scoped>
+.cropper-img-cp-container {
+    width: 100%;
+    max-width: 100%;
+    height: 100%;
+    background-color: rgb(241, 241, 241);
+    > .img {
+        width: 100%;
+        max-width: 100%;
+        height: 100%;
+        max-height: 100%;
+        display: block;
+        object-fit: contain;
+    }
+}
+</style>

+ 267 - 0
datadas/mydatadas/src/components/definDropdown.vue

@@ -0,0 +1,267 @@
+<script>
+/*
+ * 自定义下拉菜单
+ */
+import { defineComponent, ref, reactive, toRef, onUnmounted } from 'vue';
+
+export default defineComponent({
+    name: 'DefinDropdown',
+    components: {},
+    props: {
+        /** 是否显示下拉菜单 */
+        show: {
+            type: Boolean,
+            default: false,
+        },
+        ifLeftClick: {
+            type: Boolean,
+            default: true,
+        },
+        targetQuery: {
+            type: String,
+            default: '.target',
+        },
+        position: {
+            type: String,
+            default: 'outside,bottom,end', // 分为 inside and outside
+        },
+    },
+    emits: ['onOtherClick', 'onClick'],
+    setup(props, { emit }) {
+        const DefinDropTargetRef = ref(null);
+        const DefinDropContainerRef = ref(null);
+        const dataContainer = reactive({
+            show: toRef(props, 'show'),
+            targetQuery: toRef(props, 'targetQuery'),
+            position: toRef(props, 'position'),
+            ifLeftClick: toRef(props, 'ifLeftClick'),
+            location: {},
+        });
+        const otherContainer = {
+            activeTarget: null,
+        };
+        /** 鼠标点击事件 */
+        function handleClick(e, ifLeftClick = true) {
+            if (dataContainer.ifLeftClick != ifLeftClick) return;
+            if (!e || !e.target) return;
+            if (!DefinDropTargetRef.value) return;
+            if (!DefinDropContainerRef.value) return;
+            let el = DefinDropTargetRef.value;
+            let targetList = el.querySelectorAll(dataContainer.targetQuery); //.可用于操作的目标
+            let target; //被点击的目标
+            targetList.forEach((item) => {
+                if (item.contains(e.target) || e.target == item) {
+                    target = item;
+                }
+            });
+            if (!target) return;
+            let rect = el.getBoundingClientRect();
+            let rect_1 = target.getBoundingClientRect();
+            let rect_2 = DefinDropContainerRef.value.getBoundingClientRect();
+            let position = dataContainer.position;
+            let location = {
+                x: rect_1.x - rect.x,
+                y: rect_1.y - rect.y,
+            };
+            if (position == 'outside,top,start') {
+                location.y = location.y - rect_2.height;
+                location.x = location.x;
+            }
+            if (position == 'outside,top,end') {
+                location.y = location.y - rect_2.height;
+                location.x = location.x - rect_2.width + rect_1.width;
+            }
+            if (position == 'outside,right,start') {
+                location.y = location.y;
+                location.x = location.x + rect_1.width;
+            }
+            if (position == 'outside,right,end') {
+                location.y = location.y - rect_2.height + rect_1.height;
+                location.x = location.x + rect_1.width;
+            }
+            if (position == 'outside,bottom,start') {
+                location.y = location.y + rect_1.height;
+                location.x = location.x;
+            }
+            if (position == 'outside,bottom,end') {
+                location.y = location.y + rect_1.height;
+                location.x = location.x - rect_2.width + rect_1.width;
+            }
+            if (position == 'outside,left,start') {
+                location.y = location.y;
+                location.x = location.x - rect_2.width;
+            }
+            if (position == 'outside,left,end') {
+                location.y = location.y - rect_2.height + rect_1.height;
+                location.x = location.x - rect_2.width;
+            }
+            if (position == 'inside,top,right') {
+                location.y = location.y;
+                location.x = location.x - rect_2.width + rect_1.width;
+            }
+            if (position == 'inside,right,bottom') {
+                location.y = location.y - rect_2.height + rect_1.height;
+                location.x = location.x - rect_2.width + rect_1.width;
+            }
+            if (position == 'inside,bottom,left') {
+                location.y = location.y - rect_2.height + rect_1.height;
+                location.x = location.x;
+            }
+            if (position == 'inside,left,top') {
+                location.y = location.y;
+                location.x = location.x;
+            }
+            DefinDropContainerRef.value.style.top = location.y + 'px';
+            DefinDropContainerRef.value.style.left = location.x + 'px';
+            /** 保证触发在全局点击事件后 */
+            setTimeout(() => {
+                otherContainer.activeTarget = target;
+                emit('onClick');
+            }, 0);
+        }
+        /** 初始化隐藏事件 */
+        function initHiddenEvent() {
+            function callbackFn(e) {
+                if (!dataContainer.show) return;
+                if (!DefinDropTargetRef.value) return;
+                if (!DefinDropContainerRef.value) return;
+                if (!e || !e.target) return;
+                if (
+                    !DefinDropTargetRef.value.contains(e.target) &&
+                    !DefinDropContainerRef.value.contains(e.target)
+                ) {
+                    emit('onOtherClick');
+                    return;
+                }
+                let el = DefinDropTargetRef.value;
+                let targetList = el.querySelectorAll(dataContainer.targetQuery); //.可用于操作的目标
+                let target; //被点击的目标
+                targetList.forEach((item) => {
+                    if (item.contains(e.target) || e.target == item) {
+                        target = item;
+                    }
+                });
+                if (!target || otherContainer.activeTarget != target) {
+                    emit('onOtherClick');
+                    return;
+                }
+            }
+            document.addEventListener('click', callbackFn);
+            onUnmounted(() => {
+                document.removeEventListener('click', callbackFn);
+            });
+        }
+        initHiddenEvent();
+        return {
+            dataContainer,
+            DefinDropTargetRef,
+            handleClick,
+            DefinDropContainerRef,
+        };
+    },
+});
+</script>
+
+<template>
+    <div class="defin-drop">
+        <div
+            class="defin-drop-target"
+            ref="DefinDropTargetRef"
+            @click="handleClick"
+            @contextmenu.prevent="
+                (e) => {
+                    handleClick(e, false);
+                }
+            "
+        >
+            <slot></slot>
+        </div>
+        <div
+            ref="DefinDropContainerRef"
+            :class="{
+                'defin-drop-container': true,
+                show: dataContainer.show,
+            }"
+        >
+            <div class="defin-drop-container-a">
+                <slot name="dropdown"></slot>
+            </div>
+        </div>
+    </div>
+</template>
+
+<style scoped lang="scss">
+.defin-drop {
+    position: relative;
+    pointer-events: none;
+    > .defin-drop-target {
+        pointer-events: initial;
+    }
+    > .defin-drop-container {
+        top: 0;
+        right: 0;
+        position: absolute;
+        pointer-events: none;
+        width: fit-content;
+        height: fit-content;
+        &.show {
+            :deep(.defin-drop-container-a) {
+                opacity: 1 !important;
+                pointer-events: initial !important;
+                transform: scale(1) !important;
+            }
+        }
+        :deep(.defin-drop-container-a) {
+            opacity: 0;
+            transition: transform 0.2s, opacity 0.2s;
+            transform: scale(0);
+            width: fit-content;
+            height: fit-content;
+        }
+    }
+    :deep(.bt-list-container) {
+        min-width: 150px;
+        display: flex;
+        flex-direction: column;
+        width: max-content;
+        background-color: #1f1f23;
+        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4), 0 0px 4px rgba(0, 0, 0, 0.4);
+        padding: 0px 0;
+        box-sizing: border-box;
+        border-radius: 8px;
+        border: 1px solid #ffffff1d;
+        overflow: hidden;
+        > .item {
+            min-width: 150px;
+            display: flex;
+            flex-direction: row;
+            justify-content: flex-start;
+            align-items: center;
+            padding: 17px 25px;
+            box-sizing: border-box;
+            font-size: 13px;
+            font-weight: bold;
+            cursor: pointer;
+            transition: all 0.2s;
+            color: rgb(206, 206, 206);
+            border-bottom: 1px solid #ffffff1d;
+            border-left: none;
+            border-right: none;
+            line-height: 1;
+            > * {
+                margin-right: 15px;
+            }
+            &:hover {
+                background-color: rgba(145, 145, 162, 0.17);
+                color: #007fff;
+            }
+            &:last-child {
+                border-bottom: none;
+            }
+            &.logout {
+                color: #c95050;
+            }
+        }
+    }
+}
+</style>

+ 376 - 0
datadas/mydatadas/src/components/definScrollbar.vue

@@ -0,0 +1,376 @@
+<script>
+/**
+ * 自定义的滚动条
+ * 可以记录滚动位置
+ */
+import {
+    defineComponent,
+    ref,
+    reactive,
+    onActivated,
+    toRef,
+    nextTick,
+    onMounted,
+    onUnmounted,
+} from 'vue';
+import { simpleRoll } from '@/common/rollTolls';
+import { throttleFn } from '@/common/debounceAndThrottle';
+import simplebar from 'simplebar-vue';
+import 'simplebar-vue/dist/simplebar.min.css';
+
+export default defineComponent({
+    components: {
+        simplebar,
+    },
+    props: {
+        /** 是否显示回到顶部按钮 */
+        showUpBt: {
+            type: Boolean,
+            default: false,
+        },
+        /** 加载状态 */
+        loading: {
+            type: Boolean,
+            default: false,
+        },
+        /** 内容被遮挡时的阴影 */
+        showMask: {
+            type: Boolean,
+            default: true,
+        },
+        maskShadowColor: {
+            type: String,
+            default: '#0000006b',
+        },
+    },
+    emits: ['onScroll'],
+    setup(props, { emit }) {
+        const DefinScrollbarRef = ref(null); //组件实例
+        const dataContainer = reactive({
+            showUpBt: toRef(props, 'showUpBt'),
+            loading: toRef(props, 'loading'),
+            showMask: toRef(props, 'showMask'),
+            maskShadowColor: toRef(props, 'maskShadowColor'),
+            show: false,
+        });
+        const otherDataContainer = {
+            top: 0, //记录滚动条
+            left: 0,
+            target: null, //滚动容器元素
+        };
+        /** 页面加载好了找出滚动容器 */
+        onMounted(() => {
+            if (!DefinScrollbarRef.value) return;
+            let wrapRef = DefinScrollbarRef.value.querySelector('.simplebar-content-wrapper');
+            if (!wrapRef) return;
+            otherDataContainer.target = wrapRef;
+            wrapRef.addEventListener('scroll', handleScroll);
+        });
+        /** 重新加载时候赋予旧值 */
+        onActivated(() => {
+            nextTick(() => {
+                if (!otherDataContainer.target) return;
+                otherDataContainer.target.scrollTop = otherDataContainer.top || 0;
+                otherDataContainer.target.scrollLeft = otherDataContainer.left || 0;
+            });
+        });
+        /** 处理样式 */
+        const handleStyle = throttleFn(function () {
+            if (!DefinScrollbarRef.value) return;
+            if (!otherDataContainer.target) return;
+            if (!dataContainer.showMask) return;
+            let element = DefinScrollbarRef.value;
+            element.classList.remove('show-top', 'show-left', 'show-bottom', 'show-right');
+            let el = otherDataContainer.target;
+            let scrollRight = el.scrollWidth - el.clientWidth - el.scrollLeft;
+            let scrollBottom = el.scrollHeight - el.clientHeight - el.scrollTop;
+            /** 表示左边被遮挡 */
+            if (el.scrollLeft > 0) {
+                element.classList.add('show-left');
+            }
+            /** 表示右边边被遮挡 */
+            if (scrollRight > 0) {
+                element.classList.add('show-right');
+            }
+            /** 表示上边被遮挡 */
+            if (el.scrollTop > 0) {
+                element.classList.add('show-top');
+            }
+            /** 表示下边边被遮挡 */
+            if (scrollBottom > 0) {
+                element.classList.add('show-bottom');
+            }
+        }, 70);
+        let timer = setInterval(() => {
+            handleStyle();
+        }, 500);
+        onUnmounted(() => {
+            clearInterval(timer);
+        });
+        /** 滚动事件 */
+        function handleScroll(e) {
+            if (!e || !e.target) return;
+            e = e.target;
+            /**
+             * 控制回到顶部按钮得显示
+             * 大于一定阈值并且向下滚动才显示
+             *  */
+            if (e.scrollTop > 40 && e.scrollTop > otherDataContainer.top) {
+                dataContainer.show = true;
+            } else {
+                dataContainer.show = false;
+            }
+            otherDataContainer.top = e.scrollTop || 0;
+            otherDataContainer.left = e.scrollLeft || 0;
+            /** 向外部抛出事件 */
+            emit('onScroll', e);
+            /** 添加自定义class */
+            handleStyle();
+        }
+        /** 回到顶部事件 */
+        function handleUp() {
+            if (!otherDataContainer.target) return;
+            let wrapRef = otherDataContainer.target;
+            if (!wrapRef) return;
+            simpleRoll({
+                top: 0,
+                time: 150,
+                target: wrapRef,
+            });
+        }
+        /** 滚动到某一位置params {left:0,top:0} */
+        function handleTo(params) {
+            if (!otherDataContainer.target) return;
+            let wrapRef = otherDataContainer.target;
+            if (!wrapRef) return;
+            simpleRoll(
+                Object.assign(
+                    {
+                        target: wrapRef,
+                    },
+                    params,
+                ),
+            );
+        }
+        return {
+            dataContainer,
+            DefinScrollbarRef,
+            handleScroll,
+            handleUp,
+            handleTo,
+        };
+    },
+});
+</script>
+
+<template>
+    <div
+        :style="{
+            '--shadow-color-1': dataContainer.maskShadowColor,
+        }"
+        ref="DefinScrollbarRef"
+        class="defin-scrollbar"
+    >
+        <simplebar class="defin-scrollbar-simplebar">
+            <slot></slot>
+        </simplebar>
+        <div v-if="dataContainer.showMask" class="top"></div>
+        <div v-if="dataContainer.showMask" class="right"></div>
+        <div v-if="dataContainer.showMask" class="bottom"></div>
+        <div v-if="dataContainer.showMask" class="left"></div>
+        <div
+            v-if="dataContainer.showUpBt"
+            @click="handleUp"
+            :class="{
+                'scrollbar-up-bt': true,
+                show: dataContainer.show,
+            }"
+        >
+            UP
+        </div>
+        <div
+            :class="{
+                'loading-v-el': true,
+                'no-show': dataContainer.loading,
+            }"
+        >
+            <div class="title">LOADING...</div>
+            <div class="loading"></div>
+        </div>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+.defin-scrollbar {
+    position: relative;
+    width: 100%;
+    height: 100%;
+    --mask-size: 5px;
+    --shadow-color-1: #0000006b;
+    &.show-left {
+        > .left {
+            opacity: 1;
+        }
+    }
+    &.show-right {
+        > .right {
+            opacity: 1;
+        }
+    }
+    &.show-top {
+        > .top {
+            opacity: 1;
+        }
+    }
+    &.show-bottom {
+        > .bottom {
+            opacity: 1;
+        }
+    }
+    > .left,
+    > .right,
+    > .top,
+    > .bottom {
+        pointer-events: none;
+        position: absolute;
+        opacity: 0;
+        transition: opacity 0.2s;
+        z-index: 999;
+    }
+    > .top {
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: var(--mask-size);
+        background-image: linear-gradient(to bottom, var(--shadow-color-1), transparent);
+    }
+    > .right {
+        top: 0;
+        right: 0;
+        width: var(--mask-size);
+        height: 100%;
+        background-image: linear-gradient(to right, transparent, var(--shadow-color-1));
+    }
+    > .bottom {
+        bottom: 0;
+        left: 0;
+        width: 100%;
+        height: var(--mask-size);
+        background-image: linear-gradient(to bottom, transparent, var(--shadow-color-1));
+    }
+    > .left {
+        top: 0;
+        left: 0;
+        width: var(--mask-size);
+        height: 100%;
+        background-image: linear-gradient(to right, var(--shadow-color-1), transparent);
+    }
+    :deep(.defin-scrollbar-simplebar) {
+        width: 100%;
+        height: 100%;
+        .simplebar-vertical {
+            width: 12px;
+        }
+        .simplebar-scrollbar:before {
+            border-radius: 2px !important;
+            background-color: rgb(0, 0, 0);
+        }
+    }
+    > .scrollbar-up-bt {
+        position: absolute;
+        z-index: 999;
+        bottom: 3vw;
+        right: 3vw;
+        width: 40px;
+        height: 40px;
+        background-color: #282828;
+        border-radius: 5px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        line-height: 1;
+        opacity: 0;
+        pointer-events: none;
+        transition: all 0.2s;
+        cursor: pointer;
+        color: rgb(25, 137, 250);
+        font-size: 20px;
+        font-weight: bold;
+        font-family: serif;
+        box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.667);
+        &.show {
+            opacity: 1;
+            pointer-events: initial;
+        }
+        &:hover {
+            transform: scale(1.1);
+        }
+    }
+    > .loading-v-el {
+        position: absolute;
+        top: 0;
+        left: 0;
+        height: 100%;
+        width: 100%;
+        z-index: 999;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        overflow: hidden;
+        color: #dde1e4;
+        pointer-events: none;
+        transition: all 0.3s;
+        opacity: 0;
+        &.no-show {
+            opacity: 0.2;
+        }
+    }
+    > .loading-v-el .title {
+        position: absolute;
+        font-size: 20px;
+        font-family: Source Han Serif CN;
+        font-weight: bold;
+        letter-spacing: 5px;
+        transform: translateY(100px);
+        font-style: italic;
+    }
+    > .loading-v-el .loading {
+        position: absolute;
+    }
+    > .loading-v-el .loading {
+        width: 8px;
+        height: 100px;
+        border-radius: 4px;
+        display: inline-block;
+        position: relative;
+        background: currentColor;
+        color: #dde1e4;
+        animation: loading-animation 0.3s 0.3s linear infinite alternate;
+    }
+    > .loading-v-el .loading::after,
+    > .loading-v-el .loading::before {
+        content: '';
+        width: 8px;
+        height: 100px;
+        border-radius: 4px;
+        background: currentColor;
+        position: absolute;
+        top: 50%;
+        transform: translateY(-50%);
+        left: 80px;
+        animation: loading-animation 0.3s 0.45s linear infinite alternate;
+    }
+    > .loading-v-el .loading::before {
+        left: -80px;
+        animation-delay: 0s;
+    }
+    @keyframes loading-animation {
+        0% {
+            height: 100px;
+        }
+        100% {
+            height: 4.8px;
+        }
+    }
+}
+</style>

+ 95 - 0
datadas/mydatadas/src/components/dictTags.vue

@@ -0,0 +1,95 @@
+<template>
+    <div class="dict-tags">
+        <div
+            v-for="(item, index) in values"
+            :key="index"
+            :style="{
+                marginRight: values.length > 0 ? '5px' : '',
+            }"
+            class="item"
+        >
+            <span v-if="item.elTagType == 'default' || !item.elTagType" :class="item.elTagType">
+                {{ item[dataContainer.labelKey] }}
+            </span>
+            <el-tag
+                v-else
+                :disable-transitions="true"
+                :type="item.elTagType === 'primary' ? '' : item.elTagType"
+                :class="item.elTagType"
+            >
+                {{ item[dataContainer.labelKey] }}
+            </el-tag>
+        </div>
+    </div>
+</template>
+
+<script>
+/** 根据options 展示value为tag形式 */
+import { defineComponent, ref, reactive, toRef, computed } from 'vue';
+
+export default defineComponent({
+    name: 'DictTags',
+    props: {
+        options: {
+            // 列表数据
+            type: Array,
+            default: [],
+        },
+        value: {
+            // 当前的值
+            type: [Number, String, Array, Boolean],
+            default: '',
+        },
+        valueKey: {
+            type: String,
+            default: 'value',
+        },
+        labelKey: {
+            type: String,
+            default: 'label',
+        },
+    },
+    setup(props) {
+        const dataContainer = reactive({
+            options: toRef(props, 'options'),
+            value: toRef(props, 'value'),
+            valueKey: toRef(props, 'valueKey'),
+            labelKey: toRef(props, 'labelKey'),
+        });
+        const values = computed(() => {
+            if (Array.isArray(dataContainer.value)) {
+                return dataContainer.options.filter((item) => {
+                    return dataContainer.value.includes(item[dataContainer.valueKey]);
+                });
+            } else {
+                const data = dataContainer.options.find(
+                    (item) => item[dataContainer.valueKey] == dataContainer.value,
+                );
+                return data
+                    ? [data]
+                    : [
+                          {
+                              [dataContainer.labelKey]: dataContainer.value,
+                              elTagType: '',
+                          },
+                      ];
+            }
+        });
+        return {
+            dataContainer,
+            values,
+        };
+    },
+});
+</script>
+
+<style lang="scss" scoped>
+.dict-tags {
+    > .item {
+        display: inline;
+        :deep(.el-tag) {
+            margin-right: 5px;
+        }
+    }
+}
+</style>

+ 181 - 0
datadas/mydatadas/src/components/difinCollapse.vue

@@ -0,0 +1,181 @@
+<template>
+    <div class="collapse-el">
+        <div ref="CollapseElRef" class="collapse-el-container">
+            <div class="collapse-el-container-container">
+                <slot></slot>
+            </div>
+        </div>
+        <div v-if="showBt" class="collapse-el-show-container">
+            <div @click="handleClick" class="container">
+                <div
+                    :class="{
+                        bt: true,
+                        show: show,
+                    }"
+                >
+                    <SvgIcon :style="'width:15px;height:15px;'" name="svg:sort-down.svg"></SvgIcon>
+                </div>
+                {{ show ? '收缩' : '展开' }}
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+/**
+ * 折叠组件
+ */
+import { defineComponent, ref, toRef, onMounted, watch, onBeforeUnmount } from 'vue';
+import SvgIcon from '@/components/svgIcon/index.vue';
+
+export default defineComponent({
+    name: 'Collapse',
+    components: {
+        SvgIcon,
+    },
+    props: {
+        show: {
+            //是否显示
+            type: Boolean,
+            default: true,
+        },
+        showBt: {
+            //是否显示展开按钮
+            type: Boolean,
+            default: false,
+        },
+        anchorPointSignName: {
+            //锚点标识(可用querySelector查询出来的标识)
+            type: String,
+            default: '.anchor-point-target',
+        },
+    },
+    emits: ['onClick'],
+    setup(props, { emit }) {
+        const CollapseElRef = ref(null);
+        const show = toRef(props, 'show');
+        const showBt = toRef(props, 'showBt');
+        const anchorPointSignName = toRef(props, 'anchorPointSignName');
+        onMounted(() => {
+            const childEl = CollapseElRef.value.firstChild;
+            const resizeObserver = new ResizeObserver((entries) => {
+                computHeight();
+            });
+            resizeObserver.observe(childEl);
+        });
+        let timer = null;
+        watch(
+            show,
+            (newValue) => {
+                computHeight();
+            },
+            {
+                immediate: false,
+            },
+        );
+        /** 表示是显示的 */
+        function isActive() {
+            if (!CollapseElRef.value) return false;
+            const elRect = CollapseElRef.value.getBoundingClientRect();
+            if (elRect.top == 0 && elRect.bottom == 0 && elRect.left == 0 && elRect.right == 0)
+                return false;
+            return true;
+        }
+        /** 设置显示高度 */
+        function computHeight() {
+            clearTimeout(timer);
+            timer = setTimeout(() => {
+                if (!isActive()) return;
+                if (show.value) {
+                    const childHight =
+                        CollapseElRef.value.firstChild.getBoundingClientRect().height;
+                    CollapseElRef.value.style.height = childHight + 'px';
+                } else {
+                    //如果是隐藏的话找出锚点元素
+                    const anchorPointEl = CollapseElRef.value.querySelector(
+                        anchorPointSignName.value,
+                    );
+                    if (!anchorPointEl) {
+                        CollapseElRef.value.style.height = 0 + 'px';
+                    } else {
+                        //表示只隐藏到锚点元素
+                        const parentRect = CollapseElRef.value.getBoundingClientRect();
+                        const anchorPointElRect = anchorPointEl.getBoundingClientRect();
+                        const height =
+                            anchorPointElRect.y - parentRect.y + anchorPointElRect.height;
+                        CollapseElRef.value.style.height = height + 'px';
+                    }
+                }
+            }, 26);
+        }
+        onBeforeUnmount(() => {
+            clearTimeout(timer);
+        });
+        /** 收缩组件点击事件,向外部抛出 */
+        function handleClick() {
+            emit('onClick');
+        }
+        return {
+            CollapseElRef,
+            show,
+            showBt,
+            handleClick,
+        };
+    },
+});
+</script>
+
+<style lang="scss" scoped>
+.collapse-el {
+    position: relative;
+    width: 100%;
+    height: auto;
+    > .collapse-el-container {
+        position: relative;
+        width: 100%;
+        overflow: hidden;
+        transition: all 0.2s;
+        height: 0;
+        > .collapse-el-container-container {
+            position: absolute;
+            top: 0;
+            left: 0;
+            width: 100%;
+            height: fit-content;
+        }
+    }
+    > .collapse-el-show-container {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        position: absolute;
+        bottom: -7.5px;
+        left: 0;
+        width: 100%;
+        pointer-events: none;
+        > .container {
+            width: fit-content;
+            height: fit-content;
+            cursor: pointer;
+            display: flex;
+            align-items: center;
+            font-size: 12px;
+            opacity: 0.5;
+            pointer-events: initial;
+            line-height: 1;
+            > .bt {
+                width: 15px;
+                height: 15px;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                transition: all 0.2s;
+                transform: rotate(0deg);
+                &.show {
+                    transform: rotate(180deg);
+                }
+            }
+        }
+    }
+}
+</style>

+ 110 - 0
datadas/mydatadas/src/components/echartContainer.vue

@@ -0,0 +1,110 @@
+<script>
+/**
+ * echart容器
+ * 外部只关心写入配置
+ * 组件关心的是自身大小的适应以及实例的销毁,以及提供一些常用的方法让外部调用
+ */
+import {
+    defineComponent,
+    ref,
+    getCurrentInstance,
+    reactive,
+    nextTick,
+    computed,
+    onUnmounted,
+    onActivated,
+    onMounted,
+} from 'vue';
+import * as echarts from 'echarts';
+
+export default defineComponent({
+    name: 'EchartContainer',
+    setup() {
+        const ChartRef = ref(null);
+        const ChartCpRef = ref(null);
+        const otherContainer = {
+            optionData: {},
+            myChart: '',
+        };
+        /**
+         * 初始化数据(外部调用)
+         * 外部只关心图标的option数据,写入就行
+         *  */
+        function initData(data) {
+            otherContainer.optionData = data;
+            initChart();
+        }
+        /** 重新计算图表大小 */
+        function resizeChart() {
+            if (otherContainer.myChart) {
+                otherContainer.myChart.resize();
+            }
+        }
+        /** 当元素大小发生变化时 */
+        if (typeof ResizeObserver === 'function') {
+            let resizeObserver = new ResizeObserver(() => {
+                if (!ChartCpRef.value) return;
+                resizeChart();
+            });
+            onMounted(() => {
+                resizeObserver.observe(ChartCpRef.value);
+            });
+        }
+        /** 当屏幕缩放时 */
+        window.addEventListener('resize', resizeChart);
+        onUnmounted(() => {
+            window.removeEventListener('resize', resizeChart);
+            disposeChart();
+        });
+        onActivated(() => {
+            resizeChart();
+        });
+        /** 初始化图表 */
+        function initChart() {
+            if (otherContainer.myChart) {
+                // 使用之前的图表
+                otherContainer.myChart.setOption(otherContainer.optionData);
+                otherContainer.myChart.resize();
+            } else {
+                otherContainer.myChart = echarts.init(ChartRef.value, null, {
+                    renderer: 'svg',
+                });
+                otherContainer.myChart.setOption(otherContainer.optionData, true);
+            }
+        }
+        /**
+         * 销毁图表  (外部可调用)
+         *  */
+        function disposeChart() {
+            /** 销毁元素 */
+            if (otherContainer.myChart) {
+                otherContainer.myChart.dispose();
+                otherContainer.myChart = '';
+            }
+        }
+        return {
+            ChartRef,
+            initData,
+            disposeChart,
+            ChartCpRef,
+        };
+    },
+});
+</script>
+
+<template>
+    <div ref="ChartCpRef" class="chart-cp-container">
+        <div class="chart" ref="ChartRef"></div>
+    </div>
+</template>
+
+<style lang="scss" scoped>
+.chart-cp-container {
+    width: 100%;
+    height: 100%;
+    > .chart {
+        width: 100%;
+        height: 100%;
+    }
+}
+</style>

+ 92 - 0
datadas/mydatadas/src/components/iconSlect.vue

@@ -0,0 +1,92 @@
+<template>
+    <el-autocomplete
+        v-model="iconName"
+        :fetch-suggestions="getIconDataList"
+        style="width: 100%"
+        :disabled="dataContainer.isShow"
+        :hide-loading="true"
+        popper-class="icon-select-cp-item"
+        placeholder=""
+    >
+        <!-- autocomplete suggestions -->
+        <template #suffix>
+            <SvgIcon :style="'width:20px;height:20px;'" :name="iconName"></SvgIcon>
+        </template>
+        <template #default="defaultData">
+            <div class="item">
+                <SvgIcon
+                    :style="'width:15px;height:15px;margin-right:10px;'"
+                    :name="defaultData.item.value"
+                ></SvgIcon>
+                {{ defaultData.item.value }}
+            </div>
+        </template>
+    </el-autocomplete>
+</template>
+
+<script>
+/**
+ * icon选择组件
+ */
+import { defineComponent, ref, getCurrentInstance, reactive, nextTick, computed, toRef } from 'vue';
+import SvgIcon from '@/components/svgIcon/index.vue';
+import { iconList } from '@/components/svgIcon/common.js';
+
+export default defineComponent({
+    name: 'IconSelect',
+    components: {
+        SvgIcon,
+    },
+    props: {
+        name: {
+            type: String,
+            default: '',
+        },
+        isShow: {
+            type: Boolean,
+            default: false,
+        },
+    },
+    emits: ['change'],
+    setup(props, { emit }) {
+        const dataContainer = reactive({
+            isShow: toRef(props, 'isShow'),
+            name: toRef(props, 'name'),
+        });
+        const iconName = computed({
+            get() {
+                return dataContainer.name;
+            },
+            set(value) {
+                emit('change', value);
+            },
+        });
+        /** 获取icon */
+        function getIconDataList(value, callback) {
+            callback(
+                iconList.map((item) => {
+                    return {
+                        value: item.name,
+                    };
+                }),
+            );
+        }
+        return {
+            dataContainer,
+            iconName,
+            getIconDataList,
+        };
+    },
+});
+</script>
+
+<style lang="scss" scoped>
+.icon-select-cp-item {
+    .item {
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        justify-content: flex-start;
+    }
+}
+</style>

+ 74 - 0
datadas/mydatadas/src/components/keepAliveRouter.vue

@@ -0,0 +1,74 @@
+<script>
+/**
+ * keep-alive保存router-view
+ */
+import { defineComponent, h, toRef } from 'vue';
+
+export default defineComponent({
+    name: 'KeepAliveRouter',
+    props: {
+        cacheList: {
+            type: Array,
+            default: () => {
+                return [];
+            },
+        },
+    },
+    setup(props) {
+        /**
+         * 需要缓存的页面列表
+         * 根据标签列表来的,需要改的话只需要处理标签列表
+         *  */
+        const cacheList = toRef(props, 'cacheList');
+        /**
+         * 原本方法根据组件名来缓存,现在根据路由path动态修改组件实例名称来缓存
+         * 添加tag时也根据路由path来命名
+         * 该实例其实也是组件对象(并没有解决问题)
+         * 解决方法文章 https://blog.csdn.net/qq_42611074/article/details/127206469
+         */
+        const wrapperMap = new Map();
+        function formatComponentInstance(component, route) {
+            let wrapper;
+            // 重点就是这里,这个组件的名字是完全可控的,
+            // 只要自己写好逻辑,每次能找到对应的外壳组件就行,完全可以写成任何自己想要的名字
+            // 这就能配合 keep-alive 的 include 属性可控地操作缓存
+            if (!component) return;
+            /** 根据路由的path来为组件命名 */
+            const wrapperName = route.path;
+            if (wrapperMap.has(wrapperName)) {
+                wrapper = wrapperMap.get(wrapperName);
+            } else {
+                wrapper = {
+                    name: wrapperName,
+                    render() {
+                        return h(component);
+                    },
+                };
+                wrapperMap.set(wrapperName, wrapper);
+            }
+            /** 以标签页为主,清除不需要的,减少内存 */
+            let pathList = cacheList.value || [];
+            wrapperMap.forEach((_, key) => {
+                if (pathList.includes(key)) return;
+                if (key == wrapperName) return; //当前新加的不处理
+                wrapperMap.delete(key);
+            });
+            return h(wrapper);
+        }
+        return {
+            formatComponentInstance,
+            cacheList,
+        };
+    },
+});
+</script>
+
+<template>
+    <router-view v-slot="{ Component, route }">
+        <!-- <transition name="el-fade-in"> -->
+        <keep-alive :include="cacheList">
+            <component :is="formatComponentInstance(Component, route)" />
+        </keep-alive>
+        <!-- </transition> -->
+    </router-view>
+</template>

+ 163 - 0
datadas/mydatadas/src/components/myTabs.vue

@@ -0,0 +1,163 @@
+<template>
+    <div
+        class="my-tabs"
+        ref="MyTabsRef"
+        :style="{
+            gridTemplateColumns:
+                dataContainer.tabLength > 0
+                    ? `repeat(${dataContainer.tabLength},${
+                          gridStyle == 'equal' ? '1fr' : 'max-content'
+                      })`
+                    : '',
+        }"
+    >
+        <slot></slot>
+        <div
+            v-show="
+                dataContainer.show &&
+                dataContainer.activeIndex >= 0 &&
+                dataContainer.activeIndex < dataContainer.tabLength
+            "
+            ref="ItemBgRef"
+            class="my-tabs-active-item-bg"
+        ></div>
+    </div>
+</template>
+<script>
+/*
+ * 标签切换按钮组件
+ * 提供类名供外部调整
+ */
+import {
+    defineComponent,
+    ref,
+    reactive,
+    computed,
+    onMounted,
+    watch,
+    toRef,
+    onUnmounted,
+} from 'vue';
+
+export default {
+    name: 'MyTabs',
+    props: {
+        activeIndex: {
+            //当前选择的index
+            type: Number,
+            default: 0,
+        },
+        tabLength: {
+            //可切换的tab length
+            type: Number,
+            default: 0,
+        },
+        gridStyle: {
+            //布局样式,等宽或自动
+            type: String,
+            default: 'equal',
+        },
+    },
+    setup(props) {
+        const MyTabsRef = ref(null);
+        const ItemBgRef = ref(null);
+        const dataContainer = reactive({
+            show: false,
+            timer: '',
+            activeIndex: toRef(props, 'activeIndex'),
+            tabLength: toRef(props, 'tabLength'),
+            gridStyle: toRef(props, 'gridStyle'),
+        });
+        /** 是否活跃 */
+        function isActive() {
+            const el = MyTabsRef.value;
+            if (!el) return false;
+            let react = el.getBoundingClientRect();
+            /** 元素被隐藏了也不计算 */
+            if (!react.width && !react.height) return false;
+            return el.getRootNode() === document;
+        }
+        /** 计算位置 */
+        function computedLocation() {
+            const MyTabsEl = MyTabsRef.value;
+            if (!MyTabsEl) return;
+            if (!isActive()) return;
+            const ItemEls = new Array(...MyTabsEl.children);
+            if (!ItemEls) return;
+            ItemEls.pop();
+            dataContainer.show = ItemEls.length > 0;
+            const ItemBgEl = ItemBgRef.value;
+            if (!ItemBgEl) return;
+            if (dataContainer.activeIndex < 0 || dataContainer.activeIndex >= ItemEls.length)
+                return;
+            let left = ItemEls[dataContainer.activeIndex].offsetLeft;
+            let top = ItemEls[dataContainer.activeIndex].offsetTop;
+            let transform = `translate(${left}px, ${top}px)`;
+            let width = ItemEls[dataContainer.activeIndex].clientWidth + 'px';
+            let height = ItemEls[dataContainer.activeIndex].clientHeight + 'px';
+            if (ItemBgEl.style.transform != transform) {
+                ItemBgEl.style.transform = transform;
+            }
+            if (ItemBgEl.style.width != width) {
+                ItemBgEl.style.width = width;
+            }
+            if (ItemBgEl.style.height != height) {
+                ItemBgEl.style.height = height;
+            }
+        }
+        watch(props, () => {
+            computedLocation();
+        });
+        onMounted(() => {
+            computedLocation();
+            /** 监听元素宽高变化 */
+            let timer;
+            window.addEventListener('resize', () => {
+                clearTimeout(timer);
+                timer = setTimeout(() => {
+                    computedLocation();
+                }, 150);
+            });
+            dataContainer.timer = setInterval(() => {
+                computedLocation();
+            }, 150);
+        });
+        onUnmounted(() => {
+            clearInterval(dataContainer.timer);
+        });
+        return {
+            MyTabsRef,
+            ItemBgRef,
+            dataContainer,
+        };
+    },
+};
+</script>
+<style scoped lang="scss">
+.my-tabs {
+    --my-tabs-padding: 3px;
+    --my-tabs-border-radius: 5px;
+    width: fit-content;
+    height: fit-content;
+    padding: var(--my-tabs-padding);
+    box-sizing: border-box;
+    background-color: rgb(240, 242, 245);
+    border-radius: var(--my-tabs-border-radius);
+    list-style: none;
+    display: grid;
+    position: relative;
+    z-index: 0;
+    > .my-tabs-active-item-bg {
+        position: absolute;
+        height: 0;
+        width: 0;
+        top: 0;
+        left: 0;
+        border-radius: var(--my-tabs-border-radius);
+        transition: transform 0.3s, width 0.3s, height 0.3s;
+        background-color: rgba(0, 132, 255, 0.08);
+        pointer-events: none;
+        z-index: -1;
+    }
+}
+</style>

+ 74 - 0
datadas/mydatadas/src/components/shadowHtml.vue

@@ -0,0 +1,74 @@
+<script>
+/**
+ * 影子dom 展示html组件
+ */
+import {
+    defineComponent,
+    ref,
+    getCurrentInstance,
+    reactive,
+    nextTick,
+    computed,
+    toRef,
+    onMounted,
+    watch,
+} from 'vue';
+import { debounceFn } from '@/common/debounceAndThrottle';
+
+export default defineComponent({
+    props: {
+        htmlValue: {
+            type: String,
+            default: '',
+        },
+        cssValue: {
+            type: String,
+            default: '',
+        },
+    },
+    setup(props) {
+        const ShadowHtmlRef = ref(null);
+        const dataContainer = reactive({
+            htmlValue: toRef(props, 'htmlValue'),
+            cssValue: toRef(props, 'cssValue'),
+        });
+        let shadowDom;
+        function initData() {
+            shadowDom = ShadowHtmlRef.value.attachShadow({ mode: 'closed' });
+        }
+        onMounted(() => {
+            initData();
+        });
+        /** 开始渲染html */
+        const drawHtml = debounceFn(function () {
+            let htmlValue = dataContainer.htmlValue;
+            let cssValue = dataContainer.cssValue;
+            if (!shadowDom) return;
+            htmlValue = formateHtml(htmlValue);
+            shadowDom.innerHTML = `
+                <style>${cssValue || ''}</style>
+                ${htmlValue || ''}
+            `;
+        }, 300);
+        /** 格式化html,防止脚本标签 */
+        function formateHtml(value) {
+            if (!value) return '';
+            let reg = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi; //生成相关正则信息
+            value = value.replace(reg, ''); //忽略大小写的正则
+            return value;
+        }
+        watch(props, () => {
+            drawHtml();
+        });
+        drawHtml();
+        return {
+            ShadowHtmlRef,
+            dataContainer,
+        };
+    },
+});
+</script>
+
+<template>
+    <div class="shadow-html" ref="ShadowHtmlRef"></div>
+</template>

+ 10 - 0
datadas/mydatadas/src/components/svgIcon/README.md

@@ -0,0 +1,10 @@
+### 自定义的icon组件
+
+使用svg,和png,jpg格式资源,使用文件名字访问该文件。
+
+注意,为了区分icon的类型,可以放置到特定文件夹内,icon名使用文件夹名称path,例如放入到sys文件夹中的test.svg,你只能使用sys/test去访问该icon
+
+其中 svgs 文件夹中放置svg资源,引入以字符串形式引入,一次性全部引入。
+其中 imgs 文件夹中放置图片jpg,png,svg资源,引入以资源链接形式引入,可以保持图片色彩,减少加载时间。
+
+png转svg可以使用其他插件转换

+ 45 - 0
datadas/mydatadas/src/components/svgIcon/common.js

@@ -0,0 +1,45 @@
+/**
+ * 读取所有imgs下的svg文件
+ * 根据文件名区分
+ */
+
+/** 读取所有svg文件为字符串 */
+const svgIconObj = import.meta.glob('./svgs/**/*.svg', {
+    eager: true,
+    as: 'raw',
+});
+const svgIconList = Object.keys(svgIconObj).map((item) => {
+    let name = item.replace('./svgs/', 'svg:');
+    return {
+        type: 'svg',
+        name: name,
+        svg: svgIconObj[item],
+    };
+});
+/** 读取所有以资源引入的文件 */
+const imgIconObj = import.meta.glob('./imgs/**/*.*', {
+    eager: true,
+});
+const imgIconList = Object.keys(imgIconObj).map((item) => {
+    let name = item.replace('./imgs/', 'img:');
+    item = imgIconObj[item];
+    if (!item) return {};
+    let src = item.default;
+    return {
+        type: 'img',
+        name: name,
+        src: src,
+    };
+});
+
+/**
+ * 导出所有的icon
+ */
+export const iconList = [...svgIconList, ...imgIconList];
+/**
+ * 导出所有的icon name map 方便使用
+ */
+export const iconNameMap = iconList.reduce((c, i) => {
+    c.set(i.name, i);
+    return c;
+}, new Map());

File diff suppressed because it is too large
+ 0 - 0
datadas/mydatadas/src/components/svgIcon/imgs/baidu.svg


+ 1 - 0
datadas/mydatadas/src/components/svgIcon/imgs/behance.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M367.0016 530.29376H280.81152v98.7136H367.0016c7.48032 0 59.9296-2.44736 59.9296-47.5136 0-45.1328-41.216-51.2-59.9296-51.2zM684.3904 461.48096c-57.92768 0-67.4304 55.5776-67.4304 59.2384h126.86848c-3.93728-18.4832-20.57728-59.2384-59.43808-59.2384zM412.7488 435.18976c0-37.5808-48.72192-40.2432-56.192-40.2432H281.6v84.1216h82.4576c11.2384-0.01024 48.6912-6.3232 48.6912-43.8784z" fill="#2196F3" /><path d="M849.92 51.2H174.08c-67.8656 0-122.88 55.0144-122.88 122.88v675.84c0 67.8656 55.0144 122.88 122.88 122.88h675.84c67.8656 0 122.88-55.0144 122.88-122.88V174.08c0-67.8656-55.0144-122.88-122.88-122.88z m-261.12 281.58976h179.2v51.2h-179.2v-51.2z m-204.16 358.42048H204.8V332.81536h172.3392c18.70848 0 119.8848-1.2032 119.8848 91.39712 0 49.22368-33.74592 65.83808-48.7168 73.1392 22.4768 7.3216 63.68256 28.05248 63.68256 91.41248 0.01024 98.19648-112.37376 102.4256-127.34976 102.44608z m303.7184-55.552c15.872 0 27.7504-3.75808 39.64928-11.1616 11.87328-7.4496 15.85152-14.82752 19.81952-22.25664h67.39968c-11.8784 29.64992-27.71968 51.90656-51.5584 66.71872-23.78752 14.84288-51.57888 22.2208-83.27168 22.2208-19.84 0-39.68-3.71712-59.49952-11.16672-15.87712-7.4496-31.71328-18.4832-43.60192-29.61408-11.89888-11.0592-19.84-25.91744-27.7504-44.44672-7.97184-14.80192-11.9552-37.0688-11.9552-55.57248 0-18.47296 7.39328-140.8 146.7904-140.8 99.73248 0 126.84288 77.824 130.84672 96.384 3.96288 18.56 3.96288 34.9952 3.96288 57.2416h-202.24c0.01024 22.25664 11.85792 72.45312 71.40864 72.45312z" fill="#2196F3" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/imgs/facebook-messenger.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M481.28 404.48l-153.6 168.96 138.24-76.8 76.8 76.8L696.32 404.48 558.08 481.28z" fill="#448AFF" /><path d="M849.92 51.2H174.08c-67.8656 0-122.88 55.0144-122.88 122.88V849.92c0 67.8656 55.0144 122.88 122.88 122.88H849.92c67.8656 0 122.88-55.0144 122.88-122.88V174.08c0-67.8656-55.0144-122.88-122.88-122.88zM512 757.76c-27.64288 0-55.296-4.60288-79.87712-10.75712L312.32 819.2V682.49088C255.48288 631.80288 220.16 561.15712 220.16 481.28c0-152.064 130.56-276.48 291.84-276.48s291.84 124.416 291.84 276.48c0 152.06912-130.56 276.48-291.84 276.48z" fill="#448AFF" /></svg>

File diff suppressed because it is too large
+ 0 - 0
datadas/mydatadas/src/components/svgIcon/imgs/gaode.svg


+ 1 - 0
datadas/mydatadas/src/components/svgIcon/imgs/gitee.svg

@@ -0,0 +1 @@
+<svg t="1709889684813" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4284" width="128" height="128"><path d="M512 512m-494.933333 0a494.933333 494.933333 0 1 0 989.866666 0 494.933333 494.933333 0 1 0-989.866666 0Z" fill="#C71D23" p-id="4285"></path><path d="M762.538667 457.045333h-281.088a24.4736 24.4736 0 0 0-24.439467 24.405334v61.098666c-0.034133 13.5168 10.922667 24.439467 24.405333 24.439467h171.1104c13.5168 0 24.439467 10.922667 24.439467 24.439467v12.219733a73.3184 73.3184 0 0 1-73.3184 73.3184h-232.209067a24.439467 24.439467 0 0 1-24.439466-24.439467v-232.174933a73.3184 73.3184 0 0 1 73.3184-73.3184h342.152533c13.482667 0 24.405333-10.922667 24.439467-24.439467l0.034133-61.098666a24.405333 24.405333 0 0 0-24.405333-24.439467H420.352a183.296 183.296 0 0 0-183.296 183.296V762.538667c0 13.482667 10.922667 24.439467 24.405333 24.439466h360.516267a164.9664 164.9664 0 0 0 165.000533-165.000533v-140.526933a24.439467 24.439467 0 0 0-24.439466-24.439467z" fill="#FFFFFF" p-id="4286"></path></svg>

二進制
datadas/mydatadas/src/components/svgIcon/imgs/logo.png


+ 1 - 0
datadas/mydatadas/src/components/svgIcon/imgs/tengxunQQ.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M849.92 51.2H174.08c-67.8656 0-122.88 55.0144-122.88 122.88v675.84c0 67.8656 55.0144 122.88 122.88 122.88h675.84c67.8656 0 122.88-55.0144 122.88-122.88V174.08c0-67.8656-55.0144-122.88-122.88-122.88z m-86.67136 658.17088c-13.824 1.6896-53.8368-63.27808-53.8368-63.27808 0 37.5552-19.3536 86.62528-61.2864 122.10688 20.1984 6.2208 65.81248 23.04 54.98368 41.3184-8.7552 14.8224-150.67648 9.4464-191.60576 4.83328-40.9344 4.608-182.85056 9.984-191.60576-4.83328-10.8288-18.3552 34.7136-35.0976 54.9888-41.3184-41.92768-35.39968-61.2864-84.47488-61.2864-122.10688 0 0-40.00768 64.96768-53.83168 63.27808-6.4512-0.76288-14.8992-35.55328 11.2128-119.64928 12.288-39.62368 26.3424-72.57088 48.14848-126.94016-3.6864-140.30336 54.29248-257.95584 192.37376-257.95584 136.54528 0 195.82976 115.34848 192.45056 257.95584 21.7344 54.2976 35.8656 87.47008 48.1536 126.94016 26.11712 84.01408 17.66912 118.80448 11.14112 119.64928z" fill="#0099FF" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/imgs/test-1.svg

@@ -0,0 +1 @@
+<svg t="1699584254836" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1520" width="64" height="64"><path d="M95.8976 254.6688m93.4912 0l644.9152 0q93.4912 0 93.4912 93.4912l0 488.0896q0 93.4912-93.4912 93.4912l-644.9152 0q-93.4912 0-93.4912-93.4912l0-488.0896q0-93.4912 93.4912-93.4912Z" fill="#FFAC3E" p-id="1521"></path><path d="M716.8 371.1488a43.9296 43.9296 0 0 1-43.9296-43.9296V177.5104a7.2704 7.2704 0 0 0-7.936-5.8368H349.8496a7.2192 7.2192 0 0 0-7.8848 5.8368v149.7088a43.9296 43.9296 0 0 1-87.8592 0V177.5104a94.8736 94.8736 0 0 1 95.744-93.696h315.0848a94.8736 94.8736 0 0 1 95.7952 93.696v149.7088a43.9296 43.9296 0 0 1-43.9296 43.9296z" fill="#FFAC3E" p-id="1522"></path><path d="M827.5456 254.6688H196.1472a100.2496 100.2496 0 0 0-100.2496 100.2496v240.9472h831.8976V354.9184a100.2496 100.2496 0 0 0-100.2496-100.2496z" fill="#FF7C0E" p-id="1523"></path><path d="M576.3584 747.52H457.472a72.1408 72.1408 0 0 1-72.0896-72.0896V509.1328a72.192 72.192 0 0 1 72.0896-72.0896h118.8864a72.192 72.192 0 0 1 72.0896 72.0896v166.144A72.1408 72.1408 0 0 1 576.3584 747.52z m-108.5952-82.4832h98.304v-145.664h-98.304z" fill="#FFFFFF" p-id="1524"></path></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/imgs/twitter.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M849.92 51.2H174.08c-67.8656 0-122.88 55.0144-122.88 122.88v675.84c0 67.8656 55.0144 122.88 122.88 122.88h675.84c67.8656 0 122.88-55.0144 122.88-122.88V174.08c0-67.8656-55.0144-122.88-122.88-122.88z m-93.65504 336.5888a317.0816 317.0816 0 0 1 0.4352 16.11776c0 165.16096-126.8224 355.53792-358.656 355.53792-71.14752 0-137.4208-20.72064-193.24416-56.05888a248.6272 248.6272 0 0 0 30.04928 1.7664 254.80704 254.80704 0 0 0 156.56448-53.45792c-55.13728-1.08544-101.67808-37.28384-117.71392-86.79424 7.67488 1.37216 15.616 2.29888 23.74656 2.29888a124.6208 124.6208 0 0 0 33.13152-4.50048c-57.61024-11.47904-101.08416-61.94176-101.08416-122.54208v-1.46432c17.02912 9.216 36.48512 14.96064 57.15456 15.59552-33.85856-22.49728-56.064-60.66688-56.064-104.03328 0-22.81472 6.14912-44.43648 17.06496-62.90432a359.2192 359.2192 0 0 0 259.80416 130.62144 125.37344 125.37344 0 0 1-3.29216-28.50816c0-68.97664 56.42752-124.91264 126.05952-124.91264 36.24448 0 68.96128 15.0784 91.88864 39.40352 28.73344-5.5296 55.7312-16.0256 80.09728-30.30528-9.40032 29.12768-29.42464 53.7856-55.48032 69.24288 25.62048-3.1488 49.8944-9.82016 72.47872-19.82464a247.84384 247.84384 0 0 1-62.94016 64.72192z" fill="#03A9F4" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/imgs/vk.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M849.92 51.2H174.08c-67.8656 0-122.88 55.0144-122.88 122.88v675.84c0 67.8656 55.0144 122.88 122.88 122.88h675.84c67.8656 0 122.88-55.0144 122.88-122.88V174.08c0-67.8656-55.0144-122.88-122.88-122.88z m-55.58784 652.8h-67.01056c-25.40544 0-33.44384-25.1392-77.7216-76.8-38.4-44.81024-58.30144-51.2-68.05504-51.2-13.66016 0-18.33984 3.40992-18.37568 23.9104v76.07808c0 17.08032-4.39296 28.01152-47.35488 28.01152-70.912 0-151.0144-47.98976-211.80928-131.2C220.16 458.0608 204.8 358.272 204.8 339.8144c0-10.24 3.2512-19.8144 22.784-19.8144h67.65568c16.92672 0 23.42912 7.5264 29.93152 27.3408 30.02368 100.6592 74.88 177.44896 97.65888 177.44896 8.45312 0 12.36992-4.09088 12.36992-26.61888V405.42208c-2.6112-47.83616-25.6-51.9424-25.6-69.01248 0-8.2176 5.4272-16.41472 15.85152-16.41472h119.00928c14.31552 0 18.74432 8.192 18.74432 25.9584v132.74112c0 15.0272 11.43808 20.50048 15.96928 20.50048 8.44288 0 16.37888 0.41472 32-16 48.14336-56.704 89.9328-142.6944 89.9328-142.6944 4.5568-10.2656 12.35456-20.50048 29.29152-20.50048h67.01056c15.0016 0 21.376 6.72768 21.76 15.99488 0.15872 3.20512-0.40448 6.784-1.59232 10.6496-8.448 40.9856-95.06816 162.6112-94.4128 162.6112-3.68128 6.28736-6.13888 10.79808-6.36416 15.52896-0.24064 4.51072 1.57696 9.22112 6.36416 15.8976 7.14752 10.25024 22.6816 29.0816 38.43072 48.10752 28.416 34.35008 51.19488 70.38976 56.1664 85.14048 1.0496 4.0192 1.51552 7.6288 1.42848 10.85952-0.3584 12.68224-9.28768 19.21024-24.8576 19.21024z" fill="#1976D2" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/imgs/vue.svg

@@ -0,0 +1 @@
+<svg t="1700200552953" class="icon" viewBox="0 0 1323 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4079" width="64" height="64"><path d="M949.797101 0H1187.246377L593.623188 1024 0 0h454.121739L593.623188 237.449275 730.156522 0h219.640579z" fill="#41B883" p-id="4080"></path><path d="M0 0l593.623188 1024L1187.246377 0h-237.449276L593.623188 614.4 234.481159 0H0z" fill="#41B883" p-id="4081"></path><path d="M234.481159 0L593.623188 617.368116 949.797101 0h-219.640579L593.623188 237.449275 454.121739 0H234.481159z" fill="#35495E" p-id="4082"></path></svg>

File diff suppressed because it is too large
+ 0 - 0
datadas/mydatadas/src/components/svgIcon/imgs/wangyiyunyinle.svg


+ 1 - 0
datadas/mydatadas/src/components/svgIcon/imgs/whatsapp.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M849.92 51.2H174.08c-67.8656 0-122.88 55.0144-122.88 122.88v675.84c0 67.8656 55.0144 122.88 122.88 122.88h675.84c67.8656 0 122.88-55.0144 122.88-122.88V174.08c0-67.8656-55.0144-122.88-122.88-122.88z m-337.90464 768.01024h-0.11776c-55.12704-0.02048-109.20448-14.81216-156.35456-42.80832l-11.23328-6.65088-116.27008 30.47936 31.04768-113.31072-7.31648-11.6224A306.42176 306.42176 0 0 1 204.8 511.85152c0.0768-169.3184 137.8816-307.06176 307.31264-307.06176 82.06848 0.02048 159.1808 32.00512 217.18528 90.05056 58.0096 58.04544 89.91744 135.21408 89.90208 217.26208-0.06144 169.34912-137.86112 307.10784-307.18464 307.10784z" fill="#40C351" /><path d="M680.4992 589.2096c-9.23136-4.62848-54.64064-26.96192-63.10912-30.0288s-14.6176-4.608-20.79232 4.62848c-6.15424 9.23136-23.84384 30.03904-29.24032 36.18816-5.39136 6.1696-10.7776 6.94784-20.01408 2.31936-9.22112-4.63872-38.96832-14.37184-74.26048-45.82912-27.44832-24.46848-45.9776-54.69696-51.37408-63.94368-5.39136-9.22624-0.58368-14.22848 4.04992-18.8416 4.1472-4.1472 9.22624-10.78272 13.85984-16.1792 4.61312-5.39136 6.15424-9.24672 9.22624-15.39584 3.07712-6.17472 1.536-11.56096-0.77824-16.1792-2.2784-4.6336-20.224-50.29888-28.4416-68.56192-6.912-15.37536-14.19264-15.68768-20.79232-15.96416-5.39136-0.2304-11.54048-0.21504-17.69472-0.21504-6.14912 0-16.1536 2.31936-24.6272 11.56608-8.46848 9.24672-32.3328 31.57504-32.3328 77.00992 0 45.44 33.09056 89.344 37.70368 95.50336 4.61312 6.14912 63.89248 102.36928 157.75232 139.392 78.0032 30.76096 93.89056 24.64768 110.82752 23.11168 16.94208-1.53088 54.64064-22.31808 62.33088-43.89888 7.69536-21.56032 7.69536-40.0384 5.39648-43.88864-2.31424-3.86048-8.46336-6.15424-17.6896-10.79296z" fill="#40C351" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/imgs/zhihu.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M656.90624 724.29056l47.42144-33.72544h52.68992V344.89856h-143.31904v346.7264h35.82976z" fill="#0066FF" /><path d="M849.92 51.2H174.08c-67.8656 0-122.88 55.0144-122.88 122.88v675.84c0 67.8656 55.0144 122.88 122.88 122.88h675.84c67.8656 0 122.88-55.0144 122.88-122.88V174.08c0-67.8656-55.0144-122.88-122.88-122.88zM495.66208 803.34848l-101.1712-157.05088 44.26752-31.616 67.45088 98.00704c-0.00512 0 23.17824 37.99552-10.5472 90.65984z m38.99392-276.10112v25.2928H408.19712C357.61152 876.06784 204.8 807.04512 204.8 807.04512c140.16512-109.86496 142.7968-254.50496 142.7968-254.50496H208.49152c0-57.9584 52.16256-56.91392 52.16256-56.91392h93.79328v-151.7568h-50.5856C284.89728 429.2352 204.8 425.02144 204.8 425.02144s32.67072-50.5856 54.79936-137.00096c22.12864-86.42048 89.5744-76.928 89.5744-76.928-20.0192 35.82976-29.50656 76.928-29.50656 76.928H485.12c40.04864 0 37.9392 25.2928 37.9392 25.2928v29.51168H411.35616v152.8064H503.04c33.72544 0 31.616 31.616 31.616 31.616zM819.2 747.49952h-102.22592l-88.51968 55.84896-8.42752-55.84896h-64.29184V288.01536H819.2v459.48416z" fill="#0066FF" /></svg>

+ 81 - 0
datadas/mydatadas/src/components/svgIcon/index.vue

@@ -0,0 +1,81 @@
+<template>
+    <div class="svg-icon" v-show="iconData.name" :style="dataContainer.style">
+        <div class="icon-container-svg" v-if="iconData.type == 'svg'" v-html="iconData.svg"></div>
+        <img
+            class="icon-container-img"
+            v-if="iconData.type == 'img'"
+            :src="iconData.src"
+            :alt="iconData.name"
+        />
+    </div>
+</template>
+
+<script>
+/**
+ * 自定义的icon组件
+ * 外部可传入需要使用的icon的名称,注意是全名
+ */
+import { defineComponent, ref, reactive, toRef, computed } from 'vue';
+import { iconNameMap } from './common.js';
+
+export default defineComponent({
+    name: 'SvgIcon',
+    props: {
+        name: {
+            // icon 名称
+            type: String,
+            default: '',
+        },
+        style: {
+            // icon 对应的样式
+            type: String,
+            default: '',
+        },
+    },
+    setup(props) {
+        const dataContainer = reactive({
+            name: toRef(props, 'name'),
+            style: toRef(props, 'style'),
+        });
+        /** icon 个体数据 */
+        const iconData = computed(() => {
+            return iconNameMap.get(dataContainer.name) || {};
+        });
+        return {
+            dataContainer,
+            iconData,
+        };
+    },
+});
+</script>
+
+<style lang="scss" scoped>
+.svg-icon {
+    width: 20px;
+    height: 20px;
+    line-height: 1;
+    > .icon-container-svg {
+        width: 100%;
+        height: 100%;
+        :deep(svg) {
+            object-fit: cover;
+            height: 100%;
+            width: 100%;
+            // vertical-align: bottom;
+            display: block;
+            fill: currentColor;
+            /** 所有的颜色都使用外部的color属性 */
+            path {
+                fill: currentColor;
+            }
+        }
+    }
+    > .icon-container-img {
+        // vertical-align: bottom;
+        display: block;
+        height: 100%;
+        width: 100%;
+        object-fit: cover;
+    }
+}
+</style>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/Directory-tree.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M213.312 682.688v170.624h469.312V768H1024v256h-341.312l-0.064-85.376H128v-256h85.312zM1024 384v256h-341.312l-0.064-85.376h-341.12V469.376h341.12V384H1024z m-85.312 85.312H768v85.376h170.688V469.312zM1024 0v256h-341.312l-0.064-85.376H213.312v170.688H128v-256h554.624V0H1024z m-85.312 85.312H768v85.376h170.688V85.312z m-170.688 768v85.376h170.688v-85.376H768z m-768-512h341.312v341.376H0V341.312z m85.312 85.376v170.624H256V426.688H85.312z" fill="#181818" /></svg>

+ 3 - 0
datadas/mydatadas/src/components/svgIcon/svgs/Navbar-full.svg

@@ -0,0 +1,3 @@
+<svg t="1697598663799" 
+    class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4016" 
+    width="25" height="25"><path d="M170.666667 170.666667v213.333333H85.333333V85.333333h298.666667v85.333334H170.666667z m682.666666 213.333333V170.666667h-213.333333V85.333333h298.666667v298.666667h-85.333334zM170.666667 640v213.333333h213.333333v85.333334H85.333333v-298.666667h85.333334z m682.666666 0h85.333334v298.666667h-298.666667v-85.333334h213.333333v-213.333333z" fill="#2E2F30" p-id="4017"></path></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/aligncenter-fill.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M460.16 1024V0h103.68v1024H460.16zM64 577.152h896v296.32H64v-296.32z m89.6-426.688h716.8v296.32H153.6v-296.32z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/alignleft-fill.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M85.312 0v1024H0V0h85.312zM1024 256H170.688V0H1024v256z m0 768H170.688v-256H1024v256z m-170.688-384H170.688V384h682.624v256z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/alignright-fill.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M938.688 1024V0H1024v1024h-85.312zM0 768h853.312v256H0v-256zM0 0h853.312v256H0V0z m170.688 384h682.624v256H170.688V384z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/all-fill.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h469.312v469.312H0V0z m0 554.688h469.312V1024H0V554.688zM554.688 0H1024v469.312H554.688V0z m0 554.688H1024V1024H554.688V554.688z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/all.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M85.312 85.312V384H384V85.312H85.312zM0 0h469.312v469.312H0V0z m0 554.688h469.312V1024H0V554.688zM85.312 640v298.688H384V640H85.312zM554.688 0H1024v469.312H554.688V0zM640 85.312V384h298.688V85.312H640zM554.688 554.688H1024V1024H554.688V554.688zM640 640v298.688h298.688V640H640z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/arrow-left.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M263.232 576L640 931.84 554.24 1024 0 515.392 549.952 0 640 98.88 270.4 448H1024v128H263.232z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/arrow-right.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M760.768 576L384 931.84 469.76 1024 1024 515.392 474.048 0 384 98.88 753.6 448H0v128h760.768z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/borderbottom-fill.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M0 938.688h1024V1024H0v-85.312zM256 0v853.312H0V0h256z m768 0v853.312h-256V0h256z m-384 170.688v682.624H384V170.688h256z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/bordertop-fill.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M1024 85.312H0V0h1024v85.312zM768 1024V170.688h256V1024h-256zM0 1024V170.688h256V1024H0z m384-170.688V170.688h256v682.624H384z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/borderverticle-fill.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M0 460.16h1024v103.68H0V460.16zM446.848 64v896h-296.32V64h296.32z m426.688 89.6v716.8h-296.32V153.6h296.32z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/cat-code.svg

@@ -0,0 +1 @@
+<svg t="1698658386579" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6449" width="64" height="64"><path d="M877.19 151.588L927 144.42v481.433l-2.542 7.15a622.398 622.398 0 0 1-142.386 227.621l-0.182 0.185-0.183 0.183c-36.781 36.581-80.07 70.963-122.936 96.574C607.109 988.43 557.585 1006 512.5 1006c-45.088 0-94.592-17.534-146.202-48.35-42.884-25.605-86.18-60.003-123.018-96.671l-0.191-0.19-0.189-0.193A624.791 624.791 0 0 1 100.555 633.04L98 625.874V150.83l44.375 0.378c48.96 0.418 97.62-7.685 143.797-23.945l0.521-0.184 0.526-0.17a748.46 748.46 0 0 0 199.96-99.893L511.573 9.85l24.979 16.306a986.95 986.95 0 0 0 201.955 100.987c36.862 11.904 69.104 19.111 96.726 22.556 18.276 2.28 31.852 2.633 40.737 1.992 0.527-0.038 0.934-0.074 1.22-0.103z m-52.849 85.435c-33.369-4.162-71.286-12.66-113.692-26.402l-0.73-0.237-0.72-0.261a1074.982 1074.982 0 0 1-195.89-94.53 836.489 836.489 0 0 1-198.436 94.86A510.113 510.113 0 0 1 186 237.65V610.5a536.8 536.8 0 0 0 119.554 188.3C374.804 867.672 459.142 918 512.5 918c53.292 0 137.733-50.42 206.967-119.22A534.407 534.407 0 0 0 839 610.522v-371.92c-4.676-0.42-9.563-0.944-14.659-1.58z m-354.355 342.84l197.99-197.99c17.183-17.182 45.043-17.182 62.226 0 17.183 17.184 17.183 45.043 0 62.226L469.986 704.314 310.887 545.215c-17.183-17.183-17.183-45.042 0-62.225s45.043-17.183 62.226 0l96.873 96.874z" fill="#000000" p-id="6450"></path></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/chart-area.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M85.504 938.688H1024V1024H0v-85.312h0.192V0h85.312v938.688zM128 723.328l212.736-271.552 303.424 155.52L990.912 256v632.64H128v-165.312z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/chart-bar.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M85.312 938.688H1024V1024H0V0h85.312v938.688zM256 341.312h85.312V768H256V341.312zM512 128h85.312v640H512V128z m256 213.312h85.312V768H768V341.312z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/chart-line.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M85.504 938.688H1024V1024H0v-85.312h0.192V0h85.312v938.688z m120.256-169.984l-70.208-48.512L372.48 377.728l303.424 155.52 265.472-345.92 67.712 51.968-308.8 402.304-300.16-153.856-194.368 280.96z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/chart-relation.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M403.520683 655.339712l-91.333603 68.819998a127.918212 127.918212 0 1 1-36.392732-52.638344l93.700091-70.610853a223.856872 223.856872 0 0 1 292.612911-296.130662l31.915593-71.634199a127.918212 127.918212 0 1 1 59.929683 22.641524l-36.776486 82.507247a223.409158 223.409158 0 0 1 81.164106 172.497709c0 55.772341-20.338996 106.747748-54.045445 145.890721l99.200574 122.545648a127.918212 127.918212 0 1 1-50.016021 39.846523l-97.409719-120.24312c-34.985631 22.641524-76.750927 35.817099-121.586261 35.8171a223.345199 223.345199 0 0 1-170.962691-79.309292z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/chart-scatter-plot.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M85.504 938.688H1024V1024H0v-85.312h0.192V0h85.312v938.688zM384.192 512a128 128 0 1 1 0-256 128 128 0 0 1 0 256z m298.688 298.688a128 128 0 1 1 0-256 128 128 0 0 1 0 256zM320.192 213.312a64 64 0 1 1 0-128 64 64 0 0 1 0 128z m-42.688 597.376a64 64 0 1 1 0-128 64 64 0 0 1 0 128z m426.688-341.376a64 64 0 1 1 0-128 64 64 0 0 1 0 128zM917.504 384a64 64 0 1 1 0-128 64 64 0 0 1 0 128zM746.88 170.688a64 64 0 1 1 0-128 64 64 0 0 1 0 128z m-298.688 512a64 64 0 1 1 0-128 64 64 0 0 1 0 128z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/cog-fill.svg

@@ -0,0 +1 @@
+<svg t="1698912980356" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4456" width="64" height="64"><path d="M903.232 562.176l119.232 94.912-127.168 209.728-143.168-50.176a407.296 407.296 0 0 1-88.96 50.176L633.92 1024H394.688l-33.664-157.184a387.328 387.328 0 0 1-88.96-50.176l-144 50.176-127.872-209.728L120.96 562.176A395.136 395.136 0 0 1 117.312 512c0-16.896 1.6-33.792 3.712-50.176L0.192 359.168l116.032-204.544 155.84 52.736a407.296 407.296 0 0 1 88.96-50.176L396.352 0h237.568l29.248 157.184c32.128 12.8 61.568 29.696 88.96 50.176l158.08-52.736 113.664 204.544-120.64 102.656c2.048 16.384 3.648 32.768 3.648 50.176 0 11.584-1.28 28.352-3.648 50.176zM512 320a192 192 0 1 0 0 384 192 192 0 1 0 0-384z" fill="#262626" p-id="4457"></path></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/collection-fill.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M512 822.976L828.416 1024l-83.968-378.88L1024 390.208l-368.128-32.896L512 0 368.128 357.312 0 390.208l279.552 254.912L195.584 1024z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/comment-lines.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M64 64h896v709.312H363.648L64 960V64z m278.336 634.688h542.976v-560H138.688v686.848l203.648-126.848zM288 288h448v112h-448V288z m0 186.688h448v112h-448v-112z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/commentdots-fill.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M64 64h896v709.312H363.648L64 960V64z m224 298.688v112h112v-112H288z m186.688 0v112h112v-112h-112z m186.624 0v112h112v-112h-112z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/commentlines-fill.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M64 64h896v709.312H363.648L64 960V64z m224 224v112h448V288h-448z m0 186.688v112h448v-112h-448z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/compress-alt.svg

@@ -0,0 +1 @@
+<svg t="1698891403323" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4456" width="64" height="64"><path d="M638.4 305.28L879.616 64 960 144.384 718.464 385.92l132.16 133.248H512V177.792L638.4 305.28zM385.152 722.112L146.56 960.64l-80.384-80.384 238.272-238.272L173.376 512H512v336l-126.848-125.888z" fill="#373D41" p-id="4457"></path></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/database-plus.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M153.6 445.248v133.504h716.8V445.248H153.6zM576 934.976V1024H64v-311.68h512v89.088H153.6v133.568H576z m384-356.16H576v88.96H64V356.224h896v222.72zM64 0h896v311.68H64V0z m89.6 89.024v133.568h716.8V89.024H153.6z m44.8 44.544h89.6v44.544H198.4v-44.544z m0 356.16h89.6v44.544H198.4v-44.544z m565.312 273.984V640h85.376v123.712H972.8v85.376h-123.712V972.8h-85.376v-123.712H640v-85.376h123.712zM198.4 845.888h89.6v44.544H198.4v-44.544z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/database.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M153.6 445.248v133.504h716.8V445.248H153.6zM64 356.16h896v311.68H64v-311.68zM64 0h896v311.68H64V0z m89.6 89.024v133.568h716.8V89.024H153.6zM64 712.384h896V1024H64v-311.68z m89.6 88.96v133.632h716.8v-133.568H153.6z m44.8-667.776h89.6v44.544H198.4v-44.544z m0 356.16h89.6v44.544H198.4v-44.544z m0 356.16h89.6v44.544H198.4v-44.544z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/delete.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M341.312 85.312l64-85.312h213.376l64 85.312H960v85.376H64V85.312h277.312zM170.688 256h682.624v768H170.688V256zM256 341.312v597.376h512V341.312H256z m213.312 85.376v426.624H384V426.688h85.312z m170.688 0v426.624H554.688V426.688H640z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/download.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="64px" height="64.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M1024 896v128H0v-320h128v192h768v-192h128v192zM576 554.688L810.688 320 896 405.312l-384 384-384-384L213.312 320 448 554.688V0h128v554.688z" fill="#262626" /></svg>

+ 1 - 0
datadas/mydatadas/src/components/svgIcon/svgs/expand-alt.svg

@@ -0,0 +1 @@
+<svg t="1700214892268" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4107" width="64" height="64"><path d="M833.6 277.952l-241.216 241.28L512 438.72l241.536-241.536L621.44 64H960v341.376l-126.4-127.36zM190.848 749.888L429.44 511.36l80.384 80.384-238.272 238.272L402.624 960H64V624l126.848 125.888z" fill="#262626" p-id="4108"></path></svg>

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