Vue使用sign-canvas实现在线手写签名的实例
作者:船长在船上 发布时间:2024-07-26 02:36:08
标签:vue,手写签名
效果图:
sign-canvas 一个基于 canvas 开发,封装于 Vue 组件的通用手写签名板(电子签名板),支持 pc 端和移动端。
更新日志
v1.1.4 功能更新:增加全屏手写方案,可以通过 options.isFullScreen,和 options.isFullCover 属性控制,全屏模式下 canvasWidth 和 canvasHeight 属性设置无效,感谢网友 AFelicity”的建议与反馈。
v1.1.3 功能更新:增加高倍屏下,绘制会模糊的适配方案,可以通过 options.isDpr 属性进行开启或者关闭,感谢网友“Wong-Harry”的建议与反馈。
安装
npm install --save sign-canvas
全局方式
main.js:
import SignCanvas from "sign-canvas";
Vue.use(SignCanvas);
局部方式
//局部注册 模板中引入
import SignCanvas from "sign-canvas";
components: {
SignCanvas;
}
完整代码:
<template>
<div class="sign">
<sign-canvas
class="sign-canvas"
ref="SignCanvas"
:options="options"
v-model="value"
/>
<div class="btnList" ref="btnList">
<van-button type="danger" v-throttle size="small" @click="clearSignImg">清空</van-button>
<van-button type="primary" v-throttle size="small" class="ml30 mr30" @click="saveSignImg">保存</van-button>
<van-button type="primary" v-throttle size="small" @click="back">返回</van-button>
</div>
</div>
</template>
<script>
//接口引入
import { signShipmentsContract } from "../../api/userMG";
export default {
name: "signDialog",
//props: {
//组件传递的值
//visible: {
//type: Boolean,
//default: false,
//},
//图片信息Base64
//src: {
//type: String,
//default: null,
//},
//},
data() {
return {
value: null,
//配置
options: {
lastWriteSpeed: 1, //书写速度 [Number] 可选
lastWriteWidth: 2, //下笔的宽度 [Number] 可选
lineCap: "round", //线条的边缘类型 [butt]平直的边缘 [round]圆形线帽 [square]正方形线帽
lineJoin: "round", //线条交汇时边角的类型 [bevel]创建斜角 [round]创建圆角 [miter]创建尖角。
canvasWidth: "750", //canvas宽高 [Number] 可选
canvasHeight: "500", //高度 [Number] 可选
isShowBorder: false, //是否显示边框 [可选]
bgColor: "#fcc", //背景色 [String] 可选
borderWidth: 1, // 网格线宽度 [Number] 可选
borderColor: "#ff787f", //网格颜色 [String] 可选
writeWidth: 5, //基础轨迹宽度 [Number] 可选
maxWriteWidth: 30, // 写字模式最大线宽 [Number] 可选
minWriteWidth: 5, // 写字模式最小线宽 [Number] 可选
writeColor: "#101010", // 轨迹颜色 [String] 可选
isSign: true, //签名模式 [Boolean] 默认为非签名模式,有线框, 当设置为true的时候没有任何线框
imgType: "png", //下载的图片格式 [String] 可选为 jpeg canvas本是透明背景的
},
};
},
created() {
},
mounted() {
let windowHeight = document.documentElement.clientHeight;
let btnList = this.$refs.btnList.offsetHeight;
let windowWidth = document.documentElement.clientWidth;
this.options.canvasWidth = windowWidth;
this.options.canvasHeight = windowHeight - btnList;
// console.log(this.$refs.SignCanvas.saveAsImg(),"this.$refs.SignCanvas.saveAsImg()")
},
methods: {
//清除画板
clearSignImg() {
this.$refs.SignCanvas.canvasClear();
},
// 保存图片
saveSignImg() {
console.log(this.value, "value");
if (this.value == null) {
this.$toast.fail("请先签名");
} else {
this.$dialog
.confirm({
title: "签名确认",
message: "请先确认签名是否正确,一旦签名成功,无法撤销",
})
.then(() => {
console.log(1);
const img = this.$refs.SignCanvas.saveAsImg();
this.signShipmentsContractFun(img);
})
.catch(() => {
console.log(2);
this.$toast.fail({
message: "签名取消,请重新签名",
onClose: () => {
this.$refs.SignCanvas.canvasClear();
},
});
});
}
},
//下载图片/
// downloadSignImg() {
// this.$refs.SignCanvas.downloadSignImg();
// },
back() {
this.$router.back(-1);
},
// 签名
signShipmentsContractFun(img) {
let params = {
contractId: this.$route.query.contractId,
carrierContractPicture: img,
contractInfoDto: JSON.parse(this.$route.query.contractList),
};
signShipmentsContract(params)
.then((res) => {
console.log(res, "签名");
if (res.code == 200) {
this.$toast.success({
message: "保存成功",
onClose: () => {
this.$router.back(-1);
},
});
} else {
this.$toast.fail(res.msg);
}
})
.catch((error) => {});
},
},
};
</script>
<style lang="scss" scoped>
.btnList {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
padding: 30px 0;
display: flex;
justify-content: center;
}
.sign-canvas {
display: block;
margin: 0 auto;
background: #F1F1F1 !important;
border-radius: 8px;
}
</style>
来源:https://blog.csdn.net/SmartJunTao/article/details/124839475


