更新记录

1.0.0(2026-02-02) 下载此版本

Features

  • 初始版本发布
  • 支持手写签名功能
  • 支持自定义画笔颜色和粗细
  • 支持水印功能(可自定义水印文本)
  • 支持自动上传功能
  • 支持自定义工具栏
  • 兼容 H5、App、微信小程序、支付宝小程序等多端平台
  • 提供完整的事件回调和方法调用

平台兼容性

uni-app(4.84)

Vue2 Vue2插件版本 Vue3 Vue3插件版本 Chrome Chrome插件版本 Safari Safari插件版本 app-vue app-vue插件版本 app-nvue Android Android插件版本 iOS 鸿蒙
1.0.0 1.0.0 1.0.0 1.0.0 1.0.0 - 1.0.0 - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - -

其他

多语言 暗黑模式 宽屏模式
× ×

mt-signature 手写签名组件

uni-app 手写签名组件,支持多平台(H5、App、小程序),提供丰富的功能和高度的可定制性。

功能特性

  • ✅ 多平台支持(H5、App、微信小程序、支付宝小程序等)
  • ✅ 手写签名绘制(触摸/鼠标)
  • ✅ 平滑笔迹(贝塞尔曲线)
  • ✅ 撤销功能
  • ✅ 防误触(最小笔画长度)
  • ✅ 自定义工具栏位置(顶部/底部/左侧/右侧)
  • ✅ 水印支持(自动生成用户名+时间)
  • ✅ 水印自适应横竖屏
  • ✅ 自定义水印样式(颜色、大小、旋转角度)
  • ✅ 自动上传
  • ✅ 插槽支持(自定义工具栏)
  • ✅ 丰富的事件回调

安装

mt-signature 文件夹复制到项目的 uni_modules 目录下。

基础用法

<template>
  <view class="page">
    <mt-signature 
      @confirm="handleConfirm"
      @cancel="handleCancel"
    />
  </view>
</template>

<script>
export default {
  methods: {
    handleConfirm(result) {
      console.log('签名完成', result.tempFilePath);
    },
    handleCancel() {
      console.log('取消签名');
    }
  }
}
</script>

<style>
.page {
  width: 100vw;
  height: 100vh;
}
</style>

Props 属性

画布配置

参数 类型 默认值 说明
width String/Number '100%' 画布宽度
height String/Number '400rpx' 画布高度
backgroundColor String '#ffffff' 画布背景色
penColor String '#000000' 画笔颜色
penWidth Number 3 画笔粗细
placeholder String '请在此区域签字' 占位提示文字
disabled Boolean false 是否禁用
disableScroll Boolean true 是否禁用滚动

笔迹优化

参数 类型 默认值 说明
smoothStroke Boolean false 是否平滑笔迹(使用贝塞尔曲线)
minStrokeLength Number 0 最小笔画长度,小于此长度的笔画不计入(防误触)
maxUndoSteps Number 0 撤销步数,0表示不支持撤销

工具栏配置

参数 类型 默认值 说明
showToolbar Boolean true 是否显示工具栏
toolbarPosition String 'top' 工具栏位置:top/bottom/left/right
showCancelBtn Boolean true 是否显示取消按钮
showClearBtn Boolean true 是否显示清屏按钮
showConfirmBtn Boolean true 是否显示确认按钮
cancelText String '取消' 取消按钮文字
clearText String '清屏' 清屏按钮文字
confirmText String '确认' 确认按钮文字

水印配置

参数 类型 默认值 说明
showWatermark Boolean false 是否显示水印
watermark String '' 水印文本(不传则自动生成:用户名+时间)
watermarkRows Number 0 水印行数(0表示自动计算)
watermarkCols Number 0 水印列数(0表示自动计算)
watermarkColor String 'rgba(102, 102, 102, 0.5)' 水印颜色
watermarkFontSize Number 20 水印字体大小
watermarkRotate Number -45 水印旋转角度(度数)

导出配置

参数 类型 默认值 说明
fileType String 'png' 导出图片格式
quality Number 1 导出图片质量(0-1)

上传配置

参数 类型 默认值 说明
autoUpload Boolean false 是否自动上传
uploadUrl String '' 上传接口地址
uploadName String 'file' 上传文件字段名
uploadHeader Object {} 上传请求头
uploadFormData Object {} 上传额外参数

