扫码签名

697 阅读1分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

最近有一个需求:用手机扫描PC端的二维码进行手写签名。
虽然我没做类似的需求,但是当时第一反应是需要用到canvas,这我不会啊,怎么搞,然后就在github上找找有没有类似的插件,欸 找到了 vue-esign(感谢作者)。文档写的非常详细,照着做就可以了。

PC端

我们先写PC端生成二维码的部分。生成二维码我用的是 vue-qr。(感谢作者)

安装

npm install vue-qr --save

引入

import vueQR from 'vue-qr';

使用

<vue-qr :bgSrc='src' :logoSrc="src2" text="Hello world!" :size="200"></vue-qr>
<vue-qr text="Hello world!" :callback="test" qid="testid"></vue-qr>

参数很多,感兴趣的童鞋可以直接点击上面的链接查看。

下面是完整的代码

<template>
  <div class="QianMingCeShi">
    <el-button size='mini' @click="showQrcodeFn">手写签名</el-button>
    <div id="qrcode" v-if="showQrcode">
      <vueQR :size='size' text='www.baidu.com'></vueQR>
    </div>
    <img :src="imgBase64" alt="">
  </div>
</template>

<script>
import vueQR from 'vue-qr';

export default {
  name: 'qrcode',
  data() {
    return {
      size: 200, // 二维码大小
      showQrcode: false,
      text: 'www.baidu.com',
      imgBase64: '',
    }
  },
  components: {
    vueQR,
  },
  methods: {
    showQrcodeFn() {
      this.showQrcode = true;
    },
  },
}
</script>

APP部分

安装

npm install vue-esign --save

使用

1、在用到的文件里引入,也可以在main.js里全局引入

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

2、使用方法

必须设置 ref ,用来调用组件的两个内置方法 reset() 和 generate()

<vue-esign ref="esign" :width="800" :height="300" :isCrop="isCrop" :lineWidth="lineWidth" :lineColor="lineColor" :bgColor.sync="bgColor" />

属性说明

image.png 3、内置方法

两个内置方法,通过给组件设置 ref 调用:

// 清空画布
this.$refs.esign.reset()

// 生成图片
this.$refs.esign.generate().then(res => {
  console.log(res) // base64图片
}).catch(err => {
  alert(err) // 画布没有签字时会执行这里 'Not Signned'
})

下面是我的完整代码

HTML部分

 <div class="canvasBox">
  <vueEsign ref="esign" :isCrop='isCrop' :lineWidth='lineWidth' :lineColor='lineColor' :bgColor.sync='bgColor'></vueEsign>
</div>
<div class="btn">
  <van-button type="info" @click="handleReset">重写</van-button>
  <van-button type="info" @click="handleGenerate">保存/生成图片</van-button>
  <van-button plain type="info">取消</van-button>
</div>

JS部分

import vueEsign from 'vue-esign'
import { Button } from 'vant';
import { Notify } from 'vant';

Vue.use(vueEsign)
Vue.use(Button);
Vue.use(Notify);

export default {
  data() {
    return {
      isCrop: false,
      lineWidth: 6,
      lineColor: '#000',
      bgColor: '',
      autographImg: '',
    }
  },
  methods: {
    handleReset() {
      this.$refs.esign.reset();
    },
    handleGenerate() {
      this.$refs.esign.generate().then((res) => {
        this.autographImg = res;
      }).catch((err) => {
        console.log(err);
        Notify({ type: 'warning', message: '请签名签名后再保存' });
      });
    },
  },
}