uniapp通过canvas画布,签名保存,并上传到数据库

参考博客:uniapp canvas实现手写签名并保存

HTML:

		<!-- 签名 -->
		<view class="container" >  
			<view class="content-box">
				<button class="button" @click="initCanvas" v-show="!showCanvas" size="mini" type="primary">点击签名</button>
				<view v-show='showCanvas'>
				    <canvas class='mycanvas' canvas-id="mycanvas" 
						@touchmove='move' @touchstart='start($event)' @touchend='end'
						@touchcancel='cancel' @longtap='tap' @error='error' disable-scroll='true'>
				    </canvas>
				    <view class="footer">
						<button class="right" @click="clearClick" size="mini" type="primary">清除</button>
						<button class="close" @click="close" size="mini" type="primary">关闭</button>
				    </view>
				</view>
			</view>
		</view>
		<!-- 提交按钮 -->
		<view style="margin-top:38upx;">
			<button type="primary" @click="submit">提交</button>
		</view>

script:

<script>
	import axios from 'axios';
	import utils from '../../common/utils.js';
	// 画布
	var content = null;
	var touchs = [];
	var canvasw = 0;
	var canvash = 0;
	var _that;
	// 获取系统信息
	uni.getSystemInfo({
	    success: function(res) {
	        canvasw = res.windowWidth;
	        canvash = res.windowHeight;
	        },
		});
	    export default {
			data() {
				return {
					bookList: [],	//告知书文本信息
					username: '',
					title:'',
					title_id:'',
					url_id:'',	//告知书id
					//填入的数据
					answers:[],
					answerInputItem:[],
					answerCheckItem:[],
					//画布
					showCanvas:false,
					signImage: '',
					isEnd: false ,// 是否签名
				}
			},
			onLoad() {
				// 获得Canvas的上下文
				content = wx.createCanvasContext('mycanvas')
				// 设置线的颜色
				content.setStrokeStyle("#000")
				// 设置线的宽度
				content.setLineWidth(5)
				// 设置线两端端点样式更加圆润
				content.setLineCap('round')
				// 设置两条线连接处更加圆润
				content.setLineJoin('round')
			},
			methods: {
				//点击“提交”按钮
				submit:function(){
					//提交签名
					var _this = this;
					if (this.isEnd) {
						uni.canvasToTempFilePath({
							canvasId: 'mycanvas',
							success: function(res) {
								// base64转blob
								var blob = _that.dataURItoBlob(res.tempFilePath);
								//提交签名
								const axios = require('axios');
								let data = new FormData();
								data.append('type',parseInt(_this.url_id)); 
								data.append('title',_this.title_id); 
								data.append('signature',res.tempFilePath); 
								data.append('id_card','444444202009090000'); 
								data.append('signature_time','2020-09-09 12:00:00'); 
								data.append('create_user',201621177059); 
								axios.post(utils.baseUrl + 'archive/SignatureView/',data).then(function(response) {
									if(response.data.code == 200){
										uni.showToast({
											title: '提交成功',
											duration: 1500,
											mask: true
										})
										// console.log('提交成功')
									}else{
										console.log(response.data)
										uni.showToast({
											title: '提交失败,请重试',
											icon: "none",
											duration: 1500,
											mask: true
										})
									}
								})	
								// 打印图片路径
								// console.log(res.tempFilePath) //base64
								console.log('完成签名')
								// 设置图片
								_that.signImage = res.tempFilePath
							}
						})
					} else {
						uni.showToast({
							title: '请先完成签名',
							icon: "none",
							duration: 1500,
							mask: true
						})
					}	
				},
				// base64 to blob二进制
			dataURItoBlob: function(dataURI){
				var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // mime类型
				var byteString = atob(dataURI.split(',')[1]); //base64 解码
				var arrayBuffer = new ArrayBuffer(byteString.length); //创建缓冲数组
				var intArray = new Uint8Array(arrayBuffer); //创建视图
				for (var i = 0; i < byteString.length; i++) {
					intArray[i] = byteString.charCodeAt(i);
				}
				return new Blob([intArray], {type: mimeString});
			},
			// blob二进制 to base64
			blobToDataURI: function(blob, callback){
				var reader = new FileReader();
				reader.onload = function (e) {
					callback(e.target.result);
				}
				reader.readAsDataURL(blob);
			},
			// 显示画布
			initCanvas:function() {
				this.showCanvas = true;
			},
			// 关闭画布
			close:function() {
				this.showCanvas = false;
				content.clearRect(0, 0, canvasw, canvash)
				content.draw(true)
			},
			
			// 画布的触摸移动开始手势响应
			start: function(event) {
				// console.log(event)
				// console.log("触摸开始" + event.changedTouches[0].x)
				// console.log("触摸开始" + event.changedTouches[0].y)
				// 获取触摸开始的 x,y
				let point = {
					x: event.changedTouches[0].x,
					y: event.changedTouches[0].y
				}
				// console.log(point)
				touchs.push(point);
			},
			// 画布的触摸移动手势响应
			move: function(e) {
				let point = {
					x: e.touches[0].x,
					y: e.touches[0].y
				}
				// console.log(point)
				touchs.push(point)
				if (touchs.length >= 2) {
					this.draw(touchs)
				}
			},
			// 画布的触摸移动结束手势响应
			end: function(e) {
				console.log("触摸结束" + e)
				// 设置为已经签名
				this.isEnd = true
				// 清空轨迹数组
				for (let i = 0; i < touchs.length; i++) {
					touchs.pop()
				}
			},	
			// 画布的触摸取消响应
			cancel: function(e) {
				console.log("触摸取消" + e)
			},
			// 画布的长按手势响应
			tap: function(e) {
				console.log("长按手势" + e)
			},
			error: function(e) {
				console.log("画布触摸错误" + e)
			},
			// 绘制
			draw: function(touchs) {
				// console.log(touchs[0],touchs[1])
				let point1 = touchs[0]
				let point2 = touchs[1]
				touchs.shift()
				content.moveTo(point1.x, point1.y)
				content.lineTo(point2.x, point2.y)
				content.stroke()
				content.draw(true)
			},
			// 清除操作
			clearClick: function() {
				// 设置为未签名
				this.isEnd = false
				// 清除画布
				content.clearRect(0, 0, canvasw, canvash)
				content.draw(true)
			},
		}
	})

