panhui 4 years ago
parent
commit
10804735b7

+ 172 - 19
src/main/nine-space/package-lock.json

@@ -1076,7 +1076,6 @@
       "version": "7.15.4",
       "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
       "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
-      "dev": true,
       "requires": {
         "regenerator-runtime": "^0.13.4"
       }
@@ -1917,6 +1916,8 @@
     },
     "@vue/cli-plugin-babel": {
       "version": "4.5.14",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.14.tgz",
+      "integrity": "sha512-8+K684NwmN7TitdCLB9GVts36582ohusfxAL/v6cWnUgrw79gbdGkY8SqyXWrbXCyWYDJrhB25LQIrqGfsJ6Dg==",
       "dev": true,
       "requires": {
         "@babel/core": "^7.11.0",
@@ -1930,6 +1931,8 @@
     },
     "@vue/cli-plugin-eslint": {
       "version": "4.5.14",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.14.tgz",
+      "integrity": "sha512-8leK9mZ4Ia4hARWMfVAbcgPBFKjdeOW9S0nG+pt6OBnnwK+V1jf/C7ytfXH+H086KgisU8R9nz1xNaz+9QET0g==",
       "dev": true,
       "requires": {
         "@vue/cli-shared-utils": "^4.5.14",
@@ -1942,6 +1945,8 @@
     },
     "@vue/cli-plugin-pwa": {
       "version": "4.5.14",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.5.14.tgz",
+      "integrity": "sha512-Ikg2+IHSXGf+KFNkDbKDkm0HZOFBMQWVrIv8yipmOG1q7qbYmRF1rrYLvttLZlGa7/P8J8Zv3uFnGxWlmdeJYA==",
       "dev": true,
       "requires": {
         "@vue/cli-shared-utils": "^4.5.14",
@@ -1966,6 +1971,8 @@
     },
     "@vue/cli-service": {
       "version": "4.5.14",
+      "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.5.14.tgz",
+      "integrity": "sha512-vKdqs9FQH2PYcmANcUm5McE8qqFKPjvoAh3YiNBD0qjMyuX6XGmej8pICJnbbu0Kn3EgQY3haemSIhVkPPyL4g==",
       "dev": true,
       "requires": {
         "@intervolga/optimize-cssnano-plugin": "^1.0.5",
@@ -2017,6 +2024,7 @@
         "thread-loader": "^2.1.3",
         "url-loader": "^2.2.0",
         "vue-loader": "^15.9.2",
+        "vue-loader-v16": "npm:vue-loader@^16.1.0",
         "vue-style-loader": "^4.1.2",
         "webpack": "^4.0.0",
         "webpack-bundle-analyzer": "^3.8.0",
@@ -2164,6 +2172,8 @@
     },
     "@vue/eslint-config-prettier": {
       "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz",
+      "integrity": "sha512-wFQmv45c3ige5EA+ngijq40YpVcIkAy0Lihupnsnd1Dao5CBbPyfCzqtejFLZX1EwH/kCJdpz3t6s+5wd3+KxQ==",
       "dev": true,
       "requires": {
         "eslint-config-prettier": "^6.0.0"
@@ -2755,12 +2765,16 @@
     },
     "axios": {
       "version": "0.21.4",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+      "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
       "requires": {
         "follow-redirects": "^1.14.0"
       }
     },
     "babel-eslint": {
       "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
@@ -3042,6 +3056,8 @@
     },
     "better-scroll": {
       "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/better-scroll/-/better-scroll-2.4.2.tgz",
+      "integrity": "sha512-I/JzJNUay2vMAkczBa/4x52QBdUGA3Bs/QtrKrxVjSbBHUMG6yR14srQr4aCAWlIra1FBmuddwGRfI6zRagI9Q==",
       "requires": {
         "@better-scroll/core": "^2.4.2",
         "@better-scroll/indicators": "^2.4.2",
@@ -3991,6 +4007,11 @@
       "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
       "dev": true
     },
+    "complex.js": {
+      "version": "2.0.15",
+      "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.15.tgz",
+      "integrity": "sha512-gDBvQU8IG139ZBQTSo2qvDFP+lANMGluM779csXOr6ny1NUtA3wkUnCFjlDNH/moAVfXtvClYt6G0zarFbtz5w=="
+    },
     "component-emitter": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
@@ -4611,6 +4632,11 @@
       "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
       "dev": true
     },
+    "decimal.js": {
+      "version": "10.3.1",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
+      "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ=="
+    },
     "decode-uri-component": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -5261,6 +5287,11 @@
       "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
       "dev": true
     },
+    "escape-latex": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz",
+      "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw=="
+    },
     "escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -5269,6 +5300,8 @@
     },
     "eslint": {
       "version": "6.8.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
+      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
@@ -5377,6 +5410,8 @@
     },
     "eslint-plugin-prettier": {
       "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz",
+      "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==",
       "dev": true,
       "requires": {
         "prettier-linter-helpers": "^1.0.0"
@@ -5384,6 +5419,8 @@
     },
     "eslint-plugin-vue": {
       "version": "7.20.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz",
+      "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==",
       "dev": true,
       "requires": {
         "eslint-utils": "^2.1.0",
@@ -6021,6 +6058,11 @@
       "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
       "dev": true
     },
+    "fraction.js": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz",
+      "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg=="
+    },
     "fragment-cache": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -6545,6 +6587,8 @@
     },
     "html2canvas": {
       "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.3.2.tgz",
+      "integrity": "sha512-4+zqv87/a1LsaCrINV69wVLGG8GBZcYBboz1JPWEgiXcWoD9kroLzccsBRU/L9UlfV2MAZ+3J92U9IQPVMDeSQ==",
       "requires": {
         "css-line-break": "2.0.1",
         "text-segmentation": "^1.0.2"
@@ -7353,6 +7397,11 @@
       "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
       "dev": true
     },
+    "javascript-natural-sort": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
+      "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k="
+    },
     "javascript-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz",
@@ -7522,6 +7571,8 @@
     },
     "less": {
       "version": "3.13.1",
+      "resolved": "https://registry.npmjs.org/less/-/less-3.13.1.tgz",
+      "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==",
       "dev": true,
       "requires": {
         "copy-anything": "^2.0.1",
@@ -7537,6 +7588,8 @@
     },
     "less-loader": {
       "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz",
+      "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==",
       "dev": true,
       "requires": {
         "clone": "^2.1.1",
@@ -7788,6 +7841,22 @@
         "object-visit": "^1.0.0"
       }
     },
+    "mathjs": {
+      "version": "9.5.1",
+      "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-9.5.1.tgz",
+      "integrity": "sha512-yYu67sdmrLrQeRyN+DPH0aRQphdmI/gz4oNXFx4YR43NKifOiNTfXT30+ACsNIWaqJ1KihhVDD+X1kwfI2/X9g==",
+      "requires": {
+        "@babel/runtime": "^7.15.4",
+        "complex.js": "^2.0.15",
+        "decimal.js": "^10.3.1",
+        "escape-latex": "^1.2.0",
+        "fraction.js": "^4.1.1",
+        "javascript-natural-sort": "^0.7.1",
+        "seedrandom": "^3.0.5",
+        "tiny-emitter": "^2.1.0",
+        "typed-function": "^2.0.0"
+      }
+    },
     "md5.js": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@@ -9425,6 +9494,8 @@
     },
     "prettier": {
       "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz",
+      "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==",
       "dev": true
     },
     "prettier-linter-helpers": {
@@ -9743,8 +9814,7 @@
     "regenerator-runtime": {
       "version": "0.13.9",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
-      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
-      "dev": true
+      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
     },
     "regenerator-transform": {
       "version": "0.14.5",
@@ -9796,7 +9866,9 @@
       }
     },
     "register-service-worker": {
-      "version": "1.7.2"
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/register-service-worker/-/register-service-worker-1.7.2.tgz",
+      "integrity": "sha512-CiD3ZSanZqcMPRhtfct5K9f7i3OLCcBBWsJjLh1gW9RO/nS94sVzY59iS+fgYBOBqaBpf4EzfqUF3j9IG+xo8A=="
     },
     "regjsgen": {
       "version": "0.5.2",
@@ -10137,6 +10209,11 @@
         "ajv-keywords": "^3.1.0"
       }
     },
+    "seedrandom": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
+      "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
+    },
     "select": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
@@ -10954,6 +11031,8 @@
     },
     "style-resources-loader": {
       "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/style-resources-loader/-/style-resources-loader-1.4.1.tgz",
+      "integrity": "sha512-UaAoQXq20relw6B633z4QZDxDyW7gevTt1e0y3MZtzdZfnvB90UL658czAgNc609Y7Kn5ErdthK9bSVhnykBUA==",
       "dev": true,
       "requires": {
         "glob": "^7.1.6",
@@ -11047,6 +11126,8 @@
     },
     "swiper": {
       "version": "6.8.4",
+      "resolved": "https://registry.npmjs.org/swiper/-/swiper-6.8.4.tgz",
+      "integrity": "sha512-O+buF9Q+sMA0H7luMS8R59hCaJKlpo8PXhQ6ZYu6Rn2v9OsFd4d1jmrv14QvxtQpKAvL/ZiovEeANI/uDGet7g==",
       "requires": {
         "dom7": "^3.0.0",
         "ssr-window": "^3.0.0"
@@ -11366,6 +11447,11 @@
         "mime-types": "~2.1.24"
       }
     },
+    "typed-function": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-2.0.0.tgz",
+      "integrity": "sha512-Hhy1Iwo/e4AtLZNK10ewVVcP2UEs408DS35ubP825w/YgSBK1KVLwALvvIG4yX75QJrxjCpcWkzkVRB0BwwYlA=="
+    },
     "typedarray": {
       "version": "0.0.6",
       "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
@@ -11707,6 +11793,8 @@
     },
     "vant": {
       "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/vant/-/vant-3.2.5.tgz",
+      "integrity": "sha512-1nBiZsTzf53FZt4mhQvkAFy6t/mJDKVgGnjzrTyga2zA2tppH0ZIPtFyPlz6GYpvEf6Tile29DKHCvYMS8uOqA==",
       "requires": {
         "@vant/icons": "^1.7.1",
         "@vant/lazyload": "^1.4.0",
@@ -11753,6 +11841,8 @@
     },
     "vue": {
       "version": "3.2.20",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.20.tgz",
+      "integrity": "sha512-81JjEP4OGk9oO8+CU0h2nFPGgJBm9mNa3kdCX2k6FuRdrWrC+CNe+tOnuIeTg8EWwQuI+wwdra5Q7vSzp7p4Iw==",
       "requires": {
         "@vue/compiler-dom": "3.2.20",
         "@vue/compiler-sfc": "3.2.20",
@@ -11763,10 +11853,14 @@
     },
     "vue-cli-plugin-style-resources-loader": {
       "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/vue-cli-plugin-style-resources-loader/-/vue-cli-plugin-style-resources-loader-0.1.5.tgz",
+      "integrity": "sha512-LluhjWTZmpGl3tiXg51EciF+T70IN/9t6UvfmgluJBqxbrb6OV9i7L5lTd+OKtcTeghDkhcBmYhtTxxU4w/8sQ==",
       "dev": true
     },
     "vue-clipboard2": {
       "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/vue-clipboard2/-/vue-clipboard2-0.3.3.tgz",
+      "integrity": "sha512-aNWXIL2DKgJyY/1OOeITwAQz1fHaCIGvUFHf9h8UcoQBG5a74MkdhS/xqoYe7DNZdQmZRL+TAdIbtUs9OyVjbw==",
       "requires": {
         "clipboard": "^2.0.0"
       },
@@ -11785,15 +11879,12 @@
     },
     "vue-croppie": {
       "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/vue-croppie/-/vue-croppie-2.0.2.tgz",
+      "integrity": "sha512-+yiDryp76tkHpYvbFdKSTM2VSU4TTLIikOvWlSaTaomvTky2Fiig7aRr1+AcHdB1mhrtEAZQRrWFbvc7NX0qBQ==",
       "requires": {
         "croppie": "^2.6.4"
       }
     },
-    "vue-demi": {
-      "version": "0.11.4",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.11.4.tgz",
-      "integrity": "sha512-/3xFwzSykLW2HiiLie43a+FFgNOcokbBJ+fzvFXd0r2T8MYohqvphUyDQ8lbAwzQ3Dlcrb1c9ykifGkhSIAk6A=="
-    },
     "vue-eslint-parser": {
       "version": "7.11.0",
       "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz",
@@ -11844,24 +11935,84 @@
         }
       }
     },
-    "vue-qrcode": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/vue-qrcode/-/vue-qrcode-1.0.0.tgz",
-      "integrity": "sha512-rzFR9bTMpsY9lhsABmQw7JbRrOV7NAUbz7E+mu6bMjYpFHoRbH1OVlPxALcxJ0veX3Njt5vfA7pMM5dx1KMLow==",
+    "vue-loader-v16": {
+      "version": "npm:vue-loader@16.8.1",
+      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.1.tgz",
+      "integrity": "sha512-V53TJbHmzjBhCG5OYI2JWy/aYDspz4oVHKxS43Iy212GjGIG1T3EsB3+GWXFm/1z5VwjdjLmdZUFYM70y77vtQ==",
+      "dev": true,
+      "optional": true,
       "requires": {
-        "tslib": "^2.2.0",
-        "vue-demi": "^0.11.3"
+        "chalk": "^4.1.0",
+        "hash-sum": "^2.0.0",
+        "loader-utils": "^2.0.0"
       },
       "dependencies": {
-        "tslib": {
-          "version": "2.3.1",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-          "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
         }
       }
     },
     "vue-router": {
       "version": "4.0.12",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.12.tgz",
+      "integrity": "sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg==",
       "requires": {
         "@vue/devtools-api": "^6.0.0-beta.18"
       }
@@ -11892,6 +12043,8 @@
     },
     "vuex": {
       "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz",
+      "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==",
       "requires": {
         "@vue/devtools-api": "^6.0.0-beta.11"
       }

+ 1 - 0
src/main/nine-space/package.json

@@ -16,6 +16,7 @@
     "core-js": "^3.6.5",
     "html2canvas": "^1.3.2",
     "lodash": "^4.17.21",
+    "mathjs": "^9.5.1",
     "qrcode": "^1.4.4",
     "register-service-worker": "^1.7.1",
     "swiper": "^6.8.1",

+ 172 - 187
src/main/nine-space/src/views/Home.vue

@@ -1,60 +1,45 @@
 <template>
-  <div class="home">
-    <swiper
-      :effect="'coverflow'"
-      :grabCursor="true"
-      :centeredSlides="true"
-      :slidesPerView="'auto'"
-      :coverflowEffect="{
-        rotate: 0,
-        stretch: 0,
-        depth: -100,
-        modifier: 1,
-        slideShadows: true,
-      }"
-      loop
-      class="mySwiper"
-      v-if="banners.length > 0"
-    >
-      <template v-for="item in banners" :key="item.id">
-        <swiper-slide>
-          <van-image
-            width="100%"
-            height="calc(45vw - 29px)"
-            :src="item.pic"
-            fit="cover"
-          />
-        </swiper-slide>
-      </template>
-    </swiper>
-
-    <div class="box" v-if="box.length > 0">
-      <page-title
-        title="数字盲盒"
-        :to="{ path: '/productList', query: { type: 'BLIND_BOX' } }"
-      ></page-title>
-      <div class="box-list">
-        <product-info
-          v-for="(item, index) in box"
-          :key="item.id"
-          v-model:info="box[index]"
-        ></product-info>
-      </div>
-    </div>
-
-    <div class="box">
-      <page-title
-        title="最HOT收藏品"
-        :to="{ path: '/productList', query: { type: 'DEFAULT' } }"
-      ></page-title>
-      <div class="box-list">
-        <template v-for="(item, index) in products" :key="item.id">
-          <product-info v-model:info="products[index]"></product-info
-        ></template>
-      </div>
-    </div>
-
-    <!-- <page-title title="最HOT收藏品"></page-title>
+    <div class="home">
+        <swiper
+            :effect="'coverflow'"
+            :grabCursor="true"
+            :centeredSlides="true"
+            :slidesPerView="'auto'"
+            :coverflowEffect="{
+                rotate: 0,
+                stretch: 0,
+                depth: -100,
+                modifier: 1,
+                slideShadows: true
+            }"
+            loop
+            class="mySwiper"
+            v-if="banners.length > 0"
+        >
+            <template v-for="item in banners" :key="item.id">
+                <swiper-slide>
+                    <van-image :radius="6" width="100%" height="calc(45vw - 29px)" :src="item.pic" fit="cover" />
+                </swiper-slide>
+            </template>
+        </swiper>
+
+        <div class="box" v-if="box.length > 0">
+            <page-title title="数字盲盒" :to="{ path: '/productList', query: { type: 'BLIND_BOX' } }"></page-title>
+            <div class="box-list">
+                <product-info v-for="(item, index) in box" :key="item.id" v-model:info="box[index]"></product-info>
+            </div>
+        </div>
+
+        <div class="box">
+            <page-title title="最HOT收藏品" :to="{ path: '/productList', query: { type: 'DEFAULT' } }"></page-title>
+            <div class="box-list">
+                <template v-for="(item, index) in products" :key="item.id">
+                    <product-info v-model:info="products[index]"></product-info
+                ></template>
+            </div>
+        </div>
+
+        <!-- <page-title title="最HOT收藏品"></page-title>
 
     <div class="hot">
       <product-info></product-info>
