tnblog
首页
视频
资源
登录

vue3 在线签字,生成一张图 。重置的时候保留背景颜色

652人阅读 2024/12/2 11:53 总访问:827568 评论:0 收藏:0 手机
分类: 前端

主要使用插件vue-esign,官方文档:https://github.com/JaimeCheng/vue-esign

一:添加引用

  1. cnpm install vue-esign

二:简单使用

先引用

  1. import vueEsign from 'vue-esign'

就可以直接使用了

  1. <vue-esign ref="esign" :width="800" :height="300"/>

在页面里边完整一点的引用

  1. <template>
  2. <div class="upLoadSign-container">
  3. <div>
  4. <vue-esign ref="esign" :width="800" :height="300"/>
  5. </div>
  6. </div>
  7. </template>
  8. <script setup lang="ts" name="upLoadSign">
  9. import {reactive, onMounted} from 'vue'
  10. import vueEsign from 'vue-esign'
  11. const state = reactive({
  12. title: '更新',
  13. })
  14. onMounted(() => {})
  15. </script>
  16. <style scoped="scoped" lang="scss">
  17. .upLoadSign-container {
  18. padding: 15px;
  19. }
  20. </style>

三:丰富一点的用法

包含背景颜色,线条颜色,重置的时候保留背景颜色的设置等

  1. <template>
  2. <div class="upLoadSign-container">
  3. <div>线条颜色:<input type="color" v-model="lineColor" /> 背景颜色:<input type="color" v-model="bgColor" /></div>
  4. <div class="ulsc-signContent">
  5. <vue-esign ref="esign" :isClearBgColor="isClearBgColor" :width="560" :height="300" :lineColor="lineColor" :bgColor="bgColor" />
  6. <div class="ulsc-sc-operate">
  7. <el-button @click="handleReset">清空</el-button>
  8. <el-button type="primary" @click="handleGenerate">确定</el-button>
  9. </div>
  10. <img :src="resultImg" />
  11. </div>
  12. </div>
  13. </template>
  14. <script setup lang="ts" name="upLoadSign">
  15. import { reactive, onMounted, ref } from 'vue'
  16. import vueEsign from 'vue-esign'
  17. const bgColor = ref('#E6E0E0') //背景颜色
  18. const lineColor = ref('') //线条颜色
  19. const resultImg = ref('') //拿到的图片的base64
  20. const isCrop = ref(false) //是否可裁剪
  21. const esign = ref() //组件dom
  22. const isClearBgColor = ref(false) //是否在重置的时候清空背景颜色
  23. const state = reactive({
  24. title: '更新'
  25. })
  26. // 清空组件
  27. function handleReset() {
  28. esign.value.reset()
  29. resultImg.value = ''
  30. }
  31. //生成图片,并下载图片
  32. function handleGenerate() {
  33. esign.value
  34. .generate()
  35. .then((res: any) => {
  36. resultImg.value = res
  37. })
  38. .catch((err: any) => {
  39. alert(err) // 画布没有签字时会执行这里 'Not Signned'
  40. })
  41. }
  42. onMounted(() => {})
  43. </script>
  44. <style scoped="scoped" lang="scss">
  45. .upLoadSign-container {
  46. padding: 15px;
  47. .ulsc-signContent {
  48. margin-top: 10px;
  49. .ulsc-sc-operate{
  50. margin-top: 10px;
  51. display: flex;
  52. justify-content: flex-end;
  53. }
  54. }
  55. }
  56. </style>

四:配合base64 图片上传

  1. <template>
  2. <div class="upLoadSign-container">
  3. <div>线条颜色:<input type="color" v-model="lineColor" /> 背景颜色:<input type="color" v-model="bgColor" /></div>
  4. <div class="ulsc-signContent">
  5. <vue-esign ref="esign" :isClearBgColor="isClearBgColor" :width="560" :height="300" :lineColor="lineColor" :bgColor="bgColor" />
  6. <div class="ulsc-sc-operate">
  7. <el-button @click="handleReset">清空</el-button>
  8. <el-button type="primary" @click="handleGenerate">确定</el-button>
  9. </div>
  10. <!-- <img :src="resultImg" /> -->
  11. </div>
  12. </div>
  13. </template>
  14. <script setup lang="ts" name="upLoadSign">
  15. import { reactive, onMounted, ref } from 'vue'
  16. import vueEsign from 'vue-esign'
  17. import request from '/@/utils/requestTools'
  18. import { getToken } from '/@/utils/auth'
  19. const bgColor = ref('#E6E0E0') //背景颜色
  20. const lineColor = ref('') //线条颜色
  21. // const resultImg = ref('') //拿到的图片的base64
  22. const isCrop = ref(false) //是否可裁剪
  23. const esign = ref() //组件dom
  24. const isClearBgColor = ref(false) //是否在重置的时候清空背景颜色
  25. const state = reactive({
  26. title: '更新'
  27. })
  28. // 清空组件
  29. function handleReset() {
  30. esign.value.reset()
  31. // resultImg.value = ''
  32. }
  33. //生成图片,并下载图片
  34. function handleGenerate() {
  35. esign.value
  36. .generate()
  37. .then((res: any) => {
  38. // resultImg.value = res
  39. base64ToImg(res)
  40. })
  41. .catch((err: any) => {
  42. alert(err) // 画布没有签字时会执行这里 'Not Signned'
  43. })
  44. }
  45. // Base64 编码的图片转成二进制图片
  46. const base64ToImg = (base64String: string) => {
  47. const byteString = window.atob(base64String.split(',')[1])
  48. const mimeString = base64String.split(',')[0].split(':')[1].split(';')[0]
  49. const ab = new ArrayBuffer(byteString.length)
  50. const ia = new Uint8Array(ab)
  51. for (let i = 0; i < byteString.length; i++) {
  52. ia[i] = byteString.charCodeAt(i)
  53. }
  54. const blob = new Blob([ab], { type: mimeString })
  55. upLoadImg(blob)
  56. }
  57. // 调用图片文件上传的接口
  58. const upLoadImg = async (blob: any) => {
  59. const formData = new FormData()
  60. formData.append('file', blob, 'image.png')
  61. // 其他参数
  62. formData.append('bucketName', "teacher-certification")
  63. formData.append('filePath', "clients")
  64. formData.append('fileType', "1")
  65. fetch('/oss/api/xxFiles/UpLoadFormFile', {
  66. method: 'POST',
  67. headers: {
  68. // 'Content-Type': 'application/json',
  69. Authorization:'Bearer '+ getToken() // 替换为你的 token
  70. },
  71. body: formData
  72. })
  73. .then((response) => {
  74. console.log('上传成功', response)
  75. // 后面的其他业务逻辑需要自己操作
  76. })
  77. .catch((error) => {
  78. console.error('上传失败', error)
  79. })
  80. }
  81. onMounted(() => {})
  82. </script>
  83. <style scoped="scoped" lang="scss">
  84. .upLoadSign-container {
  85. padding: 15px;
  86. .ulsc-signContent {
  87. margin-top: 10px;
  88. .ulsc-sc-operate {
  89. margin-top: 10px;
  90. display: flex;
  91. justify-content: flex-end;
  92. }
  93. }
  94. }
  95. </style>