style:

/* 画布 */
.button{
	display: table;
	background-color: #149615;
}
.mycanvas{
	box-shadow: inset 0 0 10px black;
	width: 100%;
	margin: 0.5rem 0;
}
.left{
	background-color: #14b50e;
}
.right{
	background-color: #da0606
}
.close{
	background-color: #447b73;
}
.footer{
	display: flex;
}
以下是一个简单的示例代码,实现了使用uniappcanvas组件实现手写签名效果,并提供了保存和清空的功能。 template: ```html <template> <view> <canvas canvas-id="myCanvas" style="width:100%;height:400rpx;background-color: #fff;" bindtouchstart="touchStart" bindtouchmove="touchMove" bindtouchend="touchEnd"></canvas> <view class="btn-group"> <button type="primary" class="btn" @tap="save">保存</button> <button type="default" class="btn" @tap="clear">清空</button> </view> </view> </template> ``` script: ```javascript <script> export default { data() { return { ctx: null, // canvas绘图上下文 lastX: 0, // 上一次触摸的X坐标 lastY: 0, // 上一次触摸的Y坐标 isDrawing: false // 是否正在绘制 } }, mounted() { // 获取canvas绘图上下文 this.ctx = uni.createCanvasContext('myCanvas', this); }, methods: { touchStart(e) { // 记录起始点坐标 this.lastX = e.changedTouches[0].x; this.lastY = e.changedTouches[0].y; // 开始绘制 this.isDrawing = true; }, touchMove(e) { if (this.isDrawing) { // 获取当前坐标 const currentX = e.changedTouches[0].x; const currentY = e.changedTouches[0].y; // 绘制线条 this.ctx.beginPath(); this.ctx.moveTo(this.lastX, this.lastY); this.ctx.lineTo(currentX, currentY); this.ctx.stroke(); // 更新上一次坐标 this.lastX = currentX; this.lastY = currentY; } }, touchEnd() { // 结束绘制 this.isDrawing = false; }, save() { // 保存签名 uni.canvasToTempFilePath({ canvasId: 'myCanvas', success: (res) => { uni.saveImageToPhotosAlbum({ filePath: res.tempFilePath, success: () => { uni.showToast({ title: '保存成功' }) } }) } }, this); }, clear() { // 清空画布 this.ctx.clearRect(0, 0, uni.upx2px(750), uni.upx2px(400)); this.ctx.draw(); } } } </script> ``` 需要注意的是,canvas组件的宽度和高度应该使用rpx或者upx作为单位,并且在保存签名时,需要先使用canvasToTempFilePath方法将canvas转换成临时文件路径,再使用saveImageToPhotosAlbum方法保存到相册中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值