vue组件vue-esign实现电子签名


Posted in Vue.js onApril 21, 2022

vue vue-esign签字板demo

使用vue-esign让用户能够在手动签字并返回为base64或者file格式的文件流

安装

npm install vue-esign --save

在main.js中全局引用

import vueEsign from 'vue-esign'
Vue.use(vueEsign)

Demo 

<template>
  <div class="esigns">
    <vue-esign
      ref="esign"
      style="
        width: 100%;
        height: 400px
      "
      :isCrop="isCrop"
      :lineWidth="lineWidth"
      :lineColor="lineColor"
      :bgColor.sync="bgColor"
    />
    <div class="btn">
      <van-button type="primary" @click="handleReset">重置</van-button>
      <van-button type="info" @click="handleGenerate">确定</van-button>
    </div>
  </div>
</template>
<script>
export default {
  name: "Esign",
  data() {
    return {
      lineWidth: 6,
      lineColor: "#000000",
      bgColor: "",
      resultImg: "",
      isCrop: false,
    };
  },
  methods: {
    handleReset() {
      // 清除
      this.$refs.esign.reset();
    },
    handleGenerate() {
      // 获取base64
      var _this = this;
      _this.$refs.esign
        .generate()
        .then((res) => {
          // 转成文件
          var file = _this.dataURLtoFile(res);
            console.log("file:",file )
          //调用接口
          uploadFile(file).then(({ data }) => {
           console.log("data:",data)
          });
        })
        .catch((err) => {
          _this.$toast(err); 
        });
    },
    // 将base64转换为file
    dataURLtoFile(dataurl) {
      let arr = dataurl.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], "easign.jpg", { type: mime });
    },
  },
};
</script>
<style scoped>
.btn {
  display: flex;
  justify-content: space-around;
  margin-top: 10px;
}
</style>

vue移动端电子签名demo

HTML

<template>
    <div id='canvasBox'>
        <div ref="canvasBox">
             <canvas id="canvas" ref="canvas" height="150"></canvas>
        </div>
        <div class="row row-space-between">
          <button  @click="onClickCancle">取消</button>
          <button @click="clear">重签</button>
          <button @click="save">确认</button>
        </div>
        <!-- <img :src="singImgUrl" alt /> -->
    </div>
</template>

JS相关代码

<script>
var draw;
var 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) {
    var 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) {
    var that = this;
    window.getSelection()
      ? window.getSelection().removeAllRanges()
      : document.selection.empty();
    this.cxt.strokeStyle = "#BC4C2D";
    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);
    //canvas.ontouchmove = canvas.ontouchend = null
  }
  clear(btn) {
    this.base64Id = "";
    this.cxt.clearRect(0, 0, 500, 600);
  }
  save() {
    var blank = document.createElement("canvas"); //系统获取一个空canvas对象
    blank.width = canvas.width;
    blank.height = canvas.height;
    let flag = canvas.toDataURL("image/png") == blank.toDataURL(); //比较值相等则为空;
    if (flag) {
      return "0";
    } else {
      return canvas.toDataURL("image/png");
    }
  }
}
export default {
  data() {
    return {
      singImgUrl: ""
    };
  },
  methods: {
	 clear() {
        draw.clear();
        this.base64Id = "";
	 },
   	save() {
      var data = "";
      data = draw.save();
      if (data == "0") {
      		this.$toast("请先签名再点击确定哦~");
      } else {
	      this.singImgUrl = data;
	      ///data 就是得到的base64格式的签名图片,根据业务这里可上传到服务器
      }
      // 
    },
},
 mounted() {
 document.getElementById("canvasBox").addEventListener("touchmove", (e) => {
      e.preventDefault();
    });//阻止浏览器默认行为,防止签名浏览器下拉-------很重要
    this.base64Id = "";
    let _width = this.$refs.canvasBox.offsetWidth;
    this.$refs.canvas.width = _width; //适配移动端宽度给canvas
    draw = new Draw("canvas");
    draw.init();
  }
}
</script>

CSS 自行美化,相信大家都没得问题。


Tags in this post...

Vue.js 相关文章推荐
在Vue中使用mockjs代码实例
Nov 25 Vue.js
Vue组件生命周期运行原理解析
Nov 25 Vue.js
Vue3+elementui plus创建项目的方法
Dec 01 Vue.js
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 Vue.js
Vue使用鼠标在Canvas上绘制矩形
Dec 24 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
开发一个封装iframe的vue组件
Mar 29 Vue.js
详解Vue的options
May 15 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
vue代码分块和懒加载非必要资源文件
Apr 11 Vue.js
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 Vue.js
vue动态绑定style样式
Apr 20 #Vue.js
Vue OpenLayer测距功能的实现
vue 给数组添加新对象并赋值
Apr 20 #Vue.js
vue 数字翻牌器动态加载数据
Apr 20 #Vue.js
vue3.0 数字翻牌组件的使用方法详解
Apr 20 #Vue.js
vue封装数字翻牌器
Apr 20 #Vue.js
vue特效之翻牌动画
Apr 20 #Vue.js
You might like
PHP开发入门教程之面向对象
2006/12/05 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
php日历制作代码分享
2014/01/20 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
Python描述器descriptor详解
2015/02/03 Python
在Python中使用成员运算符的示例
2015/05/13 Python
python匿名函数的使用方法解析
2019/10/10 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
python def 定义函数,调用函数方式
2020/06/02 Python
Flask处理Web表单的实现方法
2021/01/31 Python
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
商务英语求职自荐信范文
2013/12/24 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
奖学金申请个人主要事迹材料
2015/11/04 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS