191 lines
4.0 KiB
Vue
191 lines
4.0 KiB
Vue
<template>
|
||
<div class="signature-pad">
|
||
<div class="container">
|
||
<vue-signature-pad
|
||
ref="signaturePadRef"
|
||
:scaleToDevicePixelRatio="false"
|
||
:options="options"
|
||
></vue-signature-pad>
|
||
</div>
|
||
<div class="dialog-footer">
|
||
<el-button style="margin-left: 20px" @click="close"> 取消 </el-button>
|
||
<el-button type="danger" style="margin-left: 20px" @click="clear">
|
||
清除
|
||
</el-button>
|
||
<el-button plain type="primary" style="margin-left: 20px" @click="save">
|
||
保存
|
||
</el-button>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import { artApi } from "../../artApi.js";
|
||
import { ElMessageBox } from "element-plus";
|
||
|
||
export default {
|
||
name: "write",
|
||
props: {
|
||
role: String,
|
||
id: Number,
|
||
},
|
||
data() {
|
||
return {
|
||
signaturePadKey: 0,
|
||
|
||
dialogVisible: false,
|
||
options: {
|
||
penColor: "#000",
|
||
onBegin: () => {
|
||
//该签名组件有bug,在非移动端环境下需要重新渲染canvas的尺寸才能正常使用
|
||
this.$refs.signaturePadRef.resizeCanvas();
|
||
},
|
||
},
|
||
uploadApi: `/v2${artApi.artUploadPicture}`, //事件图片上传api地址
|
||
};
|
||
},
|
||
mounted() {
|
||
// 如果是移动端设备,强制横屏
|
||
if (window.innerWidth < window.innerHeight) {
|
||
this.lockOrientation();
|
||
}
|
||
},
|
||
|
||
methods: {
|
||
// 退出全屏并恢复竖屏
|
||
exitFullscreenAndRestoreOrientation() {
|
||
// 恢复屏幕方向
|
||
if (screen.orientation && screen.orientation.unlock) {
|
||
// screen.orientation.unlock();
|
||
screen.orientation.lock("portrait");
|
||
} // 退出全屏
|
||
if (document.exitFullscreen && document.fullscreenElement !== null) {
|
||
document.exitFullscreen();
|
||
}
|
||
},
|
||
lockOrientation() {
|
||
if (document.documentElement.requestFullscreen) {
|
||
document.documentElement
|
||
.requestFullscreen()
|
||
.then(() => {
|
||
// 全屏成功后锁定横屏
|
||
screen.orientation.lock("landscape").catch((err) => {
|
||
console.error("无法锁定横屏:", err);
|
||
});
|
||
})
|
||
.catch((err) => {
|
||
console.error("全屏失败:", err);
|
||
ElMessageBox.alert("请使用横屏进行签名", "提示", {
|
||
confirmButtonText: "确定",
|
||
callback: () => {
|
||
this.lockOrientation();
|
||
},
|
||
});
|
||
});
|
||
} else {
|
||
console.error("当前浏览器不支持全屏API");
|
||
}
|
||
},
|
||
|
||
close() {
|
||
this.exitFullscreenAndRestoreOrientation();
|
||
this.$emit("close");
|
||
},
|
||
clear() {
|
||
this.$refs.signaturePadRef.clearSignature();
|
||
},
|
||
|
||
save() {
|
||
const signatureData = this.$refs.signaturePadRef.saveSignature();
|
||
this.$emit("save", signatureData);
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
|
||
<style scoped>
|
||
.signature-pad {
|
||
width: 100%;
|
||
height: 100%;
|
||
display: flex;
|
||
padding: 5px;
|
||
}
|
||
.container {
|
||
width: 100%;
|
||
height: 100%;
|
||
padding: 8px;
|
||
border: 1px solid;
|
||
}
|
||
.dialog-footer {
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: space-around;
|
||
align-items: center;
|
||
|
||
.otherSet {
|
||
width: 40%;
|
||
display: flex;
|
||
align-items: center;
|
||
|
||
.b1 {
|
||
width: 4px;
|
||
height: 4px;
|
||
}
|
||
|
||
.b2 {
|
||
width: 6px;
|
||
height: 6px;
|
||
}
|
||
|
||
.b3 {
|
||
width: 8px;
|
||
height: 8px;
|
||
}
|
||
|
||
.b1,
|
||
.b2,
|
||
.b3 {
|
||
display: inline-block;
|
||
background: #000;
|
||
border-radius: 50%;
|
||
}
|
||
|
||
.active {
|
||
border: 1px dashed #0074d9;
|
||
}
|
||
|
||
.circleWrap {
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
width: 18px;
|
||
height: 18px;
|
||
cursor: pointer;
|
||
margin-right: 20px;
|
||
}
|
||
|
||
.penTxt {
|
||
width: 70px;
|
||
font-size: 12px;
|
||
color: #000;
|
||
}
|
||
}
|
||
}
|
||
:deep(.el-card) {
|
||
height: 25%;
|
||
width: 50%;
|
||
}
|
||
:deep(.el-card__body) {
|
||
height: 100%;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: center;
|
||
align-items: center;
|
||
}
|
||
.svgClass {
|
||
width: 5rem;
|
||
height: 5rem;
|
||
margin-bottom: 2rem;
|
||
}
|
||
</style>
|