智慧工地前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

242 lines
6.5 KiB

<script setup>
import { reactive, onMounted } from 'vue'
import { getRtspUrl, getDevicePage, getPlaybackByTimeRtspUrl, getRegularVideoRecords } from './api'
import { ElMessage } from 'element-plus'
const state = reactive({
currentCameraIndex: 0,
cameraList: [],
cameraInfo: null
})
const switchCamera = (index) => {
state.currentCameraIndex = index;
startVideo();
}
const startVideo = () => {
let index = state.currentCameraIndex;
let channelCode = state.cameraList[index].units && state.cameraList[index].units[0].channels[0].channelCode;
if (!channelCode) {
ElMessage({
message: '设备异常',
type: 'error'
})
return;
}
getRtspUrl({
data: {
channelId: channelCode,
dataType: "1",
streamType: "1"
}
}).then(res => {
state.cameraInfo = {
channelId: channelCode,
url: res.data.url,
token: res.data.token
}
//发送消息给子页面
let video = document.getElementById('video')
video.contentWindow.postMessage({
type: 'startVideo',
data: { ...state.cameraInfo }
}, '*')
})
}
const playRecord = (date) => {
let index = state.currentCameraIndex;
let channelCode = state.cameraList[index].units && state.cameraList[index].units[0].channels[0].channelCode;
if (!channelCode) {
ElMessage({
message: '设备异常',
type: 'error'
})
return;
}
//获取当日的开始时间和结束时间
let current = new Date(date);
let startTime = parseInt(current.setHours(0, 0, 0, 0) / 1000);
let endTime = parseInt(current.setHours(23, 59, 59, 999) / 1000);
getRegularVideoRecords({
data: {
channelId: channelCode,
recordSource: '1',
startTime,
endTime,
streamType: "1",
recordType: "1"
}
}).then(res => {
console.log('res :>> ', res);
let records = res.data.records;
getPlaybackByTimeRtspUrl({
data: {
channelId: records[0].channelId,
recordSource: records[0].recordSource,
startTime: records[0].startTime,
endTime: records[0].endTime,
streamType: records[0].streamType,
recordType: records[0].recordType
}
}).then(res => {
let recordInfo = {
records: records,
channelId: records[0].channelId,
url: res.data.url,
token: res.data.token,
startTime: records[0].startTime,
endTime: records[0].endTime,
streamType: records[0].streamType,
recordType: records[0].recordType
}
//发送消息给子页面
let video = document.getElementById('video')
console.log('video :>> ', video);
video.contentWindow.postMessage({
type: 'playRecord',
data: JSON.parse(JSON.stringify(recordInfo))
}, '*')
})
})
}
onMounted(() => {
getDevicePage({
"pageNum": 1,
"pageSize": 100,
}).then((res) => {
state.cameraList = res.data.pageData
const index = state.cameraList.findIndex(item => item.isOnline === 1);
state.currentCameraIndex = index
}).catch((err) => {
});
// 监听子页面的消息
window.addEventListener('message', (event) => {
console.log('event :>> ', event.data);
if (event.data.type === 'startVideo') {
startVideo();
} else if (event.data.type === 'playRecord') {
playRecord(event.data.date);
}
});
})
</script>
<template>
<div class="app-containertwo">
<!-- 监控摄像头名称列表 -->
<div class="camera-name-list">
<!-- -->
<div :class="state.currentCameraIndex === index ? 'active' : ''" @click="switchCamera(index)" class="camera-item"
v-for="(camera, index) in state.cameraList" :key="index">
<div style="width:4.375rem;margin-right: 1.25rem;text-align: center;position: relative;">
<texttooltip :content="camera.deviceName" :class="state.currentCameraIndex === index ? 'wid202' : 'wid201'"
refName=" tooltipOverd"></texttooltip>
<el-tag style="scale: 0.7;position: absolute;top:-1.25rem;right:-.9375rem;border-radius: 1.25rem;"
:type="camera.isOnline == 1 ? 'success' : 'danger'">{{ camera.isOnline == 1 ? '在线' : '离线' }}</el-tag>
</div>
</div>
<!-- <template v-for="(camera, index) in state.cameraList" :key="index">
<span class="camera-name" @click="switchCamera(index)" :class="{ active: state.currentCameraIndex === index }">
{{ camera.deviceName }}
</span>
</template> -->
</div>
<!-- 摄像头展示区域 -->
<div class="camera-display">
<iframe v-if="state.cameraList.length > 0" id="video" src="/dahua/demo.html?real=true"
style="width:100%;height:100%;" frameborder="0"></iframe>
</div>
</div>
</template>
<style scoped>
.wid202 {
background: linear-gradient(90deg, #FFFFFF 0%, #FFF8C2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.wid201 {
background: linear-gradient(90deg, #FFFFFF 0%, #45B1FE 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.camera-item {
cursor: pointer;
width: 100%;
background: url('../../assets/images/videoitembj.png') no-repeat;
background-size: 100% 100%;
/* margin-top: -1.25rem; */
display: flex;
flex-shrink: 0;
height: 3.125rem;
align-items: center;
justify-content: flex-end;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 400;
font-size: .875rem;
margin-bottom: .625rem;
color: #fff;
}
.app-containertwo {
display: flex;
flex-direction: row;
align-items: center;
height: 100%;
padding: 0;
}
.camera-name-list {
width: 11.5625rem;
height: 100%;
margin-right: 1.25rem;
overflow-y: auto;
overflow-x: hidden;
}
.camera-name {
padding: .5rem 2rem;
border: .0625rem solid #ccc;
border-radius: 1.25rem;
cursor: pointer;
transition: all 0.3s ease;
background-color: white;
position: relative;
}
.camera-name:hover {
background-color: #e0e0e0;
transform: translateY(-.125rem);
}
.active {
background: url('../../assets/images/videoitembjtwo.png') no-repeat;
background-size: 100% 100%;
/* background-color: #2196F3;
color: white;
border-color: #2196F3; */
}
.camera-display {
width: 100%;
height: 100%;
box-sizing: border-box;
}
video {
width: 100%;
height: auto;
}
p {
text-align: center;
color: #666;
font-size: 1.125rem;
}
</style>