vue 簽名

<template>
  <div ref="signaturePanel" class="signaturePanel">
    <div  class="title" ref="title"  @click="clearAll">請?jiān)谙路絽^(qū)域簽字</div>
    <canvas ref="drawingBoard" class="drawingBoard" @mousedown="mousedown" @mousemove="mousemove" @mouseup="mouseup" v-show="!mySignature"></canvas>
    <img class="drawingBoard" :src="mySignature" v-show="mySignature"/>
    <div class="clear" @click="clearAll"><img src="../img/clear.png"/>{{mySignature ? '重新簽名':'清除'}}</div>
    <!-- <div class="nextBtn validate" @click="clearAll">提交</div> -->
    <!-- <input type="file" ref="textDom"/> -->
  </div>
</template>
<script>
import {uploadShareImages} from '../api/api'
export default {
  props: {
    signature: {
      type: String,
      default: ''
    }
  },
  data () {
    return {
      canvas: '',
      ctx: '',
      painting: false,
      lastPoint: {
        x: undefined,
        y: undefined
      },
      lineWidth: 2, // 畫筆寬度
      color: '#000', // 畫筆顏色
      mySignature: this.signature
      // width: 0, // 畫布寬度
      // height: 0 // 畫布高度
    }
  },
  watch: {
    signature(val) {
      this.mySignature = val
    }
  },
  mounted () {
    tuhu.store.commit('shopJoin/setPageIndex', 9)
    this.init()
    $(document).off('click', 'a') // 恢復(fù)a標(biāo)簽的默認(rèn)事件
  },
  created() {
  },
  methods: {
    onPageBack() {
      // 監(jiān)聽頁面返回
      tuhu.store.commit('shopJoin/setPageIndex', 9)
    },
    init () {
      this.ctx = this.$refs.drawingBoard.getContext('2d')
      this.$refs.drawingBoard.width = this.$refs.drawingBoard.offsetWidth
      this.$refs.drawingBoard.height = this.$refs.drawingBoard.offsetHeight
      this.ctx.strokeStyle = this.color
      // 在canvas繪制前填充白色背景,不然保存的png圖片是透明的
      this.ctx.fillStyle = '#fff'
      this.ctx.fillRect(0, 0, this.$refs.drawingBoard.offsetWidth, this.$refs.drawingBoard.offsetHeight)

      const _this = this
      // 兼容移動端
      if (document.body && document.body.ontouchstart !== undefined) {
        _this.$refs.drawingBoard.ontouchstart = function (e) {
          _this.mousedown(e, 0)
          e.preventDefault()
        }
        _this.$refs.drawingBoard.ontouchmove = function (e) {
          _this.mousemove(e, 0)
        }
        _this.$refs.drawingBoard.ontouchend = function (e) {
          _this.mouseup(e, 0)
        }
      }
    },
    mousedown (e, flag = 1) {
      this.painting = true
      this.lastPoint = this.getPoint(e, flag)
    },
    mousemove (e, flag = 1) {
      if (!this.painting) {
        return
      }
      let newPoint = this.getPoint(e, flag)
      this.drawLine(this.lastPoint.x, this.lastPoint.y, newPoint.x, newPoint.y)
      this.lastPoint = newPoint
    },
    getPoint(e, flag = 1) {
      let x
      let y
      try {
        let clientY = flag ? e.clientY : e.touches[0].clientY
        x = flag ? e.offsetX : e.touches[0].clientX
        y = clientY - this.$refs.title.offsetHeight - this.$refs.signaturePanel.offsetTop + this.$refs.signaturePanel.offsetParent.scrollTop
      } catch (error) {
        tuhu.alert(error)
      }

      return {x: x, y: y}
    },
    mouseup () {
      this.painting = false
    },
    drawLine (x1, y1, x2, y2) {
      this.ctx.lineWidth = this.lineWidth
      this.ctx.lineCap = 'round'
      this.ctx.lineJoin = 'round'
      this.ctx.moveTo(x1, y1)
      this.ctx.lineTo(x2, y2)
      this.ctx.stroke()
      this.ctx.closePath()
    },
    clearAll () {
      if (this.mySignature) {
        this.mySignature = ''
        this.$nextTick(() => {
          this.init()
        })
      } else {
          // this.ctx.height = this.$refs.drawingBoard.offsetHeight
        this.ctx.clearRect(0, 0, this.$refs.drawingBoard.offsetWidth, this.$refs.drawingBoard.offsetHeight)
        this.ctx.beginPath()   // 開啟新路徑,防止連筆
          // 清除以后要重新繪制背景圖
        this.ctx.fillStyle = '#fff'
        this.ctx.fillRect(0, 0, this.$refs.drawingBoard.offsetWidth, this.$refs.drawingBoard.offsetHeight)
      }
    },
    convertBase64UrlToBlob(urlData) {
      let bytes = window.atob(urlData.split(',')[1])        // 去掉url的頭氢伟,并轉(zhuǎn)換為byte
        // 處理異常,將ascii碼小于0的轉(zhuǎn)換為大于0
      let ab = new ArrayBuffer(bytes.length)
      let ia = new Uint8Array(ab)
      for (let i = 0; i < bytes.length; i++) {
        ia[i] = bytes.charCodeAt(i)
      }
      return new Blob([ab], {type: 'image/png'})
    },
    save () { // 當(dāng)前項(xiàng)目阻止了a標(biāo)簽的默認(rèn)事件
      if (this.mySignature) {
        return this.mySignature
      }
      let imgUrl = ''
      try {
        imgUrl = this.$refs.drawingBoard.toDataURL('image/png')
      } catch (error) {
        tuhu.alert(error)
        tuhu.alert('請清除簽名后浪南,重新簽名')
      }
      let formData = new FormData()
      // console.log(this.$refs.textDom.files[0])
      // formData.append('img', this.$refs.textDom.files[0])
      formData.append('imageName', this.convertBase64UrlToBlob(imgUrl))
      return uploadShareImages(formData)
        .then((res) => {
          tuhu.hidePreloader()
          return res && res.filename
        }).catch((e) => {
          tuhu.hidePreloader()
          tuhu.toast('簽名上傳失敗,請重新上傳')
          return ''
        })
    }
  }
}
</script>
<style lang="less" scoped>
  .signaturePanel {
    // overflow: hidden;
    font-size: 14px;
    background: #fff;
    padding-bottom: 2.25rem;
    position: relative;
    &::after{
      width: 100%;
      content: '簽字區(qū)';
      position: absolute;
      top: 50% - 1rem;
      left: 0;
      font-size: 3rem;
      text-align: center;
      transform: translateY(-50%);
      color: #F5F5F5;
      z-index: -1;
    }
    .title{
      height: 2rem;
      padding: .6rem 0 .3rem .75rem;
      color: #999;
      font-weight: 400;
    }
    .drawingBoard {
      width: 100%;
      height: 12rem;
      border: 1px solid #eee;
    }
    .clear {
      height: 1.4rem;
      line-height: 1.4rem;
      color: #666;
      background: #F5F5F5;
      border-radius: .7rem;
      padding: 0 .5rem;
      position: absolute;
      bottom: .7rem;
      right: .7rem;
      z-index: 99;
      text-align: center;
      vertical-align: top;
      img{
        width: .7rem;
        height: .7rem;
        margin-right: .1rem;
        transform: translateY(.1rem)
      }
    }
    // .save {
    //   background-color: #f00;
    //   position: absolute;
    //   top: 0;
    //   right: 0;
    //   z-index: 1;
    // }
  }
