|  | @@ -0,0 +1,427 @@
 | 
	
		
			
				|  |  | +// import { ElImage, ElMessage, ElUpload } from 'element-plus'
 | 
	
		
			
				|  |  | +import { defineComponent } from 'vue'
 | 
	
		
			
				|  |  | +import styles from './index.module.less'
 | 
	
		
			
				|  |  | +import iconUpload from '../col-upload/images/icon_upload.png'
 | 
	
		
			
				|  |  | +// import Cropper from './cropper'
 | 
	
		
			
				|  |  | +import { VueCropper } from 'vue-cropper'
 | 
	
		
			
				|  |  | +import umiRequest from 'umi-request'
 | 
	
		
			
				|  |  | +import 'vue-cropper/dist/index.css'
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  ElButton,
 | 
	
		
			
				|  |  | +  ElCol,
 | 
	
		
			
				|  |  | +  ElDialog,
 | 
	
		
			
				|  |  | +  ElIcon,
 | 
	
		
			
				|  |  | +  ElImage,
 | 
	
		
			
				|  |  | +  ElMessage,
 | 
	
		
			
				|  |  | +  ElUpload,
 | 
	
		
			
				|  |  | +  ElRow
 | 
	
		
			
				|  |  | +} from 'element-plus'
 | 
	
		
			
				|  |  | +import { CirclePlus, Remove } from '@element-plus/icons-vue'
 | 
	
		
			
				|  |  | +import iconRate from '../col-upload/images/icon_rate.png'
 | 
	
		
			
				|  |  | +import request from '@/helpers/request'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  name: 'col-cropper',
 | 
	
		
			
				|  |  | +  props: {
 | 
	
		
			
				|  |  | +    modelValue: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: ''
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    options: {
 | 
	
		
			
				|  |  | +      // 裁切需要参数
 | 
	
		
			
				|  |  | +      type: Object,
 | 
	
		
			
				|  |  | +      default: {
 | 
	
		
			
				|  |  | +        autoCrop: true, //是否默认生成截图框
 | 
	
		
			
				|  |  | +        enlarge: 1, //  图片放大倍数
 | 
	
		
			
				|  |  | +        autoCropWidth: 200, //默认生成截图框宽度
 | 
	
		
			
				|  |  | +        autoCropHeight: 200, //默认生成截图框高度
 | 
	
		
			
				|  |  | +        fixedBox: true, //是否固定截图框大小 不允许改变
 | 
	
		
			
				|  |  | +        previewsCircle: true, //预览图是否是原圆形
 | 
	
		
			
				|  |  | +        title: '上传图片'
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    // 显示图片原始图片
 | 
	
		
			
				|  |  | +    showSize: {
 | 
	
		
			
				|  |  | +      type: Boolean,
 | 
	
		
			
				|  |  | +      default: false
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    disabled: {
 | 
	
		
			
				|  |  | +      type: Boolean,
 | 
	
		
			
				|  |  | +      default: false
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    bucket: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: 'daya'
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    size: {
 | 
	
		
			
				|  |  | +      type: Number,
 | 
	
		
			
				|  |  | +      default: 5 // 默认5M
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    accept: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: 'images/*'
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    tips: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: '请上传图片'
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    extraTips: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: '图片最大不能超过5MB'
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    cropUploadSuccess: {
 | 
	
		
			
				|  |  | +      type: Function,
 | 
	
		
			
				|  |  | +      default: (data: string) => {}
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  data() {
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      isStopRun: false,
 | 
	
		
			
				|  |  | +      loading: false,
 | 
	
		
			
				|  |  | +      ossUploadUrl: 'https://ks3-cn-beijing.ksyuncs.com/' + this.bucket,
 | 
	
		
			
				|  |  | +      dataObj: {
 | 
	
		
			
				|  |  | +        policy: '',
 | 
	
		
			
				|  |  | +        signature: '',
 | 
	
		
			
				|  |  | +        key: '',
 | 
	
		
			
				|  |  | +        KSSAccessKeyId: '',
 | 
	
		
			
				|  |  | +        acl: 'public-read',
 | 
	
		
			
				|  |  | +        name: ''
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      visible: false,
 | 
	
		
			
				|  |  | +      img: null,
 | 
	
		
			
				|  |  | +      optionsList: {
 | 
	
		
			
				|  |  | +        img: '', //裁剪图片的地址
 | 
	
		
			
				|  |  | +        autoCrop: true, //是否默认生成截图框
 | 
	
		
			
				|  |  | +        autoCropWidth: 180, //默认生成截图框宽度
 | 
	
		
			
				|  |  | +        autoCropHeight: 180, //默认生成截图框高度
 | 
	
		
			
				|  |  | +        fixedBox: false, //是否固定截图框大小 不允许改变
 | 
	
		
			
				|  |  | +        full: false,
 | 
	
		
			
				|  |  | +        enlarge: 1, // 是否按照截图框比例输出 默认为1
 | 
	
		
			
				|  |  | +        previewsCircle: true, //预览图是否是原圆形
 | 
	
		
			
				|  |  | +        centerBox: true,
 | 
	
		
			
				|  |  | +        outputType: 'png',
 | 
	
		
			
				|  |  | +        title: '修改头像',
 | 
	
		
			
				|  |  | +        name: null // 文件名称
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      previews: {} as any,
 | 
	
		
			
				|  |  | +      url: {
 | 
	
		
			
				|  |  | +        upload: '/sys/common/saveToImgByStr'
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      submitLoading: false
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  methods: {
 | 
	
		
			
				|  |  | +    onDelete() {
 | 
	
		
			
				|  |  | +      // 删除图片
 | 
	
		
			
				|  |  | +      this.$emit('update:modelValue', '')
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //从本地选择文件
 | 
	
		
			
				|  |  | +    async handleChange(info: any) {
 | 
	
		
			
				|  |  | +      if (this.isStopRun) {
 | 
	
		
			
				|  |  | +        return
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.loading = true
 | 
	
		
			
				|  |  | +      const options = this.options
 | 
	
		
			
				|  |  | +      this.getBase64(info.file, (imageUrl: any) => {
 | 
	
		
			
				|  |  | +        const target = Object.assign({}, options, {
 | 
	
		
			
				|  |  | +          img: imageUrl,
 | 
	
		
			
				|  |  | +          name: info.file.name // 上传文件名
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +        // ;(this as any).$refs.CropperModal.edit(target)
 | 
	
		
			
				|  |  | +        this.edit(target)
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    // 上传之前 格式与大小校验
 | 
	
		
			
				|  |  | +    beforeUpload(file) {
 | 
	
		
			
				|  |  | +      this.isStopRun = false
 | 
	
		
			
				|  |  | +      var fileType = file.type
 | 
	
		
			
				|  |  | +      if (fileType.indexOf('image') < 0) {
 | 
	
		
			
				|  |  | +        ElMessage.warning('请上传图片')
 | 
	
		
			
				|  |  | +        this.isStopRun = true
 | 
	
		
			
				|  |  | +        return false
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      // const isJpgOrPng = this.acceptArray.includes(file.type)
 | 
	
		
			
				|  |  | +      // if (!isJpgOrPng) {
 | 
	
		
			
				|  |  | +      //   ElMessage.error('你上传图片格式不正确!')
 | 
	
		
			
				|  |  | +      //   this.isStopRun = true
 | 
	
		
			
				|  |  | +      // }
 | 
	
		
			
				|  |  | +      console.log(this.size)
 | 
	
		
			
				|  |  | +      const size = this.size || 0
 | 
	
		
			
				|  |  | +      const isLtSize = file.size < size * 1024 * 1024
 | 
	
		
			
				|  |  | +      if (!isLtSize) {
 | 
	
		
			
				|  |  | +        ElMessage.error('图片大小不能超过' + this.size + 'MB!')
 | 
	
		
			
				|  |  | +        this.isStopRun = true
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      return isLtSize
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    error() {
 | 
	
		
			
				|  |  | +      this.remove()
 | 
	
		
			
				|  |  | +      this.loading = false
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    remove() {
 | 
	
		
			
				|  |  | +      this.onDelete()
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //获取服务器返回的地址
 | 
	
		
			
				|  |  | +    handleCropperSuccess(data: any) {
 | 
	
		
			
				|  |  | +      //将返回的数据回显
 | 
	
		
			
				|  |  | +      this.loading = false
 | 
	
		
			
				|  |  | +      console.log(data, 'success')
 | 
	
		
			
				|  |  | +      this.$emit('update:modelValue', data)
 | 
	
		
			
				|  |  | +      // this.cropUploadSuccess(data)
 | 
	
		
			
				|  |  | +      // this.$emit('cropUploadSuccess', data)
 | 
	
		
			
				|  |  | +      // console.log(this.modelValue, 'modelValue')
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    // 取消上传
 | 
	
		
			
				|  |  | +    handleCropperClose() {
 | 
	
		
			
				|  |  | +      this.loading = false
 | 
	
		
			
				|  |  | +      this.remove()
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    getBase64(img, callback) {
 | 
	
		
			
				|  |  | +      const reader = new FileReader()
 | 
	
		
			
				|  |  | +      reader.addEventListener('load', () => callback(reader.result))
 | 
	
		
			
				|  |  | +      reader.readAsDataURL(img)
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    edit(record: any) {
 | 
	
		
			
				|  |  | +      const { options } = this
 | 
	
		
			
				|  |  | +      this.visible = true
 | 
	
		
			
				|  |  | +      this.optionsList = Object.assign({}, options, record)
 | 
	
		
			
				|  |  | +      console.log(this.options)
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 取消截图
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    cancelHandel() {
 | 
	
		
			
				|  |  | +      this.visible = false
 | 
	
		
			
				|  |  | +      // this.cropperNo()
 | 
	
		
			
				|  |  | +      this.loading = false
 | 
	
		
			
				|  |  | +      this.remove()
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 确认截图
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    okHandel() {
 | 
	
		
			
				|  |  | +      ;(this as any).$refs.cropperRef.getCropBlob(async data => {
 | 
	
		
			
				|  |  | +        this.submitLoading = true
 | 
	
		
			
				|  |  | +        const options: any = this.options
 | 
	
		
			
				|  |  | +        const fileName =
 | 
	
		
			
				|  |  | +          (options.name ? options.name.split('.')[0] : +new Date()) + '.png'
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +          let key = new Date().getTime() + fileName
 | 
	
		
			
				|  |  | +          let obj = {
 | 
	
		
			
				|  |  | +            filename: fileName,
 | 
	
		
			
				|  |  | +            bucketName: this.bucket,
 | 
	
		
			
				|  |  | +            postData: {
 | 
	
		
			
				|  |  | +              filename: fileName,
 | 
	
		
			
				|  |  | +              acl: 'public-read',
 | 
	
		
			
				|  |  | +              key: key,
 | 
	
		
			
				|  |  | +              unknowValueField: []
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          const res = await request.post('/api-website/getUploadSign', {
 | 
	
		
			
				|  |  | +            data: obj
 | 
	
		
			
				|  |  | +          })
 | 
	
		
			
				|  |  | +          this.dataObj = {
 | 
	
		
			
				|  |  | +            policy: res.data.policy,
 | 
	
		
			
				|  |  | +            signature: res.data.signature,
 | 
	
		
			
				|  |  | +            key: key,
 | 
	
		
			
				|  |  | +            KSSAccessKeyId: res.data.kssAccessKeyId,
 | 
	
		
			
				|  |  | +            acl: 'public-read',
 | 
	
		
			
				|  |  | +            name: fileName
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          let formData = new FormData()
 | 
	
		
			
				|  |  | +          for (let key in this.dataObj) {
 | 
	
		
			
				|  |  | +            formData.append(key, this.dataObj[key])
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          formData.append('file', this.blobToFile(data, fileName), fileName)
 | 
	
		
			
				|  |  | +          await umiRequest(this.ossUploadUrl, {
 | 
	
		
			
				|  |  | +            method: 'POST',
 | 
	
		
			
				|  |  | +            data: formData
 | 
	
		
			
				|  |  | +          })
 | 
	
		
			
				|  |  | +          console.log(this.ossUploadUrl + '/' + key)
 | 
	
		
			
				|  |  | +          const uploadUrl = this.ossUploadUrl + '/' + key
 | 
	
		
			
				|  |  | +          // this.cropperOk(uploadUrl)
 | 
	
		
			
				|  |  | +          this.$emit('update:modelValue', uploadUrl)
 | 
	
		
			
				|  |  | +        } catch (err: any) {
 | 
	
		
			
				|  |  | +          ElMessage.error(err)
 | 
	
		
			
				|  |  | +        } finally {
 | 
	
		
			
				|  |  | +          this.submitLoading = false
 | 
	
		
			
				|  |  | +          this.cancelHandel()
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //转成blob
 | 
	
		
			
				|  |  | +    blobToFile(Blob: any, fileName: any) {
 | 
	
		
			
				|  |  | +      //兼容IE
 | 
	
		
			
				|  |  | +      Blob.lastModifiedDate = new Date()
 | 
	
		
			
				|  |  | +      Blob.name = fileName
 | 
	
		
			
				|  |  | +      return Blob
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    base64ToFile(urlData: any, fileName: any) {
 | 
	
		
			
				|  |  | +      let arr = urlData.split(',')
 | 
	
		
			
				|  |  | +      let mime = arr[0].match(/:(.*?);/)[1]
 | 
	
		
			
				|  |  | +      let bytes = atob(arr[1]) // 解码base64
 | 
	
		
			
				|  |  | +      let n = bytes.length
 | 
	
		
			
				|  |  | +      let ia = new Uint8Array(n)
 | 
	
		
			
				|  |  | +      while (n--) {
 | 
	
		
			
				|  |  | +        ia[n] = bytes.charCodeAt(n)
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      return new File([ia], fileName, { type: mime })
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //移动框的事件
 | 
	
		
			
				|  |  | +    realTime(data: any) {
 | 
	
		
			
				|  |  | +      this.previews = data
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //图片缩放
 | 
	
		
			
				|  |  | +    changeScale(num: number) {
 | 
	
		
			
				|  |  | +      num = num || 1
 | 
	
		
			
				|  |  | +      ;(this as any).$refs.cropperRef.changeScale(num)
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //向左旋转
 | 
	
		
			
				|  |  | +    rotateLeft() {
 | 
	
		
			
				|  |  | +      ;(this as any).$refs.cropperRef.rotateLeft()
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    //向右旋转
 | 
	
		
			
				|  |  | +    rotateRight() {
 | 
	
		
			
				|  |  | +      ;(this as any).$refs.cropperRef.rotateRight()
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  render() {
 | 
	
		
			
				|  |  | +    return (
 | 
	
		
			
				|  |  | +      <div class={[styles.colUpload, 'w-full']}>
 | 
	
		
			
				|  |  | +        <ElUpload
 | 
	
		
			
				|  |  | +          disabled={this.disabled}
 | 
	
		
			
				|  |  | +          showFileList={false}
 | 
	
		
			
				|  |  | +          accept={this.accept}
 | 
	
		
			
				|  |  | +          beforeUpload={this.beforeUpload}
 | 
	
		
			
				|  |  | +          // @ts-ignore
 | 
	
		
			
				|  |  | +          httpRequest={this.handleChange}
 | 
	
		
			
				|  |  | +          // limit={1}
 | 
	
		
			
				|  |  | +          ref="uploadRef"
 | 
	
		
			
				|  |  | +        >
 | 
	
		
			
				|  |  | +          <div
 | 
	
		
			
				|  |  | +            ref="uploadDom"
 | 
	
		
			
				|  |  | +            class={[styles.uploadClass, 'w-full']}
 | 
	
		
			
				|  |  | +            style={{ height: '106px' }}
 | 
	
		
			
				|  |  | +          >
 | 
	
		
			
				|  |  | +            {this.modelValue ? (
 | 
	
		
			
				|  |  | +              <ElImage
 | 
	
		
			
				|  |  | +                src={this.modelValue}
 | 
	
		
			
				|  |  | +                fit="cover"
 | 
	
		
			
				|  |  | +                class={styles.uploadSection}
 | 
	
		
			
				|  |  | +              />
 | 
	
		
			
				|  |  | +            ) : (
 | 
	
		
			
				|  |  | +              <div
 | 
	
		
			
				|  |  | +                class={[
 | 
	
		
			
				|  |  | +                  styles.uploadSection,
 | 
	
		
			
				|  |  | +                  'flex items-center flex-col justify-center'
 | 
	
		
			
				|  |  | +                ]}
 | 
	
		
			
				|  |  | +              >
 | 
	
		
			
				|  |  | +                <img src={iconUpload} class="w-8 h-7 mb-3" />
 | 
	
		
			
				|  |  | +                <p>{this.tips}</p>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            )}
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </ElUpload>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <p class="text-3 text-[#999999] leading-6 pt-1">{this.extraTips}</p>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <ElDialog
 | 
	
		
			
				|  |  | +          modelValue={this.visible}
 | 
	
		
			
				|  |  | +          onUpdate:modelValue={val => (this.visible = val)}
 | 
	
		
			
				|  |  | +          appendToBody
 | 
	
		
			
				|  |  | +          title={this.options.title}
 | 
	
		
			
				|  |  | +          closeOnClickModal={false}
 | 
	
		
			
				|  |  | +          width={'800px'}
 | 
	
		
			
				|  |  | +          v-slots={{
 | 
	
		
			
				|  |  | +            footer: () => (
 | 
	
		
			
				|  |  | +              <span class="dialog-footer !text-center block">
 | 
	
		
			
				|  |  | +                <ElButton
 | 
	
		
			
				|  |  | +                  onClick={this.cancelHandel}
 | 
	
		
			
				|  |  | +                  disabled={this.submitLoading}
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                  取消
 | 
	
		
			
				|  |  | +                </ElButton>
 | 
	
		
			
				|  |  | +                <ElButton
 | 
	
		
			
				|  |  | +                  type="primary"
 | 
	
		
			
				|  |  | +                  onClick={this.okHandel}
 | 
	
		
			
				|  |  | +                  loading={this.submitLoading}
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                  保 存
 | 
	
		
			
				|  |  | +                </ElButton>
 | 
	
		
			
				|  |  | +              </span>
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +          }}
 | 
	
		
			
				|  |  | +        >
 | 
	
		
			
				|  |  | +          <ElRow>
 | 
	
		
			
				|  |  | +            <ElCol xs={24} md={12} style={{ width: '350px' }}>
 | 
	
		
			
				|  |  | +              <VueCropper
 | 
	
		
			
				|  |  | +                ref="cropperRef"
 | 
	
		
			
				|  |  | +                img={this.optionsList.img}
 | 
	
		
			
				|  |  | +                info={true}
 | 
	
		
			
				|  |  | +                autoCrop={this.optionsList.autoCrop}
 | 
	
		
			
				|  |  | +                autoCropWidth={this.optionsList.autoCropWidth}
 | 
	
		
			
				|  |  | +                full={this.optionsList.full}
 | 
	
		
			
				|  |  | +                outputType={this.optionsList.outputType}
 | 
	
		
			
				|  |  | +                autoCropHeight={this.optionsList.autoCropHeight}
 | 
	
		
			
				|  |  | +                fixedBox={this.optionsList.fixedBox}
 | 
	
		
			
				|  |  | +                enlarge={this.optionsList.enlarge}
 | 
	
		
			
				|  |  | +                onRealTime={this.realTime}
 | 
	
		
			
				|  |  | +                style={{ height: '350px' }}
 | 
	
		
			
				|  |  | +              />
 | 
	
		
			
				|  |  | +              <div class="flex pt-2">
 | 
	
		
			
				|  |  | +                <div
 | 
	
		
			
				|  |  | +                  onClick={() => {
 | 
	
		
			
				|  |  | +                    this.changeScale(1)
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                  class="mr-2 cursor-pointer"
 | 
	
		
			
				|  |  | +                  title="放大"
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                  <ElIcon size={30} color="#333">
 | 
	
		
			
				|  |  | +                    <CirclePlus />
 | 
	
		
			
				|  |  | +                  </ElIcon>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +                <div
 | 
	
		
			
				|  |  | +                  onClick={() => {
 | 
	
		
			
				|  |  | +                    this.changeScale(-1)
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                  class="mr-2 cursor-pointer"
 | 
	
		
			
				|  |  | +                  title="缩小"
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                  <ElIcon size={30} color="#333">
 | 
	
		
			
				|  |  | +                    <Remove />
 | 
	
		
			
				|  |  | +                  </ElIcon>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +                <div
 | 
	
		
			
				|  |  | +                  onClick={this.rotateRight}
 | 
	
		
			
				|  |  | +                  title="向右旋转"
 | 
	
		
			
				|  |  | +                  class="cursor-pointer"
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                  <img src={iconRate} class="w-[30px] h-[30px]" />
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </ElCol>
 | 
	
		
			
				|  |  | +            <ElCol xs={24} md={12} style={{ height: '350px' }}>
 | 
	
		
			
				|  |  | +              <div class={styles.previewImg}>
 | 
	
		
			
				|  |  | +                <span>预览图片</span>
 | 
	
		
			
				|  |  | +                <div
 | 
	
		
			
				|  |  | +                  class={
 | 
	
		
			
				|  |  | +                    this.optionsList.previewsCircle
 | 
	
		
			
				|  |  | +                      ? styles['avatar-upload-preview']
 | 
	
		
			
				|  |  | +                      : styles['avatar-upload-preview_range']
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                  style={{
 | 
	
		
			
				|  |  | +                    width: this.optionsList.autoCropWidth + 'px',
 | 
	
		
			
				|  |  | +                    height: this.optionsList.autoCropHeight + 'px'
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                >
 | 
	
		
			
				|  |  | +                  <ElImage src={this.previews.url} style={this.previews.img} />
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </ElCol>
 | 
	
		
			
				|  |  | +          </ElRow>
 | 
	
		
			
				|  |  | +        </ElDialog>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +})
 |