Events 事件

事件名 说明 回调参数
ready 画布初始化完成 -
start 开始绘制 { x, y }
drawing 绘制中 { x, y }
end 结束绘制 -
clear 清屏 -
undo 撤销 { stepsRemaining }
cancel 取消 -
beforeConfirm 确认前 -
confirm 确认 { tempFilePath, canvasWidth, canvasHeight, uploadResult }
success 成功 { tempFilePath, canvasWidth, canvasHeight, uploadResult }
error 错误 { type, message }

Methods 方法

通过 ref 调用组件方法:

<mt-signature ref="signature" />
方法名 说明 参数
clear() 清空画布 -
undo() 撤销上一步 -
isEmpty() 判断是否为空 -

Slots 插槽

插槽名 说明
toolbar-left 工具栏左侧内容
toolbar-center 工具栏中间内容
toolbar-right 工具栏右侧内容

使用示例

1. 基础签名

<mt-signature 
  height="500rpx"
  @confirm="handleConfirm"
/>

2. 带水印签名

<mt-signature 
  :show-watermark="true"
  watermark="张三 | 2024-01-01 12:00:00"
  @confirm="handleConfirm"
/>

3. 自动上传

<mt-signature 
  :auto-upload="true"
  upload-url="https://api.example.com/upload"
  :upload-header="{ Authorization: 'Bearer token' }"
  @success="handleSuccess"
/>

4. 平滑笔迹 + 撤销功能

<template>
  <view class="page">
    <mt-signature 
      ref="signature"
      :smooth-stroke="true"
      :max-undo-steps="10"
      :show-confirm-btn="false"
    >
      <template #toolbar-right>
        <button @click="handleUndo">撤销</button>
        <button @click="handleClear">清空</button>
        <button @click="handleConfirm">确认</button>
      </template>
    </mt-signature>
  </view>
</template>

<script>
export default {
  methods: {
    handleUndo() {
      this.$refs.signature.undo();
    },
    handleClear() {
      this.$refs.signature.clear();
    },
    handleConfirm() {
      // 手动触发确认逻辑
    }
  }
}
</script>

5. 防误触

<mt-signature 
  :min-stroke-length="10"
  @confirm="handleConfirm"
/>

6. 自定义工具栏位置

<!-- 底部工具栏 -->
<mt-signature toolbar-position="bottom" />

<!-- 左侧工具栏 -->
<mt-signature toolbar-position="left" />

<!-- 右侧工具栏 -->
<mt-signature toolbar-position="right" />

7. 自定义水印样式

<mt-signature 
  :show-watermark="true"
  watermark-color="rgba(255, 0, 0, 0.3)"
  :watermark-font-size="24"
  :watermark-rotate="-30"
  @confirm="handleConfirm"
/>

8. 完整示例

<template>
  <view class="signature-page">
    <mt-signature 
      ref="signature"
      height="100%"
      pen-color="#1890ff"
      :pen-width="4"
      :smooth-stroke="true"
      :max-undo-steps="10"
      :min-stroke-length="5"
      :show-watermark="true"
      toolbar-position="bottom"
      :auto-upload="true"
      upload-url="https://api.example.com/upload"
      :upload-header="uploadHeader"
      @ready="handleReady"
      @confirm="handleConfirm"
      @error="handleError"
    >
      <template #toolbar-center>
        <button @click="handleUndo" :disabled="!canUndo">撤销</button>
      </template>
    </mt-signature>
  </view>
</template>

<script>
export default {
  data() {
    return {
      canUndo: false,
      uploadHeader: {
        Authorization: 'Bearer ' + uni.getStorageSync('token')
      }
    };
  },
  methods: {
    handleReady() {
      console.log('画布已就绪');
    },
    handleUndo() {
      this.$refs.signature.undo();
    },
    handleConfirm(result) {
      console.log('签名完成', result);
      if (result.uploadResult) {
        console.log('上传成功', result.uploadResult);
      }
    },
    handleError(error) {
      console.error('错误', error);
      uni.showToast({
        title: error.message,
        icon: 'none'
      });
    }
  }
};
</script>

<style>
.signature-page {
  width: 100vw;
  height: 100vh;
}
</style>

兼容性

平台支持

