vue PC端完成电子签名

news2024/11/14 2:16:53

最近接到一任务,有一个功能,重来没有遇到过。就是电子签名

 看了原型其他基本都是对接口、写表单,难度不大,先把电子签名给攻克了起。

因为项目是vue 所有使用了 vue-esign 组件

1. 安装依赖

npm install vue-esign --save

2.使用

因为有许多地方要用到,就写了个组件

<template>
  <div>
    
    <el-card class="qianming-container" body-style="padding:0px">
      <vue-esign
        ref="esign"
        :isCrop="isCrop"
        :width="600"
        :height="300"
        :lineWidth="lineWidth"
        :lineColor="lineColor"
        :format="'image/png'"
        :bgColor.sync="bgColor"
      ></vue-esign>
      <div class="contro-container">
        <el-button type="danger" @click="handleReset">清空画板</el-button>
        <el-button type="primary" @click="handleGenerate">确认签名</el-button>
      </div>
    </el-card>
  </div>
</template>
  
<script>
import vueEsign from "vue-esign";
export default {
  components: { vueEsign },
  name: "Qianming",
  data() {
    return {
      lineWidth: 6,
      lineColor: "#000000",
      bgColor: "",
      resultImg: "",
      isCrop: false,
    };
  },
  methods: {
    //清空画板..
    handleReset() {
      this.$refs.esign.reset();
      this.resultImg = "";
    },
    //生成签名图片..
    handleGenerate() {
        this.$refs["esign"].generate().then((res) => {
              this.resultImg = res; // 得到了签字生成的base64图片

              this.$emit("setsignin",res)
            let file = this.base64ImgtoFile(res)
            console.log(file)
            // client.put('file', file).then(res=>{
            // if(res.url){
            //     this.resultImg = res.url
            // }else{
            //     this.$message.error('文件上传失败')
            // }
            // }).catch(err=>{})
        }).catch((err) => {
          //  没有签名,点击生成图片时调用
          this.$message({
            message: err + " 未签名!",
            type: "warning",
          });
        });
    },
    // 将base64,转换成图片
    base64ImgtoFile(dataurl, filename = "file") {
      const arr = dataurl.split(",");
      const mime = arr[0].match(/:(.*?);/)[1];
      const suffix = mime.split("/")[1];
      const bstr = atob(arr[1]);
      let n = bstr.length;
      const u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new File([u8arr], `${filename}.${suffix}`, {
        type: mime,
      });
    },
    //将base64转换为文件..
    dataURLtoFile(dataurl, filename) {
      var arr = dataurl.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new File([u8arr], filename, { type: mime });
    },
  },
};
</script>
  
<style scoped>
button {
  height: 40px;
} 
 .contro-container {
  width: 600px;
  height: 50px;
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-around;
  background-color: #d3d3d3;
  position: absolute;
  bottom: 0px;
}
.qianming-container {
  width: 600px;
  height: 350px;
  margin: 10px auto;
  position: relative;
}
.text {
  font-size: 14px;
}
.item {
  margin-bottom: 18px;
}
.clearfix:before,
.clearfix:after {
  display: table;
  content: "";
}
.clearfix:after {
  clear: both;
}
.box-card {
  width: 95%;
  margin-left: 2.5%;
  margin-top: 20px;
}
</style>
  
  

3.使用组件

template--------------

<el-form-item label="电子签名">
              <div  @click="signinVisible=true" style="width: 200px;background-color: #d9d9d9;">
                <el-image :src="signinimg" style="width: 200px;height: 100px;display: flex;align-items: center;justify-content: center;color: #999;">
                  <div slot="error" >
                     点击签名
                  </div>
                </el-image>
              </div>
</el-form-item> 


<el-dialog title="电子签名" :visible.sync="signinVisible" width="700px">
       
          <signinDia @setsignin="setsignin"></signinDia>
        
      </el-dialog>


js----------

 import signinDia from "@/components/signinDia.vue"
components: {
     signinDia
    },

 setsignin(img){
        this.signinimg=img
        this.signinVisible=false
      },

组件目前是返回bas64格式,我觉得要把他转换成在线图片,然后再存起来,具体的等写到这时和后端商量吧

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

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

相关文章

C++中的关联容器map下标运算符[]使用分析

最近使用到C中的map&#xff0c;发现一个问题&#xff0c;如果一个键不存在时&#xff0c;下标运算符会创建一个新的元素&#xff0c;其关键字为键。 一&#xff0c;问题重现 首先看一下问题描述&#xff1a; 本题要求读入 N 名学生的成绩&#xff0c;将获得某一给定分数的学生…

最细接口自动化测试yaml框架,超全详解,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 YAML文件介绍 YAM…

津津乐道设计模式 - 责任链模式详解(教你更优雅的处理商城下单业务)

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Linux系统的目录结构与基本命令

目录 Linux系统使用注意 Linux严格区分大小写 Linux文件"扩展名" Linux系统中常见的后缀名称&#xff1a; Linux中所有内容以文件形式保存 Linux中存储设备都必须在挂载之后才能使用 Linux系统的目录结构 Linux分区与Windows分区 Linux系统文件架构 Linux系…

用AI帮助小学一年级记住常用字

这几天娃就要一年级毕业放假了&#xff0c;感觉时间过得太快了。再开学就要上二年级&#xff0c;可汉字表上的区区三四百字&#xff0c;咋就那么的难读&#xff1f;难记&#xff1f;喊他们来认字&#xff0c;拉都拉不过来。哎&#xff0c;愁啊&#xff0c;替他们焦虑。突发奇想…