猜你喜欢
- 1. ref在Vue3中,ref成为了一个全家桶,除了用于创建响应式数据之外,还可以用于引用DOM元素、组件实例和其他对象。以下是ref的具
- 水球图水球图首先是动态的效果,像水流一样波动,所以看起来比较的舒服,一般用于业务里面的完成率,其实和之前的仪表盘有点类似,但是我个人绝对水球
- 通过企业管理器设置数据库的定期自动备份计划。 1、打开企业管理器,双击打开你的服务器 2、然后点上面菜单中的工具-->选择数据库维护计
- *args与**kwarsg及闭包和装饰器过程先理解闭包,再理解装饰器,不要忘了不定长参数def func():
- 概 述 现在有不少介绍利用ASP实现动态分页的文章,方法大同小异,就是每次利用ADO返回原始数据满足条件记录集中的指定
- PHP crypt() 函数定义和用法crypt() 函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串。在不同的操作系统
- 测试函数:第一种:list的set函数第二种:{}.fromkeys().keys()测试代码:#!/usr/bin/python#-*-
- 操作 redisimport redisredisPool = redis.ConnectionPool(host='192.168
- webargs是一个用于解析和验证HTTP请求对象的Python库,内置了对流行web框架的支持,包括Flask、Django、Bottle
- 这里会讨论令Oracle停机时间最小化的步骤。各种形式的停机--计划的或者是非计划的--总是不断地发生,一个DBA应该有正确的备份策略,这样
- @keyup.enter失效问题情况一(我遇到的情况)@keyup.enter外部存在form表单,并且form表单里只有一个input原因
- 导言在上两节教程中,我们看到了如何使用TemplateField来自定义GridView和DetailsView的输入。TemplateFi
- 在观看唐宇迪老师图像处理的课程中,其中有一个答题卡识别的小项目,在此结合自己理解做一个简单的总结。1. 项目分析首先在拿到项目时候,分析项目
- 创建主键可以有两种方式:create table 表名(字段名 类型,字段名 类型,……primary key(name));或者是crea
- 在一个项目中,制作呃echart图表的时候,遇到一个需求,需要从后端接口获取数据----售票员的姓名和业绩所以需要在订单表中,获取不同售票员
- 介绍海象运算符,即 := ,在 PEP 572 中被提出,并在 Python3.8 版本中发布。海象运算符的英文原名叫Assignment
- Python则是通过缩进来识别代码块的。缩进Python最具特色的是用缩进来标明成块的代码。我下面以if选择结构来举例。if后面跟随条件,如
- Elasticsearch简介Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene&
- JDBC(Java Database Connectivity),即Java数据库连接。通过JDBC编程,可以使Java应用程序和数据库进行
- 本文主要介绍了在python3.9下如何安装scrapy的方法,分享给大家,具体如下:安装命令:pip install scrapy -i