taro vue 微信小程序 手写签名 功能实现

目录

需求:

效果:

template:

 data:

methods:

手写绘制:

图片保存:

css:


需求:

在指定区域可以手写签名,点击重新签名,清除手写区域

点击提交签名,将手写签名保存为一张图片上传至oss并将地址传给服务端保存

再次进入时,如果已经保存过签名,则显示上次的签名图片

效果:

template:

<template><view class="container"><image class="sign-img" v-if="!isShowSignCanvas" :src="signUrl" mode="aspectFill"></image><canvas v-show="isShowSignCanvas" class="canvas" id="canvas" canvas-id="canvas" disable-scroll="true" @touchstart="canvasStart" @touchmove="canvasMove" @touchend="canvasEnd" @touchcancel="canvasEnd" @error="canvasIdErrorCallback"></canvas><view class="tips">请在框内签字</view><view class='addBtn'><AtButton  @click="cleardraw" class="zs-btn-plain AtButton" type='primary' >重新签名</AtButton><AtButton  @click="getImg" class="zs-btn-primary AtButton" type='primary' >提交签字</AtButton></view></view>
</template>

 data:

import Taro from "@tarojs/taro";
import { ref } from "vue";const signUrl = ref('') // 签名图片url
const isShowSignCanvas = ref(true) // 是否展示手写区域,有图片不展示,无图片展示let isButtonDown = false;
let arrx = [];
let arry = [];
let arrz = [];
let canvasw = 0;
let canvash = 0;
let signFlag = ref(false)let context = Taro.createCanvasContext('canvas'); // 使用 wx.createContext 获取绘图 下文 context
context.setFillStyle('#fff')
context.fillRect(0, 0, canvasw, canvash)
context.draw(true)
context.beginPath()
context.setStrokeStyle('#000000');
context.setLineWidth(4);
context.setLineCap('round');
context.setLineJoin('round');

methods:

手写绘制:

const canvasIdErrorCallback = (e) => { console.log(e) }
//开始
const canvasStart = (event) => {isButtonDown = true;arrz.push(0);arrx.push(event.changedTouches[0].x);arry.push(event.changedTouches[0].y);
}
//过程
const canvasMove = (event) => {if (isButtonDown) {arrz.push(1);arrx.push(event.changedTouches[0].x);arry.push(event.changedTouches[0].y);};signFlag.value = truefor (var i = 0; i < arrx.length; i++) {if (arrz[i] == 0) {context.moveTo(arrx[i], arry[i])} else {context.lineTo(arrx[i], arry[i])};};context.setStrokeStyle('#000000');context.setLineWidth(4);context.setLineCap('round');context.setLineJoin('round');context.stroke();context.draw(true);
}const canvasEnd = (event) => {isButtonDown = false;
}
const cleardraw = () => {isShowSignCanvas.value = true//清除画布arrx = [];arry = [];arrz = [];context.clearRect(0, 0, canvasw, canvash);context.draw(true);
}

图片保存:

