lanan-repair-app/pages-repair/signature/signature.vue

185 lines
4.4 KiB
Vue
Raw Normal View History

<template>
<view class="page">
2024-10-30 15:37:26 +08:00
<VNavigationBar background-color="rgba(0,0,0,0)" title="客户签名" title-color="#333"></VNavigationBar>
<view class="container">
2024-10-30 15:37:26 +08:00
<view class="instruction">
确定维修项目无误后请客户签字确认
</view>
<canvas
2024-10-31 15:20:22 +08:00
canvas-id="signatureCanvas"
class="canvas"
:disable-scroll="true"
@touchstart="startSign"
@touchmove="drawSign"
@touchend="endSign"
></canvas>
<view class="buttons">
<button @click="clearSign">清除</button>
<button @click="saveSign">保存</button>
</view>
</view>
</view>
</template>
<script>
import upload from "@/utils/upload";
import VNavigationBar from "@/components/VNavigationBar.vue";
import request from "@/utils/request";
export default {
2024-10-31 15:20:22 +08:00
components: { VNavigationBar },
data() {
return {
context: null, // Canvas上下文
isSigning: false, // 是否正在签名中
2024-10-31 15:20:22 +08:00
data: {}
};
},
onLoad(data) {
// 获取 canvas 上下文
this.context = uni.createCanvasContext("signatureCanvas", this);
2024-10-30 15:37:26 +08:00
this.context.fillStyle = "white";
2024-10-31 15:20:22 +08:00
if (data.data) {
console.log('传递过来的内容', JSON.parse(data.data));
this.data = JSON.parse(data.data);
}
},
methods: {
// 开始签名
startSign(e) {
const { x, y } = e.touches[0];
this.context.moveTo(x, y);
this.context.beginPath();
this.isSigning = true;
},
// 签名进行中
drawSign(e) {
if (!this.isSigning) return;
const { x, y } = e.touches[0];
this.context.lineTo(x, y);
this.context.setStrokeStyle("#000000"); // 设定笔触颜色
this.context.setLineWidth(2); // 设定线条宽度
this.context.setLineCap("round"); // 圆形笔触
2024-10-31 15:20:22 +08:00
this.context.stroke(); // 实线
this.context.draw(true); // 连续绘制
},
// 结束签名
endSign() {
this.isSigning = false;
},
// 清除签名
clearSign() {
this.context.clearRect(0, 0, 750, 750); // 清空 Canvas
this.context.draw();
},
// 保存签名
saveSign() {
uni.canvasToTempFilePath({
canvasId: "signatureCanvas",
success: (res) => {
const tempFilePath = res.tempFilePath;
uni.showToast({
title: "签名已保存",
icon: "success",
});
upload({
url: '/admin-api/common/upload',
filePath: tempFilePath,
}).then((res) => {
console.log('服务器返回图片地址', res);
2024-10-31 15:20:22 +08:00
this.data.image = res.data.url;
console.log('提交的内容', this.data);
request({
url: '/admin-api/repair/tickets/create',
method: 'POST',
data: this.data
}).then(res => {
uni.showToast({
title: '创建工单成功',
icon: 'success'
2024-10-31 15:20:22 +08:00
});
uni.navigateTo({
url: `/pages-order/orderDetail/orderDetail?id=${res.data.id}&isDetail=0`
});
2024-10-31 15:20:22 +08:00
});
});
},
fail: (err) => {
console.log("保存签名失败:", err);
},
});
},
},
};
</script>
<style>
.page {
display: flex;
flex-direction: column;
height: 100vh;
background-color: #f5f5f5;
}
.VNavigationBar {
padding: 20rpx;
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
position: relative;
}
.container {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20rpx;
background-color: #f5f5f5;
}
.instruction {
font-size: 32rpx;
color: #333;
margin-bottom: 20rpx;
text-align: center;
}
.canvas {
width: 100%;
2024-10-31 15:20:22 +08:00
height: 600rpx; /* 加宽画布高度以适配横屏 */
border: 1px solid #ccc;
border-radius: 10rpx;
box-shadow: 0 4rpx 8rpx rgba(0, 0, 0, 0.1);
margin-bottom: 20rpx;
background-color: #fff;
}
.buttons {
display: flex;
gap: 10rpx;
margin-top: 20rpx;
}
button {
padding: 15rpx 30rpx;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5rpx;
font-size: 28rpx;
box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.1);
transition: background-color 0.3s ease;
}
button:hover {
background-color: #0066cc;
}
button:active {
background-color: #0055aa;
}
</style>