Vue 使用Canvas画布手写电子版签名 保存 上传服务端

电子版签名效果

在这里插入图片描述

定义画布

    <canvas width="500"height="250"ref="cn"@mousedown="cnMouseDown"@mousemove="cnMouseMove"@mouseup="cnMouseUp"style="width:500px;height: 250px;background-color:snow;padding: 10px"></canvas>

canvas 的width height两个属性表示画布的大小,style的width height为实际的内容大小

是否可绘制

data() {return {pen:false //是否可以绘画};},

获取鼠标按下事件

 cnMouseDown(e){this.pen=true //鼠标按下可绘画const canvas= this.$refs.cn //获取对象const p =canvas.getContext('2d') //绘画2D图 画笔//this.p.fillStyle = '#d3d3d3'; 画布的颜色 不设置保存时为透明//this.p.fillRect(0, 0, this.canvas.width, this.canvas.height) //填充整个画布let x =e.pageX-canvas.offsetLeft //鼠标在画布的Xlet y =e.pageY-canvas.offsetTop  //鼠标在画布的Yp.moveTo(x,y)//移动画笔到 鼠标位置 断开线段p.lineTo(x,y) //画线p.stroke() //绘制轮廓 (线)this.p=p //全局挂载 其他事件需要使用到 画笔this.canvas=canvas //全局挂载 其他事件需要使用到 画布},

鼠标移动事件

cnMouseMove(e){
if(this.pen)
{let x=e.pageX-this.canvas.offsetLeft //移动的距离Xlet y =e.pageY-this.canvas.offsetTop //移动的距离Ylet w =this.canvas.width //画布高度let h =this.canvas.height //画布宽度if(x+10>w||x<10||y+10>h||y<10){this.pen=falsereturn//鼠标移出画布 停止绘制}this.p.lineTo(x,y) //鼠标移动持续绘制this.p.stroke() //绘制轮廓 (线)
}

鼠标松开事件

 cnMouseUp(){this.pen=false//鼠标双开 停止绘画},

保存签名

 save(){const url =this.canvas.toDataURL() //转换成链接const a =document.createElement('a') //创建A标签a.download='手写签名' //文件名字a.href=url //赋值a.click() //点击事件 打开下载对话框}

在这里插入图片描述

清空画布

 clear(){this.p.clearRect(0,0,this.canvas.width,this.canvas.height)},

上传服务端

接口封装

import request from '@/utils/request'
export function  fileUp(data){return request({method:'POST',url:'/fileUpload',data})
}

上传

up(){this.canvas.toBlob(b=>{ //转成二进制 成功的回调const formData = new FormData();//表单formData.append('file', b, 'filename.png'); //file为上传时的参数名fileUp(formData).then(r=>{console.log(r) //上传成功})})
},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Docker中部署Java应用:Java版本隔离的实践案例

在Docker中部署Java应用&#xff1a;Java版本隔离的实践案例 人生就是一场又一场的相遇&#xff0c;一个明媚&#xff0c;一个忧伤&#xff0c;一个华丽&#xff0c;一个冒险&#xff0c;一个倔强&#xff0c;一个柔软&#xff0c;最后那个正在成长。 背景需求 在软件开发和部…

Python实践应用|NC文件读取

import netCDF4 as nc import numpy as np import matplotlib.pyplot as plt# 打开NC文件 nc_file E:/NC_file/air.sig995.2012.nc # 将your_file.nc替换为你的NC文件路径 nc_data nc.Dataset(nc_file, r)# 查看NC文件中包含的变量 print("Variables in the NC file:&q…

APP UI设计秉承哪些原则可以开发出更好的用户体验?

设计一个优秀的APP UI需要考虑多方面因素&#xff0c;以下是一些原则可以帮助你开发出更好的用户体验&#xff1a; 简洁性&#xff08;Simplicity&#xff09;&#xff1a;保持界面简洁清晰&#xff0c;避免过多的复杂元素和信息。简洁的设计能够减少用户的认知负荷&#xff0c…

商用清洁机器人的工作原理介绍

商用清洁机器人是清洁机器人的一种&#xff0c;其主要应用于大型商场&#xff0c;办公室&#xff0c;医院&#xff0c;政府部门等。现将其主要工作原理和组成部分介绍如下。 其主要组成部分为&#xff0c;行走轮子左右各两个&#xff0c;万向轮一个&#xff0c;是基本的轮式结构…

【数据结构】Map和Set(1)

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…

【jQuery】看一眼就会用的jquery库之续章!

jQuery&#xff08;js框架&#xff09; 17、操作节点 创建节点&#xff1a; 创建节点只需要将元素放在jQuery的工厂函数中//创建一个button按钮let $btn$("<input typebutton>");//创建一个列表项let $li$("<li>选项</li>");添加节点…

医保购药小程序开发指南:利用智慧药房系统源码实现智能服务

医保购药小程序为患者提供了便捷的药品购买渠道&#xff0c;同时也为药店和医疗机构提供了智能化管理和服务的平台。接下来&#xff0c;小编将介绍如何利用智慧药房系统源码实现医保购药小程序的开发&#xff0c;并探讨如何实现智能化的服务。 第一部分&#xff1a;智慧药房系统…

如何使用IDEA直接连接MySQL数据库

如何使用IDEA直接连接MySQL数据库 新建一个空项目打开DataBase窗口连接数据库第一次连接 需要先下载驱动上一步驱动下载太慢怎么办&#xff1f;下载好驱动后 测试连接 新建一个空项目 打开DataBase窗口 连接数据库 第一次连接 需要先下载驱动 如果这里下载的很慢 看下一步解决…

SpringBoot笔记1

继承父工程 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</version></parent>java 无效的源发行版 17 解决方法 <build><plugins>…

RabbitMQ各组件参数详解(9)

这里对各个组件的参数进行详解&#xff0c;可能前面有提到过&#xff0c;这里做一个汇总 交换机 在创建交换机的时候用到建造者类ExchangeBuilder&#xff0c;会创建四种交换机 Direct Exchange 直连交换机是 RabbitMQ 中最简单的交换机类型之一。它的工作方式非常简单&…

python基础知识—while和for循环(三)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 一&#xff1a;while循环1.1程序的三种执行流程1.2while循环1.3循环变量和死循环 二&#xff1a;for循环2.1for循环2.2range 一&…

安装crossover游戏提示容量不足怎么办 如何把游戏放到外置硬盘里 Mac电脑清理磁盘空间不足

CrossOver作为一款允许用户在非原生操作系统上运行游戏和应用程序的软件&#xff0c;为不同平台的用户提供了极大的便利。然而&#xff0c;随着游戏文件大小的不断增加&#xff0c;内置硬盘的容量往往无法满足安装需求。幸运的是&#xff0c;通过一些简单的步骤&#xff0c;我们…

Penpad 再获 Animoca Brands 投资,全新生态历程

Penpad 是 Scroll 生态的 LaunchPad & Yield Aggregator 平台&#xff0c;该平台近日在融资上取得了系列进展。据悉&#xff0c;Penpad 在前不久率先获得了来自于 Gate Labs 以及 Scroll 联合创始人 Sandy Peng 的融资&#xff0c;并且在近日&#xff0c;其又获得了来自于知…

LeetCode题目73:矩阵置零

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

Amazon云计算AWS之[4]非关系型数据库服务SimpleDB和DynamoDB

文章目录 简介非关系型VS关系数据库SimpleDB域条目属性值SimpleDB的使用 DynamoDBSimpleDB VS DynamoDB 简介 非关系型数据库服务主要用于存储结构化的数据&#xff0c;并为这些数据提供查找、删除等基本的数据库功能。AWS中提供的非关系型数据库主要包括SimpleDB和DynamoDB …

(学习日记)2024.04.20:UCOSIII第四十八节:各文件功能概览

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

牛客网:S老师的公式 ← 取模运算

【题目来源】https://ac.nowcoder.com/acm/contest/76652/A【题目描述】 S 老师丢给你了一个简单的数学问题&#xff1a; 求 。 请你求出答案。【输入格式】 一行一个整数 n (1≤n≤10^6)。【输出格式】 一行一个整数表示答案。【说明】 例如&#xff0c;若n3&#xff0c;则本题…

设计模式-责任链模式(Chain of Responsibility Pattern)结构|原理|优缺点|场景|示例

设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型&#xff08;5种&#xff09; 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型&#xff08;7种&#xff09; 适配器…

对于C# 任务并行库(TPL)的一些理解

C# 的任务并行库&#xff08;Task Parallel Library&#xff0c;TPL&#xff09;是 .NET 框架的一个部分&#xff0c;它提供了一组丰富的API&#xff0c;旨在简化并行编程&#xff0c;使开发人员能够更容易地构建可以利用多核处理器优势的高性能应用程序。TPL 的设计目的是减少…

【redis】Redis数据类型(一)——String类型(包含redis通用命令)

目录 Redis通用命令String类型常用的操作命令一些特殊命令详解setnx示例使用 setrange示例 mset示例 msetnx示例 append示例 getset示例 incr示例使用1.计数器2.限速器 bitcount示例使用&#xff1a;使用 bitmap 实现用户上线次数统计性能 String类型String类型简介String类型的…