首页 > 其他分享 >vue 实现电子签名 vue-signature-pad

vue 实现电子签名 vue-signature-pad

时间:2024-11-15 14:14:15浏览次数:3  
标签:vue const 画笔 value 电子签名 pad signature ref

vue-signature-pad pc电子签名

  • 实例
    在这里插入图片描述
  • 下载依赖
//Vue 2 项目:安装 vue-signature-pad 的 2.0.5 版本。
npm install --save [email protected]
//Vue 3 项目:安装最新版本的 vue-signature-pad。
npm install --save vue-signature-pad
  • 全局引入 vue3 实例
//main.js
import { createApp } from 'vue'
const app = createApp(App)
import { VueSignaturePad } from 'vue-signature-pad';
app.component("VueSignaturePad", VueSignaturePad);
  • 封装签名组件
// signinDia.vue
<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 v-if="show1" class="line" ref="signaturePad" :options="signOptions" :images="images" :customStyle="customStyle"
      width="100%" 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 { nextTick, ref, watch } from "vue";
const signaturePad = ref();
const show1 = ref(false)
//最后加载组件
nextTick(() => { show1.value = true })
const signOptions = ref({
  minWidth: 2, // 画笔最小宽度
  maxWidth: 5, // 画笔最大宽度
  throttle: 5, // 画笔移动事件的时间间隔,单位为毫秒
  minDistance: 5, // 画笔移动的最小距离,单位为像素
  backgroundColor: "rgba(218, 215, 215, 0.829)", // 画布背景颜色
  penColor: "black", // 画笔颜色
  velocityFilterWeight: 0.7, // 画笔速度过滤器的权重
  onBegin: () => { 
    console.log('=== Begin ===');
  }, // 开始签名时的回调函数
  onEnd: () => { 
    console.log('=== End ===');
  }, // 结束签名时的回调函数
})

const customStyle = ref({
  signatureCanvas: {
    border: "1px solid #ccc", // 画布边框
    borderRadius: "5px", // 画布圆角
  }
}
)
const images = ref([])
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 emit = defineEmits(['setsignin'])
const saveUploadSign = async () => {
  console.log('检查签名板实例是否有效', signaturePad.value);  // 检查签名板实例是否有效
  const { isEmpty, data } = signaturePad.value.saveSignature();
  if (isEmpty) return;
  console.log("picture url:", data);
  if (data) {
    emit('setsignin',data)
 // 创建一个虚拟的下载链接
 const link = document.createElement('a');
    link.href = data;
    link.download = 'signature.png';  // 设置下载文件名
    // 为了确保链接点击被浏览器允许,稍微延时触发下载
    setTimeout(() => {
      link.click();  // 自动点击下载链接,触发文件下载
      // show1.value = false
    }, 100);  // 100毫秒的延时
  
  }
};
</script>
  • 需要页面引入
<template>
  <div class="app-container">
    <el-image v-if="setsignin" @click="handlePreview()" :src="form.electronicSignature" :zoom-rate="1.2"
      :max-scale="7" :min-scale="0.2" fit="cover" placeholder="点击生成" error="点击签字">
    </el-image>
    <span v-else style="color: steelblue;cursor: pointer;" @click="handlePreview()">点击签名</span>
     
    <!--电子签名弹框 -->
    <el-dialog title="电子签名" v-model="signinVisible" width="700px" :close-on-click-modal="false" append-to-body
      @close="signinVisible = false">
      <signinDia @setsignin="setsignin"></signinDia>
    </el-dialog>
  </div>
</template>

<script setup name="User">
import signinDia from "./compent/signinDia.vue"
const signinVisible=ref(false)//电子签名
const setsignin=ref('')//电子签名路径
//签字弹框关闭
function setsignin(img) {
  setsignin.value = img
  signinVisible.value=false
}
//点击签字
function handlePreview () {
  console.log('点击签字');
  signinVisible.value=true
}
</script>

标签:vue,const,画笔,value,电子签名,pad,signature,ref
From: https://blog.csdn.net/weixin_72102746/article/details/143795891

