USER-20230908AJ\Administrator 3 săptămâni în urmă
părinte
comite
87b06000d3
6 a modificat fișierele cu 1389 adăugiri și 753 ștergeri
  1. 60 1
      package-lock.json
  2. 1 0
      package.json
  3. 0 27
      page_task/graph/index.vue
  4. 586 0
      page_task/task_details/module/graph.vue
  5. 325 356
      page_task/task_details/task_details.vue
  6. 417 369
      yarn.lock

+ 60 - 1
package-lock.json

@@ -5,6 +5,7 @@
   "packages": {
     "": {
       "dependencies": {
+        "@types/three": "^0.181.0",
         "3d-force-graph": "^1.79.0",
         "animate.css": "^4.1.1",
         "echarts": "^6.0.0",
@@ -45,6 +46,12 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@dimforge/rapier3d-compat": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz",
+      "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==",
+      "license": "Apache-2.0"
+    },
     "node_modules/@tweenjs/tween.js": {
       "version": "25.0.0",
       "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz",
@@ -56,6 +63,33 @@
       "integrity": "sha512-OklP5lrmLq8/6TUOLgWc0LndUVvAiTWX5dnyoCFhIUtFW9opWsnCtG/UxPgeuC28Rv2XNbFfft/hEEI39P/4Ag==",
       "dev": true
     },
+    "node_modules/@types/stats.js": {
+      "version": "0.17.4",
+      "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz",
+      "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/three": {
+      "version": "0.181.0",
+      "resolved": "https://registry.npmjs.org/@types/three/-/three-0.181.0.tgz",
+      "integrity": "sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==",
+      "license": "MIT",
+      "dependencies": {
+        "@dimforge/rapier3d-compat": "~0.12.0",
+        "@tweenjs/tween.js": "~23.1.3",
+        "@types/stats.js": "*",
+        "@types/webxr": "*",
+        "@webgpu/types": "*",
+        "fflate": "~0.8.2",
+        "meshoptimizer": "~0.22.0"
+      }
+    },
+    "node_modules/@types/three/node_modules/@tweenjs/tween.js": {
+      "version": "23.1.3",
+      "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz",
+      "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==",
+      "license": "MIT"
+    },
     "node_modules/@types/uni-app": {
       "version": "1.4.4",
       "resolved": "https://registry.npmjs.org/@types/uni-app/-/uni-app-1.4.4.tgz",
@@ -65,6 +99,12 @@
         "vue": "^2.6.8"
       }
     },
+    "node_modules/@types/webxr": {
+      "version": "0.5.24",
+      "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz",
+      "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==",
+      "license": "MIT"
+    },
     "node_modules/@vue/compiler-sfc": {
       "version": "2.7.10",
       "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.10.tgz",
@@ -76,6 +116,12 @@
         "source-map": "^0.6.1"
       }
     },
+    "node_modules/@webgpu/types": {
+      "version": "0.1.66",
+      "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.66.tgz",
+      "integrity": "sha512-YA2hLrwLpDsRueNDXIMqN9NTzD6bCDkuXbOSe0heS+f8YE8usA6Gbv1prj81pzVHrbaAma7zObnIC+I6/sXJgA==",
+      "license": "BSD-3-Clause"
+    },
     "node_modules/3d-force-graph": {
       "version": "1.79.0",
       "resolved": "https://registry.npmjs.org/3d-force-graph/-/3d-force-graph-1.79.0.tgz",
@@ -352,6 +398,12 @@
         "zrender": "6.0.0"
       }
     },
+    "node_modules/fflate": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
+      "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
+      "license": "MIT"
+    },
     "node_modules/float-tooltip": {
       "version": "1.7.5",
       "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz",
@@ -437,6 +489,12 @@
       "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
       "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
     },
+    "node_modules/meshoptimizer": {
+      "version": "0.22.0",
+      "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz",
+      "integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==",
+      "license": "MIT"
+    },
     "node_modules/mpvue-echarts": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/mpvue-echarts/-/mpvue-echarts-1.0.0.tgz",