@@ -64,178 +49,178 @@
       </div>
     </div> -->
 
-    <div class="casting">
-      <page-title
-        title="最受欢迎铸造者"
-        :to="{ path: '/creatorList' }"
-      ></page-title>
-      <template v-for="(item, index) in miners" :key="index">
-        <creator-info
-          :rank="index < 3 ? index + 1 : 0"
-          v-model:info="miners[index]"
-          size="large"
-        ></creator-info>
-      </template>
+        <div class="casting">
+            <page-title title="最受欢迎铸造者" :to="{ path: '/creatorList' }"></page-title>
+            <template v-for="(item, index) in miners" :key="index">
+                <creator-info
+                    :rank="index < 3 ? index + 1 : 0"
+                    v-model:info="miners[index]"
+                    size="large"
+                ></creator-info>
+            </template>
+        </div>
     </div>
-  </div>
 </template>
 
 <script>
 // @ is an alias to /src
 
-import { Swiper, SwiperSlide } from "swiper/vue";
+import { Swiper, SwiperSlide } from 'swiper/vue';
 
 // Import Swiper styles
 
-import "swiper/swiper.min.css";
-import "swiper/swiper-bundle.min.css";
+import 'swiper/swiper.min.css';
+import 'swiper/swiper-bundle.min.css';
 
-import SwiperCore, { EffectCoverflow } from "swiper";
-import ProductInfo from "../components/product/productInfo.vue";
+import SwiperCore, { EffectCoverflow } from 'swiper';
+import ProductInfo from '../components/product/productInfo.vue';
 // import ProductSmall from "../components/product/productSmall.vue";
