@@ -31,7 +31,8 @@ | |||
"vue": "^2.5.2", | |||
"vue-baidu-map": "^0.21.22", | |||
"vue-cookies": "^1.7.4", | |||
"vue-esign": "^1.0.5", | |||
"vue-cropper": "^0.5.8", | |||
"vue-esign": "^1.1.4", | |||
"vue-pdf": "^4.3.0", | |||
"vue-qrcode-reader": "^3.1.0", | |||
"vue-quill-editor": "^3.0.6", | |||
@@ -889,3 +889,12 @@ export function casePointList(query) { | |||
}) | |||
} | |||
// 用户上传签字 | |||
export function electronicSignature(data) { | |||
return request({ | |||
url: '/system/user/profile/electronicSignature', | |||
method: 'post', | |||
data: data | |||
}) | |||
} | |||
@@ -1824,6 +1824,15 @@ export const constantRoutes = [ | |||
hidden: true, | |||
}, | |||
component: (resolve) => require(['@/views/yinnong/password'], resolve) | |||
} , | |||
{ | |||
path: '/yinnong/signature', | |||
name: 'yinnongSignature', | |||
meta: { | |||
title: '电子签名', | |||
hidden: true, | |||
}, | |||
component: (resolve) => require(['@/views/yinnong/signature'], resolve) | |||
}, | |||
{ | |||
path: '/yinnong/livePay', | |||
@@ -79,6 +79,17 @@ | |||
/> | |||
</template> | |||
</van-cell> | |||
<van-cell title="电子签名" is-link to="signature"> | |||
<template #icon> | |||
<van-image | |||
fit="contain" | |||
height="22" | |||
style="margin-right: 15px" | |||
src="../../../static/images/onlineHome/myIcon7.png" | |||
/> | |||
</template> | |||
</van-cell> | |||
<van-cell title="修改密码" is-link to="password"> | |||
<template #icon> | |||
<van-image | |||
@@ -0,0 +1,162 @@ | |||
<template> | |||
<div> | |||
<van-nav-bar | |||
title="电子签名" | |||
left-arrow | |||
@click-left="$router.back(-1)" | |||
/> | |||
<van-cell-group style="width: 96%;margin:2%;border-radius: 6px;overflow: hidden;padding-top: 10px;padding-bottom: 10px;box-shadow: 0px 3px 6px 0px rgba(0,0,0,0.16);"> | |||
<div class="signature-box"> | |||
<vue-esign | |||
ref="esign" | |||
class="mySign" | |||
:width="500" | |||
:height="225" | |||
:isCrop="signature.isCrop" | |||
:lineWidth="signature.lineWidth" | |||
:lineColor="signature.lineColor" | |||
:bgColor.sync="signature.bgColor" | |||
/> | |||
</div> | |||
<div class="signature-footer"> | |||
<signatureUploadSignature @signaImg = "signaImgFun"/> | |||
<van-button @click="handleGenerate" type="info" size="small"> 生成签字图片</van-button> | |||
<van-button @click="handleReset" class="clearBtn" type="info" plain size="small">清空画板</van-button> | |||
</div> | |||
<div class="esigh-result"> | |||
<img :src="signatureImg" class="imgs" v-if="signatureImg!=''"/> | |||
</div> | |||
</van-cell-group> | |||
</div> | |||
</template> | |||
<script> | |||
import vueEsign from 'vue-esign' | |||
import {getToken} from "@/utils/auth"; | |||
import axios from 'axios' | |||
import { getUserProfile } from "@/api/lawEnforcement/index"; | |||
import signatureUploadSignature from './signatureUploadSignature'; | |||
export default { | |||
name: "yinnongSignature", | |||
components:{vueEsign,signatureUploadSignature}, | |||
data() { | |||
return { | |||
signatureImg:'', | |||
//上传图片 | |||
uploadPictures:{ | |||
action:process.env.VUE_APP_BASE_API+'/system/user/profile/electronicSignature', | |||
headers: { Authorization: "Bearer " + getToken() }, | |||
}, | |||
//电子签名 | |||
signature:{ | |||
lineWidth: 6, // 画笔的线条粗细 | |||
lineColor: "#000000", // 画笔的颜色 | |||
bgColor: "", // 画布的背景颜色 | |||
resultImg: "", // 最终画布生成的base64图片 | |||
isCrop: false, // 是否裁剪,在画布设定尺寸基础上裁掉四周空白部分 | |||
} | |||
} | |||
}, | |||
mounted(){ | |||
this.getUser(); | |||
}, | |||
methods:{ | |||
getUser(){ | |||
getUserProfile().then(response => { | |||
const baseImgUrl = this.$store.getters.baseRoutingUrl; | |||
this.signatureImg = baseImgUrl+response.data.electronicSignature | |||
if(baseImgUrl==''){ | |||
setTimeout(()=>{ | |||
const baseImgUrl = this.$store.getters.baseRoutingUrl; | |||
this.signatureImg = baseImgUrl+response.data.electronicSignature | |||
},1000) | |||
} | |||
}); | |||
}, | |||
signaImgFun(url){ | |||
this.signatureImg = url; | |||
// console.log(url) | |||
}, | |||
// 清空画板 | |||
handleReset() { | |||
this.$refs.esign.reset(); | |||
}, | |||
// 生成签字图 | |||
handleGenerate() { | |||
this.$refs.esign | |||
.generate() // 使用生成器调用把签字的图片转换成为base64图片格式 | |||
.then((res) => { | |||
console.log(res) | |||
this.signature.resultImg = res; | |||
let wj = this.dataURLtoBlob(res); | |||
let param = new FormData() // 创建form对象 | |||
param.append('electronicSignaturefile', wj) // 通过append向form对象添加数据 | |||
let config = { | |||
headers: this.uploadPictures.headers | |||
} | |||
// 添加请求头 | |||
axios.post(this.uploadPictures.action, param, config) | |||
.then(res => { | |||
let content = res.data; | |||
if(content.code == 200){ | |||
const baseImgUrl = this.$store.getters.baseRoutingUrl; | |||
this.signatureImg = baseImgUrl+content.esUrl; | |||
} | |||
}) | |||
}) | |||
.catch((err) => { | |||
// 画布没有签字时会执行这里提示一下 | |||
this.$toast.fail('请签名后再生成签字图片'); | |||
}); | |||
}, | |||
dataURLtoBlob(dataurl) { | |||
var arr = dataurl.split(','); | |||
//注意base64的最后面中括号和引号是不转译的 | |||
var _arr = arr[1].substring(0,arr[1].length-2); | |||
var mime = arr[0].match(/:(.*?);/)[1], | |||
bstr =atob(_arr), | |||
n = bstr.length, | |||
u8arr = new Uint8Array(n); | |||
while (n--) { | |||
u8arr[n] = bstr.charCodeAt(n); | |||
} | |||
return new Blob([u8arr], { | |||
type: mime | |||
}); | |||
}, | |||
} | |||
} | |||
</script> | |||
<style scoped lang="scss"> | |||
.signature-box{ | |||
border:1px dashed #666; | |||
margin:2px 20px; | |||
} | |||
.signature-footer{ | |||
margin:15px 20px 0; | |||
display: flex; | |||
.clearBtn{ | |||
margin-left: 15px; | |||
} | |||
} | |||
.esigh-result{ | |||
margin:15px 20px; | |||
// height: 110px; | |||
border:1px solid #666; | |||
font-size: 0; | |||
.imgs{ | |||
width: 100%; | |||
} | |||
} | |||
</style> |
@@ -0,0 +1,161 @@ | |||
<template> | |||
<div class="update_main"> | |||
<van-button @click="editCropper" type="info" size="small">上传签字图片</van-button> | |||
<van-popup v-model="open" position="bottom" :style="{ height: '60%' }"> | |||
<div class="screenshots_main"> | |||
<vue-cropper | |||
ref="cropper" | |||
:img="options.img" | |||
:info="true" | |||
:autoCrop="options.autoCrop" | |||
:autoCropWidth="options.autoCropWidth" | |||
:autoCropHeight="options.autoCropHeight" | |||
:fixedBox="options.fixedBox" | |||
@realTime="realTime" | |||
v-if="visible" | |||
/> | |||
</div> | |||
<div class="avatar-upload-main"> | |||
<div class="avatar-upload-preview"> | |||
<img :src="previews.url" :style="previews.img" /> | |||
</div> | |||
</div> | |||
<div class="steup_main"> | |||
<van-uploader :after-read="afterRead"> | |||
<van-button icon="plus" type="primary" size="small">上传文件</van-button> | |||
</van-uploader> | |||
<van-button @click="changeScale(1)" icon="plus" size="small"></van-button> | |||
<van-button @click="changeScale(-1)" icon="minus" size="small"></van-button> | |||
<van-button @click="rotateLeft()" icon="replay" size="small" class="xzmt"></van-button> | |||
<van-button @click="rotateRight()" icon="replay" size="small"></van-button> | |||
<van-button @click="uploadImg" type="info" size="small">提交</van-button> | |||
</div> | |||
</van-popup> | |||
</div> | |||
</template> | |||
<script> | |||
import { electronicSignature } from "@/api/lawEnforcement/index"; | |||
import { VueCropper } from "vue-cropper"; | |||
export default { | |||
components: { VueCropper }, | |||
data() { | |||
return { | |||
// 是否显示弹出层 | |||
open: false, | |||
// 是否显示cropper | |||
visible: false, | |||
// 弹出层标题 | |||
title: "上传PNG签名图片", | |||
options: { | |||
img: '', //裁剪图片的地址 | |||
autoCrop: true, // 是否默认生成截图框 | |||
autoCropWidth: 244, // 默认生成截图框宽度 | |||
autoCropHeight: 110, // 默认生成截图框高度 | |||
fixedBox: true // 固定截图框大小 不允许改变 | |||
}, | |||
previews: {} | |||
} | |||
}, | |||
created(){ | |||
}, | |||
methods:{ | |||
// 编辑头像 | |||
editCropper() { | |||
this.open = true; | |||
this.visible = true; | |||
}, | |||
// 实时预览 | |||
realTime(data) { | |||
this.previews = data; | |||
}, | |||
afterRead(file){ | |||
this.options.img = file.content; | |||
}, | |||
// 图片缩放 | |||
changeScale(num) { | |||
num = num || 1; | |||
this.$refs.cropper.changeScale(num); | |||
}, | |||
// 向左旋转 | |||
rotateLeft() { | |||
this.$refs.cropper.rotateLeft(); | |||
}, | |||
// 向右旋转 | |||
rotateRight() { | |||
this.$refs.cropper.rotateRight(); | |||
}, | |||
// 上传图片 | |||
uploadImg() { | |||
this.$refs.cropper.getCropBlob(data => { | |||
let formData = new FormData(); | |||
formData.append("electronicSignaturefile", data); | |||
electronicSignature(formData).then(response => { | |||
this.open = false; | |||
this.options.img = this.$store.getters.baseRoutingUrl + response.esUrl; | |||
this.$emit('signaImg', this.options.img) | |||
// this.msgSuccess("修改成功"); | |||
this.$toast.success('成功文案'); | |||
this.visible = false; | |||
}); | |||
}); | |||
}, | |||
} | |||
} | |||
</script> | |||
<style scoped lang="scss"> | |||
.img-circle { | |||
border-radius: 50%; | |||
} | |||
.img-lg { | |||
width: 120px; | |||
height: 120px; | |||
} | |||
.avatar-upload-main{ | |||
position: relative; | |||
width: 100%; | |||
height: 160px; | |||
} | |||
.avatar-upload-preview { | |||
position: absolute; | |||
top: 50%; | |||
transform: translate(50%, -50%); | |||
width: 200px; | |||
height: 200px; | |||
border-radius: 50%; | |||
box-shadow: 0 0 4px #ccc; | |||
overflow: hidden; | |||
} | |||
.update_main{ | |||
margin-right: 15px; | |||
} | |||
.screenshots_main{ | |||
height: 350px; | |||
padding:20px 20px 0; | |||
} | |||
.avatar-upload-preview{ | |||
width: 244px; | |||
height: 110px; | |||
border-radius: 0; | |||
left: 50%; | |||
margin-left: -244px; | |||
} | |||
.steup_main{ | |||
margin:0 20px; | |||
text-align: center; | |||
.xzmt{ | |||
transform: rotate(180deg); | |||
} | |||
} | |||
</style> |