首页 > 其他分享 >vue3 手机端 手写签字

vue3 手机端 手写签字

时间:2024-04-03 14:55:25浏览次数:36  
标签:canvas const ctx value 签字 let vue3 手写 ref

<template>
  <div> 
    <div>
      <canvas class="canvas" id="canvas" ref="canvas"></canvas>
      <canvas id="blank" style="display: none"></canvas> 
      <p v-else style="font-size: 240px; line-height: 360px">
        请适当放慢签写速度,确保字迹清晰可辨认!
      </p> 
      <div class="button">
        <div class="signature">
          <button class="re-sign" ref="clearBtn">重新签名</button>
        </div>
        <div class="signature">
          <button class="re-sign" @click="imgcanvas">提交签名</button>
        </div>
      </div> 
      <!-- <img :src="dataURL" alt="" /> --> 
    </div>
  </div> 
</template>
<script setup>
import { onMounted, ref } from 'vue'
import axios from 'axios'

const canvas = ref(null) let ctx = ref() let canvasWidth = document.body.clientWidth let canvasHeight = canvasWidth
const initContext = () => { ctx = canvas.value.getContext('2d') canvas.value.width = canvasWidth * 0.98 canvas.value.height = canvasHeight * 0.98 } let isDrawing = false let lastX = 0 let lastY = 0 // 重新写 let clearBtn = ref(null) onMounted(() => { initContext() canvas.value.addEventListener('touchstart', function (e) { isDrawing = true e.preventDefault() ;[lastX, lastY] = [e.changedTouches[0].clientX, e.changedTouches[0].clientY] }) canvas.value.addEventListener('touchmove', function (e) { e.preventDefault() if (isDrawing) { ctx.beginPath() ctx.lineWidth = 24 ctx.strokeStyle = '#007768' ctx.moveTo(lastX, lastY) ctx.lineTo(e.changedTouches[0].clientX, e.changedTouches[0].clientY) ctx.stroke() ;[lastX, lastY] = [e.changedTouches[0].clientX, e.changedTouches[0].clientY] } }) canvas.value.addEventListener('touchend', function () { e.preventDefault() isDrawing = false }) clearBtn.value.addEventListener('click', function () { ctx.clearRect(0, 0, canvas.value.width, canvas.value.height) }) }) const dataURL = ref() const reader = ref() const successing = ref(false) //验证canvas画布是否为空 function isCanvasBlank(canvas) { var blank = document.createElement('canvas') //系统获取一个空canvas对象 blank.width = canvas.width blank.height = canvas.height return canvas.toDataURL() == blank.toDataURL() //比较值相等则为空 } // 转换为文件 let flies = ref() const imgcanvas = async () => { var c = document.getElementById('canvas') // 获取html的canvas对象 if (isCanvasBlank(c)) { alert('请签名,签名后即可提交') return } dataURL.value = canvas.value.toDataURL('image/png') flies.value = base64ImgtoFile(dataURL.value) try { UploadFile(flies.value) } catch (error) { console.error('上传失败:', error) } } const base64ImgtoFile = (dataurl, filename = 'file') => { 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 }) } //file上传至服务器 let dataimg = ref() const UploadFile = (file) => { let uploadkey = localStorage.getItem('uploadkey') let fd = new FormData() fd.append('file', file) //传文件 fd.append('type', '3') //传文件 axios.post('地址', fd).then((res) => { //data为后端返回的上传结果,里面包含文件在服务器上的地址 dataimg.value = res.data.data //oss返回的地址 }) } </script>

 

标签:canvas,const,ctx,value,签字,let,vue3,手写,ref
From: https://www.cnblogs.com/wulicute-TS/p/18112687

相关文章

  • vue3 快速入门系列 —— 基础
    vue3快速入门系列-基础前面我们已经用vue2和react做过开发了。从vue2升级到vue3成本较大,特别是较大的项目。所以许多公司对旧项目继续使用vue2,新项目则使用vue3。有些UI框架,比如antdesignvue1.x使用的vue2。但现在antdesignvue4.x都是基于vue3,示例默认是......
  • Vite创建Vue3项目
    一、简介    Vite:一款前端构建工具。    官网地址:https://cn.vitejs.dev二、依赖    1、Node.js。下载和安装环境略过。三、基于Vite创建Vue3项目    3.1、创建vite    npmcreatevite@latest        之后跟随引导,......
  • vue3
    [slot插槽]官方文档[slot有什么用?]为了复用,在开发过程中,会产生很多组件,组装这些组件会形成一个树形结构。如果组件嵌套层数过多,过于零碎,不利于开发和维护。slot插槽的作用,就是讲组装过程扁平化,比如有三级组件,正常需要在一级组件中嵌入二级组件,在二级组件中嵌入三......
  • 从零实现vue3核心源码 day1
    1.声明式框架Vue3依旧是声明式的框架,用起来简单。命令式和声明式区别早在JQ的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程声明式框架更加关注结果。命令式的代码封装到了vue.js中,过程靠vue.js来实现声明式代码更加简单,不需要关注实现,按照要求填代码就可......
  • 手写数字图片识别——DL 入门案例
    DeepLearningDemoofPrimary下面介绍一个入门案例,如何使用TensorFlow和Keras构建一个CNN模型进行手写数字识别,以及如何使用该模型对自己的图像进行预测。尽管这是一个相对简单的任务,但它涵盖了深度学习基本流程,包括:数据准备模型构建模型训练模型预测输入:importtenso......
  • Java登陆第三十六天——VUE3响应式入门、setup语法糖
    当浏览器接收到服务端返回的页面后,浏览器会把页面解析成DOM树,DOM树中各个元素会相应的显示在浏览器上。VUE提供的响应式数据可以在页面不刷新的情况下更新数据。响应式数据App.vue<script>//等价于setup语法糖。固定的写法,不会改。exportdefault{setup(){letsum......
  • Java登陆第三十六天——VUE3引入CSS
    在一个.Vue文件中,通常包括以下三部分。<template><style><script>.vue中部分传统部分描述<template>HTML代替传统的.html文件<style>CSS代替传统的.js文件<script>JS代替传统的.css文件声明内部的CSS在.Vue文件中,style标签声明CSS。Hello......
  • Vue3初识
    Vue3初识vue.js是什么vue是什么?官网首页就有答案:渐进式JavaScript框架。有灵活,易用,高效的特点。官网首页有详细的介绍:v2:https://cn.vuejs.org/v2/guide/V3:https://vuejs.org/V3中文:https://cn.vuejs.org/V3中文2:https://staging-cn.vuejs.org/如何理解渐进式个......
  • vue3+ant-design-vue - 最新实现“侧边动态导航栏+面包屑导航“功能,vue3+ant后台管理
    效果图在vue3+antdesignvue后台管理系统中,详细完成菜单导航+面包屑动态联动功能效果,支持缓存功能、配置简洁、自动跟随route路由进行变化、自动匹配菜单和面包屑导航的文字等,超详细实用的示例demo全部源代码。提供详细示例源代码,新手小白直接复制稍微改下配置就能用了,快......
  • vue3 点击复制
    npminstallclipboard--save//下载importClipboardfrom'clipboard'//使用页面引入js:constcopyText=async()=>{consttext=window.location.href//设置要复制的文本letclipboard=newClipboard('.buttoncopy',{text:()=>......