parent
c2ce25de03
commit
96c8a1d506
@ -0,0 +1,224 @@
|
|||||||
|
<template>
|
||||||
|
<div class="image-chooser" v-loading="loading">
|
||||||
|
<div v-for="(item, i) in list" :key="item.id" class="image-item">
|
||||||
|
<img :src="imageUrl(item)" />
|
||||||
|
<i v-if="!readonly" class="el-icon-circle-close" @click.stop="removeImage(item, i)"></i>
|
||||||
|
</div>
|
||||||
|
<div class="image-item" v-loading="uploading" v-if="!readonly">
|
||||||
|
<el-popover
|
||||||
|
v-model="bubVisible"
|
||||||
|
placement="top"
|
||||||
|
trigger="click">
|
||||||
|
<el-button type="primary" size="small" @click="goChooseImage" plain>选择系统图库</el-button>
|
||||||
|
<el-upload
|
||||||
|
ref="upload"
|
||||||
|
class="image-uploader"
|
||||||
|
:action="uploadFileUrl"
|
||||||
|
:show-file-list="false"
|
||||||
|
:on-change="handleFileChange"
|
||||||
|
:on-success="handleFileSuccess"
|
||||||
|
:on-error="handleFileError"
|
||||||
|
:before-upload="beforeFileUpload"
|
||||||
|
:auto-upload="true"
|
||||||
|
:headers="headers"
|
||||||
|
:data="uploadData"
|
||||||
|
:limit="1" accept=".png,.jpg,.jpeg,.gif">
|
||||||
|
<el-button type="success" size="small" style="margin-top: 10px;width: 104px;" plain>上传图片</el-button>
|
||||||
|
</el-upload>
|
||||||
|
<div class="image-choose" slot="reference">
|
||||||
|
<i class="el-icon-plus"></i>
|
||||||
|
</div>
|
||||||
|
</el-popover>
|
||||||
|
</div>
|
||||||
|
<ImageChooseDialog ref="imageChooseDialog" @confirm="addImages"></ImageChooseDialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { delImages, listImages } from "@/api/gallery/images";
|
||||||
|
import { getToken } from "@/utils/auth";
|
||||||
|
import { formatDateStr } from "@/utils";
|
||||||
|
import ImageChooseDialog from "./ImageChooseDialog";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'ImageChooser',
|
||||||
|
components: {
|
||||||
|
ImageChooseDialog,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
value: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
|
queryId: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
readonly: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
tag: {
|
||||||
|
type: Object,
|
||||||
|
default: () => ({})
|
||||||
|
},
|
||||||
|
taskName: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
prop: 'value',
|
||||||
|
event: 'change'
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
if (this.queryId) {
|
||||||
|
this.loading = true;
|
||||||
|
listImages({
|
||||||
|
feedbackId: this.queryId,
|
||||||
|
}).then(res => {
|
||||||
|
this.list = res.data || [];
|
||||||
|
this.loading = false;
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false;
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
uploadFileUrl: process.env.VUE_APP_BASE_API + "/gallery/images/upload", // 上传文件服务器地址
|
||||||
|
headers: {
|
||||||
|
Authorization: "Bearer " + getToken(),
|
||||||
|
},
|
||||||
|
list: [],
|
||||||
|
uploadData: {
|
||||||
|
imageTitle: this.taskName + '任务-' + this.tag.tagName + '图片',
|
||||||
|
photoTime: formatDateStr(),// 图片拍摄时间,
|
||||||
|
uploadTime: formatDateStr(),
|
||||||
|
isOpen: 1,
|
||||||
|
keyWords: '任务',
|
||||||
|
cataId: this.tag.saveDir,
|
||||||
|
},
|
||||||
|
uploading: false,
|
||||||
|
loading: false,
|
||||||
|
bubVisible: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
imageUrl(item) {
|
||||||
|
let url = item.imagePath;
|
||||||
|
if (item.file?.length > 0) {
|
||||||
|
url = item.file[0].attachFileUrl || item.imagePath;
|
||||||
|
}
|
||||||
|
if (url.indexOf("http") === 0 || url.indexOf("blob:") === 0) {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
return process.env.VUE_APP_BASE_API + url;
|
||||||
|
},
|
||||||
|
handleFileChange(file) {
|
||||||
|
|
||||||
|
},
|
||||||
|
beforeFileUpload() {
|
||||||
|
this.uploading = true;
|
||||||
|
},
|
||||||
|
handleFileSuccess(res, file) {
|
||||||
|
this.uploading = false;
|
||||||
|
if (res.code === 200) {
|
||||||
|
this.$message.success('上传成功');
|
||||||
|
console.log('上传成功;', res);
|
||||||
|
|
||||||
|
this.list.push({
|
||||||
|
imagePath: URL.createObjectURL(file.raw),
|
||||||
|
id: res.imageId,
|
||||||
|
_new: true,
|
||||||
|
});
|
||||||
|
this.$emit('change', this.list.map(item => item.id));
|
||||||
|
this.bubVisible = false;
|
||||||
|
} else {
|
||||||
|
this.$message.error('上传失败');
|
||||||
|
|
||||||
|
}
|
||||||
|
this.$refs.upload.clearFiles();
|
||||||
|
},
|
||||||
|
handleFileError() {
|
||||||
|
this.$message.error('上传失败');
|
||||||
|
this.uploading = false;
|
||||||
|
},
|
||||||
|
removeImage(item, i) {
|
||||||
|
if (item._new) {
|
||||||
|
this.loading = true;
|
||||||
|
delImages(item.id).then(() => {
|
||||||
|
this.$message.success('删除成功');
|
||||||
|
this.list.splice(i, 1);
|
||||||
|
this.$emit('change', this.list.map(item => item.id));
|
||||||
|
this.loading = false;
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false;
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.list.splice(i, 1);
|
||||||
|
this.$emit('change', this.list.map(item => item.id));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
goChooseImage() {
|
||||||
|
this.bubVisible = false;
|
||||||
|
this.$refs.imageChooseDialog.open();
|
||||||
|
},
|
||||||
|
addImages(list) {
|
||||||
|
this.list = this.list.concat(list);
|
||||||
|
this.$emit('change', this.list.map(item => item.id));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.image-chooser {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.image-item {
|
||||||
|
background: #f3f3f3;
|
||||||
|
width: 100px;
|
||||||
|
height: 100px;
|
||||||
|
border: 1px solid #eee;
|
||||||
|
border-radius: 8px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-icon-circle-close {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
display: none;
|
||||||
|
font-size: 22px;
|
||||||
|
color: #f56c6c;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-choose {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 30px;
|
||||||
|
color: #ccc
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
.image-item:hover {
|
||||||
|
.el-icon-circle-close {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.image-item + .image-item {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in new issue