</style>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豪嚎,一起剝皮案震驚了整個(gè)濱河市积瞒,隨后出現(xiàn)的幾起案子筷狼,更是在濱河造成了極大的恐慌劳吠,老刑警劉巖懒闷,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異告抄,居然都是意外死亡撰茎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門打洼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來龄糊,“玉大人,你說我怎么就攤上這事募疮§懦停” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵阿浓,是天一觀的道長他嚷。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么筋蓖? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任卸耘,我火速辦了婚禮,結(jié)果婚禮上粘咖,老公的妹妹穿的比我還像新娘蚣抗。我一直安慰自己,他們只是感情好瓮下,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布翰铡。 她就那樣靜靜地躺著,像睡著了一般唱捣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上网梢,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天震缭,我揣著相機(jī)與錄音,去河邊找鬼战虏。 笑死拣宰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烦感。 我是一名探鬼主播巡社,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼手趣!你這毒婦竟也來了晌该?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤绿渣,失蹤者是張志新(化名)和其女友劉穎朝群,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體中符,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姜胖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淀散。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片右莱。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖档插,靈堂內(nèi)的尸體忽然破棺而出慢蜓,到底是詐尸還是另有隱情,我是刑警寧澤郭膛,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布胀瞪,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凄诞。R本人自食惡果不足惜圆雁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帆谍。 院中可真熱鬧伪朽,春花似錦、人聲如沸汛蝙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窖剑。三九已至坚洽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間西土,已是汗流浹背讶舰。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留需了,地道東北人跳昼。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像肋乍,于是被迫代替她去往敵國和親鹅颊。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345