<template>
|
|
<view class="page">
|
|
<navbar title="编辑模板" leftClick @leftClick="$utils.navigateBack" />
|
|
|
|
<view class="title">
|
|
<input type="text" placeholder="请输入标题" v-model="form.title"/>
|
|
</view>
|
|
|
|
<view style="padding: 25rpx;background-color: #fff;">
|
|
<canvas-drag ref="canvasRef"
|
|
id="canvas-drag" :graph="graph"
|
|
:width="width" :height="height"
|
|
@onDrawArrChange="onDrawArrChange"
|
|
enableUndo="true"></canvas-drag>
|
|
</view>
|
|
|
|
<view class="btn-list" v-if="imageArr.length > 0">
|
|
<view class="uni-color-btn" @tap="pro">上一页</view>
|
|
<view>{{ imagesIndex + 1 }}/{{ imageArr.length }}</view>
|
|
<view class="uni-color-btn" @tap="next">下一页</view>
|
|
</view>
|
|
<view class="btn-list">
|
|
<!-- <view class="uni-color-btn" @tap="onAddImage">新建签名</view> -->
|
|
<view class="uni-color-btn" @tap="onChangeBgImage">导入合同</view>
|
|
<view class="uni-color-btn" @tap="onUndo">后退</view>
|
|
<!-- <view class="uni-color-btn" @tap="onClearCanvas">清空</view> -->
|
|
<view class="uni-color-btn" @tap="submit">保存</view>
|
|
<!-- <view class="uni-color-btn" @tap="onExportJSON">导出模板</view> -->
|
|
<!-- <view class="uni-color-btn" @tap="onAddText">添加文字</view> -->
|
|
<view class="uni-color-btn" @tap="previewContract" v-if="form.template">预览合同</view>
|
|
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import canvasDrag from "../components/canvas-drag/index";
|
|
import setData from "../components/canvas-drag/setData.js";
|
|
import wxBase64src from '@/utils/wxBase64src.js'
|
|
export default {
|
|
components: {
|
|
canvasDrag
|
|
},
|
|
mixins : [setData],
|
|
data() {
|
|
return {
|
|
height: 750,
|
|
width: 700,
|
|
drawArr : {},
|
|
form : {
|
|
template : '',
|
|
employeePage : 0,//求职者(乙方)签字页码
|
|
employeePosition : '',//求职者(乙方)签字坐标
|
|
bossPage : 0,//招聘者(甲方)签字页码
|
|
bossPosition : '',//招聘者(甲方)签字坐标
|
|
title : '',
|
|
},
|
|
imagesIndex : 0,
|
|
imageArr : [],
|
|
id : 0,
|
|
}
|
|
},
|
|
onLoad({id}) {
|
|
// uni.request({
|
|
// url : 'http://192.168.1.5:5173/arr',
|
|
// method: 'GET',
|
|
// success : res => {
|
|
// this.imageArr = res.data
|
|
// this.onChangeBgImage()
|
|
// }
|
|
// })
|
|
|
|
this.id = id
|
|
this.getDetail()
|
|
},
|
|
mounted() {
|
|
console.log("mounted mounted mounted");
|
|
},
|
|
methods: {
|
|
// async pro(){
|
|
// if(this.imagesIndex == 0){
|
|
// uni.showToast({
|
|
// title: '已经是第一页了'
|
|
// })
|
|
// return
|
|
// }
|
|
// this.imagesIndex--
|
|
// await wxBase64src.unlink()
|
|
// this.changeBgImage()
|
|
// },
|
|
// async next(){
|
|
// if(this.imagesIndex == this.imageArr.length - 1){
|
|
// uni.showToast({
|
|
// title: '已经是最后一页了'
|
|
// })
|
|
// return
|
|
// }
|
|
// this.imagesIndex++
|
|
// await wxBase64src.unlink()
|
|
// this.changeBgImage()
|
|
// },
|
|
async pro(){
|
|
if(this.imagesIndex == 0){
|
|
uni.showToast({
|
|
title: '已经是第一页了'
|
|
})
|
|
return
|
|
}
|
|
this.imagesIndex--
|
|
await wxBase64src.unlink()
|
|
// 强制重新渲染canvas
|
|
this.$nextTick(async () => {
|
|
await this.changeBgImage()
|
|
})
|
|
},
|
|
async next(){
|
|
if(this.imagesIndex == this.imageArr.length - 1){
|
|
uni.showToast({
|
|
title: '已经是最后一页了'
|
|
})
|
|
return
|
|
}
|
|
this.imagesIndex++
|
|
await wxBase64src.unlink()
|
|
// 强制重新渲染canvas
|
|
this.$nextTick(async () => {
|
|
await this.changeBgImage()
|
|
})
|
|
},
|
|
// 预览合同
|
|
previewContract(){
|
|
uni.downloadFile({
|
|
url : this.form.template,
|
|
success : res => {
|
|
uni.openDocument({
|
|
filePath: res.tempFilePath,
|
|
})
|
|
}
|
|
})
|
|
},
|
|
// 签名位置更新时
|
|
onDrawArrChange(arr){
|
|
console.log(arr);
|
|
this.drawArr = arr
|
|
},
|
|
/**
|
|
* 添加签名位置
|
|
*/
|
|
onAddImage() {
|
|
// wx.chooseImage({
|
|
// success: res => {
|
|
// this.setData({
|
|
// graph: {
|
|
// w: 100,
|
|
// h: 50,
|
|
// type: 'image',
|
|
// url: res.tempFilePaths[0]
|
|
// }
|
|
// });
|
|
// }
|
|
// });
|
|
|
|
|
|
let a = {}
|
|
let b = {}
|
|
|
|
if(this.id){
|
|
a = JSON.parse(this.form.bossPosition)
|
|
b = JSON.parse(this.form.employeePosition)
|
|
|
|
for(let ak in a){
|
|
a[ak] = this.$utils.screenSystemInfoInt(a[ak]) - 0
|
|
}
|
|
for(let bk in b){
|
|
b[bk] = this.$utils.screenSystemInfoInt(b[bk]) - 0
|
|
}
|
|
|
|
console.log(a, b);
|
|
}
|
|
|
|
uni.getImageInfo({
|
|
src: this.configList.config_sign_a,
|
|
// src: 'https://img.teyizhao.com/2025-02-07/3d837c0e-91f4-4682-82d9-a04c2af737e8.png',
|
|
success : res => {
|
|
this.setData({
|
|
graph: {
|
|
id : 'a',
|
|
w: a.w || 100,
|
|
h: a.h || 50,
|
|
x: a.x || 30,
|
|
y: a.y || 30,
|
|
type: 'image',
|
|
url : res.path
|
|
}
|
|
});
|
|
},
|
|
fail(e) {
|
|
console.log(e);
|
|
}
|
|
})
|
|
|
|
uni.getImageInfo({
|
|
src: this.configList.config_sign_b,
|
|
// src: 'https://img.teyizhao.com/2025-02-07/af4786c0-7b62-4a86-a090-9f28eca3674a.png',
|
|
success : res => {
|
|
this.setData({
|
|
graph: {
|
|
id : 'b',
|
|
w: b.w || 100,
|
|
h: b.h || 50,
|
|
x: b.x || 160,
|
|
y: b.y || 30,
|
|
type: 'image',
|
|
url : res.path
|
|
}
|
|
});
|
|
},
|
|
fail(e) {
|
|
console.log(e);
|
|
}
|
|
})
|
|
|
|
},
|
|
|
|
/**
|
|
* 导入合同
|
|
*/
|
|
async onChangeBgImage() {
|
|
let self = this
|
|
|
|
let pdfUrl = await self.loadFDP()
|
|
|
|
this.form.template = pdfUrl
|
|
|
|
await this.pdf2imagebase64()
|
|
|
|
this.changeBgImage()
|
|
|
|
},
|
|
// async changeBgImage(){
|
|
// let self = this
|
|
|
|
// let src = await wxBase64src.base64src(this.imageArr[this.imagesIndex])
|
|
|
|
// uni.getImageInfo({
|
|
// src,
|
|
// success: image => {
|
|
// console.log(image);
|
|
|
|
// let allwh = image.height + image.width
|
|
// let imgw = (image.width / allwh).toFixed(2)
|
|
// let imgh = (image.height / allwh).toFixed(2)
|
|
|
|
// self.height = imgh * Math.ceil(this.width / imgw)
|
|
|
|
// self.$nextTick(() => {
|
|
// uni.hideLoading()
|
|
// this.$refs.canvasRef.changeBgImage(image.path)
|
|
// })
|
|
// },
|
|
// fail(err) {
|
|
// wxBase64src.unlink()
|
|
// console.log(err);
|
|
// }
|
|
// })
|
|
// },
|
|
async changeBgImage(){
|
|
let self = this
|
|
|
|
try {
|
|
uni.showLoading({
|
|
title: '加载中...'
|
|
})
|
|
|
|
let src = await wxBase64src.base64src(this.imageArr[this.imagesIndex])
|
|
|
|
const imageInfo = await new Promise((resolve, reject) => {
|
|
uni.getImageInfo({
|
|
src,
|
|
success: resolve,
|
|
fail: reject
|
|
})
|
|
})
|
|
|
|
let allwh = imageInfo.height + imageInfo.width
|
|
let imgw = (imageInfo.width / allwh).toFixed(2)
|
|
let imgh = (imageInfo.height / allwh).toFixed(2)
|
|
|
|
self.height = imgh * Math.ceil(this.width / imgw)
|
|
|
|
// 确保DOM更新后再更新canvas
|
|
await this.$nextTick()
|
|
// 先清空画布再设置新图片
|
|
// await this.$refs.canvasRef.clearCanvas()
|
|
await this.$refs.canvasRef.changeBgImage(imageInfo.path)
|
|
|
|
// 重新添加签名位置
|
|
// this.onAddImage()
|
|
|
|
} catch(err) {
|
|
console.error('changeBgImage error:', err)
|
|
wxBase64src.unlink()
|
|
} finally {
|
|
uni.hideLoading()
|
|
}
|
|
},
|
|
loadFDP(){
|
|
let that = this
|
|
return new Promise((success, error) => {
|
|
uni.chooseMessageFile({
|
|
count: 1, //一次可以上传多少个
|
|
type: 'file',
|
|
extension: ['.pdf'], //文件类型
|
|
success(res) {
|
|
// that.$Oss.ossUpload(res.tempFiles[0].path)
|
|
success(that.$Oss.ossUpload(res.tempFiles[0].path))
|
|
},
|
|
fail: (err) => {
|
|
error(err)
|
|
console.log(err, 'err');
|
|
}
|
|
});
|
|
})
|
|
},
|
|
// 后退
|
|
onUndo(event) {
|
|
this.$refs.canvasRef.undo();
|
|
},
|
|
/**
|
|
* 导出当前画布为模板
|
|
*/
|
|
onExportJSON() {
|
|
this.$refs.canvasRef.exportFun().then(imgArr => {
|
|
console.log(imgArr);
|
|
uni.previewImage({
|
|
urls: [imgArr],
|
|
current: 0,
|
|
})
|
|
}).catch(e => {
|
|
console.error(e);
|
|
});
|
|
},
|
|
/**
|
|
* 添加文本
|
|
*/
|
|
onAddText() {
|
|
this.setData({
|
|
graph: {
|
|
type: 'text',
|
|
text: 'helloworld'
|
|
}
|
|
});
|
|
},
|
|
|
|
onClearCanvas(event) {
|
|
let _this = this;
|
|
_this.setData({
|
|
canvasBg: null
|
|
});
|
|
this.$refs.canvasRef.clearCanvas();
|
|
},
|
|
async submit() {
|
|
|
|
if(this.$utils.verificationAll(this.form, {
|
|
title : '请输入标题',
|
|
})){
|
|
return
|
|
}
|
|
|
|
let bossPosition = {
|
|
// ...this.drawArr.a,
|
|
x : this.$utils.rpxSystemInfoInt(this.drawArr.a.x),
|
|
y : this.$utils.rpxSystemInfoInt(this.drawArr.a.y),
|
|
w : this.$utils.rpxSystemInfoInt(this.drawArr.a.w),
|
|
h : this.$utils.rpxSystemInfoInt(this.drawArr.a.h),
|
|
}
|
|
let employeePosition = {
|
|
// ...this.drawArr.b,
|
|
x : this.$utils.rpxSystemInfoInt(this.drawArr.b.x),
|
|
y : this.$utils.rpxSystemInfoInt(this.drawArr.b.y),
|
|
w : this.$utils.rpxSystemInfoInt(this.drawArr.b.w),
|
|
h : this.$utils.rpxSystemInfoInt(this.drawArr.b.h),
|
|
}
|
|
|
|
this.form.bossPosition = JSON.stringify(bossPosition)
|
|
this.form.employeePosition = JSON.stringify(employeePosition)
|
|
|
|
this.form.bossPage = this.imagesIndex
|
|
this.form.employeePage = this.imagesIndex
|
|
|
|
this.$api(this.id ? 'updateContractTemplate' :
|
|
'addContractTemplate', this.form).then(res => {
|
|
if(res.code == 200){
|
|
uni.navigateBack(-1)
|
|
}
|
|
})
|
|
},
|
|
// pdf转图片base64
|
|
async pdf2imagebase64(){
|
|
uni.showLoading({
|
|
title: '解析文档中...'
|
|
})
|
|
let res = await this.$api('pdf2imagebase64', {
|
|
pdfPath : this.form.template
|
|
})
|
|
this.imageArr = []
|
|
for(let key in res.result){
|
|
this.imageArr.push(res.result[key])
|
|
}
|
|
},
|
|
getDetail(){
|
|
if(!this.id){
|
|
this.onAddImage()
|
|
return
|
|
}
|
|
this.$api('queryContractTemplateById', {
|
|
contractTemplateId : this.id
|
|
}).then(async (res) => {
|
|
if(res.code == 200){
|
|
this.form = res.result
|
|
|
|
this.imagesIndex = this.form.employeePage
|
|
|
|
delete this.form.createBy
|
|
delete this.form.createTime
|
|
delete this.form.updateBy
|
|
delete this.form.updateTime
|
|
|
|
this.onAddImage()
|
|
|
|
await this.pdf2imagebase64()
|
|
|
|
this.changeBgImage()
|
|
}
|
|
})
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.page {
|
|
padding-bottom: 100rpx;
|
|
.title{
|
|
padding: 10rpx 30rpx;
|
|
background-color: #fff;
|
|
margin-bottom: 10rpx;
|
|
input{
|
|
padding: 20rpx;
|
|
background-color: rgba($uni-color, 0.1);
|
|
color: $uni-color;
|
|
border: 1rpx solid $uni-color;
|
|
border-radius: 10rpx;
|
|
}
|
|
}
|
|
.btn-list {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
padding: 20rpx;
|
|
gap: 30rpx;
|
|
justify-content: center;
|
|
.uni-color-btn {
|
|
margin: 0;
|
|
border-radius: 10rpx;
|
|
}
|
|
}
|
|
}
|
|
</style>
|