|
|
- <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>
|