@@ -558,7 +616,8 @@
     "node_modules/three": {
       "version": "0.181.1",
       "resolved": "https://registry.npmjs.org/three/-/three-0.181.1.tgz",
-      "integrity": "sha512-bz9xZUQMw3pJbjKy7roiwXWgAp+oVUa+4k5o0oBAQ+IFJuru1xzvtk63h6k72XZanXS/SgoEhV6927Vgazyq2w=="
+      "integrity": "sha512-bz9xZUQMw3pJbjKy7roiwXWgAp+oVUa+4k5o0oBAQ+IFJuru1xzvtk63h6k72XZanXS/SgoEhV6927Vgazyq2w==",
+      "license": "MIT"
     },
     "node_modules/three-forcegraph": {
       "version": "1.43.0",

+ 1 - 0
package.json

@@ -1,5 +1,6 @@
 {
   "dependencies": {
+    "@types/three": "^0.181.0",
     "3d-force-graph": "^1.79.0",
     "animate.css": "^4.1.1",
     "echarts": "^6.0.0",

+ 0 - 27
page_task/graph/index.vue

@@ -1,27 +0,0 @@
-<template>
-  <view class="container">
-
-  </view>
-</template>
-
-<script>
-
-
-export default {
-  components: {
-
-  },
-  data() {
-    return {
-
-    }
-  },
-  methods: {
-
-  }
-}
-</script>
-
-<style scoped>
-
-</style>

+ 586 - 0
page_task/task_details/module/graph.vue

@@ -0,0 +1,586 @@
+<template>
+  <view class="graph-container">
+    <view class="canvas-wrapper">
+      <canvas
+          canvas-id="graphCanvas"
+          class="graph-canvas"
+          @touchstart="onTouchStart"
+          @touchmove="onTouchMove"
+          @touchend="onTouchEnd"
+      ></canvas>
+    </view>
+
+    <!-- 控制面板 -->
+    <view class="control-panel">
+      <view class="control-group">
+        <text class="control-label">布局算法:</text>
+        <picker @change="onLayoutChange" :value="layoutIndex" :range="layoutOptions">
+          <view class="picker">{{ layoutOptions[layoutIndex] }}</view>
+        </picker>
+      </view>
+
+      <view class="control-group">
+        <text class="control-label">显示标签:</text>
+        <switch :checked="showLabels" @change="toggleLabels" />
+      </view>
+
+      <view class="button-group">
+        <button class="btn primary" @tap="addRandomNode">添加节点</button>
+        <button class="btn secondary" @tap="resetView">重置视图</button>
+        <button class="btn warning" @tap="exportData">导出数据</button>
+      </view>
+    </view>
+
+    <!-- 节点信息面板 -->
+    <view v-if="selectedNode" class="node-info-panel">
+      <view class="panel-header">
+        <text class="panel-title">节点详情</text>
+        <text class="close-btn" @tap="deselectNode">×</text>
+      </view>
+      <view class="node-details">
+        <view class="detail-item">
+          <text class="detail-label">名称:</text>
+          <text class="detail-value">{{ selectedNode.name }}</text>
+        </view>
+        <view class="detail-item">
+          <text class="detail-label">ID:</text>
+          <text class="detail-value">{{ selectedNode.id }}</text>
+        </view>
+        <view class="detail-item">
+          <text class="detail-label">类型:</text>
+          <text class="detail-value">{{ selectedNode.type }}</text>
+        </view>
+        <view class="detail-item">
+          <text class="detail-label">连接数:</text>
+          <text class="detail-value">{{ getNodeDegree(selectedNode) }}</text>
+        </view>
+      </view>
+    </view>
+
+    <!-- 统计信息 -->
+    <view class="stats-panel">
+      <text class="stat-item">节点: {{ graphData.nodes.length }}</text>
+      <text class="stat-item">连接: {{ graphData.links.length }}</text>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      ctx: null,
+      canvasWidth: 750,
+      canvasHeight: 500,
+      graphData: {
+        nodes: [],
+        links: []
+      },
+      selectedNode: null,
+      hoveredNode: null,
+      showLabels: true,
+      layoutIndex: 0,
+      layoutOptions: ['力导向布局', '环形布局', '树状布局'],
+      isDragging: false,
+      dragStartX: 0,
+      dragStartY: 0,
+      offsetX: 0,
+      offsetY: 0,
+      scale: 1,
+      animationId: null
+    }
+  },
+  onReady() {
+    this.initCanvas();
+    this.initGraphData();
+    this.startAnimation();
+  },
+  onUnload() {
+    this.stopAnimation();
+  },
+  methods: {
+    initCanvas() {
+      this.ctx = uni.createCanvasContext('graphCanvas', this);
+
+      // 获取系统信息设置Canvas尺寸
+      const systemInfo = uni.getSystemInfoSync();
+      this.canvasWidth = systemInfo.windowWidth;
+      this.canvasHeight = systemInfo.windowHeight * 0.6;
+    },
+
+    initGraphData() {
+      // 示例数据
+      this.graphData = {
+        nodes: [
+          { id: 'node1', name: '中心节点', type: 'center', x: 375, y: 250, size: 20, color: '#ff6b6b' },
+          { id: 'node2', name: '用户节点', type: 'user', x: 275, y: 150, size: 15, color: '#4ecdc4' },
+          { id: 'node3', name: '产品节点', type: 'product', x: 475, y: 150, size: 15, color: '#45b7d1' },
+          { id: 'node4', name: '分类节点', type: 'category', x: 275, y: 350, size: 15, color: '#96ceb4' },
+          { id: 'node5', name: '服务节点', type: 'service', x: 475, y: 350, size: 15, color: '#feca57' }
+        ],
+        links: [
+          { source: 'node1', target: 'node2' },
+          { source: 'node1', target: 'node3' },
+          { source: 'node1', target: 'node4' },
+          { source: 'node1', target: 'node5' },
+          { source: 'node2', target: 'node3' },
+          { source: 'node4', target: 'node5' }
+        ]
+      };
+    },
+
+    startAnimation() {
+      const animate = () => {
+        this.updateLayout();
+        this.drawGraph();
+        this.animationId = requestAnimationFrame(animate);
+      };
+      animate();
+    },
+
+    stopAnimation() {
+      if (this.animationId) {
+        cancelAnimationFrame(this.animationId);
+      }
+    },
+
+    updateLayout() {
+      // 简单的力导向布局模拟
+      if (this.layoutIndex === 0) {
+        this.applyForceDirectedLayout();
+      } else if (this.layoutIndex === 1) {
+        this.applyCircularLayout();
+      } else if (this.layoutIndex === 2) {
+        this.applyTreeLayout();
+      }
+    },
+
+    applyForceDirectedLayout() {
+      const centerX = this.canvasWidth / 2 + this.offsetX;
+      const centerY = this.canvasHeight / 2 + this.offsetY;
+
+      // 简化的力导向布局
+      this.graphData.nodes.forEach((node, i) => {
+        if (node.id === 'node1') {
+          // 中心节点保持在中心
+          node.x = centerX;
+          node.y = centerY;
+          return;
+        }
+
+        // 向中心节点的引力
+        const centerNode = this.graphData.nodes[0];
+        const dx = centerNode.x - node.x;
+        const dy = centerNode.y - node.y;
+        const distance = Math.sqrt(dx * dx + dy * dy);
+
+        if (distance > 0) {
+          const force = 0.1;
+          node.x += dx * force;
+          node.y += dy * force;
+        }
+
+        // 节点间的斥力
+        this.graphData.nodes.forEach((otherNode, j) => {
+          if (i !== j) {
+            const dx = node.x - otherNode.x;
+            const dy = node.y - otherNode.y;
+            const distance = Math.sqrt(dx * dx + dy * dy);
+
+            if (distance > 0 && distance < 100) {
+              const force = 50 / (distance * distance);
+              node.x += dx * force * 0.1;
+              node.y += dy * force * 0.1;
+            }
+          }
+        });
+      });
+    },
+
+    applyCircularLayout() {
+      const centerX = this.canvasWidth / 2 + this.offsetX;
+      const centerY = this.canvasHeight / 2 + this.offsetY;
+      const radius = 150;
+
+      this.graphData.nodes.forEach((node, i) => {
+        if (node.id === 'node1') {
+          node.x = centerX;
+          node.y = centerY;
+        } else {
+          const angle = ((i - 1) / (this.graphData.nodes.length - 1)) * Math.PI * 2;
+          node.x = centerX + Math.cos(angle) * radius;
+          node.y = centerY + Math.sin(angle) * radius;
+        }
+      });
+    },
+
+    applyTreeLayout() {
+      const centerX = this.canvasWidth / 2 + this.offsetX;
+      const centerY = this.canvasHeight / 2 + this.offsetY;
+
+      this.graphData.nodes.forEach((node, i) => {
+        if (node.id === 'node1') {
+          node.x = centerX;
+          node.y = centerY;
+        } else {
+          const angle = ((i - 1) / (this.graphData.nodes.length - 1)) * Math.PI * 2;
+          const radius = 120;
+          node.x = centerX + Math.cos(angle) * radius;
+          node.y = centerY + Math.sin(angle) * radius;
+        }
+      });
+    },
+
+    drawGraph() {
+      if (!this.ctx) return;
+
+      // 清空画布
+      this.ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
+
+      // 设置缩放
+      this.ctx.scale(this.scale, this.scale);
+
+      // 绘制连接线
+      this.drawLinks();
+
+      // 绘制节点
+      this.drawNodes();
+
+      // 绘制标签
+      if (this.showLabels) {
+        this.drawLabels();
+      }
+
+      this.ctx.draw();
+    },
+
+    drawLinks() {
+      this.graphData.links.forEach(link => {
+        const sourceNode = this.graphData.nodes.find(n => n.id === link.source);
+        const targetNode = this.graphData.nodes.find(n => n.id === link.target);
+
+        if (sourceNode && targetNode) {
+          const isHighlighted = this.isLinkHighlighted(link);
+
+          this.ctx.beginPath();
+          this.ctx.moveTo(sourceNode.x, sourceNode.y);
+          this.ctx.lineTo(targetNode.x, targetNode.y);
+          this.ctx.strokeStyle = isHighlighted ? '#ff6b6b' : '#cccccc';
+          this.ctx.lineWidth = isHighlighted ? 3 : 2;
+          this.ctx.stroke();
+        }
+      });
+    },
+
+    drawNodes() {
+      this.graphData.nodes.forEach(node => {
+        const isSelected = this.selectedNode && this.selectedNode.id === node.id;
+        const isHovered = this.hoveredNode && this.hoveredNode.id === node.id;
+        const isHighlighted = isSelected || isHovered || this.isNodeConnected(node);
+
+        // 绘制节点
+        this.ctx.beginPath();
+        this.ctx.arc(node.x, node.y, isHighlighted ? node.size + 3 : node.size, 0, 2 * Math.PI);
+        this.ctx.fillStyle = node.color;
+        this.ctx.fill();
+
+        // 绘制边框
+        this.ctx.strokeStyle = isHighlighted ? '#ffffff' : node.color;
+        this.ctx.lineWidth = isHighlighted ? 3 : 2;
+        this.ctx.stroke();
+      });
+    },
+
+    drawLabels() {
+      this.graphData.nodes.forEach(node => {
+        this.ctx.setFontSize(12);
+        this.ctx.setFillStyle('#333333');
+        this.ctx.setTextAlign('center');
+        this.ctx.fillText(node.name, node.x, node.y - node.size - 8);
+      });
+    },
+
+    isNodeConnected(node) {
+      if (!this.selectedNode && !this.hoveredNode) return false;
+
+      const targetNode = this.selectedNode || this.hoveredNode;
+      return this.graphData.links.some(link =>
+          (link.source === node.id && link.target === targetNode.id) ||
+          (link.target === node.id && link.source === targetNode.id)
+      );
+    },
+
+    isLinkHighlighted(link) {
+      if (!this.selectedNode && !this.hoveredNode) return false;
+
+      const targetNode = this.selectedNode || this.hoveredNode;
+      return link.source === targetNode.id || link.target === targetNode.id;
+    },
+
+    getNodeDegree(node) {
+      return this.graphData.links.filter(link =>
+          link.source === node.id || link.target === node.id
+      ).length;
+    },
+
+    onTouchStart(e) {
+      this.isDragging = true;
+      this.dragStartX = e.touches[0].x;
+      this.dragStartY = e.touches[0].y;
+
+      // 检测点击的节点
+      const touchX = e.touches[0].x / this.scale;
+      const touchY = e.touches[0].y / this.scale;
+
+      this.selectedNode = this.getNodeAtPosition(touchX, touchY);
+      if (this.selectedNode) {
+        uni.vibrateShort(); // 触觉反馈
+      }
+    },
+
+    onTouchMove(e) {
+      if (!this.isDragging) return;
+
+      const touchX = e.touches[0].x;
+      const touchY = e.touches[0].y;
+
+      if (this.selectedNode) {
+        // 拖动节点
+        this.selectedNode.x = touchX / this.scale;
+        this.selectedNode.y = touchY / this.scale;
+      } else {
+        // 拖动画布
+        const deltaX = touchX - this.dragStartX;
+        const deltaY = touchY - this.dragStartY;
+
+        this.offsetX += deltaX;
+        this.offsetY += deltaY;
+
+        this.dragStartX = touchX;
+        this.dragStartY = touchY;
+      }
+    },
+
+    onTouchEnd() {
+      this.isDragging = false;
+      this.hoveredNode = null;
+    },
+
+    getNodeAtPosition(x, y) {
+      for (let i = this.graphData.nodes.length - 1; i >= 0; i--) {
+        const node = this.graphData.nodes[i];
+        const distance = Math.sqrt(Math.pow(node.x - x, 2) + Math.pow(node.y - y, 2));
+        if (distance <= node.size + 5) {
+          return node;
+        }
+      }
+      return null;
+    },
+
+    onLayoutChange(e) {
+      this.layoutIndex = parseInt(e.detail.value);
+      this.resetView();
+    },
+
+    toggleLabels(e) {
+      this.showLabels = e.detail.value;
+    },
+
+    addRandomNode() {
+      const nodeTypes = ['user', 'product', 'category', 'service'];
+      const colors = ['#4ecdc4', '#45b7d1', '#96ceb4', '#feca57'];
+
+      const newNode = {
+        id: `node${this.graphData.nodes.length + 1}`,
+        name: `新节点${this.graphData.nodes.length}`,
+        type: nodeTypes[Math.floor(Math.random() * nodeTypes.length)],
+        x: Math.random() * this.canvasWidth,
+        y: Math.random() * this.canvasHeight,
+        size: 12 + Math.random() * 8,
+        color: colors[Math.floor(Math.random() * colors.length)]
+      };
+
+      this.graphData.nodes.push(newNode);
+
+      // 连接到随机现有节点
+      if (this.graphData.nodes.length > 1) {
+        const randomIndex = Math.floor(Math.random() * (this.graphData.nodes.length - 1));
+        this.graphData.links.push({
+          source: newNode.id,
+          target: this.graphData.nodes[randomIndex].id
+        });
+      }
+    },
+
+    resetView() {
+      this.offsetX = 0;
+      this.offsetY = 0;
+      this.scale = 1;
+      this.selectedNode = null;
+    },
+
+    deselectNode() {
+      this.selectedNode = null;
+    },
+
+    exportData() {
+      const exportData = {
+        nodes: this.graphData.nodes,
+        links: this.graphData.links
+      };
+
+      uni.showModal({
+        title: '导出数据',
+        content: JSON.stringify(exportData, null, 2),
+        showCancel: false,
+        confirmText: '确定'
+      });
+    }
+  }
+}
+</script>
+
+<style scoped>
+.graph-container {
+  display: flex;
+  flex-direction: column;
+  height: 100vh;
+  background: #f5f5f5;
+}
+
+.canvas-wrapper {
+  flex: 1;
+  background: white;
+  position: relative;
+}
+
+.graph-canvas {
+  width: 100%;
+  height: 100%;
+  display: block;
+}
+
+.control-panel {
+  background: white;
+  padding: 20rpx;
+  border-top: 1rpx solid #eee;
+}
+
+.control-group {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 20rpx;
+  padding: 15rpx 0;
+}
+
+.control-label {
+  font-size: 28rpx;
+  color: #333;
+}
+
+.picker {
+  background: #f0f0f0;
+  padding: 10rpx 20rpx;
+  border-radius: 8rpx;
+  font-size: 26rpx;
+}
+
+.button-group {
+  display: flex;
+  justify-content: space-between;
+}
+
+.btn {
+  flex: 1;
+  margin: 0 10rpx;
+  padding: 20rpx;
+  border: none;
+  border-radius: 8rpx;
+  font-size: 26rpx;
+}
+
+.btn.primary {
+  background: #4ecdc4;
+  color: white;
+}
+
+.btn.secondary {
+  background: #45b7d1;
+  color: white;
+}
+
+.btn.warning {
+  background: #ff6b6b;
+  color: white;
+}
+
+.node-info-panel {
+  position: absolute;
+  top: 20rpx;
+  right: 20rpx;
+  background: rgba(255, 255, 255, 0.95);
+  padding: 30rpx;
+  border-radius: 16rpx;
+  box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
+  max-width: 300rpx;
+  z-index: 100;
+}
+
+.panel-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20rpx;
+}
+
+.panel-title {
+  font-size: 30rpx;
+  font-weight: bold;
+  color: #333;
+}
+
+.close-btn {
+  font-size: 40rpx;
+  color: #999;
+  cursor: pointer;
+}
+
+.node-details {
+  margin-bottom: 20rpx;
+}
+
+.detail-item {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 10rpx;
+}
+
+.detail-label {
+  font-size: 26rpx;
+  color: #666;
+}
+
+.detail-value {
+  font-size: 26rpx;
+  color: #333;
+  font-weight: 500;
+}
+
+.stats-panel {
+  position: absolute;
+  bottom: 20rpx;
+  left: 20rpx;
+  background: rgba(0, 0, 0, 0.7);
+  padding: 20rpx;
+  border-radius: 8rpx;
+  z-index: 100;
+}
+
+.stat-item {
+  display: block;
+  color: white;
+  font-size: 24rpx;
+  margin-bottom: 5rpx;
+}
+</style>

