ソースを参照

对接融合平台服务

bill 3 年 前
コミット
1c42e1abcf

+ 1 - 0
package.json

@@ -9,6 +9,7 @@
     "preview": "vite preview"
   },
   "dependencies": {
+    "ant-design-vue": "^3.3.0-beta.3",
     "axios": "^0.27.2",
     "mitt": "^3.0.0",
     "vue": "^3.2.37",

+ 384 - 293
pnpm-lock.yaml

@@ -1,8 +1,9 @@
-lockfileVersion: 5.4
+lockfileVersion: 5.3
 
 specifiers:
   '@types/node': ^18.6.5
   '@vitejs/plugin-vue': ^3.0.0
+  ant-design-vue: ^3.3.0-beta.3
   axios: ^0.27.2
   mitt: ^3.0.0
   sass: ^1.54.3
@@ -14,6 +15,7 @@ specifiers:
   vue-tsc: ^0.38.4
 
 dependencies:
+  ant-design-vue: 3.3.0-beta.3_vue@3.2.37
   axios: 0.27.2
   mitt: 3.0.0
   vue: 3.2.37
@@ -30,12 +32,60 @@ devDependencies:
 
 packages:
 
+  /@ant-design/colors/6.0.0:
+    resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==}
+    dependencies:
+      '@ctrl/tinycolor': 3.4.1
+    dev: false
+
+  /@ant-design/icons-svg/4.2.1:
+    resolution: {integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==}
+    dev: false
+
+  /@ant-design/icons-vue/6.1.0_vue@3.2.37:
+    resolution: {integrity: sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==}
+    peerDependencies:
+      vue: '>=3.0.3'
+    dependencies:
+      '@ant-design/colors': 6.0.0
+      '@ant-design/icons-svg': 4.2.1
+      vue: 3.2.37
+    dev: false
+
   /@babel/parser/7.18.11:
     resolution: {integrity: sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==}
     engines: {node: '>=6.0.0'}
     hasBin: true
     dependencies:
-      '@babel/types': registry.npmmirror.com/@babel/types/7.18.10
+      '@babel/types': link:registry.npmmirror.com/@babel/types/7.18.10
+
+  /@babel/runtime/7.18.9:
+    resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      regenerator-runtime: 0.13.9
+    dev: false
+
+  /@ctrl/tinycolor/3.4.1:
+    resolution: {integrity: sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /@esbuild/linux-loong64/0.14.54:
+    resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@simonwep/pickr/1.8.2:
+    resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==}
+    dependencies:
+      core-js: 3.24.1
+      nanopop: 2.1.0
+    dev: false
 
   /@types/node/18.6.5:
     resolution: {integrity: sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==}
@@ -139,6 +189,7 @@ packages:
     dependencies:
       '@vue/reactivity': 3.2.37
       '@vue/shared': 3.2.37
+    dev: false
 
   /@vue/runtime-dom/3.2.37:
     resolution: {integrity: sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==}
@@ -146,6 +197,7 @@ packages:
       '@vue/runtime-core': 3.2.37
       '@vue/shared': 3.2.37
       csstype: 2.6.20
+    dev: false
 
   /@vue/server-renderer/3.2.37_vue@3.2.37:
     resolution: {integrity: sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==}
@@ -155,10 +207,37 @@ packages:
       '@vue/compiler-ssr': 3.2.37
       '@vue/shared': 3.2.37
       vue: 3.2.37
+    dev: false
 
   /@vue/shared/3.2.37:
     resolution: {integrity: sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==}
 
+  /ant-design-vue/3.3.0-beta.3_vue@3.2.37:
+    resolution: {integrity: sha512-xA7clMwKRw2S6E8etiq7FRN8qktRW6xr9HBuEuUDQwsbxLIy1kVKfiTbdbh+CklmasKGd9qvEJbzc65U/HJeOw==}
+    engines: {node: '>=12.22.0'}
+    peerDependencies:
+      vue: '>=3.2.0'
+    dependencies:
+      '@ant-design/colors': 6.0.0
+      '@ant-design/icons-vue': 6.1.0_vue@3.2.37
+      '@babel/runtime': 7.18.9
+      '@ctrl/tinycolor': 3.4.1
+      '@simonwep/pickr': 1.8.2
+      array-tree-filter: 2.1.0
+      async-validator: 4.2.5
+      dayjs: 1.11.5
+      dom-align: 1.12.3
+      dom-scroll-into-view: 2.0.1
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+      resize-observer-polyfill: 1.5.1
+      scroll-into-view-if-needed: 2.2.29
+      shallow-equal: 1.2.1
+      vue: 3.2.37
+      vue-types: 3.0.2_vue@3.2.37
+      warning: 4.0.3
+    dev: false
+
   /anymatch/3.1.2:
     resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
     engines: {node: '>= 8'}
@@ -167,6 +246,14 @@ packages:
       picomatch: 2.3.1
     dev: true
 
+  /array-tree-filter/2.1.0:
+    resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==}
+    dev: false
+
+  /async-validator/4.2.5:
+    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+    dev: false
+
   /asynckit/0.4.0:
     resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
     dev: false
@@ -204,7 +291,7 @@ packages:
       normalize-path: 3.0.0
       readdirp: 3.6.0
     optionalDependencies:
-      fsevents: registry.npmmirror.com/fsevents/2.3.2
+      fsevents: 2.3.2
     dev: true
 
   /combined-stream/1.0.8:
@@ -214,41 +301,243 @@ packages:
       delayed-stream: 1.0.0
     dev: false
 
+  /compute-scroll-into-view/1.0.17:
+    resolution: {integrity: sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==}
+    dev: false
+
+  /core-js/3.24.1:
+    resolution: {integrity: sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==}
+    requiresBuild: true
+    dev: false
+
   /csstype/2.6.20:
     resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==}
+    dev: false
+
+  /dayjs/1.11.5:
+    resolution: {integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==}
+    dev: false
 
   /delayed-stream/1.0.0:
     resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
     engines: {node: '>=0.4.0'}
     dev: false
 
+  /dom-align/1.12.3:
+    resolution: {integrity: sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==}
+    dev: false
+
+  /dom-scroll-into-view/2.0.1:
+    resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==}
+    dev: false
+
+  /esbuild-android-64/0.14.54:
+    resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-android-arm64/0.14.54:
+    resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-darwin-64/0.14.54:
+    resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-darwin-arm64/0.14.54:
+    resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-freebsd-64/0.14.54:
+    resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-freebsd-arm64/0.14.54:
+    resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-32/0.14.54:
+    resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-64/0.14.54:
+    resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-arm/0.14.54:
+    resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-arm64/0.14.54:
+    resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-mips64le/0.14.54:
+    resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-ppc64le/0.14.54:
+    resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-riscv64/0.14.54:
+    resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-s390x/0.14.54:
+    resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-netbsd-64/0.14.54:
+    resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-openbsd-64/0.14.54:
+    resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-sunos-64/0.14.54:
+    resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-32/0.14.54:
+    resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-64/0.14.54:
+    resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-arm64/0.14.54:
+    resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /esbuild/0.14.54:
     resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
     optionalDependencies:
