<template>
<div class="g-nickname">
<my-header title="设置签名"></my-header>
<div class="setting-form mt10" style="margin-bottom: 68px;">
<div class="form-list">
<div class="flex mt30" style="text-align: center;color:red;font-size: 12px;margin: 20px 0px;">
请在下面红色框内手写签名
</div>
<div class="flex" style="text-align: center;">
<sign-canvas class="sign-canvas" ref="SignCanvas" :options="options" v-model="signImg"/>
</div>
<div class="flex" style="text-align: center;">
<img v-if="!signImg&&imageUrl" class="view-image" :src="imageUrl" width="150">
<img v-if="signImg" class="view-image" :src="signImg" width="150">
<a class="login-btn btn-gray" @click="canvasClear()" v-if="signImg" style="width: 90px;font-size: 12px;">重新签署</a>
</div>
<div class="flex mt30" style="text-align: center;font-size: 12px;margin-top: 20px;line-height:32px;">
<p style="color:red;">注:签名设计完成后,后续协议将自动根据签名进行签署</p>
<p><input type="checkbox" id="checkbox" v-model="isCheck" :disabled="isCheckDis" />
请确定并了解
<a class="font-size14 font-blue" @click="proShow()">《用户须知协议指引》</a>
</p>
</div>
</div>
<a class="login-btn btn-blue" @click="uploadSign()">保存签名</a>
</div>
<div v-transfer-dom>
<x-dialog v-model="showProtocol" class="dialog-Protocol">
<div class="protocolContent">
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="注册协议" name="first" v-html="protocolContent">注册协议</el-tab-pane>
<el-tab-pane label="买跌委托投资协议" name="second" v-html="protocolContent1">-</el-tab-pane>
<el-tab-pane label="买涨委托投资协议" name="third" v-html="protocolContent2">-</el-tab-pane>
</el-tabs>
</div>
<a class="register-btn btn-gray mt10 mb10" v-show="isDisabled">{{buttonName}}</a>
<a class="register-btn btn-blue mt10 mb10" @click="closeProtocol" v-show="isDisabled==false">{{buttonName}}</a>
</x-dialog>
</div>
</div>
</template>
<script>
import Vue from "vue";
import SignCanvas from 'sign-canvas';
import {upload,UpdateSign} from '@/assets/js/axios-api/UserAssets.js';
import { GetAgreeMent } from "@/assets/js/axios-api/ArticalShows.js";
Vue.use(SignCanvas);
export default {
data() {
return {
showProtocol:false,
isDisabled:false,
second:10,
isCheck:false,
isCheckDis:true,
buttonName:'',
activeName:'',
protocolContent:'',
protocolContent1:'',
protocolContent2:'',
callIndex:'',
callCount1:0,
callCount2:0,
callCount3:0,
nickName: '',
signImg:'',
signImgMin:'',
imageUrl:'',
options:{
lastWriteSpeed: 1, //书写速度 [Number] 可选
lastWriteWidth: 1, //下笔的宽度 [Number] 可选
lineCap: 'round', //线条的边缘类型 [butt]平直的边缘 [round]圆形线帽 [square] 正方形线帽
lineJoin: 'round', //线条交汇时边角的类型 [bevel]创建斜角 [round]创建圆角 [miter]创建尖角。
canvasWidth: 360, //canvas宽高 [Number] 可选
canvasHeight: 180, //高度 [Number] 可选
isShowBorder: false, //是否显示边框 [可选]
bgColor: '#fcc', //背景色 [String] 可选 注:这背景色仅仅只是canvas背景,保存的图片仍然是透明的
borderWidth: 1, // 网格线宽度 [Number] 可选
borderColor: "#ff787f", //网格颜色 [String] 可选
writeWidth: 2, //基础轨迹宽度 [Number] 可选
maxWriteWidth: 5, // 写字模式最大线宽 [Number] 可选
minWriteWidth: 5, // 写字模式最小线宽 [Number] 可选
writeColor: '#101010', // 轨迹颜色 [String] 可选
isSign: false, //签名模式 [Boolean] 默认为非签名模式,有线框, 当设置为true的时候没有任何线框
imgType:'png' //下载的图片格式 [String] 可选为 jpeg canvas本是透明背景的
}
};
},
components: {},
mounted() {
this.imageUrl=this.$store.getters.getUserInfo.signPath;
if (this.$store.getters.getUserInfo.nameTrue != 2) {
this.$vux.alert.show({title: "提示",content: "您还未实名认证,请先实名认证",
onHide() {this.$router.push("/personal/personalSet/realName");}
});
}
},
methods: {
//自己定义data哈
getCode(){
let that = this;
that.isDisabled = true;
let interval = setInterval(function() {
that.buttonName = "请至少阅读" + that.second + "秒";
--that.second;
if (that.second < 0) {
that.buttonName = "确认";
that.second = 10;
that.isDisabled = false;
clearInterval(interval);
}
}, 1000);
},
handleClick(tab, event) {
//console.log(this.activeName+"***************"+tab.name+tab.key);
},
proShow(){
this.activeName="first";
this.lookProtocol('regpact');
this.lookProtocol('tandzero');
this.lookProtocol('tandd');
this.getCode();
},
//查看协议
lookProtocol(call) {
let parameters = {
"{moneyBorrow}": "",
};
this.callIndex=call;
this.$vux.loading.show();
GetAgreeMent(call, this.$store.getters.getUserInfo.id,parameters).then(
res => {
//console.log(res);
if(call=="regpact")
{
this.protocolContent = res.Data.content;
}
if(call=="tandzero")
{
this.protocolContent1 = res.Data.content;
}
if(call=="tandd")
{
this.protocolContent2 = res.Data.content;
}
this.showProtocol = true;
this.$vux.loading.hide();
}
);
},
closeProtocol(){
switch(this.callIndex)
{
case 'tandd':
this.callCount1=1;
break;
case 'tandzero':
this.callCount2=1;
break;
case 'regpact':
this.callCount3=1;
break;
}
this.callCount1=1;
this.callCount2=1;
this.callCount3=1;
if(this.callCount1==1&&this.callCount1==1&&this.callCount3==1)
{
this.isCheck=true;
this.isCheckDis=false;
}
this.showProtocol = false;
},
/**
* 清除画板
*/
canvasClear(){
this.$refs.SignCanvas.canvasClear();
},
/**
* 保存图片
*/
saveAsImg(){
const img = this.$refs.SignCanvas.saveAsImg();
alert(`image 的base64:${img}`);
},
/**
* 下载图片
*/
downloadSignImg(){
this.$refs.SignCanvas.downloadSignImg();
},
base64ToFile(urlData, fileName) {
let arr = urlData.split(",");
let mime = arr[0].match(/:(.*?);/)[1];
let suffix = mime.split("/")[1];
let bstr = atob(arr[1]);
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], `${fileName}.${suffix}`, {
type: mime
});
},
uploadSign(){
if (!this.signImg) {
this.$vux.toast.show({type: 'cancel',text: '请先设计签名',time: 1000,width: '60%'});
return;
}
if (this.isCheck == false) {
this.$vux.toast.show({type: 'cancel',text: '请阅读并了解协议至少10秒以上',time: 3000,width: '80%'});
return;
}
this.$vux.confirm.show({
content: "签名设计完成后,后续协议将自动根据签名进行签署,您确定要继续吗?",
confirmText: "确认",
cancelText: "取消",
onConfirm: () => {
this.compressImg(this.signImg);
console.log(this.signImgMin);
}
});
},
compressImg(sourceImgObj, quality, angleOffset, outputFormat) {
let _this = this;
quality = quality || 1;
angleOffset = angleOffset || 0;
var mimeType = outputFormat || "image/png";
var Img = new Image(), dataURL = "";
console.log(sourceImgObj);
Img.src = sourceImgObj;
Img.onload = function() {
//var drawWidth = Img.naturalWidth,drawHeight = Img.naturalHeight;
var drawWidth = 100,drawHeight = 50;
// IOS 设备上 canvas 宽或高如果大于 1024,就有可能导致应用崩溃闪退
// 因此这里需要缩放
var maxSide = Math.max(drawWidth, drawHeight);
if (maxSide > 256) {
var minSide = Math.min(drawWidth, drawHeight);
minSide = (minSide / maxSide) * 256;
maxSide = 256;
if (drawWidth > drawHeight) {
drawWidth = maxSide;
drawHeight = minSide;
} else {
drawWidth = minSide;
drawHeight = maxSide;
}
}
var cvs = document.createElement("canvas");
var ctx = cvs.getContext("2d");
if (angleOffset) {
cvs.width = drawHeight;
cvs.height = drawWidth;
ctx.translate(drawHeight, 0);
ctx.rotate((angleOffset * Math.PI) / 180);
} else {
cvs.width = drawWidth;
cvs.height = drawHeight;
}
ctx.drawImage(Img, 0, 0, drawWidth, drawHeight);
var newImageData = cvs.toDataURL(mimeType, quality || 1);
console.log(newImageData);
var file=_this.base64ToFile(newImageData,"签名");
upload(file).then(res => {
console.log(res);
if (res.Result === 0) {
_this.imageUrl=res.Data.url;
_this.$vux.loading.show();
UpdateSign(_this.imageUrl).then(res => {
_this.$vux.loading.hide();
if (res.Result == 0) {
_this.$vux.toast.show({type: 'ok',text: '签名保存成功',time: 1000,width: '60%'});
_this.$router.push('/personal/personalSet/sign');
} else {
_this.showCancel(res.Message)
}
});
} else {
_this.$message({message: res.Message, type: 'error'});
}
});
};
}
}
}
</script>
<style lang="less">
.dialog-Protocol {
.weui-dialog
{
max-width: 96%;
width: 90%;
}
.protocolContent {
padding: 10px;
width: 100%;
height:420px;
overflow-y: scroll;
text-align: left;
}
}
.g-nickname {
font-size: 16px;
.setting-form {
background: #fff;
padding: 0 10px;
.form-list {
li {
height: 40px;
line-height: 40px;
border-bottom: 0;
text-align: center;
.input {
border: 0;
height: 30px;
line-height: 30px;
width: 100%;
text-align: center;
}
}
.tips {
border-top: 2px solid #ececec;/*no*/
}
}
}
}
</style>