Browse Source

大屏修改

master
changtong 6 months ago
parent
commit
26c8ee57c5
  1. 12
      config/index.js
  2. 2
      src/common/axios.js
  3. 15
      src/router/router.js
  4. 447
      src/views/screen/car-park.vue
  5. 2
      src/views/screen/car-warring.vue
  6. 104
      src/views/screen/components/alarm/alarm-dig-two.vue
  7. 1
      src/views/screen/components/alarm/alarm-dig.vue
  8. 1
      src/views/screen/components/alarm/baseAlarmDig.vue
  9. 108
      src/views/screen/components/alarm/twoImageAlarm.vue
  10. 4
      src/views/screen/components/video-monitor/video-one.vue
  11. 50
      src/views/screen/emergency-screen-two.vue
  12. 553
      src/views/screen/fights-rawls.vue
  13. 2
      src/views/screen/person-warring.vue
  14. 6
      src/views/screen/smart-travel.vue

12
config/index.js

@ -12,21 +12,21 @@ module.exports = {
assetsPublicPath: '/',
proxyTable: {
'/api': {
// target: 'http://localhost:9990',
target: 'http://60.255.186.185:9024/api',
target: 'http://192.168.111.200:9990',
// target: 'http://60.255.186.185:9024/api',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
},
'/localImage': {
target: 'http://60.255.186.185:9024/',
// target: 'http://127.0.0.1:9990/',
// target: 'http://60.255.186.185:9024/',
target: 'http://localhost:9990/',
changeOrigin: true,
},
'/socket.io': {
// target: 'http://localhost:19990/',
target: 'http://60.255.186.185:9024/',
target: 'http://localhost:19990/',
// target: 'http://60.255.186.185:9024/',
changeOrigin: true,
}
},

2
src/common/axios.js

@ -6,7 +6,7 @@ import router from '@/router/index';
import store from "@/store/index";
//默认超时时间
axios.defaults.timeout = 20000;
axios.defaults.timeout = 60000;
axios.defaults.baseURL = window.gconfig.baseURL;

15
src/router/router.js

@ -187,15 +187,6 @@ export const screenRouter = [
title: "网格管理",
component: () => import("@/views/screen/grid-manage.vue")
},
{
path: "/car-park",
name: "car-park",
title: "停车场",
meta: {
open: true
},
component: () => import("@/views/screen/car-park.vue")
},
{
path: "/person-warring",
name: "person-warring",
@ -214,6 +205,12 @@ export const screenRouter = [
title: "烟火预警",
component: () => import("@/views/screen/emergency-extend.vue")
},
{
path: "/fights-rawls",
name: "fights-rawls",
title: "打架斗殴",
component: () => import("@/views/screen/fights-rawls.vue")
},
{
path: "/perimeter-screen",
name: "perimeter-screen",

447
src/views/screen/car-park.vue

@ -1,447 +0,0 @@
<template>
<!-- 停车场 -->
<div class="eb-container" ref="appRef">
<MainTitle class="title" :title="title"></MainTitle>
<div class="map-box">
<div class="title-box-1350" style="width: 1200px">
<span>停车场地图</span>
</div>
<div class="content-info">
<gis-map
pointType="停车场"
:point-list="pointList"
listItemKey="deviceName"
:zoom="9.9"
@currentPoint="currentPointFn"
></gis-map>
</div>
</div>
<div class="park-list" @click="changeVideo">
<div class="title-box-1350" style="width: 1200px">
<span>停车场列表</span>
</div>
<div class="content-info">
<vue-seamless-scroll
:data="parkList"
:class-option="leftOptionHover"
style="width: 100%; height: 100%; overflow: hidden"
>
<div
style="
height: 190px;
display: flex;
flex-direction: row;
"
>
<div
class="camera-picture-item"
v-for="(item, index) in parkList"
:data-index="index"
:key="index"
>
<div
:data-index="index"
style="
width: 100%;
height: 100%;
position: relative;
"
>
<img
:src="item.deviceImg"
style="width: 336px; height: 190px"
:data-index="index"
/>
<div class="pic-box" :data-index="index">
{{ item.deviceName }}
</div>
</div>
</div>
</div>
</vue-seamless-scroll>
</div>
</div>
<div class="right" v-if="rightLoad">
<div class="title-box-680" style="width: 600px">
<span>停车场详情</span>
</div>
<div class="content-info">
<div class="content-info-title">
<span
style="font-size: 24px; color: #fff; font-weight: bold"
>{{ currentPark.deviceName }}</span
>
<span style="font-size: 18px; color: #c9c9c9">停车场</span>
</div>
<div class="park-count-box">
<div
class="park-count-item"
style="background-color: rgba(40, 132, 146, 0.4)"
>
<div style="width: 100%; margin-top: 20px">总车位</div>
<div
style="
width: 100%;
font-size: 30px;
font-family: 'shiShangHeiTi';
"
>
100
</div>
</div>
<div
class="park-count-item"
style="background-color: rgba(193, 53, 70, 0.3)"
>
<div style="width: 100%; margin-top: 20px">
已停车位
</div>
<div
style="
width: 100%;
font-size: 30px;
font-family: 'shiShangHeiTi';
"
>
20
</div>
</div>
<div
class="park-count-item"
style="background-color: rgba(28, 125, 78, 0.4)"
>
<div style="width: 100%; margin-top: 20px">
剩余车位
</div>
<div
style="
width: 100%;
font-size: 30px;
font-family: 'shiShangHeiTi';
"
>
80
</div>
</div>
</div>
<div class="content-info-content" style="margin-top: 20px">
<span style="font-size: 24px; color: #fff">基础信息</span>
<div
style="margin-top: 10px; display: flex"
v-if="currentPark.imgList"
>
<span
style="
font-size: 18px;
color: #c9c9c9;
display: inline-block;
width: 60px;
"
>图集:
</span>
<div
style="
font-size: 18px;
color: #fff;
display: inline-block;
width: calc(100% - 100px);
"
>
<Carousel
autoplay
v-model="carouselValue"
style="width: 100%; height: 250px"
loop
>
<CarouselItem
v-for="(item, index) in currentPark.imgList"
:key="index"
v-viewer
>
<img
style="width: 100%; height: 250px"
:src="item"
/>
</CarouselItem>
</Carousel>
</div>
</div>
<div
style="margin-top: 10px; display: flex"
v-if="currentPark.address"
>
<span
style="
font-size: 18px;
color: #c9c9c9;
display: inline-block;
width: 60px;
"
>地址:
</span>
<span
style="
font-size: 18px;
color: #fff;
display: inline-block;
width: calc(100% - 100px);
"
>{{ currentPark.address }}</span
>
</div>
<div
style="margin-top: 10px; display: flex"
v-if="currentPark.info"
>
<span
style="
font-size: 18px;
color: #c9c9c9;
display: inline-block;
width: 60px;
"
>简介:
</span>
<span
style="
font-size: 18px;
color: #fff;
display: inline-block;
width: calc(100% - 100px);
"
>{{ currentPark.info }}</span
>
</div>
</div>
</div>
</div>
<div class="page-bottom-bg"></div>
<commonModal
v-model="videoState"
:title="currentPark.deviceName"
width="800"
>
<div style="width: 100%; display: flex; flex-direction: column">
<CommonLivePlayer
:videoUrl="currentPark.url"
autoplay
:live="true"
></CommonLivePlayer>
</div>
</commonModal>
</div>
</template>
<script>
import { useIndex } from "../../utils/utilsDramAdmin";
import MainTitle from "./components/MainTitle.vue";
import vueSeamlessScroll from "vue-seamless-scroll";
import gisMap from "./components/gisMapOfCounty.vue";
import commonModal from "@/views/common-components/common-modal.vue";
import CommonLivePlayer from "@/views/common-components/common-live-player.vue";
export default {
name: "CarPark",
components: {
MainTitle,
vueSeamlessScroll,
gisMap,
commonModal,
CommonLivePlayer,
},
data() {
return {
title: "停车场",
parkList: [
{
deviceImg:
"http://60.255.197.62:9080/api/device/query/snap/51072600002002247164/51072600981310001012",
deviceName: "某某停车场",
url: "http://60.255.197.62:18089/rtp/51072600002002247164_51072600981310001012.live.mp4",
address:
"四川省某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路",
info: "收费半小时免费,超过半小时,一小时2元。",
imgList: [
"http://60.255.197.62:9080/api/device/query/snap/51072600002002247164/51072600981310001012",
"http://60.255.197.62:9080/api/device/query/snap/51072600002002247164/51072600981310001012",
],
lnglat: [105.440798, 28.100057],
},
{
deviceImg:
"http://60.255.197.62:9080/api/device/query/snap/51072600002002247164/51072600981310001012",
deviceName: "某某停车场",
url: "http://60.255.197.62:18089/rtp/51072600002002247164_51072600981310001012.live.mp4",
address:
"四川省某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路某某路",
info: "收费半小时免费,超过半小时,一小时2元。",
imgList: [
"http://60.255.197.62:9080/api/device/query/snap/51072600002002247164/51072600981310001012",
"http://60.255.197.62:9080/api/device/query/snap/51072600002002247164/51072600981310001012",
],
lnglat: [105.440798, 28.100057],
},
],
pointList: [],
leftOptionHover: {
step: 0.2, //
limitMoveNum: 2, // this.dataList.length
hoverStop: false, // stop
direction: 2, // 0 1 2 3
openWatch: true, // dom
singleHeight: 0, // (0) direction => 0/1
singleWidth: 0, // (0) direction => 2/3
waitTime: 1000, // (1000ms)
},
currentPark: {},
videoState: false,
carouselValue: 0,
rightLoad: false
};
},
computed: {},
created() {},
mounted() {
const { calcRate, windowDraw } = useIndex(this.$refs.appRef);
calcRate();
windowDraw();
this.queryParkList();
},
beforeDestroy() {},
methods: {
currentPointFn (data) {
this.currentPark = data;
this.videoState = true;
},
changeVideo(e) {
this.rightLoad = false
let index = e.target.dataset.index;
let data = this.parkList[index];
this.pointList = [data];
this.currentPark = data;
setTimeout(() => {
this.rightLoad = true
}, 100);
},
queryParkList () {
this.rightLoad = false
if (this.parkList[0]) {
this.pointList = [this.parkList[0]];
this.currentPark = this.parkList[0]
setTimeout(() => {
this.rightLoad = true
}, 100);
}
},
},
};
</script>
<style lang="less" scoped>
@import "../../styles/pbStyle.less";
.eb-container {
width: 1920px;
height: 1080px;
transform: scale(var(--scale)) translate(-50%, -50%);
transform-origin: 0 0;
position: absolute;
left: 50%;
top: 50%;
background-image: url("../../assets/largeScreen/page-bg.png");
background-size: 100%;
.map-box {
position: fixed;
top: 100px;
left: 50px;
width: 1200px;
height: 675px;
.content-info {
.content-pub-style(100%, calc(100% - 42px));
position: relative;
}
}
.park-list {
width: 1200px;
height: 240px;
position: fixed;
top: 785px;
left: 50px;
.content-info {
.content-pub-style(100%, calc(100% - 42px));
padding: 4px 0;
}
.camera-picture-item {
width: 336px;
height: 190px;
margin-left: 15px;
cursor: pointer;
.pic-box {
width: 100%;
position: absolute;
bottom: 0;
font-size: 24px;
color: white;
text-align: center;
line-height: 38px;
background-color: rgba(0, 0, 0, 0.4);
}
}
}
.right {
position: fixed;
top: 100px;
right: 50px;
width: 600px;
height: 925px;
display: flex;
flex-direction: column;
.content-info {
.content-pub-style(100%, calc(100% - 42px));
padding: 10px 20px;
display: flex;
flex-direction: column;
color: #ffffff;
overflow-y: auto;
&::-webkit-scrollbar {
display: none;
}
.content-info-title {
display: flex;
flex-direction: column;
gap: 10px;
}
.park-count-box {
width: 100%;
display: flex;
justify-content: space-between;
margin-top: 10px;
.park-count-item {
width: 183px;
height: 120px;
background-color: #00feff;
text-align: center;
font-size: 22px;
border-radius: 5px;
}
}
}
}
@keyframes slideRightIn {
from {
transform: translateX(100%);
}
to {
transform: translateX(0);
}
}
.right {
animation: slideRightIn 1s forwards;
}
}
</style>

2
src/views/screen/car-warring.vue

@ -141,7 +141,7 @@
class="info-t1"
style="margin-left: 20px"
>
设备IP{{ item.deviceIp }}
发生时间{{ item.happenTime }}
</div>
<div
class="info-t1"

104
src/views/screen/components/alarm/alarm-dig-two.vue

@ -0,0 +1,104 @@
<template>
<div class="container">
<div class="main">
<span class="device-name" v-if="alarmInfo.deviceName">{{ alarmInfo.deviceName }}</span>
<div class="track-time" >
<span>告警类型{{ alarmInfo.type }}</span>
<span style="margin-left: 100px;">{{ alarmInfo.happenTime }}</span>
</div>
<span class="warring-info" v-if="alarmInfo.info">{{ alarmInfo.info }}</span>
<img v-for="(item, index) in alarmInfo.picture" :key="index" :src="item" style="margin-top: 10px;width: 70%;" />
<!-- <img
v-if="alarmInfo.picture"
:src="alarmInfo.picture"
style="width: 622px; height: 350px"
/> -->
<div class="video" v-if="alarmInfo.url">
<CommonLivePlayer :live="true" :video-url="alarmInfo.url"></CommonLivePlayer>
</div>
</div>
</div>
</template>
<script>
import CommonLivePlayer from "@/views/common-components/common-live-player.vue";
export default {
name: "alarm-dig",
components: { CommonLivePlayer },
props: {
alarmInfo: {
type: Object,
default: {},
},
videoUrl: {
type: String,
default: "",
},
},
data() {
return {
imgIndex: 0,
};
},
methods: {},
mounted () {
console.log(this.alarmInfo)
},
watch: {},
beforeDestroy() {},
};
</script>
<style lang="less" scoped>
.container {
width: 100%;
height: 600px;
background: url("../../../../assets/largeScreen/e-bg1.png") no-repeat;
background-size: 100% 100%;
text-align: center;
padding: 64px 75px 20px 75px;
.main {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
overflow: hidden;
overflow-y: scroll;
&::-webkit-scrollbar {
display: none;
}
}
.device-name {
font-family: PingFang SC;
font-size: 26px;
font-weight: 400;
margin: 5px 0;
color: #fad03b;
}
.track-time {
font-family: PingFang SC;
font-size: 16px;
font-weight: 400;
color: #fad03b;
padding: 5px 0;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.warring-info {
font-family: PingFang SC;
font-size: 20px;
font-weight: 700;
color: #ff4747;
margin-top: 20px;
margin-bottom: 5px;
}
.video {
width: 750px;
}
}
</style>

1
src/views/screen/components/alarm/alarm-dig.vue

@ -17,6 +17,7 @@
style="width: 622px; height: 350px"
v-for="(item, index) in alarmInfo.picture"
:key="index"
v-viewer
>
<img :src="item" style="width: 622px; height: 350px" />
</CarouselItem>

1
src/views/screen/components/alarm/baseAlarmDig.vue

@ -17,6 +17,7 @@
style="width: 622px; height: 350px"
v-for="(item, index) in alarmInfo.picture"
:key="index"
v-viewer
>
<img :src="item" style="width: 622px; height: 350px" />
</CarouselItem>

108
src/views/screen/components/alarm/twoImageAlarm.vue

@ -0,0 +1,108 @@
<template>
<div class="container">
<div class="main" v-viewer>
<span class="device-name" v-if="alarmInfo.deviceName">{{
alarmInfo.deviceName
}}</span>
<div class="track-time">
<span>告警类型{{ alarmInfo.type }}</span>
<span style="margin-left: 100px">{{
alarmInfo.happenTime
}}</span>
</div>
<span class="warring-info" v-if="alarmInfo.info">{{
alarmInfo.info
}}</span>
<img v-for="(item, index) in alarmInfo.picture" :key="index" :src="item" style="margin-top: 10px;width: 70%;" />
<div class="video" v-if="alarmInfo.url">
<CommonLivePlayer
:live="true"
:video-url="alarmInfo.url"
></CommonLivePlayer>
</div>
</div>
</div>
</template>
<script>
import CommonLivePlayer from "@/views/common-components/common-live-player.vue";
export default {
name: "alarm-dig",
components: { CommonLivePlayer },
props: {
alarmInfo: {
type: Object,
default: {},
},
videoUrl: {
type: String,
default: "",
},
},
data() {
return {
imgIndex: 0,
};
},
methods: {},
mounted() {
console.log(this.alarmInfo);
},
watch: {},
beforeDestroy() {},
};
</script>
<style lang="less" scoped>
.container {
width: 100%;
height: 600px;
// background: url("../../../../assets/largeScreen/e-bg1.png") no-repeat;
// background-size: 100% 100%;
text-align: center;
// padding: 64px 75px 20px 75px;
.main {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
overflow: hidden;
overflow-y: scroll;
&::-webkit-scrollbar {
display: none;
}
}
.device-name {
font-family: PingFang SC;
font-size: 26px;
font-weight: 400;
margin: 5px 0;
color: #fad03b;
}
.track-time {
font-family: PingFang SC;
font-size: 16px;
font-weight: 400;
color: #fad03b;
padding: 5px 0;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.warring-info {
font-family: PingFang SC;
font-size: 20px;
font-weight: 700;
color: #ff4747;
margin-top: 20px;
margin-bottom: 5px;
}
.video {
width: 750px;
}
}
</style>

4
src/views/screen/components/video-monitor/video-one.vue

@ -34,7 +34,7 @@
<ptzcontrol :device-id="treeNode.deviceId" :channel-id="treeNode.channelId"></ptzcontrol>
</div>
</Poptip> -->
<img
<!-- <img
v-if="!isLive"
:src="require('@/assets/largeScreen/live.png')"
@click="changeVideoUrl"
@ -43,7 +43,7 @@
v-else
:src="require('@/assets/largeScreen/histroy.png')"
@click="openRecordVideo"
/>
/> -->
</div>
</div>
<div style="width: 100%">

50
src/views/screen/emergency-screen-two.vue

@ -8,6 +8,7 @@
<gis-map class="gismap" pointType="应急广播" :point-list="pointList" :lngLat="lngLat" list-item-key="ebrName"
@currentPoint="currentPointFn">
<template v-slot:content>
<Button style="position: fixed;bottom: 60px;left: 530px;" type="primary" @click="openApp">翠屏区应急广播综合管理平台</Button>
<div class="left-box">
<div class="left-one">
<div class="title-box-samll">
@ -115,26 +116,25 @@
播发状态
</div>
</div>
<div class="table-body-box" style="height: 394px">
<div class="table-body-box" style="height: 394px" @click="openDetail($event)">
<vue-seamless-scroll :data="infoTableData" :class-option="optionHoverVertical">
<div>
<div v-for="(
item, index
) in infoTableData" :key="index" class="table-body-item"
@click="currentInfo = item; infoState = true">
<div class="table-info-item" style="
) in infoTableData" :key="index" class="table-body-item" :data-index="index">
<div class="table-info-item" :data-index="index" style="
width: 20%;
text-align: left;
">
{{ item.eventTypeName }}
</div>
<div class="table-info-item" style="width: 30%">
<div :data-index="index" class="table-info-item" style="width: 30%">
{{ item.msgTitle }}
</div>
<div class="table-info-item" style="width: 30%">
<div :data-index="index" class="table-info-item" style="width: 30%">
{{ item.sendName }}
</div>
<div class="table-info-item" style="
<div :data-index="index" class="table-info-item" style="
width: 20%;
text-align: right;
" :style="{
@ -287,6 +287,14 @@
{{ currentInfo.broadcastStateName }}
</Tag>
</div>
<div style="
display: flex;
align-items: center;
margin-bottom: 20px;
">
<span style="font-size: 20px">音频播放</span>
<audio v-if="infoState && currentInfo.mp3" controls :src="currentInfo.mp3"></audio>
</div>
</div>
</CommonModal>
</div>
@ -350,10 +358,15 @@ export default {
calcRate();
windowDraw();
this.getDeviceListByArea();
this.getAreaListByParentId();
this.getBroadcastStatistics();
this.getDeviceList();
setTimeout(()=>{
this.getDeviceList();
}, 2000)
setTimeout(()=>{
this.getDeviceListByArea();
}, 3000)
},
beforeDestroy() {
echartsClear();
@ -365,6 +378,25 @@ export default {
this.r_barChart4.dispose();
},
methods: {
openApp () {
window.open("https://60.255.187.160:1445/#/")
},
openDetail (e) {
let index = e.target.dataset.index
let data = this.infoTableData[index]
this.$http
.post(
'/emergencyBroadcast/safeRest/ebm/getEbmInfoAll',
this.common.request({ebmId: data.ebmId})
).then(res => {
if (res.data.code == 200) {
this.currentInfo = res.data.data
this.currentInfo.mp3 = this.currentInfo.files[0].fileUrl
this.infoState = true
}
}
)
},
currentPointFn(data) {
this.currentPoint = data;
this.pointState = true;

553
src/views/screen/fights-rawls.vue

@ -0,0 +1,553 @@
<template>
<!-- 应急扩展 -->
<div class="eb-container" ref="appRef">
<MainTitle class="mainTitle" :title="title"></MainTitle>
<div class="video-box">
<!-- <commonLivePlayer
:videoUrl="videoUrl"
:live="true"
></commonLivePlayer> -->
<video-one :tree-node="videoItem"></video-one>
</div>
<div class="video-list" @click="changeVideo">
<vue-seamless-scroll
:data="videoList"
:class-option="leftOptionHover"
>
<div style="height: 150px; display: flex; flex-direction: row">
<!-- <div
class="camera-picture-item"
v-for="(item, index) in videoList"
:data-index="index"
:key="index"
>
<div
:data-index="index"
style="
width: 100%;
height: 100%;
position: relative;
"
>
<img
:src="item.deviceImg"
style="width: 425px; height: 240px"
:data-index="index"
/>
<div class="pic-box" :data-index="index">
{{ item.deviceName }}
</div>
</div>
</div> -->
<div
class="video-item"
v-for="(item, index) in videoList"
:data-index="index"
:key="index"
>
<div class="video-title" :data-index="index">
{{ item.deviceName }}
</div>
<div style="display: flex" :data-index="index">
<Tag
:data-index="index"
v-for="(data, i) in item.tags"
:key="i"
>{{ data }}</Tag
>
</div>
</div>
</div>
</vue-seamless-scroll>
</div>
<div class="right">
<div class="title-box-680" style="width: 550px">
<span>预警信息</span>
</div>
<div class="content-info">
<div class="alarm-info-count-box">
<div
class="alarm-info-count-item"
style="background-color: rgba(28, 125, 78, 0.4)"
>
<div style="width: 100%; margin-top: 20px">
当天预警次数
</div>
<div
style="
width: 100%;
font-size: 30px;
font-family: 'shiShangHeiTi';
"
>
{{ conutInfo.dayNum }}
</div>
</div>
<div
class="alarm-info-count-item"
style="background-color: rgba(40, 132, 146, 0.4)"
>
<div style="width: 100%; margin-top: 20px">
近7日预警次数
</div>
<div
style="
width: 100%;
font-size: 30px;
font-family: 'shiShangHeiTi';
"
>
{{ conutInfo.weekNum }}
</div>
</div>
<div
class="alarm-info-count-item"
style="background-color: rgba(193, 53, 70, 0.3)"
>
<div style="width: 100%; margin-top: 20px">
近30日预警次数
</div>
<div
style="
width: 100%;
font-size: 30px;
font-family: 'shiShangHeiTi';
"
>
{{ conutInfo.monthNum }}
</div>
</div>
</div>
<div style="width: 100%; height: 735px">
<div class="new-alarm-box">
<div class="new-alarm-title">预警设备</div>
<div class="new-alarm-desc">预警IP</div>
<div class="new-alarm-desc">预警时间</div>
<div class="new-alarm-desc">预警信息</div>
</div>
<div
class="alarm-record-box"
@click="openAlarmModal"
v-if="alarmInfoList.length > 0"
>
<vue-seamless-scroll
:data="alarmInfoList"
:class-option="topOptionHover"
>
<div
class="alarm-record-item"
v-for="(item, index) in alarmInfoList"
:key="index"
>
<div
class="alarm-record-title"
style="text-align: left"
:data-index="index"
>
{{ item.deviceName }}
</div>
<div
class="alarm-record-title"
style="text-align: center; width: 20%"
:data-index="index"
>
{{ item.deviceIp }}
</div>
<div
class="alarm-record-title"
style="text-align: center; width: 30%"
:data-index="index"
>
{{ item.happenTime }}
</div>
<div
class="alarm-record-title"
style="
text-align: right;
width: 20%;
padding-right: 5px;
"
:data-index="index"
>
{{ item.info }}
</div>
</div>
</vue-seamless-scroll>
</div>
<div
v-else
class="alarm-record-box"
style="
display: flex;
justify-content: center;
align-items: center;
font-size: 18px;
color: #ffffff;
"
>
暂无预警
</div>
</div>
</div>
</div>
<div class="page-bottom-bg"></div>
<div class="page-left-bg"></div>
<div class="page-right-bg"></div>
<emergency-modal
v-model="socState"
width="988px"
@close="socState = false"
>
<AlarmDigTwo :alarmInfo="diaAlarmInfo"></AlarmDigTwo>
</emergency-modal>
<common-modal
v-model="alarmInfoModal"
width="988px"
@close="alarmInfoModal = false"
>
<TwoImageAlarm :alarmInfo="diaAlarmInfo"></TwoImageAlarm>
</common-modal>
</div>
</template>
<script>
import { useIndex } from "../../utils/utilsDramAdmin";
import MainTitle from "./components/MainTitle.vue";
import commonLivePlayer from "@/views/common-components/common-live-player.vue";
import VueSeamlessScroll from "vue-seamless-scroll";
import CommonModal from "@/views/common-components/common-modal.vue";
import EmergencyModal from "@/views/common-components/emergency-modal.vue";
import AlarmDigTwo from "@/views/screen/components/alarm/alarm-dig-two.vue";
import TwoImageAlarm from "@/views/screen/components/alarm/twoImageAlarm.vue";
import VideoOne from "./components/video-monitor/video-one.vue";
export default {
name: "EmergencyExtend",
components: {
MainTitle,
commonLivePlayer,
VueSeamlessScroll,
CommonModal,
EmergencyModal,
AlarmDigTwo,
TwoImageAlarm,
VideoOne,
},
data() {
return {
title: "城市治安",
areaCode: window.$localStorage.getItem("areaCode"),
videoUrl: "",
deviceIp: "",
videoList: [],
currentDevice: {},
conutInfo: {
dayNum: 0,
weekNum: 0,
monthNum: 0,
},
alarmInfoList: [],
alarmInfoModal: false,
diaAlarmInfo: {},
leftOptionHover: {
step: 0.2, //
limitMoveNum: 2, // this.dataList.length
hoverStop: false, // stop
direction: 2, // 0 1 2 3
openWatch: true, // dom
singleHeight: 0, // (0) direction => 0/1
singleWidth: 0, // (0) direction => 2/3
waitTime: 1000, // (1000ms)
},
topOptionHover: {
step: 0.1, //
limitMoveNum: 8, // this.dataList.length
hoverStop: false, // stop
direction: 1, // 0 1 2 3
openWatch: true, // dom
singleHeight: 0, // (0) direction => 0/1
singleWidth: 0, // (0) direction => 2/3
waitTime: 1000, // (1000ms)
},
socState: false,
videoItem: {}
};
},
computed: {},
created() {},
mounted() {
const { calcRate, windowDraw } = useIndex(this.$refs.appRef);
calcRate();
windowDraw();
this.queryMonitorList();
this.subscribeTopic();
},
beforeDestroy() {
this.sockets.unsubscribe("FIGHT");
},
methods: {
//
subscribeTopic() {
//
this.sockets.subscribe("FIGHT", (data) => {
console.log("城市治安", data);
this.diaAlarmInfo = data.data;
if (this.diaAlarmInfo.picture) {
this.diaAlarmInfo.picture = JSON.parse(
this.diaAlarmInfo.picture
)
}
this.alarmInfoModal = false;
this.socState = true;
this.queryCount(this.videoList);
});
},
//
queryMonitorList() {
this.$http
.post(
"device/queryDeviceInfoPage",
this.common.request({
pageNum: 1,
pageSize: 1000,
areaCode: this.areaCode,
deviceType: "城市治安",
})
)
.then((res) => {
if (res.data.code === 200) {
this.videoList = res.data.data.records.map((item) => {
return {
...item,
title: item.deviceName,
img:
item.deviceImg ||
require("@/assets/test/v1.png"),
tags: item.powerInfo.split(","),
};
});
this.queryAlarmRecord(this.videoList);
this.queryCount(this.videoList);
this.videoItem = this.videoList[0]
this.videoUrl = this.videoList[0].url;
this.deviceIp = this.videoList[0].deviceIp;
}
});
},
openAlarmModal(event) {
console.log(event);
let index = event.target.dataset.index;
if (index) {
this.diaAlarmInfo = this.alarmInfoList[index];
if (this.diaAlarmInfo.picture) {
this.diaAlarmInfo.picture = JSON.parse(
this.diaAlarmInfo.picture
)
}
console.log(this.diaAlarmInfo.picture)
this.alarmInfoModal = true;
}
},
changeVideo(e) {
let index = e.target.dataset.index;
let item = this.videoList[index];
this.videoUrl = item.url;
this.deviceIp = item.deviceIp;
this.currentDevice = item;
},
//
queryAlarmRecord(list) {
let ips = list.map((item) => item.deviceIp);
this.$http
.post(
"alarm/base/queryBaseAlarmPage",
this.common.request({
page: 1,
pageSize: 1000,
type: "城市治安",
deviceIpList: ips,
})
)
.then((res) => {
if (res.data.code == 200) {
this.alarmInfoList = res.data.data.records;
}
});
},
//
queryCount(list) {
let ips = list.map((item) => item.deviceIp);
this.$http
.post(
"alarm/base/countAlarmInfoByIps",
this.common.request({ ips })
)
.then((res) => {
if (res.data.code == 200) {
let data = res.data.data;
this.conutInfo.dayNum = data.alarmByDay;
this.conutInfo.weekNum = data.alarmByWeek;
this.conutInfo.monthNum = data.alarmByMonth;
}
});
},
},
};
</script>
<style lang="less" scoped>
@import "../../styles/pbStyle.less";
.eb-container {
width: 1920px;
height: 1080px;
transform: scale(var(--scale)) translate(-50%, -50%);
transform-origin: 0 0;
position: absolute;
left: 50%;
top: 50%;
background-image: url("../../assets/largeScreen/page-bg.png");
background-size: 100%;
.video-box {
position: fixed;
top: 100px;
left: 50px;
width: 1250px;
height: 775px;
}
.video-list {
width: 1250px;
height: 150px;
position: fixed;
top: 865px;
left: 50px;
overflow: hidden;
.camera-picture-item {
width: 425px;
height: 240px;
margin-left: 15px;
cursor: pointer;
.pic-box {
width: 100%;
position: absolute;
bottom: 0;
font-size: 24px;
color: white;
text-align: center;
line-height: 38px;
background-color: rgba(0, 0, 0, 0.4);
}
}
.video-item {
height: 100%;
background-color: rgba(42, 76, 124, 0.4);
border-radius: 8px;
padding: 15px 10px;
margin-right: 10px;
display: flex;
flex-direction: column;
justify-content: space-between;
.video-title {
width: 100%;
font-weight: 600;
font-size: 18px;
color: #ffffff;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
}
.right {
position: fixed;
top: 100px;
right: 50px;
width: 550px;
height: 925px;
display: flex;
flex-direction: column;
.content-info {
.content-pub-style(100%, calc(100% - 44px));
display: flex;
flex-direction: column;
padding: 0 10px;
color: #ffffff;
.alarm-info-count-box {
width: 100%;
display: flex;
justify-content: space-between;
margin-top: 10px;
.alarm-info-count-item {
width: 32%;
height: 120px;
background-color: #00feff;
text-align: center;
font-size: 22px;
border-radius: 5px;
}
}
.new-alarm-box {
width: 100%;
height: 50px;
margin: 5px 0;
background: rgba(36, 74, 129, 0.8);
border-radius: 4px;
padding: 10px 20px;
display: flex;
flex-direction: row;
justify-content: space-between;
.new-alarm-title {
font-size: 14px;
line-height: 28px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.new-alarm-desc {
line-height: 28px;
font-size: 14px;
}
}
.alarm-record-box {
width: 100%;
height: 675px;
overflow: hidden;
.alarm-record-item {
width: 100%;
height: 50px;
margin: 5px 0;
background: rgba(36, 74, 129, 0.3);
border-radius: 4px;
padding: 10px 20px;
display: flex;
flex-direction: row;
justify-content: space-between;
cursor: pointer;
.alarm-record-title {
width: 25%;
font-size: 14px;
line-height: 28px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
}
}
::-webkit-scrollbar {
width: 0;
height: 0;
color: transparent;
}
</style>

2
src/views/screen/person-warring.vue

@ -141,7 +141,7 @@
:data-index="index"
style="margin-left: 20px"
>
设备IP{{ item.deviceIp }}
发生时间{{ item.happenTime }}
</div>
<div
class="info-t1"

6
src/views/screen/smart-travel.vue

@ -3,6 +3,7 @@
<div class="eb-container" ref="appRef">
<MainTitle class="mainTitle" :title="title"></MainTitle>
<div class="main-content">
<Button style="position: fixed;bottom: 10px;left: 10px;background-color: #169bcf;" type="primary" @click="openApp">智慧旅游态势感知平台</Button>
<div class="tree-box">
<Tree :data="treeList" :render="renderContent"></Tree>
</div>
@ -197,7 +198,6 @@ import MainTitle from "./components/MainTitle.vue";
import CommonLivePlayer from "@/views/common-components/common-live-player.vue";
import * as echarts from "echarts";
import { echartsFocus, echartsClear } from "@/utils/autoEcharts";
import { format } from "@/libs/date";
export default {
name: "SmartTravel",
components: { MainTitle, CommonLivePlayer },
@ -273,6 +273,9 @@ export default {
echartsClear();
},
methods: {
openApp () {
window.open("http://tour.zenstec.com/domain/dashboard")
},
renderContent(h, { root, node, data }) {
return h(
"span",
@ -357,6 +360,7 @@ export default {
series: [
{
name: "实时客流",
color: "#169bcf",
type: "line",
smooth: true,
symbolSize: 8,

Loading…
Cancel
Save