-      '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64/0.14.54
-      esbuild-android-64: registry.npmmirror.com/esbuild-android-64/0.14.54
-      esbuild-android-arm64: registry.npmmirror.com/esbuild-android-arm64/0.14.54
-      esbuild-darwin-64: registry.npmmirror.com/esbuild-darwin-64/0.14.54
-      esbuild-darwin-arm64: registry.npmmirror.com/esbuild-darwin-arm64/0.14.54
-      esbuild-freebsd-64: registry.npmmirror.com/esbuild-freebsd-64/0.14.54
-      esbuild-freebsd-arm64: registry.npmmirror.com/esbuild-freebsd-arm64/0.14.54
-      esbuild-linux-32: registry.npmmirror.com/esbuild-linux-32/0.14.54
-      esbuild-linux-64: registry.npmmirror.com/esbuild-linux-64/0.14.54
-      esbuild-linux-arm: registry.npmmirror.com/esbuild-linux-arm/0.14.54
-      esbuild-linux-arm64: registry.npmmirror.com/esbuild-linux-arm64/0.14.54
-      esbuild-linux-mips64le: registry.npmmirror.com/esbuild-linux-mips64le/0.14.54
-      esbuild-linux-ppc64le: registry.npmmirror.com/esbuild-linux-ppc64le/0.14.54
-      esbuild-linux-riscv64: registry.npmmirror.com/esbuild-linux-riscv64/0.14.54
-      esbuild-linux-s390x: registry.npmmirror.com/esbuild-linux-s390x/0.14.54
-      esbuild-netbsd-64: registry.npmmirror.com/esbuild-netbsd-64/0.14.54
-      esbuild-openbsd-64: registry.npmmirror.com/esbuild-openbsd-64/0.14.54
-      esbuild-sunos-64: registry.npmmirror.com/esbuild-sunos-64/0.14.54
-      esbuild-windows-32: registry.npmmirror.com/esbuild-windows-32/0.14.54
-      esbuild-windows-64: registry.npmmirror.com/esbuild-windows-64/0.14.54
-      esbuild-windows-arm64: registry.npmmirror.com/esbuild-windows-arm64/0.14.54
+      '@esbuild/linux-loong64': 0.14.54
+      esbuild-android-64: 0.14.54
+      esbuild-android-arm64: 0.14.54
+      esbuild-darwin-64: 0.14.54
+      esbuild-darwin-arm64: 0.14.54
+      esbuild-freebsd-64: 0.14.54
+      esbuild-freebsd-arm64: 0.14.54
+      esbuild-linux-32: 0.14.54
+      esbuild-linux-64: 0.14.54
+      esbuild-linux-arm: 0.14.54
+      esbuild-linux-arm64: 0.14.54
+      esbuild-linux-mips64le: 0.14.54
+      esbuild-linux-ppc64le: 0.14.54
+      esbuild-linux-riscv64: 0.14.54
+      esbuild-linux-s390x: 0.14.54
+      esbuild-netbsd-64: 0.14.54
+      esbuild-openbsd-64: 0.14.54
+      esbuild-sunos-64: 0.14.54
+      esbuild-windows-32: 0.14.54
+      esbuild-windows-64: 0.14.54
+      esbuild-windows-arm64: 0.14.54
     dev: true
 
   /estree-walker/2.0.2:
@@ -280,6 +569,14 @@ packages:
       mime-types: 2.1.35
     dev: false
 
+  /fsevents/2.3.2:
+    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /function-bind/1.1.1:
     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
     dev: true
@@ -332,6 +629,30 @@ packages:
     engines: {node: '>=0.12.0'}
     dev: true
 
+  /is-plain-object/3.0.1:
+    resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==}
+    engines: {node: '>=0.10.0'}
+    dev: false
+
+  /js-tokens/4.0.0:
+    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+    dev: false
+
+  /lodash-es/4.17.21:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+    dev: false
+
+  /lodash/4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+    dev: false
+
+  /loose-envify/1.4.0:
+    resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+    hasBin: true
+    dependencies:
+      js-tokens: 4.0.0
+    dev: false
+
   /magic-string/0.25.9:
     resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
     dependencies:
@@ -358,6 +679,10 @@ packages:
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
 
+  /nanopop/2.1.0:
+    resolution: {integrity: sha512-jGTwpFRexSH+fxappnGQtN9dspgE2ipa1aOjtR24igG0pv6JCxImIAmrLRHX+zUF5+1wtsFVbKyfP51kIGAVNw==}
+    dev: false
+
   /normalize-path/3.0.0:
     resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
     engines: {node: '>=0.10.0'}
@@ -390,6 +715,14 @@ packages:
       picomatch: 2.3.1
     dev: true
 
+  /regenerator-runtime/0.13.9:
+    resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==}
+    dev: false
+
+  /resize-observer-polyfill/1.5.1:
+    resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+    dev: false
+
   /resolve/1.22.1:
     resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
     hasBin: true
@@ -404,7 +737,7 @@ packages:
     engines: {node: '>=10.0.0'}
     hasBin: true
     optionalDependencies:
-      fsevents: registry.npmmirror.com/fsevents/2.3.2
+      fsevents: 2.3.2
     dev: true
 
   /sass/1.54.3:
@@ -417,6 +750,16 @@ packages:
       source-map-js: 1.0.2
     dev: true
 
+  /scroll-into-view-if-needed/2.2.29:
+    resolution: {integrity: sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==}
+    dependencies:
+      compute-scroll-into-view: 1.0.17
+    dev: false
+
+  /shallow-equal/1.2.1:
+    resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==}
+    dev: false
+
   /source-map-js/1.0.2:
     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
     engines: {node: '>=0.10.0'}
@@ -471,7 +814,7 @@ packages:
       rollup: 2.77.2
       sass: 1.54.3
     optionalDependencies:
-      fsevents: registry.npmmirror.com/fsevents/2.3.2
+      fsevents: 2.3.2
     dev: true
 
   /vue-cropper/0.5.8:
@@ -497,6 +840,16 @@ packages:
       typescript: 4.7.4
     dev: true
 
+  /vue-types/3.0.2_vue@3.2.37:
+    resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==}
+    engines: {node: '>=10.15.0'}
+    peerDependencies:
+      vue: ^3.0.0
+    dependencies:
+      is-plain-object: 3.0.1
+      vue: 3.2.37
+    dev: false
+
   /vue/3.2.37:
     resolution: {integrity: sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==}
     dependencies:
@@ -505,272 +858,10 @@ packages:
       '@vue/runtime-dom': 3.2.37
       '@vue/server-renderer': 3.2.37_vue@3.2.37
       '@vue/shared': 3.2.37
+    dev: false
 
-  registry.npmmirror.com/@babel/helper-string-parser/7.18.10:
-    resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz}
-    name: '@babel/helper-string-parser'
-    version: 7.18.10
-    engines: {node: '>=6.9.0'}
-
-  registry.npmmirror.com/@babel/helper-validator-identifier/7.18.6:
-    resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz}
-    name: '@babel/helper-validator-identifier'
-    version: 7.18.6
-    engines: {node: '>=6.9.0'}
-
-  registry.npmmirror.com/@babel/types/7.18.10:
-    resolution: {integrity: sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.18.10.tgz}
-    name: '@babel/types'
-    version: 7.18.10
-    engines: {node: '>=6.9.0'}
+  /warning/4.0.3:
+    resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
     dependencies:
-      '@babel/helper-string-parser': registry.npmmirror.com/@babel/helper-string-parser/7.18.10
-      '@babel/helper-validator-identifier': registry.npmmirror.com/@babel/helper-validator-identifier/7.18.6
-      to-fast-properties: registry.npmmirror.com/to-fast-properties/2.0.0
-
-  registry.npmmirror.com/@esbuild/linux-loong64/0.14.54:
-    resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz}
-    name: '@esbuild/linux-loong64'
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-android-64/0.14.54:
-    resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz}
-    name: esbuild-android-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-android-arm64/0.14.54:
-    resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz}
-    name: esbuild-android-arm64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-darwin-64/0.14.54:
-    resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz}
-    name: esbuild-darwin-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-darwin-arm64/0.14.54:
-    resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz}
-    name: esbuild-darwin-arm64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-freebsd-64/0.14.54:
-    resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz}
-    name: esbuild-freebsd-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-freebsd-arm64/0.14.54:
-    resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz}
-    name: esbuild-freebsd-arm64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-32/0.14.54:
-    resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz}
-    name: esbuild-linux-32
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-64/0.14.54:
-    resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz}
-    name: esbuild-linux-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-arm/0.14.54:
-    resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz}
-    name: esbuild-linux-arm
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-arm64/0.14.54:
-    resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz}
-    name: esbuild-linux-arm64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-mips64le/0.14.54:
-    resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz}
-    name: esbuild-linux-mips64le
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-ppc64le/0.14.54:
-    resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz}
-    name: esbuild-linux-ppc64le
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-riscv64/0.14.54:
-    resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz}
-    name: esbuild-linux-riscv64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-s390x/0.14.54:
-    resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz}
-    name: esbuild-linux-s390x
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-netbsd-64/0.14.54:
-    resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz}
-    name: esbuild-netbsd-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-openbsd-64/0.14.54:
-    resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz}
-    name: esbuild-openbsd-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-sunos-64/0.14.54:
-    resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz}
-    name: esbuild-sunos-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-windows-32/0.14.54:
-    resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz}
-    name: esbuild-windows-32
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-windows-64/0.14.54:
-    resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz}
-    name: esbuild-windows-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-windows-arm64/0.14.54:
-    resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz}
-    name: esbuild-windows-arm64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/fsevents/2.3.2:
-    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz}
-    name: fsevents
-    version: 2.3.2
-    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/to-fast-properties/2.0.0:
-    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz}
-    name: to-fast-properties
-    version: 2.0.0
-    engines: {node: '>=4'}
+      loose-envify: 1.4.0
+    dev: false

