zoukankan      html  css  js  c++  java
  • 在vue中设计一个客户签名的功能

    直接贴代码:

    <template>
      <div class="hello">
        <p>签字:</p>
        <canvas id="canvas" width="300" height="400">Canvas画板</canvas>
        <button style="background: #fff;color:#F7B932" @click="clear">清除</button>
        <button style="background: #F7B932;color:#fff" @click="save">保存</button>
        <p style="100%;height: .2rem"></p>
      </div>
    </template>
    <script>
      let draw;
      let preHandler = function(e){
        e.preventDefault();
      }
      class Draw {
        constructor(el) {
          this.el = el
          this.canvas = document.getElementById(this.el)
          this.cxt = this.canvas.getContext('2d')
          this.stage_info = canvas.getBoundingClientRect()
          this.path = {
            beginX: 0,
            beginY: 0,
            endX: 0,
            endY: 0
          }
        }
        init(btn) {
          let that = this;
          this.canvas.addEventListener('touchstart', function(event) {
            document.addEventListener('touchstart', preHandler, false);
            that.drawBegin(event)
          })
          this.canvas.addEventListener('touchend', function(event) {
            document.addEventListener('touchend', preHandler, false);
            that.drawEnd()
          })
          this.clear(btn)
        }
        drawBegin(e) {
          let that = this;
          window.getSelection() ? window.getSelection().removeAllRanges() : document.selection.empty()
          this.cxt.strokeStyle = "#000"
          this.cxt.beginPath()
          this.cxt.moveTo(
            e.changedTouches[0].clientX - this.stage_info.left,
            e.changedTouches[0].clientY - this.stage_info.top
          )
          this.path.beginX = e.changedTouches[0].clientX - this.stage_info.left
          this.path.beginY = e.changedTouches[0].clientY - this.stage_info.top
          canvas.addEventListener("touchmove",function(){
            that.drawing(event)
          })
        }
        drawing(e) {
          this.cxt.lineTo(
            e.changedTouches[0].clientX - this.stage_info.left,
            e.changedTouches[0].clientY - this.stage_info.top
          )
          this.path.endX = e.changedTouches[0].clientX - this.stage_info.left
          this.path.endY = e.changedTouches[0].clientY - this.stage_info.top
          this.cxt.stroke()
        }
    
        drawEnd() {
          document.removeEventListener('touchstart', preHandler, false);
          document.removeEventListener('touchend', preHandler, false);
          document.removeEventListener('touchmove', preHandler, false);
        }
        clear(btn) {
          this.cxt.clearRect(0, 0, 400, 600)
        }
        save(){
          return canvas.toDataURL("image/png")
        }
      }
      export default {
        data () {
          return {
            msg: 'Welcome to Your Vue.js App',
            val:true
          }
        },
        mounted() {
          draw = new Draw('canvas');
          draw.init();
    
          //获取屏幕的宽度
          let  clientWidth = document.documentElement.clientWidth;
          let  clientHeight = document.documentElement.clientHeight;
          //根据设计图中的canvas画布的占比进行设置
          let canvasWidth = Math.floor(clientWidth*200/220);
          let canvasHeight = Math.floor(clientHeight*200/320);
          canvas.setAttribute('width',canvasWidth+'px');
          canvas.setAttribute('height',canvasHeight+'px');
        },
        methods:{
          clear:function(){
            draw.clear();
          },
          save:function(){
            let data=draw.save();
            const _this = this
            _this.postRequestN9(‘’, {
              pkInspection: this.$route.params.pkInspection,
              pkInspectionRecord:this.$route.params.pkInspectionRecord,
              clientSignStr:data,
              accountCode:this.$route.params.accountCode
            }, function (data) {
              alert('保存成功')
              _this.$router.push({name: ''})
            })
          },
          // 将base64转换成file对象
          // dataURLtoFile (dataurl, filename = 'qianming') {
          //   let arr = dataurl.split(',')
          //   let mime = arr[0].match(/:(.*?);/)[1]
          //   let suffix = mime.split('/')[1]
          //   let bstr = atob(arr[1])
          //   let n = bstr.length
          //   let u8arr = new Uint8Array(n)
          //   while (n--) {
          //     u8arr[n] = bstr.charCodeAt(n)
          //   }
          //   return new File([u8arr], `${filename}.${suffix}`, {type: mime})
          // },
          mutate(word) {
            this.$emit("input", word);
          },
        }
      }
    </script>
    
    <style scoped>
      .hello{
        position: fixed;
        top: 0;
        bottom: 0;
         100%;
        height: 100%;
        overflow: hidden;
      }
      .hello p{
        text-align: left;
        padding:.8rem 0 .5rem .4rem;
        box-sizing: border-box;
        font-size: .5rem
      }
      .hello button{
        outline:none;
        4rem;
        height:1.2rem;
        border:1px solid #F7B932;
        border-radius:1rem;
        margin-top: .5rem;
        font-size: .45rem;
      }
      h1, h2 {
        font-weight: normal;
      }
      ul {
        list-style-type: none;
        padding: 0;
      }
      li {
        display: inline-block;
        margin: 0 10px;
      }
      a {
        color: #42b983;
      }
      #canvas {
        background: #F6F6F6;
        touch-action: none;
        cursor: default;
    
      }
      #keyword-box {
        margin: 10px 0;
      }
    </style>
    

      

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    基于分布式锁解决定时任务重复问题
    基于Redis的Setnx实现分布式锁
    基于数据库悲观锁的分布式锁
    使用锁解决电商中的超卖
  • 原文地址:https://www.cnblogs.com/panax/p/11806874.html
Copyright © 2011-2022 走看看