245 lines
5.3 KiB
Vue
245 lines
5.3 KiB
Vue
<template>
|
|
<view class="uploadImgView">
|
|
<view class="uploadTitle" v-if="name && name!=''">
|
|
<view class="name font_bold">{{name}}</view>
|
|
<view class="limit">{{newList.length}}/{{limit}}</view>
|
|
</view>
|
|
<view class="imgList">
|
|
<view class="uploadFlex itemBox" v-for="(item,index) in newList" :key="index">
|
|
<view class="imgItem">
|
|
<view class="itemImg">
|
|
<image class="img" :src="item" mode="scaleToFill"></image>
|
|
</view>
|
|
<view class="deleteBox" @click="deleteImg(index)">
|
|
<text class="icon iconfont icon-a-shanchu21"></text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="uploadFlex itemBox" v-for="(item,index) in uploadList" :key="index">
|
|
<view class="imgItem">
|
|
<view class="itemImg">
|
|
<image class="img" :src="item.path" mode="scaleToFill"></image>
|
|
</view>
|
|
<view class="progressView">
|
|
<view class="progressWidth" :style="'width:'+item.progress+'%'"></view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="uploadBut itemBox" @click="upload()" v-if="newList.length<limit">
|
|
<view class="img_but">
|
|
<view class="icon iconfont icon-a-shangchuanzhaopian2 font35"></view>
|
|
<view class="text font12">
|
|
上传图片
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default{
|
|
data(){
|
|
return{
|
|
newList:this.list,
|
|
uploadList:[],
|
|
|
|
oss:{},
|
|
}
|
|
},
|
|
props:{
|
|
name:{
|
|
type:[String],
|
|
default:''
|
|
},
|
|
limit:{
|
|
type:[Number,String],
|
|
default:1
|
|
},
|
|
list:{
|
|
type:[Array,Object],
|
|
default: () => []
|
|
},
|
|
},
|
|
watch:{
|
|
list:{
|
|
handler(val){
|
|
this.newList = val;
|
|
},
|
|
immediate:true,
|
|
deep:true
|
|
}
|
|
},
|
|
mounted() {
|
|
this.getOss();
|
|
},
|
|
onShow() {
|
|
|
|
},
|
|
methods:{
|
|
// 获取图片oss 服务地址
|
|
getOss(){
|
|
this.$api.getOss('/oss.sign',{dir:'mes'}).then(res=>{
|
|
this.oss = res.data;
|
|
}).catch(err=>{})
|
|
},
|
|
deleteImg(num){
|
|
this.newList.forEach((item,index)=>{
|
|
if(num == index){
|
|
this.newList.splice(index,1);
|
|
}
|
|
})
|
|
this.$emit('input',this.newList);
|
|
},
|
|
upload(){
|
|
uni.chooseImage({
|
|
count:9,
|
|
success: (chooseImageRes) => {
|
|
const tempFilePaths = chooseImageRes.tempFilePaths;
|
|
tempFilePaths.forEach((item,index)=>{
|
|
let num = item.length;
|
|
let nameStr = item.toString();
|
|
let name = Date.parse(new Date())+'/'+nameStr.substring(nameStr-8);
|
|
let fileName = this.oss.dir+'/'+ name;
|
|
let text = Date.parse(new Date())+'_'+index;
|
|
|
|
let obj = {
|
|
path:nameStr,
|
|
text:text,
|
|
progress:0,
|
|
}
|
|
this.uploadList.push(obj)
|
|
|
|
this.uploadOss(item,name,fileName,text);
|
|
})
|
|
},
|
|
fail:(errUpload)=> {
|
|
|
|
}
|
|
});
|
|
},
|
|
uploadOss(url,name,fileName,text){
|
|
const uploadTask = uni.uploadFile({
|
|
url:this.oss.host,
|
|
header:{
|
|
'Content-Type':'application/x-www-form-urlencoded',
|
|
},
|
|
filePath: url,
|
|
name: 'file',
|
|
formData: {
|
|
'name':name,
|
|
'key': fileName,
|
|
'policy': this.oss.policy,
|
|
'OSSAccessKeyId': this.oss.accessid,
|
|
'success_action_status':200,
|
|
'Signature': this.oss.signature,
|
|
},
|
|
success: (uploadFileRes)=>{
|
|
this.newList.push(this.oss.host+fileName);
|
|
this.uploadList = [];
|
|
this.$emit('input',this.newList);
|
|
},
|
|
fail:(err)=>{
|
|
uni.showModal({
|
|
content: err.errMsg,
|
|
showCancel: false
|
|
});
|
|
}
|
|
});
|
|
uploadTask.onProgressUpdate((res) => {
|
|
this.uploadList.forEach((item,index)=>{
|
|
if(item.text == text){
|
|
item.progress = res.progress;
|
|
}
|
|
})
|
|
});
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.uploadTitle{
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
margin-bottom: 6px;
|
|
.limit{
|
|
color: $uni-text-color-info;
|
|
}
|
|
}
|
|
.imgList{
|
|
height: 100%;
|
|
width: 100%;
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
.uploadFlex{
|
|
display: flex;
|
|
}
|
|
.itemBox{
|
|
width: 32%;
|
|
height: 100px;
|
|
margin-right: 2%;
|
|
padding: 7px 0 0 0;
|
|
box-sizing: border-box;
|
|
.imgItem{
|
|
width: 100%;
|
|
height: 100%;
|
|
position: relative;
|
|
.itemImg{
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
.img{
|
|
width: 100%;
|
|
height: 100%;
|
|
border-radius: 4px;
|
|
}
|
|
.deleteBox{
|
|
position: absolute;
|
|
top: 3px;
|
|
right: 3px;
|
|
z-index: 20;
|
|
width: 26px;
|
|
height: 26px;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background: $uni-bg-color-delete;
|
|
.icon{font-size: 14px;}
|
|
}
|
|
}
|
|
}
|
|
.itemBox:nth-child(3n){
|
|
margin-right: 0;
|
|
}
|
|
.uploadBut{
|
|
height: 93px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
align-items: center;
|
|
background: $uni-bg-color-placeholder;
|
|
border-radius: 4px;
|
|
margin: 7px 0 0 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
}
|
|
}
|
|
|
|
.img_but{
|
|
display: flex;flex-direction: column;align-items: center;
|
|
.icon{color: $uni-text-color-inverse;}
|
|
.text{margin-top: 5px;}
|
|
}
|
|
|
|
.progressView{
|
|
position: absolute;bottom: 0;left: 0;z-index: 2;
|
|
width: 100%;height: 6px;background: $uni-bg-color-placeholder;border-radius: 8px;
|
|
.progressWidth{
|
|
height: 6px;background: $uni-color-primary;
|
|
border-radius: 8px;
|
|
}
|
|
}
|
|
</style> |