+ 30 - 20
src/api/constant.ts

@@ -2,7 +2,7 @@ import { params } from '@/env'
 
 export enum ResCode {
   TOKEN_INVALID = 4008,
-  SUCCESS = 200
+  SUCCESS = 0
 }
 
 export const ResCodeDesc: { [key in ResCode]: string } = {
@@ -15,33 +15,43 @@ export const UPLOAD_HEADS = {
 }
 
 
-// 模型列表
-export const MODEL_LIST = `/laser/sceneFusion/${params.m}/list/${params.id}`
-export const INSERT_MODEL = `/laser/sceneFusion/${params.m}/uploadFile/${params.id}`
-export const UPDATE_MODEL = `/laser/sceneFusion/${params.m}/updateModel`
-export const DELETE_MODEL = `/laser/sceneFusion/${params.m}/del`
+// 融合模型列表
+export const FUSE_MODEL_LIST = `/fusion/caseFusion/list`
+export const FUSE_INSERT_MODEL = `/fusion/caseFusion/add`
+export const FUSE_UPDATE_MODEL = `/fusion/caseFusion/update`
+export const FUSE_DELETE_MODEL = `/fusion/caseFusion/delete`
+// 场景列表
+export const MODEL_LIST = `/fusion/case/sceneList`
 
 // 标注列表
-export const TAGGING_LIST = `/laser/sceneTag/${params.m}/list/${params.fushId}`
-export const INSERT_TAGGING = `/laser/sceneTag/${params.m}/add`
-export const UPDATE_TAGGING = `/laser/sceneTag/${params.m}/edit`
-export const DELETE_TAGGING = `/laser/sceneTag/${params.m}/delete`
+export const TAGGING_LIST = `/fusion/caseTag/allList`
+export const INSERT_TAGGING = `/fusion/caseTag/add`
+export const UPDATE_TAGGING = `/fusion/caseTag/update`
+export const DELETE_TAGGING = `/fusion/caseTag/delete`
 
 // 标注放置列表
-export const TAGGING_POINT_LIST = `/laser/caseTagPoint/${params.m}/list/`
-export const INSERT_TAGGING_POINT = `/laser/caseTagPoint/${params.m}/place`
-export const UPDATE_TAGGING_POINT = `/laser/sceneTag/${params.m}/edit`
-export const DELETE_TAGGING_POINT = `/laser/caseTagPoint/${params.m}/delete`
+export const TAGGING_POINT_LIST = `/fusion/caseTagPoint/allList`
+export const INSERT_TAGGING_POINT = `/fusion/caseTagPoint/place`
+export const UPDATE_TAGGING_POINT = `/fusion/caseTagPoint/update`
+export const DELETE_TAGGING_POINT = `/fusion/caseTagPoint/delete`
 
 // 标注样式类型列表
-export const TAGGING_STYLE_LIST = ''
+export const TAGGING_STYLE_LIST = '/fusion/edit/hotIcon/list'
+export const INSERT_TAGGING_STYLE = '/fusion/edit/hotIcon/add'
+export const DELETE_TAGGING_STYLE = '/fusion/edit/hotIcon/delete'
 
 // 导览
-export const GUIDE_LIST = `/laser/fusionGuide/${params.m}/list/${params.fushId}`
-export const INSERT_GUIDE = `/laser/fusionGuide/${params.m}/add`
-export const UPDATE_GUIDE = `/laser/fusionGuide/${params.m}/edit`
-export const DELETE_GUIDE = `/laser/fusionGuide/${params.m}/delete`
+export const GUIDE_LIST = `/fusion/fusionGuide/allList`
+export const INSERT_GUIDE = `/fusion/fusionGuide/add`
+export const UPDATE_GUIDE = `/fusion/fusionGuide/update`
+export const DELETE_GUIDE = `/fusion/fusionGuide/delete`
+
+// 导览路线
+export const GUIDE_PATH_LIST = `/fusion/fusionGuidePath/allList`
+export const INSERT_GUIDE_PATH = `/fusion/fusionGuidePath/add`
+export const UPDATE_GUIDE_PATH = `/fusion/fusionGuidePath/update`
+export const DELETE_GUIDE_PATH = `/fusion/fusionGuidePath/delete`
 
 
 // 文件上传
-export const UPLOAD_FILE = `/laser/oss/${params.m}/fuse-code/upload/fire`
+export const UPLOAD_FILE = `/fusion/upload/file`

+ 117 - 0
src/api/fuse-model.ts

@@ -0,0 +1,117 @@
+import axios from './instance'
+import { 
+  FUSE_MODEL_LIST,
+  FUSE_INSERT_MODEL,
+  FUSE_UPDATE_MODEL,
+  FUSE_DELETE_MODEL,
+} from './constant'
+import { params } from '@/env'
+
+import { Scene, SceneType } from './scene'
+
+
+export interface FuseModelAttrs {
+  show: boolean,
+  scale: number,
+  opacity: number,
+  bottom: number,
+  position: SceneLocalPos,
+  rotation: SceneLocalPos
+}
+
+export interface FuseModel extends FuseModelAttrs {
+  id: string
+  modelId: number
+  fusionNumId: number,
+  url: string
+  title: string
+  fusionId?: number,
+  type: SceneType
+  size: number,
+  time: string
+}
+
+interface ServiceFuseModel {
+  fusionId: number
+  hide: number,
+  opacity: number
+  bottom: number
+  fusionNumId: number,
+  transform: {
+    position: SceneLocalPos, 
+    rotation: SceneLocalPos, 
+    scale: [number, number, number]
+  },
+  sceneData: Scene
+}
+
+const serviceToLocal = (serviceModel: ServiceFuseModel): FuseModel => ({
+  show: !serviceModel.hide,
+  scale: serviceModel.transform.scale[0],
+  opacity: serviceModel.opacity || 1,
+  bottom: serviceModel.bottom || 0,
+  fusionNumId: serviceModel.fusionNumId,
+  position: serviceModel.transform.position,
+  rotation: serviceModel.transform.rotation,
+  id: serviceModel.fusionId.toString(),
+  url: serviceModel.sceneData.type === SceneType.SWSS ? serviceModel.sceneData.num : serviceModel.sceneData.modelGlbUrl,
+  title: serviceModel.sceneData.name,
+  modelId: serviceModel.sceneData.modelId,
+  fusionId: serviceModel.fusionId,
+  type: serviceModel.sceneData.type,
+  size: serviceModel.sceneData.modelSize,
+  time: serviceModel.sceneData.createTime
+})
+
+const localToService = (model: FuseModel): Omit<ServiceFuseModel, 'sceneData'> => ({
+  fusionId: Number(model.id),
+  hide: Number(!model.show),
+  opacity: model.opacity,
+  fusionNumId: model.fusionNumId,
+  bottom: model.bottom,
+  transform: {
+    position: model.position, 
+    rotation: model.rotation, 
+    scale: [model.scale, model.scale, model.scale]
+  }
+})
+
+export type FuseModels = FuseModel[]
+
+export const fetchFuseModels = async () => {
+  const serviceModels = await axios.get<ServiceFuseModel[]>(FUSE_MODEL_LIST, { params: { caseId: params.caseId } })
+  return serviceModels.map(serviceToLocal)
+} 
+
+export const postAddFuseModel = async (model: FuseModel) => {
+  const upload = localToService(model)
+  const serviceModel = await axios<ServiceFuseModel>({
+    url: FUSE_INSERT_MODEL,
+    method: 'POST',
+    data: {
+      caseId: params.caseId,
+      modelId: model.modelId,
+      hide: upload.hide,
+      transform: upload.transform,
+      opacity: upload.opacity,
+      bottom: upload.bottom
+    }
+  })
+  return serviceToLocal(serviceModel)
+}
+
+export const postUpdateFuseModels = (model: FuseModel) => {
+  const upload = localToService(model)
+  return axios.post<undefined>(FUSE_UPDATE_MODEL, {
+    fusionNumId: upload.fusionNumId,
+    hide: upload.hide,
+    transform: upload.transform,
+    opacity: upload.opacity,
+    bottom: upload.bottom
+  })
+}
+
+export const postDeleteFuseModel = (model: FuseModel) => {
+  return axios.post<undefined>(FUSE_DELETE_MODEL, { fusionNumId: model.fusionNumId })
+}
+

+ 18 - 1
src/api/index.ts

@@ -3,8 +3,25 @@
 export { ResCode } from './constant'
 export type { ResData } from './setup'
 
+
+export type BasePagingRequest = {
+  pageNum: number,
+  pageSize: number,
+}
+
+export type ParamsPagingRequest = {[key in string]: any}
+
+export type PagingRequest<T extends ParamsPagingRequest> = BasePagingRequest & T
+export type PagingResult<T> = {
+  list: T,
+  total: number,
+  pageNum: number,
+  pageSize: number
+}
+
 export * from './instance'
-export * from './model'
+export * from './scene'
+export * from './fuse-model'
 export * from './tagging'
 export * from './tagging-style'
 export * from './tagging-position'

+ 15 - 14
src/api/instance.ts

@@ -2,8 +2,8 @@ import { axiosFactory } from './setup'
 import { Message } from 'bill/index'
 import { showLoad, hideLoad } from '@/utils'
 import * as URL from './constant'
-import { ResCode, ResCodeDesc } from './constant'
-import { baseURL } from '@/env'
+import { ResCodeDesc } from './constant'
+import { baseURL, params } from '@/env'
 
 const instance = axiosFactory()
 
@@ -41,19 +41,20 @@ addResErrorHandler(
 addHook({ before: showLoad, after: hideLoad })
 
 addUnsetTokenURLS(
-  URL.MODEL_LIST,
-  URL.UPDATE_MODEL,
-  URL.INSERT_MODEL,
-  URL.DELETE_MODEL,
-  URL.TAGGING_LIST,
-  URL.DELETE_TAGGING,
-  URL.INSERT_TAGGING,
-  URL.UPDATE_TAGGING,
-  URL.TAGGING_POINT_LIST,
-  URL.INSERT_TAGGING_POINT,
-  URL.UPDATE_TAGGING_POINT,
-  URL.DELETE_TAGGING_POINT,
+  // URL.FUSE_MODEL_LIST,
+  // URL.FUSE_UPDATE_MODEL,
+  // URL.FUSE_INSERT_MODEL,
+  // URL.FUSE_DELETE_MODEL,
+  // URL.TAGGING_LIST,
+  // URL.DELETE_TAGGING,
+  // URL.INSERT_TAGGING,
+  // URL.UPDATE_TAGGING,
+  // URL.TAGGING_POINT_LIST,
+  // URL.INSERT_TAGGING_POINT,
+  // URL.UPDATE_TAGGING_POINT,
+  // URL.DELETE_TAGGING_POINT,
 )
 setDefaultURI(baseURL)
+params.token && setToken(params.token)
 
 export default axios

+ 0 - 127
src/api/model.ts

@@ -1,127 +0,0 @@
-import axios from './instance'
-import { 
-  MODEL_LIST,
-  INSERT_MODEL,
-  UPDATE_MODEL,
-  DELETE_MODEL,
-  UPLOAD_HEADS
-} from './constant'
-
-export enum ModelType {
-  SWKK = 'swkk',
-  SWKJ = 'swkj',
-  SWMX = 'glb',
-  SWSS = 'laser',
-}
-
-export const ModelTypeDesc: Record<ModelType, string>  = {
-  [ModelType.SWKK]: '四维看看',
-  [ModelType.SWKJ]: '四维看见',
-  [ModelType.SWSS]: '四维深时',
-  [ModelType.SWMX]: '三维模型',
-}
-
-export interface ModelAttrs {
-  show: boolean,
-  scale: number,
-  opacity: number,
-  bottom: number,
-  position: SceneLocalPos,
-  rotation: SceneLocalPos
-}
-export interface Model extends ModelAttrs {
-  id: string
-  url: string
-  title: string
-  fusionId?: number,
-  type: ModelType
-  size: number,
-  time: string
-}
-
-interface ServiceModel {
-  createTime: string,
-  id: number,
-  hide: number,
-  modelDateType: string
-  modelGlbUrl: string
-  fusionId?: number,
-  modelSize: number
-  modelTitle: string
-  opacity: number
-  bottom: number
-  type: number
-  transform: {
-    position: SceneLocalPos, 
-    rotation: SceneLocalPos, 
-    scale: [number, number, number]
-  }
-}
-
-const serviceToLocal = (serviceModel: ServiceModel): Model => ({
-  show: !serviceModel.hide,
-  scale: serviceModel.transform.scale[0],
-  opacity: serviceModel.opacity || 1,
-  bottom: serviceModel.bottom || 0,
-  position: serviceModel.transform.position,
-  rotation: serviceModel.transform.rotation,
-  id: serviceModel.id.toString(),
-  url: serviceModel.modelGlbUrl,
-  title: serviceModel.modelTitle,
-  fusionId: serviceModel.fusionId,
-  type:  serviceModel.type === 2 ? ModelType.SWSS : ModelType.SWMX,
-  size: serviceModel.modelSize,
-  time: serviceModel.createTime
-})
-
-const localToService = (model: Model): ServiceModel => ({
-  createTime: model.time,
-  id: Number(model.id),
-  hide: Number(!model.show),
-  fusionId: model.fusionId,
-  modelDateType: model.type,
-  modelGlbUrl: model.url,
-  type: model.type === ModelType.SWSS ? 2 : 3,
-  modelSize: model.size,
-  modelTitle: model.title,
-  opacity: model.opacity,
-  bottom: model.bottom,
-  transform: {
-    position: model.position, 
-    rotation: model.rotation, 
-    scale: [model.scale, model.scale, model.scale]
-  }
-})
-
-export type Models = Model[]
-
-export const fetchModels = async () => {
-  const serviceModels = await axios.post<ServiceModel[]>(MODEL_LIST)
-  return serviceModels.map(serviceToLocal)
-} 
-
-export const postAddModel = async (file: File) => {
-  const form = new FormData()
-  form.append('file', file)
-
-  const serviceModel = await axios<ServiceModel>({
-    url: INSERT_MODEL,
-    method: 'POST',
-    headers: { ...UPLOAD_HEADS },
-    data: form
-  })
-  return serviceToLocal(serviceModel)
-}
-
-export const postUpdateModels = (model: Model) => {
-  console.log('update', model)
-  return axios.post<undefined>(UPDATE_MODEL, localToService(model))
-}
-  
-
-export const postDeleteModel = (id: Model['id']) => {
-  console.log('delete')
-  return axios.post<undefined>(DELETE_MODEL, {ids: [id]})
-}
-
-  

+ 41 - 0
src/api/scene.ts

@@ -0,0 +1,41 @@
+import axios from './instance'
+import { MODEL_LIST } from './constant'
+import { params } from '@/env'
+
+export enum SceneType {
+  SWKK = 0,
+  SWKJ = 1,
+  SWSS = 2,
+  SWMX = 3,
+}
+
+export const SceneTypeDesc: Record<SceneType, string>  = {
+  [SceneType.SWKK]: '四维看看',
+  [SceneType.SWKJ]: '四维看见',
+  [SceneType.SWSS]: '四维深时',
+  [SceneType.SWMX]: '三维模型',
+}
+
+export interface Scene {
+  createTime: string
+  id: number
+  isLaser: boolean
+  modelDateType: string
+  modelGlbUrl: string
+  modelId: number
+  modelObjUrl: string
+  modelSize: number
+  modelTitle: string
+  name: string
+  num: string
+  sceneName: string
+  snCode: string
+  thumb: string
+  title: string
+  type: SceneType
+}
+
+export type Scenes = Scene[]
+
+export const fetchScenes = () => 
+  axios.post<Scenes>(MODEL_LIST, { caseId: params.caseId })

+ 2 - 2
src/api/tagging-position.ts

@@ -6,7 +6,7 @@ import {
   INSERT_TAGGING_POINT
 } from './constant'
 
-import type { Model } from './model'
+import type { FuseModel } from './fuse-model'
 import type { Tagging } from './tagging'
 
 interface ServicePosition {
@@ -19,7 +19,7 @@ interface ServicePosition {
 export interface TaggingPosition {
   id: string,
   taggingId: Tagging['id']
-  modelId: Model['id']
+  modelId: FuseModel['id']
   localPos: SceneLocalPos
 }
 

+ 2 - 2
src/api/tagging.ts

@@ -7,7 +7,7 @@ import {
   UPDATE_TAGGING
 } from './constant'
 
-import type { Model } from './model'
+import type { FuseModel } from './fuse-model'
 import type { TaggingPosition } from './tagging-position'
 import type { TaggingStyle } from './tagging-style'
 
@@ -51,7 +51,7 @@ const serviceToLocal = (serviceTagging: ServerTagging): Tagging => ({
 
 const localToService = (tagging: Tagging, update = false): PartialProps<ServerTagging, 'id' | 'hotIconUrl'> & { fusionId: number } => ({
   "hotIconId": Number(tagging.styleId),
-  "fusionId": params.fushId,
+  "fusionId": params.caseId,
   "getMethod": tagging.method,
   "getUser": tagging.principal,
   "hotIconUrl": "static/img_default/lQLPDhrvVzvNvTswMLAOU-UNqYnnZQG1YPJUwLwA_48_48.png",

+ 3 - 3
src/components/tagging/list.vue

@@ -13,14 +13,14 @@
 <script lang="ts" setup>
 import { computed } from 'vue'
 import Sign from './sign.vue'
-import { Tagging, getModelShowVariable, getModel, getTaggingPositions } from '@/store';
+import { Tagging, getFuseModelShowVariable, getFuseModel, getTaggingPositions } from '@/store';
 import { custom } from '@/env'
 
 const props = defineProps<{ tagging: Tagging }>()
 
 const isShowSign = (modelId: string) => {
-  const model = getModel(modelId)
-  return model?.loaded && getModelShowVariable(model).value
+  const model = getFuseModel(modelId)
+  return model?.loaded && getFuseModelShowVariable(model).value
 }
 
 const positions = computed(() => {

+ 2 - 2
src/components/tagging/sign.vue

@@ -47,7 +47,7 @@ import { computed, ref, watchEffect, watch } from 'vue'
 import UIBubble from 'bill/components/bubble/index.vue'
 import Images from '@/views/tagging/images.vue'
 import Preview, { MediaType } from '../static-preview/index.vue'
-import { getTaggingStyle, getModel } from '@/store';
+import { getTaggingStyle, getFuseModel } from '@/store';
 import { getFileUrl } from '@/utils'
 import { sdk } from '@/sdk'
 import { custom, getResource } from '@/env'
@@ -72,7 +72,7 @@ const updatePosStyle = () => {
 }
 watchEffect(updatePosStyle)
 sdk.sceneBus.on('cameraChange', updatePosStyle)
-const model = getModel(props.scenePos.modelId)
+const model = getFuseModel(props.scenePos.modelId)
 model && watch(model, updatePosStyle, { deep: true })
 
 

+ 6 - 9
src/env/index.ts

@@ -1,7 +1,7 @@
 import { stackFactory, flatStacksValue, strToParams } from '@/utils'
 import { ref } from 'vue'
 
-import type { Model, TaggingPosition } from '@/store'
+import type { FuseModel, TaggingPosition } from '@/store'
 
 export const viewModeStack = stackFactory(ref<'full' | 'auto'>('auto'))
 export const showToolbarStack = stackFactory(ref<boolean>(false))
@@ -10,8 +10,8 @@ export const showLeftPanoStack = stackFactory(ref<boolean>(false))
 export const showLeftCtrlPanoStack = stackFactory(ref<boolean>(true))
 export const showRightCtrlPanoStack = stackFactory(ref<boolean>(true))
 export const showTaggingsStack = stackFactory(ref<boolean>(true))
-export const currentModelStack = stackFactory(ref<Model | null>(null))
-export const showModelsMapStack = stackFactory(ref<Map<Model, boolean>>(new Map))
+export const currentModelStack = stackFactory(ref<FuseModel | null>(null))
+export const showModelsMapStack = stackFactory(ref<Map<FuseModel, boolean>>(new Map))
 export const modelsChangeStoreStack = stackFactory(ref<boolean>(false))
 export const showTaggingPositionsStack = stackFactory(ref<WeakSet<TaggingPosition>>(new WeakSet()))
 // export const showModelsChangeStoreStack = stackFactory
@@ -32,12 +32,9 @@ export const custom = flatStacksValue({
 
 
 export const params = strToParams(location.search) as unknown as Params
-params.fushId = Number(params.fushId)
+params.caseId = Number(params.caseId)
 export type Params = { 
-  m: string,
-  id: string,
-  fushId: number,
-  staticURL?: string,
+  caseId: number,
   baseURL?: string,
   token?: string
 }
@@ -47,5 +44,5 @@ export const baseURL = params.baseURL ? params.baseURL : import.meta.env.DEV ? '
 
 export const getResource = (uri: string) => {
   if (~uri.indexOf('base64') || ~uri.indexOf('bolb') || ~uri.indexOf('//')) return uri
-  return `${params.staticURL}/${uri}`
+  return `${baseURL}/${uri}`
 }

+ 27 - 24
src/layout/model-list/index.vue

@@ -6,20 +6,7 @@
       :data="modelList" 
     >
       <template #action>
-        <ui-input
-          type="file"
-          width="20px"
-          placeholder="上传模型"
-          othPlaceholder="支持RAR,ZIP压缩包格式"
-          accept=".rar, .zip"
-          :disable="true"
-          :multiple="false"
-          @update:modelValue="addModel"
-        >
-          <template v-slot:replace>
-            <ui-icon type="add" ctrl/>
-          </template>
-      </ui-input>
+        <ui-icon type="add" @click="insertMode = true" ctrl/>
       </template>
       <template #atom="{ item }">
         <ModelSign 
@@ -30,28 +17,37 @@
       </template>
     </List>
   </LeftPano>
+
+  <SelectModel 
+    :select-ids="fuseModels.map(item => item.modelId)"
+    @close="insertMode = false" 
+    @select="addModelsHandler"
+    v-if="insertMode" 
+  />
 </template>
 
 <script lang="ts" setup>
-import { computed, watchEffect } from 'vue'
+import { computed, watchEffect, ref } from 'vue'
 import { LeftPano } from '@/layout'
-import { models, getModelShowVariable, addModel } from '@/store'
 import { custom } from '@/env'
 import { getSceneModel } from '@/sdk'
+import SelectModel from './select.vue'
 import List from '@/components/list/index.vue'
 import ModelSign from './sign.vue'
+import { fuseModels, getFuseModelShowVariable, createFuseModels, Scene, addFuseModel } from '@/store'
 
-import type { Model } from '@/store'
+import type { FuseModel } from '@/store'
 
+const insertMode = ref(false)
 const modelList = computed(() => 
-  models.value.map(model => ({
+  fuseModels.value.map(model => ({
     raw: model,
     select: custom.currentModel === model
   }))
 )
 
-const modelChangeSelect = (model: Model) => {
-  if (getModelShowVariable(model).value) {
+const modelChangeSelect = (model: FuseModel) => {
+  if (getFuseModelShowVariable(model).value) {
     if (custom.currentModel !== model) {
       getSceneModel(model)?.changeSelect(true)
       custom.currentModel = model
@@ -63,16 +59,23 @@ const modelChangeSelect = (model: Model) => {
 }
 
 watchEffect(() => {
-  if (custom.currentModel && !getModelShowVariable(custom.currentModel).value) {
+  if (custom.currentModel && !getFuseModelShowVariable(custom.currentModel).value) {
     custom.currentModel = null
   }
 })
 
-const modelDelete = (model: Model) => {
-  const index = models.value.indexOf(model)
+const modelDelete = (model: FuseModel) => {
+  const index = fuseModels.value.indexOf(model)
   if (~index) {
-    models.value.splice(index, 1)
+    fuseModels.value.splice(index, 1)
   }
+  console.log(fuseModels.value.length)
 }
 
+const addModelsHandler = (modelIds: Scene['modelId'][]) => {
+  modelIds
+    .filter(modelId => !fuseModels.value.some(model => model.modelId === modelId))
+    .map(modelId => createFuseModels({ modelId }))
+    .forEach(addFuseModel)
+}
 </script>

+ 84 - 0
src/layout/model-list/select.vue

@@ -0,0 +1,84 @@
+<template>
+  <Modal 
+    width="800px"
+    title="添加场景" 
+    :visible="true"
+    @ok="okHandler"
+    @cancel="emit('close')"
+    okText="确定"
+    cancelText="取消"
+  >
+    <div>
+      <div className='model-header'>
+        <Search
+          className='content-header-search'
+          placeholder="输入名称搜索" 
+          style="width: 264px"
+          @search="val => keyword = val"
+        />
+      </div>
+      <Table 
+        :row-key="record => record.modelId"
+        :columns="cloumns"
+        :rowSelection="rowSelection"
+        :data-source="filterScenes"
+        :pagination="false"
+      />
+    </div>
+  </Modal>
+</template>
+
+<script lang="ts" setup>
+import { Modal, Input, Table } from 'ant-design-vue'
+import { computed, ref } from 'vue';
+import { scenes } from '@/store'
+
+import type { Scene } from '@/api'
+
+type Key = Scene['modelId']
+
+const Search = Input.Search
+
+const props = defineProps<{selectIds: Key[]}>()
+const emit = defineEmits<{
+  (e: 'close'): void
+  (e: 'select', ids: Key[]): void
+}>()
+
+const keyword = ref('')
+const filterScenes = computed(
+  () => scenes.value.filter(item => item.name && item.modelId && item.name.includes(keyword.value))
+)
+
+const selects = ref<Key[]>(props.selectIds)
+const rowSelection: any = ref({
+  selectedRowKeys: selects,
+  onChange: (ids: number[]) => selects.value = ids
+})
+const cloumns = [
+  {
+    title: '名称',
+    dataIndex: 'sceneName',
+    key: 'sceneName',
+  },
+  {
+    title: '拍摄时间',
+    dataIndex: 'createTime',
+    key: 'createTime',
+  }
+]
+
+const okHandler = () => {
+  emit('select', selects.value)
+  emit('close')
+}
+
+</script>
+
+<style lang="scss" scoped>
+.model-header {
+  display: flex;
+  justify-content: flex-end;
+  padding-bottom: 24px;
+}
+</style>

+ 6 - 6
src/layout/model-list/sign.vue

@@ -7,24 +7,24 @@
         type="del" 
         ctrl 
         @click="$emit('delete')" 
-        v-if="model.type !== ModelType.SWSS && custom.modelsChangeStore" 
+        v-if="custom.modelsChangeStore" 
       />
     </div>
   </div>
   <div class="model-desc" @click="$emit('click')">
-    <p><span>数据来源:</span>{{ ModelTypeDesc[model.type] }}</p>
+    <p><span>数据来源:</span>{{ SceneTypeDesc[model.type] }}</p>
     <p><span>数据大小:</span>{{ model.size }}</p>
     <p><span>拍摄时间:</span>{{ model.time }}</p>
   </div>
 </template>
 
 <script lang="ts" setup>
-import { getModelShowVariable, ModelTypeDesc, ModelType } from '@/store'
+import { getFuseModelShowVariable, SceneTypeDesc, SceneType } from '@/store'
 import { custom } from '@/env'
 
-import type { Model } from '@/store'
+import type { FuseModel } from '@/store'
 
-type ModelProps = { model: Model }
+type ModelProps = { model: FuseModel }
 const props = defineProps<ModelProps>()
 
 type ModelEmits = {
@@ -34,7 +34,7 @@ type ModelEmits = {
 }
 defineEmits<ModelEmits>();
 
-const show = getModelShowVariable(props.model)
+const show = getFuseModelShowVariable(props.model)
 
 </script>
 

+ 1 - 0
src/main.ts

@@ -1,4 +1,5 @@
 import { createApp } from 'vue'
+import 'ant-design-vue/dist/antd.css';
 import './style.scss'
 import App from './app.vue'
 import Components from 'bill/index'

+ 8 - 8
src/sdk/association.ts

@@ -1,5 +1,5 @@
 import { sdk } from './sdk'
-import { models, taggings, isEdit, sysBus, getModelShowVariable, ModelType } from '@/store'
+import { fuseModels, taggings, isEdit, sysBus, getFuseModelShowVariable, SceneType } from '@/store'
 import { toRaw, watchEffect, ref, watch } from 'vue'
 import { viewModeStack, custom, getResource } from '@/env'
 import { 
@@ -14,13 +14,13 @@ import {
 import TaggingComponent from '@/components/tagging/list.vue'
 
 import type { SDK, SceneModel, SceneGuidePath } from '.'
-import { Model, Tagging } from '@/store'
+import { FuseModel, Tagging } from '@/store'
 
-const sceneModelMap = new WeakMap<Model, SceneModel>()
-export const getSceneModel = (model: Model | null) => model && sceneModelMap.get(toRaw(model))
+const sceneModelMap = new WeakMap<FuseModel, SceneModel>()
+export const getSceneModel = (model: FuseModel | null) => model && sceneModelMap.get(toRaw(model))
 
 const associationModels = (sdk: SDK) => {
-  const getModels = () => models.value
+  const getModels = () => fuseModels.value
   shallowWatchArray(getModels, (models, oldModels) => {
     const { added, deleted } = diffArrayChange(models, oldModels)
     for (const item of added) {
@@ -31,8 +31,8 @@ const associationModels = (sdk: SDK) => {
       const itemRaw = toRaw(item)
       const sceneModel = sdk.addModel({
         ...itemRaw,
-        type: ModelType.SWMX,
-        url: getResource(item.url)
+        type: item.type === SceneType.SWSS ? 'laser' : 'glb',
+        url: item.type === SceneType.SWSS ? item.url : getResource(item.url)
       })
       sceneModelMap.set(itemRaw, sceneModel)
 
@@ -70,7 +70,7 @@ const associationModels = (sdk: SDK) => {
       () => item.loaded,
       (loaded) => {
         if (loaded) {
-          const modelShow = getModelShowVariable(item)
+          const modelShow = getFuseModelShowVariable(item)
           watchEffect(() => getSceneModel(item)?.changeBottom(item.bottom))
           watchEffect(() => getSceneModel(item)?.changeOpacity(item.opacity))
           watchEffect(() => getSceneModel(item)?.changeScale(item.scale))

+ 9 - 9
src/sdk/sdk.ts

@@ -1,11 +1,11 @@
 import cover from './cover'
 import { loadLib } from '@/utils'
 
-import type { ModelAttrs, Model, GuidePath, GuidePaths } from '@/store'
+import type { FuseModelAttrs, FuseModel, GuidePath, GuidePaths } from '@/store'
 import type { Emitter } from 'mitt'
 
 
-type SceneModelAttrs = ModelAttrs & { select: boolean }
+type SceneModelAttrs = FuseModelAttrs & { select: boolean }
 export type SceneModel = ToChangeAPI<Omit<SceneModelAttrs, 'position' | 'rotation'>>
   & { 
     bus: Emitter<
@@ -30,7 +30,7 @@ export type SceneModel = ToChangeAPI<Omit<SceneModelAttrs, 'position' | 'rotatio
   }
 
 
-export type AddModelProps = Pick<Model, 'type' | 'url' | 'id'> & ModelAttrs
+export type addModelProps = Pick<FuseModel, 'url' | 'id'> & FuseModelAttrs & { type: 'laser' | 'glb' }
 
 export type SceneGuidePath = Pick<GuidePath, 'position' | 'target' | 'speed' | 'time'>
 export interface SceneGuide {
@@ -40,18 +40,18 @@ export interface SceneGuide {
   clear: () => void
 }
 
-export type ScenePos = { localPos: SceneLocalPos, modelId: Model['id'] }
+export type ScenePos = { localPos: SceneLocalPos, modelId: FuseModel['id'] }
 export type ScreenPos = { 
   trueSide: boolean,
   pos: ScreenLocalPos, 
-  modelId: Model['id'] 
+  modelId: FuseModel['id'] 
 }
 
 export interface CameraComeToProps { 
   position: SceneLocalPos; 
   target?: SceneLocalPos; 
   dur?: number, 
-  modelId?: Model['id'], 
+  modelId?: FuseModel['id'], 
   distance?: 1 | 2 | 3 
 }
 
@@ -60,10 +60,10 @@ export type CalcPathProps = [[SceneGuidePath, SceneGuidePath], Partial<Pick<Scen
 export interface SDK {
   layout: HTMLDivElement,
   sceneBus: Emitter<{ 'cameraChange': void }>
-  addModel: (props: AddModelProps) => SceneModel
+  addModel: (props: addModelProps) => SceneModel
   calcPathInfo: (paths: CalcPathProps[0], info: CalcPathProps[1]) => Required<CalcPathProps[1]>
-  getPositionByScreen: (screenPos: ScreenLocalPos, modelId?: Model['id']) => ScenePos | null
-  getScreenByPosition: (localPos: SceneLocalPos, modelId?: Model['id']) => ScreenPos | null
+  getPositionByScreen: (screenPos: ScreenLocalPos, modelId?: FuseModel['id']) => ScenePos | null
+  getScreenByPosition: (localPos: SceneLocalPos, modelId?: FuseModel['id']) => ScreenPos | null
   screenshot: (width: number, height: number) => Promise<string>
   getPose: () => { position: SceneLocalPos, target: SceneLocalPos }
   comeTo: (pos: CameraComeToProps) => void

+ 127 - 0
src/store/fuse-model.ts

@@ -0,0 +1,127 @@
+import { computed, ref, watchPostEffect } from 'vue'
+import { autoSetModeCallback, unSetModelUpdate, createTemploraryID } from './sys'
+import { custom } from '@/env'
+import { 
+  fetchFuseModels, 
+  postAddFuseModel, 
+  postDeleteFuseModel,
+  postUpdateFuseModels,
+  SceneType
+} from '@/api'
+import { 
+  deleteStoreItem, 
+  addStoreItem, 
+  updateStoreItem, 
+  fetchStoreItems,
+  saveStoreItems,
+  recoverStoreItems
+} from '@/utils'
+
+import type { FuseModel as SModel, FuseModelAttrs } from '@/api'
+
+export type FuseModel = SModel & { loaded: boolean, error: boolean, progress: number }
+export type FuseModels = FuseModel[]
+export type { FuseModelAttrs } from '@/api'
+
+export const fuseModels = ref<FuseModels>([])
+export const defaultFuseModelAttrs: FuseModelAttrs = {
+  show: true,
+  scale: 1,
+  opacity: 1,
+  bottom: 0,
+  position: {x: 0, y: 0, z: 0},
+  rotation: {x: 0, y: 0, z: 0}
+}
+export const createFuseModels = (model: Partial<FuseModel> = {}): FuseModel => serviceToLocal({
+  id: createTemploraryID(),
+  modelId: 0,
+  fusionNumId: 0,
+  url: '',
+  title: '',
+  type: SceneType.SWMX,
+  size: 0,
+  time: new Date().toString(),
+  ...defaultFuseModelAttrs,
+  ...model
+})
+
+export const getFuseModel = (modelId: FuseModel['id']) => fuseModels.value.find(model => model.id === modelId)
+export const getFuseModelShowVariable = (model: FuseModel) => 
+  computed({
+    get: () => custom.modelsChangeStore 
+      ? model.show 
+      : custom.showModelsMap.get(model) || false,
+    set: (show: boolean) => {
+      if (custom.modelsChangeStore) {
+        model.show = show
+      } else {
+        custom.showModelsMap.set(model, show)
+      }
+    }
+  })
+  
+export const fuseModelsLoaded = ref(false)
+watchPostEffect(() => {
+  const loaded = fuseModels.value.every(model => model.loaded || model.error)
+  fuseModelsLoaded.value = loaded
+})
+
+
+let bcModels: FuseModels = []
+export const getBackupFuseModels = () => bcModels
+export const backupFuseModels = () => {
+  bcModels = fuseModels.value.map(model => ({
+    ...model,
+    rotation: {...model.rotation},
+    position: {...model.position},
+  }))
+}
+
+const serviceToLocal = (model: SModel): FuseModel => ({
+  ...model, 
+  error: false,
+  loaded: false, 
+  progress: 0,
+})
+
+const initFuseModel = (model: FuseModel) => {
+  custom.showModelsMap.set(model, model.show)
+}
+
+export const recoverFuseModels = recoverStoreItems(fuseModels, getBackupFuseModels)
+
+export const updateFuseModel = updateStoreItem(fuseModels, postUpdateFuseModels)
+export const deleteFuseModel = deleteStoreItem(fuseModels, postDeleteFuseModel)
+export const addFuseModel = async (model: FuseModel) => {
+  const addModel = serviceToLocal(await postAddFuseModel(model))
+  initFuseModel(addModel)
+  unSetModelUpdate(() => fuseModels.value.push(addModel))
+}
+
+export const initialFuseModels = fetchStoreItems(
+  fuseModels, 
+  fetchFuseModels, 
+  () => {
+    for (const model of fuseModels.value) {
+      initFuseModel(model)
+    }
+    backupFuseModels()
+  }, 
+  smodels => smodels.map(serviceToLocal),
+)
+export const saveFuseModels = saveStoreItems(
+  fuseModels,
+  getBackupFuseModels,
+  {
+    update: updateFuseModel,
+    delete: deleteFuseModel
+  }
+)
+
+
+export const autoSaveFuseModels = autoSetModeCallback(fuseModels, {
+  backup: backupFuseModels,
+  recovery: recoverFuseModels,
+  save: saveFuseModels,
+  isUpdate: () => fuseModelsLoaded.value,
+})

+ 11 - 6
src/store/index.ts

@@ -1,5 +1,6 @@
 import { ref } from 'vue'
-import { initialModels } from './model'
+import { initialModels } from './scene'
+import { initialFuseModels } from './fuse-model'
 import { initialTaggings } from './tagging'
 import { initialTaggingStyles } from './tagging-style'
 import { initialGuides } from './guide'
@@ -10,20 +11,24 @@ export const error = ref(false)
 export const initialStore = async () => {
   await Promise.all([
     initialModels(),
-    initialTaggingStyles(),
-    initialTaggings(),
-    initialGuides()
+    initialFuseModels(),
+    // initialTaggingStyles(),
+    // initialTaggings(),
+    // initialGuides()
   ])
   try {
     loaded.value = true
-  } catch {
+    console.log('初始化成功')
+  } catch(e) {
+    console.error('初始化错误', e)
     error.value = true
   }
 }
 
 
 export * from './sys'
-export * from './model'
+export * from './scene'
+export * from './fuse-model'
 export * from './tagging'
 export * from './tagging-style'
 export * from './guide'

+ 0 - 104
src/store/model.ts

@@ -1,104 +0,0 @@
-import { computed, ref, watchPostEffect } from 'vue'
-import { autoSetModeCallback, unSetModelUpdate } from './sys'
-import { showModelsMapStack, custom } from '@/env'
-import { 
-  fetchModels, 
-  postAddModel, 
-  postDeleteModel,
-  postUpdateModels
-} from '@/api'
-import { 
-  deleteStoreItem, 
-  addStoreItem, 
-  updateStoreItem, 
-  fetchStoreItems,
-  saveStoreItems,
-  recoverStoreItems
-} from '@/utils'
-
-import type { Model as SModel } from '@/api'
-
-export type Model = SModel & { loaded: boolean, error: boolean, progress: number }
-export type Models = Model[]
-
-export const models = ref<Models>([])
-
-export const getModel = (modelId: Model['id']) => models.value.find(model => model.id === modelId)
-export const getModelShowVariable = (model: Model) => 
-  computed({
-    get: () => custom.modelsChangeStore 
-      ? model.show 
-      : custom.showModelsMap.get(model) || false,
-    set: (show: boolean) => {
-      if (custom.modelsChangeStore) {
-        model.show = show
-      } else {
-        custom.showModelsMap.set(model, show)
-      }
-    }
-  })
-  
-export const modelsLoaded = ref(false)
-watchPostEffect(() => {
-  const loaded = models.value.every(model => model.loaded || model.error)
-  modelsLoaded.value = loaded
-})
-
-
-let bcModels: Models = []
-export const getBackupModels = () => bcModels
-export const backupModels = () => {
-  bcModels = models.value.map(model => ({
-    ...model,
-    rotation: {...model.rotation},
-    position: {...model.position},
-  }))
-}
-
-const serviceToLocal = (model: SModel): Model => ({
-  ...model, 
-  error: false,
-  loaded: false, 
-  progress: 0,
-})
-
-export const recoverModels = recoverStoreItems(models, getBackupModels)
-export const addModel = async (file: File) => {
-  const model = await postAddModel(file)
-  unSetModelUpdate(() => models.value.push(serviceToLocal(model)))
-  backupModels()
-}
-export const updateModel = updateStoreItem(models, postUpdateModels)
-export const deleteModel = deleteStoreItem(models, model => postDeleteModel(model.id))
-export const initialModels = fetchStoreItems(
-  models, 
-  fetchModels, 
-  () => {
-    const showModelsMap = new Map<Model, boolean>()
-    for (const model of models.value) {
-      showModelsMap.set(model, model.show)
-    }
-    showModelsMapStack.push(ref(showModelsMap))
-    backupModels()
-  }, 
-  smodels => smodels.map(serviceToLocal),
-)
-export const saveModels = saveStoreItems(
-  models,
-  getBackupModels,
-  {
-    update: updateModel,
-    delete: deleteModel,
-  }
-)
-
-
-export const autoSaveModels = autoSetModeCallback(models, {
-  backup: backupModels,
-  recovery: recoverModels,
-  save: saveModels,
-  isUpdate: () => modelsLoaded.value,
-})
-
-export { ModelType, ModelTypeDesc } from '@/api'
-export type { ModelAttrs } from '@/api'

+ 18 - 0
src/store/scene.ts

@@ -0,0 +1,18 @@
+import { ref } from 'vue'
+import { fetchScenes } from '@/api'
+import { fetchStoreItems } from '@/utils'
+
+import type { Scene, Scenes } from '@/api'
+export type { Scene, Scenes } from '@/api'
+
+
+export const scenes = ref<Scenes>([])
+
+export const getModel = (modelId: Scene['id']) => scenes.value.find(scene => scene.id === modelId)
+
+export const initialModels = fetchStoreItems(
+  scenes, 
+  fetchScenes, 
+)
+
+export { SceneType, SceneTypeDesc } from '@/api'

+ 7 - 1
src/utils/store-help.ts

@@ -106,6 +106,11 @@ export function deleteStoreItem <T extends {id: any}, K extends {id: any} = T>(
     storeSecurityDelete(items.value, item)
   }
 }
+
+export function fetchStoreItems <T extends {id: any}, K extends {id: any} = T>(
+  items: Ref<T[]>, 
+  fetchAction: () => Promise<T[]>, 
+): () => Promise<void>
 export function fetchStoreItems <T extends {id: any}, K extends {id: any} = T>(
   items: Ref<T[]>, 
   fetchAction: () => Promise<T[]>, 
@@ -120,7 +125,7 @@ export function fetchStoreItems <T extends {id: any}, K extends {id: any} = T>(
 export function fetchStoreItems <T extends {id: any}, K extends {id: any} = T>(
   items: Ref<T[]>, 
   fetchAction: () => Promise<K[]>, 
-  callback: (() => void) | null,
+  callback?: (() => void) | null,
   transform?: (items: K[]) => Promise<T[]> | T[],
 ) {
   return async () => {
@@ -153,6 +158,7 @@ export const saveStoreItems = <T extends {id: any}>(
     added
   } = diffStoreItemsChange(newItems.value, oldItems)
 
+  console.log(newItems.value, oldItems, deleted, updated, added)
   const promiseAll: Promise<any>[] = []
   
   if (actions.delete) {

+ 3 - 11
src/views/merge/index.vue

@@ -20,7 +20,7 @@
         <ui-button>配准</ui-button>
       </ui-group-option> -->
       <ui-group-option>
-        <ui-button @click="Object.assign(custom.currentModel as any, defaultAttrs)">恢复默认</ui-button>
+        <ui-button @click="Object.assign(custom.currentModel as any, defaultFuseModelAttrs)">恢复默认</ui-button>
       </ui-group-option>
     </ui-group>
   </RightPano>
@@ -28,7 +28,7 @@
 
 <script lang="ts" setup>
 import { RightPano } from '@/layout'
-import { autoSaveModels, ModelAttrs } from '@/store'
+import { autoSaveFuseModels, defaultFuseModelAttrs } from '@/store'
 import { togetherCallback } from '@/utils'
 import Actions from '@/components/actions/index.vue'
 import { getSceneModel } from '@/sdk'
@@ -43,14 +43,6 @@ useViewStack(() => {
   active.value = true
   return () => active.value = false
 })
-const defaultAttrs: ModelAttrs = {
-  show: true,
-  scale: 1,
-  opacity: 1,
-  bottom: 0,
-  position: {x: 0, y: 0, z: 0},
-  rotation: {x: 0, y: 0, z: 0}
-}
 const opacityOption = { min: 0.01, max: 1, step: 0.01, }
 const bottomOption = { min: 1, max: 100, step: 1, }
 const scaleOption = { min: 0.01, max: 1, step: 0.01, }
@@ -81,6 +73,6 @@ useViewStack(() => togetherCallback([
   showLeftPanoStack.push(ref(true)),
   modelsChangeStoreStack.push(ref(true))
 ]))
-useViewStack(autoSaveModels)
+useViewStack(autoSaveFuseModels)
 
 </script>

+ 2 - 2
src/views/tagging/index.vue

@@ -62,7 +62,7 @@ import {
   enterEdit, 
   Model,
   getModel,
-  getModelShowVariable,
+  getFuseModelShowVariable,
   getTaggingPositions,
   taggingPositions,
   createTaggingPosition
@@ -107,7 +107,7 @@ const flyTaggingPositions = (tagging: Tagging) => {
     }
     const position = positions[i]
     const model = getModel(position.modelId)
-    if (!model || !getModelShowVariable(model).value) {
+    if (!model || !getFuseModelShowVariable(model).value) {
       flyIndex(i + 1)
       return;
     }

+ 4 - 4
src/views/tagging/sign.vue

@@ -30,8 +30,8 @@ import { getResource } from '@/env'
 import { 
   getTaggingStyle, 
   getTaggingPositions, 
-  getModel,
-  getModelShowVariable
+  getFuseModel,
+  getFuseModelShowVariable
 } from '@/store'
 
 import type { Tagging } from '@/store'
@@ -41,8 +41,8 @@ const style = computed(() => getTaggingStyle(props.tagging.styleId))
 const positions = computed(() => getTaggingPositions(props.tagging))
 const disabledFly = computed(() => 
   positions.value
-    .map(position => getModel(position.modelId))
-    .every(model => !model || !getModelShowVariable(model).value)
+    .map(position => getFuseModel(position.modelId))
+    .every(model => !model || !getFuseModelShowVariable(model).value)
 )
 
 const emit = defineEmits<{ 

+ 1 - 8
vite.config.ts

@@ -1,17 +1,10 @@
 import { defineConfig } from 'vite'
 import vue from '@vitejs/plugin-vue'
-import fs from 'fs'
 
 import { resolve } from 'path'
 
-const outDir = resolve(process.env.PWD, process.argv[process.argv.length - 1])
-
-
 // https://vitejs.dev/config/
 export default defineConfig({
-  build: {
-    outDir: fs.existsSync(outDir) ? outDir : './dist'
-  },
   plugins: [vue()],
   base: './',
   assetsInclude: ['public/**/*'],
@@ -34,7 +27,7 @@ export default defineConfig({
     open: true,
     proxy: {
       '/api': {
-        target: 'http://192.168.0.152:8088/',
+        target: 'http://192.168.0.47:8808',
         changeOrigin: true,
         rewrite: path => path.replace(/^\/api/, '')
       }