-import CreatorInfo from "../components/creator/CreatorInfo.vue";
+import CreatorInfo from '../components/creator/CreatorInfo.vue';
 
 // install Swiper modules
 SwiperCore.use([EffectCoverflow]);
 
 export default {
-  name: "Home",
-  inject: ["bs"],
-  components: {
-    Swiper,
-    SwiperSlide,
-    ProductInfo,
-    CreatorInfo,
-  },
-  data() {
-    return {
-      banners: [],
-      box: [],
-      products: [],
-      miners: [],
-    };
-  },
-  mounted() {
-    this.$toast.loading({
-      message: "加载中...",
-      forbidClick: true,
-    });
-    Promise.all([
-      this.$http
-        .post(
-          "/banner/all",
-          {
-            query: {
-              type: "HOME",
-            },
-            sort: "createdAt,desc",
-          },
-          { body: "json" }
-        )
-        .then((res) => {
-          this.banners = res.content;
-        }),
-      this.getProduct("BLIND_BOX").then((res) => {
-        this.box = res;
-      }),
-      this.getProduct().then((res) => {
-        this.products = res;
-      }),
-      this.getMiner(),
-    ]).then(() => {
-      setTimeout(() => {
-        this.$toast.clear();
-        this.bs.value.refresh();
-      }, 100);
-    });
-  },
-  methods: {
-    getProduct(type = "DEFAULT") {
-      return this.$http
-        .post(
-          "/collection/all",
-          {
-            page: 0,
-            size: 4,
-            query: {
-              type: type,
-              onShelf: true,
-              del: false,
-            },
-            sort: "createdAt,desc",
-          },
-          { body: "json" }
-        )
-        .then((res) => {
-          return Promise.resolve(res.content);
-        });
+    name: 'Home',
+    inject: ['bs'],
+    components: {
+        Swiper,
+        SwiperSlide,
+        ProductInfo,
+        CreatorInfo
+    },
+    data() {
+        return {
+            banners: [],
+            box: [],
+            products: [],
+            miners: []
+        };
     },
-    getMiner() {
-      this.$http
-        .post(
-          "/user/all",
-          {
-            page: 0,
-            query: { hasRole: "ROLE_MINTER" },
-            size: 5,
-            sort: "createdAt,desc",
-          },
-          { body: "json" }
-        )
-        .then((res) => {
-          this.miners = res.content;
+    mounted() {
+        this.$toast.loading({
+            message: '加载中...',
+            forbidClick: true
+        });
+        Promise.all([
+            this.$http
+                .post(
+                    '/banner/all',
+                    {
+                        query: {
+                            type: 'HOME'
+                        },
+                        sort: 'createdAt,desc'
+                    },
+                    { body: 'json' }
+                )
+                .then(res => {
+                    this.banners = res.content;
+                }),
+            this.getProduct('BLIND_BOX').then(res => {
+                this.box = res;
+            }),
+            this.getProduct().then(res => {
+                this.products = res;
+            }),
+            this.getMiner()
+        ]).then(() => {
+            setTimeout(() => {
+                this.$toast.clear();
+                this.bs.value.refresh();
+            }, 100);
         });
     },
-  },
+    methods: {
+        getProduct(type = 'DEFAULT') {
+            return this.$http
+                .post(
+                    '/collection/all',
+                    {
+                        page: 0,
+                        size: 4,
+                        query: {
+                            type: type,
+                            onShelf: true,
+                            del: false
+                        },
+                        sort: 'createdAt,desc'
+                    },
+                    { body: 'json' }
+                )
+                .then(res => {
+                    return Promise.resolve(res.content);
+                });
+        },
+        getMiner() {
+            this.$http
+                .post(
+                    '/user/all',
+                    {
+                        page: 0,
+                        query: { hasRole: 'ROLE_MINTER' },
+                        size: 5,
+                        sort: 'createdAt,desc'
+                    },
+                    { body: 'json' }
+                )
+                .then(res => {
+                    this.miners = res.content;
+                });
+        }
+    }
 };
 </script>
 
 <style lang="less" scoped>
 .swiper {
-  width: 100%;
-  padding-top: 50px;
-  padding-bottom: 50px;
+    width: 100%;
+    padding-top: 50px;
+    padding-bottom: 50px;
 }
 
 .swiper-slide {
-  background-position: center;
-  background-size: cover;
-  width: calc(100vw - 66px);
-  height: calc(45vw - 29px);
-
-  img {
+    background-position: center;
+    background-size: cover;
     width: calc(100vw - 66px);
     height: calc(45vw - 29px);
-    display: block;
-  }
+
+    img {
+        width: calc(100vw - 66px);
+        height: calc(45vw - 29px);
+        display: block;
+    }
+    .van-image {
+        border-radius: 6px;
+    }
 }
 
 .swiper-slide img {
-  display: block;
-  width: 100%;
+    display: block;
+    width: 100%;
 }
 .home {
-  padding: 10px 0 100px;
+    padding: 10px 0 100px;
 }
 
 .hot {
-  display: flex;
-  padding: 0 8px;
-
-  .hot-right {
     display: flex;
-    flex-direction: column;
-    justify-content: space-between;
-  }
+    padding: 0 8px;
+
+    .hot-right {
+        display: flex;
+        flex-direction: column;
+        justify-content: space-between;
+    }
 }
 
 .box-list {
-  padding: 0 8px;
-  display: flex;
-  flex-wrap: wrap;
+    padding: 0 8px;
+    display: flex;
+    flex-wrap: wrap;
 
-  .product {
-    margin-bottom: 16px;
-  }
+    .product {
+        margin-bottom: 16px;
+    }
 }
 </style>

+ 260 - 273
src/main/nine-space/src/views/Submit.vue

@@ -1,325 +1,312 @@
 <template>
-  <div class="submit">
-    <div class="pageTitle">{{ info.minter }}</div>
-    <div class="product">
-      <van-image
-        width="74"
-        height="104"
-        :radius="6"
-        :src="getImg(info.pics || info.pic)"
-        fit="cover"
-      />
-      <div class="product-content">
-        <div class="text1">
-          {{ info.name }}
+    <div class="submit">
+        <div class="pageTitle">{{ info.minter }}</div>
+        <div class="product">
+            <van-image width="74" height="104" :radius="6" :src="getImg(info.pics || info.pic)" fit="cover" />
+            <div class="product-content">
+                <div class="text1">
+                    {{ info.name }}
+                </div>
+                <div class="no"></div>
+                <div class="price">¥{{ info.price }}</div>
+            </div>
         </div>
-        <div class="no"></div>
-        <div class="price">¥{{ info.price }}</div>
-      </div>
-    </div>
 
-    <div class="list">
-      <div class="info">
-        <div class="text1">商品费用</div>
-        <div class="text2">¥{{ info.price }}</div>
-      </div>
-      <div class="info">
-        <div class="text1">GAS费用</div>
-        <div class="text2">¥{{ gas }}</div>
-      </div>
+        <div class="list">
+            <div class="info">
+                <div class="text1">商品费用</div>
+                <div class="text2">¥{{ info.price }}</div>
+            </div>
+            <div class="info">
+                <div class="text1">GAS费用</div>
+                <div class="text2">¥{{ gas }}</div>
+            </div>
 
-      <van-field
-        type="text"
-        label="订单留言"
-        placeholder="选填"
-        v-model="message"
-      />
+            <van-field type="text" label="订单留言" placeholder="选填" v-model="message" />
 
-      <div class="pay">
-        <div
-          class="pay-item"
-          @click="payType = item.type"
-          v-for="(item, index) in payInfos"
-          :key="index"
-        >
-          <img :src="item.icon" alt="" />
-          <span>{{ item.name }}</span>
-          <img :src="payType === item.type ? icons[1] : icons[0]" alt="" />
+            <div class="pay">
+                <div class="pay-item" @click="payType = item.type" v-for="(item, index) in payInfos" :key="index">
+                    <img :src="item.icon" alt="" />
+                    <span>{{ item.name }}</span>
+                    <img :src="payType === item.type ? icons[1] : icons[0]" alt="" />
+                </div>
+            </div>
         </div>
-      </div>
-    </div>
 
-    <div class="bottom van-safe-area-bottom" ref="bottom">
-      <div class="bottom-content">
-        <span class="text">总计</span>
-        <span class="price">
-          <i class="font_family icon-icon_jiage"></i>{{ money }}
-        </span>
-        <van-button
-          round
-          color="linear-gradient(135deg, #FDFB60 0%, #FF8F3E 100%)"
-          @click="submit"
-          :disabled="orderId"
-        >
-          立即支付
-        </van-button>
-      </div>
+        <div class="bottom van-safe-area-bottom" ref="bottom">
+            <div class="bottom-content">
+                <span class="text">总计</span>
+                <span class="price"> <i class="font_family icon-icon_jiage"></i>{{ money }} </span>
+                <div class="btn">
+                    <van-button
+                        round
+                        color="linear-gradient(135deg, #FDFB60 0%, #FF8F3E 100%)"
+                        @click="submit"
+                        :disabled="orderId"
+                    >
+                        立即支付
+                    </van-button>
+                </div>
+            </div>
+        </div>
     </div>
-  </div>
 </template>
 
 <script>
-const path = require("path");
+const path = require('path');
+import { add } from 'mathjs';
 export default {
-  name: "Submit",
-  inject: ["bs"],
-  data() {
-    return {
-      info: {},
-      message: "",
-      payType: "ALIPAY",
-      payInfos: [
-        {
-          icon: require("../assets/svgs/zhifubao.svg"),
-          name: "支付宝",
-          type: "ALIPAY",
-        },
-        {
-          icon: require("../assets/svgs/wechat.svg"),
-          name: "微信",
-          type: "WEIXIN",
-        },
-        // {
-        //   icon: require("../assets/svgs/png-decp.svg"),
-        //   name: "DCEP",
-        // },
-      ],
-      icons: [
-        require("../assets/svgs/icon_gouxuan_huise.svg"),
-        require("../assets/svgs/icon_gouxuan_pre.svg"),
-      ],
-      bottom: null,
-      orderId: 0,
-      gas: 1,
-    };
-  },
-  computed: {
-    money() {
-      if (this.info.price) {
-        return this.info.price + this.gas;
-      } else {
-        return 0;
-      }
+    name: 'Submit',
+    inject: ['bs'],
+    data() {
+        return {
+            info: {},
+            message: '',
+            payType: 'ALIPAY',
+            payInfos: [
+                {
+                    icon: require('../assets/svgs/zhifubao.svg'),
+                    name: '支付宝',
+                    type: 'ALIPAY'
+                },
+                {
+                    icon: require('../assets/svgs/wechat.svg'),
+                    name: '微信',
+                    type: 'WEIXIN'
+                }
+                // {
+                //   icon: require("../assets/svgs/png-decp.svg"),
+                //   name: "DCEP",
+                // },
+            ],
+            icons: [require('../assets/svgs/icon_gouxuan_huise.svg'), require('../assets/svgs/icon_gouxuan_pre.svg')],
+            bottom: null,
+            orderId: 0,
+            gas: 1
+        };
     },
-  },
-  mounted() {
-    this.$http.post("/sysConfig/get/gas_fee").then((res) => {
-      this.gas = res.value;
-    });
-    this.$toast.loading({
-      message: "加载中...",
-      forbidClick: true,
-    });
-    if (this.$route.query.id) {
-      this.$http.get("/collection/get/" + this.$route.query.id).then((res) => {
-        this.info = res;
-        setTimeout(() => {
-          this.$toast.clear();
-          this.bs.value.refresh();
-        }, 100);
-
-        // this.$http('/sysConfig/get/gas_fee')
-      });
-    } else {
-      this.$http.get("/order/get/" + this.$route.query.orderId).then((res) => {
-        this.info = res;
-        this.orderId = res.id;
-        setTimeout(() => {
-          this.bs.value.refresh();
-        }, 100);
-        this.$dialog
-          .alert({
-            title: "提示",
-            message:
-              res.status === "NOT_PAID" || res.status === "CANCELLED"
-                ? "订单支付失败,点击重新下单"
-                : "订单已支付,点击查看订单详情",
-          })
-          .then(() => {
-            if (res.status === "NOT_PAID" || res.status === "CANCELLED") {
-              this.$router.back();
+    computed: {
+        money() {
+            if (this.info.price) {
+                return add(this.info.price, this.gas);
             } else {
-              this.$router.replace("/orderDetail?id" + res.id);
+                return 0;
             }
-            // on close
-          });
-      });
-    }
-
-    this.bottom = this.$refs.bottom;
-    document.body.appendChild(this.$refs.bottom);
-  },
-  unmounted() {
-    if (this.bottom) {
-      document.body.removeChild(this.bottom);
-    }
-  },
-  methods: {
-    submit() {
-      this.$http
-        .post("/order/create?collectionId=" + this.$route.query.id + "&qty=1")
-        .then((res) => {
-          this.orderId = res.id;
-          this.$router.replace("/submit?orderId=" + res.id);
-          this.$nextTick(() => {
-            document.location.replace(
-              path.resolve(this.$baseUrl, "payOrder/alipay?id=" + res.id)
-            );
-          });
-        })
-        .catch((e) => {
-          if (e) {
-            this.$toast(e.error);
-          }
+        }
+    },
+    mounted() {
+        this.$http.get('/sysConfig/get/gas_fee').then(res => {
+            this.gas = res.value;
+        });
+        this.$toast.loading({
+            message: '加载中...',
+            forbidClick: true
         });
+        if (this.$route.query.id) {
+            this.$http.get('/collection/get/' + this.$route.query.id).then(res => {
+                this.info = res;
+                setTimeout(() => {
+                    this.$toast.clear();
+                    this.bs.value.refresh();
+                }, 100);
+
+                // this.$http('/sysConfig/get/gas_fee')
+            });
+        } else {
+            this.$http.get('/order/get/' + this.$route.query.orderId).then(res => {
+                this.info = res;
+                this.orderId = res.id;
+                setTimeout(() => {
+                    this.bs.value.refresh();
+                }, 100);
+                this.$dialog
+                    .alert({
+                        title: '提示',
+                        message:
+                            res.status === 'NOT_PAID' || res.status === 'CANCELLED'
+                                ? '订单支付失败,点击重新下单'
+                                : '订单已支付,点击查看订单详情'
+                    })
+                    .then(() => {
+                        if (res.status === 'NOT_PAID' || res.status === 'CANCELLED') {
+                            this.$router.back();
+                        } else {
+                            this.$router.replace('/orderDetail?id' + res.id);
+                        }
+                        // on close
+                    });
+            });
+        }
+
+        this.bottom = this.$refs.bottom;
+        document.body.appendChild(this.$refs.bottom);
     },
-  },
+    unmounted() {
+        if (this.bottom) {
+            document.body.removeChild(this.bottom);
+        }
+    },
+    methods: {
+        submit() {
+            this.$http
+                .post('/order/create?collectionId=' + this.$route.query.id + '&qty=1')
+                .then(res => {
+                    this.orderId = res.id;
+                    this.$router.replace('/submit?orderId=' + res.id);
+                    this.$nextTick(() => {
+                        document.location.replace(path.resolve(this.$baseUrl, 'payOrder/alipay?id=' + res.id));
+                    });
+                })
+                .catch(e => {
+                    if (e) {
+                        this.$toast(e.error);
+                    }
+                });
+        }
+    }
 };
 </script>
 
 <style lang="less" scoped>
 .submit {
-  padding: 20px 16px;
+    padding: 20px 16px;
 }
 
 .pageTitle {
-  font-size: 14px;
-  color: #ffffff;
-  line-height: 22px;
+    font-size: 14px;
+    color: #ffffff;
+    line-height: 22px;
 }
 
 .info {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  height: 60px;
-  border-bottom: 1px solid #202122;
-  .text1 {
-    font-size: 14px;
-    color: #ffffff;
-    line-height: 24px;
-  }
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    height: 60px;
+    border-bottom: 1px solid #202122;
+    .text1 {
+        font-size: 14px;
+        color: #ffffff;
+        line-height: 24px;
+    }
 
-  .text2 {
-    font-size: 16px;
-    font-weight: bold;
-    color: #fdfb60;
-    line-height: 24px;
-  }
+    .text2 {
+        font-size: 16px;
+        font-weight: bold;
+        color: #fdfb60;
+        line-height: 24px;
+    }
 
-  .text3 {
-    font-size: 14px;
-    color: #939599;
-    line-height: 20px;
-  }
+    .text3 {
+        font-size: 14px;
+        color: #939599;
+        line-height: 20px;
+    }
 }
 
 .product {
-  display: flex;
-  padding: 12px 0 20px;
-  .product-content {
-    flex-grow: 1;
-    margin-left: 10px;
     display: flex;
-    flex-direction: column;
-    .no {
-      flex-grow: 1;
-      padding: 4px 0 8px;
-      font-size: 14px;
-      color: #939599;
-      line-height: 24px;
-    }
+    padding: 12px 0 20px;
+    .product-content {
+        flex-grow: 1;
+        margin-left: 10px;
+        display: flex;
+        flex-direction: column;
+        .no {
+            flex-grow: 1;
+            padding: 4px 0 8px;
+            font-size: 14px;
+            color: #939599;
+            line-height: 24px;
+        }
 
-    .text1 {
-      font-size: 16px;
-      font-weight: bold;
-      color: #ffffff;
-      line-height: 22px;
-    }
+        .text1 {
+            font-size: 16px;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 22px;
+        }
 
-    .price {
-      font-size: 16px;
-      font-weight: bold;
-      color: #ffffff;
-      line-height: 24px;
+        .price {
+            font-size: 16px;
+            font-weight: bold;
+            color: #ffffff;
+            line-height: 24px;
+        }
     }
-  }
 }
 
 /deep/.van-field {
-  padding: 20px 0;
-  .van-field__label {
-    font-size: 14px;
-    color: #ffffff;
-    line-height: 24px;
-  }
-  .van-field__control {
-    text-align: right;
-    color: #939599;
-  }
+    padding: 20px 0;
+    .van-field__label {
+        font-size: 14px;
+        color: #ffffff;
+        line-height: 24px;
+    }
+    .van-field__control {
+        text-align: right;
+        color: #939599;
+    }
 }
 
 .pay-item {
-  display: flex;
-  align-items: center;
-  height: 60px;
-  border-top: 1px solid #202122;
-  span {
-    font-size: 14px;
-    font-weight: bold;
-    color: #ffffff;
-    line-height: 24px;
-    flex-grow: 1;
-    padding: 0 10px;
-  }
+    display: flex;
+    align-items: center;
+    height: 60px;
+    border-top: 1px solid #202122;
+    span {
+        font-size: 14px;
+        font-weight: bold;
+        color: #ffffff;
+        line-height: 24px;
+        flex-grow: 1;
+        padding: 0 10px;
+    }
 }
 
 .bottom {
-  position: fixed;
-  bottom: 0px;
-  left: 0;
-  right: 0;
-  background-color: @bg;
-  z-index: 20;
-  border-top: 1px solid #313233;
+    position: fixed;
+    bottom: 0px;
+    left: 0;
+    right: 0;
+    background-color: @bg;
+    z-index: 20;
+    border-top: 1px solid #313233;
 
-  .bottom-content {
-    padding: 6px 16px;
-    display: flex;
-    align-items: center;
+    .bottom-content {
+        padding: 6px 16px;
+        display: flex;
+        align-items: center;
 
-    .van-button {
-      width: 210px;
-      color: #333230 !important;
-    }
-    .text {
-      font-size: 14px;
-      color: #939599;
-      line-height: 20px;
-    }
+        .btn {
+            flex-grow: 1;
+            display: flex;
+            justify-content: flex-end;
+        }
+        .van-button {
+            flex-grow: 1;
+            color: #333230 !important;
+            max-width: 210px;
+        }
+        .text {
+            font-size: 14px;
+            color: #939599;
+            line-height: 20px;
+            word-break: keep-all;
+        }
 
-    .price {
-      font-size: 34px;
-      font-family: OSP;
-      font-weight: normal;
-      color: #fdfb60;
-      line-height: 34px;
-      flex-grow: 1;
-      margin: 0 10px;
-      .font_family {
-        font-size: 10px;
-      }
+        .price {
+            font-size: 34px;
+            font-family: OSP;
+            font-weight: normal;
+            color: #fdfb60;
+            line-height: 34px;
+            // flex-grow: 1;
+            margin: 0 10px;
+            .font_family {
+                font-size: 10px;
+            }
+        }
     }
-  }
 }
 </style>

+ 374 - 392
src/main/nine-space/src/views/product/Detail.vue

@@ -1,28 +1,27 @@
 <template>
-  <div class="detail">
-    <swiper pagination class="mySwiper" v-if="banners.length > 0">
-      <swiper-slide v-for="(item, index) in banners" :key="index">
-        <img :src="item" />
-      </swiper-slide>
-    </swiper>
-
-    <div class="info">
-      <div class="price-line">
-        <div class="price">
-          <i class="font_family icon-icon_jiage"></i>{{ info.price }}
-        </div>
-        <div class="sub" v-if="info.royalties">
-          含 <span>{{ info.royalties }}%</span> 版税
-        </div>
-        <div class="flex1"></div>
-        <div class="text">
-          <span>已售 {{ info.sale }}</span>
-          <span>剩余 {{ info.stock }}</span>
-        </div>
-      </div>
-      <div class="title">{{ info.name }}</div>
-      <div class="info-bottom">
-        <!-- <span class="text1" v-if="info.type !== 'DEFAULT'"> 编号 338392 </span>
+    <div class="detail">
+        <swiper pagination class="mySwiper" v-if="banners.length > 0">
+            <swiper-slide v-for="(item, index) in banners" :key="index">
+                <!-- <img :src="item" /> -->
+                <van-image @click="preview(index, banners)" :src="item" width="100vw" height="100vw" fit="scale-down" />
+            </swiper-slide>
+        </swiper>
+
+        <div class="info">
+            <div class="price-line">
+                <div class="price"><i class="font_family icon-icon_jiage"></i>{{ info.price }}</div>
+                <div class="sub" v-if="info.royalties">
+                    含 <span>{{ info.royalties }}%</span> 版税
+                </div>
+                <div class="flex1"></div>
+                <div class="text">
+                    <span>已售 {{ info.sale }}</span>
+                    <span>剩余 {{ info.stock }}</span>
+                </div>
+            </div>
+            <div class="title">{{ info.name }}</div>
+            <div class="info-bottom">
+                <!-- <span class="text1" v-if="info.type !== 'DEFAULT'"> 编号 338392 </span>
         <van-button
           v-if="info.type !== 'DEFAULT'"
           type="primary"
@@ -30,448 +29,431 @@
           size="mini"
           >选择其他编号</van-button
         > -->
-        <div class="flex1"></div>
-        <like-button :isLike="info.liked" @click="likeProduct">
-          {{ info.likes }}
-        </like-button>
-      </div>
-    </div>
+                <div class="flex1"></div>
+                <like-button :isLike="info.liked" @click="likeProduct">
+                    {{ info.likes }}
+                </like-button>
+            </div>
+        </div>
 
-    <driver />
-    <van-cell
-      value="进入主页"
-      is-link
-      class="creator"
-      :to="{
-        path: '/creatorDetail',
-        query: {
-          id: info.minterId,
-        },
-      }"
-    >
-      <template #icon>
-        <van-image
-          width="40"
-          height="40"
-          :src="info.minterAvatar"
-          fit="cover"
-          radius="100"
-        />
-      </template>
-      <template #title>
-        <div class="text1">{{ info.minter }}</div>
-        <div class="text2">铸造者</div>
-      </template>
-    </van-cell>
-
-    <driver />
-
-    <div class="goods">
-      <template v-if="boxs.length > 0">
-        <div class="page-title">盲盒详情</div>
-        <swiper
-          :slidesPerView="'auto'"
-          :spaceBetween="20"
-          class="detail-swiper"
+        <driver />
+        <van-cell
+            value="进入主页"
+            is-link
+            class="creator"
+            :to="{
+                path: '/creatorDetail',
+                query: {
+                    id: info.minterId
+                }
+            }"
         >
-          <swiper-slide v-for="(item, index) in boxs" :key="index">
-            <van-image
-              width="100%"
-              height="170"
-              :src="item"
-              fit="cover"
-              radius="12"
-              @click="preview(index)"
-            />
-          </swiper-slide>
-        </swiper>
-      </template>
-      <template v-if="properties.length > 0">
-        <div class="page-title">商品特性</div>
-        <div class="specific-list">
-          <div
-            class="specific-item"
-            v-for="(item, index) in properties"
-            :key="index"
-          >
-            <div class="text1">{{ item.name }}</div>
-            <div class="text2">{{ item.value }}</div>
-          </div>
+            <template #icon>
+                <van-image width="40" height="40" :src="info.minterAvatar" fit="cover" radius="100" />
+            </template>
+            <template #title>
+                <div class="text1">{{ info.minter }}</div>
+                <div class="text2">铸造者</div>
+            </template>
+        </van-cell>
+
+        <driver />
+
+        <div class="goods">
+            <template v-if="boxs.length > 0">
+                <div class="page-title">盲盒详情</div>
+                <swiper :slidesPerView="'auto'" :spaceBetween="20" class="detail-swiper">
+                    <swiper-slide v-for="(item, index) in boxs" :key="index">
+                        <van-image
+                            width="100%"
+                            height="170"
+                            :src="item"
+                            fit="cover"
+                            radius="12"
+                            @click="preview(index, boxs)"
+                        />
+                    </swiper-slide>
+                </swiper>
+            </template>
+            <template v-if="properties.length > 0">
+                <div class="page-title">商品特性</div>
+                <div class="specific-list">
+                    <div class="specific-item" v-for="(item, index) in properties" :key="index">
+                        <div class="text1">{{ item.name }}</div>
+                        <div class="text2">{{ item.value }}</div>
+                    </div>
+                </div>
+            </template>
+            <template v-if="info.detail">
+                <div class="page-title">作品描述</div>
+                <div class="page-text" v-html="info.detail"></div
+            ></template>
         </div>
-      </template>
-      <template v-if="info.detail">
-        <div class="page-title">作品描述</div>
-        <div class="page-text" v-html="info.detail"></div
-      ></template>
-    </div>
 
-    <div class="btn van-safe-area-bottom" ref="btn" v-if="isBuy">
-      <div class="btns">
-        <van-button type="primary" block round @click="buy"
-          >立即购买</van-button
-        >
-      </div>
-    </div>
+        <div class="btn van-safe-area-bottom" ref="btn" v-if="isBuy">
+            <div class="btns">
+                <van-button type="primary" block round @click="buy">立即购买</van-button>
+            </div>
+        </div>
 
-    <!-- <driver /> -->
+        <!-- <driver /> -->
 
-    <!-- <van-collapse v-model="activeName" accordion>
+        <!-- <van-collapse v-model="activeName" accordion>
       <van-collapse-item title="交易记录" name="1">
         <van-cell title="单元格" value="内容"> </van-cell>
       </van-collapse-item>
     </van-collapse> -->
 
-    <driver />
+        <driver />
 
-    <post :info="info" />
-  </div>
+        <post :info="info" />
+    </div>
 </template>
 
 <script>
-import { Swiper, SwiperSlide } from "swiper/vue";
+import { Swiper, SwiperSlide } from 'swiper/vue';
 
-import "swiper/swiper.min.css";
-import "swiper/swiper-bundle.min.css";
+import 'swiper/swiper.min.css';
+import 'swiper/swiper-bundle.min.css';
 
-import SwiperCore, { Pagination } from "swiper";
-import Post from "../../components/Post.vue";
-import { ImagePreview } from "vant";
+import SwiperCore, { Pagination } from 'swiper';
+import Post from '../../components/Post.vue';
+import { ImagePreview } from 'vant';
 
 // install Swiper modules
 SwiperCore.use([Pagination]);
 
 export default {
-  components: {
-    Swiper,
-    SwiperSlide,
-    Post,
-  },
-  inject: ["bs"],
-  data() {
-    return {
-      activeName: "1",
-      info: {},
-      liked: false,
-      btn: null,
-      blindBoxItems: [],
-    };
-  },
-  computed: {
-    banners() {
-      return this.info.pics || [];
+    components: {
+        Swiper,
+        SwiperSlide,
+        Post
     },
-    properties() {
-      return this.info.properties || [];
+    inject: ['bs'],
+    data() {
+        return {
+            activeName: '1',
+            info: {},
+            liked: false,
+            btn: null,
+            blindBoxItems: []
+        };
     },
-    isBuy() {
-      return this.info.stock && this.info.onShelf && this.info.salable;
+    computed: {
+        banners() {
+            return this.info.pics || [];
+        },
+        properties() {
+            return this.info.properties || [];
+        },
+        isBuy() {
+            return this.info.stock && this.info.onShelf && this.info.salable;
+        },
+        boxs() {
+            let list = [...this.blindBoxItems];
+            return list.map(item => {
+                return this.getImg(item.pics);
+            });
+        }
     },
-    boxs() {
-      let list = [...this.blindBoxItems];
-      return list.map((item) => {
-        return this.getImg(item.pics);
-      });
+    mounted() {
+        this.getProduct();
     },
-  },
-  mounted() {
-    this.getProduct();
-  },
-  beforeUnmount() {
-    if (this.btn) {
-      document.body.removeChild(this.btn);
-    }
-  },
-  methods: {
-    preview(index = 0) {
-      ImagePreview({
-        images: [...this.boxs],
-        startPosition: index,
-      });
+    beforeUnmount() {
+        if (this.btn) {
+            document.body.removeChild(this.btn);
+        }
     },
-    getProduct() {
-      this.$toast.loading({
-        message: "加载中...",
-        forbidClick: true,
-      });
-      this.$http
-        .get("/collection/get/" + this.$route.query.id)
-        .then((res) => {
-          this.info = res;
-          this.$nextTick(() => {
-            if (this.isBuy) {
-              this.btn = this.$refs.btn;
+    methods: {
+        preview(index = 0, list = []) {
+            ImagePreview({
+                images: [...list],
+                startPosition: index
+            });
+        },
+        getProduct() {
+            this.$toast.loading({
+                message: '加载中...',
+                forbidClick: true
+            });
+            this.$http
+                .get('/collection/get/' + this.$route.query.id)
+                .then(res => {
+                    this.info = res;
+                    this.$nextTick(() => {
+                        if (this.isBuy) {
+                            this.btn = this.$refs.btn;
+                        }
+                        document.body.appendChild(this.$refs.btn);
+                    });
+
+                    if (res.type === 'BLIND_BOX') {
+                        return this.$http.post(
+                            '/blindBoxItem/all',
+                            {
+                                query: {
+                                    blindBoxId: res.id
+                                }
+                            },
+                            { body: 'json' }
+                        );
+                    } else {
+                        return Promise.resolve();
+                    }
+                })
+                .then(res => {
+                    if (res) {
+                        this.blindBoxItems = res.content;
+                    }
+
+                    this.scrollRefreash();
+                });
+        },
+        likeProduct() {
+            if (!this.info.liked) {
+                this.$http.get(`/collection/${this.info.id}/like`).then(() => {
+                    this.getProduct();
+                    this.$toast.success('收藏成功');
+                });
+            } else {
+                this.$http.get(`/collection/${this.info.id}/unlike`).then(() => {
+                    this.getProduct();
+                    this.$toast.success('取消收藏');
+                });
             }
-            document.body.appendChild(this.$refs.btn);
-          });
-
-          if (res.type === "BLIND_BOX") {
-            return this.$http.post(
-              "/blindBoxItem/all",
-              {
-                query: {
-                  blindBoxId: res.id,
-                },
-              },
-              { body: "json" }
-            );
-          } else {
-            return Promise.resolve();
-          }
-        })
-        .then((res) => {
-          if (res) {
-            this.blindBoxItems = res.content;
-          }
-
-          this.scrollRefreash();
-        });
-    },
-    likeProduct() {
-      if (!this.info.liked) {
-        this.$http.get(`/collection/${this.info.id}/like`).then(() => {
-          this.getProduct();
-          this.$toast.success("收藏成功");
-        });
-      } else {
-        this.$http.get(`/collection/${this.info.id}/unlike`).then(() => {
-          this.getProduct();
-          this.$toast.success("取消收藏");
-        });
-      }
-    },
-    buy() {
-      this.checkLogin().then(() => {
-        this.$router.push({
-          path: "/submit",
-          query: {
-            id: this.$route.query.id,
-          },
-        });
-      });
-    },
-  },
+        },
+        buy() {
+            this.checkLogin().then(() => {
+                this.$router.push({
+                    path: '/submit',
+                    query: {
+                        id: this.$route.query.id
+                    }
+                });
+            });
+        }
+    }
 };
 </script>
 
 <style lang="less" scoped>
 .detail {
-  padding-bottom: 100px;
+    padding-bottom: 100px;
 }
 .info {
-  // height: 164px;
-  background-color: @bg;
-  border-radius: 20px 20px 0 0;
-  transform: translateY(-16px);
-  position: relative;
-  z-index: 2;
-  padding: 16px 16px 0;
-  box-sizing: border-box;
-
-  .price {
-    font-size: 36px;
-    font-family: OSP;
-    color: #fdfb60;
-    line-height: 36px;
-    transform: translateY(3px);
-
-    .font_family {
-      font-size: 10px;
-      line-height: 24px;
-      vertical-align: middle;
+    // height: 164px;
+    background-color: @bg;
+    border-radius: 20px 20px 0 0;
+    transform: translateY(-16px);
+    position: relative;
+    z-index: 2;
+    padding: 16px 16px 0;
+    box-sizing: border-box;
+
+    .price {
+        font-size: 36px;
+        font-family: OSP;
+        color: #fdfb60;
+        line-height: 36px;
+        transform: translateY(3px);
+
+        .font_family {
+            font-size: 10px;
+            line-height: 24px;
+            vertical-align: middle;
+        }
     }
-  }
 
-  .price-line {
-    display: flex;
-    align-items: flex-end;
-    .sub {
-      flex-grow: 1;
-      margin-left: 5px;
-      font-size: 14px;
-      color: #949699;
-      line-height: 16px;
-      span {
-        color: #fff;
-      }
+    .price-line {
+        display: flex;
+        align-items: flex-end;
+        .sub {
+            flex-grow: 1;
+            margin-left: 5px;
+            font-size: 14px;
+            color: #949699;
+            line-height: 16px;
+            span {
+                color: #fff;
+            }
+        }
+
+        .text {
+            font-size: 14px;
+            color: #939599;
+            line-height: 16px;
+            span {
+                margin-left: 10px;
+            }
+        }
     }
 
-    .text {
-      font-size: 14px;
-      color: #939599;
-      line-height: 16px;
-      span {
-        margin-left: 10px;
-      }
+    .title {
+        font-size: 20px;
+        font-weight: bold;
+        color: #ffffff;
+        line-height: 28px;
+        margin-top: 12px;
     }
-  }
 
-  .title {
-    font-size: 20px;
-    font-weight: bold;
-    color: #ffffff;
-    line-height: 28px;
-    margin-top: 12px;
-  }
-
-  .info-bottom {
-    display: flex;
-    position: relative;
-    margin-top: 4px;
-    height: 24px;
-    .text1 {
-      font-size: 14px;
-      color: #949699;
-      line-height: 24px;
+    .info-bottom {
+        display: flex;
+        position: relative;
+        margin-top: 4px;
+        height: 24px;
+        .text1 {
+            font-size: 14px;
+            color: #949699;
+            line-height: 24px;
+        }
+        .van-button {
+            font-size: 13px;
+            color: #fdfb60;
+            line-height: 24px;
+            background: linear-gradient(135deg, #fdfb60 0%, #ff8f3e 100%);
+            -webkit-background-clip: text;
+            -webkit-text-fill-color: transparent;
+            border-width: 0px;
+            margin-left: 10px;
+        }
+
+        .like {
+            position: absolute;
+            right: 0;
+        }
     }
-    .van-button {
-      font-size: 13px;
-      color: #fdfb60;
-      line-height: 24px;
-      background: linear-gradient(135deg, #fdfb60 0%, #ff8f3e 100%);
-      -webkit-background-clip: text;
-      -webkit-text-fill-color: transparent;
-      border-width: 0px;
-      margin-left: 10px;
+}
+
+/deep/.creator {
+    align-items: center;
+    padding: 24px 16px 24px;
+    .van-cell__title {
+        margin-left: 12px;
+        .text1 {
+            font-size: 16px;
+            line-height: 24px;
+        }
+        .text2 {
+            font-size: 12px;
+            color: #939599;
+            line-height: 22px;
+        }
     }
 
-    .like {
-      position: absolute;
-      right: 0;
+    .van-cell__value {
+        font-size: 13px;
     }
-  }
 }
 
-/deep/.creator {
-  align-items: center;
-  padding: 24px 16px 24px;
-  .van-cell__title {
-    margin-left: 12px;
-    .text1 {
-      font-size: 16px;
-      line-height: 24px;
+/deep/ .mySwiper {
+    width: 100vw;
+    height: 100vw;
+    z-index: 1;
+
+    .swiper-pagination {
+        bottom: 22px;
     }
-    .text2 {
-      font-size: 12px;
-      color: #939599;
-      line-height: 22px;
+
+    .swiper-pagination-bullet {
+        width: 6px;
+        height: 2px;
+        border-radius: 1px;
+        background: #d7d7d7;
     }
-  }
 
-  .van-cell__value {
-    font-size: 13px;
-  }
-}
+    .swiper-pagination-bullet-active {
+        background: @prim;
+    }
 
-/deep/ .mySwiper {
-  width: 100vw;
-  height: 100vw;
-  z-index: 1;
-
-  .swiper-pagination {
-    bottom: 22px;
-  }
-
-  .swiper-pagination-bullet {
-    width: 6px;
-    height: 2px;
-    border-radius: 1px;
-    background: #d7d7d7;
-  }
-
-  .swiper-pagination-bullet-active {
-    background: @prim;
-  }
-
-  .swiper-slide img {
-    display: block;
-    width: 100%;
-    height: 100%;
-    object-fit: cover;
-    border-radius: 4px;
-  }
+    .swiper-slide img {
+        display: block;
+        width: 100%;
+        height: 100%;
+        object-fit: cover;
+        border-radius: 4px;
+    }
 }
 .goods {
-  padding: 20px 16px;
+    padding: 20px 16px;
 
-  .page-title {
-    &:not(:first-child) {
-      padding-top: 16px;
+    .page-title {
+        &:not(:first-child) {
+            padding-top: 16px;
+        }
     }
-  }
 }
 
 .page-title {
-  font-size: 18px;
-  font-weight: bold;
-  color: #ffffff;
-  line-height: 28px;
+    font-size: 18px;
+    font-weight: bold;
+    color: #ffffff;
+    line-height: 28px;
 }
 .specific-list {
-  padding: 16px 0;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
+    padding: 16px 0;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
 }
 .specific-item {
-  width: 94px;
-  height: 62px;
-  border-radius: 4px;
-  border: solid 0px transparent;
-  padding: 1px;
-  background-image: linear-gradient(@bg, @bg),
-    linear-gradient(135deg, #fdfb60, #ff8f3e);
-  background-origin: border-box;
-  box-sizing: border-box;
-  background-clip: content-box, border-box;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  flex-direction: column;
-
-  .text1 {
-    font-size: 14px;
-    color: #939599;
-    line-height: 24px;
-  }
+    width: 94px;
+    height: 62px;
+    border-radius: 4px;
+    border: solid 0px transparent;
+    padding: 1px;
+    background-image: linear-gradient(@bg, @bg), linear-gradient(135deg, #fdfb60, #ff8f3e);
+    background-origin: border-box;
+    box-sizing: border-box;
+    background-clip: content-box, border-box;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
 
-  .text2 {
-    font-size: 14px;
-    color: #ffffff;
-    line-height: 24px;
-  }
+    .text1 {
+        font-size: 14px;
+        color: #939599;
+        line-height: 24px;
+    }
+
+    .text2 {
+        font-size: 14px;
+        color: #ffffff;
+        line-height: 24px;
+    }
 }
 
 .page-text {
-  font-size: 14px;
-  color: #ffffff;
-  line-height: 28px;
-  margin-top: 10px;
+    font-size: 14px;
+    color: #ffffff;
+    line-height: 28px;
+    margin-top: 10px;
 }
 
 .btn {
-  position: fixed;
-  z-index: 20;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  background: #202122ee;
-  .btns {
-    padding: 6px 42px;
-  }
-  .van-button {
-    background: linear-gradient(135deg, #fdfb60 0%, #ff8f3e 100%);
-    color: #333230;
-    font-size: 16px;
-    border-width: 0px;
-  }
+    position: fixed;
+    z-index: 20;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    background: #202122ee;
+    .btns {
+        padding: 6px 42px;
+    }
+    .van-button {
+        background: linear-gradient(135deg, #fdfb60 0%, #ff8f3e 100%);
+        color: #333230;
+        font-size: 16px;
+        border-width: 0px;
+    }
 }
 
 .detail-swiper {
-  height: 170px;
-  margin-top: 12px;
+    height: 170px;
+    margin-top: 12px;
 }
 
 .swiper-slide {
-  width: 35.2vw;
+    width: 35.2vw;
 }
 </style>

+ 52 - 2
src/main/nine-space/yarn.lock

@@ -864,7 +864,7 @@
     "@babel/types" "^7.4.4"
     esutils "^2.0.2"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.0", "@babel/runtime@^7.3.4", "@babel/runtime@^7.8.4":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.0", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.4", "@babel/runtime@^7.8.4":
   version "7.15.4"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
   integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==
@@ -2914,6 +2914,11 @@ commondir@^1.0.1:
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
   integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
 
+complex.js@^2.0.15:
+  version "2.0.15"
+  resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.0.15.tgz#7add6848b4c1d12aa9262f7df925ebe7a51a7406"
+  integrity sha512-gDBvQU8IG139ZBQTSo2qvDFP+lANMGluM779csXOr6ny1NUtA3wkUnCFjlDNH/moAVfXtvClYt6G0zarFbtz5w==
+
 component-emitter@^1.2.1:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
@@ -3381,6 +3386,11 @@ decamelize@^1.2.0:
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
 
+decimal.js@^10.3.1:
+  version "10.3.1"
+  resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
+  integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
+
 decode-uri-component@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@@ -3808,6 +3818,11 @@ escape-html@~1.0.3:
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
   integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
 
+escape-latex@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1"
+  integrity sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==
+
 escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@@ -4360,6 +4375,11 @@ forwarded@0.2.0:
   resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
   integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
 
+fraction.js@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.1.tgz#ac4e520473dae67012d618aab91eda09bcb400ff"
+  integrity sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==
+
 fragment-cache@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
@@ -5465,6 +5485,11 @@ isstream@~0.1.2:
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
   integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
 
+javascript-natural-sort@^0.7.1:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59"
+  integrity sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=
+
 javascript-stringify@^2.0.1:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79"
@@ -5857,6 +5882,21 @@ map-visit@^1.0.0:
   dependencies:
     object-visit "^1.0.0"
 
+mathjs@^9.5.1:
+  version "9.5.1"
+  resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-9.5.1.tgz#553353ee95852e8dd07edc49d8464db3abb7413f"
+  integrity sha512-yYu67sdmrLrQeRyN+DPH0aRQphdmI/gz4oNXFx4YR43NKifOiNTfXT30+ACsNIWaqJ1KihhVDD+X1kwfI2/X9g==
+  dependencies:
+    "@babel/runtime" "^7.15.4"
+    complex.js "^2.0.15"
+    decimal.js "^10.3.1"
+    escape-latex "^1.2.0"
+    fraction.js "^4.1.1"
+    javascript-natural-sort "^0.7.1"
+    seedrandom "^3.0.5"
+    tiny-emitter "^2.1.0"
+    typed-function "^2.0.0"
+
 md5.js@^1.3.4:
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
@@ -7707,6 +7747,11 @@ schema-utils@^3.0.0:
     ajv "^6.12.5"
     ajv-keywords "^3.5.2"
 
+seedrandom@^3.0.5:
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7"
+  integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==
+
 select-hose@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
@@ -8458,7 +8503,7 @@ timsort@^0.3.0:
   resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
   integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
 
-tiny-emitter@^2.0.0:
+tiny-emitter@^2.0.0, tiny-emitter@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
   integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
@@ -8592,6 +8637,11 @@ type-is@~1.6.17, type-is@~1.6.18:
     media-typer "0.3.0"
     mime-types "~2.1.24"
 
+typed-function@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-2.0.0.tgz#15ab3825845138a8b1113bd89e60cd6a435739e8"
+  integrity sha512-Hhy1Iwo/e4AtLZNK10ewVVcP2UEs408DS35ubP825w/YgSBK1KVLwALvvIG4yX75QJrxjCpcWkzkVRB0BwwYlA==
+
 typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"