From d60b5adb62fb7a176c96a645cc38b83e7da87af4 Mon Sep 17 00:00:00 2001
From: pan <380711010@qq.com>
Date: Sat, 7 Sep 2024 20:52:35 +0800
Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=B7=A6=E4=BE=A7=E8=8F=9C=E5=8D=95?=
=?UTF-8?q?=E6=A0=91=E5=92=8C=E6=8C=89=E9=92=AE=E6=A0=B7=E5=BC=8F=E8=B0=83?=
=?UTF-8?q?=E6=95=B4=202=E3=80=81=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?=
=?UTF-8?q?=E5=A4=B9=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4=203=E3=80=81?=
=?UTF-8?q?=E6=96=87=E6=A1=A3=E5=B7=A5=E5=85=B7=E8=AF=A6=E6=83=85=E6=96=B0?=
=?UTF-8?q?=E5=A2=9E=E9=A2=84=E8=A7=88=204=E3=80=81=E6=89=80=E6=9C=89?=
=?UTF-8?q?=E7=9A=84=E9=A2=84=E8=A7=88=E5=8A=9F=E8=83=BD=E6=96=B0=E5=A2=9E?=
=?UTF-8?q?=E9=81=AE=E7=BD=A9=E5=A4=84=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../FileUpload/optimizeToolUpload.vue | 315 +++++++++++++++---
src/layout/components/Navbar.vue | 4 +-
src/views/document/detail.vue | 3 +-
src/views/document/downloadFileDetail.vue | 2 +-
src/views/document/editDocument.vue | 11 +-
src/views/filestatistic/index.vue | 1 -
src/views/message/index.vue | 4 +
src/views/tool/downloadFileDetail.vue | 3 +-
src/views/tool/toolDetail.vue | 2 +-
.../workflowList/addWorkflow/tool_release.vue | 15 +-
10 files changed, 296 insertions(+), 64 deletions(-)
diff --git a/src/components/FileUpload/optimizeToolUpload.vue b/src/components/FileUpload/optimizeToolUpload.vue
index 4ec4efe..a13e58a 100644
--- a/src/components/FileUpload/optimizeToolUpload.vue
+++ b/src/components/FileUpload/optimizeToolUpload.vue
@@ -4,7 +4,7 @@
:before-upload="beforeUpload"
:on-change="onChange"
:on-remove="handleRemove"
- :multiple="isMultiple"
+ :multiple="false"
:on-exceed="handleExceed"
:accept="acceptType"
:file-list="fileList"
@@ -18,11 +18,7 @@
-
-
-
@@ -34,7 +30,6 @@ import axios from 'axios'
import {
getToken
} from "@/utils/auth";
-import JSZip from 'jszip'
export default {
props: {
@@ -96,6 +91,8 @@ export default {
uploadedNum: 0,
_shardCount: null, //是否最后一片
isFolder: false,
+ totalFiles: 0, // 总文件数量
+ uploadedCount: 0, // 已上传文件数量
};
},
watch: {
@@ -196,38 +193,42 @@ export default {
});
})
} else {
- self.uploadedNum = 0
- file._shardCount = Math.ceil(file.size / this.partSize) //总片数
- file.uploaded = 0
- let formData = new FormData()
- formData.append('fileName', file.name)
- //大文件上传初始化,返回uploadId initUpload(formData)
- axios({
- url: process.env.VUE_APP_BASE_API + "/common/initUpload",
- method: 'post',
- data: formData,
- headers: {
- 'Authorization': 'Bearer ' + getToken(),
- 'Content-Type': 'multipart/form-data'
- },
- }).then(function (res) {
- if (res.status == 200) {
- //从第0块开始上传
- file.uploadId = res.data.uploadId
- file.objectKey = res.data
- file.chunkId = 0
- self.uploadByChunk(file)
- } else {
- this.progress--
- self.$message.error(res.msg)
- }
- }).catch(error => {
- self.progressPercent = 0
- self.progressFlag = false;
- console.error(error)
- })
+ self.uploadIdSharding(file);
}
+ },
+ uploadIdSharding(file){
+ let self = this
+ self.uploadedNum = 0
+ file._shardCount = Math.ceil(file.size / this.partSize) //总片数
+ file.uploaded = 0
+ let formData = new FormData()
+ formData.append('fileName', file.name)
+ //大文件上传初始化,返回uploadId initUpload(formData)
+ axios({
+ url: process.env.VUE_APP_BASE_API + "/common/initUpload",
+ method: 'post',
+ data: formData,
+ headers: {
+ 'Authorization': 'Bearer ' + getToken(),
+ 'Content-Type': 'multipart/form-data'
+ },
+ }).then(function (res) {
+ if (res.status == 200) {
+ //从第0块开始上传
+ file.uploadId = res.data.uploadId
+ file.objectKey = res.data
+ file.chunkId = 0
+ self.uploadByChunk(file)
+ } else {
+ this.progress--
+ self.$message.error(res.msg)
+ }
+ }).catch(error => {
+ self.progressPercent = 0
+ self.progressFlag = false;
+ console.error(error)
+ })
},
//分片上传大文件
uploadByChunk(file) {
@@ -254,7 +255,6 @@ export default {
'Authorization': 'Bearer ' + getToken(),
'Content-Type': 'multipart/form-data'
},
-
}).then(response => {
if (response.status == 200) {
//判断返回的MD5值是否一致,一致继续传下一块,否则重传本块(这里目前前后端MD5一直不一致,暂时先注释掉,有时间了我再研究一下)
@@ -327,6 +327,7 @@ export default {
})
}
},
+
resetData() {
this.progress = 0;
},
@@ -346,7 +347,6 @@ export default {
},
/** 清空文件 **/
clearFile(){
- this.progressFlag = false;
if(this.$refs.upload){
this.$refs.upload.clearFiles();
}
@@ -357,7 +357,7 @@ export default {
document.getElementById("fileFolder").value = null;
this.$refs.fileRef.dispatchEvent(new MouseEvent("click"));
},
- async handleFolderUpload(event) {
+/* async handleFolderUpload(event) {
let self = this;
self.isFolder = true
const files = event.target.files;
@@ -376,17 +376,236 @@ export default {
}
await self.uploadFile(temp);
}
- /* console.info("files=========", files)
- let fileListTemp = []
- for(let item of files){
- fileListTemp.push(item);
+ }, */
+
+ /* // 处理文件夹上传
+ async handleFolderUpload(event) {
+ const files = event.target.files;
+ this.isFolder = true;
+ this.progressFlag = true;
+
+ if (files.length === 0) {
+ this.$message.warning('没有选择文件');
+ return;
+ }
+
+ let successCount = 0;
+ let failCount = 0;
+ for (const file of files) {
+ try {
+ await this.uploadFolderFile({ file });
+ successCount++;
+ } catch (error) {
+ failCount++;
+ }
+ }
+
+ this.$message.success(`上传完成!成功:${successCount},失败:${failCount}`);
+ this.progressFlag = false;
+ this.progressPercent = 0;
+ }, */
+ // 单个文件上传
+ uploadFolderFile({ data, file }) {
+ let self = this
+ //初始化参数
+ if (file.size < this.partSize) {
+ return new Promise((resolve, reject) => {
+ const formData = new FormData();
+ formData.append("file", file);
+ this.progressFlag = true;
+
+ axios({
+ url: self.uploadUrl,
+ method: 'post',
+ data: formData,
+ headers: {
+ 'Authorization': 'Bearer ' + getToken(),
+ 'Content-Type': 'multipart/form-data'
+ },
+ /* onUploadProgress: progressEvent => {
+ this.progressPercent = ((progressEvent.loaded / progressEvent.total) * 100) | 0;
+ } */
+ }).then(res => {
+ setTimeout(() => {
+ if (res.data.code === 200) {
+ // self.progressFlag = false;
+ // self.progressPercent = 0;
+ self.handleResult(res,file);
+ resolve(); // 上传成功后,调用 resolve
+ } else {
+ // self.progressFlag = false;
+ self.$message.error(file.name + '上传失败!');
+ reject(); // 上传失败时调用 reject
+ }
+ }, 500);
+ }).catch(error => {
+ // self.progressFlag = false;
+ // self.progressPercent = 0;
+ self.$message.error(file.name + '上传失败!');
+ reject(error); // 上传失败时调用 reject
+ });
+ });
+ }else{
+ return new Promise((resolve, reject) => {
+ self.uploadIdShardingFolder(file)
+ .then(() => {
+ resolve(); // 上传成功,继续下一个文件
+ })
+ .catch(error => {
+ reject(error); // 上传失败,触发 reject
+ });
+ });
}
- self.fileList = fileListTemp; */
- /* files.for()
- self.onChange(null, files); */
- // self.fileList = files;
- // this.$refs.fileRef.value = null;
},
+
+
+ async handleFolderUpload(event) {
+ const files = Array.from(event.target.files);
+ this.totalFiles = files.length;
+ this.uploadedCount = 0;
+ this.progressFlag = true;
+ let failCount = 0;
+ for (let i = 0; i < files.length; i++) {
+ try {
+ await this.uploadFolderFile(
+ {
+ data: null,
+ file: files[i]
+ }
+ );
+ this.uploadedCount++;
+ this.updateProgress();
+ } catch (error) {
+ failCount++;
+ }
+ }
+ this.$message.success('上传完成!成功:' + this.uploadedCount+',失败:' + failCount);
+ this.progressFlag = false;
+ this.progressPercent = 0;
+ },
+ updateProgress() {
+ if (this.uploadedCount === this.totalFiles) {
+ this.progressPercent = 100;
+ } else {
+ this.progressPercent = Math.min(100, Math.floor((this.uploadedCount / this.totalFiles) * 100));
+ }
+/*
+ if (this.uploadedCount % 10 === 0 || this.uploadedCount === this.totalFiles) {
+ this.$message.success(`已上传 ${this.uploadedCount} 个文件`);
+ } */
+ },
+
+ // 初始化分片上传
+ uploadIdShardingFolder(file) {
+ let self = this
+ return new Promise((resolve, reject) => {
+ file._shardCount = Math.ceil(file.size / this.partSize); // 总片数
+ file.uploaded = 0;
+
+ const formData = new FormData();
+ formData.append('fileName', file.name);
+
+ // 大文件上传初始化, 返回 uploadId
+ axios({
+ url: process.env.VUE_APP_BASE_API + "/common/initUpload",
+ method: 'post',
+ data: formData,
+ headers: {
+ 'Authorization': 'Bearer ' + getToken(),
+ 'Content-Type': 'multipart/form-data'
+ },
+ }).then(res => {
+ if (res.status === 200) {
+ file.uploadId = res.data.uploadId;
+ file.chunkId = 0;
+ this.uploadByChunkFolder(file)
+ .then(() => resolve()) // 全部分片上传完成,返回 resolve
+ .catch(error => reject(error)); // 分片上传出错,返回 reject
+ } else {
+ reject(new Error('初始化上传失败'));
+ }
+ }).catch(error => {
+ reject(error);
+ });
+ });
+ },
+
+ // 分片上传逻辑
+ uploadByChunkFolder(file) {
+ let self = this
+ return new Promise((resolve, reject) => {
+ const uploadChunk = (chunkId) => {
+ const _start = chunkId * this.partSize;
+ const _end = Math.min(file.size, _start + this.partSize);
+ const fileData = file.slice(_start, _end);
+
+ const form1 = new FormData();
+ form1.append('chunkFile', fileData);
+ form1.append('uploadId', file.uploadId);
+ form1.append('chunkId', (chunkId + 1).toString());
+ form1.append('shardCount', file._shardCount.toString());
+
+ axios({
+ url: process.env.VUE_APP_BASE_API + "/common/uploadChunk",
+ method: 'post',
+ data: form1,
+ headers: {
+ 'Authorization': 'Bearer ' + getToken(),
+ 'Content-Type': 'multipart/form-data'
+ },
+ }).then(response => {
+ if (response.status === 200) {
+ file.uploadedNum++;
+ // const percent = Math.floor((file.uploadedNum / file._shardCount) * 100);
+ // this.percentageSend(file, percent);
+ if (chunkId + 1 < file._shardCount) {
+ // 继续上传下一片
+ uploadChunk(chunkId + 1);
+ } else {
+ // 所有分片上传完成,合并文件
+ this.mergeFileFolder(file).then(() => resolve()).catch(error => reject(error));
+ }
+ } else {
+ reject(new Error('分片上传失败'));
+ }
+ }).catch(error => {
+ reject(error);
+ });
+ };
+
+ // 从第0块开始上传
+ uploadChunk(0);
+ });
+ },
+
+ // 合并文件
+ mergeFileFolder(file) {
+ let self = this
+ return new Promise((resolve, reject) => {
+ const form2 = new FormData();
+ form2.append('uploadId', file.uploadId);
+ form2.append('fileName', file.name);
+
+ axios({
+ url: process.env.VUE_APP_BASE_API + "/common/mergeFile",
+ method: 'post',
+ data: form2,
+ headers: {
+ 'Authorization': 'Bearer ' + getToken(),
+ 'Content-Type': 'multipart/form-data'
+ },
+ }).then(res => {
+ if (res.status === 200) {
+ self.handleResult(res,file);
+ resolve(); // 合并成功
+ } else {
+ reject(new Error('文件合并失败'));
+ }
+ }).catch(error => {
+ reject(error);
+ });
+ });
+ }
}
};
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 6a35b7f..df028f6 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -97,9 +97,9 @@ export default {
})
}).catch(() => {});
},
- // 跳转到购物车
+ // 跳转到消息中心
toMyCartPage() {
- this.$router.push({ path: '/message' })
+ this.$router.push({ path: '/message', query: {'states':'1'} })
},
}
}
diff --git a/src/views/document/detail.vue b/src/views/document/detail.vue
index 0a44b54..fe72b94 100644
--- a/src/views/document/detail.vue
+++ b/src/views/document/detail.vue
@@ -18,7 +18,7 @@
-
+
@@ -480,7 +480,6 @@
this.isPreviewDisable = true
this.previewLoading = true
this.$nextTick(() => {
- console.info("this.$refs.previewForm====999999=======", this.$refs.previewForm)
this.$refs.previewForm.frontModulePreview(row)
})
},
diff --git a/src/views/document/downloadFileDetail.vue b/src/views/document/downloadFileDetail.vue
index f3cd28a..74a57b9 100644
--- a/src/views/document/downloadFileDetail.vue
+++ b/src/views/document/downloadFileDetail.vue
@@ -2,7 +2,7 @@
-
+
diff --git a/src/views/document/editDocument.vue b/src/views/document/editDocument.vue
index cfcdb44..2451cfd 100644
--- a/src/views/document/editDocument.vue
+++ b/src/views/document/editDocument.vue
@@ -128,7 +128,7 @@
-