vue3实现电子签名的方法

vue3实现电子签名且对电子签名可进行修改画笔粗细、画笔颜色、撤销、清屏、保存等功能。

实现效果:查看源码
在这里插入图片描述

第一种:通过canvas

<div class="signaturePad-Box w100 h100 flex-center"><el-space class="mb10" size="large"><div><el-text>画笔粗细:</el-text><el-input-number v-model="state.signOptions.lineWidth" :min="2" :max="10" :step="1" @change="initCanvas" /></div><div><el-text>画笔颜色:</el-text><el-color-picker v-model="state.signOptions.penColor" color-format="hex" @blur="initCanvas"> </el-color-picker></div></el-space><canvas ref="canvas" @mousedown="startDrawing" @mousemove="draw" @mouseup="stopDrawing"></canvas><el-space class="mt10"><el-button  @click="clear">清除</el-button><el-button type="success" @click="view">查看</el-button><el-button type="primary" @click="save">保存</el-button></el-space><el-dialog v-model="state.dialogVisible" title="查看图片"  ><el-image :src="state.dataURL" /><template #footer><div class="dialog-footer"><el-button type="primary" @click="state.dialogVisible = false"> 确定 </el-button></div></template></el-dialog>
</div>
<script setup>import {ref,reactive,onMounted} from "vue";const canvas = ref(null);const state=reactive({dialogVisible:false,dataURL:"",signOptions: {penColor: '#000000',lineWidth: 2,},})let isDrawing = false;let lastX = 0;let lastY = 0;/* 初始化画布 */const initCanvas = () => {const ctx = canvas.value.getContext('2d');ctx.strokeStyle = state.signOptions.penColor;ctx.lineWidth = state.signOptions.lineWidth;}/* 开始绘制 */const startDrawing = (event) => {isDrawing = true;[lastX, lastY] = [event.offsetX, event.offsetY];}/* 绘制线条 */const draw = (event) => {if (!isDrawing) return;const ctx = canvas.value.getContext('2d');const currentX = event.offsetX;const currentY = event.offsetY;ctx.beginPath();ctx.moveTo(lastX, lastY);ctx.lineTo(currentX, currentY);ctx.stroke();[lastX, lastY] = [currentX, currentY];}/* 停止绘制 */const stopDrawing = () => {isDrawing = false;}/* 清除画布 */const clear = () => {const ctx = canvas.value.getContext('2d');ctx.clearRect(0, 0, canvas.value.width, canvas.value.height);}/* 保存签名 */const save = () => {state.dataURL = canvas.value.toDataURL('image/png');console.log('签名地址为:', state.dataURL);}/* 查看签名 */const view=()=>{state.dataURL = canvas.value.toDataURL('image/png');state.dialogVisible=true;}onMounted(() => initCanvas());
</script>

第二种:通过vue-signature-pad

安装依赖:

// npm
npm i vue-signature-pad// yarn
yarn add vue-signature-pad//pnpm 
pnpm i vue-signature-pad

在main.js里引用依赖:
注:在官网上写的是全局引入非单文件引入

import VueSignaturePad from 'vue-signature-pad';createApp(App).use(router).use(VueSignaturePad).mount('#app')

实现代码:

<template><div><el-space class="mb10" size="large"><div><el-text>画笔粗细:</el-text><el-input-number v-model="state.size" :min="2" :max="10" :step="1" @change="onChange" /></div><div><el-text>画笔颜色:</el-text><el-color-picker v-model="state.color" color-format="hex" @change="onChange"> </el-color-picker></div></el-space><VueSignaturePad class="line" ref="signaturePad" :options="signOptions" width="400px" height="200px" /><el-space class="mt10"><el-button @click="unDoSign">撤销</el-button><el-button @click="clearSign">清屏</el-button><el-button type="primary" @click="saveUploadSign">保存</el-button></el-space></div>
</template>
<script setup>import {ref,watch} from "vue";const signaturePad = ref();const signOptions=ref({penColor: '#000000',minWidth: 1,maxWidth:1})const state=ref({color:"#000",size:1})// 画笔颜色粗细改变时const onChange=()=>{signOptions.value={penColor:state.value.color,maxWidth:state.value.size}}// 撤销电子签名const unDoSign = () => {signaturePad.value.undoSignature();};// 清空电子签名const clearSign = () => {signaturePad.value.clearSignature();};// 保存并上传电子签名const saveUploadSign = async () => {const {isEmpty,data} = signaturePad.value.saveSignature();if (isEmpty) return;console.log("picture url:",data);};</script>

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

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