平台 基础绘制 水印 上传 撤销 平滑笔迹 说明
H5 完全支持,支持鼠标绘制
App 完全支持
微信小程序 ⚠️ 撤销功能可能有性能问题
支付宝小程序 ⚠️ 撤销功能可能有性能问题
百度小程序 ⚠️ 撤销功能可能有性能问题
字节小程序 ⚠️ 撤销功能可能有性能问题
QQ小程序 ⚠️ 撤销功能可能有性能问题

Vue 版本支持

  • Vue 2.x: ✅ 完全支持
  • Vue 3.x: ✅ 完全支持(已适配生命周期)

功能兼容性说明

1. 基础绘制功能

  • 所有平台均支持
  • H5 平台额外支持鼠标绘制

2. 水印功能

  • 所有平台均支持
  • 水印会自动根据横竖屏调整密度
  • 支持自定义水印样式(颜色、大小、旋转角度)

3. 撤销功能

  • H5 和 App 平台完全支持
  • 小程序平台支持但有限制:
    • 每次撤销需要重新绘制图片,可能有性能开销
    • 建议设置较小的 maxUndoSteps(如 3-5 步)
    • 频繁撤销可能导致卡顿

4. 平滑笔迹

  • 所有平台均支持
  • 使用二次贝塞尔曲线实现
  • 移动端可能有轻微性能影响,建议根据实际情况开启

5. 自动上传

  • 所有平台均支持
  • 需要配置 uploadUrl
  • 小程序需要在后台配置合法域名

注意事项

通用注意事项

  1. 组件尺寸:组件需要明确的宽高才能正常工作
  2. 水印自适应:水印会自动根据横竖屏调整密度
  3. 性能优化
    • 撤销功能会占用内存,建议设置合理的 maxUndoSteps
    • 平滑笔迹会略微增加性能开销,移动端建议谨慎使用
  4. 上传配置:自动上传需要配置 uploadUrl

小程序特殊注意事项

  1. 撤销功能限制

    • 小程序的撤销功能基于 canvasToTempFilePathdrawImage
    • 频繁撤销可能导致性能问题
    • 建议 maxUndoSteps 不超过 5
  2. 上传域名配置

    • 需要在小程序后台配置 uploadUrl 为合法域名
    • 开发时可以在开发者工具中勾选"不校验合法域名"
  3. Canvas 限制

    • 部分小程序对 canvas 尺寸有限制
    • 建议画布尺寸不要过大(宽高不超过 4096px)

H5 特殊说明

  1. 鼠标支持:H5 平台同时支持触摸和鼠标绘制
  2. 跨域问题:如果使用水印功能,确保图片资源不跨域

Vue 版本兼容

组件同时支持 Vue 2 和 Vue 3:

  • 使用 beforeDestroy(Vue 2)和 beforeUnmount(Vue 3)双生命周期
  • 避免使用 Vue 3 专有 API
  • canvasId 生成使用时间戳而非 _uid

测试建议

建议在以下环境进行测试:

  1. H5 浏览器:Chrome、Safari、Firefox
  2. 微信小程序:真机测试(开发者工具可能表现不一致)
  3. App:iOS 和 Android 真机测试
  4. 其他小程序:根据目标平台进行真机测试

已知问题

  1. 小程序撤销性能:小程序平台的撤销功能可能有性能问题,建议限制撤销步数
  2. 部分小程序水印字体:某些小程序平台可能不支持自定义字体,会使用系统默认字体

更新日志

v1.0.0

  • 初始版本发布
  • 支持基础签名功能
  • 支持水印
  • 支持自动上传
  • 支持平滑笔迹
  • 支持撤销功能
  • 支持防误触
  • 支持自定义工具栏位置 签名组件

一个功能完善、兼容多端的手写签名组件,支持水印、自动上传等功能。

平台兼容性

Vue2 Vue3 H5 App 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序

安装

方式一:通过 uni_modules 安装(推荐)

在 HBuilderX 中右键 uni_modules 目录,选择 从插件市场导入插件,搜索 mt-signature 安装。

方式二:手动导入

mt-signature 文件夹复制到项目的 uni_modules 目录下。

基础用法

<template>
  <view>
    <mt-signature
      @confirm="onConfirm"
      @cancel="onCancel"
    />
  </view>
