| | |
| | | <template> |
| | | <div class="my-upload"> |
| | | <div v-if="pictureList.length > 0" class="image-box"> |
| | | <div v-for="image in pictureList" class="image-box-item"> |
| | | <i |
| | | v-if="isShowUpload" |
| | | @click="handleDeletePicture(image)" |
| | | class="el-icon-delete image-delete-icon" |
| | | ></i> |
| | | <div v-for="image in pictureList" :class="{ 'image-box-item': true, 'image-box-item-cover': isShowUpload }"> |
| | | <span v-if="isShowUpload" @click="handleDeletePicture(image)" class="image-delete-icon el-icon-delete"></span> |
| | | <el-image :key="image" class="image-content" :src="image"></el-image> |
| | | </div> |
| | | </div> |
| | | <el-upload |
| | | v-if="isShowUpload" |
| | | v-if="isShowUpload && pictureList.length < limit" |
| | | :file-list="fileList" |
| | | action="/sccg/file/medias" |
| | | v-loading="loading" |
| | | element-loading-spinner="el-icon-loading" |
| | | element-loading-background="rgba(0, 0, 0, 0.8)" |
| | | action="" |
| | | :multiple="multiple" |
| | | :show-file-list="flag" |
| | | :before-upload="beforeUpload" |
| | | :limit="limit" |
| | | :on-success="handleSuccess" |
| | | :on-error="handleError" |
| | | :list-type="listType" |
| | | :headers="getToken()" |
| | | :auto-upload="true" |
| | | :http-request="handleUpload" |
| | | style="margin-left: 14px;" |
| | | > |
| | | <div class="upload-btn"> |
| | | <i class="el-icon-plus"></i> |
| | |
| | | </div> |
| | | </template> |
| | | <script> |
| | | import imageManagement from "@/api/operate/imageManagement"; |
| | | |
| | | export default { |
| | | data() { |
| | | return { |
| | |
| | | limit: 4, |
| | | // 文件列表类型 |
| | | listType: "picture-card", |
| | | loading: false |
| | | }; |
| | | }, |
| | | methods: { |
| | | // 上传之前回调 |
| | | beforeUpload(rawFile) { |
| | | // 验证上传文件 |
| | | validateFile(file) { |
| | | if ( |
| | | rawFile.type !== "image/png" && |
| | | rawFile.type !== "image/svg+xml" && |
| | | rawFile.type !== "image/jpg" && |
| | | rawFile.type !== "image/jpeg" |
| | | file.type !== "image/png" && |
| | | file.type !== "image/svg+xml" && |
| | | file.type !== "image/jpg" && |
| | | file.type !== "image/jpeg" |
| | | ) { |
| | | this.$message.error("图片必须是 jpg/svg/jpeg/png 格式!"); |
| | | return false; |
| | | } else if (rawFile.size / 1024 / 1024 > 5) { |
| | | this.loading = false; |
| | | return false; |
| | | } |
| | | |
| | | if (file.size / 1024 / 1024 > 5) { |
| | | this.$message.error("上传图片不能超过 5MB!"); |
| | | this.loading = false; |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | // 上传成功回调 |
| | | handleSuccess(res, file, filelist) { |
| | | if (res.data.url1) { |
| | | this.$emit("setPictureUrl", { url: res.data.url1 }); |
| | | } else if (res.data.url2) { |
| | | this.$emit("setPictureUrl", { url: res.data.url2 }); |
| | | } else if (res.data.url3) { |
| | | this.$emit("setPictureUrl", { url: res.data.url3 }); |
| | | } else { |
| | | this.$emit("setPictureUrl", { url: res.data.url4 }); |
| | | |
| | | handleUpload(data) { |
| | | this.loading = true; |
| | | const { file } = data; |
| | | const validate = this.validateFile(file); |
| | | if (!validate) { |
| | | return; |
| | | } |
| | | }, |
| | | // 上传失败回调 |
| | | handleError(err, file, fileList) { |
| | | this.$message({ |
| | | type: "error", |
| | | message: err, |
| | | }); |
| | | }, |
| | | // 获取token |
| | | getToken() { |
| | | const token = sessionStorage.getItem("token"); |
| | | const tokenHead = sessionStorage.getItem("tokenHead"); |
| | | if (token && tokenHead) { |
| | | return { Authorization: tokenHead + token }; |
| | | } |
| | | const formData = new FormData(); |
| | | formData.append('file', file); |
| | | imageManagement.importImage(formData) |
| | | .then(({ url1, url2, url3, url4 }) => { |
| | | const url = url1 ?? url2 ?? url3 ?? url4; |
| | | this.$emit('setPictureUrl', { url: url }); |
| | | this.loading = false; |
| | | }) |
| | | .catch(err => { |
| | | this.loading = false; |
| | | this.$message.error(err); |
| | | }) |
| | | }, |
| | | |
| | | handleDeletePicture(imageUrl) { |
| | |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | height: 100px; |
| | | margin: 0 10px; |
| | | |
| | | .image-content { |
| | | width: 100px; |
| | | height: 100px; |
| | | } |
| | | |
| | | .image-delete-icon { |
| | | position: relative; |
| | | bottom: calc(100% - 50px); |
| | | left: calc(100% - 50px); |
| | | position: absolute; |
| | | top: 45px; |
| | | left: 45px; |
| | | opacity: 0; |
| | | } |
| | | |
| | | .image-box-item { |
| | | padding: 0px 10px; |
| | | position: sticky; |
| | | margin: 0 10px; |
| | | } |
| | | .image-box-item:hover { |
| | | color: #ffffff; |
| | | opacity: 0.5; |
| | | |
| | | .image-box-item-cover:hover { |
| | | .image-content { |
| | | box-shadow: #ffffff; |
| | | opacity: 0.5; |
| | | } |
| | | |
| | | .image-delete-icon { |
| | | color: red; |
| | | font-size: 14px; |
| | | z-index: 2; |
| | | opacity: 1; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | } |