直接贴代码:

<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="width: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;
width: 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;
width: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>

  

在vue中设计一个客户签名的功能的更多相关文章

  1. 利用Vue实现一个简单的购物车功能

    开始学习Vue的小白,dalao多多指正 想要实现下面这个界面,包含总价计算.数量增加和移除功能 话不多说代码如下 <!DOCTYPE html> <html> <hea ...

  2. 用Vue开发一个实时性时间转换功能,看这篇文章就够了

    前言 最近有一个说法,如果你看见某个网站的某个功能,你就大概能猜出背后的业务逻辑是怎么样的,以及你能动手开发一个一毛一样的功能,那么你的前端技能算是进阶中高级水平了.比如咱们今天要聊的这个话题:如何用 ...

  3. 在微信框架模块中,基于Vue&Element前端的后台管理功能介绍

    微信开发包括公众号.企业微信.微信小程序等方面的开发内容,需要对腾信的微信API接口进行封装:包括事件.菜单.订阅用户.多媒体文件.图文消息.消息群发.微信支付和企业红包.摇一摇设备.语义理解.微信小 ...

  4. iOS适配HTTPS,创建一个自签名的SSL证书(x509)具体步骤

    引言(创建生成的证书只能用于测试使用.如果想使用自签名证书就只能以自己为 CA机构颁发证书,进行双向认证才能使用) 使用HTTP(超文本传输)协议访问互联网上的数据是没有经过加密的.也就是说,任何人都 ...

  5. 用vue开发一个app(2,main.js)

    昨天跟着vue的官网搭建了vue的一个脚手架,我也是第一次用VUE一切都在摸索阶段. 今天试着看下里面脚手架里面有点什么东西 先看看main.js 导入了3个模块 一个vue,一个app,还有rout ...

  6. android 实现银联刷卡机消费后,手动签名的功能

    几天前去物管交物业费,物管工作人员说小区引进高新产品,使用银行卡消费后,不需要拿笔在银联机上签名,直接用手指触摸实现消费签名,当时心想,果然是高科技,机子外形如下左图,签名如下右图.         ...

  7. [转]如何创建一个自签名的SSL证书(X509)

    原文出自:http://www.joyios.com/?p=47 引言 使用HTTP(超文本传输)协议访问互联网上的数据是没有经过加密的.也就是说,任何人都可以通过适当的工具拦截或者监听到在网络上传输 ...

  8. Vue实现一个MarkDown编辑器

    Vue实现一个markdown编辑器 前段时间做项目的时候,需要一个Markdown编辑器,在网上找了一些开源的实现,但是都不满足需求 说实话,这些开源项目也很难满足需求公司项目的需求,与其实现一个大 ...

  9. 一步步使用SpringBoot结合Vue实现登录和用户管理功能

    前后端分离开发是当今开发的主流.本篇文章从零开始,一步步使用SpringBoot结合Vue来实现日常开发中最常见的登录功能,以及登录之后对用户的管理功能.通过这个例子,可以快速入门SpringBoot ...

随机推荐

  1. 随笔1 interface Map<K,V>

    第一次写笔记就从map开始吧,如上图所示,绿色的是interface,黄色的是abstract class,蓝色的是class,可以看出所有和图相关的接口,抽象类和类的起源都是interface ma ...

  2. 2018-11-01-weekly

    Algorithm 107. 二叉树的层次遍历 II What 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历).例如:给定二叉树 [3,9 ...

  3. export default{} 和 new Vue()都是什么意思

    在生成.导出.导入.使用 Vue 组件的时候,有些新手就会常常被位于不同文件的 new Vue() 和 export default{} 搞得晕头转向.它们含义到底是什么,又有什么异同呢? 首先,Vu ...

  4. [POJ1772] Substract

    问题描述 We are given a sequence of N positive integers a = [a1, a2, ..., aN] on which we can perform co ...

  5. Proto3语法翻译

    本文主要对proto3语法翻译.参考网址:https://developers.google.com/protocol-buffers/docs/proto3 defining a message t ...

  6. centos 7 网卡绑定 bond0 开机无法自启

    https://blog.csdn.net/u012881151/article/details/54910847 1.环境CentOS Linux release 7.2.1511 (Core)li ...

  7. Python 数字系列-数字格式化输出

    数字的格式化输出 问题 你需要将数字格式化后输出,并控制数字的位数.对齐.千位分隔符和其他的细节. 解决方案 格式化输出单个数字的时候,可以使用内置的 format() 函数,比如: >> ...

  8. docker 配置sonatype/nexus3

    docker search nexusdocker pull sonatype/nexus3mkdir -p /dockermaven/nexus-datachmod -R 777 /dockerma ...

  9. Aliyun mysql配置 远程访问 10038

    环境 centos7.2    mysql5.7 网上搜了好多的文章,有的说在/etc/my.cnf 注释掉bind-address = 127.0.0.1 ,也开启了3306端口的防火墙,也添加了远 ...

  10. 快速测试端口的连通性(HTTP/HTTPS)

    ping 仅限 80 端口,命令中无法指定端口: C:\Users\Administrator>ping kikakika.com 遗失对主机的连接. 正在 Ping kikakika.com ...