相关文章

【大模型认识】警惕AI幻觉,利用插件+微调来增强GPT模型

文章目录 一. 大模型的局限1. 大模型不会计算2. 甚至明目张胆的欺骗 二. 使用插件和微调来增强GPT模型1. 模型的局限性2. 插件来增强大模型的能力3. 微调技术-提高特定任务的准确性 一. 大模型的局限 1. 大模型不会计算 LLM根据给定的输入提示词逐个预测下一个词&#xff08;…

【人工智能基础】RNN实验

一、RNN特性 权重共享 wordi weight bais 持久记忆单元 wordi weightword baisword hi weighth baish 二、公式化表达 ht f(ht - 1, xt) ht tanh(Whhht - 1 Wxhxt) yt Whyht 三、RNN网络正弦波波形预测 环境准备 import numpy as np import torch from tor…

LeetCode-hot100题解—Day7

原题链接&#xff1a;力扣热题-HOT100 我把刷题的顺序调整了一下&#xff0c;所以可以根据题号进行参考&#xff0c;题号和力扣上时对应的&#xff0c;那么接下来就开始刷题之旅吧~ 1-8题见LeetCode-hot100题解—Day1 9-16题见LeetCode-hot100题解—Day2 17-24题见LeetCode-hot…

面试 Java 基础八股文十问十答第二十九期

面试 Java 基础八股文十问十答第二十九期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;类加载过程 类加载…

OpenNJet产品体验-手把手在Ubuntu20.04系统从零部署到应用OpenNJet

目录 一、引言 二、OpenNJet产品安装 2.1下载OpenNJet安装包 2.2安装OpenNJet V2.0.1 ​2.3快速启动并测试OpenNJet 三、OpenNJet产品应用体验 3.1配置OpenNJet 3.2 部署 Web 应用程序 3.3启动 NJet 3.4访问 Web 应用程序 四、总结 一、引言 OpenNJet应用引擎是高性…

[iOS]从拾遗到Runtime(上)

[iOS]从拾遗到Runtime(上) 文章目录 [iOS]从拾遗到Runtime(上)写在前面名词介绍instance 实例对象class 类对象meta-class 元类对象为什么要有元类&#xff1f; runtimeMethod(objc_method)SEL(objc_selector)IMP 类缓存(objc_cache)Category(objc_category) 消息传递消息传递的…

Vue 3 中的 h() 与 mergeProps() API 详解

前言 在 Vue 3 中&#xff0c;随着 Composition API 的引入&#xff0c;我们有了更多的灵活性和控制权来构建我们的组件。其中&#xff0c;h() 函数和 mergeProps() 是在构建渲染函数或 JSX/TSX 时经常使用的两个工具。下面&#xff0c;我将对这两个 API 进行详细的解释。 h()…

2024OD机试卷-求最多可以派出多少支团队 (java\python\c++)

题目:求最多可以派出多少支团队 题目描述 用数组代表每个人的能力,一个比赛活动要求参赛团队的最低能力值为N,每个团队可以由1人或者2人组成,且1个人只能参加1个团队,计算出最多可以派出多少只符合要求的团队。 输入描述 第一行代表总人数,范围1-500000 第二行数组代…

