浏览代码

预览水印位置

Michael Wang 3 年之前
父节点
当前提交
c4ca66492f

+ 3 - 2
package.json

@@ -23,6 +23,7 @@
     "gm": "^1.23.1",
     "image-size": "^0.6.3",
     "jquery": "^3.3.1",
+    "lodash": "^4.17.21",
     "log4js": "^3.0.6",
     "mkdirp": "^0.5.1",
     "moment": "^2.22.2",
@@ -32,7 +33,7 @@
     "requestretry": "^3.1.0",
     "thinkjs-util": ">=0.0.1",
     "vertx": "^0.0.1-security",
-    "vue": "^3.0.0",
+    "vue": "^3.2.6",
     "vue-router": "^4.0.0-0"
   },
   "devDependencies": {
@@ -49,7 +50,7 @@
     "@vue/cli-plugin-router": "~4.5.0",
     "@vue/cli-plugin-typescript": "~4.5.0",
     "@vue/cli-service": "~4.5.0",
-    "@vue/compiler-sfc": "^3.0.0",
+    "@vue/compiler-sfc": "^3.2.6",
     "@vue/eslint-config-prettier": "^6.0.0",
     "@vue/eslint-config-typescript": "^7.0.0",
     "babel-plugin-import": "^1.13.3",

二进制
public/img/common-card.jpg


二进制
public/img/master-card.jpg


+ 150 - 32
src/features/Image/Image.vue

@@ -34,6 +34,14 @@
           <a-input v-model:value="template" style="width: 600px" />
         </td>
       </tr>
+      <tr id="message-tr">
+        <th></th>
+        <td>
+          <p v-if="ruleExample" class="error-tetx" id="message-text">
+            {{ ruleExample }}
+          </p>
+        </td>
+      </tr>
       <tr id="append-select">
         <th>是否续传:</th>
         <td>
@@ -57,26 +65,6 @@
         </td>
       </tr>
       <template v-if="type === '1'">
-        <tr>
-          <th>水印起始位置(横向):</th>
-          <td>
-            <a-input
-              v-model:value="x"
-              style="width: 600px"
-              placeholder="数字,默认0.03"
-            />
-          </td>
-        </tr>
-        <tr>
-          <th>水印起始位置(纵向):</th>
-          <td>
-            <a-input
-              v-model:value="y"
-              style="width: 600px"
-              placeholder="数字,默认0.01"
-            />
-          </td>
-        </tr>
         <tr id="watermark-select">
           <th>添加分数水印:</th>
           <td>
@@ -99,6 +87,12 @@
             </div>
           </td>
         </tr>
+        <tr>
+          <th>水印显示区域:</th>
+          <td>
+            <a-button type="primary" @click="showPreview">预览</a-button>
+          </td>
+        </tr>
         <tr id="examNumber-select">
           <th>准考证号:</th>
           <td>
@@ -121,14 +115,6 @@
         </tr>
       </template>
 
-      <tr id="message-tr">
-        <th></th>
-        <td>
-          <p v-if="ruleExample" class="error-tetx" id="message-text">
-            {{ ruleExample }}
-          </p>
-        </td>
-      </tr>
       <tr>
         <td colspan="2" style="text-align: center">
           <a href="##" class="start-btn" @click="start">
@@ -138,6 +124,44 @@
       </tr>
     </table>
   </div>
+
+  <a-modal
+    v-model:visible="visible"
+    title="请选择水印位置"
+    width="100%"
+    wrapClassName="full-modal"
+    ok-text="确定"
+    cancel-text="取消"
+    :cancel-button-props="{ style: 'display: none' }"
+    @ok="visible = false"
+  >
+    <div style="position: relative">
+      <img
+        id="preview-image"
+        :src="cardUrl"
+        draggable="false"
+        style="width: 100%; height: 100%; user-select: none"
+      />
+      <div
+        ref="dragContainerRef"
+        style="
+          color: red;
+          border: 2px dotted red;
+          cursor: grab;
+          width: 80px;
+          height: 80px;
+          top: 0;
+          left: 0;
+          user-select: none;
+        "
+        :style="{ top: yAttr, left: xAttr }"
+        @mousedown="mouseDownHandler"
+        class="water-mark"
+      >
+        <div>成绩明细</div>
+      </div>
+    </div>
+  </a-modal>
 </template>
 
 <script setup lang="ts">
@@ -145,6 +169,8 @@ import { store } from "@/store";
 import { computed, ref, watch } from "vue";
 import { useRouter } from "vue-router";
 import { message } from "ant-design-vue";
+import { throttle } from "lodash";
+
 const router = useRouter();
 
 let type = ref("");
@@ -156,8 +182,8 @@ let watermark = ref(true);
 let trackMode = ref("");
 let examNumber = ref("");
 let subjectCode = ref("");
-let x = ref(0.03);
-let y = ref(0.01);
+let x = ref(0.01);
+let y = ref(0.03);
 
 const config = store.pageInputs["/image-download"];
 if (config) {
@@ -170,8 +196,8 @@ if (config) {
   trackMode.value = config.trackMode;
   examNumber.value = config.examNumber || "";
   subjectCode.value = config.subjectCode || "";
-  x.value = config.x || 0.03;
-  y.value = config.y || 0.01;
+  x.value = config.x || 0.01;
+  y.value = config.y || 0.03;
 }
 
 let ruleExample = computed(() => {
@@ -253,4 +279,96 @@ watch(type, () => {
     subjectCode.value = "";
   }
 });
+
+let visible = ref(false);
+let cardUrl = computed(() => {
+  if (trackMode.value === "1") {
+    return "/img/common_card.jpg";
+  } else if (trackMode.value === "2") {
+    return "/img/master-card.jpg";
+  } else {
+    return "";
+  }
+});
+
+let dragContainerRef = ref();
+const showPreview = () => {
+  if (cardUrl.value) {
+    visible.value = true;
+  } else {
+    message.info("请选择水印模式");
+  }
+};
+let xAttr = computed(() => x.value * 100 + "%");
+let yAttr = computed(() => y.value * 100 + "%");
+
+let clientX = 0,
+  clientY = 0;
+
+const mouseDownHandler = (e: MouseEvent) => {
+  // console.log(e);
+  const con = dragContainerRef.value as HTMLDivElement;
+  con.addEventListener("mousemove", mouseMoveThrottle);
+  con.addEventListener("mouseup", mouseUpHandler);
+  con.addEventListener("mouseout", mouseoutHandler);
+  clientX = e.clientX;
+  clientY = e.clientY;
+};
+const mouseMoveHandler = (e: MouseEvent) => {
+  // console.log(e);
+  const image = document.querySelector("#preview-image") as HTMLImageElement;
+  x.value += (e.clientX - clientX) / image.width;
+  clientX = e.clientX;
+
+  y.value += (e.clientY - clientY) / image.height;
+  clientY = e.clientY;
+
+  // console.log(x.value, y.value);
+  if (x.value < 0) {
+    x.value = 0;
+  }
+  if (x.value > 1) {
+    x.value = 1;
+  }
+  if (y.value < 0) {
+    y.value = 0;
+  }
+  if (y.value > 1) {
+    y.value = 1;
+  }
+};
+const mouseMoveThrottle = throttle((e: MouseEvent) => mouseMoveHandler(e), 100);
+
+const mouseoutHandler = () => {
+  mouseUpHandler();
+};
+const mouseUpHandler = () => {
+  // console.log(e);
+  const con = dragContainerRef.value as HTMLDivElement;
+  con.removeEventListener("mousemove", mouseMoveThrottle);
+  con.removeEventListener("mouseup", mouseUpHandler);
+  con.removeEventListener("mouseout", mouseoutHandler);
+};
 </script>
+
+<style>
+.full-modal .ant-modal {
+  max-width: 100%;
+  top: 0;
+  padding-bottom: 0;
+  margin: 0;
+}
+.full-modal .ant-modal-content {
+  display: flex;
+  flex-direction: column;
+  height: calc(100vh);
+}
+.full-modal .ant-modal-body {
+  flex: 1;
+}
+</style>
+<style scoped>
+.water-mark {
+  position: absolute;
+}
+</style>

+ 62 - 0
src/features/Image/use/draggable.ts

@@ -0,0 +1,62 @@
+import { onMounted, onUnmounted, ref } from "vue";
+
+export function dragImage() {
+  // grab moving
+  let pos = { top: 0, left: 0, x: 0, y: 0 };
+  const dragContainer = ref(null as unknown as HTMLDivElement);
+  // const isGrabbing = ref(false);
+
+  const mouseDownHandler = function (e: MouseEvent) {
+    // 防止鼠标左键激发
+    if (e.button !== 0) return;
+    pos = {
+      // The current scroll
+      left: parseInt(dragContainer.value.style.left),
+      top: parseInt(dragContainer.value.style.top),
+      // Get the current mouse position
+      x: e.clientX,
+      y: e.clientY,
+    };
+    // isGrabbing.value = true;
+    if (dragContainer.value) {
+      dragContainer.value.style.cursor = "grabbing";
+
+      dragContainer.value.addEventListener("mousemove", mouseMoveHandler);
+      dragContainer.value.addEventListener("mouseup", mouseUpHandler);
+    }
+  };
+
+  const mouseMoveHandler = function (e: MouseEvent) {
+    // if (!isGrabbing.value) return;
+    // How far the mouse has been moved
+    const dx = e.clientX - pos.x;
+    const dy = e.clientY - pos.y;
+
+    console.log(e);
+
+    // Scroll the element
+    dragContainer.value.style.top = pos.top - dy + "px";
+    dragContainer.value.style.left = pos.left - dx + "px";
+  };
+  const mouseUpHandler = function () {
+    // isGrabbing.value = false;
+    if (dragContainer.value) {
+      dragContainer.value.removeEventListener("mousemove", mouseMoveHandler);
+      dragContainer.value.removeEventListener("mouseup", mouseUpHandler);
+      dragContainer.value.style.cursor = "auto";
+    }
+  };
+
+  onMounted(() => {
+    dragContainer.value.addEventListener("mousedown", mouseDownHandler);
+  });
+  onUnmounted(() => {
+    if (dragContainer.value) {
+      dragContainer.value.removeEventListener("mousedown", mouseDownHandler);
+      dragContainer.value.removeEventListener("mousemove", mouseMoveHandler);
+      dragContainer.value.removeEventListener("mouseup", mouseUpHandler);
+    }
+  });
+
+  return { dragContainer };
+}

+ 7 - 0
src/features/ImageDownload/ImageDownload.vue

@@ -58,6 +58,10 @@ async function cacheImages(urls: string) {
     httpApp
       .get(url, {
         responseType: "blob",
+        headers: {
+          // 怀疑 electron 有问题,这里没生效
+          "Cache-Control": "no-cache",
+        },
       })
       .catch((e) => {
         console.log(e, "cache error");
@@ -135,6 +139,9 @@ onMounted(async () => {
 
               const imageRes = await httpApp.get(sheetUrl, {
                 responseType: "blob",
+                headers: {
+                  "Cache-Control": "no-cache",
+                },
               });
 
               const [width, height] = await getImageDim(imageRes.data);

+ 2 - 2
src/lib/watermark.ts

@@ -16,8 +16,8 @@ export async function addWatermark(
   student: Student,
   index: number,
   trackMode: string,
-  x = 0.03,
-  y = 0.01
+  x = 0.01,
+  y = 0.03
 ): Promise<boolean> {
   if (
     index !== 1 &&

+ 75 - 63
yarn.lock

@@ -278,7 +278,7 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.12.0", "@babel/parser@^7.13.9", "@babel/parser@^7.14.5", "@babel/parser@^7.15.0":
+"@babel/parser@^7.14.5", "@babel/parser@^7.15.0":
   version "7.15.3"
   resolved "https://registry.nlark.com/@babel/parser/download/@babel/parser-7.15.3.tgz"
   integrity sha1-NBbZvqdIBSz8tj28wnNoEFse2GI=
@@ -922,7 +922,7 @@
     debug "^4.1.0"
     globals "^11.1.0"
 
-"@babel/types@^7.0.0", "@babel/types@^7.12.0", "@babel/types@^7.13.0", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0", "@babel/types@^7.4.4":
+"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0", "@babel/types@^7.4.4":
   version "7.15.0"
   resolved "https://registry.nlark.com/@babel/types/download/@babel/types-7.15.0.tgz?cache=0&sync_timestamp=1628111919490&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.15.0.tgz"
   integrity sha1-Ya8R8ihsTpxpyo3rX0N1pzxy3L0=
@@ -1703,39 +1703,40 @@
     semver "^6.1.0"
     strip-ansi "^6.0.0"
 
-"@vue/compiler-core@3.2.4":
-  version "3.2.4"
-  resolved "https://registry.nlark.com/@vue/compiler-core/download/@vue/compiler-core-3.2.4.tgz?cache=0&sync_timestamp=1629218802866&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcompiler-core%2Fdownload%2F%40vue%2Fcompiler-core-3.2.4.tgz"
-  integrity sha1-qY0pV3GZjB6NzMTuPVL+sUsCrqk=
+"@vue/compiler-core@3.2.6":
+  version "3.2.6"
+  resolved "https://registry.nlark.com/@vue/compiler-core/download/@vue/compiler-core-3.2.6.tgz?cache=0&sync_timestamp=1629824327277&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcompiler-core%2Fdownload%2F%40vue%2Fcompiler-core-3.2.6.tgz#7162bb0670273f04566af0d353009187ab577915"
+  integrity sha1-cWK7BnAnPwRWavDTUwCRh6tXeRU=
   dependencies:
-    "@babel/parser" "^7.12.0"
-    "@babel/types" "^7.12.0"
-    "@vue/shared" "3.2.4"
-    estree-walker "^2.0.1"
+    "@babel/parser" "^7.15.0"
+    "@babel/types" "^7.15.0"
+    "@vue/shared" "3.2.6"
+    estree-walker "^2.0.2"
     source-map "^0.6.1"
 
-"@vue/compiler-dom@3.2.4":
-  version "3.2.4"
-  resolved "https://registry.nlark.com/@vue/compiler-dom/download/@vue/compiler-dom-3.2.4.tgz?cache=0&sync_timestamp=1629218803439&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcompiler-dom%2Fdownload%2F%40vue%2Fcompiler-dom-3.2.4.tgz"
-  integrity sha1-OkPeJD66Enq75X55aguWnS33jAg=
+"@vue/compiler-dom@3.2.6":
+  version "3.2.6"
+  resolved "https://registry.nlark.com/@vue/compiler-dom/download/@vue/compiler-dom-3.2.6.tgz?cache=0&sync_timestamp=1629824326003&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcompiler-dom%2Fdownload%2F%40vue%2Fcompiler-dom-3.2.6.tgz#3764d7fe1a696e39fb2a3c9d638da0749e369b2d"
+  integrity sha1-N2TX/hppbjn7KjydY42gdJ42my0=
   dependencies:
-    "@vue/compiler-core" "3.2.4"
-    "@vue/shared" "3.2.4"
+    "@vue/compiler-core" "3.2.6"
+    "@vue/shared" "3.2.6"
 
-"@vue/compiler-sfc@^3.0.0":
-  version "3.2.4"
-  resolved "https://registry.nlark.com/@vue/compiler-sfc/download/@vue/compiler-sfc-3.2.4.tgz"
-  integrity sha1-mAeGjMlQKR8WPDkwqBuxbocN8Jc=
+"@vue/compiler-sfc@^3.2.6":
+  version "3.2.6"
+  resolved "https://registry.nlark.com/@vue/compiler-sfc/download/@vue/compiler-sfc-3.2.6.tgz#d6ab7410cff57081ab627b15a1ea51a1072c7cf1"
+  integrity sha1-1qt0EM/1cIGrYnsVoepRoQcsfPE=
   dependencies:
-    "@babel/parser" "^7.13.9"
-    "@babel/types" "^7.13.0"
+    "@babel/parser" "^7.15.0"
+    "@babel/types" "^7.15.0"
     "@types/estree" "^0.0.48"
-    "@vue/compiler-core" "3.2.4"
-    "@vue/compiler-dom" "3.2.4"
-    "@vue/compiler-ssr" "3.2.4"
-    "@vue/shared" "3.2.4"
+    "@vue/compiler-core" "3.2.6"
+    "@vue/compiler-dom" "3.2.6"
+    "@vue/compiler-ssr" "3.2.6"
+    "@vue/ref-transform" "3.2.6"
+    "@vue/shared" "3.2.6"
     consolidate "^0.16.0"
-    estree-walker "^2.0.1"
+    estree-walker "^2.0.2"
     hash-sum "^2.0.0"
     lru-cache "^5.1.1"
     magic-string "^0.25.7"
@@ -1745,13 +1746,13 @@
     postcss-selector-parser "^6.0.4"
     source-map "^0.6.1"
 
-"@vue/compiler-ssr@3.2.4":
-  version "3.2.4"
-  resolved "https://registry.nlark.com/@vue/compiler-ssr/download/@vue/compiler-ssr-3.2.4.tgz?cache=0&sync_timestamp=1629218803713&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcompiler-ssr%2Fdownload%2F%40vue%2Fcompiler-ssr-3.2.4.tgz"
-  integrity sha1-vlHyGcIEKz5TA3PmC8Emraa7HMA=
+"@vue/compiler-ssr@3.2.6":
+  version "3.2.6"
+  resolved "https://registry.nlark.com/@vue/compiler-ssr/download/@vue/compiler-ssr-3.2.6.tgz#cadcf199859fa00739f4275b4c85970e4b0abe7d"
+  integrity sha1-ytzxmYWfoAc59CdbTIWXDksKvn0=
   dependencies:
-    "@vue/compiler-dom" "3.2.4"
-    "@vue/shared" "3.2.4"
+    "@vue/compiler-dom" "3.2.6"
+    "@vue/shared" "3.2.6"
 
 "@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.1.2":
   version "3.2.2"
@@ -1793,34 +1794,45 @@
   resolved "https://registry.npm.taobao.org/@vue/preload-webpack-plugin/download/@vue/preload-webpack-plugin-1.1.2.tgz?cache=0&sync_timestamp=1613215080607&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fpreload-webpack-plugin%2Fdownload%2F%40vue%2Fpreload-webpack-plugin-1.1.2.tgz"
   integrity sha1-zrkktOyzucQ4ccekKaAvhCPmIas=
 
-"@vue/reactivity@3.2.4":
-  version "3.2.4"
-  resolved "https://registry.nlark.com/@vue/reactivity/download/@vue/reactivity-3.2.4.tgz?cache=0&sync_timestamp=1629218804796&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Freactivity%2Fdownload%2F%40vue%2Freactivity-3.2.4.tgz"
-  integrity sha1-oCCtflD2dCGaB3ZLEFtZIuYVl+o=
+"@vue/reactivity@3.2.6":
+  version "3.2.6"
+  resolved "https://registry.nlark.com/@vue/reactivity/download/@vue/reactivity-3.2.6.tgz?cache=0&sync_timestamp=1629824924140&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Freactivity%2Fdownload%2F%40vue%2Freactivity-3.2.6.tgz#b8993fa6f48545178e588e25a9c9431a1c1b7d50"
+  integrity sha1-uJk/pvSFRReOWI4lqclDGhwbfVA=
   dependencies:
-    "@vue/shared" "3.2.4"
+    "@vue/shared" "3.2.6"
 
-"@vue/runtime-core@3.2.4":
-  version "3.2.4"
-  resolved "https://registry.nlark.com/@vue/runtime-core/download/@vue/runtime-core-3.2.4.tgz?cache=0&sync_timestamp=1629218804006&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fruntime-core%2Fdownload%2F%40vue%2Fruntime-core-3.2.4.tgz"
-  integrity sha1-2l3ePcHkjfmd0x6pqXL1wCrNw/U=
+"@vue/ref-transform@3.2.6":
+  version "3.2.6"
+  resolved "https://registry.nlark.com/@vue/ref-transform/download/@vue/ref-transform-3.2.6.tgz#30b5f1fa77daf9894bc23e6a5a0e3586a4a796b8"
+  integrity sha1-MLXx+nfa+YlLwj5qWg41hqSnlrg=
   dependencies:
-    "@vue/reactivity" "3.2.4"
-    "@vue/shared" "3.2.4"
+    "@babel/parser" "^7.15.0"
+    "@vue/compiler-core" "3.2.6"
+    "@vue/shared" "3.2.6"
+    estree-walker "^2.0.2"
+    magic-string "^0.25.7"
 
-"@vue/runtime-dom@3.2.4":
-  version "3.2.4"
-  resolved "https://registry.nlark.com/@vue/runtime-dom/download/@vue/runtime-dom-3.2.4.tgz?cache=0&sync_timestamp=1629218804501&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fruntime-dom%2Fdownload%2F%40vue%2Fruntime-dom-3.2.4.tgz"
-  integrity sha1-ECVZXyrpmhL+Dh5rzo32dh7+wks=
+"@vue/runtime-core@3.2.6":
+  version "3.2.6"
+  resolved "https://registry.nlark.com/@vue/runtime-core/download/@vue/runtime-core-3.2.6.tgz?cache=0&sync_timestamp=1629824921272&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fruntime-core%2Fdownload%2F%40vue%2Fruntime-core-3.2.6.tgz#376baeef7fe02a62377d46d0d0a8ab9510db1d8e"
+  integrity sha1-N2uu73/gKmI3fUbQ0KirlRDbHY4=
   dependencies:
-    "@vue/runtime-core" "3.2.4"
-    "@vue/shared" "3.2.4"
+    "@vue/reactivity" "3.2.6"
+    "@vue/shared" "3.2.6"
+
+"@vue/runtime-dom@3.2.6":
+  version "3.2.6"
+  resolved "https://registry.nlark.com/@vue/runtime-dom/download/@vue/runtime-dom-3.2.6.tgz?cache=0&sync_timestamp=1629824925767&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fruntime-dom%2Fdownload%2F%40vue%2Fruntime-dom-3.2.6.tgz#0f74dbca84d56c222fbfbd53415b260386859a3b"
+  integrity sha1-D3TbyoTVbCIvv71TQVsmA4aFmjs=
+  dependencies:
+    "@vue/runtime-core" "3.2.6"
+    "@vue/shared" "3.2.6"
     csstype "^2.6.8"
 
-"@vue/shared@3.2.4":
-  version "3.2.4"
-  resolved "https://registry.nlark.com/@vue/shared/download/@vue/shared-3.2.4.tgz"
-  integrity sha1-uioJUnr/8nso0I+SG0pZfpUEyno=
+"@vue/shared@3.2.6":
+  version "3.2.6"
+  resolved "https://registry.nlark.com/@vue/shared/download/@vue/shared-3.2.6.tgz?cache=0&sync_timestamp=1629824947203&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fshared%2Fdownload%2F%40vue%2Fshared-3.2.6.tgz#2c22bae88fe2b7b59fa68a9c9c4cd60bae2c1794"
+  integrity sha1-LCK66I/it7WfpoqcnEzWC64sF5Q=
 
 "@vue/web-component-wrapper@^1.2.0":
   version "1.3.0"
@@ -4608,9 +4620,9 @@ estraverse@^5.1.0, estraverse@^5.2.0:
   resolved "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz"
   integrity sha1-MH30JUfmzHMk088DwVXVzbjFOIA=
 
-estree-walker@^2.0.1:
+estree-walker@^2.0.2:
   version "2.0.2"
-  resolved "https://registry.nlark.com/estree-walker/download/estree-walker-2.0.2.tgz"
+  resolved "https://registry.nlark.com/estree-walker/download/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
   integrity sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw=
 
 esutils@^2.0.2:
@@ -10540,14 +10552,14 @@ vue-types@^3.0.0:
   dependencies:
     is-plain-object "3.0.1"
 
-vue@^3.0.0:
-  version "3.2.4"
-  resolved "https://registry.nlark.com/vue/download/vue-3.2.4.tgz"
-  integrity sha1-2U2IZ15BwFDTpyLQhIpwY7XoemA=
+vue@^3.2.6:
+  version "3.2.6"
+  resolved "https://registry.nlark.com/vue/download/vue-3.2.6.tgz?cache=0&sync_timestamp=1629824252933&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue%2Fdownload%2Fvue-3.2.6.tgz#c71445078751f458648fd8fb3a2da975507d03d2"
+  integrity sha1-xxRFB4dR9Fhkj9j7Oi2pdVB9A9I=
   dependencies:
-    "@vue/compiler-dom" "3.2.4"
-    "@vue/runtime-dom" "3.2.4"
-    "@vue/shared" "3.2.4"
+    "@vue/compiler-dom" "3.2.6"
+    "@vue/runtime-dom" "3.2.6"
+    "@vue/shared" "3.2.6"
 
 warning@^4.0.0:
   version "4.0.3"