< template>
< view class = "signBox column-me" >
< ! -- 这个是自定义的title- 可根据自己封装的title的作为调整 -- >
< status- bar title= "电子签名" : bgColor= "null" > < / status- bar>
< view class = "topHint" > 请绘制清晰可辨的签名并保存< / view>
< canvas class = "canvas flex1" : canvas- id= "cid" : id= "cid" @touchstart= "touchstart" @touchmove= "touchmove"
@touchend= "touchend" : disable- scroll= "true" > < / canvas>
< view class = "btn margin-top10 margin-bottom10" >
< view class = "cancelBtn" @click= "reWrite" > 重写< / view>
< view class = "saveBtn margin-left30" @click= "save" > 保存< / view>
< / view>
< / view>
< / template>
< script>
export default {
components : { } ,
data ( ) {
return {
line : [ ] ,
radius : 0 ,
taskId : '' ,
dom : null ,
cid : 'canvas' ,
Strokes : [ ] ,
showCanvasDialog : false ,
canvasImg : '' ,
}
} ,
onLoad ( e ) {
this . taskId = e. taskId
} ,
computed : { } ,
mounted : function ( ) {
let that = this
this . initCanvas ( )
} ,
methods : {
initCanvas ( ) {
let that = this
this . $nextTick ( function ( ) {
this . dom = uni. createCanvasContext ( this . cid, this ) ;
var query = wx. createSelectorQuery ( ) ;
query. select ( '#canvas' ) . boundingClientRect ( ) ;
query. exec ( function ( res ) {
let widths = res[ 0 ] . width
let heights = res[ 0 ] . height
that. dom. rect ( 0 , 0 , widths, heights)
that. dom. setFillStyle ( '#FFFFFF' )
that. dom. fill ( )
that. dom. draw ( )
} )
} ) ;
} ,
touchstart ( e ) {
this . Strokes. push ( {
imageData : null ,
style : {
color : '#000000' ,
lineWidth : '3' ,
} ,
points : [ {
x : e. touches[ 0 ] . x,
y : e. touches[ 0 ] . y,
type : e. type,
} ]
} )
this . drawLine ( this . Strokes[ this . Strokes. length - 1 ] , e. type) ;
} ,
touchmove ( e ) {
this . Strokes[ this . Strokes. length - 1 ] . points. push ( {
x : e. touches[ 0 ] . x,
y : e. touches[ 0 ] . y,
type : e. type,
} )
this . drawLine ( this . Strokes[ this . Strokes. length - 1 ] , e. type) ;
} ,
touchend ( e ) {
if ( this . Strokes[ this . Strokes. length - 1 ] . points. length < 2 ) {
this . Strokes. pop ( ) ;
}
} ,
drawLine ( StrokesItem, type ) {
if ( StrokesItem. points. length > 1 ) {
this . dom. setLineCap ( 'round' )
this . dom. setStrokeStyle ( StrokesItem. style. color) ;
this . dom. setLineWidth ( StrokesItem. style. lineWidth) ;
this . dom. moveTo ( StrokesItem. points[ StrokesItem. points. length - 2 ] . x, StrokesItem. points[ StrokesItem
. points. length -
2 ] . y) ;
this . dom. lineTo ( StrokesItem. points[ StrokesItem. points. length - 1 ] . x, StrokesItem. points[ StrokesItem
. points. length -
1 ] . y) ;
this . dom. stroke ( ) ;
this . dom. draw ( true ) ;
}
} ,
reWrite ( ) {
this . Strokes = [ ] ;
this . dom. draw ( ) ;
this . initCanvas ( )
} ,
save ( ) {
let that = this
uni. canvasToTempFilePath ( {
canvasId : 'canvas' ,
fileType : 'png' ,
quality : 1 ,
success : function ( res ) {
let imgs = [ res. tempFilePath]
that. $. upload_img ( imgs, 0 , res => {
let imgUrl = res. data
let mediaUrl = that. $. get_data ( 'mediaUrl' )
if ( that. $. isEmpty ( mediaUrl) ) {
mediaUrl = ''
}
that. $. ajax ( "POST" , "/customer/user/checkTask" , {
taskId : that. taskId,
status : 1 ,
signImage : imgUrl,
userVideo : mediaUrl,
} , ( res ) => {
if ( res. code === 1000 ) {
that. $. ti_shi ( res. message)
setTimeout ( ( ) => {
uni. $emit ( 'signOk' )
that. $. back ( )
} , 1000 )
} else {
that. $. ti_shi ( res. message)
}
} ) ;
} )
} ,
fail ( e ) {
console. log ( e)
}
} )
}
}
}
< / script>
< style scoped lang= "less" >
. signBox {
position : relative;
overflow : hidden;
background- color: #F6F6F6 ;
height : 100vh;
width : 100vw;
. canvas {
width : 100 % ;
background : #FFFFFF ;
}
. topHint {
width : 100 % ;
height : 60rpx;
line- height: 60rpx;
font- size: 28rpx;
color : #6D7984;
text- align: center;
background : ;
}
. btn {
width : 100 % ;
height : 132rpx;
display : flex;
align- items: center;
justify- content: center;
. saveBtn {
width : 300rpx;
height : 88rpx;
line- height: 88rpx;
background : #215AA0;
border- radius: 20rpx;
text- align: center;
font- size: 32rpx;
color : #FFFFFF ;
}
. cancelBtn {
width : 298rpx;
height : 86rpx;
line- height: 86rpx;
background : #FFFFFF ;
border- radius: 20rpx;
text- align: center;
font- size: 32rpx;
color : #202233 ;
border : 1px solid #BBC4CC ;
}
}
}
< / style>