大模型微调之 在亚马逊AWS上实战LlaMA案例(四)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;四&#xff09; 在 Amazon SageMaker JumpStart 上微调 Llama 2 以生成文本 Meta 能够使用Amazon SageMaker JumpStart微调 Llama 2 模型。 Llama 2 系列大型语言模型 (LLM) 是预先训练和微调的生成文本模型的集合&#x…

C++string续

一.find_first_of与find 相同&#xff1a;都是从string里面找字符&#xff0c;传参格式一样(都可以从某个位置开始找) 不同&#xff1a;find_first_of只能找字符&#xff0c;find可以找字符串 find_first_of参数里面的string与char*是每个字符的集合&#xff0c;指找出string…

普通组件的注册-局部注册和全局注册

目录 一、局部注册和全局注册-概述 二、局部注册的使用示例 三、全局注册的使用示例 一、局部注册和全局注册-概述 组件注册有两种方式&#xff1a; 局部注册&#xff1a;只能在注册的组件内使用。使用方法&#xff1a;创建.vue文件&#xff0c;在使用的组件内导入并注册。…

QX-mini51单片机学习-----(3)流水灯

目录 1宏定义 2函数的定义 3延时函数 4标准库函数中的循环移位函数 5循环移位函数与左移和右移运算符的区别 6实例 7keil中DeBug的用法 1宏定义 是预处理语句不需要分号 #define uchar unsigned char//此时uchar代替unsigned char typedef是关键字 后面是接分号…

Python实战开发及案例分析(5)—— 贪心算法

贪心算法是一种在每一步选择中都采取当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。贪心算法不能保证得到最优解&#xff0c;但在某些问题中非常有效&#xff0c;并容易实现。 案例分析&#xff1a;找零问…

【Web前端】JavaScript—01

1.Javascript简介 简称JS&#xff0c;是当前最流行、应用最广泛的客户端脚本语言&#xff0c;用来在网页中添加一些动态效果与交互功能。在web开发领域有着举足轻重的地位。 2.JavaScript包含内容 核心ECMAScript(es):提供语言的语法和基本对象(数据类型、运算符、流程控制等…

Android Studio 之颜色

在Android中&#xff0c;颜色值由透明度alpha和RGB&#xff08;红、绿、蓝&#xff09;三原色定义&#xff0c;有八位十六进制数与六位十六进制数两种编码&#xff0c;例如八位编码FFEEDDCC&#xff0c;FF表示透明度&#xff0c;EE表示红色的浓度&#xff0c;DD表示绿色的浓度&…

Java特性之设计模式【代理模式】

一、代理模式 概述 在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式 在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口 主要解决&#xff1a; 在直接访问…

设计模式——外观模式(Facade)

外观模式&#xff08;Facade Pattern&#xff09; 是一种结构型设计模式&#xff0c;它为一个子系统中的一组接口提供一个统一的高层接口&#xff0c;使得子系统更加容易使用。这种类型的设计模式属于结构型模式&#xff0c;它向客户端提供了一个接口&#xff0c;隐藏了子系统的…

项目管理-项目资源管理2/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 资源管理&#xff1a;6个过程“硅谷火箭管控” ①规划资源管理&#xff1a; 写计划 ②估算活动资源&#xff1a;估算团队资源&…

【代码随想录37期】Day01 二分查找 + 移除元素

二分查找 力扣704 贴一下之前的笔记&#xff1a; 没想到一下子写不出来&#xff0c;忘记什么是二分法了&#xff0c;这里回顾一下&#xff1a; 「二分查找 binary search」是一种基于分治策略的高效搜索算法。 它利用数据的有序性&#xff0c;每轮减少一半搜索范围&#xff…

Kafak 消费异常:The coordinator is not available.

Kafak 消费异常:The coordinator is not available. 1. 问题描述2. 问题排查2.1 Topic 状态异常2.2 `__consumer_offsets` 简介1. 问题描述 在新环境部署 Kafak 时,发现可以正常产生消息,但是无法正常消费消息,消费消息的异常日志如下: 11:59:53.315 [main] DEBUG org.a…