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

news2025/1/15 23:46:15

电子版签名效果

在这里插入图片描述

定义画布

    <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 //鼠标在画布的X
      let y =e.pageY-canvas.offsetTop  //鼠标在画布的Y
      
      p.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 //移动的距离X
  let y =e.pageY-this.canvas.offsetTop //移动的距离Y

  let w =this.canvas.width //画布高度
  let h =this.canvas.height //画布宽度

  if(x+10>w||x<10||y+10>h||y<10){
    this.pen=false
    return
    //鼠标移出画布 停止绘制
  }

  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.coloradmin.cn/o/1628647.html

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

相关文章

Nginx:高性能Web服务器与反向代理的卓越之选

目录 一、Nginx概述 二、Nginx的特点 三、Nginx架构图 四、Nginx优势 五、正向代理与反向代理 正向代理&#xff1a; 反向代理&#xff1a; 一、Nginx概述 Nginx&#xff08;engine x&#xff09;是一个由俄罗斯人Igor Sysoev开发的高性能HTTP和反向代理服务器。其历史背…

MySQL 数据库远程访问问题

在默认的情况下&#xff0c;MySQL 是不能远程访问的&#xff0c;当我们修改了用户名可以接受远程访问后&#xff0c;还是没有办法接受远程访问。 还有一个配置的地方需要验证。 mysqld.cnf 配置文件 mysqld.cnf 配置文件对访问的地址可能会有限制。 配置文件的地址为&#…

YoloV9改进策略:注意力改进、Neck层改进_自研全新的Mamba注意力_即插即用,简单易懂_附结构图_检测、分割、关键点均适用(独家原创,全世界首发)

摘要 无Mamba不狂欢,本文打造基于Mamba的注意力机制。全世界首发基于Mamba的注意力啊!对Mamba感兴趣的朋友一定不要错过啊! 基于Mamba的高效注意力代码和结构图 import torch import torch.nn as nn # 导入自定义的Mamba模块 from mamba_ssm import Mamba class Eff…

AI大模型系列:自然语言处理,从规则到统计的演变

自然语言处理&#xff0c;从规则到统计的演变 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是人工智能的一个重要分支&#xff0c;主要研究如何让计算机理解、解释和生成人类语言。从自然语言处理的字面上来看&#xff0c;最重要的是“语言…

css 文字左右抖动效果

