feat(system): 优化文件和图片管理页面

- 改进文件管理界面布局和交互逻辑
- 优化图片管理功能和用户体验
- 统一页面组件样式和规范
- 完善数据处理和错误处理机制
This commit is contained in:
Leo 2025-09-25 16:00:46 +08:00
parent 1714927ecb
commit f5676bac4f
2 changed files with 100 additions and 12 deletions

View File

@ -196,6 +196,7 @@
height="auto" height="auto"
confirm-text="确定" confirm-text="确定"
cancel-text="取消" cancel-text="取消"
:confirm-disabled="isConfirmDisabled"
@coi-confirm="handleUploadConfirm" @coi-confirm="handleUploadConfirm"
@coi-cancel="handleUploadCancel" @coi-cancel="handleUploadCancel"
> >
@ -276,7 +277,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { h, onMounted, ref } from 'vue' import { computed, h, onMounted, ref } from 'vue'
import { NButton, NIcon, NP, NPopconfirm, NSpace, NTag, NText, NUpload, NUploadDragger } from 'naive-ui' import { NButton, NIcon, NP, NPopconfirm, NSpace, NTag, NText, NUpload, NUploadDragger } from 'naive-ui'
import type { DataTableColumns, DataTableInst, FormInst, UploadFileInfo, UploadInst } from 'naive-ui' import type { DataTableColumns, DataTableInst, FormInst, UploadFileInfo, UploadInst } from 'naive-ui'
import CoiEmpty from '@/components/common/CoiEmpty.vue' import CoiEmpty from '@/components/common/CoiEmpty.vue'
@ -345,6 +346,34 @@ const searchForm = ref<SysFileSearchForm>({
const uploadFileList = ref<UploadFileInfo[]>([]) const uploadFileList = ref<UploadFileInfo[]>([])
const uploading = ref(false) const uploading = ref(false)
//
const isConfirmDisabled = computed(() => {
const fileList = uploadFileList.value
//
if (fileList.length === 0) {
return true
}
// pending uploading
const uploadingFiles = fileList.filter(file =>
file.status === 'pending' || file.status === 'uploading',
)
if (uploadingFiles.length > 0) {
return true
}
// error
const errorFiles = fileList.filter(file => file.status === 'error')
if (errorFiles.length > 0) {
return true
}
//
const finishedFiles = fileList.filter(file => file.status === 'finished')
return finishedFiles.length === 0
})
// //
const uploadForm = ref({ const uploadForm = ref({
fileService: 'LOCAL', fileService: 'LOCAL',
@ -749,7 +778,20 @@ async function customUpload({ file, onProgress, onFinish, onError }: any) {
onProgress({ percent: 10 }) onProgress({ percent: 10 })
// API // API
await uploadFile(fileObj, folderName, 2, '-1', uploadForm.value.fileService) const result = await uploadFile(fileObj, folderName, 2, '-1', uploadForm.value.fileService)
//
if (result.isSuccess === false) {
// HTTP200
// HTTP
onError()
//
const index = uploadFileList.value.findIndex(item => item.id === file.id)
if (index !== -1) {
uploadFileList.value.splice(index, 1)
}
return
}
// //
onProgress({ percent: 100 }) onProgress({ percent: 100 })
@ -762,6 +804,12 @@ async function customUpload({ file, onProgress, onFinish, onError }: any) {
catch (error: any) { catch (error: any) {
onError() onError()
//
const index = uploadFileList.value.findIndex(item => item.id === file.id)
if (index !== -1) {
uploadFileList.value.splice(index, 1)
}
// //
let errorMessage = `文件 ${file.file.name} 上传失败` let errorMessage = `文件 ${file.file.name} 上传失败`

View File

@ -317,6 +317,7 @@
height="auto" height="auto"
confirm-text="确定" confirm-text="确定"
cancel-text="取消" cancel-text="取消"
:confirm-disabled="isConfirmDisabled"
@coi-confirm="handleUploadConfirm" @coi-confirm="handleUploadConfirm"
@coi-cancel="handleUploadCancel" @coi-cancel="handleUploadCancel"
> >
@ -405,7 +406,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { h, onMounted, ref } from 'vue' import { computed, h, onMounted, ref } from 'vue'
import { NButton, NIcon, NP, NPopconfirm, NSpace, NSpin, NTag, NText, NTooltip, NUpload, NUploadDragger } from 'naive-ui' import { NButton, NIcon, NP, NPopconfirm, NSpace, NSpin, NTag, NText, NTooltip, NUpload, NUploadDragger } from 'naive-ui'
import type { DataTableColumns, DataTableInst, FormInst, UploadFileInfo, UploadInst } from 'naive-ui' import type { DataTableColumns, DataTableInst, FormInst, UploadFileInfo, UploadInst } from 'naive-ui'
import CoiEmpty from '@/components/common/CoiEmpty.vue' import CoiEmpty from '@/components/common/CoiEmpty.vue'
@ -480,6 +481,34 @@ const searchForm = ref<SysPictureSearchForm>({
const uploadFileList = ref<UploadFileInfo[]>([]) const uploadFileList = ref<UploadFileInfo[]>([])
const uploading = ref(false) const uploading = ref(false)
//
const isConfirmDisabled = computed(() => {
const fileList = uploadFileList.value
//
if (fileList.length === 0) {
return true
}
// pending uploading
const uploadingFiles = fileList.filter(file =>
file.status === 'pending' || file.status === 'uploading',
)
if (uploadingFiles.length > 0) {
return true
}
// error
const errorFiles = fileList.filter(file => file.status === 'error')
if (errorFiles.length > 0) {
return true
}
//
const finishedFiles = fileList.filter(file => file.status === 'finished')
return finishedFiles.length === 0
})
// //
const uploadForm = ref({ const uploadForm = ref({
pictureService: 'LOCAL', pictureService: 'LOCAL',
@ -883,19 +912,24 @@ async function customUpload({ file, onProgress, onFinish, onError }: any) {
try { try {
const fileObj = file.file as File const fileObj = file.file as File
//
// console.log('customUpload :', {
// fileName: fileObj.name,
// fileSize: fileObj.size,
// fileSizeMB: (fileObj.size / 1024 / 1024).toFixed(2),
// })
// //
onProgress({ percent: 10 }) onProgress({ percent: 10 })
// API - 使 // API - 使
// console.log('API:', { pictureType: uploadForm.value.pictureType, pictureService: uploadForm.value.pictureService, fileSize: 2 }) const result = await uploadPicture(fileObj, uploadForm.value.pictureType, 2, uploadForm.value.pictureService)
await uploadPicture(fileObj, uploadForm.value.pictureType, 2, uploadForm.value.pictureService)
//
if (result.isSuccess === false) {
// HTTP200
// HTTP
onError()
//
const index = uploadFileList.value.findIndex(item => item.id === file.id)
if (index !== -1) {
uploadFileList.value.splice(index, 1)
}
return
}
// //
onProgress({ percent: 100 }) onProgress({ percent: 100 })
@ -910,6 +944,12 @@ async function customUpload({ file, onProgress, onFinish, onError }: any) {
console.error('图片上传失败:', error) console.error('图片上传失败:', error)
//
const index = uploadFileList.value.findIndex(item => item.id === file.id)
if (index !== -1) {
uploadFileList.value.splice(index, 1)
}
// //
let errorMessage = `图片 ${file.file.name} 上传失败` let errorMessage = `图片 ${file.file.name} 上传失败`