From e70e005e10d600bbfb1930ece66fb8d15f5176a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Sun, 24 Apr 2022 17:45:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=9B=BE=E7=89=87=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ImageUpload/index.vue | 362 +++++++++++++-------------- 1 file changed, 179 insertions(+), 183 deletions(-) diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue index 706de3d..b45a704 100644 --- a/src/components/ImageUpload/index.vue +++ b/src/components/ImageUpload/index.vue @@ -1,190 +1,186 @@ - \ No newline at end of file + // 文件类型, 例如['png', 'jpg', 'jpeg'] + fileType: { + type: Array, + default: () => ['png', 'jpg', 'jpeg'], + }, + // 是否显示提示 + isShowTip: { + type: Boolean, + default: true, + }, + // 上传携带的参数 + data: { + type: Object, + }, +}) + +const { proxy } = getCurrentInstance() +const emit = defineEmits() +const number = ref(0) +const uploadList = ref([]) +const dialogImageUrl = ref('') +const dialogVisible = ref(false) +const baseUrl = import.meta.env.VITE_APP_BASE_API +const uploadImgUrl = ref(baseUrl + import.meta.env.VITE_APP_UPLOAD_URL ?? '/Common/UploadFile') // 上传的图片服务器地址 +const headers = ref({ Authorization: 'Bearer ' + getToken() }) +const fileList = ref([]) +const showTip = computed(() => props.isShowTip && (props.fileType || props.fileSize)) + +watch( + () => props.modelValue, + (val) => { + if (val) { + // 首先将值转为数组 + const list = Array.isArray(val) ? val : props.modelValue.split(',') + // 然后将数组转为对象数组 + fileList.value = list.map((item) => { + if (typeof item === 'string') { + if (item.indexOf(baseUrl) === -1) { + item = { name: baseUrl + item, url: baseUrl + item } + } else { + item = { name: item, url: item } + } + } + return item + }) + } else { + fileList.value = [] + return [] + } + }, + { deep: true, immediate: true }, +) + +// 删除图片 +function handleRemove(file, files) { + emit('update:modelValue', listToString(fileList.value)) +} + +// 上传成功回调 +function handleUploadSuccess(res) { + uploadList.value.push({ name: res.data.fileName, url: res.data.url }) + if (uploadList.value.length === number.value) { + fileList.value = fileList.value.concat(uploadList.value) + uploadList.value = [] + number.value = 0 + emit('update:modelValue', listToString(fileList.value)) + // emit('success', listToString(fileList.value)) + proxy.$modal.closeLoading() + } +} + +// 上传前loading加载 +function handleBeforeUpload(file) { + let isImg = false + if (props.fileType.length) { + let fileExtension = '' + if (file.name.lastIndexOf('.') > -1) { + fileExtension = file.name.slice(file.name.lastIndexOf('.') + 1) + } + isImg = props.fileType.some((type) => { + if (file.type.indexOf(type) > -1) return true + if (fileExtension && fileExtension.indexOf(type) > -1) return true + return false + }) + } else { + isImg = file.type.indexOf('image') > -1 + } + if (!isImg) { + proxy.$modal.msgError(`文件格式不正确, 请上传${props.fileType.join('/')}图片格式文件!`) + return false + } + if (props.fileSize) { + const isLt = file.size / 1024 / 1024 < props.fileSize + if (!isLt) { + proxy.$modal.msgError(`上传头像图片大小不能超过 ${props.fileSize} MB!`) + return false + } + } + proxy.$modal.loading('正在上传图片,请稍候...') + number.value++ +} + +// 文件个数超出 +function handleExceed() { + proxy.$modal.msgError(`上传文件数量不能超过 ${props.limit} 个!`) +} + +// 上传失败 +function handleUploadError() { + proxy.$modal.msgError('上传图片失败') + proxy.$modal.closeLoading() +} + +// 预览 +function handlePictureCardPreview(file) { + dialogImageUrl.value = file.url + dialogVisible.value = true +} + +// 对象转成指定字符串分隔 +function listToString(list, separator) { + let strs = '' + separator = separator || ',' + for (let i in list) { + if (undefined !== list[i].url && list[i].url.indexOf('blob:') !== 0) { + strs += list[i].url.replace(baseUrl, '') + separator + } + } + return strs != '' ? strs.substr(0, strs.length - 1) : '' +} +