初始化

This commit is contained in:
2025-07-28 15:52:07 +08:00
commit cd0e77b332
1304 changed files with 302802 additions and 0 deletions

View File

@@ -0,0 +1,264 @@
<template>
<div>
<div class="signature">
<span @click="openDialog" v-if="url == null || url == ''" type="text">手写签名</span>
<el-image v-else @click="openDialog" style="height: 50rpx; width:150px;" :src=" baseurl + src" fit="cover">
<div slot="error" class="image-slot">
<span @click="openDialog">加载失败点击重写</span>
</div>
</el-image>
<div class="op">
<!-- <span v-if="url != null && url != '' " @click="openDialog">
重写
</span> -->
</div>
</div>
<el-dialog
class="pane"
:show-close="false"
:visible.sync="dialogVisible"
width="900px"
@opened="openedHandle"
>
<div slot="title" class="pane-title">
<div class="tool-bar">
<i class="el-icon-edit " :style="{color:isClear==false?'red':''}" @click="draw"></i>
<i class="el-icon-brush" :style="{color:isClear==true?'red':''}" @click="setClear"></i>
<i class="el-icon-arrow-left" @click="backStep"></i>
<i class="el-icon-arrow-right" @click="nextStep"></i>
<i class="el-icon-delete" @click="clearAll"></i>
</div>
<div class="close" v-if="!disabled">
<span @click="upload">
保存
</span>
<span @click="dialogVisible = false">
关闭
</span>
</div>
</div>
<div class="pane-box">
<canvas ref="canvas" width="900px" height="300px"></canvas>
</div>
</el-dialog>
</div>
</template>
<script>
import {commonUpload} from "@/api/affix/affix"
import { getTokenKeySessionStorage as getToken } from "@/utils/auth";
export default {
name: 'CmSignature',
inject: {
elForm: {
default: '',
}
},
data() {
return {
cvs:null,
ctx:null,
isClear:false,
canvasHistory:[],
step:-1,
dialogVisible:false,
baseurl: process.env.VUE_APP_BASE_API ,
uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址
headers: {
Authorization: "Bearer " + getToken(),
},
src:null,
baseurl: process.env.VUE_APP_BASE_API ,
}
},
props: {
url:{
type:String,
default:null,
},
disabled:{
type:Boolean,
default:false
}
},
methods: {
upload(){
let _this = this;
this.cvs.toBlob(function (blob) {
// 创建一个File对象
let f = new File([blob], 'signature.webp', { type: 'image/webp'})
// 图片ajax上传字段名是image
commonUpload({file:f}).then(res=>{
if(res.code == 200 && res.fileName){
//上传成功的文件名
_this.$emit("save-success",res.fileName);
_this.dialogVisible = false;
}
})
});
},
draw(){
this.isClear = false;
},
backStep(){
if (this.step >= 0) {
this.step--;
this.ctx.clearRect(0, 0, this.cvs.width, this.cvs.height);
let canvasPic = new Image();
canvasPic.src = this.canvasHistory[this.step];
canvasPic.addEventListener('load', () => {
this.ctx.drawImage(canvasPic, 0, 0);
});
}
},
nextStep(){
if (this.step < this.canvasHistory.length - 1) {
this.step++;
this.ctx.clearRect(0, 0, this.cvs.width, this.cvs.height);
let canvasPic = new Image();
canvasPic.src = this.canvasHistory[this.step];
canvasPic.addEventListener('load', () => {
this.ctx.drawImage(canvasPic, 0, 0);
});
}
},
setClear(){
this.isClear = true;
},
openedHandle(){
let _this = this;
let cvs = this.$refs.canvas;
if(this.url!=null && this.url != ''){
let img = new Image();
img.onload = function() {
ctx.drawImage(img, 0, 0); // 在Canvas上绘制图片
};
img.src = this.baseurl + this.url; // 替换为你的图片路径
}
this.cvs = cvs;
//获取画笔
let ctx = cvs.getContext('2d');
this.ctx = ctx;
// ctx.translate(0.5, 0.5)
ctx.lineWidth = 3;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.fillStyle="#ff0000";
//鼠标按下时间
cvs.onmousedown = (e)=>{
//
ctx.beginPath();
ctx.moveTo(e.offsetX,e.offsetY);
cvs.onmousemove = (ev)=>{
if(this.isClear){
//橡皮擦
ctx.clearRect(ev.offsetX-5,ev.offsetY-5,10,10);
}else{
//画线
ctx.lineTo(ev.offsetX,ev.offsetY);
ctx.stroke();
}
}
}
cvs.onmouseup=()=>{
cvs.onmousemove = null
_this.step++;
_this.canvasHistory.push(cvs.toDataURL());
};
},
openDialog(){
this.dialogVisible = true;
},
clearAll(){
this.step = -1;
this.canvasHistory = [];
this.ctx.clearRect(0,0,this.cvs.width,this.cvs.height);
}
},
created() {
},
watch: {
// 父组件值监听事件
url: {
handler: function(newVal/*, oldVal*/) {
console.log(newVal);
this.src = newVal;
}
}
},
}
</script>
<style scoped>
.pane>>>.el-dialog__header,.pane>>>.el-dialog__body{
padding: 0;
}
.pane-title{
height: 46px;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.tool-bar{
display: flex;
flex-direction: row;
justify-content: start;
gap: 10px;
align-items: center;
}
.pane-title i{
width: 46px;
height: 46px;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
.close{
display: flex;
flex-direction: row;
justify-content: start;
align-items: center;
}
.close span{
padding: 10px;
}
.active{
color: #409EFF;
}
.signature{
color: #409EFF;
cursor: pointer;
}
.op{
display: none;
}
.signature:hover>.op{
display: block;
}
</style>