</template>

<script>
export default {
  methods: {
    onConfirm(result) {
      console.log('签名完成', result.tempFilePath);
    },
    onCancel() {
      console.log('取消签名');
    }
  }
}
</script>

带水印

<template>
  <mt-signature
    :show-watermark="true"
    watermark="张三 | 2024-01-30 10:30:00"
    @confirm="onConfirm"
  />
</template>

自动上传

<template>
  <mt-signature
    :auto-upload="true"
    upload-url="https://your-api.com/upload"
    :upload-header="{ Authorization: 'Bearer token' }"
    @confirm="onConfirm"
  />
</template>

<script>
export default {
  methods: {
    onConfirm(result) {
      console.log('上传结果', result.uploadResult);
    }
  }
}
</script>

自定义样式

<template>
  <mt-signature
    width="100%"
    height="500rpx"
    background-color="#f5f5f5"
    pen-color="#ff0000"
    :pen-width="5"
    placeholder="请在此处签名"
  />
</template>

自定义工具栏

<template>
  <mt-signature>
    <template #toolbar-left>
      <button @click="handleBack">返回</button>
    </template>
    <template #toolbar-center>
      <text>请签名</text>
    </template>
    <template #toolbar-right>
      <button @click="handleSave">保存</button>
    </template>
  </mt-signature>
</template>

Props

参数 说明 类型 默认值
width 画布宽度 String/Number 100%
height 画布高度 String/Number 400rpx
backgroundColor 画布背景色 String #ffffff
penColor 画笔颜色 String #000000
penWidth 画笔粗细 Number 3
showToolbar 是否显示工具栏 Boolean true
showCancelBtn 是否显示取消按钮 Boolean true
showClearBtn 是否显示清屏按钮 Boolean true
showConfirmBtn 是否显示确认按钮 Boolean true
cancelText 取消按钮文字 String 取消
clearText 清屏按钮文字 String 清屏
confirmText 确认按钮文字 String 确认
placeholder 占位提示文字 String 请在此区域签字
disabled 是否禁用 Boolean false
disableScroll 是否禁用滚动 Boolean true
showWatermark 是否显示水印 Boolean false
watermark 水印文本 String -
watermarkRows 水印行数 Number 12
watermarkCols 水印列数 Number 6
fileType 导出图片格式 String png
quality 导出图片质量(0-1) Number 1
autoUpload 是否自动上传 Boolean false
uploadUrl 上传接口地址 String -
uploadName 上传文件字段名 String file
uploadHeader 上传请求头 Object {}
uploadFormData 上传额外参数 Object {}

Events

事件名 说明 回调参数
ready 画布初始化完成 -
start 开始签字 { x, y }
drawing 签字中 { x, y }
end 结束签字 -
clear 清屏 -
cancel 取消 -
beforeConfirm 确认前 -
confirm 确认签字 { tempFilePath, canvasWidth, canvasHeight, uploadResult }
success 操作成功 result
error 操作失败 { type, message }

Slots

插槽名 说明
toolbar-left 工具栏左侧内容
toolbar-center 工具栏中间内容
toolbar-right 工具栏右侧内容

Methods

通过 ref 调用组件方法:

<template>
  <mt-signature ref="signature" />
</template>

<script>
export default {
  methods: {
    // 清空签名
    clearSignature() {
      this.$refs.signature.clear();
    },
    // 判断是否为空
    checkEmpty() {
      const isEmpty = this.$refs.signature.isEmpty();
      console.log('是否为空', isEmpty);
    }
  }
}
</script>
方法名 说明 参数 返回值
clear 清空签名 - -
isEmpty 判断是否为空 - Boolean

注意事项

  1. 小程序平台:需要在 manifest.json 中配置 canvas 权限
  2. H5平台:建议在移动端使用,PC端可能存在兼容性问题
  3. App平台:如需横屏显示,请在页面中单独处理屏幕方向
  4. 水印功能:水印仅在导出图片时添加,不影响签字体验
  5. 上传功能:需要配置正确的上传接口和请求头

完整示例

参考 pages/signature/index.vue 页面的实现。

更新日志

1.0.0 (2024-01-30)

  • 初始版本发布
  • 支持基础签名功能
  • 支持水印功能
  • 支持自动上传
  • 兼容多端平台

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。