543 lines
14 KiB
Vue
543 lines
14 KiB
Vue
<template>
|
||
<div class="home">
|
||
<div class="nav">
|
||
<div class="iconBack"><i
|
||
class="el-icon-arrow-left"
|
||
style="color: white"
|
||
></i></div>
|
||
<div class="pageName">
|
||
<h2 class="tou">人员二维码</h2>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="content">
|
||
<div
|
||
class="place"
|
||
ref="backgroundElement"
|
||
:style="{
|
||
backgroundImage: 'url(' + srcImgUrl + ')'
|
||
}"
|
||
>
|
||
<div :style="{
|
||
height: backimgheight + 'px'
|
||
}">
|
||
<div
|
||
class="
|
||
content-up"
|
||
:style="{ width: backimgwidth + 'px' }"
|
||
>
|
||
<div
|
||
class="upDiv"
|
||
:style="{ width: backimgwidth + 'px', height: backimgheightUp + 'px', }"
|
||
>
|
||
<div
|
||
class="hear"
|
||
:style="{ fontSize: backimgFontSize * 0.9 + 'px', padding: backimgFontSize * 0.7 + 'px' }"
|
||
>
|
||
{{ currentTime }}
|
||
</div>
|
||
<div class="qr">
|
||
<div
|
||
:style="{ paddingTop: backimgFontSize + 'px' }"
|
||
v-if="backimgwidth != 0"
|
||
>
|
||
<vue-qr
|
||
:text="qrUrl"
|
||
:callback="qrCallBack"
|
||
:size="qrsize"
|
||
:margin="0"
|
||
:colorDark="fontColor"
|
||
colorLight="white"
|
||
:logoScale="0.2"
|
||
:dotScale="0.7"
|
||
>
|
||
</vue-qr>
|
||
</div>
|
||
|
||
<div
|
||
class="tip"
|
||
:style="{ 'color': fontColor, fontSize: backimgFontSize * 0.9 + 'px' }"
|
||
>
|
||
|
||
<p v-if="WorkerInfo.safeScore >= 90">无风险</p>
|
||
<p v-if="WorkerInfo.safeScore >= 80 && WorkerInfo.safeScore < 90"><i
|
||
v-if="WorkerInfo.safeScore < 90"
|
||
class="el-icon-warning"
|
||
:style="{ 'color': fontColor }"
|
||
></i>低风险</p>
|
||
<p v-if="WorkerInfo.safeScore < 80"><i
|
||
v-if="WorkerInfo.safeScore < 90"
|
||
class="el-icon-warning"
|
||
:style="{ 'color': fontColor }"
|
||
></i>高风险</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="content-down">
|
||
<div
|
||
class="downDiv"
|
||
style="text-align: center;"
|
||
:style="{ height: backimgheightDown + 'px' }"
|
||
>
|
||
<div
|
||
class="downHear"
|
||
:style="{
|
||
fontSize: backimgFontSize * 0.65 + 'px',
|
||
width: backimgwidth + 'px',
|
||
paddingTop: backimgFontSize * 0.4 + 'px',
|
||
paddingBottom: backimgFontSize * 0.4 + 'px'
|
||
}"
|
||
>
|
||
<div class="down-up">
|
||
<div class="left-downHear">姓名:</div>
|
||
<div class="right-downHear">{{ WorkerInfo.workerName | hideName }}</div>
|
||
</div>
|
||
<div class="down-up">
|
||
<div class="left-downHear">证件号码:</div>
|
||
<div class="right-downHear">{{ WorkerInfo.idCard | hideIdNum }}</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div
|
||
class="text"
|
||
v-if="WorkerInfo.safeScore >= 90 && backimgwidth != 0"
|
||
:style="{ 'color': fontColor, paddingTop: backimgFontSize * 0.3 + 'px', height: backimgFontSize * 8.27 + 'px' }"
|
||
>
|
||
通过后台查询到,您无扣分风险
|
||
</div>
|
||
|
||
<div
|
||
class="text2"
|
||
v-if="WorkerInfo.safeScore < 90 && backimgwidth != 0"
|
||
:style="{ 'color': fontColor, paddingTop: backimgFontSize * 0.3 + 'px', paddingBottom: backimgFontSize * 0.3 + 'px', height: backimgFontSize * 8.27 + 'px', width: backimgFontSize * 13.35 + 'px' }"
|
||
>
|
||
<div
|
||
class="text2-title"
|
||
:style="{ fontSize: backimgFontSize * 0.6 + 'px', }"
|
||
>通过后台查询到,您有以下扣分记录:</div>
|
||
<ul
|
||
class="text2-content"
|
||
v-infinite-scroll="load"
|
||
style="overflow:auto"
|
||
:style="{ fontSize: backimgFontSize * 0.5 + 'px', height: backimgFontSize * 7.5 + 'px', }"
|
||
>
|
||
<li
|
||
class="text2-item"
|
||
v-for="( item, i ) in scoreRecord "
|
||
:key="item.id"
|
||
:style="{ height: backimgFontSize * 2 + 'px', paddingTop: backimgFontSize * 0.33 + 'px', width: ((backimgFontSize * 13.35) - 25) + 'px' }"
|
||
>{{ i + 1 }}. {{ item.deductReason }}</li>
|
||
</ul>
|
||
</div>
|
||
<div
|
||
class="foot"
|
||
v-if="WorkerInfo.safeScore >= 90"
|
||
:style="{ 'color': fontColor, paddingTop: backimgFontSize * 0.4 + 'px', fontSize: backimgFontSize * 0.9 + 'px' }"
|
||
>
|
||
可通行
|
||
</div>
|
||
<div
|
||
class="foot"
|
||
v-if="WorkerInfo.safeScore >= 80 && WorkerInfo.safeScore < 90"
|
||
:style="{ 'color': fontColor, paddingTop: backimgFontSize * 0.4 + 'px', fontSize: backimgFontSize * 0.9 + 'px' }"
|
||
>
|
||
安全分已经低于90分
|
||
</div>
|
||
<div
|
||
class="foot"
|
||
v-if="WorkerInfo.safeScore < 80"
|
||
:style="{ 'color': fontColor, paddingTop: backimgFontSize * 0.4 + 'px', fontSize: backimgFontSize * 0.9 + 'px' }"
|
||
>
|
||
安全分已经低于80分
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import vueQr from 'vue-qr'
|
||
// import imgerr from '../assets'
|
||
export default {
|
||
name: 'myLogin',
|
||
components: {
|
||
vueQr
|
||
},
|
||
data () {
|
||
return {
|
||
//二维码大小
|
||
qrsize: 230,
|
||
|
||
//动态背景宽
|
||
backimgwidth: 0,
|
||
|
||
//动态背景高
|
||
backimgheight: 0,
|
||
|
||
//动态背景高(上)
|
||
backimgheightUp: 0,
|
||
|
||
//动态背景高(下)
|
||
backimgheightDown: 0,
|
||
|
||
//动态字体大小
|
||
backimgFontSize: 0,
|
||
|
||
//扣分记录
|
||
scoreRecord: [],
|
||
//当前时间
|
||
currentTime: "",
|
||
//名字
|
||
name: "王富贵",
|
||
idNum: "210811196005132133",
|
||
//动态背景图片
|
||
srcImgUrl: "",
|
||
//背景图片
|
||
// imgUrl: ["../../assets/健康.png", "../../assets/低险.png", "../../assets/危险.png"],
|
||
imgUrl: {
|
||
img1: require("../../assets/健康.png"),
|
||
img2: require("../../assets/低险.png"),
|
||
img3: require("../../assets/危险.png")
|
||
},
|
||
id: "",
|
||
// 用于生成二维码的url
|
||
qrUrl: "",
|
||
// 下载数据base64
|
||
qrDownloadUrl: "",
|
||
//二维码颜色
|
||
fontColor: "green",
|
||
//下方结构
|
||
flag: true,
|
||
//劳务人员信息
|
||
WorkerInfo: {},
|
||
}
|
||
},
|
||
|
||
// beforeCreate () {
|
||
// this.getBackgroundImageSize();
|
||
// },
|
||
|
||
created () {
|
||
this.updateTime();
|
||
setInterval(() => {
|
||
this.updateTime();
|
||
}, 1);
|
||
this.getId();
|
||
},
|
||
|
||
mounted () {
|
||
this.setColor(this.WorkerInfo.safeScore);
|
||
this.setImg(this.WorkerInfo.safeScore);
|
||
this.getScoreRecord();
|
||
|
||
setTimeout(() => {
|
||
this.getBackgroundImageSize();
|
||
}, 1000); // 延迟1秒钟执行,您可以根据实际情况调整延迟时间
|
||
},
|
||
|
||
methods: {
|
||
getBackgroundImageSize () {
|
||
var backgroundImage = new Image();
|
||
var imageUrl = getComputedStyle(document.querySelector('.place')).backgroundImage.slice(4, -1).replace(/['"]/g, "");
|
||
|
||
backgroundImage.src = imageUrl;
|
||
|
||
var self = this; // 保存this指向到变量self
|
||
|
||
backgroundImage.onload = function () {
|
||
var containerWidth = document.querySelector('.place').clientWidth;
|
||
var containerHeight = document.querySelector('.place').clientHeight;
|
||
var imageWidth = backgroundImage.width;
|
||
var imageHeight = backgroundImage.height;
|
||
console.log("containerWidth :" + containerWidth);
|
||
console.log("containerHeight :" + containerHeight);
|
||
console.log("imageWidth :" + imageWidth);
|
||
console.log("imageHeight :" + imageHeight);
|
||
|
||
var scaleX = containerWidth / imageWidth;
|
||
var scaleY = containerHeight / imageHeight;
|
||
var displayWidth, displayHeight;
|
||
|
||
if (scaleX < scaleY) {
|
||
displayWidth = containerWidth;
|
||
displayHeight = imageHeight * scaleX;
|
||
} else {
|
||
displayWidth = imageWidth * scaleY;
|
||
displayHeight = containerHeight;
|
||
}
|
||
|
||
self.backimgwidth = displayWidth * 0.8;
|
||
self.backimgheight = displayHeight;
|
||
self.qrsize = displayWidth * 0.6;
|
||
|
||
self.backimgheightUp = self.backimgheight * (53 / 100);
|
||
self.backimgheightDown = self.backimgheight * (47 / 100);
|
||
|
||
self.backimgFontSize = self.qrsize * 0.1;
|
||
|
||
console.log("处理过的背景图宽度: " + self.backimgwidth);
|
||
console.log("处理过的背景图高度: " + self.backimgheight);
|
||
console.log("二维码大小: " + self.qrsize);
|
||
console.log("动态字体大小: " + self.backimgFontSize);
|
||
}
|
||
},
|
||
|
||
async getScoreRecord () {
|
||
const params = {
|
||
workerId: this.id,
|
||
};
|
||
const { data: res } = await this.$http.get('/xmgl/xzDeductScoreRecord/list', params);
|
||
console.log(res);
|
||
if (res.success == true && res.result.length != 0) {
|
||
this.scoreRecord = res.result;
|
||
console.log(this.scoreRecord);
|
||
}
|
||
|
||
},
|
||
|
||
load () { },
|
||
|
||
updateTime () {
|
||
const date = new Date();
|
||
const year = date.getFullYear();
|
||
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||
const day = String(date.getDate()).padStart(2, '0');
|
||
const hours = String(date.getHours()).padStart(2, '0');
|
||
const minutes = String(date.getMinutes()).padStart(2, '0');
|
||
this.currentTime = `${year}-${month}-${day} ${hours}:${minutes}`;
|
||
},
|
||
setImg (fenshu) {
|
||
if (fenshu >= 90) {
|
||
this.srcImgUrl = this.imgUrl.img1;
|
||
} else if (fenshu >= 80 && fenshu < 90) {
|
||
this.srcImgUrl = this.imgUrl.img2;
|
||
} else if (fenshu < 80) {
|
||
this.srcImgUrl = this.imgUrl.img3;
|
||
}
|
||
},
|
||
|
||
setColor (fenshu) {
|
||
if (fenshu >= 90) {
|
||
this.fontColor = "green";
|
||
} else if (fenshu >= 80 && fenshu < 90) {
|
||
this.fontColor = "rgb(255, 230, 0)";
|
||
} else if (fenshu < 80) {
|
||
this.fontColor = "red";
|
||
}
|
||
},
|
||
|
||
getId () {
|
||
// console.log(this.$route.params);
|
||
this.WorkerInfo = this.$route.params.WorkerInfo;
|
||
console.log(this.WorkerInfo);
|
||
this.qrUrl = this.WorkerInfo.id;
|
||
},
|
||
// 二维码刷新后调用
|
||
qrCallBack (qrUrl) {
|
||
this.qrDownloadUrl = qrUrl;
|
||
},
|
||
// 下载二维码
|
||
downloadQrcode () {
|
||
let a = document.createElement('a');
|
||
a.download = '我的二维码';
|
||
a.href = this.qrDownloadUrl;
|
||
a.click();
|
||
},
|
||
//换颜色
|
||
handleQrCode (type) {
|
||
switch (type) {
|
||
case 1:
|
||
this.fontColor = 'green'
|
||
break
|
||
case 2:
|
||
this.fontColor = 'orange'
|
||
break
|
||
case 3:
|
||
this.fontColor = 'red'
|
||
break
|
||
}
|
||
},
|
||
},
|
||
|
||
filters: {
|
||
// 加密身份证号
|
||
hideIdNum (val) {
|
||
return `${val.substring(0, 3)}*************${val.substring(val.length - 2)}`
|
||
},
|
||
// 加密名字
|
||
hideName (val) {
|
||
return `${val.substring(0, 1)}**`
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
.content {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: 100%;
|
||
height: calc(100% - 3.33rem);
|
||
}
|
||
|
||
.place {
|
||
width: 90%;
|
||
height: 100%;
|
||
background-image: url(../../assets/健康.png);
|
||
background-size: contain;
|
||
background-repeat: no-repeat;
|
||
background-position: center;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: center;
|
||
align-items: center;
|
||
}
|
||
|
||
.content-up {
|
||
width: 100%;
|
||
height: 54.5%;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: flex-end;
|
||
}
|
||
|
||
.content-down {
|
||
height: 45.5%;
|
||
}
|
||
|
||
.upDiv {
|
||
/* background-color: yellow; */
|
||
/* position: absolute;
|
||
bottom: 0;
|
||
left: 50%;
|
||
transform: translateX(-50%); */
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: flex-end;
|
||
/* height: 500px; */
|
||
}
|
||
|
||
.hear {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.qr {}
|
||
|
||
.tip {
|
||
font-weight: bold;
|
||
border-bottom: 0.16rem dashed gray;
|
||
}
|
||
|
||
.text2-title {
|
||
display: flex;
|
||
font-size: 0.6rem;
|
||
}
|
||
|
||
.text2-content {
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: space-around;
|
||
margin-top: 0;
|
||
}
|
||
|
||
.text2-item {
|
||
/* display: flex;
|
||
padding-left: 0; */
|
||
float: left;
|
||
/* 设置元素浮动 */
|
||
}
|
||
|
||
ul {
|
||
padding-inline-start: 10px;
|
||
}
|
||
|
||
li {
|
||
text-align: left;
|
||
/* 保持文本从左边开始 */
|
||
}
|
||
|
||
.text2 {
|
||
/* height: 40%; */
|
||
/* line-height: 1rem; */
|
||
/* font-size: 0.5rem; */
|
||
font-weight: bold;
|
||
}
|
||
|
||
.text {
|
||
/* height: 40%; */
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 1rem;
|
||
font-weight: bold;
|
||
}
|
||
|
||
.foot {
|
||
font-size: 1.3rem;
|
||
font-weight: bold;
|
||
}
|
||
|
||
.down-up {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
}
|
||
|
||
|
||
|
||
.downDiv {
|
||
/* height: 100%; */
|
||
|
||
}
|
||
|
||
.downHear {
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: space-between;
|
||
/* height: 15%; */
|
||
font-weight: bold;
|
||
border-bottom: 1px solid gray;
|
||
|
||
}
|
||
|
||
.home {
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
|
||
.nav {
|
||
background-color: rgb(0, 128, 255);
|
||
width: 100%;
|
||
height: 3.33rem;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.iconBack {
|
||
position: absolute;
|
||
left: 0;
|
||
font-size: 2.08rem;
|
||
}
|
||
|
||
.warnToken {
|
||
position: absolute;
|
||
font-size: 2.08rem;
|
||
}
|
||
|
||
.pageName {}
|
||
|
||
.tou {
|
||
margin: 0;
|
||
color: white;
|
||
}
|
||
</style> |