1005 lines
25 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="fullHeight">
<headers :showBack="true">
<view class="headerName">
塔吊详情信息
</view>
</headers>
<view class="menuBox">
<view class="menuItem" @click="changeMenu(0)" :class="tabIndex==0?'active':''">
数据总览
</view>
<view class="menuItem" @click="changeMenu(1)" :class="tabIndex==1?'active':''">
数据趋势
</view>
<view class="menuItem" @click="changeMenu(2)" :class="tabIndex==2?'active':''">
报警列表
</view>
</view>
<!-- 数据总览 -->
<view class="" v-if="tabIndex==0" style="padding-bottom:20rpx">
<view class="" style="text-align: center;">
<view class="warningText">{{warningText}}</view>
<view class="towerRunBox">
<image src="../../../static/towerCrane/towerBG.png" alt="" ref="towerBG" class="towerBG" />
<image src="../../../static/towerCrane/1.png" alt="" v-show="hideGoods" class="xMove" id="xMove"
:style="{ top: '100rpx', left: coordData.coordX + 'px',height:'24rpx',width:'52rpx' }" />
<image src="../../../static/towerCrane/line.png" alt="" class="lines" id="line" v-show="hideGoods"
:style="{
'top': '58px',
'width':'20rpx',
'height': lineHeight,
'left': lineLeft
}" />
<view class="moveBox" id="moveBox" :style="{'top': hockTop,'left': hockLeft}" v-show="hideGoods">
<image src="../../../static/towerCrane/hock.png" style="width:36px; height:74px;" alt="" />
</view>
</view>
</view>
<view class="blockBox">
<view class="realTimeBox">
<view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.loading}} kg
</view>
<view class="label">载重</view>
</view>
</view>
<view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.height}} m
</view>
<view class="label">高度</view>
</view>
</view>
<view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.windspeed}} m/s
</view>
<view class="label">风速</view>
</view>
</view>
<!-- <view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.windRatio?realTimeData.windRatio:0}} %
</view>
<view class="label">风速百分比</view>
</view>
</view> -->
<view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.angle}} °
</view>
<view class="label">角度</view>
</view>
</view>
<view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.torqueRatio?realTimeData.torqueRatio:'0'}} %
</view>
<view class="label">力矩百分比</view>
</view>
</view>
<view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.loadRatio?realTimeData.loadRatio:'0'}} %
</view>
<view class="label">荷载比</view>
</view>
</view>
<view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.obliguity?realTimeData.obliguity:0}} °
</view>
<view class="label">倾角</view>
</view>
</view>
<view class="item">
<view class="itemInner">
<view class="num">
{{detailData.forearmLength}} m
</view>
<view class="label">前臂长</view>
</view>
</view>
<view class="item">
<view class="itemInner">
<view class="num">
{{detailData.towerHeight}} m
</view>
<view class="label">塔身高</view>
</view>
</view>
<view class="item">
<view class="itemInner">
<view class="num">
{{detailData.posteriorArmLength}} m
</view>
<view class="label">后臂长</view>
</view>
</view>
<!-- <view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.biasAngle?realTimeData.biasAngle:0}} °
</view>
<view class="label">前倾角</view>
</view>
</view> -->
<view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.ranger}} m
</view>
<view class="label">幅度</view>
</view>
</view>
<!-- <view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.biasAngleRatio?realTimeData.biasAngleRatio:0}} %
</view>
<view class="label">倾角比例</view>
</view>
</view> -->
<!-- <view class="item">
<view class="itemInner">
<view class="num">
{{realTimeData.alarmName?realTimeData.alarmName:'无'}}
</view>
<view class="label">预警</view>
</view>
</view> -->
</view>
</view>
<!-- <view class="selectContent" v-if="videoList.length>0">
<picker mode="selector" :range="videoList" @change="changeVideo" range-key="videoName" :value="videoIndex">
<view class="selectVideoBox">
<text class="videoName">{{videoList[videoIndex].videoName}}</text>
<uni-icons2 class="arrow" type="arrowdown" size="15"></uni-icons2>
</view>
</picker>
</view>
<view class="moudleTitle2">
实时视频
</view>
<video class="videoBox" id="myVideo" :src="videoUrl" controls autoplay></video> -->
<view class="moudleTitle2">
司机列表
</view>
<view class="blockBox" style="margin: 0px 30rpx 30rpx;">
<view class="tableBox">
<view class="tableHead">
<view class="item">姓名</view>
<view class="item">联系电话</view>
<view class="item">照片</view>
</view>
<view v-if="driverList.length>0" v-for="(item,index) in driverList" :key="index" class="tableBody">
<view class="item">{{item.workerName}}</view>
<view class="item">{{item.phoneNumber}}</view>
<view class="item">
<image :src="url_config+'image/'+item.fieldAcquisitionUrl" class="profile_photo"
@click="previewImg(url_config+'image/'+item.fieldAcquisitionUrl)"></image>
</view>
</view>
<view v-if="driverList.length==0" style="text-align: center; margin-top: 16rpx; color: #999;">暂无数据
</view>
</view>
</view>
</view>
<view class="" v-if="tabIndex==1">
<view class="blockBox">
<view class="chartTitle">
吊重 (kg)
</view>
<u-charts canvas-id="lineChartLoad" chartType="line" :opts="lineChartData1" ref="lineChartLoad"
:cWidth="315" :cHeight="200" :legends="false" />
</view>
<view class="blockBox">
<view class="chartTitle">
幅度 (m)
</view>
<u-charts canvas-id="lineChartRange" chartType="line" :opts="lineChartData2" ref="lineChartRange"
:cWidth="315" :cHeight="200" :legends="false" />
</view>
</view>
<view class="" v-if="tabIndex==2">
<!-- <view class="selectContent selectContent2">
<picker mode="date" @change="changeDate" :value="searchDate" style="margin-left:30rpx">
<view class="selectVideoBox">
<text class="videoName">{{searchDate}}</text>
<uni-icons2 class="arrow" type="arrowdown" size="15"></uni-icons2>
</view>
</picker>
</view> -->
<view v-if="typeState.length>0" class="flex evenly typeState">
<view :class="statusSelect==item.val?'this_class':''" v-for="(item,index) in typeState" :key="index" @click="typeStateEve(item.val)">
{{item.txt}}
</view>
</view>
<view class="blockBox" v-for="(item,index) in alarmList" :key="index" @click="toDetail(item.id)">
<view class="" style="position: absolute;right: 40rpx;top:40rpx;font-size:28rpx;">
<text :style="item.status==1?'color: #00aaff;':item.status==2?'color:#00aaff':item.status==3?'color:#00aa00':'color:#00aa00'">{{status[item.status]}}</text>
</view>
<view class="alarmItem">
<text class="label">设备名称</text><text class="value">{{item.devName}}</text>
</view>
<view class="alarmItem">
<text class="label">设备编号</text><text class="value">{{item.devSn}}</text>
</view>
<view class="alarmItem">
<text class="label">司机姓名</text><text class="value">{{item.driverName}}</text>
</view>
<view class="alarmItem">
<text class="label">司机身份证号</text><text class="value">{{item.driverIdCard}}</text>
</view>
<view class="alarmItem">
<text class="label" >环境防撞报警</text><text :style="filterAlarmColor[item.environmentAlarm]" class="value">{{filterAlarm(item.environmentAlarm)}}</text>
</view>
<view class="alarmItem">
<text class="label">高度上限位报警</text><text :style="filterAlarmColor[item.heightAlarm]" class="value">{{filterAlarm(item.heightAlarm)}}</text>
</view>
<view class="alarmItem">
<text class="label">幅度外限位报警</text><text :style="filterAlarmColor[item.maxRangeAlarm]" class="value">{{filterAlarm(item.maxRangeAlarm)}}</text>
</view>
<view class="alarmItem">
<text class="label">幅度内限位报警</text><text :style="filterAlarmColor[item.minRangeAlarm]" class="value">{{filterAlarm(item.minRangeAlarm)}}</text>
</view>
<view class="alarmItem">
<text class="label">力矩报警</text><text :style="filterAlarmColor[item.momentAlarm]" class="value">{{filterAlarm(item.momentAlarm)}}</text>
</view>
<view class="alarmItem">
<text class="label">多机防撞报警</text><text :style="filterAlarmColor[item.multiAlarm]" class="value">{{filterAlarm(item.multiAlarm)}}</text>
</view>
<view class="alarmItem">
<text class="label">逆时针回转限位报警</text><text :style="filterAlarmColor[item.negAngleAlarm]" class="value">{{filterAlarm(item.negAngleAlarm)}}</text>
</view>
<view class="alarmItem">
<text class="label">倾角报警</text><text :style="filterAlarmColor[item.obliguityAlarm]" class="value">{{filterAlarm(item.obliguityAlarm)}}</text>
</view>
<view class="alarmItem">
<text class="label">风速报警</text><text :style="filterAlarmColor[item.windSpeedAlarm]" class="value">{{filterAlarm(item.windSpeedAlarm)}}</text>
</view>
<view class="alarmItem">
<text class="label">塔机报警时间</text><text class="value">{{item.alarmTime}}</text>
</view>
</view>
<view class="placeholderBox" v-if="alarmList.length==0">
<image src="/static/noData.png" mode="" class="noDataImg"></image>
<view class="text">
暂无报警
</view>
</view>
</view>
</view>
</template>
<script>
import uCharts from '@/components/u-charts/component.vue';
import headers from "../../../components/headers/headers.vue"
import {
GetDateStr
} from "../../../static/js/util.js"
var frontArmLength = 345; //图片塔机臂长px
var height = 336; //图片塔机高度px
var imgLeftWidth = 80; //塔机图片司机距离左边距离px
var imgLeftHeight = 50; //塔机图片司机距离上边距离px
var realWidth = 0; //实际塔机臂长m
var realHeight = 0; //实际塔机高度m
var $moveBox;
var $xMove;
var $line;
// var $ratioW = 0.438; //实际图片宽度 496 - 显示宽度 345 = 比例 151/345
// var $ratioH = 0.436; //实际图片宽度 484 - 显示宽度 337 = 比例 147/337
var $ratioW = 0.695; //实际图片宽度 496 - 显示宽度 345 = 比例 151/345
// var $ratioH = 0.695; //实际图片宽度 484 - 显示宽度 337 = 比例 147/337
export default {
components: {
uCharts
},
data() {
return {
typeState:[{txt:'待发起',val:1},{txt:'已整改',val:3}],//statusSelect整改状态 1:待发起 ,2:待整改 3已整改
statusSelect:1,
status: {
1: "待发起",
2: "待整改",
3: "已整改"
},
userInfo: "",
devSn: "",
devId: "",
hockTop: 0,
hockLeft: 0,
lineHeight: 0,
lineLeft: 0,
moveLeft: 0,
projectDetail: '',
devIndex: 0,
realTimeData: {
loading: '--',
height: '--',
windspeed: '--',
windRatio: '--',
angle: '--',
torqueRatio: '--',
biasAngle: '--',
ranger: '--',
biasAngleRatio: '--',
alarmName: '--',
},
detailData: "",
alarmList: [],
searchDate: '',
lineChartData1: {
categories: [],
series: [{
name: "吊重",
data: []
}]
},
lineChartData2: {
categories: [],
series: [{
name: "幅度",
data: []
}]
},
tabIndex: 0,
videoUrl: '',
videoList: [],
videoIndex: 0,
driverList: [],
coordData: {
coordX: 0,
coordY: 0,
lineLength: 0,
},
hideGoods: true,
warningText: '',
onload:"",
filterAlarmColor:{
0:"color:#44AB47;",
1:"color:#FF3F33;",
2:'color:#ffaa00;'
}
};
},
onLoad(options) {
this.devSn = options.devSn;
this.devId = options.id;
realWidth = options.forearmLength;
realHeight = options.towerHeight;
this.userInfo = JSON.parse(uni.getStorageSync('userInfo'));
this.getRealTimeData();
this.getDevDetail();
this.tabIndex = 0;
this.onload=true;//开始加载
},
onShow() {
if(!this.onload){//防止执行两次
this.tabIndex = 2;
this.onload=true;
this.loadData()
}
if(this.userInfo.accountType==6){//整改人状态
this.typeState=[];
this.statusSelect=2;
}else{
this.typeState=[{txt:'待发起',val:1},{txt:'已整改',val:3}]
}
},
onHide() {
this.onload=false;
},
mounted() {
this.projectDetail = JSON.parse(uni.getStorageSync('projectDetail'))
this.searchDate = GetDateStr(0, '-');
this.$nextTick(() => {
// $moveBox = document.getElementById('moveBox')
// $xMove = document.getElementById('xMove')
// $line = document.getElementById('line')
})
// frontArmLength = document.getElementsByClassName('towerBG')[0].offsetWidth;
// height = document.getElementsByClassName('towerBG')[0].offsetHeight;
},
methods: {
typeStateEve(v){
this.statusSelect=v;
this.pageNo = 1;
this.alarmList =[];
this.getAlarmData();
},
toDetail(id) {
uni.navigateTo({
url: '/pages/towerCrane/towerCrane?id=' + id
})
},
filterAlarm(val) {
if (val == '0') {
return "正常"
} else if (val == 1) {
return "报警"
} else if (val == 2) {
return "预警"
}
},
previewImg(url) {
uni.previewImage({
urls: [url]
})
},
changeVideo(e) {
this.videoIndex = e.target.value
this.isHasVideo()
},
//判断设备有没有绑定视频
isHasVideo(val) {
var that = this
console.log(that.videoList)
if (that.videoList.length > 0) {
if (that.videoList[this.videoIndex].videoType == 2) {
that.videoUrl = that.videoList[this.videoIndex].liveRadioUrl
} else {
that.getPlayUrl()
}
}
},
//获取视频地址
getPlayUrl() {
var that = this
var videoInfo = that.videoList[this.videoIndex]
var json = {
itemId: that.videoList[this.videoIndex].itemId || that.videoList[this.videoIndex].id
}
if (videoInfo.videoType == 3) {
json.streamType = 1
json.type = 'rtsp' //rtsp或者hls
}
this.sendRequest({
url: "xmgl/videoItem/getVideoItemInfo",
data: json,
method: "post",
success(res) {
switch (videoInfo.videoType) {
case 1:
that.videoUrl = res.result.videoInfo.hdFlvAddress
break;
default:
that.videoUrl = res.result.videoInfo.url
break;
}
}
})
},
changeDate(e) {
this.searchDate = e.target.value
this.getAlarmData()
},
changeMenu(index) {
this.tabIndex = index;
this.loadData()
},
loadData() {
switch (this.tabIndex) {
case 0:
this.$nextTick(() => {
// $moveBox = document.getElementById('moveBox')
// $xMove = document.getElementById('xMove')
// $line = document.getElementById('line')
})
this.getRealTimeData()
this.getDevDetail()
break;
case 1:
this.getDustData()
break;
case 2:
this.getAlarmData()
break;
}
},
//获取数据趋势
getDustData() {
var that = this
this.sendRequest({
url: "xmgl/towerCurrentData/getTodayTowerCurrentDataList",
data: {
devSn: this.devSn
},
method: "POST",
success(res) {
var DATA = res.result
var xdata = [],
ydata1 = [],
ydata2 = [],
ydata3 = [],
ydata4 = [];
DATA.forEach(element => {
// console.log(element.reciveTime)
xdata.push(element.reciveTime.split(' ')[1])
ydata1.push(element.loading)
ydata2.push(element.ranger)
})
// console.log(xdata)
that.lineChartData1.categories = xdata
that.lineChartData2.categories = xdata
that.lineChartData1.series = [{
name: "吊重",
data: ydata1
}]
that.lineChartData2.series = [{
name: "幅度",
data: ydata2
}]
that.$refs.lineChartLoad.changeData('lineChartLoad', that.lineChartData1)
that.$refs.lineChartRange.changeData('lineChartRange', that.lineChartData2)
}
})
},
//获取报警列表
getAlarmData() {
var that = this
let qData = {
projectSn: this.projectDetail.projectSn,
pageNo: 1,
pageSize: 100,
// startTime: this.searchDate,
// endTime: this.searchDate,
devSn: this.devSn,
accountType: this.userInfo.accountType,
status:this.statusSelect
}
if (this.userInfo.accountType == 6) {
qData.pushPersonId=this.userInfo.userId
}
this.sendRequest({
url: "xmgl/towerAlarm/list",
data:qData,
method: "POST",
success(res) {
that.alarmList = res.result.records
}
})
},
// 获取设备详细
getDevDetail() {
var that = this
this.sendRequest({
url: "xmgl/tower/queryById",
data: {
id: this.devId
},
method: "POST",
success(res) {
// that.videoList = res.result.videoList
if (res.result.enableVideoUrl == 1) {
that.videoList = res.result.videoList;
that.isHasVideo()
} else {
if (res.result.videoUrl && res.result.videoUrl != 'null') {
that.videoList = JSON.parse(res.result.videoUrl);
that.videoUrl = that.videoList.url
} else {
that.videoList = []
}
}
that.driverList = res.result.towerDriverList
that.detailData = res.result
}
})
},
//获取实时数据
getRealTimeData() {
var that = this
this.sendRequest({
url: "xmgl/towerCurrentData/getNewestTowerCurrentData",
data: {
// projectSn: this.projectDetail.projectSn,
devSn: this.devSn
},
method: "POST",
success(res) {
if (res.result) {
that.realTimeData = res.result;
console.log(res.result)
var y = 0
var x = 0
if (res.result.ranger) {
x = parseFloat(res.result.ranger)
}
if (res.result.height) {
y = parseFloat(res.result.height)
}
that.move(x, y);
// that.move(100, 200);
that.hideGoods = true;
} else {
that.hideGoods = false;
that.realTimeData = {
loading: '--',
height: '--',
windspeed: '--',
windRatio: '--',
angle: '--',
torqueRatio: '--',
biasAngle: '--',
ranger: '--',
biasAngleRatio: '--',
alarmName: '--',
}
}
}
})
},
//计算 吊物 位置
move(x, y) {
console.log((x / realWidth) * frontArmLength - imgLeftWidth)
console.log(x)
console.log(y)
console.log(realWidth)
console.log(frontArmLength)
console.log(imgLeftWidth)
var xImg, yImg;
// if (x <= realWidth) {
// xImg = ((x / realWidth) * frontArmLength + imgLeftWidth);
// this.warningText=''
// if (y <= realHeight) {
// yImg = (y / realHeight) * height + imgLeftHeight;
// this.warningText=''
// } else {
// yImg = height + imgLeftHeight
// this.warningText='当前设备高度参数错误'
// }
// } else {
// xImg = frontArmLength + imgLeftWidth;
// this.warningText='当前设备前臂长参数错误'
// if (y <= realHeight) {
// yImg = (y / realHeight) * height + imgLeftHeight;
// } else {
// yImg = height + imgLeftHeight
// this.warningText='当前设备前臂长,高度参数错误'
// }
// }
if (x <= realWidth) {
// console.log(frontArmLength, realWidth)
xImg = ((x / realWidth) * frontArmLength) + 38
// xImg = (x / realWidth) * (frontArmLength - imgLeftWidth) + imgLeftWidth;
this.warningText = "";
} else {
// xImg = frontArmLength-imgLeftWidth;
xImg = 38
this.warningText = "当前设备前臂长参数错误";
}
// if(x==""){
// }
if (y <= realHeight) {
yImg = ((y / realHeight) * height) + 48
// yImg = ((realHeight-y) / realHeight) * (height-imgLeftHeight) + imgLeftHeight;
// this.warningText = "";
} else {
// yImg = height-imgLeftHeight;
yImg = 48
this.warningText = "当前设备高度参数错误";
}
// console.log(xImg)
// console.log(yImg)
// xImg = xImg*$ratioW;
// yImg = yImg*$ratioW;
console.log('有值吗',xImg)
console.log(yImg)
this.hockLeft = xImg - 6 + 'px';
this.hockTop = (yImg - 74) + 'px';
this.coordData.coordX = xImg;
this.lineLeft = xImg + 8 + 'px';
this.lineHeight = (yImg - 48 - 74) + 'px';
// this.lineHeight = yImg + 'px';
console.log(this.lineHeight)
// if($line.height==undefined){
// $line.style.height = 0 +'px'
// }
// console.log(this.hockLeft,this.hockTop,this.coordData.coordX,this.lineHeight)
},
}
}
</script>
<style lang="scss" scoped>
.this_class{
color: #007AFF;
}
.typeState{
height: 80rpx;
background-color: #fff;
font-size: 28rpx;
width: 100%;
}
.barBox {
background-color: #5181F6;
}
.menuBox {
display: flex;
align-items: center;
height: 36px;
font-size: 30rpx;
background-color: white;
margin-top: -1px;
position: relative;
z-index: 999;
border-bottom: 1px solid rgba(194, 194, 194, 0.2);
.menuItem {
flex: 1;
text-align: center;
&.active {
color: rgba(43, 141, 243, 1);
}
}
}
.blockBox {
position: relative;
box-shadow: 0 4px 24px 0px rgba(212, 220, 236, 0.69);
border-radius: 16rpx;
margin: 30rpx;
padding: 30rpx;
}
.numContent {
text-align: center;
}
.numBox {
width: 130px;
height: 100rpx;
border-radius: 16rpx;
background-image: linear-gradient(rgba(134, 145, 252, 1), rgba(16, 97, 254, 1));
font-size: 24rpx;
color: white;
text-align: center;
display: inline-block;
.num {
font-size: 30rpx;
margin: 10rpx 0 0px;
}
}
.numBox1 {
margin-right: 20rpx;
}
.selectContent {
text-align: center;
margin-top: 30rpx;
}
.selectVideoBox {
border: 1px solid rgba(42, 43, 91, 0.2);
border-radius: 36rpx;
height: 70rpx;
font-size: 30rpx;
display: inline-block;
.videoName {
padding: 0 24rpx 0 30rpx;
// border-right: 1px solid rgba(42, 43, 91, 0.2);
line-height: 70rpx;
height: 70rpx;
}
.arrow {
padding: 0 24rpx 0 4rpx;
}
}
.arrow {
margin-left: 20rpx;
}
.realTimeBox {
overflow: hidden;
.item {
float: left;
width: 33.33%;
.itemInner {
// box-shadow: 0 4px 24px 0px rgba(212, 220, 236, 0.69);
border: 1px solid rgba(220, 220, 220, 0.3);
margin: 3.10rpx;
font-size: 24rpx;
text-align: center;
padding: 7px 0;
}
.num {
font-size: 30rpx;
color: rgba(43, 141, 243, 1);
}
}
}
.alarmIcon {
width: 40rpx;
height: 40rpx;
}
.switchIcon {
width: 100rpx;
height: 29px;
}
.blockTitle {
text-align: center;
margin-top: 24rpx;
}
.tableBox {
font-size: 28rpx;
width: 100%;
.tableHead {
font-weight: bold;
display: flex;
border-bottom: 1px solid rgba(42, 43, 91, 0.1);
.item {
flex: 1;
padding: 0 0 20rpx;
text-align: center;
}
}
.tableBody {
display: flex;
align-items: center;
.item {
flex: 1;
text-align: center;
justify-content: center;
padding: 20rpx 0 0px;
}
}
}
.chartTitle {
font-size: 28rpx;
font-weight: 500;
margin-bottom: 30rpx;
}
.selectContent2 {
display: flex;
align-items: center;
justify-content: center;
}
.alarmItem {
font-size: 28rpx;
.label {
opacity: 0.6;
}
}
.profile_photo {
width: 60rpx;
height: 60rpx;
}
.moudleTitle2 {
font-size: 20rpx;
opacity: 0.69;
font-weight: 400;
margin: 30rpx 0;
text-align: center;
}
.videoBox {
width: calc(100% - 60rpx);
height: 225px;
margin: 0px 30rpx;
border-radius: 20rpx;
}
.towerRunBox {
text-align: center;
box-sizing: border-box;
// padding: 30rpx;
position: relative;
display: inline-block;
// margin: 30rpx auto;
}
.towerBG {
width: 345px;
height: 337px;
}
.moveBox,
.xMove,
.lines {
position: absolute;
left: 0;
top: 0;
transition: all 1s;
// display: none;
}
.lines,
.xMove {
top: 84rpx;
}
.lines {
width: 20rpx;
}
.warningText {
width: 100%;
font-size: 28rpx;
color: red;
text-align: center;
}
.flex {
display: flex;
align-items: center;
}
.center {
justify-content: center;
}
.between {
justify-content: space-between;
}
.warp {
flex-wrap: wrap;
}
.evenly {
justify-content: space-evenly;
}
</style>