相关文章

  • SpringBoot+Vue3实现数据可视化大屏
    前端工程的地址:UserManagerFront:数据可视化前端(gitee.com)效果展示,可以展现出来了,样式可能还有一些丑。后端代码后端主要是拿到数据并对数据进行处理,按照前端需要的格式进行返回即可。importcom.njitzx.entity.Student;importcom.njitzx.entity.vo.*;import......
  • ssm118亿互游在线平台设计与开发+vue(论文+源码)_kaic
    毕业设计(论文)  亿互游在线平台的设计与开发学生姓名   XXX                        学    号   XXXXXXXX          分院名称   XXXXXXXX          专业班级   XXXXX   ......
  • 浏览器里面带有很多%的是什么?如果查看?如何使用notePad++解码?如何使用notePad++解码URL
    1、浏览器里面带有很多%的是什么?本质就是url携带的参数,就是k-v键值对(如下说明)。由于k-v键值对里面,如果v里面包含“=”或“&”就是导致服务器解析错误,因此会将url就行url编码。会将url转换为对应的ASCII,如果是在v里面的=或&就会添加%来标记。这样就防止解析url错误。浏览器通......
  • 基于springboot+vue实现的摄影师分享交流社区 (源码+L文+ppt)4-094
      3.1系统功能结构3.2.2数据逻辑结构(共13张表)在综合了以上对系统的设计,和对数据库的分析,同时结合了以往对数据库的使用经验后,构建了以下几张表,以下为每张表的内容:表3-1:用户字段名称类型长度字段说明主键默认值idbigint主键  主键addtimeti......
  • 基于springboot+vue实现的人事管理系统 (源码+L文+ppt)4-084
      摘 要人事管理系统是企业用以维护员工信息、管理人力资源活动和优化组织效能的关键工具。该系统具备多项功能,包括员工信息管理、部门协调、培训安排、职位调整、考勤追踪、请假审批、奖惩记录、工资发放以及员工积分管理等。管理员端提供全面控制,允许系统管理员执行从......
  • 基于springboot+vue实现的摄影师分享交流社区 (源码+L文+ppt)4-094
      3.1系统功能结构3.2.2数据逻辑结构(共13张表)在综合了以上对系统的设计,和对数据库的分析,同时结合了以往对数据库的使用经验后,构建了以下几张表,以下为每张表的内容:表3-1:用户字段名称类型长度字段说明主键默认值idbigint主键  主键addtimeti......
  • 基于springboot+vue实现的人事管理系统 (源码+L文+ppt)4-084
      摘 要人事管理系统是企业用以维护员工信息、管理人力资源活动和优化组织效能的关键工具。该系统具备多项功能,包括员工信息管理、部门协调、培训安排、职位调整、考勤追踪、请假审批、奖惩记录、工资发放以及员工积分管理等。管理员端提供全面控制,允许系统管理员执行从......
  • 基于springboot+vue实现的摄影师分享交流社区 (源码+L文+ppt)4-094
      3.1系统功能结构3.2.2数据逻辑结构(共13张表)在综合了以上对系统的设计,和对数据库的分析,同时结合了以往对数据库的使用经验后,构建了以下几张表,以下为每张表的内容:表3-1:用户字段名称类型长度字段说明主键默认值idbigint主键  主键addtimeti......
  • 基于springboot+vue实现的大型超市数据处理系统 (源码+L文+ppt)4-015
      第4章 系统设计本章主要讲述的是大型超市数据处理系统的设计开发结构,简单介绍了开发流程与数据库设计的原则以及数据表的关系结构图,并且详细的展示了数据表的内部结构信息与属性。图4-2大型超市数据处理系统总体结构图4.4 数据表信息(共18张表)在关系数据E-R图中,......
  • 基于springboot+vue实现的高校电子图书馆的大数据平台 (源码+L文+ppt)4-013
      4.1系统结构设计这些功能可以充分满足高校电子图书馆的大数据平台的需求。此系统功能较为全面如下图系统功能结构如图4-1所示。图4-1功能结构图4.3.2 数据库表结构(共15张表)本论文中的高校电子图书馆的大数据平台采用MySQL数据库,系统中的所有对象以及对象的所有属性......