BarracksDataTwo/src/views/home/index.vue

907 lines
23 KiB
Vue

<template>
<NAV />
<!-- 侧边栏显隐-->
<div class="aside">
<ul class="aside-ul">
<li class="aside-li" :key="index" v-for="(item,index) in asideList" @click="toggleDevice(index)">
<img :src="deviceIndex===index?item.select:item.default" alt="" srcset="">
<img class="aside-li-msg" v-if="deviceIndex===index" :src="item.rightImg" alt="" srcset="">
</li>
</ul>
</div>
<div id="three3D">
<Three />
</div>
<div class="container">
<div class="container-left">
<div class="container-left-box">
<!-- 报警列表 -->
<div class="public-title">
<span class="font">报警列表</span>
<span class="more">
</span>
</div>
<div class="alarmList">
<section class="regional" v-for="item in alarmList.regional">
<div class="alarmList-type">
区域入侵
</div>
<div class="alarmList-regional">
<div style="width: 2.75rem; height:2.75rem;display: flex;align-items: center">
<el-image style="width: 2.75rem; height: 2.75rem" :src="cameraUrl" fit="cover" />
</div>
<div class="alarmList-regional-msg">
<div>
<i class="drop"></i>
<span>位置:</span>
<span>{{item.address}}</span>
</div>
<div>
<i class="drop"></i>
<span>时间:</span>
<span>{{item.date}}</span>
</div>
</div>
</div>
</section>
<section class="humidity" v-for="item in alarmList.humidity">
<div class="alarmList-type">
温湿度告警
</div>
<div class="alarmList-content">
<div>
<i class="drop"></i>
<span>当前温度:</span>
<span>{{item.humidity}}</span>
</div>
<div>
<i class="drop"></i>
<span>报警温度:</span>
<span>{{item.alarmHumidity}}</span>
</div>
<div>
<i class="drop"></i>
<span>位置:</span>
<span>{{item.address}}</span>
</div>
<div>
<i class="drop"></i>
<span>时间:</span>
<span>{{item.date}}</span>
</div>
</div>
</section>
<section class="urgent" v-for="item in alarmList.urgent">
<div class="alarmList-type">
紧急告警
</div>
<div class="alarmList-content">
<div>
<i class="drop"></i>
<span>当前温度:</span>
<span>{{item.humidity}}</span>
</div>
<div>
<i class="drop"></i>
<span>报警温度:</span>
<span>{{item.alarmHumidity}}</span>
</div>
<div>
<i class="drop"></i>
<span>位置:</span>
<span>{{item.address}}</span>
</div>
<div>
<i class="drop"></i>
<span>时间:</span>
<span>{{item.date}}</span>
</div>
</div>
</section>
</div>
<div class="public-title">
<span class="font">钥匙柜状态总览</span>
<span class="record-icon">
</span>
</div>
<!-- 钥匙柜数据 -->
<div class="keyword">
<ul class="keyword-state">
<li v-for="(item,index) in keywordState">
<i :class="'keyword-state-icon'+index"></i>
<span>{{item}}</span>
</li>
</ul>
<section v-for="(item,index) in keywordList" class="keyword-item" :class="'keyword-item-state'+item.keyState">
<span>{{item.keyCapturing}}号锁位</span>
<span class="position">{{item.position}}</span>
</section>
</div>
<!-- 门禁进入实况-->
<div class="access-title">
<span>门禁进入实况</span>
</div>
<div class="access-control">
<el-collapse v-model="activeNames">
<el-collapse-item :title="item.doorName" :name="item.doorName" v-for="item in doorNames">
<el-timeline>
<el-timeline-item v-for="(activity, index) in item.data" :key="index">
<p style="display: flex;justify-content: space-between">
<span v-if="activity.inAndOutType"
style="margin-left: 0.5rem">
{{ activity.personName
}}
<span style="margin-left: 0.5rem;color: rgba(233, 244, 255, 0.60)">{{
activity.inAndOutType == -1
? "出库房"
: activity.inAndOutType == 1
? "进入库房"
: "未知"
}}</span>
</span>
<span style="color: rgba(0, 221, 255, 1);font-size: .75rem">{{ activity.eventTime }}</span>
</p>
<!-- <div class="enterImg">-->
<!-- <img :src="'https://192.168.3.3:443' + activity.picUri" alt="" />-->
<!-- </div>-->
</el-timeline-item>
</el-timeline>
</el-collapse-item>
</el-collapse>
</div>
</div>
</div>
<div class="container-right">
<div class="container-right-box">
<!-- 排班表 -->
<div class="public-title">
<span class="font">排班表</span>
<span class="more">
</span>
</div>
<div class="schedule-date">
<p>
<i class="drop"></i>
日期:{{schedule.date}}
</p>
<p style="margin-left: 2.37rem">
<i class="drop"></i>
时间:{{schedule.day}}
</p>
<p>
<i class="drop"></i>
星期:{{schedule.week}}
</p>
</div>
<div class="schedule-person">
<section v-for="(item,index) in schedule.person" class="schedule-person-item">
</section>
</div>
<!-- 巡更线监控 -->
<div class="public-title">
<span class="font">巡更线监控</span>
</div>
<div class="patrol-line">
<el-table :data="tableData" style="width: 100%" stripe :row-class-name="getRowColor">
<el-table-column prop="position" min-width="25%" label="巡更点" show-overflow-tooltip />
<el-table-column prop="state" min-width="25%" label="巡更状态">
<template #default="scope">
<div>
<!-- <i class="qiu-icon" :style="'background-color:' + getColor(scope.row.state)"></i>{{
getFont(scope.row.state) }} -->
<p><i class="qiu-icon" :style="'background-color:' + getColor(scope.row.state)"></i>{{
fontState[parseInt(scope.row.state)] }}</p>
</div>
</template>
</el-table-column>
<el-table-column prop="history" min-width="55%" label="打卡记录" show-overflow-tooltip />
</el-table>
</div>
</div>
</div>
</div>
<!-- 底部-->
<div class="footer">
<ul class="footer-ul">
<li class="footer-ul-li" v-for="(item,index) in footerList" @click="dialogShow=true">
<img :src="item.default" alt="">
</li>
</ul>
</div>
<!-- 底部点击弹框 -->
<Dialog @close="closeHandle" v-if="dialogShow"/>
</template>
<script setup>
import getPath from "@/utils/getPath.js";
import Three from '@/components/Three.vue'
import {ref} from 'vue'
import cameraUrl from '@/assets/images/camera.png'
import NAV from '@/components/nav.vue'
import Dialog from '@/components/dialog.vue'
// 侧边栏
const asideList = ref([
{
default:getPath.store,
select:getPath.storeSelect,
rightImg:getPath.storePrompt,
},
{
default:getPath.monitorPoint,
select:getPath.monitorPointSelect,
rightImg:getPath.monitorPointPrompt,
},
{
default:getPath.alarmHost,
select:getPath.alarmHostSelect,
rightImg:getPath.alarmHostPrompt,
},
{
default:getPath.water,
select:getPath.waterSelect,
rightImg:getPath.waterPrompt,
},
{
default:getPath.smoke,
select:getPath.smokeSelect,
rightImg:getPath.smokePrompt,
},
{
default:getPath.humidity,
select:getPath.humiditySelect,
rightImg:getPath.humidityPrompt,
},
{
default:getPath.accessControl,
select:getPath.accessControlSelect,
rightImg:getPath.accessControlPrompt,
},
])
// 底部栏
const footerList = ref([
{title:'首页',default:getPath.home,select:getPath.homeSelect},
{title:'温湿度记录',default:getPath.record,select:getPath.recordSelect},
{title:'枪支离位报警',default:getPath.guns,select:getPath.gunsSelect},
{title:'视频监控',default:getPath.monitor,select:getPath.monitorSelect},
{title:'运维状况',default:getPath.operation,select:getPath.operationSelect}
])
// 报警列表
const alarmList = ref({
regional:[
{
address:'东6厂房西侧摄像头',
date:'2022-07-18 12:02:56'
}
],
humidity:[
{
alarmHumidity:'40℃',
humidity:'40℃',
address:'西3区厂房',
date:'2022-07-18 12:02:56'
}
],
urgent:[
{
alarmHumidity:'40℃',
humidity:'40℃',
address:'西3区厂房',
date:'2022-07-18 12:02:56'
}
]
})
// 钥匙柜
const keywordState = ref(['在位','不在位'])
// 钥匙柜
const keywordList = ref([
{
keyCapturing: "1",
keyState: "1",
},
{
keyCapturing: "2",
keyState: "1",
},
{
keyCapturing: "3",
keyState: "1",
},
{
keyCapturing: "4",
keyState: "1",
},
{
keyCapturing: "5",
keyState: "0",
position: "李柳柳取走",
},
{
keyCapturing: "6",
keyState: "0",
position: "李柳柳取走",
},
{
keyCapturing: "7",
keyState: "0",
position: "李柳柳取走",
},
{
keyCapturing: "8",
keyState: "1",
},
{
keyCapturing: "9",
keyState: "1",
},
{
keyCapturing: "10",
keyState: "1",
},
{
keyCapturing: "11",
keyState: "1",
},
{
keyCapturing: "12",
keyState: "1",
},
]);
// 门禁进入实况
const activeNames = ref([])
const doorNames = ref([
{
doorName:'1号仓库',
data:[
{personName:'张集网',eventTime:'12:27',inAndOutType:-1},{personName:'张集网',eventTime:'12:27',inAndOutType:-1},{personName:'张集网',eventTime:'12:27',inAndOutType:-1}
]
},
{
doorName:'2号仓库',
data:[
{personName:'张集网',eventTime:'12:27',inAndOutType:-1},{personName:'张集网',eventTime:'12:27',inAndOutType:-1}
]
}
])
// 排班表
const schedule = ref({
date:'2022-07-08',
week:'周日',
day:'18:04:55',
person:[
{},
{},
{},
]
})
// 巡更线
const tableData = ref([
{
position: "巡更点1",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点2",
state: "0",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点3",
state: "2",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点4",
state: "3",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点5",
state: "4",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点6",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点7",
state: "2",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点8",
state: "2",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点9",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点10",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点10",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点10",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点10",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点10",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点10",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点10",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点10",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
{
position: "巡更点10",
state: "1",
history: "刘七七 2020/06/08 14:27:11",
},
]);
// 状态文字
const fontState = ref(['准时','早巡','晚巡','补漏巡','漏巡'])
// 获取状态颜色
function getColor(state) {
if (state === "1" || state === "2") {
return "#f05657";
} else if (state === "4" || state === "3") {
return "#FFBF00";
} else if (state === "0") {
return "#52e76f";
}
}
// 弹窗的显影
const dialogShow = ref(false)
function closeHandle(e){
dialogShow.value = false
}
const deviceIndex = ref(0)
// 侧边栏点击事件控制three中设备显隐
function toggleDevice(index){
deviceIndex.value = index
}
</script>
<style lang="scss" scoped>
.aside{
//height: vh(380);
width: vw(44);
position: fixed;
bottom: vh(81);
left:vw(456);
z-index:99;
&-li{
width: 100%;
position: relative;
margin-bottom: .6rem;
&-msg{
position: absolute;
left: 107%;
top: 0;
}
}
}
//公共小圆点
.drop{
margin-right: 0.5rem;
width: 0.8rem;
display: inline-block;
height: 0.8rem;
background-image: url('@/assets/images/drop.png');
}
.container {
width: 100%;
height: 100%;
display: flex;
justify-content: space-between;
&-left, &-right {
padding-top: vw(104);
width: vw(380);
height: 100%;
position: relative;
&-box {
width: 100%;
height: 100%;
}
}
//标题
.public-title,.access-title{
height:vh(40);
width: 108%;
position: relative;
right: 4%;
display: flex;
justify-content: space-between;
padding-left: 3.5rem;
padding-right: 1rem;
align-items: center;
box-sizing: border-box;
background-image: url('@/assets/images/title-box.png');
span:nth-child(1){
font-family: pangmen;
font-size: 1.625rem;
}
.more,.record-icon{
background-image: url('@/assets/images/checkMore.png');
background-size: 100% 100%;
width: 4.25rem;
height: 1.5rem;
}
.record-icon{
background-image: url('@/assets/images/record-icon.png');
}
}
.access-title{
margin-top: 0.5rem;
background-image: url('@/assets/images/door-title.png');
}
&-left {
background-image: url('@/assets/images/left-mask.png');
padding-left: 3.5rem;
background-size: 100% 100%;
//报警列表
.alarmList{
width: 100%;
height: vh(364);
margin-bottom: 1rem;
display: flex;
flex-wrap: wrap;
align-content: space-evenly;
&-type{
margin-top: .75rem;
margin-left: 1.3rem;
color: rgba(255, 255, 255, 1);
}
//温湿度告警、紧急告警
&-content{
display: flex;
flex-wrap: wrap;
padding-left: .7rem;
align-items: center;
box-sizing: border-box;
align-content: space-evenly;
font-size: 0.875rem;
height: 70%;
color:rgba(189, 220, 248, 1);
}
&-content>div:nth-child(2n-1){
width: 40%;
}
&-content>div>span:nth-of-type(1){
color: rgba(88, 174, 247, 1);
}
section{
width: 100%;
height: 30%;
background-image: url('@/assets/images/alarm-item.png');
}
// 区域入侵
&-regional{
align-items: center;
display: flex;
font-size: 0.875rem;
color:rgba(189, 220, 248, 1);
padding-left: .7rem;
height: 70%;
&-msg{
height: 100%;
margin-left: .75rem;
display: flex;
flex-wrap: wrap;
align-content: space-evenly;
}
}
}
// 钥匙柜
.keyword{
width: 100%;
//background-color: #fff;
height: vh(220);
&-state{
display: flex;
justify-content: flex-end;
font-size: .75rem;
margin: 1rem 0;
&-icon0,&-icon1{
width: 0.875rem;
height: .875rem;
background-size: 100% 100%;
display: inline-block;
vertical-align: middle;
margin-right: .5rem;
}
&-icon0{
background-image: url('@/assets/images/has.png');
}
&-icon0 + span{
color: rgba(0, 220, 183, 1);
}
&-icon1 + span{
color: rgba(255, 255, 255, 1);
}
&-icon1{
margin-left: 2rem;
background-image: url('@/assets/images/noHas.png');
}
}
&-item{
float: left;
width: 23.5%;
font-size: .75rem;
height: 24%;
display: flex;
align-items: center;
padding: .5rem;
box-sizing: border-box;
justify-content: flex-end;
margin-bottom: .5rem;
background-image: url('@/assets/images/has-bg.png');
background-size: 100% 100%;
margin-right: .45rem;
position: relative;
.position{
top: 0;
position: absolute;
left: 50%;
white-space: nowrap;
font-size: .625rem;
transform: translate(-50%);
}
&-state1{
background-image: url('@/assets/images/has-bg.png');
color: rgba(0, 237, 197, 1);
}
&-state0{
color: rgba(255, 255, 255, 1);
background-image: url('@/assets/images/noHas-bg.png');
}
}
&-item:nth-of-type(4n){
margin-right: 0;
}
}
//门禁进入实况
.access-control{
margin-top: 1rem;
height: vh(175);
overflow-y: scroll;
}
.access-control::-webkit-scrollbar{
display: none;
}
}
&-right {
background-image: url('@/assets/images/right-mask.png');
padding-right: 3.5rem;
background-size: 100% 100%;
.schedule-date{
display: flex;
flex-wrap: wrap;
align-content: space-between;
padding: 0.6rem 0.8rem;
box-sizing: border-box;
background-image: url('@/assets/images/schedule-date.png');
width: 100%;
height: vh(80);
margin:1rem 0;
}
.schedule-person{
&-item{
width: 30%;
height: 100%;
background-image: url('@/assets/images/schedule-person.png');
background-size: 100% 100%;
}
justify-content: space-between;
height: vh(160);
width: 100%;
display: flex;
margin-bottom: 1.8rem;
}
}
}
.footer {
width: 100%;
height: vh(26);
position: absolute;
bottom: 0;
background-image: url('@/assets/images/bottom.png');
justify-content: center;
&-ul{
width: vw(800);
display: flex;
position: absolute;
top: -100%;
left: 50%;
transform: translate(-50%);
&-li{
margin-left: -1.25rem;
cursor: pointer;
}
&-li:nth-child(1){
margin-left: 0;
}
}
}
//巡更线列表
.patrol-line{
height: vh(540);
width: 100%;
margin-top: 1rem;
.qiu-icon {
display: inline-block;
width: 0.5rem;
height: 0.5rem;
margin-right: 0.3rem;
border-radius: 50%;
}
}
:deep(.state2) {
color: #ffbf00;
}
:deep(.state1) {
color: #f05657;
}
:deep(.state3) {
color: #52e76f;
}
:deep(.el-table__row--striped) {
background-image: none !important;
}
:deep(tr.el-table__row td.el-table__cell) {
background-color: transparent !important;
}
:deep(.el-table__inner-wrapper::before) {
background-color: transparent !important;
}
:deep(.el-table .el-table__cell) {
padding: 0;
}
:deep(.el-table .cell) {
height: 100%;
line-height: 2.4rem;
}
:deep(.el-table tr),
:deep(.el-table),
:deep(.el-table th),
:deep(.el-table td) {
background-color: transparent;
}
:deep(.el-table__row) {
height: 2.4rem;
}
:deep(.el-table) {
color: rgba(233, 244, 255, 1);
font-size: 0.8rem;
height: 100%;
}
:deep(.el-table thead){
color: rgba(255, 255, 255, 1);
font-size: 0.8rem;
background-image: url('@/assets/images/table-header.png');
height: 2rem;
line-height: 2rem;
font-weight: normal;
}
:deep(.el-table th.el-table__cell.is-leaf),
:deep(.el-table td.el-table__cell) {
border-color: transparent;
}
//门禁
:deep(.el-collapse-item__header){
height: 1.75rem;
padding-left: 0.625rem;
font-size: 1rem;
box-sizing: border-box;
border: none;
background-color: transparent;
color: rgba(233, 244, 255, 1);
background-image: url('@/assets/images/door-device.png');
}
:deep(.el-collapse-item__content){
background-color: transparent;
border: none !important;
font-size: 1rem;
padding-bottom: 0;
}
:deep(.el-collapse-item__wrap){
background-color: transparent;
border: none;
}
:deep(.el-collapse){
border: none;
//border-color: unset;
}
:deep(.el-timeline-item__wrapper) {
padding-left: 0.8rem;
}
:deep(.el-timeline) {
padding-left: 0.3rem;
box-sizing: border-box;
padding-top: 0.5rem;
}
:deep(.el-timeline-item) {
padding-bottom: 0.4rem;
}
:deep(.el-timeline-item__content) {
color:rgba(233, 244, 255, 1);
font-size: 0.875rem;
padding:0 1rem;
//background-image: url('@/assets/images/timeline.png');
//background-size: 100% 100%;
box-sizing: border-box;
}
:deep(.el-timeline-item__node--normal) {
width: 0.75rem;
height: 0.75rem;
left: 1px;
top: .3rem;
background-color: transparent;
background-image: url('@/assets/images/round-icon.png');
}
:deep(.el-timeline-item__tail) {
//border-color: #0a6594;
border:1px dashed #fff;
height: 59%;
top: 1.1rem;
left: 6px;
}
</style>