const getImg = () => {if (!isShowSignCanvas.value) {Taro.navigateBack();return false}if (arrx.length == 0 || !signFlag.value) {Taro.showToast({title: `签名内容不能为空`,icon: 'none',duration: 2000})return false}Taro.canvasToTempFilePath({x: 0,y: 0,canvasId: 'canvas',success(res) {Taro.uploadFile({url: `xxxx`,filePath: res.tempFilePath,name: 'file',fileName: '签名',success: function (ress) {if (JSON.parse(ress.data).code == 0) {imgUrl = JSON.parse(ress.data).data.res.url// 图片已经上传至oss,此处是把图片地址传给服务端} else {Taro.showToast({title: `上传失败,请稍后再试`,icon: 'none',duration: 2000})}},fail: console.error})}})
}

css:

.container {width: 95%;position: absolute;height: 95%;top: 50%;left: 50%;transform: translate(-50%, -50%);box-sizing: border-box;background: #fff;border-radius: 5px;
}.sign-img {width: 100%;height: 80%;
}
.canvas {width: 100%;height: 70%;border: 1px dashed #aaa;box-sizing: border-box;
}.tips {height: 10%;display: flex;align-items: center;justify-content: center;text-align: center;color: #aaa;
}.addBtn {display: flex;align-items: center;justify-content: center;height: 18%;position: fixed;bottom: 0;width: 100%;background: #fff;z-index: 100;
}.addBtn .AtButton {height: 80%;font-size: 16px;width: 40%;
}

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

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

相关文章

OpenAI GPT3 Search API not working locally

题意&#xff1a;"OpenAI GPT-3 搜索 API 在本地无法工作" 问题背景&#xff1a; I am using the python client for GPT 3 search model on my own Jsonlines files. When I run the code on Google Colab Notebook for test purposes, it works fine and returns …

若依部署后出现Error: Cannot find module ‘@/views/xxx‘问题,本地没有问题(解决办法)

若依部署后出现Error: Cannot find module ‘/views/xxx‘问题&#xff0c;本地没有问题 文章目录 若依部署后出现Error: Cannot find module ‘/views/xxx‘问题&#xff0c;本地没有问题一、问题描述1️⃣&#xff1a;描述2️⃣&#xff1a;原因 二、解决办法1.permission.js…

Win32远线程注入

远线程注入 远线程(RemoteThread)注入是指一个进程在另一个进程中创建线程的技术&#xff0c;这是一种很经典的DLL注入技术。 虽然比较古老&#xff0c;但是很实用。通过远线程注入&#xff0c;再配合api函数的hook技术&#xff0c;可以实现很多有意思的功能。 实现远线程注入…

Java项目: 基于SpringBoot+mysql学生读书笔记共享平台(含源码+数据库+毕业论文+springboot开发文档)

一、项目简介 本项目是一套基于SpringBootmysql学生读书笔记共享平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单…

JsonCpp库的使用

目录 一、Json数据格式 二、JsonCpp介绍 2.1 Json::Value 2.2 序列化接口 2.3 反序列化接口 三、JsonCpp的使用 3.1 头文件包含 3.2 序列化 3.3 反序列化 四、补充 Json 是⼀种数据交换格式&#xff0c;它采⽤完全独⽴于编程语⾔的⽂本格式来存储和表示数据。 一、J…

Cvemap 到Nuclei模板映射

随着 ProjectDiscovery 的崛起&#xff0c;Nuclei、Katana、Subfinder、Naabu 以及最新添加的 cvemap 等工具纷纷出现&#xff0c;以增强勇敢者的武器库。 CVEmap 和 Nuclei 缺少功能 大多数渗透测试人员对缺少将cvemap结果直接“映射”到现有核心模板的功能感到失望。 这个绝…

macOS搭建Python3.11+Django4.2.15的平台框架使用Poetry管理

最近想使用Python开发&#xff0c;使用Django框架搭建平台&#xff0c;之前没有使用过Python&#xff0c;所以记录下整个过程&#xff1a; 1、Python版本的选择&#xff0c;直接去官网【Download Python | Python.org】看最新稳定版是哪个版本&#xff0c;选择安装&#xff0c…

Redis配置

redis配置管理 可以直接打开配置文件进行查看和修改&#xff0c;也可以通过config命令来进行查看和修改。 配置文件位置 Linux中默认在/etc/redis/redis.conf。Windows 中默认在安装目录下&#xff0c;名为 redis.windows.conf。 查看redis配置 使用redis-cli连接redis后&…

Anaconda安装并配置Python环境 | Python系列教程

Anaconda 是一个流行的 Python 数据科学和机器学习平台&#xff0c;它简化了包管理和部署的复杂性。Anaconda 旨在通过提供一个预配置的环境来加速数据分析、机器学习、科学计算和软件开发等领域的开发流程。总的来说&#xff0c;Anaconda 是一个强大的平台&#xff0c;它通过简…

ubunto中常见问题及WSL

ubunto中常见问题 ubuntu中vscode界面放大缩小的快捷方式ubuntu中vscode界面放大缩小的快捷方式_ubuntu中让vscode全屏-CSDN博客https://blog.csdn.net/weixin_47295886/article/details/123023748 解决出现无法使用sudo命令情况 解决出现无法使用sudo命令情况 - 知乎 (zhih…

DVP接口详解

背景知识 什么是DVP&#xff1f; DVP全称Digital Video Port&#xff08;数字视频端口&#xff09;是一种用于图像传感器和处理器之间传输视频数据的接口标准&#xff0c;DVP 接口采用并行传输方式&#xff0c;设计上属于低速总线&#xff0c;DVP没有特定的传输协议&#xff…

office365如何退回之前的版本

一夜之间&#xff0c;我的word使用起来感觉好麻烦。查询了一下&#xff0c;发现是word更新了。 感觉更新后一些功能很不好用&#xff0c;所以我决定返回之前使用的版本。现在记录一下这个过程&#xff0c;也可以供有需要的朋友参考。 打开cmd窗口&#xff0c;在第一行输入以下…

Vue3实时更新时间(年-月-日 时:分:秒)

代码案例 <script lang"ts" setup> import { ref,onMounted } from vue; const timer ref() const date ref("")//年月日 const moreTime ref("")//时分秒 onMounted(()>{//创建定时器1秒执行一次timer.value setInterval(() >…

真实:关于源代码防泄漏工作一些经验分享

互联网的飞速发展&#xff0c;各行各业都在往数字化转型&#xff0c;很多传统的业务数据都需要逐渐录入到电脑中&#xff0c;不仅节省了空间&#xff0c;还节约了成本。而这些数据都需要通过各类型的应用程序&#xff0c;进行分类&#xff0c;统计&#xff0c;展示&#xff0c;…

Apache DolphinScheduler项目与社区7-8月发展报告

各位热爱 Apache DolphinScheduler 的小伙伴们&#xff0c;社区7-8月报更新啦&#xff01;这里将记录 Apache DolphinScheduler 社区每月的重要更新&#xff0c;欢迎关注&#xff01; Merge Stars 感谢以下小伙伴上两个月为 Apache DolphinScheduler 项目和社区发展所做的精彩…

从K-Means到K-Medoid:聚类算法在缺陷报告分析中的性能比拼与优化探索

本文分享自华为云社区《聚类&#xff1a;k-Means 和 k-Medoid》作者&#xff1a; Uncle_Tom 1. 前言 在《对静态分析缺陷报告进行聚类&#xff0c;以降低维护成本》 提到使用 k-Medoid 通过相似缺陷的聚类&#xff0c;来减少程序员对大量缺陷分析的工作量。 k-Medoid 和传统的…

业务解耦-Spring事件监听的三种实现方式

实现ApplicationListener 步骤如下&#xff1a; 1.写Event类&#xff0c;需要继承Spring的ApplicationEvent类 2.写监听类&#xff0c;需要实现Spring的ApplicationListener接口&#xff0c;加上Component注解 3.监听类实现onApplicationEvent方法 4.通过ApplicationContext.p…

25届计算机毕业设计:如何用Java SpringBoot+Vue打造高效医疗器械管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

手游推广痛点解析,Xinstall如何助力厂商破解难题?

随着手游市场的日益繁荣&#xff0c;手游推广方式也在不断革新。从传统的地推、广告投放到如今新兴的CPA&#xff08;按动作付费&#xff09;和CPS&#xff08;按销售订单付费&#xff09;模式&#xff0c;手游推广正逐步走向效果导向的时代。而在这个过程中&#xff0c;Xinsta…

Ubuntu上安装剪切板管理软件

1. 更新系统和软件 确保你的系统和软件是最新的&#xff0c;有时更新可以修复这类错误。 sudo apt update sudo apt upgrade 2. 重新安装 Diodon 尝试卸载并重新安装 Diodon。 sudo apt remove diodon sudo apt install diodon 3. 检查依赖项 确保系统中安装了所有必要…