<vms-upload v-model="saveForm.fileList"
:file-type="['jpg', 'png', 'pdf', 'xlsx', 'xls', 'docx', 'doc']"
:is-disabled="type === 'check' ? true : false"
/>
<template>
<div>
<el-upload
:class="{hide:isDisabled}"
:file-list="fileList"
action=""
:limit="limit"
:disabled="isDisabled"
:http-request="fileRequest"
list-type="picture-card"
:on-preview="handlePreview"
:on-remove="handleRemove"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
>
<i class="el-icon-plus" />
</el-upload>
<el-image-viewer
v-if="imgView"
:url-list="urlList"
:initial-index="initialIndex"
:on-close="() => { imgView = false }"
:style="{ 'zIndex': 9999 }"
/>
</div>
</template>
<script>
import axios from 'axios'
import { Message } from 'element-ui'
import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
export default {
components: {
ElImageViewer
},
props: {
value: {
type: Array,
default () {
return []
}
},
isDisabled: {
type: Boolean,
default: false
},
fileType: {
type: Array,
default () {
return []
}
},
limit: {
type: Number,
default: 10
}
},
data () {
return {
dialogImageUrl: '',
dialogVisible: false,
fileList: [],
fileSuccess: [],
imageUrl: '',
imgView: false,
urlList: [],
initialIndex: 0
}
},
watch: {
value: {
handler (val) {
if (Array.isArray(val) && val.length) {
this.fileSuccess = val.map((item) => {
return {
url: item.imageUrl,
imageUrl: item.imageUrl,
name: item.name
}
})
this.fileListFun()
} else {
this.fileSuccess = []
this.fileList = []
}
},
deep: true,
immediate: true
},
fileList: {
handler (val) {
this.$emit('fileChange', val)
}
}
},
methods: {
beforeAvatarUpload (file) {
if (this.fileType.length && !this.fileType.includes(file.name.match(/\.[^.]+$/g)[0].replace(/\./g, ''))) {
Message({
message: `允许上传的格式: ${this.fileType.join(' | ')}`,
type: 'warning'
})
return false
}
},
fileRequest (item) {
const uploadData = new FormData()
uploadData.append('file', item.file)
item.status = 'uploading'
item.message = '上传中...'
axios.post('/admin/common/commonPic/uploadFile', uploadData, {
headers: {
'Content-Type': 'multipart/form-data'
}
}).then((res) => {
if (res.data.code === 200 && res.data.data) {
this.fileSuccess.push(res.data.data)
this.$emit('input', this.fileSuccess)
this.fileListFun()
} else {
Message.error('文件上传错误')
}
}).catch((err) => {
console.log(err)
Message.error('文件上传错误')
})
},
fileListFun () {
this.fileList = []
this.fileList = this.fileSuccess.map((item, index) => {
if (/.pdf$/.test(item.imageUrl)) {
item = {
url: require('@/assets/vms/img/pdf.svg'),
showUrl: item.showUrl,
imageUrl: item.imageUrl
}
} else if (/.xlsx$/.test(item.imageUrl)) {
item = {
url: require('@/assets/vms/img/xlsx.svg'),
showUrl: item.showUrl,
imageUrl: item.imageUrl
}
} else if (/.doc$/.test(item.imageUrl) || /.docx$/.test(item.imageUrl)) {
item = {
url: require('@/assets/vms/img/doc.svg'),
showUrl: item.showUrl,
imageUrl: item.imageUrl
}
} else if (/.zip$/.test(item.imageUrl) || /.rar$/.test(item.imageUrl)) {
item = {
url: require('@/assets/vms/img/zip.svg'),
showUrl: item.showUrl,
imageUrl: item.imageUrl
}
} else if (/(.jpg|.png|.jpeg)$/.test(item.imageUrl)) {
item = {
url: item.imageUrl,
imageUrl: item.imageUrl
}
} else {
item = {
url: item.url,
imageUrl: item.url
}
}
return item
})
},
handleAvatarSuccess () {
},
handleRemove (file, fileList) {
const findIndex = this.fileSuccess.findIndex((item) => {
return item.url === file.imageUrl
})
this.fileSuccess.splice(findIndex, 1)
this.fileListFun()
this.$emit('input', this.fileSuccess)
},
handlePreview (file) {
if (!/(.jpg|.png|.jpeg|.webp|.svg)$/.test(file.imageUrl)) {
if (/.pdf$/.test(file.imageUrl)) {
window.open(file.imageUrl, '_blank')
} else {
window.open(file.imageUrl)
}
} else {
this.imgView = true
this.urlList = this.fileList.filter((item) => {
if (/(.jpg|.png|.jpeg|.webp|.svg)$/.test(item.imageUrl)) {
return item
}
}).map((item) => {
return item.imageUrl
})
this.initialIndex = this.urlList.findIndex((item) => {
return item === file.imageUrl
})
}
}
}
}
</script>
<style lang="scss">
.hide .el-upload--picture-card {
display: none;
}
</style>