From b99738f4e8c69700beff0fb7d3e64dcd0ba00f04 Mon Sep 17 00:00:00 2001 From: yujialong <479214531@qq.com> Date: Mon, 27 Nov 2023 13:55:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B5=9B=E4=BA=8B=E6=88=90=E7=BB=A9=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=88=97=E8=A1=A8=E5=AF=BC=E5=87=BA=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=E5=8C=85=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 35 +++++++++++-- package.json | 2 + src/api/index.js | 1 + src/libs/zip.js | 56 +++++++++++++++++++++ src/pages/match/manage/matchArchList.vue | 63 ++++++++++++++---------- src/pages/station/preview/index.vue | 4 -- 6 files changed, 127 insertions(+), 34 deletions(-) create mode 100644 src/libs/zip.js diff --git a/package-lock.json b/package-lock.json index b703907..f2f3506 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4694,6 +4694,11 @@ "schema-utils": "^1.0.0" } }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "filesize": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", @@ -6916,6 +6921,11 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", @@ -7511,6 +7521,17 @@ "verror": "1.10.0" } }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -7550,6 +7571,14 @@ "invert-kv": "^2.0.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "liftoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", @@ -8984,8 +9013,7 @@ "pako": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" }, "parallel-transform": { "version": "1.2.0", @@ -11157,8 +11185,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { "version": "1.1.1", diff --git a/package.json b/package.json index 836d61f..bfd58ad 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,9 @@ "echarts": "^4.8.0", "element-theme": "^2.0.1", "element-ui": "^2.13.0", + "file-saver": "^2.0.5", "js-cookie": "^2.2.1", + "jszip": "^3.10.1", "mavon-editor": "^2.10.4", "postcss-px2rem": "^0.3.0", "px2rem-loader": "^0.1.9", diff --git a/src/api/index.js b/src/api/index.js index fff3fa3..3b859dd 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -253,6 +253,7 @@ export default { frontOfficeCompetitionRanking: `competition/competition/rank/frontOfficeCompetitionRanking`, cCompetitionStageFileList: `competition/cCompetitionStageFile/listByEntity`, derive: `${host}competition/cCompetitionStageFile/deriveAll`, + allExperimentalResultsAreDerived: `${host}competition/competition/performance/allExperimentalResultsAreDerived`, gradeImport: `https://www.occupationlab.com/template/赛事成绩导入模板.xlsx`, rankImportTeam: `https://www.occupationlab.com/template/赛事排名导入模板(团队赛).xlsx`, rankImportPerson: `https://www.occupationlab.com/template/赛事排名导入模板(个人赛).xlsx`, diff --git a/src/libs/zip.js b/src/libs/zip.js new file mode 100644 index 0000000..14f57d7 --- /dev/null +++ b/src/libs/zip.js @@ -0,0 +1,56 @@ +// 导出压缩包 +import JSZip from 'jszip' +import FileSaver from 'file-saver' + +//文件以流的形式获取(参数url为文件链接地址) +const getImgArrayBuffer = url => { + return new Promise((resolve, reject) => { + //通过请求获取文件blob格式 + let xmlhttp = new XMLHttpRequest(); + xmlhttp.open('GET', url, true); + xmlhttp.responseType = 'blob' + xmlhttp.onload = function () { + if (xmlhttp.status == 200) { + resolve(xmlhttp.response); + } else { + reject(xmlhttp.response); + } + }; + xmlhttp.send(); + }); +} + +/** + * @param {String} zipName 压缩包名字 + * @param {Array} files 需要压缩的文件数组 + * @param {Function | undefined} callback 回调 + */ +export default function (zipName, files, callback) { + var zip = new JSZip(); + var promises = []; + let cache = {}; + for (let item of files) { + // item.filePath为文件链接地址 + // item.fileName为文件名称 + if(item.filePath) { + const promise = getImgArrayBuffer(item.filePath).then((data) => { + // 下载文件, 并存成ArrayBuffer对象(blob) + zip.file(item.fileName, data, { binary: true }); // 逐个添加文件 + cache[item.fileName] = data; + }); + promises.push(promise); + } else { + // 地址不存在时提示 + console.log(`附件${item.fileName}地址错误,下载失败`); + } + } + Promise.all(promises).then(() => { + zip.generateAsync({ type: "blob" }).then((content) => { + // 生成二进制流 + FileSaver.saveAs(content, zipName); // 利用file-saver保存文件 zipName: 自定义文件名 + callback && callback() + }); + }).catch((res) => { + console.log("文件压缩失败"); + }); +} diff --git a/src/pages/match/manage/matchArchList.vue b/src/pages/match/manage/matchArchList.vue index f356459..31502c3 100644 --- a/src/pages/match/manage/matchArchList.vue +++ b/src/pages/match/manage/matchArchList.vue @@ -262,6 +262,7 @@ import Setting from "@/setting"; import util from "@/libs/util"; import * as echarts from "echarts"; import axios from 'axios'; +import Zip from '@/libs/zip' export default { data () { return { @@ -368,40 +369,50 @@ export default { }, // 导出(有勾选:就导勾选中的;没有勾选:就导全部) exportData () { - // 有勾选,就带上勾选的id + // 有选择数据,则导出已选择的,否则导出全部 if (this.multipleSelection.length) { - const ids = this.multipleSelection.map(e => e.reportId) - url += `&ids=${ids.toString()}` + axios.post(this.api.exportExperimentalResultsInBatch, this.multipleSelection, { + headers: this.headers, + responseType: 'blob' + }).then((res) => { + util.downloadFileDirect(`赛事成绩.xls`, new Blob([res.data])) + }).catch(res => { }) + } else if (this.list.length) { + axios.post(this.api.allExperimentalResultsAreDerived, { + pageNum: 1, + pageSize: 10000, + competitionId: this.id, + isNakadai: 0, + stageId: this.stageId, + }, { + headers: this.headers, + responseType: 'blob' + }).then((res) => { + util.downloadFileDirect(`赛事成绩.xls`, new Blob([res.data])) + }).catch(res => { }) } - axios.post(this.api.exportExperimentalResultsInBatch, this.list, { - headers: this.headers, - responseType: 'blob' - }).then((res) => { - util.downloadFileDirect(`赛事成绩.xls`, new Blob([res.data])) - }).catch(res => { }) + + // let { list } = this + // if (this.multipleSelection.length) { + // list = this.multipleSelection + // } + // axios.post(this.api.exportExperimentalResultsInBatch, list, { + // headers: this.headers, + // responseType: 'blob' + // }).then((res) => { + // util.downloadFileDirect(`赛事成绩.xls`, new Blob([res.data])) + // }).catch(res => { }) }, // 导出(有勾选:就导勾选中的;没有勾选:就导全部) exportData1 () { - // 有勾选,就带上勾选的id - let ids + this.loading = true + let list = this.list1 if (this.multipleSelection1.length) { - ids = this.multipleSelection1.map(e => e.id) - } - const data = { - pageNum: 1, - pageSize: 1000, - competitionId: this.id, - stageId: this.stageId, + list = this.multipleSelection1 } - if (ids) data.ids = ids - this.loading = true - axios.post(this.api.derive, data, { - headers: this.headers, - responseType: 'blob' - }).then((res) => { - util.downloadFileDirect(`批量导出.zip`, new Blob([res.data])) + Zip('批量导出', list, () => { this.loading = false - }).catch(res => { }) + }) }, handleDelete (row) { // 删除 this.$confirm("确定要删除吗?", "提示", { diff --git a/src/pages/station/preview/index.vue b/src/pages/station/preview/index.vue index b02bdf3..ff7e2e5 100644 --- a/src/pages/station/preview/index.vue +++ b/src/pages/station/preview/index.vue @@ -993,10 +993,6 @@ export default { } else if (systemId == 19) { // 沙盘 location.href = `${Setting.sandPath}/#/?curriculumName=${this.curriculumName}&token=${token}&cid=${this.courseId}&mallId=${this.mallId}&systemId=${this.systemIds}&projectId=${this.curProject}&assessmentId=&classId=&stopTime=&manager=1&referrer=${encodeURIComponent(location.href)}` - } else if (systemId == 21) { - window.open(`http://121.37.29.24:80/yyyflogin?userId=${this.userId}&userName=${userName}&userType=${roleId}&reqType=1&reqId=3989a0ad671849b99dcbdcc208782333&caseId=9681f86902314b10bc752909121f9ab9&authorization=87DIVy348Oxzj3ha&classId=1876&courserId=7ff5d4715b114b7398b6f26c20fac460`); - } else if (systemId == 22) { - window.open(`https://danbao.czcyedu.com/#/loginFromYyyf?userId=${this.userId}&userName=${userName}&userType=${roleId}&reqType=1&reqId=eb7d8355119d449184c548b07dc01ed9&caseId=1198241070647873538&authorization=87DIVy348Oxzj3ha&classId=1876&courserId=faaedd82adb9444285a5785e4a3dd4f9`); } else { // python系统 this.toPython(this.curProject)