Johnhong9527 5 년 전
부모
커밋
add08ca62f

+ 9 - 8
.eslintrc.js

@@ -1,17 +1,18 @@
 module.exports = {
   root: true,
   env: {
-    node: true,
+    node: true
   },
-  extends: [
-    'plugin:vue/essential',
-    '@vue/airbnb',
-  ],
+  extends: ["plugin:vue/essential", "@vue/airbnb"],
+
   parserOptions: {
-    parser: 'babel-eslint',
+    parser: "babel-eslint"
   },
+
   rules: {
-    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
-    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+    "no-console": "off",
+    "no-debugger": "off"
   },
+
+  extends: ["plugin:vue/essential", "@vue/airbnb"]
 };

+ 7 - 3
package.json

@@ -8,12 +8,18 @@
     "lint": "vue-cli-service lint"
   },
   "dependencies": {
+    "@sentry/browser": "^5.15.5",
+    "@sentry/integrations": "^5.15.5",
     "core-js": "^3.6.4",
+    "pdfjs-dist": "^2.3.200",
     "vue": "^2.6.11",
+    "vue-pdf": "^4.0.8",
+    "vue-resize-sensor": "^2.0.0",
     "vue-router": "^3.1.6",
     "vuex": "^3.1.3"
   },
   "devDependencies": {
+    "@sentry/webpack-plugin": "^1.11.1",
     "@vue/cli-plugin-babel": "~4.3.0",
     "@vue/cli-plugin-eslint": "~4.3.0",
     "@vue/cli-plugin-router": "~4.3.0",
@@ -27,7 +33,6 @@
     "less": "^3.0.4",
     "less-loader": "^5.0.0",
     "lint-staged": "^9.5.0",
-    "vue-cli-plugin-webpack-bundle-analyzer": "~2.0.0",
     "vue-template-compiler": "^2.6.11"
   },
   "gitHooks": {
@@ -35,8 +40,7 @@
   },
   "lint-staged": {
     "*.{js,jsx,vue}": [
-      "vue-cli-service lint",
-      "git add"
+      "vue-cli-service lint"
     ]
   }
 }

+ 4 - 2
src/App.vue

@@ -2,9 +2,11 @@
   <div id="app">
     <div id="nav">
       <router-link to="/">Home</router-link> |
-      <router-link to="/about">About</router-link>
+      <router-link to="/about">About</router-link> |
+      <router-link to="/2020_5_6">2020_5_6</router-link> |
+      <router-link to="/printView">printView</router-link>
     </div>
-    <router-view/>
+    <router-view />
   </div>
 </template>
 

+ 144 - 0
src/components/vue-pdf/annotationLayer.css

