diff --git a/src/components/Upload/index.vue b/src/components/Upload/index.vue index 2ae8302f184e8e21e736a4eb853fe318f4ca14be..9b5a8ae867911a33b3ff4d3fece0a41ef33e7958 100644 --- a/src/components/Upload/index.vue +++ b/src/components/Upload/index.vue @@ -3,12 +3,31 @@
- - {{ $t("btnText.chooseFile") }} - - - {{ $t("btnText.delete") }} - +
+ + {{ $t("btnText.chooseFile") }} + + + {{ $t("btnText.batchDelete") }} + +
+
+
+ {{ $t("dialogTipText.fileNums") }}:{{ + fileTableList.data.length + }}/{{ props.maxFileNum }} +
+
+ {{ $t("dialogTipText.fileSizes") }}:{{ allFileSizesInfo }}/{{ + maxFileSizesInfo + }} +
+
{{ $t("dialogTipText.continueAdd") }}
@@ -16,8 +35,10 @@ action="" drag multiple + :limit="props.maxFileNum" :accept="accept" :show-file-list="false" + :on-exceed="handleExceed" :on-success="handlsSuccess" :on-change="handleChange" :on-progress="handleProgress" @@ -194,19 +215,35 @@ let selectedFiles: any[] = []; const multipleSelection = ref([]); const uploadingList = ref>([]); const showTaskList = ref(true); +let allFileSizes = ref(0); // 所有文件大小 + +let allFileSizesInfo = computed(() => { + // 字节转MB:1 MB = 1024 * 1024 bytes + if (allFileSizes.value <= 0) return 0; + if (allFileSizes.value < 1024) { + return allFileSizes.value + "B"; + } else if (allFileSizes.value / 1024 < 1024) { + return (allFileSizes.value / 1024).toFixed(0) + "KB"; + } else if (allFileSizes.value / 1024 / 1024 < 1024) { + return (allFileSizes.value / 1024 / 1024).toFixed(0) + "MB"; + } else { + return (allFileSizes.value / 1024 / 1024 / 1024).toFixed(0) + "GB"; + } +}); + +let maxFileSizesInfo = computed(() => { + if (props.maxSize <= 0) return 0; + if (props.maxSize < 1) { + return (props.maxSize * 1024).toFixed(0) + "MB"; + } else { + return props.maxSize + "GB"; + } +}); // 表格实例引用 const fileTableRef = ref(); const handleSelectionChange = (val: TableRow[]) => { multipleSelection.value = val; - let allFileSizes = 0; - val.forEach((item) => { - allFileSizes += item.file.size as number; - }); - btnDisabled.value = - isMaxMemoryOut(allFileSizes, props.maxSize) || - val.length > props.maxFileNum || - !val.length; selectedFiles = val.map((item) => { return { id: item.id, @@ -218,6 +255,16 @@ const handleSelectionChange = (val: TableRow[]) => { }; const hasFiles = computed(() => fileTableList.data.length > 0); + +const changeAllSizes = (file: any, type?: string) => { + if (type === "add") { + allFileSizes.value += file.size as number; + } else { + allFileSizes.value -= file.size as number; + } + btnDisabled.value = isMaxMemoryOut(allFileSizes.value, props.maxSize); +}; + const handleChange = (file: UploadFile) => { const item: TableRow = { id: file.uid, @@ -225,20 +272,15 @@ const handleChange = (file: UploadFile) => { size: bytesToSize(file.size as number), file: file, }; + changeAllSizes(file, "add"); fileTableList.data.push(item); - selectedFiles.push({ - id: item.id, - name: item.name, - file: item.file, - percent: 0, - }); - // 异步更新选中状态 - nextTick(() => { - const row = fileTableList.data.find((val) => item.id === val.id); - if (row) { - fileTableRef.value.toggleRowSelection(row, true); - } - }); +}; + +// 超出文件数量限制时的处理 +const handleExceed = () => { + ElMessage.warning( + `超出文件数量限制,最多只能上传 ${props.maxFileNum} 个文件!` + ); }; const handleProgress = (e: UploadProgressEvent) => { @@ -287,13 +329,18 @@ watch( immediate: true, } ); - +const batchDelete = () => { + if (!selectedFiles.length) { + ElMessage.warning(`请先选择文件再进行批量删除操作!`); + return; + } + selectedFiles.forEach((item) => item && deleteFile(item)); +}; const deleteFile = (row?: any) => { if (row) { const idx = fileTableList.data.findIndex((item: any) => item.id === row.id); fileTableList.data.splice(idx, 1); - } else if (selectedFiles.length > 0) { - selectedFiles.forEach((item) => item && deleteFile(item)); + changeAllSizes(row.file, "del"); } }; @@ -330,10 +377,10 @@ const handleLimitSize = (selectedFileData) => { return flag; }; - +// 提交资产库 .zip const uploadFiles = () => { if (props.singleFileLimit) { - if (handleLimitSize(selectedFiles)) { + if (handleLimitSize(fileTableList.data)) { ElMessage({ showClose: true, message: t("dialogTipText.singleFileSize"), @@ -346,8 +393,8 @@ const uploadFiles = () => { } props?.handleImportLoading(true); let uploadFileNumber = 0; - props.handInitTaskList(selectedFiles).then((res: any) => { - uploadingList.value = selectedFiles.map((item) => { + props.handInitTaskList(fileTableList.data).then((res: any) => { + uploadingList.value = fileTableList.data.map((item) => { return { id: item.id, name: item.name, @@ -374,7 +421,7 @@ const uploadFiles = () => { }, onSuccess: (response: any) => { uploadFileNumber += 1; - if (uploadFileNumber === selectedFiles.length) { + if (uploadFileNumber === fileTableList.data.length) { props.handleQueryTaskList(); } }, @@ -404,14 +451,16 @@ const uploadFiles = () => { }), ]; uploadingList.value.length && handleToggleUploadNotify(); + props.handleCancelVisible(); + fileTableList.data = []; + allFileSizes.value = 0; }); - props.handleCancelVisible(); - fileTableList.data = []; }; +// 资产库内提交文件 .pdf .ms .docx...... const uploadKnowledgeFile = () => { if (props.singleFileLimit) { - if (handleLimitSize(selectedFiles)) { + if (handleLimitSize(fileTableList.data)) { ElMessage({ showClose: true, message: t("dialogTipText.singleFileSize"), @@ -424,7 +473,7 @@ const uploadKnowledgeFile = () => { } props?.handleImportLoading(true); let uploadFileNumber = 0; - uploadingList.value = selectedFiles.map((item) => { + uploadingList.value = fileTableList.data.map((item) => { return { id: item.id, name: item.name, @@ -452,7 +501,7 @@ const uploadKnowledgeFile = () => { uploadingList.value.length && handleToggleUploadNotify(); }, onSuccess: (response: any) => { - props.handleQueryTaskList(selectedFiles); + props.handleQueryTaskList(fileTableList.data); uploadFileNumber += 1; item.percent = 100; item.uploadStatus = "success"; @@ -463,6 +512,7 @@ const uploadKnowledgeFile = () => { uploadingList.value.length && handleToggleUploadNotify(); props.handleCancelVisible(); fileTableList.data = []; + allFileSizes.value = 0; }; const handleToggleUploadNotify = () => { diff --git a/src/lang/package/en.ts b/src/lang/package/en.ts index 04e4da2f7088220126fd353bd074a54eecb82b1a..053f7248d0b38b54d56f615e4ec9e379f1806b75 100644 --- a/src/lang/package/en.ts +++ b/src/lang/package/en.ts @@ -138,6 +138,7 @@ export default { export: "Export", edit: "Edit", delete: "Delete", + batchDelete: "Batch Delete", retry: "Retry", restart: "Restart", clearAll: "Clear all", @@ -183,6 +184,8 @@ export default { fileName: "File name", fileSize: "Size", singleFileSize: "The size of a file cannot exceed 20 MB.", + fileNums: "File Number", + fileSizes: "File Size", }, formTipText: { analyticTip: diff --git a/src/lang/package/zh-cn.ts b/src/lang/package/zh-cn.ts index 262688e22f46e14590126c2a5d41b49b2d81a313..1062fd7edc6dd50e642123cd94dfde5120d8fea7 100644 --- a/src/lang/package/zh-cn.ts +++ b/src/lang/package/zh-cn.ts @@ -143,6 +143,7 @@ export default { export: "导出", edit: "编辑", delete: "删除", + batchDelete: "批量删除", retry: "重试", restart: "重启", clearAll: "全部清空", @@ -187,6 +188,8 @@ export default { fileName: "文件名", fileSize: "大小", singleFileSize: "单个文件大小不能超过20MB", + fileNums: "文件数", + fileSizes: "文件大小", }, formTipText: { analyticTip: diff --git a/src/styles/upload.scss b/src/styles/upload.scss index 4818025ccdcd1a564a3098b440c49637f7237c18..798ad4960737219ef6eea71c9eab91c08bd93021 100644 --- a/src/styles/upload.scss +++ b/src/styles/upload.scss @@ -6,6 +6,7 @@ .upload-to-list { .list-action { display: flex; + justify-content: space-between; .file-ops { height: 24px; @@ -15,13 +16,23 @@ .delFileBtn { height: 24px; - padding: 4px 20px; + padding: 4px 10px; font-size: 12px; span { min-width: unset !important; } } + + .list-action-tip { + width: 60%; + font-size: var(--o-font-size-info); + display: flex; + justify-content: end; + &>:first-child{ + margin-right: 15px; + } + } } .list-tip { @@ -161,7 +172,7 @@ height: 24px; } - + .upload-tip { + +.upload-tip { margin-top: 24px; } } @@ -171,13 +182,16 @@ height: 184px; cursor: default; background-color: var(--o-bg-color-base); + .cell { font-size: 12px !important; } + .el-table { ::-webkit-scrollbar { width: 4px !important; } + .el-scrollbar__bar.is-vertical { width: 4px !important; } @@ -220,4 +234,4 @@ .el-progress__text { font-weight: 600 !important; } -} +} \ No newline at end of file diff --git a/src/views/knowledgeFile/index.vue b/src/views/knowledgeFile/index.vue index d5764527a654b569d7cae8ae4cb7cf04eac2248c..cd78c36d037b1f06af7d5f05b0cb0e3454605c82 100644 --- a/src/views/knowledgeFile/index.vue +++ b/src/views/knowledgeFile/index.vue @@ -558,7 +558,7 @@ :tipText="$t('dialogTipText.fileAllFormat')" accept=".md,.xlsx,.pdf,.doc,.docx,.txt,.pptx,.html" :maxFileNum="128" - :maxSize="0.5" + :maxSize="0.488" :handleUploadMyFile="handleUploadMyFile" :handleQueryTaskList="handleQueryTaskList" :handleCancelVisible="handleCancelVisible" diff --git a/src/views/knowledgeFileSection/index.vue b/src/views/knowledgeFileSection/index.vue index 99ce27716eb006f4eb834875b471202a13b7582e..03064740222b1ef99c1a60d677156a946f79e2c4 100644 --- a/src/views/knowledgeFileSection/index.vue +++ b/src/views/knowledgeFileSection/index.vue @@ -238,8 +238,7 @@ - {{ itemText }} -
+
diff --git a/vite.config.ts b/vite.config.ts index 3337c7e3620cb59e4b5ca2d3ee68bbdeb4c8cd4e..2c6ec92e85a38f33e681b9a371cfc0c22bc184f0 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -60,10 +60,11 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => { open: true, proxy: { "/witchaind/api": { - target: "http://116.63.144.61:9988", + target: "https://euler-copilot-master.test.osinfra.cn/witchaind", changeOrigin: true, ws: false, - rewrite: (path) => path.replace(new RegExp("^" + "/witchaind/api"), ""), + secure: false, + rewrite: (path) => path.replace(/^\/witchaind\/api/, "/api") }, }, },