Docker发布VUE vhr微人事前端(Nginx 403 forbidden)

本文代码来源于&#xff08;感谢作者&#xff09; GitHub - lenve/vhr: 微人事是一个前后端分离的人力资源管理系统&#xff0c;项目采用SpringBootVue开发。 发布过程参考博主 【Docker】使用docker容器发布vue项目_docker 发布vue_TOP灬小朋友的博客-CSDN博客 1.创建Do…

食品空压机数据采集远程监控系统解决方案

食品行业是一个需求量大、安全标准高、竞争激烈的行业。随着人们消费水平的提升&#xff0c;对食品的品质、口味、营养、卫生等方面有了更高的要求。食品空压机是食品生产过程中不可缺少的设备&#xff0c;它可以提供稳定的压缩空气&#xff0c;用于食品加工、包装、运输等环节…

大聪明教你学Java | 深入浅出聊 ThreadPoolExecutor

前言 🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。 🍊支持作者: 点赞👍、关注💖、留言💌~ 在《阿里巴巴 Java 开发手册》中有这么一个强制要求:“线程池不允许使用 Executors 去创建,而是…

6月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩)发布!

飞瓜轻数发布2023年6月19日-6月25日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

【计算机网络】数据链路层之随机接入-CSMA/CD协议

1.概念 2.信号碰撞&#xff08;冲突&#xff09; 3.解决方案 CSMA/CD 4.争用期&#xff08;端到端往返时延&#xff09; 5.最小帧长 6.最大帧长 7.指数退避算法 8.信道利用率 9.帧发送流程 10.帧接受流程 12.题目1 13.题目2 14.题目3 15 小结

linux:docker-compose下载后无法使用

参考&#xff1a; Ubuntu 安装 Docker & Docker-Compose - 知乎 解决方法: PC上下载二进制文件&#xff0c;之后filezilla上传到服务器对应目录

项目一、黑客攻击系统功能菜单->功能菜单

功能菜单 项目需求 注&#xff1a;本小节"是写功能的选项&#xff0c;在有图形化的app当中&#xff0c;肯定有选项 这章节就是讲怎么写选项的" 什么是图形化&#xff1a;把文字翻译成图像或者是图片等等。 功能选项&#xff1a; 1.网站404攻击 2.网站篡改攻击 3.网站…

Acer宏碁超轻薄笔记本非凡Swift系列SF314-57G原装出厂Win10系统工厂模式 恢复原厂OEM系统

Acer宏基超轻薄笔记本电脑&#xff0c;Acer宏碁Swift系列非凡SF314-57G原装出厂Windows10系统(工厂模式) 恢复原厂预装OEM系统 系统自带所有驱动、Office办公软件、出厂主题壁纸LOGO、 Acer Care Center、Quick Access等预装程序 所需要工具&#xff1a;32G或以上的U盘&#…

chatgpt 用来取名字

Object ,array 相对 string,int 来说是什么类型, 分别用英文名称来定义他们的类型类别

应用在数字音频工作站中的ADC芯片

数字音频工作站&#xff08;DAW&#xff09;是电子设备或应用软件用于记录&#xff0c;编辑和产生的音频文件。数字音频工作站具有多种配置&#xff0c;从便携式计算机上的单个软件程序到集成的独立单元&#xff0c;一直到由中央计算机控制的众多组件的高度复杂的配置。无论配置…

vue3-实战-15-管理后台-动态实现菜单权限和按钮权限

目录 1-菜单路由权限分析 2-菜单权限实现 2.1-路由拆分 2.2-动态计算当前用户的权限 3-按钮权限实现 1-菜单路由权限分析 目前我们系统中有&#xff1a;login(登录页面)、404(404一级路由)、任意路由、首页(/home)、数据大屏、权限管理(三个子路由)商品管理模块(四个子路由…

libevent(14)bufferevent的client端例子

前面我们写了基于bufferevent的server端&#xff0c;这里我们写1个基于bufferevent的client端。 test_libevent_client.cpp&#xff1a; #include <string.h> #include <errno.h> #include <stdio.h> #include <signal.h> #include <netinet/in.h&…

wsl下面的子系统启用systemctl

下载地址 https://github.com/gdraheim/docker-systemctl-replacement 操作 mv /usr/bin/systemctl /usr/bin/systemctl.old #对原文件进行备份sudo scp /mnt/c/Users/Administrator/Desktop/systemctl.py /usr/bin/systemctl #把项目中的systemctl.py文件拷贝到/use/bin/ 目…

vitest测试 element-plus二次封装组件时css文件报错

bug描述&#xff1a;使用 element-plus 二次封装组件&#xff0c;使用 vitest 测试时报错&#xff0c;对于 element-plus 的 css 样式识别失败。 报错内容&#xff1a; Unknown file extension “.css” for D:\demo\omniButton\node_modules.pnpm\registry.npmmirror.comeleme…

SQL专家云快速解决阻塞

背景 当数据库突然产生严重阻塞时&#xff0c;运维人员要快速找到阻塞的源头并处理&#xff0c;让业务快速恢复。但是大多数运维人员只掌握了sp_who2、sp_lock等简单的语句&#xff0c;存在以下不足&#xff1a; 找不到真正的源头&#xff0c;过程中会误杀掉大量的会话&#xf…