소스 검색

add export

zhangjie 4 년 전
부모
커밋
dc4a2a6058

+ 1 - 0
package.json

@@ -13,6 +13,7 @@
     "core-js": "^3.6.4",
     "deepmerge": "^4.2.2",
     "echarts": "^4.7.0",
+    "html2canvas": "^1.0.0-rc.5",
     "js-md5": "^0.7.3",
     "view-design": "^4.2.0",
     "vue": "^2.6.11",

+ 1 - 1
src/assets/styles/home.less

@@ -13,7 +13,7 @@
   bottom: 0;
   overflow: auto;
   background: @background-color;
-  z-index: 98;
+  z-index: 100;
 }
 .home-main {
   position: relative;

+ 56 - 0
src/assets/styles/main.less

@@ -573,8 +573,64 @@
   }
 }
 
+// analysis-export -------------------------->
+.analysis-export-modal {
+  position: fixed;
+  z-index: 99;
+  top: 0;
+  left: -10000px;
+  width: 1400px;
+  height: 1000px;
+  background-color: #fff;
+  overflow: auto;
+
+  // width: 100%;
+  // height: 100%;
+  // left: 0;
+}
 // print page for export
 .print-box {
+  // width: 1160px;
+  // height: 1639px;
   width: 210mm;
   height: 297mm;
+  margin: 0 auto;
+  position: relative;
+  padding: 60px 60px;
+  h1 {
+    font-size: 24px;
+    text-align: center;
+    font-weight: 600;
+    margin-bottom: 30px;
+  }
+  .quality-info {
+    font-size: 16px;
+    font-weight: 600;
+    line-height: 30px;
+    margin-bottom: 20px;
+  }
+  .print-chart {
+    margin-bottom: 20px;
+
+    &-title {
+      font-size: 16px;
+      font-weight: 600;
+    }
+  }
+  .export-table {
+    width: 100%;
+    border-spacing: 0;
+    border-collapse: collapse;
+    text-align: center;
+    border-bottom: 1px solid #000;
+    border-right: 1px solid #000;
+    th,
+    td {
+      color: #000;
+      padding: 3px 5px;
+      border-top: 1px solid #000;
+      border-left: 1px solid #000;
+      border-radius: 0 !important;
+    }
+  }
 }

+ 24 - 1
src/components/EchartRender.vue

@@ -3,6 +3,7 @@
     <h3 class="chart-title">{{ chartTitle }}</h3>
     <v-chart
       :options="chartOption"
+      :init-options="initOptions"
       v-if="chartOption"
       autoresize
       ref="vueChart"
@@ -28,6 +29,17 @@ export default {
         );
       }
     },
