<template> 
 | 
  <div> 
 | 
    <el-upload 
 | 
        class="avatar-uploader" 
 | 
        accept=".png,.jpg,.jpeg" 
 | 
        :style="customStyle" 
 | 
        action="" 
 | 
        :auto-upload="false" 
 | 
        :show-file-list="false" 
 | 
        :on-change='openUpdateIcon'> 
 | 
      <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> 
 | 
    <el-dialog 
 | 
        append-to-body 
 | 
        :close-on-click-modal="false" 
 | 
        title="上传图片" 
 | 
        :visible.sync="updateImg" 
 | 
        width="1000px" 
 | 
        class="icon-dialog-wrapper dialong-com-style"> 
 | 
      <ImageCropper ref="iconShot" v-if="updateImg" :imgSrc="img" > 
 | 
      </ImageCropper> 
 | 
      <span slot="footer" class="dialog-footer"> 
 | 
            <el-button @click="updateImg = false">取 消</el-button> 
 | 
            <el-button type="primary" @click="uploadIcon">确 定</el-button> 
 | 
          </span> 
 | 
    </el-dialog> 
 | 
  </div> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
import ImageCropper from '@/components/common/ImageCropper' 
 | 
import { upload } from '@/api/system/common' 
 | 
export default { 
 | 
  components: { ImageCropper }, 
 | 
  props: { 
 | 
    file: { 
 | 
      type: Object, 
 | 
      default: () => {} 
 | 
    }, 
 | 
    tipsLabel: '', 
 | 
    customStyle: { 
 | 
      type: String, 
 | 
      default: 'width: 90px; height: 90px;' 
 | 
    }, 
 | 
    uploadData: Object 
 | 
  }, 
 | 
  data () { 
 | 
    return { 
 | 
      fileInfo:{}, 
 | 
      img: null, 
 | 
      updateImg: false, 
 | 
      imageSrc: null, 
 | 
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload' 
 | 
    } 
 | 
  }, 
 | 
  
 | 
  methods: { 
 | 
    uploadIcon () { 
 | 
      // 获取裁剪后的图片 
 | 
      this.$refs.iconShot.getImagecropper().getCropBlob((fileData) => { // 获取当前裁剪好的数据 
 | 
        // 注此时的data是一个Blob数据,部分接口接收的是File转化的FormData数据 
 | 
        console.log(fileData) 
 | 
        const formData = new FormData() 
 | 
  
 | 
        formData.append('folder', 'member') 
 | 
        formData.append( 
 | 
            'file', 
 | 
            new File( 
 | 
                [fileData], // 将Blob类型转化成File类型 
 | 
                this.fileInfo.name, // 设置File类型的文件名称 
 | 
                { type: this.fileInfo.type } // 设置File类型的文件类型 
 | 
            ) 
 | 
        ) 
 | 
        upload(formData).then(res => { 
 | 
          console.log(res) 
 | 
          this.file.imgurl = res.imgaddr 
 | 
          this.file.imgurlfull = res.url 
 | 
          this.$message.success('上传成功') 
 | 
          this.imageSrc = res.url 
 | 
          this.updateImg = false 
 | 
          this.$emit('uploadSuccess', { imgurl: res.imgaddr, imgurlfull: res.url, name: res.originname }) 
 | 
          this.$emit('uploadEnd') 
 | 
        }) 
 | 
      }) 
 | 
    }, 
 | 
  
 | 
    // 上传图片 
 | 
    openUpdateIcon (file, fileList) { 
 | 
      const isJPG = file.raw.type === 'image/jpeg' || file.raw.type === 'image/png' 
 | 
      const isLt2M = file.size / 1024 / 1024 < 5 
 | 
      if (!isJPG) { 
 | 
        this.$message.error('上传头像图片只能是 JPG/PNG 格式!') 
 | 
        return false 
 | 
      } 
 | 
      if (!isLt2M) { 
 | 
        this.$message.error('上传头像图片大小不能超过 5MB!') 
 | 
        return false 
 | 
      } 
 | 
      // 上传成功后将图片地址赋值给裁剪框显示图片 
 | 
      this.$nextTick(async () => { 
 | 
        // base64方式 
 | 
        // this.option.img = await fileByBase64(file.raw) 
 | 
        this.fileInfo.name = file.name 
 | 
        this.fileInfo.type = file.type 
 | 
        console.log(file, fileList) 
 | 
        this.img = URL.createObjectURL(file.raw) 
 | 
        // this.loading = false 
 | 
        this.updateImg = true 
 | 
      }) 
 | 
    }, 
 | 
    handleAvatarSuccess (res, file) { 
 | 
      if (res.code == 200) { 
 | 
        const { data } = res 
 | 
        this.file.imgurl = data.imgaddr 
 | 
        this.file.imgurlfull = data.url 
 | 
        this.$message.success('上传成功') 
 | 
        this.imageSrc = data.url 
 | 
        this.updateImg = true 
 | 
        // this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url, name: data.originname }) 
 | 
      } else { 
 | 
        this.$message.error('上传失败') 
 | 
      } 
 | 
      this.$emit('uploadEnd') 
 | 
    }, 
 | 
    uploadError () { 
 | 
      this.$message.error('上传失败') 
 | 
      this.$emit('uploadEnd') 
 | 
    }, 
 | 
    // // 拦截 
 | 
    beforeAvatarUpload (file) { 
 | 
      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: 100% !important; 
 | 
  height: auto !important; 
 | 
  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> 
 |