<template> 
 | 
  <div> 
 | 
    <el-upload class="avatar-uploader" accept=".png,.jpg,.jpeg" :style="customStyle" :action="uploadImgUrl" 
 | 
      :data="uploadData" :show-file-list="false" :on-success="handleAvatarSuccess" :on-error="uploadError" 
 | 
      :before-upload="beforeAvatarUpload"> 
 | 
      <img v-if="file.imgurlfull" style="width: 100%;" :src="file.imgurlfull" :style="customStyle" class="avatar"> 
 | 
      <div v-else :style="customStyle"> 
 | 
        <i class="el-icon-plus avatar-uploader-icon"></i> 
 | 
        <div class="tips-style">{{ tipsLabel }}</div> 
 | 
      </div> 
 | 
    </el-upload> 
 | 
  </div> 
 | 
  
 | 
</template> 
 | 
  
 | 
<script> 
 | 
import { Loading } from 'element-ui' 
 | 
export default { 
 | 
  props: { 
 | 
    file: { 
 | 
      type: Object, 
 | 
      default: () => { } 
 | 
    }, 
 | 
    tipsLabel: '', 
 | 
    customStyle: { 
 | 
      type: String, 
 | 
      default: 'width: 90px; max-height: 90px;' 
 | 
    }, 
 | 
    uploadData: Object 
 | 
  }, 
 | 
  data() { 
 | 
    return { 
 | 
      loading: null, 
 | 
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/web/public/upload' 
 | 
    } 
 | 
  }, 
 | 
  
 | 
  methods: { 
 | 
    // 上传图片 
 | 
    handleAvatarSuccess(res, file) { 
 | 
      this.$nextTick(() => { // 以服务的方式调用的 Loading 需要异步关闭 
 | 
        this.loading.close() 
 | 
      }) 
 | 
      if (res.code == 200) { 
 | 
        let { data } = res 
 | 
        this.file.imgurl = data.imgaddr 
 | 
        this.file.imgurlfull = data.url 
 | 
        this.$message.success('上传成功') 
 | 
        this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url, name: data.originname }) 
 | 
      } else { 
 | 
        this.$message.error('上传失败') 
 | 
      } 
 | 
      this.$emit('uploadEnd') 
 | 
    }, 
 | 
    uploadError() { 
 | 
      this.$message.error('上传失败') 
 | 
      this.$nextTick(() => { // 以服务的方式调用的 Loading 需要异步关闭 
 | 
        this.loading.close() 
 | 
      }) 
 | 
      this.$emit('uploadEnd') 
 | 
    }, 
 | 
    // // 拦截 
 | 
    beforeAvatarUpload(file) { 
 | 
      this.loading = Loading.service({ 
 | 
        lock: true, 
 | 
        text: 'Loading', 
 | 
        spinner: 'el-icon-loading', 
 | 
        background: 'rgba(0, 0, 0, 0.7)' 
 | 
      }) 
 | 
      this.$emit('uploadBegin') 
 | 
      return true 
 | 
    } 
 | 
  } 
 | 
} 
 | 
</script> 
 | 
  
 | 
<style lang="scss" scoped> 
 | 
$image-width: 90px; 
 | 
  
 | 
.avatar-uploader { 
 | 
  width: $image-width; 
 | 
  height: $image-width; 
 | 
} 
 | 
  
 | 
::v-deep .el-upload { 
 | 
  border: 1px dashed #d9d9d9; 
 | 
  border-radius: 6px; 
 | 
  cursor: pointer; 
 | 
  position: relative; 
 | 
  overflow: hidden; 
 | 
} 
 | 
  
 | 
.avatar-uploader .el-upload:hover { 
 | 
  border-color: #409EFF; 
 | 
} 
 | 
  
 | 
.avatar-uploader-icon { 
 | 
  line-height: 90px; 
 | 
  font-size: 28px; 
 | 
  color: #8c939d; 
 | 
  width: $image-width; 
 | 
  height: $image-width; 
 | 
  text-align: center; 
 | 
} 
 | 
  
 | 
.avatar { 
 | 
  width: 90px; 
 | 
  max-height: 90px; 
 | 
  display: block; 
 | 
} 
 | 
  
 | 
.tips-style { 
 | 
  height: 13px; 
 | 
  font-size: 13px; 
 | 
  font-weight: 400; 
 | 
  color: #999999; 
 | 
  line-height: 13px; 
 | 
} 
 | 
</style> 
 | 
<style lang="scss" scoped> 
 | 
::v-deep .el-upload--picture-card { 
 | 
  width: 90px !important; 
 | 
  height: 90px !important; 
 | 
} 
 | 
  
 | 
::v-deep .el-upload-list__item { 
 | 
  width: 90px !important; 
 | 
  height: 90px !important; 
 | 
} 
 | 
  
 | 
.icon { 
 | 
  -webkit-transform: translate(-50%, -50%); 
 | 
  -ms-transform: translate(-50%, -50%); 
 | 
  transform: translate(0%, -85%); 
 | 
} 
 | 
  
 | 
::v-deep .el-upload-list__item { 
 | 
  width: 90px !important; 
 | 
  height: 90px !important; 
 | 
} 
 | 
</style> 
 |