From 70e2de3250f887fedbc75b73b1822e666b8a5001 Mon Sep 17 00:00:00 2001 From: luoqiz Date: Wed, 16 Apr 2025 13:41:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=88=E7=9B=AE=E5=BD=95=E5=BD=A2=E5=BC=8F=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=20(#60)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/system/file.ts | 10 ++++ src/apis/system/type.ts | 2 +- src/constant/file.ts | 2 + .../FileDetailModal/ModalContent.vue | 2 +- .../system/file/main/FileMain/FileGrid.vue | 8 ++- .../system/file/main/FileMain/FileList.vue | 8 ++- src/views/system/file/main/FileMain/index.vue | 55 +++++++++++++++++-- 7 files changed, 78 insertions(+), 9 deletions(-) diff --git a/src/apis/system/file.ts b/src/apis/system/file.ts index 48fb434..ba519c0 100644 --- a/src/apis/system/file.ts +++ b/src/apis/system/file.ts @@ -24,3 +24,13 @@ export function deleteFile(id: string) { export function getFileStatistics() { return http.get(`${BASE_URL}/statistics`) } + +/** @desc 根据sha256检测文件是否已经在服务器存在 */ +export function checkFile(sha256: string) { + return http.get(`${BASE_URL}/check`, { fileHash: sha256 }) +} + +/** @desc 创建文件夹 */ +export function createDir(path: string, name: string) { + return http.post(`${BASE_URL}/createDir`, { parentPath: path, name }) +} diff --git a/src/apis/system/type.ts b/src/apis/system/type.ts index 993a370..f0bb895 100644 --- a/src/apis/system/type.ts +++ b/src/apis/system/type.ts @@ -207,7 +207,7 @@ export interface FileItem { parentPath: string absPath: string metadata: string - md5: string + sha256: string contentType: string thumbnailSize: number thumbnailUrl: string diff --git a/src/constant/file.ts b/src/constant/file.ts index df4d499..778a857 100644 --- a/src/constant/file.ts +++ b/src/constant/file.ts @@ -46,3 +46,5 @@ export const OfficeTypes = ['ppt', 'pptx', 'doc', 'docx', 'xls', 'xlsx', 'pdf'] export const WordTypes = ['doc', 'docx'] export const ExcelTypes = ['xls', 'xlsx'] + +export const DirTypes = ['dir'] diff --git a/src/views/system/file/components/FileDetailModal/ModalContent.vue b/src/views/system/file/components/FileDetailModal/ModalContent.vue index 8dda68c..a38c006 100644 --- a/src/views/system/file/components/FileDetailModal/ModalContent.vue +++ b/src/views/system/file/components/FileDetailModal/ModalContent.vue @@ -14,7 +14,7 @@ {{ formatFileSize(data.size) }} {{ data.absPath + getFileName(data) }} - {{ data.md5 }} + {{ data.sha256 }} {{ data.createTime }} {{ data.updateTime }} {{ data.storageName }} diff --git a/src/views/system/file/main/FileMain/FileGrid.vue b/src/views/system/file/main/FileMain/FileGrid.vue index 1cee35a..fef7de4 100644 --- a/src/views/system/file/main/FileMain/FileGrid.vue +++ b/src/views/system/file/main/FileMain/FileGrid.vue @@ -13,7 +13,7 @@ scroll-to-close > -
+
@@ -51,6 +51,7 @@ const props = withDefaults(defineProps(), { const emit = defineEmits<{ (e: 'click', record: FileItem): void + (e: 'dblclick', record: FileItem): void (e: 'select', record: FileItem): void (e: 'right-menu-click', mode: string, item: FileItem): void }>() @@ -73,6 +74,11 @@ const handleClickFile = (item: FileItem) => { emit('click', item) } +// 双击事件 +const handleDblclickFile = (item: FileItem) => { + emit('dblclick', item) +} + // 选中事件 const handleCheckFile = (item: FileItem) => { emit('select', item) diff --git a/src/views/system/file/main/FileMain/FileList.vue b/src/views/system/file/main/FileMain/FileList.vue index febd868..16c1c9a 100644 --- a/src/views/system/file/main/FileMain/FileList.vue +++ b/src/views/system/file/main/FileMain/FileList.vue @@ -34,7 +34,7 @@
@@ -77,6 +77,7 @@ const props = withDefaults(defineProps(), { const emit = defineEmits<{ (e: 'click', record: FileItem): void + (e: 'dblclick', record: FileItem): void (e: 'select', record: FileItem): void (e: 'right-menu-click', mode: string, item: FileItem): void }>() @@ -109,6 +110,11 @@ const handleRowClick: TableInstance['onRowClick'] = (record) => { emit('click', record as unknown as FileItem) } +// 双击事件 +const handleDblclickFile = (item: FileItem) => { + emit('dblclick', item) +} + // 右键菜单点击事件 const handleRightMenuClick = (mode: string, item: FileItem) => { emit('right-menu-click', mode, item) diff --git a/src/views/system/file/main/FileMain/index.vue b/src/views/system/file/main/FileMain/index.vue index 0209b32..81764fb 100644 --- a/src/views/system/file/main/FileMain/index.vue +++ b/src/views/system/file/main/FileMain/index.vue @@ -38,6 +38,12 @@ + + + + @@ -93,8 +104,8 @@ import { import FileGrid from './FileGrid.vue' import useFileManage from './useFileManage' import { useTable } from '@/hooks' -import { type FileItem, type FileQuery, deleteFile, listFile, uploadFile } from '@/apis' -import { ImageTypes, OfficeTypes } from '@/constant/file' +import { type FileItem, type FileQuery, checkFile, createDir, deleteFile, listFile, uploadFile } from '@/apis' +import { DirTypes, ImageTypes, OfficeTypes } from '@/constant/file' import 'viewerjs/dist/viewer.css' import { downloadByUrl } from '@/utils/downloadFile' import mittBus from '@/utils/mitt' @@ -114,9 +125,15 @@ const queryTypeOption = [{ value: 'absPath', }] const queryType = ref('name') + +// 新建文件夹弹窗显示 +const createDirModalVisible = ref(false) +// 新文件名称 +const newDirName = ref() + const queryForm = reactive({ name: undefined, - absPath: undefined, + absPath: '/', type: route.query.type?.toString() !== '0' ? route.query.type?.toString() : undefined, sort: ['updateTime,desc'], }) @@ -180,6 +197,19 @@ const handleClickFile = (item: FileItem) => { previewFileAudioModal(item) } } + +// 双击文件 +const handleDblclickFile = (item: FileItem) => { + if (DirTypes.includes(item.extension)) { + if (item.absPath.endsWith('/')) { + queryForm.absPath = item.absPath + item.name + } else { + queryForm.absPath = `${item.absPath}/${item.name}` + } + search() + } +} + // 下载文件 const onDownload = async (fileInfo: FileItem) => { const res = await downloadByUrl({ @@ -242,6 +272,7 @@ const handleUpload = (options: RequestOption) => { const { onProgress, onError, onSuccess, fileItem, name = 'file' } = options onProgress(20) const formData = new FormData() + formData.append('path', queryForm.absPath ?? '/') formData.append(name as string, fileItem.file as Blob) try { const res = await uploadFile(formData) @@ -272,6 +303,20 @@ onBeforeRouteUpdate((to) => { search() }) +// 新建文件夹弹窗窗口取消事件 +const handleCancel = () => { + newDirName.value = undefined + createDirModalVisible.value = false +} + +// 新建文件夹弹窗窗口确认事件 +const handleCreateDir = async () => { + const res = await createDir(queryForm.absPath ?? '/', newDirName.value) + newDirName.value = undefined + createDirModalVisible.value = false + search() +} + onMounted(() => { search() })