@@ -0,0 +1,144 @@
+/* see https://github.com/mozilla/pdf.js/blob/55a853b6678cf3d05681ffbb521e5228e607b5d2/test/annotation_layer_test.css */
+
+.annotationLayer {
+	position: absolute;
+	left: 0;
+	top: 0;
+	right: 0;
+	bottom: 0;
+}
+
+.annotationLayer section {
+	position: absolute;
+}
+.annotationLayer .linkAnnotation > a {
+	position: absolute;
+	font-size: 1em;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+
+.annotationLayer .linkAnnotation > a /* -ms-a */ {
+	background: url('data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7')
+		0 0 repeat;
+}
+
+.annotationLayer .linkAnnotation > a:hover {
+	opacity: 0.2;
+	background: #ff0;
+	box-shadow: 0px 2px 10px #ff0;
+}
+
+.annotationLayer .textAnnotation img {
+	position: absolute;
+	cursor: pointer;
+}
+
+.annotationLayer .textWidgetAnnotation input,
+.annotationLayer .textWidgetAnnotation textarea,
+.annotationLayer .choiceWidgetAnnotation select,
+.annotationLayer .buttonWidgetAnnotation.checkBox input,
+.annotationLayer .buttonWidgetAnnotation.radioButton input {
+	background-color: rgba(0, 54, 255, 0.13);
+	border: 1px solid transparent;
+	box-sizing: border-box;
+	font-size: 9px;
+	height: 100%;
+	padding: 0 3px;
+	vertical-align: top;
+	width: 100%;
+}
+
+.annotationLayer .textWidgetAnnotation textarea {
+	font: message-box;
+	font-size: 9px;
+	resize: none;
+}
+
+.annotationLayer .textWidgetAnnotation input[disabled],
+.annotationLayer .textWidgetAnnotation textarea[disabled],
+.annotationLayer .choiceWidgetAnnotation select[disabled],
+.annotationLayer .buttonWidgetAnnotation.checkBox input[disabled],
+.annotationLayer .buttonWidgetAnnotation.radioButton input[disabled] {
+	background: none;
+	border: 1px solid transparent;
+	cursor: not-allowed;
+}
+
+.annotationLayer .textWidgetAnnotation input:hover,
+.annotationLayer .textWidgetAnnotation textarea:hover,
+.annotationLayer .choiceWidgetAnnotation select:hover,
+.annotationLayer .buttonWidgetAnnotation.checkBox input:hover,
+.annotationLayer .buttonWidgetAnnotation.radioButton input:hover {
+	border: 1px solid #000;
+}
+
+.annotationLayer .textWidgetAnnotation input:focus,
+.annotationLayer .textWidgetAnnotation textarea:focus,
+.annotationLayer .choiceWidgetAnnotation select:focus {
+	background: none;
+	border: 1px solid transparent;
+}
+
+.annotationLayer .textWidgetAnnotation input.comb {
+	font-family: monospace;
+	padding-left: 2px;
+	padding-right: 0;
+}
+
+.annotationLayer .textWidgetAnnotation input.comb:focus {
+	/*
+	 * Letter spacing is placed on the right side of each character. Hence, the
+	 * letter spacing of the last character may be placed outside the visible
+	 * area, causing horizontal scrolling. We avoid this by extending the width
+	 * when the element has focus and revert this when it loses focus.
+	 */
+	width: 115%;
+}
+
+.annotationLayer .buttonWidgetAnnotation.checkBox input,
+.annotationLayer .buttonWidgetAnnotation.radioButton input {
+	-webkit-appearance: none;
+	-moz-appearance: none;
+	-ms-appearance: none;
+	appearance: none;
+}
+
+.annotationLayer .popupWrapper {
+	position: absolute;
+	width: 20em;
+}
+
+.annotationLayer .popup {
+	position: absolute;
+	z-index: 200;
+	max-width: 20em;
+	background-color: #ffff99;
+	box-shadow: 0px 2px 5px #333;
+	border-radius: 2px;
+	padding: 0.6em;
+	margin-left: 5px;
+	cursor: pointer;
+	word-wrap: break-word;
+}
+
+.annotationLayer .popup h1 {
+	font-size: 1em;
+	border-bottom: 1px solid #000000;
+	padding-bottom: 0.2em;
+}
+
+.annotationLayer .popup p {
+	padding-top: 0.2em;
+}
+
+.annotationLayer .highlightAnnotation,
+.annotationLayer .underlineAnnotation,
+.annotationLayer .squigglyAnnotation,
+.annotationLayer .strikeoutAnnotation,
+.annotationLayer .lineAnnotation svg line,
+.annotationLayer .fileAttachmentAnnotation {
+	cursor: pointer;
+}

+ 120 - 0
src/components/vue-pdf/componentFactory.js

@@ -0,0 +1,120 @@
+/*eslint-disable*/
+import resizeSensor from "vue-resize-sensor";
+
+export default function(pdfjsWrapper) {
+  var createLoadingTask = pdfjsWrapper.createLoadingTask;
+  var PDFJSWrapper = pdfjsWrapper.PDFJSWrapper;
+
+  return {
+    createLoadingTask: createLoadingTask,
+    render: function(h) {
+      return h(
+        "span",
+        {
+          attrs: {
+            style: "position: relative; display: block"
+          }
+        },
+        [
+          h("canvas", {
+            attrs: {
+              style:
+                "display: inline-block; width: 100%; height: 100%; vertical-align: top"
+            },
+            ref: "canvas"
+          }),
+          h("span", {
+            style: "display: inline-block; width: 100%; height: 100%",
+            class: "annotationLayer",
+            ref: "annotationLayer"
+          }),
+          h(resizeSensor, {
+            props: {
+              initial: true
+            },
+            on: {
+              resize: this.resize
+            }
+          })
+        ]
+      );
+    },
+    props: {
+      src: {
+        type: [String, Object, Uint8Array],
+        default: ""
+      },
+      page: {
+        type: Number,
+        default: 1
+      },
+      rotate: {
+        type: Number
+      }
+    },
+    watch: {
+      src: function() {
+        console.log(this.src);
+        this.pdf.loadDocument(this.src);
+      },
+      page: function() {
+        this.pdf.loadPage(this.page, this.rotate);
+      },
+      rotate: function() {
+        this.pdf.renderPage(this.rotate);
+      }
+    },
+    methods: {
+      resize: function(size) {
+        console.log(size);
+        // check if the element is attached to the dom tree || resizeSensor being destroyed
+        if (
+          this.$el.parentNode === null ||
+          (size.width === 0 && size.height === 0)
+        )
+          return;
+
+        // on IE10- canvas height must be set
+        this.$refs.canvas.style.height =
+          this.$refs.canvas.offsetWidth *
+            (this.$refs.canvas.height / this.$refs.canvas.width) +
+          "px";
+        // update the page when the resolution is too poor
+        var resolutionScale = this.pdf.getResolutionScale();
+
+        if (resolutionScale < 0.85 || resolutionScale > 1.15)
+          this.pdf.renderPage(this.rotate);
+
+        // this.$refs.annotationLayer.style.transform = 'scale('+resolutionScale+')';
+      },
+      print: function(dpi, pageList) {
+        this.pdf.printPage(dpi, pageList);
+      }
+    },
+
+    // doc: mounted hook is not called during server-side rendering.
+    mounted: function() {
+      this.pdf = new PDFJSWrapper(
+        this.$refs.canvas,
+        this.$refs.annotationLayer,
+        this.$emit.bind(this)
+      );
+
+      this.$on("loaded", function() {
+        this.pdf.loadPage(this.page, this.rotate);
+      });
+
+      this.$on("page-size", function(width, height) {
+        this.$refs.canvas.style.height =
+          this.$refs.canvas.offsetWidth * (height / width) + "px";
+      });
+
+      this.pdf.loadDocument(this.src);
+    },
+
+    // doc: destroyed hook is not called during server-side rendering.
+    destroyed: function() {
+      this.pdf.destroy();
+    }
+  };
+}

+ 366 - 0
src/components/vue-pdf/pdfjsWrapper.js

@@ -0,0 +1,366 @@
+/*eslint-disable*/
+import { PDFLinkService } from 'pdfjs-dist/lib/web/pdf_link_service';
+
+var pendingOperation = Promise.resolve();
+
+export default function(PDFJS) {
+  function isPDFDocumentLoadingTask(obj) {
+    return typeof obj === 'object' && obj !== null && obj.__PDFDocumentLoadingTask === true;
+  }
+
+  function createLoadingTask(src, options) {
+    var source;
+    if (typeof src === 'string') source = { url: src };
+    else if (src instanceof Uint8Array) source = { data: src };
+    else if (typeof src === 'object' && src !== null) source = Object.assign({}, src);
+    else throw new TypeError('invalid src type');
+
+    // source.verbosity = PDFJS.VerbosityLevel.INFOS;
+    // source.pdfBug = true;
+    // source.stopAtErrors = true;
+
+    var loadingTask = PDFJS.getDocument(source);
+    loadingTask.__PDFDocumentLoadingTask = true; // since PDFDocumentLoadingTask is not public
+
+    if (options && options.onPassword) loadingTask.onPassword = options.onPassword;
+
+    if (options && options.onProgress) loadingTask.onProgress = options.onProgress;
+
+    return loadingTask;
+  }
+
+  function PDFJSWrapper(canvasElt, annotationLayerElt, emitEvent) {
+    var pdfDoc = null;
+    var pdfPage = null;
+    var pdfRender = null;
+    var canceling = false;
+
+    canvasElt.getContext('2d').save();
+
+    function clearCanvas() {
+      canvasElt.getContext('2d').clearRect(0, 0, canvasElt.width, canvasElt.height);
+    }
+
+    function clearAnnotations() {
+      while (annotationLayerElt.firstChild)
+        annotationLayerElt.removeChild(annotationLayerElt.firstChild);
+    }
+
+    this.destroy = function() {
+      if (pdfDoc === null) return;
+
+      // Aborts all network requests and destroys worker.
+      pendingOperation = pdfDoc.destroy();
+      pdfDoc = null;
+    };
+
+    this.getResolutionScale = function() {
+      return canvasElt.offsetWidth / canvasElt.width;
+    };
+
+    this.printPage = function(dpi, pageNumberOnly) {
+      if (pdfPage === null) return;
+
+      // 1in == 72pt
+      // 1in == 96px
+      var PRINT_RESOLUTION = dpi === undefined ? 150 : dpi;
+      var PRINT_UNITS = PRINT_RESOLUTION / 72.0;
+      var CSS_UNITS = 96.0 / 72.0;
+
+      // var iframeElt = document.createElement('iframe');
+      var printContainerElement = document.createElement('div');
+      printContainerElement.setAttribute('id', 'print-container');
+
+      // function removeIframe() {
+
+      //   iframeElt.parentNode.removeChild(iframeElt);
+      // }
+      function removePrintContainer() {
+        printContainerElement.parentNode.removeChild(printContainerElement);
+      }
+
+      new Promise(function(resolve, reject) {
+        // iframeElt.frameBorder = '0';
+        // iframeElt.scrolling = 'no';
+        // iframeElt.width = '0px;'
+        // iframeElt.height = '0px;'
+        // iframeElt.style.cssText = 'position: absolute; top: 0; left: 0';
+
+        // iframeElt.onload = function() {
+
+        //   resolve(this.contentWindow);
+        // }
+
+        // window.document.body.appendChild(iframeElt);
+        printContainerElement.frameBorder = '0';
+        printContainerElement.scrolling = 'no';
+        printContainerElement.width = '0px;';
+        printContainerElement.height = '0px;';
+        printContainerElement.style.cssText = 'position: absolute; top: 0; left: 0';
+
+        window.document.body.appendChild(printContainerElement);
+        resolve(window);
+      })
+        .then(function(win) {
+          win.document.title = '';
+
+          return pdfDoc.getPage(1).then(function(page) {
+            var viewport = page.getViewport({ scale: 1 });
+            printContainerElement.appendChild(win.document.createElement('style')).textContent =
+              '@supports ((size:A4) and (size:1pt 1pt)) {' +
+              '@page { margin: 1pt; size: ' +
+              (viewport.width * PRINT_UNITS) / CSS_UNITS +
+              'pt ' +
+              (viewport.height * PRINT_UNITS) / CSS_UNITS +
+              'pt; }' +
+              '}' +
+              '#print-canvas { display: none }' +
+              '@media print {' +
+              'body { margin: 0 }' +
+              'canvas { page-break-before: avoid; page-break-after: always; page-break-inside: avoid }' +
+              '#print-canvas { page-break-before: avoid; page-break-after: always; page-break-inside: avoid; display: block }' +
+              'body > *:not(#print-container) { display: none; }' +
+              '}' +
+              '@media screen {' +
+              'body { margin: 0 }' +
+              '}';
+            return win;
+          });
+        })
+        .then(function(win) {
+          var allPages = [];
+
+          for (var pageNumber = 1; pageNumber <= pdfDoc.numPages; ++pageNumber) {
+            if (pageNumberOnly !== undefined && pageNumberOnly.indexOf(pageNumber) === -1) continue;
+
+            allPages.push(
+              pdfDoc.getPage(pageNumber).then(function(page) {
+                var viewport = page.getViewport({ scale: 1 });
+
+                // var printCanvasElt = win.document.body.appendChild(win.document.createElement('canvas'));
+                var printCanvasElt = printContainerElement.appendChild(
+                  win.document.createElement('canvas'),
+                );
+                printCanvasElt.setAttribute('id', 'print-canvas');
+                printCanvasElt.width = viewport.width * PRINT_UNITS;
+                printCanvasElt.height = viewport.height * PRINT_UNITS;
+
+                return page.render({
+                  canvasContext: printCanvasElt.getContext('2d'),
+                  transform: [
+                    // Additional transform, applied just before viewport transform.
+                    PRINT_UNITS,
+                    0,
+                    0,
+                    PRINT_UNITS,
+                    0,
+                    0,
+                  ],
+                  viewport: viewport,
+                  intent: 'print',
+                }).promise;
+              }),
+            );
+          }
+
+          Promise.all(allPages)
+            .then(function() {
+              win.focus(); // Required for IE
+              if (win.document.queryCommandSupported('print')) {
+                win.document.execCommand('print', false, null);
+              } else {
+                win.print();
+              }
+              // removeIframe();
+              removePrintContainer();
+            })
+            .catch(function(err) {
+              // removeIframe();
+              removePrintContainer();
+              emitEvent('error', err);
+            });
+        });
+    };
+
+    this.renderPage = function(rotate) {
+      if (pdfRender !== null) {
+        if (canceling) return;
+        canceling = true;
+        pdfRender.cancel();
+        return;
+      }
+
+      if (pdfPage === null) return;
+
+      rotate =
+        (pdfPage.rotate === undefined ? 0 : pdfPage.rotate) + (rotate === undefined ? 0 : rotate);
+
+      var scale =
+        (canvasElt.offsetWidth / pdfPage.getViewport({ scale: 1 }).width) *
+        (window.devicePixelRatio || 1);
+      var viewport = pdfPage.getViewport({ scale, rotation: rotate });
+
+      emitEvent('page-size', viewport.width, viewport.height);
+
+      canvasElt.width = viewport.width;
+      canvasElt.height = viewport.height;
+
+      pdfRender = pdfPage.render({
+        canvasContext: canvasElt.getContext('2d'),
+        viewport: viewport,
+      });
+
+      annotationLayerElt.style.visibility = 'hidden';
+      clearAnnotations();
+
+      var viewer = {
+        scrollPageIntoView: function(params) {
+          emitEvent('link-clicked', params.pageNumber);
+        },
+      };
+
+      var linkService = new PDFLinkService();
+      linkService.setDocument(pdfDoc);
+      linkService.setViewer(viewer);
+
+      pendingOperation = pendingOperation.then(
+        function() {
+          var getAnnotationsOperation = pdfPage
+            .getAnnotations({ intent: 'display' })
+            .then(function(annotations) {
+              PDFJS.AnnotationLayer.render({
+                viewport: viewport.clone({ dontFlip: true }),
+                div: annotationLayerElt,
+                annotations: annotations,
+                page: pdfPage,
+                linkService: linkService,
+                renderInteractiveForms: false,
+              });
+            });
+
+          var pdfRenderOperation = pdfRender.promise
+            .then(function() {
+              annotationLayerElt.style.visibility = '';
+              canceling = false;
+              pdfRender = null;
+            })
+            .catch(
+              function(err) {
+                pdfRender = null;
+                if (err instanceof PDFJS.RenderingCancelledException) {
+                  canceling = false;
+                  this.renderPage(rotate);
+                  return;
+                }
+                emitEvent('error', err);
+              }.bind(this),
+            );
+
+          return Promise.all([getAnnotationsOperation, pdfRenderOperation]);
+        }.bind(this),
+      );
+    };
+
+    this.forEachPage = function(pageCallback) {
+      var numPages = pdfDoc.numPages;
+
+      (function next(pageNum) {
+        pdfDoc
+          .getPage(pageNum)
+          .then(pageCallback)
+          .then(function() {
+            if (++pageNum <= numPages) next(pageNum);
+          });
+      })(1);
+    };
+
+    this.loadPage = function(pageNumber, rotate) {
+      pdfPage = null;
+
+      if (pdfDoc === null) return;
+
+      pendingOperation = pendingOperation
+        .then(function() {
+          return pdfDoc.getPage(pageNumber);
+        })
+        .then(
+          function(page) {
+            pdfPage = page;
+            this.renderPage(rotate);
+            emitEvent('page-loaded', page.pageNumber);
+          }.bind(this),
+        )
+        .catch(function(err) {
+          clearCanvas();
+          clearAnnotations();
+          emitEvent('error', err);
+        });
+    };
+
+    this.loadDocument = function(src) {
+      pdfDoc = null;
+      pdfPage = null;
+
+      emitEvent('num-pages', undefined);
+
+      if (!src) {
+        canvasElt.removeAttribute('width');
+        canvasElt.removeAttribute('height');
+        clearAnnotations();
+        return;
+      }
+
+      // wait for pending operation ends
+      pendingOperation = pendingOperation
+        .then(function() {
+          var loadingTask;
+          if (isPDFDocumentLoadingTask(src)) {
+            if (src.destroyed) {
+              emitEvent('error', new Error('loadingTask has been destroyed'));
+              return;
+            }
+
+            loadingTask = src;
+          } else {
+            loadingTask = createLoadingTask(src, {
+              onPassword: function(updatePassword, reason) {
+                var reasonStr;
+                switch (reason) {
+                  case PDFJS.PasswordResponses.NEED_PASSWORD:
+                    reasonStr = 'NEED_PASSWORD';
+                    break;
+                  case PDFJS.PasswordResponses.INCORRECT_PASSWORD:
+                    reasonStr = 'INCORRECT_PASSWORD';
+                    break;
+                }
+                emitEvent('password', updatePassword, reasonStr);
+              },
+              onProgress: function(status) {
+                var ratio = status.loaded / status.total;
+                emitEvent('progress', Math.min(ratio, 1));
+              },
+            });
+          }
+
+          return loadingTask.promise;
+        })
+        .then(function(pdf) {
+          pdfDoc = pdf;
+          emitEvent('num-pages', pdf.numPages);
+          emitEvent('loaded');
+        })
+        .catch(function(err) {
+          clearCanvas();
+          clearAnnotations();
+          emitEvent('error', err);
+        });
+    };
+
+    annotationLayerElt.style.transformOrigin = '0 0';
+  }
+
+  return {
+    createLoadingTask: createLoadingTask,
+    PDFJSWrapper: PDFJSWrapper,
+  };
+}

+ 19 - 0
src/components/vue-pdf/vuePdfSss.vue

@@ -0,0 +1,19 @@
+<style src="./annotationLayer.css"></style>
+<script>
+/*eslint-disable*/
+import componentFactory from "./componentFactory";
+import pdfjsWrapper from "./pdfjsWrapper";
+
+const PDFJS = require("pdfjs-dist");
+
+if (process.env.VUE_ENV !== "server") {
+  if (typeof window !== "undefined" && "Worker" in window) {
+    const PdfjsWorker = require("worker-loader!pdfjs-dist/build/pdf.worker.js");
+    PDFJS.GlobalWorkerOptions.workerPort = new PdfjsWorker();
+  }
+}
+const component = componentFactory(pdfjsWrapper(PDFJS));
+component.PDFJS = PDFJS;
+
+export default component;
+</script>

+ 26 - 6
src/main.js

@@ -1,12 +1,32 @@
-import Vue from 'vue';
-import App from './App.vue';
-import router from './router';
-import store from './store';
+import Vue from "vue";
+import * as Sentry from "@sentry/browser";
+import { Vue as VueIntegration } from "@sentry/integrations";
+import App from "./App.vue";
+import router from "./router";
+import store from "./store";
+
+// if (process.env.NODE_ENV === "production") {
+//   Sentry.init({
+//     dsn: "http://3a6d0bf34c8e48e79771449a1ef487db@localhost:9000/2",
+//     integrations: [new VueIntegration({ Vue, attachProps: true })]
+//   });
+
+//   // Sentry.configureScope(function(scope) {
+//   //   scope.setUser({ email: "john.doe@example.com" });
+//   // });
+// }
+
+// 在生产环境中让sentry报错
+process.env.NODE_ENV === "production" &&
+  Sentry.init({
+    dsn: "http://3a6d0bf34c8e48e79771449a1ef487db@localhost:9000/2",
+    integrations: [new VueIntegration({ Vue, attachProps: true })]
+  });
 
 Vue.config.productionTip = false;
 
 new Vue({
   router,
   store,
-  render: (h) => h(App),
-}).$mount('#app');
+  render: h => h(App)
+}).$mount("#app");

