zhangjie 3 роки тому
батько
коміт
d759d5c442

+ 36 - 0
src/assets/styles/pages.scss

@@ -360,3 +360,39 @@
     margin-bottom: 40px;
   }
 }
+
+// paper-preview-dialog
+.paper-preview-dialog {
+  .paper-preview {
+    overflow: auto;
+    canvas {
+      display: block;
+      margin: 0 auto;
+    }
+  }
+  .preview-loading {
+    position: absolute;
+    top: 100px;
+    width: 100%;
+    z-index: auto;
+    font-size: 100px;
+    text-align: center;
+    color: #aaa;
+  }
+  .el-dialog__body {
+    padding: 70px 20px 80px !important;
+  }
+  .el-dialog__footer {
+    position: fixed;
+    width: 100%;
+    left: 0;
+    bottom: 0;
+    z-index: 9;
+    padding: 15px 20px;
+    border-top: 1px solid #eff0f5;
+    background-color: #fff;
+    .el-button {
+      float: none;
+    }
+  }
+}

+ 3 - 2
src/modules/customer/views/CustomerCard.vue

@@ -168,7 +168,8 @@
 <script>
 import pickerOptions from "@/constants/datePickerOptions";
 import { customerCardTaskList, customerPaperExport } from "../api";
-import { downloadBlob, randomCode } from "@/plugins/utils";
+import { randomCode } from "@/plugins/utils";
+import { downloadByApi } from "@/plugins/download";
 
 export default {
   name: "customer-card",
@@ -286,7 +287,7 @@ export default {
       }
 
       this.loading = true;
-      const res = await downloadBlob(() => {
+      const res = await downloadByApi(() => {
         return customerPaperExport({ ids: this.multipleSelection });
       }, `${randomCode()}.zip`).catch(() => {});
 

+ 3 - 2
src/modules/exam/components/PaperApproveTable.vue

@@ -175,7 +175,8 @@
 </template>
 
 <script>
-import { downloadBlob, parseTimeRangeDateAndTime } from "@/plugins/utils";
+import { parseTimeRangeDateAndTime } from "@/plugins/utils";
+import { downloadByApi } from "@/plugins/download";
 import { examTaskApproveForm, downloadExamTaskApproveForm } from "../api";
 
 export default {
@@ -324,7 +325,7 @@ export default {
         htmlContent: this.getHtmlContent(),
         examTaskId: this.instance.id
       };
-      const res = await downloadBlob(() => {
+      const res = await downloadByApi(() => {
         return downloadExamTaskApproveForm(datas);
       }, `${this.instance.courseName}-试卷审批表.pdf`).catch(() => {});
 

+ 2 - 2
src/modules/exam/views/TaskPaperManage.vue

@@ -206,7 +206,7 @@ import {
   paperAndCardBatchExport
 } from "../api";
 import pickerOptions from "@/constants/datePickerOptions";
-import { downloadBlob } from "@/plugins/utils";
+import { downloadByApi } from "@/plugins/download";
 import { CARD_SOURCE_TYPE } from "@/constants/enumerate";
 import ModifyTaskPaper from "../components/ModifyTaskPaper";
 import PublishPrintTask from "../components/PublishPrintTask";
@@ -332,7 +332,7 @@ export default {
       if (this.loading) return;
 
       this.loading = true;
-      const res = await downloadBlob(() => {
+      const res = await downloadByApi(() => {
         return downloadPaper(row.id);
       }, `${row.paperNumber}-${Date.now()}.zip`).catch(() => {});
 

+ 3 - 2
src/modules/print/views/BusinessDataExport.vue

@@ -189,7 +189,8 @@ import {
 } from "../api";
 import PreviewBusinessDetail from "../components/PreviewBusinessDetail";
 import UploadBusinessDataDialog from "../components/UploadBusinessDataDialog";
-import { downloadBlob, parseTimeRangeDateAndTime } from "@/plugins/utils";
+import { parseTimeRangeDateAndTime } from "@/plugins/utils";
+import { downloadByApi } from "@/plugins/download";
 import pickerOptions from "@/constants/datePickerOptions";
 
 export default {
@@ -316,7 +317,7 @@ export default {
       if (this.loading) return;
 
       this.loading = true;
-      const res = await downloadBlob(() => {
+      const res = await downloadByApi(() => {
         return businessTemplateDownload();
       }, `考务数据模板.xlsx`).catch(() => {});
 

+ 7 - 0
src/modules/stmms/api.js

@@ -6,3 +6,10 @@ export const markTaskListPage = datas => {
 export const uploadPaperAndAnswer = datas => {
   return $post("/api/admin/exam/structure/upload", datas);
 };
+// score-archive
+export const scoreListPage = datas => {
+  return $postParam("/api/admin/sys/user/user_list", datas);
+};
+export const scorePaperDetail = datas => {
+  return $postParam("/api/admin/sys/user/user_list", datas);
+};

+ 127 - 0
src/modules/stmms/components/PaperPreviewDialog.vue

@@ -0,0 +1,127 @@
+<template>
+  <el-dialog
+    class="paper-preview-dialog"
+    :visible.sync="modalIsShow"
+    :title="title"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    append-to-body
+    fullscreen
+    @open="visibleChange"
+  >
+    <div v-if="loading" class="preview-loading">
+      <i class="el-icon-loading"></i>
+    </div>
+    <div ref="PaperPreview" class="paper-preview"></div>
+
+    <div slot="footer">
+      <el-button type="primary" :disabled="loading" @click="toOrigin"
+        >实际大小</el-button
+      >
+      <el-button
+        type="primary"
+        :disabled="loading || rate >= maxScale"
+        @click="toMagnify"
+        >放大</el-button
+      >
+      <el-button
+        type="primary"
+        :disabled="loading || rate <= minScale"
+        @click="toShrink"
+        >缩小</el-button
+      >
+      <el-button type="success" :loading="loading" @click="toDownload"
+        >下载</el-button
+      >
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { buildCanvas, downloadPaper } from "./downloadPaper";
+import papers from "./paper";
+
+export default {
+  name: "modify-user",
+  props: {
+    instance: {
+      type: Object,
+      default() {
+        return {};
+      }
+    }
+  },
+  computed: {
+    title() {
+      return "试卷预览" + this.instance.studentName;
+    }
+  },
+  data() {
+    return {
+      modalIsShow: false,
+      loading: false,
+      papers: [],
+      rate: 1,
+      minScale: 0.5,
+      maxScale: 2,
+      canvas: null
+    };
+  },
+  methods: {
+    visibleChange() {
+      this.papers = papers;
+      this.rebuild();
+    },
+    cancel() {
+      this.modalIsShow = false;
+    },
+    open() {
+      this.modalIsShow = true;
+    },
+    async rebuild() {
+      this.loading = true;
+      this.canvas = null;
+      const canvas = await buildCanvas(papers, this.rate).catch(() => {});
+      if (!canvas) {
+        this.$message.error("试卷绘制错误!");
+        this.loading = false;
+        return;
+      }
+      const previewDom = this.$refs.PaperPreview;
+      previewDom.childNodes.forEach(node => {
+        previewDom.removeChild(node);
+      });
+      previewDom.appendChild(canvas);
+      this.canvas = canvas;
+      this.loading = false;
+    },
+    toOrigin() {
+      this.rate = 1;
+      this.rebuild();
+    },
+    toMagnify() {
+      const rate = this.rate * 1.2;
+      this.rate = rate >= this.maxScale ? this.maxScale : rate;
+      this.rebuild();
+    },
+    toShrink() {
+      const rate = this.rate * 0.75;
+      this.rate = rate <= this.minScale ? this.minScale : rate;
+      this.rebuild();
+    },
+    async toDownload() {
+      if (this.loading) return;
+      this.loading = true;
+      const filename = ``;
+      const res = await downloadPaper(this.papers, filename).catch(() => {});
+      this.loading = false;
+      if (!res) {
+        this.$message.error("下载失败,请重新尝试!");
+        return;
+      }
+
+      this.$message.success("下载成功!");
+    }
+  }
+};
+</script>

+ 25 - 11
src/modules/stmms/components/UploadPaperAnswerDialog.vue

@@ -10,9 +10,9 @@
     append-to-body
     @open="visibleChange"
   >
-    <el-form ref="modalFormComp" :model="infos" label-width="80px">
+    <el-form ref="modalFormComp" :model="infos" label-width="120px">
       <div v-for="paperType in paperTypes" :key="paperType" class="part-box">
-        <h3 class="part-box-title">{{ paperType }}</h3>
+        <h3 class="part-box-title">卷型{{ paperType }}</h3>
         <el-form-item
           v-for="(val, key) in fileTypes"
           :key="key"
@@ -85,13 +85,13 @@ export default {
       paperTypes: [],
       fileTypes: {
         subjectiveQuestion: {
-          name: "客观题",
+          name: "客观题试卷结构",
           downloadUrl: "111",
           downloadName: "客观题结构.xlsx",
           format: ["xlsx", "xls"]
         },
         objectiveQuestion: {
-          name: "主观题",
+          name: "主观题试卷结构",
           downloadUrl: "111",
           downloadName: "主观题答案.xlsx",
           format: ["xlsx", "xls"]
@@ -100,7 +100,12 @@ export default {
           name: "标答",
           format: ["pdf"]
         }
-      }
+      },
+      fileTypeSerial: [
+        "subjectiveQuestion",
+        "objectiveQuestion",
+        "standardAnswer"
+      ]
     };
   },
   methods: {
@@ -163,14 +168,23 @@ export default {
 
       let formData = new FormData();
       formData.append("id", this.instance.id);
-      Object.entries(this.infos).forEach(([paperType, vals], index) => {
-        const indexName = `files[${index}]`;
-        formData.append(`${indexName}.paperType`, paperType);
-        Object.keys(vals).forEach(typeKey => {
-          formData.append(`${indexName}.${typeKey}File`, vals[typeKey].file);
-          formData.append(`${indexName}.${typeKey}Md5`, vals[typeKey].md5);
+      let md5s = [];
+      Object.values(this.infos).forEach(vals => {
+        this.fileTypeSerial.forEach(typeKey => {
+          formData.append(`files`, vals[typeKey].file);
+          md5s.push(vals[typeKey].md5);
         });
       });
+      formData.append(`md5`, md5s.join());
+      formData.append(`paperType`, this.instance.paperType);
+      // Object.entries(this.infos).forEach(([paperType, vals], index) => {
+      //   const indexName = `files[${index}]`;
+      //   formData.append(`${indexName}.paperType`, paperType);
+      //   this.fileTypeSerial.forEach(typeKey => {
+      //     formData.append(`${indexName}.${typeKey}File`, vals[typeKey].file);
+      //     formData.append(`${indexName}.${typeKey}Md5`, vals[typeKey].md5);
+      //   });
+      // });
       const data = await uploadPaperAndAnswer(formData).catch(() => {});
       this.isSubmit = false;
       if (!data) return;

+ 120 - 0
src/modules/stmms/components/downloadPaper.js

@@ -0,0 +1,120 @@
+import { calcSum } from "@/plugins/utils";
+import { downloadByBlob } from "@/plugins/download";
+
+function loadPaper(url) {
+  return new Promise((resolve, reject) => {
+    const img = new Image();
+    img.crossOrigin = "";
+    img.onload = function() {
+      resolve([img.width, img.height]);
+    };
+    img.onerror = function(e) {
+      reject(e);
+    };
+    img.src = url;
+  });
+}
+async function initPapers(papers) {
+  const fetchAll = papers.map(paper => loadPaper(paper.url));
+  const res = await Promise.all(fetchAll).catch(() => {});
+
+  if (!res) {
+    return Promise.reject("图片初始化错误");
+  }
+
+  res.forEach((size, index) => {
+    papers[index].width = size[0];
+    papers[index].height = size[1];
+  });
+  return papers;
+}
+
+function drawPaper(ctx, paper, rate, preHeight) {
+  return new Promise((resolve, reject) => {
+    const img = new Image();
+    img.crossOrigin = "";
+    img.onload = function() {
+      ctx.drawImage(
+        img,
+        0,
+        preHeight * rate,
+        paper.width * rate,
+        paper.height * rate
+      );
+      const fontSize = Math.ceil(30 * rate);
+      ctx.font = `${fontSize}px '微软雅黑'`;
+      ctx.fillStyle = "#3a5ae5";
+      ctx.textBaseline = "top";
+
+      // 绘制轨迹
+      paper.track.forEach(trackItem => {
+        ctx.fillText(
+          trackItem.content,
+          trackItem.left * rate,
+          (trackItem.top + preHeight) * rate
+        );
+      });
+
+      resolve(true);
+    };
+    img.onerror = function() {
+      reject("图片绘制错误");
+    };
+    img.src = paper.url;
+  });
+}
+
+export async function buildCanvas(papers, rate = 1) {
+  rate = rate < 0.5 ? 0.5 : rate;
+  rate = rate > 2 ? 2 : rate;
+
+  const canvas = document.createElement("canvas");
+  const ctx = canvas.getContext("2d");
+
+  if (!canvas || !ctx) {
+    return Promise.reject("不支持预览!");
+  }
+
+  papers = await initPapers(papers).catch(() => {});
+  if (!papers) return Promise.reject("图片初始化错误");
+
+  const maxWidth = Math.max.apply(
+    null,
+    papers.map(paper => paper.width)
+  );
+  const maxHeight = calcSum(papers.map(paper => paper.height));
+
+  canvas.width = maxWidth * rate;
+  canvas.height = maxHeight * rate;
+
+  let preHeight = 0;
+  for (let index = 0; index < papers.length; index++) {
+    const paper = papers[index];
+    const dres = await drawPaper(ctx, paper, rate, preHeight).catch(() => {});
+    if (!dres) {
+      return Promise.reject("图片绘制错误");
+    }
+
+    preHeight += paper.height;
+  }
+
+  return canvas;
+}
+
+export async function downloadPaper(papers, filename) {
+  const canvas = await buildCanvas(papers, 1).catch(() => {});
+  if (!canvas) {
+    return Promise.reject("生成图片异常");
+  }
+
+  return new Promise((resolve, reject) => {
+    try {
+      canvas.toBlob(blob => {
+        downloadByBlob(blob, filename);
+        resolve(true);
+      });
+    } catch (error) {
+      reject(error);
+    }
+  });
+}

+ 164 - 0
src/modules/stmms/components/paper.js

@@ -0,0 +1,164 @@
+const papers = [
+  {
+    url: "https://t7.baidu.com/it/u=2621658848,3952322712&fm=193&f=GIF",
+    width: 0,
+    height: 0,
+    track: [
+      {
+        top: 30,
+        left: 56,
+        content: "2"
+      },
+      {
+        top: 80,
+        left: 120,
+        content: "3"
+      },
+      {
+        top: 120,
+        left: 120,
+        content: "4"
+      },
+      {
+        top: 140,
+        left: 150,
+        content: "5"
+      },
+      {
+        top: 200,
+        left: 120,
+        content: "6"
+      }
+    ]
+  },
+  {
+    url: "https://t7.baidu.com/it/u=3631608752,3069876728&fm=193&f=GIF",
+    width: 0,
+    height: 0,
+    track: [
+      {
+        top: 30,
+        left: 56,
+        content: "2"
+      },
+      {
+        top: 80,
+        left: 120,
+        content: "3"
+      },
+      {
+        top: 120,
+        left: 120,
+        content: "4"
+      },
+      {
+        top: 140,
+        left: 150,
+        content: "5"
+      },
+      {
+        top: 200,
+        left: 120,
+        content: "6"
+      }
+    ]
+  },
+  {
+    url: "https://t7.baidu.com/it/u=4080826490,615918710&fm=193&f=GIF",
+    width: 0,
+    height: 0,
+    track: [
+      {
+        top: 30,
+        left: 56,
+        content: "2"
+      },
+      {
+        top: 80,
+        left: 120,
+        content: "3"
+      },
+      {
+        top: 120,
+        left: 120,
+        content: "4"
+      },
+      {
+        top: 140,
+        left: 150,
+        content: "5"
+      },
+      {
+        top: 200,
+        left: 120,
+        content: "6"
+      }
+    ]
+  },
+  {
+    url: "https://t7.baidu.com/it/u=3713375227,571533122&fm=193&f=GIF",
+    width: 0,
+    height: 0,
+    track: [
+      {
+        top: 30,
+        left: 56,
+        content: "2"
+      },
+      {
+        top: 80,
+        left: 120,
+        content: "3"
+      },
+      {
+        top: 120,
+        left: 120,
+        content: "4"
+      },
+      {
+        top: 140,
+        left: 150,
+        content: "5"
+      },
+      {
+        top: 200,
+        left: 120,
+        content: "6"
+      }
+    ]
+  },
+  {
+    url: "https://t7.baidu.com/it/u=3694360626,2933607547&fm=193&f=GIF",
+    width: 0,
+    height: 0,
+    track: [
+      {
+        top: 30,
+        left: 56,
+        content: "2"
+      },
+      {
+        top: 80,
+        left: 120,
+        content: "3"
+      },
+      {
+        top: 120,
+        left: 120,
+        content: "4"
+      },
+      {
+        top: 140,
+        left: 150,
+        content: "5"
+      },
+      {
+        top: 200,
+        left: 120,
+        content: "6"
+      }
+    ]
+  }
+];
+
+export default papers;

+ 230 - 3
src/modules/stmms/views/ScoreArchive.vue

@@ -1,15 +1,242 @@
 <template>
   <div class="score-archive">
-    score-archive
+    <div class="part-box part-box-filter part-box-flex">
+      <el-form ref="FilterForm" label-position="left" inline>
+        <template v-if="!checkPrivilege('condition', 'condition')">
+          <el-form-item label="考试时间:">
+            <el-select
+              v-model="filter.semester"
+              placeholder="考试时间"
+              filterable
+              clearable
+            >
+              <el-option
+                v-for="item in semesters"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="学院:">
+            <el-select
+              v-model="filter.collegeId"
+              placeholder="学院"
+              filterable
+              clearable
+            >
+              <el-option
+                v-for="item in colleges"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="专业:">
+            <el-select
+              v-model="filter.subjectId"
+              placeholder="专业"
+              filterable
+              clearable
+            >
+              <el-option
+                v-for="item in subjects"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="班级:">
+            <el-select
+              v-model="filter.clazzId"
+              placeholder="班级"
+              filterable
+              clearable
+            >
+              <el-option
+                v-for="item in clazzes"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="课程:">
+            <el-select
+              v-model="filter.courseCode"
+              placeholder="课程"
+              filterable
+              clearable
+            >
+              <el-option
+                v-for="item in courses"
+                :key="item.id"
+                :value="item.id"
+                :label="item.name"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </template>
+        <el-form-item label-width="0px">
+          <el-button
+            v-if="!checkPrivilege('button', 'select')"
+            type="primary"
+            @click="toPage(1)"
+            >查询</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div class="part-box-action">
+        <el-button
+          v-if="!checkPrivilege('button', 'downloadAll')"
+          type="primary"
+          icon="el-icon-refresh"
+          :loading="loading"
+          @click="toDownloadAll"
+          >一键下载</el-button
+        >
+        <el-button
+          v-if="!checkPrivilege('button', 'export')"
+          type="primary"
+          icon="el-icon-circle-plus-outline"
+          @click="toExport"
+          >成绩导出</el-button
+        >
+      </div>
+    </div>
+
+    <div class="part-box part-box-pad">
+      <el-table ref="TableList" :data="dataList">
+        <el-table-column
+          type="index"
+          label="序号"
+          width="70"
+          :index="indexMethod"
+        ></el-table-column>
+        <el-table-column prop="examTime" label="考试时间"></el-table-column>
+        <el-table-column
+          prop="realName"
+          label="姓名"
+          width="120"
+        ></el-table-column>
+        <el-table-column prop="studentNo" label="学号"></el-table-column>
+        <el-table-column prop="college" label="院系"></el-table-column>
+        <el-table-column prop="college" label="专业"></el-table-column>
+        <el-table-column prop="college" label="班级"></el-table-column>
+        <el-table-column prop="college" label="课程名"></el-table-column>
+        <el-table-column prop="college" label="成绩"></el-table-column>
+        <el-table-column class-name="action-column" label="操作" width="160px">
+          <template slot-scope="scope">
+            <el-button
+              v-if="!checkPrivilege('link', 'view')"
+              class="btn-primary"
+              type="text"
+              @click="toViewPaper(scope.row)"
+              >查看原卷</el-button
+            >
+            <el-button
+              v-if="!checkPrivilege('link', 'download')"
+              class="btn-danger"
+              type="text"
+              :loading="downloading"
+              @click="toDownload(scope.row)"
+              >下载</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="part-page">
+        <el-pagination
+          background
+          layout="total,prev, pager, next"
+          :current-page="current"
+          :total="total"
+          :page-size="size"
+          @current-change="toPage"
+        >
+        </el-pagination>
+      </div>
+    </div>
+
+    <PaperPreviewDialog ref="PaperPreviewDialog" :instance="curRow" />
   </div>
 </template>
 
 <script>
+import { scoreListPage } from "../api";
+import PaperPreviewDialog from "../components/PaperPreviewDialog";
+import { downloadPaper } from "../components/downloadPaper";
+
 export default {
   name: "score-archive",
+  components: { PaperPreviewDialog },
   data() {
-    return {};
+    return {
+      filter: {
+        semester: "",
+        collegeId: "",
+        subjectId: "",
+        clazzId: "",
+        courseCode: ""
+      },
+      current: 1,
+      size: this.GLOBAL.pageSize,
+      total: 0,
+      dataList: [],
+      semesters: [],
+      colleges: [],
+      subjects: [],
+      clazzes: [],
+      courses: [],
+      curRow: {},
+      curPapers: [],
+      downloading: false,
+      loading: false
+    };
   },
-  methods: {}
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      if (!this.checkPrivilege("list", "list")) return;
+      const datas = {
+        ...this.filter,
+        pageNumber: this.current,
+        pageSize: this.size
+      };
+      const data = await scoreListPage(datas);
+      this.dataList = data.records;
+      this.total = data.total;
+    },
+    toPage(page) {
+      this.current = page;
+      this.getList();
+    },
+    toDownloadAll() {},
+    toExport() {
+      this.$refs.PaperPreviewDialog.open();
+    },
+    toViewPaper(row) {
+      this.curRow = row;
+      this.$refs.PaperPreviewDialog.open();
+    },
+    async toDownload(row) {
+      if (!this.downloading) return;
+      this.downloading = true;
+      const papers = row.papers;
+      const filename = ``;
+      const res = await downloadPaper(papers, filename).catch(() => {});
+      this.downloading = false;
+      if (!res) {
+        this.$message.error("下载失败,请重新尝试!");
+        return;
+      }
+
+      this.$message.success("下载成功!");
+    }
+  }
 };
 </script>

+ 53 - 0
src/plugins/download.js

@@ -0,0 +1,53 @@
+/**
+ * 通过api下载文件
+ * @param {AxiosPromise} fetchFunc 下载接口
+ * @param {String}} fileName 文件名
+ * @returns boolean
+ */
+export function downloadByApi(fetchFunc, fileName) {
+  return fetchFunc()
+    .then(res => {
+      const filename =
+        fileName || parseDownloadFilename(res.headers["content-disposition"]);
+      downloadByBlob(new Blob([res.data]), filename);
+      return true;
+    })
+    .catch(() => {
+      return Promise.reject();
+    });
+}
+
+/**
+ * 下载blob
+ * @param {Blob} data blob对象
+ * @param {String} filename 文件名
+ */
+export function downloadByBlob(data, filename) {
+  const blobUrl = URL.createObjectURL(data);
+  const tempLink = document.createElement("a");
+  tempLink.style.display = "none";
+  tempLink.href = blobUrl;
+  tempLink.setAttribute("download", filename);
+  if (tempLink.download === "undefined") {
+    tempLink.setAttribute("target", "_blank");
+  }
+  document.body.appendChild(tempLink);
+  tempLink.click();
+  document.body.removeChild(tempLink);
+  window.URL.revokeObjectURL(blobUrl);
+}
+
+const parseDownloadFilename = dispositionInfo => {
+  if (!dispositionInfo) return;
+
+  const strs = dispositionInfo.split(";");
+  let filename = "";
+  strs
+    .map(item => item.split("="))
+    .find(item => {
+      if (item[0].indexOf("filename") !== -1) {
+        filename = decodeURI(item[1]);
+      }
+    });
+  return filename;
+};

+ 0 - 20
src/plugins/utils.js

@@ -108,26 +108,6 @@ export function download(option) {
   });
 }
 
-/**
- * 文件流下载
- * @param {Function} fetchFunc 下载程序,返回promise
- * @param {String} fileName 保存的文件名
- */
-export async function downloadBlob(fetchFunc, fileName) {
-  const res = await fetchFunc().catch(() => {});
-  if (!res) return;
-
-  const blobUrl = URL.createObjectURL(new Blob([res.data]));
-  let a = document.createElement("a");
-  a.download = fileName;
-  a.href = blobUrl;
-  document.body.appendChild(a);
-  a.click();
-  a.parentNode.removeChild(a);
-
-  return true;
-}
-
 // function toDataURL(url) {
 //   return fetch(url)
 //     .then(response => {