更新记录

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

更新手写插件


平台兼容性

uni-app(3.6.17)

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

手写签名识别组件说明文档

一、组件概述

一个基于 uni-app + Vue3 组合式 API 开发的手写签名识别弹窗组件,支持手写绘制、画布操作(清除/撤销)、签名预览、手写内容 OCR 识别及识别状态管理等核心功能,可灵活集成到各类需要手写签名/手写内容识别的业务场景中。

二、核心功能

  1. 手写绘制:支持在画布上自由书写,可设置画笔颜色、粗细,触摸事件(开始/移动/结束)处理流畅;
  2. 画布操作:提供清除画布、撤销上一步书写的功能;
  3. 预览生成:自动将画布内容转为临时图片路径,支持预览展示;
  4. OCR 识别:支持手动/自动触发识别,内置超时控制,识别状态(识别中/成功/失败/超时)可视化;
  5. 交互控制:弹窗形式展示,支持确认/取消操作,识别结果校验(未识别/识别失败时禁止确认);
  6. 事件通信:通过自定义事件与父组件解耦,识别逻辑由父组件实现,组件仅负责触发和状态管理。

三、使用方式

1. 基础引入

<template>
  <view>
    <!-- 引入签名识别组件 -->
    <at-sign 
      ref="signRef"
      :auto-recognize="true"
      :recognition-timeout="15000"
      :is-ocr="true"
      @confirm="handleConfirm"
      @cancel="handleCancel"
      @recognize="handleRecognize"
      @recognizeStart="handleRecognizeStart"
      @recognizeComplete="handleRecognizeComplete"
    />

    <!-- 打开组件按钮 -->
    <button @tap="openSign">打开签名识别</button>
  </view>
</template>

<script setup>
import AtSign from '@/uni_modules/at-sign/components/at-sign.vue';
import { ref } from 'vue';

const signRef = ref(null);

// 打开签名弹窗
const openSign = () => {
  signRef.value.open();
};

// 确认签名回调
const handleConfirm = (result) => {
  console.log('签名确认:', result);
  // result 包含:imagePath(签名图片路径)、text(识别结果)、paths(书写路径数据)、timestamp(时间戳)
};

// 取消签名回调
const handleCancel = () => {
  console.log('签名取消');
};

// 触发识别回调(父组件实现具体识别逻辑)
const handleRecognize = async (imagePath, paths) => {
  try {
    // 调用OCR接口识别图片内容
    const res = await uni.request({
      url: '你的OCR识别接口',
      method: 'POST',
      data: { imagePath }
    });
    // 设置识别结果到组件
    signRef.value.setRecognitionResult({
      success: true,
      text: res.data.result // 识别出的文字
    });
  } catch (err) {
    // 识别失败
    signRef.value.setRecognitionResult({
      success: false,
      message: '识别失败:' + err.message
    });
  }
};

// 开始识别回调
const handleRecognizeStart = () => {
  console.log('开始识别');
};

// 识别完成回调
const handleRecognizeComplete = (data) => {
  console.log('识别完成:', data);
};
</script>

2. Props 配置项

参数名 类型 默认值 说明
autoRecognize Boolean false 书写完成后是否自动触发识别
recognitionTimeout Number 10000 识别超时时间(单位:ms),超时后自动终止识别并提示
isOcr Boolean false 是否开启OCR识别功能;开启后,确认时会校验识别结果(未识别/识别失败禁止确认)

3. 自定义事件

事件名 触发时机 回调参数 说明
confirm 点击“确定”按钮且校验通过 result: { imagePath, text, paths, timestamp } 确认签名,返回签名图片、识别结果、书写路径等信息
cancel 点击“取消”按钮或弹窗背景 - 取消签名,关闭弹窗并清空画布
recognize 点击“识别”按钮或自动触发识别 imagePath: 签名图片临时路径, paths: 书写路径数组 触发识别,父组件需监听此事件实现具体OCR逻辑
recognizeStart 开始识别时 - 识别流程启动的回调(仅状态通知)
recognizeComplete 识别完成(成功/失败/超时) { success: Boolean, text?: String, error?: String } 识别流程结束的回调,返回识别状态和结果/错误信息
update:recognitionResult 识别结果更新时 text: 识别出的文字 识别结果更新的双向绑定事件
update:recognitionFailed 识别失败状态更新时 failed: Boolean 识别失败状态的双向绑定事件

4. 暴露的方法(defineExpose)

方法名 参数 说明
open - 打开签名弹窗,初始化画布
close - 关闭签名弹窗,清空画布和识别状态
clearCanvas - 清空画布内容,重置识别状态
undo - 撤销上一步书写的内容
recognize - 手动触发识别(同点击“识别”按钮)
setRecognitionResult result: { success, text?, message? } 父组件调用,设置识别结果到组件;success为true时传text(识别文字),false时传message(失败原因)
getState - 获取当前组件状态:{ hasContent, pathCount, recognitionResult, recognitionFailed, isRecognizing, previewImage, paths }
getImageData - 异步返回当前画布的临时图片路径(无内容时返回null)

5. 状态变量(暴露)

变量名 类型 说明
isRecognizing Ref 是否正在识别中
recognitionResult Ref 当前识别结果(成功时为文字,失败时为空)
recognitionFailed Ref 是否识别失败

四、样式说明

组件内置基础样式,支持通过 scoped 样式覆盖,核心样式类说明: 类名 说明
.popup 弹窗外层容器(半透明背景)
.sign-area 签名内容区域(白色背景)
.draw-area 画布容器(可调整height修改画布大小)
.operate-area 操作按钮区域(清除/撤销/识别按钮)
.recognize-btn 识别按钮(默认绿色,识别中为灰色不可点击)
.recognition-area 识别结果展示区域
.recognition-status.has-result 识别成功的文字样式(绿色)
.recognition-status.failed 识别失败的文字样式(红色)
.sign-btn-area 底部确认/取消按钮区域

五、注意事项

  1. 画布初始化:组件打开时通过 uni.createSelectorQuery 获取画布节点,需确保弹窗 visible 为 true 后再初始化(组件已通过 nextTick 处理);
  2. 图片生成:uni.canvasToTempFilePath 生成的临时路径仅在当前会话有效,如需持久化需上传至服务器;
  3. 识别逻辑:组件仅触发识别事件,不包含具体OCR识别实现,需父组件对接第三方OCR接口(如阿里云OCR、腾讯云OCR等);
  4. 跨端兼容:基于 uni-app 开发,兼容微信小程序、App、H5 等端,但需注意不同端 canvas 接口的细微差异(组件已做基础兼容);
  5. 性能优化:书写路径过多时,重绘画布可能存在性能问题,可根据业务限制最大书写步数。

总结

  1. 该组件是一个高可复用的手写签名识别弹窗,核心能力为手写绘制、画布管理和识别状态管控,识别逻辑解耦给父组件实现,灵活性高;
  2. 使用时需通过 ref 调用 open() 打开弹窗,监听 recognize 事件实现OCR接口对接,通过 setRecognitionResult 回传识别结果;
  3. 关键配置项 isOcr 控制是否开启识别校验,autoRecognize 控制是否自动识别,可根据业务场景灵活调整。

隐私、权限声明

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

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

插件不采集任何数据

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

许可协议

MIT协议