+ 29 - 10
src/router/index.js

@@ -1,27 +1,46 @@
-import Vue from 'vue';
-import VueRouter from 'vue-router';
-import Home from '../views/Home.vue';
+import Vue from "vue";
+import VueRouter from "vue-router";
+import Home from "../views/Home.vue";
 
 Vue.use(VueRouter);
 
 const routes = [
   {
-    path: '/',
-    name: 'Home',
-    component: Home,
+    path: "/",
+    name: "Home",
+    component: Home
   },
   {
-    path: '/about',
-    name: 'About',
+    path: "/about",
+    name: "About",
     // route level code-splitting
     // this generates a separate chunk (about.[hash].js) for this route
     // which is lazy-loaded when the route is visited.
-    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue'),
+    component: () =>
+      import(/* webpackChunkName: "about" */ "../views/About.vue")
   },
+  {
+    path: "/2020_5_6",
+    name: "2020_5_6",
+    // route level code-splitting
+    // this generates a separate chunk (about.[hash].js) for this route
+    // which is lazy-loaded when the route is visited.
+    component: () =>
+      import(/* webpackChunkName: "2020_5_6" */ "../views/2020_5_6.vue")
+  },
+  {
+    path: "/printView",
+    name: "printView",
+    // route level code-splitting
+    // this generates a separate chunk (about.[hash].js) for this route
+    // which is lazy-loaded when the route is visited.
+    component: () =>
+      import(/* webpackChunkName: "printView" */ "../views/printView.vue")
+  }
 ];
 
 const router = new VueRouter({
-  routes,
+  routes
 });
 
 export default router;