+    rendererType: {
+      type: String,
+      default: "canvas",
+      validator(val) {
+        return ["canvas", "svg"].indexOf(val) !== -1;
+      }
+    },
+    animationIsOpen: {
+      type: Boolean,
+      default: true
+    },
     chartData: {
       type: [Object, Array],
       required: true
@@ -52,10 +64,12 @@ export default {
   },
   data() {
     return {
-      chartOption: null
+      chartOption: null,
+      initOptions: { renderer: "canvas" }
     };
   },
   mounted() {
+    if (this.rendererType) this.initOptions.renderer = this.rendererType;
     this.getOptions();
   },
   methods: {
@@ -63,6 +77,9 @@ export default {
       const name = this.chartType[0].toUpperCase() + this.chartType.slice(1);
       this.chartOption = this[`get${name}Option`](this.chartData);
     },
+    getDataURL(options) {
+      return this.$refs.vueChart && this.$refs.vueChart.getDataURL(options);
+    },
     getLineOption(datas) {
       let labels = [],
         vals = [];
@@ -82,6 +99,7 @@ export default {
       ]);
 
       return {
+        animation: this.animationIsOpen,
         grid: {
           top: "10%",
           bottom: "12%",
@@ -169,6 +187,7 @@ export default {
         };
       });
       return {
+        animation: this.animationIsOpen,
         grid: {
           top: "24%",
           bottom: "10%"
@@ -208,6 +227,7 @@ export default {
     getBarOption(datas) {
       if (!datas.names.length) return;
       return {
+        animation: this.animationIsOpen,
         color: this.chartColor,
         grid: {
           top: "20%",
@@ -273,6 +293,7 @@ export default {
     getBarReverseOption(datas) {
       if (!datas.names.length) return;
       return {
+        animation: this.animationIsOpen,
         color: this.chartColor,
         grid: {
           top: "20%",
@@ -362,6 +383,7 @@ export default {
       });
 
       const options = {
+        animation: this.animationIsOpen,
         color: this.chartColor,
         grid: {
           top: "20%",
@@ -460,6 +482,7 @@ export default {
         };
       });
       return {
+        animation: this.animationIsOpen,
         grid: {
           top: "15%",
           bottom: "12%"

+ 0 - 89
src/modules/exports/QualityAnalysisExport.vue

@@ -1,89 +0,0 @@
-<template>
-  <div class="quality-analysis-export">
-    <div class="print-box">
-      <h1>阅卷质量分析</h1>
-      <div class="quality-info">
-        <p>科目:速写</p>
-        <p>开始时间:速写</p>
-        <p>结束时间:速写</p>
-      </div>
-      <div class="print-chart">
-        <div class="print-chart-title"></div>
-        <div class="print-chart-body"></div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import {
-  levelsPropReport,
-  deviationReport,
-  distanceReport,
-  callbackReport
-} from "@/api";
-// import EchartRender from "@/components/EchartRender";
-import { filterObjNull } from "@/plugins/utils";
-
-export default {
-  name: "quality-analysis-export",
-  // components: { EchartRender },
-  data() {
-    return {};
-  },
-  methods: {
-    parseGroupBarData(datas) {
-      if (!datas.length) {
-        return { names: [], dataList: [] };
-      }
-      var names = datas[0].data.map(function(item) {
-        return item.markerName;
-      });
-      var dataList = datas.map(function(item) {
-        return {
-          name: item.name,
-          data: item.data.map(function(elem) {
-            return elem.prop;
-          })
-        };
-      });
-      return {
-        names: names,
-        dataList: dataList
-      };
-    },
-    parseBarData(datas) {
-      var names = [];
-      var dataList = [];
-      datas.map(function(item, index) {
-        names[index] = item.userName;
-        dataList[index] = item.sumCount;
-      });
-      return {
-        names: names,
-        dataList: dataList
-      };
-    },
-    async toSearch() {
-      const datas = filterObjNull({
-        ...this.filter
-      });
-      const requests = [
-        levelsPropReport(datas),
-        deviationReport(datas),
-        distanceReport(datas),
-        callbackReport(datas)
-      ];
-      const data = await Promise.all(requests);
-
-      this.levelsPropReportData = this.parseGroupBarData(data[0]);
-
-      this.deviationReportData = this.parseBarData(data[1]);
-
-      this.distanceReportData = this.parseBarData(data[2]);
-
-      this.callbackReportData = this.parseBarData(data[3]);
-    }
-  }
-};
-</script>

+ 46 - 3
src/modules/grading/GradingDetail.vue

@@ -29,7 +29,12 @@
         </Form>
       </div>
       <div class="part-box-head-right" v-if="curStep.name === 'analysis'">
-        <Button shape="circle" type="success" icon="upload-white icon"
+        <Button
+          shape="circle"
+          type="success"
+          icon="upload-white icon"
+          @click="toExport"
+          :load="isDownload"
           >导出表格</Button
         >
       </div>
@@ -151,6 +156,14 @@
       @modified="leaderGradingSuccess"
       ref="ModifyLeaderGrading"
     ></modify-leader-grading>
+    <!-- grade-analysis-export -->
+    <grade-analysis-export
+      ref="GradeAnalysisExport"
+      :chart-data="renderChartData"
+      :page-info="renderPageInfo"
+      @on-exported="exportOver"
+      v-if="renderExportPage"
+    ></grade-analysis-export>
   </div>
 </template>
 
@@ -169,6 +182,7 @@ import GradeHistoryPaper from "./components/GradeHistoryPaper";
 import GradeAction from "./components/GradeAction";
 import GradeAnalysis from "./components/GradeAnalysis";
 import ModifyLeaderGrading from "./components/ModifyLeaderGrading";
+import GradeAnalysisExport from "./components/GradeAnalysisExport";
 // 三种情况:
 // 管理员(ADMIN),科组长(MARK_LEADER),评卷员(MARKER)
 // 管理员:标准卷,试卷列表,操作盘
@@ -186,7 +200,8 @@ export default {
     GradeStandardPaper,
     GradeAction,
     GradeAnalysis,
-    ModifyLeaderGrading
+    ModifyLeaderGrading,
+    GradeAnalysisExport
   },
   data() {
     return {
@@ -228,7 +243,12 @@ export default {
       carouselPapers: [],
       curCarouselPaperIndex: 0,
       beforeCarouselCurPaperIndex: 0,
-      isFullscreenMarking: false
+      isFullscreenMarking: false,
+      // export
+      renderExportPage: false,
+      renderChartData: {},
+      renderPageInfo: {},
+      isDownload: false
     };
   },
   computed: {
@@ -456,6 +476,29 @@ export default {
     carouseImagePreviewClose() {
       this.isFullscreenMarking = false;
       this.selectPaper(this.beforeCarouselCurPaperIndex);
+    },
+    // export
+    toExport() {
+      this.isDownload = true;
+      const curArea = this.areas.find(
+        item => item.id === this.filter.questionId
+      );
+      this.renderPageInfo = {
+        subjectName: this.$parent.curSubject.name,
+        areaName: curArea.areaName
+      };
+      this.renderChartData = {
+        levelData: this.$refs.GradeAnalysis.levelData,
+        lineChartData: this.$refs.GradeAnalysis.lineChartData
+      };
+      this.renderExportPage = true;
+    },
+    exportOver(result) {
+      if (!result) {
+        this.$Message.error("导出失败,请重新尝试!");
+      }
+      this.renderExportPage = false;
+      this.isDownload = false;
     }
   }
 };

+ 125 - 0
src/modules/grading/components/GradeAnalysisExport.vue

@@ -0,0 +1,125 @@
+<template>
+  <div class="grade-analysis-export analysis-export-modal">
+    <div class="print-box">
+      <h1>
+        分档详情数据
+      </h1>
+      <div class="quality-info">
+        <p>科目:{{ pageInfo.subjectName }}</p>
+        <p>考区:{{ pageInfo.areaName }}</p>
+        <p>截止时间:{{ currentTime }}</p>
+      </div>
+      <div class="print-chart">
+        <div class="print-chart-title">详细数值表:</div>
+        <table class="export-table">
+          <tr>
+            <th>科目</th>
+            <th>档位</th>
+            <th>范围</th>
+            <th>数量</th>
+            <th>占比</th>
+            <th>预设占比</th>
+            <th>差值</th>
+            <th>累计数量</th>
+            <th>累计占比</th>
+            <th>调整</th>
+          </tr>
+          <tr v-for="(item, index) in chartData.levelData" :key="index">
+            <td>{{ item.subjectName }}</td>
+            <td>{{ item.code }}</td>
+            <td>{{ item.minScore }} ~ {{ item.maxScore }}</td>
+            <td>{{ item.levelCount }}</td>
+            <td>{{ item.levelProp }}%</td>
+            <td>{{ item.examLevelProp }}%</td>
+            <td>{{ item.diffProp }}%</td>
+            <td>{{ item.cumulateCount }}</td>
+            <td>{{ item.cumulateProp }}%</td>
+            <td>{{ item.adjustmentCount }}</td>
+          </tr>
+        </table>
+      </div>
+      <div class="print-chart" v-if="chartData.lineChartData">
+        <div class="print-chart-title">档位分布曲线图:</div>
+        <div class="print-chart-body">
+          <echart-render
+            :chart-data="chartData.lineChartData"
+            :animation-is-open="false"
+            chart-type="line"
+            ref="lineChart"
+            v-if="!showImg"
+          ></echart-render>
+          <img src="" ref="lineChartImg" v-show="showImg" />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import EchartRender from "@/components/EchartRender";
+import { download, formatDate } from "@/plugins/utils";
+import html2canvas from "html2canvas";
+
+export default {
+  name: "grade-analysis-export",
+  components: { EchartRender },
+  props: {
+    chartData: {
+      type: Object,
+      default() {
+        return {};
+      }
+    },
+    pageInfo: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      currentTime: formatDate(),
+      showImg: false
+    };
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.$refs.lineChartImg.src = this.$refs.lineChart.getDataURL({
+        backgroundColor: "#fff"
+      });
+
+      this.showImg = true;
+      this.$nextTick(() => {
+        this.toExport();
+      });
+    });
+  },
+  methods: {
+    async toExport() {
+      const canvas = await html2canvas(this.$el.childNodes[0], {
+        allowTaint: true
+      }).catch(() => {});
+
+      if (!canvas) {
+        this.$emit("on-exported", false);
+        return;
+      }
+
+      let result = true;
+      await download({
+        type: "post",
+        url: `${this.GLOBAL.domain}/api/exportPdf`,
+        data: {
+          content: [canvas.toDataURL().split(",")[1]]
+        },
+        fileName: `${this.pageInfo.subjectName}-${this.pageInfo.areaName}-分档详情分析.pdf`
+      }).catch(() => {
+        result = false;
+      });
+
+      this.$emit("on-exported", result);
+    }
+  }
+};
+</script>

+ 2 - 1
src/modules/grading/components/ModifyLeaderGrading.vue

@@ -120,7 +120,8 @@ export default {
       }
       const datas = {
         action: this.actionType,
-        level: this.LevelInfo.selectedLevel
+        level: this.LevelInfo.selectedLevel,
+        originLevel: this.LevelInfo.curLevel
       };
       if (this.actionType === "reject")
         datas.range = this.selectedMarkers.join();

+ 8 - 8
src/modules/login/login.vue

@@ -114,14 +114,14 @@ export default {
       this.$ls.set("user", data, this.GLOBAL.authTimeout);
       this.$store.commit("setUser", data);
       // 初次登陆强制修改密码
-      // if (
-      //   data.role !== "ADMIN" &&
-      //   data.role != "INSPECTION" &&
-      //   !data.pwChangedCount
-      // ) {
-      //   this.$refs.ResetPwd.open();
-      //   return;
-      // }
+      if (
+        data.role !== "ADMIN" &&
+        data.role !== "INSPECTION" &&
+        !data.pwChangedCount
+      ) {
+        this.$refs.ResetPwd.open();
+        return;
+      }
 
       const params = {
         workId: data.workId,

+ 50 - 3
src/modules/main/QualityAnalysis.vue

@@ -54,6 +54,8 @@
           type="success"
           shape="circle"
           icon="upload-white icon"
+          :load="isDownload"
+          :disabled="!dataReady"
           @click="toExport"
           >导出表格</Button
         >
@@ -104,6 +106,14 @@
         </div>
       </Col>
     </Row>
+
+    <quality-analysis-export
+      ref="QualityAnalysisExport"
+      :chart-data="renderChartData"
+      :page-info="renderPageInfo"
+      @on-exported="exportOver"
+      v-if="renderExportPage"
+    ></quality-analysis-export>
   </div>
 </template>
 
@@ -117,11 +127,12 @@ import {
   areaList
 } from "@/api";
 import EchartRender from "@/components/EchartRender";
+import QualityAnalysisExport from "./components/QualityAnalysisExport";
 import { filterObjNull } from "@/plugins/utils";
 
 export default {
   name: "quality-analysis",
-  components: { EchartRender },
+  components: { EchartRender, QualityAnalysisExport },
   data() {
     return {
       filter: {
@@ -137,7 +148,13 @@ export default {
       deviationReportData: null,
       callbackReportData: null,
       subjects: [],
-      areas: []
+      areas: [],
+      dataReady: false,
+      // export
+      renderExportPage: false,
+      renderChartData: {},
+      renderPageInfo: {},
+      isDownload: false
     };
   },
   mounted() {
@@ -215,12 +232,42 @@ export default {
       this.distanceReportData = this.parseBarData(data[2]);
 
       this.callbackReportData = this.parseBarData(data[3]);
+
+      this.dataReady = true;
     },
     searchTimeChange(val) {
       this.filter.startTime = val[0] || null;
       this.filter.endTime = val[1] || null;
     },
-    toExport() {}
+    toExport() {
+      if (!this.dataReady) return;
+      const curSubject = this.subjects.find(
+        item => item.subject === this.filter.subject
+      );
+      const curArea = this.areas.find(
+        item => item.areaCode === this.filter.areaCode
+      );
+      this.renderPageInfo = {
+        subjectName: curSubject.name,
+        areaName: curArea.areaName,
+        startTime: this.filter.startTime || "无",
+        endTime: this.filter.endTime || "无"
+      };
+      this.renderChartData = {
+        levelsPropReportData: this.levelsPropReportData,
+        deviationReportData: this.deviationReportData,
+        distanceReportData: this.distanceReportData,
+        callbackReportData: this.callbackReportData
+      };
+      this.renderExportPage = true;
+    },
+    exportOver(result) {
+      if (!result) {
+        this.$Message.error("导出失败,请重新尝试!");
+      }
+      this.renderExportPage = false;
+      this.isDownload = false;
+    }
   }
 };
 </script>

+ 182 - 0
src/modules/main/components/QualityAnalysisExport.vue

@@ -0,0 +1,182 @@
+<template>
+  <div class="quality-analysis-export analysis-export-modal">
+    <div class="print-box">
+      <h1>
+        阅卷质量分析
+      </h1>
+      <div class="quality-info">
+        <p>科目:{{ pageInfo.subjectName }}</p>
+        <p>考区:{{ pageInfo.areaName }}</p>
+        <p>开始时间:{{ pageInfo.startTime }}</p>
+        <p>结束时间:{{ pageInfo.endTime }}</p>
+      </div>
+      <div class="print-chart" v-if="chartData.levelsPropReportData">
+        <div class="print-chart-body" v-if="!showImg">
+          <echart-render
+            chart-title="档位分布图"
+            :animation-is-open="false"
+            :chart-data="chartData.levelsPropReportData"
+            chart-type="barGroup"
+            ref="levelsPropChart"
+          ></echart-render>
+        </div>
+        <div
+          class="print-chart-body"
+          v-show="showImg && chartData.levelsPropReportData.names.length"
+        >
+          <div class="print-chart-title">档位分布图:</div>
+          <img src="" ref="levelsPropImg" />
+        </div>
+      </div>
+      <div class="print-chart" v-if="chartData.deviationReportData">
+        <div class="print-chart-body" v-if="!showImg">
+          <echart-render
+            chart-title="累计偏差"
+            :animation-is-open="false"
+            :chart-data="chartData.deviationReportData"
+            :chart-color="['#FF7786']"
+            chart-type="barReverse"
+            ref="deviationChart"
+          ></echart-render>
+        </div>
+        <div
+          class="print-chart-body"
+          v-show="showImg && chartData.deviationReportData.names.length"
+        >
+          <div class="print-chart-title">累计偏差:</div>
+          <img src="" ref="deviationImg" />
+        </div>
+      </div>
+    </div>
+    <div class="print-box">
+      <div class="print-chart" v-if="chartData.distanceReportData">
+        <div class="print-chart-body" v-if="!showImg">
+          <echart-render
+            chart-title="累计误差"
+            :animation-is-open="false"
+            :chart-data="chartData.distanceReportData"
+            :chart-color="['#22C0FF']"
+            chart-type="bar"
+            ref="distanceChart"
+          ></echart-render>
+        </div>
+        <div
+          class="print-chart-body"
+          v-show="showImg && chartData.distanceReportData.names.length"
+        >
+          <div class="print-chart-title">累计误差:</div>
+          <img src="" ref="distanceImg" />
+        </div>
+      </div>
+      <div class="print-chart" v-if="chartData.callbackReportData">
+        <div class="print-chart-body" v-if="!showImg">
+          <echart-render
+            chart-title="打回次数"
+            :animation-is-open="false"
+            :chart-data="chartData.callbackReportData"
+            :chart-color="['#41CD7D']"
+            chart-type="bar"
+            ref="callbackChart"
+          ></echart-render>
+        </div>
+        <div
+          class="print-chart-body"
+          v-show="showImg && chartData.callbackReportData.names.length"
+        >
+          <div class="print-chart-title">打回次数:</div>
+          <img src="" ref="callbackImg" />
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import EchartRender from "@/components/EchartRender";
+import { download } from "@/plugins/utils";
+import html2canvas from "html2canvas";
+
+export default {
+  name: "quality-analysis-export",
+  components: { EchartRender },
+  props: {
+    chartData: {
+      type: Object,
+      default() {
+        return {};
+      }
+    },
+    pageInfo: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      showImg: false
+    };
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.$refs.levelsPropImg.src = this.$refs.levelsPropChart.getDataURL({
+        backgroundColor: "#fff",
+        excludeComponents: ["toolbox "]
+      });
+      this.$refs.deviationImg.src = this.$refs.deviationChart.getDataURL({
+        backgroundColor: "#fff",
+        excludeComponents: ["toolbox "]
+      });
+      this.$refs.distanceImg.src = this.$refs.distanceChart.getDataURL({
+        backgroundColor: "#fff",
+        excludeComponents: ["toolbox "]
+      });
+      this.$refs.callbackImg.src = this.$refs.callbackChart.getDataURL({
+        backgroundColor: "#fff",
+        excludeComponents: ["toolbox "]
+      });
+
+      this.showImg = true;
+      this.$nextTick(() => {
+        this.toExport();
+      });
+    });
+  },
+  methods: {
+    async toExport() {
+      let fetchAll = [];
+      this.$el.childNodes.forEach(item => {
+        fetchAll.push(
+          html2canvas(item, {
+            allowTaint: true
+          })
+        );
+      });
+      const canvasList = await Promise.all(fetchAll).catch(() => {});
+      const contents = canvasList
+        .filter(canvas => canvas)
+        .map(canvas => canvas.toDataURL().split(",")[1]);
+
+      if (!contents.length) {
+        this.$emit("on-exported", false);
+        return;
+      }
+
+      let result = true;
+      await download({
+        type: "post",
+        url: `${this.GLOBAL.domain}/api/exportPdf`,
+        data: {
+          content: contents
+        },
+        fileName: `${this.pageInfo.subjectName}-${this.pageInfo.areaName}-阅卷质量分析.pdf`
+      }).catch(() => {
+        result = false;
+      });
+
+      this.$emit("on-exported", result);
+    }
+  }
+};
+</script>

+ 1 - 0
src/plugins/VueCharts.js

@@ -17,6 +17,7 @@ import "echarts/lib/chart/bar";
 import "echarts/lib/chart/line";
 // import "echarts/lib/chart/pie";
 // import "echarts/lib/chart/map";
+import "zrender/lib/svg/svg";
 // map
 // import "echarts/map/js/china";
 // import "echarts/map/js/china-contour";

+ 12 - 3
src/plugins/utils.js

@@ -61,7 +61,11 @@ function download(option) {
 
   return new Promise((resolve, reject) => {
     let xhr = new XMLHttpRequest();
-    xhr.open(opt.type.toUpperCase(), opt.url, true);
+    const requestType = opt.type.toUpperCase();
+    const IS_POST = requestType === "POST";
+    xhr.open(requestType, opt.url, true);
+    if (IS_POST)
+      xhr.setRequestHeader("Content-Type", "application/json;charset=utf-8");
     xhr.responseType = "blob";
 
     // header set
@@ -93,8 +97,13 @@ function download(option) {
       }
     };
 
-    if (opt.type.toUpperCase() === "POST") {
-      xhr.send(opt.data);
+    if (IS_POST) {
+      // let formData = new FormData();
+      // for (let key in opt.data) {
+      //   formData.append(key, opt.data[key]);
+      // }
+      // xhr.send(formData);
+      xhr.send(JSON.stringify(opt.data));
     } else {
       xhr.send();
     }

+ 19 - 0
yarn.lock

@@ -1673,6 +1673,11 @@ balanced-match@^1.0.0:
   resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
   integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
 
+base64-arraybuffer@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.2.0.tgz#4b944fac0191aa5907afe2d8c999ccc57ce80f45"
+  integrity sha1-S5RPrAGRqlkHr+LYyZnMxXzoD0U=
+
 base64-js@^1.0.2:
   version "1.3.1"
   resolved "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
@@ -2634,6 +2639,13 @@ css-declaration-sorter@^4.0.1:
     postcss "^7.0.1"
     timsort "^0.3.0"
 
+css-line-break@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npm.taobao.org/css-line-break/download/css-line-break-1.1.1.tgz#d5e9bdd297840099eb0503c7310fd34927a026ef"
+  integrity sha1-1em90peEAJnrBQPHMQ/TSSegJu8=
+  dependencies:
+    base64-arraybuffer "^0.2.0"
+
 css-loader@^3.4.2:
   version "3.5.3"
   resolved "https://registry.npm.taobao.org/css-loader/download/css-loader-3.5.3.tgz#95ac16468e1adcd95c844729e0bb167639eb0bcf"
@@ -4324,6 +4336,13 @@ html-webpack-plugin@^3.2.0:
     toposort "^1.0.0"
     util.promisify "1.0.0"
 
+html2canvas@^1.0.0-rc.5:
+  version "1.0.0-rc.5"
+  resolved "https://registry.npm.taobao.org/html2canvas/download/html2canvas-1.0.0-rc.5.tgz#4ee3cac9f6e20a0fa0c2f35a6f99c960ae7ec4c1"
+  integrity sha1-TuPKyfbiCg+gwvNab5nJYK5+xME=
+  dependencies:
+    css-line-break "1.1.1"
+
 htmlparser2@^3.3.0:
   version "3.10.1"
   resolved "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"