<template><div class"box"><div class"shake shape">抖动特效交字11</div></div> </template><script setup></script><style scope> .shape {margin: 50px;width: 200px;height: 50px;line-heigh…

腾讯混元,「出招」SaaS

透过这次升级动作&#xff0c;也同样对应的一个明显的信号是&#xff1a;腾讯在数字化时代的To B底层能力&#xff0c;也更在一步步AI化。 作者|皮爷 出品|产业家 “大模型如今走到哪了&#xff1f;”在越来越多的场合和分享上&#xff0c;这个问题开始成为必谈的话题之一…

计算机存储原理.2

1.主存储器与CPU之间的连接 2.存储器芯片的输入输出信号 3.增加主存的存储字长 3.1位扩展 数据总线的利用成分是不充分的(单块只能读写一位)&#xff0c;为了解决这个问题所以引出了位扩展。 使用多块存储芯片解决这个问题。 3.2字扩展 因为存储器买的是8k*8位的&am…

朴素贝叶斯算法分类

def loadDataSet():postingList[[my, dog, has, flea, problems, help, please], #切分的词条[maybe, not, take, him, to, dog, park, stupid],[my, dalmation, is, so, cute, I, love, him],[stop, posting, stupid, worthless, garbage],[mr, licks, ate, my, steak, …

Steam家庭组功能出现问题,组建家庭可能受限

Steam家庭组功能出现问题&#xff01;组建家庭可能受限 最近Steam家庭功能出现了问题&#xff0c;导致组建家庭可能会受到限制。一些玩家在邀请家庭成员加入时遇到了接受邀请失败的情况&#xff0c;提示他们不具有资格加入家庭。经过测试发现&#xff0c;即使是同一地区的账号…

单一职责原则介绍

单一职责原则&#xff08;Single Responsibility Principle&#xff0c;简称SRP&#xff09;是面向对象设计中的一个重要原则&#xff0c;它指出一个类应该只有一个引起变化的原因。换句话说&#xff0c;每个类都应该有一个明确的任务&#xff0c;只做一件事&#xff0c;并做好…

主机ping不通虚拟机/虚拟机ping不通主机/xhell连接不了虚拟机/win10或win11系统升级导致无法连接到虚拟机

解决方案 重置网卡 找虚拟机ip&#xff0c;第二个inet对应的就是虚拟机ip地址 xshell连接 参考: 主机ping不通虚拟机

C语言数据结构之栈

目录 1.栈的概念及结构2.栈的实现3.栈的代码实现4.相关例题 •͈ᴗ•͈ 个人主页&#xff1a;御翮 •͈ᴗ•͈ 个人专栏&#xff1a;C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-5

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

【iOS开发】(五)react Native路由和导航20240421-22

【iOS开发】(五)react Native 路由和导航Navigation 20240421 在&#xff08;一&#xff09;&#xff08;二&#xff09;中我们 Reactnative搭建了开发环境、学习了 基础语法、状态管理&#xff0c;JSX、组件、状态和生命周期以及样式布局等。 在&#xff08;三&#xff09;&a…

JavaScript-事件监听、事件对象与事件流

事件监听 什么是事件什么是事件监听&#xff1f;事件监听三要素 事件监听L0 绑定L2 绑定区别vue绑定 事件类型鼠标事件键盘事件焦点事件文本事件 什么是事件对象获取事件对象环境对象回调函数事件流事件捕获事件冒泡阻止冒泡 解绑事件两种注册事件的区别事件委托 什么是事件 事…

「笔试刷题」:孩子们的游戏(圆圈中最后剩下的数)

一、题目 描述 每年六一儿童节&#xff0c;牛客都会准备一些小礼物和小游戏去看望孤儿院的孩子们。其中&#xff0c;有个游戏是这样的&#xff1a;首先&#xff0c;让 n 个小朋友们围成一个大圈&#xff0c;小朋友们的编号是0~n-1。然后&#xff0c;随机指定一个数 m &#xf…

敏捷之Scrum开发

目录 一、什么是 Scrum 1.1 Scrum 的定义 二、Scrum 迭代开发过程 2.1 迭代开发过程说明 2.1.1 开发方法 2.1.1.1 增量模型 2.1.1.1.1 定义 2.1.1.1.2 模型方法说明 2.1.1.2 迭代模型 2.1.1.2.1 定义 2.1.1.2.2 模型方法说明 2.1.2 迭代过程 2.1.2.1 产品需求Produ…

GPU服务器和普通服务器有何区别?

众所周知&#xff0c;服务器是网络中的重要设备&#xff0c;要接受少至几十人、多至成千上万人的访问&#xff0c;因此对服务器具有大数据量的快速吞吐、超强的稳定性、长时间运行等严格要求。 GPU服务器和普通服务器的主要区别在于硬件配置和适用场景&#xff0c;特别是处理器…

STM32修改主频的方法

大家都知道STM32F103C8T6的主频是72M&#xff0c;那怎么样才能在程序中获得这个主频的值呢&#xff1f;怎么样才能更改主频的值呢&#xff1f; 如图找到主频的变量&#xff0c;然后显示这个变量就是显示主频了。 #include "stm32f10x.h" // Device…

【图解计算机网络】简单易懂的https原理解析

简单易懂的https原理解析 https与http的区别混合加密对称加密非对称加密混合加密解析混合加密问题 摘要算法数字证书数字证书原理为什么通过CA证书可以解决中间人攻击的问题呢&#xff1f; https握手流程 https与http的区别 http是明文传输的&#xff0c;非常不安全&#xff0…