+ 136 - 0
src/views/2020_5_6.vue

@@ -0,0 +1,136 @@
+<template>
+  <div>
+    123
+  </div>
+</template>
+<script>
+export default {
+  created() {
+    console.log(this.addTwoNumbers([2, 4, 3, 9], [5, 6, 4, 9]));
+  },
+  methods: {
+    /*
+      给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
+
+      你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
+
+      给定 nums = [2, 7, 11, 15], target = 9
+      因为 nums[0] + nums[1] = 2 + 7 = 9
+      所以返回 [0, 1]
+    */
+    run(nums, target) {
+      let start = -1;
+      let end = -1;
+      for (let i = 0; i < nums.length; i++) {
+        let item = nums[i];
+        const newArray = nums.slice(i + 1);
+        newArray.forEach((element, index) => {
+          if (item + element === target) {
+            start = i;
+            end = i + index + 1;
+          }
+        });
+      }
+      return [start, end];
+    },
+    /*
+      输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
+      输出:7 -> 0 -> 8
+      原因:342 + 465 = 807
+    */
+    addTwoNumbers(l1, l2) {
+      const setArr = arr => {
+        let newArr = [];
+        for (let i = arr.length - 1; i > -1; i--) {
+          newArr.push(arr[i]);
+        }
+        return Number.parseInt(JSON.stringify(newArr).replace(/,|\[|\]/g, ""));
+      };
+      const l1Num = setArr(l1);
+      const l2Num = setArr(l2);
+      const sun = l1Num + l2Num;
+      const arrStr = sun.toString();
+
+      let arrNum = [];
+      for (let i = 0; i < arrStr.length; i++) {
+        arrNum.push(Number.parseInt(arrStr[i]));
+      }
+      return arrNum;
+    },
+    test() {
+      let node = new ListNode("head");
+      let temp = node; //哑结点
+      let add = 0; //是否进一
+      let sum = 0; //新链表当前未取余的值 = 链表1值 + 链表2值 + add;
+
+      //遍历,直到最长的都为空
+      while (l1 || l2) {
+        sum = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + add;
+        temp.next = new ListNode(sum % 10); //取余则为新链表的值
+        temp = temp.next;
+        add = sum >= 10 ? 1 : 0;
+        l1 && (l1 = l1.next);
+        l2 && (l2 = l2.next);
+      }
+      add && (temp.next = new ListNode(add));
+      return node.next;
+
+      // 作者:lvshanke
+      // 链接:https://leetcode-cn.com/problems/add-two-numbers/solution/zhi-xing-yong-shi-chao-guo-8246nei-cun-xiao-hao-ch/
+      // 来源:力扣(LeetCode)
+      // 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+    },
+    test2() {
+      /**
+       * Definition for singly-linked list.
+       * function ListNode(val) {
+       *     this.val = val;
+       *     this.next = null;
+       * }
+       */
+      function getListNodeVal(ln) {
+        return ln ? ln.val : 0;
+      }
+      /**
+       * @param {ListNode} l1
+       * @param {ListNode} l2
+       * @return {ListNode}
+       */
+      var addTwoNumbers = function(l1, l2) {
+        // 返回值
+        let res = new ListNode("begin"),
+          // 临时变量做中间节点
+          temp = res,
+          // 记录上次的计算是否需要进位 初始值为0
+          carry = 0,
+          // 每次计算和
+          sum = 0;
+        while (l1 || l2) {
+          // 求和
+          sum = getListNodeVal(l1) + getListNodeVal(l2) + carry;
+          // 这一步很关键
+          // 把当前暂存链表 新建 ListNode val为 sum % 10 的结果
+          // 这一步做完之后
+          // 第一次 之后 res = {val: 'begin', next: {val: sum % 10, next:null } }
+          // 以此类推
+          temp.next = new ListNode(sum % 10);
+          // 同时改变 temp 指向为新建 链表
+          temp = temp.next;
+          // 判断当前求和计算是否 >= 10
+          // true就是需要进位,为下次计算保存起来
+          // 没有就重置为 0
+          carry = sum >= 10 ? 1 : 0;
+          // 改变 l1 l2 指向
+          l1 && (l1 = l1.next);
+          l2 && (l2 = l2.next);
+        }
+        // 如果到最后 carry 还是存在
+        // 那么证明最后一位计算结果 >= 10
+        carry && (temp.next = new ListNode(carry));
+        // 返回 res.next res.val = 'begin' 记录的是我们开始 next才是保存我们的结果
+        return res.next;
+      };
+    }
+  }
+};
+</script>

+ 15 - 0
src/views/About.vue

@@ -1,5 +1,20 @@
 <template>
   <div class="about">
     <h1>This is an about page</h1>
+    <button @click="test">test</button>
+    {{ a }}
   </div>
 </template>
+
+<script>
+export default {
+  created() {},
+  methods: {
+    test() {
+      console.log(13);
+
+      console.log(aa, bbbb);
+    }
+  }
+};
+</script>

+ 87 - 0
src/views/printView.vue

@@ -0,0 +1,87 @@
+<template>
+  <div class="w-printer">
+    <!-- <iframe
+      :src="getprintPreview()"
+      type="application/x-google-chrome-pdf"
+      style="width:100%;height:100%;border:none;padding:0;margin:0;"
+    >
+    </iframe> -->
+    <!-- <a-button @click="$refs.myPdfComponent.print()">print</a-button> -->
+    <div class="btn-wrapper">
+      <div><button @click="back" type="link">返回</button></div>
+      <div>
+        <button type="primary" @click="$refs.myPdfComponent.print()">
+          打印
+        </button>
+      </div>
+    </div>
+    <div class="w-pdf-style">
+      <vue-pdf :src="pdfUrl" ref="myPdfComponent"></vue-pdf>
+    </div>
+  </div>
+</template>
+<script>
+// import { printPreview } from '@/api/print';
+// import vuePdf from "@/components/vue-pdf/vuePdfSss.vue";
+import vuePdf from "vue-pdf";
+import CMapReaderFactory from "vue-pdf/src/CMapReaderFactory.js";
+
+export default {
+  created() {
+    // this.pdfUrl = "http://127.0.0.1:9999/test.pdf";
+    this.pdfUrl =
+      "https://tengnat.yiyuntong.net:40051/mes-print-service/print/preview?code=6100000081&configCode=transaction";
+    // this.pdfUrl = vuePdf.createLoadingTask({
+    //   url: "http://127.0.0.1:9999/test.pdf",
+    //   CMapReaderFactory
+    // });
+  },
+  data() {
+    return {
+      pdfUrl: "",
+      path: ""
+    };
+  },
+  components: {
+    "vue-pdf": vuePdf
+  },
+  methods: {
+    // async getprintPreview() {
+    //   const res = await printPreview({ code: 'T9700000859', configCode: 'transaction' });
+    //   console.log(res, 'res');
+    //   return res.data;
+    //   // const res = await printPreview();
+    // },
+    back() {
+      this.$router.go(-1);
+      // this.$router.push({ path: this.path });
+    }
+  }
+};
+</script>
+
+<style lang="less" scoped>
+.w-printer {
+  // display: flex;
+  height: 100%;
+  width: 100%;
+
+  .btn-wrapper {
+    width: 900px;
+    display: flex;
+    justify-content: space-between;
+    margin: 10px auto;
+  }
+  .w-pdf-style {
+    border: 1px solid #d3d3d3;
+    // display: block;
+    width: 900px;
+    // padding: 0 30px;
+    margin: 0 auto;
+    // display: inline-block;
+    // width: 80%;
+    // height: 80%;
+    // border: 1px solid #ccc;
+  }
+}
+</style>

+ 20 - 0
vue.config.js

@@ -0,0 +1,20 @@
+const SentryCliPlugin = require("@sentry/webpack-plugin");
+
+module.exports = {
+  lintOnSave: false,
+  chainWebpack: config => {
+    config.plugin("sentry").use(SentryCliPlugin, [
+      {
+        include: ".",
+        ignoreFile: ".sentrycliignore",
+        ignore: ["node_modules", "webpack.config.js"],
+        configFile: "sentry.properties",
+        dryRun: true,
+        release: "foo"
+      }
+    ]);
+    // if (process.env.NODE_ENV === "production") {
+
+    // }
+  }
+};

+ 175 - 20
yarn.lock

@@ -878,6 +878,85 @@
   dependencies:
     any-observable "^0.3.0"
 
+"@sentry/browser@^5.15.5":
+  version "5.15.5"
+  resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.15.5.tgz#d9a51f1388581067b50d30ed9b1aed2cbb333a36"
+  integrity sha512-rqDvjk/EvogfdbZ4TiEpxM/lwpPKmq23z9YKEO4q81+1SwJNua53H60dOk9HpRU8nOJ1g84TMKT2Ov8H7sqDWA==
+  dependencies:
+    "@sentry/core" "5.15.5"
+    "@sentry/types" "5.15.5"
+    "@sentry/utils" "5.15.5"
+    tslib "^1.9.3"
+
+"@sentry/cli@^1.52.3":
+  version "1.52.3"
+  resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.52.3.tgz#270ed167c7dae2f85eb4622ad3a4ec12ab67e6d2"
+  integrity sha512-QOSIg5hxAEa6v6H7oEeF6A/Rpa0wloMhbu0Qed6zHv3lyoqf0Z34Kq2jCXdqGsOE3IzkO+3CNy81F6361j5TKg==
+  dependencies:
+    https-proxy-agent "^5.0.0"
+    mkdirp "^0.5.5"
+    node-fetch "^2.6.0"
+    progress "^2.0.3"
+    proxy-from-env "^1.1.0"
+
+"@sentry/core@5.15.5":
+  version "5.15.5"
+  resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.15.5.tgz#40ea79bff5272d3fbbeeb4a98cdc59e1adbd2c92"
+  integrity sha512-enxBLv5eibBMqcWyr+vApqeix8uqkfn0iGsD3piKvoMXCgKsrfMwlb/qo9Ox0lKr71qIlZVt+9/A2vZohdgnlg==
+  dependencies:
+    "@sentry/hub" "5.15.5"
+    "@sentry/minimal" "5.15.5"
+    "@sentry/types" "5.15.5"
+    "@sentry/utils" "5.15.5"
+    tslib "^1.9.3"
+
+"@sentry/hub@5.15.5":
+  version "5.15.5"
+  resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.15.5.tgz#f5abbcdbe656a70e2ff02c02a5a4cffa0f125935"
+  integrity sha512-zX9o49PcNIVMA4BZHe//GkbQ4Jx+nVofqU/Il32/IbwKhcpPlhGX3c1sOVQo4uag3cqd/JuQsk+DML9TKkN0Lw==
+  dependencies:
+    "@sentry/types" "5.15.5"
+    "@sentry/utils" "5.15.5"
+    tslib "^1.9.3"
+
+"@sentry/integrations@^5.15.5":
+  version "5.15.5"
+  resolved "https://registry.npm.taobao.org/@sentry/integrations/download/@sentry/integrations-5.15.5.tgz#7f7bc488d838cd50e9ca50d5f933680632827826"
+  integrity sha1-f3vEiNg4zVDpylDV+TNoBjKCeCY=
+  dependencies:
+    "@sentry/types" "5.15.5"
+    "@sentry/utils" "5.15.5"
+    tslib "^1.9.3"
+
+"@sentry/minimal@5.15.5":
+  version "5.15.5"
+  resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.15.5.tgz#a0e4e071f01d9c4d808094ae7203f6c4cca9348a"
+  integrity sha512-zQkkJ1l9AjmU/Us5IrOTzu7bic4sTPKCatptXvLSTfyKW7N6K9MPIIFeSpZf9o1yM2sRYdK7GV08wS2eCT3JYw==
+  dependencies:
+    "@sentry/hub" "5.15.5"
+    "@sentry/types" "5.15.5"
+    tslib "^1.9.3"
+
+"@sentry/types@5.15.5":
+  version "5.15.5"
+  resolved "https://registry.npm.taobao.org/@sentry/types/download/@sentry/types-5.15.5.tgz#16c97e464cf09bbd1d2e8ce90d130e781709076e"
+  integrity sha1-Fsl+Rkzwm70dLozpDRMOeBcJB24=
+
+"@sentry/utils@5.15.5":
+  version "5.15.5"
+  resolved "https://registry.npm.taobao.org/@sentry/utils/download/@sentry/utils-5.15.5.tgz#dec1d4c79037c4da08b386f5d34409234dcbfb15"
+  integrity sha1-3sHUx5A3xNoIs4b100QJI03L+xU=
+  dependencies:
+    "@sentry/types" "5.15.5"
+    tslib "^1.9.3"
+
+"@sentry/webpack-plugin@^1.11.1":
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.11.1.tgz#ef14479b92e247777061e69404b1faed39944dc8"
+  integrity sha512-7uQiqHXK84GYy2mL/c+cW/QBtr/D8fNmf8U5nUDN4+44aNrQxSJ4vJmYJbxYg1zO6qN/xZyqJt3uKBlgA3FkZg==
+  dependencies:
+    "@sentry/cli" "^1.52.3"
+
 "@soda/friendly-errors-webpack-plugin@^1.7.1":
   version "1.7.1"
   resolved "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.7.1.tgz#706f64bcb4a8b9642b48ae3ace444c70334d615d"
@@ -1358,6 +1437,13 @@ address@^1.1.2:
   resolved "https://registry.npm.taobao.org/address/download/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
   integrity sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY=
 
+agent-base@6:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.0.tgz#5d0101f19bbfaed39980b22ae866de153b93f09a"
+  integrity sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==
+  dependencies:
+    debug "4"
+
 aggregate-error@^3.0.0:
   version "3.0.1"
   resolved "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
@@ -1681,6 +1767,11 @@ babel-plugin-dynamic-import-node@^2.3.0:
   dependencies:
     object.assign "^4.1.0"
 
+babel-plugin-syntax-dynamic-import@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
+  integrity sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=
+
 balanced-match@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
@@ -2786,6 +2877,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
   dependencies:
     ms "2.0.0"
 
+debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+  integrity sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=
+  dependencies:
+    ms "^2.1.1"
+
 debug@^3.0.0, debug@^3.1.1, debug@^3.2.5:
   version "3.2.6"
   resolved "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
@@ -2793,13 +2891,6 @@ debug@^3.0.0, debug@^3.1.1, debug@^3.2.5:
   dependencies:
     ms "^2.1.1"
 
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
-  version "4.1.1"
-  resolved "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
-  integrity sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=
-  dependencies:
-    ms "^2.1.1"
-
 decamelize@^1.2.0:
   version "1.2.0"
   resolved "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -4407,6 +4498,14 @@ https-browserify@^1.0.0:
   resolved "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
   integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
 
+https-proxy-agent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+  integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+  dependencies:
+    agent-base "6"
+    debug "4"
+
 human-signals@^1.1.1:
   version "1.1.1"
   resolved "https://registry.npm.taobao.org/human-signals/download/human-signals-1.1.1.tgz?cache=0&sync_timestamp=1584198662293&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhuman-signals%2Fdownload%2Fhuman-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
@@ -5247,7 +5346,7 @@ loader-utils@^0.2.16:
     json5 "^0.5.0"
     object-assign "^4.0.1"
 
-loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
+loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0:
   version "1.4.0"
   resolved "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz?cache=0&sync_timestamp=1584445207623&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-utils%2Fdownload%2Floader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
   integrity sha1-xXm140yzSxp07cbB+za/o3HVphM=
@@ -5642,7 +5741,7 @@ mixin-deep@^1.2.0:
     for-in "^1.0.2"
     is-extendable "^1.0.1"
 
-mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1:
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1:
   version "0.5.5"
   resolved "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&sync_timestamp=1587535418745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
   integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=
@@ -5752,6 +5851,16 @@ no-case@^2.2.0:
   dependencies:
     lower-case "^1.1.1"
 
+node-ensure@^0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7"
+  integrity sha1-7K52QVDemYYexcgQ/V0Jaxg5Mqc=
+
+node-fetch@^2.6.0:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
+  integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
+
 node-forge@0.9.0:
   version "0.9.0"
   resolved "https://registry.npm.taobao.org/node-forge/download/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
@@ -6344,6 +6453,14 @@ pbkdf2@^3.0.3:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
+pdfjs-dist@^2.1.266, pdfjs-dist@^2.3.200:
+  version "2.3.200"
+  resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-2.3.200.tgz#2920dc28ae7f2b8313cd6d6223c97ae85ac07eac"
+  integrity sha512-+8wBjU5h8LPZOIvR9X2uCrp/8xWQG1DRDKMLg5lzGN1qyIAZlYUxA0KQyy12Nw5jN7ozulC6v97PMaDcLgAcFg==
+  dependencies:
+    node-ensure "^0.0.0"
+    worker-loader "^2.0.0"
+
 performance-now@^2.1.0:
   version "2.1.0"
   resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@@ -6817,7 +6934,7 @@ process@^0.11.10:
   resolved "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
   integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
 
-progress@^2.0.0:
+progress@^2.0.0, progress@^2.0.3:
   version "2.0.3"
   resolved "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
   integrity sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=
@@ -6842,6 +6959,11 @@ proxy-addr@~2.0.5:
     forwarded "~0.1.2"
     ipaddr.js "1.9.1"
 
+proxy-from-env@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
 prr@~1.0.1:
   version "1.0.1"
   resolved "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
@@ -6977,6 +7099,14 @@ raw-body@2.4.0:
     iconv-lite "0.4.24"
     unpipe "1.0.0"
 
+raw-loader@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-3.1.0.tgz#5e9d399a5a222cc0de18f42c3bc5e49677532b3f"
+  integrity sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==
+  dependencies:
+    loader-utils "^1.1.0"
+    schema-utils "^2.0.1"
+
 read-pkg-up@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fread-pkg-up%2Fdownload%2Fread-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
@@ -7348,6 +7478,14 @@ sax@~1.2.4:
   resolved "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk=
 
+schema-utils@^0.4.0:
+  version "0.4.7"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
+  integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==
+  dependencies:
+    ajv "^6.1.0"
+    ajv-keywords "^3.1.0"
+
 schema-utils@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz?cache=0&sync_timestamp=1587138120194&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
@@ -7357,7 +7495,7 @@ schema-utils@^1.0.0:
     ajv-errors "^1.0.0"
     ajv-keywords "^3.1.0"
 
-schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.5, schema-utils@^2.6.6:
+schema-utils@^2.0.0, schema-utils@^2.0.1, schema-utils@^2.5.0, schema-utils@^2.6.5, schema-utils@^2.6.6:
   version "2.6.6"
   resolved "https://registry.npm.taobao.org/schema-utils/download/schema-utils-2.6.6.tgz?cache=0&sync_timestamp=1587138120194&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c"
   integrity sha1-KZ/mvUozZdwj2Z/URsr/jx1sMww=
@@ -8217,7 +8355,7 @@ ts-pnp@^1.1.6:
   resolved "https://registry.npm.taobao.org/ts-pnp/download/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
   integrity sha1-pQCtCEsHmPHDBxrzkeZZEshrypI=
 
-tslib@^1.10.0, tslib@^1.9.0:
+tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3:
   version "1.11.1"
   resolved "https://registry.npm.taobao.org/tslib/download/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
   integrity sha1-6xXRKIJ/vuKEFUnhcfRe0zisfjU=
@@ -8503,13 +8641,6 @@ vm-browserify@^1.0.1:
   resolved "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz?cache=0&sync_timestamp=1572870717730&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvm-browserify%2Fdownload%2Fvm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
   integrity sha1-eGQcSIuObKkadfUR56OzKobl3aA=
 
-vue-cli-plugin-webpack-bundle-analyzer@~2.0.0:
-  version "2.0.0"
-  resolved "https://registry.npm.taobao.org/vue-cli-plugin-webpack-bundle-analyzer/download/vue-cli-plugin-webpack-bundle-analyzer-2.0.0.tgz#160fbd492a673bae1be3a9f714db12218678fa01"
-  integrity sha1-Fg+9SSpnO64b46n3FNsSIYZ4+gE=
-  dependencies:
-    webpack-bundle-analyzer "^3.6.0"
-
 vue-eslint-parser@^7.0.0:
   version "7.0.0"
   resolved "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-7.0.0.tgz#a4ed2669f87179dedd06afdd8736acbb3a3864d6"
@@ -8538,6 +8669,22 @@ vue-loader@^15.9.1:
     vue-hot-reload-api "^2.3.0"
     vue-style-loader "^4.1.0"
 
+vue-pdf@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/vue-pdf/-/vue-pdf-4.0.8.tgz#a7875245cd8a4fb53193e844b46350e77d7af5d9"
+  integrity sha512-R/Bv/0KhTXH/v6aBnCY6vqhN+p6HDNFohMOWtJyYrF7KtHbMYQaRhQg9Z0+7HyboApnx4P+lpZP+Xrl2JZE6HA==
+  dependencies:
+    babel-plugin-syntax-dynamic-import "^6.18.0"
+    loader-utils "^1.2.3"
+    pdfjs-dist "^2.1.266"
+    raw-loader "^3.1.0"
+    vue-resize-sensor "^2.0.0"
+
+vue-resize-sensor@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/vue-resize-sensor/-/vue-resize-sensor-2.0.0.tgz#3a587fd6802e1688709cf2c5aadae7a0075952bf"
+  integrity sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ==
+
 vue-router@^3.1.6:
   version "3.1.6"
   resolved "https://registry.npm.taobao.org/vue-router/download/vue-router-3.1.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.1.6.tgz#45f5a3a3843e31702c061dd829393554e4328f89"
@@ -8597,7 +8744,7 @@ wcwidth@^1.0.1:
   dependencies:
     defaults "^1.0.3"
 
-webpack-bundle-analyzer@^3.6.0, webpack-bundle-analyzer@^3.6.1:
+webpack-bundle-analyzer@^3.6.1:
   version "3.7.0"
   resolved "https://registry.npm.taobao.org/webpack-bundle-analyzer/download/webpack-bundle-analyzer-3.7.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-bundle-analyzer%2Fdownload%2Fwebpack-bundle-analyzer-3.7.0.tgz#84da434e89442899b884d9ad38e466d0db02a56f"
   integrity sha1-hNpDTolEKJm4hNmtOORm0NsCpW8=
@@ -8771,6 +8918,14 @@ worker-farm@^1.7.0:
   dependencies:
     errno "~0.1.7"
 
+worker-loader@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-2.0.0.tgz#45fda3ef76aca815771a89107399ee4119b430ac"
+  integrity sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==
+  dependencies:
+    loader-utils "^1.0.0"
+    schema-utils "^0.4.0"
+
 wrap-ansi@^2.0.0:
   version "2.1.0"
   resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"