abpcoder 4 месяцев назад
Родитель
Сommit
897befff09
100 измененных файлов с 12305 добавлено и 5110 удалено
  1. BIN
      back-ui/admin.zip
  2. 2 1
      back-ui/package.json
  3. 5049 0
      back-ui/pnpm-lock.yaml
  4. 163 20
      back-ui/src/api/dz/cards.js
  5. 8 0
      back-ui/src/api/dz/classes.js
  6. 9 0
      back-ui/src/api/dz/school.js
  7. 17 0
      back-ui/src/api/dz/teacherclass.js
  8. 15 0
      back-ui/src/assets/icons/svg/share.svg
  9. 17 12
      back-ui/src/assets/styles/variables.module.scss
  10. 41 15
      back-ui/src/components/AddressSelect/index.vue
  11. 600 0
      back-ui/src/components/Form/index.vue
  12. 261 0
      back-ui/src/components/SearchForm/index.vue
  13. 357 0
      back-ui/src/components/Table/index.vue
  14. 1 9
      back-ui/src/layout/components/Navbar.vue
  15. 4 3
      back-ui/src/store/modules/settings.js
  16. 36 7
      back-ui/src/views/dz/agent/index.vue
  17. 252 0
      back-ui/src/views/dz/cards/components/ApplyCardDialog.vue
  18. 409 0
      back-ui/src/views/dz/cards/components/AssignCardDialog.vue
  19. 220 0
      back-ui/src/views/dz/cards/components/AssociateCampusDialog.vue
  20. 299 0
      back-ui/src/views/dz/cards/components/CardGenerationDialog.vue
  21. 156 0
      back-ui/src/views/dz/cards/components/CloseCardDialog.vue
  22. 249 0
      back-ui/src/views/dz/cards/components/EditStudentDialog.vue
  23. 156 0
      back-ui/src/views/dz/cards/components/PaymentDialog.vue
  24. 92 0
      back-ui/src/views/dz/cards/components/RefundDialog.vue
  25. 156 0
      back-ui/src/views/dz/cards/components/ReopenCardDialog.vue
  26. 301 0
      back-ui/src/views/dz/cards/config/form.js
  27. 187 0
      back-ui/src/views/dz/cards/config/table.js
  28. 943 690
      back-ui/src/views/dz/cards/index.vue
  29. 0 1
      back-ui/src/views/dz/classes/index.vue
  30. 39 0
      back-ui/src/views/dz/open/config/form.js
  31. 89 0
      back-ui/src/views/dz/open/config/table.js
  32. 329 276
      back-ui/src/views/dz/open/index.vue
  33. 1 3
      back-ui/src/views/dz/papers/index.vue
  34. 3 6
      back-ui/src/views/dz/papers/list.vue
  35. 5 4
      back-ui/src/views/dz/school/index.vue
  36. 118 1
      back-ui/src/views/dz/teacher/index.vue
  37. 8 8
      back-ui/src/views/dz/teacherclass/index.vue
  38. 168 93
      back-ui/src/views/learn/paper/index.vue
  39. 11 1
      back-ui/src/views/system/user/index.vue
  40. 0 3718
      back-ui/yarn.lock
  41. 50 2
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzAgentController.java
  42. 21 7
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzCardsController.java
  43. 24 0
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzClassesController.java
  44. 38 1
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzSchoolController.java
  45. 70 3
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzTeacherClassController.java
  46. 5 1
      ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzTeacherController.java
  47. 79 0
      ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontCustomerMarjorsController.java
  48. 103 0
      ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontCustomerUniversityController.java
  49. 6 5
      ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontUniversitiesController.java
  50. 3 1
      ie-admin/src/main/java/com/ruoyi/web/controller/learn/LearnQuestionsController.java
  51. 35 5
      ie-admin/src/main/java/com/ruoyi/web/controller/learn/LearnTeacherController.java
  52. 3 0
      ie-admin/src/main/java/com/ruoyi/web/service/CommService.java
  53. 4 4
      ie-admin/src/main/java/com/ruoyi/web/service/ExamService.java
  54. 270 2
      ie-admin/src/main/java/com/ruoyi/web/service/LearnTeacherService.java
  55. 9 28
      ie-admin/src/main/java/com/ruoyi/web/service/PaperService.java
  56. 2 0
      ie-admin/src/main/java/com/ruoyi/web/service/SysRegisterService.java
  57. 65 0
      ie-common/src/main/java/com/ruoyi/common/enums/BoolValues.java
  58. 24 0
      ie-system/src/main/java/com/ruoyi/dz/domain/DzAgent.java
  59. 89 7
      ie-system/src/main/java/com/ruoyi/dz/domain/DzCards.java
  60. 18 0
      ie-system/src/main/java/com/ruoyi/dz/domain/DzClasses.java
  61. 12 1
      ie-system/src/main/java/com/ruoyi/dz/domain/DzSchool.java
  62. 2 1
      ie-system/src/main/java/com/ruoyi/dz/domain/DzTeacher.java
  63. 27 17
      ie-system/src/main/java/com/ruoyi/dz/domain/DzTeacherClass.java
  64. 4 0
      ie-system/src/main/java/com/ruoyi/dz/mapper/DzAgentMapper.java
  65. 2 0
      ie-system/src/main/java/com/ruoyi/dz/mapper/DzClassesMapper.java
  66. 11 9
      ie-system/src/main/java/com/ruoyi/dz/mapper/DzSchoolMapper.java
  67. 9 9
      ie-system/src/main/java/com/ruoyi/dz/mapper/DzTeacherClassMapper.java
  68. 12 1
      ie-system/src/main/java/com/ruoyi/dz/service/IDzCardsService.java
  69. 9 9
      ie-system/src/main/java/com/ruoyi/dz/service/IDzSchoolService.java
  70. 9 8
      ie-system/src/main/java/com/ruoyi/dz/service/IDzTeacherClassService.java
  71. 84 12
      ie-system/src/main/java/com/ruoyi/dz/service/impl/DzCardsServiceImpl.java
  72. 14 8
      ie-system/src/main/java/com/ruoyi/dz/service/impl/DzSchoolServiceImpl.java
  73. 13 8
      ie-system/src/main/java/com/ruoyi/dz/service/impl/DzTeacherClassServiceImpl.java
  74. 1 0
      ie-system/src/main/java/com/ruoyi/ie/mapper/AMarjorPlanMapper.java
  75. 12 1
      ie-system/src/main/java/com/ruoyi/learn/domain/LearnDirectedKnowledge.java
  76. 22 0
      ie-system/src/main/java/com/ruoyi/learn/domain/LearnPaperQuestion.java
  77. 51 0
      ie-system/src/main/java/com/ruoyi/learn/domain/LearnStudent.java
  78. 23 13
      ie-system/src/main/java/com/ruoyi/learn/domain/LearnTestPaper.java
  79. 70 14
      ie-system/src/main/java/com/ruoyi/learn/domain/TestPaperVO.java
  80. 2 0
      ie-system/src/main/java/com/ruoyi/learn/mapper/LearnDirectedKnowledgeMapper.java
  81. 7 0
      ie-system/src/main/java/com/ruoyi/learn/mapper/LearnStudentMapper.java
  82. 4 0
      ie-system/src/main/java/com/ruoyi/learn/mapper/LearnTestPaperMapper.java
  83. 9 8
      ie-system/src/main/java/com/ruoyi/system/mapper/SysAreaMapper.java
  84. 3 0
      ie-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
  85. 1 0
      ie-system/src/main/java/com/ruoyi/system/service/ISysAreaService.java
  86. 5 0
      ie-system/src/main/java/com/ruoyi/system/service/impl/SysAreaServiceImpl.java
  87. 1 1
      ie-system/src/main/java/com/ruoyi/syzy/service/impl/BBusiWishUniversitiesServiceImpl.java
  88. 27 19
      ie-system/src/main/resources/mapper/dz/DzAgentMapper.xml
  89. 18 12
      ie-system/src/main/resources/mapper/dz/DzCardsMapper.xml
  90. 5 0
      ie-system/src/main/resources/mapper/dz/DzClassesMapper.xml
  91. 14 1
      ie-system/src/main/resources/mapper/dz/DzSchoolMapper.xml
  92. 31 11
      ie-system/src/main/resources/mapper/dz/DzTeacherClassMapper.xml
  93. 5 0
      ie-system/src/main/resources/mapper/ie/AMarjorPlanMapper.xml
  94. 11 1
      ie-system/src/main/resources/mapper/learn/LearnDirectedKnowledgeMapper.xml
  95. 36 2
      ie-system/src/main/resources/mapper/learn/LearnStudentMapper.xml
  96. 20 10
      ie-system/src/main/resources/mapper/learn/LearnTestPaperMapper.xml
  97. 13 0
      ie-system/src/main/resources/mapper/learn/LearnTestStudentMapper.xml
  98. 10 0
      ie-system/src/main/resources/mapper/system/SysAreaMapper.xml
  99. 6 0
      ie-system/src/main/resources/mapper/system/SysDeptMapper.xml
  100. 1 0
      ie-system/src/main/resources/mapper/syzy/BBusiWishUniversitiesMapper.xml

BIN
back-ui/admin.zip


+ 2 - 1
back-ui/package.json

@@ -17,7 +17,7 @@
   },
   "dependencies": {
     "@element-plus/icons-vue": "2.3.1",
-    "@tailwindcss/vite": "^4.1.13",
+    "@tailwindcss/vite": "^4.1.14",
     "@vueup/vue-quill": "1.2.0",
     "@vueuse/core": "^13.3.0",
     "axios": "1.9.0",
@@ -31,6 +31,7 @@
     "jsencrypt": "3.3.2",
     "nprogress": "0.2.0",
     "pinia": "3.0.2",
+    "sortablejs": "^1.15.6",
     "splitpanes": "4.0.4",
     "tailwindcss": "^4.1.13",
     "vue": "3.5.16",

+ 5049 - 0
back-ui/pnpm-lock.yaml

@@ -0,0 +1,5049 @@
+lockfileVersion: '9.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+importers:
+
+  .:
+    dependencies:
+      '@element-plus/icons-vue':
+        specifier: 2.3.1
+        version: 2.3.1(vue@3.5.16)
+      '@tailwindcss/vite':
+        specifier: ^4.1.14
+        version: 4.1.14(vite@6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1))
+      '@vueup/vue-quill':
+        specifier: 1.2.0
+        version: 1.2.0(vue@3.5.16)
+      '@vueuse/core':
+        specifier: ^13.3.0
+        version: 13.3.0(vue@3.5.16)
+      axios:
+        specifier: 1.9.0
+        version: 1.9.0
+      clipboard:
+        specifier: 2.0.11
+        version: 2.0.11
+      echarts:
+        specifier: 5.6.0
+        version: 5.6.0
+      element-plus:
+        specifier: 2.10.7
+        version: 2.10.7(vue@3.5.16)
+      file-saver:
+        specifier: 2.0.5
+        version: 2.0.5
+      fuse.js:
+        specifier: 6.6.2
+        version: 6.6.2
+      js-beautify:
+        specifier: 1.14.11
+        version: 1.14.11
+      js-cookie:
+        specifier: 3.0.5
+        version: 3.0.5
+      jsencrypt:
+        specifier: 3.3.2
+        version: 3.3.2
+      nprogress:
+        specifier: 0.2.0
+        version: 0.2.0
+      pinia:
+        specifier: 3.0.2
+        version: 3.0.2(vue@3.5.16)
+      sortablejs:
+        specifier: ^1.15.6
+        version: 1.15.6
+      splitpanes:
+        specifier: 4.0.4
+        version: 4.0.4(vue@3.5.16)
+      tailwindcss:
+        specifier: ^4.1.13
+        version: 4.1.14
+      vue:
+        specifier: 3.5.16
+        version: 3.5.16
+      vue-cropper:
+        specifier: 1.1.1
+        version: 1.1.1
+      vue-router:
+        specifier: 4.5.1
+        version: 4.5.1(vue@3.5.16)
+      vuedraggable:
+        specifier: 4.1.0
+        version: 4.1.0(vue@3.5.16)
+    devDependencies:
+      '@vitejs/plugin-vue':
+        specifier: 5.2.4
+        version: 5.2.4(vite@6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1))(vue@3.5.16)
+      sass-embedded:
+        specifier: 1.89.1
+        version: 1.89.1
+      unplugin-auto-import:
+        specifier: 0.18.6
+        version: 0.18.6(@vueuse/core@13.3.0(vue@3.5.16))(rollup@4.52.3)
+      unplugin-vue-setup-extend-plus:
+        specifier: 1.0.1
+        version: 1.0.1
+      vite:
+        specifier: 6.3.5
+        version: 6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1)
+      vite-plugin-compression:
+        specifier: 0.5.1
+        version: 0.5.1(vite@6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1))
+      vite-plugin-svg-icons:
+        specifier: 2.0.1
+        version: 2.0.1(vite@6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1))
+
+packages:
+
+  '@antfu/utils@0.7.10':
+    resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
+
+  '@babel/helper-string-parser@7.27.1':
+    resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-validator-identifier@7.27.1':
+    resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/parser@7.28.4':
+    resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  '@babel/types@7.28.4':
+    resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==}
+    engines: {node: '>=6.9.0'}
+
+  '@bufbuild/protobuf@2.9.0':
+    resolution: {integrity: sha512-rnJenoStJ8nvmt9Gzye8nkYd6V22xUAnu4086ER7h1zJ508vStko4pMvDeQ446ilDTFpV5wnoc5YS7XvMwwMqA==}
+
+  '@ctrl/tinycolor@3.6.1':
+    resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+    engines: {node: '>=10'}
+
+  '@element-plus/icons-vue@2.3.1':
+    resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  '@esbuild/aix-ppc64@0.25.10':
+    resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [aix]
+
+  '@esbuild/android-arm64@0.25.10':
+    resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [android]
+
+  '@esbuild/android-arm@0.25.10':
+    resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [android]
+
+  '@esbuild/android-x64@0.25.10':
+    resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [android]
+
+  '@esbuild/darwin-arm64@0.25.10':
+    resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@esbuild/darwin-x64@0.25.10':
+    resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@esbuild/freebsd-arm64@0.25.10':
+    resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@esbuild/freebsd-x64@0.25.10':
+    resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@esbuild/linux-arm64@0.25.10':
+    resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/linux-arm@0.25.10':
+    resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/linux-ia32@0.25.10':
+    resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/linux-loong64@0.25.10':
+    resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==}
+    engines: {node: '>=18'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/linux-mips64el@0.25.10':
+    resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==}
+    engines: {node: '>=18'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/linux-ppc64@0.25.10':
+    resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/linux-riscv64@0.25.10':
+    resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==}
+    engines: {node: '>=18'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/linux-s390x@0.25.10':
+    resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==}
+    engines: {node: '>=18'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/linux-x64@0.25.10':
+    resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/netbsd-arm64@0.25.10':
+    resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [netbsd]
+
+  '@esbuild/netbsd-x64@0.25.10':
+    resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/openbsd-arm64@0.25.10':
+    resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openbsd]
+
+  '@esbuild/openbsd-x64@0.25.10':
+    resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/openharmony-arm64@0.25.10':
+    resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openharmony]
+
+  '@esbuild/sunos-x64@0.25.10':
+    resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/win32-arm64@0.25.10':
+    resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/win32-ia32@0.25.10':
+    resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/win32-x64@0.25.10':
+    resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [win32]
+
+  '@floating-ui/core@1.7.3':
+    resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
+
+  '@floating-ui/dom@1.7.4':
+    resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
+
+  '@floating-ui/utils@0.2.10':
+    resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
+
+  '@isaacs/cliui@8.0.2':
+    resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+    engines: {node: '>=12'}
+
+  '@isaacs/fs-minipass@4.0.1':
+    resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
+    engines: {node: '>=18.0.0'}
+
+  '@jridgewell/gen-mapping@0.3.13':
+    resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+  '@jridgewell/remapping@2.3.5':
+    resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+  '@jridgewell/resolve-uri@3.1.2':
+    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/sourcemap-codec@1.5.5':
+    resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+  '@jridgewell/trace-mapping@0.3.31':
+    resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+  '@nodelib/fs.scandir@2.1.5':
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.stat@2.0.5':
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/fs.walk@1.2.8':
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+
+  '@one-ini/wasm@0.1.1':
+    resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==}
+
+  '@pkgjs/parseargs@0.11.0':
+    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+    engines: {node: '>=14'}
+
+  '@rollup/pluginutils@5.3.0':
+    resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+
+  '@rollup/rollup-android-arm-eabi@4.52.3':
+    resolution: {integrity: sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==}
+    cpu: [arm]
+    os: [android]
+
+  '@rollup/rollup-android-arm64@4.52.3':
+    resolution: {integrity: sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==}
+    cpu: [arm64]
+    os: [android]
+
+  '@rollup/rollup-darwin-arm64@4.52.3':
+    resolution: {integrity: sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rollup/rollup-darwin-x64@4.52.3':
+    resolution: {integrity: sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rollup/rollup-freebsd-arm64@4.52.3':
+    resolution: {integrity: sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@rollup/rollup-freebsd-x64@4.52.3':
+    resolution: {integrity: sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.52.3':
+    resolution: {integrity: sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm-musleabihf@4.52.3':
+    resolution: {integrity: sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm64-gnu@4.52.3':
+    resolution: {integrity: sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rollup/rollup-linux-arm64-musl@4.52.3':
+    resolution: {integrity: sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rollup/rollup-linux-loong64-gnu@4.52.3':
+    resolution: {integrity: sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==}
+    cpu: [loong64]
+    os: [linux]
+
+  '@rollup/rollup-linux-ppc64-gnu@4.52.3':
+    resolution: {integrity: sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@rollup/rollup-linux-riscv64-gnu@4.52.3':
+    resolution: {integrity: sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@rollup/rollup-linux-riscv64-musl@4.52.3':
+    resolution: {integrity: sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@rollup/rollup-linux-s390x-gnu@4.52.3':
+    resolution: {integrity: sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==}
+    cpu: [s390x]
+    os: [linux]
+
+  '@rollup/rollup-linux-x64-gnu@4.52.3':
+    resolution: {integrity: sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rollup/rollup-linux-x64-musl@4.52.3':
+    resolution: {integrity: sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rollup/rollup-openharmony-arm64@4.52.3':
+    resolution: {integrity: sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==}
+    cpu: [arm64]
+    os: [openharmony]
+
+  '@rollup/rollup-win32-arm64-msvc@4.52.3':
+    resolution: {integrity: sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rollup/rollup-win32-ia32-msvc@4.52.3':
+    resolution: {integrity: sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@rollup/rollup-win32-x64-gnu@4.52.3':
+    resolution: {integrity: sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==}
+    cpu: [x64]
+    os: [win32]
+
+  '@rollup/rollup-win32-x64-msvc@4.52.3':
+    resolution: {integrity: sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==}
+    cpu: [x64]
+    os: [win32]
+
+  '@sxzz/popperjs-es@2.11.7':
+    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+
+  '@tailwindcss/node@4.1.14':
+    resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==}
+
+  '@tailwindcss/oxide-android-arm64@4.1.14':
+    resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [android]
+
+  '@tailwindcss/oxide-darwin-arm64@4.1.14':
+    resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@tailwindcss/oxide-darwin-x64@4.1.14':
+    resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@tailwindcss/oxide-freebsd-x64@4.1.14':
+    resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14':
+    resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==}
+    engines: {node: '>= 10'}
+    cpu: [arm]
+    os: [linux]
+
+  '@tailwindcss/oxide-linux-arm64-gnu@4.1.14':
+    resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@tailwindcss/oxide-linux-arm64-musl@4.1.14':
+    resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@tailwindcss/oxide-linux-x64-gnu@4.1.14':
+    resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+
+  '@tailwindcss/oxide-linux-x64-musl@4.1.14':
+    resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+
+  '@tailwindcss/oxide-wasm32-wasi@4.1.14':
+    resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [wasm32]
+    bundledDependencies:
+      - '@napi-rs/wasm-runtime'
+      - '@emnapi/core'
+      - '@emnapi/runtime'
+      - '@tybys/wasm-util'
+      - '@emnapi/wasi-threads'
+      - tslib
+
+  '@tailwindcss/oxide-win32-arm64-msvc@4.1.14':
+    resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@tailwindcss/oxide-win32-x64-msvc@4.1.14':
+    resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [win32]
+
+  '@tailwindcss/oxide@4.1.14':
+    resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==}
+    engines: {node: '>= 10'}
+
+  '@tailwindcss/vite@4.1.14':
+    resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==}
+    peerDependencies:
+      vite: ^5.2.0 || ^6 || ^7
+
+  '@trysound/sax@0.2.0':
+    resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+    engines: {node: '>=10.13.0'}
+
+  '@types/estree@1.0.8':
+    resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+  '@types/lodash-es@4.17.12':
+    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+  '@types/lodash@4.17.20':
+    resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==}
+
+  '@types/node@24.6.1':
+    resolution: {integrity: sha512-ljvjjs3DNXummeIaooB4cLBKg2U6SPI6Hjra/9rRIy7CpM0HpLtG9HptkMKAb4HYWy5S7HUvJEuWgr/y0U8SHw==}
+
+  '@types/svgo@2.6.4':
+    resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
+
+  '@types/web-bluetooth@0.0.16':
+    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+
+  '@types/web-bluetooth@0.0.21':
+    resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
+
+  '@vitejs/plugin-vue@5.2.4':
+    resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==}
+    engines: {node: ^18.0.0 || >=20.0.0}
+    peerDependencies:
+      vite: ^5.0.0 || ^6.0.0
+      vue: ^3.2.25
+
+  '@vue/compiler-core@3.5.16':
+    resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==}
+
+  '@vue/compiler-core@3.5.22':
+    resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==}
+
+  '@vue/compiler-dom@3.5.16':
+    resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==}
+
+  '@vue/compiler-dom@3.5.22':
+    resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==}
+
+  '@vue/compiler-sfc@3.5.16':
+    resolution: {integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==}
+
+  '@vue/compiler-sfc@3.5.22':
+    resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==}
+
+  '@vue/compiler-ssr@3.5.16':
+    resolution: {integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==}
+
+  '@vue/compiler-ssr@3.5.22':
+    resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==}
+
+  '@vue/devtools-api@6.6.4':
+    resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
+  '@vue/devtools-api@7.7.7':
+    resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==}
+
+  '@vue/devtools-kit@7.7.7':
+    resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==}
+
+  '@vue/devtools-shared@7.7.7':
+    resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==}
+
+  '@vue/reactivity@3.5.16':
+    resolution: {integrity: sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==}
+
+  '@vue/runtime-core@3.5.16':
+    resolution: {integrity: sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==}
+
+  '@vue/runtime-dom@3.5.16':
+    resolution: {integrity: sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==}
+
+  '@vue/server-renderer@3.5.16':
+    resolution: {integrity: sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==}
+    peerDependencies:
+      vue: 3.5.16
+
+  '@vue/shared@3.5.16':
+    resolution: {integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==}
+
+  '@vue/shared@3.5.22':
+    resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==}
+
+  '@vueup/vue-quill@1.2.0':
+    resolution: {integrity: sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==}
+    peerDependencies:
+      vue: ^3.2.41
+
+  '@vueuse/core@13.3.0':
+    resolution: {integrity: sha512-uYRz5oEfebHCoRhK4moXFM3NSCd5vu2XMLOq/Riz5FdqZMy2RvBtazdtL3gEcmDyqkztDe9ZP/zymObMIbiYSg==}
+    peerDependencies:
+      vue: ^3.5.0
+
+  '@vueuse/core@9.13.0':
+    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
+
+  '@vueuse/metadata@13.3.0':
+    resolution: {integrity: sha512-42IzJIOYCKIb0Yjv1JfaKpx8JlCiTmtCWrPxt7Ja6Wzoq0h79+YVXmBV03N966KEmDEESTbp5R/qO3AB5BDnGw==}
+
+  '@vueuse/metadata@9.13.0':
+    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
+
+  '@vueuse/shared@13.3.0':
+    resolution: {integrity: sha512-L1QKsF0Eg9tiZSFXTgodYnu0Rsa2P0En2LuLrIs/jgrkyiDuJSsPZK+tx+wU0mMsYHUYEjNsuE41uqqkuR8VhA==}
+    peerDependencies:
+      vue: ^3.5.0
+
+  '@vueuse/shared@9.13.0':
+    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
+
+  abbrev@2.0.0:
+    resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+  acorn@8.15.0:
+    resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  ansi-regex@2.1.1:
+    resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
+    engines: {node: '>=0.10.0'}
+
+  ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  ansi-regex@6.2.2:
+    resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+    engines: {node: '>=12'}
+
+  ansi-styles@2.2.1:
+    resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
+    engines: {node: '>=0.10.0'}
+
+  ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+
+  ansi-styles@6.2.3:
+    resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
+    engines: {node: '>=12'}
+
+  arr-diff@4.0.0:
+    resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
+    engines: {node: '>=0.10.0'}
+
+  arr-flatten@1.1.0:
+    resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
+    engines: {node: '>=0.10.0'}
+
+  arr-union@3.1.0:
+    resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
+    engines: {node: '>=0.10.0'}
+
+  array-buffer-byte-length@1.0.2:
+    resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+    engines: {node: '>= 0.4'}
+
+  array-unique@0.3.2:
+    resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
+    engines: {node: '>=0.10.0'}
+
+  arraybuffer.prototype.slice@1.0.4:
+    resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+    engines: {node: '>= 0.4'}
+
+  assign-symbols@1.0.0:
+    resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
+    engines: {node: '>=0.10.0'}
+
+  async-function@1.0.0:
+    resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+    engines: {node: '>= 0.4'}
+
+  async-validator@4.2.5:
+    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+  asynckit@0.4.0:
+    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+  atob@2.1.2:
+    resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
+    engines: {node: '>= 4.5.0'}
+    hasBin: true
+
+  available-typed-arrays@1.0.7:
+    resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+    engines: {node: '>= 0.4'}
+
+  axios@1.9.0:
+    resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==}
+
+  balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  base@0.11.2:
+    resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
+    engines: {node: '>=0.10.0'}
+
+  big.js@5.2.2:
+    resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+
+  birpc@2.6.1:
+    resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==}
+
+  bluebird@3.7.2:
+    resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+
+  boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+  brace-expansion@2.0.2:
+    resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+
+  braces@2.3.2:
+    resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
+    engines: {node: '>=0.10.0'}
+
+  braces@3.0.3:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
+
+  buffer-builder@0.2.0:
+    resolution: {integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==}
+
+  cache-base@1.0.1:
+    resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
+    engines: {node: '>=0.10.0'}
+
+  call-bind-apply-helpers@1.0.2:
+    resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+    engines: {node: '>= 0.4'}
+
+  call-bind@1.0.8:
+    resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+    engines: {node: '>= 0.4'}
+
+  call-bound@1.0.4:
+    resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+    engines: {node: '>= 0.4'}
+
+  chalk@1.1.3:
+    resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
+    engines: {node: '>=0.10.0'}
+
+  chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
+
+  chownr@3.0.0:
+    resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
+    engines: {node: '>=18'}
+
+  class-utils@0.3.6:
+    resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
+    engines: {node: '>=0.10.0'}
+
+  clipboard@2.0.11:
+    resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==}
+
+  clone@2.1.2:
+    resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
+    engines: {node: '>=0.8'}
+
+  collection-visit@1.0.0:
+    resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
+    engines: {node: '>=0.10.0'}
+
+  color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+
+  color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+  colorjs.io@0.5.2:
+    resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==}
+
+  combined-stream@1.0.8:
+    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+    engines: {node: '>= 0.8'}
+
+  commander@10.0.1:
+    resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+    engines: {node: '>=14'}
+
+  commander@7.2.0:
+    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+    engines: {node: '>= 10'}
+
+  component-emitter@1.3.1:
+    resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
+
+  confbox@0.1.8:
+    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+  confbox@0.2.2:
+    resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+
+  config-chain@1.1.13:
+    resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+
+  copy-anything@3.0.5:
+    resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
+    engines: {node: '>=12.13'}
+
+  copy-descriptor@0.1.1:
+    resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
+    engines: {node: '>=0.10.0'}
+
+  cors@2.8.5:
+    resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+    engines: {node: '>= 0.10'}
+
+  cross-spawn@7.0.6:
+    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+    engines: {node: '>= 8'}
+
+  css-select@4.3.0:
+    resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+
+  css-tree@1.1.3:
+    resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+    engines: {node: '>=8.0.0'}
+
+  css-what@6.2.2:
+    resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+    engines: {node: '>= 6'}
+
+  csso@4.2.0:
+    resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
+    engines: {node: '>=8.0.0'}
+
+  csstype@3.1.3:
+    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+  data-view-buffer@1.0.2:
+    resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+    engines: {node: '>= 0.4'}
+
+  data-view-byte-length@1.0.2:
+    resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+    engines: {node: '>= 0.4'}
+
+  data-view-byte-offset@1.0.1:
+    resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+    engines: {node: '>= 0.4'}
+
+  dayjs@1.11.18:
+    resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==}
+
+  debug@2.6.9:
+    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  debug@4.4.3:
+    resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  decode-uri-component@0.2.2:
+    resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+    engines: {node: '>=0.10'}
+
+  deep-equal@1.1.2:
+    resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==}
+    engines: {node: '>= 0.4'}
+
+  define-data-property@1.1.4:
+    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+    engines: {node: '>= 0.4'}
+
+  define-properties@1.2.1:
+    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+    engines: {node: '>= 0.4'}
+
+  define-property@0.2.5:
+    resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
+    engines: {node: '>=0.10.0'}
+
+  define-property@1.0.0:
+    resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
+    engines: {node: '>=0.10.0'}
+
+  define-property@2.0.2:
+    resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
+    engines: {node: '>=0.10.0'}
+
+  delayed-stream@1.0.0:
+    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+    engines: {node: '>=0.4.0'}
+
+  delegate@3.2.0:
+    resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
+
+  detect-libc@2.1.1:
+    resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==}
+    engines: {node: '>=8'}
+
+  dom-serializer@0.2.2:
+    resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
+
+  dom-serializer@1.4.1:
+    resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+
+  domelementtype@1.3.1:
+    resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
+
+  domelementtype@2.3.0:
+    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+  domhandler@2.4.2:
+    resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
+
+  domhandler@4.3.1:
+    resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+    engines: {node: '>= 4'}
+
+  domutils@1.7.0:
+    resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
+
+  domutils@2.8.0:
+    resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+
+  dunder-proto@1.0.1:
+    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+    engines: {node: '>= 0.4'}
+
+  eastasianwidth@0.2.0:
+    resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+  echarts@5.6.0:
+    resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==}
+
+  editorconfig@1.0.4:
+    resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  element-plus@2.10.7:
+    resolution: {integrity: sha512-bL4yhepL8/0NEQA5+N2Q6ZVKLipIDkiQjK2mqtSmGh6CxJk1yaBMdG5HXfYkbk1htNcT3ULk9g23lzT323JGcA==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+  emoji-regex@9.2.2:
+    resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+  emojis-list@3.0.0:
+    resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+    engines: {node: '>= 4'}
+
+  enhanced-resolve@5.18.3:
+    resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
+    engines: {node: '>=10.13.0'}
+
+  entities@1.1.2:
+    resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==}
+
+  entities@2.2.0:
+    resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+
+  entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+
+  es-abstract@1.24.0:
+    resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
+    engines: {node: '>= 0.4'}
+
+  es-define-property@1.0.1:
+    resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+    engines: {node: '>= 0.4'}
+
+  es-errors@1.3.0:
+    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+    engines: {node: '>= 0.4'}
+
+  es-object-atoms@1.1.1:
+    resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+    engines: {node: '>= 0.4'}
+
+  es-set-tostringtag@2.1.0:
+    resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+    engines: {node: '>= 0.4'}
+
+  es-to-primitive@1.3.0:
+    resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+    engines: {node: '>= 0.4'}
+
+  esbuild@0.25.10:
+    resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+  escape-string-regexp@1.0.5:
+    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+    engines: {node: '>=0.8.0'}
+
+  escape-string-regexp@5.0.0:
+    resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+    engines: {node: '>=12'}
+
+  estree-walker@2.0.2:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+  estree-walker@3.0.3:
+    resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+  etag@1.8.1:
+    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+    engines: {node: '>= 0.6'}
+
+  eventemitter3@2.0.3:
+    resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==}
+
+  expand-brackets@2.1.4:
+    resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
+    engines: {node: '>=0.10.0'}
+
+  exsolve@1.0.7:
+    resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
+
+  extend-shallow@2.0.1:
+    resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+    engines: {node: '>=0.10.0'}
+
+  extend-shallow@3.0.2:
+    resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
+    engines: {node: '>=0.10.0'}
+
+  extend@3.0.2:
+    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+  extglob@2.0.4:
+    resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
+    engines: {node: '>=0.10.0'}
+
+  fast-diff@1.1.2:
+    resolution: {integrity: sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==}
+
+  fast-diff@1.2.0:
+    resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==}
+
+  fast-glob@3.3.3:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+    engines: {node: '>=8.6.0'}
+
+  fastq@1.19.1:
+    resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+  fdir@6.5.0:
+    resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+    engines: {node: '>=12.0.0'}
+    peerDependencies:
+      picomatch: ^3 || ^4
+    peerDependenciesMeta:
+      picomatch:
+        optional: true
+
+  file-saver@2.0.5:
+    resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
+
+  fill-range@4.0.0:
+    resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
+    engines: {node: '>=0.10.0'}
+
+  fill-range@7.1.1:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  follow-redirects@1.15.11:
+    resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+
+  for-each@0.3.5:
+    resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+    engines: {node: '>= 0.4'}
+
+  for-in@1.0.2:
+    resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
+    engines: {node: '>=0.10.0'}
+
+  foreground-child@3.3.1:
+    resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+    engines: {node: '>=14'}
+
+  form-data@4.0.4:
+    resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==}
+    engines: {node: '>= 6'}
+
+  fragment-cache@0.2.1:
+    resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
+    engines: {node: '>=0.10.0'}
+
+  fs-extra@10.1.0:
+    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+    engines: {node: '>=12'}
+
+  fsevents@2.3.3:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+
+  function-bind@1.1.2:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+  function.prototype.name@1.1.8:
+    resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+    engines: {node: '>= 0.4'}
+
+  functions-have-names@1.2.3:
+    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+  fuse.js@6.6.2:
+    resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==}
+    engines: {node: '>=10'}
+
+  generator-function@2.0.1:
+    resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
+    engines: {node: '>= 0.4'}
+
+  get-intrinsic@1.3.0:
+    resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+    engines: {node: '>= 0.4'}
+
+  get-proto@1.0.1:
+    resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+    engines: {node: '>= 0.4'}
+
+  get-symbol-description@1.1.0:
+    resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+    engines: {node: '>= 0.4'}
+
+  get-value@2.0.6:
+    resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
+    engines: {node: '>=0.10.0'}
+
+  glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  glob@10.4.5:
+    resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+    hasBin: true
+
+  globalthis@1.0.4:
+    resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+    engines: {node: '>= 0.4'}
+
+  good-listener@1.2.2:
+    resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==}
+
+  gopd@1.2.0:
+    resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+    engines: {node: '>= 0.4'}
+
+  graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  has-ansi@2.0.0:
+    resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==}
+    engines: {node: '>=0.10.0'}
+
+  has-bigints@1.1.0:
+    resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+    engines: {node: '>= 0.4'}
+
+  has-flag@1.0.0:
+    resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==}
+    engines: {node: '>=0.10.0'}
+
+  has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  has-property-descriptors@1.0.2:
+    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+  has-proto@1.2.0:
+    resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+    engines: {node: '>= 0.4'}
+
+  has-symbols@1.1.0:
+    resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+    engines: {node: '>= 0.4'}
+
+  has-tostringtag@1.0.2:
+    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+    engines: {node: '>= 0.4'}
+
+  has-value@0.3.1:
+    resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
+    engines: {node: '>=0.10.0'}
+
+  has-value@1.0.0:
+    resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
+    engines: {node: '>=0.10.0'}
+
+  has-values@0.1.4:
+    resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
+    engines: {node: '>=0.10.0'}
+
+  has-values@1.0.0:
+    resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
+    engines: {node: '>=0.10.0'}
+
+  hasown@2.0.2:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
+
+  he@1.2.0:
+    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+    hasBin: true
+
+  hookable@5.5.3:
+    resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
+
+  htmlparser2@3.10.1:
+    resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
+
+  image-size@0.5.5:
+    resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+    engines: {node: '>=0.10.0'}
+    hasBin: true
+
+  immutable@5.1.3:
+    resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==}
+
+  inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+  ini@1.3.8:
+    resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+  internal-slot@1.1.0:
+    resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+    engines: {node: '>= 0.4'}
+
+  is-accessor-descriptor@1.0.1:
+    resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==}
+    engines: {node: '>= 0.10'}
+
+  is-arguments@1.2.0:
+    resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+    engines: {node: '>= 0.4'}
+
+  is-array-buffer@3.0.5:
+    resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+    engines: {node: '>= 0.4'}
+
+  is-async-function@2.1.1:
+    resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+    engines: {node: '>= 0.4'}
+
+  is-bigint@1.1.0:
+    resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+    engines: {node: '>= 0.4'}
+
+  is-boolean-object@1.2.2:
+    resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+    engines: {node: '>= 0.4'}
+
+  is-buffer@1.1.6:
+    resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
+
+  is-callable@1.2.7:
+    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+    engines: {node: '>= 0.4'}
+
+  is-data-descriptor@1.0.1:
+    resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==}
+    engines: {node: '>= 0.4'}
+
+  is-data-view@1.0.2:
+    resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+    engines: {node: '>= 0.4'}
+
+  is-date-object@1.1.0:
+    resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+    engines: {node: '>= 0.4'}
+
+  is-descriptor@0.1.7:
+    resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==}
+    engines: {node: '>= 0.4'}
+
+  is-descriptor@1.0.3:
+    resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==}
+    engines: {node: '>= 0.4'}
+
+  is-extendable@0.1.1:
+    resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+    engines: {node: '>=0.10.0'}
+
+  is-extendable@1.0.1:
+    resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
+    engines: {node: '>=0.10.0'}
+
+  is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  is-finalizationregistry@1.1.1:
+    resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+    engines: {node: '>= 0.4'}
+
+  is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+
+  is-generator-function@1.1.2:
+    resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
+    engines: {node: '>= 0.4'}
+
+  is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  is-map@2.0.3:
+    resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+    engines: {node: '>= 0.4'}
+
+  is-negative-zero@2.0.3:
+    resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+    engines: {node: '>= 0.4'}
+
+  is-number-object@1.1.1:
+    resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+    engines: {node: '>= 0.4'}
+
+  is-number@3.0.0:
+    resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
+    engines: {node: '>=0.10.0'}
+
+  is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  is-plain-obj@1.1.0:
+    resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+    engines: {node: '>=0.10.0'}
+
+  is-plain-object@2.0.4:
+    resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+    engines: {node: '>=0.10.0'}
+
+  is-regex@1.2.1:
+    resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+    engines: {node: '>= 0.4'}
+
+  is-set@2.0.3:
+    resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+    engines: {node: '>= 0.4'}
+
+  is-shared-array-buffer@1.0.4:
+    resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+    engines: {node: '>= 0.4'}
+
+  is-string@1.1.1:
+    resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+    engines: {node: '>= 0.4'}
+
+  is-symbol@1.1.1:
+    resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+    engines: {node: '>= 0.4'}
+
+  is-typed-array@1.1.15:
+    resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+    engines: {node: '>= 0.4'}
+
+  is-weakmap@2.0.2:
+    resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+    engines: {node: '>= 0.4'}
+
+  is-weakref@1.1.1:
+    resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+    engines: {node: '>= 0.4'}
+
+  is-weakset@2.0.4:
+    resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+    engines: {node: '>= 0.4'}
+
+  is-what@4.1.16:
+    resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
+    engines: {node: '>=12.13'}
+
+  is-windows@1.0.2:
+    resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+    engines: {node: '>=0.10.0'}
+
+  isarray@1.0.0:
+    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+  isarray@2.0.5:
+    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+  isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  isobject@2.1.0:
+    resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
+    engines: {node: '>=0.10.0'}
+
+  isobject@3.0.1:
+    resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+    engines: {node: '>=0.10.0'}
+
+  jackspeak@3.4.3:
+    resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+  jiti@2.6.1:
+    resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
+    hasBin: true
+
+  js-base64@2.6.4:
+    resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==}
+
+  js-beautify@1.14.11:
+    resolution: {integrity: sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  js-cookie@3.0.5:
+    resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
+    engines: {node: '>=14'}
+
+  js-tokens@9.0.1:
+    resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
+  jsencrypt@3.3.2:
+    resolution: {integrity: sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==}
+
+  json5@1.0.2:
+    resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+    hasBin: true
+
+  jsonfile@6.2.0:
+    resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
+
+  kind-of@3.2.2:
+    resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
+    engines: {node: '>=0.10.0'}
+
+  kind-of@4.0.0:
+    resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
+    engines: {node: '>=0.10.0'}
+
+  kind-of@5.1.0:
+    resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==}
+    engines: {node: '>=0.10.0'}
+
+  kind-of@6.0.3:
+    resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+    engines: {node: '>=0.10.0'}
+
+  lightningcss-darwin-arm64@1.30.1:
+    resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  lightningcss-darwin-x64@1.30.1:
+    resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  lightningcss-freebsd-x64@1.30.1:
+    resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  lightningcss-linux-arm-gnueabihf@1.30.1:
+    resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  lightningcss-linux-arm64-gnu@1.30.1:
+    resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  lightningcss-linux-arm64-musl@1.30.1:
+    resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  lightningcss-linux-x64-gnu@1.30.1:
+    resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  lightningcss-linux-x64-musl@1.30.1:
+    resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  lightningcss-win32-arm64-msvc@1.30.1:
+    resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  lightningcss-win32-x64-msvc@1.30.1:
+    resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  lightningcss@1.30.1:
+    resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==}
+    engines: {node: '>= 12.0.0'}
+
+  loader-utils@1.4.2:
+    resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
+    engines: {node: '>=4.0.0'}
+
+  local-pkg@0.5.1:
+    resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
+    engines: {node: '>=14'}
+
+  local-pkg@1.1.2:
+    resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
+    engines: {node: '>=14'}
+
+  lodash-es@4.17.21:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+  lodash-unified@1.0.3:
+    resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
+    peerDependencies:
+      '@types/lodash-es': '*'
+      lodash: '*'
+      lodash-es: '*'
+
+  lodash.clonedeep@4.5.0:
+    resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+
+  lodash.isequal@4.5.0:
+    resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+    deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead.
+
+  lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+  lru-cache@10.4.3:
+    resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+  magic-string@0.26.7:
+    resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==}
+    engines: {node: '>=12'}
+
+  magic-string@0.30.19:
+    resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==}
+
+  map-cache@0.2.2:
+    resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+    engines: {node: '>=0.10.0'}
+
+  map-visit@1.0.0:
+    resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
+    engines: {node: '>=0.10.0'}
+
+  math-intrinsics@1.1.0:
+    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+    engines: {node: '>= 0.4'}
+
+  mdn-data@2.0.14:
+    resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+
+  memoize-one@6.0.0:
+    resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+
+  merge-options@1.0.1:
+    resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==}
+    engines: {node: '>=4'}
+
+  merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
+  micromatch@3.1.0:
+    resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==}
+    engines: {node: '>=0.10.0'}
+
+  micromatch@4.0.8:
+    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+    engines: {node: '>=8.6'}
+
+  mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+
+  mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
+
+  minimatch@9.0.1:
+    resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minimatch@9.0.5:
+    resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minimist@1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+  minipass@7.1.2:
+    resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  minizlib@3.1.0:
+    resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
+    engines: {node: '>= 18'}
+
+  mitt@3.0.1:
+    resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
+
+  mixin-deep@1.3.2:
+    resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
+    engines: {node: '>=0.10.0'}
+
+  mlly@1.8.0:
+    resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
+
+  ms@2.0.0:
+    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+  ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  nanoid@3.3.11:
+    resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  nanomatch@1.2.13:
+    resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
+    engines: {node: '>=0.10.0'}
+
+  nopt@7.2.1:
+    resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+    hasBin: true
+
+  normalize-wheel-es@1.2.0:
+    resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
+
+  nprogress@0.2.0:
+    resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
+
+  nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+  object-assign@4.1.1:
+    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+    engines: {node: '>=0.10.0'}
+
+  object-copy@0.1.0:
+    resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
+    engines: {node: '>=0.10.0'}
+
+  object-inspect@1.13.4:
+    resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+    engines: {node: '>= 0.4'}
+
+  object-is@1.1.6:
+    resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+    engines: {node: '>= 0.4'}
+
+  object-keys@1.1.1:
+    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+    engines: {node: '>= 0.4'}
+
+  object-visit@1.0.1:
+    resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
+    engines: {node: '>=0.10.0'}
+
+  object.assign@4.1.7:
+    resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+    engines: {node: '>= 0.4'}
+
+  object.pick@1.3.0:
+    resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+    engines: {node: '>=0.10.0'}
+
+  own-keys@1.0.1:
+    resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+    engines: {node: '>= 0.4'}
+
+  package-json-from-dist@1.0.1:
+    resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+  parchment@1.1.4:
+    resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==}
+
+  pascalcase@0.1.1:
+    resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
+    engines: {node: '>=0.10.0'}
+
+  path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  path-scurry@1.11.1:
+    resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+    engines: {node: '>=16 || 14 >=14.18'}
+
+  pathe@0.2.0:
+    resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==}
+
+  pathe@2.0.3:
+    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+  perfect-debounce@1.0.0:
+    resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
+
+  picocolors@1.1.1:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+  picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  picomatch@4.0.3:
+    resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+    engines: {node: '>=12'}
+
+  pinia@3.0.2:
+    resolution: {integrity: sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==}
+    peerDependencies:
+      typescript: '>=4.4.4'
+      vue: ^2.7.0 || ^3.5.11
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  pkg-types@1.3.1:
+    resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+  pkg-types@2.3.0:
+    resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+
+  posix-character-classes@0.1.1:
+    resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
+    engines: {node: '>=0.10.0'}
+
+  possible-typed-array-names@1.1.0:
+    resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+    engines: {node: '>= 0.4'}
+
+  postcss-prefix-selector@1.16.1:
+    resolution: {integrity: sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==}
+    peerDependencies:
+      postcss: '>4 <9'
+
+  postcss@5.2.18:
+    resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==}
+    engines: {node: '>=0.12'}
+
+  postcss@8.5.6:
+    resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  posthtml-parser@0.2.1:
+    resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==}
+
+  posthtml-rename-id@1.0.12:
+    resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==}
+
+  posthtml-render@1.4.0:
+    resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==}
+    engines: {node: '>=10'}
+
+  posthtml-svg-mode@1.0.3:
+    resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==}
+
+  posthtml@0.9.2:
+    resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==}
+    engines: {node: '>=0.10.0'}
+
+  proto-list@1.2.4:
+    resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+
+  proxy-from-env@1.1.0:
+    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+  quansync@0.2.11:
+    resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
+  query-string@4.3.4:
+    resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==}
+    engines: {node: '>=0.10.0'}
+
+  queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  quill-delta@3.6.3:
+    resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==}
+    engines: {node: '>=0.10'}
+
+  quill-delta@4.2.2:
+    resolution: {integrity: sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==}
+
+  quill@1.3.7:
+    resolution: {integrity: sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==}
+
+  readable-stream@3.6.2:
+    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+    engines: {node: '>= 6'}
+
+  reflect.getprototypeof@1.0.10:
+    resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+    engines: {node: '>= 0.4'}
+
+  regex-not@1.0.2:
+    resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
+    engines: {node: '>=0.10.0'}
+
+  regexp.prototype.flags@1.5.4:
+    resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+    engines: {node: '>= 0.4'}
+
+  repeat-element@1.1.4:
+    resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
+    engines: {node: '>=0.10.0'}
+
+  repeat-string@1.6.1:
+    resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+    engines: {node: '>=0.10'}
+
+  resolve-url@0.2.1:
+    resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
+    deprecated: https://github.com/lydell/resolve-url#deprecated
+
+  ret@0.1.15:
+    resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+    engines: {node: '>=0.12'}
+
+  reusify@1.1.0:
+    resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+  rfdc@1.4.1:
+    resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+  rollup@4.52.3:
+    resolution: {integrity: sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
+
+  run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+  rxjs@7.8.2:
+    resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
+
+  safe-array-concat@1.1.3:
+    resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+    engines: {node: '>=0.4'}
+
+  safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+  safe-push-apply@1.0.0:
+    resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+    engines: {node: '>= 0.4'}
+
+  safe-regex-test@1.1.0:
+    resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+    engines: {node: '>= 0.4'}
+
+  safe-regex@1.1.0:
+    resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
+
+  sass-embedded-android-arm64@1.89.1:
+    resolution: {integrity: sha512-Je6x7uuJRGQdr5ziSJdaPA4NhBSO26BU/E55qiuMUZpjq2EWBEJPbNeugu/cWlCEmfqoVuxj37r8aEU+KG0H1g==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  sass-embedded-android-arm@1.89.1:
+    resolution: {integrity: sha512-wVchZSz8zbJBwwOs9/iwco/M5G3L5BaeqwUF1EC3Gtzn1BsXYUEkJfftW2HxGl4hQz2YlpR7BY1GRN817uxADA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm]
+    os: [android]
+
+  sass-embedded-android-riscv64@1.89.1:
+    resolution: {integrity: sha512-DhWe+A4RVtpHMVaQgdzRpiczAXKPl7XhyY9USkY9Xkhv94+csTfjyuFmsUuCpKSiQDQkD+rGByfg+9yQIk/RgQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [riscv64]
+    os: [android]
+
+  sass-embedded-android-x64@1.89.1:
+    resolution: {integrity: sha512-LTEzxTXrv3evPiHBmDMtJtO5tEprg7bvNOwYTjDEhE9ZCYdb70l+haIY0dVyhGxyeaBJlyvatjWOKEduPP3Lyw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [android]
+
+  sass-embedded-darwin-arm64@1.89.1:
+    resolution: {integrity: sha512-7qMO4BLdIOFMMc1M+hg5iWEjPxbPlH1XTPUCwyuXYqubz6kXkdrrtJXolNAAey/0ZOE6uXk0APugm93a/veQdQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  sass-embedded-darwin-x64@1.89.1:
+    resolution: {integrity: sha512-Jzuws3NNx4YtDdL2/skP8BvGqMBKn26XINehwLnD2kgbh0+k+vKNWt5JDomvIuZVLsK8zWrMoRkXpk4wuHdqrw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  sass-embedded-linux-arm64@1.89.1:
+    resolution: {integrity: sha512-h967EV2armjV+Re+hHv7LaIzCOvV6DoFod9GJhXTdnPvilqs7DAPTUfN07wOqbzjlaGEnITZXzLsWAoZ1Z7tWQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  sass-embedded-linux-arm@1.89.1:
+    resolution: {integrity: sha512-8TvFr/lh7FARtNr9mM57m7NNvtSZwnlkXtfY1D48B81Ve6GgtLqQhELNzvTcfQ0WZa0aNnVjq9XUuWLlrMDaZQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  sass-embedded-linux-musl-arm64@1.89.1:
+    resolution: {integrity: sha512-l4TrsUmE3AEPy2gDThb+OQV5xSyrb807DJbkQiFtTwvtOZAAkoVl1v2QeocW0npgKjc/W7nHMiSempJe0UcV7w==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  sass-embedded-linux-musl-arm@1.89.1:
+    resolution: {integrity: sha512-Tl8wDL+3qFa/AhvZZBb1OvhN1SvIsRSLaPdGP8cv3VmKKVBdlLp2zedPTlcLJpR9dG/bjtGJYGX15kWHAvZ6mQ==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  sass-embedded-linux-musl-riscv64@1.89.1:
+    resolution: {integrity: sha512-YJVZmz032U7dv4RW3u+SJGp+DQWmYWc5fX/aXzLuoL6PPUPon1/Sseaf/5YGtcuQf8RnxZBbM2nFHFVHDJfsQw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [riscv64]
+    os: [linux]
+
+  sass-embedded-linux-musl-x64@1.89.1:
+    resolution: {integrity: sha512-67ijpk87V0VlpdVTtgnfIzRkVUMtEH79nvGctvNpk0XT6v+oxoFRljFRiYItZOxb5gRZMnvtkgaz1VHVcMrhtg==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  sass-embedded-linux-riscv64@1.89.1:
+    resolution: {integrity: sha512-SQNWy5kUvlQJUKRXFy8jS05DBik+2ERIWDxOBk+QuJYEIktlA9fKKBU8c7RkgpZFNXSXZa0W1Gy27oOFCzhhuA==}
+    engines: {node: '>=14.0.0'}
+    cpu: [riscv64]
+    os: [linux]
+
+  sass-embedded-linux-x64@1.89.1:
+    resolution: {integrity: sha512-KUqGzBvTDZG6D3Pq41sCzqO1wkxM0WmxxlI7PTuVkvgciTywHf8F7mkg2alMLVZQ6APJEYtlnCGQgn4cCgYsqw==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  sass-embedded-win32-arm64@1.89.1:
+    resolution: {integrity: sha512-Lk6dYA18RasZxQhShT91G7Z2o7+F9necTNJ951a5AICsSJpTbg3tTnAGB7Rvd6xB5reQSZoXfB/zXKEKwtzaow==}
+    engines: {node: '>=14.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  sass-embedded-win32-x64@1.89.1:
+    resolution: {integrity: sha512-YlvzrzFPHd4GKa04jMfP0t2DGJHPTm7zN4GEYtaOFqeS6BoEAUY5kBNYFy7zhwKesN3kGyU/D9rz1MfLRgGv0g==}
+    engines: {node: '>=14.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  sass-embedded@1.89.1:
+    resolution: {integrity: sha512-alvGGlyYdkSXYKOfS/TTxUD0993EYOe3adIPtwCWEg037qe183p2dkYnbaRsCLJFKt+QoyRzhsrbCsK7sbR6MA==}
+    engines: {node: '>=16.0.0'}
+    hasBin: true
+
+  scule@1.3.0:
+    resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
+
+  select@1.1.2:
+    resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==}
+
+  semver@7.7.2:
+    resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  set-function-length@1.2.2:
+    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+    engines: {node: '>= 0.4'}
+
+  set-function-name@2.0.2:
+    resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+    engines: {node: '>= 0.4'}
+
+  set-proto@1.0.0:
+    resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+    engines: {node: '>= 0.4'}
+
+  set-value@2.0.1:
+    resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
+    engines: {node: '>=0.10.0'}
+
+  shebang-command@2.0.0:
+    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+    engines: {node: '>=8'}
+
+  shebang-regex@3.0.0:
+    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+    engines: {node: '>=8'}
+
+  side-channel-list@1.0.0:
+    resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+    engines: {node: '>= 0.4'}
+
+  side-channel-map@1.0.1:
+    resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+    engines: {node: '>= 0.4'}
+
+  side-channel-weakmap@1.0.2:
+    resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+    engines: {node: '>= 0.4'}
+
+  side-channel@1.1.0:
+    resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+    engines: {node: '>= 0.4'}
+
+  signal-exit@4.1.0:
+    resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+    engines: {node: '>=14'}
+
+  snapdragon-node@2.1.1:
+    resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
+    engines: {node: '>=0.10.0'}
+
+  snapdragon-util@3.0.1:
+    resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
+    engines: {node: '>=0.10.0'}
+
+  snapdragon@0.8.2:
+    resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
+    engines: {node: '>=0.10.0'}
+
+  sortablejs@1.14.0:
+    resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==}
+
+  sortablejs@1.15.6:
+    resolution: {integrity: sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==}
+
+  source-map-js@1.2.1:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
+
+  source-map-resolve@0.5.3:
+    resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
+    deprecated: See https://github.com/lydell/source-map-resolve#deprecated
+
+  source-map-url@0.4.1:
+    resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
+    deprecated: See https://github.com/lydell/source-map-url#deprecated
+
+  source-map@0.5.7:
+    resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+    engines: {node: '>=0.10.0'}
+
+  source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+
+  sourcemap-codec@1.4.8:
+    resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+    deprecated: Please use @jridgewell/sourcemap-codec instead
+
+  speakingurl@14.0.1:
+    resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
+    engines: {node: '>=0.10.0'}
+
+  split-string@3.1.0:
+    resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
+    engines: {node: '>=0.10.0'}
+
+  splitpanes@4.0.4:
+    resolution: {integrity: sha512-RbysugZhjbCw5fgplvk3hOXr41stahQDtZhHVkhnnJI6H4wlGDhM2kIpbehy7v92duy9GnMa8zIhHigIV1TWtg==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  stable@0.1.8:
+    resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
+    deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
+
+  static-extend@0.1.2:
+    resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
+    engines: {node: '>=0.10.0'}
+
+  stop-iteration-iterator@1.1.0:
+    resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
+    engines: {node: '>= 0.4'}
+
+  strict-uri-encode@1.1.0:
+    resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
+    engines: {node: '>=0.10.0'}
+
+  string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+
+  string-width@5.1.2:
+    resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+    engines: {node: '>=12'}
+
+  string.prototype.trim@1.2.10:
+    resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.trimend@1.0.9:
+    resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+    engines: {node: '>= 0.4'}
+
+  string.prototype.trimstart@1.0.8:
+    resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+    engines: {node: '>= 0.4'}
+
+  string_decoder@1.3.0:
+    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+  strip-ansi@3.0.1:
+    resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
+    engines: {node: '>=0.10.0'}
+
+  strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+
+  strip-ansi@7.1.2:
+    resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
+    engines: {node: '>=12'}
+
+  strip-literal@2.1.1:
+    resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==}
+
+  superjson@2.2.2:
+    resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==}
+    engines: {node: '>=16'}
+
+  supports-color@2.0.0:
+    resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
+    engines: {node: '>=0.8.0'}
+
+  supports-color@3.2.3:
+    resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==}
+    engines: {node: '>=0.8.0'}
+
+  supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
+
+  supports-color@8.1.1:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+
+  svg-baker@1.7.0:
+    resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==}
+
+  svgo@2.8.0:
+    resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+
+  sync-child-process@1.0.2:
+    resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==}
+    engines: {node: '>=16.0.0'}
+
+  sync-message-port@1.1.3:
+    resolution: {integrity: sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==}
+    engines: {node: '>=16.0.0'}
+
+  tailwindcss@4.1.14:
+    resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==}
+
+  tapable@2.3.0:
+    resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
+    engines: {node: '>=6'}
+
+  tar@7.5.1:
+    resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==}
+    engines: {node: '>=18'}
+
+  tiny-emitter@2.1.0:
+    resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
+
+  tinyglobby@0.2.15:
+    resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+    engines: {node: '>=12.0.0'}
+
+  to-object-path@0.3.0:
+    resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
+    engines: {node: '>=0.10.0'}
+
+  to-regex-range@2.1.1:
+    resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
+    engines: {node: '>=0.10.0'}
+
+  to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+
+  to-regex@3.0.2:
+    resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
+    engines: {node: '>=0.10.0'}
+
+  traverse@0.6.11:
+    resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==}
+    engines: {node: '>= 0.4'}
+
+  tslib@2.3.0:
+    resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==}
+
+  tslib@2.8.1:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+  typed-array-buffer@1.0.3:
+    resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-byte-length@1.0.3:
+    resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-byte-offset@1.0.4:
+    resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+    engines: {node: '>= 0.4'}
+
+  typed-array-length@1.0.7:
+    resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+    engines: {node: '>= 0.4'}
+
+  typedarray.prototype.slice@1.0.5:
+    resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==}
+    engines: {node: '>= 0.4'}
+
+  ufo@1.6.1:
+    resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
+
+  unbox-primitive@1.1.0:
+    resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+    engines: {node: '>= 0.4'}
+
+  undici-types@7.13.0:
+    resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==}
+
+  unimport@3.14.6:
+    resolution: {integrity: sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==}
+
+  union-value@1.0.1:
+    resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
+    engines: {node: '>=0.10.0'}
+
+  universalify@2.0.1:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+
+  unplugin-auto-import@0.18.6:
+    resolution: {integrity: sha512-LMFzX5DtkTj/3wZuyG5bgKBoJ7WSgzqSGJ8ppDRdlvPh45mx6t6w3OcbExQi53n3xF5MYkNGPNR/HYOL95KL2A==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@nuxt/kit': ^3.2.2
+      '@vueuse/core': '*'
+    peerDependenciesMeta:
+      '@nuxt/kit':
+        optional: true
+      '@vueuse/core':
+        optional: true
+
+  unplugin-vue-setup-extend-plus@1.0.1:
+    resolution: {integrity: sha512-mW2IzkyJITyspAV/LEdnEyE1CJip9jB5fCeaVv7Q6X0oJyDrOxXoB+jyet0q5pRJNjErbjQx950/8NPTvbqLTQ==}
+
+  unplugin@1.16.1:
+    resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
+    engines: {node: '>=14.0.0'}
+
+  unset-value@1.0.0:
+    resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
+    engines: {node: '>=0.10.0'}
+
+  urix@0.1.0:
+    resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
+    deprecated: Please see https://github.com/lydell/urix#deprecated
+
+  use@3.1.1:
+    resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
+    engines: {node: '>=0.10.0'}
+
+  util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+  varint@6.0.0:
+    resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
+
+  vary@1.1.2:
+    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+    engines: {node: '>= 0.8'}
+
+  vite-plugin-compression@0.5.1:
+    resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
+    peerDependencies:
+      vite: '>=2.0.0'
+
+  vite-plugin-svg-icons@2.0.1:
+    resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==}
+    peerDependencies:
+      vite: '>=2.0.0'
+
+  vite@6.3.5:
+    resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==}
+    engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+    hasBin: true
+    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
+
+  vue-cropper@1.1.1:
+    resolution: {integrity: sha512-WsqKMpaBf9Osi1LQlE/5AKdD0nHWOy1asLXocaG8NomOWO07jiZi968+/PbMmnD0QbPJOumDQaGuGa13qys85A==}
+
+  vue-demi@0.14.10:
+    resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
+    engines: {node: '>=12'}
+    hasBin: true
+    peerDependencies:
+      '@vue/composition-api': ^1.0.0-rc.1
+      vue: ^3.0.0-0 || ^2.6.0
+    peerDependenciesMeta:
+      '@vue/composition-api':
+        optional: true
+
+  vue-router@4.5.1:
+    resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==}
+    peerDependencies:
+      vue: ^3.2.0
+
+  vue@3.5.16:
+    resolution: {integrity: sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  vuedraggable@4.1.0:
+    resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
+    peerDependencies:
+      vue: ^3.0.1
+
+  webpack-virtual-modules@0.6.2:
+    resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
+  which-boxed-primitive@1.1.1:
+    resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+    engines: {node: '>= 0.4'}
+
+  which-builtin-type@1.2.1:
+    resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+    engines: {node: '>= 0.4'}
+
+  which-collection@1.0.2:
+    resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+    engines: {node: '>= 0.4'}
+
+  which-typed-array@1.1.19:
+    resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
+    engines: {node: '>= 0.4'}
+
+  which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+
+  wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+
+  wrap-ansi@8.1.0:
+    resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+    engines: {node: '>=12'}
+
+  yallist@5.0.0:
+    resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
+    engines: {node: '>=18'}
+
+  zrender@5.6.1:
+    resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==}
+
+snapshots:
+
+  '@antfu/utils@0.7.10': {}
+
+  '@babel/helper-string-parser@7.27.1': {}
+
+  '@babel/helper-validator-identifier@7.27.1': {}
+
+  '@babel/parser@7.28.4':
+    dependencies:
+      '@babel/types': 7.28.4
+
+  '@babel/types@7.28.4':
+    dependencies:
+      '@babel/helper-string-parser': 7.27.1
+      '@babel/helper-validator-identifier': 7.27.1
+
+  '@bufbuild/protobuf@2.9.0': {}
+
+  '@ctrl/tinycolor@3.6.1': {}
+
+  '@element-plus/icons-vue@2.3.1(vue@3.5.16)':
+    dependencies:
+      vue: 3.5.16
+
+  '@esbuild/aix-ppc64@0.25.10':
+    optional: true
+
+  '@esbuild/android-arm64@0.25.10':
+    optional: true
+
+  '@esbuild/android-arm@0.25.10':
+    optional: true
+
+  '@esbuild/android-x64@0.25.10':
+    optional: true
+
+  '@esbuild/darwin-arm64@0.25.10':
+    optional: true
+
+  '@esbuild/darwin-x64@0.25.10':
+    optional: true
+
+  '@esbuild/freebsd-arm64@0.25.10':
+    optional: true
+
+  '@esbuild/freebsd-x64@0.25.10':
+    optional: true
+
+  '@esbuild/linux-arm64@0.25.10':
+    optional: true
+
+  '@esbuild/linux-arm@0.25.10':
+    optional: true
+
+  '@esbuild/linux-ia32@0.25.10':
+    optional: true
+
+  '@esbuild/linux-loong64@0.25.10':
+    optional: true
+
+  '@esbuild/linux-mips64el@0.25.10':
+    optional: true
+
+  '@esbuild/linux-ppc64@0.25.10':
+    optional: true
+
+  '@esbuild/linux-riscv64@0.25.10':
+    optional: true
+
+  '@esbuild/linux-s390x@0.25.10':
+    optional: true
+
+  '@esbuild/linux-x64@0.25.10':
+    optional: true
+
+  '@esbuild/netbsd-arm64@0.25.10':
+    optional: true
+
+  '@esbuild/netbsd-x64@0.25.10':
+    optional: true
+
+  '@esbuild/openbsd-arm64@0.25.10':
+    optional: true
+
+  '@esbuild/openbsd-x64@0.25.10':
+    optional: true
+
+  '@esbuild/openharmony-arm64@0.25.10':
+    optional: true
+
+  '@esbuild/sunos-x64@0.25.10':
+    optional: true
+
+  '@esbuild/win32-arm64@0.25.10':
+    optional: true
+
+  '@esbuild/win32-ia32@0.25.10':
+    optional: true
+
+  '@esbuild/win32-x64@0.25.10':
+    optional: true
+
+  '@floating-ui/core@1.7.3':
+    dependencies:
+      '@floating-ui/utils': 0.2.10
+
+  '@floating-ui/dom@1.7.4':
+    dependencies:
+      '@floating-ui/core': 1.7.3
+      '@floating-ui/utils': 0.2.10
+
+  '@floating-ui/utils@0.2.10': {}
+
+  '@isaacs/cliui@8.0.2':
+    dependencies:
+      string-width: 5.1.2
+      string-width-cjs: string-width@4.2.3
+      strip-ansi: 7.1.2
+      strip-ansi-cjs: strip-ansi@6.0.1
+      wrap-ansi: 8.1.0
+      wrap-ansi-cjs: wrap-ansi@7.0.0
+
+  '@isaacs/fs-minipass@4.0.1':
+    dependencies:
+      minipass: 7.1.2
+
+  '@jridgewell/gen-mapping@0.3.13':
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.5
+      '@jridgewell/trace-mapping': 0.3.31
+
+  '@jridgewell/remapping@2.3.5':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.13
+      '@jridgewell/trace-mapping': 0.3.31
+
+  '@jridgewell/resolve-uri@3.1.2': {}
+
+  '@jridgewell/sourcemap-codec@1.5.5': {}
+
+  '@jridgewell/trace-mapping@0.3.31':
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.2
+      '@jridgewell/sourcemap-codec': 1.5.5
+
+  '@nodelib/fs.scandir@2.1.5':
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+
+  '@nodelib/fs.stat@2.0.5': {}
+
+  '@nodelib/fs.walk@1.2.8':
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.19.1
+
+  '@one-ini/wasm@0.1.1': {}
+
+  '@pkgjs/parseargs@0.11.0':
+    optional: true
+
+  '@rollup/pluginutils@5.3.0(rollup@4.52.3)':
+    dependencies:
+      '@types/estree': 1.0.8
+      estree-walker: 2.0.2
+      picomatch: 4.0.3
+    optionalDependencies:
+      rollup: 4.52.3
+
+  '@rollup/rollup-android-arm-eabi@4.52.3':
+    optional: true
+
+  '@rollup/rollup-android-arm64@4.52.3':
+    optional: true
+
+  '@rollup/rollup-darwin-arm64@4.52.3':
+    optional: true
+
+  '@rollup/rollup-darwin-x64@4.52.3':
+    optional: true
+
+  '@rollup/rollup-freebsd-arm64@4.52.3':
+    optional: true
+
+  '@rollup/rollup-freebsd-x64@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-arm-gnueabihf@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-arm-musleabihf@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-gnu@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-arm64-musl@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-loong64-gnu@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-ppc64-gnu@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-gnu@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-riscv64-musl@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-s390x-gnu@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-x64-gnu@4.52.3':
+    optional: true
+
+  '@rollup/rollup-linux-x64-musl@4.52.3':
+    optional: true
+
+  '@rollup/rollup-openharmony-arm64@4.52.3':
+    optional: true
+
+  '@rollup/rollup-win32-arm64-msvc@4.52.3':
+    optional: true
+
+  '@rollup/rollup-win32-ia32-msvc@4.52.3':
+    optional: true
+
+  '@rollup/rollup-win32-x64-gnu@4.52.3':
+    optional: true
+
+  '@rollup/rollup-win32-x64-msvc@4.52.3':
+    optional: true
+
+  '@sxzz/popperjs-es@2.11.7': {}
+
+  '@tailwindcss/node@4.1.14':
+    dependencies:
+      '@jridgewell/remapping': 2.3.5
+      enhanced-resolve: 5.18.3
+      jiti: 2.6.1
+      lightningcss: 1.30.1
+      magic-string: 0.30.19
+      source-map-js: 1.2.1
+      tailwindcss: 4.1.14
+
+  '@tailwindcss/oxide-android-arm64@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-darwin-arm64@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-darwin-x64@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-freebsd-x64@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-linux-arm64-gnu@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-linux-arm64-musl@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-linux-x64-gnu@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-linux-x64-musl@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-wasm32-wasi@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-win32-arm64-msvc@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide-win32-x64-msvc@4.1.14':
+    optional: true
+
+  '@tailwindcss/oxide@4.1.14':
+    dependencies:
+      detect-libc: 2.1.1
+      tar: 7.5.1
+    optionalDependencies:
+      '@tailwindcss/oxide-android-arm64': 4.1.14
+      '@tailwindcss/oxide-darwin-arm64': 4.1.14
+      '@tailwindcss/oxide-darwin-x64': 4.1.14
+      '@tailwindcss/oxide-freebsd-x64': 4.1.14
+      '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14
+      '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14
+      '@tailwindcss/oxide-linux-arm64-musl': 4.1.14
+      '@tailwindcss/oxide-linux-x64-gnu': 4.1.14
+      '@tailwindcss/oxide-linux-x64-musl': 4.1.14
+      '@tailwindcss/oxide-wasm32-wasi': 4.1.14
+      '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14
+      '@tailwindcss/oxide-win32-x64-msvc': 4.1.14
+
+  '@tailwindcss/vite@4.1.14(vite@6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1))':
+    dependencies:
+      '@tailwindcss/node': 4.1.14
+      '@tailwindcss/oxide': 4.1.14
+      tailwindcss: 4.1.14
+      vite: 6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1)
+
+  '@trysound/sax@0.2.0': {}
+
+  '@types/estree@1.0.8': {}
+
+  '@types/lodash-es@4.17.12':
+    dependencies:
+      '@types/lodash': 4.17.20
+
+  '@types/lodash@4.17.20': {}
+
+  '@types/node@24.6.1':
+    dependencies:
+      undici-types: 7.13.0
+
+  '@types/svgo@2.6.4':
+    dependencies:
+      '@types/node': 24.6.1
+
+  '@types/web-bluetooth@0.0.16': {}
+
+  '@types/web-bluetooth@0.0.21': {}
+
+  '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1))(vue@3.5.16)':
+    dependencies:
+      vite: 6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1)
+      vue: 3.5.16
+
+  '@vue/compiler-core@3.5.16':
+    dependencies:
+      '@babel/parser': 7.28.4
+      '@vue/shared': 3.5.16
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
+  '@vue/compiler-core@3.5.22':
+    dependencies:
+      '@babel/parser': 7.28.4
+      '@vue/shared': 3.5.22
+      entities: 4.5.0
+      estree-walker: 2.0.2
+      source-map-js: 1.2.1
+
+  '@vue/compiler-dom@3.5.16':
+    dependencies:
+      '@vue/compiler-core': 3.5.16
+      '@vue/shared': 3.5.16
+
+  '@vue/compiler-dom@3.5.22':
+    dependencies:
+      '@vue/compiler-core': 3.5.22
+      '@vue/shared': 3.5.22
+
+  '@vue/compiler-sfc@3.5.16':
+    dependencies:
+      '@babel/parser': 7.28.4
+      '@vue/compiler-core': 3.5.16
+      '@vue/compiler-dom': 3.5.16
+      '@vue/compiler-ssr': 3.5.16
+      '@vue/shared': 3.5.16
+      estree-walker: 2.0.2
+      magic-string: 0.30.19
+      postcss: 8.5.6
+      source-map-js: 1.2.1
+
+  '@vue/compiler-sfc@3.5.22':
+    dependencies:
+      '@babel/parser': 7.28.4
+      '@vue/compiler-core': 3.5.22
+      '@vue/compiler-dom': 3.5.22
+      '@vue/compiler-ssr': 3.5.22
+      '@vue/shared': 3.5.22
+      estree-walker: 2.0.2
+      magic-string: 0.30.19
+      postcss: 8.5.6
+      source-map-js: 1.2.1
+
+  '@vue/compiler-ssr@3.5.16':
+    dependencies:
+      '@vue/compiler-dom': 3.5.16
+      '@vue/shared': 3.5.16
+
+  '@vue/compiler-ssr@3.5.22':
+    dependencies:
+      '@vue/compiler-dom': 3.5.22
+      '@vue/shared': 3.5.22
+
+  '@vue/devtools-api@6.6.4': {}
+
+  '@vue/devtools-api@7.7.7':
+    dependencies:
+      '@vue/devtools-kit': 7.7.7
+
+  '@vue/devtools-kit@7.7.7':
+    dependencies:
+      '@vue/devtools-shared': 7.7.7
+      birpc: 2.6.1
+      hookable: 5.5.3
+      mitt: 3.0.1
+      perfect-debounce: 1.0.0
+      speakingurl: 14.0.1
+      superjson: 2.2.2
+
+  '@vue/devtools-shared@7.7.7':
+    dependencies:
+      rfdc: 1.4.1
+
+  '@vue/reactivity@3.5.16':
+    dependencies:
+      '@vue/shared': 3.5.16
+
+  '@vue/runtime-core@3.5.16':
+    dependencies:
+      '@vue/reactivity': 3.5.16
+      '@vue/shared': 3.5.16
+
+  '@vue/runtime-dom@3.5.16':
+    dependencies:
+      '@vue/reactivity': 3.5.16
+      '@vue/runtime-core': 3.5.16
+      '@vue/shared': 3.5.16
+      csstype: 3.1.3
+
+  '@vue/server-renderer@3.5.16(vue@3.5.16)':
+    dependencies:
+      '@vue/compiler-ssr': 3.5.16
+      '@vue/shared': 3.5.16
+      vue: 3.5.16
+
+  '@vue/shared@3.5.16': {}
+
+  '@vue/shared@3.5.22': {}
+
+  '@vueup/vue-quill@1.2.0(vue@3.5.16)':
+    dependencies:
+      quill: 1.3.7
+      quill-delta: 4.2.2
+      vue: 3.5.16
+
+  '@vueuse/core@13.3.0(vue@3.5.16)':
+    dependencies:
+      '@types/web-bluetooth': 0.0.21
+      '@vueuse/metadata': 13.3.0
+      '@vueuse/shared': 13.3.0(vue@3.5.16)
+      vue: 3.5.16
+
+  '@vueuse/core@9.13.0(vue@3.5.16)':
+    dependencies:
+      '@types/web-bluetooth': 0.0.16
+      '@vueuse/metadata': 9.13.0
+      '@vueuse/shared': 9.13.0(vue@3.5.16)
+      vue-demi: 0.14.10(vue@3.5.16)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  '@vueuse/metadata@13.3.0': {}
+
+  '@vueuse/metadata@9.13.0': {}
+
+  '@vueuse/shared@13.3.0(vue@3.5.16)':
+    dependencies:
+      vue: 3.5.16
+
+  '@vueuse/shared@9.13.0(vue@3.5.16)':
+    dependencies:
+      vue-demi: 0.14.10(vue@3.5.16)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+
+  abbrev@2.0.0: {}
+
+  acorn@8.15.0: {}
+
+  ansi-regex@2.1.1: {}
+
+  ansi-regex@5.0.1: {}
+
+  ansi-regex@6.2.2: {}
+
+  ansi-styles@2.2.1: {}
+
+  ansi-styles@4.3.0:
+    dependencies:
+      color-convert: 2.0.1
+
+  ansi-styles@6.2.3: {}
+
+  arr-diff@4.0.0: {}
+
+  arr-flatten@1.1.0: {}
+
+  arr-union@3.1.0: {}
+
+  array-buffer-byte-length@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      is-array-buffer: 3.0.5
+
+  array-unique@0.3.2: {}
+
+  arraybuffer.prototype.slice@1.0.4:
+    dependencies:
+      array-buffer-byte-length: 1.0.2
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.24.0
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      is-array-buffer: 3.0.5
+
+  assign-symbols@1.0.0: {}
+
+  async-function@1.0.0: {}
+
+  async-validator@4.2.5: {}
+
+  asynckit@0.4.0: {}
+
+  atob@2.1.2: {}
+
+  available-typed-arrays@1.0.7:
+    dependencies:
+      possible-typed-array-names: 1.1.0
+
+  axios@1.9.0:
+    dependencies:
+      follow-redirects: 1.15.11
+      form-data: 4.0.4
+      proxy-from-env: 1.1.0
+    transitivePeerDependencies:
+      - debug
+
+  balanced-match@1.0.2: {}
+
+  base@0.11.2:
+    dependencies:
+      cache-base: 1.0.1
+      class-utils: 0.3.6
+      component-emitter: 1.3.1
+      define-property: 1.0.0
+      isobject: 3.0.1
+      mixin-deep: 1.3.2
+      pascalcase: 0.1.1
+
+  big.js@5.2.2: {}
+
+  birpc@2.6.1: {}
+
+  bluebird@3.7.2: {}
+
+  boolbase@1.0.0: {}
+
+  brace-expansion@2.0.2:
+    dependencies:
+      balanced-match: 1.0.2
+
+  braces@2.3.2:
+    dependencies:
+      arr-flatten: 1.1.0
+      array-unique: 0.3.2
+      extend-shallow: 2.0.1
+      fill-range: 4.0.0
+      isobject: 3.0.1
+      repeat-element: 1.1.4
+      snapdragon: 0.8.2
+      snapdragon-node: 2.1.1
+      split-string: 3.1.0
+      to-regex: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  braces@3.0.3:
+    dependencies:
+      fill-range: 7.1.1
+
+  buffer-builder@0.2.0: {}
+
+  cache-base@1.0.1:
+    dependencies:
+      collection-visit: 1.0.0
+      component-emitter: 1.3.1
+      get-value: 2.0.6
+      has-value: 1.0.0
+      isobject: 3.0.1
+      set-value: 2.0.1
+      to-object-path: 0.3.0
+      union-value: 1.0.1
+      unset-value: 1.0.0
+
+  call-bind-apply-helpers@1.0.2:
+    dependencies:
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+
+  call-bind@1.0.8:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-define-property: 1.0.1
+      get-intrinsic: 1.3.0
+      set-function-length: 1.2.2
+
+  call-bound@1.0.4:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      get-intrinsic: 1.3.0
+
+  chalk@1.1.3:
+    dependencies:
+      ansi-styles: 2.2.1
+      escape-string-regexp: 1.0.5
+      has-ansi: 2.0.0
+      strip-ansi: 3.0.1
+      supports-color: 2.0.0
+
+  chalk@4.1.2:
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
+  chownr@3.0.0: {}
+
+  class-utils@0.3.6:
+    dependencies:
+      arr-union: 3.1.0
+      define-property: 0.2.5
+      isobject: 3.0.1
+      static-extend: 0.1.2
+
+  clipboard@2.0.11:
+    dependencies:
+      good-listener: 1.2.2
+      select: 1.1.2
+      tiny-emitter: 2.1.0
+
+  clone@2.1.2: {}
+
+  collection-visit@1.0.0:
+    dependencies:
+      map-visit: 1.0.0
+      object-visit: 1.0.1
+
+  color-convert@2.0.1:
+    dependencies:
+      color-name: 1.1.4
+
+  color-name@1.1.4: {}
+
+  colorjs.io@0.5.2: {}
+
+  combined-stream@1.0.8:
+    dependencies:
+      delayed-stream: 1.0.0
+
+  commander@10.0.1: {}
+
+  commander@7.2.0: {}
+
+  component-emitter@1.3.1: {}
+
+  confbox@0.1.8: {}
+
+  confbox@0.2.2: {}
+
+  config-chain@1.1.13:
+    dependencies:
+      ini: 1.3.8
+      proto-list: 1.2.4
+
+  copy-anything@3.0.5:
+    dependencies:
+      is-what: 4.1.16
+
+  copy-descriptor@0.1.1: {}
+
+  cors@2.8.5:
+    dependencies:
+      object-assign: 4.1.1
+      vary: 1.1.2
+
+  cross-spawn@7.0.6:
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
+  css-select@4.3.0:
+    dependencies:
+      boolbase: 1.0.0
+      css-what: 6.2.2
+      domhandler: 4.3.1
+      domutils: 2.8.0
+      nth-check: 2.1.1
+
+  css-tree@1.1.3:
+    dependencies:
+      mdn-data: 2.0.14
+      source-map: 0.6.1
+
+  css-what@6.2.2: {}
+
+  csso@4.2.0:
+    dependencies:
+      css-tree: 1.1.3
+
+  csstype@3.1.3: {}
+
+  data-view-buffer@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  data-view-byte-length@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  data-view-byte-offset@1.0.1:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  dayjs@1.11.18: {}
+
+  debug@2.6.9:
+    dependencies:
+      ms: 2.0.0
+
+  debug@4.4.3:
+    dependencies:
+      ms: 2.1.3
+
+  decode-uri-component@0.2.2: {}
+
+  deep-equal@1.1.2:
+    dependencies:
+      is-arguments: 1.2.0
+      is-date-object: 1.1.0
+      is-regex: 1.2.1
+      object-is: 1.1.6
+      object-keys: 1.1.1
+      regexp.prototype.flags: 1.5.4
+
+  define-data-property@1.1.4:
+    dependencies:
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  define-properties@1.2.1:
+    dependencies:
+      define-data-property: 1.1.4
+      has-property-descriptors: 1.0.2
+      object-keys: 1.1.1
+
+  define-property@0.2.5:
+    dependencies:
+      is-descriptor: 0.1.7
+
+  define-property@1.0.0:
+    dependencies:
+      is-descriptor: 1.0.3
+
+  define-property@2.0.2:
+    dependencies:
+      is-descriptor: 1.0.3
+      isobject: 3.0.1
+
+  delayed-stream@1.0.0: {}
+
+  delegate@3.2.0: {}
+
+  detect-libc@2.1.1: {}
+
+  dom-serializer@0.2.2:
+    dependencies:
+      domelementtype: 2.3.0
+      entities: 2.2.0
+
+  dom-serializer@1.4.1:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+      entities: 2.2.0
+
+  domelementtype@1.3.1: {}
+
+  domelementtype@2.3.0: {}
+
+  domhandler@2.4.2:
+    dependencies:
+      domelementtype: 1.3.1
+
+  domhandler@4.3.1:
+    dependencies:
+      domelementtype: 2.3.0
+
+  domutils@1.7.0:
+    dependencies:
+      dom-serializer: 0.2.2
+      domelementtype: 1.3.1
+
+  domutils@2.8.0:
+    dependencies:
+      dom-serializer: 1.4.1
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+
+  dunder-proto@1.0.1:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  eastasianwidth@0.2.0: {}
+
+  echarts@5.6.0:
+    dependencies:
+      tslib: 2.3.0
+      zrender: 5.6.1
+
+  editorconfig@1.0.4:
+    dependencies:
+      '@one-ini/wasm': 0.1.1
+      commander: 10.0.1
+      minimatch: 9.0.1
+      semver: 7.7.2
+
+  element-plus@2.10.7(vue@3.5.16):
+    dependencies:
+      '@ctrl/tinycolor': 3.6.1
+      '@element-plus/icons-vue': 2.3.1(vue@3.5.16)
+      '@floating-ui/dom': 1.7.4
+      '@popperjs/core': '@sxzz/popperjs-es@2.11.7'
+      '@types/lodash': 4.17.20
+      '@types/lodash-es': 4.17.12
+      '@vueuse/core': 9.13.0(vue@3.5.16)
+      async-validator: 4.2.5
+      dayjs: 1.11.18
+      escape-html: 1.0.3
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+      lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21)
+      memoize-one: 6.0.0
+      normalize-wheel-es: 1.2.0
+      vue: 3.5.16
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+
+  emoji-regex@8.0.0: {}
+
+  emoji-regex@9.2.2: {}
+
+  emojis-list@3.0.0: {}
+
+  enhanced-resolve@5.18.3:
+    dependencies:
+      graceful-fs: 4.2.11
+      tapable: 2.3.0
+
+  entities@1.1.2: {}
+
+  entities@2.2.0: {}
+
+  entities@4.5.0: {}
+
+  es-abstract@1.24.0:
+    dependencies:
+      array-buffer-byte-length: 1.0.2
+      arraybuffer.prototype.slice: 1.0.4
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      data-view-buffer: 1.0.2
+      data-view-byte-length: 1.0.2
+      data-view-byte-offset: 1.0.1
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      es-set-tostringtag: 2.1.0
+      es-to-primitive: 1.3.0
+      function.prototype.name: 1.1.8
+      get-intrinsic: 1.3.0
+      get-proto: 1.0.1
+      get-symbol-description: 1.1.0
+      globalthis: 1.0.4
+      gopd: 1.2.0
+      has-property-descriptors: 1.0.2
+      has-proto: 1.2.0
+      has-symbols: 1.1.0
+      hasown: 2.0.2
+      internal-slot: 1.1.0
+      is-array-buffer: 3.0.5
+      is-callable: 1.2.7
+      is-data-view: 1.0.2
+      is-negative-zero: 2.0.3
+      is-regex: 1.2.1
+      is-set: 2.0.3
+      is-shared-array-buffer: 1.0.4
+      is-string: 1.1.1
+      is-typed-array: 1.1.15
+      is-weakref: 1.1.1
+      math-intrinsics: 1.1.0
+      object-inspect: 1.13.4
+      object-keys: 1.1.1
+      object.assign: 4.1.7
+      own-keys: 1.0.1
+      regexp.prototype.flags: 1.5.4
+      safe-array-concat: 1.1.3
+      safe-push-apply: 1.0.0
+      safe-regex-test: 1.1.0
+      set-proto: 1.0.0
+      stop-iteration-iterator: 1.1.0
+      string.prototype.trim: 1.2.10
+      string.prototype.trimend: 1.0.9
+      string.prototype.trimstart: 1.0.8
+      typed-array-buffer: 1.0.3
+      typed-array-byte-length: 1.0.3
+      typed-array-byte-offset: 1.0.4
+      typed-array-length: 1.0.7
+      unbox-primitive: 1.1.0
+      which-typed-array: 1.1.19
+
+  es-define-property@1.0.1: {}
+
+  es-errors@1.3.0: {}
+
+  es-object-atoms@1.1.1:
+    dependencies:
+      es-errors: 1.3.0
+
+  es-set-tostringtag@2.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      has-tostringtag: 1.0.2
+      hasown: 2.0.2
+
+  es-to-primitive@1.3.0:
+    dependencies:
+      is-callable: 1.2.7
+      is-date-object: 1.1.0
+      is-symbol: 1.1.1
+
+  esbuild@0.25.10:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.25.10
+      '@esbuild/android-arm': 0.25.10
+      '@esbuild/android-arm64': 0.25.10
+      '@esbuild/android-x64': 0.25.10
+      '@esbuild/darwin-arm64': 0.25.10
+      '@esbuild/darwin-x64': 0.25.10
+      '@esbuild/freebsd-arm64': 0.25.10
+      '@esbuild/freebsd-x64': 0.25.10
+      '@esbuild/linux-arm': 0.25.10
+      '@esbuild/linux-arm64': 0.25.10
+      '@esbuild/linux-ia32': 0.25.10
+      '@esbuild/linux-loong64': 0.25.10
+      '@esbuild/linux-mips64el': 0.25.10
+      '@esbuild/linux-ppc64': 0.25.10
+      '@esbuild/linux-riscv64': 0.25.10
+      '@esbuild/linux-s390x': 0.25.10
+      '@esbuild/linux-x64': 0.25.10
+      '@esbuild/netbsd-arm64': 0.25.10
+      '@esbuild/netbsd-x64': 0.25.10
+      '@esbuild/openbsd-arm64': 0.25.10
+      '@esbuild/openbsd-x64': 0.25.10
+      '@esbuild/openharmony-arm64': 0.25.10
+      '@esbuild/sunos-x64': 0.25.10
+      '@esbuild/win32-arm64': 0.25.10
+      '@esbuild/win32-ia32': 0.25.10
+      '@esbuild/win32-x64': 0.25.10
+
+  escape-html@1.0.3: {}
+
+  escape-string-regexp@1.0.5: {}
+
+  escape-string-regexp@5.0.0: {}
+
+  estree-walker@2.0.2: {}
+
+  estree-walker@3.0.3:
+    dependencies:
+      '@types/estree': 1.0.8
+
+  etag@1.8.1: {}
+
+  eventemitter3@2.0.3: {}
+
+  expand-brackets@2.1.4:
+    dependencies:
+      debug: 2.6.9
+      define-property: 0.2.5
+      extend-shallow: 2.0.1
+      posix-character-classes: 0.1.1
+      regex-not: 1.0.2
+      snapdragon: 0.8.2
+      to-regex: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  exsolve@1.0.7: {}
+
+  extend-shallow@2.0.1:
+    dependencies:
+      is-extendable: 0.1.1
+
+  extend-shallow@3.0.2:
+    dependencies:
+      assign-symbols: 1.0.0
+      is-extendable: 1.0.1
+
+  extend@3.0.2: {}
+
+  extglob@2.0.4:
+    dependencies:
+      array-unique: 0.3.2
+      define-property: 1.0.0
+      expand-brackets: 2.1.4
+      extend-shallow: 2.0.1
+      fragment-cache: 0.2.1
+      regex-not: 1.0.2
+      snapdragon: 0.8.2
+      to-regex: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  fast-diff@1.1.2: {}
+
+  fast-diff@1.2.0: {}
+
+  fast-glob@3.3.3:
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.8
+
+  fastq@1.19.1:
+    dependencies:
+      reusify: 1.1.0
+
+  fdir@6.5.0(picomatch@4.0.3):
+    optionalDependencies:
+      picomatch: 4.0.3
+
+  file-saver@2.0.5: {}
+
+  fill-range@4.0.0:
+    dependencies:
+      extend-shallow: 2.0.1
+      is-number: 3.0.0
+      repeat-string: 1.6.1
+      to-regex-range: 2.1.1
+
+  fill-range@7.1.1:
+    dependencies:
+      to-regex-range: 5.0.1
+
+  follow-redirects@1.15.11: {}
+
+  for-each@0.3.5:
+    dependencies:
+      is-callable: 1.2.7
+
+  for-in@1.0.2: {}
+
+  foreground-child@3.3.1:
+    dependencies:
+      cross-spawn: 7.0.6
+      signal-exit: 4.1.0
+
+  form-data@4.0.4:
+    dependencies:
+      asynckit: 0.4.0
+      combined-stream: 1.0.8
+      es-set-tostringtag: 2.1.0
+      hasown: 2.0.2
+      mime-types: 2.1.35
+
+  fragment-cache@0.2.1:
+    dependencies:
+      map-cache: 0.2.2
+
+  fs-extra@10.1.0:
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 6.2.0
+      universalify: 2.0.1
+
+  fsevents@2.3.3:
+    optional: true
+
+  function-bind@1.1.2: {}
+
+  function.prototype.name@1.1.8:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      functions-have-names: 1.2.3
+      hasown: 2.0.2
+      is-callable: 1.2.7
+
+  functions-have-names@1.2.3: {}
+
+  fuse.js@6.6.2: {}
+
+  generator-function@2.0.1: {}
+
+  get-intrinsic@1.3.0:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      function-bind: 1.1.2
+      get-proto: 1.0.1
+      gopd: 1.2.0
+      has-symbols: 1.1.0
+      hasown: 2.0.2
+      math-intrinsics: 1.1.0
+
+  get-proto@1.0.1:
+    dependencies:
+      dunder-proto: 1.0.1
+      es-object-atoms: 1.1.1
+
+  get-symbol-description@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+
+  get-value@2.0.6: {}
+
+  glob-parent@5.1.2:
+    dependencies:
+      is-glob: 4.0.3
+
+  glob@10.4.5:
+    dependencies:
+      foreground-child: 3.3.1
+      jackspeak: 3.4.3
+      minimatch: 9.0.5
+      minipass: 7.1.2
+      package-json-from-dist: 1.0.1
+      path-scurry: 1.11.1
+
+  globalthis@1.0.4:
+    dependencies:
+      define-properties: 1.2.1
+      gopd: 1.2.0
+
+  good-listener@1.2.2:
+    dependencies:
+      delegate: 3.2.0
+
+  gopd@1.2.0: {}
+
+  graceful-fs@4.2.11: {}
+
+  has-ansi@2.0.0:
+    dependencies:
+      ansi-regex: 2.1.1
+
+  has-bigints@1.1.0: {}
+
+  has-flag@1.0.0: {}
+
+  has-flag@4.0.0: {}
+
+  has-property-descriptors@1.0.2:
+    dependencies:
+      es-define-property: 1.0.1
+
+  has-proto@1.2.0:
+    dependencies:
+      dunder-proto: 1.0.1
+
+  has-symbols@1.1.0: {}
+
+  has-tostringtag@1.0.2:
+    dependencies:
+      has-symbols: 1.1.0
+
+  has-value@0.3.1:
+    dependencies:
+      get-value: 2.0.6
+      has-values: 0.1.4
+      isobject: 2.1.0
+
+  has-value@1.0.0:
+    dependencies:
+      get-value: 2.0.6
+      has-values: 1.0.0
+      isobject: 3.0.1
+
+  has-values@0.1.4: {}
+
+  has-values@1.0.0:
+    dependencies:
+      is-number: 3.0.0
+      kind-of: 4.0.0
+
+  hasown@2.0.2:
+    dependencies:
+      function-bind: 1.1.2
+
+  he@1.2.0: {}
+
+  hookable@5.5.3: {}
+
+  htmlparser2@3.10.1:
+    dependencies:
+      domelementtype: 1.3.1
+      domhandler: 2.4.2
+      domutils: 1.7.0
+      entities: 1.1.2
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+
+  image-size@0.5.5: {}
+
+  immutable@5.1.3: {}
+
+  inherits@2.0.4: {}
+
+  ini@1.3.8: {}
+
+  internal-slot@1.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      hasown: 2.0.2
+      side-channel: 1.1.0
+
+  is-accessor-descriptor@1.0.1:
+    dependencies:
+      hasown: 2.0.2
+
+  is-arguments@1.2.0:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-array-buffer@3.0.5:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+
+  is-async-function@2.1.1:
+    dependencies:
+      async-function: 1.0.0
+      call-bound: 1.0.4
+      get-proto: 1.0.1
+      has-tostringtag: 1.0.2
+      safe-regex-test: 1.1.0
+
+  is-bigint@1.1.0:
+    dependencies:
+      has-bigints: 1.1.0
+
+  is-boolean-object@1.2.2:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-buffer@1.1.6: {}
+
+  is-callable@1.2.7: {}
+
+  is-data-descriptor@1.0.1:
+    dependencies:
+      hasown: 2.0.2
+
+  is-data-view@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+      is-typed-array: 1.1.15
+
+  is-date-object@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-descriptor@0.1.7:
+    dependencies:
+      is-accessor-descriptor: 1.0.1
+      is-data-descriptor: 1.0.1
+
+  is-descriptor@1.0.3:
+    dependencies:
+      is-accessor-descriptor: 1.0.1
+      is-data-descriptor: 1.0.1
+
+  is-extendable@0.1.1: {}
+
+  is-extendable@1.0.1:
+    dependencies:
+      is-plain-object: 2.0.4
+
+  is-extglob@2.1.1: {}
+
+  is-finalizationregistry@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+
+  is-fullwidth-code-point@3.0.0: {}
+
+  is-generator-function@1.1.2:
+    dependencies:
+      call-bound: 1.0.4
+      generator-function: 2.0.1
+      get-proto: 1.0.1
+      has-tostringtag: 1.0.2
+      safe-regex-test: 1.1.0
+
+  is-glob@4.0.3:
+    dependencies:
+      is-extglob: 2.1.1
+
+  is-map@2.0.3: {}
+
+  is-negative-zero@2.0.3: {}
+
+  is-number-object@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-number@3.0.0:
+    dependencies:
+      kind-of: 3.2.2
+
+  is-number@7.0.0: {}
+
+  is-plain-obj@1.1.0: {}
+
+  is-plain-object@2.0.4:
+    dependencies:
+      isobject: 3.0.1
+
+  is-regex@1.2.1:
+    dependencies:
+      call-bound: 1.0.4
+      gopd: 1.2.0
+      has-tostringtag: 1.0.2
+      hasown: 2.0.2
+
+  is-set@2.0.3: {}
+
+  is-shared-array-buffer@1.0.4:
+    dependencies:
+      call-bound: 1.0.4
+
+  is-string@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  is-symbol@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+      has-symbols: 1.1.0
+      safe-regex-test: 1.1.0
+
+  is-typed-array@1.1.15:
+    dependencies:
+      which-typed-array: 1.1.19
+
+  is-weakmap@2.0.2: {}
+
+  is-weakref@1.1.1:
+    dependencies:
+      call-bound: 1.0.4
+
+  is-weakset@2.0.4:
+    dependencies:
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+
+  is-what@4.1.16: {}
+
+  is-windows@1.0.2: {}
+
+  isarray@1.0.0: {}
+
+  isarray@2.0.5: {}
+
+  isexe@2.0.0: {}
+
+  isobject@2.1.0:
+    dependencies:
+      isarray: 1.0.0
+
+  isobject@3.0.1: {}
+
+  jackspeak@3.4.3:
+    dependencies:
+      '@isaacs/cliui': 8.0.2
+    optionalDependencies:
+      '@pkgjs/parseargs': 0.11.0
+
+  jiti@2.6.1: {}
+
+  js-base64@2.6.4: {}
+
+  js-beautify@1.14.11:
+    dependencies:
+      config-chain: 1.1.13
+      editorconfig: 1.0.4
+      glob: 10.4.5
+      nopt: 7.2.1
+
+  js-cookie@3.0.5: {}
+
+  js-tokens@9.0.1: {}
+
+  jsencrypt@3.3.2: {}
+
+  json5@1.0.2:
+    dependencies:
+      minimist: 1.2.8
+
+  jsonfile@6.2.0:
+    dependencies:
+      universalify: 2.0.1
+    optionalDependencies:
+      graceful-fs: 4.2.11
+
+  kind-of@3.2.2:
+    dependencies:
+      is-buffer: 1.1.6
+
+  kind-of@4.0.0:
+    dependencies:
+      is-buffer: 1.1.6
+
+  kind-of@5.1.0: {}
+
+  kind-of@6.0.3: {}
+
+  lightningcss-darwin-arm64@1.30.1:
+    optional: true
+
+  lightningcss-darwin-x64@1.30.1:
+    optional: true
+
+  lightningcss-freebsd-x64@1.30.1:
+    optional: true
+
+  lightningcss-linux-arm-gnueabihf@1.30.1:
+    optional: true
+
+  lightningcss-linux-arm64-gnu@1.30.1:
+    optional: true
+
+  lightningcss-linux-arm64-musl@1.30.1:
+    optional: true
+
+  lightningcss-linux-x64-gnu@1.30.1:
+    optional: true
+
+  lightningcss-linux-x64-musl@1.30.1:
+    optional: true
+
+  lightningcss-win32-arm64-msvc@1.30.1:
+    optional: true
+
+  lightningcss-win32-x64-msvc@1.30.1:
+    optional: true
+
+  lightningcss@1.30.1:
+    dependencies:
+      detect-libc: 2.1.1
+    optionalDependencies:
+      lightningcss-darwin-arm64: 1.30.1
+      lightningcss-darwin-x64: 1.30.1
+      lightningcss-freebsd-x64: 1.30.1
+      lightningcss-linux-arm-gnueabihf: 1.30.1
+      lightningcss-linux-arm64-gnu: 1.30.1
+      lightningcss-linux-arm64-musl: 1.30.1
+      lightningcss-linux-x64-gnu: 1.30.1
+      lightningcss-linux-x64-musl: 1.30.1
+      lightningcss-win32-arm64-msvc: 1.30.1
+      lightningcss-win32-x64-msvc: 1.30.1
+
+  loader-utils@1.4.2:
+    dependencies:
+      big.js: 5.2.2
+      emojis-list: 3.0.0
+      json5: 1.0.2
+
+  local-pkg@0.5.1:
+    dependencies:
+      mlly: 1.8.0
+      pkg-types: 1.3.1
+
+  local-pkg@1.1.2:
+    dependencies:
+      mlly: 1.8.0
+      pkg-types: 2.3.0
+      quansync: 0.2.11
+
+  lodash-es@4.17.21: {}
+
+  lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
+    dependencies:
+      '@types/lodash-es': 4.17.12
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+
+  lodash.clonedeep@4.5.0: {}
+
+  lodash.isequal@4.5.0: {}
+
+  lodash@4.17.21: {}
+
+  lru-cache@10.4.3: {}
+
+  magic-string@0.26.7:
+    dependencies:
+      sourcemap-codec: 1.4.8
+
+  magic-string@0.30.19:
+    dependencies:
+      '@jridgewell/sourcemap-codec': 1.5.5
+
+  map-cache@0.2.2: {}
+
+  map-visit@1.0.0:
+    dependencies:
+      object-visit: 1.0.1
+
+  math-intrinsics@1.1.0: {}
+
+  mdn-data@2.0.14: {}
+
+  memoize-one@6.0.0: {}
+
+  merge-options@1.0.1:
+    dependencies:
+      is-plain-obj: 1.1.0
+
+  merge2@1.4.1: {}
+
+  micromatch@3.1.0:
+    dependencies:
+      arr-diff: 4.0.0
+      array-unique: 0.3.2
+      braces: 2.3.2
+      define-property: 1.0.0
+      extend-shallow: 2.0.1
+      extglob: 2.0.4
+      fragment-cache: 0.2.1
+      kind-of: 5.1.0
+      nanomatch: 1.2.13
+      object.pick: 1.3.0
+      regex-not: 1.0.2
+      snapdragon: 0.8.2
+      to-regex: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  micromatch@4.0.8:
+    dependencies:
+      braces: 3.0.3
+      picomatch: 2.3.1
+
+  mime-db@1.52.0: {}
+
+  mime-types@2.1.35:
+    dependencies:
+      mime-db: 1.52.0
+
+  minimatch@9.0.1:
+    dependencies:
+      brace-expansion: 2.0.2
+
+  minimatch@9.0.5:
+    dependencies:
+      brace-expansion: 2.0.2
+
+  minimist@1.2.8: {}
+
+  minipass@7.1.2: {}
+
+  minizlib@3.1.0:
+    dependencies:
+      minipass: 7.1.2
+
+  mitt@3.0.1: {}
+
+  mixin-deep@1.3.2:
+    dependencies:
+      for-in: 1.0.2
+      is-extendable: 1.0.1
+
+  mlly@1.8.0:
+    dependencies:
+      acorn: 8.15.0
+      pathe: 2.0.3
+      pkg-types: 1.3.1
+      ufo: 1.6.1
+
+  ms@2.0.0: {}
+
+  ms@2.1.3: {}
+
+  nanoid@3.3.11: {}
+
+  nanomatch@1.2.13:
+    dependencies:
+      arr-diff: 4.0.0
+      array-unique: 0.3.2
+      define-property: 2.0.2
+      extend-shallow: 3.0.2
+      fragment-cache: 0.2.1
+      is-windows: 1.0.2
+      kind-of: 6.0.3
+      object.pick: 1.3.0
+      regex-not: 1.0.2
+      snapdragon: 0.8.2
+      to-regex: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+
+  nopt@7.2.1:
+    dependencies:
+      abbrev: 2.0.0
+
+  normalize-wheel-es@1.2.0: {}
+
+  nprogress@0.2.0: {}
+
+  nth-check@2.1.1:
+    dependencies:
+      boolbase: 1.0.0
+
+  object-assign@4.1.1: {}
+
+  object-copy@0.1.0:
+    dependencies:
+      copy-descriptor: 0.1.1
+      define-property: 0.2.5
+      kind-of: 3.2.2
+
+  object-inspect@1.13.4: {}
+
+  object-is@1.1.6:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+
+  object-keys@1.1.1: {}
+
+  object-visit@1.0.1:
+    dependencies:
+      isobject: 3.0.1
+
+  object.assign@4.1.7:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+      has-symbols: 1.1.0
+      object-keys: 1.1.1
+
+  object.pick@1.3.0:
+    dependencies:
+      isobject: 3.0.1
+
+  own-keys@1.0.1:
+    dependencies:
+      get-intrinsic: 1.3.0
+      object-keys: 1.1.1
+      safe-push-apply: 1.0.0
+
+  package-json-from-dist@1.0.1: {}
+
+  parchment@1.1.4: {}
+
+  pascalcase@0.1.1: {}
+
+  path-key@3.1.1: {}
+
+  path-scurry@1.11.1:
+    dependencies:
+      lru-cache: 10.4.3
+      minipass: 7.1.2
+
+  pathe@0.2.0: {}
+
+  pathe@2.0.3: {}
+
+  perfect-debounce@1.0.0: {}
+
+  picocolors@1.1.1: {}
+
+  picomatch@2.3.1: {}
+
+  picomatch@4.0.3: {}
+
+  pinia@3.0.2(vue@3.5.16):
+    dependencies:
+      '@vue/devtools-api': 7.7.7
+      vue: 3.5.16
+
+  pkg-types@1.3.1:
+    dependencies:
+      confbox: 0.1.8
+      mlly: 1.8.0
+      pathe: 2.0.3
+
+  pkg-types@2.3.0:
+    dependencies:
+      confbox: 0.2.2
+      exsolve: 1.0.7
+      pathe: 2.0.3
+
+  posix-character-classes@0.1.1: {}
+
+  possible-typed-array-names@1.1.0: {}
+
+  postcss-prefix-selector@1.16.1(postcss@5.2.18):
+    dependencies:
+      postcss: 5.2.18
+
+  postcss@5.2.18:
+    dependencies:
+      chalk: 1.1.3
+      js-base64: 2.6.4
+      source-map: 0.5.7
+      supports-color: 3.2.3
+
+  postcss@8.5.6:
+    dependencies:
+      nanoid: 3.3.11
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  posthtml-parser@0.2.1:
+    dependencies:
+      htmlparser2: 3.10.1
+      isobject: 2.1.0
+
+  posthtml-rename-id@1.0.12:
+    dependencies:
+      escape-string-regexp: 1.0.5
+
+  posthtml-render@1.4.0: {}
+
+  posthtml-svg-mode@1.0.3:
+    dependencies:
+      merge-options: 1.0.1
+      posthtml: 0.9.2
+      posthtml-parser: 0.2.1
+      posthtml-render: 1.4.0
+
+  posthtml@0.9.2:
+    dependencies:
+      posthtml-parser: 0.2.1
+      posthtml-render: 1.4.0
+
+  proto-list@1.2.4: {}
+
+  proxy-from-env@1.1.0: {}
+
+  quansync@0.2.11: {}
+
+  query-string@4.3.4:
+    dependencies:
+      object-assign: 4.1.1
+      strict-uri-encode: 1.1.0
+
+  queue-microtask@1.2.3: {}
+
+  quill-delta@3.6.3:
+    dependencies:
+      deep-equal: 1.1.2
+      extend: 3.0.2
+      fast-diff: 1.1.2
+
+  quill-delta@4.2.2:
+    dependencies:
+      fast-diff: 1.2.0
+      lodash.clonedeep: 4.5.0
+      lodash.isequal: 4.5.0
+
+  quill@1.3.7:
+    dependencies:
+      clone: 2.1.2
+      deep-equal: 1.1.2
+      eventemitter3: 2.0.3
+      extend: 3.0.2
+      parchment: 1.1.4
+      quill-delta: 3.6.3
+
+  readable-stream@3.6.2:
+    dependencies:
+      inherits: 2.0.4
+      string_decoder: 1.3.0
+      util-deprecate: 1.0.2
+
+  reflect.getprototypeof@1.0.10:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.24.0
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      get-intrinsic: 1.3.0
+      get-proto: 1.0.1
+      which-builtin-type: 1.2.1
+
+  regex-not@1.0.2:
+    dependencies:
+      extend-shallow: 3.0.2
+      safe-regex: 1.1.0
+
+  regexp.prototype.flags@1.5.4:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-errors: 1.3.0
+      get-proto: 1.0.1
+      gopd: 1.2.0
+      set-function-name: 2.0.2
+
+  repeat-element@1.1.4: {}
+
+  repeat-string@1.6.1: {}
+
+  resolve-url@0.2.1: {}
+
+  ret@0.1.15: {}
+
+  reusify@1.1.0: {}
+
+  rfdc@1.4.1: {}
+
+  rollup@4.52.3:
+    dependencies:
+      '@types/estree': 1.0.8
+    optionalDependencies:
+      '@rollup/rollup-android-arm-eabi': 4.52.3
+      '@rollup/rollup-android-arm64': 4.52.3
+      '@rollup/rollup-darwin-arm64': 4.52.3
+      '@rollup/rollup-darwin-x64': 4.52.3
+      '@rollup/rollup-freebsd-arm64': 4.52.3
+      '@rollup/rollup-freebsd-x64': 4.52.3
+      '@rollup/rollup-linux-arm-gnueabihf': 4.52.3
+      '@rollup/rollup-linux-arm-musleabihf': 4.52.3
+      '@rollup/rollup-linux-arm64-gnu': 4.52.3
+      '@rollup/rollup-linux-arm64-musl': 4.52.3
+      '@rollup/rollup-linux-loong64-gnu': 4.52.3
+      '@rollup/rollup-linux-ppc64-gnu': 4.52.3
+      '@rollup/rollup-linux-riscv64-gnu': 4.52.3
+      '@rollup/rollup-linux-riscv64-musl': 4.52.3
+      '@rollup/rollup-linux-s390x-gnu': 4.52.3
+      '@rollup/rollup-linux-x64-gnu': 4.52.3
+      '@rollup/rollup-linux-x64-musl': 4.52.3
+      '@rollup/rollup-openharmony-arm64': 4.52.3
+      '@rollup/rollup-win32-arm64-msvc': 4.52.3
+      '@rollup/rollup-win32-ia32-msvc': 4.52.3
+      '@rollup/rollup-win32-x64-gnu': 4.52.3
+      '@rollup/rollup-win32-x64-msvc': 4.52.3
+      fsevents: 2.3.3
+
+  run-parallel@1.2.0:
+    dependencies:
+      queue-microtask: 1.2.3
+
+  rxjs@7.8.2:
+    dependencies:
+      tslib: 2.8.1
+
+  safe-array-concat@1.1.3:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+      has-symbols: 1.1.0
+      isarray: 2.0.5
+
+  safe-buffer@5.2.1: {}
+
+  safe-push-apply@1.0.0:
+    dependencies:
+      es-errors: 1.3.0
+      isarray: 2.0.5
+
+  safe-regex-test@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-regex: 1.2.1
+
+  safe-regex@1.1.0:
+    dependencies:
+      ret: 0.1.15
+
+  sass-embedded-android-arm64@1.89.1:
+    optional: true
+
+  sass-embedded-android-arm@1.89.1:
+    optional: true
+
+  sass-embedded-android-riscv64@1.89.1:
+    optional: true
+
+  sass-embedded-android-x64@1.89.1:
+    optional: true
+
+  sass-embedded-darwin-arm64@1.89.1:
+    optional: true
+
+  sass-embedded-darwin-x64@1.89.1:
+    optional: true
+
+  sass-embedded-linux-arm64@1.89.1:
+    optional: true
+
+  sass-embedded-linux-arm@1.89.1:
+    optional: true
+
+  sass-embedded-linux-musl-arm64@1.89.1:
+    optional: true
+
+  sass-embedded-linux-musl-arm@1.89.1:
+    optional: true
+
+  sass-embedded-linux-musl-riscv64@1.89.1:
+    optional: true
+
+  sass-embedded-linux-musl-x64@1.89.1:
+    optional: true
+
+  sass-embedded-linux-riscv64@1.89.1:
+    optional: true
+
+  sass-embedded-linux-x64@1.89.1:
+    optional: true
+
+  sass-embedded-win32-arm64@1.89.1:
+    optional: true
+
+  sass-embedded-win32-x64@1.89.1:
+    optional: true
+
+  sass-embedded@1.89.1:
+    dependencies:
+      '@bufbuild/protobuf': 2.9.0
+      buffer-builder: 0.2.0
+      colorjs.io: 0.5.2
+      immutable: 5.1.3
+      rxjs: 7.8.2
+      supports-color: 8.1.1
+      sync-child-process: 1.0.2
+      varint: 6.0.0
+    optionalDependencies:
+      sass-embedded-android-arm: 1.89.1
+      sass-embedded-android-arm64: 1.89.1
+      sass-embedded-android-riscv64: 1.89.1
+      sass-embedded-android-x64: 1.89.1
+      sass-embedded-darwin-arm64: 1.89.1
+      sass-embedded-darwin-x64: 1.89.1
+      sass-embedded-linux-arm: 1.89.1
+      sass-embedded-linux-arm64: 1.89.1
+      sass-embedded-linux-musl-arm: 1.89.1
+      sass-embedded-linux-musl-arm64: 1.89.1
+      sass-embedded-linux-musl-riscv64: 1.89.1
+      sass-embedded-linux-musl-x64: 1.89.1
+      sass-embedded-linux-riscv64: 1.89.1
+      sass-embedded-linux-x64: 1.89.1
+      sass-embedded-win32-arm64: 1.89.1
+      sass-embedded-win32-x64: 1.89.1
+
+  scule@1.3.0: {}
+
+  select@1.1.2: {}
+
+  semver@7.7.2: {}
+
+  set-function-length@1.2.2:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.3.0
+      gopd: 1.2.0
+      has-property-descriptors: 1.0.2
+
+  set-function-name@2.0.2:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      functions-have-names: 1.2.3
+      has-property-descriptors: 1.0.2
+
+  set-proto@1.0.0:
+    dependencies:
+      dunder-proto: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+
+  set-value@2.0.1:
+    dependencies:
+      extend-shallow: 2.0.1
+      is-extendable: 0.1.1
+      is-plain-object: 2.0.4
+      split-string: 3.1.0
+
+  shebang-command@2.0.0:
+    dependencies:
+      shebang-regex: 3.0.0
+
+  shebang-regex@3.0.0: {}
+
+  side-channel-list@1.0.0:
+    dependencies:
+      es-errors: 1.3.0
+      object-inspect: 1.13.4
+
+  side-channel-map@1.0.1:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      object-inspect: 1.13.4
+
+  side-channel-weakmap@1.0.2:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      object-inspect: 1.13.4
+      side-channel-map: 1.0.1
+
+  side-channel@1.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      object-inspect: 1.13.4
+      side-channel-list: 1.0.0
+      side-channel-map: 1.0.1
+      side-channel-weakmap: 1.0.2
+
+  signal-exit@4.1.0: {}
+
+  snapdragon-node@2.1.1:
+    dependencies:
+      define-property: 1.0.0
+      isobject: 3.0.1
+      snapdragon-util: 3.0.1
+
+  snapdragon-util@3.0.1:
+    dependencies:
+      kind-of: 3.2.2
+
+  snapdragon@0.8.2:
+    dependencies:
+      base: 0.11.2
+      debug: 2.6.9
+      define-property: 0.2.5
+      extend-shallow: 2.0.1
+      map-cache: 0.2.2
+      source-map: 0.5.7
+      source-map-resolve: 0.5.3
+      use: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
+
+  sortablejs@1.14.0: {}
+
+  sortablejs@1.15.6: {}
+
+  source-map-js@1.2.1: {}
+
+  source-map-resolve@0.5.3:
+    dependencies:
+      atob: 2.1.2
+      decode-uri-component: 0.2.2
+      resolve-url: 0.2.1
+      source-map-url: 0.4.1
+      urix: 0.1.0
+
+  source-map-url@0.4.1: {}
+
+  source-map@0.5.7: {}
+
+  source-map@0.6.1: {}
+
+  sourcemap-codec@1.4.8: {}
+
+  speakingurl@14.0.1: {}
+
+  split-string@3.1.0:
+    dependencies:
+      extend-shallow: 3.0.2
+
+  splitpanes@4.0.4(vue@3.5.16):
+    dependencies:
+      vue: 3.5.16
+
+  stable@0.1.8: {}
+
+  static-extend@0.1.2:
+    dependencies:
+      define-property: 0.2.5
+      object-copy: 0.1.0
+
+  stop-iteration-iterator@1.1.0:
+    dependencies:
+      es-errors: 1.3.0
+      internal-slot: 1.1.0
+
+  strict-uri-encode@1.1.0: {}
+
+  string-width@4.2.3:
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+
+  string-width@5.1.2:
+    dependencies:
+      eastasianwidth: 0.2.0
+      emoji-regex: 9.2.2
+      strip-ansi: 7.1.2
+
+  string.prototype.trim@1.2.10:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-data-property: 1.1.4
+      define-properties: 1.2.1
+      es-abstract: 1.24.0
+      es-object-atoms: 1.1.1
+      has-property-descriptors: 1.0.2
+
+  string.prototype.trimend@1.0.9:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  string.prototype.trimstart@1.0.8:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  string_decoder@1.3.0:
+    dependencies:
+      safe-buffer: 5.2.1
+
+  strip-ansi@3.0.1:
+    dependencies:
+      ansi-regex: 2.1.1
+
+  strip-ansi@6.0.1:
+    dependencies:
+      ansi-regex: 5.0.1
+
+  strip-ansi@7.1.2:
+    dependencies:
+      ansi-regex: 6.2.2
+
+  strip-literal@2.1.1:
+    dependencies:
+      js-tokens: 9.0.1
+
+  superjson@2.2.2:
+    dependencies:
+      copy-anything: 3.0.5
+
+  supports-color@2.0.0: {}
+
+  supports-color@3.2.3:
+    dependencies:
+      has-flag: 1.0.0
+
+  supports-color@7.2.0:
+    dependencies:
+      has-flag: 4.0.0
+
+  supports-color@8.1.1:
+    dependencies:
+      has-flag: 4.0.0
+
+  svg-baker@1.7.0:
+    dependencies:
+      bluebird: 3.7.2
+      clone: 2.1.2
+      he: 1.2.0
+      image-size: 0.5.5
+      loader-utils: 1.4.2
+      merge-options: 1.0.1
+      micromatch: 3.1.0
+      postcss: 5.2.18
+      postcss-prefix-selector: 1.16.1(postcss@5.2.18)
+      posthtml-rename-id: 1.0.12
+      posthtml-svg-mode: 1.0.3
+      query-string: 4.3.4
+      traverse: 0.6.11
+    transitivePeerDependencies:
+      - supports-color
+
+  svgo@2.8.0:
+    dependencies:
+      '@trysound/sax': 0.2.0
+      commander: 7.2.0
+      css-select: 4.3.0
+      css-tree: 1.1.3
+      csso: 4.2.0
+      picocolors: 1.1.1
+      stable: 0.1.8
+
+  sync-child-process@1.0.2:
+    dependencies:
+      sync-message-port: 1.1.3
+
+  sync-message-port@1.1.3: {}
+
+  tailwindcss@4.1.14: {}
+
+  tapable@2.3.0: {}
+
+  tar@7.5.1:
+    dependencies:
+      '@isaacs/fs-minipass': 4.0.1
+      chownr: 3.0.0
+      minipass: 7.1.2
+      minizlib: 3.1.0
+      yallist: 5.0.0
+
+  tiny-emitter@2.1.0: {}
+
+  tinyglobby@0.2.15:
+    dependencies:
+      fdir: 6.5.0(picomatch@4.0.3)
+      picomatch: 4.0.3
+
+  to-object-path@0.3.0:
+    dependencies:
+      kind-of: 3.2.2
+
+  to-regex-range@2.1.1:
+    dependencies:
+      is-number: 3.0.0
+      repeat-string: 1.6.1
+
+  to-regex-range@5.0.1:
+    dependencies:
+      is-number: 7.0.0
+
+  to-regex@3.0.2:
+    dependencies:
+      define-property: 2.0.2
+      extend-shallow: 3.0.2
+      regex-not: 1.0.2
+      safe-regex: 1.1.0
+
+  traverse@0.6.11:
+    dependencies:
+      gopd: 1.2.0
+      typedarray.prototype.slice: 1.0.5
+      which-typed-array: 1.1.19
+
+  tslib@2.3.0: {}
+
+  tslib@2.8.1: {}
+
+  typed-array-buffer@1.0.3:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-typed-array: 1.1.15
+
+  typed-array-byte-length@1.0.3:
+    dependencies:
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      has-proto: 1.2.0
+      is-typed-array: 1.1.15
+
+  typed-array-byte-offset@1.0.4:
+    dependencies:
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      has-proto: 1.2.0
+      is-typed-array: 1.1.15
+      reflect.getprototypeof: 1.0.10
+
+  typed-array-length@1.0.7:
+    dependencies:
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      is-typed-array: 1.1.15
+      possible-typed-array-names: 1.1.0
+      reflect.getprototypeof: 1.0.10
+
+  typedarray.prototype.slice@1.0.5:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.24.0
+      es-errors: 1.3.0
+      get-proto: 1.0.1
+      math-intrinsics: 1.1.0
+      typed-array-buffer: 1.0.3
+      typed-array-byte-offset: 1.0.4
+
+  ufo@1.6.1: {}
+
+  unbox-primitive@1.1.0:
+    dependencies:
+      call-bound: 1.0.4
+      has-bigints: 1.1.0
+      has-symbols: 1.1.0
+      which-boxed-primitive: 1.1.1
+
+  undici-types@7.13.0: {}
+
+  unimport@3.14.6(rollup@4.52.3):
+    dependencies:
+      '@rollup/pluginutils': 5.3.0(rollup@4.52.3)
+      acorn: 8.15.0
+      escape-string-regexp: 5.0.0
+      estree-walker: 3.0.3
+      fast-glob: 3.3.3
+      local-pkg: 1.1.2
+      magic-string: 0.30.19
+      mlly: 1.8.0
+      pathe: 2.0.3
+      picomatch: 4.0.3
+      pkg-types: 1.3.1
+      scule: 1.3.0
+      strip-literal: 2.1.1
+      unplugin: 1.16.1
+    transitivePeerDependencies:
+      - rollup
+
+  union-value@1.0.1:
+    dependencies:
+      arr-union: 3.1.0
+      get-value: 2.0.6
+      is-extendable: 0.1.1
+      set-value: 2.0.1
+
+  universalify@2.0.1: {}
+
+  unplugin-auto-import@0.18.6(@vueuse/core@13.3.0(vue@3.5.16))(rollup@4.52.3):
+    dependencies:
+      '@antfu/utils': 0.7.10
+      '@rollup/pluginutils': 5.3.0(rollup@4.52.3)
+      fast-glob: 3.3.3
+      local-pkg: 0.5.1
+      magic-string: 0.30.19
+      minimatch: 9.0.5
+      unimport: 3.14.6(rollup@4.52.3)
+      unplugin: 1.16.1
+    optionalDependencies:
+      '@vueuse/core': 13.3.0(vue@3.5.16)
+    transitivePeerDependencies:
+      - rollup
+
+  unplugin-vue-setup-extend-plus@1.0.1:
+    dependencies:
+      '@vue/compiler-sfc': 3.5.22
+      magic-string: 0.26.7
+      unplugin: 1.16.1
+
+  unplugin@1.16.1:
+    dependencies:
+      acorn: 8.15.0
+      webpack-virtual-modules: 0.6.2
+
+  unset-value@1.0.0:
+    dependencies:
+      has-value: 0.3.1
+      isobject: 3.0.1
+
+  urix@0.1.0: {}
+
+  use@3.1.1: {}
+
+  util-deprecate@1.0.2: {}
+
+  varint@6.0.0: {}
+
+  vary@1.1.2: {}
+
+  vite-plugin-compression@0.5.1(vite@6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1)):
+    dependencies:
+      chalk: 4.1.2
+      debug: 4.4.3
+      fs-extra: 10.1.0
+      vite: 6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1)
+    transitivePeerDependencies:
+      - supports-color
+
+  vite-plugin-svg-icons@2.0.1(vite@6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1)):
+    dependencies:
+      '@types/svgo': 2.6.4
+      cors: 2.8.5
+      debug: 4.4.3
+      etag: 1.8.1
+      fs-extra: 10.1.0
+      pathe: 0.2.0
+      svg-baker: 1.7.0
+      svgo: 2.8.0
+      vite: 6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1)
+    transitivePeerDependencies:
+      - supports-color
+
+  vite@6.3.5(@types/node@24.6.1)(jiti@2.6.1)(lightningcss@1.30.1)(sass-embedded@1.89.1):
+    dependencies:
+      esbuild: 0.25.10
+      fdir: 6.5.0(picomatch@4.0.3)
+      picomatch: 4.0.3
+      postcss: 8.5.6
+      rollup: 4.52.3
+      tinyglobby: 0.2.15
+    optionalDependencies:
+      '@types/node': 24.6.1
+      fsevents: 2.3.3
+      jiti: 2.6.1
+      lightningcss: 1.30.1
+      sass-embedded: 1.89.1
+
+  vue-cropper@1.1.1: {}
+
+  vue-demi@0.14.10(vue@3.5.16):
+    dependencies:
+      vue: 3.5.16
+
+  vue-router@4.5.1(vue@3.5.16):
+    dependencies:
+      '@vue/devtools-api': 6.6.4
+      vue: 3.5.16
+
+  vue@3.5.16:
+    dependencies:
+      '@vue/compiler-dom': 3.5.16
+      '@vue/compiler-sfc': 3.5.16
+      '@vue/runtime-dom': 3.5.16
+      '@vue/server-renderer': 3.5.16(vue@3.5.16)
+      '@vue/shared': 3.5.16
+
+  vuedraggable@4.1.0(vue@3.5.16):
+    dependencies:
+      sortablejs: 1.14.0
+      vue: 3.5.16
+
+  webpack-virtual-modules@0.6.2: {}
+
+  which-boxed-primitive@1.1.1:
+    dependencies:
+      is-bigint: 1.1.0
+      is-boolean-object: 1.2.2
+      is-number-object: 1.1.1
+      is-string: 1.1.1
+      is-symbol: 1.1.1
+
+  which-builtin-type@1.2.1:
+    dependencies:
+      call-bound: 1.0.4
+      function.prototype.name: 1.1.8
+      has-tostringtag: 1.0.2
+      is-async-function: 2.1.1
+      is-date-object: 1.1.0
+      is-finalizationregistry: 1.1.1
+      is-generator-function: 1.1.2
+      is-regex: 1.2.1
+      is-weakref: 1.1.1
+      isarray: 2.0.5
+      which-boxed-primitive: 1.1.1
+      which-collection: 1.0.2
+      which-typed-array: 1.1.19
+
+  which-collection@1.0.2:
+    dependencies:
+      is-map: 2.0.3
+      is-set: 2.0.3
+      is-weakmap: 2.0.2
+      is-weakset: 2.0.4
+
+  which-typed-array@1.1.19:
+    dependencies:
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      for-each: 0.3.5
+      get-proto: 1.0.1
+      gopd: 1.2.0
+      has-tostringtag: 1.0.2
+
+  which@2.0.2:
+    dependencies:
+      isexe: 2.0.0
+
+  wrap-ansi@7.0.0:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  wrap-ansi@8.1.0:
+    dependencies:
+      ansi-styles: 6.2.3
+      string-width: 5.1.2
+      strip-ansi: 7.1.2
+
+  yallist@5.0.0: {}
+
+  zrender@5.6.1:
+    dependencies:
+      tslib: 2.3.0

+ 163 - 20
back-ui/src/api/dz/cards.js

@@ -1,44 +1,187 @@
-import request from '@/utils/request'
+import request from "@/utils/request";
 
 // 查询学习卡列表
 export function listCards(query) {
   return request({
-    url: '/dz/cards/list',
-    method: 'get',
-    params: query
-  })
+    url: "/dz/cards/list",
+    method: "get",
+    params: query,
+  });
 }
 
 // 查询学习卡详细
 export function getCards(cardId) {
   return request({
-    url: '/dz/cards/' + cardId,
-    method: 'get'
-  })
+    url: "/dz/cards/" + cardId,
+    method: "get",
+  });
 }
 
 // 新增学习卡
 export function addCards(data) {
   return request({
-    url: '/dz/cards',
-    method: 'post',
-    data: data
-  })
+    url: "/dz/cards",
+    method: "post",
+    data: data,
+  });
 }
 
 // 修改学习卡
 export function updateCards(data) {
   return request({
-    url: '/dz/cards',
-    method: 'put',
-    data: data
-  })
+    url: "/dz/cards",
+    method: "put",
+    data: data,
+  });
 }
 
 // 删除学习卡
-export function delCards(cardId) {
+export function delCards(cardIds) {
+  // 如果是数组,转换为逗号分隔的字符串
+  const ids = Array.isArray(cardIds) ? cardIds.join(",") : cardIds;
   return request({
-    url: '/dz/cards/' + cardId,
-    method: 'delete'
-  })
+    url: "/dz/cards/" + ids,
+    method: "delete",
+  });
+}
+
+// 制卡
+export function issueCard(institutionId, type, count) {
+  return request({
+    url: "/dz/cards/issueCard",
+    method: "post",
+    params: {
+      institutionId,
+      type,
+      count,
+    },
+  });
+}
+
+// 分配卡
+export function assignCard(
+  cardType,
+  agentId,
+  begin,
+  end,
+  location,
+  examType,
+  schoolId
+) {
+  return request({
+    url: "/dz/cards/assignCard",
+    method: "post",
+    params: {
+      cardType,
+      agentId,
+      begin,
+      end,
+      location,
+      examType,
+      schoolId,
+    },
+  });
+}
+
+// 获取考生类型列表
+export function getExamTypes(location) {
+  return request({
+    url: "/front/user/examTypes",
+    method: "get",
+    params: {
+      location,
+    },
+  });
+}
+
+// 获取代理商列表
+export function getAgentList(query) {
+  return request({
+    url: "/dz/agent/list",
+    method: "get",
+    params: query,
+  });
+}
+
+// 缴费
+export function payCard(cardIds) {
+  return request({
+    url: "/dz/cards/changeCard",
+    method: "post",
+    params: {
+      action: "Pay",
+      cardIds: Array.isArray(cardIds) ? cardIds.join(",") : cardIds,
+    },
+  });
+}
+
+// 关卡
+export function closeCard(cardIds) {
+  return request({
+    url: "/dz/cards/changeCard",
+    method: "post",
+    params: {
+      action: "Close",
+      cardIds: Array.isArray(cardIds) ? cardIds.join(",") : cardIds,
+    },
+  });
+}
+
+// 重开
+export function reopenCard(cardIds) {
+  return request({
+    url: "/dz/cards/changeCard",
+    method: "post",
+    params: {
+      action: "ReOpen",
+      cardIds: Array.isArray(cardIds) ? cardIds.join(",") : cardIds,
+    },
+  });
+}
+
+// 退费
+export function refundCard(cardIds) {
+  return request({
+    url: "/dz/cards/changeCard",
+    method: "post",
+    params: {
+      action: "Refund",
+      cardIds: Array.isArray(cardIds) ? cardIds.join(",") : cardIds,
+    },
+  });
+}
+
+// 获取校区列表
+export function getCampusList(query) {
+  return request({
+    url: "/dz/school/getSchoolList",
+    method: "get",
+    params: query,
+  });
+}
+
+// 关联校区
+export function associateCampus(beginCardNo, endCardNo, campusId) {
+  return request({
+    url: "/dz/cards/changeCampus",
+    method: "post",
+    params: {
+      campusId,
+      begin: beginCardNo,
+      end: endCardNo,
+    },
+  });
+}
+
+// 申请开卡
+export function requestOpenCard(schoolId, beginCardNo, endCardNo) {
+  return request({
+    url: "/dz/cards/requestOpenCard",
+    method: "post",
+    params: {
+      schoolId,
+      begin: beginCardNo,
+      end: endCardNo,
+    },
+  });
 }

+ 8 - 0
back-ui/src/api/dz/classes.js

@@ -9,6 +9,14 @@ export function listClasses(query) {
   })
 }
 
+export function listAllClass(query) {
+  return request({
+    url: '/dz/classes/listAll',
+    method: 'get',
+    params: query
+  })
+}
+
 // 查询学生班级列表
 export function listAllSchool(query) {
   return request({

+ 9 - 0
back-ui/src/api/dz/school.js

@@ -1,5 +1,14 @@
 import request from '@/utils/request'
 
+// 查询查询院校列表
+export function listUniversity(query) {
+  return request({
+    url: '/front/university/list',
+    method: 'get',
+    params: query
+  })
+}
+
 // 查询机构校区列表
 export function listAllSchool(query) {
   return request({

+ 17 - 0
back-ui/src/api/dz/teacherclass.js

@@ -9,6 +9,15 @@ export function listTeacherclass(query) {
   })
 }
 
+// 查询教师班级关系列表
+export function listAllTeacherClass(query) {
+  return request({
+    url: '/dz/teacherclass/listAllTeacherClass',
+    method: 'get',
+    params: query
+  })
+}
+
 // 查询教师班级关系详细
 export function getTeacherclass(id) {
   return request({
@@ -26,6 +35,14 @@ export function addTeacherclass(data) {
   })
 }
 
+export function batchBindTeacherClass(data) {
+  return request({
+    url: '/dz/teacherclass/batchBindTeacherClass',
+    method: 'post',
+    data: data
+  })
+}
+
 // 修改教师班级关系
 export function updateTeacherclass(data) {
   return request({

+ 15 - 0
back-ui/src/assets/icons/svg/share.svg

@@ -0,0 +1,15 @@
+<svg width="1024" height="1024" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
+  <!-- 中心圆 -->
+  <circle cx="512" cy="512" r="64" fill="currentColor"/>
+  
+  <!-- 箭头线条 -->
+  <path d="M512 192L512 832" stroke="currentColor" stroke-width="8" stroke-linecap="round"/>
+  <path d="M192 512L832 512" stroke="currentColor" stroke-width="8" stroke-linecap="round"/>
+  
+  <!-- 对角线箭头 -->
+  <path d="M224 224L800 800" stroke="currentColor" stroke-width="8" stroke-linecap="round"/>
+  <path d="M800 224L224 800" stroke="currentColor" stroke-width="8" stroke-linecap="round"/>
+</svg>
+
+
+

+ 17 - 12
back-ui/src/assets/styles/variables.module.scss

@@ -71,10 +71,10 @@ $--color-info: #909399;
   --sidebar-bg: #{$menuBg};
   --sidebar-text: #{$menuText};
   --menu-hover: #{$menuHover};
-  
+
   --navbar-bg: #ffffff;
   --navbar-text: #303133;
-  
+
   /* splitpanes default-theme 变量 */
   --splitpanes-default-bg: #ffffff;
 
@@ -119,7 +119,7 @@ html.dark {
   --blockquote-bg: #1d1e1f;
   --blockquote-border: #303030;
   --blockquote-text: #d0d0d0;
-  
+
   /* Cron 时间表达式 模式变量 */
   --cron-border: #303030;
 
@@ -127,10 +127,13 @@ html.dark {
   --splitpanes-default-bg: #141414;
 
   /* 侧边栏菜单覆盖 */
-   .sidebar-container {
-    .el-menu-item, .menu-title {
+  .sidebar-container {
+
+    .el-menu-item,
+    .menu-title {
       color: var(--el-text-color-regular);
     }
+
     & .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title,
     & .theme-dark .el-sub-menu .el-menu-item {
       background-color: var(--el-bg-color) !important;
@@ -141,6 +144,7 @@ html.dark {
   .el-menu--horizontal {
     .el-menu-item {
       &:not(.is-disabled) {
+
         &:hover,
         &:focus {
           background-color: var(--navbar-hover) !important;
@@ -180,7 +184,8 @@ html.dark {
     --el-table-border-color: var(--el-border-color-light) !important;
     --el-table-row-hover-bg-color: var(--el-bg-color-overlay) !important;
 
-    .el-table__header-wrapper, .el-table__fixed-header-wrapper {
+    .el-table__header-wrapper,
+    .el-table__fixed-header-wrapper {
       th {
         background-color: var(--el-bg-color-overlay, #f8f8f9) !important;
         color: var(--el-text-color-regular, #515a6e);
@@ -190,7 +195,7 @@ html.dark {
 
   /* 树组件高亮样式覆盖 */
   .el-tree {
-    .el-tree-node.is-current > .el-tree-node__content {
+    .el-tree-node.is-current>.el-tree-node__content {
       background-color: var(--el-bg-color-overlay) !important;
       color: var(--el-color-primary);
     }
@@ -199,9 +204,10 @@ html.dark {
       background-color: var(--el-bg-color-overlay);
     }
   }
-  
+
   /* 下拉菜单样式覆盖 */
-  .el-dropdown-menu__item:not(.is-disabled):focus, .el-dropdown-menu__item:not(.is-disabled):hover{
+  .el-dropdown-menu__item:not(.is-disabled):focus,
+  .el-dropdown-menu__item:not(.is-disabled):hover {
     background-color: var(--navbar-hover) !important;
   }
 
@@ -211,11 +217,10 @@ html.dark {
     border-left-color: var(--blockquote-border) !important;
     color: var(--blockquote-text) !important;
   }
-  
+
   /* 时间表达式标题样式覆盖 */
   .popup-result .title {
     background: var(--cron-border);
   }
 
-}
-
+}

+ 41 - 15
back-ui/src/components/AddressSelect/index.vue

@@ -1,22 +1,48 @@
 <template>
-  <el-cascader :options="data" :props="props" v-model="ids" clearable @change="handleChange" />
+  <el-cascader
+    :options="data"
+    :props="cascaderProps"
+    v-model="ids"
+    clearable
+    @change="handleChange"
+  />
 </template>
 <script setup>
+import { ref, watch } from "vue";
 import { cascaderAreaList } from "@/api/system/area";
-const data = ref([]);
-const ids = ref('');
-const opts = defineProps({
-  value: String
-});
-watch(opts, (val) => {
-  ids.value = val;
+
+const props = defineProps({
+  modelValue: [String, Array],
 });
-const emit = defineEmits(['update:value', 'change']);
-const props = {
+
+const emit = defineEmits(["update:modelValue", "change"]);
+
+const data = ref([]);
+const ids = ref(props.modelValue || []);
+
+// 监听父组件传入的值变化
+watch(
+  () => props.modelValue,
+  (newVal) => {
+    ids.value = newVal || [];
+  },
+  { immediate: true }
+);
+
+// 监听内部值变化并通知父组件
+watch(
+  ids,
+  (newVal) => {
+    emit("update:modelValue", newVal);
+  },
+  { deep: true }
+);
+
+const cascaderProps = {
   multiple: false,
   checkStrictly: true,
-  label: 'areaName',
-  value: 'areaId',
+  label: "areaName",
+  value: "areaId",
   lazy: true,
   async lazyLoad(node, resolve) {
     const { level, value } = node;
@@ -31,9 +57,9 @@ const props = {
 async function getAreaList(parentId) {
   return cascaderAreaList(parentId);
 }
-function handleChange() {
-  emit('update:value', ids.value || []);
-  emit('change', ids.value || []);
+function handleChange(value) {
+  emit("update:modelValue", ids.value || []);
+  emit("change", ids.value || []);
 }
 </script>
 <style lang="scss" scoped></style>

+ 600 - 0
back-ui/src/components/Form/index.vue

@@ -0,0 +1,600 @@
+<template>
+  <el-form
+    ref="formRef"
+    :model="formData"
+    :rules="formRules"
+    :label-width="labelWidth"
+    :label-position="labelPosition"
+    :size="size"
+    :disabled="disabled"
+    :inline="inline"
+    v-bind="$attrs"
+  >
+    <!-- 内联表单 -->
+    <template v-if="inline">
+      <el-form-item
+        v-for="(item, index) in formConfig"
+        :key="index"
+        :label="item.label"
+        :prop="item.name"
+        :required="item.req"
+        :rules="getItemRules(item)"
+      >
+        <!-- 输入框 -->
+        <el-input
+          v-if="item.type === 'text'"
+          v-model="formData[item.name]"
+          :placeholder="item.placeholder || `请输入${item.label}`"
+          :clearable="item.clearable !== false"
+          :disabled="item.disabled"
+          :maxlength="item.maxlength"
+          :show-word-limit="item.showWordLimit"
+          v-bind="item.props"
+        />
+
+        <!-- 文本域 -->
+        <el-input
+          v-else-if="item.type === 'textarea'"
+          v-model="formData[item.name]"
+          type="textarea"
+          :placeholder="item.placeholder || `请输入${item.label}`"
+          :rows="item.rows || 3"
+          :clearable="item.clearable !== false"
+          :disabled="item.disabled"
+          :maxlength="item.maxlength"
+          :show-word-limit="item.showWordLimit"
+          v-bind="item.props"
+        />
+
+        <!-- 数字输入框 -->
+        <el-input-number
+          v-else-if="item.type === 'number'"
+          v-model="formData[item.name]"
+          :placeholder="item.placeholder || `请输入${item.label}`"
+          :min="item.min"
+          :max="item.max"
+          :step="item.step"
+          :precision="item.precision"
+          :disabled="item.disabled"
+          :controls="item.controls !== false"
+          v-bind="item.props"
+        />
+
+        <!-- 选择器 -->
+        <el-select
+          v-else-if="item.type === 'select'"
+          v-model="formData[item.name]"
+          :placeholder="item.placeholder || `请选择${item.label}`"
+          :clearable="item.clearable !== false"
+          :disabled="item.disabled"
+          :multiple="item.multiple"
+          :filterable="item.filterable"
+          :remote="item.remote"
+          :remote-method="item.remoteMethod"
+          :loading="item.loading"
+          v-bind="item.props"
+          :style="inline ? 'width: 180px' : 'width: 100%'"
+        >
+          <el-option
+            v-for="option in getOptions(item)"
+            :key="getOptionValue(option, item)"
+            :label="getOptionLabel(option, item)"
+            :value="getOptionValue(option, item)"
+          />
+        </el-select>
+
+        <!-- 日期选择器 -->
+        <el-date-picker
+          v-else-if="item.type === 'date'"
+          v-model="formData[item.name]"
+          :type="item.dateType || 'date'"
+          :placeholder="item.placeholder || `请选择${item.label}`"
+          :format="item.format"
+          :value-format="item.valueFormat"
+          :clearable="item.clearable !== false"
+          :disabled="item.disabled"
+          :show-time="item.showTime"
+          :range-separator="item.rangeSeparator || '至'"
+          :start-placeholder="item.startPlaceholder"
+          :end-placeholder="item.endPlaceholder"
+          v-bind="item.props"
+          style="width: 180px"
+        />
+
+        <!-- 时间选择器 -->
+        <el-time-picker
+          v-else-if="item.type === 'time'"
+          v-model="formData[item.name]"
+          :placeholder="item.placeholder || `请选择${item.label}`"
+          :format="item.format"
+          :value-format="item.valueFormat"
+          :clearable="item.clearable !== false"
+          :disabled="item.disabled"
+          v-bind="item.props"
+          style="width: 180px"
+        />
+
+        <!-- 开关 -->
+        <el-switch
+          v-else-if="item.type === 'switch'"
+          v-model="formData[item.name]"
+          :disabled="item.disabled"
+          :active-text="item.activeText"
+          :inactive-text="item.inactiveText"
+          :active-value="item.activeValue"
+          :inactive-value="item.inactiveValue"
+          v-bind="item.props"
+        />
+
+        <!-- 单选框组 -->
+        <el-radio-group
+          v-else-if="item.type === 'radio'"
+          v-model="formData[item.name]"
+          :disabled="item.disabled"
+          v-bind="item.props"
+        >
+          <el-radio
+            v-for="option in getOptions(item)"
+            :key="getOptionValue(option, item)"
+            :label="getOptionValue(option, item)"
+          >
+            {{ getOptionLabel(option, item) }}
+          </el-radio>
+        </el-radio-group>
+
+        <!-- 复选框组 -->
+        <el-checkbox-group
+          v-else-if="item.type === 'checkbox'"
+          v-model="formData[item.name]"
+          :disabled="item.disabled"
+          v-bind="item.props"
+        >
+          <el-checkbox
+            v-for="option in getOptions(item)"
+            :key="getOptionValue(option, item)"
+            :label="getOptionValue(option, item)"
+          >
+            {{ getOptionLabel(option, item) }}
+          </el-checkbox>
+        </el-checkbox-group>
+
+        <!-- 自定义插槽 -->
+        <slot
+          v-else-if="item.type === 'slot'"
+          :name="item.slotName || item.name"
+          :item="item"
+          :value="formData[item.name]"
+          :formData="formData"
+        />
+
+        <!-- 范围选择器 -->
+        <div
+          v-else-if="item.type === 'range'"
+          class="range-input"
+          style="display: flex; align-items: center; gap: 10px"
+        >
+          <el-input
+            v-model="formData[item.beginField || 'begin']"
+            :placeholder="item.startPlaceholder || '开始值'"
+            :clearable="item.clearable !== false"
+            :disabled="item.disabled"
+            style="flex: 1"
+          />
+          <span style="color: #999; font-size: 14px">至</span>
+          <el-input
+            v-model="formData[item.endField || 'end']"
+            :placeholder="item.endPlaceholder || '结束值'"
+            :clearable="item.clearable !== false"
+            :disabled="item.disabled"
+            style="flex: 1"
+          />
+        </div>
+
+        <!-- 默认文本显示 -->
+        <span v-else>{{ formData[item.name] }}</span>
+      </el-form-item>
+    </template>
+
+    <!-- 栅格布局表单 -->
+    <el-row v-else :gutter="gutter">
+      <el-col
+        v-for="(item, index) in formConfig"
+        :key="index"
+        :span="item.span || 4"
+        :xs="item.xs || 12"
+        :sm="item.sm || 8"
+        :md="item.md || 6"
+        :lg="item.lg || 4"
+        :xl="item.xl || 4"
+      >
+        <el-form-item
+          :label="item.label"
+          :prop="item.name"
+          :required="item.req"
+          :rules="getItemRules(item)"
+        >
+          <!-- 输入框 -->
+          <el-input
+            v-if="item.type === 'text'"
+            v-model="formData[item.name]"
+            :placeholder="item.placeholder || `请输入${item.label}`"
+            :clearable="item.clearable !== false"
+            :disabled="item.disabled"
+            :maxlength="item.maxlength"
+            :show-word-limit="item.showWordLimit"
+            v-bind="item.props"
+          />
+
+          <!-- 文本域 -->
+          <el-input
+            v-else-if="item.type === 'textarea'"
+            v-model="formData[item.name]"
+            type="textarea"
+            :placeholder="item.placeholder || `请输入${item.label}`"
+            :rows="item.rows || 3"
+            :clearable="item.clearable !== false"
+            :disabled="item.disabled"
+            :maxlength="item.maxlength"
+            :show-word-limit="item.showWordLimit"
+            v-bind="item.props"
+          />
+
+          <!-- 数字输入框 -->
+          <el-input-number
+            v-else-if="item.type === 'number'"
+            v-model="formData[item.name]"
+            :placeholder="item.placeholder || `请输入${item.label}`"
+            :min="item.min"
+            :max="item.max"
+            :step="item.step"
+            :precision="item.precision"
+            :disabled="item.disabled"
+            :controls="item.controls !== false"
+            v-bind="item.props"
+            style="width: 100%"
+          />
+
+          <!-- 选择器 -->
+          <el-select
+            v-else-if="item.type === 'select'"
+            v-model="formData[item.name]"
+            :placeholder="item.placeholder || `请选择${item.label}`"
+            :clearable="item.clearable !== false"
+            :disabled="item.disabled"
+            :multiple="item.multiple"
+            :filterable="item.filterable"
+            :remote="item.remote"
+            :remote-method="item.remoteMethod"
+            :loading="item.loading"
+            v-bind="item.props"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="option in getOptions(item)"
+              :key="getOptionValue(option, item)"
+              :label="getOptionLabel(option, item)"
+              :value="getOptionValue(option, item)"
+            />
+          </el-select>
+
+          <!-- 日期选择器 -->
+          <el-date-picker
+            v-else-if="item.type === 'date'"
+            v-model="formData[item.name]"
+            :type="item.dateType || 'date'"
+            :placeholder="item.placeholder || `请选择${item.label}`"
+            :format="item.format"
+            :value-format="item.valueFormat"
+            :clearable="item.clearable !== false"
+            :disabled="item.disabled"
+            :show-time="item.showTime"
+            :range-separator="item.rangeSeparator || '至'"
+            :start-placeholder="item.startPlaceholder"
+            :end-placeholder="item.endPlaceholder"
+            v-bind="item.props"
+            style="width: 100%"
+          />
+
+          <!-- 时间选择器 -->
+          <el-time-picker
+            v-else-if="item.type === 'time'"
+            v-model="formData[item.name]"
+            :placeholder="item.placeholder || `请选择${item.label}`"
+            :format="item.format"
+            :value-format="item.valueFormat"
+            :clearable="item.clearable !== false"
+            :disabled="item.disabled"
+            v-bind="item.props"
+            style="width: 100%"
+          />
+
+          <!-- 开关 -->
+          <el-switch
+            v-else-if="item.type === 'switch'"
+            v-model="formData[item.name]"
+            :disabled="item.disabled"
+            :active-text="item.activeText"
+            :inactive-text="item.inactiveText"
+            :active-value="item.activeValue"
+            :inactive-value="item.inactiveValue"
+            v-bind="item.props"
+          />
+
+          <!-- 单选框组 -->
+          <el-radio-group
+            v-else-if="item.type === 'radio'"
+            v-model="formData[item.name]"
+            :disabled="item.disabled"
+            v-bind="item.props"
+          >
+            <el-radio
+              v-for="option in getOptions(item)"
+              :key="getOptionValue(option, item)"
+              :label="getOptionValue(option, item)"
+            >
+              {{ getOptionLabel(option, item) }}
+            </el-radio>
+          </el-radio-group>
+
+          <!-- 复选框组 -->
+          <el-checkbox-group
+            v-else-if="item.type === 'checkbox'"
+            v-model="formData[item.name]"
+            :disabled="item.disabled"
+            v-bind="item.props"
+          >
+            <el-checkbox
+              v-for="option in getOptions(item)"
+              :key="getOptionValue(option, item)"
+              :label="getOptionValue(option, item)"
+            >
+              {{ getOptionLabel(option, item) }}
+            </el-checkbox>
+          </el-checkbox-group>
+
+          <!-- 自定义插槽 -->
+          <slot
+            v-else-if="item.type === 'slot'"
+            :name="item.slotName || item.name"
+            :item="item"
+            :value="formData[item.name]"
+            :formData="formData"
+          />
+
+          <!-- 范围选择器 -->
+          <div
+            v-else-if="item.type === 'range'"
+            class="range-input"
+            style="display: flex; align-items: center; gap: 10px"
+          >
+            <el-input
+              v-model="formData[item.beginField || 'begin']"
+              :placeholder="item.startPlaceholder || '开始值'"
+              :clearable="item.clearable !== false"
+              :disabled="item.disabled"
+              style="flex: 1"
+            />
+            <span style="color: #999; font-size: 14px">至</span>
+            <el-input
+              v-model="formData[item.endField || 'end']"
+              :placeholder="item.endPlaceholder || '结束值'"
+              :clearable="item.clearable !== false"
+              :disabled="item.disabled"
+              style="flex: 1"
+            />
+          </div>
+
+          <!-- 默认文本显示 -->
+          <span v-else>{{ formData[item.name] }}</span>
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script setup>
+import { ref, reactive, watch, computed, onMounted } from "vue";
+
+const props = defineProps({
+  // 表单配置
+  config: {
+    type: Array,
+    default: () => [],
+  },
+  // 表单数据
+  modelValue: {
+    type: Object,
+    default: () => ({}),
+  },
+  // 标签宽度
+  labelWidth: {
+    type: String,
+    default: "120px",
+  },
+  // 标签位置
+  labelPosition: {
+    type: String,
+    default: "right",
+  },
+  // 尺寸
+  size: {
+    type: String,
+    default: "default",
+  },
+  // 是否禁用
+  disabled: {
+    type: Boolean,
+    default: false,
+  },
+  // 栅格间距
+  gutter: {
+    type: Number,
+    default: 20,
+  },
+  // 是否内联表单
+  inline: {
+    type: Boolean,
+    default: false,
+  },
+});
+
+const emit = defineEmits(["update:modelValue", "change", "validate"]);
+
+const formRef = ref();
+const formData = reactive({});
+const formRules = reactive({});
+
+// 监听父组件传入的modelValue变化,同步到formData
+watch(
+  () => props.modelValue,
+  (newValue) => {
+    if (newValue) {
+      Object.assign(formData, newValue);
+    }
+  },
+  { immediate: true, deep: true }
+);
+
+// 监听formData变化,同步回父组件
+watch(
+  formData,
+  (newData) => {
+    emit("update:modelValue", { ...newData });
+  },
+  { deep: true }
+);
+
+// 计算属性
+const formConfig = computed(() => props.config);
+
+// 初始化表单数据
+const initFormData = () => {
+  formConfig.value.forEach((item) => {
+    if (formData[item.name] === undefined) {
+      formData[item.name] = item.value || getDefaultValue(item.type);
+    }
+  });
+};
+
+// 获取默认值
+const getDefaultValue = (type) => {
+  const defaults = {
+    text: "",
+    textarea: "",
+    number: null,
+    select: null,
+    date: null,
+    time: null,
+    switch: false,
+    radio: null,
+    checkbox: [],
+  };
+  return defaults[type] || "";
+};
+
+// 初始化表单验证规则
+const initFormRules = () => {
+  formConfig.value.forEach((item) => {
+    if (item.req) {
+      formRules[item.name] = [
+        { required: true, message: `请输入${item.label}`, trigger: "blur" },
+      ];
+    }
+    if (item.rules) {
+      formRules[item.name] = formRules[item.name] || [];
+      formRules[item.name].push(...item.rules);
+    }
+  });
+};
+
+// 获取表单项验证规则
+const getItemRules = (item) => {
+  const rules = [];
+  if (item.req) {
+    rules.push({
+      required: true,
+      message: `请输入${item.label}`,
+      trigger: "blur",
+    });
+  }
+  if (item.rules) {
+    rules.push(...item.rules);
+  }
+  return rules;
+};
+
+// 获取选项数据
+const getOptions = (item) => {
+  return item.option || [];
+};
+
+// 获取选项标签
+const getOptionLabel = (option, item) => {
+  if (typeof option === "string") return option;
+  return option[item.optionLabel] || option.label || option.name || option;
+};
+
+// 获取选项值
+const getOptionValue = (option, item) => {
+  if (typeof option === "string") return option;
+  return option[item.optionValue] || option.value || option.id || option;
+};
+
+// 监听外部数据变化
+watch(
+  () => props.modelValue,
+  (newVal) => {
+    Object.assign(formData, newVal);
+  },
+  { deep: true, immediate: true }
+);
+
+// 监听表单数据变化
+watch(
+  formData,
+  (newVal) => {
+    emit("update:modelValue", { ...newVal });
+    emit("change", { ...newVal });
+  },
+  { deep: true }
+);
+
+// 表单验证
+const validate = (callback) => {
+  return formRef.value.validate(callback);
+};
+
+// 重置表单
+const resetFields = () => {
+  formRef.value.resetFields();
+  // 重置为初始值
+  formConfig.value.forEach((item) => {
+    formData[item.name] = item.value || getDefaultValue(item.type);
+  });
+};
+
+// 清除验证
+const clearValidate = (props) => {
+  formRef.value.clearValidate(props);
+};
+
+// 暴露方法
+defineExpose({
+  validate,
+  resetFields,
+  clearValidate,
+  formRef,
+});
+
+// 初始化
+onMounted(() => {
+  initFormData();
+  initFormRules();
+});
+</script>
+
+<style scoped>
+.el-form-item {
+  margin-bottom: 18px;
+}
+</style>

+ 261 - 0
back-ui/src/components/SearchForm/index.vue

@@ -0,0 +1,261 @@
+<template>
+  <div class="search-form">
+    <!-- 使用 Form 组件 -->
+    <Form
+      ref="formRef"
+      :config="searchConfig"
+      :model-value="searchData"
+      @update:model-value="handleFormUpdate"
+      :inline="inline"
+      :size="size"
+      :label-width="labelWidth"
+      v-bind="$attrs"
+    >
+      <!-- 省市区域选择器 slot -->
+      <template #areaSelect="{ value, formData }">
+        <AddressSelect v-model="formData.areaIds" style="width: 180px" />
+      </template>
+    </Form>
+
+    <!-- 操作按钮 -->
+    <div v-if="showButtons" class="search-buttons">
+      <el-button
+        type="primary"
+        :icon="Search"
+        :loading="loading"
+        @click="handleSearch"
+      >
+        {{ searchText }}
+      </el-button>
+      <el-button :icon="Refresh" @click="handleReset">
+        {{ resetText }}
+      </el-button>
+      <el-button
+        v-if="showExpand"
+        type="text"
+        :icon="expandCollapse ? ArrowUp : ArrowDown"
+        @click="toggleExpand"
+      >
+        {{ expandCollapse ? "收起" : "展开" }}
+      </el-button>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, watch, computed, onMounted } from "vue";
+import { Search, Refresh, ArrowUp, ArrowDown } from "@element-plus/icons-vue";
+import Form from "@/components/Form/index.vue";
+import AddressSelect from "@/components/AddressSelect/index.vue";
+
+const props = defineProps({
+  // 表单配置(从父组件传入)
+  config: {
+    type: Array,
+    default: () => [],
+  },
+  // 搜索数据
+  modelValue: {
+    type: Object,
+    default: () => ({}),
+  },
+  // 是否内联
+  inline: {
+    type: Boolean,
+    default: true,
+  },
+  // 尺寸
+  size: {
+    type: String,
+    default: "default",
+  },
+  // 标签宽度
+  labelWidth: {
+    type: String,
+    default: "auto",
+  },
+  // 是否显示按钮
+  showButtons: {
+    type: Boolean,
+    default: true,
+  },
+  // 搜索按钮文本
+  searchText: {
+    type: String,
+    default: "搜索",
+  },
+  // 重置按钮文本
+  resetText: {
+    type: String,
+    default: "重置",
+  },
+  // 是否显示展开/收起
+  showExpand: {
+    type: Boolean,
+    default: false,
+  },
+  // 展开时显示的字段数量
+  expandCount: {
+    type: Number,
+    default: 3,
+  },
+  // 加载状态
+  loading: {
+    type: Boolean,
+    default: false,
+  },
+  // 搜索处理函数(从父组件传入)
+  onSearch: {
+    type: Function,
+    default: null,
+  },
+  // 重置处理函数(从父组件传入)
+  onReset: {
+    type: Function,
+    default: null,
+  },
+});
+
+const emit = defineEmits([
+  "update:modelValue",
+  "search",
+  "reset",
+  "expand-change",
+]);
+
+const formRef = ref();
+const searchData = reactive({});
+const expandCollapse = ref(true);
+
+// 处理Form组件update:model-value事件
+const handleFormUpdate = (newData) => {
+  Object.assign(searchData, newData);
+};
+
+// 监听父组件传入的modelValue变化,同步到searchData
+watch(
+  () => props.modelValue,
+  (newValue) => {
+    if (newValue) {
+      Object.assign(searchData, newValue);
+    }
+  },
+  { immediate: true, deep: true }
+);
+
+// 监听searchData变化,同步回父组件
+watch(
+  searchData,
+  (newData) => {
+    emit("update:modelValue", { ...newData });
+  },
+  { deep: true }
+);
+
+// 强制监听searchData中的areaIds字段
+watch(
+  () => searchData.areaIds,
+  (newAreaIds, oldAreaIds) => {
+    if (newAreaIds !== oldAreaIds) {
+      emit("update:modelValue", { ...searchData });
+    }
+  },
+  { immediate: false, deep: true }
+);
+
+// 计算属性 - 筛选出可搜索的字段
+const searchConfig = computed(() => {
+  let config = props.config.filter((item) => item.search !== false);
+
+  if (props.showExpand && !expandCollapse.value) {
+    config = config.slice(0, props.expandCount);
+  }
+
+  return config;
+});
+
+// 搜索处理
+const handleSearch = () => {
+  const params = { ...searchData };
+  // 过滤空值
+  Object.keys(params).forEach((key) => {
+    if (
+      params[key] === "" ||
+      params[key] === null ||
+      params[key] === undefined
+    ) {
+      delete params[key];
+    }
+  });
+
+  // 如果父组件传入了搜索处理函数,则调用
+  if (props.onSearch) {
+    props.onSearch(params);
+  }
+
+  emit("search", params);
+};
+
+// 重置处理
+const handleReset = () => {
+  formRef.value.resetFields();
+
+  // 如果父组件传入了重置处理函数,则调用
+  if (props.onReset) {
+    props.onReset();
+  }
+
+  emit("reset");
+  emit("search", {});
+};
+
+// 展开/收起切换
+const toggleExpand = () => {
+  expandCollapse.value = !expandCollapse.value;
+  emit("expand-change", expandCollapse.value);
+};
+
+// 监听外部数据变化
+watch(
+  () => props.modelValue,
+  (newVal) => {
+    Object.assign(searchData, newVal);
+  },
+  { deep: true, immediate: true }
+);
+
+// 监听搜索数据变化
+watch(
+  searchData,
+  (newVal) => {
+    emit("update:modelValue", { ...newVal });
+  },
+  { deep: true }
+);
+
+// 暴露方法
+defineExpose({
+  formRef,
+  handleSearch,
+  handleReset,
+  toggleExpand,
+});
+</script>
+
+<style scoped>
+.search-form {
+  background: var(--el-bg-color);
+  padding: 18px;
+  border-radius: 4px;
+  margin-bottom: 16px;
+}
+
+.search-buttons {
+  margin-top: 18px;
+  text-align: left;
+}
+
+.search-buttons .el-button {
+  margin-right: 10px;
+}
+</style>

+ 357 - 0
back-ui/src/components/Table/index.vue

@@ -0,0 +1,357 @@
+<template>
+  <div class="table-container">
+    <el-table
+      v-loading="loading"
+      :data="tableData"
+      @selection-change="handleSelectionChange"
+      :stripe="stripe"
+      :border="border"
+      :height="height"
+      :max-height="maxHeight"
+      v-bind="$attrs"
+    >
+      <!-- 多选列 -->
+      <el-table-column
+        v-if="selectionMode === 'multiple'"
+        type="selection"
+        width="55"
+        align="center"
+      />
+
+      <!-- 单选列 -->
+      <el-table-column
+        v-if="selectionMode === 'single'"
+        width="55"
+        align="center"
+      >
+        <template #default="scope">
+          <el-radio
+            v-model="selectedRowKey"
+            :label="scope.row[rowKey]"
+            @change="handleSingleSelection(scope.row)"
+          >
+            &nbsp;
+          </el-radio>
+        </template>
+      </el-table-column>
+
+      <!-- 序号列 -->
+      <el-table-column
+        v-if="showIndex"
+        label="序号"
+        type="index"
+        width="80"
+        align="center"
+      />
+
+      <!-- 动态列 -->
+      <template v-for="column in columns" :key="column.prop || column.label">
+        <el-table-column
+          :label="column.label"
+          :prop="column.prop"
+          :align="column.align || 'center'"
+          :width="column.width"
+          :min-width="column.minWidth"
+          :fixed="column.fixed"
+          :show-overflow-tooltip="column.showOverflowTooltip !== false"
+          :type="column.type === 'index' ? 'index' : undefined"
+        >
+          <template #default="scope">
+            <!-- 序号列 - 使用Element Plus默认序号 -->
+            <template v-if="column.type === 'index'">
+              {{ scope.$index + 1 }}
+            </template>
+
+            <!-- 字典标签 -->
+            <template v-else-if="column.type === 'dict'">
+              <dict-tag
+                :options="column.options"
+                :value="scope.row[column.prop]"
+              />
+            </template>
+
+            <!-- 时间格式化 -->
+            <template v-else-if="column.type === 'time'">
+              <span>{{
+                parseTime(
+                  scope.row[column.prop],
+                  column.format || "{y}-{m}-{d}"
+                )
+              }}</span>
+            </template>
+
+            <!-- 图片 -->
+            <template v-else-if="column.type === 'image'">
+              <el-image
+                :src="scope.row[column.prop]"
+                :preview-src-list="
+                  column.previewList || [scope.row[column.prop]]
+                "
+                :style="{
+                  width: column.width || '50px',
+                  height: column.height || '50px',
+                }"
+                fit="cover"
+                v-if="scope.row[column.prop]"
+              />
+            </template>
+
+            <!-- 状态标签 -->
+            <template v-else-if="column.type === 'status'">
+              <el-tag
+                :type="getStatusTagType(scope.row, column)"
+                :size="column.tagSize || 'default'"
+              >
+                {{ getStatusText(scope.row, column) }}
+              </el-tag>
+            </template>
+
+            <!-- 自定义slot -->
+            <template v-else-if="column.type === 'slot'">
+              <slot :name="column.slotName" :row="scope.row" :column="column" />
+            </template>
+
+            <!-- 普通文本 -->
+            <template v-else>
+              <span :class="column.textClass">{{
+                scope.row[column.prop]
+              }}</span>
+            </template>
+          </template>
+        </el-table-column>
+      </template>
+
+      <!-- 操作列 -->
+      <el-table-column
+        v-if="actions && actions.length > 0"
+        label="操作"
+        align="center"
+        :width="actionWidth"
+        class-name="small-padding fixed-width"
+      >
+        <template #default="scope">
+          <template v-for="action in actions" :key="action.key">
+            <el-button
+              :link="action.link !== false"
+              :type="action.type || 'primary'"
+              :icon="action.icon"
+              :size="action.size || 'small'"
+              :disabled="getActionDisabled(scope.row, action)"
+              @click="handleAction(action, scope.row)"
+              v-hasPermi="action.permission"
+            >
+              {{ action.label }}
+            </el-button>
+            <el-divider
+              v-if="
+                action.showDivider !== false &&
+                action !== actions[actions.length - 1]
+              "
+              direction="vertical"
+            />
+          </template>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <pagination
+      v-if="showPagination"
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script setup>
+import { ref, computed, watch } from "vue";
+import { parseTime } from "@/utils/ruoyi";
+// import { useDict } from '@/stores/modules/dict' // 不需要,父组件传递
+import Pagination from "@/components/Pagination/index.vue";
+
+const props = defineProps({
+  // 表格数据
+  data: {
+    type: Array,
+    default: () => [],
+  },
+  // 表格列配置
+  columns: {
+    type: Array,
+    default: () => [],
+  },
+  // 操作按钮配置
+  actions: {
+    type: Array,
+    default: () => [],
+  },
+  // 加载状态
+  loading: {
+    type: Boolean,
+    default: false,
+  },
+  // 总数
+  total: {
+    type: Number,
+    default: 0,
+  },
+  // 查询参数
+  queryParams: {
+    type: Object,
+    default: () => ({
+      pageNum: 1,
+      pageSize: 10,
+    }),
+  },
+  // 是否显示多选
+  showSelection: {
+    type: Boolean,
+    default: false,
+  },
+  // 是否显示序号
+  showIndex: {
+    type: Boolean,
+    default: false,
+  },
+  // 是否显示分页
+  showPagination: {
+    type: Boolean,
+    default: true,
+  },
+  // 表格属性
+  stripe: {
+    type: Boolean,
+    default: true,
+  },
+  border: {
+    type: Boolean,
+    default: false,
+  },
+  height: {
+    type: [String, Number],
+    default: null,
+  },
+  maxHeight: {
+    type: [String, Number],
+    default: null,
+  },
+  // 操作列宽度
+  actionWidth: {
+    type: [String, Number],
+    default: "auto",
+  },
+  // 选择模式:'single' | 'multiple' | 'none'
+  selectionMode: {
+    type: String,
+    default: "none",
+    validator: (value) => ["single", "multiple", "none"].includes(value),
+  },
+  // 当前选中的行
+  selectedRows: {
+    type: Array,
+    default: () => [],
+  },
+  // 选择键字段名
+  rowKey: {
+    type: String,
+    default: "id",
+  },
+});
+
+const emit = defineEmits(["selection-change", "action", "getList"]);
+
+// 计算属性
+const tableData = computed(() => props.data);
+
+// 单选相关
+const selectedRowKey = ref(null);
+
+// 监听选中行变化
+watch(
+  () => props.selectedRows,
+  (newRows) => {
+    if (props.selectionMode === "single" && newRows.length > 0) {
+      selectedRowKey.value = newRows[0][props.rowKey];
+    } else if (props.selectionMode === "single" && newRows.length === 0) {
+      selectedRowKey.value = null;
+    }
+  },
+  { immediate: true }
+);
+
+// 单选处理
+const handleSingleSelection = (row) => {
+  emit("selection-change", [row]);
+};
+
+// 多选处理
+const handleSelectionChange = (selection) => {
+  emit("selection-change", selection);
+};
+
+// 执行操作
+const handleAction = (action, row) => {
+  emit("action", action, row);
+};
+
+// 获取操作按钮禁用状态
+const getActionDisabled = (row, action) => {
+  if (typeof action.disabled === "function") {
+    return action.disabled(row);
+  }
+  return action.disabled || false;
+};
+
+// 获取状态标签类型
+const getStatusTagType = (row, column) => {
+  if (typeof column.statusType === "function") {
+    return column.statusType(row);
+  }
+
+  const value = row[column.prop];
+  if (column.statusMap) {
+    return column.statusMap[value]?.type || "info";
+  }
+
+  // 默认状态映射
+  const statusMap = {
+    0: "info",
+    1: "success",
+    2: "warning",
+    3: "danger",
+  };
+  return statusMap[value] || "info";
+};
+
+// 获取状态文本
+const getStatusText = (row, column) => {
+  if (typeof column.statusText === "function") {
+    return column.statusText(row);
+  }
+
+  const value = row[column.prop];
+  if (column.statusMap) {
+    return column.statusMap[value]?.text || value;
+  }
+
+  return value;
+};
+
+// 获取列表数据
+const getList = () => {
+  emit("getList");
+};
+</script>
+
+<style scoped>
+.table-container {
+  width: 100%;
+}
+
+.el-table {
+  width: 100%;
+}
+</style>

+ 1 - 9
back-ui/src/layout/components/Navbar.vue

@@ -8,14 +8,6 @@
       <template v-if="appStore.device !== 'mobile'">
         <header-search id="header-search" class="right-menu-item" />
 
-        <el-tooltip content="源码地址" effect="dark" placement="bottom">
-          <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
-        <el-tooltip content="文档地址" effect="dark" placement="bottom">
-          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
-        </el-tooltip>
-
         <screenfull id="screenfull" class="right-menu-item hover-effect" />
 
         <el-tooltip content="主题模式" effect="dark" placement="bottom">
@@ -178,7 +170,7 @@ function toggleTheme() {
 
         svg {
           transition: transform 0.3s;
-          
+
           &:hover {
             transform: scale(1.15);
           }

+ 4 - 3
back-ui/src/store/modules/settings.js

@@ -24,9 +24,11 @@ const useSettingsStore = defineStore(
       sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo,
       dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle,
       footerVisible: storageSetting.footerVisible === undefined ? footerVisible : storageSetting.footerVisible,
-      footerContent: footerContent,
-      isDark: isDark.value
+      footerContent: footerContent
     }),
+    getters: {
+      isDark: () => isDark.value
+    },
     actions: {
       // 修改布局设置
       changeSetting(data) {
@@ -42,7 +44,6 @@ const useSettingsStore = defineStore(
       },
       // 切换暗黑模式
       toggleTheme() {
-        this.isDark = !this.isDark
         toggleDark()
       }
     }

+ 36 - 7
back-ui/src/views/dz/agent/index.vue

@@ -76,7 +76,8 @@
                           <el-table-column label="归属机构" align="center" key="deptName" prop="dept.deptName" :show-overflow-tooltip="true" />
                           <el-table-column label="联系电话" align="center" prop="phonenumber" />
                           <!--      <el-table-column label="上级代理商ID" align="center" prop="parentId" />-->
-                          <el-table-column label="学校/校区" align="center" prop="schools" />
+<!--                          <el-table-column label="学校/校区" align="center" prop="schools" />-->
+                          <el-table-column label="学校/校区" align="center" prop="schoolName" />
                           <el-table-column label="备注" align="center" prop="remark" />
                           <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
                               <template #default="scope">
@@ -95,7 +96,7 @@
     <el-dialog :title="title" v-model="open" width="500px" append-to-body>
       <el-form ref="agentRef" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="用户ID" prop="userId">
-          <el-input v-model="form.userId" placeholder="请输入用户ID" />
+          <el-input v-model="form.userId" placeholder="请输入用户ID" disabled/>
         </el-form-item>
           <el-form-item label="代理商" prop="name">
               <el-input v-model="form.name" placeholder="请输入代理商" />
@@ -117,9 +118,20 @@
             check-strictly
           />
         </el-form-item>
-        <el-form-item label="负责校区" prop="schools">
-          <el-input v-model="form.schools" placeholder="请输入负责校区" />
-        </el-form-item>
+<!--        <el-form-item label="负责校区" prop="schools">-->
+<!--          <el-input v-model="form.schools" placeholder="请输入负责校区" />-->
+<!--        </el-form-item>-->
+
+          <el-form-item label="关联校区" prop="classIds">
+              <el-select v-model="form.schoolIds" multiple placeholder="请选择校区" style="width: 100%">
+                  <el-option
+                          v-for="item in schoolOptions"
+                          :key="item.id"
+                          :label="item.name"
+                          :value="item.id"
+                  />
+              </el-select>
+          </el-form-item>
         <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" placeholder="请输入备注" />
         </el-form-item>
@@ -140,6 +152,7 @@ import { deptTreeSelect } from "@/api/system/user"
 import useAppStore from '@/store/modules/app'
 import { Splitpanes, Pane } from "splitpanes"
 import "splitpanes/dist/splitpanes.css"
+import { listAllSchool } from "@/api/dz/school"
 
 const { proxy } = getCurrentInstance()
 const appStore = useAppStore()
@@ -155,6 +168,7 @@ const refreshTable = ref(true)
 const deptName = ref("")
 const deptOptions = ref(undefined)
 const enabledDeptOptions = ref(undefined)
+const schoolOptions = ref(undefined)
 
 const data = reactive({
   form: {},
@@ -164,7 +178,8 @@ const data = reactive({
     deptId: null,
     phonenumber: null,
     parentId: null,
-    schools: null,
+    // schools: null,
+    schoolIds: []
   },
   rules: {
   }
@@ -244,7 +259,8 @@ function reset() {
     name: null,
     phonenumber: null,
     parentId: null,
-    schools: null,
+    // schools: null,
+    schoolIds: [],
     remark: null
   }
   proxy.resetForm("agentRef")
@@ -271,6 +287,8 @@ function resetQuery() {
 function handleAdd(row) {
   reset()
   getTreeselect()
+  //处理学校
+  getSchools(row)
   if (row != null && row.agentId) {
     form.value.parentId = row.agentId
   } else {
@@ -298,11 +316,22 @@ async function handleUpdate(row) {
   }
   getAgent(row.agentId).then(response => {
     form.value = response.data
+    //处理学校
+    getSchools(row)
+
     open.value = true
     title.value = "修改机构代理"
   })
 }
 
+function getSchools(row){
+    //处理学校
+    const deptId = row.deptId;
+    listAllSchool(deptId).then(response => {
+        schoolOptions.value= response.data
+    })
+}
+
 /** 提交按钮 */
 function submitForm() {
   proxy.$refs["agentRef"].validate(valid => {

+ 252 - 0
back-ui/src/views/dz/cards/components/ApplyCardDialog.vue

@@ -0,0 +1,252 @@
+<template>
+  <el-dialog
+    title="申请开卡"
+    v-model="visible"
+    width="500px"
+    append-to-body
+    align-center
+    :center="true"
+    :destroy-on-close="true"
+  >
+    <div class="apply-card-content">
+      <el-form
+        ref="applyCardFormRef"
+        :model="form"
+        :rules="rules"
+        label-width="100px"
+      >
+        <!-- 卡号段 -->
+        <el-form-item label="卡号段" :required="true">
+          <div style="display: flex; align-items: center; gap: 10px">
+            <el-form-item prop="beginCardNo" style="flex: 1; margin-bottom: 0">
+              <el-input
+                v-model="form.beginCardNo"
+                placeholder="开始卡号"
+                style="width: 100%"
+              />
+            </el-form-item>
+            <span>-</span>
+            <el-form-item prop="endCardNo" style="flex: 1; margin-bottom: 0">
+              <el-input
+                v-model="form.endCardNo"
+                placeholder="结束卡号"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </div>
+        </el-form-item>
+
+        <!-- 学校 -->
+        <el-form-item label="学校" prop="schoolId">
+          <el-select
+            v-model="form.schoolId"
+            placeholder="请选择学校"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="school in campusList"
+              :key="school.id"
+              :label="school.name"
+              :value="school.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCancel">取消</el-button>
+        <el-button type="primary" @click="handleSubmit" :loading="loading">
+          <svg-icon
+            icon-class="lightning"
+            class="mr-1"
+            style="font-size: 14px"
+          />
+          提交
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, computed, watch } from "vue";
+import { requestOpenCard } from "@/api/dz/cards";
+import { listUniversity } from "@/api/dz/school";
+import { associateCampus, getCampusList } from "@/api/dz/cards";
+
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false,
+  },
+  selectedCards: {
+    type: Array,
+    default: () => [],
+  },
+});
+
+const emit = defineEmits(["update:modelValue", "confirm", "success"]);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (value) => emit("update:modelValue", value),
+});
+
+const applyCardFormRef = ref();
+const loading = ref(false);
+const schoolList = ref([]);
+const campusList = ref([]);
+
+const form = ref({
+  beginCardNo: "",
+  endCardNo: "",
+  schoolId: null,
+});
+
+const rules = {
+  beginCardNo: [
+    { required: true, message: "开始卡号不能为空", trigger: "blur" },
+  ],
+  endCardNo: [{ required: true, message: "结束卡号不能为空", trigger: "blur" }],
+  schoolId: [{ required: true, message: "学校不能为空", trigger: "change" }],
+};
+
+// 获取校区列表
+async function getCampusListData() {
+  try {
+    const response = await getCampusList({ pageNum: 1, pageSize: 1000 });
+    if (response.code === 200) {
+      campusList.value = response.data || [];
+    }
+  } catch (error) {
+    console.error("获取校区列表失败:", error);
+  }
+}
+
+// 获取所有学校列表
+async function getAllSchools() {
+  try {
+    const response = await listUniversity({
+      pageNum: 1,
+      pageSize: 1000,
+    });
+    if (response.code === 200) {
+      // 处理API返回的数据结构
+      let schoolData = [];
+
+      // 检查是否有rows字段(直接在response中)
+      if (response.rows) {
+        schoolData = response.rows;
+      }
+      // 检查是否有data.rows字段
+      else if (response.data && response.data.rows) {
+        schoolData = response.data.rows;
+      }
+      // 检查是否有data数组
+      else if (response.data && Array.isArray(response.data)) {
+        schoolData = response.data;
+      }
+      // 检查是否有data对象
+      else if (response.data && response.data.id) {
+        schoolData = [response.data];
+      }
+
+      schoolList.value = schoolData;
+      console.log("所有学校数据:", schoolData);
+    }
+  } catch (error) {
+    console.error("获取所有学校列表失败:", error);
+    schoolList.value = [];
+  }
+}
+
+// 自动填充卡号段
+function autoFillCardRange() {
+  if (props.selectedCards && props.selectedCards.length > 0) {
+    const cardNos = props.selectedCards
+      .map((card) => card.cardNo || card.id)
+      .filter((cardNo) => cardNo && cardNo !== "未知")
+      .sort();
+
+    if (cardNos.length > 0) {
+      const minCardNo = cardNos[0];
+      const maxCardNo = cardNos[cardNos.length - 1];
+
+      // 开始卡号段是最小卡号段的整十数部分
+      const minCardNoNum = parseInt(minCardNo);
+      const beginCardNo = Math.floor(minCardNoNum / 10) * 10;
+
+      form.value.beginCardNo = beginCardNo.toString();
+      form.value.endCardNo = maxCardNo;
+    }
+  }
+}
+
+// 重置表单
+function resetForm() {
+  form.value = {
+    beginCardNo: "",
+    endCardNo: "",
+    schoolId: null,
+  };
+}
+
+// 取消
+function handleCancel() {
+  visible.value = false;
+  resetForm();
+}
+
+// 提交申请
+async function handleSubmit() {
+  applyCardFormRef.value.validate(async (valid) => {
+    if (valid) {
+      try {
+        loading.value = true;
+        const begin = form.value.beginCardNo;
+        const end = form.value.endCardNo;
+        const schoolId = form.value.schoolId;
+
+        if (!begin || !end) {
+          throw new Error("请填写完整的卡号段");
+        }
+        if (!schoolId) {
+          throw new Error("请选择学校");
+        }
+
+        await requestOpenCard(schoolId, begin, end);
+        emit("success", "申请开卡成功!");
+        visible.value = false;
+        resetForm();
+      } catch (error) {
+        console.error("申请开卡失败:", error);
+        emit("confirm", { error: error.message });
+      } finally {
+        loading.value = false;
+      }
+    }
+  });
+}
+
+// 监听弹窗关闭,重置表单
+watch(visible, (newVal) => {
+  if (!newVal) {
+    resetForm();
+  } else {
+    getCampusListData();
+    autoFillCardRange();
+  }
+});
+</script>
+
+<style scoped>
+.apply-card-content {
+  padding: 20px 0;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+</style>

+ 409 - 0
back-ui/src/views/dz/cards/components/AssignCardDialog.vue

@@ -0,0 +1,409 @@
+<template>
+  <el-dialog
+    title="分配卡"
+    v-model="visible"
+    width="500px"
+    append-to-body
+    align-center
+    :center="true"
+    :destroy-on-close="true"
+  >
+    <el-form
+      ref="assignCardFormRef"
+      :model="form"
+      :rules="rules"
+      label-width="100px"
+    >
+      <!-- 卡类型 -->
+      <el-form-item label="卡类型" prop="cardType" :required="true">
+        <el-select
+          v-model="form.cardType"
+          placeholder="请选择卡类型"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="dict in cardTypeOptions"
+            :key="dict.value"
+            :label="dict.label"
+            :value="parseInt(dict.value)"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <!-- 卡号段 -->
+      <el-form-item label="卡号段" :required="true">
+        <div style="display: flex; align-items: center; gap: 10px">
+          <el-form-item prop="beginCardNo" style="flex: 1; margin-bottom: 0">
+            <el-input
+              v-model="form.beginCardNo"
+              placeholder="开始卡号"
+              style="width: 100%"
+            />
+          </el-form-item>
+          <span>-</span>
+          <el-form-item prop="endCardNo" style="flex: 1; margin-bottom: 0">
+            <el-input
+              v-model="form.endCardNo"
+              placeholder="结束卡号"
+              style="width: 100%"
+            />
+          </el-form-item>
+        </div>
+      </el-form-item>
+
+      <!-- 代理商 -->
+      <el-form-item label="代理商" prop="agentId" :required="true">
+        <el-select
+          v-model="form.agentId"
+          placeholder="请选择代理商"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="agent in agentList"
+            :key="agent.id"
+            :label="agent.name"
+            :value="agent.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <!-- 省份 -->
+      <el-form-item label="省份" prop="province">
+        <el-select
+          v-model="form.province"
+          placeholder="请选择省份"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="province in provinceList"
+            :key="province.dictValue"
+            :label="province.dictLabel"
+            :value="province.dictValue"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <!-- 学校 -->
+      <el-form-item label="学校" prop="school">
+        <el-select
+          v-model="form.school"
+          placeholder="请选择学校"
+          style="width: 100%"
+          :disabled="!form.province"
+        >
+          <el-option
+            v-for="school in schoolList"
+            :key="school.id"
+            :label="school.name"
+            :value="school.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <!-- 考生类别 -->
+      <el-form-item label="考生类别" prop="studentCategory">
+        <el-select
+          v-model="form.studentCategory"
+          placeholder="请选择考生类别"
+          style="width: 100%"
+        >
+          <el-option label="全部" value="all"></el-option>
+          <el-option
+            v-for="examType in examTypeList"
+            :key="examType.dictValue"
+            :label="examType.dictLabel"
+            :value="examType.dictValue"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCancel">取消</el-button>
+        <el-button type="primary" @click="handleSubmit" :loading="loading"
+          >分配</el-button
+        >
+        <el-button @click="handleReassign" :loading="reassignLoading"
+          >重新分配</el-button
+        >
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, computed, watch } from "vue";
+import { assignCard, getExamTypes, getAgentList } from "@/api/dz/cards";
+import { getPaperProvinces } from "@/api/dz/papers";
+import { listUniversity } from "@/api/dz/school";
+
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false,
+  },
+  schoolList: {
+    type: Array,
+    default: () => [],
+  },
+  cardTypeOptions: {
+    type: Array,
+    default: () => [],
+  },
+});
+
+const emit = defineEmits(["update:modelValue", "success"]);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (value) => emit("update:modelValue", value),
+});
+
+const assignCardFormRef = ref();
+const loading = ref(false);
+const reassignLoading = ref(false);
+const provinceList = ref([]); // 省份列表
+const schoolList = ref([]); // 学校列表
+const examTypeList = ref([]); // 考生类型列表
+const agentList = ref([]); // 代理商列表
+
+const form = ref({
+  cardType: null,
+  beginCardNo: "",
+  endCardNo: "",
+  agentId: null,
+  province: null,
+  school: null,
+  studentCategory: "all",
+});
+
+const rules = {
+  cardType: [{ required: true, message: "卡类型不能为空", trigger: "change" }],
+  beginCardNo: [
+    { required: true, message: "开始卡号不能为空", trigger: "blur" },
+  ],
+  endCardNo: [{ required: true, message: "结束卡号不能为空", trigger: "blur" }],
+  agentId: [{ required: true, message: "代理商不能为空", trigger: "change" }],
+};
+
+// 重置表单
+function resetForm() {
+  form.value = {
+    cardType: null,
+    beginCardNo: "",
+    endCardNo: "",
+    agentId: null,
+    province: null,
+    school: null,
+    studentCategory: "all",
+  };
+}
+
+// 获取省份列表
+async function getProvinceList() {
+  try {
+    const response = await getPaperProvinces();
+    if (response.code === 200) {
+      provinceList.value = response.data || [];
+    }
+  } catch (error) {
+    console.error("获取省份列表失败:", error);
+  }
+}
+
+// 获取考生类型列表
+async function getExamTypeList(location) {
+  try {
+    const response = await getExamTypes(location);
+    if (response.code === 200) {
+      examTypeList.value = response.data || [];
+    }
+  } catch (error) {
+    console.error("获取考生类型列表失败:", error);
+  }
+}
+
+// 获取代理商列表
+async function getAgentListData() {
+  try {
+    const response = await getAgentList({});
+    if (response.code === 200) {
+      // 处理代理商数据,映射字段名
+      agentList.value = (response.data || []).map((item) => ({
+        id: item.agentId,
+        name: item.name,
+        agentId: item.agentId,
+        deptId: item.deptId,
+        phonenumber: item.phonenumber,
+        schoolName: item.schoolName,
+      }));
+    }
+  } catch (error) {
+    console.error("获取代理商列表失败:", error);
+  }
+}
+
+// 根据省份获取学校列表
+async function getSchoolListByProvince(province) {
+  try {
+    if (!province || province === "all") {
+      schoolList.value = [];
+      return;
+    }
+
+    const response = await listUniversity({
+      location: province,
+      pageNum: 1,
+      pageSize: 1000,
+    });
+    if (response.code === 200) {
+      // 处理API返回的数据结构
+      let schoolData = [];
+
+      // 检查是否有rows字段(直接在response中)
+      if (response.rows) {
+        schoolData = response.rows;
+      }
+      // 检查是否有data.rows字段
+      else if (response.data && response.data.rows) {
+        schoolData = response.data.rows;
+      }
+      // 检查是否有data数组
+      else if (response.data && Array.isArray(response.data)) {
+        schoolData = response.data;
+      }
+      // 检查是否有data对象
+      else if (response.data && response.data.id) {
+        schoolData = [response.data];
+      }
+
+      schoolList.value = schoolData;
+      console.log("学校数据:", schoolData); // 添加调试日志
+    }
+  } catch (error) {
+    console.error("获取学校列表失败:", error);
+    schoolList.value = [];
+  }
+}
+
+// 取消
+function handleCancel() {
+  visible.value = false;
+  resetForm();
+}
+
+// 提交
+async function handleSubmit() {
+  assignCardFormRef.value.validate(async (valid) => {
+    if (valid) {
+      try {
+        loading.value = true;
+        // 获取开始号和结束号
+        const begin = form.value.beginCardNo;
+        const end = form.value.endCardNo;
+
+        if (!begin || !end) {
+          throw new Error("请填写完整的卡号段");
+        }
+
+        // 调用分配卡API,传递所有参数
+        await assignCard(
+          form.value.cardType,
+          form.value.agentId,
+          begin,
+          end,
+          form.value.province,
+          form.value.studentCategory,
+          form.value.school
+        );
+
+        emit("success", "分配卡成功!");
+        visible.value = false;
+        resetForm();
+      } catch (error) {
+        console.error("分配卡失败:", error);
+        throw error;
+      } finally {
+        loading.value = false;
+      }
+    }
+  });
+}
+
+// 重新分配
+async function handleReassign() {
+  assignCardFormRef.value.validate(async (valid) => {
+    if (valid) {
+      try {
+        reassignLoading.value = true;
+        // 获取开始号和结束号
+        const begin = form.value.beginCardNo;
+        const end = form.value.endCardNo;
+
+        if (!begin || !end) {
+          throw new Error("请填写完整的卡号段");
+        }
+
+        // 再次调用分配卡API
+        await assignCard(
+          form.value.cardType,
+          form.value.agentId,
+          begin,
+          end,
+          form.value.province,
+          form.value.studentCategory,
+          form.value.school
+        );
+
+        emit("success", "重新分配卡成功!");
+        visible.value = false;
+        resetForm();
+      } catch (error) {
+        console.error("重新分配卡失败:", error);
+        throw error;
+      } finally {
+        reassignLoading.value = false;
+      }
+    } else {
+      // 如果表单验证失败,提示用户
+      console.warn("表单验证失败,请检查必填项");
+    }
+  });
+}
+
+// 监听弹窗关闭,重置表单
+watch(visible, (newVal) => {
+  if (!newVal) {
+    resetForm();
+  } else {
+    // 弹窗打开时获取省份列表
+    getProvinceList();
+    // 获取默认考生类型列表(可以根据需要调整)
+    getExamTypeList("湖南省"); // 默认获取湖南省的考生类型
+    // 获取代理商列表
+    getAgentListData();
+  }
+});
+
+// 监听省份变化,获取对应学校
+watch(
+  () => form.value.province,
+  (newProvince) => {
+    // 重置学校选择
+    form.value.school = null;
+    // 获取对应省份的学校列表
+    getSchoolListByProvince(newProvince);
+    // 获取对应省份的考生类型列表
+    if (newProvince) {
+      getExamTypeList(newProvince);
+    }
+  }
+);
+</script>
+
+<style scoped>
+.dialog-footer {
+  text-align: right;
+}
+</style>

+ 220 - 0
back-ui/src/views/dz/cards/components/AssociateCampusDialog.vue

@@ -0,0 +1,220 @@
+<template>
+  <el-dialog
+    title="关联校区"
+    v-model="visible"
+    width="500px"
+    append-to-body
+    align-center
+    :center="true"
+    :destroy-on-close="true"
+  >
+    <div class="associate-campus-content">
+      <el-form
+        ref="associateCampusFormRef"
+        :model="form"
+        :rules="rules"
+        label-width="100px"
+      >
+        <!-- 卡号段 -->
+        <el-form-item label="卡号段" :required="true">
+          <div style="display: flex; align-items: center; gap: 10px">
+            <el-form-item prop="beginCardNo" style="flex: 1; margin-bottom: 0">
+              <el-input
+                v-model="form.beginCardNo"
+                placeholder="开始卡号"
+                style="width: 100%"
+              />
+            </el-form-item>
+            <span>-</span>
+            <el-form-item prop="endCardNo" style="flex: 1; margin-bottom: 0">
+              <el-input
+                v-model="form.endCardNo"
+                placeholder="结束卡号"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </div>
+        </el-form-item>
+
+        <!-- 校区 -->
+        <el-form-item label="校区" prop="campusId" :required="true">
+          <el-select
+            v-model="form.campusId"
+            placeholder="请选择校区"
+            style="width: 100%"
+          >
+            <el-option label="全部" value="all"></el-option>
+            <el-option
+              v-for="campus in campusList"
+              :key="campus.id"
+              :label="campus.name"
+              :value="campus.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCancel">取消</el-button>
+        <el-button type="primary" @click="handleConfirm" :loading="loading">
+          <svg-icon
+            icon-class="lightning"
+            class="mr-1"
+            style="font-size: 14px"
+          />
+          确认
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, computed, watch } from "vue";
+import { associateCampus, getCampusList } from "@/api/dz/cards";
+
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false,
+  },
+  selectedCards: {
+    type: Array,
+    default: () => [],
+  },
+});
+
+const emit = defineEmits(["update:modelValue", "confirm", "success"]);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (value) => emit("update:modelValue", value),
+});
+
+const associateCampusFormRef = ref();
+const loading = ref(false);
+const campusList = ref([]);
+
+const form = ref({
+  beginCardNo: "",
+  endCardNo: "",
+  campusId: null,
+});
+
+const rules = {
+  beginCardNo: [
+    { required: true, message: "开始卡号不能为空", trigger: "blur" },
+  ],
+  endCardNo: [{ required: true, message: "结束卡号不能为空", trigger: "blur" }],
+  campusId: [{ required: true, message: "校区不能为空", trigger: "change" }],
+};
+
+// 获取校区列表
+async function getCampusListData() {
+  try {
+    const response = await getCampusList({ pageNum: 1, pageSize: 1000 });
+    if (response.code === 200) {
+      campusList.value = response.data || [];
+    }
+  } catch (error) {
+    console.error("获取校区列表失败:", error);
+  }
+}
+
+// 自动填充卡号段
+function autoFillCardRange() {
+  if (props.selectedCards && props.selectedCards.length > 0) {
+    const cardNos = props.selectedCards
+      .map((card) => card.cardNo || card.id)
+      .filter((cardNo) => cardNo && cardNo !== "未知")
+      .sort();
+
+    if (cardNos.length > 0) {
+      const minCardNo = cardNos[0];
+      const maxCardNo = cardNos[cardNos.length - 1];
+
+      // 开始卡号段是最小卡号段的整十数部分
+      const minCardNoNum = parseInt(minCardNo);
+      const beginCardNo = Math.floor(minCardNoNum / 10) * 10;
+
+      form.value.beginCardNo = beginCardNo.toString();
+      form.value.endCardNo = maxCardNo;
+    }
+  }
+}
+
+// 重置表单
+function resetForm() {
+  form.value = {
+    beginCardNo: "",
+    endCardNo: "",
+    campusId: null,
+  };
+}
+
+// 取消
+function handleCancel() {
+  visible.value = false;
+  resetForm();
+}
+
+// 确认关联
+async function handleConfirm() {
+  associateCampusFormRef.value.validate(async (valid) => {
+    if (valid) {
+      try {
+        loading.value = true;
+        const begin = form.value.beginCardNo;
+        const end = form.value.endCardNo;
+        const campusId = form.value.campusId;
+
+        if (!begin || !end) {
+          throw new Error("请填写完整的卡号段");
+        }
+        if (!campusId || campusId === "all") {
+          throw new Error("请选择校区");
+        }
+
+        await associateCampus(begin, end, campusId);
+        emit("success", "关联校区成功!");
+        visible.value = false;
+        resetForm();
+      } catch (error) {
+        console.error("关联校区失败:", error);
+        emit("confirm", { error: error.message });
+      } finally {
+        loading.value = false;
+      }
+    }
+  });
+}
+
+// 监听弹窗关闭,重置表单
+watch(visible, (newVal) => {
+  if (!newVal) {
+    resetForm();
+  } else {
+    getCampusListData();
+    autoFillCardRange();
+  }
+});
+</script>
+
+<style scoped>
+.associate-campus-content {
+  padding: 20px 0;
+}
+
+.hint-text {
+  color: #1890ff;
+  font-size: 12px;
+  margin-bottom: 20px;
+  padding-left: 100px;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+</style>

+ 299 - 0
back-ui/src/views/dz/cards/components/CardGenerationDialog.vue

@@ -0,0 +1,299 @@
+<template>
+  <el-dialog
+    title="制卡"
+    v-model="visible"
+    width="500px"
+    append-to-body
+    align-center
+    :center="true"
+    :destroy-on-close="true"
+  >
+    <el-form
+      ref="cardGenerationFormRef"
+      :model="form"
+      :rules="rules"
+      label-width="100px"
+    >
+      <!-- 机构 -->
+      <el-form-item label="机构" prop="institutionId" :required="true">
+        <el-select
+          v-model="form.institutionId"
+          placeholder="请选择机构"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="institution in institutionList"
+            :key="institution.deptId"
+            :label="institution.deptName"
+            :value="institution.deptId"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <!-- 卡类型 -->
+      <el-form-item label="卡类型" prop="type" :required="true">
+        <el-select
+          v-model="form.type"
+          placeholder="请选择卡类型"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="dict in cardTypeOptions"
+            :key="dict.value"
+            :label="dict.label"
+            :value="parseInt(dict.value)"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <!-- 省份 -->
+      <!-- <el-form-item label="省份">
+        <el-select
+          v-model="form.province"
+          placeholder="请选择省份"
+          style="width: 100%"
+        >
+          <el-option label="全部" value="all"></el-option>
+          <el-option
+            v-for="province in provinceList"
+            :key="province.dictValue"
+            :label="province.dictLabel"
+            :value="province.dictValue"
+          ></el-option>
+        </el-select>
+      </el-form-item> -->
+
+      <!-- 学校 -->
+      <!-- <el-form-item label="学校">
+        <el-select
+          v-model="form.school"
+          placeholder="请选择学校"
+          style="width: 100%"
+          :disabled="form.province === 'all'"
+        >
+          <el-option label="全部" value="all"></el-option>
+          <el-option
+            v-for="school in schoolList"
+            :key="school.id"
+            :label="school.name"
+            :value="school.id"
+          ></el-option>
+        </el-select>
+      </el-form-item> -->
+
+      <!-- 卡数量 -->
+      <el-form-item label="卡数量" prop="cardQuantity" :required="true">
+        <el-input-number
+          v-model="form.cardQuantity"
+          :min="1"
+          :max="1000"
+          placeholder="请输入卡数量"
+          style="width: 100%"
+        />
+      </el-form-item>
+    </el-form>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCancel">取消</el-button>
+        <el-button type="primary" @click="handleSubmit">开始制卡</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, computed, watch } from "vue";
+import { issueCard } from "@/api/dz/cards";
+import { getPaperProvinces } from "@/api/dz/papers";
+import { listUniversity } from "@/api/dz/school";
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false,
+  },
+  institutionList: {
+    type: Array,
+    default: () => [],
+  },
+  schoolList: {
+    type: Array,
+    default: () => [],
+  },
+  cardTypeOptions: {
+    type: Array,
+    default: () => [],
+  },
+});
+
+const emit = defineEmits(["update:modelValue", "success"]);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (value) => emit("update:modelValue", value),
+});
+
+const cardGenerationFormRef = ref();
+const provinceList = ref([]); // 省份列表
+const schoolList = ref([]); // 学校列表
+const form = ref({
+  institutionId: null,
+  type: null,
+  province: "all",
+  school: "all",
+  cardQuantity: 1,
+});
+
+const rules = {
+  institutionId: [
+    { required: true, message: "机构不能为空", trigger: "change" },
+  ],
+  type: [{ required: true, message: "卡类型不能为空", trigger: "change" }],
+  cardQuantity: [
+    { required: true, message: "卡数量不能为空", trigger: "blur" },
+    {
+      type: "number",
+      min: 1,
+      max: 1000,
+      message: "请输入正确的卡数量",
+      trigger: "blur",
+    },
+  ],
+};
+
+// 获取卡类型枚举
+function getCardTypeEnum(typeValue) {
+  const cardTypeMap = {
+    6: "Platform",
+    2: "Dept",
+    7: "ECard",
+    8: "Test",
+  };
+  return cardTypeMap[typeValue] || "ECard"; // 默认返回电子卡
+}
+
+// 获取省份列表
+async function getProvinceList() {
+  try {
+    const response = await getPaperProvinces();
+    if (response.code === 200) {
+      provinceList.value = response.data || [];
+    }
+  } catch (error) {
+    console.error("获取省份列表失败:", error);
+  }
+}
+
+// 根据省份获取学校列表
+async function getSchoolListByProvince(province) {
+  try {
+    if (province === "all" || !province) {
+      schoolList.value = [];
+      return;
+    }
+
+    const response = await listUniversity({
+      location: province,
+      pageNum: 1,
+      pageSize: 1000,
+    });
+    if (response.code === 200) {
+      // 处理API返回的数据结构
+      let schoolData = [];
+
+      // 检查是否有rows字段(直接在response中)
+      if (response.rows) {
+        schoolData = response.rows;
+      }
+      // 检查是否有data.rows字段
+      else if (response.data && response.data.rows) {
+        schoolData = response.data.rows;
+      }
+      // 检查是否有data数组
+      else if (response.data && Array.isArray(response.data)) {
+        schoolData = response.data;
+      }
+      // 检查是否有data对象
+      else if (response.data && response.data.id) {
+        schoolData = [response.data];
+      }
+
+      schoolList.value = schoolData;
+      console.log("学校数据:", schoolData); // 添加调试日志
+    }
+  } catch (error) {
+    console.error("获取学校列表失败:", error);
+    schoolList.value = [];
+  }
+}
+
+function resetForm() {
+  form.value = {
+    institutionId: null,
+    type: null,
+    province: "all",
+    school: "all",
+    cardQuantity: 1,
+  };
+}
+
+// 取消
+function handleCancel() {
+  visible.value = false;
+  resetForm();
+}
+
+// 提交
+async function handleSubmit() {
+  cardGenerationFormRef.value.validate(async (valid) => {
+    if (valid) {
+      try {
+        const cardData = {
+          institutionId: form.value.institutionId,
+          type: form.value.type,
+          count: parseInt(form.value.cardQuantity),
+        };
+        await issueCard(
+          cardData.institutionId,
+          getCardTypeEnum(cardData.type),
+          cardData.count
+        );
+
+        emit("success", "制卡成功!");
+        visible.value = false;
+        resetForm();
+      } catch (error) {
+        console.error("制卡失败:", error);
+        throw error;
+      }
+    }
+  });
+}
+
+// 监听弹窗关闭,重置表单
+watch(visible, (newVal) => {
+  if (!newVal) {
+    resetForm();
+  } else {
+    // 弹窗打开时获取省份列表
+    // getProvinceList(); // 暂时屏蔽
+  }
+});
+
+// 监听省份变化,获取对应学校
+// watch(
+//   () => form.value.province,
+//   (newProvince) => {
+//     // 重置学校选择
+//     form.value.school = "all";
+//     // 获取对应省份的学校列表
+//     getSchoolListByProvince(newProvince);
+//   }
+// );
+</script>
+
+<style scoped>
+.dialog-footer {
+  text-align: right;
+}
+</style>

+ 156 - 0
back-ui/src/views/dz/cards/components/CloseCardDialog.vue

@@ -0,0 +1,156 @@
+<template>
+  <el-dialog
+    title="关卡"
+    v-model="visible"
+    width="400px"
+    append-to-body
+    align-center
+    :center="true"
+    :destroy-on-close="true"
+  >
+    <div class="close-card-confirm-content">
+      <div class="confirm-item">
+        <el-icon class="warning-icon">
+          <Warning />
+        </el-icon>
+        <span class="confirm-text">
+          {{ getConfirmMessage() }}
+        </span>
+      </div>
+    </div>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCancel">取消</el-button>
+        <el-button type="primary" @click="handleConfirm" :loading="loading"
+          >确定</el-button
+        >
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, computed } from "vue";
+import { Warning } from "@element-plus/icons-vue";
+import { closeCard } from "@/api/dz/cards";
+
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false,
+  },
+  cardNo: {
+    type: [String, Number, Array],
+    default: "",
+  },
+  cardIds: {
+    type: Array,
+    default: () => [],
+  },
+});
+
+const emit = defineEmits(["update:modelValue", "confirm", "success"]);
+
+const loading = ref(false);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (value) => emit("update:modelValue", value),
+});
+
+// 获取确认消息
+function getConfirmMessage() {
+  // 处理 cardNo 为数组的情况
+  if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+    if (props.cardNo.length === 1) {
+      return `是否确认关卡vip卡编号为${props.cardNo[0]}的数据项?`;
+    } else {
+      return `是否确认关卡以下${
+        props.cardNo.length
+      }张vip卡?\n${props.cardNo.join("、")}`;
+    }
+  }
+  // 处理 cardNo 为单个值的情况
+  else if (props.cardNo) {
+    return `是否确认关卡vip卡编号为${props.cardNo}的数据项?`;
+  }
+  // 处理 cardIds 的情况
+  else if (props.cardIds && props.cardIds.length > 0) {
+    return `是否确认关卡选中的${props.cardIds.length}张学习卡?`;
+  }
+  return "是否确认关卡?";
+}
+
+// 取消
+function handleCancel() {
+  visible.value = false;
+}
+
+// 确认关卡
+async function handleConfirm() {
+  try {
+    loading.value = true;
+
+    // 确定要关卡的卡ID
+    let cardIdsToClose = [];
+
+    // 处理 cardNo 为数组的情况
+    if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+      cardIdsToClose = props.cardNo;
+    }
+    // 处理 cardNo 为单个值的情况
+    else if (props.cardNo) {
+      cardIdsToClose = [props.cardNo];
+    }
+    // 处理 cardIds 的情况
+    else if (props.cardIds && props.cardIds.length > 0) {
+      cardIdsToClose = props.cardIds;
+    }
+
+    if (cardIdsToClose.length === 0) {
+      throw new Error("没有选择要关卡的卡片");
+    }
+
+    // 调用关卡API
+    await closeCard(cardIdsToClose);
+
+    emit("success", "关卡成功!");
+    visible.value = false;
+  } catch (error) {
+    console.error("关卡失败:", error);
+    emit("confirm", { error: error.message });
+  } finally {
+    loading.value = false;
+  }
+}
+</script>
+
+<style scoped>
+.close-card-confirm-content {
+  padding: 20px 0;
+}
+
+.confirm-item {
+  display: flex;
+  align-items: flex-start;
+  gap: 12px;
+}
+
+.warning-icon {
+  color: #e6a23c;
+  font-size: 20px;
+  margin-top: 2px;
+  flex-shrink: 0;
+}
+
+.confirm-text {
+  font-size: 14px;
+  line-height: 1.5;
+  color: #ffffff;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+</style>

+ 249 - 0
back-ui/src/views/dz/cards/components/EditStudentDialog.vue

@@ -0,0 +1,249 @@
+<template>
+  <el-dialog
+    title="编辑"
+    v-model="visible"
+    width="500px"
+    append-to-body
+    align-center
+    :center="true"
+    :destroy-on-close="true"
+  >
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+      <!-- 学校 -->
+      <el-form-item label="学校" prop="schoolId">
+        <el-select
+          v-model="form.schoolId"
+          placeholder="请选择学校"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="school in schoolList"
+            :key="school.id"
+            :label="school.name"
+            :value="school.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <!-- 班级 -->
+      <el-form-item label="班级" prop="classId">
+        <el-select
+          v-model="form.classId"
+          placeholder="请选择班级"
+          style="width: 100%"
+        >
+          <el-option
+            v-for="classItem in classList"
+            :key="classItem.id"
+            :label="classItem.name"
+            :value="classItem.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+
+      <!-- 姓名 -->
+      <el-form-item label="姓名" prop="nickName">
+        <el-input v-model="form.nickName" placeholder="请输入姓名" />
+      </el-form-item>
+
+      <!-- 手机号 -->
+      <el-form-item label="手机号" prop="phone">
+        <el-input v-model="form.phone" placeholder="请输入手机号" />
+      </el-form-item>
+
+      <!-- 语数英 -->
+      <el-form-item label="语数英" prop="chineseMathEnglish">
+        <el-input
+          v-model="form.chineseMathEnglish"
+          placeholder="请输入语数英成绩"
+        />
+      </el-form-item>
+
+      <!-- 职业技能 -->
+      <el-form-item label="职业技能" prop="vocationalSkills">
+        <el-input
+          v-model="form.vocationalSkills"
+          placeholder="请输入职业技能成绩"
+        />
+      </el-form-item>
+    </el-form>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button type="primary" @click="handleSubmit">保 存</el-button>
+        <el-button @click="handleCancel">取 消</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, computed, watch } from "vue";
+import { getCards, addCards, updateCards } from "@/api/dz/cards";
+import { listUniversity } from "@/api/dz/school";
+
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false,
+  },
+  cardId: {
+    type: [String, Number],
+    default: null,
+  },
+  schoolList: {
+    type: Array,
+    default: () => [],
+  },
+  classList: {
+    type: Array,
+    default: () => [],
+  },
+});
+
+const emit = defineEmits(["update:modelValue", "success"]);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (value) => emit("update:modelValue", value),
+});
+
+const formRef = ref();
+const schoolList = ref([]); // 学校列表
+
+const form = ref({
+  cardId: null,
+  schoolId: null,
+  classId: null,
+  nickName: "",
+  phone: "",
+  chineseMathEnglish: "",
+  vocationalSkills: "",
+});
+
+const rules = {
+  schoolId: [{ required: true, message: "学校不能为空", trigger: "change" }],
+  classId: [{ required: true, message: "班级不能为空", trigger: "change" }],
+  nickName: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
+  phone: [
+    { required: true, message: "手机号不能为空", trigger: "blur" },
+    {
+      pattern: /^1[3-9]\d{9}$/,
+      message: "请输入正确的手机号",
+      trigger: "blur",
+    },
+  ],
+  chineseMathEnglish: [
+    { required: true, message: "语数英成绩不能为空", trigger: "blur" },
+  ],
+  vocationalSkills: [
+    { required: true, message: "职业技能成绩不能为空", trigger: "blur" },
+  ],
+};
+
+// 重置表单
+function resetForm() {
+  form.value = {
+    cardId: null,
+    schoolId: null,
+    classId: null,
+    nickName: "",
+    phone: "",
+    chineseMathEnglish: "",
+    vocationalSkills: "",
+  };
+}
+
+// 获取所有学校列表
+async function getAllSchools() {
+  try {
+    const response = await listUniversity({
+      pageNum: 1,
+      pageSize: 1000,
+    });
+    if (response.code === 200) {
+      // 处理API返回的数据结构
+      let schoolData = [];
+
+      // 检查是否有rows字段(直接在response中)
+      if (response.rows) {
+        schoolData = response.rows;
+      }
+      // 检查是否有data.rows字段
+      else if (response.data && response.data.rows) {
+        schoolData = response.data.rows;
+      }
+      // 检查是否有data数组
+      else if (response.data && Array.isArray(response.data)) {
+        schoolData = response.data;
+      }
+      // 检查是否有data对象
+      else if (response.data && response.data.id) {
+        schoolData = [response.data];
+      }
+
+      schoolList.value = schoolData;
+      console.log("所有学校数据:", schoolData);
+    }
+  } catch (error) {
+    console.error("获取所有学校列表失败:", error);
+    schoolList.value = [];
+  }
+}
+
+// 取消
+function handleCancel() {
+  visible.value = false;
+  resetForm();
+}
+
+// 提交
+async function handleSubmit() {
+  formRef.value.validate(async (valid) => {
+    if (valid) {
+      try {
+        if (form.value.cardId != null) {
+          await updateCards(form.value);
+        } else {
+          await addCards(form.value);
+        }
+
+        emit("success", "保存成功!");
+        visible.value = false;
+        resetForm();
+      } catch (error) {
+        console.error("保存失败:", error);
+        throw error;
+      }
+    }
+  });
+}
+
+// 获取卡片数据
+async function fetchCardData() {
+  if (props.cardId) {
+    try {
+      const response = await getCards(props.cardId);
+      form.value = response.data;
+    } catch (error) {
+      console.error("获取卡片数据失败:", error);
+    }
+  }
+}
+
+// 监听弹窗打开,获取数据
+watch(visible, (newVal) => {
+  if (newVal && props.cardId) {
+    fetchCardData();
+    getAllSchools(); // 获取所有学校列表
+  } else if (!newVal) {
+    resetForm();
+  }
+});
+</script>
+
+<style scoped>
+.dialog-footer {
+  text-align: right;
+}
+</style>

+ 156 - 0
back-ui/src/views/dz/cards/components/PaymentDialog.vue

@@ -0,0 +1,156 @@
+<template>
+  <el-dialog
+    title="缴费"
+    v-model="visible"
+    width="400px"
+    append-to-body
+    align-center
+    :center="true"
+    :destroy-on-close="true"
+  >
+    <div class="payment-confirm-content">
+      <div class="confirm-item">
+        <el-icon class="warning-icon">
+          <Warning />
+        </el-icon>
+        <span class="confirm-text">
+          {{ getConfirmMessage() }}
+        </span>
+      </div>
+    </div>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCancel">取消</el-button>
+        <el-button type="primary" @click="handleConfirm" :loading="loading"
+          >确定</el-button
+        >
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, computed } from "vue";
+import { Warning } from "@element-plus/icons-vue";
+import { payCard } from "@/api/dz/cards";
+
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false,
+  },
+  cardNo: {
+    type: [String, Number, Array],
+    default: "",
+  },
+  cardIds: {
+    type: Array,
+    default: () => [],
+  },
+});
+
+const emit = defineEmits(["update:modelValue", "confirm", "success"]);
+
+const loading = ref(false);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (value) => emit("update:modelValue", value),
+});
+
+// 获取确认消息
+function getConfirmMessage() {
+  // 处理 cardNo 为数组的情况
+  if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+    if (props.cardNo.length === 1) {
+      return `是否确认缴费vip卡编号为${props.cardNo[0]}的数据项?`;
+    } else {
+      return `是否确认缴费以下${
+        props.cardNo.length
+      }张vip卡?\n${props.cardNo.join("、")}`;
+    }
+  }
+  // 处理 cardNo 为单个值的情况
+  else if (props.cardNo) {
+    return `是否确认缴费vip卡编号为${props.cardNo}的数据项?`;
+  }
+  // 处理 cardIds 的情况
+  else if (props.cardIds && props.cardIds.length > 0) {
+    return `是否确认缴费选中的${props.cardIds.length}张学习卡?`;
+  }
+  return "是否确认缴费?";
+}
+
+// 取消
+function handleCancel() {
+  visible.value = false;
+}
+
+// 确认缴费
+async function handleConfirm() {
+  try {
+    loading.value = true;
+
+    // 确定要缴费的卡ID
+    let cardIdsToPay = [];
+
+    // 处理 cardNo 为数组的情况
+    if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+      cardIdsToPay = props.cardNo;
+    }
+    // 处理 cardNo 为单个值的情况
+    else if (props.cardNo) {
+      cardIdsToPay = [props.cardNo];
+    }
+    // 处理 cardIds 的情况
+    else if (props.cardIds && props.cardIds.length > 0) {
+      cardIdsToPay = props.cardIds;
+    }
+
+    if (cardIdsToPay.length === 0) {
+      throw new Error("没有选择要缴费的卡片");
+    }
+
+    // 调用缴费API
+    await payCard(cardIdsToPay);
+
+    emit("success", "缴费成功!");
+    visible.value = false;
+  } catch (error) {
+    console.error("缴费失败:", error);
+    emit("confirm", { error: error.message });
+  } finally {
+    loading.value = false;
+  }
+}
+</script>
+
+<style scoped>
+.payment-confirm-content {
+  padding: 20px 0;
+}
+
+.confirm-item {
+  display: flex;
+  align-items: flex-start;
+  gap: 12px;
+}
+
+.warning-icon {
+  color: #e6a23c;
+  font-size: 20px;
+  margin-top: 2px;
+  flex-shrink: 0;
+}
+
+.confirm-text {
+  font-size: 14px;
+  line-height: 1.5;
+  color: #ffffff;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+</style>

+ 92 - 0
back-ui/src/views/dz/cards/components/RefundDialog.vue

@@ -0,0 +1,92 @@
+<template>
+  <el-dialog
+    title="退费"
+    v-model="visible"
+    width="400px"
+    append-to-body
+    align-center
+    :center="true"
+    :destroy-on-close="true"
+  >
+    <div class="refund-confirm-content">
+      <div class="confirm-item">
+        <el-icon class="warning-icon">
+          <Warning />
+        </el-icon>
+        <span class="confirm-text">
+          是否确认退费vip卡编号为{{ cardNo }}的数据项?
+        </span>
+      </div>
+    </div>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCancel">取消</el-button>
+        <el-button type="primary" @click="handleConfirm">确定</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, computed } from "vue";
+import { Warning } from "@element-plus/icons-vue";
+
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false,
+  },
+  cardNo: {
+    type: [String, Number],
+    default: "",
+  },
+});
+
+const emit = defineEmits(["update:modelValue", "confirm"]);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (value) => emit("update:modelValue", value),
+});
+
+// 取消
+function handleCancel() {
+  visible.value = false;
+}
+
+// 确认退费
+function handleConfirm() {
+  emit("confirm", props.cardNo);
+  visible.value = false;
+}
+</script>
+
+<style scoped>
+.refund-confirm-content {
+  padding: 20px 0;
+}
+
+.confirm-item {
+  display: flex;
+  align-items: flex-start;
+  gap: 12px;
+}
+
+.warning-icon {
+  color: #e6a23c;
+  font-size: 20px;
+  margin-top: 2px;
+  flex-shrink: 0;
+}
+
+.confirm-text {
+  font-size: 14px;
+  line-height: 1.5;
+  color: #ffffff;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+</style>

+ 156 - 0
back-ui/src/views/dz/cards/components/ReopenCardDialog.vue

@@ -0,0 +1,156 @@
+<template>
+  <el-dialog
+    title="重开"
+    v-model="visible"
+    width="400px"
+    append-to-body
+    align-center
+    :center="true"
+    :destroy-on-close="true"
+  >
+    <div class="reopen-card-confirm-content">
+      <div class="confirm-item">
+        <el-icon class="warning-icon">
+          <Warning />
+        </el-icon>
+        <span class="confirm-text">
+          {{ getConfirmMessage() }}
+        </span>
+      </div>
+    </div>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCancel">取消</el-button>
+        <el-button type="primary" @click="handleConfirm" :loading="loading"
+          >确定</el-button
+        >
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, computed } from "vue";
+import { Warning } from "@element-plus/icons-vue";
+import { reopenCard } from "@/api/dz/cards";
+
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false,
+  },
+  cardNo: {
+    type: [String, Number, Array],
+    default: "",
+  },
+  cardIds: {
+    type: Array,
+    default: () => [],
+  },
+});
+
+const emit = defineEmits(["update:modelValue", "confirm", "success"]);
+
+const loading = ref(false);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (value) => emit("update:modelValue", value),
+});
+
+// 获取确认消息
+function getConfirmMessage() {
+  // 处理 cardNo 为数组的情况
+  if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+    if (props.cardNo.length === 1) {
+      return `是否确认重开VIP卡编号为${props.cardNo[0]}的数据项?`;
+    } else {
+      return `是否确认重开以下${
+        props.cardNo.length
+      }张VIP卡?\n${props.cardNo.join("、")}`;
+    }
+  }
+  // 处理 cardNo 为单个值的情况
+  else if (props.cardNo) {
+    return `是否确认重开VIP卡编号为${props.cardNo}的数据项?`;
+  }
+  // 处理 cardIds 的情况
+  else if (props.cardIds && props.cardIds.length > 0) {
+    return `是否确认重开选中的${props.cardIds.length}张学习卡?`;
+  }
+  return "是否确认重开?";
+}
+
+// 取消
+function handleCancel() {
+  visible.value = false;
+}
+
+// 确认重开
+async function handleConfirm() {
+  try {
+    loading.value = true;
+
+    // 确定要重开的卡ID
+    let cardIdsToReopen = [];
+
+    // 处理 cardNo 为数组的情况
+    if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
+      cardIdsToReopen = props.cardNo;
+    }
+    // 处理 cardNo 为单个值的情况
+    else if (props.cardNo) {
+      cardIdsToReopen = [props.cardNo];
+    }
+    // 处理 cardIds 的情况
+    else if (props.cardIds && props.cardIds.length > 0) {
+      cardIdsToReopen = props.cardIds;
+    }
+
+    if (cardIdsToReopen.length === 0) {
+      throw new Error("没有选择要重开的卡片");
+    }
+
+    // 调用重开API
+    await reopenCard(cardIdsToReopen);
+
+    emit("success", "重开成功!");
+    visible.value = false;
+  } catch (error) {
+    console.error("重开失败:", error);
+    emit("confirm", { error: error.message });
+  } finally {
+    loading.value = false;
+  }
+}
+</script>
+
+<style scoped>
+.reopen-card-confirm-content {
+  padding: 20px 0;
+}
+
+.confirm-item {
+  display: flex;
+  align-items: flex-start;
+  gap: 12px;
+}
+
+.warning-icon {
+  color: #e6a23c;
+  font-size: 20px;
+  margin-top: 2px;
+  flex-shrink: 0;
+}
+
+.confirm-text {
+  font-size: 14px;
+  line-height: 1.5;
+  color: #ffffff;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+</style>

+ 301 - 0
back-ui/src/views/dz/cards/config/form.js

@@ -0,0 +1,301 @@
+const info = [
+  // 第一行
+  {
+    label: "省市区",
+    name: "areaIds",
+    value: [],
+    type: "slot",
+    slotName: "areaSelect",
+    search: true,
+  },
+  {
+    label: "分配学校",
+    name: "assignSchoolId",
+    value: "",
+    type: "select",
+    option: [],
+    optionLabel: "name",
+    optionValue: "id",
+    search: true,
+  },
+  {
+    label: "注册学校",
+    name: "registerSchoolId",
+    value: "",
+    type: "select",
+    option: [],
+    optionLabel: "name",
+    optionValue: "id",
+    search: true,
+  },
+  {
+    label: "校区",
+    name: "campusId",
+    value: "",
+    type: "select",
+    option: [],
+    optionLabel: "name",
+    optionValue: "id",
+    search: true,
+  },
+  {
+    label: "代理商",
+    name: "agentId",
+    value: "",
+    type: "select",
+    option: [],
+    optionLabel: "name",
+    optionValue: "id",
+    search: true,
+  },
+
+  // 第二行
+  {
+    label: "账号",
+    name: "cardNo",
+    value: "",
+    type: "text",
+    search: true,
+  },
+  {
+    label: "初始密码",
+    name: "password",
+    value: "",
+    type: "text",
+    search: true,
+  },
+  {
+    label: "卡号段",
+    name: "cardNoRange",
+    value: "",
+    type: "range",
+    search: true,
+    placeholder: "请选择卡号段",
+    startPlaceholder: "开始卡号",
+    endPlaceholder: "结束卡号",
+    beginField: "begin",
+    endField: "end",
+  },
+  {
+    label: "卡类型",
+    name: "type",
+    value: "",
+    type: "select",
+    option: [],
+    optionLabel: "label",
+    optionValue: "value",
+    search: true,
+  },
+  {
+    label: "分配考生类别",
+    name: "studentCategory",
+    value: "",
+    type: "select",
+    option: [],
+    optionLabel: "label",
+    optionValue: "value",
+    search: true,
+  },
+
+  // 第三行
+  {
+    label: "分配状态",
+    name: "distributeStatus",
+    value: "",
+    type: "select",
+    option: [],
+    optionLabel: "label",
+    optionValue: "value",
+    search: true,
+  },
+  {
+    label: "使用状态",
+    name: "status",
+    value: "",
+    type: "select",
+    option: [],
+    optionLabel: "label",
+    optionValue: "value",
+    search: true,
+  },
+  {
+    label: "过期状态",
+    name: "timeStatus",
+    value: "",
+    type: "select",
+    option: [],
+    optionLabel: "label",
+    optionValue: "value",
+    search: true,
+  },
+  {
+    label: "结束状态",
+    name: "isSettlement",
+    value: "",
+    type: "select",
+    option: [
+      { label: "是", value: 1 },
+      { label: "否", value: 0 },
+    ],
+    optionLabel: "label",
+    optionValue: "value",
+    search: true,
+  },
+
+  // 其他字段(不在搜索表单显示但保留的)
+  {
+    label: "卡号",
+    name: "cardNo",
+    value: "",
+    type: "text",
+    search: false,
+  },
+  {
+    label: "密码",
+    name: "password",
+    value: "",
+    type: "text",
+    search: false,
+  },
+  {
+    label: "末级代理商ID",
+    name: "leftAgentId",
+    value: "",
+    type: "select",
+    option: [],
+    optionLabel: "name",
+    optionValue: "id",
+    search: false,
+  },
+  {
+    label: "学校班级ID",
+    name: "schoolId",
+    value: "",
+    type: "text",
+    search: false,
+  },
+  {
+    label: "班级ID",
+    name: "classId",
+    value: "",
+    type: "text",
+    search: false,
+  },
+  {
+    label: "入学年份",
+    name: "year",
+    value: "",
+    type: "text",
+    search: false,
+  },
+  {
+    label: "高考年份",
+    name: "endYear",
+    value: "",
+    type: "text",
+    search: false,
+  },
+  {
+    label: "开卡ID",
+    name: "openId",
+    value: "",
+    type: "text",
+    search: false,
+  },
+  {
+    label: "分配时间",
+    name: "distributeTime",
+    value: "",
+    type: "date",
+    dateType: "date",
+    valueFormat: "YYYY-MM-DD",
+    search: false,
+  },
+  {
+    label: "过期时间",
+    name: "outDate",
+    value: "",
+    type: "date",
+    dateType: "date",
+    valueFormat: "YYYY-MM-DD",
+    search: false,
+  },
+  {
+    label: "开卡时间",
+    name: "openTime",
+    value: "",
+    type: "date",
+    dateType: "date",
+    valueFormat: "YYYY-MM-DD",
+    search: false,
+  },
+  {
+    label: "缴费时间",
+    name: "payTime",
+    value: "",
+    type: "date",
+    dateType: "date",
+    valueFormat: "YYYY-MM-DD",
+    search: false,
+  },
+  {
+    label: "激活时间",
+    name: "activeTime",
+    value: "",
+    type: "date",
+    dateType: "date",
+    valueFormat: "YYYY-MM-DD",
+    search: false,
+  },
+  {
+    label: "结算时间",
+    name: "settlementTime",
+    value: "",
+    type: "date",
+    dateType: "date",
+    valueFormat: "YYYY-MM-DD",
+    search: false,
+  },
+  {
+    label: "退费时间",
+    name: "refundTime",
+    value: "",
+    type: "date",
+    dateType: "date",
+    valueFormat: "YYYY-MM-DD",
+    search: false,
+  },
+  {
+    label: "关卡时间",
+    name: "closeTime",
+    value: "",
+    type: "date",
+    dateType: "date",
+    valueFormat: "YYYY-MM-DD",
+    search: false,
+  },
+  {
+    label: "创建时间",
+    name: "createTime",
+    value: "",
+    type: "date",
+    dateType: "date",
+    valueFormat: "YYYY-MM-DD",
+    search: false,
+  },
+  {
+    label: "更新时间",
+    name: "updateTime",
+    value: "",
+    type: "date",
+    dateType: "date",
+    valueFormat: "YYYY-MM-DD",
+    search: false,
+  },
+];
+
+const formInfo = {
+  info,
+};
+
+export default formInfo;

+ 187 - 0
back-ui/src/views/dz/cards/config/table.js

@@ -0,0 +1,187 @@
+const tableConfig = {
+  // 表格列配置
+  columns: [
+    {
+      label: "序号",
+      type: "index",
+      align: "center",
+      width: 80,
+    },
+    {
+      label: "卡号",
+      prop: "cardNo",
+      align: "center",
+      width: 120,
+      showOverflowTooltip: true,
+    },
+    {
+      label: "密码",
+      prop: "password",
+      align: "center",
+      width: 100,
+    },
+    {
+      label: "姓名—手机",
+      prop: "studentInfo",
+      align: "center",
+      type: "slot",
+      slotName: "studentInfo", // 自定义插槽显示姓名-手机
+      width: 150,
+    },
+    {
+      label: "卡类型",
+      prop: "type",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置
+      width: 100,
+    },
+    {
+      label: "分配学校",
+      prop: "assignSchoolName",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置学校选项
+      width: 120,
+    },
+    {
+      label: "注册学校",
+      prop: "schoolName",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置学校选项
+      width: 120,
+    },
+    {
+      label: "班级",
+      prop: "className",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置班级选项
+      width: 100,
+    },
+    {
+      label: "校区",
+      prop: "campusName",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置校区选项
+      width: 100,
+    },
+    {
+      label: "校区班级",
+      prop: "className",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置校区班级选项
+      width: 120,
+    },
+    {
+      label: "分配考生类型",
+      prop: "assignExamType",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置
+      width: 120,
+    },
+    {
+      label: "分配状态",
+      prop: "distributeStatus",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置
+      width: 100,
+    },
+    {
+      label: "使用状态",
+      prop: "status",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置
+      width: 100,
+    },
+    {
+      label: "过期状态",
+      prop: "timeStatus",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置
+      width: 100,
+    },
+    {
+      label: "结算状态",
+      prop: "isSettlement",
+      align: "center",
+      type: "dict",
+      options: [], // 动态设置
+      width: 100,
+    },
+    {
+      label: "激活时间",
+      prop: "activeTime",
+      align: "center",
+      type: "time",
+      format: "{y}-{m}-{d}",
+      width: 120,
+    },
+    {
+      label: "到期时间",
+      prop: "outDate",
+      align: "center",
+      type: "time",
+      format: "{y}-{m}-{d}",
+      width: 120,
+    },
+    {
+      label: "缴费时间",
+      prop: "payTime",
+      align: "center",
+      type: "time",
+      format: "{y}-{m}-{d}",
+      width: 120,
+    },
+    {
+      label: "开卡时间",
+      prop: "openTime",
+      align: "center",
+      type: "time",
+      format: "{y}-{m}-{d}",
+      width: 120,
+    },
+  ],
+
+  // 操作按钮配置
+  actions: [
+    // {
+    //   key: "edit",
+    //   label: "修改",
+    //   type: "primary",
+    //   icon: "Edit",
+    //   link: true,
+    //   permission: ["dz:cards:edit"],
+    // },
+    {
+      key: "delete",
+      label: "删除",
+      type: "primary",
+      icon: "Delete",
+      link: true,
+      permission: ["dz:cards:remove"],
+    },
+  ],
+
+  // 表格属性配置
+  tableProps: {
+    stripe: true,
+    border: false,
+    showSelection: true, // 启用多选列
+    showIndex: false, // 使用自定义序号列
+    showPagination: true,
+    actionWidth: "auto",
+    // 选择模式配置
+    selectionMode: "multiple", // 'single' | 'multiple' | 'none'
+    rowKey: "cardId", // 选择键字段名
+  },
+};
+
+export default tableConfig;

+ 943 - 690
back-ui/src/views/dz/cards/index.vue

@@ -1,235 +1,42 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="卡号" prop="cardNo">
-        <el-input
-                v-model="queryParams.cardNo"
-                placeholder="请输入卡号"
-                clearable
-                @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-<!--      <el-form-item label="初始密码" prop="password">-->
-<!--        <el-input-->
-<!--                v-model="queryParams.password"-->
-<!--                placeholder="请输入初始密码"-->
-<!--                clearable-->
-<!--                @keyup.enter="handleQuery"-->
-<!--        />-->
-<!--      </el-form-item>-->
-      <el-form-item label="卡类型" prop="type">
-        <el-select v-model="queryParams.type" placeholder="请选择卡类型" clearable style="width: 170px;">
-          <el-option
-                  v-for="dict in card_type"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="卡状态" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择卡状态" clearable style="width: 170px;">
-          <el-option
-                  v-for="dict in card_status"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="分配状态" prop="distributeStatus">
-        <el-select v-model="queryParams.distributeStatus" placeholder="请选择分配状态" clearable style="width: 170px;">
-          <el-option
-                  v-for="dict in card_distribute_status"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="过期状态" prop="timeStatus">
-        <el-select v-model="queryParams.timeStatus" placeholder="请选择过期状态" clearable style="width: 170px;">
-          <el-option
-                  v-for="dict in card_time_status"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="缴费状态" prop="payStatus">
-        <el-select v-model="queryParams.payStatus" placeholder="请选择缴费状态" clearable style="width: 170px;">
-          <el-option
-                  v-for="dict in card_pay_status"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="是否结算" prop="isSettlement">
-        <el-select v-model="queryParams.isSettlement" placeholder="请选择是否结算" clearable style="width: 170px;">
-          <el-option
-                  v-for="dict in bool_values"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="一级代理商ID" prop="agentId">
-        <el-input
-                v-model="queryParams.agentId"
-                placeholder="请输入一级代理商ID"
-                clearable
-                @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="末级代理商ID" prop="leftAgentId">
-        <el-input
-                v-model="queryParams.leftAgentId"
-                placeholder="请输入末级代理商ID"
-                clearable
-                @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="安排校区" prop="campusId">
-        <el-input
-                v-model="queryParams.campusId"
-                placeholder="请输入安排校区"
-                clearable
-                @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="分配学校" prop="assignSchoolId">
-        <el-input
-                v-model="queryParams.assignSchoolId"
-                placeholder="请输入分配学校"
-                clearable
-                @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="校区id" prop="schoolId">
-        <el-input
-                v-model="queryParams.schoolId"
-                placeholder="请输入校区id"
-                clearable
-                @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="校区班级ID" prop="classesId">
-        <el-input
-                v-model="queryParams.classesId"
-                placeholder="请输入校区班级ID"
-                clearable
-                @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="班级/入学年份" prop="year">
-        <el-input
-                v-model="queryParams.year"
-                placeholder="请输入班级/入学年份"
-                clearable
-                @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="高考年份" prop="endYear">
-        <el-input
-                v-model="queryParams.endYear"
-                placeholder="请输入高考年份"
-                clearable
-                @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="开卡ID" prop="openId">
-        <el-input
-                v-model="queryParams.openId"
-                placeholder="请输入开卡ID"
-                clearable
-                @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="分配时间" prop="distributeTime">
-        <el-date-picker clearable
-                        v-model="queryParams.distributeTime"
-                        type="date"
-                        value-format="YYYY-MM-DD"
-                        placeholder="请选择分配时间">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="过期时间" prop="outDate">
-        <el-date-picker clearable
-                        v-model="queryParams.outDate"
-                        type="date"
-                        value-format="YYYY-MM-DD"
-                        placeholder="请选择过期时间">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="开卡时间" prop="openTime">
-        <el-date-picker clearable
-                        v-model="queryParams.openTime"
-                        type="date"
-                        value-format="YYYY-MM-DD"
-                        placeholder="请选择开卡时间">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="缴费时间" prop="payTime">
-        <el-date-picker clearable
-                        v-model="queryParams.payTime"
-                        type="date"
-                        value-format="YYYY-MM-DD"
-                        placeholder="请选择缴费时间">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="激活时间" prop="activeTime">
-        <el-date-picker clearable
-                        v-model="queryParams.activeTime"
-                        type="date"
-                        value-format="YYYY-MM-DD"
-                        placeholder="请选择激活时间">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="结算时间" prop="settlementTime">
-        <el-date-picker clearable
-                        v-model="queryParams.settlementTime"
-                        type="date"
-                        value-format="YYYY-MM-DD"
-                        placeholder="请选择结算时间">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="退费时间" prop="refundTime">
-        <el-date-picker clearable
-                        v-model="queryParams.refundTime"
-                        type="date"
-                        value-format="YYYY-MM-DD"
-                        placeholder="请选择退费时间">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="关卡时间" prop="closeTime">
-        <el-date-picker clearable
-                        v-model="queryParams.closeTime"
-                        type="date"
-                        value-format="YYYY-MM-DD"
-                        placeholder="请选择关卡时间">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
+    <!-- 搜索表单组件 -->
+    <SearchForm
+      v-show="showSearch"
+      :config="searchConfig"
+      :model-value="queryParams"
+      @update:model-value="handleSearchFormUpdate"
+      :on-search="handleQuery"
+      :on-reset="resetQuery"
+      :show-expand="true"
+      :expand-count="6"
+      label-width="68px"
+    />
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
-                type="primary"
-                plain
-                icon="Plus"
-                @click="handleAdd"
-                v-hasPermi="['dz:cards:add']"
-        >新增</el-button>
+          type="primary"
+          plain
+          icon="Plus"
+          @click="handleAdd"
+          v-hasPermi="['dz:cards:add']"
+          >制卡</el-button
+        >
       </el-col>
       <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          @click="handleAssignCard"
+          v-hasPermi="['dz:cards:add']"
+          style="border-color: #67c23a; color: #67c23a; font-weight: 500"
+        >
+          <svg-icon icon-class="peoples" class="mr-1" style="font-size: 16px" />
+          分配卡
+        </el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
         <el-button
                 type="success"
                 plain
@@ -237,511 +44,957 @@
                 :disabled="single"
                 @click="handleUpdate"
                 v-hasPermi="['dz:cards:edit']"
-        >修改</el-button>
+          >修改</el-button
+        >
+      </el-col> -->
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          :disabled="multiple"
+          @click="handlePayment"
+          v-hasPermi="['dz:cards:add']"
+          style="border-color: #e6a23c; color: #e6a23c; font-weight: 500"
+        >
+          <svg-icon icon-class="money" class="mr-1" style="font-size: 16px" />
+          缴费
+        </el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
-                type="danger"
-                plain
-                icon="Delete"
-                :disabled="multiple"
-                @click="handleDelete"
-                v-hasPermi="['dz:cards:remove']"
-        >删除</el-button>
+          type="danger"
+          plain
+          :disabled="multiple"
+          @click="handleCloseCard"
+          v-hasPermi="['dz:cards:add']"
+          style="border-color: #f56c6c; color: #f56c6c; font-weight: 500"
+        >
+          <svg-icon icon-class="lock" class="mr-1" style="font-size: 16px" />
+          关卡
+        </el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
-                type="warning"
-                plain
-                icon="Download"
-                @click="handleExport"
-                v-hasPermi="['dz:cards:export']"
-        >导出</el-button>
+          type="primary"
+          plain
+          :disabled="multiple"
+          @click="handleReopenCard"
+          v-hasPermi="['dz:cards:add']"
+          style="border-color: #13c2c2; color: #13c2c2; font-weight: 500"
+        >
+          <svg-icon icon-class="enter" class="mr-1" style="font-size: 16px" />
+          重开
+        </el-button>
       </el-col>
-      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          :disabled="multiple"
+          @click="handleRefund"
+          v-hasPermi="['dz:cards:add']"
+          style="border-color: #ff4d4f; color: #ff4d4f; font-weight: 500"
+        >
+          <svg-icon icon-class="money" class="mr-1" style="font-size: 16px" />
+          退费
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
 
-    <el-table v-loading="loading" :data="cardsList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="ID" align="center" prop="cardId" />
-      <el-table-column label="卡号" align="center" prop="cardNo" />
-      <el-table-column label="初始密码" align="center" prop="password" />
-      <el-table-column label="卡类型" align="center" prop="type">
-        <template #default="scope">
-          <dict-tag :options="card_type" :value="scope.row.type"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="卡状态" align="center" prop="status">
-        <template #default="scope">
-          <dict-tag :options="card_status" :value="scope.row.status"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="分配状态" align="center" prop="distributeStatus">
-        <template #default="scope">
-          <dict-tag :options="card_distribute_status" :value="scope.row.distributeStatus"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="过期状态" align="center" prop="timeStatus">
-        <template #default="scope">
-          <dict-tag :options="card_time_status" :value="scope.row.timeStatus"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="缴费状态" align="center" prop="payStatus">
-        <template #default="scope">
-          <dict-tag :options="card_pay_status" :value="scope.row.payStatus"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="结算状态" align="center" prop="isSettlement">
-        <template #default="scope">
-          <dict-tag :options="bool_values" :value="scope.row.isSettlement"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="机构ID" align="center" prop="deptId" />
-      <el-table-column label="一级代理商ID" align="center" prop="agentId" />
-      <el-table-column label="末级代理商ID" align="center" prop="leftAgentId" />
-      <el-table-column label="安排校区" align="center" prop="campusId" />
-      <el-table-column label="分配学校" align="center" prop="assignSchoolId" />
-      <el-table-column label="校区id" align="center" prop="schoolId" />
-      <el-table-column label="校区班级ID" align="center" prop="classesId" />
-      <el-table-column label="班级/入学年份" align="center" prop="year" />
-      <el-table-column label="高考年份" align="center" prop="endYear" />
-      <el-table-column label="开卡ID" align="center" prop="openId" />
-      <el-table-column label="备注" align="center" prop="remark" />
-      <el-table-column label="分配时间" align="center" prop="distributeTime" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.distributeTime, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="过期时间" align="center" prop="outDate" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.outDate, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="开卡时间" align="center" prop="openTime" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.openTime, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="缴费时间" align="center" prop="payTime" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.payTime, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="激活时间" align="center" prop="activeTime" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.activeTime, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="结算时间" align="center" prop="settlementTime" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.settlementTime, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="退费时间" align="center" prop="refundTime" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.refundTime, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="关卡时间" align="center" prop="closeTime" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.closeTime, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template #default="scope">
-          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dz:cards:edit']">修改</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dz:cards:remove']">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <pagination
-            v-show="total>0"
-            :total="total"
-            v-model:page="queryParams.pageNum"
-            v-model:limit="queryParams.pageSize"
-            @pagination="getList"
-    />
+          @click="handleAssociateCampus"
+          v-hasPermi="['dz:cards:add']"
+          style="border-color: #1890ff; color: #1890ff; font-weight: 500"
+        >
+          <svg-icon icon-class="link" class="mr-1" style="font-size: 16px" />
+          关联校区
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          @click="handleApplyCard"
+          v-hasPermi="['dz:cards:add']"
+          style="border-color: #52c41a; color: #52c41a; font-weight: 500"
+        >
+          <svg-icon icon-class="edit" class="mr-1" style="font-size: 16px" />
+          申请开卡
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          :disabled="multiple"
+          icon="Delete"
+          @click="handleDelete"
+          v-hasPermi="['dz:cards:remove']"
+          style="border-color: #ff4d4f; color: #ff4d4f; font-weight: 500"
+        >
+          删除
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['dz:cards:export']"
+          style="border-color: #722ed1; color: #722ed1; font-weight: 500"
+          >导出</el-button
+        >
+      </el-col>
+      <right-toolbar
+        v-model:showSearch="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
 
-    <!-- 添加或修改学习卡对话框 -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="cardsRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="卡号" prop="cardNo">
-          <el-input v-model="form.cardNo" placeholder="请输入卡号" />
-        </el-form-item>
-        <el-form-item label="初始密码" prop="password">
-          <el-input v-model="form.password" placeholder="请输入初始密码" />
-        </el-form-item>
-        <el-form-item label="卡类型" prop="type">
-          <el-select v-model="form.type" placeholder="请选择卡类型">
-            <el-option
-                    v-for="dict in card_type"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="parseInt(dict.value)"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="卡状态" prop="status">
-          <el-select v-model="form.status" placeholder="请选择卡状态">
-            <el-option
-                    v-for="dict in card_status"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="parseInt(dict.value)"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="分配状态" prop="distributeStatus">
-          <el-select v-model="form.distributeStatus" placeholder="请选择分配状态">
-            <el-option
-                    v-for="dict in card_distribute_status"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="parseInt(dict.value)"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="过期状态" prop="timeStatus">
-          <el-select v-model="form.timeStatus" placeholder="请选择过期状态">
-            <el-option
-                    v-for="dict in card_time_status"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="parseInt(dict.value)"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="缴费状态" prop="payStatus">
-          <el-select v-model="form.payStatus" placeholder="请选择缴费状态">
-            <el-option
-                    v-for="dict in card_pay_status"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="parseInt(dict.value)"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="结算状态" prop="isSettlement">
-          <el-radio-group v-model="form.isSettlement">
-            <el-radio
-                    v-for="dict in bool_values"
-                    :key="dict.value"
-                    :label="parseInt(dict.value)"
-            >{{dict.label}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="一级代理商ID" prop="agentId">
-          <el-input v-model="form.agentId" placeholder="请输入一级代理商ID" />
-        </el-form-item>
-        <el-form-item label="末级代理商ID" prop="leftAgentId">
-          <el-input v-model="form.leftAgentId" placeholder="请输入末级代理商ID" />
-        </el-form-item>
-        <el-form-item label="安排校区" prop="campusId">
-          <el-input v-model="form.campusId" placeholder="请输入安排校区" />
-        </el-form-item>
-        <el-form-item label="分配学校" prop="assignSchoolId">
-          <el-input v-model="form.assignSchoolId" placeholder="请输入分配学校" />
-        </el-form-item>
-        <el-form-item label="校区id" prop="schoolId">
-          <el-input v-model="form.schoolId" placeholder="请输入校区id" />
-        </el-form-item>
-        <el-form-item label="校区班级ID" prop="classesId">
-          <el-input v-model="form.classesId" placeholder="请输入校区班级ID" />
-        </el-form-item>
-        <el-form-item label="班级/入学年份" prop="year">
-          <el-input v-model="form.year" placeholder="请输入班级/入学年份" />
-        </el-form-item>
-        <el-form-item label="高考年份" prop="endYear">
-          <el-input v-model="form.endYear" placeholder="请输入高考年份" />
-        </el-form-item>
-        <el-form-item label="开卡ID" prop="openId">
-          <el-input v-model="form.openId" placeholder="请输入开卡ID" />
-        </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" placeholder="请输入备注" />
-        </el-form-item>
-        <el-form-item label="分配时间" prop="distributeTime">
-          <el-date-picker clearable
-                          v-model="form.distributeTime"
-                          type="date"
-                          value-format="YYYY-MM-DD"
-                          placeholder="请选择分配时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="过期时间" prop="outDate">
-          <el-date-picker clearable
-                          v-model="form.outDate"
-                          type="date"
-                          value-format="YYYY-MM-DD"
-                          placeholder="请选择过期时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="开卡时间" prop="openTime">
-          <el-date-picker clearable
-                          v-model="form.openTime"
-                          type="date"
-                          value-format="YYYY-MM-DD"
-                          placeholder="请选择开卡时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="缴费时间" prop="payTime">
-          <el-date-picker clearable
-                          v-model="form.payTime"
-                          type="date"
-                          value-format="YYYY-MM-DD"
-                          placeholder="请选择缴费时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="激活时间" prop="activeTime">
-          <el-date-picker clearable
-                          v-model="form.activeTime"
-                          type="date"
-                          value-format="YYYY-MM-DD"
-                          placeholder="请选择激活时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="结算时间" prop="settlementTime">
-          <el-date-picker clearable
-                          v-model="form.settlementTime"
-                          type="date"
-                          value-format="YYYY-MM-DD"
-                          placeholder="请选择结算时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="退费时间" prop="refundTime">
-          <el-date-picker clearable
-                          v-model="form.refundTime"
-                          type="date"
-                          value-format="YYYY-MM-DD"
-                          placeholder="请选择退费时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="关卡时间" prop="closeTime">
-          <el-date-picker clearable
-                          v-model="form.closeTime"
-                          type="date"
-                          value-format="YYYY-MM-DD"
-                          placeholder="请选择关卡时间">
-          </el-date-picker>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+    <!-- Table组件 -->
+    <Table
+      :data="cardsList"
+      :columns="tableColumns"
+      :actions="tableActions"
+      :loading="loading"
+      :total="total"
+      :queryParams="queryParams"
+      v-bind="tableProps"
+      @action="handleTableAction"
+      @selection-change="handleSelectionChange"
+      @getList="getList"
+    >
+      <!-- 姓名-手机插槽 -->
+      <template #studentInfo="{ row }">
+        <div class="student-info">
+          <div class="student-name">{{ row.nickName || "-" }}</div>
+          <div class="student-phone">{{ row.mobile || "-" }}</div>
         </div>
       </template>
-    </el-dialog>
+    </Table>
+
+    <!-- 弹窗组件 -->
+    <CardGenerationDialog
+      v-model="cardGenerationOpen"
+      :institution-list="institutionList"
+      :school-list="schoolList"
+      :card-type-options="card_type"
+      @success="handleDialogSuccess"
+    />
+
+    <AssignCardDialog
+      v-model="assignCardOpen"
+      :school-list="schoolList"
+      :card-type-options="card_type"
+      @success="handleDialogSuccess"
+    />
+
+    <EditStudentDialog
+      v-model="open"
+      :card-id="currentCardId"
+      :class-list="classList"
+      @success="handleDialogSuccess"
+    />
+
+    <PaymentDialog
+      v-model="paymentOpen"
+      :card-no="currentCardNo"
+      :card-ids="selectedCardIds"
+      :selected-cards="selectedRows"
+      @success="handlePaymentSuccess"
+    />
+
+    <CloseCardDialog
+      v-model="closeCardOpen"
+      :card-no="currentCloseCardNo"
+      :card-ids="selectedCardIds"
+      @success="handleCloseCardSuccess"
+    />
+
+    <ReopenCardDialog
+      v-model="reopenCardOpen"
+      :card-no="currentReopenCardNo"
+      :card-ids="selectedCardIds"
+      @success="handleReopenCardSuccess"
+    />
+
+    <RefundDialog
+      v-model="refundOpen"
+      :card-no="currentRefundCardNo"
+      @confirm="handleRefundConfirm"
+    />
+
+    <AssociateCampusDialog
+      v-model="associateCampusOpen"
+      :selected-cards="selectedRows"
+      @success="handleAssociateCampusSuccess"
+    />
+
+    <ApplyCardDialog
+      v-model="applyCardOpen"
+      :selected-cards="selectedRows"
+      @success="handleApplyCardSuccess"
+    />
   </div>
 </template>
 
+<style scoped>
+.student-info {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.student-name {
+  font-weight: 500;
+  margin-bottom: 2px;
+}
+
+.student-phone {
+  font-size: 12px;
+  color: #909399;
+}
+</style>
+
 <script setup name="Cards">
-  import { listCards, getCards, delCards, addCards, updateCards } from "@/api/dz/cards"
-
-  const { proxy } = getCurrentInstance()
-  const { card_status, card_distribute_status, card_time_status, bool_values, card_pay_status, card_type } = proxy.useDict('card_status', 'card_distribute_status', 'card_time_status', 'bool_values', 'card_pay_status', 'card_type')
-
-  const cardsList = ref([])
-  const open = ref(false)
-  const loading = ref(true)
-  const showSearch = ref(true)
-  const ids = ref([])
-  const single = ref(true)
-  const multiple = ref(true)
-  const total = ref(0)
-  const title = ref("")
-
-  const data = reactive({
-    form: {},
-    queryParams: {
-      pageNum: 1,
-      pageSize: 10,
-      cardNo: null,
-      password: null,
-      type: null,
-      status: null,
-      distributeStatus: null,
-      timeStatus: null,
-      payStatus: null,
-      isSettlement: null,
-      deptId: null,
-      agentId: null,
-      leftAgentId: null,
-      campusId: null,
-      assignSchoolId: null,
-      schoolId: null,
-      classesId: null,
-      year: null,
-      endYear: null,
-      openId: null,
-      distributeTime: null,
-      outDate: null,
-      openTime: null,
-      payTime: null,
-      activeTime: null,
-      settlementTime: null,
-      refundTime: null,
-      closeTime: null,
-    },
-    rules: {
-      type: [
-        { required: true, message: "卡类型不能为空", trigger: "change" }
-      ],
-      status: [
-        { required: true, message: "卡状态不能为空", trigger: "change" }
-      ],
-      distributeStatus: [
-        { required: true, message: "分配状态不能为空", trigger: "change" }
-      ],
-      timeStatus: [
-        { required: true, message: "过期状态不能为空", trigger: "change" }
-      ],
-      payStatus: [
-        { required: true, message: "缴费状态不能为空", trigger: "change" }
-      ],
-      isSettlement: [
-        { required: true, message: "结算状态不能为空", trigger: "change" }
-      ],
-      createTime: [
-        { required: true, message: "生成时间不能为空", trigger: "blur" }
-      ],
-      updateTime: [
-        { required: true, message: "更新时间不能为空", trigger: "blur" }
-      ]
+import {
+  listCards,
+  getCards,
+  delCards,
+  addCards,
+  updateCards,
+} from "@/api/dz/cards";
+import SearchForm from "@/components/SearchForm/index.vue";
+import Table from "@/components/Table/index.vue";
+import CardGenerationDialog from "./components/CardGenerationDialog.vue";
+import AssignCardDialog from "./components/AssignCardDialog.vue";
+import EditStudentDialog from "./components/EditStudentDialog.vue";
+import PaymentDialog from "./components/PaymentDialog.vue";
+import CloseCardDialog from "./components/CloseCardDialog.vue";
+import ReopenCardDialog from "./components/ReopenCardDialog.vue";
+import RefundDialog from "./components/RefundDialog.vue";
+import AssociateCampusDialog from "./components/AssociateCampusDialog.vue";
+import ApplyCardDialog from "./components/ApplyCardDialog.vue";
+import formInfo from "./config/form.js";
+import tableConfig from "./config/table.js";
+import { listUniversity } from "@/api/dz/school";
+import { assignCard, issueCard } from "@/api/dz/cards";
+import { listDept } from "@/api/system/dept";
+import { listAgent } from "@/api/dz/agent";
+
+const { proxy } = getCurrentInstance();
+const {
+  card_status,
+  card_distribute_status,
+  card_time_status,
+  bool_values,
+  card_pay_status,
+  card_type,
+} = proxy.useDict(
+  "card_status",
+  "card_distribute_status",
+  "card_time_status",
+  "bool_values",
+  "card_pay_status",
+  "card_type"
+);
+
+const cardsList = ref([]);
+const schoolList = ref([]);
+const classList = ref([]); // 班级列表
+const open = ref(false);
+const cardGenerationOpen = ref(false); // 制卡对话框
+const assignCardOpen = ref(false); // 分配卡对话框
+const paymentOpen = ref(false); // 缴费对话框
+const closeCardOpen = ref(false); // 关卡对话框
+const reopenCardOpen = ref(false); // 重开对话框
+const refundOpen = ref(false); // 退费对话框
+const associateCampusOpen = ref(false); // 关联校区对话框
+const applyCardOpen = ref(false); // 申请开卡对话框
+const currentCardNo = ref([]); // 当前缴费的卡号(支持数组)
+const currentCloseCardNo = ref([]); // 当前关卡的卡号(支持数组)
+const currentReopenCardNo = ref([]); // 当前重开的卡号(支持数组)
+const currentRefundCardNo = ref(""); // 当前退费的卡号
+const agentList = ref([]); // 代理商列表
+const institutionList = ref([]); // 机构列表
+const selectedRows = ref([]); // 选中的行
+const selectedCardIds = computed(() =>
+  selectedRows.value.map((row) => row.cardId)
+); // 选中的卡ID列表
+const currentCardId = ref(null); // 当前编辑的卡片ID
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+// 搜索配置
+const searchConfig = computed(() => {
+  const config = [...formInfo.info];
+
+  // 动态设置选项数据
+  config.forEach((item) => {
+    switch (item.name) {
+      case "type":
+        item.option = card_type.value || [];
+        break;
+      case "status":
+        item.option = card_status.value || [];
+        break;
+      case "distributeStatus":
+        item.option = card_distribute_status.value || [];
+        break;
+      // 移除registerSchoolId,实体类中不存在
+      case "timeStatus":
+        item.option = card_time_status.value || [];
+        break;
+      case "payStatus":
+        item.option = card_pay_status.value || [];
+        break;
+      case "isSettlement":
+        item.option = bool_values.value || [];
+        break;
+      case "assignSchoolId":
+        item.option = schoolList.value || [];
+        break;
+    }
+  });
+
+  return config;
+});
+
+// 表格配置
+const tableColumns = computed(() => {
+  const columns = [...tableConfig.columns];
+
+  // 动态设置字典选项
+  columns.forEach((column) => {
+    switch (column.prop) {
+      case "type":
+        column.options = card_type.value || [];
+        break;
+      case "status":
+        column.options = card_status.value || [];
+        break;
+      case "distributeStatus":
+        column.options = card_distribute_status.value || [];
+        break;
+      case "timeStatus":
+        column.options = card_time_status.value || [];
+        break;
+      case "payStatus":
+        column.options = card_pay_status.value || [];
+        break;
+      case "isSettlement":
+        column.options = bool_values.value || [];
+        break;
+      // 移除studentCategory,实体类中不存在
+      case "registerSchoolId":
+      case "assignSchoolId":
+        column.options = schoolList.value || [];
+        break;
+      case "studentCategory":
+      case "classId":
+      case "schoolClassId":
+      case "campusId":
+        column.options = []; // 需要从相应API获取
+        break;
+    }
+  });
+
+  return columns;
+});
+
+const tableActions = computed(() => tableConfig.actions);
+const tableProps = computed(() => tableConfig.tableProps);
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    // 搜索表单字段
+    areaIds: [],
+    assignSchoolId: null,
+    registerSchoolId: null,
+    campusId: null,
+    agentId: null,
+    cardNo: null,
+    password: null,
+    cardNoRange: null,
+    begin: null,
+    end: null,
+    type: null,
+    studentCategory: null, // 分配考生类型
+    studentName: null, // 学生姓名
+    phone: null, // 手机号
+    registerSchoolId: null, // 注册学校
+    schoolClassId: null, // 校区班级
+    distributeStatus: null,
+    status: null,
+    timeStatus: null,
+    isSettlement: null,
+
+    // 其他字段(用于数据传输)
+    cardNo: null,
+    password: null,
+    payStatus: null,
+    isSettlement: null,
+    deptId: null,
+    leftAgentId: null,
+    schoolId: null,
+    classId: null,
+    year: null,
+    endYear: null,
+    openId: null,
+    distributeTime: null,
+    outDate: null,
+    openTime: null,
+    payTime: null,
+    activeTime: null,
+    settlementTime: null,
+    refundTime: null,
+    closeTime: null,
+    createTime: null,
+    updateTime: null,
+  },
+  rules: {
+    schoolId: [{ required: true, message: "学校不能为空", trigger: "change" }],
+    classId: [{ required: true, message: "班级不能为空", trigger: "change" }],
+    nickName: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
+    phone: [
+      { required: true, message: "手机号不能为空", trigger: "blur" },
+      {
+        pattern: /^1[3-9]\d{9}$/,
+        message: "请输入正确的手机号",
+        trigger: "blur",
+      },
+    ],
+    chineseMathEnglish: [
+      { required: true, message: "语数英成绩不能为空", trigger: "blur" },
+    ],
+    vocationalSkills: [
+      { required: true, message: "职业技能成绩不能为空", trigger: "blur" },
+    ],
+  },
+});
+
+const { queryParams, form } = toRefs(data);
+
+// 监听queryParams的原始变化
+watch(
+  () => data.queryParams,
+  (newParams) => {
+    if (newParams.areaIds && newParams.areaIds.length > 0) {
+      getSchoolList();
     }
-  })
+  },
+  { immediate: true, deep: true }
+);
+
+/** 查询学习卡列表 */
+function getList() {
+  loading.value = true;
+  listCards(queryParams.value).then((response) => {
+    cardsList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+/** 获取学校列表 */
+function getSchoolList() {
+  // 如果没有选择省市区,则不获取学校列表
+  if (!queryParams.value.areaIds || queryParams.value.areaIds.length === 0) {
+    schoolList.value = [];
+    return;
+  }
+
+  // 构造location参数:如果有省市区选择,取最后一个值(区)作为location
+  const location =
+    queryParams.value.areaIds[queryParams.value.areaIds.length - 1];
+
+  // 传递pageNum和pageSize参数
+  const requestParams = {
+    location,
+    pageNum: queryParams.value.pageNum || 1,
+    pageSize: queryParams.value.pageSize || 10,
+  };
+
+  listUniversity(requestParams)
+    .then((response) => {
+      // 根据API返回数据结构处理
+      let schoolData = [];
+      if (response.data) {
+        schoolData = Array.isArray(response.data)
+          ? response.data
+          : response.data.rows || response.data.list || [];
+      } else if (response.rows) {
+        schoolData = response.rows;
+      } else if (response.list) {
+        schoolData = response.list;
+      } else if (Array.isArray(response)) {
+        schoolData = response;
+      }
 
-  const { queryParams, form, rules } = toRefs(data)
+      // 确保数据格式符合配置要求
+      schoolData = schoolData.map((item) => {
+        // 如果API返回的是 {id, name, ...} 格式,直接使用
+        if (item.id && item.name) {
+          return item;
+        }
+        // 如果是其他格式,需要转换
+        return {
+          id: item.id || item.value || item.schoolId,
+          name: item.name || item.label || item.schoolName || item.title,
+        };
+      });
 
-  /** 查询学习卡列表 */
-  function getList() {
-    loading.value = true
-    listCards(queryParams.value).then(response => {
-      cardsList.value = response.rows
-      total.value = response.total
-      loading.value = false
+      schoolList.value = schoolData;
     })
+    .catch((error) => {
+      console.error("获取学校列表失败:", error);
+      schoolList.value = [];
+    });
+}
+
+// 取消按钮
+// 处理弹窗成功事件
+function handleDialogSuccess(message) {
+  proxy.$modal.msgSuccess(message);
+  getList(); // 刷新列表
+}
+
+// 获取机构列表
+async function getInstitutionList() {
+  try {
+    const response = await listDept({});
+    institutionList.value = response.data || response.rows || response || [];
+  } catch (error) {
+    console.error("获取机构列表失败:", error);
+    institutionList.value = [];
   }
+}
 
-  // 取消按钮
-  function cancel() {
-    open.value = false
-    reset()
+// 获取班级列表
+async function getClassList() {
+  try {
+    // 这里应该调用获取班级列表的API
+    // 暂时使用模拟数据
+    classList.value = [
+      { id: 1, name: "2501" },
+      { id: 2, name: "2502" },
+      { id: 3, name: "2503" },
+    ];
+  } catch (error) {
+    console.error("获取班级列表失败:", error);
+    classList.value = [];
   }
+}
 
-  // 表单重置
-  function reset() {
-    form.value = {
-      cardId: null,
-      cardNo: null,
-      password: null,
-      type: null,
-      status: null,
-      distributeStatus: null,
-      timeStatus: null,
-      payStatus: null,
-      isSettlement: null,
-      deptId: null,
-      agentId: null,
-      leftAgentId: null,
-      campusId: null,
-      assignSchoolId: null,
-      schoolId: null,
-      classesId: null,
-      year: null,
-      endYear: null,
-      openId: null,
-      remark: null,
-      distributeTime: null,
-      outDate: null,
-      openTime: null,
-      payTime: null,
-      activeTime: null,
-      settlementTime: null,
-      refundTime: null,
-      closeTime: null,
-      createTime: null,
-      updateTime: null
-    }
-    proxy.resetForm("cardsRef")
+// 获取代理商列表
+async function getAgentList() {
+  try {
+    const response = await listAgent({});
+    const agentData = response.data || response.rows || response || [];
+
+    // 确保数据格式符合前端期望
+    agentList.value = agentData.map((item) => ({
+      id: item.agentId,
+      name: item.name,
+    }));
+  } catch (error) {
+    console.error("获取代理商列表失败:", error);
+    agentList.value = [];
   }
+}
+
+function cancel() {
+  open.value = false;
+  reset();
+}
 
-  /** 搜索按钮操作 */
-  function handleQuery() {
-    queryParams.value.pageNum = 1
-    getList()
+// 表单重置
+function reset() {
+  form.value = {
+    cardId: null,
+    cardNo: null,
+    password: null,
+    type: null,
+    status: null,
+    distributeStatus: null,
+    timeStatus: null,
+    payStatus: null,
+    isSettlement: null,
+    deptId: null,
+    agentId: null,
+    leftAgentId: null,
+    campusId: null,
+    assignSchoolId: null,
+    schoolId: null,
+    classesId: null,
+    year: null,
+    endYear: null,
+    openId: null,
+    remark: null,
+    distributeTime: null,
+    outDate: null,
+    openTime: null,
+    payTime: null,
+    activeTime: null,
+    settlementTime: null,
+    refundTime: null,
+    closeTime: null,
+    createTime: null,
+    updateTime: null,
+  };
+  proxy.resetForm("cardsRef");
+}
+
+/** 搜索按钮操作 */
+/** 表格操作处理 */
+function handleTableAction(action, row) {
+  switch (action.key) {
+    case "edit":
+      handleUpdate(row); // 修改时获取行数据
+      break;
+    case "delete":
+      handleDelete(row);
+      break;
+    default:
+      console.warn("Unknown action:", action.key);
   }
+}
+
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
 
-  /** 重置按钮操作 */
-  function resetQuery() {
-    proxy.resetForm("queryRef")
-    handleQuery()
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+/** 处理SearchForm组件的update:model-value事件 */
+function handleSearchFormUpdate(newData) {
+  Object.assign(data.queryParams, newData);
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  selectedRows.value = selection;
+  ids.value = selection.map((item) => item.cardId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 制卡按钮操作 */
+function handleAdd() {
+  cardGenerationOpen.value = true;
+  getInstitutionList(); // 获取机构列表
+}
+
+/** 缴费按钮操作 */
+function handlePayment() {
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgWarning("请选择要缴费的卡片");
+    return;
   }
 
-  // 多选框选中数据
-  function handleSelectionChange(selection) {
-    ids.value = selection.map(item => item.cardId)
-    single.value = selection.length != 1
-    multiple.value = !selection.length
+  // 获取所有选中卡片的卡号数组
+  const cardNos = selectedRows.value.map(
+    (card) => card.cardNo || card.id || "未知"
+  );
+  currentCardNo.value = cardNos;
+  paymentOpen.value = true;
+}
+
+// 处理缴费成功
+function handlePaymentSuccess(message) {
+  proxy.$modal.msgSuccess(message);
+  getList(); // 刷新列表
+}
+
+// 处理缴费确认(保留兼容性)
+function handlePaymentConfirm(cardNo) {
+  proxy.$modal.msgSuccess(`缴费成功!卡号:${cardNo}`);
+  getList(); // 刷新列表
+}
+
+/** 关卡按钮操作 */
+function handleCloseCard() {
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgWarning("请选择要关卡的卡片");
+    return;
   }
 
-  /** 新增按钮操作 */
-  function handleAdd() {
-    reset()
-    open.value = true
-    title.value = "添加学习卡"
+  // 获取所有选中卡片的卡号数组
+  const cardNos = selectedRows.value.map(
+    (card) => card.cardNo || card.id || "未知"
+  );
+  currentCloseCardNo.value = cardNos;
+  closeCardOpen.value = true;
+}
+
+// 处理关卡成功
+function handleCloseCardSuccess(message) {
+  proxy.$modal.msgSuccess(message);
+  getList(); // 刷新列表
+}
+
+// 处理关卡确认(保留兼容性)
+function handleCloseCardConfirm(cardNo) {
+  proxy.$modal.msgSuccess(`关卡成功!卡号:${cardNo}`);
+  getList(); // 刷新列表
+}
+
+/** 重开按钮操作 */
+function handleReopenCard() {
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgWarning("请选择要重开的卡片");
+    return;
   }
 
-  /** 修改按钮操作 */
-  function handleUpdate(row) {
-    reset()
-    const _cardId = row.cardId || ids.value
-    getCards(_cardId).then(response => {
-      form.value = response.data
-      open.value = true
-      title.value = "修改学习卡"
-    })
+  // 获取所有选中卡片的卡号数组
+  const cardNos = selectedRows.value.map(
+    (card) => card.cardNo || card.id || "未知"
+  );
+  currentReopenCardNo.value = cardNos;
+  reopenCardOpen.value = true;
+}
+
+// 处理重开成功
+function handleReopenCardSuccess(message) {
+  proxy.$modal.msgSuccess(message);
+  getList(); // 刷新列表
+}
+
+// 处理重开确认(保留兼容性)
+function handleReopenCardConfirm(cardNo) {
+  proxy.$modal.msgSuccess(`重开成功!卡号:${cardNo}`);
+  getList(); // 刷新列表
+}
+
+/** 退费按钮操作 */
+function handleRefund() {
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgWarning("请选择要退费的卡片");
+    return;
   }
 
-  /** 提交按钮 */
-  function submitForm() {
-    proxy.$refs["cardsRef"].validate(valid => {
-      if (valid) {
-        if (form.value.cardId != null) {
-          updateCards(form.value).then(response => {
-            proxy.$modal.msgSuccess("修改成功")
-            open.value = false
-            getList()
-          })
-        } else {
-          addCards(form.value).then(response => {
-            proxy.$modal.msgSuccess("新增成功")
-            open.value = false
-            getList()
-          })
-        }
-      }
-    })
+  // 获取第一个选中卡片的卡号
+  const firstCard = selectedRows.value[0];
+  currentRefundCardNo.value = firstCard.cardNo || firstCard.id || "未知";
+  refundOpen.value = true;
+}
+
+// 处理退费确认
+function handleRefundConfirm(cardNo) {
+  proxy.$modal.msgSuccess(`退费成功!卡号:${cardNo}`);
+  getList(); // 刷新列表
+}
+
+/** 关联校区按钮操作 */
+function handleAssociateCampus() {
+  if (selectedRows.value.length === 0) {
+    // proxy.$modal.msgWarning("请选择要关联校区的卡片");
+    // return;
   }
+  associateCampusOpen.value = true;
+}
 
-  /** 删除按钮操作 */
-  function handleDelete(row) {
-    const _cardIds = row.cardId || ids.value
-    proxy.$modal.confirm('是否确认删除学习卡编号为"' + _cardIds + '"的数据项?').then(function() {
-      return delCards(_cardIds)
-    }).then(() => {
-      getList()
-      proxy.$modal.msgSuccess("删除成功")
-    }).catch(() => {})
+// 处理关联校区成功
+function handleAssociateCampusSuccess(message) {
+  proxy.$modal.msgSuccess(message);
+  getList();
+}
+
+// 处理关联校区确认
+function handleAssociateCampusConfirm(data) {
+  proxy.$modal.msgSuccess(
+    `关联校区成功!卡号段:${data.beginCardNo}-${data.endCardNo}`
+  );
+  getList(); // 刷新列表
+}
+
+// 获取代理商列表
+async function getAgentListData() {
+  try {
+    const response = await getAgentList({ pageNum: 1, pageSize: 1000 });
+    if (response.code === 200) {
+      agentList.value = response.data || [];
+    }
+  } catch (error) {
+    console.error("获取代理商列表失败:", error);
+    agentList.value = [];
   }
+}
 
-  /** 导出按钮操作 */
-  function handleExport() {
-    proxy.download('dz/cards/export', {
-      ...queryParams.value
-    }, `cards_${new Date().getTime()}.xlsx`)
+/** 申请开卡按钮操作 */
+function handleApplyCard() {
+  if (selectedRows.value.length === 0) {
+    // proxy.$modal.msgWarning("请选择要申请开卡的卡片");
+    // return;
   }
+  applyCardOpen.value = true;
+}
+
+// 处理申请开卡成功
+function handleApplyCardSuccess(message) {
+  proxy.$modal.msgSuccess(message);
+  getList();
+}
 
-  getList()
+// 处理申请开卡确认
+function handleApplyCardConfirm(data) {
+  proxy.$modal.msgSuccess(
+    `申请开卡成功!卡号段:${data.beginCardNo}-${data.endCardNo}`
+  );
+  getList(); // 刷新列表
+}
+
+/** 分配卡按钮操作 */
+function handleAssignCard() {
+  assignCardOpen.value = true;
+  getInstitutionList(); // 获取机构列表
+  getAgentList(); // 获取代理商列表
+}
+
+/** 修改按钮操作 */
+async function handleUpdate(row) {
+  reset();
+  const _cardId = row.cardId || ids.value;
+  currentCardId.value = _cardId;
+
+  try {
+    // 获取学习卡详细信息
+    const response = await getCards(_cardId);
+    if (response.code === 200) {
+      const cardData = response.data;
+
+      // 将后端数据对应到表单字段
+      form.value = {
+        cardId: cardData.cardId,
+        cardNo: cardData.cardNo,
+        password: cardData.password,
+        type: cardData.type,
+        status: cardData.status,
+        distributeStatus: cardData.distributeStatus,
+        timeStatus: cardData.timeStatus,
+        payStatus: cardData.payStatus,
+        isSettlement: cardData.isSettlement,
+        deptId: cardData.deptId,
+        agentId: cardData.agentId,
+        leftAgentId: cardData.leftAgentId,
+        campusId: cardData.campusId,
+        assignSchoolId: cardData.assignSchoolId,
+        schoolId: cardData.schoolId,
+        classId: cardData.classId,
+        year: cardData.year,
+        endYear: cardData.endYear,
+        openId: cardData.openId,
+        nickName: cardData.nickName,
+        mobile: cardData.mobile,
+        chineseMathEnglish: cardData.chineseMathEnglish,
+        vocationalSkills: cardData.vocationalSkills,
+        studentCategory: cardData.studentCategory,
+        assignExamType: cardData.assignExamType,
+        areaIds: cardData.areaIds,
+        remark: cardData.remark,
+      };
+
+      // 获取班级列表
+      await getClassList();
+
+      // 打开编辑弹窗
+      open.value = true;
+    } else {
+      proxy.$modal.msgError("获取学习卡信息失败");
+    }
+  } catch (error) {
+    console.error("获取学习卡详细信息失败:", error);
+    proxy.$modal.msgError("获取学习卡信息失败");
+  }
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["cardsRef"].validate((valid) => {
+    if (valid) {
+      if (form.value.cardId != null) {
+        updateCards(form.value).then((response) => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addCards(form.value).then((response) => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _cardIds = row.cardId || ids.value;
+  const cardIdsArray = Array.isArray(_cardIds) ? _cardIds : [_cardIds];
+
+  if (cardIdsArray.length === 0) {
+    proxy.$modal.msgWarning("请选择要删除的数据");
+    return;
+  }
+
+  const message =
+    cardIdsArray.length === 1
+      ? `是否确认删除学习卡编号为"${cardIdsArray[0]}"的数据项?`
+      : `是否确认删除选中的${cardIdsArray.length}条学习卡数据?`;
+
+  proxy.$modal
+    .confirm(message)
+    .then(function () {
+      return delCards(cardIdsArray);
+    })
+    .then(() => {
+      getList();
+      proxy.$modal.msgSuccess("删除成功");
+    })
+    .catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download(
+    "dz/cards/export",
+    {
+      ...queryParams.value,
+    },
+    `cards_${new Date().getTime()}.xlsx`
+  );
+}
+
+getList();
+
+// 监听地址选择变化,自动获取学校列表
+watch(
+  () => queryParams.value.areaIds,
+  (newAreaIds) => {
+    if (newAreaIds && newAreaIds.length > 0) {
+      getSchoolList();
+    } else {
+      schoolList.value = [];
+    }
+  },
+  { immediate: true, deep: true }
+);
 </script>

+ 0 - 1
back-ui/src/views/dz/classes/index.vue

@@ -195,7 +195,6 @@
   const { proxy } = getCurrentInstance()
   const { bool_values } = proxy.useDict('bool_values')
 
-
   const classesList = ref([])
   const schoolOptions = ref([])
   const open = ref(false)

+ 39 - 0
back-ui/src/views/dz/open/config/form.js

@@ -0,0 +1,39 @@
+const info = [
+  {
+    label: "申请人",
+    name: "applicant",
+    value: "",
+    type: "text",
+    search: true,
+    placeholder: "请输入申请人",
+  },
+  {
+    label: "卡号",
+    name: "cardNo",
+    value: "",
+    type: "text",
+    search: true,
+    placeholder: "请输入卡号",
+  },
+  {
+    label: "申请状态",
+    name: "status",
+    value: "",
+    type: "select",
+    search: true,
+    placeholder: "请选择申请状态",
+    option: [
+      { label: "待审核", value: "0" },
+      { label: "审核通过", value: "1" },
+      { label: "已拒绝", value: "2" },
+    ],
+    optionLabel: "label",
+    optionValue: "value",
+  },
+];
+
+const formInfo = {
+  info,
+};
+
+export default formInfo;

+ 89 - 0
back-ui/src/views/dz/open/config/table.js

@@ -0,0 +1,89 @@
+const tableConfig = {
+  // 表格列配置
+  columns: [
+    {
+      label: "编号",
+      prop: "id",
+      align: "center",
+      width: 80,
+    },
+    {
+      label: "卡号段",
+      prop: "cardRange",
+      align: "center",
+      minWidth: 180,
+      type: "slot",
+      slotName: "cardRange",
+    },
+    {
+      label: "申请数量",
+      prop: "quantity",
+      align: "center",
+      width: 100,
+      type: "slot",
+      slotName: "quantity",
+    },
+    {
+      label: "申请人",
+      prop: "applicant",
+      align: "center",
+      minWidth: 120,
+    },
+    {
+      label: "学校",
+      prop: "schoolName",
+      align: "center",
+      minWidth: 150,
+    },
+    {
+      label: "申请时间",
+      prop: "createTime",
+      align: "center",
+      width: 180,
+      type: "time",
+      format: "{y}-{m}-{d} {h}:{i}:{s}",
+    },
+    {
+      label: "申请状态",
+      prop: "status",
+      align: "center",
+      width: 100,
+      type: "slot",
+      slotName: "status",
+    },
+    {
+      label: "原因",
+      prop: "reason",
+      align: "center",
+      minWidth: 120,
+      type: "slot",
+      slotName: "reason",
+    },
+  ],
+
+  // 操作按钮配置
+  actions: [
+    {
+      key: "review",
+      label: "审核",
+      type: "primary",
+      link: true,
+      permission: ["dz:open:review"],
+      condition: (row) => row.status === 0, // 只有待审核状态才显示审核按钮
+    },
+  ],
+
+  // 表格属性配置
+  tableProps: {
+    stripe: true,
+    border: false,
+    showSelection: true,
+    showIndex: false,
+    showPagination: true,
+    actionWidth: 150,
+    selectionMode: "multiple",
+    rowKey: "id",
+  },
+};
+
+export default tableConfig;

+ 329 - 276
back-ui/src/views/dz/open/index.vue

@@ -1,90 +1,15 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="代理" prop="agentId">
-        <el-input
-          v-model="queryParams.agentId"
-          placeholder="请输入代理"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="起始卡号" prop="startNo">
-        <el-input
-          v-model="queryParams.startNo"
-          placeholder="请输入起始卡号"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="截至卡号" prop="endNo">
-        <el-input
-          v-model="queryParams.endNo"
-          placeholder="请输入截至卡号"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="结束日期" prop="endDate">
-        <el-date-picker clearable
-          v-model="queryParams.endDate"
-          type="date"
-          value-format="YYYY-MM-DD"
-          placeholder="请选择结束日期">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="校区" prop="schoolId">
-        <el-input
-          v-model="queryParams.schoolId"
-          placeholder="请输入校区"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="发件人" prop="sender">
-        <el-input
-          v-model="queryParams.sender"
-          placeholder="请输入发件人"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="重新开卡:0否,1是" prop="isReopen">
-        <el-select v-model="queryParams.isReopen" placeholder="请选择重新开卡:0否,1是" clearable>
-          <el-option
-            v-for="dict in sys_normal_disable"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="卡类型,对应card_type" prop="cardType">
-        <el-select v-model="queryParams.cardType" placeholder="请选择卡类型,对应card_type" clearable>
-          <el-option
-            v-for="dict in card_type"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="状态(0:无效,1:审核结束,2:审核中)" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择状态(0:无效,1:审核结束,2:审核中)" clearable>
-          <el-option
-            v-for="dict in sys_yes_no"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
-        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
+    <!-- 搜索表单 -->
+    <SearchForm
+      :config="searchConfig"
+      v-model="queryParams"
+      @search="handleQuery"
+      @reset="resetQuery"
+      :loading="loading"
+    />
 
+    <!-- 操作按钮 -->
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -93,27 +18,8 @@
           icon="Plus"
           @click="handleAdd"
           v-hasPermi="['dz:open:add']"
-        >新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="Edit"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['dz:open:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="Delete"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['dz:open:remove']"
-        >删除</el-button>
+          >新增</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -122,60 +28,57 @@
           icon="Download"
           @click="handleExport"
           v-hasPermi="['dz:open:export']"
-        >导出</el-button>
+          >导出</el-button
+        >
       </el-col>
-      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+      <right-toolbar
+        v-model:showSearch="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="openList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="标识" align="center" prop="id" />
-      <el-table-column label="代理" align="center" prop="agentId" />
-      <el-table-column label="起始卡号" align="center" prop="startNo" />
-      <el-table-column label="截至卡号" align="center" prop="endNo" />
-      <el-table-column label="结束日期" align="center" prop="endDate" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.endDate, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column label="校区" align="center" prop="schoolId" />
-      <el-table-column label="发件人" align="center" prop="sender" />
-      <el-table-column label="重新开卡:0否,1是" align="center" prop="isReopen">
-        <template #default="scope">
-          <dict-tag :options="sys_normal_disable" :value="scope.row.isReopen"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="卡类型,对应card_type" align="center" prop="cardType">
-        <template #default="scope">
-          <dict-tag :options="card_type" :value="scope.row.cardType"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="状态(0:无效,1:审核结束,2:审核中)" align="center" prop="status">
-        <template #default="scope">
-          <dict-tag :options="sys_yes_no" :value="scope.row.status"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template #default="scope">
-          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dz:open:edit']">修改</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dz:open:remove']">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    
-    <pagination
-      v-show="total>0"
+    <!-- 数据表格 -->
+    <Table
+      :data="openList"
+      :columns="tableConfigData.columns"
+      :actions="tableConfigData.actions"
+      :loading="loading"
       :total="total"
-      v-model:page="queryParams.pageNum"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
+      :query-params="queryParams"
+      v-model:selected-rows="selectedRows"
+      @selection-change="handleSelectionChange"
+      @action="handleAction"
+      @get-list="getList"
+      v-bind="tableConfigData.tableProps"
+    >
+      <!-- 卡号段插槽 -->
+      <template #cardRange="{ row }">
+        <span>{{ row.startNo }}~{{ row.endNo }}</span>
+      </template>
+
+      <!-- 申请数量插槽 -->
+      <template #quantity="{ row }">
+        <span>{{ calculateQuantity(row.startNo, row.endNo) }}</span>
+      </template>
+
+      <!-- 申请状态插槽 -->
+      <template #status="{ row }">
+        <el-tag :type="getStatusType(row.status)">
+          {{ getStatusText(row.status) }}
+        </el-tag>
+      </template>
+
+      <!-- 原因插槽 -->
+      <template #reason="{ row }">
+        <span>{{ row.reason || "-" }}</span>
+      </template>
+    </Table>
 
     <!-- 添加或修改开卡申请对话框 -->
     <el-dialog :title="title" v-model="open" width="500px" append-to-body>
       <el-form ref="openRef" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="代理" prop="agentId">
-          <el-input v-model="form.agentId" placeholder="请输入代理" />
+        <el-form-item label="申请人" prop="applicant">
+          <el-input v-model="form.applicant" placeholder="请输入申请人" />
         </el-form-item>
         <el-form-item label="起始卡号" prop="startNo">
           <el-input v-model="form.startNo" placeholder="请输入起始卡号" />
@@ -183,47 +86,18 @@
         <el-form-item label="截至卡号" prop="endNo">
           <el-input v-model="form.endNo" placeholder="请输入截至卡号" />
         </el-form-item>
-        <el-form-item label="结束日期" prop="endDate">
-          <el-date-picker clearable
-            v-model="form.endDate"
-            type="date"
-            value-format="YYYY-MM-DD"
-            placeholder="请选择结束日期">
-          </el-date-picker>
+        <el-form-item label="学校" prop="schoolName">
+          <el-input v-model="form.schoolName" placeholder="请输入学校" />
         </el-form-item>
-        <el-form-item label="校区" prop="schoolId">
-          <el-input v-model="form.schoolId" placeholder="请输入校区" />
-        </el-form-item>
-        <el-form-item label="发件人" prop="sender">
-          <el-input v-model="form.sender" placeholder="请输入发件人" />
-        </el-form-item>
-        <el-form-item label="重新开卡:0否,1是" prop="isReopen">
-          <el-radio-group v-model="form.isReopen">
-            <el-radio
-              v-for="dict in sys_normal_disable"
-              :key="dict.value"
-              :label="parseInt(dict.value)"
-            >{{dict.label}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="卡类型,对应card_type" prop="cardType">
-          <el-select v-model="form.cardType" placeholder="请选择卡类型,对应card_type">
-            <el-option
-              v-for="dict in card_type"
-              :key="dict.value"
-              :label="dict.label"
-              :value="parseInt(dict.value)"
-            ></el-option>
+        <el-form-item label="申请状态" prop="status">
+          <el-select v-model="form.status" placeholder="请选择申请状态">
+            <el-option label="待审核" :value="0" />
+            <el-option label="审核通过" :value="1" />
+            <el-option label="已拒绝" :value="2" />
           </el-select>
         </el-form-item>
-        <el-form-item label="状态(0:无效,1:审核结束,2:审核中)" prop="status">
-          <el-radio-group v-model="form.status">
-            <el-radio
-              v-for="dict in sys_yes_no"
-              :key="dict.value"
-              :label="parseInt(dict.value)"
-            >{{dict.label}}</el-radio>
-          </el-radio-group>
+        <el-form-item label="原因" prop="reason">
+          <el-input v-model="form.reason" placeholder="请输入原因" />
         </el-form-item>
       </el-form>
       <template #footer>
@@ -233,161 +107,340 @@
         </div>
       </template>
     </el-dialog>
+
+    <!-- 审核对话框 -->
+    <el-dialog
+      title="审核开卡申请"
+      v-model="reviewOpen"
+      width="400px"
+      append-to-body
+    >
+      <div class="detail">
+        <div class="item">
+          <span class="label"> 卡号段: </span>
+          <span class="value">
+            {{ reviewForm.startNo }}~{{ reviewForm.endNo }}
+          </span>
+        </div>
+        <div class="item">
+          <span class="label"> 申请人: </span>
+          <span class="value">
+            {{ reviewForm.applicant }}
+          </span>
+        </div>
+        <div class="item">
+          <span class="label"> 申请时间: </span>
+          <span class="value">
+            {{ reviewForm.createTime }}
+          </span>
+        </div>
+        <div class="item">
+          <span class="label"> 学校: </span>
+          <span class="value">
+            {{ reviewForm.schoolName }}
+          </span>
+        </div>
+      </div>
+      <el-form
+        ref="reviewRef"
+        :model="reviewForm"
+        :rules="reviewRules"
+        label-width="80px"
+      >
+        <el-form-item label="审核结果" prop="status">
+          <el-radio-group v-model="reviewForm.status">
+            <el-radio :value="1">审核通过</el-radio>
+            <el-radio :value="2">已拒绝</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="原因" prop="reason">
+          <el-input
+            v-model="reviewForm.reason"
+            placeholder="请输入审核原因"
+            type="textarea"
+            :rows="3"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitReview">确 定</el-button>
+          <el-button @click="cancelReview">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup name="Open">
-import { listOpen, getOpen, delOpen, addOpen, updateOpen } from "@/api/dz/open"
+import { listOpen, getOpen, addOpen, updateOpen } from "@/api/dz/open";
+import SearchForm from "@/components/SearchForm/index.vue";
+import Table from "@/components/Table/index.vue";
+import formConfig from "./config/form.js";
+import tableConfig from "./config/table.js";
 
-const { proxy } = getCurrentInstance()
-const { sys_yes_no, sys_normal_disable, card_type } = proxy.useDict('sys_yes_no', 'sys_normal_disable', 'card_type')
+const { proxy } = getCurrentInstance();
 
-const openList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
+const openList = ref([]);
+const open = ref(false);
+const reviewOpen = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const total = ref(0);
+const title = ref("");
+const selectedRows = ref([]);
+
+// 搜索配置
+const searchConfig = computed(() => {
+  return formConfig.info.filter((item) => item.search);
+});
+
+// 表格配置
+const tableConfigData = computed(() => tableConfig);
 
 const data = reactive({
   form: {},
+  reviewForm: {
+    id: null,
+    status: null,
+    reason: null,
+    startNo: null,
+    endNo: null,
+    applicant: null,
+    createTime: null,
+    schoolName: null,
+  },
   queryParams: {
     pageNum: 1,
     pageSize: 10,
-    agentId: null,
-    startNo: null,
-    endNo: null,
-    endDate: null,
-    schoolId: null,
-    sender: null,
-    isReopen: null,
-    cardType: null,
-    status: null
+    applicant: null,
+    cardNo: null,
+    status: null,
   },
   rules: {
-    createTime: [
-      { required: true, message: "申请时间不能为空", trigger: "blur" }
+    applicant: [{ required: true, message: "申请人不能为空", trigger: "blur" }],
+    startNo: [{ required: true, message: "起始卡号不能为空", trigger: "blur" }],
+    endNo: [{ required: true, message: "截至卡号不能为空", trigger: "blur" }],
+    schoolName: [{ required: true, message: "学校不能为空", trigger: "blur" }],
+    status: [
+      { required: true, message: "申请状态不能为空", trigger: "change" },
     ],
+  },
+  reviewRules: {
     status: [
-      { required: true, message: "状态(0:无效,1:审核结束,2:审核中)不能为空", trigger: "change" }
-    ]
-  }
-})
+      { required: true, message: "审核结果不能为空", trigger: "change" },
+    ],
+    reason: [],
+  },
+});
 
-const { queryParams, form, rules } = toRefs(data)
+const { queryParams, form, rules, reviewForm, reviewRules } = toRefs(data);
 
 /** 查询开卡申请列表 */
 function getList() {
-  loading.value = true
-  listOpen(queryParams.value).then(response => {
-    openList.value = response.rows
-    total.value = response.total
-    loading.value = false
-  })
+  loading.value = true;
+  listOpen(queryParams.value).then((response) => {
+    openList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 计算申请数量
+function calculateQuantity(startNo, endNo) {
+  if (!startNo || !endNo) return 0;
+  const start = parseInt(startNo);
+  const end = parseInt(endNo);
+  return end - start + 1;
+}
+
+// 获取状态文本
+function getStatusText(status) {
+  const statusMap = {
+    0: "待审核",
+    1: "审核通过",
+    2: "已拒绝",
+  };
+  return statusMap[status] || "未知";
+}
+
+// 获取状态类型
+function getStatusType(status) {
+  const typeMap = {
+    0: "warning",
+    1: "success",
+    2: "danger",
+  };
+  return typeMap[status] || "info";
 }
 
 // 取消按钮
 function cancel() {
-  open.value = false
-  reset()
+  open.value = false;
+  reset();
+}
+
+// 取消审核
+function cancelReview() {
+  reviewOpen.value = false;
+  resetReview();
 }
 
 // 表单重置
 function reset() {
   form.value = {
     id: null,
-    agentId: null,
+    applicant: null,
     startNo: null,
     endNo: null,
-    endDate: null,
-    schoolId: null,
-    sender: null,
+    schoolName: null,
+    status: null,
+    reason: null,
     createTime: null,
-    isReopen: null,
-    cardType: null,
-    status: null
-  }
-  proxy.resetForm("openRef")
+  };
+  proxy.resetForm("openRef");
+}
+
+// 审核表单重置
+function resetReview() {
+  reviewForm.value = {
+    id: null,
+    status: null,
+    reason: null,
+    startNo: null,
+    endNo: null,
+    applicant: null,
+    createTime: null,
+    schoolName: null,
+  };
+  proxy.resetForm("reviewRef");
 }
 
 /** 搜索按钮操作 */
 function handleQuery() {
-  queryParams.value.pageNum = 1
-  getList()
+  queryParams.value.pageNum = 1;
+  getList();
 }
 
 /** 重置按钮操作 */
 function resetQuery() {
-  proxy.resetForm("queryRef")
-  handleQuery()
+  proxy.resetForm("queryRef");
+  handleQuery();
 }
 
 // 多选框选中数据
 function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.id)
-  single.value = selection.length != 1
-  multiple.value = !selection.length
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
 }
 
 /** 新增按钮操作 */
 function handleAdd() {
-  reset()
-  open.value = true
-  title.value = "添加开卡申请"
+  reset();
+  open.value = true;
+  title.value = "添加开卡申请";
 }
 
 /** 修改按钮操作 */
 function handleUpdate(row) {
-  reset()
-  const _id = row.id || ids.value
-  getOpen(_id).then(response => {
-    form.value = response.data
-    open.value = true
-    title.value = "修改开卡申请"
-  })
+  reset();
+  const _id = row.id || ids.value;
+  getOpen(_id).then((response) => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改开卡申请";
+  });
+}
+
+/** 审核按钮操作 */
+function handleReview(row) {
+  resetReview();
+
+  // 从列表中获取对应的数据并填充到reviewForm中
+  reviewForm.value = {
+    id: row.id,
+    status: null,
+    reason: null,
+    startNo: row.startNo || "-",
+    endNo: row.endNo || "-",
+    applicant: row.applicant || "-",
+    createTime: row.createTime || "-",
+    schoolName: row.schoolName || "-",
+  };
+
+  reviewOpen.value = true;
+}
+
+/** 表格操作处理 */
+function handleAction(action, row) {
+  switch (action.key) {
+    case "review":
+      handleReview(row);
+      break;
+  }
 }
 
 /** 提交按钮 */
 function submitForm() {
-  proxy.$refs["openRef"].validate(valid => {
+  proxy.$refs["openRef"].validate((valid) => {
     if (valid) {
       if (form.value.id != null) {
-        updateOpen(form.value).then(response => {
-          proxy.$modal.msgSuccess("修改成功")
-          open.value = false
-          getList()
-        })
+        updateOpen(form.value).then((response) => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
       } else {
-        addOpen(form.value).then(response => {
-          proxy.$modal.msgSuccess("新增成功")
-          open.value = false
-          getList()
-        })
+        addOpen(form.value).then((response) => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
       }
     }
-  })
+  });
 }
 
-/** 删除按钮操作 */
-function handleDelete(row) {
-  const _ids = row.id || ids.value
-  proxy.$modal.confirm('是否确认删除开卡申请编号为"' + _ids + '"的数据项?').then(function() {
-    return delOpen(_ids)
-  }).then(() => {
-    getList()
-    proxy.$modal.msgSuccess("删除成功")
-  }).catch(() => {})
+/** 提交审核 */
+function submitReview() {
+  proxy.$refs["reviewRef"].validate((valid) => {
+    if (valid) {
+      // 这里应该调用审核API,暂时使用更新API
+      const updateData = {
+        id: reviewForm.value.id,
+        status: reviewForm.value.status,
+        reason: reviewForm.value.reason,
+      };
+      updateOpen(updateData).then((response) => {
+        proxy.$modal.msgSuccess("审核成功");
+        reviewOpen.value = false;
+        getList();
+      });
+    }
+  });
 }
 
 /** 导出按钮操作 */
 function handleExport() {
-  proxy.download('dz/open/export', {
-    ...queryParams.value
-  }, `open_${new Date().getTime()}.xlsx`)
+  proxy.download(
+    "dz/open/export",
+    {
+      ...queryParams.value,
+    },
+    `open_${new Date().getTime()}.xlsx`
+  );
 }
 
-getList()
+getList();
 </script>
+<style>
+.detail {
+  padding-left: 10px;
+  .item {
+    display: flex;
+    align-items: center;
+    margin-bottom: 10px;
+  }
+}
+</style>

+ 1 - 3
back-ui/src/views/dz/papers/index.vue

@@ -19,6 +19,4 @@ import {useProvideLoading} from "@/views/hooks/useLoading.js";
 const {loading} = useProvideLoading()
 </script>
 
-<style scoped>
-
-</style>
+<style scoped></style>

+ 3 - 6
back-ui/src/views/dz/papers/list.vue

@@ -1,10 +1,7 @@
 <template>
-
+  <div>组卷历史</div>
 </template>
 
-<script setup name="PaperList">
-</script>
-
-<style scoped>
+<script setup></script>
 
-</style>
+<style lang="scss" scoped></style>

+ 5 - 4
back-ui/src/views/dz/school/index.vue

@@ -102,9 +102,10 @@
               <el-table-column label="归属机构" align="center" key="deptName" prop="dept.deptName" :show-overflow-tooltip="true" />
               <el-table-column label="省份" align="center" prop="location" />
 
-              <el-table-column label="省" align="center" prop="pro" />
-              <el-table-column label="市" align="center" prop="city" />
-              <el-table-column label="区" align="center" prop="area" />
+<!--              <el-table-column label="省" align="center" prop="pro" />-->
+<!--              <el-table-column label="市" align="center" prop="city" />-->
+<!--              <el-table-column label="区" align="center" prop="area" />-->
+              <el-table-column label="所属地区" align="center" prop="proCityAreaName" />
               <el-table-column label="状态" align="center" prop="status">
                 <template #default="scope">
                   <dict-tag :options="bool_values" :value="scope.row.status"/>
@@ -226,7 +227,7 @@
     },
     rules: {
       status: [
-        { required: true, message: "状态(0:无效,1:有效)不能为空", trigger: "change" },
+        { required: true, message: "状态不能为空", trigger: "change" },
         { required: true, message: "机构不能为空", trigger: "change" }
       ],
     }

+ 118 - 1
back-ui/src/views/dz/teacher/index.vue

@@ -90,6 +90,7 @@
       <el-table-column label="用户ID" align="center" prop="userId" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template #default="scope">
+          <el-button link type="primary" icon="" @click="handleUpdateTeacherClass(scope.row)" v-hasPermi="['dz:teacher:edit']">关联班级</el-button>
           <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dz:teacher:edit']">修改</el-button>
           <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dz:teacher:remove']">删除</el-button>
         </template>
@@ -131,18 +132,50 @@
         </div>
       </template>
     </el-dialog>
+
+      <!-- 关联班级 -->
+      <el-dialog :title="titleTeacherClass" v-model="openTeacherClass" width="500px" append-to-body>
+          <el-form ref="teacherClassRef" :model="formTeacherClass" :rules="rulesTeacherClass" label-width="80px">
+<!--              <el-form-item label="教师ID" v-show="false" prop="teacherId">-->
+<!--                  <el-input v-model="formTeacherClass.teacherId" placeholder="请输入教师ID" disabled/>-->
+<!--              </el-form-item>-->
+              <el-form-item label="教师姓名" prop="name">
+                  <el-input v-model="formTeacherClass.name" placeholder="请输入教师姓名" disabled/>
+              </el-form-item>
+              <el-form-item label="关联班级" prop="classIds">
+                  <el-select v-model="formTeacherClass.classIds" multiple placeholder="请选择班级" style="width: 100%">
+                      <el-option
+                              v-for="item in classOptions"
+                              :key="item.classId"
+                              :label="item.name"
+                              :value="item.classId"
+                      />
+                  </el-select>
+              </el-form-item>
+          </el-form>
+          <template #footer>
+              <div class="dialog-footer">
+                  <el-button type="primary" @click="submitFormTeacherClass">确 定</el-button>
+                  <el-button @click="cancelTeacherClass">取 消</el-button>
+              </div>
+          </template>
+      </el-dialog>
   </div>
 </template>
 
 <script setup name="Teacher">
 import { listTeacher, getTeacher, delTeacher, addTeacher, updateTeacher } from "@/api/dz/teacher"
 import { listAllSchool } from "@/api/dz/school"
+import { listAllClass } from "@/api/dz/classes"
+import { batchBindTeacherClass,listAllTeacherClass } from "@/api/dz/teacherclass"
 
 const { proxy } = getCurrentInstance()
 
 const teacherList = ref([])
 const schoolOptions = ref([])
+const classOptions = ref([])
 const open = ref(false)
+const openTeacherClass = ref(false)
 const loading = ref(true)
 const showSearch = ref(true)
 const ids = ref([])
@@ -150,9 +183,15 @@ const single = ref(true)
 const multiple = ref(true)
 const total = ref(0)
 const title = ref("")
+const titleTeacherClass = ref("")
 
 const data = reactive({
   form: {},
+  formTeacherClass: {
+      teacherId: null,
+      name: null,
+      classIds: []
+  },
   queryParams: {
     pageNum: 1,
     pageSize: 10,
@@ -161,10 +200,16 @@ const data = reactive({
     name: null
   },
   rules: {
+  },
+  rulesTeacherClass: {
+      // 可以添加验证规则
+      classIds: [
+          { required: true, message: "请选择至少一个班级", trigger: "change" }
+      ]
   }
 })
 
-const { queryParams, form, rules } = toRefs(data)
+const { queryParams, form, formTeacherClass, rules, rulesTeacherClass } = toRefs(data)
 
 /** 查询老师列表 */
 function getList() {
@@ -183,12 +228,19 @@ function getSchoolList() {
   })
 }
 
+// function getClassListBySchool() {
+//     listAll().then(response => {
+//         classOptions.value = response.data || []
+//     })
+// }
+
 // 取消按钮
 function cancel() {
   open.value = false
   reset()
 }
 
+
 // 表单重置
 function reset() {
   form.value = {
@@ -200,6 +252,22 @@ function reset() {
   proxy.resetForm("teacherRef")
 }
 
+// 取消按钮
+function cancelTeacherClass() {
+    openTeacherClass.value = false
+    resetTeacherClass()
+}
+
+// 表单重置
+function resetTeacherClass() {
+    formTeacherClass.value = {
+        teacherId: null,
+        classIds: [],
+        name: null
+    }
+    proxy.resetForm("teacherClassRef")
+}
+
 /** 搜索按钮操作 */
 function handleQuery() {
   queryParams.value.pageNum = 1
@@ -276,9 +344,58 @@ function handleExport() {
   }, `teacher_${new Date().getTime()}.xlsx`)
 }
 
+/** 关联老师班级,按钮操作 */
+function handleUpdateTeacherClass(row) {
+    resetTeacherClass()
+    // const _schoolId = row.schoolId
+    const submitData = {
+        schoolId: row.schoolId,
+        teacherId: row.teacherId
+    }
+    listAllClass(submitData).then(response => {
+        classOptions.value = response.data || []
+
+        // 然后设置数据
+        formTeacherClass.value.teacherId = row.teacherId
+        formTeacherClass.value.name = row.name
+
+        listAllTeacherClass(submitData).then(response => {
+            formTeacherClass.value.classIds = (response.data || []).map(item => item.classId)
+        })
+
+        openTeacherClass.value = true
+        titleTeacherClass.value = "关联班级"
+    })
+}
+
+/** 关联老师班级,提交按钮 */
+function submitFormTeacherClass() {
+    proxy.$refs["teacherClassRef"].validate(valid => {
+        if (valid) {
+            // 构建提交参数
+            const submitData = {
+                teacherId: formTeacherClass.value.teacherId,
+                classIds: formTeacherClass.value.classIds
+            }
+            // console.log("submitData"+submitData)
+
+            // 调用关联班级的API
+            // 假设API函数名为 updateTeacherClassRelation
+            batchBindTeacherClass(submitData).then(response => {
+                proxy.$modal.msgSuccess("关联成功")
+                openTeacherClass.value = false
+                getList()
+            }).catch(() => {
+                proxy.$modal.msgError("关联失败")
+            })
+        }
+    })
+}
+
 onMounted(() => {
   getSchoolList()
   getList()
+  // getClassListBySchool()
 })
 
 </script>

+ 8 - 8
back-ui/src/views/dz/teacherclass/index.vue

@@ -9,9 +9,9 @@
           @keyup.enter="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="班级id" prop="classesId">
+      <el-form-item label="班级id" prop="classId">
         <el-input
-          v-model="queryParams.classesId"
+          v-model="queryParams.classId"
           placeholder="请输入班级id"
           clearable
           @keyup.enter="handleQuery"
@@ -77,7 +77,7 @@
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="标识" align="center" prop="id" />
       <el-table-column label="老师id" align="center" prop="teacherId" />
-      <el-table-column label="班级id" align="center" prop="classesId" />
+      <el-table-column label="班级id" align="center" prop="classId" />
       <el-table-column label="有效状态" align="center" prop="status" />
       <el-table-column label="备注" align="center" prop="remark" />
       <el-table-column label="结束日期" align="center" prop="outDate" width="180">
@@ -92,7 +92,7 @@
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -107,8 +107,8 @@
         <el-form-item label="老师id" prop="teacherId">
           <el-input v-model="form.teacherId" placeholder="请输入老师id" />
         </el-form-item>
-        <el-form-item label="班级id" prop="classesId">
-          <el-input v-model="form.classesId" placeholder="请输入班级id" />
+        <el-form-item label="班级id" prop="classId">
+          <el-input v-model="form.classId" placeholder="请输入班级id" />
         </el-form-item>
         <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" placeholder="请输入备注" />
@@ -153,7 +153,7 @@ const data = reactive({
     pageNum: 1,
     pageSize: 10,
     teacherId: null,
-    classesId: null,
+    classId: null,
     status: null,
     outDate: null
   },
@@ -184,7 +184,7 @@ function reset() {
   form.value = {
     id: null,
     teacherId: null,
-    classesId: null,
+    classId: null,
     status: null,
     remark: null,
     outDate: null

+ 168 - 93
back-ui/src/views/learn/paper/index.vue

@@ -1,6 +1,12 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      :model="queryParams"
+      ref="queryRef"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
       <el-form-item label="科目id" prop="subjectId">
         <el-input
           v-model="queryParams.subjectId"
@@ -90,15 +96,19 @@
         />
       </el-form-item>
       <el-form-item label="创建时间" prop="createTime">
-        <el-date-picker clearable
+        <el-date-picker
+          clearable
           v-model="queryParams.createTime"
           type="date"
           value-format="YYYY-MM-DD"
-          placeholder="请选择创建时间">
+          placeholder="请选择创建时间"
+        >
         </el-date-picker>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button type="primary" icon="Search" @click="handleQuery"
+          >搜索</el-button
+        >
         <el-button icon="Refresh" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
@@ -111,7 +121,8 @@
           icon="Plus"
           @click="handleAdd"
           v-hasPermi="['learn:paper:add']"
-        >新增</el-button>
+          >新增</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -121,7 +132,8 @@
           :disabled="single"
           @click="handleUpdate"
           v-hasPermi="['learn:paper:edit']"
-        >修改</el-button>
+          >修改</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -131,7 +143,8 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['learn:paper:remove']"
-        >删除</el-button>
+          >删除</el-button
+        >
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -140,18 +153,30 @@
           icon="Download"
           @click="handleExport"
           v-hasPermi="['learn:paper:export']"
-        >导出</el-button>
+          >导出</el-button
+        >
       </el-col>
-      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+      <right-toolbar
+        v-model:showSearch="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="paperList" @selection-change="handleSelectionChange">
+    <el-table
+      v-loading="loading"
+      :data="paperList"
+      @selection-change="handleSelectionChange"
+    >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="${comment}" align="center" prop="id" />
       <el-table-column label="科目id" align="center" prop="subjectId" />
       <el-table-column label="试卷名称" align="center" prop="paperName" />
       <el-table-column label="创建年度" align="center" prop="year" />
-      <el-table-column label="历年真题,模拟卷,必刷题;组卷;练习卷;刷题卷;know_test-知识点,auto-基础题库,high_error-高频错题,smart_test-智能刷题,paper-真题,试卷" align="center" prop="paperType" />
+      <el-table-column
+        label="历年真题,模拟卷,必刷题;组卷;练习卷;刷题卷;know_test-知识点,auto-基础题库,high_error-高频错题,smart_test-智能刷题,paper-真题,试卷"
+        align="center"
+        prop="paperType"
+      />
       <el-table-column label="试卷题数" align="center" prop="number" />
       <el-table-column label="试卷总分数" align="center" prop="fenshu" />
       <el-table-column label="试券来源" align="center" prop="paperSource" />
@@ -159,24 +184,51 @@
       <el-table-column label="标识" align="center" prop="tiid" />
       <el-table-column label="路径" align="center" prop="osspath" />
       <el-table-column label="源文件名" align="center" prop="filename" />
-      <el-table-column label="真题卷id或组卷人id" align="center" prop="relateId" />
+      <el-table-column
+        label="真题卷id或组卷人id"
+        align="center"
+        prop="relateId"
+      />
       <el-table-column label="适用地区" align="center" prop="locations" />
       <el-table-column label="适用考生" align="center" prop="examineeTypes" />
-      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        width="180"
+      >
         <template #default="scope">
-          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+          <span>{{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
         <template #default="scope">
-          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['learn:paper:edit']">修改</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['learn:paper:remove']">删除</el-button>
+          <el-button
+            link
+            type="primary"
+            icon="Edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['learn:paper:edit']"
+            >修改</el-button
+          >
+          <el-button
+            link
+            type="primary"
+            icon="Delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['learn:paper:remove']"
+            >删除</el-button
+          >
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
-      v-show="total>0"
+      v-show="total > 0"
       :total="total"
       v-model:page="queryParams.pageNum"
       v-model:limit="queryParams.pageSize"
@@ -211,13 +263,24 @@
           <el-input v-model="form.tiid" placeholder="请输入标识" />
         </el-form-item>
         <el-form-item label="路径" prop="osspath">
-          <el-input v-model="form.osspath" type="textarea" placeholder="请输入内容" />
+          <el-input
+            v-model="form.osspath"
+            type="textarea"
+            placeholder="请输入内容"
+          />
         </el-form-item>
         <el-form-item label="源文件名" prop="filename">
-          <el-input v-model="form.filename" type="textarea" placeholder="请输入内容" />
+          <el-input
+            v-model="form.filename"
+            type="textarea"
+            placeholder="请输入内容"
+          />
         </el-form-item>
         <el-form-item label="真题卷id或组卷人id" prop="relateId">
-          <el-input v-model="form.relateId" placeholder="请输入真题卷id或组卷人id" />
+          <el-input
+            v-model="form.relateId"
+            placeholder="请输入真题卷id或组卷人id"
+          />
         </el-form-item>
         <el-form-item label="适用地区" prop="locations">
           <el-input v-model="form.locations" placeholder="请输入适用地区" />
@@ -237,19 +300,25 @@
 </template>
 
 <script setup name="Paper">
-import { listPaper, getPaper, delPaper, addPaper, updatePaper } from "@/api/learn/paper"
+import {
+  listPaper,
+  getPaper,
+  delPaper,
+  addPaper,
+  updatePaper,
+} from "@/api/learn/paper";
 
-const { proxy } = getCurrentInstance()
+const { proxy } = getCurrentInstance();
 
-const paperList = ref([])
-const open = ref(false)
-const loading = ref(true)
-const showSearch = ref(true)
-const ids = ref([])
-const single = ref(true)
-const multiple = ref(true)
-const total = ref(0)
-const title = ref("")
+const paperList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
 
 const data = reactive({
   form: {},
@@ -270,37 +339,35 @@ const data = reactive({
     relateId: null,
     locations: null,
     examineeTypes: null,
-    createTime: null
+    createTime: null,
   },
   rules: {
-    subjectId: [
-      { required: true, message: "科目id不能为空", trigger: "blur" }
-    ],
+    subjectId: [{ required: true, message: "科目id不能为空", trigger: "blur" }],
     paperSource: [
-      { required: true, message: "试券来源不能为空", trigger: "blur" }
+      { required: true, message: "试券来源不能为空", trigger: "blur" },
     ],
     directKey: [
-      { required: true, message: "定向key不能为空", trigger: "blur" }
+      { required: true, message: "定向key不能为空", trigger: "blur" },
     ],
-  }
-})
+  },
+});
 
-const { queryParams, form, rules } = toRefs(data)
+const { queryParams, form, rules } = toRefs(data);
 
 /** 查询试卷列表 */
 function getList() {
-  loading.value = true
-  listPaper(queryParams.value).then(response => {
-    paperList.value = response.rows
-    total.value = response.total
-    loading.value = false
-  })
+  loading.value = true;
+  listPaper(queryParams.value).then((response) => {
+    paperList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
 }
 
 // 取消按钮
 function cancel() {
-  open.value = false
-  reset()
+  open.value = false;
+  reset();
 }
 
 // 表单重置
@@ -321,86 +388,94 @@ function reset() {
     relateId: null,
     locations: null,
     examineeTypes: null,
-    createTime: null
-  }
-  proxy.resetForm("paperRef")
+    createTime: null,
+  };
+  proxy.resetForm("paperRef");
 }
 
 /** 搜索按钮操作 */
 function handleQuery() {
-  queryParams.value.pageNum = 1
-  getList()
+  queryParams.value.pageNum = 1;
+  getList();
 }
 
 /** 重置按钮操作 */
 function resetQuery() {
-  proxy.resetForm("queryRef")
-  handleQuery()
+  proxy.resetForm("queryRef");
+  handleQuery();
 }
 
 // 多选框选中数据
 function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.id)
-  single.value = selection.length != 1
-  multiple.value = !selection.length
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
 }
 
 /** 新增按钮操作 */
 function handleAdd() {
-  reset()
-  open.value = true
-  title.value = "添加试卷"
+  reset();
+  open.value = true;
+  title.value = "添加试卷";
 }
 
 /** 修改按钮操作 */
 function handleUpdate(row) {
-  reset()
-  const _id = row.id || ids.value
-  getPaper(_id).then(response => {
-    form.value = response.data
-    open.value = true
-    title.value = "修改试卷"
-  })
+  reset();
+  const _id = row.id || ids.value;
+  getPaper(_id).then((response) => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改试卷";
+  });
 }
 
 /** 提交按钮 */
 function submitForm() {
-  proxy.$refs["paperRef"].validate(valid => {
+  proxy.$refs["paperRef"].validate((valid) => {
     if (valid) {
       if (form.value.id != null) {
-        updatePaper(form.value).then(response => {
-          proxy.$modal.msgSuccess("修改成功")
-          open.value = false
-          getList()
-        })
+        updatePaper(form.value).then((response) => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
       } else {
-        addPaper(form.value).then(response => {
-          proxy.$modal.msgSuccess("新增成功")
-          open.value = false
-          getList()
-        })
+        addPaper(form.value).then((response) => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
       }
     }
-  })
+  });
 }
 
 /** 删除按钮操作 */
 function handleDelete(row) {
-  const _ids = row.id || ids.value
-  proxy.$modal.confirm('是否确认删除试卷编号为"' + _ids + '"的数据项?').then(function() {
-    return delPaper(_ids)
-  }).then(() => {
-    getList()
-    proxy.$modal.msgSuccess("删除成功")
-  }).catch(() => {})
+  const _ids = row.id || ids.value;
+  proxy.$modal
+    .confirm('是否确认删除试卷编号为"' + _ids + '"的数据项?')
+    .then(function () {
+      return delPaper(_ids);
+    })
+    .then(() => {
+      getList();
+      proxy.$modal.msgSuccess("删除成功");
+    })
+    .catch(() => {});
 }
 
 /** 导出按钮操作 */
 function handleExport() {
-  proxy.download('learn/paper/export', {
-    ...queryParams.value
-  }, `paper_${new Date().getTime()}.xlsx`)
+  proxy.download(
+    "learn/paper/export",
+    {
+      ...queryParams.value,
+    },
+    `paper_${new Date().getTime()}.xlsx`
+  );
 }
 
-getList()
+getList();
 </script>

+ 11 - 1
back-ui/src/views/system/user/index.vue

@@ -20,6 +20,11 @@
               <el-form-item label="用户名称" prop="userName">
                 <el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
               </el-form-item>
+              <el-form-item label="用户类型" prop="userType">
+                <el-select v-model="queryParams.status" placeholder="用户状态" clearable style="width: 240px">
+                  <el-option v-for="dict in user_type" :key="dict.value" :label="dict.label" :value="dict.value" />
+                </el-select>
+              </el-form-item>
               <el-form-item label="手机号码" prop="phonenumber">
                 <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable style="width: 240px" @keyup.enter="handleQuery" />
               </el-form-item>
@@ -61,6 +66,11 @@
               <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns.userId.visible" />
               <el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns.userName.visible" :show-overflow-tooltip="true" />
               <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns.nickName.visible" :show-overflow-tooltip="true" />
+              <el-table-column label="用户类型" align="center" key="userType" v-if="columns.status.visible">
+                <template #default="scope">
+                  <dict-tag :options="user_type" :value="scope.row.userType" />
+                </template>
+              </el-table-column>
               <el-table-column label="机构" align="center" key="deptName" prop="dept.deptName" v-if="columns.deptName.visible" :show-overflow-tooltip="true" />
               <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns.phonenumber.visible" width="120" />
               <el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
@@ -223,7 +233,7 @@ import "splitpanes/dist/splitpanes.css"
 const router = useRouter()
 const appStore = useAppStore()
 const { proxy } = getCurrentInstance()
-const { sys_normal_disable, sys_user_sex } = proxy.useDict("sys_normal_disable", "sys_user_sex")
+const { sys_normal_disable, sys_user_sex, user_type } = proxy.useDict("sys_normal_disable", "sys_user_sex", "user_type")
 
 const userList = ref([])
 const open = ref(false)

+ 0 - 3718
back-ui/yarn.lock

@@ -1,3718 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@antfu/utils@^0.7.10":
-  version "0.7.10"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@antfu/utils/-/utils-0.7.10.tgz"
-  integrity sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==
-
-"@babel/helper-string-parser@^7.27.1":
-  version "7.27.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"
-  integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
-
-"@babel/helper-validator-identifier@^7.27.1":
-  version "7.27.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz"
-  integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
-
-"@babel/parser@^7.27.2", "@babel/parser@^7.28.3":
-  version "7.28.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@babel/parser/-/parser-7.28.4.tgz"
-  integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==
-  dependencies:
-    "@babel/types" "^7.28.4"
-
-"@babel/types@^7.28.4":
-  version "7.28.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@babel/types/-/types-7.28.4.tgz"
-  integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==
-  dependencies:
-    "@babel/helper-string-parser" "^7.27.1"
-    "@babel/helper-validator-identifier" "^7.27.1"
-
-"@bufbuild/protobuf@^2.0.0":
-  version "2.7.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@bufbuild/protobuf/-/protobuf-2.7.0.tgz"
-  integrity sha512-qn6tAIZEw5i/wiESBF4nQxZkl86aY4KoO0IkUa2Lh+rya64oTOdJQFlZuMwI1Qz9VBJQrQC4QlSA2DNek5gCOA==
-
-"@ctrl/tinycolor@^3.4.1":
-  version "3.6.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz"
-  integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==
-
-"@element-plus/icons-vue@^2.3.1", "@element-plus/icons-vue@2.3.1":
-  version "2.3.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz"
-  integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==
-
-"@esbuild/darwin-x64@0.25.9":
-  version "0.25.9"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz"
-  integrity sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==
-
-"@floating-ui/core@^1.7.3":
-  version "1.7.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@floating-ui/core/-/core-1.7.3.tgz"
-  integrity sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==
-  dependencies:
-    "@floating-ui/utils" "^0.2.10"
-
-"@floating-ui/dom@^1.0.1":
-  version "1.7.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@floating-ui/dom/-/dom-1.7.4.tgz"
-  integrity sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==
-  dependencies:
-    "@floating-ui/core" "^1.7.3"
-    "@floating-ui/utils" "^0.2.10"
-
-"@floating-ui/utils@^0.2.10":
-  version "0.2.10"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@floating-ui/utils/-/utils-0.2.10.tgz"
-  integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==
-
-"@isaacs/cliui@^8.0.2":
-  version "8.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@isaacs/cliui/-/cliui-8.0.2.tgz"
-  integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
-  dependencies:
-    string-width "^5.1.2"
-    string-width-cjs "npm:string-width@^4.2.0"
-    strip-ansi "^7.0.1"
-    strip-ansi-cjs "npm:strip-ansi@^6.0.1"
-    wrap-ansi "^8.1.0"
-    wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
-
-"@isaacs/fs-minipass@^4.0.0":
-  version "4.0.1"
-  resolved "https://registry.npmmirror.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz"
-  integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==
-  dependencies:
-    minipass "^7.0.4"
-
-"@jridgewell/gen-mapping@^0.3.5":
-  version "0.3.13"
-  resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"
-  integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
-  dependencies:
-    "@jridgewell/sourcemap-codec" "^1.5.0"
-    "@jridgewell/trace-mapping" "^0.3.24"
-
-"@jridgewell/remapping@^2.3.4":
-  version "2.3.5"
-  resolved "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz"
-  integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
-  dependencies:
-    "@jridgewell/gen-mapping" "^0.3.5"
-    "@jridgewell/trace-mapping" "^0.3.24"
-
-"@jridgewell/resolve-uri@^3.1.0":
-  version "3.1.2"
-  resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
-  integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
-
-"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5":
-  version "1.5.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
-  integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
-
-"@jridgewell/trace-mapping@^0.3.24":
-  version "0.3.31"
-  resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"
-  integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
-  dependencies:
-    "@jridgewell/resolve-uri" "^3.1.0"
-    "@jridgewell/sourcemap-codec" "^1.4.14"
-
-"@nodelib/fs.scandir@2.1.5":
-  version "2.1.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
-  integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
-  dependencies:
-    "@nodelib/fs.stat" "2.0.5"
-    run-parallel "^1.1.9"
-
-"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
-  version "2.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
-  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
-
-"@nodelib/fs.walk@^1.2.3":
-  version "1.2.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
-  integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
-  dependencies:
-    "@nodelib/fs.scandir" "2.1.5"
-    fastq "^1.6.0"
-
-"@one-ini/wasm@0.1.1":
-  version "0.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@one-ini/wasm/-/wasm-0.1.1.tgz"
-  integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==
-
-"@pkgjs/parseargs@^0.11.0":
-  version "0.11.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@pkgjs/parseargs/-/parseargs-0.11.0.tgz"
-  integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
-
-"@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7":
-  version "2.11.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz"
-  integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==
-
-"@rollup/pluginutils@^5.1.3", "@rollup/pluginutils@^5.1.4":
-  version "5.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@rollup/pluginutils/-/pluginutils-5.3.0.tgz"
-  integrity sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==
-  dependencies:
-    "@types/estree" "^1.0.0"
-    estree-walker "^2.0.2"
-    picomatch "^4.0.2"
-
-"@rollup/rollup-darwin-x64@4.50.0":
-  version "4.50.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz"
-  integrity sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==
-
-"@tailwindcss/node@4.1.13":
-  version "4.1.13"
-  resolved "https://registry.npmmirror.com/@tailwindcss/node/-/node-4.1.13.tgz"
-  integrity sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==
-  dependencies:
-    "@jridgewell/remapping" "^2.3.4"
-    enhanced-resolve "^5.18.3"
-    jiti "^2.5.1"
-    lightningcss "1.30.1"
-    magic-string "^0.30.18"
-    source-map-js "^1.2.1"
-    tailwindcss "4.1.13"
-
-"@tailwindcss/oxide-darwin-x64@4.1.13":
-  version "4.1.13"
-  resolved "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.tgz"
-  integrity sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==
-
-"@tailwindcss/oxide@4.1.13":
-  version "4.1.13"
-  resolved "https://registry.npmmirror.com/@tailwindcss/oxide/-/oxide-4.1.13.tgz"
-  integrity sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==
-  dependencies:
-    detect-libc "^2.0.4"
-    tar "^7.4.3"
-  optionalDependencies:
-    "@tailwindcss/oxide-android-arm64" "4.1.13"
-    "@tailwindcss/oxide-darwin-arm64" "4.1.13"
-    "@tailwindcss/oxide-darwin-x64" "4.1.13"
-    "@tailwindcss/oxide-freebsd-x64" "4.1.13"
-    "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.13"
-    "@tailwindcss/oxide-linux-arm64-gnu" "4.1.13"
-    "@tailwindcss/oxide-linux-arm64-musl" "4.1.13"
-    "@tailwindcss/oxide-linux-x64-gnu" "4.1.13"
-    "@tailwindcss/oxide-linux-x64-musl" "4.1.13"
-    "@tailwindcss/oxide-wasm32-wasi" "4.1.13"
-    "@tailwindcss/oxide-win32-arm64-msvc" "4.1.13"
-    "@tailwindcss/oxide-win32-x64-msvc" "4.1.13"
-
-"@tailwindcss/vite@^4.1.13":
-  version "4.1.13"
-  resolved "https://registry.npmmirror.com/@tailwindcss/vite/-/vite-4.1.13.tgz"
-  integrity sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==
-  dependencies:
-    "@tailwindcss/node" "4.1.13"
-    "@tailwindcss/oxide" "4.1.13"
-    tailwindcss "4.1.13"
-
-"@trysound/sax@0.2.0":
-  version "0.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@trysound/sax/-/sax-0.2.0.tgz"
-  integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
-
-"@types/estree@^1.0.0", "@types/estree@1.0.8":
-  version "1.0.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@types/estree/-/estree-1.0.8.tgz"
-  integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
-
-"@types/lodash-es@*", "@types/lodash-es@^4.17.6":
-  version "4.17.12"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@types/lodash-es/-/lodash-es-4.17.12.tgz"
-  integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==
-  dependencies:
-    "@types/lodash" "*"
-
-"@types/lodash@*", "@types/lodash@^4.14.182":
-  version "4.17.20"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@types/lodash/-/lodash-4.17.20.tgz"
-  integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==
-
-"@types/node@*", "@types/node@^18.0.0 || ^20.0.0 || >=22.0.0":
-  version "24.3.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@types/node/-/node-24.3.1.tgz"
-  integrity sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==
-  dependencies:
-    undici-types "~7.10.0"
-
-"@types/svgo@^2.6.1":
-  version "2.6.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@types/svgo/-/svgo-2.6.4.tgz"
-  integrity sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==
-  dependencies:
-    "@types/node" "*"
-
-"@types/web-bluetooth@^0.0.16":
-  version "0.0.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz"
-  integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
-
-"@types/web-bluetooth@^0.0.21":
-  version "0.0.21"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz"
-  integrity sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==
-
-"@vitejs/plugin-vue@5.2.4":
-  version "5.2.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz"
-  integrity sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==
-
-"@vue/compiler-core@3.5.16":
-  version "3.5.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/compiler-core/-/compiler-core-3.5.16.tgz"
-  integrity sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==
-  dependencies:
-    "@babel/parser" "^7.27.2"
-    "@vue/shared" "3.5.16"
-    entities "^4.5.0"
-    estree-walker "^2.0.2"
-    source-map-js "^1.2.1"
-
-"@vue/compiler-core@3.5.21":
-  version "3.5.21"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/compiler-core/-/compiler-core-3.5.21.tgz"
-  integrity sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==
-  dependencies:
-    "@babel/parser" "^7.28.3"
-    "@vue/shared" "3.5.21"
-    entities "^4.5.0"
-    estree-walker "^2.0.2"
-    source-map-js "^1.2.1"
-
-"@vue/compiler-dom@3.5.16":
-  version "3.5.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz"
-  integrity sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==
-  dependencies:
-    "@vue/compiler-core" "3.5.16"
-    "@vue/shared" "3.5.16"
-
-"@vue/compiler-dom@3.5.21":
-  version "3.5.21"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/compiler-dom/-/compiler-dom-3.5.21.tgz"
-  integrity sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==
-  dependencies:
-    "@vue/compiler-core" "3.5.21"
-    "@vue/shared" "3.5.21"
-
-"@vue/compiler-sfc@^3.2.37":
-  version "3.5.21"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/compiler-sfc/-/compiler-sfc-3.5.21.tgz"
-  integrity sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==
-  dependencies:
-    "@babel/parser" "^7.28.3"
-    "@vue/compiler-core" "3.5.21"
-    "@vue/compiler-dom" "3.5.21"
-    "@vue/compiler-ssr" "3.5.21"
-    "@vue/shared" "3.5.21"
-    estree-walker "^2.0.2"
-    magic-string "^0.30.18"
-    postcss "^8.5.6"
-    source-map-js "^1.2.1"
-
-"@vue/compiler-sfc@3.5.16":
-  version "3.5.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz"
-  integrity sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==
-  dependencies:
-    "@babel/parser" "^7.27.2"
-    "@vue/compiler-core" "3.5.16"
-    "@vue/compiler-dom" "3.5.16"
-    "@vue/compiler-ssr" "3.5.16"
-    "@vue/shared" "3.5.16"
-    estree-walker "^2.0.2"
-    magic-string "^0.30.17"
-    postcss "^8.5.3"
-    source-map-js "^1.2.1"
-
-"@vue/compiler-ssr@3.5.16":
-  version "3.5.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz"
-  integrity sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==
-  dependencies:
-    "@vue/compiler-dom" "3.5.16"
-    "@vue/shared" "3.5.16"
-
-"@vue/compiler-ssr@3.5.21":
-  version "3.5.21"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/compiler-ssr/-/compiler-ssr-3.5.21.tgz"
-  integrity sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==
-  dependencies:
-    "@vue/compiler-dom" "3.5.21"
-    "@vue/shared" "3.5.21"
-
-"@vue/devtools-api@^6.6.4":
-  version "6.6.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-api/-/devtools-api-6.6.4.tgz"
-  integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
-
-"@vue/devtools-api@^7.7.2":
-  version "7.7.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-api/-/devtools-api-7.7.7.tgz"
-  integrity sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==
-  dependencies:
-    "@vue/devtools-kit" "^7.7.7"
-
-"@vue/devtools-kit@^7.7.7":
-  version "7.7.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz"
-  integrity sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==
-  dependencies:
-    "@vue/devtools-shared" "^7.7.7"
-    birpc "^2.3.0"
-    hookable "^5.5.3"
-    mitt "^3.0.1"
-    perfect-debounce "^1.0.0"
-    speakingurl "^14.0.1"
-    superjson "^2.2.2"
-
-"@vue/devtools-shared@^7.7.7":
-  version "7.7.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz"
-  integrity sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==
-  dependencies:
-    rfdc "^1.4.1"
-
-"@vue/reactivity@3.5.16":
-  version "3.5.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/reactivity/-/reactivity-3.5.16.tgz"
-  integrity sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==
-  dependencies:
-    "@vue/shared" "3.5.16"
-
-"@vue/runtime-core@3.5.16":
-  version "3.5.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/runtime-core/-/runtime-core-3.5.16.tgz"
-  integrity sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==
-  dependencies:
-    "@vue/reactivity" "3.5.16"
-    "@vue/shared" "3.5.16"
-
-"@vue/runtime-dom@3.5.16":
-  version "3.5.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz"
-  integrity sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==
-  dependencies:
-    "@vue/reactivity" "3.5.16"
-    "@vue/runtime-core" "3.5.16"
-    "@vue/shared" "3.5.16"
-    csstype "^3.1.3"
-
-"@vue/server-renderer@3.5.16":
-  version "3.5.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/server-renderer/-/server-renderer-3.5.16.tgz"
-  integrity sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==
-  dependencies:
-    "@vue/compiler-ssr" "3.5.16"
-    "@vue/shared" "3.5.16"
-
-"@vue/shared@3.5.16":
-  version "3.5.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/shared/-/shared-3.5.16.tgz"
-  integrity sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==
-
-"@vue/shared@3.5.21":
-  version "3.5.21"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vue/shared/-/shared-3.5.21.tgz"
-  integrity sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==
-
-"@vueup/vue-quill@1.2.0":
-  version "1.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vueup/vue-quill/-/vue-quill-1.2.0.tgz"
-  integrity sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==
-  dependencies:
-    quill "^1.3.7"
-    quill-delta "^4.2.2"
-
-"@vueuse/core@*", "@vueuse/core@^13.3.0":
-  version "13.3.0"
-  resolved "https://registry.npmmirror.com/@vueuse/core/-/core-13.3.0.tgz"
-  integrity sha512-uYRz5oEfebHCoRhK4moXFM3NSCd5vu2XMLOq/Riz5FdqZMy2RvBtazdtL3gEcmDyqkztDe9ZP/zymObMIbiYSg==
-  dependencies:
-    "@types/web-bluetooth" "^0.0.21"
-    "@vueuse/metadata" "13.3.0"
-    "@vueuse/shared" "13.3.0"
-
-"@vueuse/core@^9.1.0":
-  version "9.13.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@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 "*"
-
-"@vueuse/metadata@13.3.0":
-  version "13.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vueuse/metadata/-/metadata-13.3.0.tgz"
-  integrity sha512-42IzJIOYCKIb0Yjv1JfaKpx8JlCiTmtCWrPxt7Ja6Wzoq0h79+YVXmBV03N966KEmDEESTbp5R/qO3AB5BDnGw==
-
-"@vueuse/metadata@9.13.0":
-  version "9.13.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vueuse/metadata/-/metadata-9.13.0.tgz"
-  integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==
-
-"@vueuse/shared@13.3.0":
-  version "13.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vueuse/shared/-/shared-13.3.0.tgz"
-  integrity sha512-L1QKsF0Eg9tiZSFXTgodYnu0Rsa2P0En2LuLrIs/jgrkyiDuJSsPZK+tx+wU0mMsYHUYEjNsuE41uqqkuR8VhA==
-
-"@vueuse/shared@9.13.0":
-  version "9.13.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/@vueuse/shared/-/shared-9.13.0.tgz"
-  integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==
-  dependencies:
-    vue-demi "*"
-
-abbrev@^2.0.0:
-  version "2.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/abbrev/-/abbrev-2.0.0.tgz"
-  integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==
-
-acorn@^8.14.0, acorn@^8.15.0:
-  version "8.15.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/acorn/-/acorn-8.15.0.tgz"
-  integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
-
-ansi-regex@^2.0.0:
-  version "2.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-2.1.1.tgz"
-  integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
-
-ansi-regex@^5.0.1:
-  version "5.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-5.0.1.tgz"
-  integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
-
-ansi-regex@^6.0.1:
-  version "6.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-6.2.0.tgz"
-  integrity sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==
-
-ansi-styles@^2.2.1:
-  version "2.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ansi-styles/-/ansi-styles-2.2.1.tgz"
-  integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==
-
-ansi-styles@^4.0.0, ansi-styles@^4.1.0:
-  version "4.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ansi-styles/-/ansi-styles-4.3.0.tgz"
-  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
-  dependencies:
-    color-convert "^2.0.1"
-
-ansi-styles@^6.1.0:
-  version "6.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ansi-styles/-/ansi-styles-6.2.1.tgz"
-  integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
-
-arr-diff@^4.0.0:
-  version "4.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/arr-diff/-/arr-diff-4.0.0.tgz"
-  integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==
-
-arr-flatten@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/arr-flatten/-/arr-flatten-1.1.0.tgz"
-  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
-
-arr-union@^3.1.0:
-  version "3.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/arr-union/-/arr-union-3.1.0.tgz"
-  integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==
-
-array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz"
-  integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==
-  dependencies:
-    call-bound "^1.0.3"
-    is-array-buffer "^3.0.5"
-
-array-unique@^0.3.2:
-  version "0.3.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/array-unique/-/array-unique-0.3.2.tgz"
-  integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==
-
-arraybuffer.prototype.slice@^1.0.4:
-  version "1.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz"
-  integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==
-  dependencies:
-    array-buffer-byte-length "^1.0.1"
-    call-bind "^1.0.8"
-    define-properties "^1.2.1"
-    es-abstract "^1.23.5"
-    es-errors "^1.3.0"
-    get-intrinsic "^1.2.6"
-    is-array-buffer "^3.0.4"
-
-assign-symbols@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/assign-symbols/-/assign-symbols-1.0.0.tgz"
-  integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
-
-async-function@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/async-function/-/async-function-1.0.0.tgz"
-  integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==
-
-async-validator@^4.2.5:
-  version "4.2.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/async-validator/-/async-validator-4.2.5.tgz"
-  integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
-
-asynckit@^0.4.0:
-  version "0.4.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/asynckit/-/asynckit-0.4.0.tgz"
-  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
-
-atob@^2.1.2:
-  version "2.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/atob/-/atob-2.1.2.tgz"
-  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-
-available-typed-arrays@^1.0.7:
-  version "1.0.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz"
-  integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
-  dependencies:
-    possible-typed-array-names "^1.0.0"
-
-axios@1.9.0:
-  version "1.9.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/axios/-/axios-1.9.0.tgz"
-  integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==
-  dependencies:
-    follow-redirects "^1.15.6"
-    form-data "^4.0.0"
-    proxy-from-env "^1.1.0"
-
-balanced-match@^1.0.0:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-1.0.2.tgz"
-  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-
-base@^0.11.1:
-  version "0.11.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/base/-/base-0.11.2.tgz"
-  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
-  dependencies:
-    cache-base "^1.0.1"
-    class-utils "^0.3.5"
-    component-emitter "^1.2.1"
-    define-property "^1.0.0"
-    isobject "^3.0.1"
-    mixin-deep "^1.2.0"
-    pascalcase "^0.1.1"
-
-big.js@^5.2.2:
-  version "5.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/big.js/-/big.js-5.2.2.tgz"
-  integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
-
-birpc@^2.3.0:
-  version "2.5.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/birpc/-/birpc-2.5.0.tgz"
-  integrity sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==
-
-bluebird@^3.5.0:
-  version "3.7.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/bluebird/-/bluebird-3.7.2.tgz"
-  integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
-
-boolbase@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/boolbase/-/boolbase-1.0.0.tgz"
-  integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
-
-brace-expansion@^2.0.1:
-  version "2.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/brace-expansion/-/brace-expansion-2.0.2.tgz"
-  integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==
-  dependencies:
-    balanced-match "^1.0.0"
-
-braces@^2.2.2:
-  version "2.3.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/braces/-/braces-2.3.2.tgz"
-  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
-  dependencies:
-    arr-flatten "^1.1.0"
-    array-unique "^0.3.2"
-    extend-shallow "^2.0.1"
-    fill-range "^4.0.0"
-    isobject "^3.0.1"
-    repeat-element "^1.1.2"
-    snapdragon "^0.8.1"
-    snapdragon-node "^2.0.1"
-    split-string "^3.0.2"
-    to-regex "^3.0.1"
-
-braces@^3.0.3:
-  version "3.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/braces/-/braces-3.0.3.tgz"
-  integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
-  dependencies:
-    fill-range "^7.1.1"
-
-buffer-builder@^0.2.0:
-  version "0.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/buffer-builder/-/buffer-builder-0.2.0.tgz"
-  integrity sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==
-
-cache-base@^1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/cache-base/-/cache-base-1.0.1.tgz"
-  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
-  dependencies:
-    collection-visit "^1.0.0"
-    component-emitter "^1.2.1"
-    get-value "^2.0.6"
-    has-value "^1.0.0"
-    isobject "^3.0.1"
-    set-value "^2.0.0"
-    to-object-path "^0.3.0"
-    union-value "^1.0.0"
-    unset-value "^1.0.0"
-
-call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz"
-  integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
-  dependencies:
-    es-errors "^1.3.0"
-    function-bind "^1.1.2"
-
-call-bind@^1.0.7, call-bind@^1.0.8:
-  version "1.0.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/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"
-
-call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4:
-  version "1.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/call-bound/-/call-bound-1.0.4.tgz"
-  integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
-  dependencies:
-    call-bind-apply-helpers "^1.0.2"
-    get-intrinsic "^1.3.0"
-
-chalk@^1.1.3:
-  version "1.1.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/chalk/-/chalk-1.1.3.tgz"
-  integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==
-  dependencies:
-    ansi-styles "^2.2.1"
-    escape-string-regexp "^1.0.2"
-    has-ansi "^2.0.0"
-    strip-ansi "^3.0.0"
-    supports-color "^2.0.0"
-
-chalk@^4.1.2:
-  version "4.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/chalk/-/chalk-4.1.2.tgz"
-  integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
-  dependencies:
-    ansi-styles "^4.1.0"
-    supports-color "^7.1.0"
-
-chownr@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.npmmirror.com/chownr/-/chownr-3.0.0.tgz"
-  integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==
-
-class-utils@^0.3.5:
-  version "0.3.6"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/class-utils/-/class-utils-0.3.6.tgz"
-  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
-  dependencies:
-    arr-union "^3.1.0"
-    define-property "^0.2.5"
-    isobject "^3.0.0"
-    static-extend "^0.1.1"
-
-clipboard@2.0.11:
-  version "2.0.11"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/clipboard/-/clipboard-2.0.11.tgz"
-  integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==
-  dependencies:
-    good-listener "^1.2.2"
-    select "^1.1.2"
-    tiny-emitter "^2.0.0"
-
-clone@^2.1.1:
-  version "2.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/clone/-/clone-2.1.2.tgz"
-  integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
-
-collection-visit@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/collection-visit/-/collection-visit-1.0.0.tgz"
-  integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==
-  dependencies:
-    map-visit "^1.0.0"
-    object-visit "^1.0.0"
-
-color-convert@^2.0.1:
-  version "2.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/color-convert/-/color-convert-2.0.1.tgz"
-  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
-  dependencies:
-    color-name "~1.1.4"
-
-color-name@~1.1.4:
-  version "1.1.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/color-name/-/color-name-1.1.4.tgz"
-  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
-colorjs.io@^0.5.0:
-  version "0.5.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/colorjs.io/-/colorjs.io-0.5.2.tgz"
-  integrity sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==
-
-combined-stream@^1.0.8:
-  version "1.0.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/combined-stream/-/combined-stream-1.0.8.tgz"
-  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
-  dependencies:
-    delayed-stream "~1.0.0"
-
-commander@^10.0.0:
-  version "10.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/commander/-/commander-10.0.1.tgz"
-  integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
-
-commander@^7.2.0:
-  version "7.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/commander/-/commander-7.2.0.tgz"
-  integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-
-component-emitter@^1.2.1:
-  version "1.3.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/component-emitter/-/component-emitter-1.3.1.tgz"
-  integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
-
-confbox@^0.1.8:
-  version "0.1.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/confbox/-/confbox-0.1.8.tgz"
-  integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==
-
-confbox@^0.2.2:
-  version "0.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/confbox/-/confbox-0.2.2.tgz"
-  integrity sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==
-
-config-chain@^1.1.13:
-  version "1.1.13"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/config-chain/-/config-chain-1.1.13.tgz"
-  integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
-  dependencies:
-    ini "^1.3.4"
-    proto-list "~1.2.1"
-
-copy-anything@^3.0.2:
-  version "3.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/copy-anything/-/copy-anything-3.0.5.tgz"
-  integrity sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==
-  dependencies:
-    is-what "^4.1.8"
-
-copy-descriptor@^0.1.0:
-  version "0.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/copy-descriptor/-/copy-descriptor-0.1.1.tgz"
-  integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==
-
-cors@^2.8.5:
-  version "2.8.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/cors/-/cors-2.8.5.tgz"
-  integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
-  dependencies:
-    object-assign "^4"
-    vary "^1"
-
-cross-spawn@^7.0.6:
-  version "7.0.6"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/cross-spawn/-/cross-spawn-7.0.6.tgz"
-  integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
-  dependencies:
-    path-key "^3.1.0"
-    shebang-command "^2.0.0"
-    which "^2.0.1"
-
-css-select@^4.1.3:
-  version "4.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/css-select/-/css-select-4.3.0.tgz"
-  integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==
-  dependencies:
-    boolbase "^1.0.0"
-    css-what "^6.0.1"
-    domhandler "^4.3.1"
-    domutils "^2.8.0"
-    nth-check "^2.0.1"
-
-css-tree@^1.1.2, css-tree@^1.1.3:
-  version "1.1.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/css-tree/-/css-tree-1.1.3.tgz"
-  integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
-  dependencies:
-    mdn-data "2.0.14"
-    source-map "^0.6.1"
-
-css-what@^6.0.1:
-  version "6.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/css-what/-/css-what-6.2.2.tgz"
-  integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==
-
-csso@^4.2.0:
-  version "4.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/csso/-/csso-4.2.0.tgz"
-  integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
-  dependencies:
-    css-tree "^1.1.2"
-
-csstype@^3.1.3:
-  version "3.1.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/csstype/-/csstype-3.1.3.tgz"
-  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
-
-data-view-buffer@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/data-view-buffer/-/data-view-buffer-1.0.2.tgz"
-  integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==
-  dependencies:
-    call-bound "^1.0.3"
-    es-errors "^1.3.0"
-    is-data-view "^1.0.2"
-
-data-view-byte-length@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz"
-  integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==
-  dependencies:
-    call-bound "^1.0.3"
-    es-errors "^1.3.0"
-    is-data-view "^1.0.2"
-
-data-view-byte-offset@^1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz"
-  integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==
-  dependencies:
-    call-bound "^1.0.2"
-    es-errors "^1.3.0"
-    is-data-view "^1.0.1"
-
-dayjs@^1.11.13:
-  version "1.11.18"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/dayjs/-/dayjs-1.11.18.tgz"
-  integrity sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==
-
-debug@^2.2.0:
-  version "2.6.9"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/debug/-/debug-2.6.9.tgz"
-  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
-  dependencies:
-    ms "2.0.0"
-
-debug@^2.3.3:
-  version "2.6.9"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/debug/-/debug-2.6.9.tgz"
-  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
-  dependencies:
-    ms "2.0.0"
-
-debug@^4.3.3:
-  version "4.4.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/debug/-/debug-4.4.1.tgz"
-  integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
-  dependencies:
-    ms "^2.1.3"
-
-decode-uri-component@^0.2.0:
-  version "0.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/decode-uri-component/-/decode-uri-component-0.2.2.tgz"
-  integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
-
-define-data-property@^1.0.1, define-data-property@^1.1.4:
-  version "1.1.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/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"
-
-define-properties@^1.2.1:
-  version "1.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/define-properties/-/define-properties-1.2.1.tgz"
-  integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
-  dependencies:
-    define-data-property "^1.0.1"
-    has-property-descriptors "^1.0.0"
-    object-keys "^1.1.1"
-
-define-property@^0.2.5:
-  version "0.2.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/define-property/-/define-property-0.2.5.tgz"
-  integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==
-  dependencies:
-    is-descriptor "^0.1.0"
-
-define-property@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/define-property/-/define-property-1.0.0.tgz"
-  integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==
-  dependencies:
-    is-descriptor "^1.0.0"
-
-define-property@^2.0.2:
-  version "2.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/define-property/-/define-property-2.0.2.tgz"
-  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
-  dependencies:
-    is-descriptor "^1.0.2"
-    isobject "^3.0.1"
-
-delayed-stream@~1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/delayed-stream/-/delayed-stream-1.0.0.tgz"
-  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
-
-delegate@^3.1.2:
-  version "3.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/delegate/-/delegate-3.2.0.tgz"
-  integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==
-
-detect-libc@^2.0.3, detect-libc@^2.0.4:
-  version "2.1.1"
-  resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.1.tgz"
-  integrity sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==
-
-dom-serializer@^1.0.1:
-  version "1.4.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/dom-serializer/-/dom-serializer-1.4.1.tgz"
-  integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==
-  dependencies:
-    domelementtype "^2.0.1"
-    domhandler "^4.2.0"
-    entities "^2.0.0"
-
-dom-serializer@0:
-  version "0.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/dom-serializer/-/dom-serializer-0.2.2.tgz"
-  integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
-  dependencies:
-    domelementtype "^2.0.1"
-    entities "^2.0.0"
-
-domelementtype@^1.3.1, domelementtype@1:
-  version "1.3.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/domelementtype/-/domelementtype-1.3.1.tgz"
-  integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
-
-domelementtype@^2.0.1, domelementtype@^2.2.0:
-  version "2.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/domelementtype/-/domelementtype-2.3.0.tgz"
-  integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
-
-domhandler@^2.3.0:
-  version "2.4.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/domhandler/-/domhandler-2.4.2.tgz"
-  integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
-  dependencies:
-    domelementtype "1"
-
-domhandler@^4.2.0, domhandler@^4.3.1:
-  version "4.3.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/domhandler/-/domhandler-4.3.1.tgz"
-  integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
-  dependencies:
-    domelementtype "^2.2.0"
-
-domutils@^1.5.1:
-  version "1.7.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/domutils/-/domutils-1.7.0.tgz"
-  integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
-  dependencies:
-    dom-serializer "0"
-    domelementtype "1"
-
-domutils@^2.8.0:
-  version "2.8.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/domutils/-/domutils-2.8.0.tgz"
-  integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
-  dependencies:
-    dom-serializer "^1.0.1"
-    domelementtype "^2.2.0"
-    domhandler "^4.2.0"
-
-dunder-proto@^1.0.0, dunder-proto@^1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/dunder-proto/-/dunder-proto-1.0.1.tgz"
-  integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
-  dependencies:
-    call-bind-apply-helpers "^1.0.1"
-    es-errors "^1.3.0"
-    gopd "^1.2.0"
-
-eastasianwidth@^0.2.0:
-  version "0.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/eastasianwidth/-/eastasianwidth-0.2.0.tgz"
-  integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
-
-echarts@5.6.0:
-  version "5.6.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/echarts/-/echarts-5.6.0.tgz"
-  integrity sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==
-  dependencies:
-    tslib "2.3.0"
-    zrender "5.6.1"
-
-editorconfig@^1.0.3:
-  version "1.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/editorconfig/-/editorconfig-1.0.4.tgz"
-  integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==
-  dependencies:
-    "@one-ini/wasm" "0.1.1"
-    commander "^10.0.0"
-    minimatch "9.0.1"
-    semver "^7.5.3"
-
-element-plus@2.10.7:
-  version "2.10.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/element-plus/-/element-plus-2.10.7.tgz"
-  integrity sha512-bL4yhepL8/0NEQA5+N2Q6ZVKLipIDkiQjK2mqtSmGh6CxJk1yaBMdG5HXfYkbk1htNcT3ULk9g23lzT323JGcA==
-  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"
-
-emoji-regex@^8.0.0:
-  version "8.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/emoji-regex/-/emoji-regex-8.0.0.tgz"
-  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-
-emoji-regex@^9.2.2:
-  version "9.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/emoji-regex/-/emoji-regex-9.2.2.tgz"
-  integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
-
-emojis-list@^3.0.0:
-  version "3.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/emojis-list/-/emojis-list-3.0.0.tgz"
-  integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
-
-enhanced-resolve@^5.18.3:
-  version "5.18.3"
-  resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz"
-  integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==
-  dependencies:
-    graceful-fs "^4.2.4"
-    tapable "^2.2.0"
-
-entities@^1.1.1:
-  version "1.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/entities/-/entities-1.1.2.tgz"
-  integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
-
-entities@^2.0.0:
-  version "2.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/entities/-/entities-2.2.0.tgz"
-  integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
-
-entities@^4.5.0:
-  version "4.5.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/entities/-/entities-4.5.0.tgz"
-  integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
-
-es-abstract@^1.23.5, es-abstract@^1.23.9:
-  version "1.24.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/es-abstract/-/es-abstract-1.24.0.tgz"
-  integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==
-  dependencies:
-    array-buffer-byte-length "^1.0.2"
-    arraybuffer.prototype.slice "^1.0.4"
-    available-typed-arrays "^1.0.7"
-    call-bind "^1.0.8"
-    call-bound "^1.0.4"
-    data-view-buffer "^1.0.2"
-    data-view-byte-length "^1.0.2"
-    data-view-byte-offset "^1.0.1"
-    es-define-property "^1.0.1"
-    es-errors "^1.3.0"
-    es-object-atoms "^1.1.1"
-    es-set-tostringtag "^2.1.0"
-    es-to-primitive "^1.3.0"
-    function.prototype.name "^1.1.8"
-    get-intrinsic "^1.3.0"
-    get-proto "^1.0.1"
-    get-symbol-description "^1.1.0"
-    globalthis "^1.0.4"
-    gopd "^1.2.0"
-    has-property-descriptors "^1.0.2"
-    has-proto "^1.2.0"
-    has-symbols "^1.1.0"
-    hasown "^2.0.2"
-    internal-slot "^1.1.0"
-    is-array-buffer "^3.0.5"
-    is-callable "^1.2.7"
-    is-data-view "^1.0.2"
-    is-negative-zero "^2.0.3"
-    is-regex "^1.2.1"
-    is-set "^2.0.3"
-    is-shared-array-buffer "^1.0.4"
-    is-string "^1.1.1"
-    is-typed-array "^1.1.15"
-    is-weakref "^1.1.1"
-    math-intrinsics "^1.1.0"
-    object-inspect "^1.13.4"
-    object-keys "^1.1.1"
-    object.assign "^4.1.7"
-    own-keys "^1.0.1"
-    regexp.prototype.flags "^1.5.4"
-    safe-array-concat "^1.1.3"
-    safe-push-apply "^1.0.0"
-    safe-regex-test "^1.1.0"
-    set-proto "^1.0.0"
-    stop-iteration-iterator "^1.1.0"
-    string.prototype.trim "^1.2.10"
-    string.prototype.trimend "^1.0.9"
-    string.prototype.trimstart "^1.0.8"
-    typed-array-buffer "^1.0.3"
-    typed-array-byte-length "^1.0.3"
-    typed-array-byte-offset "^1.0.4"
-    typed-array-length "^1.0.7"
-    unbox-primitive "^1.1.0"
-    which-typed-array "^1.1.19"
-
-es-define-property@^1.0.0, es-define-property@^1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/es-define-property/-/es-define-property-1.0.1.tgz"
-  integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
-
-es-errors@^1.3.0:
-  version "1.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/es-errors/-/es-errors-1.3.0.tgz"
-  integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
-
-es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
-  version "1.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/es-object-atoms/-/es-object-atoms-1.1.1.tgz"
-  integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
-  dependencies:
-    es-errors "^1.3.0"
-
-es-set-tostringtag@^2.1.0:
-  version "2.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz"
-  integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
-  dependencies:
-    es-errors "^1.3.0"
-    get-intrinsic "^1.2.6"
-    has-tostringtag "^1.0.2"
-    hasown "^2.0.2"
-
-es-to-primitive@^1.3.0:
-  version "1.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/es-to-primitive/-/es-to-primitive-1.3.0.tgz"
-  integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==
-  dependencies:
-    is-callable "^1.2.7"
-    is-date-object "^1.0.5"
-    is-symbol "^1.0.4"
-
-esbuild@^0.25.0:
-  version "0.25.9"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/esbuild/-/esbuild-0.25.9.tgz"
-  integrity sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==
-  optionalDependencies:
-    "@esbuild/aix-ppc64" "0.25.9"
-    "@esbuild/android-arm" "0.25.9"
-    "@esbuild/android-arm64" "0.25.9"
-    "@esbuild/android-x64" "0.25.9"
-    "@esbuild/darwin-arm64" "0.25.9"
-    "@esbuild/darwin-x64" "0.25.9"
-    "@esbuild/freebsd-arm64" "0.25.9"
-    "@esbuild/freebsd-x64" "0.25.9"
-    "@esbuild/linux-arm" "0.25.9"
-    "@esbuild/linux-arm64" "0.25.9"
-    "@esbuild/linux-ia32" "0.25.9"
-    "@esbuild/linux-loong64" "0.25.9"
-    "@esbuild/linux-mips64el" "0.25.9"
-    "@esbuild/linux-ppc64" "0.25.9"
-    "@esbuild/linux-riscv64" "0.25.9"
-    "@esbuild/linux-s390x" "0.25.9"
-    "@esbuild/linux-x64" "0.25.9"
-    "@esbuild/netbsd-arm64" "0.25.9"
-    "@esbuild/netbsd-x64" "0.25.9"
-    "@esbuild/openbsd-arm64" "0.25.9"
-    "@esbuild/openbsd-x64" "0.25.9"
-    "@esbuild/openharmony-arm64" "0.25.9"
-    "@esbuild/sunos-x64" "0.25.9"
-    "@esbuild/win32-arm64" "0.25.9"
-    "@esbuild/win32-ia32" "0.25.9"
-    "@esbuild/win32-x64" "0.25.9"
-
-escape-html@^1.0.3:
-  version "1.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/escape-html/-/escape-html-1.0.3.tgz"
-  integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
-
-escape-string-regexp@^1.0.2:
-  version "1.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
-  integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
-
-escape-string-regexp@^5.0.0:
-  version "5.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz"
-  integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==
-
-escape-string-regexp@1.0.5:
-  version "1.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
-  integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
-
-estree-walker@^2.0.2:
-  version "2.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/estree-walker/-/estree-walker-2.0.2.tgz"
-  integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
-
-estree-walker@^3.0.3:
-  version "3.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/estree-walker/-/estree-walker-3.0.3.tgz"
-  integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==
-  dependencies:
-    "@types/estree" "^1.0.0"
-
-etag@^1.8.1:
-  version "1.8.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/etag/-/etag-1.8.1.tgz"
-  integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
-
-eventemitter3@^5.0.1:
-  version "5.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/eventemitter3/-/eventemitter3-5.0.1.tgz"
-  integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
-
-expand-brackets@^2.1.4:
-  version "2.1.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/expand-brackets/-/expand-brackets-2.1.4.tgz"
-  integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==
-  dependencies:
-    debug "^2.3.3"
-    define-property "^0.2.5"
-    extend-shallow "^2.0.1"
-    posix-character-classes "^0.1.0"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.1"
-
-exsolve@^1.0.7:
-  version "1.0.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/exsolve/-/exsolve-1.0.7.tgz"
-  integrity sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==
-
-extend-shallow@^2.0.1:
-  version "2.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/extend-shallow/-/extend-shallow-2.0.1.tgz"
-  integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==
-  dependencies:
-    is-extendable "^0.1.0"
-
-extend-shallow@^3.0.0:
-  version "3.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/extend-shallow/-/extend-shallow-3.0.2.tgz"
-  integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==
-  dependencies:
-    assign-symbols "^1.0.0"
-    is-extendable "^1.0.1"
-
-extend-shallow@^3.0.2:
-  version "3.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/extend-shallow/-/extend-shallow-3.0.2.tgz"
-  integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==
-  dependencies:
-    assign-symbols "^1.0.0"
-    is-extendable "^1.0.1"
-
-extglob@^2.0.2:
-  version "2.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/extglob/-/extglob-2.0.4.tgz"
-  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
-  dependencies:
-    array-unique "^0.3.2"
-    define-property "^1.0.0"
-    expand-brackets "^2.1.4"
-    extend-shallow "^2.0.1"
-    fragment-cache "^0.2.1"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.1"
-
-fast-diff@^1.3.0:
-  version "1.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fast-diff/-/fast-diff-1.3.0.tgz"
-  integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
-
-fast-diff@1.2.0:
-  version "1.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fast-diff/-/fast-diff-1.2.0.tgz"
-  integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
-
-fast-glob@^3.3.2, fast-glob@^3.3.3:
-  version "3.3.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fast-glob/-/fast-glob-3.3.3.tgz"
-  integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
-  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.8"
-
-fastq@^1.6.0:
-  version "1.19.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fastq/-/fastq-1.19.1.tgz"
-  integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==
-  dependencies:
-    reusify "^1.0.4"
-
-fdir@^6.4.4:
-  version "6.5.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fdir/-/fdir-6.5.0.tgz"
-  integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
-
-file-saver@2.0.5:
-  version "2.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/file-saver/-/file-saver-2.0.5.tgz"
-  integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==
-
-fill-range@^4.0.0:
-  version "4.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fill-range/-/fill-range-4.0.0.tgz"
-  integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==
-  dependencies:
-    extend-shallow "^2.0.1"
-    is-number "^3.0.0"
-    repeat-string "^1.6.1"
-    to-regex-range "^2.1.0"
-
-fill-range@^7.1.1:
-  version "7.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fill-range/-/fill-range-7.1.1.tgz"
-  integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
-  dependencies:
-    to-regex-range "^5.0.1"
-
-follow-redirects@^1.15.6:
-  version "1.15.11"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/follow-redirects/-/follow-redirects-1.15.11.tgz"
-  integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==
-
-for-each@^0.3.3, for-each@^0.3.5:
-  version "0.3.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/for-each/-/for-each-0.3.5.tgz"
-  integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==
-  dependencies:
-    is-callable "^1.2.7"
-
-for-in@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/for-in/-/for-in-1.0.2.tgz"
-  integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
-
-foreground-child@^3.1.0:
-  version "3.3.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/foreground-child/-/foreground-child-3.3.1.tgz"
-  integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==
-  dependencies:
-    cross-spawn "^7.0.6"
-    signal-exit "^4.0.1"
-
-form-data@^4.0.0:
-  version "4.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/form-data/-/form-data-4.0.4.tgz"
-  integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==
-  dependencies:
-    asynckit "^0.4.0"
-    combined-stream "^1.0.8"
-    es-set-tostringtag "^2.1.0"
-    hasown "^2.0.2"
-    mime-types "^2.1.12"
-
-fragment-cache@^0.2.1:
-  version "0.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fragment-cache/-/fragment-cache-0.2.1.tgz"
-  integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==
-  dependencies:
-    map-cache "^0.2.2"
-
-fs-extra@^10.0.0:
-  version "10.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.1.0.tgz"
-  integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
-  dependencies:
-    graceful-fs "^4.2.0"
-    jsonfile "^6.0.1"
-    universalify "^2.0.0"
-
-fsevents@~2.3.2, fsevents@~2.3.3:
-  version "2.3.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fsevents/-/fsevents-2.3.3.tgz"
-  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-
-function-bind@^1.1.2:
-  version "1.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/function-bind/-/function-bind-1.1.2.tgz"
-  integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
-
-function.prototype.name@^1.1.6, function.prototype.name@^1.1.8:
-  version "1.1.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/function.prototype.name/-/function.prototype.name-1.1.8.tgz"
-  integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==
-  dependencies:
-    call-bind "^1.0.8"
-    call-bound "^1.0.3"
-    define-properties "^1.2.1"
-    functions-have-names "^1.2.3"
-    hasown "^2.0.2"
-    is-callable "^1.2.7"
-
-functions-have-names@^1.2.3:
-  version "1.2.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/functions-have-names/-/functions-have-names-1.2.3.tgz"
-  integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
-
-fuse.js@6.6.2:
-  version "6.6.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/fuse.js/-/fuse.js-6.6.2.tgz"
-  integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==
-
-get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0:
-  version "1.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/get-intrinsic/-/get-intrinsic-1.3.0.tgz"
-  integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
-  dependencies:
-    call-bind-apply-helpers "^1.0.2"
-    es-define-property "^1.0.1"
-    es-errors "^1.3.0"
-    es-object-atoms "^1.1.1"
-    function-bind "^1.1.2"
-    get-proto "^1.0.1"
-    gopd "^1.2.0"
-    has-symbols "^1.1.0"
-    hasown "^2.0.2"
-    math-intrinsics "^1.1.0"
-
-get-proto@^1.0.0, get-proto@^1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/get-proto/-/get-proto-1.0.1.tgz"
-  integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
-  dependencies:
-    dunder-proto "^1.0.1"
-    es-object-atoms "^1.0.0"
-
-get-symbol-description@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/get-symbol-description/-/get-symbol-description-1.1.0.tgz"
-  integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==
-  dependencies:
-    call-bound "^1.0.3"
-    es-errors "^1.3.0"
-    get-intrinsic "^1.2.6"
-
-get-value@^2.0.3, get-value@^2.0.6:
-  version "2.0.6"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/get-value/-/get-value-2.0.6.tgz"
-  integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==
-
-glob-parent@^5.1.2:
-  version "5.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/glob-parent/-/glob-parent-5.1.2.tgz"
-  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
-  dependencies:
-    is-glob "^4.0.1"
-
-glob@^10.3.3:
-  version "10.4.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/glob/-/glob-10.4.5.tgz"
-  integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
-  dependencies:
-    foreground-child "^3.1.0"
-    jackspeak "^3.1.2"
-    minimatch "^9.0.4"
-    minipass "^7.1.2"
-    package-json-from-dist "^1.0.0"
-    path-scurry "^1.11.1"
-
-globalthis@^1.0.4:
-  version "1.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/globalthis/-/globalthis-1.0.4.tgz"
-  integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
-  dependencies:
-    define-properties "^1.2.1"
-    gopd "^1.0.1"
-
-good-listener@^1.2.2:
-  version "1.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/good-listener/-/good-listener-1.2.2.tgz"
-  integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==
-  dependencies:
-    delegate "^3.1.2"
-
-gopd@^1.0.1, gopd@^1.2.0:
-  version "1.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/gopd/-/gopd-1.2.0.tgz"
-  integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
-
-graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
-  version "4.2.11"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.2.11.tgz"
-  integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
-
-has-ansi@^2.0.0:
-  version "2.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-ansi/-/has-ansi-2.0.0.tgz"
-  integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==
-  dependencies:
-    ansi-regex "^2.0.0"
-
-has-bigints@^1.0.2:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-bigints/-/has-bigints-1.1.0.tgz"
-  integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==
-
-has-flag@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-flag/-/has-flag-1.0.0.tgz"
-  integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==
-
-has-flag@^4.0.0:
-  version "4.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-flag/-/has-flag-4.0.0.tgz"
-  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-
-has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz"
-  integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
-  dependencies:
-    es-define-property "^1.0.0"
-
-has-proto@^1.2.0:
-  version "1.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-proto/-/has-proto-1.2.0.tgz"
-  integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==
-  dependencies:
-    dunder-proto "^1.0.0"
-
-has-symbols@^1.0.3, has-symbols@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-symbols/-/has-symbols-1.1.0.tgz"
-  integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
-
-has-tostringtag@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-tostringtag/-/has-tostringtag-1.0.2.tgz"
-  integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
-  dependencies:
-    has-symbols "^1.0.3"
-
-has-value@^0.3.1:
-  version "0.3.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-value/-/has-value-0.3.1.tgz"
-  integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==
-  dependencies:
-    get-value "^2.0.3"
-    has-values "^0.1.4"
-    isobject "^2.0.0"
-
-has-value@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-value/-/has-value-1.0.0.tgz"
-  integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==
-  dependencies:
-    get-value "^2.0.6"
-    has-values "^1.0.0"
-    isobject "^3.0.0"
-
-has-values@^0.1.4:
-  version "0.1.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-values/-/has-values-0.1.4.tgz"
-  integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==
-
-has-values@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/has-values/-/has-values-1.0.0.tgz"
-  integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==
-  dependencies:
-    is-number "^3.0.0"
-    kind-of "^4.0.0"
-
-hasown@^2.0.0, hasown@^2.0.2:
-  version "2.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/hasown/-/hasown-2.0.2.tgz"
-  integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
-  dependencies:
-    function-bind "^1.1.2"
-
-he@^1.1.1:
-  version "1.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/he/-/he-1.2.0.tgz"
-  integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-
-hookable@^5.5.3:
-  version "5.5.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/hookable/-/hookable-5.5.3.tgz"
-  integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==
-
-htmlparser2@^3.8.3:
-  version "3.10.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/htmlparser2/-/htmlparser2-3.10.1.tgz"
-  integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
-  dependencies:
-    domelementtype "^1.3.1"
-    domhandler "^2.3.0"
-    domutils "^1.5.1"
-    entities "^1.1.1"
-    inherits "^2.0.1"
-    readable-stream "^3.1.1"
-
-image-size@^0.5.1:
-  version "0.5.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/image-size/-/image-size-0.5.5.tgz"
-  integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
-
-immutable@^5.0.2:
-  version "5.1.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/immutable/-/immutable-5.1.3.tgz"
-  integrity sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==
-
-inherits@^2.0.1, inherits@^2.0.3:
-  version "2.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/inherits/-/inherits-2.0.4.tgz"
-  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-ini@^1.3.4:
-  version "1.3.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ini/-/ini-1.3.8.tgz"
-  integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
-internal-slot@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/internal-slot/-/internal-slot-1.1.0.tgz"
-  integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==
-  dependencies:
-    es-errors "^1.3.0"
-    hasown "^2.0.2"
-    side-channel "^1.1.0"
-
-is-accessor-descriptor@^1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz"
-  integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==
-  dependencies:
-    hasown "^2.0.0"
-
-is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
-  version "3.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-array-buffer/-/is-array-buffer-3.0.5.tgz"
-  integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==
-  dependencies:
-    call-bind "^1.0.8"
-    call-bound "^1.0.3"
-    get-intrinsic "^1.2.6"
-
-is-async-function@^2.0.0:
-  version "2.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-async-function/-/is-async-function-2.1.1.tgz"
-  integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==
-  dependencies:
-    async-function "^1.0.0"
-    call-bound "^1.0.3"
-    get-proto "^1.0.1"
-    has-tostringtag "^1.0.2"
-    safe-regex-test "^1.1.0"
-
-is-bigint@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-bigint/-/is-bigint-1.1.0.tgz"
-  integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==
-  dependencies:
-    has-bigints "^1.0.2"
-
-is-boolean-object@^1.2.1:
-  version "1.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-boolean-object/-/is-boolean-object-1.2.2.tgz"
-  integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==
-  dependencies:
-    call-bound "^1.0.3"
-    has-tostringtag "^1.0.2"
-
-is-buffer@^1.1.5:
-  version "1.1.6"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-buffer/-/is-buffer-1.1.6.tgz"
-  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-
-is-callable@^1.2.7:
-  version "1.2.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-callable/-/is-callable-1.2.7.tgz"
-  integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
-
-is-data-descriptor@^1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz"
-  integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==
-  dependencies:
-    hasown "^2.0.0"
-
-is-data-view@^1.0.1, is-data-view@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-data-view/-/is-data-view-1.0.2.tgz"
-  integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==
-  dependencies:
-    call-bound "^1.0.2"
-    get-intrinsic "^1.2.6"
-    is-typed-array "^1.1.13"
-
-is-date-object@^1.0.5, is-date-object@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-date-object/-/is-date-object-1.1.0.tgz"
-  integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==
-  dependencies:
-    call-bound "^1.0.2"
-    has-tostringtag "^1.0.2"
-
-is-descriptor@^0.1.0:
-  version "0.1.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-descriptor/-/is-descriptor-0.1.7.tgz"
-  integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==
-  dependencies:
-    is-accessor-descriptor "^1.0.1"
-    is-data-descriptor "^1.0.1"
-
-is-descriptor@^1.0.0, is-descriptor@^1.0.2:
-  version "1.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-descriptor/-/is-descriptor-1.0.3.tgz"
-  integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==
-  dependencies:
-    is-accessor-descriptor "^1.0.1"
-    is-data-descriptor "^1.0.1"
-
-is-extendable@^0.1.0, is-extendable@^0.1.1:
-  version "0.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-extendable/-/is-extendable-0.1.1.tgz"
-  integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
-
-is-extendable@^1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-extendable/-/is-extendable-1.0.1.tgz"
-  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
-  dependencies:
-    is-plain-object "^2.0.4"
-
-is-extglob@^2.1.1:
-  version "2.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz"
-  integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
-
-is-finalizationregistry@^1.1.0:
-  version "1.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz"
-  integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==
-  dependencies:
-    call-bound "^1.0.3"
-
-is-fullwidth-code-point@^3.0.0:
-  version "3.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
-  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-
-is-generator-function@^1.0.10:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-generator-function/-/is-generator-function-1.1.0.tgz"
-  integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==
-  dependencies:
-    call-bound "^1.0.3"
-    get-proto "^1.0.0"
-    has-tostringtag "^1.0.2"
-    safe-regex-test "^1.1.0"
-
-is-glob@^4.0.1:
-  version "4.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-glob/-/is-glob-4.0.3.tgz"
-  integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
-  dependencies:
-    is-extglob "^2.1.1"
-
-is-map@^2.0.3:
-  version "2.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-map/-/is-map-2.0.3.tgz"
-  integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
-
-is-negative-zero@^2.0.3:
-  version "2.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-negative-zero/-/is-negative-zero-2.0.3.tgz"
-  integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
-
-is-number-object@^1.1.1:
-  version "1.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-number-object/-/is-number-object-1.1.1.tgz"
-  integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==
-  dependencies:
-    call-bound "^1.0.3"
-    has-tostringtag "^1.0.2"
-
-is-number@^3.0.0:
-  version "3.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-number/-/is-number-3.0.0.tgz"
-  integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==
-  dependencies:
-    kind-of "^3.0.2"
-
-is-number@^7.0.0:
-  version "7.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-number/-/is-number-7.0.0.tgz"
-  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-
-is-plain-obj@^1.1:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-plain-obj/-/is-plain-obj-1.1.0.tgz"
-  integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==
-
-is-plain-object@^2.0.3, is-plain-object@^2.0.4:
-  version "2.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-plain-object/-/is-plain-object-2.0.4.tgz"
-  integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
-  dependencies:
-    isobject "^3.0.1"
-
-is-regex@^1.2.1:
-  version "1.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-regex/-/is-regex-1.2.1.tgz"
-  integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==
-  dependencies:
-    call-bound "^1.0.2"
-    gopd "^1.2.0"
-    has-tostringtag "^1.0.2"
-    hasown "^2.0.2"
-
-is-set@^2.0.3:
-  version "2.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-set/-/is-set-2.0.3.tgz"
-  integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
-
-is-shared-array-buffer@^1.0.4:
-  version "1.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz"
-  integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==
-  dependencies:
-    call-bound "^1.0.3"
-
-is-string@^1.1.1:
-  version "1.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-string/-/is-string-1.1.1.tgz"
-  integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==
-  dependencies:
-    call-bound "^1.0.3"
-    has-tostringtag "^1.0.2"
-
-is-symbol@^1.0.4, is-symbol@^1.1.1:
-  version "1.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-symbol/-/is-symbol-1.1.1.tgz"
-  integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==
-  dependencies:
-    call-bound "^1.0.2"
-    has-symbols "^1.1.0"
-    safe-regex-test "^1.1.0"
-
-is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15:
-  version "1.1.15"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-typed-array/-/is-typed-array-1.1.15.tgz"
-  integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==
-  dependencies:
-    which-typed-array "^1.1.16"
-
-is-weakmap@^2.0.2:
-  version "2.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-weakmap/-/is-weakmap-2.0.2.tgz"
-  integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
-
-is-weakref@^1.0.2, is-weakref@^1.1.1:
-  version "1.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-weakref/-/is-weakref-1.1.1.tgz"
-  integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==
-  dependencies:
-    call-bound "^1.0.3"
-
-is-weakset@^2.0.3:
-  version "2.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-weakset/-/is-weakset-2.0.4.tgz"
-  integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==
-  dependencies:
-    call-bound "^1.0.3"
-    get-intrinsic "^1.2.6"
-
-is-what@^4.1.8:
-  version "4.1.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-what/-/is-what-4.1.16.tgz"
-  integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==
-
-is-windows@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/is-windows/-/is-windows-1.0.2.tgz"
-  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
-
-isarray@^2.0.5:
-  version "2.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/isarray/-/isarray-2.0.5.tgz"
-  integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
-
-isarray@1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/isarray/-/isarray-1.0.0.tgz"
-  integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
-
-isexe@^2.0.0:
-  version "2.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/isexe/-/isexe-2.0.0.tgz"
-  integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
-
-isobject@^2.0.0:
-  version "2.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/isobject/-/isobject-2.1.0.tgz"
-  integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
-  dependencies:
-    isarray "1.0.0"
-
-isobject@^2.1.0:
-  version "2.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/isobject/-/isobject-2.1.0.tgz"
-  integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
-  dependencies:
-    isarray "1.0.0"
-
-isobject@^3.0.0:
-  version "3.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz"
-  integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
-
-isobject@^3.0.1:
-  version "3.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz"
-  integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
-
-jackspeak@^3.1.2:
-  version "3.4.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/jackspeak/-/jackspeak-3.4.3.tgz"
-  integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
-  dependencies:
-    "@isaacs/cliui" "^8.0.2"
-  optionalDependencies:
-    "@pkgjs/parseargs" "^0.11.0"
-
-jiti@^2.5.1, jiti@>=1.21.0:
-  version "2.6.1"
-  resolved "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz"
-  integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==
-
-js-base64@^2.1.9:
-  version "2.6.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/js-base64/-/js-base64-2.6.4.tgz"
-  integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
-
-js-beautify@1.14.11:
-  version "1.14.11"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/js-beautify/-/js-beautify-1.14.11.tgz"
-  integrity sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==
-  dependencies:
-    config-chain "^1.1.13"
-    editorconfig "^1.0.3"
-    glob "^10.3.3"
-    nopt "^7.2.0"
-
-js-cookie@3.0.5:
-  version "3.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/js-cookie/-/js-cookie-3.0.5.tgz"
-  integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==
-
-js-tokens@^9.0.1:
-  version "9.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/js-tokens/-/js-tokens-9.0.1.tgz"
-  integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==
-
-jsencrypt@3.3.2:
-  version "3.3.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/jsencrypt/-/jsencrypt-3.3.2.tgz"
-  integrity sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==
-
-json5@^1.0.1:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/json5/-/json5-1.0.2.tgz"
-  integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
-  dependencies:
-    minimist "^1.2.0"
-
-jsonfile@^6.0.1:
-  version "6.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-6.2.0.tgz"
-  integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==
-  dependencies:
-    universalify "^2.0.0"
-  optionalDependencies:
-    graceful-fs "^4.1.6"
-
-kind-of@^3.0.2:
-  version "3.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/kind-of/-/kind-of-3.2.2.tgz"
-  integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^3.0.3:
-  version "3.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/kind-of/-/kind-of-3.2.2.tgz"
-  integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^3.2.0:
-  version "3.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/kind-of/-/kind-of-3.2.2.tgz"
-  integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^4.0.0:
-  version "4.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/kind-of/-/kind-of-4.0.0.tgz"
-  integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^5.0.2:
-  version "5.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/kind-of/-/kind-of-5.1.0.tgz"
-  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
-
-kind-of@^6.0.2:
-  version "6.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/kind-of/-/kind-of-6.0.3.tgz"
-  integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
-
-lightningcss-darwin-x64@1.30.1:
-  version "1.30.1"
-  resolved "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz"
-  integrity sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==
-
-lightningcss@^1.21.0, lightningcss@1.30.1:
-  version "1.30.1"
-  resolved "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.30.1.tgz"
-  integrity sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==
-  dependencies:
-    detect-libc "^2.0.3"
-  optionalDependencies:
-    lightningcss-darwin-arm64 "1.30.1"
-    lightningcss-darwin-x64 "1.30.1"
-    lightningcss-freebsd-x64 "1.30.1"
-    lightningcss-linux-arm-gnueabihf "1.30.1"
-    lightningcss-linux-arm64-gnu "1.30.1"
-    lightningcss-linux-arm64-musl "1.30.1"
-    lightningcss-linux-x64-gnu "1.30.1"
-    lightningcss-linux-x64-musl "1.30.1"
-    lightningcss-win32-arm64-msvc "1.30.1"
-    lightningcss-win32-x64-msvc "1.30.1"
-
-loader-utils@^1.1.0:
-  version "1.4.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/loader-utils/-/loader-utils-1.4.2.tgz"
-  integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==
-  dependencies:
-    big.js "^5.2.2"
-    emojis-list "^3.0.0"
-    json5 "^1.0.1"
-
-local-pkg@^0.5.1:
-  version "0.5.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/local-pkg/-/local-pkg-0.5.1.tgz"
-  integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==
-  dependencies:
-    mlly "^1.7.3"
-    pkg-types "^1.2.1"
-
-local-pkg@^1.0.0:
-  version "1.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/local-pkg/-/local-pkg-1.1.2.tgz"
-  integrity sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==
-  dependencies:
-    mlly "^1.7.4"
-    pkg-types "^2.3.0"
-    quansync "^0.2.11"
-
-lodash-es@*, lodash-es@^4.17.21:
-  version "4.17.21"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/lodash-es/-/lodash-es-4.17.21.tgz"
-  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
-
-lodash-unified@^1.0.2:
-  version "1.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/lodash-unified/-/lodash-unified-1.0.3.tgz"
-  integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==
-
-lodash.clonedeep@^4.5.0:
-  version "4.5.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz"
-  integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
-
-lodash.isequal@^4.5.0:
-  version "4.5.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/lodash.isequal/-/lodash.isequal-4.5.0.tgz"
-  integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
-
-lodash@*, lodash@^4.17.21:
-  version "4.17.21"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz"
-  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-
-lru-cache@^10.2.0:
-  version "10.4.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/lru-cache/-/lru-cache-10.4.3.tgz"
-  integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
-
-magic-string@^0.26.2:
-  version "0.26.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/magic-string/-/magic-string-0.26.7.tgz"
-  integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==
-  dependencies:
-    sourcemap-codec "^1.4.8"
-
-magic-string@^0.30.14, magic-string@^0.30.17, magic-string@^0.30.18:
-  version "0.30.18"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/magic-string/-/magic-string-0.30.18.tgz"
-  integrity sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==
-  dependencies:
-    "@jridgewell/sourcemap-codec" "^1.5.5"
-
-map-cache@^0.2.2:
-  version "0.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/map-cache/-/map-cache-0.2.2.tgz"
-  integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==
-
-map-visit@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/map-visit/-/map-visit-1.0.0.tgz"
-  integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==
-  dependencies:
-    object-visit "^1.0.0"
-
-math-intrinsics@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
-  integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
-
-mdn-data@2.0.14:
-  version "2.0.14"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/mdn-data/-/mdn-data-2.0.14.tgz"
-  integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
-
-memoize-one@^6.0.0:
-  version "6.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/memoize-one/-/memoize-one-6.0.0.tgz"
-  integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
-
-merge-options@1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/merge-options/-/merge-options-1.0.1.tgz"
-  integrity sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==
-  dependencies:
-    is-plain-obj "^1.1"
-
-merge2@^1.3.0:
-  version "1.4.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/merge2/-/merge2-1.4.1.tgz"
-  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-
-micromatch@^4.0.8:
-  version "4.0.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/micromatch/-/micromatch-4.0.8.tgz"
-  integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
-  dependencies:
-    braces "^3.0.3"
-    picomatch "^2.3.1"
-
-micromatch@3.1.0:
-  version "3.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/micromatch/-/micromatch-3.1.0.tgz"
-  integrity sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==
-  dependencies:
-    arr-diff "^4.0.0"
-    array-unique "^0.3.2"
-    braces "^2.2.2"
-    define-property "^1.0.0"
-    extend-shallow "^2.0.1"
-    extglob "^2.0.2"
-    fragment-cache "^0.2.1"
-    kind-of "^5.0.2"
-    nanomatch "^1.2.1"
-    object.pick "^1.3.0"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.1"
-
-mime-db@1.52.0:
-  version "1.52.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/mime-db/-/mime-db-1.52.0.tgz"
-  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-
-mime-types@^2.1.12:
-  version "2.1.35"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/mime-types/-/mime-types-2.1.35.tgz"
-  integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
-  dependencies:
-    mime-db "1.52.0"
-
-minimatch@^9.0.4:
-  version "9.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/minimatch/-/minimatch-9.0.5.tgz"
-  integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
-  dependencies:
-    brace-expansion "^2.0.1"
-
-minimatch@^9.0.5:
-  version "9.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/minimatch/-/minimatch-9.0.5.tgz"
-  integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
-  dependencies:
-    brace-expansion "^2.0.1"
-
-minimatch@9.0.1:
-  version "9.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/minimatch/-/minimatch-9.0.1.tgz"
-  integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==
-  dependencies:
-    brace-expansion "^2.0.1"
-
-minimist@^1.2.0:
-  version "1.2.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/minimist/-/minimist-1.2.8.tgz"
-  integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
-
-"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4, minipass@^7.1.2:
-  version "7.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/minipass/-/minipass-7.1.2.tgz"
-  integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
-
-minizlib@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.npmmirror.com/minizlib/-/minizlib-3.1.0.tgz"
-  integrity sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==
-  dependencies:
-    minipass "^7.1.2"
-
-mitt@^3.0.1:
-  version "3.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/mitt/-/mitt-3.0.1.tgz"
-  integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
-
-mixin-deep@^1.2.0:
-  version "1.3.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/mixin-deep/-/mixin-deep-1.3.2.tgz"
-  integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
-  dependencies:
-    for-in "^1.0.2"
-    is-extendable "^1.0.1"
-
-mlly@^1.7.3, mlly@^1.7.4:
-  version "1.8.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/mlly/-/mlly-1.8.0.tgz"
-  integrity sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==
-  dependencies:
-    acorn "^8.15.0"
-    pathe "^2.0.3"
-    pkg-types "^1.3.1"
-    ufo "^1.6.1"
-
-ms@^2.1.3:
-  version "2.1.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ms/-/ms-2.1.3.tgz"
-  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
-ms@2.0.0:
-  version "2.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ms/-/ms-2.0.0.tgz"
-  integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
-
-nanoid@^3.3.11:
-  version "3.3.11"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/nanoid/-/nanoid-3.3.11.tgz"
-  integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
-
-nanomatch@^1.2.1:
-  version "1.2.13"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/nanomatch/-/nanomatch-1.2.13.tgz"
-  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
-  dependencies:
-    arr-diff "^4.0.0"
-    array-unique "^0.3.2"
-    define-property "^2.0.2"
-    extend-shallow "^3.0.2"
-    fragment-cache "^0.2.1"
-    is-windows "^1.0.2"
-    kind-of "^6.0.2"
-    object.pick "^1.3.0"
-    regex-not "^1.0.0"
-    snapdragon "^0.8.1"
-    to-regex "^3.0.1"
-
-nopt@^7.2.0:
-  version "7.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/nopt/-/nopt-7.2.1.tgz"
-  integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==
-  dependencies:
-    abbrev "^2.0.0"
-
-normalize-wheel-es@^1.2.0:
-  version "1.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz"
-  integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==
-
-nprogress@0.2.0:
-  version "0.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/nprogress/-/nprogress-0.2.0.tgz"
-  integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==
-
-nth-check@^2.0.1:
-  version "2.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/nth-check/-/nth-check-2.1.1.tgz"
-  integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
-  dependencies:
-    boolbase "^1.0.0"
-
-object-assign@^4, object-assign@^4.1.0:
-  version "4.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/object-assign/-/object-assign-4.1.1.tgz"
-  integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
-
-object-copy@^0.1.0:
-  version "0.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/object-copy/-/object-copy-0.1.0.tgz"
-  integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==
-  dependencies:
-    copy-descriptor "^0.1.0"
-    define-property "^0.2.5"
-    kind-of "^3.0.3"
-
-object-inspect@^1.13.3, object-inspect@^1.13.4:
-  version "1.13.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/object-inspect/-/object-inspect-1.13.4.tgz"
-  integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
-
-object-keys@^1.1.1:
-  version "1.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/object-keys/-/object-keys-1.1.1.tgz"
-  integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
-
-object-visit@^1.0.0:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/object-visit/-/object-visit-1.0.1.tgz"
-  integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==
-  dependencies:
-    isobject "^3.0.0"
-
-object.assign@^4.1.7:
-  version "4.1.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/object.assign/-/object.assign-4.1.7.tgz"
-  integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==
-  dependencies:
-    call-bind "^1.0.8"
-    call-bound "^1.0.3"
-    define-properties "^1.2.1"
-    es-object-atoms "^1.0.0"
-    has-symbols "^1.1.0"
-    object-keys "^1.1.1"
-
-object.pick@^1.3.0:
-  version "1.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/object.pick/-/object.pick-1.3.0.tgz"
-  integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==
-  dependencies:
-    isobject "^3.0.1"
-
-own-keys@^1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/own-keys/-/own-keys-1.0.1.tgz"
-  integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==
-  dependencies:
-    get-intrinsic "^1.2.6"
-    object-keys "^1.1.1"
-    safe-push-apply "^1.0.0"
-
-package-json-from-dist@^1.0.0:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz"
-  integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
-
-parchment@^3.0.0:
-  version "3.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/parchment/-/parchment-3.0.0.tgz"
-  integrity sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==
-
-pascalcase@^0.1.1:
-  version "0.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/pascalcase/-/pascalcase-0.1.1.tgz"
-  integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==
-
-path-key@^3.1.0:
-  version "3.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/path-key/-/path-key-3.1.1.tgz"
-  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
-path-scurry@^1.11.1:
-  version "1.11.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/path-scurry/-/path-scurry-1.11.1.tgz"
-  integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
-  dependencies:
-    lru-cache "^10.2.0"
-    minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
-
-pathe@^0.2.0:
-  version "0.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/pathe/-/pathe-0.2.0.tgz"
-  integrity sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==
-
-pathe@^2.0.1, pathe@^2.0.3:
-  version "2.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/pathe/-/pathe-2.0.3.tgz"
-  integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==
-
-perfect-debounce@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/perfect-debounce/-/perfect-debounce-1.0.0.tgz"
-  integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
-
-picocolors@^1.0.0, picocolors@^1.1.1:
-  version "1.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/picocolors/-/picocolors-1.1.1.tgz"
-  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
-
-picomatch@^2.3.1:
-  version "2.3.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz"
-  integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-
-"picomatch@^3 || ^4", picomatch@^4.0.2:
-  version "4.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/picomatch/-/picomatch-4.0.3.tgz"
-  integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
-
-pinia@3.0.2:
-  version "3.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/pinia/-/pinia-3.0.2.tgz"
-  integrity sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==
-  dependencies:
-    "@vue/devtools-api" "^7.7.2"
-
-pkg-types@^1.2.1, pkg-types@^1.3.0, pkg-types@^1.3.1:
-  version "1.3.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/pkg-types/-/pkg-types-1.3.1.tgz"
-  integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==
-  dependencies:
-    confbox "^0.1.8"
-    mlly "^1.7.4"
-    pathe "^2.0.1"
-
-pkg-types@^2.3.0:
-  version "2.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/pkg-types/-/pkg-types-2.3.0.tgz"
-  integrity sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==
-  dependencies:
-    confbox "^0.2.2"
-    exsolve "^1.0.7"
-    pathe "^2.0.3"
-
-posix-character-classes@^0.1.0:
-  version "0.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/posix-character-classes/-/posix-character-classes-0.1.1.tgz"
-  integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==
-
-possible-typed-array-names@^1.0.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz"
-  integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==
-
-postcss-prefix-selector@^1.6.0:
-  version "1.16.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz"
-  integrity sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==
-
-postcss@^5.2.17:
-  version "5.2.18"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/postcss/-/postcss-5.2.18.tgz"
-  integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
-  dependencies:
-    chalk "^1.1.3"
-    js-base64 "^2.1.9"
-    source-map "^0.5.6"
-    supports-color "^3.2.3"
-
-postcss@^8.5.3, postcss@^8.5.6, "postcss@>4 <9":
-  version "8.5.6"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/postcss/-/postcss-8.5.6.tgz"
-  integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
-  dependencies:
-    nanoid "^3.3.11"
-    picocolors "^1.1.1"
-    source-map-js "^1.2.1"
-
-posthtml-parser@^0.2.0, posthtml-parser@^0.2.1:
-  version "0.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/posthtml-parser/-/posthtml-parser-0.2.1.tgz"
-  integrity sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==
-  dependencies:
-    htmlparser2 "^3.8.3"
-    isobject "^2.1.0"
-
-posthtml-rename-id@^1.0:
-  version "1.0.12"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz"
-  integrity sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==
-  dependencies:
-    escape-string-regexp "1.0.5"
-
-posthtml-render@^1.0.5, posthtml-render@^1.0.6:
-  version "1.4.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/posthtml-render/-/posthtml-render-1.4.0.tgz"
-  integrity sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==
-
-posthtml-svg-mode@^1.0.3:
-  version "1.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz"
-  integrity sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==
-  dependencies:
-    merge-options "1.0.1"
-    posthtml "^0.9.2"
-    posthtml-parser "^0.2.1"
-    posthtml-render "^1.0.6"
-
-posthtml@^0.9.2:
-  version "0.9.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/posthtml/-/posthtml-0.9.2.tgz"
-  integrity sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==
-  dependencies:
-    posthtml-parser "^0.2.0"
-    posthtml-render "^1.0.5"
-
-proto-list@~1.2.1:
-  version "1.2.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/proto-list/-/proto-list-1.2.4.tgz"
-  integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
-
-proxy-from-env@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
-  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
-
-quansync@^0.2.11:
-  version "0.2.11"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/quansync/-/quansync-0.2.11.tgz"
-  integrity sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==
-
-query-string@^4.3.2:
-  version "4.3.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/query-string/-/query-string-4.3.4.tgz"
-  integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==
-  dependencies:
-    object-assign "^4.1.0"
-    strict-uri-encode "^1.0.0"
-
-queue-microtask@^1.2.2:
-  version "1.2.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/queue-microtask/-/queue-microtask-1.2.3.tgz"
-  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
-
-quill-delta@^4.2.2:
-  version "4.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/quill-delta/-/quill-delta-4.2.2.tgz"
-  integrity sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==
-  dependencies:
-    fast-diff "1.2.0"
-    lodash.clonedeep "^4.5.0"
-    lodash.isequal "^4.5.0"
-
-quill-delta@^5.1.0:
-  version "5.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/quill-delta/-/quill-delta-5.1.0.tgz"
-  integrity sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==
-  dependencies:
-    fast-diff "^1.3.0"
-    lodash.clonedeep "^4.5.0"
-    lodash.isequal "^4.5.0"
-
-quill@2.0.2:
-  version "2.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/quill/-/quill-2.0.2.tgz"
-  integrity sha512-QfazNrhMakEdRG57IoYFwffUIr04LWJxbS/ZkidRFXYCQt63c1gK6Z7IHUXMx/Vh25WgPBU42oBaNzQ0K1R/xw==
-  dependencies:
-    eventemitter3 "^5.0.1"
-    lodash-es "^4.17.21"
-    parchment "^3.0.0"
-    quill-delta "^5.1.0"
-
-readable-stream@^3.1.1:
-  version "3.6.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-3.6.2.tgz"
-  integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
-  dependencies:
-    inherits "^2.0.3"
-    string_decoder "^1.1.1"
-    util-deprecate "^1.0.1"
-
-reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9:
-  version "1.0.10"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz"
-  integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==
-  dependencies:
-    call-bind "^1.0.8"
-    define-properties "^1.2.1"
-    es-abstract "^1.23.9"
-    es-errors "^1.3.0"
-    es-object-atoms "^1.0.0"
-    get-intrinsic "^1.2.7"
-    get-proto "^1.0.1"
-    which-builtin-type "^1.2.1"
-
-regex-not@^1.0.0, regex-not@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/regex-not/-/regex-not-1.0.2.tgz"
-  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
-  dependencies:
-    extend-shallow "^3.0.2"
-    safe-regex "^1.1.0"
-
-regexp.prototype.flags@^1.5.4:
-  version "1.5.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz"
-  integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==
-  dependencies:
-    call-bind "^1.0.8"
-    define-properties "^1.2.1"
-    es-errors "^1.3.0"
-    get-proto "^1.0.1"
-    gopd "^1.2.0"
-    set-function-name "^2.0.2"
-
-repeat-element@^1.1.2:
-  version "1.1.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/repeat-element/-/repeat-element-1.1.4.tgz"
-  integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
-
-repeat-string@^1.6.1:
-  version "1.6.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/repeat-string/-/repeat-string-1.6.1.tgz"
-  integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
-
-resolve-url@^0.2.1:
-  version "0.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/resolve-url/-/resolve-url-0.2.1.tgz"
-  integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
-
-ret@~0.1.10:
-  version "0.1.15"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ret/-/ret-0.1.15.tgz"
-  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
-
-reusify@^1.0.4:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/reusify/-/reusify-1.1.0.tgz"
-  integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
-
-rfdc@^1.4.1:
-  version "1.4.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/rfdc/-/rfdc-1.4.1.tgz"
-  integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==
-
-rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^4.34.9:
-  version "4.50.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/rollup/-/rollup-4.50.0.tgz"
-  integrity sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==
-  dependencies:
-    "@types/estree" "1.0.8"
-  optionalDependencies:
-    "@rollup/rollup-android-arm-eabi" "4.50.0"
-    "@rollup/rollup-android-arm64" "4.50.0"
-    "@rollup/rollup-darwin-arm64" "4.50.0"
-    "@rollup/rollup-darwin-x64" "4.50.0"
-    "@rollup/rollup-freebsd-arm64" "4.50.0"
-    "@rollup/rollup-freebsd-x64" "4.50.0"
-    "@rollup/rollup-linux-arm-gnueabihf" "4.50.0"
-    "@rollup/rollup-linux-arm-musleabihf" "4.50.0"
-    "@rollup/rollup-linux-arm64-gnu" "4.50.0"
-    "@rollup/rollup-linux-arm64-musl" "4.50.0"
-    "@rollup/rollup-linux-loongarch64-gnu" "4.50.0"
-    "@rollup/rollup-linux-ppc64-gnu" "4.50.0"
-    "@rollup/rollup-linux-riscv64-gnu" "4.50.0"
-    "@rollup/rollup-linux-riscv64-musl" "4.50.0"
-    "@rollup/rollup-linux-s390x-gnu" "4.50.0"
-    "@rollup/rollup-linux-x64-gnu" "4.50.0"
-    "@rollup/rollup-linux-x64-musl" "4.50.0"
-    "@rollup/rollup-openharmony-arm64" "4.50.0"
-    "@rollup/rollup-win32-arm64-msvc" "4.50.0"
-    "@rollup/rollup-win32-ia32-msvc" "4.50.0"
-    "@rollup/rollup-win32-x64-msvc" "4.50.0"
-    fsevents "~2.3.2"
-
-run-parallel@^1.1.9:
-  version "1.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/run-parallel/-/run-parallel-1.2.0.tgz"
-  integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
-  dependencies:
-    queue-microtask "^1.2.2"
-
-rxjs@^7.4.0:
-  version "7.8.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/rxjs/-/rxjs-7.8.2.tgz"
-  integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==
-  dependencies:
-    tslib "^2.1.0"
-
-safe-array-concat@^1.1.3:
-  version "1.1.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/safe-array-concat/-/safe-array-concat-1.1.3.tgz"
-  integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==
-  dependencies:
-    call-bind "^1.0.8"
-    call-bound "^1.0.2"
-    get-intrinsic "^1.2.6"
-    has-symbols "^1.1.0"
-    isarray "^2.0.5"
-
-safe-buffer@~5.2.0:
-  version "5.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/safe-buffer/-/safe-buffer-5.2.1.tgz"
-  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-safe-push-apply@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/safe-push-apply/-/safe-push-apply-1.0.0.tgz"
-  integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==
-  dependencies:
-    es-errors "^1.3.0"
-    isarray "^2.0.5"
-
-safe-regex-test@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/safe-regex-test/-/safe-regex-test-1.1.0.tgz"
-  integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==
-  dependencies:
-    call-bound "^1.0.2"
-    es-errors "^1.3.0"
-    is-regex "^1.2.1"
-
-safe-regex@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/safe-regex/-/safe-regex-1.1.0.tgz"
-  integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==
-  dependencies:
-    ret "~0.1.10"
-
-sass-embedded-darwin-x64@1.89.1:
-  version "1.89.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.89.1.tgz"
-  integrity sha512-Jzuws3NNx4YtDdL2/skP8BvGqMBKn26XINehwLnD2kgbh0+k+vKNWt5JDomvIuZVLsK8zWrMoRkXpk4wuHdqrw==
-
-sass-embedded@*, sass-embedded@1.89.1:
-  version "1.89.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/sass-embedded/-/sass-embedded-1.89.1.tgz"
-  integrity sha512-alvGGlyYdkSXYKOfS/TTxUD0993EYOe3adIPtwCWEg037qe183p2dkYnbaRsCLJFKt+QoyRzhsrbCsK7sbR6MA==
-  dependencies:
-    "@bufbuild/protobuf" "^2.0.0"
-    buffer-builder "^0.2.0"
-    colorjs.io "^0.5.0"
-    immutable "^5.0.2"
-    rxjs "^7.4.0"
-    supports-color "^8.1.1"
-    sync-child-process "^1.0.2"
-    varint "^6.0.0"
-  optionalDependencies:
-    sass-embedded-android-arm "1.89.1"
-    sass-embedded-android-arm64 "1.89.1"
-    sass-embedded-android-riscv64 "1.89.1"
-    sass-embedded-android-x64 "1.89.1"
-    sass-embedded-darwin-arm64 "1.89.1"
-    sass-embedded-darwin-x64 "1.89.1"
-    sass-embedded-linux-arm "1.89.1"
-    sass-embedded-linux-arm64 "1.89.1"
-    sass-embedded-linux-musl-arm "1.89.1"
-    sass-embedded-linux-musl-arm64 "1.89.1"
-    sass-embedded-linux-musl-riscv64 "1.89.1"
-    sass-embedded-linux-musl-x64 "1.89.1"
-    sass-embedded-linux-riscv64 "1.89.1"
-    sass-embedded-linux-x64 "1.89.1"
-    sass-embedded-win32-arm64 "1.89.1"
-    sass-embedded-win32-x64 "1.89.1"
-
-scule@^1.3.0:
-  version "1.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/scule/-/scule-1.3.0.tgz"
-  integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==
-
-select@^1.1.2:
-  version "1.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/select/-/select-1.1.2.tgz"
-  integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==
-
-semver@^7.5.3:
-  version "7.7.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/semver/-/semver-7.7.2.tgz"
-  integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
-
-set-function-length@^1.2.2:
-  version "1.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/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"
-
-set-function-name@^2.0.2:
-  version "2.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/set-function-name/-/set-function-name-2.0.2.tgz"
-  integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
-  dependencies:
-    define-data-property "^1.1.4"
-    es-errors "^1.3.0"
-    functions-have-names "^1.2.3"
-    has-property-descriptors "^1.0.2"
-
-set-proto@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/set-proto/-/set-proto-1.0.0.tgz"
-  integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==
-  dependencies:
-    dunder-proto "^1.0.1"
-    es-errors "^1.3.0"
-    es-object-atoms "^1.0.0"
-
-set-value@^2.0.0, set-value@^2.0.1:
-  version "2.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/set-value/-/set-value-2.0.1.tgz"
-  integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
-  dependencies:
-    extend-shallow "^2.0.1"
-    is-extendable "^0.1.1"
-    is-plain-object "^2.0.3"
-    split-string "^3.0.1"
-
-shebang-command@^2.0.0:
-  version "2.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/shebang-command/-/shebang-command-2.0.0.tgz"
-  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
-  dependencies:
-    shebang-regex "^3.0.0"
-
-shebang-regex@^3.0.0:
-  version "3.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/shebang-regex/-/shebang-regex-3.0.0.tgz"
-  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-side-channel-list@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/side-channel-list/-/side-channel-list-1.0.0.tgz"
-  integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
-  dependencies:
-    es-errors "^1.3.0"
-    object-inspect "^1.13.3"
-
-side-channel-map@^1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/side-channel-map/-/side-channel-map-1.0.1.tgz"
-  integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
-  dependencies:
-    call-bound "^1.0.2"
-    es-errors "^1.3.0"
-    get-intrinsic "^1.2.5"
-    object-inspect "^1.13.3"
-
-side-channel-weakmap@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz"
-  integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
-  dependencies:
-    call-bound "^1.0.2"
-    es-errors "^1.3.0"
-    get-intrinsic "^1.2.5"
-    object-inspect "^1.13.3"
-    side-channel-map "^1.0.1"
-
-side-channel@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/side-channel/-/side-channel-1.1.0.tgz"
-  integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
-  dependencies:
-    es-errors "^1.3.0"
-    object-inspect "^1.13.3"
-    side-channel-list "^1.0.0"
-    side-channel-map "^1.0.1"
-    side-channel-weakmap "^1.0.2"
-
-signal-exit@^4.0.1:
-  version "4.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/signal-exit/-/signal-exit-4.1.0.tgz"
-  integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
-
-snapdragon-node@^2.0.1:
-  version "2.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/snapdragon-node/-/snapdragon-node-2.1.1.tgz"
-  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
-  dependencies:
-    define-property "^1.0.0"
-    isobject "^3.0.0"
-    snapdragon-util "^3.0.1"
-
-snapdragon-util@^3.0.1:
-  version "3.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/snapdragon-util/-/snapdragon-util-3.0.1.tgz"
-  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
-  dependencies:
-    kind-of "^3.2.0"
-
-snapdragon@^0.8.1:
-  version "0.8.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/snapdragon/-/snapdragon-0.8.2.tgz"
-  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
-  dependencies:
-    base "^0.11.1"
-    debug "^2.2.0"
-    define-property "^0.2.5"
-    extend-shallow "^2.0.1"
-    map-cache "^0.2.2"
-    source-map "^0.5.6"
-    source-map-resolve "^0.5.0"
-    use "^3.1.0"
-
-sortablejs@1.14.0:
-  version "1.14.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/sortablejs/-/sortablejs-1.14.0.tgz"
-  integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==
-
-source-map-js@^1.2.1:
-  version "1.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/source-map-js/-/source-map-js-1.2.1.tgz"
-  integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
-
-source-map-resolve@^0.5.0:
-  version "0.5.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/source-map-resolve/-/source-map-resolve-0.5.3.tgz"
-  integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
-  dependencies:
-    atob "^2.1.2"
-    decode-uri-component "^0.2.0"
-    resolve-url "^0.2.1"
-    source-map-url "^0.4.0"
-    urix "^0.1.0"
-
-source-map-url@^0.4.0:
-  version "0.4.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/source-map-url/-/source-map-url-0.4.1.tgz"
-  integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
-
-source-map@^0.5.6:
-  version "0.5.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/source-map/-/source-map-0.5.7.tgz"
-  integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
-
-source-map@^0.6.1:
-  version "0.6.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/source-map/-/source-map-0.6.1.tgz"
-  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-
-sourcemap-codec@^1.4.8:
-  version "1.4.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
-  integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
-
-speakingurl@^14.0.1:
-  version "14.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/speakingurl/-/speakingurl-14.0.1.tgz"
-  integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==
-
-split-string@^3.0.1, split-string@^3.0.2:
-  version "3.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/split-string/-/split-string-3.1.0.tgz"
-  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
-  dependencies:
-    extend-shallow "^3.0.0"
-
-splitpanes@4.0.4:
-  version "4.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/splitpanes/-/splitpanes-4.0.4.tgz"
-  integrity sha512-RbysugZhjbCw5fgplvk3hOXr41stahQDtZhHVkhnnJI6H4wlGDhM2kIpbehy7v92duy9GnMa8zIhHigIV1TWtg==
-
-stable@^0.1.8:
-  version "0.1.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/stable/-/stable-0.1.8.tgz"
-  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
-
-static-extend@^0.1.1:
-  version "0.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/static-extend/-/static-extend-0.1.2.tgz"
-  integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==
-  dependencies:
-    define-property "^0.2.5"
-    object-copy "^0.1.0"
-
-stop-iteration-iterator@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz"
-  integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==
-  dependencies:
-    es-errors "^1.3.0"
-    internal-slot "^1.1.0"
-
-strict-uri-encode@^1.0.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz"
-  integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
-
-string_decoder@^1.1.1:
-  version "1.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/string_decoder/-/string_decoder-1.3.0.tgz"
-  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
-  dependencies:
-    safe-buffer "~5.2.0"
-
-"string-width-cjs@npm:string-width@^4.2.0":
-  version "4.2.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/string-width/-/string-width-4.2.3.tgz"
-  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
-  dependencies:
-    emoji-regex "^8.0.0"
-    is-fullwidth-code-point "^3.0.0"
-    strip-ansi "^6.0.1"
-
-string-width@^4.1.0:
-  version "4.2.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/string-width/-/string-width-4.2.3.tgz"
-  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
-  dependencies:
-    emoji-regex "^8.0.0"
-    is-fullwidth-code-point "^3.0.0"
-    strip-ansi "^6.0.1"
-
-string-width@^5.0.1, string-width@^5.1.2:
-  version "5.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/string-width/-/string-width-5.1.2.tgz"
-  integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
-  dependencies:
-    eastasianwidth "^0.2.0"
-    emoji-regex "^9.2.2"
-    strip-ansi "^7.0.1"
-
-string.prototype.trim@^1.2.10:
-  version "1.2.10"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz"
-  integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==
-  dependencies:
-    call-bind "^1.0.8"
-    call-bound "^1.0.2"
-    define-data-property "^1.1.4"
-    define-properties "^1.2.1"
-    es-abstract "^1.23.5"
-    es-object-atoms "^1.0.0"
-    has-property-descriptors "^1.0.2"
-
-string.prototype.trimend@^1.0.9:
-  version "1.0.9"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz"
-  integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==
-  dependencies:
-    call-bind "^1.0.8"
-    call-bound "^1.0.2"
-    define-properties "^1.2.1"
-    es-object-atoms "^1.0.0"
-
-string.prototype.trimstart@^1.0.8:
-  version "1.0.8"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz"
-  integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
-  dependencies:
-    call-bind "^1.0.7"
-    define-properties "^1.2.1"
-    es-object-atoms "^1.0.0"
-
-"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
-  version "6.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-6.0.1.tgz"
-  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
-  dependencies:
-    ansi-regex "^5.0.1"
-
-strip-ansi@^3.0.0:
-  version "3.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-3.0.1.tgz"
-  integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
-  dependencies:
-    ansi-regex "^2.0.0"
-
-strip-ansi@^6.0.0, strip-ansi@^6.0.1:
-  version "6.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-6.0.1.tgz"
-  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
-  dependencies:
-    ansi-regex "^5.0.1"
-
-strip-ansi@^7.0.1:
-  version "7.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-7.1.0.tgz"
-  integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
-  dependencies:
-    ansi-regex "^6.0.1"
-
-strip-literal@^2.1.1:
-  version "2.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/strip-literal/-/strip-literal-2.1.1.tgz"
-  integrity sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==
-  dependencies:
-    js-tokens "^9.0.1"
-
-superjson@^2.2.2:
-  version "2.2.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/superjson/-/superjson-2.2.2.tgz"
-  integrity sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==
-  dependencies:
-    copy-anything "^3.0.2"
-
-supports-color@^2.0.0:
-  version "2.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/supports-color/-/supports-color-2.0.0.tgz"
-  integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==
-
-supports-color@^3.2.3:
-  version "3.2.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/supports-color/-/supports-color-3.2.3.tgz"
-  integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==
-  dependencies:
-    has-flag "^1.0.0"
-
-supports-color@^7.1.0:
-  version "7.2.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/supports-color/-/supports-color-7.2.0.tgz"
-  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
-  dependencies:
-    has-flag "^4.0.0"
-
-supports-color@^8.1.1:
-  version "8.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/supports-color/-/supports-color-8.1.1.tgz"
-  integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
-  dependencies:
-    has-flag "^4.0.0"
-
-svg-baker@1.7.0:
-  version "1.7.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/svg-baker/-/svg-baker-1.7.0.tgz"
-  integrity sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==
-  dependencies:
-    bluebird "^3.5.0"
-    clone "^2.1.1"
-    he "^1.1.1"
-    image-size "^0.5.1"
-    loader-utils "^1.1.0"
-    merge-options "1.0.1"
-    micromatch "3.1.0"
-    postcss "^5.2.17"
-    postcss-prefix-selector "^1.6.0"
-    posthtml-rename-id "^1.0"
-    posthtml-svg-mode "^1.0.3"
-    query-string "^4.3.2"
-    traverse "^0.6.6"
-
-svgo@^2.8.0:
-  version "2.8.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/svgo/-/svgo-2.8.0.tgz"
-  integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==
-  dependencies:
-    "@trysound/sax" "0.2.0"
-    commander "^7.2.0"
-    css-select "^4.1.3"
-    css-tree "^1.1.3"
-    csso "^4.2.0"
-    picocolors "^1.0.0"
-    stable "^0.1.8"
-
-sync-child-process@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/sync-child-process/-/sync-child-process-1.0.2.tgz"
-  integrity sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==
-  dependencies:
-    sync-message-port "^1.0.0"
-
-sync-message-port@^1.0.0:
-  version "1.1.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/sync-message-port/-/sync-message-port-1.1.3.tgz"
-  integrity sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==
-
-tailwindcss@^4.1.13, tailwindcss@4.1.13:
-  version "4.1.13"
-  resolved "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.1.13.tgz"
-  integrity sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==
-
-tapable@^2.2.0:
-  version "2.2.3"
-  resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.3.tgz"
-  integrity sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==
-
-tar@^7.4.3:
-  version "7.5.1"
-  resolved "https://registry.npmmirror.com/tar/-/tar-7.5.1.tgz"
-  integrity sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==
-  dependencies:
-    "@isaacs/fs-minipass" "^4.0.0"
-    chownr "^3.0.0"
-    minipass "^7.1.2"
-    minizlib "^3.1.0"
-    yallist "^5.0.0"
-
-tiny-emitter@^2.0.0:
-  version "2.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/tiny-emitter/-/tiny-emitter-2.1.0.tgz"
-  integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
-
-tinyglobby@^0.2.13:
-  version "0.2.14"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/tinyglobby/-/tinyglobby-0.2.14.tgz"
-  integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==
-  dependencies:
-    fdir "^6.4.4"
-    picomatch "^4.0.2"
-
-to-object-path@^0.3.0:
-  version "0.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/to-object-path/-/to-object-path-0.3.0.tgz"
-  integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==
-  dependencies:
-    kind-of "^3.0.2"
-
-to-regex-range@^2.1.0:
-  version "2.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-2.1.1.tgz"
-  integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==
-  dependencies:
-    is-number "^3.0.0"
-    repeat-string "^1.6.1"
-
-to-regex-range@^5.0.1:
-  version "5.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-5.0.1.tgz"
-  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
-  dependencies:
-    is-number "^7.0.0"
-
-to-regex@^3.0.1:
-  version "3.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/to-regex/-/to-regex-3.0.2.tgz"
-  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
-  dependencies:
-    define-property "^2.0.2"
-    extend-shallow "^3.0.2"
-    regex-not "^1.0.2"
-    safe-regex "^1.1.0"
-
-traverse@^0.6.6:
-  version "0.6.11"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/traverse/-/traverse-0.6.11.tgz"
-  integrity sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==
-  dependencies:
-    gopd "^1.2.0"
-    typedarray.prototype.slice "^1.0.5"
-    which-typed-array "^1.1.18"
-
-tslib@^2.1.0, tslib@2.3.0:
-  version "2.3.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/tslib/-/tslib-2.3.0.tgz"
-  integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
-
-typed-array-buffer@^1.0.3:
-  version "1.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz"
-  integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==
-  dependencies:
-    call-bound "^1.0.3"
-    es-errors "^1.3.0"
-    is-typed-array "^1.1.14"
-
-typed-array-byte-length@^1.0.3:
-  version "1.0.3"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz"
-  integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==
-  dependencies:
-    call-bind "^1.0.8"
-    for-each "^0.3.3"
-    gopd "^1.2.0"
-    has-proto "^1.2.0"
-    is-typed-array "^1.1.14"
-
-typed-array-byte-offset@^1.0.4:
-  version "1.0.4"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz"
-  integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==
-  dependencies:
-    available-typed-arrays "^1.0.7"
-    call-bind "^1.0.8"
-    for-each "^0.3.3"
-    gopd "^1.2.0"
-    has-proto "^1.2.0"
-    is-typed-array "^1.1.15"
-    reflect.getprototypeof "^1.0.9"
-
-typed-array-length@^1.0.7:
-  version "1.0.7"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/typed-array-length/-/typed-array-length-1.0.7.tgz"
-  integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==
-  dependencies:
-    call-bind "^1.0.7"
-    for-each "^0.3.3"
-    gopd "^1.0.1"
-    is-typed-array "^1.1.13"
-    possible-typed-array-names "^1.0.0"
-    reflect.getprototypeof "^1.0.6"
-
-typedarray.prototype.slice@^1.0.5:
-  version "1.0.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz"
-  integrity sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==
-  dependencies:
-    call-bind "^1.0.8"
-    define-properties "^1.2.1"
-    es-abstract "^1.23.9"
-    es-errors "^1.3.0"
-    get-proto "^1.0.1"
-    math-intrinsics "^1.1.0"
-    typed-array-buffer "^1.0.3"
-    typed-array-byte-offset "^1.0.4"
-
-ufo@^1.6.1:
-  version "1.6.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/ufo/-/ufo-1.6.1.tgz"
-  integrity sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==
-
-unbox-primitive@^1.1.0:
-  version "1.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/unbox-primitive/-/unbox-primitive-1.1.0.tgz"
-  integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==
-  dependencies:
-    call-bound "^1.0.3"
-    has-bigints "^1.0.2"
-    has-symbols "^1.1.0"
-    which-boxed-primitive "^1.1.1"
-
-undici-types@~7.10.0:
-  version "7.10.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/undici-types/-/undici-types-7.10.0.tgz"
-  integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==
-
-unimport@^3.13.4:
-  version "3.14.6"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/unimport/-/unimport-3.14.6.tgz"
-  integrity sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==
-  dependencies:
-    "@rollup/pluginutils" "^5.1.4"
-    acorn "^8.14.0"
-    escape-string-regexp "^5.0.0"
-    estree-walker "^3.0.3"
-    fast-glob "^3.3.3"
-    local-pkg "^1.0.0"
-    magic-string "^0.30.17"
-    mlly "^1.7.4"
-    pathe "^2.0.1"
-    picomatch "^4.0.2"
-    pkg-types "^1.3.0"
-    scule "^1.3.0"
-    strip-literal "^2.1.1"
-    unplugin "^1.16.1"
-
-union-value@^1.0.0:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/union-value/-/union-value-1.0.1.tgz"
-  integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
-  dependencies:
-    arr-union "^3.1.0"
-    get-value "^2.0.6"
-    is-extendable "^0.1.1"
-    set-value "^2.0.1"
-
-universalify@^2.0.0:
-  version "2.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/universalify/-/universalify-2.0.1.tgz"
-  integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
-
-unplugin-auto-import@0.18.6:
-  version "0.18.6"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/unplugin-auto-import/-/unplugin-auto-import-0.18.6.tgz"
-  integrity sha512-LMFzX5DtkTj/3wZuyG5bgKBoJ7WSgzqSGJ8ppDRdlvPh45mx6t6w3OcbExQi53n3xF5MYkNGPNR/HYOL95KL2A==
-  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"
-
-unplugin-vue-setup-extend-plus@1.0.1:
-  version "1.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/unplugin-vue-setup-extend-plus/-/unplugin-vue-setup-extend-plus-1.0.1.tgz"
-  integrity sha512-mW2IzkyJITyspAV/LEdnEyE1CJip9jB5fCeaVv7Q6X0oJyDrOxXoB+jyet0q5pRJNjErbjQx950/8NPTvbqLTQ==
-  dependencies:
-    "@vue/compiler-sfc" "^3.2.37"
-    magic-string "^0.26.2"
-    unplugin "^1.3.1"
-
-unplugin@^1.16.0, unplugin@^1.16.1, unplugin@^1.3.1:
-  version "1.16.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/unplugin/-/unplugin-1.16.1.tgz"
-  integrity sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==
-  dependencies:
-    acorn "^8.14.0"
-    webpack-virtual-modules "^0.6.2"
-
-unset-value@^1.0.0:
-  version "1.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/unset-value/-/unset-value-1.0.0.tgz"
-  integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==
-  dependencies:
-    has-value "^0.3.1"
-    isobject "^3.0.0"
-
-urix@^0.1.0:
-  version "0.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/urix/-/urix-0.1.0.tgz"
-  integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==
-
-use@^3.1.0:
-  version "3.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/use/-/use-3.1.1.tgz"
-  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
-
-util-deprecate@^1.0.1:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/util-deprecate/-/util-deprecate-1.0.2.tgz"
-  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
-
-varint@^6.0.0:
-  version "6.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/varint/-/varint-6.0.0.tgz"
-  integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==
-
-vary@^1:
-  version "1.1.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/vary/-/vary-1.1.2.tgz"
-  integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
-
-vite-plugin-compression@0.5.1:
-  version "0.5.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz"
-  integrity sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==
-  dependencies:
-    chalk "^4.1.2"
-    debug "^4.3.3"
-    fs-extra "^10.0.0"
-
-vite-plugin-svg-icons@2.0.1:
-  version "2.0.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz"
-  integrity sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==
-  dependencies:
-    "@types/svgo" "^2.6.1"
-    cors "^2.8.5"
-    debug "^4.3.3"
-    etag "^1.8.1"
-    fs-extra "^10.0.0"
-    pathe "^0.2.0"
-    svg-baker "1.7.0"
-    svgo "^2.8.0"
-
-"vite@^5.0.0 || ^6.0.0", "vite@^5.2.0 || ^6 || ^7", vite@>=2.0.0, vite@6.3.5:
-  version "6.3.5"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/vite/-/vite-6.3.5.tgz"
-  integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==
-  dependencies:
-    esbuild "^0.25.0"
-    fdir "^6.4.4"
-    picomatch "^4.0.2"
-    postcss "^8.5.3"
-    rollup "^4.34.9"
-    tinyglobby "^0.2.13"
-  optionalDependencies:
-    fsevents "~2.3.3"
-
-vue-cropper@1.1.1:
-  version "1.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/vue-cropper/-/vue-cropper-1.1.1.tgz"
-  integrity sha512-WsqKMpaBf9Osi1LQlE/5AKdD0nHWOy1asLXocaG8NomOWO07jiZi968+/PbMmnD0QbPJOumDQaGuGa13qys85A==
-
-vue-demi@*:
-  version "0.14.10"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/vue-demi/-/vue-demi-0.14.10.tgz"
-  integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
-
-vue-router@4.5.1:
-  version "4.5.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/vue-router/-/vue-router-4.5.1.tgz"
-  integrity sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==
-  dependencies:
-    "@vue/devtools-api" "^6.6.4"
-
-"vue@^2.7.0 || ^3.5.11", "vue@^3.0.0-0 || ^2.6.0", vue@^3.0.1, vue@^3.2.0, vue@^3.2.25, vue@^3.2.41, vue@^3.5.0, vue@3.5.16:
-  version "3.5.16"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/vue/-/vue-3.5.16.tgz"
-  integrity sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==
-  dependencies:
-    "@vue/compiler-dom" "3.5.16"
-    "@vue/compiler-sfc" "3.5.16"
-    "@vue/runtime-dom" "3.5.16"
-    "@vue/server-renderer" "3.5.16"
-    "@vue/shared" "3.5.16"
-
-vuedraggable@4.1.0:
-  version "4.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/vuedraggable/-/vuedraggable-4.1.0.tgz"
-  integrity sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==
-  dependencies:
-    sortablejs "1.14.0"
-
-webpack-virtual-modules@^0.6.2:
-  version "0.6.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz"
-  integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==
-
-which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
-  version "1.1.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz"
-  integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==
-  dependencies:
-    is-bigint "^1.1.0"
-    is-boolean-object "^1.2.1"
-    is-number-object "^1.1.1"
-    is-string "^1.1.1"
-    is-symbol "^1.1.1"
-
-which-builtin-type@^1.2.1:
-  version "1.2.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/which-builtin-type/-/which-builtin-type-1.2.1.tgz"
-  integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==
-  dependencies:
-    call-bound "^1.0.2"
-    function.prototype.name "^1.1.6"
-    has-tostringtag "^1.0.2"
-    is-async-function "^2.0.0"
-    is-date-object "^1.1.0"
-    is-finalizationregistry "^1.1.0"
-    is-generator-function "^1.0.10"
-    is-regex "^1.2.1"
-    is-weakref "^1.0.2"
-    isarray "^2.0.5"
-    which-boxed-primitive "^1.1.0"
-    which-collection "^1.0.2"
-    which-typed-array "^1.1.16"
-
-which-collection@^1.0.2:
-  version "1.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/which-collection/-/which-collection-1.0.2.tgz"
-  integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
-  dependencies:
-    is-map "^2.0.3"
-    is-set "^2.0.3"
-    is-weakmap "^2.0.2"
-    is-weakset "^2.0.3"
-
-which-typed-array@^1.1.16, which-typed-array@^1.1.18, which-typed-array@^1.1.19:
-  version "1.1.19"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/which-typed-array/-/which-typed-array-1.1.19.tgz"
-  integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==
-  dependencies:
-    available-typed-arrays "^1.0.7"
-    call-bind "^1.0.8"
-    call-bound "^1.0.4"
-    for-each "^0.3.5"
-    get-proto "^1.0.1"
-    gopd "^1.2.0"
-    has-tostringtag "^1.0.2"
-
-which@^2.0.1:
-  version "2.0.2"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/which/-/which-2.0.2.tgz"
-  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
-  dependencies:
-    isexe "^2.0.0"
-
-"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
-  version "7.0.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
-  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
-  dependencies:
-    ansi-styles "^4.0.0"
-    string-width "^4.1.0"
-    strip-ansi "^6.0.0"
-
-wrap-ansi@^8.1.0:
-  version "8.1.0"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/wrap-ansi/-/wrap-ansi-8.1.0.tgz"
-  integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
-  dependencies:
-    ansi-styles "^6.1.0"
-    string-width "^5.0.1"
-    strip-ansi "^7.0.1"
-
-yallist@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.npmmirror.com/yallist/-/yallist-5.0.0.tgz"
-  integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==
-
-zrender@5.6.1:
-  version "5.6.1"
-  resolved "https://mirrors.huaweicloud.com/repository/npm/zrender/-/zrender-5.6.1.tgz"
-  integrity sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==
-  dependencies:
-    tslib "2.3.0"

+ 50 - 2
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzAgentController.java

@@ -1,7 +1,16 @@
 package com.ruoyi.web.controller.dz;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.dz.domain.DzSchool;
+import com.ruoyi.dz.service.IDzSchoolService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -22,7 +31,7 @@ import com.ruoyi.common.utils.poi.ExcelUtil;
 
 /**
  * 机构代理Controller
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
@@ -32,6 +41,8 @@ public class DzAgentController extends BaseController
 {
     @Autowired
     private IDzAgentService dzAgentService;
+    @Autowired
+    private IDzSchoolService schoolService;
 
     /**
      * 查询机构代理列表
@@ -41,6 +52,32 @@ public class DzAgentController extends BaseController
     public AjaxResult list(DzAgent dzAgent)
     {
         List<DzAgent> list = dzAgentService.selectDzAgentList(dzAgent);
+        //处理关联学校的显示
+        List<Long> distinctSchoolIds = list.stream()
+                .map(DzAgent::getSchoolIds)
+                .filter(Objects::nonNull)        // 过滤null数组
+                .filter(array -> array.length > 0) // 过滤空数组
+                .flatMap(Arrays::stream).filter(Objects::nonNull)        // 过滤数组中的null元素
+                .distinct()
+                .collect(Collectors.toList());
+        //查询学校名称
+        if (CollectionUtil.isNotEmpty(distinctSchoolIds)){
+            Map<Long, DzSchool> schoolMap = schoolService.selectDzSchoolListByIds(distinctSchoolIds).stream().collect(Collectors.toMap(DzSchool::getId, school -> school));
+            for (DzAgent agent : list) {
+                if (agent.getSchoolIds() != null&&agent.getSchoolIds().length>0) {
+                    String schoolName = Arrays.stream(agent.getSchoolIds())
+                            .filter(Objects::nonNull)  // 过滤null值
+                            .map(schoolId -> schoolMap.get(schoolId))  // 根据ID获取学校对象
+                            .filter(Objects::nonNull)  // 过滤map中不存在的学校
+                            .map(DzSchool::getName)    // 获取学校名称
+                            .filter(name -> name != null && !name.trim().isEmpty())  // 过滤空名称
+                            .collect(Collectors.joining(", "));  // 用逗号连接
+
+                    agent.setSchoolName(schoolName);
+                }
+            }
+        }
+
         return success(list);
     }
 
@@ -75,6 +112,7 @@ public class DzAgentController extends BaseController
     @PostMapping
     public AjaxResult add(@RequestBody DzAgent dzAgent)
     {
+        setSchools(dzAgent);
         return toAjax(dzAgentService.insertDzAgent(dzAgent));
     }
 
@@ -86,15 +124,25 @@ public class DzAgentController extends BaseController
     @PutMapping
     public AjaxResult edit(@RequestBody DzAgent dzAgent)
     {
+        setSchools(dzAgent);
         return toAjax(dzAgentService.updateDzAgent(dzAgent));
     }
 
+    private void setSchools(DzAgent dzAgent){
+        String schools = dzAgent.getSchools();
+        Long[] schoolIds = dzAgent.getSchoolIds();
+        if (null!=schoolIds&&schoolIds.length>0){
+            schools = Arrays.stream(schoolIds).filter(Objects::nonNull).map(String::valueOf) .collect(Collectors.joining(","));
+            dzAgent.setSchools(schools);
+        }
+    }
+
     /**
      * 删除机构代理
      */
     @PreAuthorize("@ss.hasPermi('dz:agent:remove')")
     @Log(title = "机构代理", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{agentIds}")
+    @DeleteMapping("/{agentIds}")
     public AjaxResult remove(@PathVariable Long[] agentIds)
     {
         return toAjax(dzAgentService.deleteDzAgentByAgentIds(agentIds));

+ 21 - 7
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzCardsController.java

@@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.ValidationException;
 
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.enums.ExamType;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.dz.domain.DzAgent;
 import com.ruoyi.dz.service.IDzAgentService;
@@ -47,6 +48,7 @@ public class DzCardsController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('dz:cards:list')")
     @GetMapping("/list")
+    @ApiOperation("列表")
     public TableDataInfo list(DzCards dzCards)
     {
         startPage();
@@ -72,6 +74,7 @@ public class DzCardsController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('dz:cards:query')")
     @GetMapping(value = "/{cardId}")
+    @ApiOperation("详情")
     public AjaxResult getInfo(@PathVariable("cardId") Long cardId)
     {
         return success(dzCardsService.selectDzCardsByCardId(cardId));
@@ -122,7 +125,10 @@ public class DzCardsController extends BaseController
     @Log(title = "分配卡", businessType = BusinessType.INSERT)
     @PostMapping("/assignCard")
     @ApiOperation("分配卡")
-    public AjaxResult assignCard(@ApiParam("代理商") Long agentId, @ApiParam("开始号") String begin, @ApiParam("结束号") String end)
+    public AjaxResult assignCard(@ApiParam("代理商") @RequestParam Long agentId, @ApiParam("开始号") @RequestParam String begin, @ApiParam("结束号") @RequestParam String end,
+                                 @ApiParam("省份") @RequestParam(required = false) String location,
+                                 @ApiParam("考生类型") @RequestParam(required = false) ExamType examType,
+                                 @ApiParam("学校") @RequestParam(required = false) Long schoolId)
     {
         SysUser sysUser = SecurityUtils.getLoginUser().getUser();
         DzAgent agent = agentService.selectDzAgentByAgentId(agentId);
@@ -130,30 +136,38 @@ public class DzCardsController extends BaseController
             if (!sysUser.getUserTypeId().equals(agent.getParentId())) {
                 throw new ValidationException("只能分配给下级代理");
             }
-            dzCardsService.assignCard(sysUser.getUserTypeId(), agentId, begin, end);
+            dzCardsService.assignCard(sysUser.getUserTypeId(), agentId, begin, end, location, examType, schoolId);
         } else if(UserTypeEnum.Institution.equals(sysUser.getUserType())) { // 机构分配卡给自己的下级
             if (!sysUser.getDeptId().equals(agent.getDeptId())) {
                 throw new ValidationException("只能分配给下级代理");
             }
-            dzCardsService.assignCard(agentId, agentId, begin, end);
-        } else { // 平台指定, TODO 暂只支持二级代理
-            dzCardsService.assignCard(agent.getParentId(), agentId, begin, end);
+            dzCardsService.assignCard(null == agent.getParentId() ? agentId : agent.getParentId(), agentId, begin, end, location, examType, schoolId);
+        } else if(null == agent.getParentId()) { // 平台指定, TODO 暂只支持二级代理
+            dzCardsService.assignCard(null == agent.getParentId() ? agentId : agent.getParentId(), agentId, begin, end, location, examType, schoolId);
         }
         return AjaxResult.success();
     }
 
     @Log(title = "直接开卡", businessType = BusinessType.INSERT)
     @PostMapping("/openCard")
-    @ApiOperation("分配卡")
+    @ApiOperation("直接开卡")
     public AjaxResult openCard(@ApiParam("学校") Long schoolId, @ApiParam("开始号") String begin, @ApiParam("结束号") String end)
     {
         Long agentId = 0L;
         return AjaxResult.success(dzCardsService.openCard(schoolId, agentId, begin, end));
     }
 
+    @Log(title = "分配校区", businessType = BusinessType.INSERT)
+    @PostMapping("/changeCampus")
+    @ApiOperation("分配校区")
+    public AjaxResult changeCampus(@ApiParam("校区") Long campusId, @ApiParam("开始号") String begin, @ApiParam("结束号") String end)
+    {
+        return AjaxResult.success(dzCardsService.changeCampus(campusId, begin, end));
+    }
+
     @Log(title = "申请开卡", businessType = BusinessType.INSERT)
     @PostMapping("/requestOpenCard")
-    @ApiOperation("分配卡")
+    @ApiOperation("申请开卡")
     public AjaxResult requestOpenCard(@ApiParam("学校") Long schoolId, @ApiParam("开始号") String begin, @ApiParam("结束号") String end)
     {
         Long agentId = SecurityUtils.getLoginUser().getUser().getUserTypeId();

+ 24 - 0
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzClassesController.java

@@ -1,7 +1,13 @@
 package com.ruoyi.web.controller.dz;
 
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.dz.domain.DzTeacher;
+import com.ruoyi.dz.domain.DzTeacherClass;
+import com.ruoyi.dz.service.IDzTeacherClassService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -33,6 +39,8 @@ public class DzClassesController extends BaseController
 {
     @Autowired
     private IDzClassesService dzClassesService;
+    @Autowired
+    private IDzTeacherClassService teacherClassService;
 
     /**
      * 查询学生班级列表
@@ -46,6 +54,22 @@ public class DzClassesController extends BaseController
         return getDataTable(list);
     }
 
+    @GetMapping("/listAll")
+    public AjaxResult listAll(DzClasses dzClasses)
+    {
+        List<DzClasses> list = dzClassesService.selectDzClassesList(dzClasses);
+//        if (null!=dzClasses.getTeacherId()){
+//            DzTeacherClass query = new DzTeacherClass().setTeacherId(dzClasses.getTeacherId());
+//            Long[] classIds = teacherClassService.selectDzTeacherClassList(query).stream()
+//                    .map(DzTeacherClass::getClassId)
+//                    .filter(Objects::nonNull)
+//                    .distinct() // 去重(如果需要)
+//                    .toArray(Long[]::new);
+//            list.stream().forEach(c->c.setClassIds(classIds));
+//        }
+        return AjaxResult.success(list);
+    }
+
     /**
      * 导出学生班级列表
      */

+ 38 - 1
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzSchoolController.java

@@ -1,7 +1,16 @@
 package com.ruoyi.web.controller.dz;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import javax.servlet.http.HttpServletResponse;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.domain.SysArea;
+import com.ruoyi.system.service.ISysAreaService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -33,6 +42,8 @@ public class DzSchoolController extends BaseController
 {
     @Autowired
     private IDzSchoolService dzSchoolService;
+    @Autowired
+    private ISysAreaService areaService;
 
     /**
      * 查询机构校区列表
@@ -42,7 +53,33 @@ public class DzSchoolController extends BaseController
     public TableDataInfo list(DzSchool dzSchool)
     {
         startPage();
-        List<DzSchool> list = dzSchoolService.selectDzSchoolList(dzSchool);
+        List<DzSchool> list= dzSchoolService.selectDzSchoolList(dzSchool);
+        //处理省市区
+        List<Long> areaIds = list.stream()
+                .flatMap(school -> Stream.of(
+                        school.getPro(),school.getCity(),school.getArea()
+                ))
+                .filter(Objects::nonNull).distinct().collect(Collectors.toList());
+        if (CollectionUtil.isNotEmpty(areaIds)){
+            Map<Long, SysArea> areaMap = areaService.selectSysAreaListByIds(areaIds)
+                    .stream().collect(Collectors.toMap(SysArea::getAreaId,area -> area));
+            list.forEach(school -> {
+                StringBuilder proCityAreaName = new StringBuilder();
+                if (null!=school.getPro()&&areaMap.containsKey(school.getPro())){
+                    proCityAreaName.append(areaMap.get(school.getPro()).getAreaName());
+                }
+                if (null!=school.getCity()&&areaMap.containsKey(school.getCity())){
+                    proCityAreaName.append(areaMap.get(school.getCity()).getAreaName());
+                }
+                if (null!=school.getArea()&&areaMap.containsKey(school.getArea())){
+                    proCityAreaName.append(areaMap.get(school.getArea()).getAreaName());
+                }
+                if (StringUtils.isNotEmpty(proCityAreaName.toString())){
+                    school.setProCityAreaName(proCityAreaName.toString());
+                }
+            });
+        }
+
         return getDataTable(list);
     }
 

+ 70 - 3
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzTeacherClassController.java

@@ -1,7 +1,13 @@
 package com.ruoyi.web.controller.dz;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.enums.BoolValues;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -23,7 +29,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
 
 /**
  * 教师班级关系Controller
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
@@ -46,6 +52,13 @@ public class DzTeacherClassController extends BaseController
         return getDataTable(list);
     }
 
+    @GetMapping("/listAllTeacherClass")
+    public AjaxResult listAllTeacherClass(DzTeacherClass dzTeacherClass)
+    {
+        List<DzTeacherClass> list = dzTeacherClassService.selectDzTeacherClassList(dzTeacherClass);
+        return AjaxResult.success(list);
+    }
+
     /**
      * 导出教师班级关系列表
      */
@@ -73,13 +86,67 @@ public class DzTeacherClassController extends BaseController
      * 新增教师班级关系
      */
     @PreAuthorize("@ss.hasPermi('dz:teacherclass:add')")
-    @Log(title = "教师班级关系", businessType = BusinessType.INSERT)
+    @Log(title = "关联教师班级关系", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody DzTeacherClass dzTeacherClass)
     {
         return toAjax(dzTeacherClassService.insertDzTeacherClass(dzTeacherClass));
     }
 
+    @Log(title = "批量关联教师班级关系", businessType = BusinessType.INSERT)
+    @PostMapping("/batchBindTeacherClass")
+    public AjaxResult batchBindTeacherClass(@RequestBody DzTeacherClass dzTeacherClass)
+    {
+        List<Long> insertClassIds = Arrays.stream(dzTeacherClass.getClassIds()).collect(Collectors.toList());
+
+        DzTeacherClass cond = new DzTeacherClass().setTeacherId(dzTeacherClass.getTeacherId());
+        List<DzTeacherClass> alreadyList = dzTeacherClassService.selectDzTeacherClassList(cond);
+        List<Long> dbClassIds = alreadyList.stream().map(DzTeacherClass::getClassId).collect(Collectors.toList());
+
+        // 2. 找出需要删除的班级ID(存在于dbClassIds但不存在于insertClassIds)
+        List<Long> deleteClassIds = dbClassIds.stream()
+                .filter(dbId -> !insertClassIds.contains(dbId))
+                .collect(Collectors.toList());
+
+        // 3. 找出需要新增的班级ID(存在于insertClassIds但不存在于dbClassIds)
+        List<Long> newClassIds = insertClassIds.stream()
+                .filter(insertId -> !dbClassIds.contains(insertId))
+                .collect(Collectors.toList());
+
+        // 4. 执行删除操作
+        if (!deleteClassIds.isEmpty()) {
+            //alreadyList转换为Map<Long,Long>,key为classesId,value为id(删除时需要用id)
+            Map<Long,Long> map = alreadyList.stream() .collect(Collectors.toMap( DzTeacherClass::getClassId, DzTeacherClass::getId, (existing, replacement) -> existing ));
+            Long[] deleteIds = deleteClassIds.stream()
+                    .map(classId -> map.get(classId))  // 通过classId获取对应的id
+                    .filter(Objects::nonNull)          // 过滤掉null值
+                    .toArray(Long[]::new);
+            if (deleteIds.length > 0) {
+                String[] stringDeleteIds = Arrays.stream(deleteIds)
+                        .map(id -> String.valueOf(id))  // Long 转 String
+                        .toArray(String[]::new);
+                dzTeacherClassService.deleteDzTeacherClassByIds(stringDeleteIds);
+            }
+        }
+
+        // 5. 执行新增操作
+        Long teacherId = dzTeacherClass.getTeacherId();
+        if (!newClassIds.isEmpty()) {
+            List<DzTeacherClass> insertList = newClassIds.stream()
+                    .map(classId -> {
+                        DzTeacherClass insert = new DzTeacherClass();
+                        insert.setTeacherId(teacherId);
+                        insert.setClassId(classId);
+                        insert.setStatus(BoolValues.yes.getValue()); // 设置有效状态
+                        return insert;
+                    })
+                    .collect(Collectors.toList());
+            dzTeacherClassService.insertBatch(insertList);
+        }
+
+        return AjaxResult.success();
+    }
+
     /**
      * 修改教师班级关系
      */
@@ -96,7 +163,7 @@ public class DzTeacherClassController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('dz:teacherclass:remove')")
     @Log(title = "教师班级关系", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
+    @DeleteMapping("/{ids}")
     public AjaxResult remove(@PathVariable String[] ids)
     {
         return toAjax(dzTeacherClassService.deleteDzTeacherClassByIds(ids));

+ 5 - 1
ie-admin/src/main/java/com/ruoyi/web/controller/dz/DzTeacherController.java

@@ -2,6 +2,8 @@ package com.ruoyi.web.controller.dz;
 
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.dz.service.IDzTeacherClassService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -23,7 +25,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
 
 /**
  * 老师Controller
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
@@ -33,6 +35,8 @@ public class DzTeacherController extends BaseController
 {
     @Autowired
     private IDzTeacherService dzTeacherService;
+    @Autowired
+    private IDzTeacherClassService teacherClassService;
 
     /**
      * 查询老师列表

+ 79 - 0
ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontCustomerMarjorsController.java

@@ -0,0 +1,79 @@
+package com.ruoyi.web.controller.front;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.sy.domain.SyMajor;
+import com.ruoyi.sy.service.ISyMajorService;
+import com.ruoyi.syzy.domain.BCustomerMarjors;
+import com.ruoyi.syzy.service.IBCustomerMarjorsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@Api(tags = "关注的专业")
+@RequestMapping("front/customer/marjors")
+public class FrontCustomerMarjorsController extends BaseController {
+
+    @Autowired
+    private IBCustomerMarjorsService customerMarjorsService;
+    @Autowired
+    private ISyMajorService majorService;
+
+    @GetMapping("list")
+    @ApiOperation("01 关注专业列表")
+    public TableDataInfo list(@ApiParam(value = "页数", example = "1") @RequestParam Integer pageNum,
+        @ApiParam(value = "页大小", example = "15") @RequestParam Integer pageSize) {
+        String customerCode = SecurityUtils.getLoginUser().getUser().getCode();
+        startPage();
+        List<JSONObject> arr = customerMarjorsService.listMyByPage(customerCode);
+        return getDataTable(arr);
+    }
+
+    @GetMapping("remove")
+    @ApiOperation("02 移除关注专业")
+    public AjaxResult remove(@ApiParam("数据Id") @RequestParam String code) {
+        String customerCode = SecurityUtils.getLoginUser().getUser().getCode();
+
+        SyMajor major = majorService.selectSyMajorByCode(code);
+        if(null==major){
+            return AjaxResult.error("未找到对应编码"+code);
+        }
+        Long marjorId = major.getId();
+
+        BCustomerMarjors customerMarjors= new BCustomerMarjors();
+        customerMarjors.setCustomerCode(customerCode);
+        customerMarjors.setMarjorId(marjorId);
+        List<BCustomerMarjors> customerMarjorsList=customerMarjorsService.selectBCustomerMarjorsList(customerMarjors);
+        customerMarjorsList.forEach(ll->{
+            Long id = ll.getId();
+            customerMarjorsService.remove(customerCode, id);
+        });
+
+        return success();
+    }
+
+    @GetMapping("add")
+    @ApiOperation("03 关注专业")
+    public AjaxResult add(@ApiParam("专业code") @RequestParam String code) {
+        String customerCode = SecurityUtils.getLoginUser().getUser().getCode();
+        SyMajor major = majorService.selectSyMajorByCode(code);
+        if(null==major){
+            return AjaxResult.error("未找到对应编码"+code);
+        }
+        Long marjorId = major.getId();
+        customerMarjorsService.add(customerCode, marjorId);
+        return success();
+    }
+
+}

+ 103 - 0
ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontCustomerUniversityController.java

@@ -0,0 +1,103 @@
+package com.ruoyi.web.controller.front;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.service.ISysDictTypeService;
+import com.ruoyi.syzy.domain.BBusiWishUniversities;
+import com.ruoyi.syzy.domain.BCustomerUniversities;
+import com.ruoyi.syzy.service.IBBusiWishUniversitiesService;
+import com.ruoyi.syzy.service.IBCustomerUniversitiesService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@Api(tags = "关注的院校")
+@RequestMapping("front/customer/university")
+public class FrontCustomerUniversityController extends BaseController {
+
+    @Autowired
+    private IBCustomerUniversitiesService customerUniversitiesService;
+    @Autowired
+    private IBBusiWishUniversitiesService wishUniversitiesService;
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+
+    @GetMapping("list")
+    @ApiOperation("01 关注院校列表")
+    public TableDataInfo list(@ApiParam(value = "页数", example = "1") @RequestParam Integer pageNum,
+        @ApiParam(value = "页大小", example = "15") @RequestParam Integer pageSize) {
+        String customerCode = SecurityUtils.getLoginUser().getUser().getCode();
+        startPage();
+        List<BBusiWishUniversities> arr = wishUniversitiesService.listMyByPage(customerCode);
+        //处理院校星级竞争力
+        arr.stream().forEach(t -> {
+            if(StringUtils.isNotEmpty(t.getStar())){
+                t.setStar(dictTypeService.getDictDataByType("university_stars",t.getStar()));
+            }
+        });
+        return getDataTable(arr);
+    }
+
+    @GetMapping("remove")
+    @ApiOperation("02 移除关注院校")
+    public AjaxResult remove(@ApiParam("院校Id") @RequestParam Long universityId) {
+        String customerCode = SecurityUtils.getLoginUser().getUser().getCode();
+        BBusiWishUniversities universities = wishUniversitiesService.selectBBusiWishUniversitiesById(universityId);
+        if (null == universities) {
+            return AjaxResult.error("未找到对应id" + universityId);
+        }
+        BCustomerUniversities upd = new BCustomerUniversities();
+        BCustomerUniversities cond = new BCustomerUniversities();
+        cond.setCustomerCode(customerCode);
+        cond.setUniversityId(universityId);
+        cond.setStatus(1L);
+        List<BCustomerUniversities> list = customerUniversitiesService.selectBCustomerUniversitiesList(cond);
+        list.forEach(t -> {
+            upd.setId(t.getId());
+            upd.setStatus(0L);
+            customerUniversitiesService.updateBCustomerUniversities(upd);
+            wishUniversitiesService.updateCollect(universityId, -1);
+        });
+        return success();
+    }
+
+    @GetMapping("add")
+    @ApiOperation("03 关注院校")
+    public AjaxResult add(@ApiParam("院校id") @RequestParam Long universityId) {
+        String customerCode = SecurityUtils.getLoginUser().getUser().getCode();
+        BBusiWishUniversities universities = wishUniversitiesService.selectBBusiWishUniversitiesById(universityId);
+        if (null == universities) {
+            return AjaxResult.error("未找到对应id" + universityId);
+        }
+        BCustomerUniversities cond = new BCustomerUniversities();
+        cond.setCustomerCode(customerCode);
+        cond.setUniversityId(universityId);
+        List<BCustomerUniversities> list = customerUniversitiesService.selectBCustomerUniversitiesList(cond);
+        if (CollectionUtils.isNotEmpty(list)) {
+            if (list.get(0).getStatus() != 1L) {
+                BCustomerUniversities upd = new BCustomerUniversities();
+                upd.setId(list.get(0).getId());
+                upd.setStatus(1L);
+                customerUniversitiesService.updateBCustomerUniversities(upd);
+            }
+        } else {
+            cond.setStatus(1L);
+            customerUniversitiesService.insertBCustomerUniversities(cond);
+        }
+        wishUniversitiesService.updateCollect(universityId, 1);
+        return success();
+    }
+
+}

+ 6 - 5
ie-admin/src/main/java/com/ruoyi/web/controller/front/FrontUniversitiesController.java

@@ -136,12 +136,13 @@ public class FrontUniversitiesController extends BaseController {
             cond.setFilterRank(null);
             cond.setOrderBy(StringUtils.isNotBlank(cond.getOrderBy()) ? cond.getOrderBy() : "code");
         }
-        cond.setEnrollLocation(location);
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        cond.setEnrollLocation(user.getLocation());
         startPage();
         List<BBusiWishUniversities> arr;
-        SysUser user = SecurityUtils.getLoginUser().getUser();
         Integer planYear = voluntaryService.getPlanYear(user);
-        if(Constant.EXAM_TYPE_ZG.equals(user.getExamType())) {
+        if(Constant.EXAM_TYPE_ZG.equals(user.getExamType().title())) {
+            //职高对口
             arr = universitiesService.selectMajorWishUniversitiesListSimpleByMap2(cond.toCondMap(planYear, user.getExamType().title(), user.getSelectSubject(), user.getLocation())); // TODO MF
         } else {
             arr = universitiesService.selectMajorWishUniversitiesListSimpleByMap(cond.toCondMap(planYear, Constant.EXAM_TYPE_PG, null, user.getLocation()));
@@ -173,7 +174,7 @@ public class FrontUniversitiesController extends BaseController {
         data.getBaseInfo().setCollected(CollectionUtils.isNotEmpty(list));
         this.saveUniversitiesClicks(code);
 
-        if(Constant.EXAM_TYPE_ZG.equals(sysUser.getExamType())) {
+        if(Constant.EXAM_TYPE_ZG.equals(sysUser.getExamType().title())) {
             Integer examMajor = sysUser.getSelectSubject(); // TODO MF
 
             BBusiWishUniversitySubmitRecruitPlan planCond = new BBusiWishUniversitySubmitRecruitPlan();
@@ -189,7 +190,7 @@ public class FrontUniversitiesController extends BaseController {
             submitCond.setLiberalScience(examMajor);
             List<UniversityDetailDTO.WishSubmit> submitList = wishUniversitySubmitMarjorsService.selectBBusiWishUniversitySubmitMarjorsList(submitCond).stream().map(t -> new UniversityDetailDTO.WishSubmit(t)).collect(Collectors.toList());
             data.setEnrollHistories(submitList);
-        } else if(Constant.EXAM_TYPE_PG.equals(sysUser.getExamType()) || Constant.EXAM_TYPE_ZZ.equals(sysUser.getExamType())) {
+        } else if(Constant.EXAM_TYPE_PG.equals(sysUser.getExamType().title()) || Constant.EXAM_TYPE_ZZ.equals(sysUser.getExamType().title())) {
             Pair<List<UniversityDetailDTO.WishPlan>, List<UniversityDetailDTO.WishSubmit>> pair = voluntaryService.getUniversityHistory(universityId, sysUser.getLocation(), sysUser.getExamType().title());
             data.setPlanHistories(pair.getLeft());
             data.setEnrollHistories(pair.getRight());

+ 3 - 1
ie-admin/src/main/java/com/ruoyi/web/controller/learn/LearnQuestionsController.java

@@ -4,6 +4,7 @@ import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -31,7 +32,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
  */
 @RestController
 @RequestMapping("/learn/questions")
-@Api("后台-学习 - 题")
+@Api(tags = "后台-学习 - 题")
 public class LearnQuestionsController extends BaseController
 {
     @Autowired
@@ -42,6 +43,7 @@ public class LearnQuestionsController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('learn:questions:list')")
     @GetMapping("/list")
+    @ApiOperation("查询列表")
     public TableDataInfo list(LearnQuestions learnQuestions)
     {
         startPage();

+ 35 - 5
ie-admin/src/main/java/com/ruoyi/web/controller/learn/LearnTeacherController.java

@@ -1,6 +1,8 @@
 package com.ruoyi.web.controller.learn;
 
+import cn.hutool.core.lang.Dict;
 import com.alibaba.fastjson2.JSONObject;
+import com.google.common.collect.Lists;
 import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -10,7 +12,6 @@ import com.ruoyi.dz.domain.DzControl;
 import com.ruoyi.dz.domain.DzSubject;
 import com.ruoyi.dz.service.IDzControlService;
 import com.ruoyi.dz.service.IDzSubjectService;
-import com.ruoyi.ie.service.IAMarjorPlanService;
 import com.ruoyi.learn.domain.TestPaperVO;
 import com.ruoyi.web.service.LearnTeacherService;
 import io.swagger.annotations.Api;
@@ -95,6 +96,13 @@ public class LearnTeacherController extends BaseController {
         return AjaxResult.success(learnTeacherService.getClasses(getUserId()));
     }
 
+    @GetMapping("/students")
+    @ApiOperation("学生列表")
+    public AjaxResult students(@ApiParam("批次ID") Long batchId)
+    {
+        return AjaxResult.success(learnTeacherService.getStudents(batchId, getUserId()));
+    }
+
     @GetMapping("/universities")
     @ApiOperation("院校列表")
     public AjaxResult universities(@ApiParam("批次ID") Long batchId)
@@ -126,12 +134,34 @@ public class LearnTeacherController extends BaseController {
         return AjaxResult.success(learnTeacherService.getKnowledgeTree(subjectId, majorPlanIds));
     }
 
+    @GetMapping("/questionTypes")
+    @ApiOperation("题型列表")
+    public AjaxResult questionTypes(@ApiParam("科目ID") Long subjectId, @RequestParam(required = false) @ApiParam("专业计划ID") Long[] knowledgeIds)
+    {
+        List<Dict> dictList = Lists.newArrayList();
+        dictList.add(Dict.create().set("dictLabel", "单选题").set("dictValue", "1"));
+        dictList.add(Dict.create().set("dictLabel", "多选题").set("dictValue", "2"));
+        dictList.add(Dict.create().set("dictLabel", "判断题").set("dictValue", "3"));
+        dictList.add(Dict.create().set("dictLabel", "分析题").set("dictValue", "4"));
+        return AjaxResult.success(dictList);
+    }
+
     @PreAuthorize("@ss.hasPermi('learn:test_paper:add')")
-    @PostMapping("/build")
-    @ApiOperation("批量组卷")
-    public AjaxResult batchBuild(@RequestBody TestPaperVO.TestPapersBuildReq req)
+    @PostMapping("/build/auto")
+    @ApiOperation("批量自动组卷")
+    public AjaxResult batchBuildAuto(@RequestBody TestPaperVO.TestPapersBuildAutoReq req)
     {
-        return toAjax(true);
+        req.setBuildType(TestPaperVO.PaperBuildType.Auto);
+        return AjaxResult.success(learnTeacherService.buildPapersAuto(req));
+    }
+
+    @PreAuthorize("@ss.hasPermi('learn:test_paper:add')")
+    @PostMapping("/build/manual")
+    @ApiOperation("批量手动组卷")
+    public AjaxResult batchBuildManual(@RequestBody TestPaperVO.TestPapersBuildManualReq req)
+    {
+        req.setBuildType(TestPaperVO.PaperBuildType.Manual);
+        return AjaxResult.success(learnTeacherService.buildPapersManual(req));
     }
 
     @PreAuthorize("@ss.hasPermi('learn:test_paper:query')")

+ 3 - 0
ie-admin/src/main/java/com/ruoyi/web/service/CommService.java

@@ -53,6 +53,9 @@ public class CommService {
     }
 
     public void requireVip() {
+        if (true){
+            return;
+        }
         SysUser user = SecurityUtils.getLoginUser().getUser();
         if (!UserRegStatus.Student.equals(user.getRegStatus())) {
             throw new CustomException("没有权限,请开通VIP", 405);

+ 4 - 4
ie-admin/src/main/java/com/ruoyi/web/service/ExamService.java

@@ -116,13 +116,13 @@ public class ExamService {
             paperMapper.updateLearnPaper(up);
         }
 
-        PaperService.PaperDef paperDef = new PaperService.PaperDef();
+        TestPaperVO.PaperDef paperDef = new TestPaperVO.PaperDef();
         paperDef.setTotal(15L);
         paperDef.setFillExclude(true);
         paperDef.setKnowIds(Lists.newArrayList(knowledgeId));
-        List<PaperService.TypeDef> typeDefList= Lists.newArrayList();
-        typeDefList.add(new PaperService.TypeDef("单选题", "单选题", 80, 1));
-        typeDefList.add(new PaperService.TypeDef("判断题", "判断题", 10, 2));
+        List<TestPaperVO.TypeDef> typeDefList= Lists.newArrayList();
+        typeDefList.add(new TestPaperVO.TypeDef("单选题", "单选题", 80, 1));
+        typeDefList.add(new TestPaperVO.TypeDef("判断题", "判断题", 10, 2));
         paperDef.setTypes(typeDefList);
         List<LearnPaperQuestion> pqList = paperService.getQuestions(studentId,  paperDef);
 

+ 270 - 2
ie-admin/src/main/java/com/ruoyi/web/service/LearnTeacherService.java

@@ -1,34 +1,60 @@
 package com.ruoyi.web.service;
 
 import cn.hutool.core.lang.Dict;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.TreeEntity;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.dz.domain.DzClasses;
 import com.ruoyi.dz.mapper.DzClassesMapper;
+import com.ruoyi.enums.PaperType;
+import com.ruoyi.ie.domain.AMarjorPlan;
 import com.ruoyi.ie.mapper.AMarjorPlanMapper;
-import com.ruoyi.learn.domain.LearnKnowledgeTree;
+import com.ruoyi.learn.domain.*;
+import com.ruoyi.learn.mapper.LearnDirectedKnowledgeMapper;
 import com.ruoyi.learn.mapper.LearnKnowledgeTreeMapper;
+import com.ruoyi.learn.mapper.LearnStudentMapper;
+import com.ruoyi.learn.mapper.LearnTestPaperMapper;
 import com.ruoyi.syzy.domain.BBusiWishUniversities;
 import com.ruoyi.syzy.mapper.BBusiWishUniversitiesMapper;
 import lombok.Data;
 import org.apache.commons.compress.utils.Lists;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
+import javax.validation.ValidationException;
+import java.util.Calendar;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Service
 public class LearnTeacherService {
     private final DzClassesMapper dzClassesMapper;
     private final LearnKnowledgeTreeMapper learnKnowledgeTreeMapper;
+    private final LearnStudentMapper learnStudentMapper;
     private final AMarjorPlanMapper marjorPlanMapper;
     private final BBusiWishUniversitiesMapper busiWishUniversitiesMapper;
+    private final LearnDirectedKnowledgeMapper learnDirectedKnowledgeMapper;
+    private final PaperService paperService;
+    private final LearnTestPaperMapper learnTestPaperMapper;
 
-    public LearnTeacherService(DzClassesMapper dzClassesMapper, LearnKnowledgeTreeMapper learnKnowledgeTreeMapper, AMarjorPlanMapper marjorPlanMapper, BBusiWishUniversitiesMapper busiWishUniversitiesMapper) {
+    public LearnTeacherService(DzClassesMapper dzClassesMapper, LearnKnowledgeTreeMapper learnKnowledgeTreeMapper, LearnStudentMapper learnStudentMapper, AMarjorPlanMapper marjorPlanMapper, BBusiWishUniversitiesMapper busiWishUniversitiesMapper, LearnDirectedKnowledgeMapper learnDirectedKnowledgeMapper, PaperService paperService, LearnTestPaperMapper learnTestPaperMapper) {
         this.dzClassesMapper = dzClassesMapper;
         this.learnKnowledgeTreeMapper = learnKnowledgeTreeMapper;
+        this.learnStudentMapper = learnStudentMapper;
         this.marjorPlanMapper = marjorPlanMapper;
         this.busiWishUniversitiesMapper = busiWishUniversitiesMapper;
+        this.learnDirectedKnowledgeMapper = learnDirectedKnowledgeMapper;
+        this.paperService = paperService;
+        this.learnTestPaperMapper = learnTestPaperMapper;
     }
 
     public List<DzClasses> getClasses(Long teacherId)
@@ -36,6 +62,10 @@ public class LearnTeacherService {
         return dzClassesMapper.selectClassesForTeacher(teacherId);
     }
 
+    public List<LearnStudent> getStudents(Long batchId, Long classId) {
+        return learnStudentMapper.selectClassStudents(batchId, new Long[] {classId});
+    }
+
     public List<BBusiWishUniversities> selectUniversityList(Long teacherId, Long batchId) {
         return busiWishUniversitiesMapper.selectUniversityListForTeacher(teacherId, batchId);
     }
@@ -45,7 +75,220 @@ public class LearnTeacherService {
                 .set("majorName", t.getMajorName()).set("count", t.getXuefei()).set("total", t.getPlanTotal())).collect(Collectors.toList());
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public String buildPapersAuto(TestPaperVO.TestPapersBuildAutoReq req) {
+        // 查询 院校,专业组,专业计划范围, 明细一级时只有一个,否则就是批量
+        List<LearnStudent> studentList = learnStudentMapper.selectLearnStudentsByMap(req.toMap());
+        if(CollectionUtils.isEmpty(studentList)) {
+            throw new ValidationException("无可用计划可检查");
+        }
+        Set<Long> planIdSet = Sets.newHashSet();
+        Map<Long, List<LearnStudent>> universityMap = Maps.newHashMap();
+        for(LearnStudent ls : studentList){
+            planIdSet.add(ls.getMajorPlanId());
+            List<LearnStudent> list = universityMap.get(ls.getUniversityId());
+            if(null == list) {
+                list = Lists.newArrayList();
+                universityMap.put(ls.getUniversityId(), list);
+            }
+            list.add(ls);
+        }
+        // 查询已经生成的
+        Map<Long, Map<String, LearnTestPaper>> universityDirectPaperMap = learnTestPaperMapper.selectByBatchAndUniversityIds(req.getBatchId(), universityMap.keySet()).stream()
+                .collect(Collectors.groupingBy(LearnTestPaper::getUniversityId, Collectors.toMap(LearnTestPaper::getDirectKey, a -> a)));
+        if(null == req.getDirectType() || !req.getDirectType()) { // 全量
+            LearnPaper paper = new LearnPaper();
+            paper.setPaperName(req.getTitle());
+            paper.setYear(Calendar.getInstance().get(Calendar.YEAR));
+            paper.setPaperType(PaperType.Test.name());
+            paper.setSubjectId(req.getSubjectId());
+            paper.setDirectKey("");
+            for(Long universityId : universityMap.keySet()) {
+                Map<String, LearnTestPaper> directPaperMap = universityDirectPaperMap.get(universityId);
+                if(null != directPaperMap && directPaperMap.containsKey("")) {
+                    continue;
+                }
+                if(null == paper.getId()) {
+                    Pair<LearnPaper, List<LearnPaperQuestion>> paperResult = paperService.buildPaper(null, paper, req.getPaperDef());
+                    paperService.savePaper(paper, paperResult.getRight());
+                }
+                LearnTestPaper testPaper = new LearnTestPaper();
+                testPaper.setBatchId(req.getBatchId());
+                testPaper.setUniversityId(universityId);
+                testPaper.setDirectKey("");
+                testPaper.setPaperId(paper.getId());
+                learnTestPaperMapper.insertLearnTestPaper(testPaper);
+            }
+            return "";
+        }
+        TestPaperVO.PaperDef paperDef = req.getPaperDef();
+        if(null != req.getPlanIds() && req.getPlanIds().size() == 1) {
+            if(!CollectionUtils.isEmpty(paperDef.getKnowIds())) {
+                throw new ValidationException("批量时不支持自定义知识点");
+            }
+        }
+        Map<Long, Map<String, LearnDirectedKnowledge>> universityDirectedKnowledgeMap = learnDirectedKnowledgeMapper.selectByUniversityIds(universityMap.keySet().toArray(new Long[universityMap.size()])).stream().collect(
+                Collectors.groupingBy(LearnDirectedKnowledge::getUniversityId, Collectors.toMap(LearnDirectedKnowledge::getDirectKey, a -> a)));
+        Map<Long, AMarjorPlan> planMap = marjorPlanMapper.selectAMarjorPlanByIds(planIdSet.toArray(new Long[planIdSet.size()])).stream().collect(Collectors.toMap(AMarjorPlan::getId, a -> a));
+
+        LearnDirectedKnowledge directedKnowledge = null;
+        String directedKey = null;
+
+        for(Long universityId : universityMap.keySet()) {
+            Map<String, LearnDirectedKnowledge> directedKnowledgeMap = universityDirectedKnowledgeMap.get(universityId);
+            for(LearnStudent ls : universityMap.get(universityId)) {
+                AMarjorPlan plan = planMap.get(ls.getMajorPlanId());
+                String groupName = StringUtils.trimToEmpty(plan.getMajorGroup());
+                if(CollectionUtils.isEmpty(paperDef.getKnowIds())) {
+                    if(null != (directedKnowledge = directedKnowledgeMap.get((directedKey = groupName + "_" + plan.getMajorName())))) {
+                        paperDef.setKnowIds(Stream.of(directedKnowledge.getKnowledges().split(",")).map(t -> Long.parseLong(t.trim())).collect(Collectors.toList()));
+                    } else if(null != (directedKnowledge = directedKnowledgeMap.get(directedKey = groupName))) {
+                        paperDef.setKnowIds(Stream.of(directedKnowledge.getKnowledges().split(",")).map(t -> Long.parseLong(t.trim())).collect(Collectors.toList()));
+                    } else {
+                        throw new ValidationException("院校没有配置定向知识点,生成失败: " + universityId + ":" + groupName + ":" + plan.getMajorName());
+                    }
+                } else if(null != directedKnowledgeMap) {
+                    if(null != (directedKnowledge = directedKnowledgeMap.get((directedKey = groupName + "_" + plan.getMajorName())))) {
+                    } else if(null != (directedKnowledge = directedKnowledgeMap.get(directedKey = groupName))) {
+                    } else {
+                        throw new ValidationException("院校没有配置定向知识点,生成失败" + universityId + ":" + directedKey);
+                    }
+                } else {
+                    throw new ValidationException("院校没有配置定向知识点,生成失败: " + universityId);
+                }
+                Map<String, LearnTestPaper> directPaperMap = universityDirectPaperMap.get(universityId);
+                if(null != directPaperMap && directPaperMap.containsKey(directedKey)) {
+                    continue;
+                }
+                LearnPaper paper = new LearnPaper();
+                paper.setSubjectId(req.getSubjectId());
+                paper.setPaperName(req.getTitle());
+                paper.setYear(plan.getYear());
+                paper.setPaperType(PaperType.Test.name());
+                paper.setDirectKey(directedKey);
+                Pair<LearnPaper, List<LearnPaperQuestion>> paperResult = paperService.buildPaper(null, paper, paperDef);
+                paperService.savePaper(paperResult.getKey(), paperResult.getValue());
+
+                LearnTestPaper testPaper = new LearnTestPaper();
+                testPaper.setBatchId(req.getBatchId());
+                testPaper.setUniversityId(universityId);
+                testPaper.setDirectKey(directedKey);
+                testPaper.setPaperId(paper.getId());
+                learnTestPaperMapper.insertLearnTestPaper(testPaper);
+                directPaperMap.put(directedKey, testPaper);
+            }
+        }
+        return "";
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public String buildPapersManual(TestPaperVO.TestPapersBuildManualReq req) {
+        if(null == req.getSubjectId()) {
+            throw new ValidationException("未选择科目");
+        }
+        // 查询 院校,专业组,专业计划范围, 明细一级时只有一个,否则就是批量
+        List<LearnStudent> studentList = learnStudentMapper.selectLearnStudentsByMap(req.toMap());
+        if(CollectionUtils.isEmpty(studentList)) {
+            throw new ValidationException("无可用计划可检查");
+        }
+        Set<Long> planIdSet = Sets.newHashSet();
+        Map<Long, List<LearnStudent>> universityMap = Maps.newHashMap();
+        for(LearnStudent ls : studentList){
+            planIdSet.add(ls.getMajorPlanId());
+            List<LearnStudent> list = universityMap.get(ls.getUniversityId());
+            if(null == list) {
+                list = Lists.newArrayList();
+                universityMap.put(ls.getUniversityId(), list);
+            }
+            list.add(ls);
+        }
+        // 查询已经生成的
+        Map<Long, Map<String, LearnTestPaper>> universityDirectPaperMap = learnTestPaperMapper.selectByBatchAndUniversityIds(req.getBatchId(), universityMap.keySet()).stream()
+                .collect(Collectors.groupingBy(LearnTestPaper::getUniversityId, Collectors.toMap(LearnTestPaper::getDirectKey, a -> a)));
+
+        LearnPaper paper = new LearnPaper();
+        paper.setPaperName(req.getTitle());
+        paper.setYear(Calendar.getInstance().get(Calendar.YEAR));
+        paper.setPaperType(PaperType.Test.name());
+        if(null == req.getDirectType() || !req.getDirectType()) { // 全量
+            paper.setSubjectId(req.getSubjectId());
+            paper.setDirectKey("");
+            for(Long universityId : universityMap.keySet()) {
+                Map<String, LearnTestPaper> directPaperMap = universityDirectPaperMap.get(universityId);
+                if(null != directPaperMap && directPaperMap.containsKey("")) {
+                    continue;
+                }
+                if(null == paper.getId()) {
+                    paperService.savePaper(paper, req.getQuestions());
+                }
+                LearnTestPaper testPaper = new LearnTestPaper();
+                testPaper.setBatchId(req.getBatchId());
+                testPaper.setUniversityId(universityId);
+                testPaper.setDirectKey("");
+                testPaper.setPaperId(paper.getId());
+                testPaper.setConditions("");
+                testPaper.setCreatorId(SecurityUtils.getUserId());
+                learnTestPaperMapper.insertLearnTestPaper(testPaper);
+            }
+            return "";
+        } // 定向
+        // 准备定向数据
+        Map<Long, Map<String, LearnDirectedKnowledge>> universityDirectedKnowledgeMap = learnDirectedKnowledgeMapper.selectByUniversityIds(universityMap.keySet().toArray(new Long[universityMap.size()])).stream().collect(
+                Collectors.groupingBy(LearnDirectedKnowledge::getUniversityId, Collectors.toMap(LearnDirectedKnowledge::getDirectKey, a -> a)));
+        Map<Long, AMarjorPlan> planMap = marjorPlanMapper.selectAMarjorPlanByIds(planIdSet.toArray(new Long[planIdSet.size()])).stream().collect(Collectors.toMap(AMarjorPlan::getId, a -> a));
+
+        String directedKey = null;
+        for(Long universityId : universityMap.keySet()) {
+            Map<String, LearnTestPaper> directPaperMap = universityDirectPaperMap.get(universityId);
+            Map<String, LearnDirectedKnowledge> directedKnowledgeMap = universityDirectedKnowledgeMap.get(universityId);
+            for(LearnStudent ls : universityMap.get(universityId)) { // Group+Name
+                AMarjorPlan plan = planMap.get(ls.getMajorPlanId());
+                String groupName = StringUtils.trimToEmpty(plan.getMajorGroup());
+                if(null != (directedKnowledgeMap.get(directedKey = groupName + "_" + plan.getMajorName()))) {
+                    if(null != directPaperMap.get(directedKey)) {
+                        continue;
+                    }
+                } else if(null != directedKnowledgeMap.get(directedKey = groupName)) {
+                    if(null != directPaperMap.get(directedKey)) {
+                        continue;
+                    }
+                } else {
+                    continue;
+                }
+                if(null == paper.getId()) {
+                    paperService.savePaper(paper, req.getQuestions());
+                }
+                LearnTestPaper testPaper = new LearnTestPaper();
+                testPaper.setBatchId(req.getBatchId());
+                testPaper.setUniversityId(universityId);
+                testPaper.setDirectKey(directedKey);
+                testPaper.setPaperId(paper.getId());
+                learnTestPaperMapper.insertLearnTestPaper(testPaper);
+                directPaperMap.put(directedKey, testPaper);
+            }
+        }
+        return "";
+    }
+
     public List<TreeNode> getKnowledgeTree(Long subjectId, Long[] planIds) {
+        Set<Long> knowledgeIdSet = Sets.newHashSet();
+        if(ArrayUtils.isNotEmpty(planIds)) {
+            List<AMarjorPlan> planList = marjorPlanMapper.selectAMarjorPlanByIds(planIds);
+            AMarjorPlan curr = planList.get(0);
+            LearnDirectedKnowledge dkCond = new LearnDirectedKnowledge();
+            dkCond.setUniversityId(curr.getUniversityId());
+            dkCond.setYear(curr.getYear());
+            Map<String, LearnDirectedKnowledge> directedKnowledgeMap = learnDirectedKnowledgeMapper.selectLearnDirectedKnowledgeList(dkCond).stream().collect(Collectors.toMap(LearnDirectedKnowledge::getDirectKey, t -> t));
+            LearnDirectedKnowledge directedKnowledge = null;
+            for(AMarjorPlan plan : planList) {
+                String groupName = StringUtils.trimToEmpty(plan.getMajorGroup());
+                if(null != (directedKnowledge = directedKnowledgeMap.get(groupName + "_" + plan.getMajorName()))) {
+                    knowledgeIdSet.addAll(Stream.of(directedKnowledge.getKnowledges().split(",")).map(t -> Long.parseLong(t.trim())).collect(Collectors.toList()));
+                } else if(null != (directedKnowledge = directedKnowledgeMap.get(groupName))) {
+                    knowledgeIdSet.addAll(Stream.of(directedKnowledge.getKnowledges().split(",")).map(t -> Long.parseLong(t.trim())).collect(Collectors.toList()));
+                }
+            }
+        }
         LearnKnowledgeTree ktCond = new LearnKnowledgeTree();
         ktCond.setSubjectId(subjectId);
         List<LearnKnowledgeTree> ktList = learnKnowledgeTreeMapper.selectLearnKnowledgeTreeList(ktCond);
@@ -58,6 +301,9 @@ public class LearnTeacherService {
             }
             teMap.get(kt.getPid()).getChildren().add(teMap.get(kt.getId()));
         }
+        for(TreeNode tn : treeNodeList) {
+            tn.setChecked(knowledgeIdSet);
+        }
         return treeNodeList;
     }
 
@@ -65,10 +311,32 @@ public class LearnTeacherService {
     public static class TreeNode {
         private Long id;
         private String name;
+        private Integer status;
         List<TreeNode> children = Lists.newArrayList();
         public TreeNode(Long id, String name) {
             this.id = id;
             this.name = name;
+            this.status = 0;
+        }
+
+        public boolean setChecked(Set<Long> idSet) {
+            boolean checkSelf = idSet.contains(id);
+            if(CollectionUtils.isEmpty(children)) {
+                this.status = checkSelf ? 1 : 0;
+                return true;
+            }
+            int count = 0;
+            for(TreeNode tn : children) {
+                if(checkSelf || idSet.contains(tn.getId())) {
+                    tn.setStatus(1);
+                    count++;
+                }
+            }
+            if(children.size() == count) {
+                this.status = 1;
+                return true;
+            }
+            return false;
         }
     }
 }

+ 9 - 28
ie-admin/src/main/java/com/ruoyi/web/service/PaperService.java

@@ -10,9 +10,7 @@ import com.ruoyi.enums.PaperStatus;
 import com.ruoyi.enums.PaperType;
 import com.ruoyi.learn.domain.*;
 import com.ruoyi.learn.mapper.*;
-import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.tuple.Pair;
 import org.springframework.stereotype.Service;
 
@@ -78,9 +76,9 @@ public class PaperService {
         paper.setStatus(PaperStatus.Valid.getVal());
         paper.setDirectKey(directedKnowledge.getDirectKey());
 
-        PaperService.PaperDef paperDef = JSONObject.parseObject(directedKnowledge.getConditions(), PaperDef.class);
+        TestPaperVO.PaperDef paperDef = JSONObject.parseObject(directedKnowledge.getConditions(), TestPaperVO.PaperDef.class);
         paperDef.setKnowIds(Stream.of(directedKnowledge.getKnowledges().split(",")).map(Long::valueOf).collect(Collectors.toList()));
-        paperDef.setTypes(JSONArray.parseArray(directedKnowledge.getQuestionTypes(), TypeDef.class));
+        paperDef.setTypes(JSONArray.parseArray(directedKnowledge.getQuestionTypes(), TestPaperVO.TypeDef.class));
         return buildPaper(null, paper, paperDef);
     }
 
@@ -91,7 +89,7 @@ public class PaperService {
      * @param paperDef
      * @return
      */
-    public Pair<LearnPaper, List<LearnPaperQuestion>> buildPaper(Long studentId, LearnPaper paper, PaperService.PaperDef paperDef) {
+    public Pair<LearnPaper, List<LearnPaperQuestion>> buildPaper(Long studentId, LearnPaper paper, TestPaperVO.PaperDef paperDef) {
         if(null == studentId){
             paperDef.setFillExclude(false);
         }
@@ -123,17 +121,17 @@ public class PaperService {
      * @param paperDef
      * @return
      */
-    public List<LearnPaperQuestion> getQuestions(Long studentId, PaperDef paperDef) {
+    public List<LearnPaperQuestion> getQuestions(Long studentId, TestPaperVO.PaperDef paperDef) {
         // 题型分布定义, 知识点列表, 分值定义
         // 统计知识点+类型的有效数量 TODO 总量可以缓存
         Map<String, KnowTypeAssign> knowTypeAssignMap = Maps.newHashMap();
-        List<String> typeSet = paperDef.getTypes().stream().map(TypeDef::getType).collect(Collectors.toList());
+        List<String> typeSet = paperDef.getTypes().stream().map(TestPaperVO.TypeDef::getType).collect(Collectors.toList());
         Map cond = Maps.newHashMap();
         cond.put("studentId", studentId);
         cond.put("knowIds", paperDef.getKnowIds());
         cond.put("types", typeSet);
         setValue(knowTypeAssignMap, cond, 1); // 填充排除总量
-        if (paperDef.fillExclude) {
+        if (paperDef.getFillExclude()) {
             cond.remove("studentId");
             setValue(knowTypeAssignMap, cond, 2); // 按需填充总量
         }
@@ -161,8 +159,8 @@ public class PaperService {
                     avgKnowTypeCount = 1L;
                 }
                 typeCount = 0;
-                for (TypeDef typeDef : paperDef.getTypes()) {
-                    Long tmpMinKnowTypeCount = assignKnownCount(knowId, typeDef.getType(), knowTypeAssignMap, avgKnowTypeCount, paperDef.fillExclude, assignCount);
+                for (TestPaperVO.TypeDef typeDef : paperDef.getTypes()) {
+                    Long tmpMinKnowTypeCount = assignKnownCount(knowId, typeDef.getType(), knowTypeAssignMap, avgKnowTypeCount, paperDef.getFillExclude(), assignCount);
                     if (tmpMinKnowTypeCount > 0) {
                         minKnowTypeCount = Math.min(minKnowTypeCount, tmpMinKnowTypeCount);
                         knowSet.add(knowId);
@@ -182,7 +180,7 @@ public class PaperService {
         Random random = new Random();
         List<LearnPaperQuestion> pqList = Lists.newArrayList();
         Set<Long> existQuestionIdSet = Sets.newHashSet();
-        for (TypeDef typeDef : paperDef.getTypes()) {
+        for (TestPaperVO.TypeDef typeDef : paperDef.getTypes()) {
             for (Long knowId : paperDef.getKnowIds()) {
                 String key = knowId + "_" + typeDef.getType();
                 KnowTypeAssign ktc = knowTypeAssignMap.get(key);
@@ -312,21 +310,4 @@ public class PaperService {
         Long exclCount; // 排除总数
         Long total; // 全量总数
     }
-
-    @Data
-    @AllArgsConstructor
-    @NoArgsConstructor
-    public static class TypeDef {
-        String title;
-        String type;
-        Integer count;
-        Integer score;
-    }
-    @Data
-    public static class PaperDef {
-        Long total;
-        List<Long> knowIds;
-        Boolean fillExclude; // 不足时是否填充排除的
-        List<TypeDef> types;
-    }
 }

+ 2 - 0
ie-admin/src/main/java/com/ruoyi/web/service/SysRegisterService.java

@@ -7,6 +7,7 @@ import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.dz.domain.DzCards;
 import com.ruoyi.dz.service.IDzCardsService;
+import com.ruoyi.enums.UserTypeEnum;
 import com.ruoyi.framework.web.service.TokenService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -147,6 +148,7 @@ public class SysRegisterService
             }
         }
         if(null == user.getUserId()) {
+            user.setUserType(UserTypeEnum.Card.getVal());
             userService.insertUser(user);
         } else {
             userService.updateUser(user);

+ 65 - 0
ie-common/src/main/java/com/ruoyi/common/enums/BoolValues.java

@@ -0,0 +1,65 @@
+package com.ruoyi.common.enums;
+
+import com.ruoyi.common.utils.StringUtils;
+
+/**
+ * 0否,1是
+ */
+public enum BoolValues {
+    other(-1, "其他"),
+    no(0, "否"),
+    yes(1, "是"),
+    ;
+
+    private Integer value;
+    private String remark;
+
+    private BoolValues(Integer value, String remark) {
+        this.value = value;
+        this.remark = remark;
+    }
+
+    public Integer getValue() {
+        return value;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public static BoolValues getByValue(String value) {
+        for (BoolValues o : BoolValues.values()) {
+            if (o.getValue().equals(value)) {
+                return o;
+            }
+        }
+        return null;
+    }
+
+    public static Boolean isTrue(Object value)
+    {
+        if(StringUtils.isNull(value)){
+            return false;
+        }
+        if(value instanceof Long||value instanceof Integer){
+            return BoolValues.yes.getValue()==Integer.parseInt(String.valueOf(value));
+        }
+        return false;
+    }
+
+    public static Boolean isOther(Object value)
+    {
+        if(StringUtils.isNull(value)){
+            return false;
+        }
+        if(value instanceof Long||value instanceof Integer){
+            return BoolValues.other.getValue()==Integer.parseInt(String.valueOf(value));
+        }
+        return false;
+    }
+
+    public static Boolean isFalse(Object value)
+    {
+        return !isTrue(value);
+    }
+}

+ 24 - 0
ie-system/src/main/java/com/ruoyi/dz/domain/DzAgent.java

@@ -1,11 +1,16 @@
 package com.ruoyi.dz.domain;
 
 import com.ruoyi.common.core.domain.entity.SysDept;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.TreeEntity;
 
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
 /**
  * 机构代理对象 dz_agent
  *
@@ -40,11 +45,30 @@ public class DzAgent extends TreeEntity
     /** 负责校区列表 */
     @Excel(name = "负责校区列表")
     private String schools;
+    private Long[] schoolIds;
+    private String schoolName;
 
     private String username;
 
     private SysDept dept;
 
+    public String getSchoolName() {
+        return schoolName;
+    }
+
+    public void setSchoolName(String schoolName) {
+        this.schoolName = schoolName;
+    }
+
+    public Long[] getSchoolIds() {
+        return (null==schoolIds||schoolIds.length==0)?(StringUtils.isNotEmpty(schools)?
+                Arrays.stream(schools.split(",")).map(String::trim).filter(s -> !s.isEmpty()).map(Long::valueOf).toArray(Long[]::new):new Long[0]):schoolIds;
+    }
+
+    public void setSchoolIds(Long[] schoolIds) {
+        this.schoolIds = schoolIds;
+    }
+
     public SysDept getDept() {
         return dept;
     }

+ 89 - 7
ie-system/src/main/java/com/ruoyi/dz/domain/DzCards.java

@@ -62,12 +62,18 @@ public class DzCards extends BaseEntity
 
     /** 末级代理商ID */
     @Excel(name = "末级代理商ID")
-    private Long leftAgentId;
+    private Long leafAgentId;
 
     /** 安排校区 */
     @Excel(name = "安排校区")
     private Long campusId;
 
+    @Excel(name = "分配考生省份")
+    private String assignLocation;
+
+    @Excel(name = "分配考生类型")
+    private String assignExamType;
+
     /** 分配学校 */
     @Excel(name = "分配学校")
     private Long assignSchoolId;
@@ -132,6 +138,18 @@ public class DzCards extends BaseEntity
     @Excel(name = "关卡时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date closeTime;
 
+    private String deptName;
+    /** 代理商 */
+    private String agentName;
+    /** 安排校区 */
+    private String campusName;
+    /** 分配学校 */
+    private String assignSchoolName;
+    /** 校区名称 */
+    private String schoolName;
+    /** 校区班级ID */
+    private String className;
+
     public void setCardId(Long cardId) 
     {
         this.cardId = cardId;
@@ -182,7 +200,15 @@ public class DzCards extends BaseEntity
         return status;
     }
 
-    public void setDistributeStatus(Integer distributeStatus) 
+    public String getAssignLocation() {
+        return assignLocation;
+    }
+
+    public void setAssignLocation(String assignLocation) {
+        this.assignLocation = assignLocation;
+    }
+
+    public void setDistributeStatus(Integer distributeStatus)
     {
         this.distributeStatus = distributeStatus;
     }
@@ -242,14 +268,14 @@ public class DzCards extends BaseEntity
         return agentId;
     }
 
-    public void setLeftAgentId(Long leftAgentId) 
+    public void setLeafAgentId(Long leafAgentId)
     {
-        this.leftAgentId = leftAgentId;
+        this.leafAgentId = leafAgentId;
     }
 
-    public Long getLeftAgentId() 
+    public Long getLeafAgentId()
     {
-        return leftAgentId;
+        return leafAgentId;
     }
 
     public void setCampusId(Long campusId) 
@@ -402,6 +428,62 @@ public class DzCards extends BaseEntity
         return closeTime;
     }
 
+    public String getAssignExamType() {
+        return assignExamType;
+    }
+
+    public void setAssignExamType(String assignExamType) {
+        this.assignExamType = assignExamType;
+    }
+
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    public String getAgentName() {
+        return agentName;
+    }
+
+    public void setAgentName(String agentName) {
+        this.agentName = agentName;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+
+    public String getAssignSchoolName() {
+        return assignSchoolName;
+    }
+
+    public void setAssignSchoolName(String assignSchoolName) {
+        this.assignSchoolName = assignSchoolName;
+    }
+
+    public String getSchoolName() {
+        return schoolName;
+    }
+
+    public void setSchoolName(String schoolName) {
+        this.schoolName = schoolName;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -416,7 +498,7 @@ public class DzCards extends BaseEntity
             .append("isSettlement", getIsSettlement())
             .append("deptId", getDeptId())
             .append("agentId", getAgentId())
-            .append("leftAgentId", getLeftAgentId())
+            .append("leafAgentId", getLeafAgentId())
             .append("campusId", getCampusId())
             .append("assignSchoolId", getAssignSchoolId())
             .append("schoolId", getSchoolId())

+ 18 - 0
ie-system/src/main/java/com/ruoyi/dz/domain/DzClasses.java

@@ -17,6 +17,8 @@ public class DzClasses extends BaseEntity
 
     /** ID */
     private Long classId;
+    private Long[] classIds;
+    private Long teacherId;
 
     /** 学校 */
     @Excel(name = "学校")
@@ -44,6 +46,22 @@ public class DzClasses extends BaseEntity
     @Excel(name = "统计数据")
     private String stats;
 
+    public Long[] getClassIds() {
+        return classIds;
+    }
+
+    public void setClassIds(Long[] classIds) {
+        this.classIds = classIds;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
     public DzSchool getSchool() {
         return school;
     }

+ 12 - 1
ie-system/src/main/java/com/ruoyi/dz/domain/DzSchool.java

@@ -6,6 +6,8 @@ import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
 import com.ruoyi.common.core.domain.BaseEntity;
 
+import java.util.List;
+
 /**
  * 机构校区对象 dz_school
  *
@@ -15,7 +17,6 @@ import com.ruoyi.common.core.domain.BaseEntity;
 public class DzSchool extends BaseEntity
 {
     private static final long serialVersionUID = 1L;
-
     /** $column.columnComment */
     private Long id;
 
@@ -43,12 +44,22 @@ public class DzSchool extends BaseEntity
     @Excel(name = "区")
     private Long area;
 
+    String proCityAreaName ;
+
     /** 状态(0:无效,1:有效) */
     @Excel(name = "状态(0:无效,1:有效)")
     private Integer status;
 
     private SysDept dept;
 
+    public String getProCityAreaName() {
+        return proCityAreaName;
+    }
+
+    public void setProCityAreaName(String proCityAreaName) {
+        this.proCityAreaName = proCityAreaName;
+    }
+
     public SysDept getDept() {
         return dept;
     }

+ 2 - 1
ie-system/src/main/java/com/ruoyi/dz/domain/DzTeacher.java

@@ -63,9 +63,10 @@ public class DzTeacher extends BaseEntity
         this.username = username;
     }
 
-    public void setTeacherId(Long teacherId)
+    public DzTeacher setTeacherId(Long teacherId)
     {
         this.teacherId = teacherId;
+        return this;
     }
 
     public Long getTeacherId()

+ 27 - 17
ie-system/src/main/java/com/ruoyi/dz/domain/DzTeacherClass.java

@@ -9,7 +9,7 @@ import com.ruoyi.common.core.domain.BaseEntity;
 
 /**
  * 教师班级关系对象 dz_teacher_class
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
@@ -18,7 +18,7 @@ public class DzTeacherClass extends BaseEntity
     private static final long serialVersionUID = 1L;
 
     /** 标识 */
-    private String id;
+    private Long id;
 
     /** 老师id */
     @Excel(name = "老师id")
@@ -26,73 +26,83 @@ public class DzTeacherClass extends BaseEntity
 
     /** 班级id */
     @Excel(name = "班级id")
-    private Long classesId;
+    private Long classId;
+    private Long[] classIds;
 
     /** 有效状态 */
     @Excel(name = "有效状态")
-    private Long status;
+    private Integer status;
 
     /** 结束日期 */
     @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "结束日期", width = 30, dateFormat = "yyyy-MM-dd")
     private Date outDate;
 
-    public void setId(String id) 
+    public void setId(Long id)
     {
         this.id = id;
     }
 
-    public String getId() 
+    public Long getId()
     {
         return id;
     }
 
-    public void setTeacherId(Long teacherId) 
+    public DzTeacherClass setTeacherId(Long teacherId)
     {
         this.teacherId = teacherId;
+        return this;
     }
 
-    public Long getTeacherId() 
+    public Long getTeacherId()
     {
         return teacherId;
     }
 
-    public void setClassesId(Long classesId) 
+    public void setClassId(Long classId)
     {
-        this.classesId = classesId;
+        this.classId = classId;
     }
 
-    public Long getClassesId() 
+    public Long getClassId()
     {
-        return classesId;
+        return classId;
     }
 
-    public void setStatus(Long status) 
+    public void setStatus(Integer status)
     {
         this.status = status;
     }
 
-    public Long getStatus() 
+    public Integer getStatus()
     {
         return status;
     }
 
-    public void setOutDate(Date outDate) 
+    public void setOutDate(Date outDate)
     {
         this.outDate = outDate;
     }
 
-    public Date getOutDate() 
+    public Date getOutDate()
     {
         return outDate;
     }
 
+    public Long[] getClassIds() {
+        return classIds;
+    }
+
+    public void setClassIds(Long[] classIds) {
+        this.classIds = classIds;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
             .append("id", getId())
             .append("teacherId", getTeacherId())
-            .append("classesId", getClassesId())
+            .append("classId", getClassId())
             .append("status", getStatus())
             .append("remark", getRemark())
             .append("outDate", getOutDate())

+ 4 - 0
ie-system/src/main/java/com/ruoyi/dz/mapper/DzAgentMapper.java

@@ -1,7 +1,9 @@
 package com.ruoyi.dz.mapper;
 
+import java.util.Collection;
 import java.util.List;
 import com.ruoyi.dz.domain.DzAgent;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 机构代理Mapper接口
@@ -11,6 +13,8 @@ import com.ruoyi.dz.domain.DzAgent;
  */
 public interface DzAgentMapper 
 {
+    public List<DzAgent> selectDzAgentByAgentIds(@Param("ids")Collection<Long> ids);
+
     /**
      * 查询机构代理
      * 

+ 2 - 0
ie-system/src/main/java/com/ruoyi/dz/mapper/DzClassesMapper.java

@@ -1,5 +1,6 @@
 package com.ruoyi.dz.mapper;
 
+import java.util.Collection;
 import java.util.List;
 import com.ruoyi.dz.domain.DzClasses;
 import org.apache.ibatis.annotations.Param;
@@ -12,6 +13,7 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface DzClassesMapper 
 {
+    public List<DzClasses> selectClassesByIds(@Param("ids") Collection<Long> ids);
     public List<DzClasses> selectClassesForTeacher(@Param("teacherId") Long teacherId);
 
     /**

+ 11 - 9
ie-system/src/main/java/com/ruoyi/dz/mapper/DzSchoolMapper.java

@@ -1,19 +1,21 @@
 package com.ruoyi.dz.mapper;
 
+import java.util.Collection;
 import java.util.List;
 import com.ruoyi.dz.domain.DzSchool;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 机构校区Mapper接口
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
-public interface DzSchoolMapper 
+public interface DzSchoolMapper
 {
     /**
      * 查询机构校区
-     * 
+     *
      * @param id 机构校区主键
      * @return 机构校区
      */
@@ -21,15 +23,15 @@ public interface DzSchoolMapper
 
     /**
      * 查询机构校区列表
-     * 
+     *
      * @param dzSchool 机构校区
      * @return 机构校区集合
      */
     public List<DzSchool> selectDzSchoolList(DzSchool dzSchool);
-
+    public List<DzSchool> selectDzSchoolListByIds(@Param("ids") Collection<Long> ids);
     /**
      * 新增机构校区
-     * 
+     *
      * @param dzSchool 机构校区
      * @return 结果
      */
@@ -37,7 +39,7 @@ public interface DzSchoolMapper
 
     /**
      * 修改机构校区
-     * 
+     *
      * @param dzSchool 机构校区
      * @return 结果
      */
@@ -45,7 +47,7 @@ public interface DzSchoolMapper
 
     /**
      * 删除机构校区
-     * 
+     *
      * @param id 机构校区主键
      * @return 结果
      */
@@ -53,7 +55,7 @@ public interface DzSchoolMapper
 
     /**
      * 批量删除机构校区
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */

+ 9 - 9
ie-system/src/main/java/com/ruoyi/dz/mapper/DzTeacherClassMapper.java

@@ -5,15 +5,15 @@ import com.ruoyi.dz.domain.DzTeacherClass;
 
 /**
  * 教师班级关系Mapper接口
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
-public interface DzTeacherClassMapper 
+public interface DzTeacherClassMapper
 {
     /**
      * 查询教师班级关系
-     * 
+     *
      * @param id 教师班级关系主键
      * @return 教师班级关系
      */
@@ -21,7 +21,7 @@ public interface DzTeacherClassMapper
 
     /**
      * 查询教师班级关系列表
-     * 
+     *
      * @param dzTeacherClass 教师班级关系
      * @return 教师班级关系集合
      */
@@ -29,15 +29,15 @@ public interface DzTeacherClassMapper
 
     /**
      * 新增教师班级关系
-     * 
+     *
      * @param dzTeacherClass 教师班级关系
      * @return 结果
      */
     public int insertDzTeacherClass(DzTeacherClass dzTeacherClass);
-
+    public int insertBatch(List<DzTeacherClass> list);
     /**
      * 修改教师班级关系
-     * 
+     *
      * @param dzTeacherClass 教师班级关系
      * @return 结果
      */
@@ -45,7 +45,7 @@ public interface DzTeacherClassMapper
 
     /**
      * 删除教师班级关系
-     * 
+     *
      * @param id 教师班级关系主键
      * @return 结果
      */
@@ -53,7 +53,7 @@ public interface DzTeacherClassMapper
 
     /**
      * 批量删除教师班级关系
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */

+ 12 - 1
ie-system/src/main/java/com/ruoyi/dz/service/IDzCardsService.java

@@ -1,6 +1,8 @@
 package com.ruoyi.dz.service;
 
 import java.util.List;
+
+import com.ruoyi.common.enums.ExamType;
 import com.ruoyi.dz.domain.DzCards;
 import com.ruoyi.enums.CardAction;
 import com.ruoyi.enums.CardType;
@@ -78,7 +80,7 @@ public interface IDzCardsService
      * @param beginNo
      * @param endNo
      */
-    public void assignCard(Long agentId, Long leafAgentId, String beginNo, String endNo);
+    public void assignCard(Long agentId, Long leafAgentId, String beginNo, String endNo, String location, ExamType examType, Long schoolId);
 
     /**
      * 开卡
@@ -112,4 +114,13 @@ public interface IDzCardsService
      * @param cardIds
      */
     public void changeCard(CardAction action, Long[] cardIds);
+
+    /**
+     * 分配校区
+     * @param campusId
+     * @param beginNo
+     * @param endNo
+     * @return
+     */
+    public Boolean changeCampus(Long campusId, String beginNo, String endNo);
 }

+ 9 - 9
ie-system/src/main/java/com/ruoyi/dz/service/IDzSchoolService.java

@@ -5,15 +5,15 @@ import com.ruoyi.dz.domain.DzSchool;
 
 /**
  * 机构校区Service接口
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
-public interface IDzSchoolService 
+public interface IDzSchoolService
 {
     /**
      * 查询机构校区
-     * 
+     *
      * @param id 机构校区主键
      * @return 机构校区
      */
@@ -21,15 +21,15 @@ public interface IDzSchoolService
 
     /**
      * 查询机构校区列表
-     * 
+     *
      * @param dzSchool 机构校区
      * @return 机构校区集合
      */
     public List<DzSchool> selectDzSchoolList(DzSchool dzSchool);
-
+    public List<DzSchool> selectDzSchoolListByIds(List<Long> schoolIds);
     /**
      * 新增机构校区
-     * 
+     *
      * @param dzSchool 机构校区
      * @return 结果
      */
@@ -37,7 +37,7 @@ public interface IDzSchoolService
 
     /**
      * 修改机构校区
-     * 
+     *
      * @param dzSchool 机构校区
      * @return 结果
      */
@@ -45,7 +45,7 @@ public interface IDzSchoolService
 
     /**
      * 批量删除机构校区
-     * 
+     *
      * @param ids 需要删除的机构校区主键集合
      * @return 结果
      */
@@ -53,7 +53,7 @@ public interface IDzSchoolService
 
     /**
      * 删除机构校区信息
-     * 
+     *
      * @param id 机构校区主键
      * @return 结果
      */

+ 9 - 8
ie-system/src/main/java/com/ruoyi/dz/service/IDzTeacherClassService.java

@@ -5,15 +5,15 @@ import com.ruoyi.dz.domain.DzTeacherClass;
 
 /**
  * 教师班级关系Service接口
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
-public interface IDzTeacherClassService 
+public interface IDzTeacherClassService
 {
     /**
      * 查询教师班级关系
-     * 
+     *
      * @param id 教师班级关系主键
      * @return 教师班级关系
      */
@@ -21,7 +21,7 @@ public interface IDzTeacherClassService
 
     /**
      * 查询教师班级关系列表
-     * 
+     *
      * @param dzTeacherClass 教师班级关系
      * @return 教师班级关系集合
      */
@@ -29,15 +29,16 @@ public interface IDzTeacherClassService
 
     /**
      * 新增教师班级关系
-     * 
+     *
      * @param dzTeacherClass 教师班级关系
      * @return 结果
      */
     public int insertDzTeacherClass(DzTeacherClass dzTeacherClass);
+    public int insertBatch(List<DzTeacherClass> list);
 
     /**
      * 修改教师班级关系
-     * 
+     *
      * @param dzTeacherClass 教师班级关系
      * @return 结果
      */
@@ -45,7 +46,7 @@ public interface IDzTeacherClassService
 
     /**
      * 批量删除教师班级关系
-     * 
+     *
      * @param ids 需要删除的教师班级关系主键集合
      * @return 结果
      */
@@ -53,7 +54,7 @@ public interface IDzTeacherClassService
 
     /**
      * 删除教师班级关系信息
-     * 
+     *
      * @param id 教师班级关系主键
      * @return 结果
      */

+ 84 - 12
ie-system/src/main/java/com/ruoyi/dz/service/impl/DzCardsServiceImpl.java

@@ -1,25 +1,26 @@
 package com.ruoyi.dz.service.impl;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Random;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import cn.hutool.core.util.RandomUtil;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.enums.ExamType;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.criteria.CardCriteria;
-import com.ruoyi.dz.domain.DzAgent;
-import com.ruoyi.dz.domain.DzCardsOpen;
-import com.ruoyi.dz.mapper.DzAgentMapper;
-import com.ruoyi.dz.mapper.DzCardsOpenMapper;
+import com.ruoyi.dz.domain.*;
+import com.ruoyi.dz.mapper.*;
 import com.ruoyi.enums.*;
+import com.ruoyi.system.mapper.SysDeptMapper;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.ruoyi.dz.mapper.DzCardsMapper;
-import com.ruoyi.dz.domain.DzCards;
 import com.ruoyi.dz.service.IDzCardsService;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -40,6 +41,12 @@ public class DzCardsServiceImpl implements IDzCardsService
     private DzCardsOpenMapper dzCardsOpenMapper;
     @Autowired
     private DzAgentMapper dzAgentMapper;
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+    @Autowired
+    private DzSchoolMapper dzSchoolMapper;
+    @Autowired
+    private DzClassesMapper dzClassesMapper;
 
     private final String format = "%d%08d";
 
@@ -64,6 +71,52 @@ public class DzCardsServiceImpl implements IDzCardsService
         return list.size() != 1 ? null : list.get(0);
     }
 
+    private List<DzCards> fillNames(List<DzCards> list) {
+        Set<Long> classIdSet = Sets.newHashSet();
+        Set<Long> schoolIdSet = Sets.newHashSet();
+        Set<Long> deptIdSet = Sets.newHashSet();
+        Set<Long> agentIdSet = Sets.newHashSet();
+        for(DzCards c : list) {
+            if(null != c.getClassId()) {
+                classIdSet.add(c.getClassId());
+            }
+            if(null != c.getAssignSchoolId()) {
+                schoolIdSet.add(c.getAssignSchoolId());
+            }
+            if(null != c.getSchoolId()) {
+                schoolIdSet.add(c.getSchoolId());
+            }
+            if(null != c.getCampusId()) {
+                schoolIdSet.add(c.getCampusId());
+            }
+            if(null != c.getDeptId()) {
+                deptIdSet.add(c.getDeptId());
+            }
+            if(null != c.getLeafAgentId()) {
+                agentIdSet.add(c.getLeafAgentId());
+            }
+            if(null != c.getAgentId()) {
+                agentIdSet.add(c.getAgentId());
+            }
+        }
+        Map<Long, String> deptMap = !deptIdSet.isEmpty() ? sysDeptMapper.selectDeptByIds(deptIdSet).stream().collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName)) : Maps.newHashMap();
+        Map<Long, String> schoolMap = !schoolIdSet.isEmpty() ? dzSchoolMapper.selectDzSchoolListByIds(schoolIdSet).stream().collect(Collectors.toMap(DzSchool::getId, DzSchool::getName)) : Maps.newHashMap();;
+        Map<Long, String> agentMap = !agentIdSet.isEmpty() ? dzAgentMapper.selectDzAgentByAgentIds(agentIdSet).stream().collect(Collectors.toMap(DzAgent::getAgentId, DzAgent::getName)) : Maps.newHashMap();
+        Map<Long, String> classesMap = !classIdSet.isEmpty() ? dzClassesMapper.selectClassesByIds(classIdSet).stream().collect(Collectors.toMap(DzClasses::getClassId, DzClasses::getName)) : Maps.newHashMap();
+        for(DzCards c : list) {
+            c.setClassName(classesMap.get(c.getClassId()));
+            c.setAssignSchoolName(schoolMap.get(c.getAssignSchoolId()));
+            c.setSchoolName(schoolMap.get(c.getSchoolId()));
+            c.setCampusName(schoolMap.get(c.getCampusId()));
+            c.setDeptName(deptMap.get(c.getDeptId()));
+            if(null != c.getAgentId()) {
+                String name = agentMap.get(c.getAgentId());
+                c.setAgentName(null != c.getLeafAgentId() && !c.getLeafAgentId().equals(c.getAgentId()) ? agentMap.get(c.getLeafAgentId()) + "(" + name + ")" : name);
+            }
+        }
+        return list;
+    }
+
     /**
      * 查询学习卡列表
      * 
@@ -73,7 +126,7 @@ public class DzCardsServiceImpl implements IDzCardsService
     @Override
     public List<DzCards> selectDzCardsList(DzCards dzCards)
     {
-        return dzCardsMapper.selectDzCardsList(dzCards);
+        return fillNames(dzCardsMapper.selectDzCardsList(dzCards));
     }
 
     /**
@@ -150,7 +203,7 @@ public class DzCardsServiceImpl implements IDzCardsService
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void assignCard(Long agentId, Long leafAgentId, String beginNo, String endNo) {
+    public void assignCard(Long agentId, Long leafAgentId, String beginNo, String endNo, String location, ExamType examType, Long schoolId) {
         CardCriteria cond = new CardCriteria();
         cond.setStartNo(beginNo);
         cond.setEndNo(endNo);
@@ -161,8 +214,12 @@ public class DzCardsServiceImpl implements IDzCardsService
                 throw new ValidationException("卡分配错误");
             }
             dzCards.setAgentId(agentId);
-            dzCards.setLeftAgentId(leafAgentId);
+            dzCards.setLeafAgentId(leafAgentId);
             dzCards.setDistributeTime(DateUtils.getNowDate());
+            dzCards.setAssignLocation(location);
+            dzCards.setAssignExamType(null != examType ? examType.name() : null);
+            dzCards.setAssignSchoolId(schoolId);
+            dzCards.setDistributeStatus(CardDistributeStatus.Assign.getVal());
             dzCardsMapper.updateDzCards(dzCards);
         });
     }
@@ -252,6 +309,7 @@ public class DzCardsServiceImpl implements IDzCardsService
                 throw new ValidationException("重复支付已支付卡: " + StringUtils.join(cardIds, ","));
             }
             up.setPayStatus(PayStatus.Paid.getVal());
+            up.setStatus(CardStatus.Paid.getVal());
             up.setPayTime(DateUtils.getNowDate());
         } else if(CardAction.Close.equals(action)) {
             if(cards.stream().filter(t -> t.getDistributeStatus().equals(CardDistributeStatus.Close.getVal())).count() > 0) {
@@ -278,4 +336,18 @@ public class DzCardsServiceImpl implements IDzCardsService
             dzCardsMapper.updateDzCards(up);
         }
     }
+
+    public Boolean changeCampus(Long campusId, String beginNo, String endNo) {
+        CardCriteria cond = new CardCriteria();
+        cond.setStartNo(beginNo);
+        cond.setEndNo(endNo);
+        List<DzCards> cards = dzCardsMapper.selectListByCond(cond);
+        DzCards dzCards = new DzCards();
+        cards.stream().forEach(c -> {
+            dzCards.setCardId(c.getCardId());
+            dzCards.setCampusId(campusId);
+            dzCardsMapper.updateDzCards(dzCards);
+        });
+        return true;
+    }
 }

+ 14 - 8
ie-system/src/main/java/com/ruoyi/dz/service/impl/DzSchoolServiceImpl.java

@@ -10,19 +10,19 @@ import com.ruoyi.dz.service.IDzSchoolService;
 
 /**
  * 机构校区Service业务层处理
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
 @Service
-public class DzSchoolServiceImpl implements IDzSchoolService 
+public class DzSchoolServiceImpl implements IDzSchoolService
 {
     @Autowired
     private DzSchoolMapper dzSchoolMapper;
 
     /**
      * 查询机构校区
-     * 
+     *
      * @param id 机构校区主键
      * @return 机构校区
      */
@@ -34,7 +34,7 @@ public class DzSchoolServiceImpl implements IDzSchoolService
 
     /**
      * 查询机构校区列表
-     * 
+     *
      * @param dzSchool 机构校区
      * @return 机构校区
      */
@@ -44,9 +44,15 @@ public class DzSchoolServiceImpl implements IDzSchoolService
         return dzSchoolMapper.selectDzSchoolList(dzSchool);
     }
 
+    @Override
+    public List<DzSchool> selectDzSchoolListByIds(List<Long> schoolIds)
+    {
+        return dzSchoolMapper.selectDzSchoolListByIds(schoolIds);
+    }
+
     /**
      * 新增机构校区
-     * 
+     *
      * @param dzSchool 机构校区
      * @return 结果
      */
@@ -59,7 +65,7 @@ public class DzSchoolServiceImpl implements IDzSchoolService
 
     /**
      * 修改机构校区
-     * 
+     *
      * @param dzSchool 机构校区
      * @return 结果
      */
@@ -72,7 +78,7 @@ public class DzSchoolServiceImpl implements IDzSchoolService
 
     /**
      * 批量删除机构校区
-     * 
+     *
      * @param ids 需要删除的机构校区主键
      * @return 结果
      */
@@ -84,7 +90,7 @@ public class DzSchoolServiceImpl implements IDzSchoolService
 
     /**
      * 删除机构校区信息
-     * 
+     *
      * @param id 机构校区主键
      * @return 结果
      */

+ 13 - 8
ie-system/src/main/java/com/ruoyi/dz/service/impl/DzTeacherClassServiceImpl.java

@@ -9,19 +9,19 @@ import com.ruoyi.dz.service.IDzTeacherClassService;
 
 /**
  * 教师班级关系Service业务层处理
- * 
+ *
  * @author ruoyi
  * @date 2025-09-12
  */
 @Service
-public class DzTeacherClassServiceImpl implements IDzTeacherClassService 
+public class DzTeacherClassServiceImpl implements IDzTeacherClassService
 {
     @Autowired
     private DzTeacherClassMapper dzTeacherClassMapper;
 
     /**
      * 查询教师班级关系
-     * 
+     *
      * @param id 教师班级关系主键
      * @return 教师班级关系
      */
@@ -33,7 +33,7 @@ public class DzTeacherClassServiceImpl implements IDzTeacherClassService
 
     /**
      * 查询教师班级关系列表
-     * 
+     *
      * @param dzTeacherClass 教师班级关系
      * @return 教师班级关系
      */
@@ -45,7 +45,7 @@ public class DzTeacherClassServiceImpl implements IDzTeacherClassService
 
     /**
      * 新增教师班级关系
-     * 
+     *
      * @param dzTeacherClass 教师班级关系
      * @return 结果
      */
@@ -55,9 +55,14 @@ public class DzTeacherClassServiceImpl implements IDzTeacherClassService
         return dzTeacherClassMapper.insertDzTeacherClass(dzTeacherClass);
     }
 
+    @Override
+    public int insertBatch(List<DzTeacherClass> list) {
+        return dzTeacherClassMapper.insertBatch(list);
+    }
+
     /**
      * 修改教师班级关系
-     * 
+     *
      * @param dzTeacherClass 教师班级关系
      * @return 结果
      */
@@ -69,7 +74,7 @@ public class DzTeacherClassServiceImpl implements IDzTeacherClassService
 
     /**
      * 批量删除教师班级关系
-     * 
+     *
      * @param ids 需要删除的教师班级关系主键
      * @return 结果
      */
@@ -81,7 +86,7 @@ public class DzTeacherClassServiceImpl implements IDzTeacherClassService
 
     /**
      * 删除教师班级关系信息
-     * 
+     *
      * @param id 教师班级关系主键
      * @return 结果
      */

+ 1 - 0
ie-system/src/main/java/com/ruoyi/ie/mapper/AMarjorPlanMapper.java

@@ -14,6 +14,7 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface AMarjorPlanMapper 
 {
+    public List<AMarjorPlan> selectAMarjorPlanByIds(Long[] ids);
     public List<AMarjorPlan>  selectMajorForUniversity(@Param("universityId") Long universityId, @Param("year") Integer year, @Param("batchId") Long batchId);
     /**
      * 查询专业计划要求

+ 12 - 1
ie-system/src/main/java/com/ruoyi/learn/domain/LearnDirectedKnowledge.java

@@ -22,6 +22,9 @@ public class LearnDirectedKnowledge extends BaseEntity
     @Excel(name = "年度")
     private Integer year;
 
+    @Excel(name = "院校ID")
+    private Long universityId;
+
     /** 定向Key */
     @Excel(name = "定向Key")
     private String directKey;
@@ -82,7 +85,15 @@ public class LearnDirectedKnowledge extends BaseEntity
         return year;
     }
 
-    public void setDirectKey(String directKey) 
+    public Long getUniversityId() {
+        return universityId;
+    }
+
+    public void setUniversityId(Long universityId) {
+        this.universityId = universityId;
+    }
+
+    public void setDirectKey(String directKey)
     {
         this.directKey = directKey;
     }

+ 22 - 0
ie-system/src/main/java/com/ruoyi/learn/domain/LearnPaperQuestion.java

@@ -34,6 +34,12 @@ public class LearnPaperQuestion extends BaseEntity
     @Excel(name = "分值")
     private Integer score;
 
+    @Excel(name = "题型")
+    private String type;
+
+    @Excel(name = "难度")
+    private Integer diff;
+
     public void setId(Long id) 
     {
         this.id = id;
@@ -84,6 +90,22 @@ public class LearnPaperQuestion extends BaseEntity
         return score;
     }
 
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Integer getDiff() {
+        return diff;
+    }
+
+    public void setDiff(Integer diff) {
+        this.diff = diff;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 51 - 0
ie-system/src/main/java/com/ruoyi/learn/domain/LearnStudent.java

@@ -30,10 +30,21 @@ public class LearnStudent extends BaseEntity
     @Excel(name = "院校id")
     private Long universityId;
 
+    @Excel(name = "定向键")
+    private String directKey;
+
+    @Excel(name = "专业组")
+    private String majorGroup;
+
     /** 计划专业id */
     @Excel(name = "计划专业id")
     private Long majorPlanId;
 
+
+    private String studentName;
+    private String paperId;
+    private Integer status;
+
     public Long getStudentId() {
         return studentId;
     }
@@ -50,6 +61,14 @@ public class LearnStudent extends BaseEntity
         this.classId = classId;
     }
 
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
     public Long getCampusId() {
         return campusId;
     }
@@ -66,6 +85,22 @@ public class LearnStudent extends BaseEntity
         this.universityId = universityId;
     }
 
+    public String getDirectKey() {
+        return directKey;
+    }
+
+    public void setDirectKey(String directKey) {
+        this.directKey = directKey;
+    }
+
+    public String getMajorGroup() {
+        return majorGroup;
+    }
+
+    public void setMajorGroup(String majorGroup) {
+        this.majorGroup = majorGroup;
+    }
+
     public Long getMajorPlanId() {
         return majorPlanId;
     }
@@ -73,4 +108,20 @@ public class LearnStudent extends BaseEntity
     public void setMajorPlanId(Long majorPlanId) {
         this.majorPlanId = majorPlanId;
     }
+
+    public String getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(String paperId) {
+        this.paperId = paperId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
 }

+ 23 - 13
ie-system/src/main/java/com/ruoyi/learn/domain/LearnTestPaper.java

@@ -20,7 +20,11 @@ public class LearnTestPaper extends BaseEntity
 
     /** 批次id */
     @Excel(name = "批次id")
-    private Long batchId;
+    private Integer batchId;
+
+    /** 院校id */
+    @Excel(name = "院校id")
+    private Long universityId;
 
     /** 定向key */
     @Excel(name = "定向key")
@@ -32,7 +36,7 @@ public class LearnTestPaper extends BaseEntity
 
     /** 试卷生成条件 */
     @Excel(name = "试卷生成条件")
-    private String condions;
+    private String conditions;
 
     /** 创建人 */
     @Excel(name = "创建人")
@@ -48,17 +52,25 @@ public class LearnTestPaper extends BaseEntity
         return id;
     }
 
-    public void setBatchId(Long batchId) 
+    public void setBatchId(Integer batchId)
     {
         this.batchId = batchId;
     }
 
-    public Long getBatchId() 
+    public Integer getBatchId()
     {
         return batchId;
     }
 
-    public void setDirectKey(String directKey) 
+    public Long getUniversityId() {
+        return universityId;
+    }
+
+    public void setUniversityId(Long universityId) {
+        this.universityId = universityId;
+    }
+
+    public void setDirectKey(String directKey)
     {
         this.directKey = directKey;
     }
@@ -78,17 +90,15 @@ public class LearnTestPaper extends BaseEntity
         return paperId;
     }
 
-    public void setCondions(String condions) 
-    {
-        this.condions = condions;
+    public String getConditions() {
+        return conditions;
     }
 
-    public String getCondions() 
-    {
-        return condions;
+    public void setConditions(String conditions) {
+        this.conditions = conditions;
     }
 
-    public void setCreatorId(Long creatorId) 
+    public void setCreatorId(Long creatorId)
     {
         this.creatorId = creatorId;
     }
@@ -105,7 +115,7 @@ public class LearnTestPaper extends BaseEntity
             .append("batchId", getBatchId())
             .append("directKey", getDirectKey())
             .append("paperId", getPaperId())
-            .append("condions", getCondions())
+            .append("conditions", getConditions())
             .append("creatorId", getCreatorId())
             .append("createTime", getCreateTime())
             .toString();

+ 70 - 14
ie-system/src/main/java/com/ruoyi/learn/domain/TestPaperVO.java

@@ -1,38 +1,75 @@
 package com.ruoyi.learn.domain;
 
+import com.google.common.collect.Maps;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.util.List;
 import java.util.Map;
 
 public class TestPaperVO {
-    enum PaperBuildType {
+    public static enum PaperBuildType {
         Manual, Auto
     }
 
-    @ApiModel("批量组卷请求")
+    @ApiModel("基本组卷请求")
     @Data
     public static class TestPapersBuildReq {
-        @ApiModelProperty("班级")
-        List<Long> classIds;
-        @ApiModelProperty("考生类型")
-        List<String> examTypes;
-        @ApiModelProperty("组卷类型")
+        @ApiModelProperty("名称")
+        String title;
+        @ApiModelProperty("总分")
+        Integer total;
+
+        @ApiModelProperty("批次")
+        Integer batchId;
+        @ApiModelProperty("省份")
+        String location;
+        @ApiModelProperty("组卷方式")
         PaperBuildType buildType;
-        @ApiModelProperty("定向类型 null是全部")
+        @ApiModelProperty("是否定向")
         Boolean directType;
+
+        @ApiModelProperty("科目")
+        Long subjectId;
+
+        @ApiModelProperty("考生类型")
+        List<String> examTypes;
+        @ApiModelProperty("班级")
+        List<Long> classIds;
         @ApiModelProperty("院校")
         List<Long> universityIds;
         @ApiModelProperty("专业组(单院校有效)")
         List<String> groups;
-        @ApiModelProperty("科目")
-        List<Integer> subjectIds;
-        @ApiModelProperty("知识点")
-        List<Long> knowledgeIds;
-        @ApiModelProperty("题型要求")
-        Map<String, Integer> questionTypeNum;
+        @ApiModelProperty("专业组(单专业组有效)")
+        List<Long> planIds;
+
+        public Map<String, Object> toMap() {
+            Map<String, Object> map = Maps.newHashMap();
+            map.put("batchId", batchId);
+            map.put("location", location);
+            map.put("examTypes", examTypes);
+            map.put("classIds", classIds);
+            map.put("universityIds", universityIds);
+            map.put("groups", groups);
+            map.put("planIds", planIds);
+            return map;
+        }
+    }
+
+    @ApiModel("手动组卷请求")
+    @Data
+    public static class TestPapersBuildManualReq extends TestPapersBuildReq {
+        @ApiModelProperty("试题列表")
+        List<LearnPaperQuestion> questions;
+    }
+    @ApiModel("智能组卷请求")
+    @Data
+    public static class TestPapersBuildAutoReq extends TestPapersBuildReq {
+        @ApiModelProperty("试卷要求")
+        PaperDef paperDef;
     }
 
     @ApiModel("批量查询请求")
@@ -86,4 +123,23 @@ public class TestPaperVO {
         @ApiModelProperty("学生")
         List<Long> studentIds;
     }
+
+
+    @Data
+    public static class PaperDef {
+        Long total;
+        List<Long> knowIds;
+        Boolean fillExclude; // 不足时是否填充排除的
+        List<TestPaperVO.TypeDef> types;
+    }
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class TypeDef {
+        String title;
+        String type;
+        Integer count;
+        Integer score;
+    }
 }

+ 2 - 0
ie-system/src/main/java/com/ruoyi/learn/mapper/LearnDirectedKnowledgeMapper.java

@@ -11,6 +11,8 @@ import com.ruoyi.learn.domain.LearnDirectedKnowledge;
  */
 public interface LearnDirectedKnowledgeMapper 
 {
+    public List<LearnDirectedKnowledge> selectByUniversityIds(Long[] universityIds);
+
     /**
      * 查询定向知识点关系
      * 

+ 7 - 0
ie-system/src/main/java/com/ruoyi/learn/mapper/LearnStudentMapper.java

@@ -1,7 +1,10 @@
 package com.ruoyi.learn.mapper;
 
 import java.util.List;
+import java.util.Map;
+
 import com.ruoyi.learn.domain.LearnStudent;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 学生Mapper接口
@@ -11,6 +14,10 @@ import com.ruoyi.learn.domain.LearnStudent;
  */
 public interface LearnStudentMapper 
 {
+    public List<LearnStudent> selectLearnStudentsByMap(Map cond);
+
+    public List<LearnStudent> selectClassStudents(@Param("batchId") Long batchId, @Param("classIds") Long[] classIds);
+
     /**
      * 查询学生
      * 

+ 4 - 0
ie-system/src/main/java/com/ruoyi/learn/mapper/LearnTestPaperMapper.java

@@ -1,7 +1,9 @@
 package com.ruoyi.learn.mapper;
 
+import java.util.Collection;
 import java.util.List;
 import com.ruoyi.learn.domain.LearnTestPaper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 批次测试卷Mapper接口
@@ -11,6 +13,8 @@ import com.ruoyi.learn.domain.LearnTestPaper;
  */
 public interface LearnTestPaperMapper 
 {
+    public List<LearnTestPaper> selectByBatchAndUniversityIds(@Param("batchId") Integer batchId, @Param("universityIds") Collection<Long> universityIds);
+
     /**
      * 查询批次测试卷
      * 

+ 9 - 8
ie-system/src/main/java/com/ruoyi/system/mapper/SysAreaMapper.java

@@ -5,15 +5,15 @@ import com.ruoyi.system.domain.SysArea;
 
 /**
  * 区域-省市区县Mapper接口
- * 
+ *
  * @author ruoyi
  * @date 2025-09-29
  */
-public interface SysAreaMapper 
+public interface SysAreaMapper
 {
     /**
      * 查询区域-省市区县
-     * 
+     *
      * @param areaId 区域-省市区县主键
      * @return 区域-省市区县
      */
@@ -21,15 +21,16 @@ public interface SysAreaMapper
 
     /**
      * 查询区域-省市区县列表
-     * 
+     *
      * @param sysArea 区域-省市区县
      * @return 区域-省市区县集合
      */
     public List<SysArea> selectSysAreaList(SysArea sysArea);
+    public List<SysArea> selectSysAreaListByIds(List<Long> ids);
 
     /**
      * 新增区域-省市区县
-     * 
+     *
      * @param sysArea 区域-省市区县
      * @return 结果
      */
@@ -37,7 +38,7 @@ public interface SysAreaMapper
 
     /**
      * 修改区域-省市区县
-     * 
+     *
      * @param sysArea 区域-省市区县
      * @return 结果
      */
@@ -45,7 +46,7 @@ public interface SysAreaMapper
 
     /**
      * 删除区域-省市区县
-     * 
+     *
      * @param areaId 区域-省市区县主键
      * @return 结果
      */
@@ -53,7 +54,7 @@ public interface SysAreaMapper
 
     /**
      * 批量删除区域-省市区县
-     * 
+     *
      * @param areaIds 需要删除的数据主键集合
      * @return 结果
      */

+ 3 - 0
ie-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java

@@ -1,5 +1,6 @@
 package com.ruoyi.system.mapper;
 
+import java.util.Collection;
 import java.util.List;
 import org.apache.ibatis.annotations.Param;
 import com.ruoyi.common.core.domain.entity.SysDept;
@@ -11,6 +12,8 @@ import com.ruoyi.common.core.domain.entity.SysDept;
  */
 public interface SysDeptMapper
 {
+    public List<SysDept> selectDeptByIds(@Param("ids") Collection<Long> ids);
+
     /**
      * 查询机构管理数据
      * 

+ 1 - 0
ie-system/src/main/java/com/ruoyi/system/service/ISysAreaService.java

@@ -26,6 +26,7 @@ public interface ISysAreaService
      * @return 区域-省市区县集合
      */
     public List<SysArea> selectSysAreaList(SysArea sysArea);
+    public List<SysArea> selectSysAreaListByIds(List<Long> ids);
     public List<SysArea> listTree(SysArea criteria);
     /**
      * 新增区域-省市区县

+ 5 - 0
ie-system/src/main/java/com/ruoyi/system/service/impl/SysAreaServiceImpl.java

@@ -47,6 +47,11 @@ public class SysAreaServiceImpl implements ISysAreaService
     {
         return sysAreaMapper.selectSysAreaList(sysArea);
     }
+    @Override
+    public List<SysArea> selectSysAreaListByIds(List<Long> ids)
+    {
+        return sysAreaMapper.selectSysAreaListByIds(ids);
+    }
 
     @Override
     public List<SysArea> listTree(SysArea criteria) {

+ 1 - 1
ie-system/src/main/java/com/ruoyi/syzy/service/impl/BBusiWishUniversitiesServiceImpl.java

@@ -158,7 +158,7 @@ public class BBusiWishUniversitiesServiceImpl implements IBBusiWishUniversitiesS
         String examTypeData = ConstantUtil.getExamTypeData(u.getExamType().title());
         cond.put("year", year);
         cond.put("collegeCode", code);
-        cond.put("examineeType", u.getExamType());
+        cond.put("examineeType", u.getExamType().title());
         cond.put("examType", examTypeData);
         cond.put("examMajor", u.getSelectSubject()); // TODO MF
         List<BBusiWishUniversitiesProfession> professionList = universitiesProfessionMapper.selectEnrollPlanProfessionByCode(cond);

+ 27 - 19
ie-system/src/main/resources/mapper/dz/DzAgentMapper.xml

@@ -5,12 +5,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 <mapper namespace="com.ruoyi.dz.mapper.DzAgentMapper">
 
     <resultMap type="DzAgent" id="DzAgentResult">
-        <result property="agentId"    column="agentId"    />
-        <result property="deptId"    column="deptId"    />
-        <result property="userId"    column="userId"    />
+        <result property="agentId"    column="agent_id"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="userId"    column="user_id"    />
         <result property="name"    column="name"    />
         <result property="phonenumber"    column="phonenumber"    />
-        <result property="parentId"    column="parentId"    />
+        <result property="parentId"    column="parent_id"    />
         <result property="schools"    column="schools"    />
         <result property="remark"    column="remark"    />
         <association property="dept"     javaType="SysDept"         resultMap="deptResult" />
@@ -27,37 +27,45 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectDzAgentVo">
-        select t1.agentId, t1.deptId, t1.userId, t1.name, t1.phonenumber, t1.parentId, t1.schools, t1.remark,
+        select t1.agent_id, t1.dept_id, t1.user_id, t1.name, t1.phonenumber, t1.parent_id, t1.schools, t1.remark,
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status
         from dz_agent t1
-        left join sys_dept d on t1.deptId = d.dept_id
+        left join sys_dept d on t1.dept_id = d.dept_id
     </sql>
 
     <select id="selectDzAgentList" parameterType="DzAgent" resultMap="DzAgentResult">
         <include refid="selectDzAgentVo"/>
         <where>
-            <if test="userId != null "> and t1.userId = #{userId}</if>
-            <if test="deptId != null "> and t1.deptId = #{deptId}</if>
+            <if test="userId != null "> and t1.user_id = #{userId}</if>
+<!--            <if test="deptId != null "> and t1.dept_id = #{deptId}</if>-->
+            <if test="deptId != null ">
+                AND (t1.dept_id = #{deptId} OR t1.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ))
+            </if>
             <if test="name != null  and name != ''"> and t1.name like concat('%', #{name}, '%')</if>
             <if test="phonenumber != null  and phonenumber != ''"> and t1.phonenumber  like concat('%', #{phonenumber}, '%')</if>
-            <if test="parentId != null "> and t1.parentId = #{parentId}</if>
+            <if test="parentId != null "> and t1.parent_id = #{parentId}</if>
             <if test="schools != null  and schools != ''"> and t1.schools = #{schools}</if>
         </where>
     </select>
 
     <select id="selectDzAgentByAgentId" parameterType="Long" resultMap="DzAgentResult">
         <include refid="selectDzAgentVo"/>
-        where t1.agentId = #{agentId}
+        where t1.agent_id = #{agentId}
+    </select>
+
+    <select id="selectDzAgentByAgentIds" resultMap="DzAgentResult">
+        <include refid="selectDzAgentVo"/>
+        where t1.agent_id in <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
     </select>
 
     <insert id="insertDzAgent" parameterType="DzAgent" useGeneratedKeys="true" keyProperty="agentId">
         insert into dz_agent
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="deptId != null">deptId,</if>
-            <if test="userId != null">userId,</if>
+            <if test="deptId != null">dept_id,</if>
+            <if test="userId != null">user_id,</if>
             <if test="name != null">name,</if>
             <if test="phonenumber != null">phonenumber,</if>
-            <if test="parentId != null">parentId,</if>
+            <if test="parentId != null">parent_id,</if>
             <if test="schools != null">schools,</if>
             <if test="remark != null">remark,</if>
          </trim>
@@ -75,23 +83,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <update id="updateDzAgent" parameterType="DzAgent">
         update dz_agent
         <trim prefix="SET" suffixOverrides=",">
-            <if test="userId != null">userId = #{userId},</if>
-            <if test="deptId != null">deptId = #{deptId},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="deptId != null">dept_id = #{deptId},</if>
             <if test="name != null">name = #{name},</if>
             <if test="phonenumber != null">phonenumber = #{phonenumber},</if>
-            <if test="parentId != null">parentId = #{parentId},</if>
+            <if test="parentId != null">parent_id = #{parentId},</if>
             <if test="schools != null">schools = #{schools},</if>
             <if test="remark != null">remark = #{remark},</if>
         </trim>
-        where agentId = #{agentId}
+        where agent_id = #{agentId}
     </update>
 
     <delete id="deleteDzAgentByAgentId" parameterType="Long">
-        delete from dz_agent where agentId = #{agentId}
+        delete from dz_agent where agent_id = #{agentId}
     </delete>
 
     <delete id="deleteDzAgentByAgentIds" parameterType="String">
-        delete from dz_agent where agentId in
+        delete from dz_agent where agent_id in
         <foreach item="agentId" collection="array" open="(" separator="," close=")">
             #{agentId}
         </foreach>

+ 18 - 12
ie-system/src/main/resources/mapper/dz/DzCardsMapper.xml

@@ -16,8 +16,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="isSettlement"    column="is_settlement"    />
         <result property="deptId"    column="dept_id"    />
         <result property="agentId"    column="agent_id"    />
-        <result property="leftAgentId"    column="left_agent_id"    />
+        <result property="leafAgentId"    column="leaf_agent_id"    />
         <result property="campusId"    column="campus_id"    />
+        <result property="assignLocation"    column="assign_location"    />
+        <result property="assignExamType"    column="assign_exam_type"    />
         <result property="assignSchoolId"    column="assign_school_id"    />
         <result property="schoolId"    column="school_id"    />
         <result property="classId"    column="class_id"    />
@@ -38,7 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectDzCardsVo">
-        select card_id, card_no, password, type, status, distribute_status, time_status, pay_status, is_settlement, dept_id, agent_id, left_agent_id, campus_id, assign_school_id, school_id, class_id, year, end_year, open_id, remark, distribute_time, out_date, open_time, pay_time, active_time, settlement_time, refund_time, close_time, create_time, update_time from dz_cards
+        select card_id, card_no, password, type, status, distribute_status, time_status, pay_status, is_settlement, dept_id, agent_id, leaf_agent_id, campus_id, assign_location,assign_exam_type,assign_school_id, school_id, class_id, year, end_year, open_id, remark, distribute_time, out_date, open_time, pay_time, active_time, settlement_time, refund_time, close_time, create_time, update_time from dz_cards
     </sql>
 
     <select id="selectDzCardsList" parameterType="DzCards" resultMap="DzCardsResult">
@@ -54,8 +56,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isSettlement != null "> and is_settlement = #{isSettlement}</if>
             <if test="deptId != null "> and dept_id = #{deptId}</if>
             <if test="agentId != null "> and agent_id = #{agentId}</if>
-            <if test="leftAgentId != null "> and left_agent_id = #{leftAgentId}</if>
+            <if test="leafAgentId != null "> and leaf_agent_id = #{leafAgentId}</if>
             <if test="campusId != null "> and campus_id = #{campusId}</if>
+            <if test="assignLocation != null "> and assign_location = #{assignLocation}</if>
+            <if test="assignExamType != null "> and assign_exam_type = #{assignExamType}</if>
             <if test="assignSchoolId != null "> and assign_school_id = #{assignSchoolId}</if>
             <if test="schoolId != null "> and school_id = #{schoolId}</if>
             <if test="classId != null "> and class_id = #{classId}</if>
@@ -91,9 +95,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isSettlement != null">is_settlement,</if>
             <if test="deptId != null">dept_id,</if>
             <if test="agentId != null">agent_id,</if>
-            <if test="leftAgentId != null">left_agent_id,</if>
+            <if test="leafAgentId != null">leaf_agent_id,</if>
             <if test="campusId != null">campus_id,</if>
-            <if test="assignSchoolId != null">assign_school_id,</if>
+            assign_location,assign_exam_type,assign_school_id,
             <if test="schoolId != null">school_id,</if>
             <if test="classId != null">class_id,</if>
             <if test="year != null">year,</if>
@@ -122,9 +126,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isSettlement != null">#{isSettlement},</if>
             <if test="deptId != null">#{deptId},</if>
             <if test="agentId != null">#{agentId},</if>
-            <if test="leftAgentId != null">#{leftAgentId},</if>
+            <if test="leafAgentId != null">#{leafAgentId},</if>
             <if test="campusId != null">#{campusId},</if>
-            <if test="assignSchoolId != null">#{assignSchoolId},</if>
+            #{assignLocation},#{assignExamType},#{assignSchoolId},
             <if test="schoolId != null">#{schoolId},</if>
             <if test="classId != null">#{classId},</if>
             <if test="year != null">#{year},</if>
@@ -157,9 +161,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isSettlement != null">is_settlement = #{isSettlement},</if>
             <if test="deptId != null">dept_id = #{deptId},</if>
             <if test="agentId != null">agent_id = #{agentId},</if>
-            <if test="leftAgentId != null">left_agent_id = #{leftAgentId},</if>
+            <if test="leafAgentId != null">leaf_agent_id = #{leafAgentId},</if>
             <if test="campusId != null">campus_id = #{campusId},</if>
-            <if test="assignSchoolId != null">assign_school_id = #{assignSchoolId},</if>
+            assign_location = #{assignLocation},assign_exam_type = #{assignExamType},assign_school_id = #{assignSchoolId},
             <if test="schoolId != null">school_id = #{schoolId},</if>
             <if test="classId != null">class_id = #{classId},</if>
             <if test="year != null">year = #{year},</if>
@@ -195,8 +199,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectListByCond" parameterType="com.ruoyi.criteria.CardCriteria" resultMap="DzCardsResult">
         <include refid="selectDzCardsVo"/>
         <where>
-            <if test="startNo != null  and startNo != ''"> and card_no &gt; #{cardNo}</if>
-            <if test="endNo != null  and endNo != ''"> and card_no &lt; #{cardNo}</if>
+            <if test="startNo != null  and startNo != ''"> and card_no &gt;= #{startNo}</if>
+            <if test="endNo != null  and endNo != ''"> and card_no &lt;= #{endNo}</if>
             <if test="cardNo != null  and cardNo != ''"> and card_no = #{cardNo}</if>
             <if test="password != null  and password != ''"> and password = #{password}</if>
             <if test="type != null "> and type = #{type}</if>
@@ -207,8 +211,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isSettlement != null "> and is_settlement = #{isSettlement}</if>
             <if test="deptId != null "> and dept_id = #{deptId}</if>
             <if test="agentId != null "> and agent_id = #{agentId}</if>
-            <if test="leftAgentId != null "> and left_agent_id = #{leftAgentId}</if>
+            <if test="leafAgentId != null "> and leaf_agent_id = #{leafAgentId}</if>
             <if test="campusId != null "> and campus_id = #{campusId}</if>
+            <if test="assignLocation != null "> and assign_location = #{assignLocation}</if>
+            <if test="assignExamType != null "> and assign_exam_type = #{assignExamType}</if>
             <if test="assignSchoolId != null "> and assign_school_id = #{assignSchoolId}</if>
             <if test="schoolId != null "> and school_id = #{schoolId}</if>
             <if test="classId != null "> and class_id = #{classId}</if>

+ 5 - 0
ie-system/src/main/resources/mapper/dz/DzClassesMapper.xml

@@ -52,6 +52,11 @@
         WHERE tc.`teacher_id` = #{teacherId} AND NOW() &lt; tc.`out_date`
     </select>
 
+    <select id="selectClassesByIds" resultMap="DzClassesResult">
+        <include refid="selectDzClassesVo"/>
+        where t1.class_id in <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
+    </select>
+
     <select id="selectDzClassesByClassId" parameterType="Long" resultMap="DzClassesResult">
         <include refid="selectDzClassesVo"/>
         where t1.class_id = #{classId}

+ 14 - 1
ie-system/src/main/resources/mapper/dz/DzSchoolMapper.xml

@@ -40,7 +40,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectDzSchoolVo"/>
         <where>
             <if test="name != null  and name != ''"> and t1.name like concat('%', #{name}, '%')</if>
-            <if test="deptId != null "> and t1.dept_id = #{deptId}</if>
+<!--            <if test="deptId != null "> and t1.dept_id = #{deptId}</if>-->
+            <if test="deptId != null ">
+                AND (t1.dept_id = #{deptId} OR t1.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ))
+            </if>
             <if test="location != null  and location != ''"> and t1.location = #{location}</if>
             <if test="pro != null "> and t1.pro = #{pro}</if>
             <if test="city != null "> and t1.city = #{city}</if>
@@ -49,6 +52,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
     </select>
 
+    <select id="selectDzSchoolListByIds" resultMap="DzSchoolResult">
+        <include refid="selectDzSchoolVo"/>
+        WHERE 1=1
+        AND t1.id IN
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        ORDER BY t1.id ASC
+    </select>
+
     <select id="selectDzSchoolById" parameterType="Long" resultMap="DzSchoolResult">
         <include refid="selectDzSchoolVo"/>
         where t1.id = #{id}

+ 31 - 11
ie-system/src/main/resources/mapper/dz/DzTeacherClassMapper.xml

@@ -3,30 +3,30 @@
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.dz.mapper.DzTeacherClassMapper">
-    
+
     <resultMap type="DzTeacherClass" id="DzTeacherClassResult">
         <result property="id"    column="id"    />
         <result property="teacherId"    column="teacher_id"    />
-        <result property="classesId"    column="classes_id"    />
+        <result property="classId"    column="class_id"    />
         <result property="status"    column="status"    />
         <result property="remark"    column="remark"    />
         <result property="outDate"    column="out_date"    />
     </resultMap>
 
     <sql id="selectDzTeacherClassVo">
-        select id, teacher_id, classes_id, status, remark, out_date from dz_teacher_class
+        select id, teacher_id, class_id, status, remark, out_date from dz_teacher_class
     </sql>
 
     <select id="selectDzTeacherClassList" parameterType="DzTeacherClass" resultMap="DzTeacherClassResult">
         <include refid="selectDzTeacherClassVo"/>
-        <where>  
+        <where>
             <if test="teacherId != null "> and teacher_id = #{teacherId}</if>
-            <if test="classesId != null "> and classes_id = #{classesId}</if>
+            <if test="classId != null "> and class_id = #{classId}</if>
             <if test="status != null "> and status = #{status}</if>
             <if test="outDate != null "> and out_date = #{outDate}</if>
         </where>
     </select>
-    
+
     <select id="selectDzTeacherClassById" parameterType="String" resultMap="DzTeacherClassResult">
         <include refid="selectDzTeacherClassVo"/>
         where id = #{id}
@@ -36,25 +36,45 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         insert into dz_teacher_class
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="teacherId != null">teacher_id,</if>
-            <if test="classesId != null">classes_id,</if>
+            <if test="classId != null">class_id,</if>
             <if test="status != null">status,</if>
             <if test="remark != null">remark,</if>
             <if test="outDate != null">out_date,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="teacherId != null">#{teacherId},</if>
-            <if test="classesId != null">#{classesId},</if>
+            <if test="classId != null">#{classId},</if>
             <if test="status != null">#{status},</if>
             <if test="remark != null">#{remark},</if>
             <if test="outDate != null">#{outDate},</if>
          </trim>
     </insert>
 
+    <!-- 批量插入教师班级关联关系 -->
+    <insert id="insertBatch" parameterType="java.util.List">
+        INSERT INTO dz_teacher_class (
+        teacher_id,
+        class_id,
+        status,
+        create_time,
+        create_by
+        ) VALUES
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.teacherId},
+            #{item.classId},
+            #{item.status},
+            #{item.createTime},
+            #{item.createBy}
+            )
+        </foreach>
+    </insert>
+
     <update id="updateDzTeacherClass" parameterType="DzTeacherClass">
         update dz_teacher_class
         <trim prefix="SET" suffixOverrides=",">
             <if test="teacherId != null">teacher_id = #{teacherId},</if>
-            <if test="classesId != null">classes_id = #{classesId},</if>
+            <if test="classId != null">class_id = #{classId},</if>
             <if test="status != null">status = #{status},</if>
             <if test="remark != null">remark = #{remark},</if>
             <if test="outDate != null">out_date = #{outDate},</if>
@@ -67,9 +87,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <delete id="deleteDzTeacherClassByIds" parameterType="String">
-        delete from dz_teacher_class where id in 
+        delete from dz_teacher_class where id in
         <foreach item="id" collection="array" open="(" separator="," close=")">
             #{id}
         </foreach>
     </delete>
-</mapper>
+</mapper>

+ 5 - 0
ie-system/src/main/resources/mapper/ie/AMarjorPlanMapper.xml

@@ -107,6 +107,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where id = #{id}
     </select>
 
+    <select id="selectAMarjorPlanByIds" parameterType="Long" resultMap="AMarjorPlanResult">
+        <include refid="selectAMarjorPlanVo"/>
+        where id in <foreach item="id" collection="array" open="(" separator="," close=")">#{id}</foreach>
+    </select>
+
     <select id="selectMajorCodesByIds" parameterType="String" resultType="String">
         SELECT distinct m1.code majorCode
         FROM `a_marjor_plan` p

+ 11 - 1
ie-system/src/main/resources/mapper/learn/LearnDirectedKnowledgeMapper.xml

@@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <resultMap type="LearnDirectedKnowledge" id="LearnDirectedKnowledgeResult">
         <result property="id"    column="id"    />
         <result property="year"    column="year"    />
+        <result property="universityId"    column="university_id"    />
         <result property="directKey"    column="direct_key"    />
         <result property="enrollFormula"    column="enrollFormula"    />
         <result property="cultural"    column="cultural"    />
@@ -20,13 +21,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectLearnDirectedKnowledgeVo">
-        select id, year, direct_key, enrollFormula, cultural, professional, subjects, question_types, knowledges, locations, examineeTypes, conditions from learn_directed_knowledge
+        select id, year, university_id, direct_key, enrollFormula, cultural, professional, subjects, question_types, knowledges, locations, examineeTypes, conditions from learn_directed_knowledge
     </sql>
 
     <select id="selectLearnDirectedKnowledgeList" parameterType="LearnDirectedKnowledge" resultMap="LearnDirectedKnowledgeResult">
         <include refid="selectLearnDirectedKnowledgeVo"/>
         <where>  
             <if test="year != null "> and year = #{year}</if>
+            <if test="universityId != null  and universityId != ''"> and university_id = #{universityId}</if>
             <if test="directKey != null  and directKey != ''"> and direct_key = #{directKey}</if>
             <if test="enrollFormula != null  and enrollFormula != ''"> and enrollFormula = #{enrollFormula}</if>
             <if test="cultural != null  and cultural != ''"> and cultural = #{cultural}</if>
@@ -45,10 +47,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where id = #{id}
     </select>
 
+    <select id="selectByUniversityIds" parameterType="Long" resultMap="LearnDirectedKnowledgeResult">
+        <include refid="selectLearnDirectedKnowledgeVo"/>
+        where id in <foreach item="id" collection="array" open="(" separator="," close=")">#{id}</foreach>
+    </select>
+
     <insert id="insertLearnDirectedKnowledge" parameterType="LearnDirectedKnowledge" useGeneratedKeys="true" keyProperty="id">
         insert into learn_directed_knowledge
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="year != null">year,</if>
+            <if test="universityId != null">university_id,</if>
             <if test="directKey != null">direct_key,</if>
             <if test="enrollFormula != null">enrollFormula,</if>
             <if test="cultural != null">cultural,</if>
@@ -62,6 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="year != null">#{year},</if>
+            <if test="universityId != null">#{universityId},</if>
             <if test="directKey != null">#{directKey},</if>
             <if test="enrollFormula != null">#{enrollFormula},</if>
             <if test="cultural != null">#{cultural},</if>
@@ -79,6 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         update learn_directed_knowledge
         <trim prefix="SET" suffixOverrides=",">
             <if test="year != null">year = #{year},</if>
+            <if test="universityId != null">university_id = #{universityId},</if>
             <if test="directKey != null">direct_key = #{directKey},</if>
             <if test="enrollFormula != null">enrollFormula = #{enrollFormula},</if>
             <if test="cultural != null">cultural = #{cultural},</if>

+ 36 - 2
ie-system/src/main/resources/mapper/learn/LearnStudentMapper.xml

@@ -9,11 +9,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="classId"    column="class_id"    />
         <result property="campusId"    column="campus_id"    />
         <result property="universityId"    column="university_id"    />
+        <result property="directKey"    column="direct_key"    />
+        <result property="majorGroup"    column="major_group"    />
         <result property="majorPlanId"    column="major_plan_id"    />
     </resultMap>
 
     <sql id="selectLearnStudentVo">
-        select student_id, class_id, campus_id, university_id, major_plan_id from learn_student
+        select student_id, class_id, campus_id, university_id,direct_key, major_group,major_plan_id from learn_student
     </sql>
 
     <select id="selectLearnStudentList" parameterType="LearnStudent" resultMap="LearnStudentResult">
@@ -22,7 +24,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="directKey != null  and directKey != ''"> and direct_key = #{directKey}</if>
         </where>
     </select>
-    
+
+    <select id="selectLearnStudentsByMap" parameterType="map" resultMap="LearnStudentResult">
+        SELECT distinct ls.`university_id`, ls.`major_group`, ls.`major_plan_id`
+        FROM `learn_student` ls
+        LEFT JOIN `learn_test_student` ts ON ts.`student_id` = ls.`student_id` AND ts.`batch_id` = #{batchId}
+        JOIN `sys_user` u ON ls.`student_id` = u.`user_id`
+        <where> ts.`id` IS NULL and u.`location` = #{location}
+            <if test="examTypes != null  and examTypes.size() > 0"> AND u.`exam_type` in <foreach item="id" collection="examTypes" open="(" separator="," close=")">#{id}</foreach></if>
+            <if test="classIds != null  and classIds.size() > 0"> AND ls.`class_id` IN <foreach item="id" collection="classIds" open="(" separator="," close=")">#{id}</foreach></if>
+            <if test="universityIds != null  and universityIds.size() > 0"> AND ls.`university_id` IN <foreach item="id" collection="universityIds" open="(" separator="," close=")">#{id}</foreach></if>
+            <if test="groups != null  and groups.size() > 0"> AND ls.`major_group` IN <foreach item="id" collection="groups" open="(" separator="," close=")">#{id}</foreach></if>
+            <if test="planIds != null  and planIds.size() > 0"> AND ls.`major_plan_id` IN <foreach item="id" collection="planIds" open="(" separator="," close=")">#{id}</foreach></if>
+        </where>
+    </select>
+
+    <select id="selectClassStudents" resultMap="LearnStudentResult">
+        SELECT ls.*, u.nick_name studentName , tp.`paper_id` paperId, ts.`status`
+        FROM `learn_student` ls
+        JOIN `sys_user` u ON ls.`student_id` = u.`user_id`
+        LEFT JOIN `learn_test_paper` tp ON tp.`batch_id` = #{batchId} AND tp.`direct_key` = ls.`direct_key`
+        LEFT JOIN `learn_test_student` ts ON ts.`batch_id` = #{batchId} AND ls.`student_id` = ts.`student_id`
+        where ts.`id` IS NULL AND ls.`class_id` IN <foreach item="id" collection="classIds" open="(" separator="," close=")">#{id}</foreach>
+    </select>
+
+
+
+
     <select id="selectLearnStudentByStudentId" parameterType="Long" resultMap="LearnStudentResult">
         <include refid="selectLearnStudentVo"/>
         where student_id = #{studentId}
@@ -35,6 +63,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="classId != null">class_id,</if>
             <if test="campusId != null">campus_id,</if>
             <if test="universityId != null">university_id,</if>
+            <if test="directKey != null">direct_key,</if>
+            <if test="majorGroup != null">major_group,</if>
             <if test="majorPlanId != null">major_plan_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -42,6 +72,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="classId != null">#{classId},</if>
             <if test="campusId != null">#{campusId},</if>
             <if test="universityId != null">#{universityId},</if>
+            <if test="directKey != null">#{directKey},</if>
+            <if test="majorGroup != null">#{majorGroup},</if>
             <if test="majorPlanId != null">#{majorPlanId},</if>
          </trim>
     </insert>
@@ -52,6 +84,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="classId != null">class_id = #{classId},</if>
             <if test="campusId != null">campus_id = #{campusId},</if>
             <if test="universityId != null">university_id = #{universityId},</if>
+            <if test="directKey != null">direct_key = #{directKey},</if>
+            <if test="majorGroup != null">major_group = #{majorGroup},</if>
             <if test="majorPlanId != null">major_plan_id = #{majorPlanId},</if>
         </trim>
         where student_id = #{studentId}

+ 20 - 10
ie-system/src/main/resources/mapper/learn/LearnTestPaperMapper.xml

@@ -7,28 +7,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <resultMap type="LearnTestPaper" id="LearnTestPaperResult">
         <result property="id"    column="id"    />
         <result property="batchId"    column="batch_id"    />
+        <result property="universityId"    column="university_id"    />
         <result property="directKey"    column="direct_key"    />
         <result property="paperId"    column="paper_id"    />
-        <result property="condions"    column="condions"    />
+        <result property="conditions"    column="conditions"    />
         <result property="creatorId"    column="creator_id"    />
         <result property="createTime"    column="create_time"    />
     </resultMap>
 
     <sql id="selectLearnTestPaperVo">
-        select id, batch_id, direct_key, paper_id, condions, creator_id, create_time from learn_test_paper
+        select id, batch_id, university_id, direct_key, paper_id, conditions, creator_id, create_time from learn_test_paper
     </sql>
 
     <select id="selectLearnTestPaperList" parameterType="LearnTestPaper" resultMap="LearnTestPaperResult">
         <include refid="selectLearnTestPaperVo"/>
         <where>  
             <if test="batchId != null "> and batch_id = #{batchId}</if>
+            <if test="universityId != null "> and university_id = #{universityId}</if>
             <if test="directKey != null  and directKey != ''"> and direct_key = #{directKey}</if>
             <if test="paperId != null "> and paper_id = #{paperId}</if>
-            <if test="condions != null  and condions != ''"> and condions = #{condions}</if>
+            <if test="conditions != null  and conditions != ''"> and conditions = #{conditions}</if>
             <if test="creatorId != null "> and creator_id = #{creatorId}</if>
         </where>
     </select>
-    
+
+    <select id="selectByBatchAndUniversityIds" resultMap="LearnTestPaperResult">
+        <include refid="selectLearnTestPaperVo"/>
+        where batch_id = #{batchId} and university_id in <foreach item="id" collection="universityIds" open="(" separator="," close=")">#{id}</foreach>
+    </select>
+
     <select id="selectLearnTestPaperById" parameterType="String" resultMap="LearnTestPaperResult">
         <include refid="selectLearnTestPaperVo"/>
         where id = #{id}
@@ -38,17 +45,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         insert into learn_test_paper
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="batchId != null">batch_id,</if>
-            <if test="directKey != null and directKey != ''">direct_key,</if>
+            <if test="universityId != null">university_id,</if>
+            <if test="directKey != null ">direct_key,</if>
             <if test="paperId != null">paper_id,</if>
-            <if test="condions != null and condions != ''">condions,</if>
+            <if test="conditions != null">conditions,</if>
             <if test="creatorId != null">creator_id,</if>
             <if test="createTime != null">create_time,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="batchId != null">#{batchId},</if>
-            <if test="directKey != null and directKey != ''">#{directKey},</if>
+            <if test="universityId != null">#{universityId},</if>
+            <if test="directKey != null">#{directKey},</if>
             <if test="paperId != null">#{paperId},</if>
-            <if test="condions != null and condions != ''">#{condions},</if>
+            <if test="conditions != null">#{conditions},</if>
             <if test="creatorId != null">#{creatorId},</if>
             <if test="createTime != null">#{createTime},</if>
          </trim>
@@ -58,9 +67,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         update learn_test_paper
         <trim prefix="SET" suffixOverrides=",">
             <if test="batchId != null">batch_id = #{batchId},</if>
-            <if test="directKey != null and directKey != ''">direct_key = #{directKey},</if>
+            <if test="universityId != null">university_id = #{universityId},</if>
+            <if test="directKey != null">direct_key = #{directKey},</if>
             <if test="paperId != null">paper_id = #{paperId},</if>
-            <if test="condions != null and condions != ''">condions = #{condions},</if>
+            <if test="conditions != null">conditions = #{conditions},</if>
             <if test="creatorId != null">creator_id = #{creatorId},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
         </trim>

+ 13 - 0
ie-system/src/main/resources/mapper/learn/LearnTestStudentMapper.xml

@@ -20,6 +20,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select id, batch_id, student_id, direct_key, paper_id, class_id, examinee_id, status, create_time from learn_test_student
     </sql>
 
+    <select id="selectDirectedStudentList" parameterType="LearnTestStudent" resultMap="LearnTestStudentResult">
+        <include refid="selectLearnTestStudentVo"/>
+        <where>
+            <if test="batchId != null "> and batch_id = #{batchId}</if>
+            <if test="studentId != null "> and student_id = #{studentId}</if>
+            <if test="directKey != null  and directKey != ''"> and direct_key = #{directKey}</if>
+            <if test="paperId != null "> and paper_id = #{paperId}</if>
+            <if test="classId != null "> and class_id = #{classId}</if>
+            <if test="examineeId != null "> and examinee_id = #{examineeId}</if>
+            <if test="status != null "> and status = #{status}</if>
+        </where>
+    </select>
+
     <select id="selectLearnTestStudentList" parameterType="LearnTestStudent" resultMap="LearnTestStudentResult">
         <include refid="selectLearnTestStudentVo"/>
         <where>  

+ 10 - 0
ie-system/src/main/resources/mapper/system/SysAreaMapper.xml

@@ -71,6 +71,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by area_id asc
     </select>
 
+    <select id="selectSysAreaListByIds" parameterType="list" resultMap="SysAreaResult">
+        <include refid="selectSysAreaVo"/>
+        WHERE status = '0'
+        AND area_id IN
+        <foreach collection="list" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        ORDER BY area_id ASC
+    </select>
+
     <select id="selectSysAreaByAreaId" parameterType="Long" resultMap="SysAreaResult">
         <include refid="selectSysAreaVo"/>
         where area_id = #{areaId}

+ 6 - 0
ie-system/src/main/resources/mapper/system/SysDeptMapper.xml

@@ -64,6 +64,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		from sys_dept d
 		where d.dept_id = #{deptId}
 	</select>
+
+	<select id="selectDeptByIds" resultMap="SysDeptResult">
+		select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status
+		from sys_dept d
+		where d.dept_id in <foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach>
+	</select>
     
     <select id="checkDeptExistUser" parameterType="Long" resultType="int">
 		select count(1) from sys_user where dept_id = #{deptId} and del_flag = '0'

+ 1 - 0
ie-system/src/main/resources/mapper/syzy/BBusiWishUniversitiesMapper.xml

@@ -156,6 +156,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       <if test="featureses!= null"> and <foreach item="o" collection="featureses" open="(" separator=" OR " close=")">u.features like concat('%', #{o}, '%')</foreach></if>
       <if test="bxTypes!= null"> and <foreach item="o" collection="bxTypes" open="(" separator=" OR " close=")">u.bxType like concat('%', #{o}, '%')</foreach></if>
       <if test="enrollLocations!= null"> and <foreach item="o" collection="enrollLocations" open="(" separator=" OR " close=")">u.enrollLocation like concat('%', #{o}, '%')</foreach></if>
+      <if test="locations!= null"> and <foreach item="o" collection="locations" open="(" separator=" OR " close=")">u.location like concat('%', #{o}, '%')</foreach></if>
       <if test="stars!= null"> and <foreach item="o" collection="stars" open="(" separator=" OR " close=")">u.star like concat('%', #{o}, '%')</foreach></if>
       <if test="filterRank!= null and filterRank"> and u.star &gt; 0 </if>
       <if test="codes!= null">

Некоторые файлы не были показаны из-за большого количества измененных файлов