本文介绍了在Vue项目中集成vue-esign组件实现电子签名的完整流程,包括全局注册、参数配置及重置与生成方法。同时提供了基于原生Canvas的移动端手写板实现方案,涵盖触摸事件处理、路径绘制及图片导出逻辑,适用于需要手动签字并返回base64或文件流的场景。
Vue集成vue-esign电子签名组件示例
通过引入vue-esign库,开发者可以在应用中实现用户手动签字功能,并将签名结果导出为base64编码字符串或文件流格式。
安装依赖
npm install vue-esign --save在main.js文件中全局注册该组件,代码如下:
import vueEsign from 'vue-esign'
Vue.use(vueEsign)基础使用示例
<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>针对移动端设备的电子签名实现方案
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>JavaScript核心逻辑代码
<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样式部分可根据实际需求自行调整美化,通常无需特殊处理。
以上内容为个人经验分享,旨在提供参考,欢迎支持。