+ 325 - 356
page_task/task_details/task_details.vue

@@ -1,336 +1,305 @@
 <template>
-	<view class="total-page page-env-20 page-box">
-		<Nav :back="isReturn!==1" :title="'任务详情'" :genre="2" :fixedHeight="fixedHeight">
-			<view class="task-tabs m-b20" :style=" {top:`${$tools.topHeight()}px`}">
-				<view class="detail-bg m-lr20 m-b10 m-t10">
-					<image class="detail-img" src="/page_task/static/img/task-details/top-bg.png" mode="aspectFill">
-					</image>
-					<view class="detail-content">
-						<view class="row-c m-l10 m-t16 m-b20 text-color-fff">
-							<image class="wh-45 r-circle" src="https://img10.360buyimg.com/imgw/s288x1000_jfs/t1/307262/4/9992/255939/684f9a78Fbddd6f3f/e07bf46597371d37.jpg"
-								mode="aspectFill">
-							</image>
-							<text class="size-28 m-lr16  m-t6">大连市甘井子区宜居园81号2单元1层1号房屋</text>
-
-							<view class="row-c size-24 sys-bg-007038 r-100 p-lr16 p-tb6 m-l20" >
-								<text>住宅</text>
-							</view>
-							<image class="wh-60 animate__animated animate__fadeInDownBig"
-								style="position: absolute;right: 20rpx;"
-								:src="'/page_task/static/img/task-details/icon-1.png'"
-								mode="aspectFill">
-							</image>
-						</view>
-						<view class="row-justify-sb center buttom-titke sys-bg-BFD2CC text-color-12 size-24">
-							<text class="size-28 text-color-E21 sys-weight-600">{{applyFor.quota}}万</text>
-							<text>{{business.stageName}}</text>
-							<text>{{applyFor.use_date}}用款</text>
-							<view class="row-c">
-								<image class="wh-25 m-r10" src="/page_task/static/img/task-details/usrr.png" mode="">
-								</image>
-								<text>{{business.creation_name}}</text>
-							</view>
-						</view>
-					</view>
-				</view>
-				<TaskTab :current="current" @onChange="onChange"></TaskTab>
-			</view>
-		</Nav>
+  <view class="total-page page-env-20 page-box">
+    <Nav :back="isReturn!==1" :title="'任务详情'" :genre="2" :fixedHeight="fixedHeight">
+      <view class="task-tabs m-b20" :style=" {top:`${$tools.topHeight()}px`}">
+        <view class="detail-bg m-lr20 m-b10 m-t10">
+          <image class="detail-img" src="/page_task/static/img/task-details/top-bg.png" mode="aspectFill">
+          </image>
+          <view class="detail-content">
+            <view class="row-c m-l10 m-t16 m-b20 text-color-fff">
+              <image class="wh-45 r-circle" src="https://img10.360buyimg.com/imgw/s288x1000_jfs/t1/307262/4/9992/255939/684f9a78Fbddd6f3f/e07bf46597371d37.jpg"
+                     mode="aspectFill">
+              </image>
+              <text class="size-28 m-lr16  m-t6">大连市甘井子区宜居园81号2单元1层1号房屋</text>
+
+              <view class="row-c size-24 sys-bg-007038 r-100 p-lr16 p-tb6 m-l20" >
+                <text>住宅</text>
+              </view>
+              <image class="wh-60 animate__animated animate__fadeInDownBig"
+                     style="position: absolute;right: 20rpx;"
+                     :src="'/page_task/static/img/task-details/icon-1.png'"
+                     mode="aspectFill">
+              </image>
+            </view>
+            <view class="row-justify-sb center buttom-titke sys-bg-BFD2CC text-color-12 size-24">
+              <text class="size-28 text-color-E21 sys-weight-600">{{applyFor.quota}}万</text>
+              <text>{{business.stageName}}</text>
+              <text>{{applyFor.use_date}}用款</text>
+              <view class="row-c">
+                <image class="wh-25 m-r10" src="/page_task/static/img/task-details/usrr.png" mode="">
+                </image>
+                <text>{{business.creation_name}}</text>
+              </view>
+            </view>
+          </view>
+        </view>
+        <TaskTab :current="current" @onChange="onChange"></TaskTab>
+      </view>
+    </Nav>
     <view class="sys-list-background-color task-tabs-width "
           :style="{top:`${$tools.topHeight()+fixedHeight}px`}">
       <view v-if="current === 1"></view>
       <view >
-        <graph></graph>
+        <!--        <graph></graph>-->
       </view>
     </view>
 
-		<!--		<EnButton :text="'冲销'" v-if="current === 1"></EnButton>-->
-		<!--		<EnButton is_both :leftText="'交接'" :rightText="'操作'"  @onSubmit="setTaskOperate(1)" @onLeftSubmit="openExecute"></EnButton>-->
-		<uni-popup ref="executePopup" type="bottom">
-			<EnSelect title="请选择任务接收人" :local-data="executeData" ref="system" v-model="executeId"
-				@setAffirm="setNewExecute" @close="closeExecutePopup"></EnSelect>
-		</uni-popup>
 
-	</view>
+    <uni-popup ref="executePopup" type="bottom">
+      <EnSelect title="请选择任务接收人" :local-data="executeData" ref="system" v-model="executeId"
+                @setAffirm="setNewExecute" @close="closeExecutePopup"></EnSelect>
+    </uni-popup>
+
+  </view>
 </template>
 
 <script>
-	import TaskTab from "@/common/task/task_tab.vue"
-	// 身份信息
-	import Identity from "./module/identity.vue"
-	// 申请信息
-	import Apply from "./module/apply.vue"
-	// 第三方信息
-	import ThirdParty from "./module/third_party.vue"
-	// 资产信息
-	import Property from "./module/property.vue"
-	// 审核进度
-	import Steps from "./module/steps.vue"
-	// 跟进记录
-	import Record from "./module/record.vue"
-	import tools from "@/service/tools";
-	import {
-		cancellation,
-		endTask,
-		getExecuteList,
-		getStageList,
-		getTaskDetail,
-		setExecute,
-		takeTask
-	} from "@/api/task";
-	import EnSelect from "@/components/en-utils/en-select/en-select.vue";
-	import CreditList from "@/page_task/credit/credit.vue";
-  import {type} from "@/uni_modules/uni-forms/components/uni-forms/utils";
-  import Graph from "@/page_task/graph/index.vue";
-
-	export default {
-		components: {
-      Graph,
-			CreditList,
-			EnSelect,
-			TaskTab,
-			Identity,
-			ThirdParty,
-			Apply,
-			Property,
-			Record,
-			Steps
-		},
-		data() {
-			return {
-				current: 1,
-				fixedHeight: 200,
-				options: {
-					// autoHeight: true,
-					slidesPerView: 1.1,
-					centeredSlides: true,
-					spaceBetween: 10,
-					effect: 'cards'
-				},
-				list: [1, 2, 3],
-				lists: [1, 2],
-				businessId: '',
-				product: {
-					product_name: '',
-					product_types: [],
-					type_data: []
-				},
-				business: {
-					id: 0,
-					status: 0,
-					phone: '',
-					identity_one: '',
-					identity_two: '',
-					marriage_img: [],
-					credit_img: [],
-				}, //基本信息
-				propertyList: [], //资产信息
-				applyFor: {}, //申请信息
-				credit: {}, //征信信息
-				postLoan: {}, //贷后信息
-				tripartite: [], //第三方信息
-				linkman: [], //联系人信息
-				stageData: {
-					stageName: '',
-					userName: ""
-				},
-				isAjax: false,
-				isExecute: 0,
-				msgList: [],
-				executeData: [],
-				showExecute: false,
-				auditType: 0,
-				previewList: [],
-				imgKey: 0,
-				imgList: [],
-				replyId: "",
-				stageList: [],
-				businessStageList: [],
-				businessFile: {
-					fileList: [],
-					imgList: [],
-					videoList: [],
-				},
-				videoUrl: '',
-				executeId: '',
-				clientKey: [],
-				propertyKey: [],
-				appliesKey: [],
-				tripartiteKey: [],
-				linkmanKey: [],
-				creditKey: [],
-				identityHeight: 0,
-				thirdPartHeight: 0,
-				applyHeight: 0,
-				propertyHeight: 0,
-				creditListHeight: 0,
-				maxHeight: '100%',
-				creditHeight: '100%',
-        basicType:['1'],
-        restType:['2'],
-        isReturn:0
-			}
-		},
-		onLoad(data) {
-      console.log('-----------aaaaa-----------')
-
-		},
-    mounted() {
+import TaskTab from "@/common/task/task_tab.vue"
+// 身份信息
+import Identity from "./module/identity.vue"
+// 申请信息
+import Apply from "./module/apply.vue"
+// 第三方信息
+import ThirdParty from "./module/third_party.vue"
+// 资产信息
+import Property from "./module/property.vue"
+// 审核进度
+import Steps from "./module/steps.vue"
+// 跟进记录
+import Record from "./module/record.vue"
+import tools from "@/service/tools";
+
+import EnSelect from "@/components/en-utils/en-select/en-select.vue";
+import CreditList from "@/page_task/credit/credit.vue";
+
+export default {
+  components: {
+    CreditList,
+    EnSelect,
+    TaskTab,
+    Identity,
+    ThirdParty,
+    Apply,
+    Property,
+    Record,
+    Steps
+  },
+  data() {
+    return {
+      current: 1,
+      fixedHeight: 200,
+      options: {
+        // autoHeight: true,
+        slidesPerView: 1.1,
+        centeredSlides: true,
+        spaceBetween: 10,
+        effect: 'cards'
+      },
+      list: [1, 2, 3],
+      lists: [1, 2],
+      businessId: '',
+      product: {
+        product_name: '',
+        product_types: [],
+        type_data: []
+      },
+      business: {
+        id: 0,
+        status: 0,
+        phone: '',
+        identity_one: '',
+        identity_two: '',
+        marriage_img: [],
+        credit_img: [],
+      }, //基本信息
+      propertyList: [], //资产信息
+      applyFor: {}, //申请信息
+      credit: {}, //征信信息
+      postLoan: {}, //贷后信息
+      tripartite: [], //第三方信息
+      linkman: [], //联系人信息
+      stageData: {
+        stageName: '',
+        userName: ""
+      },
+      isAjax: false,
+      isExecute: 0,
+      msgList: [],
+      executeData: [],
+      showExecute: false,
+      auditType: 0,
+      previewList: [],
+      imgKey: 0,
+      imgList: [],
+      replyId: "",
+      stageList: [],
+      businessStageList: [],
+      businessFile: {
+        fileList: [],
+        imgList: [],
+        videoList: [],
+      },
+      videoUrl: '',
+      executeId: '',
+      clientKey: [],
+      propertyKey: [],
+      appliesKey: [],
+      tripartiteKey: [],
+      linkmanKey: [],
+      creditKey: [],
+      identityHeight: 0,
+      thirdPartHeight: 0,
+      applyHeight: 0,
+      propertyHeight: 0,
+      creditListHeight: 0,
+      maxHeight: '100%',
+      creditHeight: '100%',
+      basicType:['1'],
+      restType:['2'],
+      isReturn:0
+    }
+  },
+  onLoad(data) {
+    console.log('-----------aaaaa-----------')
+
+  },
+  mounted() {
+
+  },
+  methods: {
+    makingCall(phone){
+      tools.makingCall(phone)
+    },
+    onShowImg(item) {
+      console.log(this.businessFile.imgList)
+      let imgIndex=this.businessFile.imgList.indexOf(item)
+      if (imgIndex < 0) {
+        this.businessFile.imgList.push(item)
+        imgIndex=this.businessFile.imgList.length-1
+      }
+      console.log(this.businessFile.imgList)
+
+      // 预览图片
+      uni.previewImage({
+        current: imgIndex,
+        urls: this.businessFile.imgList,
+      });
+    },
+    auditTask(auditType) {
 
     },
-		methods: {
-      makingCall(phone){
-        tools.makingCall(phone)
-      },
-			onShowImg(item) {
-        console.log(this.businessFile.imgList)
-        let imgIndex=this.businessFile.imgList.indexOf(item)
-				if (imgIndex < 0) {
-					this.businessFile.imgList.push(item)
-          imgIndex=this.businessFile.imgList.length-1
-				}
-        console.log(this.businessFile.imgList)
+    setPostLoan() {
 
-				// 预览图片
-				uni.previewImage({
-					current: imgIndex,
-					urls: this.businessFile.imgList,
-				});
-			},
-			auditTask(auditType) {
+    },
+    editTask() {
 
-			},
-			setPostLoan() {
+    },
+    cancellation() {
 
-			},
-			editTask() {
+    },
+    endTask() {
 
-			},
-			cancellation() {
+    },
+    takeTask() {
 
-			},
-			endTask() {
+    },
+    closeExecutePopup(){
 
-			},
-			takeTask() {
+    },
+    setNewExecute(type) {
 
-			},
-      closeExecutePopup(){
+      this.$refs.executePopup.close('bottom')
 
-      },
-			setNewExecute(type) {
-				if (type) {
-					//设置新执行人
-					if (this.executeId <= 0) {
-						tools.error('请选择执行人')
-						return
-					}
-					setExecute({
-						'business_id': this.businessId,
-						'user_id': this.executeId
-					}).then((res) => {
-						if (res.code === 1) {
-							tools.success(res.msg)
-							uni.$emit('newReceiving')
-							this.getTaskDetail()
-
-						} else {
-							tools.error(res.msg)
-						}
-					})
-				}
-				this.$refs.executePopup.close('bottom')
-
-			},
-			openExecute() {
-
-			},
-			setTaskOperate(type) {
-
-			},
-			async getTaskDetail() {
-
-			},
-
-			// 获取详情高度Swiper
-			getDetailsHeight() {
-				this.maxHeight = '100%'
-				this.$nextTick(() => {
-					const query = uni.createSelectorQuery().in(this);
-					setTimeout(() => {
-						query.select('.identity').boundingClientRect(data => {
-							if (data) {
-								this.maxHeight = data.height
-								console.log(this.maxHeight);
-								uni.pageScrollTo({
-									scrollTop: 0,
-									duration: 300
-								});
-							}
-						}).exec();
-					}, 200)
-				})
-			},
-			// 获取详情高度Swiper
-			onSwiper(swiper, index) {
-				this.maxHeight = '100%'
-				const query = uni.createSelectorQuery().in(this);
-				this.$nextTick(() => {
-					setTimeout(() => {
-						if (index == 0) {
-							query.select('.identity').boundingClientRect(data => {
-								if (data) {
-									this.maxHeight = data.height
-								}
-							}).exec();
-						}
-						if (index == 1) {
-							query.select('.apply').boundingClientRect(data => {
-								if (data) {
-									this.maxHeight = data.height
-								}
-							}).exec();
-						}
-						if (index == 2) {
-							query.select('.third_party').boundingClientRect(data => {
-								if (data) {
-									this.maxHeight = data.height
-								}
-							}).exec();
-						}
-						uni.pageScrollTo({
-							scrollTop: 0,
-							duration: 300
-						});
-					}, 200)
-				})
-			},
-			// 征信高度Swiper
-			onCreditHeight() {
-
-			},
-			// 征信高度Swiper
-			onCreditSwiper(swiper, index) {
-
-			},
-			onChange(current) {
-				if (current == 1) {
-					this.getDetailsHeight()
-				}
-				if (current == 2) {
-					this.onCreditHeight()
-				}
-				this.current = current
-				uni.pageScrollTo({
-					scrollTop: 0,
-					duration: 300
-				});
-			},
-			onSubmit() {
-
-			}
-		}
-	}
+    },
+    openExecute() {
+
+    },
+    setTaskOperate(type) {
+
+    },
+    async getTaskDetail() {
+
+    },
+
+    // 获取详情高度Swiper
+    getDetailsHeight() {
+      this.maxHeight = '100%'
+      this.$nextTick(() => {
+        const query = uni.createSelectorQuery().in(this);
+        setTimeout(() => {
+          query.select('.identity').boundingClientRect(data => {
+            if (data) {
+              this.maxHeight = data.height
+              console.log(this.maxHeight);
+              uni.pageScrollTo({
+                scrollTop: 0,
+                duration: 300
+              });
+            }
+          }).exec();
+        }, 200)
+      })
+    },
+    // 获取详情高度Swiper
+    onSwiper(swiper, index) {
+      this.maxHeight = '100%'
+      const query = uni.createSelectorQuery().in(this);
+      this.$nextTick(() => {
+        setTimeout(() => {
+          if (index == 0) {
+            query.select('.identity').boundingClientRect(data => {
+              if (data) {
+                this.maxHeight = data.height
+              }
+            }).exec();
+          }
+          if (index == 1) {
+            query.select('.apply').boundingClientRect(data => {
+              if (data) {
+                this.maxHeight = data.height
+              }
+            }).exec();
+          }
+          if (index == 2) {
+            query.select('.third_party').boundingClientRect(data => {
+              if (data) {
+                this.maxHeight = data.height
+              }
+            }).exec();
+          }
+          uni.pageScrollTo({
+            scrollTop: 0,
+            duration: 300
+          });
+        }, 200)
+      })
+    },
+    // 征信高度Swiper
+    onCreditHeight() {
+
+    },
+    // 征信高度Swiper
+    onCreditSwiper(swiper, index) {
+
+    },
+    onChange(current) {
+      if (current == 1) {
+        this.getDetailsHeight()
+      }
+      if (current == 2) {
+        this.onCreditHeight()
+      }
+      this.current = current
+      uni.pageScrollTo({
+        scrollTop: 0,
+        duration: 300
+      });
+    },
+    onSubmit() {
+
+    }
+  }
+}
 </script>
 
 <style lang="scss" scoped>
@@ -344,51 +313,51 @@
     min-height: calc(100vh - 630rpx - 160rpx - env(safe-area-inset-bottom));
   }
 }
