171 lines
3.9 KiB
Vue
171 lines
3.9 KiB
Vue
<template>
|
|
<el-upload
|
|
ref="uploadRef"
|
|
style="width: 100%"
|
|
:file-list="fileList"
|
|
:action="action"
|
|
multiple
|
|
:limit="limit"
|
|
:list-type="listType"
|
|
:auto-upload="autoUpload"
|
|
:disabled="disabled"
|
|
:accept="accept"
|
|
:on-remove="onRemove"
|
|
:before-remove="beforeRemove"
|
|
:on-change="onChange"
|
|
:on-exceed="onExceed"
|
|
:on-preview="onPreview"
|
|
:http-request="httpRequest"
|
|
:show-file-list="showFileList"
|
|
:class="{ hide: fileList.length === limit }"
|
|
>
|
|
<icon-plus
|
|
v-if="listType === 'picture-card'"
|
|
theme="filled"
|
|
size="32"
|
|
fill="#fff"
|
|
:stroke-width="3"
|
|
/>
|
|
<el-button v-else type="primary">点击选择文件上传</el-button>
|
|
<template #tip>
|
|
<div class="mt-10 text-red"><slot name="tip"></slot></div>
|
|
</template>
|
|
</el-upload>
|
|
<el-dialog v-model="visible" title="查看图片">
|
|
<img
|
|
:src="imageUrl"
|
|
alt="Preview Image"
|
|
style="width: 100%; object-fit: scale-down"
|
|
/>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { ref } from "vue";
|
|
import { ElMessage, ElMessageBox } from "element-plus";
|
|
import { setDeleteImg } from "@/request/api";
|
|
|
|
defineOptions({
|
|
name: "LayoutUpload",
|
|
});
|
|
const props = defineProps({
|
|
fileList: {
|
|
type: Array,
|
|
default: () => [],
|
|
required: true,
|
|
},
|
|
autoUpload: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
action: {
|
|
type: String,
|
|
default: "",
|
|
},
|
|
limit: {
|
|
type: Number,
|
|
default: 1,
|
|
},
|
|
listType: {
|
|
type: String,
|
|
default: "text",
|
|
},
|
|
accept: {
|
|
type: String,
|
|
default: "",
|
|
},
|
|
ratio: {
|
|
type: String,
|
|
default: "",
|
|
},
|
|
disabled: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
deleteToServer: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
showFileList: {
|
|
type: Boolean,
|
|
default: true,
|
|
},
|
|
httpRequest: {
|
|
type: Function,
|
|
},
|
|
size: {
|
|
type: Number,
|
|
default: 0,
|
|
},
|
|
});
|
|
const visible = ref(false);
|
|
const imageUrl = ref("");
|
|
const emits = defineEmits(["update:file-list", "preview"]);
|
|
const uploadRef = ref(null);
|
|
const onExceed = () => {
|
|
ElMessage.warning(`最多上传${props.limit}个文件`);
|
|
};
|
|
const beforeRemove = async (uploadFile) => {
|
|
if (props.deleteToServer && uploadFile.IMGFILES_ID) {
|
|
await ElMessageBox.confirm("确定要删除吗?", {
|
|
type: "warning",
|
|
});
|
|
await setDeleteImg({
|
|
IMGFILES_ID: uploadFile.IMGFILES_ID,
|
|
});
|
|
}
|
|
};
|
|
const onRemove = (uploadFile, uploadFiles) => {
|
|
emits("update:file-list", uploadFiles);
|
|
};
|
|
const onChange = (uploadFile, uploadFiles) => {
|
|
const accept = props.accept && props.accept.split(",");
|
|
const ratio = props.ratio && props.ratio.split("*");
|
|
const suffix = uploadFile.raw.name.substring(
|
|
uploadFile.raw.name.lastIndexOf("."),
|
|
uploadFile.raw.name.length
|
|
);
|
|
const size = props.size * 1024 * 1024;
|
|
if (ratio) {
|
|
const img = new Image();
|
|
img.src = uploadFile.url;
|
|
img.onload = () => {
|
|
if (img.width !== +ratio[0] && img.height !== +ratio[1]) {
|
|
ElMessage.warning(`只能上传${props.ratio}分辨率的图片`);
|
|
uploadRef.value.handleRemove(uploadFile.raw);
|
|
}
|
|
};
|
|
}
|
|
if (size) {
|
|
if (uploadFile.size > size) {
|
|
ElMessage.warning(`文件大小不能超过${props.size}M`);
|
|
uploadRef.value.handleRemove(uploadFile.raw);
|
|
}
|
|
}
|
|
if (accept) {
|
|
if (accept.includes(suffix)) {
|
|
emits("update:file-list", uploadFiles);
|
|
} else {
|
|
ElMessage.warning(`只能上传${props.accept}格式的文件`);
|
|
uploadRef.value.handleRemove(uploadFile.raw);
|
|
}
|
|
} else {
|
|
emits("update:file-list", uploadFiles);
|
|
}
|
|
};
|
|
const onPreview = (uploadFile) => {
|
|
if (props.listType === "picture-card") {
|
|
visible.value = true;
|
|
imageUrl.value = uploadFile.url;
|
|
} else {
|
|
emits("preview", uploadFile);
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.hide :deep(.el-upload--picture-card) {
|
|
display: none;
|
|
}
|
|
</style>
|