注意:fetch 获取返回值还要写一个then里边使用tojson才行

fetch 获取返回值还要写一个then里边使用tojson才行

  1. fetch('https://api.example.com/data')
  2. // 这里要多加一个then才能获取到返回值
  3. .then(response => {
  4. if (response.ok) {
  5. return response.json(); // 转换为JSON
  6. }
  7. throw new Error('Network response was not ok.');
  8. })
  9. .then(data => console.log(data)) // 这里的data是通过JSON转换的对象
  10. .catch(error => console.error('There has been a problem with your fetch operation:', error)); // 捕获错误

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

vue3,vue组件,props给一个对象参数vue组件间传参数vue父组件给子组件传参数组件参数类型父组件调用子组件的方法vue组件事件监听,给子组件传递方法,子组件调用父组件方法

[TOC]组件可以使用props给组件传值,可以同时传递多个,可以是任意类型,比如字符串或者对象。 下面是个简单的例子: &lt...

vue3最基础的数据加载,表格table

vue3表格加载一点静态数据 &lt;template&gt; &lt;el-table :data=&quot;tableData&quot; style=&quot;width: 100%&quot...

vue3 Element Plus 表单输入框放到一行

当垂直方向空间受限且表单较简单时,可以在一行内放置表单。 通过设置 inline 属性为 true 可以让表单域变为行内的表单域...

vue3 Element ui Plus 表格 分页,vue3 el-pagination分页

其实就是el-pagination控件的使用而已 &lt;template&gt; &lt;div&gt; &lt;el-table :data=&quot;tableData&quot; ...

vue触发a标签的点击事件vue3 dom操作 触发点击事件 文件选择库只会触发一次change事件的问题

[TOC]vue触发a标签的点击事件直接操作dom节点的方式比较简单 &lt;button @click=&quot;handleBtnClick&quot;&gt;点击按钮&...

vue3 ref的使用多个ref的使用通过ref触发点击事件

多个ref获取的方法可以使用一样的,通过变量名来区分就行了 const vabUploadRef = ref() const multipleTableRef = ref() ...

vue elementui,vue3 element plus 文件上传的时候设置其他参数后台.net接收传递的额外参数图片上传

比如上传文件的时候额外传递两个select选择的值 前台前面上传文件的时候要提供默认参数很简单,el-upload绑定一个data即可...

vue,vue3 打开新页面,页面跳转vue跳转到一个新页面vue路由传参,vue3路由传参,vue3 获取路由参数

[TOC]VUE页面跳转本地页面跳转 goApplicationCenter() { //进行页面跳转 let path = &quot;/application-center&quo...

vuevue3组件封装,vue组件模板简单组件模板基础组件模板vue引入自定义的组件vue使用自定义的组件插槽slot使用vue封装格子效果,一块一块的grid布局效果

[TOC]vue封装组件的简单模板贴一个简单模板方便自定义组件的时候直接复制 &lt;template&gt; &lt;div class=&quot;app...

.net6 Signalr+vue3 的运用(上)

.net6 Signalr+Vue3 的运用(上)[TOC] 什么是 SignalR?ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加...

.net6 Signalr+vue3 的运用(下)

.net6 Signalr+Vue3 的运用(下)[TOC] 上篇链接:https://www.tnblog.net/hb/article/details/7961SignalR 中的用户 Sig...

.net6 Signalr+vue3 配合Ingress Nginx的运用

.net6 Signalr+Vue3 配合Ingress Nginx的运用[TOC] 结合上篇:https://www.tnblog.net/hb/article/details/7963 项目打...

vue3 Element Plus 表格使用vue3常用界面搭配vue3基础模板使用

一个简单的表格加时间搜索界面效果如下: 代码如下: &lt;template&gt; &lt;div class=&quot;app-container&quot;&g...

vue3 如何加prototypevue3使用globalProperties

在2.X版本中创建一个vue 实例是通过 new Vue()来实现的,到了3.X中则是通过使用createApp这个 API返回一个应用实例,并且可...
这一生多幸运赶上过你.
排名
8
文章
222
粉丝
7
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术