-	.details_body {
-		width: 100%;
-		position: absolute;
-	}
-
-	.detail-bg {
-		position: relative;
-	}
-
-	.detail-img {
-		width: calc(100%);
-		height: 220rpx;
-	}
-
-	.detail-content {
-		position: absolute;
-		top: 10rpx;
-		left: 20rpx;
-
-		.top-titke {
-			height: 75rpx;
-			line-height: 75rpx;
-			// background: red;
-		}
-
-		.detail-line {
-			width: 2rpx;
-			height: 24rpx;
-			background-color: #FFFFFF;
-		}
-
-		.buttom-titke {
-			flex: 1;
-			margin-top: 40rpx;
-			height: 90rpx;
-			width: 635rpx;
-			line-height: 90rpx;
-			border-radius: 20rpx;
-			padding: 0 20rpx;
-		}
-	}
-
-	.swiper-wrapper {
-		z-index: 0 !important;
-	}
+.details_body {
+  width: 100%;
+  position: absolute;
+}
+
+.detail-bg {
+  position: relative;
+}
+
+.detail-img {
+  width: calc(100%);
+  height: 220rpx;
+}
+
+.detail-content {
+  position: absolute;
+  top: 10rpx;
+  left: 20rpx;
+
+  .top-titke {
+    height: 75rpx;
+    line-height: 75rpx;
+    // background: red;
+  }
+
+  .detail-line {
+    width: 2rpx;
+    height: 24rpx;
+    background-color: #FFFFFF;
+  }
+
+  .buttom-titke {
+    flex: 1;
+    margin-top: 40rpx;
+    height: 90rpx;
+    width: 635rpx;
+    line-height: 90rpx;
+    border-radius: 20rpx;
+    padding: 0 20rpx;
+  }
+}
+
+.swiper-wrapper {
+  z-index: 0 !important;
+}
 .video-box {
   height: 70vh;
   width: 100vw;

+ 417 - 369
yarn.lock

@@ -3,462 +3,510 @@
 
 
 "@babel/parser@^7.18.4":
-  "integrity" "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw=="
-  "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz"
-  "version" "7.19.0"
+  version "7.19.0"
+  resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz"
+  integrity sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==
 
 "@babel/runtime@^7.17.8":
-  "integrity" "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="
-  "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz"
-  "version" "7.28.4"
+  version "7.28.4"
+  resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz"
+  integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==
+
+"@dimforge/rapier3d-compat@~0.12.0":
+  version "0.12.0"
+  resolved "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz"
+  integrity sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==
+
+"@tweenjs/tween.js@~23.1.3":
+  version "23.1.3"
+  resolved "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz"
+  integrity sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==
 
 "@tweenjs/tween.js@18 - 25":
-  "integrity" "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A=="
-  "resolved" "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz"
-  "version" "25.0.0"
+  version "25.0.0"
+  resolved "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz"
+  integrity sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==
 
 "@types/html5plus@^1.0.2":
-  "integrity" "sha512-OklP5lrmLq8/6TUOLgWc0LndUVvAiTWX5dnyoCFhIUtFW9opWsnCtG/UxPgeuC28Rv2XNbFfft/hEEI39P/4Ag=="
-  "resolved" "https://registry.npmjs.org/@types/html5plus/-/html5plus-1.0.2.tgz"
-  "version" "1.0.2"
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@types/html5plus/-/html5plus-1.0.2.tgz"
+  integrity sha512-OklP5lrmLq8/6TUOLgWc0LndUVvAiTWX5dnyoCFhIUtFW9opWsnCtG/UxPgeuC28Rv2XNbFfft/hEEI39P/4Ag==
+
+"@types/stats.js@*":
+  version "0.17.4"
+  resolved "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz"
+  integrity sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==
+
+"@types/three@^0.181.0":
+  version "0.181.0"
+  resolved "https://registry.npmjs.org/@types/three/-/three-0.181.0.tgz"
+  integrity sha512-MLF1ks8yRM2k71D7RprFpDb9DOX0p22DbdPqT/uAkc6AtQXjxWCVDjCy23G9t1o8HcQPk7woD2NIyiaWcWPYmA==
+  dependencies:
+    "@dimforge/rapier3d-compat" "~0.12.0"
+    "@tweenjs/tween.js" "~23.1.3"
+    "@types/stats.js" "*"
+    "@types/webxr" "*"
+    "@webgpu/types" "*"
+    fflate "~0.8.2"
+    meshoptimizer "~0.22.0"
 
 "@types/uni-app@^1.4.4":
-  "integrity" "sha512-ZTXnrCTblZyoLIoKbTv1Whz1nxrTcM7vg0qGXzDpXP8m9MqdjKt48N3FffQT1IsJWNkxbvJ1Eg5UHDaq+k+oBQ=="
-  "resolved" "https://registry.npmjs.org/@types/uni-app/-/uni-app-1.4.4.tgz"
-  "version" "1.4.4"
+  version "1.4.4"
+  resolved "https://registry.npmjs.org/@types/uni-app/-/uni-app-1.4.4.tgz"
+  integrity sha512-ZTXnrCTblZyoLIoKbTv1Whz1nxrTcM7vg0qGXzDpXP8m9MqdjKt48N3FffQT1IsJWNkxbvJ1Eg5UHDaq+k+oBQ==
   dependencies:
-    "vue" "^2.6.8"
+    vue "^2.6.8"
+
+"@types/webxr@*":
+  version "0.5.24"
+  resolved "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz"
+  integrity sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==
 
 "@vue/compiler-sfc@2.7.10":
-  "integrity" "sha512-55Shns6WPxlYsz4WX7q9ZJBL77sKE1ZAYNYStLs6GbhIOMrNtjMvzcob6gu3cGlfpCR4bT7NXgyJ3tly2+Hx8Q=="
-  "resolved" "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.10.tgz"
-  "version" "2.7.10"
+  version "2.7.10"
+  resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.10.tgz"
+  integrity sha512-55Shns6WPxlYsz4WX7q9ZJBL77sKE1ZAYNYStLs6GbhIOMrNtjMvzcob6gu3cGlfpCR4bT7NXgyJ3tly2+Hx8Q==
   dependencies:
     "@babel/parser" "^7.18.4"
-    "postcss" "^8.4.14"
-    "source-map" "^0.6.1"
+    postcss "^8.4.14"
+    source-map "^0.6.1"
+
+"@webgpu/types@*":
+  version "0.1.66"
+  resolved "https://registry.npmjs.org/@webgpu/types/-/types-0.1.66.tgz"
+  integrity sha512-YA2hLrwLpDsRueNDXIMqN9NTzD6bCDkuXbOSe0heS+f8YE8usA6Gbv1prj81pzVHrbaAma7zObnIC+I6/sXJgA==
 
 "3d-force-graph@^1.79.0":
-  "integrity" "sha512-0RUNcfiH12f93loY/iS4wShzhXzdLLN4futvFnintF7eP30DjX+nAdLDAGOZwSflhijQyVwnGtpczNjFrDLUzQ=="
-  "resolved" "https://registry.npmjs.org/3d-force-graph/-/3d-force-graph-1.79.0.tgz"
-  "version" "1.79.0"
+  version "1.79.0"
+  resolved "https://registry.npmjs.org/3d-force-graph/-/3d-force-graph-1.79.0.tgz"
+  integrity sha512-0RUNcfiH12f93loY/iS4wShzhXzdLLN4futvFnintF7eP30DjX+nAdLDAGOZwSflhijQyVwnGtpczNjFrDLUzQ==
   dependencies:
-    "accessor-fn" "1"
-    "kapsule" "^1.16"
-    "three" ">=0.118 <1"
-    "three-forcegraph" "1"
-    "three-render-objects" "^1.35"
-
-"accessor-fn@1":
-  "integrity" "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA=="
-  "resolved" "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz"
-  "version" "1.5.3"
-
-"animate.css@^4.1.1":
-  "integrity" "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="
-  "resolved" "https://registry.npmmirror.com/animate.css/-/animate.css-4.1.1.tgz"
-  "version" "4.1.1"
+    accessor-fn "1"
+    kapsule "^1.16"
+    three ">=0.118 <1"
+    three-forcegraph "1"
+    three-render-objects "^1.35"
+
+accessor-fn@1:
+  version "1.5.3"
+  resolved "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz"
+  integrity sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==
+
+animate.css@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/animate.css/-/animate.css-4.1.1.tgz"
+  integrity sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==
 
 "bezier-js@3 - 6":
-  "integrity" "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg=="
-  "resolved" "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz"
-  "version" "6.1.4"
-
-"canvas-color-tracker@^1.3":
-  "integrity" "sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg=="
-  "resolved" "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz"
-  "version" "1.3.2"
+  version "6.1.4"
+  resolved "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz"
+  integrity sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==
+
+canvas-color-tracker@^1.3:
+  version "1.3.2"
+  resolved "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz"
+  integrity sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==
   dependencies:
-    "tinycolor2" "^1.6.0"
+    tinycolor2 "^1.6.0"
 
-"crypto-js@^4.1.1":
-  "integrity" "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
-  "resolved" "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz"
-  "version" "4.1.1"
+crypto-js@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz"
+  integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==
 
-"csstype@^3.1.0":
-  "integrity" "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
-  "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz"
-  "version" "3.1.0"
+csstype@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz"
+  integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==
 
 "d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3":
-  "integrity" "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="
-  "resolved" "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
-  "version" "3.2.4"
+  version "3.2.4"
+  resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
+  integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
   dependencies:
-    "internmap" "1 - 2"
+    internmap "1 - 2"
 
-"d3-binarytree@1":
-  "integrity" "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw=="
-  "resolved" "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz"
-  "version" "1.0.2"
+d3-binarytree@1:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz"
+  integrity sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==
 
 "d3-color@1 - 3":
-  "integrity" "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
-  "resolved" "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz"
-  "version" "3.1.0"
+  version "3.1.0"
+  resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz"
+  integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
 
 "d3-dispatch@1 - 3":
-  "integrity" "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="
-  "resolved" "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz"
-  "version" "3.0.1"
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz"
+  integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
 
 "d3-drag@2 - 3":
-  "integrity" "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="
-  "resolved" "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz"
-  "version" "3.0.0"
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz"
+  integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==
   dependencies:
-    "d3-dispatch" "1 - 3"
-    "d3-selection" "3"
+    d3-dispatch "1 - 3"
+    d3-selection "3"
 
 "d3-ease@1 - 3":
-  "integrity" "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
-  "resolved" "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz"
-  "version" "3.0.1"
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz"
+  integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
 
 "d3-force-3d@2 - 3":
-  "integrity" "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA=="
-  "resolved" "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz"
-  "version" "3.0.6"
+  version "3.0.6"
+  resolved "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz"
+  integrity sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==
   dependencies:
-    "d3-binarytree" "1"
-    "d3-dispatch" "1 - 3"
-    "d3-octree" "1"
-    "d3-quadtree" "1 - 3"
-    "d3-timer" "1 - 3"
+    d3-binarytree "1"
+    d3-dispatch "1 - 3"
+    d3-octree "1"
+    d3-quadtree "1 - 3"
+    d3-timer "1 - 3"
 
 "d3-format@1 - 3":
-  "integrity" "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
-  "resolved" "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz"
-  "version" "3.1.0"
+  version "3.1.0"
+  resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz"
+  integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
 
 "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3":
-  "integrity" "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="
-  "resolved" "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"
-  "version" "3.0.1"
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"
+  integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
   dependencies:
-    "d3-color" "1 - 3"
+    d3-color "1 - 3"
 
-"d3-octree@1":
-  "integrity" "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A=="
-  "resolved" "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz"
-  "version" "1.1.0"
+d3-octree@1:
+  version "1.1.0"
+  resolved "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz"
+  integrity sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==
 
 "d3-quadtree@1 - 3":
-  "integrity" "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="
-  "resolved" "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz"
-  "version" "3.0.1"
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz"
+  integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==
 
 "d3-scale-chromatic@1 - 3":
-  "integrity" "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="
-  "resolved" "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz"
-  "version" "3.1.0"
+  version "3.1.0"
+  resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz"
+  integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==
   dependencies:
-    "d3-color" "1 - 3"
-    "d3-interpolate" "1 - 3"
+    d3-color "1 - 3"
+    d3-interpolate "1 - 3"
 
 "d3-scale@1 - 4":
-  "integrity" "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="
-  "resolved" "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz"
-  "version" "4.0.2"
+  version "4.0.2"
+  resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz"
+  integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
   dependencies:
-    "d3-array" "2.10.0 - 3"
-    "d3-format" "1 - 3"
-    "d3-interpolate" "1.2.0 - 3"
-    "d3-time" "2.1.1 - 3"
-    "d3-time-format" "2 - 4"
+    d3-array "2.10.0 - 3"
+    d3-format "1 - 3"
+    d3-interpolate "1.2.0 - 3"
+    d3-time "2.1.1 - 3"
+    d3-time-format "2 - 4"
 
-"d3-selection@2 - 3", "d3-selection@3":
-  "integrity" "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="
-  "resolved" "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz"
-  "version" "3.0.0"
+"d3-selection@2 - 3", d3-selection@3:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz"
+  integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
 
 "d3-time-format@2 - 4":
-  "integrity" "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="
-  "resolved" "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz"
-  "version" "4.1.0"
+  version "4.1.0"
+  resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz"
+  integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==
   dependencies:
-    "d3-time" "1 - 3"
+    d3-time "1 - 3"
 
 "d3-time@1 - 3", "d3-time@2.1.1 - 3":
-  "integrity" "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="
-  "resolved" "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"
-  "version" "3.1.0"
+  version "3.1.0"
+  resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"
+  integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
   dependencies:
-    "d3-array" "2 - 3"
+    d3-array "2 - 3"
 
 "d3-timer@1 - 3":
-  "integrity" "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="
-  "resolved" "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz"
-  "version" "3.0.1"
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz"
+  integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
 
 "d3-transition@2 - 3":
-  "integrity" "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="
-  "resolved" "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz"
-  "version" "3.0.1"
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz"
+  integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==
   dependencies:
-    "d3-color" "1 - 3"
-    "d3-dispatch" "1 - 3"
-    "d3-ease" "1 - 3"
-    "d3-interpolate" "1 - 3"
-    "d3-timer" "1 - 3"
+    d3-color "1 - 3"
+    d3-dispatch "1 - 3"
+    d3-ease "1 - 3"
+    d3-interpolate "1 - 3"
+    d3-timer "1 - 3"
 
 "d3-zoom@2 - 3":
-  "integrity" "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="
-  "resolved" "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz"
-  "version" "3.0.0"
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz"
+  integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==
   dependencies:
-    "d3-dispatch" "1 - 3"
-    "d3-drag" "2 - 3"
-    "d3-interpolate" "1 - 3"
-    "d3-selection" "2 - 3"
-    "d3-transition" "2 - 3"
-
-"data-bind-mapper@1":
-  "integrity" "sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw=="
-  "resolved" "https://registry.npmjs.org/data-bind-mapper/-/data-bind-mapper-1.0.3.tgz"
-  "version" "1.0.3"
+    d3-dispatch "1 - 3"
+    d3-drag "2 - 3"
+    d3-interpolate "1 - 3"
+    d3-selection "2 - 3"
+    d3-transition "2 - 3"
+
+data-bind-mapper@1:
+  version "1.0.3"
+  resolved "https://registry.npmjs.org/data-bind-mapper/-/data-bind-mapper-1.0.3.tgz"
+  integrity sha512-QmU3lyEnbENQPo0M1F9BMu4s6cqNNp8iJA+b/HP2sSb7pf3dxwF3+EP1eO69rwBfH9kFJ1apmzrtogAmVt2/Xw==
   dependencies:
-    "accessor-fn" "1"
+    accessor-fn "1"
 
-"echarts@^6.0.0":
-  "integrity" "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ=="
-  "resolved" "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz"
-  "version" "6.0.0"
+echarts@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz"
+  integrity sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==
   dependencies:
-    "tslib" "2.3.0"
-    "zrender" "6.0.0"
-
-"float-tooltip@^1.7":
-  "integrity" "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg=="
-  "resolved" "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz"
-  "version" "1.7.5"
+    tslib "2.3.0"
+    zrender "6.0.0"
+
+fflate@~0.8.2:
+  version "0.8.2"
+  resolved "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz"
+  integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==
+
+float-tooltip@^1.7:
+  version "1.7.5"
+  resolved "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz"
+  integrity sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==
   dependencies:
-    "d3-selection" "2 - 3"
-    "kapsule" "^1.16"
-    "preact" "10"
-
-"force-graph@^1.51.0":
-  "integrity" "sha512-aTnihCmiMA0ItLJLCbrQYS9mzriopW24goFPgUnKAAmAlPogTSmFWqoBPMXzIfPb7bs04Hur5zEI4WYgLW3Sig=="
-  "resolved" "https://registry.npmjs.org/force-graph/-/force-graph-1.51.0.tgz"
-  "version" "1.51.0"
+    d3-selection "2 - 3"
+    kapsule "^1.16"
+    preact "10"
+
+force-graph@^1.51.0:
+  version "1.51.0"
+  resolved "https://registry.npmjs.org/force-graph/-/force-graph-1.51.0.tgz"
+  integrity sha512-aTnihCmiMA0ItLJLCbrQYS9mzriopW24goFPgUnKAAmAlPogTSmFWqoBPMXzIfPb7bs04Hur5zEI4WYgLW3Sig==
   dependencies:
     "@tweenjs/tween.js" "18 - 25"
-    "accessor-fn" "1"
-    "bezier-js" "3 - 6"
-    "canvas-color-tracker" "^1.3"
-    "d3-array" "1 - 3"
-    "d3-drag" "2 - 3"
-    "d3-force-3d" "2 - 3"
-    "d3-scale" "1 - 4"
-    "d3-scale-chromatic" "1 - 3"
-    "d3-selection" "2 - 3"
-    "d3-zoom" "2 - 3"
-    "float-tooltip" "^1.7"
-    "index-array-by" "1"
-    "kapsule" "^1.16"
-    "lodash-es" "4"
-
-"index-array-by@1":
-  "integrity" "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw=="
-  "resolved" "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz"
-  "version" "1.4.2"
+    accessor-fn "1"
+    bezier-js "3 - 6"
+    canvas-color-tracker "^1.3"
+    d3-array "1 - 3"
+    d3-drag "2 - 3"
+    d3-force-3d "2 - 3"
+    d3-scale "1 - 4"
+    d3-scale-chromatic "1 - 3"
+    d3-selection "2 - 3"
+    d3-zoom "2 - 3"
+    float-tooltip "^1.7"
+    index-array-by "1"
+    kapsule "^1.16"
+    lodash-es "4"
+
+index-array-by@1:
+  version "1.4.2"
+  resolved "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz"
+  integrity sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==
 
 "internmap@1 - 2":
-  "integrity" "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="
-  "resolved" "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"
-  "version" "2.0.3"
-
-"js-base64@^2.6.4":
-  "integrity" "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ=="
-  "resolved" "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz"
-  "version" "2.6.4"
-
-"js-base64@^3.7.2":
-  "integrity" "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
-  "resolved" "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.5.tgz"
-  "version" "3.7.5"
-
-"js-md5@^0.8.3":
-  "integrity" "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ=="
-  "resolved" "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz"
-  "version" "0.8.3"
-
-"jweixin-module@^1.2.0":
-  "integrity" "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w=="
-  "resolved" "https://registry.npmmirror.com/jweixin-module/-/jweixin-module-1.6.0.tgz"
-  "version" "1.6.0"
-
-"kapsule@^1.16":
-  "integrity" "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg=="
-  "resolved" "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz"
-  "version" "1.16.3"
+  version "2.0.3"
+  resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"
+  integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
+
+js-base64@^2.6.4:
+  version "2.6.4"
+  resolved "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz"
+  integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
+
+js-base64@^3.7.2:
+  version "3.7.5"
+  resolved "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.5.tgz"
+  integrity sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==
+
+js-md5@^0.8.3:
+  version "0.8.3"
+  resolved "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz"
+  integrity sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==
+
+jweixin-module@^1.2.0:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/jweixin-module/-/jweixin-module-1.6.0.tgz"
+  integrity sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w==
+
+kapsule@^1.16:
+  version "1.16.3"
+  resolved "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz"
+  integrity sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==
   dependencies:
-    "lodash-es" "4"
-
-"lodash-es@4":
-  "integrity" "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
-  "resolved" "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
-  "version" "4.17.21"
-
-"mpvue-echarts@^1.0.0":
-  "integrity" "sha512-tY73yPqfB3KvU5o5vMxOjqknJI+Z+s/dk2l6Uw/yo3Hz0NgDPqa8t2z6H+6e4AWqLu2TODjjOys2IUMq5/YOGQ=="
-  "resolved" "https://registry.npmjs.org/mpvue-echarts/-/mpvue-echarts-1.0.0.tgz"
-  "version" "1.0.0"
-
-"nanoid@^3.3.4":
-  "integrity" "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
-  "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz"
-  "version" "3.3.4"
-
-"ngraph.events@^1.0.0", "ngraph.events@^1.2.1":
-  "integrity" "sha512-NeDGI4DSyjBNBRtA86222JoYietsmCXbs8CEB0dZ51Xeh4lhVl1y3wpWLumczvnha8sFQIW4E0vvVWwgmX2mGw=="
-  "resolved" "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.4.0.tgz"
-  "version" "1.4.0"
-
-"ngraph.forcelayout@3":
-  "integrity" "sha512-MKBuEh1wujyQHFTW57y5vd/uuEOK0XfXYxm3lC7kktjJLRdt/KEKEknyOlc6tjXflqBKEuYBBcu7Ax5VY+S6aw=="
-  "resolved" "https://registry.npmjs.org/ngraph.forcelayout/-/ngraph.forcelayout-3.3.1.tgz"
-  "version" "3.3.1"
+    lodash-es "4"
+
+lodash-es@4:
+  version "4.17.21"
+  resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
+  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
+meshoptimizer@~0.22.0:
+  version "0.22.0"
+  resolved "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz"
+  integrity sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==
+
+mpvue-echarts@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/mpvue-echarts/-/mpvue-echarts-1.0.0.tgz"
+  integrity sha512-tY73yPqfB3KvU5o5vMxOjqknJI+Z+s/dk2l6Uw/yo3Hz0NgDPqa8t2z6H+6e4AWqLu2TODjjOys2IUMq5/YOGQ==
+
+nanoid@^3.3.4:
+  version "3.3.4"
+  resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz"
+  integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+
+ngraph.events@^1.0.0, ngraph.events@^1.2.1:
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.4.0.tgz"
+  integrity sha512-NeDGI4DSyjBNBRtA86222JoYietsmCXbs8CEB0dZ51Xeh4lhVl1y3wpWLumczvnha8sFQIW4E0vvVWwgmX2mGw==
+
+ngraph.forcelayout@3:
+  version "3.3.1"
+  resolved "https://registry.npmjs.org/ngraph.forcelayout/-/ngraph.forcelayout-3.3.1.tgz"
+  integrity sha512-MKBuEh1wujyQHFTW57y5vd/uuEOK0XfXYxm3lC7kktjJLRdt/KEKEknyOlc6tjXflqBKEuYBBcu7Ax5VY+S6aw==
   dependencies:
-    "ngraph.events" "^1.0.0"
-    "ngraph.merge" "^1.0.0"
-    "ngraph.random" "^1.0.0"
-
-"ngraph.graph@20":
-  "integrity" "sha512-1jorNgIc0Kg0L9bTNN4+RCrVvbZ+4pqGVMrbhX3LLyqYcRdLvAQRRnxddmfj9l5f6Eq59SUTfbYZEm8cktiE7Q=="
-  "resolved" "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-20.1.0.tgz"
-  "version" "20.1.0"
+    ngraph.events "^1.0.0"
+    ngraph.merge "^1.0.0"
+    ngraph.random "^1.0.0"
+
+ngraph.graph@20:
+  version "20.1.0"
+  resolved "https://registry.npmjs.org/ngraph.graph/-/ngraph.graph-20.1.0.tgz"
+  integrity sha512-1jorNgIc0Kg0L9bTNN4+RCrVvbZ+4pqGVMrbhX3LLyqYcRdLvAQRRnxddmfj9l5f6Eq59SUTfbYZEm8cktiE7Q==
   dependencies:
-    "ngraph.events" "^1.2.1"
-
-"ngraph.merge@^1.0.0":
-  "integrity" "sha512-5J8YjGITUJeapsomtTALYsw7rFveYkM+lBj3QiYZ79EymQcuri65Nw3knQtFxQBU1r5iOaVRXrSwMENUPK62Vg=="
-  "resolved" "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-1.0.0.tgz"
-  "version" "1.0.0"
-
-"ngraph.random@^1.0.0":
-  "integrity" "sha512-4EUeAGbB2HWX9njd6bP6tciN6ByJfoaAvmVL9QTaZSeXrW46eNGA9GajiXiPBbvFqxUWFkEbyo6x5qsACUuVfA=="
-  "resolved" "https://registry.npmjs.org/ngraph.random/-/ngraph.random-1.2.0.tgz"
-  "version" "1.2.0"
-
-"picocolors@^1.0.0":
-  "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
-  "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
-  "version" "1.0.0"
-
-"polished@4":
-  "integrity" "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA=="
-  "resolved" "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz"
-  "version" "4.3.1"
+    ngraph.events "^1.2.1"
+
+ngraph.merge@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/ngraph.merge/-/ngraph.merge-1.0.0.tgz"
+  integrity sha512-5J8YjGITUJeapsomtTALYsw7rFveYkM+lBj3QiYZ79EymQcuri65Nw3knQtFxQBU1r5iOaVRXrSwMENUPK62Vg==
+
+ngraph.random@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.npmjs.org/ngraph.random/-/ngraph.random-1.2.0.tgz"
+  integrity sha512-4EUeAGbB2HWX9njd6bP6tciN6ByJfoaAvmVL9QTaZSeXrW46eNGA9GajiXiPBbvFqxUWFkEbyo6x5qsACUuVfA==
+
+picocolors@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
+  integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+polished@4:
+  version "4.3.1"
+  resolved "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz"
+  integrity sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==
   dependencies:
     "@babel/runtime" "^7.17.8"
 
-"postcss@^8.4.14":
-  "integrity" "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ=="
-  "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz"
-  "version" "8.4.16"
+postcss@^8.4.14:
+  version "8.4.16"
+  resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz"
+  integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==
   dependencies:
-    "nanoid" "^3.3.4"
-    "picocolors" "^1.0.0"
-    "source-map-js" "^1.0.2"
-
-"preact@10":
-  "integrity" "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg=="
-  "resolved" "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz"
-  "version" "10.27.2"
-
-"source-map-js@^1.0.2":
-  "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
-  "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
-  "version" "1.0.2"
-
-"source-map@^0.6.1":
-  "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-  "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
-  "version" "0.6.1"
-
-"three-forcegraph@1":
-  "integrity" "sha512-1AqLmTCjjjwcuccObG96fCxiRnNJjCLdA5Mozl7XK+ROwTJ6QEJPo2XJ6uxWeuAmPE7ukMhgv4lj28oZSfE4wg=="
-  "resolved" "https://registry.npmjs.org/three-forcegraph/-/three-forcegraph-1.43.0.tgz"
-  "version" "1.43.0"
+    nanoid "^3.3.4"
+    picocolors "^1.0.0"
+    source-map-js "^1.0.2"
+
+preact@10:
+  version "10.27.2"
+  resolved "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz"
+  integrity sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==
+
+source-map-js@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
+  integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+three-forcegraph@1:
+  version "1.43.0"
+  resolved "https://registry.npmjs.org/three-forcegraph/-/three-forcegraph-1.43.0.tgz"
+  integrity sha512-1AqLmTCjjjwcuccObG96fCxiRnNJjCLdA5Mozl7XK+ROwTJ6QEJPo2XJ6uxWeuAmPE7ukMhgv4lj28oZSfE4wg==
   dependencies:
-    "accessor-fn" "1"
-    "d3-array" "1 - 3"
-    "d3-force-3d" "2 - 3"
-    "d3-scale" "1 - 4"
-    "d3-scale-chromatic" "1 - 3"
-    "data-bind-mapper" "1"
-    "kapsule" "^1.16"
-    "ngraph.forcelayout" "3"
-    "ngraph.graph" "20"
-    "tinycolor2" "1"
-
-"three-render-objects@^1.35":
-  "integrity" "sha512-Ukpu1pei3L5r809izvjsZxwuRcYLiyn6Uvy3lZ9bpMTdvj3i6PeX6w++/hs2ZS3KnEzGjb6YvTvh4UQuwHTDJg=="
-  "resolved" "https://registry.npmjs.org/three-render-objects/-/three-render-objects-1.40.4.tgz"
-  "version" "1.40.4"
+    accessor-fn "1"
+    d3-array "1 - 3"
+    d3-force-3d "2 - 3"
+    d3-scale "1 - 4"
+    d3-scale-chromatic "1 - 3"
+    data-bind-mapper "1"
+    kapsule "^1.16"
+    ngraph.forcelayout "3"
+    ngraph.graph "20"
+    tinycolor2 "1"
+
+three-render-objects@^1.35:
+  version "1.40.4"
+  resolved "https://registry.npmjs.org/three-render-objects/-/three-render-objects-1.40.4.tgz"
+  integrity sha512-Ukpu1pei3L5r809izvjsZxwuRcYLiyn6Uvy3lZ9bpMTdvj3i6PeX6w++/hs2ZS3KnEzGjb6YvTvh4UQuwHTDJg==
   dependencies:
     "@tweenjs/tween.js" "18 - 25"
-    "accessor-fn" "1"
-    "float-tooltip" "^1.7"
-    "kapsule" "^1.16"
-    "polished" "4"
-
-"three@^0.181.1", "three@>=0.118 <1", "three@>=0.118.3", "three@>=0.168":
-  "integrity" "sha512-bz9xZUQMw3pJbjKy7roiwXWgAp+oVUa+4k5o0oBAQ+IFJuru1xzvtk63h6k72XZanXS/SgoEhV6927Vgazyq2w=="
-  "resolved" "https://registry.npmjs.org/three/-/three-0.181.1.tgz"
-  "version" "0.181.1"
-
-"tinycolor2@^1.6.0", "tinycolor2@1":
-  "integrity" "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
-  "resolved" "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz"
-  "version" "1.6.0"
-
-"tslib@2.3.0":
-  "integrity" "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
-  "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz"
-  "version" "2.3.0"
-
-"uni-read-pages@^1.0.5":
-  "integrity" "sha512-GkrrZ0LX0vn9R5k6RKEi0Ez3Q3e2vUpjXQ8Z6/K/d28KudI9ajqgt8WEjQFlG5EPm1K6uTArN8LlqmZTEixDUA=="
-  "resolved" "https://registry.npmmirror.com/uni-read-pages/-/uni-read-pages-1.0.5.tgz"
-  "version" "1.0.5"
-
-"uni-simple-router@^2.0.7":
-  "integrity" "sha512-8FKv5dw7Eoonm0gkO8udprrxzin0fNUI0+AvIphFkFRH5ZmP5ZWJ2pvnWzb2NiiqQSECTSU5VSB7HhvOSwD5eA=="
-  "resolved" "https://registry.npmmirror.com/uni-simple-router/-/uni-simple-router-2.0.7.tgz"
-  "version" "2.0.7"
-
-"uploading-oss@^1.0.3":
-  "integrity" "sha512-aqHh5NCOBcrA4d8yCIKR7B9GrKzH88X7gL8BSvIw18pi79AgWnhDkCoyjQmDqzTvjQqYfKwyFTEgnafzMx/GbQ=="
-  "resolved" "https://registry.npmjs.org/uploading-oss/-/uploading-oss-1.0.3.tgz"
-  "version" "1.0.3"
+    accessor-fn "1"
+    float-tooltip "^1.7"
+    kapsule "^1.16"
+    polished "4"
+
+three@^0.181.1, "three@>=0.118 <1", three@>=0.118.3, three@>=0.168:
+  version "0.181.1"
+  resolved "https://registry.npmjs.org/three/-/three-0.181.1.tgz"
+  integrity sha512-bz9xZUQMw3pJbjKy7roiwXWgAp+oVUa+4k5o0oBAQ+IFJuru1xzvtk63h6k72XZanXS/SgoEhV6927Vgazyq2w==
+
+tinycolor2@^1.6.0, tinycolor2@1:
+  version "1.6.0"
+  resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz"
+  integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
+
+tslib@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz"
+  integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
+
+uni-read-pages@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/uni-read-pages/-/uni-read-pages-1.0.5.tgz"
+  integrity sha512-GkrrZ0LX0vn9R5k6RKEi0Ez3Q3e2vUpjXQ8Z6/K/d28KudI9ajqgt8WEjQFlG5EPm1K6uTArN8LlqmZTEixDUA==
+
+uni-simple-router@^2.0.7:
+  version "2.0.7"
+  resolved "https://registry.npmmirror.com/uni-simple-router/-/uni-simple-router-2.0.7.tgz"
+  integrity sha512-8FKv5dw7Eoonm0gkO8udprrxzin0fNUI0+AvIphFkFRH5ZmP5ZWJ2pvnWzb2NiiqQSECTSU5VSB7HhvOSwD5eA==
+
+uploading-oss@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmjs.org/uploading-oss/-/uploading-oss-1.0.3.tgz"
+  integrity sha512-aqHh5NCOBcrA4d8yCIKR7B9GrKzH88X7gL8BSvIw18pi79AgWnhDkCoyjQmDqzTvjQqYfKwyFTEgnafzMx/GbQ==
   dependencies:
-    "crypto-js" "^4.1.1"
-    "js-base64" "^2.6.4"
-
-"vue-waterfall-easy@^2.4.4":
-  "integrity" "sha512-5OkpT2FPNC3rHBy858zk/nmJxqdPaGmj/KVbmA6dgcvtsovKMa+zuf/Z7F+S2NnObeavpIBztTWgcH3S42ZD+g=="
-  "resolved" "https://registry.npmjs.org/vue-waterfall-easy/-/vue-waterfall-easy-2.4.4.tgz"
-  "version" "2.4.4"
-
-"vue@^2.6.8":
-  "integrity" "sha512-HmFC70qarSHPXcKtW8U8fgIkF6JGvjEmDiVInTkKZP0gIlEPhlVlcJJLkdGIDiNkIeA2zJPQTWJUI4iWe+AVfg=="
-  "resolved" "https://registry.npmjs.org/vue/-/vue-2.7.10.tgz"
-  "version" "2.7.10"
+    crypto-js "^4.1.1"
+    js-base64 "^2.6.4"
+
+vue-waterfall-easy@^2.4.4:
+  version "2.4.4"
+  resolved "https://registry.npmjs.org/vue-waterfall-easy/-/vue-waterfall-easy-2.4.4.tgz"
+  integrity sha512-5OkpT2FPNC3rHBy858zk/nmJxqdPaGmj/KVbmA6dgcvtsovKMa+zuf/Z7F+S2NnObeavpIBztTWgcH3S42ZD+g==
+
+vue@^2.6.8:
+  version "2.7.10"
+  resolved "https://registry.npmjs.org/vue/-/vue-2.7.10.tgz"
+  integrity sha512-HmFC70qarSHPXcKtW8U8fgIkF6JGvjEmDiVInTkKZP0gIlEPhlVlcJJLkdGIDiNkIeA2zJPQTWJUI4iWe+AVfg==
   dependencies:
     "@vue/compiler-sfc" "2.7.10"
-    "csstype" "^3.1.0"
+    csstype "^3.1.0"
 
-"wecomjsdk@^1.0.2":
-  "integrity" "sha512-nPbrTcA5P8IOY/gQJJ3/AtXE2zSqJIQB156RUAQ2+RvwvJmcR66p7hpZtCjbtKefvyDO0LJBdEFqfjRR72zjIw=="
-  "resolved" "https://registry.npmmirror.com/wecomjsdk/-/wecomjsdk-1.0.2.tgz"
-  "version" "1.0.2"
+wecomjsdk@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/wecomjsdk/-/wecomjsdk-1.0.2.tgz"
+  integrity sha512-nPbrTcA5P8IOY/gQJJ3/AtXE2zSqJIQB156RUAQ2+RvwvJmcR66p7hpZtCjbtKefvyDO0LJBdEFqfjRR72zjIw==
 
-"zrender@6.0.0":
-  "integrity" "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg=="
-  "resolved" "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz"
-  "version" "6.0.0"
+zrender@6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz"
+  integrity sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==
   dependencies:
-    "tslib" "2.3.0"
+    tslib "2.3.0"