<section class="signature"> <div class="signatureBox"> <div class="canvasBox" ref="canvasHW"> <canvas ref="canvasF" @touchstart='touchStart' @touchmove='touchMove' @touchend='touchEnd' @mousedown="mouseDown" @mousemove="mouseMove" @mouseup="mouseUp" > </canvas> <div class="btnBox"> <div @click="overwrite">重写</div> <div @click="commit">提交签名</div> </div> </div> </div> <img class="imgCanvas" :src="imgUrl"> </section>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | <script> export default { data() { return { stageInfo: '' , imgUrl: '' , client: {}, points: [], canvasTxt: null , startX: 0, startY: 0, moveY: 0, moveX: 0, endY: 0, endX: 0, w: null , h: null , isDown: false , // isViewAutograph: this.$route.query.isViews > 0, // contractSuccess: this.$route.query.contractSuccess } }, mounted() { let canvas = this .$refs.canvasF canvas.height = this .$refs.canvasHW.offsetHeight - 500 canvas.width = this .$refs.canvasHW.offsetWidth - 50 this .canvasTxt = canvas.getContext( '2d' ) this .stageInfo = canvas.getBoundingClientRect() }, methods: { //mobile touchStart(ev) { ev = ev || event ev.preventDefault() if (ev.touches.length == 1) { let obj = { x: ev.targetTouches[0].clientX, y: ev.targetTouches[0].clientY, } this .startX = obj.x this .startY = obj.y this .canvasTxt.beginPath() this .canvasTxt.moveTo( this .startX, this .startY) this .canvasTxt.lineTo(obj.x, obj.y) this .canvasTxt.stroke() this .canvasTxt.closePath() this .points.push(obj) } }, touchMove(ev) { ev = ev || event ev.preventDefault() if (ev.touches.length == 1) { let obj = { x: ev.targetTouches[0].clientX - this .stageInfo.left, y: ev.targetTouches[0].clientY - this .stageInfo.top } this .moveY = obj.y this .moveX = obj.x this .canvasTxt.beginPath() // strokeStyle = 'blue'; this .canvasTxt.moveTo( this .startX, this .startY) this .canvasTxt.lineTo(obj.x, obj.y) this .canvasTxt.stroke() this .canvasTxt.closePath() this .startY = obj.y this .startX = obj.x this .points.push(obj) } }, touchEnd(ev) { ev = ev || event ev.preventDefault() if (ev.touches.length == 1) { let obj = { x: ev.targetTouches[0].clientX - this .stageInfo.left, y: ev.targetTouches[0].clientY - this .stageInfo.top } this .canvasTxt.beginPath() this .canvasTxt.moveTo( this .startX, this .startY) this .canvasTxt.lineTo(obj.x, obj.y) this .canvasTxt.stroke() this .canvasTxt.closePath() this .points.push(obj) } }, //pc mouseDown(ev) { ev = ev || event ev.preventDefault() if (1) { let obj = { x: ev.offsetX, y: ev.offsetY } this .startX = obj.x this .startY = obj.y this .canvasTxt.beginPath() this .canvasTxt.moveTo( this .startX, this .startY) this .canvasTxt.lineTo(obj.x, obj.y) this .canvasTxt.stroke() this .canvasTxt.closePath() this .points.push(obj) this .isDown = true } }, mouseMove(ev) { ev = ev || event ev.preventDefault() if ( this .isDown) { let obj = { x: ev.offsetX, y: ev.offsetY } this .moveY = obj.y this .moveX = obj.x this .canvasTxt.beginPath() this .canvasTxt.moveTo( this .startX, this .startY) this .canvasTxt.lineTo(obj.x, obj.y) this .canvasTxt.stroke() this .canvasTxt.closePath() this .startY = obj.y this .startX = obj.x this .points.push(obj) } }, mouseUp(ev) { ev = ev || event ev.preventDefault() if (1) { let obj = { x: ev.offsetX, y: ev.offsetY } this .canvasTxt.beginPath() this .canvasTxt.moveTo( this .startX, this .startY) this .canvasTxt.lineTo(obj.x, obj.y) this .canvasTxt.stroke() this .canvasTxt.closePath() this .points.push(obj) this .points.push({x: -1, y: -1}) this .isDown = false } }, //重写 overwrite() { this .canvasTxt.clearRect(0, 0, this .$refs.canvasF.width, this .$refs.canvasF.height) this .points = [] }, //提交签名 commit() { this .imgUrl= this .$refs.canvasF.toDataURL(); console.log( this .$refs.canvasF.toDataURL()) //签名img回传后台 } } } </script> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <style scoped> .signatureBox { width : 100% ; height : calc( 100% - 50px ); box-sizing: border-box; overflow : hidden ; background : #fff ; z-index : 100 ; display : flex; flex- direction : column; } .canvasBox { box-sizing: border-box; flex: 1 ; } canvas { border : 1px solid #7d7d7d ; } .btnBox { padding : 10px ; text-align : center ; } .btnBox button:first-of-type { background : transparent ; border-radius: 4px ; height : 40px ; width : 80px ; font-size : 14px ; } .btnBox button:last-of-type { background : #71b900 ; color : #fff ; border-radius: 4px ; height : 40px ; width : 80px ; font-size : 14px ; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· 工良出品 | 长文讲解 MCP 和案例实战
· 一天 Star 破万的开源项目「GitHub 热点速览」
· 多年后再做Web开发,AI帮大忙
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 别再堆文档了,大模型时代知识库应该这样建