Compare commits
37 Commits
1651188051
...
video2
| Author | SHA1 | Date | |
|---|---|---|---|
| 046aea0f55 | |||
| 3e9f7133de | |||
| affc881aaa | |||
| 87c115ab99 | |||
| 6fe84fe853 | |||
| b7499f12d1 | |||
| 724dc4a561 | |||
|
|
cee259db65 | ||
| 3853793886 | |||
| aa75cd9cb9 | |||
|
|
f09d8c972b | ||
| be75778018 | |||
| 72fcf0b531 | |||
| 406d502e60 | |||
|
|
cbedd59743 | ||
| 85a24f2147 | |||
| 04b25ab162 | |||
| 402e3c6e09 | |||
| c392ce026d | |||
| aa18dc7a4c | |||
|
|
467915db82 | ||
| b56a35cad4 | |||
|
|
937ab3a230 | ||
|
|
b459464052 | ||
| 9d134a2b9d | |||
|
|
afc316bbab | ||
| 1b4226d325 | |||
| 20049de695 | |||
| 095cd64373 | |||
| d6c4bd0406 | |||
| 03e0ea4cb8 | |||
| caa474a5a9 | |||
| 7edb14c031 | |||
| b1161d7479 | |||
| d1411314a5 | |||
| a23660efd6 | |||
| 90347ba87a |
@@ -3,9 +3,7 @@
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<main class="wrapper">
|
||||
<RouterView />
|
||||
</main>
|
||||
<main class="wrapper"> <RouterView /> </main>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import request from './request'
|
||||
|
||||
export function getTrafficEventsApi() {
|
||||
export function getTrafficEventsApi(type) {
|
||||
return request({
|
||||
url: '/fjtcc-api/api/largeScreen/monitor/trafficEvents',
|
||||
url: '/fjtcc-api/api/largeScreen/monitor/trafficEvents?type='+type,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
export function getVideoEventApi(scenicSpotId) {
|
||||
export function getVideoEventApi(scenicSpotId,type) {
|
||||
return request({
|
||||
url: '/fjtcc-api/api/largeScreen/monitor/videoEvents?scenicSpotId='+scenicSpotId,
|
||||
url: '/fjtcc-api/api/largeScreen/monitor/videoEvents?type='+type+'&scenicSpotId='+scenicSpotId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ const instance = axios.create({
|
||||
timeout: 100000,
|
||||
headers: {
|
||||
Authorization: mode == 'dev' ? devToken : proToken,
|
||||
'User-Type':'2',
|
||||
'User-Type': '1',
|
||||
'Content-Type': 'application/json;charset=UTF-8'
|
||||
}
|
||||
})
|
||||
|
||||
@@ -7,7 +7,13 @@ export function getListApi() {
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 统计
|
||||
export function getDetailApi(id) {
|
||||
return request({
|
||||
url: '/fjtcc-api/api/largeScreen/workorder/detail/'+id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 统计
|
||||
export function getTotalApi() {
|
||||
return request({
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/images/d-icon-1.png
Normal file
BIN
src/assets/images/d-icon-1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
BIN
src/assets/images/loading.gif
Normal file
BIN
src/assets/images/loading.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
@@ -57,7 +57,7 @@
|
||||
top: '20%',
|
||||
textStyle: {
|
||||
color: '#00D0FF',
|
||||
fontSize: fitChartSize(24)
|
||||
fontSize: fitChartSize(18)
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -66,7 +66,7 @@
|
||||
top: '50%',
|
||||
textStyle: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(22)
|
||||
fontSize: fitChartSize(16)
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -91,13 +91,13 @@
|
||||
[0, '#075199'],
|
||||
[1, '#075199']
|
||||
],
|
||||
width: fitChartSize(10)
|
||||
width: fitChartSize(6)
|
||||
}
|
||||
},
|
||||
progress: {
|
||||
show: true,
|
||||
roundCap: false,
|
||||
width: fitChartSize(10)
|
||||
width: fitChartSize(6)
|
||||
},
|
||||
pointer: {
|
||||
// 指针
|
||||
@@ -143,13 +143,13 @@
|
||||
[0, '#075199'],
|
||||
[1, '#075199']
|
||||
],
|
||||
width: fitChartSize(10)
|
||||
width: fitChartSize(6)
|
||||
}
|
||||
},
|
||||
progress: {
|
||||
show: true,
|
||||
roundCap: false,
|
||||
width: fitChartSize(10)
|
||||
width: fitChartSize(6)
|
||||
},
|
||||
pointer: {
|
||||
// 指针
|
||||
|
||||
@@ -52,34 +52,32 @@
|
||||
flex: 1;
|
||||
.label {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
margin-left: vw(4);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
.count {
|
||||
position: relative;
|
||||
margin-top: vh(30);
|
||||
margin-top: vh(10);
|
||||
z-index: 1;
|
||||
.value {
|
||||
padding-left: vw(20);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(38);
|
||||
font-size: vw(28);
|
||||
color: #02f9fa;
|
||||
}
|
||||
.suffix {
|
||||
// margin-top: vh(34);
|
||||
margin-top: vh(4);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(12);
|
||||
color: #02f9fa;
|
||||
margin-left:vw(5);
|
||||
}
|
||||
.bg {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: vw(184);
|
||||
height: vh(50);
|
||||
line-height: vh(50);
|
||||
width: vw(134);
|
||||
height: vh(30);
|
||||
z-index: -1;
|
||||
}
|
||||
}
|
||||
|
||||
352
src/components/HlsPlayer/index-bak.vue
Normal file
352
src/components/HlsPlayer/index-bak.vue
Normal file
@@ -0,0 +1,352 @@
|
||||
<template>
|
||||
<div v-show="isActive" class="myVideo-container">
|
||||
<video
|
||||
class="myVideo"
|
||||
ref="videoElement"
|
||||
muted
|
||||
playsinline
|
||||
:controls="false"
|
||||
disablePictureInPicture
|
||||
></video>
|
||||
<!-- <div v-if="loading" class="loading-overlay pointer-events-none">
|
||||
<div class="loading-text">{{ loadingText }}</div>
|
||||
</div> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Hls from 'hls.js'
|
||||
|
||||
export default {
|
||||
name: 'HlsPlayer',
|
||||
props: {
|
||||
url: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
isActive: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
width: {
|
||||
type: [String, Number],
|
||||
default: '100%'
|
||||
},
|
||||
height: {
|
||||
type: [String, Number],
|
||||
default: '100%'
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
hls: null,
|
||||
video: null,
|
||||
loading: false,
|
||||
loadingText: '加载中...',
|
||||
retryCount: 0,
|
||||
maxRetries: 3,
|
||||
isReady: false,
|
||||
playAttempts: 0,
|
||||
maxPlayAttempts: 3,
|
||||
cleanupTimeout: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
videoStyle() {
|
||||
const style = {}
|
||||
if (this.width) {
|
||||
style.width = typeof this.width === 'number' ? `${this.width}px` : this.width
|
||||
}
|
||||
if (this.height) {
|
||||
style.height = typeof this.height === 'number' ? `${this.height}px` : this.height
|
||||
}
|
||||
return style
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
isActive: {
|
||||
handler(newValue) {
|
||||
if (newValue) {
|
||||
this.$nextTick(this.initializePlayer)
|
||||
} else {
|
||||
this.immediateCleanup()
|
||||
}
|
||||
},
|
||||
immediate: true
|
||||
},
|
||||
url(newUrl) {
|
||||
// console.log(newUrl,'77777777777777777777777777777777')
|
||||
if (newUrl && this.isActive) {
|
||||
this.initializePlayer()
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.video = this.$refs.videoElement
|
||||
this.registerVideoEvents()
|
||||
},
|
||||
methods: {
|
||||
registerVideoEvents() {
|
||||
const events = ['canplay', 'waiting', 'playing', 'error', 'stalled', 'suspend']
|
||||
|
||||
events.forEach((event) => {
|
||||
this.video.addEventListener(event, this.handleVideoEvent)
|
||||
})
|
||||
},
|
||||
|
||||
handleVideoEvent(event) {
|
||||
switch (event.type) {
|
||||
case 'canplay':
|
||||
this.isReady = true
|
||||
break
|
||||
case 'waiting':
|
||||
this.showLoadingIndicator('缓冲中...')
|
||||
break
|
||||
case 'playing':
|
||||
this.loading = false
|
||||
break
|
||||
case 'error':
|
||||
this.handlePlaybackError()
|
||||
break
|
||||
case 'stalled':
|
||||
this.showLoadingIndicator('播放卡顿...')
|
||||
break
|
||||
case 'suspend':
|
||||
this.cleanupNetworkResources()
|
||||
break
|
||||
}
|
||||
},
|
||||
|
||||
immediateCleanup() {
|
||||
// 立即停止网络请求
|
||||
if (this.hls) {
|
||||
this.hls.stopLoad()
|
||||
this.hls.detachMedia()
|
||||
}
|
||||
|
||||
// 延迟完全清理以避免播放卡顿
|
||||
this.cleanupTimeout = setTimeout(() => {
|
||||
// 仅在不重新初始化播放器时才调用 fullCleanup
|
||||
if (!this.url || !this.isActive) {
|
||||
this.fullCleanup()
|
||||
}
|
||||
}, 1000)
|
||||
},
|
||||
|
||||
fullCleanup() {
|
||||
if (this.hls) {
|
||||
this.hls.destroy()
|
||||
this.hls = null
|
||||
}
|
||||
|
||||
if (this.video) {
|
||||
this.video.pause()
|
||||
this.video.removeAttribute('src')
|
||||
this.video.load()
|
||||
}
|
||||
|
||||
this.loading = false
|
||||
this.retryCount = 0
|
||||
this.isReady = false
|
||||
this.playAttempts = 0
|
||||
|
||||
if (this.cleanupTimeout) {
|
||||
clearTimeout(this.cleanupTimeout)
|
||||
}
|
||||
},
|
||||
|
||||
initializePlayer() {
|
||||
if (!this.isActive || !this.url) return
|
||||
|
||||
// 如果是重新初始化播放器,先清理已存在的资源
|
||||
if (this.hls) {
|
||||
this.immediateCleanup()
|
||||
}
|
||||
this.hls = new Hls({
|
||||
// 内存优化配置
|
||||
maxBufferSize: 0, // 降低缓冲区大小(15MB)
|
||||
maxBufferLength: 0.1, // 更小的缓冲窗口
|
||||
liveSyncDuration: 1, // 紧跟直播点
|
||||
liveMaxLatencyDuration: 5, // 最大延迟5秒
|
||||
liveDurationInfinity: true,
|
||||
lowLatencyMode: true, // 启用低延迟模式
|
||||
maxMaxBufferLength: 60,
|
||||
backBufferLength: 1, // 减少保留的缓冲数据
|
||||
manifestLoadingTimeOut: 10000,
|
||||
manifestLoadingMaxRetry: 5,
|
||||
fragLoadingTimeOut: 5000,
|
||||
fragLoadingMaxRetry: 2,
|
||||
enableWorker: true, // 启用Web Worker
|
||||
recycleVideoFrames: true, // 启用帧回收
|
||||
|
||||
startLevel: -1,
|
||||
autoStartLoad: true,
|
||||
maxBufferHole: 2, // 允许更大的时间缺口
|
||||
highBufferWatchdogPeriod: 4, // 延长监控周期
|
||||
nudgeMaxRetry: 5, // 增加微调重试次数
|
||||
nudgeOffset: 0.05, // 微调步长(秒)
|
||||
jumpGaps: false,
|
||||
stallThreshold: 1000
|
||||
})
|
||||
|
||||
this.hls.attachMedia(this.video)
|
||||
this.hls.loadSource(this.url)
|
||||
|
||||
// 事件处理
|
||||
this.hls.on(Hls.Events.MANIFEST_PARSED, () => {
|
||||
this.loading = false
|
||||
this.retryCount = 0
|
||||
this.safePlay()
|
||||
})
|
||||
this.hls.on(Hls.Events.ERROR, (event, data) => {
|
||||
console.log('核心视频错误',data.type)
|
||||
// this.hls.startLoad(); //重连
|
||||
if (data.type === Hls.ErrorTypes.BUFFER_STALLED_ERROR) {
|
||||
console.error('缓冲停滞错误,尝试重新加载视频');
|
||||
this.hls.startLoad(); // 尝试重新加载视频
|
||||
}
|
||||
this.handleHlsError(data)
|
||||
})
|
||||
|
||||
this.hls.on(Hls.Events.BUFFER_EOS, () => {
|
||||
this.cleanupNetworkResources()
|
||||
})
|
||||
},
|
||||
initVideo() {
|
||||
this.beforeDestroy()
|
||||
this.hls = new Hls({
|
||||
maxBufferLength: 30, // 最大缓冲长度(秒)
|
||||
maxMaxBufferLength: 15, // 缓冲区长度的上限
|
||||
maxBufferSize: 30 * 1000 * 1000 // 最大缓冲大小(字节)
|
||||
})
|
||||
this.hls.attachMedia(this.video)
|
||||
this.hls.loadSource(this.url)
|
||||
|
||||
// 事件处理
|
||||
this.hls.on(Hls.Events.MANIFEST_PARSED, () => {
|
||||
this.loading = false
|
||||
this.retryCount = 0
|
||||
this.safePlay()
|
||||
})
|
||||
this.hls.on(Hls.Events.ERROR, (event, data) => {
|
||||
this.hls.startLoad(); //重连
|
||||
this.handleHlsError(data)
|
||||
})
|
||||
|
||||
this.hls.on(Hls.Events.BUFFER_EOS, () => {
|
||||
this.cleanupNetworkResources()
|
||||
})
|
||||
},
|
||||
cleanupNetworkResources() {
|
||||
// 清理已播放的缓冲数据
|
||||
if (this.hls && this.video) {
|
||||
try {
|
||||
const currentTime = this.video.currentTime
|
||||
this.hls.mediaBuffer = null
|
||||
if (this.hls.bufferTimer) {
|
||||
clearInterval(this.hls.bufferTimer)
|
||||
}
|
||||
this.hls.flushBuffer()
|
||||
this.video.currentTime = currentTime
|
||||
} catch (e) {
|
||||
console.warn('Buffer cleanup error:', e)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
handleHlsError(data) {
|
||||
// console.error('HLS Error:', data)
|
||||
if (data.fatal) {
|
||||
switch (data.type) {
|
||||
case Hls.ErrorTypes.NETWORK_ERROR:
|
||||
this.retryLoad()
|
||||
break
|
||||
case Hls.ErrorTypes.MEDIA_ERROR:
|
||||
this.hls.recoverMediaError()
|
||||
break
|
||||
default:
|
||||
this.fullCleanup()
|
||||
break
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
retryLoad() {
|
||||
if (this.retryCount < this.maxRetries) {
|
||||
this.retryCount++
|
||||
this.showLoadingIndicator(`重试第 ${this.retryCount} 次...`)
|
||||
setTimeout(() => this.initializePlayer(), 2000)
|
||||
} else {
|
||||
this.showLoadingIndicator('视频加载失败')
|
||||
this.fullCleanup()
|
||||
}
|
||||
},
|
||||
|
||||
showLoadingIndicator(text) {
|
||||
this.loading = true
|
||||
this.loadingText = text
|
||||
},
|
||||
|
||||
async safePlay() {
|
||||
if (!this.video || this.playAttempts >= this.maxPlayAttempts) return
|
||||
|
||||
try {
|
||||
this.playAttempts++
|
||||
if (this.video.readyState >= 2) {
|
||||
await this.video.play()
|
||||
this.playAttempts = 0
|
||||
} else {
|
||||
setTimeout(this.safePlay, 500)
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('播放失败:', error)
|
||||
setTimeout(this.safePlay, 1000)
|
||||
}
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
// 移除所有事件监听
|
||||
if (this.video) {
|
||||
const events = ['canplay', 'waiting', 'playing', 'error', 'stalled', 'suspend']
|
||||
events.forEach((event) => {
|
||||
this.video.removeEventListener(event, this.handleVideoEvent)
|
||||
})
|
||||
}
|
||||
this.fullCleanup()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.myVideo-container {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.myVideo {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
// aspect-ratio: 16/9;
|
||||
/* border: 1px solid #ccc; */
|
||||
// border-radius: vw(5);
|
||||
}
|
||||
|
||||
.loading-overlay {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.loading-text {
|
||||
color: white;
|
||||
padding: vw(10);
|
||||
border-radius: vw(4);
|
||||
background: rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
</style>
|
||||
@@ -4,9 +4,8 @@
|
||||
class="myVideo"
|
||||
id="video"
|
||||
ref="videoElement"
|
||||
muted
|
||||
playsinline
|
||||
preload="auto"
|
||||
muted
|
||||
autoplay
|
||||
:controls="false"
|
||||
></video>
|
||||
@@ -18,7 +17,7 @@
|
||||
|
||||
<script>
|
||||
import Hls from 'hls.js'
|
||||
import WebRTCWhep from "whepts";
|
||||
import WebRTCWhep from 'whepts'
|
||||
export default {
|
||||
name: 'HlsPlayer',
|
||||
props: {
|
||||
@@ -122,6 +121,7 @@ export default {
|
||||
immediateCleanup() {
|
||||
// 立即停止网络请求
|
||||
if (this.hls) {
|
||||
this.hls.close();
|
||||
this.hls.stopLoad()
|
||||
this.hls.detachMedia()
|
||||
}
|
||||
@@ -159,7 +159,7 @@ export default {
|
||||
|
||||
initializePlayer() {
|
||||
if (!this.isActive || !this.url) return
|
||||
// 如果是重新初始化播放器,先清理已存在的资源
|
||||
|
||||
if(this.url.startsWith('http://192.168.77.200:8050/')){
|
||||
this.hls = new WebRTCWhep({
|
||||
url: this.url, // WHEP 服务器地址
|
||||
@@ -176,6 +176,7 @@ export default {
|
||||
// this.initializePlayer();
|
||||
})
|
||||
}else{
|
||||
// 如果是重新初始化播放器,先清理已存在的资源
|
||||
if (this.hls) {
|
||||
this.immediateCleanup()
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
border: 1px solid #0096FF;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
font-size: ${fitChartSize(18)}px;
|
||||
font-size: ${fitChartSize(16)}px;
|
||||
border-radius: ${fitChartSize(4)}px;
|
||||
padding: ${fitChartSize(4)}px ${fitChartSize(12)}px;">
|
||||
${valueStr}</div>`
|
||||
@@ -93,7 +93,7 @@
|
||||
},
|
||||
grid: {
|
||||
left: '2%',
|
||||
right: '10%',
|
||||
right: '5%',
|
||||
bottom: '5%',
|
||||
top: '10%',
|
||||
containLabel: true
|
||||
@@ -103,12 +103,12 @@
|
||||
x: 'center',
|
||||
y: 'top',
|
||||
icon: 'rect',
|
||||
itemWidth: fitChartSize(12),
|
||||
itemHeight: fitChartSize(12),
|
||||
itemGap: fitChartSize(12),
|
||||
itemWidth: fitChartSize(8),
|
||||
itemHeight: fitChartSize(4),
|
||||
itemGap: fitChartSize(10),
|
||||
textStyle: {
|
||||
color: '#ffffff',
|
||||
fontSize: fitChartSize(22)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
},
|
||||
title: {
|
||||
@@ -127,14 +127,14 @@
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
fontSize: fitChartSize(18),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: fitChartSize(18),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
},
|
||||
splitLine: {
|
||||
@@ -224,7 +224,7 @@
|
||||
top:0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size:font-vw(18);
|
||||
font-size:vw(18);
|
||||
// color:#999;
|
||||
color:#02f9fa;
|
||||
display: flex;
|
||||
|
||||
@@ -48,10 +48,7 @@
|
||||
}
|
||||
})
|
||||
|
||||
const { id, setOption,chartVal,dispose ,clearOption} = useEchart()
|
||||
|
||||
|
||||
|
||||
const { id,chart, setOption,chartVal,dispose ,clearOption} = useEchart()
|
||||
let condShow = ref(0)
|
||||
let aIndex = 1
|
||||
var colorList = []
|
||||
@@ -59,40 +56,35 @@
|
||||
watch(
|
||||
() => props.dataList,
|
||||
(newVal) => {
|
||||
console.log(newVal,'监听数据切换变化')
|
||||
aIndex+=1
|
||||
|
||||
aIndex+=1
|
||||
if(aIndex>=3&&!newVal.length){
|
||||
condShow.value = 1
|
||||
|
||||
}
|
||||
if (newVal.length > 0) {
|
||||
|
||||
console.log(colorList.value,'colorList')
|
||||
condShow.value = 2
|
||||
colorList = []
|
||||
nextTick(() => {
|
||||
clearOption();
|
||||
init()
|
||||
// defaultCofig.legend.formatter = (name) => {
|
||||
// let percent = props.dataList.find((item) => item.name == name).value
|
||||
// return name + '\u3000' + `${percent}%`
|
||||
// }
|
||||
// defaultCofig.series[0].data = props.dataList
|
||||
// defaultCofig.series[0].label.formatter = () => {
|
||||
// return `{value|${props.total}}` + '\n' + `{name|${props.label} }`
|
||||
// }
|
||||
// setOption({
|
||||
// ...defaultCofig,
|
||||
// ...props.config
|
||||
// })
|
||||
|
||||
})
|
||||
}else{
|
||||
|
||||
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
const init = ()=>{
|
||||
if(condShow.value===2){
|
||||
return;
|
||||
}
|
||||
clearOption()
|
||||
colorList = [];
|
||||
condShow.value = 2
|
||||
const validDataList = props.dataList.filter(item => {
|
||||
return item && item.name && (item.value || item.value === 0);
|
||||
});
|
||||
props.dataList.forEach((item,index)=>{
|
||||
|
||||
if(item.name=='负面'){
|
||||
@@ -113,21 +105,30 @@
|
||||
color: colorList,
|
||||
legend: {
|
||||
orient: 'vertical',
|
||||
x: 'center',
|
||||
y: '60%',
|
||||
bottom:'20%',
|
||||
itemWidth: fitChartSize(20),
|
||||
itemHeight: fitChartSize(20),
|
||||
x: '64%',
|
||||
y: 'center',
|
||||
itemWidth: fitChartSize(12),
|
||||
itemHeight: fitChartSize(12),
|
||||
itemGap: fitChartSize(10),
|
||||
textStyle: {
|
||||
color: '#ffffff',
|
||||
fontSize: fitChartSize(18)
|
||||
}
|
||||
fontSize: fitChartSize(14)
|
||||
},
|
||||
formatter: (name) => {
|
||||
// let percent = props.dataList.find((item) => item.name == name).value
|
||||
const item = validDataList.find((item) => item.name === name);
|
||||
|
||||
const percent = item ? item.value : 0;
|
||||
|
||||
const displayName = name || '';
|
||||
return `${displayName}\u3000${percent}%`;
|
||||
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: 'pie',
|
||||
center: ['50%', '30%'],
|
||||
center: ['30%', '50%'],
|
||||
radius: ['40%', '55%'],
|
||||
itemStyle: {
|
||||
borderWidth: fitChartSize(4),
|
||||
@@ -143,35 +144,63 @@
|
||||
rich: {
|
||||
value: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18),
|
||||
fontSize: fitChartSize(24),
|
||||
fontWeight: 'bold',
|
||||
padding: [0, 0, 5, 0]
|
||||
},
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
},
|
||||
labelLine: {
|
||||
show: false
|
||||
},
|
||||
data: []
|
||||
data: validDataList
|
||||
}
|
||||
]
|
||||
}
|
||||
defaultCofig.legend.formatter = (name) => {
|
||||
let percent = props.dataList.find((item) => item.name == name).value
|
||||
return name + '\u3000' + `${percent}%`
|
||||
// defaultCofig.series[0].data = props.dataList
|
||||
// defaultCofig.legend.formatter = (name) => {
|
||||
// let percent = props.dataList.find((item) => item.name == name).value
|
||||
// if(name){
|
||||
// return name + '\u3000' + `${percent}%`
|
||||
// }else{
|
||||
// return name + '\u3000' + `${0}%`
|
||||
// }
|
||||
// }
|
||||
// defaultCofig.series[0].label.formatter = () => {
|
||||
// return `{value|${props.total}}` + '\n' + `{name|${props.label} }`
|
||||
// }
|
||||
setOption({},true)
|
||||
const changeChart = setOption({
|
||||
...defaultCofig,
|
||||
...props.config
|
||||
})
|
||||
|
||||
changeChart.off('legendselectchanged');
|
||||
changeChart.on('legendselectchanged', function (e) {
|
||||
console.log(e,'e')
|
||||
var echartsArr = [];
|
||||
for (let key in e.selected) {
|
||||
if (e.selected[key]) {
|
||||
echartsArr.push(key)
|
||||
}
|
||||
defaultCofig.series[0].data = props.dataList
|
||||
defaultCofig.series[0].label.formatter = () => {
|
||||
return `{value|${props.total}}` + '\n' + `{name|${props.label} }`
|
||||
}
|
||||
var echartsNum = 0;
|
||||
props.dataList.forEach(item => {
|
||||
if(echartsArr.includes(item.name)){
|
||||
echartsNum += parseFloat(item.value)
|
||||
}
|
||||
})
|
||||
|
||||
defaultCofig.series[0].label.formatter = `{value|${parseInt(echartsNum/100*props.total)}}` + '\n' + `{name|${props.label}}`;
|
||||
setOption({
|
||||
...defaultCofig,
|
||||
...props.config
|
||||
})
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -183,7 +212,7 @@
|
||||
top:0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size:font-vw(22);
|
||||
font-size:vw(18);
|
||||
// color:#999;
|
||||
color:#02f9fa;
|
||||
display: flex;
|
||||
|
||||
@@ -81,8 +81,7 @@
|
||||
show: false
|
||||
},
|
||||
legend: {
|
||||
show: false,
|
||||
|
||||
show: false
|
||||
},
|
||||
grid: {
|
||||
left: '4%',
|
||||
@@ -115,7 +114,7 @@
|
||||
show: true,
|
||||
axisLabel: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(11),
|
||||
fontSize: fitChartSize(18),
|
||||
verticalAlign: 'bottom',
|
||||
padding: [0, -fitChartSize(10), fitChartSize(10), 0],
|
||||
inside: true,
|
||||
@@ -126,7 +125,7 @@
|
||||
value: {
|
||||
align: 'center',
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(20)
|
||||
fontSize: fitChartSize(14)
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -149,7 +148,7 @@
|
||||
fontWeight: 500,
|
||||
position: 'left',
|
||||
align: 'left',
|
||||
fontSize: fitChartSize(20),
|
||||
fontSize: fitChartSize(14),
|
||||
formatter: function (params) {
|
||||
return params.data.name ?? '其他'
|
||||
}
|
||||
@@ -187,7 +186,7 @@
|
||||
top:0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size:vw(20);
|
||||
font-size:vw(18);
|
||||
// color:#999;
|
||||
color:#02f9fa;
|
||||
display: flex;
|
||||
@@ -195,7 +194,7 @@
|
||||
justify-content: center;
|
||||
}
|
||||
.top {
|
||||
width: vw(290);
|
||||
height: vh(650);
|
||||
width: vw(250);
|
||||
height: vh(366);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
legend: {
|
||||
show: true,
|
||||
x: 'center',
|
||||
y: '72%',
|
||||
y: 'bottom',
|
||||
itemHeight: fitChartSize(12),
|
||||
itemWidth: fitChartSize(12),
|
||||
itemGap: fitChartSize(6),
|
||||
@@ -102,6 +102,7 @@
|
||||
let obj = props.list.find((item) => item.name == name)
|
||||
return '{name|' + name + '} {value|' + obj?.value + '}{value|%}'
|
||||
}
|
||||
|
||||
// if(obj.value){
|
||||
// obj.value?obj.value:0;
|
||||
|
||||
@@ -112,12 +113,12 @@
|
||||
rich: {
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(12)
|
||||
},
|
||||
value: {
|
||||
color: '#00D5F6',
|
||||
fontWeight: 600,
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -164,7 +165,7 @@
|
||||
top:0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size:fonnt-vw(20);
|
||||
font-size:vw(18);
|
||||
// color:#999;
|
||||
color:#02f9fa;
|
||||
display: flex;
|
||||
@@ -227,12 +228,12 @@
|
||||
}
|
||||
&-item-label {
|
||||
font-weight: 400;
|
||||
font-size: vw(18);
|
||||
font-size: vw(12);
|
||||
line-height: vh(14);
|
||||
}
|
||||
&-item-value {
|
||||
font-weight: bold;
|
||||
font-size: vw(22);
|
||||
font-size: vw(16);
|
||||
line-height: vh(18);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,9 +20,9 @@
|
||||
.title-1 {
|
||||
position: relative;
|
||||
.title {
|
||||
margin: vh(20) auto;
|
||||
width: vw(640);
|
||||
height: vh(66);
|
||||
margin: vh(10) auto;
|
||||
width: vw(468);
|
||||
height: vh(32);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
@@ -30,7 +30,7 @@
|
||||
background-size: 100% 100%;
|
||||
& > span {
|
||||
font-weight: 800;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(16);
|
||||
background-image: linear-gradient(to bottom, #ffffff 0%, #75c1ff 100%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
|
||||
<style scoped lang="scss">
|
||||
.title-2 {
|
||||
min-width: vw(240);
|
||||
height: vh(80);
|
||||
width: vw(240);
|
||||
height: vh(28);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
// background-image: url('@/assets/images/title-5.png');
|
||||
@@ -47,7 +47,7 @@
|
||||
}
|
||||
& span {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(15);
|
||||
background-image: linear-gradient(to bottom, #ffffff 0%, #75c1ff 100%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
|
||||
@@ -16,17 +16,17 @@
|
||||
<style scoped lang="scss">
|
||||
.title-3 {
|
||||
position: relative;
|
||||
// min-width: vw(400);
|
||||
height: vh(22);
|
||||
width: 100%;
|
||||
height: vh(12);
|
||||
margin-top: vh(20);
|
||||
background-image: url('@/assets/images/title-6.png');
|
||||
background-size: 100% 100%;
|
||||
|
||||
background-size: 100%;
|
||||
& > span {
|
||||
position: absolute;
|
||||
bottom: vh(4);
|
||||
left: vw(20);
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(15);
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(to bottom, #ffffff 0%, #0096ff 100%);
|
||||
-webkit-background-clip: text;
|
||||
|
||||
@@ -231,7 +231,7 @@ onMounted(()=>{
|
||||
text-align: center;
|
||||
// line-height: vh(24);
|
||||
font-weight: 400;
|
||||
font-size:font-vw(16);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
// background-image: url('@/assets/images/unfollow.png');
|
||||
background-size: 100% 100%;
|
||||
@@ -263,7 +263,7 @@ onMounted(()=>{
|
||||
> span {
|
||||
margin: 0 vw(16);
|
||||
font-weight: 400;
|
||||
font-size:font-vw(16);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
}
|
||||
.pause {
|
||||
@@ -279,7 +279,7 @@ onMounted(()=>{
|
||||
height: vw(980);
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
font-size:font-vw(30);
|
||||
font-size: vw(30);
|
||||
transform: translate(-50%, -50%);
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
v-for="(item, index) in navList"
|
||||
:key="index"
|
||||
>
|
||||
{{ item.dictLabel }}
|
||||
{{ item }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -13,9 +13,9 @@ export function useEchart() {
|
||||
const setOption = (params, update = false) => {
|
||||
initChart()
|
||||
chart.setOption(params, update)
|
||||
return chart;
|
||||
}
|
||||
const clearOption = () => {
|
||||
console.log('clearooooooooooooooooo')
|
||||
// 将series设置为空数组,可以清空图表内容
|
||||
chart.setOption({
|
||||
series:[]
|
||||
|
||||
@@ -3,7 +3,7 @@ export function useWebSocket(url) {
|
||||
let socket = ref(null) // socket对象
|
||||
let isConnected = ref(false) // 是否连接成功
|
||||
let dataRes = ref(null) // 存储推送数据
|
||||
|
||||
let timer=null;
|
||||
const connectWebSocket = () => {
|
||||
socket.value = new WebSocket(url, 'echo-protocol', {
|
||||
headers: {
|
||||
@@ -28,6 +28,19 @@ export function useWebSocket(url) {
|
||||
socket.value.onclose = (event) => {
|
||||
isConnected.value = false
|
||||
console.log('WebSocket close:',url, event)
|
||||
if(!timer){
|
||||
timer =setInterval(() => {
|
||||
if(!isConnected.value){
|
||||
console.log('重连中...')
|
||||
connectWebSocket()
|
||||
}else if(isConnected.value){
|
||||
clearInterval(timer)
|
||||
timer = null;
|
||||
}
|
||||
}, 5000);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getPreviewUrlApi,getColletListApi } from '@/api/home'
|
||||
import {getVideoListApi, getColletListApi, getPreviewUrlApi} from '@/api/home'
|
||||
import { postVideoCollectApi } from '@/api/monitor'
|
||||
|
||||
import primary from '@/assets/images/item-primary.png'
|
||||
@@ -77,9 +77,14 @@
|
||||
getVideoList()
|
||||
})
|
||||
}
|
||||
const handleItem = (item) => {
|
||||
const handleItem = async (item) => {
|
||||
console.log(item, 'iscollect')
|
||||
src.value = item.hlsUrl
|
||||
let res = await getPreviewUrlApi({
|
||||
cameraIndexCode: item.cameraIndexCode,
|
||||
type: 'hls',
|
||||
subStream:0
|
||||
})
|
||||
src.value = res.data.url
|
||||
isCollect.value = item.isCollect
|
||||
isDiy.value = item.isDiy
|
||||
cameraIndexCode.value = item.cameraIndexCode
|
||||
@@ -96,9 +101,8 @@
|
||||
pubSub.publish('videoCollect')
|
||||
}
|
||||
const handleClose = () => {
|
||||
modelValue.value = false
|
||||
clearHlsRefs()
|
||||
|
||||
modelValue.value = false
|
||||
}
|
||||
const clearHlsRefs = () => {
|
||||
if (hlsRefs.length > 0) {
|
||||
@@ -135,7 +139,7 @@
|
||||
player.on('error', (error) => {
|
||||
console.error('错误:', error.message, error.type)
|
||||
if(error.type ==='REQUEST_ERROR' || error.type ==='NOT_FOUND_ERROR'){
|
||||
createPlayer(cameraIndexCode,videoElement);
|
||||
createPlayer(cameraIndexCode,videoElement)
|
||||
}
|
||||
})
|
||||
player.on('play:failed', (err) => {
|
||||
@@ -168,7 +172,7 @@
|
||||
break;
|
||||
default:
|
||||
console.log('无法恢复的错误,销毁播放器');
|
||||
// hls.destroy();
|
||||
hls.destroy();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -198,8 +202,8 @@
|
||||
<style scoped lang="scss">
|
||||
.z-dialog {
|
||||
:deep(.el-dialog) {
|
||||
width: vw(2500);
|
||||
padding: vw(15);
|
||||
width: vw(2100);
|
||||
padding: vw(8);
|
||||
background-image: url('@/assets/images/dialog-bg.png') !important;
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
@@ -210,14 +214,14 @@
|
||||
.list {
|
||||
margin-top: vw(30);
|
||||
gap: vw(8);
|
||||
height: vh(1200);
|
||||
height: vh(860);
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-content: flex-start;
|
||||
.item {
|
||||
position: relative;
|
||||
width: vw(500);
|
||||
height: vh(400);
|
||||
width: vw(410);
|
||||
height: vh(280);
|
||||
padding: vw(12);
|
||||
box-sizing: border-box;
|
||||
background-image: url('@/assets/images/item-primary.png');
|
||||
@@ -236,8 +240,8 @@
|
||||
> span {
|
||||
padding-left: vw(10);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
line-height: vw(18);
|
||||
font-size: vw(14);
|
||||
line-height: vw(14);
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
@@ -248,15 +252,13 @@
|
||||
right: vw(4);
|
||||
top: vw(4);
|
||||
z-index: 99;
|
||||
min-width: vw(100);
|
||||
height: vw(50);
|
||||
width: vw(64);
|
||||
height: vw(30);
|
||||
text-align: center;
|
||||
// line-height: vw(50);
|
||||
line-height: vw(30);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(12);
|
||||
color: #ffffff;
|
||||
padding:vw(10);
|
||||
box-sizing: border-box;
|
||||
background-image: url('@/assets/images/unfollow.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
|
||||
@@ -10,25 +10,14 @@
|
||||
:key="index"
|
||||
@click="handleItem(item)"
|
||||
>
|
||||
<HlsPlayer :url="item.hlsUrl" />
|
||||
<div class="item-unfollow" @click.stop="handleUnfollow(item.cameraIndexCode, index)">取消关注</div>
|
||||
<!-- <div>
|
||||
<p class="item-title--primary">
|
||||
{{ item.cameraName || item.cameraIndexCode }}
|
||||
</p>
|
||||
|
||||
<video
|
||||
class="item-img"
|
||||
:id="'video' + index"
|
||||
muted
|
||||
autoplay
|
||||
:controls="false"
|
||||
:src="item.hlsUrl"
|
||||
controlsList="nodownload"
|
||||
>
|
||||
<source src="" type="application/x-mpegURL" />
|
||||
</video>
|
||||
</div> -->
|
||||
></video>
|
||||
<div class="item-unfollow" @click.stop="handleUnfollow(item.cameraIndexCode, index)">取消关注</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -50,6 +39,7 @@
|
||||
|
||||
import { useWebSocket } from '@/hooks/socket'
|
||||
import { mode, socketBaseUrl, proSocketBaseUrl } from '@/utils/config'
|
||||
import WebRTCWhep from 'whepts'
|
||||
|
||||
const { dataRes } = useWebSocket(
|
||||
`${mode == 'dev' ? socketBaseUrl : proSocketBaseUrl}/ws/securityAlerts`
|
||||
@@ -69,11 +59,17 @@ let isCollect = ref(0)
|
||||
let cameraIndexCode = ref('')
|
||||
let videoShow = ref(false)
|
||||
let allShow = ref(false)
|
||||
let webrtcRefs = []
|
||||
let hlsRefs = []
|
||||
let timer = null
|
||||
let isDiy = ref(0)
|
||||
const handleItem = (item) => {
|
||||
src.value = item.hlsUrl
|
||||
const handleItem = async (item) => {
|
||||
let res = await getPreviewUrlApi({
|
||||
cameraIndexCode: item.cameraIndexCode,
|
||||
type: 'hls',
|
||||
subStream:0
|
||||
})
|
||||
src.value = res.data.url
|
||||
cameraIndexCode.value = item.cameraIndexCode
|
||||
isCollect.value = item.isCollect
|
||||
isDiy.value = item.isDiy
|
||||
@@ -98,34 +94,76 @@ let isCollect = ref(0)
|
||||
src.value = res.data.url
|
||||
videoShow.value = true
|
||||
}
|
||||
const createPlayer = (cameraIndexCode,videoElement) => {
|
||||
getPreviewUrlApi({
|
||||
type: 'hls',
|
||||
cameraIndexCode: cameraIndexCode,
|
||||
subStream:0
|
||||
}).then(res=>{
|
||||
const url = res.data.url;
|
||||
if(url.startsWith('http://192.168.77.200:8050/')){
|
||||
const player = new WebRTCWhep({
|
||||
url:url, // WHEP 服务器地址
|
||||
container: videoElement, // 视频播放容器
|
||||
iceServers: [{ urls: 'turn:192.168.77.200:3478',username: 'ZLMediaKit',credential: 'ZLMediaKit'}]
|
||||
})
|
||||
player.on('error', (error) => {
|
||||
if(error.type ==='REQUEST_ERROR' || error.type ==='NOT_FOUND_ERROR'){
|
||||
createPlayer(cameraIndexCode,videoElement);
|
||||
}
|
||||
})
|
||||
player.on('play:failed', (err) => {
|
||||
// createPlayer(cameraIndexCode,videoElement);
|
||||
})
|
||||
webrtcRefs.push(player)
|
||||
}
|
||||
else{
|
||||
const player = new Hls({
|
||||
maxBufferLength: 10, // 最大缓冲长度(秒)
|
||||
maxMaxBufferLength: 15, // 缓冲区长度的上限
|
||||
maxBufferSize: 30 * 1000 * 1000 // 最大缓冲大小(字节)
|
||||
})
|
||||
player.loadSource(url)
|
||||
player.attachMedia(videoElement)
|
||||
player.on(Hls.Events.MANIFEST_PARSED, () => {
|
||||
videoElement.play()
|
||||
})
|
||||
player.on(Hls.Events.ERROR, (event, data) => {
|
||||
// 根据错误类型进行处理
|
||||
if (data.fatal) {
|
||||
switch (data.type) {
|
||||
case Hls.ErrorTypes.NETWORK_ERROR:
|
||||
console.log('网络错误,尝试重新加载');
|
||||
player.startLoad();
|
||||
break;
|
||||
case Hls.ErrorTypes.MEDIA_ERROR:
|
||||
console.log('媒体错误,尝试修复');
|
||||
player.recoverMediaError();
|
||||
break;
|
||||
default:
|
||||
console.log('无法恢复的错误,销毁播放器');
|
||||
// hls.destroy();
|
||||
break;
|
||||
}
|
||||
}
|
||||
})
|
||||
hlsRefs.push(player)
|
||||
}
|
||||
})
|
||||
}
|
||||
const getVideoList = async () => {
|
||||
let res = await getColletListApi({
|
||||
pageNum: 1,
|
||||
pageSize: 5
|
||||
})
|
||||
list.value = res.data
|
||||
postVideoRemain()
|
||||
if (timer) clearInterval(timer)
|
||||
// console.log(list.value,'list.valuelist.valuelist.valuelist.value')
|
||||
// nextTick(() => {
|
||||
// list.value.forEach(async (item, index) => {
|
||||
// var video = document.getElementById(`video${index}`)
|
||||
// const hls = new Hls({
|
||||
// enableWorker: false, // 禁用 Worker 来避免额外的线程
|
||||
// enableSoftwareAES: true, // 使用软件解码器以避免硬件解码的额外请求
|
||||
// cache: true, // 启用缓存
|
||||
// maxBufferLength: 10, // 最大缓冲长度(秒)
|
||||
// maxMaxBufferLength: 15, // 缓冲区长度的上限
|
||||
// maxBufferSize: 20 * 1000 * 1000 // 最大缓冲大小(字节)
|
||||
// })
|
||||
// hls.loadSource(item.hlsUrl)
|
||||
// hls.attachMedia(video)
|
||||
// hls.on(Hls.Events.MANIFEST_PARSED, () => {
|
||||
// video.play()
|
||||
// })
|
||||
// hlsRefs.push(hls)
|
||||
// })
|
||||
// })
|
||||
nextTick(() => {
|
||||
list.value.forEach(async (item, index) => {
|
||||
var videoElement = document.getElementById(`video${index}`)
|
||||
createPlayer(item.cameraIndexCode,videoElement);
|
||||
})
|
||||
})
|
||||
}
|
||||
watch(
|
||||
() => list.value,
|
||||
@@ -143,12 +181,22 @@ let isCollect = ref(0)
|
||||
})
|
||||
hlsRefs = []
|
||||
}
|
||||
if(webrtcRefs.length>0){
|
||||
webrtcRefs.map((item) => {
|
||||
try{
|
||||
item.close()
|
||||
}catch (e) {
|
||||
|
||||
}
|
||||
})
|
||||
webrtcRefs = [];
|
||||
}
|
||||
getVideoList()
|
||||
}
|
||||
const onVideoCollect = () => {
|
||||
pubSub.subscribe('videoCollect', () => {
|
||||
clearHlsRefs()
|
||||
// getVideoList()
|
||||
getVideoList()
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div class="correspondence">
|
||||
<div class="top-box">
|
||||
<div class="title">融合通信</div>
|
||||
<div class="icon-box flex" style="height: initial;">
|
||||
<div class="icon-box flex">
|
||||
<div
|
||||
class="item"
|
||||
v-for="item in deptsList"
|
||||
@@ -340,8 +340,6 @@
|
||||
.item-name {
|
||||
width: 90%;
|
||||
text-align: center;
|
||||
line-height: 1.6;
|
||||
font-size:vw(18);
|
||||
}
|
||||
.sp-img {
|
||||
width: vw(100);
|
||||
@@ -349,8 +347,7 @@
|
||||
.correspondence {
|
||||
margin: vw(8);
|
||||
width: vw(300);
|
||||
// height: vh(1070);
|
||||
height: 100%;
|
||||
height: vh(1070);
|
||||
background-image: url('@/assets/images/bg-1.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
@@ -373,11 +370,11 @@
|
||||
}
|
||||
.table {
|
||||
width: 100%;
|
||||
margin-top: vh(20);
|
||||
margin-top: vh(5);
|
||||
.header {
|
||||
height: vh(28);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(12);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
background: linear-gradient(180deg, rgba(0, 99, 255, 0) 0%, #0063ff 100%);
|
||||
@@ -407,7 +404,7 @@
|
||||
.item {
|
||||
height: vh(50);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #f1f7ff;
|
||||
display: flex;
|
||||
&:nth-child(2n + 1) {
|
||||
@@ -433,7 +430,7 @@
|
||||
span {
|
||||
margin-left: vw(30);
|
||||
font-weight: 800;
|
||||
font-size: font-vw(15);
|
||||
font-size: vw(15);
|
||||
line-height: vh(26);
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
@@ -449,10 +446,9 @@
|
||||
.top-box {
|
||||
width: 100%;
|
||||
height: vh(500);
|
||||
height:50%;
|
||||
.icon-box {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
line-height: vh(16);
|
||||
flex-wrap: wrap;
|
||||
@@ -479,7 +475,7 @@
|
||||
text-align: center;
|
||||
line-height: vh(26);
|
||||
margin-left: vw(32.5);
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(16);
|
||||
font-weight: 800;
|
||||
color: #fff;
|
||||
background-image: url('@/assets/images/title-1.png');
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
<div v-if="isBack" class="back2" @click="handleHome">
|
||||
<img class="icon" src="@/assets/images/home.png" alt="" /> 首页
|
||||
</div>
|
||||
<div class="btn-all" :class="!isBack?'all-home':''" v-if="!isBack" @click="allShow = true" >核心景区视频</div>
|
||||
<ul class="nav-left">
|
||||
<li
|
||||
class="nav-left-item"
|
||||
@@ -86,29 +85,25 @@
|
||||
<div class="weather">
|
||||
<span>{{ weatherData?.temperature }}-{{ weatherData?.skycon }}</span>
|
||||
<span class="line">|</span>
|
||||
|
||||
<!-- <span class="line">|</span> -->
|
||||
<span>空气质量:{{ weatherData?.airQuality }}</span>
|
||||
<div class="top-20">
|
||||
<span>风速:{{ weatherData?.windSpeed }}</span>
|
||||
</div>
|
||||
<span class="line">|</span>
|
||||
<span>空气质量:{{ weatherData?.airQuality }}</span>
|
||||
</div>
|
||||
<p class="date">{{ currentDate }}</p>
|
||||
<div v-if="isBack" class="back" @click="handleBack">
|
||||
<img class="icon" src="@/assets/images/back.png" alt="" /> 返回
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="amplify" @click="handleAmplify">
|
||||
<div class="amplify" @click="handleAmplify">
|
||||
<img class="icon-qp" src="@/assets/images/qping.png" alt="" />
|
||||
</div> -->
|
||||
<all-list v-model="allShow" />
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
||||
</script>
|
||||
<script setup>
|
||||
import { useRouter } from 'vue-router'
|
||||
import allList from '../CoreVideo/allList'
|
||||
|
||||
import title2 from '@/assets/images/title-2.png'
|
||||
import title3 from '@/assets/images/title-3.png'
|
||||
import title2Select from '@/assets/images/title-2-select.png'
|
||||
@@ -124,7 +119,7 @@
|
||||
const homeStore = useHomeStore()
|
||||
const scenicStore = useScenicStore()
|
||||
const router = useRouter()
|
||||
let allShow = ref(false)
|
||||
|
||||
let currentDate = ref('')
|
||||
let weatherData = ref({})
|
||||
let title = ref('')
|
||||
@@ -172,6 +167,7 @@
|
||||
router.push('/home')
|
||||
}
|
||||
const handleCommand = (item, type) => {
|
||||
|
||||
current.value = ''
|
||||
if (type === 'hotel') {
|
||||
otherRightLabel.value = '其他场馆'
|
||||
@@ -195,7 +191,6 @@
|
||||
|
||||
// 点击导航
|
||||
const handleNav = (item) => {
|
||||
|
||||
if (isSkip.value) {
|
||||
router.push(item.path)
|
||||
} else {
|
||||
@@ -218,7 +213,6 @@
|
||||
otherLeftLabel.value = '其他酒店'
|
||||
otherRightLabel.value = '其他场馆'
|
||||
pubSub.publish('hotelChange', item)
|
||||
// console.log(item,'hotelChange')
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -268,8 +262,7 @@
|
||||
isSkip.value = false
|
||||
isBack.value = true
|
||||
let res = await getSpotListApi()
|
||||
navLeft.value = res.data
|
||||
|
||||
navLeft.value = res.data.slice(0,3)
|
||||
current.value = res.data[0].id
|
||||
title.value = navLeft.value[0].name
|
||||
pubSub.publish('scenicChange', navLeft.value[0])
|
||||
@@ -313,7 +306,7 @@
|
||||
scenicSpotId: '',
|
||||
id:10086,
|
||||
},
|
||||
...spotRes.data
|
||||
...spotRes.data.slice(0,3)
|
||||
]
|
||||
if(monitorDefaultData.value){
|
||||
current.value = monitorDefaultData.value.id
|
||||
@@ -375,11 +368,10 @@
|
||||
let hotelRes = await getHotelListApi({ hotelStadiumType: 1 })
|
||||
navLeft.value = hotelRes.data.slice(0, 3)
|
||||
current.value = navLeft.value[0].id
|
||||
otherLeftNav.value = hotelRes.data.slice(3, hotelRes.data.length - 1)
|
||||
otherLeftNav.value = hotelRes.data.slice(3, hotelRes.data.length)
|
||||
let venueRes = await getHotelListApi({ hotelStadiumType: 2 })
|
||||
// console.log(venueRes,'venueRes')
|
||||
navRight.value = venueRes.data.slice(0, 3)
|
||||
otherRightNav.value = venueRes.data.slice(3, venueRes.data.length - 1)
|
||||
otherRightNav.value = venueRes.data.slice(3, venueRes.data.length)
|
||||
pubSub.publish('hotelChange', hotelRes.data[0])
|
||||
break
|
||||
}
|
||||
@@ -419,9 +411,6 @@
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.top-20{
|
||||
margin-top:vh(20);
|
||||
}
|
||||
.amplify{
|
||||
position:absolute;
|
||||
right:vw(20);
|
||||
@@ -435,10 +424,10 @@
|
||||
left: vw(326);
|
||||
.weather {
|
||||
position: absolute;
|
||||
right: vw(-300);
|
||||
top: vh(30);
|
||||
right: 0;
|
||||
top: vh(10);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(18);
|
||||
color: #ffffff;
|
||||
.line {
|
||||
margin: 0 vw(10);
|
||||
@@ -446,20 +435,20 @@
|
||||
}
|
||||
.date {
|
||||
position: absolute;
|
||||
left: vw(-300);
|
||||
top: vh(30);
|
||||
left: 0;
|
||||
top: vh(10);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(18);
|
||||
color: #ffffff;
|
||||
}
|
||||
.back {
|
||||
position: absolute;
|
||||
right: vw(240);
|
||||
top: vh(30);
|
||||
width: vw(150);
|
||||
height: vh(56);
|
||||
right: 0;
|
||||
top: vh(50);
|
||||
width: vw(130);
|
||||
height: vh(36);
|
||||
font-weight: 600;
|
||||
font-size: vw(22);
|
||||
font-size: vw(20);
|
||||
color: #ffffff;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
@@ -470,39 +459,18 @@
|
||||
background: linear-gradient(270deg, rgba(8, 41, 86, 0.16) 0%, #0b61b4 100%);
|
||||
.icon {
|
||||
margin-right: vw(10);
|
||||
width: vw(34);
|
||||
width: vw(24);
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
.btn-all{
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
left: vw(140);
|
||||
top: vh(30);
|
||||
min-width: vw(180);
|
||||
padding:0 vw(15);
|
||||
height: vh(56);
|
||||
font-weight: 600;
|
||||
font-size: vw(22);
|
||||
color: #ffffff;
|
||||
background: linear-gradient(270deg, rgba(8, 41, 86, 0.16) 0%, #0b61b4 100%);
|
||||
border-radius: vw(60);
|
||||
border: 1px solid rgba(0, 114, 220, 0.3);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.all-home{
|
||||
left: vw(20);
|
||||
}
|
||||
.back2 {
|
||||
position: absolute;
|
||||
left: vw(-50);
|
||||
top: vh(30);
|
||||
width: vw(150);
|
||||
height: vh(56);
|
||||
left: 0;
|
||||
top: vh(50);
|
||||
width: vw(130);
|
||||
height: vh(36);
|
||||
font-weight: 600;
|
||||
font-size: vw(22);
|
||||
font-size: vw(20);
|
||||
color: #ffffff;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
@@ -513,7 +481,7 @@
|
||||
background: linear-gradient(270deg, rgba(8, 41, 86, 0.16) 0%, #0b61b4 100%);
|
||||
.icon {
|
||||
margin-right: vw(10);
|
||||
width: vw(34);
|
||||
width: vw(24);
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
@@ -551,7 +519,7 @@
|
||||
height: vh(56);
|
||||
line-height: vh(46);
|
||||
font-weight: 600;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(28);
|
||||
text-align: center;
|
||||
padding: 0 vw(50);
|
||||
color: rgba(208, 236, 255, 0.9);
|
||||
@@ -578,7 +546,7 @@
|
||||
height: vh(56);
|
||||
line-height: vh(46);
|
||||
font-weight: 600;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(28);
|
||||
text-align: center;
|
||||
color: rgba(208, 236, 255, 0.9);
|
||||
background-image: url('@/assets/images/title-3.png');
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<template>
|
||||
<Header />
|
||||
<div class="flex flex-1">
|
||||
<!-- <core-video v-if="homeStore.amplify" /> -->
|
||||
<core-video v-if="homeStore.amplify" />
|
||||
<div class="mian">
|
||||
<router-view />
|
||||
</div>
|
||||
<!-- <correspondence v-if="homeStore.amplify"/> -->
|
||||
<correspondence v-if="homeStore.amplify"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ export const useScenicStore = defineStore('scenic', () => {
|
||||
infoList: [
|
||||
{ name: '游玩舒适度', type: 0, value: '空闲' },
|
||||
// { name: '景区安全', type: 0, value: '安全' },
|
||||
{ name: '通景交通', type: 0, value: '通畅' },
|
||||
{ name: '交通拥堵度', type: 0, value: '通畅' },
|
||||
{ name: '停车场负荷', type: 0, value: '空闲' }
|
||||
]
|
||||
})
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
@use 'sass:math';
|
||||
|
||||
//默认设计稿的宽度
|
||||
$designWidth: 3840;
|
||||
$designWidth: 3822;
|
||||
//默认设计稿的高度
|
||||
$designHeight: 2160;
|
||||
|
||||
$designHeight: 1080;
|
||||
|
||||
//px转为vw的函数
|
||||
@function vw($px) {
|
||||
@@ -15,41 +14,3 @@ $designHeight: 2160;
|
||||
@function vh($px) {
|
||||
@return math.div($px, $designHeight) * 100vh;
|
||||
}
|
||||
// 字体大小转为vw的函数(放大1.4倍)
|
||||
/// 将像素值转换为vw单位,并自动放大1.4倍
|
||||
/// @param {Number} $px - 设计稿中的像素值
|
||||
/// @return {String} - 转换后的vw单位值
|
||||
@function font-vw($px) {
|
||||
$scaled-px: $px * 1.4;
|
||||
@return math.div($scaled-px, $designWidth) * 100vw;
|
||||
}
|
||||
|
||||
// 字体大小转为vh的函数(放大1.4倍)
|
||||
/// 将像素值转换为vh单位,并自动放大1.4倍
|
||||
/// @param {Number} $px - 设计稿中的像素值
|
||||
/// @return {String} - 转换后的vh单位值
|
||||
@function font-vh($px) {
|
||||
$scaled-px: $px * 1.4;
|
||||
@return math.div($scaled-px, $designHeight) * 100vh;
|
||||
}
|
||||
// 字体大小声明mixin(默认使用vw单位)
|
||||
/// 声明字体大小,自动应用1.4倍放大
|
||||
/// @param {Number} $px - 设计稿中的像素值
|
||||
/// @param {String} $unit - 单位类型,可选'vw'或'vh',默认'vw'
|
||||
@mixin font-size($px, $unit: vw) {
|
||||
@if $unit == vw {
|
||||
font-size: font-vw($px);
|
||||
} @else if $unit == vh {
|
||||
font-size: font-vh($px);
|
||||
} @else {
|
||||
@error "Unsupported unit: #{$unit}. Use 'vw' or 'vh'.";
|
||||
}
|
||||
}
|
||||
// 通用放大函数
|
||||
/// 将值按指定比例放大
|
||||
/// @param {Number} $value - 原始值
|
||||
/// @param {Number} $factor - 放大系数,默认1.4
|
||||
/// @return {Number} - 放大后的值
|
||||
@function scale($value, $factor: 1.4) {
|
||||
@return $value * $factor;
|
||||
}
|
||||
@@ -7,6 +7,6 @@ export const proSocketBaseUrl = 'ws://192.168.77.200:8060'
|
||||
export const mode = 'pro' // 测试 dev 正式 pro
|
||||
|
||||
export const devToken =
|
||||
'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImE1OWFmNWYwLTU3OWItNDJkNy1hZDJhLTY0Y2JlODA5ZWI1NiJ9.BTxvu6jUWbN0qONWf5K6VzXopE8T8qXzKuX-mij21VJT4U0LdgnqToyqeNDQ2OyJ6cvpdJBzQ9mEEb-dnwrTpQ'
|
||||
'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImE1OWFmNWYwLTU3OWItNDJkNy1hZDJhLTY0Y2JlODA5ZWI1NiJ9.BTxvu6jUWbN0qONWf5K6VzXopE8T8qXzKuX-mij21VJT4U0LdgnqToyqeNDQ2OyJ6cvpdJBzQ9mEEb-dnwrTpQ11'
|
||||
export const proToken =
|
||||
'eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImE1OWFmNWYwLTU3OWItNDJkNy1hZDJhLTY0Y2JlODA5ZWI1NiJ9.dSLZekRsYf5ZZDCYqFEOgHTi4GeHD0m10gGHXrbgpc-hD52Zt7Vw05cxhQ-lzY29yf2IxH0oYi28DBfHdtf9SA'
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* Echarts图表尺寸自适应 */
|
||||
export const fitChartSize = (size, width = 3840) => {
|
||||
export const fitChartSize = (size, width = 3822) => {
|
||||
let clientWidth =
|
||||
window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth
|
||||
if (!clientWidth) return size
|
||||
let scale = clientWidth / width
|
||||
return Number((size * scale).toFixed(3))*1.4
|
||||
return Number((size * scale).toFixed(3))
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
//默认设计稿的宽度
|
||||
const designWidth = 3840
|
||||
const designWidth = 3822
|
||||
//默认设计稿的高度
|
||||
const designHeight = 2160
|
||||
const designHeight = 1080
|
||||
|
||||
let styleUtil = {
|
||||
// px转vw
|
||||
px2vw: function (_px) {
|
||||
return ((_px * 100.0*4) / designWidth).toFixed(3) + 'vw'
|
||||
return ((_px * 100.0) / designWidth).toFixed(3) + 'vw'
|
||||
},
|
||||
// px转vh
|
||||
px2vh: function (_px) {
|
||||
return ((_px * 100.0*4) / designHeight).toFixed(3) + 'vh'
|
||||
return ((_px * 100.0) / designHeight).toFixed(3) + 'vh'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -52,29 +52,7 @@
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- <div class="pagination">
|
||||
<el-pagination
|
||||
v-model:current-page="params.pageNum"
|
||||
:page-size="params.pageSize"
|
||||
:total="total"
|
||||
background
|
||||
layout="prev, pager, next"
|
||||
@current-change="currentChange"
|
||||
/>
|
||||
</div> -->
|
||||
</div>
|
||||
|
||||
<!-- <ul class="videos">
|
||||
<li class="video-item" v-for="item in 8" :key="item">
|
||||
<img src="@/assets/images/sxzd.png" alt="" />
|
||||
<p>
|
||||
<span>核心路段:这是一条信息说明</span>
|
||||
</p>
|
||||
</li>
|
||||
</ul> -->
|
||||
<!-- <div class="pagination-box">
|
||||
<el-pagination background layout="prev, pager, next" :total="1000" />
|
||||
</div> -->
|
||||
</div>
|
||||
<VideoDialog v-model="show" :cameraIndexCode="cameraIndexCode" @isDiyChange="isDiyChange" :isDiy="isDiy" :isCollect="isCollect" :src="videoSrc" />
|
||||
</template>
|
||||
@@ -247,7 +225,7 @@ const handleCamera = async (itemCode,resource,index) => {
|
||||
let res = await getPreviewUrlApi({
|
||||
type: 'hls',
|
||||
cameraIndexCode:itemCode,
|
||||
sub_stream: 0
|
||||
subStream:0
|
||||
})
|
||||
cameraIndexCode.value = itemCode;
|
||||
isCollect.value = resource.isCollect
|
||||
@@ -258,15 +236,23 @@ const handleCamera = async (itemCode,resource,index) => {
|
||||
const clearHlsRefs = () => {
|
||||
if (hlsRefs.length > 0) {
|
||||
hlsRefs.map((item) => {
|
||||
try{
|
||||
item.destroy()
|
||||
}catch (e) {
|
||||
|
||||
}
|
||||
})
|
||||
hlsRefs = []
|
||||
}
|
||||
if(webrtcRefs.length>0){
|
||||
webrtcRefs.map((item) => {
|
||||
try{
|
||||
item.close()
|
||||
}catch (e) {
|
||||
|
||||
}
|
||||
})
|
||||
webrtcRefs = []
|
||||
webrtcRefs = [];
|
||||
}
|
||||
}
|
||||
// 分页
|
||||
@@ -315,11 +301,11 @@ const createPlayer = (cameraIndexCode,videoElement) => {
|
||||
}
|
||||
})
|
||||
player.on('play:failed', (err) => {
|
||||
// console.log('播放失败:', err)
|
||||
// createPlayer(cameraIndexCode,videoElement);
|
||||
})
|
||||
webrtcRefs.push(player)
|
||||
}
|
||||
else{
|
||||
}else{
|
||||
const player = new Hls({
|
||||
maxBufferLength: 10, // 最大缓冲长度(秒)
|
||||
maxMaxBufferLength: 15, // 缓冲区长度的上限
|
||||
@@ -398,6 +384,7 @@ const getVideoRegions = async () => {
|
||||
cameraName: cameraName.value,
|
||||
businessScenicArea: params.businessScenicArea
|
||||
})
|
||||
console.log(res,11111111111111)
|
||||
regionList.value = res.data
|
||||
regionList.value.forEach((item,index)=>{
|
||||
// item.show = true
|
||||
@@ -431,7 +418,7 @@ onUnmounted(() => {
|
||||
border:vw(2) solid #0096FF;
|
||||
padding:vh(40) vw(20);
|
||||
position:relative;
|
||||
height:vh(1950);
|
||||
height:vh(900);
|
||||
padding-bottom:vh(20);
|
||||
.item-element{
|
||||
display: flex;
|
||||
@@ -465,7 +452,7 @@ onUnmounted(() => {
|
||||
width:100%;
|
||||
height:vh(30);
|
||||
padding:0 vw(30);
|
||||
font-size: font-vw(24);
|
||||
font-size:vw(24);
|
||||
line-height:vh(30);
|
||||
// line-height: vh(40);
|
||||
}
|
||||
@@ -482,7 +469,7 @@ onUnmounted(() => {
|
||||
.empty-box{
|
||||
display:flex;
|
||||
align-items: center;
|
||||
font-size: font-vw(40);
|
||||
font-size:vw(40);
|
||||
height:vh(750);
|
||||
justify-content: center;
|
||||
text-align:center;
|
||||
@@ -522,7 +509,7 @@ onUnmounted(() => {
|
||||
.video-box {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
// height: vh(950);
|
||||
height: vh(950);
|
||||
margin-top: vh(120);
|
||||
margin-left: vw(10);
|
||||
padding: vh(34) vw(26);
|
||||
@@ -555,7 +542,7 @@ onUnmounted(() => {
|
||||
> span {
|
||||
padding-left: vw(20);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
line-height: vh(40);
|
||||
}
|
||||
@@ -589,6 +576,7 @@ onUnmounted(() => {
|
||||
}
|
||||
&-list {
|
||||
// gap: vw(3);
|
||||
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-content: flex-start;
|
||||
@@ -607,13 +595,14 @@ onUnmounted(() => {
|
||||
// border-radius: 5px; /* 滑块的圆角 */
|
||||
// }
|
||||
// overflow: auto;
|
||||
|
||||
}
|
||||
&-item {
|
||||
position: relative;
|
||||
// width: vw(720);
|
||||
// width:48%;
|
||||
// margin-right: 1%;
|
||||
height: vh(600);
|
||||
height: vh(275);
|
||||
padding: vh(10) vw(10);
|
||||
box-sizing: border-box;
|
||||
margin-bottom:vh(6);
|
||||
@@ -633,11 +622,11 @@ onUnmounted(() => {
|
||||
top: vw(8);
|
||||
z-index: 9999;
|
||||
padding: 0 vw(20);
|
||||
height: vh(34);
|
||||
height: vh(24);
|
||||
text-align: center;
|
||||
line-height: vh(34);
|
||||
line-height: vh(24);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
background-image: url('@/assets/images/unfollow.png');
|
||||
background-size: 100% 100%;
|
||||
@@ -655,9 +644,9 @@ onUnmounted(() => {
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
padding: vh(20) vw(20);
|
||||
padding: vh(10) vw(10);
|
||||
color: #fff;
|
||||
font-size: vw(20);
|
||||
font-size: vw(14);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@@ -665,17 +654,15 @@ onUnmounted(() => {
|
||||
}
|
||||
&-item__title--error {
|
||||
@extend .video-item__title;
|
||||
font-size: font-vw(22);
|
||||
background-color: rgba(226, 27, 27, 0.72);
|
||||
}
|
||||
&-item__title--primary {
|
||||
@extend .video-item__title;
|
||||
font-size: font-vw(22);
|
||||
background-color: rgba(4, 30, 69, 0.72);
|
||||
}
|
||||
&-item__video {
|
||||
width: 100%;
|
||||
height: vh(580);
|
||||
height: vh(260);
|
||||
// height:100%;
|
||||
object-fit: fill;
|
||||
}
|
||||
@@ -699,7 +686,7 @@ onUnmounted(() => {
|
||||
top: 40 (vh);
|
||||
z-index: 9;
|
||||
font-weight: 400;
|
||||
font-size: vw(22);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
padding: vw(20);
|
||||
display: flex;
|
||||
@@ -774,7 +761,7 @@ onUnmounted(() => {
|
||||
width: 100%;
|
||||
padding: vw(10);
|
||||
color: #fff;
|
||||
font-size: vw(20);
|
||||
font-size: vw(14);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@@ -786,7 +773,6 @@ onUnmounted(() => {
|
||||
}
|
||||
&-title--primary {
|
||||
@extend .item-title;
|
||||
font-size: font-vw(20);
|
||||
background-color: rgba(4, 30, 69, 0.72);
|
||||
}
|
||||
&-img {
|
||||
|
||||
@@ -30,17 +30,16 @@
|
||||
|
||||
const init = () => {
|
||||
if (!params) {
|
||||
let center = ['50%', '30%']
|
||||
let center = ['25%', '50%']
|
||||
params = {
|
||||
color: ['#00B1FF', '#00FFFF', '#FF3737', '#DD5627', '#D3F0FE'],
|
||||
legend: {
|
||||
orient: 'vertical',
|
||||
// right: 0,
|
||||
y: '54%',
|
||||
bottom:20,
|
||||
right: 0,
|
||||
y: 'center',
|
||||
itemHeight: fitChartSize(8),
|
||||
itemWidth: fitChartSize(8),
|
||||
itemGap: fitChartSize(12),
|
||||
itemGap: fitChartSize(10),
|
||||
formatter: function (name) {
|
||||
let obj = props.list.find((item) => item.name == name)
|
||||
return '{name|' + name + '} {value|' + obj?.value + '}{value|%}'
|
||||
@@ -73,7 +72,7 @@
|
||||
label: {
|
||||
show: false,
|
||||
color: '#D3F0FE',
|
||||
fontSize: fitChartSize(14)
|
||||
fontSize: fitChartSize(12)
|
||||
},
|
||||
data: props.list || []
|
||||
},
|
||||
@@ -91,7 +90,7 @@
|
||||
label: {
|
||||
show: false,
|
||||
color: '#D3F0FE',
|
||||
fontSize: fitChartSize(14)
|
||||
fontSize: fitChartSize(12)
|
||||
},
|
||||
data: props.list
|
||||
},
|
||||
@@ -137,7 +136,7 @@
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.age {
|
||||
width: 90%;
|
||||
height: vh(420);
|
||||
width: vw(300);
|
||||
height: vh(150);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -31,14 +31,13 @@
|
||||
<span v-else class="statistic-value">暂无</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class=" rela">
|
||||
<div class="flex rela">
|
||||
<Title3 title="景区排队人数" />
|
||||
|
||||
</div>
|
||||
<div class="pt-20">
|
||||
<Line
|
||||
width="95%"
|
||||
:height="120"
|
||||
:width="370"
|
||||
:height="140"
|
||||
:config="{ legend: false }"
|
||||
:data="scenicQueueList"
|
||||
:xAxisData="scenicQueueXAxisData"
|
||||
@@ -60,8 +59,8 @@
|
||||
<Title3 title="今日景区承载量" />
|
||||
<div class="pt-20">
|
||||
<Line
|
||||
width="95%"
|
||||
:height="120"
|
||||
:width="370"
|
||||
:height="140"
|
||||
:config="{ legend: false }"
|
||||
:data="scenicBearList"
|
||||
:xAxisData="scenicBearXAxisData"
|
||||
@@ -122,12 +121,12 @@
|
||||
|
||||
<div class="box-1">
|
||||
<Title3 title="客源地TOP5" />
|
||||
<RegionTop :list="homeStore.userPortraitData.provinceRate" width="100%" :height="160" />
|
||||
<RegionTop :list="homeStore.userPortraitData.provinceRate" :width="230" :height="260" />
|
||||
</div>
|
||||
|
||||
<div class="box-1">
|
||||
<Title3 title="购票渠道" />
|
||||
<TicketSource :list="homeStore.userPortraitData.channel" width="100%" :height="160" />
|
||||
<TicketSource :list="homeStore.userPortraitData.channel" :width="230" :height="260" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -193,16 +192,16 @@
|
||||
.select-box {
|
||||
width:vw(200);
|
||||
height:vh(30);
|
||||
font-size: font-vw(16);
|
||||
font-size:vw(16);
|
||||
}
|
||||
.box-2 {
|
||||
margin-top: vh(120);
|
||||
width: vw(1200);
|
||||
// height: vh(953);
|
||||
width: vw(800);
|
||||
height: vh(953);
|
||||
padding: vw(8);
|
||||
box-sizing: border-box;
|
||||
// background-image: url('@/assets/images/bg-2.png');
|
||||
// background-size: 100% 100%;
|
||||
background-image: url('@/assets/images/bg-2.png');
|
||||
background-size: 100% 100%;
|
||||
.dropdown {
|
||||
position: absolute;
|
||||
right: vw(8);
|
||||
@@ -210,11 +209,11 @@
|
||||
z-index: 990;
|
||||
}
|
||||
.list {
|
||||
height: vh(104);
|
||||
height: vh(72);
|
||||
}
|
||||
.item {
|
||||
position: relative;
|
||||
height: vh(104);
|
||||
height: vh(52);
|
||||
margin: 0 vh(10);
|
||||
flex: 1;
|
||||
z-index: 1;
|
||||
@@ -224,35 +223,35 @@
|
||||
&-icon {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
// height: 100%;
|
||||
height: auto;
|
||||
z-index: -1;
|
||||
}
|
||||
&-label {
|
||||
position: absolute;
|
||||
left: vw(120);
|
||||
top: vh(-20);
|
||||
left: vw(70);
|
||||
top: vh(-10);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
}
|
||||
&-value {
|
||||
position: absolute;
|
||||
left: vw(120);
|
||||
left: vw(70);
|
||||
.countup-wrap {
|
||||
color: #02f9fa;
|
||||
font-size: font-vw(28);
|
||||
font-size: vw(28);
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
.unit {
|
||||
color: #02f9fa;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
margin-bottom: vh(4);
|
||||
}
|
||||
.box {
|
||||
width: 50%;
|
||||
height: vh(795);
|
||||
width: vw(384);
|
||||
height: vh(320);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
&:nth-child(1) {
|
||||
@@ -263,7 +262,7 @@
|
||||
display: flex;
|
||||
margin-top: vh(12);
|
||||
width: 100%;
|
||||
height: vh(150);
|
||||
height: vh(88);
|
||||
background-image: url('@/assets/images/bg-4.png');
|
||||
background-size: 100% 100%;
|
||||
&-item {
|
||||
@@ -275,20 +274,20 @@
|
||||
cursor:pointer;
|
||||
}
|
||||
&-title {
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(16);
|
||||
color: #fff;
|
||||
}
|
||||
&-value {
|
||||
margin-top: vh(10);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(20);
|
||||
color: #02f9fa;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
}
|
||||
.value {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(28);
|
||||
font-size: vw(28);
|
||||
|
||||
}
|
||||
.active{
|
||||
@@ -296,14 +295,14 @@
|
||||
}
|
||||
.prefix,
|
||||
.suffix {
|
||||
font-size: font-vw(12);
|
||||
font-size: vw(12);
|
||||
margin-bottom: vh(4);
|
||||
}
|
||||
}
|
||||
}
|
||||
.age-box {
|
||||
width: vw(400);
|
||||
height: vh(680);
|
||||
width: vw(320);
|
||||
height: vh(303);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
&:nth-child(1) {
|
||||
@@ -311,9 +310,8 @@
|
||||
}
|
||||
}
|
||||
.box-1 {
|
||||
width: vw(400);
|
||||
height: vh(680);
|
||||
|
||||
width: vw(230);
|
||||
height: vh(303);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
&:nth-child(2) {
|
||||
@@ -324,7 +322,7 @@
|
||||
margin: vh(10) vw(20) 0 vw(20);
|
||||
height: vh(24);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -352,7 +350,7 @@
|
||||
}
|
||||
.text {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
.progress {
|
||||
@@ -364,21 +362,21 @@
|
||||
}
|
||||
.man {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #02f9fa;
|
||||
margin-left: vw(10);
|
||||
}
|
||||
.woman {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #f15a25;
|
||||
margin-left: vw(10);
|
||||
}
|
||||
}
|
||||
.ticket-box {
|
||||
margin-top: vh(10);
|
||||
margin-top: vh(20);
|
||||
width: 100%;
|
||||
height: vh(196);
|
||||
height: vh(106);
|
||||
background: linear-gradient(to right, rgba(0, 77, 136, 0) 0%, rgba(0, 77, 136, 0.6) 100%);
|
||||
.title {
|
||||
width: vw(253);
|
||||
@@ -390,7 +388,7 @@
|
||||
& > span {
|
||||
padding-left: vw(22);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(15);
|
||||
font-size: vw(15);
|
||||
background-image: linear-gradient(to bottom, #ffffff 0%, #75c1ff 100%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
@@ -400,13 +398,12 @@
|
||||
}
|
||||
}
|
||||
.ticket-wrap {
|
||||
// margin-top: vh(18);
|
||||
// margin-bottom: vh(18);
|
||||
margin-top: vh(8);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
& > img {
|
||||
width: vw(124);
|
||||
width: vw(74);
|
||||
height: auto;
|
||||
}
|
||||
& > div {
|
||||
@@ -420,12 +417,12 @@
|
||||
.label {
|
||||
padding-left: vw(10);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
.countup-wrap {
|
||||
color: #02f9fa;
|
||||
font-size: font-vw(28);
|
||||
font-size: vw(28);
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -36,8 +36,8 @@
|
||||
<div class="pt-10">
|
||||
<Title3 title="拥堵路段总数" />
|
||||
<Line
|
||||
width="95%"
|
||||
:height="100"
|
||||
:width="250"
|
||||
:height="150"
|
||||
:config="{ legend: false }"
|
||||
:data="congestionData"
|
||||
:xAxisData="congestionXAxisData"
|
||||
@@ -91,8 +91,8 @@
|
||||
<Title3 title="停车场车流量" />
|
||||
<div class="pt-10">
|
||||
<Line
|
||||
width="95%"
|
||||
:height="94"
|
||||
:width="250"
|
||||
:height="150"
|
||||
:config="{ legend: false }"
|
||||
:data="parkData"
|
||||
:xAxisData="parkXAxisData"
|
||||
@@ -121,17 +121,17 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex" v-if="false">
|
||||
<!-- <div class="flex-1">
|
||||
<div class="flex">
|
||||
<div class="flex-1">
|
||||
<Title1 title="车船信息" class="title1" />
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<Title1 title="酒店信息" class="title1" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex" v-if="false">
|
||||
<div class="car-ship" v-if="false">
|
||||
<div class="flex">
|
||||
<div class="car-ship">
|
||||
<div class="mb-6">
|
||||
<div class="car">
|
||||
<div class="label">车总数</div>
|
||||
@@ -299,47 +299,45 @@
|
||||
}
|
||||
.box-3 {
|
||||
margin-top: vh(120);
|
||||
width: vw(1200);
|
||||
height:100%;
|
||||
// height: vh(2056);
|
||||
width: vw(774);
|
||||
height: vh(956);
|
||||
padding-left: vw(8);
|
||||
box-sizing: border-box;
|
||||
// background-image: url('@/assets/images/bg-5.png');
|
||||
background-image: url('@/assets/images/bg-5.png');
|
||||
background-size: 100% 100%;
|
||||
.traffic-info {
|
||||
// height: vh(80);
|
||||
height: vh(80);
|
||||
}
|
||||
.cell {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.icon {
|
||||
width: vw(124);
|
||||
width: vw(64);
|
||||
height: auto;
|
||||
}
|
||||
.countup-wrap {
|
||||
color: #02f9fa;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
font-weight: bold;
|
||||
text-shadow: 0 0 9px #0096ff;
|
||||
}
|
||||
.label {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(14);
|
||||
margin-top: vh(10);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
}
|
||||
.box {
|
||||
width: 33%;
|
||||
// height: vh(200);
|
||||
width: vw(250);
|
||||
height: vh(200);
|
||||
margin-right: vw(8);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
.box-1 {
|
||||
// width: vw(300);
|
||||
flex:1;
|
||||
height: vh(450);
|
||||
width: vw(250);
|
||||
height: vh(200);
|
||||
margin-right: vw(8);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
@@ -354,7 +352,7 @@
|
||||
|
||||
& > div {
|
||||
flex: 1;
|
||||
height: vh(120);
|
||||
height: vh(70);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
@@ -362,13 +360,13 @@
|
||||
background-size: 100% 100%;
|
||||
.label {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(14);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
.value {
|
||||
margin-top: vh(10);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(24);
|
||||
color: #ffffff;
|
||||
}
|
||||
.error {
|
||||
@@ -386,22 +384,20 @@
|
||||
}
|
||||
}
|
||||
.car-ship {
|
||||
width:100%;
|
||||
// flex: 1;
|
||||
flex: 1;
|
||||
& > div {
|
||||
position: relative;
|
||||
height: vh(235);
|
||||
height: vh(114);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background-image: url('@/assets/images/bg-4.png');
|
||||
background-size: cover;
|
||||
background-size: 100% 100%;
|
||||
.car {
|
||||
@extend .icon;
|
||||
width: vw(352);
|
||||
height: vw(70);
|
||||
padding-left: vw(90);
|
||||
margin-left: vw(30);
|
||||
|
||||
margin-left: vw(10);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
@@ -423,12 +419,12 @@
|
||||
.label {
|
||||
margin-bottom: vh(6);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
.value {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(24);
|
||||
color: #02f9fa;
|
||||
}
|
||||
.unit {
|
||||
@@ -439,31 +435,27 @@
|
||||
}
|
||||
.table {
|
||||
position: absolute;
|
||||
left: vw(200);
|
||||
// width: vw(350);
|
||||
width:80%;
|
||||
// height: vh(196);
|
||||
height:90%;
|
||||
left: vw(160);
|
||||
width: vw(226);
|
||||
height: vh(96);
|
||||
z-index: 2;
|
||||
background: rgba(0, 150, 255, 0.17);
|
||||
.header {
|
||||
display: flex;
|
||||
height: vh(48);
|
||||
line-height: vh(48);
|
||||
height: vh(18);
|
||||
line-height: vh(18);
|
||||
text-align: center;
|
||||
background: rgba(0, 150, 255, 0.4);
|
||||
& > div {
|
||||
flex: 1;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(12);
|
||||
color: #fff;
|
||||
// height: vh(50);
|
||||
// line-height: vh(50);
|
||||
}
|
||||
}
|
||||
.content {
|
||||
overflow-y: hidden;
|
||||
// height: vh(282);
|
||||
height: vh(82);
|
||||
// /* 滚动条整体样式 */
|
||||
// &::-webkit-scrollbar {
|
||||
// width: vw(4); /* 滚动条的宽度 */
|
||||
@@ -480,9 +472,8 @@
|
||||
}
|
||||
.cell {
|
||||
display: flex;
|
||||
// height: vh(50);
|
||||
// line-height: vh(50);
|
||||
padding:vw(10);
|
||||
height: vh(27);
|
||||
line-height: vh(27);
|
||||
text-align: center;
|
||||
background: #074686;
|
||||
&:nth-child(odd) {
|
||||
@@ -495,39 +486,37 @@
|
||||
flex: 1;
|
||||
}
|
||||
& > div:nth-child(1) {
|
||||
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(12);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
& > div:nth-child(2) {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(18);
|
||||
color: #ffffff;
|
||||
}
|
||||
& > div:nth-child(3) {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(18);
|
||||
color: #02f9fa;
|
||||
}
|
||||
.unit-1 {
|
||||
font-size: vw(18);
|
||||
font-size: vw(12);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.hotel {
|
||||
flex:1;
|
||||
margin: 0 vw(6);
|
||||
& > div:nth-child(1) {
|
||||
display: flex;
|
||||
// width: vw(360);
|
||||
height: vh(100);
|
||||
width: vw(360);
|
||||
height: vh(70);
|
||||
background-image: url('@/assets/images/bg-4.png');
|
||||
background-size: 100% 100%;
|
||||
.item {
|
||||
@@ -538,13 +527,13 @@
|
||||
justify-content: center;
|
||||
.label {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(14);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
.value {
|
||||
margin-top: vh(10);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(24);
|
||||
color: #ffffff;
|
||||
}
|
||||
.success {
|
||||
@@ -562,7 +551,7 @@
|
||||
& > div:nth-child(2) {
|
||||
padding-top: vh(6);
|
||||
margin-top: vh(6);
|
||||
// width: vw(360);
|
||||
width: vw(360);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
@@ -575,7 +564,7 @@
|
||||
}
|
||||
.title1 {
|
||||
:deep(.title) {
|
||||
// width: vw(300) !important;
|
||||
width: vw(300) !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.gauge {
|
||||
width: vw(200);
|
||||
height: vh(80);
|
||||
width: vw(120);
|
||||
height: vh(50);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -70,14 +70,14 @@
|
||||
grid: {
|
||||
left: '4%',
|
||||
right: '4%',
|
||||
top: '0',
|
||||
top: '4%',
|
||||
bottom: '4%',
|
||||
containLabel: true
|
||||
},
|
||||
legend: {
|
||||
orient: 'horizontal',
|
||||
x: 'center',
|
||||
bottom: '5px',
|
||||
bottom: '-3%',
|
||||
itemHeight: fitChartSize(12),
|
||||
itemWidth: fitChartSize(12),
|
||||
itemGap: fitChartSize(6),
|
||||
@@ -90,11 +90,11 @@
|
||||
rich: {
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(16)
|
||||
fontSize: fitChartSize(12)
|
||||
},
|
||||
value: {
|
||||
color: '#00D5F6',
|
||||
fontSize: fitChartSize(16)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -102,7 +102,7 @@
|
||||
series: [
|
||||
{
|
||||
type: 'pie',
|
||||
center: ['50%', '32%'],
|
||||
center: ['50%', '40%'],
|
||||
radius: ['45%', '60%'],
|
||||
itemStyle: {
|
||||
borderWidth: fitChartSize(4),
|
||||
@@ -138,7 +138,23 @@
|
||||
} else {
|
||||
params.series[0].data = getSeriesData()
|
||||
}
|
||||
setOption(params)
|
||||
const chart = setOption(params)
|
||||
chart.on('legendselectchanged', function (e) {
|
||||
var echartsArr = [];
|
||||
for (let key in e.selected) {
|
||||
if (e.selected[key]) {
|
||||
echartsArr.push(key)
|
||||
}
|
||||
}
|
||||
var echartsNum = 0;
|
||||
props.list.forEach(item => {
|
||||
if(echartsArr.includes(item.name)){
|
||||
echartsNum += parseInt(item.count)
|
||||
}
|
||||
})
|
||||
params.series[0].label.formatter = `{label|拥堵次数}` + '\n' + `{value|${echartsNum}}`;
|
||||
setOption(params);
|
||||
});
|
||||
}
|
||||
|
||||
onMounted(() => {})
|
||||
@@ -151,7 +167,7 @@
|
||||
top:0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size:vw(20);
|
||||
font-size:vw(18);
|
||||
// color:#999;
|
||||
color:#02f9fa;
|
||||
display: flex;
|
||||
@@ -159,7 +175,7 @@
|
||||
justify-content: center;
|
||||
}
|
||||
.jam-count {
|
||||
width: vw(350);
|
||||
height: vh(400);
|
||||
width: vw(250);
|
||||
height: vh(150);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
show: true,
|
||||
axisLabel: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18),
|
||||
fontSize: fitChartSize(12),
|
||||
verticalAlign: 'bottom',
|
||||
padding: [0, 0, 6, 0],
|
||||
inside: true,
|
||||
@@ -152,7 +152,7 @@
|
||||
align: 'center',
|
||||
color: '#fff',
|
||||
fontWeight: 600,
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(14)
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -176,7 +176,7 @@
|
||||
fontWeight: 500,
|
||||
position: 'left',
|
||||
align: 'left',
|
||||
fontSize: fitChartSize(18),
|
||||
fontSize: fitChartSize(14),
|
||||
formatter: function (params) {
|
||||
return params.data.name
|
||||
}
|
||||
@@ -213,7 +213,7 @@
|
||||
top:0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size:vw(20);
|
||||
font-size:vw(18);
|
||||
// color:#999;
|
||||
color:#02f9fa;
|
||||
display: flex;
|
||||
@@ -221,7 +221,7 @@
|
||||
justify-content: center;
|
||||
}
|
||||
.jam {
|
||||
width: vw(290);
|
||||
height: vh(400);
|
||||
width: vw(250);
|
||||
height: vh(160);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<!-- 酒店入住人数及入住率 -->
|
||||
<div class="occupancyNew" :id="id" />
|
||||
<div class="occupancy" :id="id" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@@ -19,11 +19,10 @@
|
||||
watch(
|
||||
() => props.list,
|
||||
(val) => {
|
||||
|
||||
if (val.length > 0) {
|
||||
setTimeout(() => {
|
||||
init()
|
||||
}, 1500)
|
||||
}, 1000)
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
@@ -124,7 +123,7 @@
|
||||
show: true,
|
||||
axisLabel: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18),
|
||||
fontSize: fitChartSize(12),
|
||||
verticalAlign: 'bottom',
|
||||
padding: [0, 0, 10, 0],
|
||||
inside: true,
|
||||
@@ -136,7 +135,7 @@
|
||||
align: 'center',
|
||||
color: '#fff',
|
||||
fontWeight: 600,
|
||||
fontSize: fitChartSize(20)
|
||||
fontSize: fitChartSize(14)
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -160,7 +159,7 @@
|
||||
fontWeight: 500,
|
||||
position: 'left',
|
||||
align: 'left',
|
||||
fontSize: fitChartSize(20),
|
||||
fontSize: fitChartSize(14),
|
||||
formatter: function (params) {
|
||||
return params.data.name
|
||||
}
|
||||
@@ -191,8 +190,8 @@
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.occupancyNew {
|
||||
width: 100%;
|
||||
height: vh(360);
|
||||
.occupancy {
|
||||
width: vw(360);
|
||||
height: vh(130);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
show: true,
|
||||
axisLabel: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(16),
|
||||
fontSize: fitChartSize(12),
|
||||
verticalAlign: 'bottom',
|
||||
padding: [0, 0, 6, 0],
|
||||
inside: true,
|
||||
@@ -141,13 +141,13 @@
|
||||
align: 'center',
|
||||
color: '#fff',
|
||||
fontWeight: 600,
|
||||
fontSize: fitChartSize(16)
|
||||
fontSize: fitChartSize(14)
|
||||
},
|
||||
total: {
|
||||
align: 'center',
|
||||
color: '#fff',
|
||||
fontWeight: 600,
|
||||
fontSize: fitChartSize(16)
|
||||
fontSize: fitChartSize(14)
|
||||
},
|
||||
}
|
||||
},
|
||||
@@ -172,7 +172,7 @@
|
||||
fontWeight: 500,
|
||||
position: 'left',
|
||||
align: 'left',
|
||||
fontSize: fitChartSize(16),
|
||||
fontSize: fitChartSize(14),
|
||||
formatter: function (params) {
|
||||
return params.data.name
|
||||
}
|
||||
@@ -206,7 +206,7 @@
|
||||
|
||||
<style scoped lang="scss">
|
||||
.vacancy {
|
||||
width: vw(400);
|
||||
height: vh(400);
|
||||
width: vw(250);
|
||||
height: vh(160);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -60,14 +60,14 @@
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
fontSize: fitChartSize(18),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: fitChartSize(18),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
},
|
||||
splitLine: {
|
||||
@@ -88,7 +88,7 @@
|
||||
show: true,
|
||||
position: 'top',
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(14)
|
||||
fontSize: fitChartSize(10)
|
||||
},
|
||||
itemStyle: {
|
||||
borderRadius: [0, 0, 0, 0],
|
||||
@@ -125,6 +125,6 @@
|
||||
<style scoped lang="scss">
|
||||
.vehicle-source {
|
||||
width: 100%;
|
||||
height: vh(400);
|
||||
height: vh(160);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -119,11 +119,11 @@
|
||||
.info {
|
||||
margin-top: vh(120);
|
||||
width: vw(626);
|
||||
// height: vh(950);
|
||||
height: vh(950);
|
||||
background: linear-gradient(321deg, #0b2f64 0%, #062b57 100%);
|
||||
&-header {
|
||||
padding: vh(12) vw(12);
|
||||
min-height: vh(330);
|
||||
height: vh(167);
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
@@ -137,7 +137,7 @@
|
||||
margin-left: vw(20);
|
||||
> h2 {
|
||||
font-weight: 800;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(20);
|
||||
color: #ffffff;
|
||||
margin-bottom: vh(12);
|
||||
margin-top: vh(10);
|
||||
@@ -155,40 +155,36 @@
|
||||
}
|
||||
&__text {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(16);
|
||||
color: #0096ff;
|
||||
line-height: 2;
|
||||
}
|
||||
}
|
||||
.statistic {
|
||||
// margin:vh(10);
|
||||
&-box {
|
||||
height: vh(230);
|
||||
height: vh(94);
|
||||
margin: 0 vw(26);
|
||||
// gap: vw(20);
|
||||
gap: vw(20);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top:vh(20);
|
||||
flex-wrap: wrap;
|
||||
margin-top:vh(10);
|
||||
}
|
||||
&-item {
|
||||
// flex: 1;
|
||||
width:32%;
|
||||
flex: 1;
|
||||
}
|
||||
&-item__label {
|
||||
margin-bottom: vh(26);
|
||||
margin-bottom: vh(16);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
> span {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
margin-left: vw(4);
|
||||
}
|
||||
}
|
||||
&-item__value {
|
||||
width: vw(200);
|
||||
height: vh(60);
|
||||
width: vw(100);
|
||||
height: vh(30);
|
||||
padding-left: vw(12);
|
||||
padding-bottom: vh(12);
|
||||
display: flex;
|
||||
@@ -197,11 +193,11 @@
|
||||
background-size: 100% 100%;
|
||||
.countup-wrap {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(42);
|
||||
font-size: vw(28);
|
||||
color: #02f9fa;
|
||||
}
|
||||
> span {
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(12);
|
||||
color: #02f9fa;
|
||||
margin-left: vw(4);
|
||||
}
|
||||
@@ -223,11 +219,11 @@
|
||||
margin: vh(20) 0 0 vw(20);
|
||||
padding-right: vw(20);
|
||||
overflow-y: auto;
|
||||
height: vh(830);
|
||||
height: vh(200);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
line-height: 2;
|
||||
line-height: vw(26);
|
||||
text-align: justify;
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
|
||||
@@ -1,25 +1,6 @@
|
||||
<template>
|
||||
<div class="video-box">
|
||||
<div class="left-nav">
|
||||
<div v-if="showNav" class="ul">
|
||||
<div
|
||||
class="li"
|
||||
:class="{ active: current == index }"
|
||||
v-for="(item, index) in navList"
|
||||
:key="index"
|
||||
@click="handleNav(index)"
|
||||
>
|
||||
<span v-if="!params.businessScenicArea && index == 0"> 核心路段 </span>
|
||||
<span v-else>
|
||||
{{ item.dictLabel }}
|
||||
</span>
|
||||
</div>
|
||||
<div
|
||||
:class="{ active: current == 3 }"
|
||||
@click="handleNav(3)" class="li">
|
||||
<span>自定义</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bom-box">
|
||||
<Title2 title="检索" />
|
||||
<div class="search-box">
|
||||
@@ -55,7 +36,7 @@
|
||||
<div v-if="videoLog == 1" class="video-wrapper">
|
||||
<div class="video-list">
|
||||
<div class="empty-box" v-if="videoList.length==0&&cond">
|
||||
未接入
|
||||
{{cond?'未接入':'加载中...'}}
|
||||
</div>
|
||||
<div
|
||||
class="video-item"
|
||||
@@ -77,17 +58,18 @@
|
||||
>关注
|
||||
</div>
|
||||
<video
|
||||
class="video-item__video"
|
||||
:id="'hotelmonitorVideo' + index"
|
||||
preload="auto"
|
||||
class="video-item__video"
|
||||
muted
|
||||
autoplay
|
||||
:controls="false"
|
||||
>
|
||||
|
||||
<source type="application/x-mpegURL"/>
|
||||
</video>
|
||||
<p class="video-item__title--primary">
|
||||
{{ item.cameraName || item.scenicAreaId }}
|
||||
{{ item.cameraName || item.cameraIndexCode }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -150,7 +132,7 @@
|
||||
>
|
||||
<div>
|
||||
<p class="item-title--primary">
|
||||
{{ item.cameraName || item.scenicAreaId }}
|
||||
{{ item.cameraName || item.cameraIndexCode }}
|
||||
</p>
|
||||
<video
|
||||
class="item-img"
|
||||
@@ -182,6 +164,7 @@
|
||||
</div>
|
||||
<VideoDialog v-model="show" :cameraIndexCode="cameraIndexCode" :isDiy="isDiy" :isCollect="isCollect" :src="videoSrc" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getRegionsListApi,getPreviewUrlApi } from '@/api/home'
|
||||
import {
|
||||
@@ -341,9 +324,10 @@ const createPlayer = (cameraIndexCode,videoElement) => {
|
||||
getPreviewUrlApi({
|
||||
type: 'hls',
|
||||
cameraIndexCode: cameraIndexCode,
|
||||
subStream:1
|
||||
subStream:0
|
||||
}).then(res=>{
|
||||
const url = res.data.url;
|
||||
console.log('url',url)
|
||||
if(url.startsWith('http://192.168.77.200:8050/')){
|
||||
const player = new WebRTCWhep({
|
||||
url:url, // WHEP 服务器地址
|
||||
@@ -357,6 +341,7 @@ const createPlayer = (cameraIndexCode,videoElement) => {
|
||||
}
|
||||
})
|
||||
player.on('play:failed', (err) => {
|
||||
console.error('错误:',err)
|
||||
// createPlayer(cameraIndexCode,videoElement);
|
||||
})
|
||||
webrtcRefs.push(player)
|
||||
@@ -449,6 +434,7 @@ const handleItemVideo = async (url, type, code, item) => {
|
||||
}
|
||||
})
|
||||
hlsRef.on('play:failed', (err) => {
|
||||
console.log('播放失败,尝试重新加载');
|
||||
// handleItemVideo(url, type, code, item);
|
||||
})
|
||||
} else {
|
||||
@@ -540,8 +526,8 @@ onUnmounted(() => {
|
||||
.empty-box{
|
||||
display:flex;
|
||||
align-items: center;
|
||||
font-size: font-vw(40);
|
||||
// height:vh(750);
|
||||
font-size:vw(40);
|
||||
height:vh(750);
|
||||
justify-content: center;
|
||||
text-align:center;
|
||||
width:100%;
|
||||
@@ -569,7 +555,7 @@ onUnmounted(() => {
|
||||
> span {
|
||||
margin: 0 vw(16);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
}
|
||||
.pause {
|
||||
@@ -582,7 +568,7 @@ onUnmounted(() => {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex: 1;
|
||||
// height: vh(950);
|
||||
height: vh(950);
|
||||
margin-top: vh(120);
|
||||
margin-left: vw(10);
|
||||
padding: vh(34) vw(26);
|
||||
@@ -614,7 +600,7 @@ onUnmounted(() => {
|
||||
> span {
|
||||
padding-left: vw(20);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
line-height: vh(40);
|
||||
}
|
||||
@@ -643,7 +629,7 @@ onUnmounted(() => {
|
||||
padding: vh(10) vw(30);
|
||||
position: absolute;
|
||||
right: vw(30);
|
||||
bottom: vh(50);
|
||||
bottom: vh(20);
|
||||
}
|
||||
}
|
||||
&-list {
|
||||
@@ -656,7 +642,7 @@ onUnmounted(() => {
|
||||
position: relative;
|
||||
// width: vw(720);
|
||||
width:33%;
|
||||
height: vh(880);
|
||||
height: vh(380);
|
||||
padding: vh(10) vw(10);
|
||||
background-image: url('/src/assets/images/item-primary.png');
|
||||
background-size: 100% 100%;
|
||||
@@ -678,7 +664,7 @@ onUnmounted(() => {
|
||||
text-align: center;
|
||||
line-height: vh(24);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
background-image: url('@/assets/images/unfollow.png');
|
||||
background-size: 100% 100%;
|
||||
@@ -690,16 +676,15 @@ onUnmounted(() => {
|
||||
|
||||
&-item__inner {
|
||||
position: relative;
|
||||
height:100%;
|
||||
}
|
||||
&-item__title {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
padding: vh(20) vw(20);
|
||||
padding: vh(10) vw(10);
|
||||
color: #fff;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@@ -707,18 +692,15 @@ onUnmounted(() => {
|
||||
}
|
||||
&-item__title--error {
|
||||
@extend .video-item__title;
|
||||
font-size: font-vw(20);
|
||||
background-color: rgba(226, 27, 27, 0.72);
|
||||
}
|
||||
&-item__title--primary {
|
||||
@extend .video-item__title;
|
||||
font-size:font-vw(20);
|
||||
background-color: rgba(4, 30, 69, 0.72);
|
||||
}
|
||||
&-item__video {
|
||||
width: 100%;
|
||||
height:100%;
|
||||
// height: vh(1860);
|
||||
height: vh(366);
|
||||
object-fit: fill;
|
||||
}
|
||||
&-detail {
|
||||
@@ -730,7 +712,7 @@ onUnmounted(() => {
|
||||
position: relative;
|
||||
padding: vh(40) vw(50);
|
||||
width: vw(2060);
|
||||
height: vh(1960);
|
||||
height: vh(960);
|
||||
// background-image: url('/src/assets/images/one-video-bg.png');
|
||||
// background-size: 100% 100%;
|
||||
}
|
||||
@@ -741,7 +723,7 @@ onUnmounted(() => {
|
||||
top: 40 (vh);
|
||||
z-index: 9;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
padding: vw(20);
|
||||
display: flex;
|
||||
@@ -750,14 +732,14 @@ onUnmounted(() => {
|
||||
}
|
||||
&-detail__video {
|
||||
width: 100%;
|
||||
height: vh(1780);
|
||||
height: vh(780);
|
||||
object-fit: contain;
|
||||
background-color: #000;
|
||||
}
|
||||
&-right {
|
||||
margin-left: vw(8);
|
||||
width: vw(540);
|
||||
height: vh(1890);
|
||||
width: vw(440);
|
||||
height: vh(890);
|
||||
background: #082f5a;
|
||||
.back-box {
|
||||
cursor: pointer;
|
||||
@@ -771,14 +753,14 @@ onUnmounted(() => {
|
||||
}
|
||||
& > span {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(20);
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
.list {
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
height: vh(1870);
|
||||
height: vh(870);
|
||||
padding: vw(8);
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
@@ -814,28 +796,25 @@ onUnmounted(() => {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
padding: vw(20);
|
||||
padding: vw(10);
|
||||
color: #fff;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(14);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
z-index: 999;
|
||||
}
|
||||
&-title--error {
|
||||
// @extend .item-title;
|
||||
font-size:font-vw(22);
|
||||
@extend .item-title;
|
||||
background-color: rgba(226, 27, 27, 0.72);
|
||||
}
|
||||
&-title--primary {
|
||||
// @extend .item-title;
|
||||
font-size: font-vw(20);
|
||||
padding:vw(10);
|
||||
@extend .item-title;
|
||||
background-color: rgba(4, 30, 69, 0.72);
|
||||
}
|
||||
&-img {
|
||||
width: 100%;
|
||||
height: vh(264);
|
||||
height: vh(164);
|
||||
display: block;
|
||||
object-fit: cover;
|
||||
}
|
||||
@@ -882,7 +861,7 @@ onUnmounted(() => {
|
||||
span {
|
||||
margin-left: vw(30);
|
||||
font-weight: 800;
|
||||
font-size: font-vw(15);
|
||||
font-size: vw(15);
|
||||
line-height: vh(26);
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
@@ -914,7 +893,7 @@ onUnmounted(() => {
|
||||
border-radius: 0px 0px 0px 0px;
|
||||
text-align: center;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
padding: vw(20);
|
||||
text-align: left;
|
||||
@@ -934,15 +913,15 @@ onUnmounted(() => {
|
||||
}
|
||||
.left-nav {
|
||||
margin: 0 vw(8);
|
||||
width: vw(450);
|
||||
// background: linear-gradient(321deg, #0b2f64 0%, #062b57 91%, rgba(5, 40, 79, 0) 100%);
|
||||
width: vw(250);
|
||||
background: linear-gradient(321deg, #0b2f64 0%, #062b57 91%, rgba(5, 40, 79, 0) 100%);
|
||||
.bom-box {
|
||||
margin-top: vh(40);
|
||||
margin-top: vh(20);
|
||||
.search-box {
|
||||
border-radius: vw(2);
|
||||
height: vh(56);
|
||||
height: vh(36);
|
||||
border: 1px solid #0096ff;
|
||||
margin: vh(20) auto;
|
||||
margin: vh(10) auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
@@ -956,7 +935,7 @@ onUnmounted(() => {
|
||||
|
||||
.tree-box {
|
||||
position: relative;
|
||||
height: vh(1750);
|
||||
height: vh(750);
|
||||
padding: 0 vw(20);
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
@@ -999,7 +978,7 @@ onUnmounted(() => {
|
||||
padding: 0 vw(20);
|
||||
display: block;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(15);
|
||||
color: #ffffff;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
@@ -1030,7 +1009,7 @@ onUnmounted(() => {
|
||||
cursor: pointer;
|
||||
color: rgb(192,216,254);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(15);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
@@ -1057,7 +1036,7 @@ onUnmounted(() => {
|
||||
}
|
||||
:deep(.el-input__inner) {
|
||||
height: vh(36);
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
},
|
||||
total: {
|
||||
type: Number,
|
||||
default: () => 123456
|
||||
default: () => 0
|
||||
},
|
||||
colors: {
|
||||
type: Array,
|
||||
@@ -37,22 +37,29 @@
|
||||
orient: 'vertical',
|
||||
y: 'center',
|
||||
left: '50%',
|
||||
itemWidth: fitChartSize(18),
|
||||
itemHeight: fitChartSize(18),
|
||||
itemWidth: fitChartSize(12),
|
||||
itemHeight: fitChartSize(12),
|
||||
itemGap: fitChartSize(6),
|
||||
formatter: (name) => {
|
||||
let obj = props.dataList.find((item) => item.name == name)
|
||||
return `{name|${name}} {value|${obj?.value}}{value|%}`
|
||||
let total = getTotal();
|
||||
if(total==0){
|
||||
return `{name|${name}} {value|0}{value|%}`
|
||||
}else{
|
||||
let value = ((obj?.value/total).toFixed(4)*100).toFixed(2);
|
||||
return `{name|${name}} {value|${value}}{value|%}`
|
||||
}
|
||||
|
||||
},
|
||||
textStyle: {
|
||||
rich: {
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(20)
|
||||
fontSize: fitChartSize(12)
|
||||
},
|
||||
value: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(20)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -73,13 +80,13 @@
|
||||
rich: {
|
||||
value: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(20),
|
||||
fontSize: fitChartSize(16),
|
||||
fontWeight: 'bold',
|
||||
padding: [0, 0, 5, 0]
|
||||
},
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(22)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -126,13 +133,32 @@
|
||||
return `{value|${getTotal()}}` + '\n' + `{name|告警总数}`
|
||||
}
|
||||
}
|
||||
const changeChart = setOption(params)
|
||||
changeChart.off('legendselectchanged');
|
||||
changeChart.on('legendselectchanged', function (e) {
|
||||
var echartsArr = [];
|
||||
for (let key in e.selected) {
|
||||
if (e.selected[key]) {
|
||||
echartsArr.push(key)
|
||||
}
|
||||
}
|
||||
var echartsNum = 0;
|
||||
props.dataList.forEach(item => {
|
||||
if(echartsArr.includes(item.name)){
|
||||
echartsNum += parseFloat(item.value)
|
||||
}
|
||||
})
|
||||
params.series[0].label.formatter = () => {
|
||||
return `{value|${echartsNum}}` + '\n' + `{name|告警总数}`
|
||||
}
|
||||
setOption(params)
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.alarmRate {
|
||||
width: 100%;
|
||||
height: vh(400);
|
||||
width: vw(380);
|
||||
height: vh(180);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
:end-val="aiAnalyzeData.allAnalysisPoints"
|
||||
/>
|
||||
</div>
|
||||
<div class="traffic-item" @click="showAbnormalList">
|
||||
<div class="traffic-item" @click="showAbnormalList('curr')">
|
||||
<span class="traffic-item__title">异常点位</span>
|
||||
<countup :class="aiAnalyzeData.abnormalPoints>0?'traffic-item__value--error':'traffic-item__value--success'" :end-val="aiAnalyzeData.abnormalPoints" />
|
||||
</div>
|
||||
@@ -28,30 +28,30 @@
|
||||
<span class="scenic-item__label">核心景区分析点位</span>
|
||||
<countup class="scenic-item__value" :end-val="scenicAiAnalyzeData.coreMonitoringPoints" />
|
||||
</div>
|
||||
<div class="scenic-item" @click="showAbnormalList" style="cursor: pointer;" >
|
||||
<div class="scenic-item" @click="showAbnormalList('curr')" style="cursor: pointer;" >
|
||||
<span class="scenic-item__label">异常点位</span>
|
||||
<countup class="scenic-item__value" :end-val="scenicAiAnalyzeData.abnormalPoints" />
|
||||
</div>
|
||||
<div class="scenic-item" @click="showAbnormalList" style="cursor: pointer;" >
|
||||
<div class="scenic-item" @click="showAbnormalList('curr')" style="cursor: pointer;" >
|
||||
<span class="scenic-item__label">异常告警</span>
|
||||
<countup class="scenic-item__value" :end-val="scenicAiAnalyzeData.abnormalAlarm" />
|
||||
</div>
|
||||
<div class="scenic-item">
|
||||
<div class="scenic-item" @click="showAbnormalList('deal')" style="cursor: pointer;">
|
||||
<span class="scenic-item__label">已解除</span>
|
||||
<countup class="scenic-item__value" :end-val="scenicAiAnalyzeData.handled" />
|
||||
</div>
|
||||
</div>
|
||||
<div class=" pt-20 gap8" style="margin-top:20px;">
|
||||
<div class="flex pt-20 gap8">
|
||||
<div class="box">
|
||||
<Title3 title="异常告警" />
|
||||
<Line
|
||||
width="100%"
|
||||
:height="90"
|
||||
:width="370"
|
||||
:height="180"
|
||||
:data="abnormalAlarm"
|
||||
:xAxisData="abnormalAlarmXAxisData"
|
||||
/>
|
||||
</div>
|
||||
<div class="box other-box" style="margin-top:20px;">
|
||||
<div class="box">
|
||||
<Title3 title="异常告警占比" />
|
||||
<div class="flex">
|
||||
<alarmRate :dataList="abnormalData.abnormalAlarmPercent" />
|
||||
@@ -67,15 +67,15 @@
|
||||
:end-val="trafficAiAnalyzeData.coreMonitoringPoints"
|
||||
/>
|
||||
</div>
|
||||
<div class="scenic-item" style="cursor: pointer" @click="showTrafficEvent">
|
||||
<div class="scenic-item" style="cursor: pointer" @click="showTrafficEvent('curr')">
|
||||
<span class="scenic-item__label">拥堵点位</span>
|
||||
<countup class="scenic-item__value" :end-val="trafficAiAnalyzeData.abnormalPoints" />
|
||||
</div>
|
||||
<div class="scenic-item" style="cursor: pointer" @click="showTrafficEvent">
|
||||
<div class="scenic-item" style="cursor: pointer" @click="showTrafficEvent('curr')">
|
||||
<span class="scenic-item__label">拥堵告警</span>
|
||||
<countup class="scenic-item__value" :end-val="trafficAiAnalyzeData.abnormalWarnings" />
|
||||
</div>
|
||||
<div class="scenic-item">
|
||||
<div class="scenic-item" style="cursor: pointer" @click="showTrafficEvent('deal')">
|
||||
<span class="scenic-item__label">已解除</span>
|
||||
<countup class="scenic-item__value" :end-val="trafficAiAnalyzeData.handled" />
|
||||
</div>
|
||||
@@ -83,9 +83,9 @@
|
||||
<div class="flex pt-20">
|
||||
<div class="box">
|
||||
<Title3 title="平均车速(KM/H)" />
|
||||
<traffic-jam width="100%"
|
||||
<traffic-jam :width="760"
|
||||
:series="jamlData[0].data"
|
||||
:data="jamXAxisData" height="350" />
|
||||
:data="jamXAxisData" :height="180" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -109,7 +109,7 @@
|
||||
<iframe v-if="scenicSpotId == 'root00000000'" width="100%" height="100%" src="http://192.168.77.200/map/sxzd/sxzd.html"></iframe>
|
||||
<iframe v-if="scenicSpotId == '龙桥河'" width="100%" height="100%" src="http://192.168.77.200/map/lqh/lqh.html"></iframe>
|
||||
</div>
|
||||
<div class="">
|
||||
<div class="flex">
|
||||
<div class="monitor">
|
||||
<div class="t-title">
|
||||
<span>监控点位统计</span>
|
||||
@@ -130,7 +130,7 @@
|
||||
:end-val="pointAlarmData.analysisPoints"
|
||||
/>
|
||||
</div>
|
||||
<div class="monitor-statistics-item" @click="showAbnormalList" style="cursor: pointer;" >
|
||||
<div class="monitor-statistics-item" @click="showAbnormalList('curr')" style="cursor: pointer;" >
|
||||
<span class="monitor-statistics-item__label">异常点位</span>
|
||||
<countup
|
||||
class="monitor-statistics-item__value"
|
||||
@@ -140,10 +140,10 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="bg" style="cursor: pointer;" >
|
||||
<Title3 title="今日异常告警" @click="showAbnormalList" />
|
||||
<Title3 title="今日异常告警" @click="showAbnormalList('all')" />
|
||||
<Line
|
||||
width="100%"
|
||||
:height="70"
|
||||
:width="370"
|
||||
:height="180"
|
||||
:data="abnormalAlarm"
|
||||
:xAxisData="abnormalAlarmXAxisData"
|
||||
/>
|
||||
@@ -155,20 +155,20 @@
|
||||
</div>
|
||||
<div class="traffic-alarm-statistics">
|
||||
<img class="traffic-alarm-statistics-icon" src="@/assets/images/t-ico-2.png" />
|
||||
<div class="traffic-alarm-statistics-item" @click="showAbnormalList" style="cursor: pointer;">
|
||||
<div class="traffic-alarm-statistics-item" @click="showAbnormalList('curr')" style="cursor: pointer;">
|
||||
<span class="traffic-alarm-statistics-item__label">当前告警</span>
|
||||
<countup
|
||||
:class="pointAlarmData.abnormalAlarm>0?'traffic-alarm-statistics-item__error':'traffic-alarm-statistics-item__value'"
|
||||
:end-val="pointAlarmData.abnormalAlarm"
|
||||
/>
|
||||
</div>
|
||||
<div class="traffic-alarm-statistics-item">
|
||||
<div class="traffic-alarm-statistics-item" @click="showAbnormalList('all')" style="cursor: pointer;">
|
||||
<span class="traffic-alarm-statistics-item__label">异常告警</span>
|
||||
<countup class="traffic-alarm-statistics-item__value"
|
||||
:end-val="pointAlarmData.allAbnormalAlarm"
|
||||
/>
|
||||
</div>
|
||||
<div class="traffic-alarm-statistics-item">
|
||||
<div class="traffic-alarm-statistics-item" @click="showAbnormalList('deal')" style="cursor: pointer;">
|
||||
<span class="traffic-alarm-statistics-item__label">已解除告警</span>
|
||||
<countup
|
||||
class="traffic-alarm-statistics-item__value traffic-alarm-statistics-item__value"
|
||||
@@ -180,6 +180,7 @@
|
||||
<Title3 title="异常告警占比" />
|
||||
<div class="flex">
|
||||
<alarmRate :dataList="abnormalData.abnormalAlarmPercent" />
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -187,8 +188,8 @@
|
||||
</template>
|
||||
</div>
|
||||
<video-dialog v-model="videoShow" :src="src" :cameraIndexCode="cameraIndexCode" />
|
||||
<warn-list v-model="warnShow" :scenicSpotId="scenicSpotId" />
|
||||
<traffic-list v-model="trafficEventShow" />
|
||||
<warn-list v-model="warnShow" :type="warnType" :scenicSpotId="scenicSpotId" />
|
||||
<traffic-list v-model="trafficEventShow" :type="trafficEventType" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
@@ -246,24 +247,29 @@
|
||||
let cameraIndexCode = ref('')
|
||||
let videoShow = ref(false)
|
||||
let warnShow = ref(false)
|
||||
let warnType = ref('')
|
||||
let trafficEventShow = ref(false)
|
||||
const showAbnormalList = function (){
|
||||
let trafficEventType = ref('curr')
|
||||
const showAbnormalList = function (type){
|
||||
warnType.value = type;
|
||||
warnShow.value = true;
|
||||
}
|
||||
const showTrafficEvent = function(){
|
||||
const showTrafficEvent = function(type){
|
||||
trafficEventType.value = type;
|
||||
trafficEventShow.value = true;
|
||||
}
|
||||
// window.addEventListener("message", async(e) => {
|
||||
// let {code,data} = await getPreviewUrlApi({
|
||||
// type: 'hls',
|
||||
// cameraIndexCode:e.data.cameraIndexCode
|
||||
// })
|
||||
// if(code===200){
|
||||
// src.value = data.url
|
||||
// cameraIndexCode.value = e.data.cameraIndexCode
|
||||
// videoShow.value = true
|
||||
// }
|
||||
// });
|
||||
window.addEventListener("message", async(e) => {
|
||||
let {code,data} = await getPreviewUrlApi({
|
||||
type: 'hls',
|
||||
cameraIndexCode:e.data.cameraIndexCode,
|
||||
subStream:0
|
||||
})
|
||||
if(code===200){
|
||||
src.value = data.url
|
||||
cameraIndexCode.value = e.data.cameraIndexCode
|
||||
videoShow.value = true
|
||||
}
|
||||
});
|
||||
// 异常告警
|
||||
let abnormalAlarm = computed(() => {
|
||||
return [{ data: abnormalData.value.abnormalAlarm.map((item) => item.value) }]
|
||||
@@ -346,7 +352,7 @@
|
||||
.none {
|
||||
width: vw(380);
|
||||
height: vh(200);
|
||||
font-size: font-vw(28);
|
||||
font-size: vw(28);
|
||||
color: #f2f2f2;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -354,7 +360,7 @@
|
||||
}
|
||||
.detection-top {
|
||||
width: 100%;
|
||||
height: vh(860);
|
||||
height: vh(560);
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
display: flex;
|
||||
@@ -380,10 +386,10 @@
|
||||
}
|
||||
}
|
||||
.monitor {
|
||||
// width: vw(405);
|
||||
width: vw(405);
|
||||
margin-right: vw(8);
|
||||
&-statistics {
|
||||
height: vh(110);
|
||||
height: vh(90);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
@@ -397,13 +403,13 @@
|
||||
&-statistics-item {
|
||||
&__label {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
}
|
||||
&__value {
|
||||
margin-top: vh(10);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #ffffff;
|
||||
}
|
||||
&:nth-child(4) {
|
||||
@@ -417,9 +423,9 @@
|
||||
}
|
||||
}
|
||||
.traffic-alarm {
|
||||
// width: vw(405);
|
||||
width: vw(405);
|
||||
&-statistics {
|
||||
height: vh(110);
|
||||
height: vh(90);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
@@ -433,20 +439,20 @@
|
||||
&-statistics-item {
|
||||
&__label {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
}
|
||||
&__value {
|
||||
margin-top: vh(10);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #02f9fa;
|
||||
text-align: center;
|
||||
}
|
||||
&__error {
|
||||
margin-top: vh(10);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #ff4400;
|
||||
text-align: center;
|
||||
}
|
||||
@@ -467,11 +473,11 @@
|
||||
}
|
||||
}
|
||||
.t-title {
|
||||
margin: vh(25) auto;
|
||||
margin: vh(10) auto;
|
||||
width: 100%;
|
||||
height: vh(50);
|
||||
height: vh(32);
|
||||
font-weight: 800;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(16);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -485,31 +491,31 @@
|
||||
box-shadow: none;
|
||||
border-top-left-radius: vh(30);
|
||||
border-bottom-left-radius: vh(30);
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
}
|
||||
.box-1 {
|
||||
margin-top: vh(120);
|
||||
width: vw(1100);
|
||||
// height: vh(950);
|
||||
width: vw(800);
|
||||
height: vh(950);
|
||||
padding: vw(8);
|
||||
box-sizing: border-box;
|
||||
background-image: url('@/assets/images/bg-2.png');
|
||||
background-size: 100% 100%;
|
||||
.traffic {
|
||||
margin-top: vh(20);
|
||||
height: vh(142);
|
||||
height: vh(72);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
|
||||
&-item {
|
||||
width: vw(339);
|
||||
height: vw(102);
|
||||
width: vw(229);
|
||||
height: vw(72);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
padding-left: vw(150);
|
||||
padding-left: vw(84);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
@@ -530,22 +536,22 @@
|
||||
&-item__title {
|
||||
margin-bottom: vh(6);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
}
|
||||
&-item__value--primary {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #12b5fd;
|
||||
}
|
||||
&-item__value--success {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #02f9fa;
|
||||
}
|
||||
&-item__value--error {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #f15a25;
|
||||
}
|
||||
}
|
||||
@@ -556,14 +562,13 @@
|
||||
gap: vw(20);
|
||||
|
||||
&-item {
|
||||
// width: vw(182);
|
||||
flex:1;
|
||||
height: vw(156);
|
||||
width: vw(182);
|
||||
height: vw(106);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin:vh(20) 0;
|
||||
|
||||
&:nth-child(1) {
|
||||
background-image: url('/src/assets/images/four-t-1.png');
|
||||
background-size: 100% 100%;
|
||||
@@ -604,30 +609,28 @@
|
||||
}
|
||||
&-item__label {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
}
|
||||
&-item__value {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
margin-top: vh(10);
|
||||
}
|
||||
}
|
||||
|
||||
.unit {
|
||||
color: #02f9fa;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
margin-bottom: vh(4);
|
||||
}
|
||||
.other-box{
|
||||
|
||||
height: vh(350) !important;
|
||||
}
|
||||
.box {
|
||||
flex: 1;
|
||||
height: vh(400);
|
||||
height: vh(220);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
|
||||
// .title-2 {
|
||||
// width: vw(253);
|
||||
// height: vh(28);
|
||||
@@ -638,7 +641,7 @@
|
||||
// & > span {
|
||||
// padding-left: vw(22);
|
||||
// font-weight: bold;
|
||||
// font-size: font-vw(15);
|
||||
// font-size: vw(15);
|
||||
// background-image: linear-gradient(to bottom, #ffffff 0%, #75c1ff 100%);
|
||||
// -webkit-background-clip: text;
|
||||
// background-clip: text;
|
||||
@@ -661,36 +664,36 @@
|
||||
justify-content: center;
|
||||
}
|
||||
&-title {
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
&-value {
|
||||
margin-top: vh(10);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #02f9fa;
|
||||
}
|
||||
&-error{
|
||||
margin-top: vh(10);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #ff4400;
|
||||
}
|
||||
.count {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(28);
|
||||
font-size: vw(28);
|
||||
color: #ff4400 !important;
|
||||
}
|
||||
.prefix,
|
||||
.suffix {
|
||||
color: #ff4400;
|
||||
font-size: font-vw(12);
|
||||
font-size: vw(12);
|
||||
}
|
||||
}
|
||||
.title-3 {
|
||||
position: relative;
|
||||
width: vw(344);
|
||||
height: vh(16);
|
||||
height: vh(12);
|
||||
margin-top: vh(20);
|
||||
background-image: url('@/assets/images/title-6.png');
|
||||
background-size: 100% 100%;
|
||||
@@ -699,7 +702,7 @@
|
||||
position: absolute;
|
||||
bottom: vh(4);
|
||||
left: vw(20);
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(15);
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(to bottom, #ffffff 0%, #0096ff 100%);
|
||||
-webkit-background-clip: text;
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
<span>收藏夹</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="bom-box">
|
||||
<Title2 title="检索"/>
|
||||
@@ -91,16 +93,21 @@
|
||||
@click.stop="handleCollect(item.cameraIndexCode, item.isCollect, index)"
|
||||
>关注
|
||||
</div>
|
||||
<view class="video-item__video">
|
||||
<video
|
||||
class="video-item__video"
|
||||
:id="'monitorVideo' + index"
|
||||
preload="auto"
|
||||
class="video-item__video"
|
||||
muted
|
||||
autoplay
|
||||
:controls="false"
|
||||
>
|
||||
|
||||
<source type="application/x-mpegURL"/>
|
||||
</video>
|
||||
</view>
|
||||
|
||||
|
||||
<p class="video-item__title--primary">
|
||||
{{ item.cameraName || item.cameraIndexCode }}
|
||||
</p>
|
||||
@@ -119,15 +126,17 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="videoLog == 2" class="video-detail" style="flex:1;">
|
||||
<div v-if="videoLog == 2" class="video-detail">
|
||||
<div class="video-detail__wrapper">
|
||||
<video class="video-detail__video" ref="videoRef" muted autoplay controls>
|
||||
<source type="application/x-mpegURL"/>
|
||||
</video>
|
||||
<div class="action-box">
|
||||
<div class="action-item">
|
||||
<span class="item-sc" @click="handleCollect(thisVideo.cameraIndexCode, thisVideo.isCollect, index)" v-if="thisVideo.isCollect==0">关注</span>
|
||||
<span class="item-sc" @click="handleCollect(thisVideo.cameraIndexCode, thisVideo.isCollect, index)" v-else="thisVideo.isCollect==1">取消关注</span>
|
||||
<span class="item-sc" @click="handleCollect(thisVideo.cameraIndexCode, thisVideo.isCollect, null)"
|
||||
v-if="thisVideo.isCollect==0">关注</span>
|
||||
<span class="item-sc" @click="handleCollect(thisVideo.cameraIndexCode, thisVideo.isCollect, null)"
|
||||
v-else="thisVideo.isCollect==1">取消关注</span>
|
||||
</div>
|
||||
<div class="action-item">
|
||||
<img src="@/assets/images/plus.png" title="焦距变大" @click="handleAction(Z00M_IN)"/>
|
||||
@@ -147,8 +156,10 @@
|
||||
<img src="@/assets/images/right.png" title="右转" @click="handleAction(RIGHT)"/>
|
||||
</div>
|
||||
<div class="action-item">
|
||||
<span class="item-sc" @click="handleCollectAdd(thisVideo.cameraIndexCode, thisVideo.isDiy, index)" v-if="thisVideo.isDiy==0">收藏</span>
|
||||
<span class="item-sc" @click="handleCollectAdd(thisVideo.cameraIndexCode, thisVideo.isDiy, index)" v-else="thisVideo.isDiy==1">取消收藏</span>
|
||||
<span class="item-sc" @click="handleCollectAdd(thisVideo.cameraIndexCode, thisVideo.isDiy, null)"
|
||||
v-if="thisVideo.isDiy==0">收藏</span>
|
||||
<span class="item-sc" @click="handleCollectAdd(thisVideo.cameraIndexCode, thisVideo.isDiy, null)"
|
||||
v-else="thisVideo.isDiy==1">取消收藏</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -192,6 +203,7 @@
|
||||
|
||||
<script setup>
|
||||
import {getVideoListApi, getPreviewUrlApi, getColletListApi, getColletDiyListApi, getColletDiyApi} from '@/api/home'
|
||||
import WebRTCWhep from 'whepts'
|
||||
import {
|
||||
getVideoTypeApi,
|
||||
getVideoRegionsApi,
|
||||
@@ -199,12 +211,19 @@
|
||||
postVideoControlApi,
|
||||
postVideoCollectApi
|
||||
} from '@/api/monitor'
|
||||
import WebRTCWhep from 'whepts'
|
||||
|
||||
import {debounce} from 'lodash'
|
||||
import pubSub from 'pubsub-js'
|
||||
import Hls from 'hls.js'
|
||||
import HlsPlayer from "@/components/HlsPlayer/index.vue";
|
||||
|
||||
// const Z00M_IN = 'ZOOM_IN' // 焦距变大
|
||||
// const Z00M_OUT = 'ZOOM_OUT' // 焦距变小
|
||||
// const UP = 'UP' // 上转
|
||||
// const DOWN = 'DOWN' // 下转
|
||||
// const LEFT = 'LEFT' // 左转
|
||||
// const RIGHT = 'RIGHT' // 右转
|
||||
// const STOP = 'STOP' // 停止操作
|
||||
const Z00M_IN = 'zoomin' // 焦距变大
|
||||
const Z00M_OUT = 'zoomout' // 焦距变小
|
||||
const UP = 'up' // 上转
|
||||
@@ -255,64 +274,6 @@
|
||||
// })
|
||||
// }, 2000)
|
||||
}
|
||||
const createPlayer = (cameraIndexCode,videoElement) => {
|
||||
getPreviewUrlApi({
|
||||
type: 'hls',
|
||||
cameraIndexCode: cameraIndexCode,
|
||||
subStream:1
|
||||
}).then(res=>{
|
||||
const url = res.data.url;
|
||||
if(url.startsWith('http://192.168.77.200:8050/')){
|
||||
const player = new WebRTCWhep({
|
||||
url: url, // WHEP 服务器地址
|
||||
container: videoElement, // 视频播放容器
|
||||
iceServers: [{ urls: 'turn:192.168.77.200:3478',username: 'ZLMediaKit',credential: 'ZLMediaKit'}]
|
||||
})
|
||||
player.on('error', (error) => {
|
||||
console.error('错误:', error.message, error.type)
|
||||
if(error.type ==='REQUEST_ERROR' || error.type ==='NOT_FOUND_ERROR'){
|
||||
createPlayer(cameraIndexCode,videoElement);
|
||||
}
|
||||
})
|
||||
player.on('play:failed', (err) => {
|
||||
// createPlayer(cameraIndexCode,videoElement);
|
||||
})
|
||||
webrtcRefs.push(player)
|
||||
}
|
||||
else{
|
||||
const player = new Hls({
|
||||
maxBufferLength: 10, // 最大缓冲长度(秒)
|
||||
maxMaxBufferLength: 15, // 缓冲区长度的上限
|
||||
maxBufferSize: 30 * 1000 * 1000 // 最大缓冲大小(字节)
|
||||
})
|
||||
player.loadSource(url)
|
||||
player.attachMedia(videoElement)
|
||||
player.on(Hls.Events.MANIFEST_PARSED, () => {
|
||||
videoElement.play()
|
||||
})
|
||||
player.on(Hls.Events.ERROR, (event, data) => {
|
||||
// 根据错误类型进行处理
|
||||
if (data.fatal) {
|
||||
switch (data.type) {
|
||||
case Hls.ErrorTypes.NETWORK_ERROR:
|
||||
console.log('网络错误,尝试重新加载');
|
||||
player.startLoad();
|
||||
break;
|
||||
case Hls.ErrorTypes.MEDIA_ERROR:
|
||||
console.log('媒体错误,尝试修复');
|
||||
player.recoverMediaError();
|
||||
break;
|
||||
default:
|
||||
console.log('无法恢复的错误,销毁播放器');
|
||||
// hls.destroy();
|
||||
break;
|
||||
}
|
||||
}
|
||||
})
|
||||
hlsRefs.push(player)
|
||||
}
|
||||
})
|
||||
}
|
||||
const initVideo = () => {
|
||||
clearHlsRefs()
|
||||
nextTick(() => {
|
||||
@@ -323,7 +284,6 @@
|
||||
})
|
||||
}
|
||||
const onInput = debounce((e) => {
|
||||
|
||||
if (e) {
|
||||
getVideoRegions('search')
|
||||
} else {
|
||||
@@ -334,7 +294,11 @@
|
||||
const clearHlsRefs = () => {
|
||||
if (hlsRefs.length > 0) {
|
||||
hlsRefs.map((item) => {
|
||||
try{
|
||||
item.destroy()
|
||||
}catch (e) {
|
||||
|
||||
}
|
||||
})
|
||||
hlsRefs = []
|
||||
}
|
||||
@@ -390,7 +354,12 @@
|
||||
}
|
||||
const handleBack = () => {
|
||||
videoLog.value = 1
|
||||
try{
|
||||
hlsRef.destroy()
|
||||
}catch (e) {
|
||||
|
||||
}
|
||||
|
||||
initVideo()
|
||||
}
|
||||
let thisVideo = ref(null)
|
||||
@@ -417,9 +386,6 @@
|
||||
handleItemVideo(url, type, code, item);
|
||||
}
|
||||
})
|
||||
hlsRef.on('play:failed', (err) => {
|
||||
// handleItemVideo(url, type, code, item);
|
||||
})
|
||||
} else {
|
||||
hlsRef = new Hls({
|
||||
maxBufferLength: 10, // 最大缓冲长度(秒)
|
||||
@@ -437,11 +403,12 @@
|
||||
}, 1000)
|
||||
}
|
||||
const handleAction = async (e) => {
|
||||
command.value = e
|
||||
if (e == STOP) {
|
||||
ACTION = '1'
|
||||
command.value = e
|
||||
} else {
|
||||
ACTION = '0'
|
||||
command.value = e
|
||||
}
|
||||
await postVideoControlApi({
|
||||
action: ACTION,
|
||||
@@ -481,11 +448,21 @@
|
||||
isCollect: status == 0 ? 1 : 0
|
||||
})
|
||||
if (status == 0) {
|
||||
if(thisVideo.value){
|
||||
thisVideo.value.isCollect =1
|
||||
}
|
||||
if(index!=null){
|
||||
videoList.value[index].isCollect = 1
|
||||
}
|
||||
|
||||
} else {
|
||||
if(thisVideo.value){
|
||||
thisVideo.value.isCollect = 0
|
||||
}
|
||||
if(index!=null){
|
||||
videoList.value[index].isCollect = 0
|
||||
|
||||
}
|
||||
}
|
||||
pubSub.publish('videoCollect', id)
|
||||
}
|
||||
@@ -518,6 +495,61 @@
|
||||
},
|
||||
{immediate: true}
|
||||
)
|
||||
const createPlayer = (cameraIndexCode,videoElement) => {
|
||||
getPreviewUrlApi({
|
||||
type: 'hls',
|
||||
cameraIndexCode: cameraIndexCode,
|
||||
subStream:1
|
||||
}).then(res=>{
|
||||
const url = res.data.url;
|
||||
if(url.startsWith('http://192.168.77.200:8050/')){
|
||||
const player = new WebRTCWhep({
|
||||
url: url, // WHEP 服务器地址
|
||||
container: videoElement, // 视频播放容器
|
||||
iceServers: [{ urls: 'turn:192.168.77.200:3478',username: 'ZLMediaKit',credential: 'ZLMediaKit'}]
|
||||
})
|
||||
player.on('error', (error) => {
|
||||
console.error('错误:', error.message, error.type)
|
||||
if(error.type ==='REQUEST_ERROR' || error.type ==='NOT_FOUND_ERROR'){
|
||||
createPlayer(cameraIndexCode,videoElement)
|
||||
}
|
||||
})
|
||||
webrtcRefs.push(player)
|
||||
}
|
||||
else{
|
||||
const player = new Hls({
|
||||
maxBufferLength: 10, // 最大缓冲长度(秒)
|
||||
maxMaxBufferLength: 15, // 缓冲区长度的上限
|
||||
maxBufferSize: 30 * 1000 * 1000 // 最大缓冲大小(字节)
|
||||
})
|
||||
player.loadSource(url)
|
||||
player.attachMedia(videoElement)
|
||||
player.on(Hls.Events.MANIFEST_PARSED, () => {
|
||||
videoElement.play()
|
||||
})
|
||||
player.on(Hls.Events.ERROR, (event, data) => {
|
||||
// 根据错误类型进行处理
|
||||
if (data.fatal) {
|
||||
switch (data.type) {
|
||||
case Hls.ErrorTypes.NETWORK_ERROR:
|
||||
console.log('网络错误,尝试重新加载');
|
||||
player.startLoad();
|
||||
break;
|
||||
case Hls.ErrorTypes.MEDIA_ERROR:
|
||||
console.log('媒体错误,尝试修复');
|
||||
player.recoverMediaError();
|
||||
break;
|
||||
default:
|
||||
console.log('无法恢复的错误,销毁播放器');
|
||||
// hls.destroy();
|
||||
break;
|
||||
}
|
||||
}
|
||||
})
|
||||
hlsRefs.push(player)
|
||||
}
|
||||
})
|
||||
}
|
||||
const getVideoList = async (val) => {
|
||||
try {
|
||||
if (loading.value) return
|
||||
@@ -531,7 +563,6 @@
|
||||
let res = await getVideoListApi(params)
|
||||
total.value = res.total
|
||||
if (res.data.length > 0) {
|
||||
|
||||
videoList.value = res.data
|
||||
nextTick(() => {
|
||||
videoList.value.forEach(async (x, index) => {
|
||||
@@ -632,18 +663,19 @@
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
.new-title {
|
||||
margin-bottom: vh(20);
|
||||
color: #fff;
|
||||
position: relative;
|
||||
// left:vw(-15);
|
||||
}
|
||||
|
||||
.tree-item__child-item {
|
||||
.new-title:last-child {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.action {
|
||||
&-box {
|
||||
margin-top: vh(16);
|
||||
@@ -652,64 +684,74 @@
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
&-item {
|
||||
padding: vw(16);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background: #0a4190;
|
||||
border-radius: vw(8);
|
||||
|
||||
> img {
|
||||
cursor: pointer;
|
||||
width: vw(34);
|
||||
height: auto;
|
||||
}
|
||||
|
||||
> span {
|
||||
margin: 0 vw(16);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.pause {
|
||||
margin: 0 vw(10);
|
||||
}
|
||||
|
||||
.item-sc {
|
||||
padding: vw(10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//背景色设置为透明
|
||||
:deep(.el-input__wrapper) {
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
//输入框颜色
|
||||
:deep(.el-input__inner) {
|
||||
background-color: rgba(0, 0, 0, 0) !important;
|
||||
color: #fff;
|
||||
font-size: font-vw(22) !important;
|
||||
}
|
||||
|
||||
.box-2 {
|
||||
margin-top: vh(120);
|
||||
// height: vh(950);
|
||||
height: vh(950);
|
||||
display: flex;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
:deep(.el-input__inner) {
|
||||
height: vh(36);
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.left-nav {
|
||||
margin: 0 vw(8);
|
||||
width: vw(350);
|
||||
width: vw(250);
|
||||
background: linear-gradient(321deg, #0b2f64 0%, #062b57 91%, rgba(5, 40, 79, 0) 100%);
|
||||
|
||||
.bom-box {
|
||||
margin-top: vh(20);
|
||||
|
||||
.search-box {
|
||||
border-radius: vw(2);
|
||||
height: vh(70);
|
||||
height: vh(36);
|
||||
border: 1px solid #0096ff;
|
||||
margin: vh(10) auto;
|
||||
display: flex;
|
||||
@@ -725,65 +767,72 @@
|
||||
|
||||
.tree-box {
|
||||
position: relative;
|
||||
height: vh(1080);
|
||||
height: vh(490);
|
||||
padding: 0 vw(20);
|
||||
padding-right: 0;
|
||||
padding-bottom: vw(10);
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
margin-top:vh(30);
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
width: vw(4); /* 滚动条的宽度 */
|
||||
}
|
||||
|
||||
/* 滚动条轨道 */
|
||||
&::-webkit-scrollbar-track {
|
||||
background: 'transparent'; /* 轨道的背景色 */
|
||||
}
|
||||
|
||||
/* 滚动条滑块 */
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: rgba(0, 150, 255, 0.63); /* 滑块的背景色 */
|
||||
border-radius: 5px; /* 滑块的圆角 */
|
||||
}
|
||||
|
||||
.tree-item {
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
padding-top: vh(30);
|
||||
|
||||
padding-top: vh(20);
|
||||
// border-left: vw(2) solid #37d8fc;
|
||||
&:nth-child(1) {
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
&__node {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
&__icon {
|
||||
margin-left: vw(-8);
|
||||
width: vw(16);
|
||||
height: auto;
|
||||
}
|
||||
|
||||
&__icon-up {
|
||||
@extend .tree-item__icon;
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
&__name {
|
||||
padding: 0 vw(5);
|
||||
display: block;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(15);
|
||||
color: #ffffff;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
&__child {
|
||||
position: relative;
|
||||
margin-top: vh(20);
|
||||
// margin-left: vw(20);
|
||||
// border-left: vw(2) solid #37d8fc;
|
||||
}
|
||||
|
||||
&-top__icon {
|
||||
position: absolute;
|
||||
left: vw(-8);
|
||||
@@ -791,6 +840,7 @@
|
||||
width: vw(16);
|
||||
height: vw(16);
|
||||
}
|
||||
|
||||
&-bottom__icon {
|
||||
position: absolute;
|
||||
left: vw(-8);
|
||||
@@ -798,18 +848,20 @@
|
||||
width: vw(16);
|
||||
height: vw(16);
|
||||
}
|
||||
|
||||
&__child-item {
|
||||
padding: vh(0) vw(20) vh(20) vw(10);
|
||||
cursor: pointer;
|
||||
color: rgb(192, 216, 254);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(15);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
// display: flex;
|
||||
align-items: flex-start;
|
||||
padding-right: 0;
|
||||
|
||||
&:nth-last-of-type(1) {
|
||||
// padding: vh(0) vw(20);
|
||||
// padding-right:0;
|
||||
@@ -819,11 +871,12 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ul {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(18);
|
||||
color: #fff;
|
||||
height: vh(740);
|
||||
height: vh(340);
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
/* 滚动条整体样式 */
|
||||
@@ -831,26 +884,29 @@
|
||||
&::-webkit-scrollbar {
|
||||
width: vw(4); /* 滚动条的宽度 */
|
||||
}
|
||||
|
||||
/* 滚动条轨道 */
|
||||
&::-webkit-scrollbar-track {
|
||||
background: 'transparent'; /* 轨道的背景色 */
|
||||
}
|
||||
|
||||
/* 滚动条滑块 */
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: rgba(0, 150, 255, 0.63); /* 滑块的背景色 */
|
||||
border-radius: 5px; /* 滑块的圆角 */
|
||||
}
|
||||
|
||||
.li {
|
||||
cursor: pointer;
|
||||
// width: vw(250);
|
||||
height: vh(120);
|
||||
line-height: vh(120);
|
||||
width: vw(250);
|
||||
height: vh(58);
|
||||
line-height: vh(58);
|
||||
text-align: center;
|
||||
margin-bottom: vh(25);
|
||||
margin-bottom: vh(15);
|
||||
background: url('/src/assets/images/m-nav-bg-1.png');
|
||||
background-size: 100% 100%;
|
||||
font-size: font-vw(22);
|
||||
}
|
||||
|
||||
.active {
|
||||
background: url('/src/assets/images/m-nav-bg-2.png');
|
||||
background-size: 100% 100%;
|
||||
@@ -862,38 +918,43 @@
|
||||
&-wrapper {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
// height: vh(960);
|
||||
height: vh(960);
|
||||
padding: vh(30) vw(20);
|
||||
box-sizing: border-box;
|
||||
background-image: url('/src/assets/images/log-v-bg.png');
|
||||
background-size: 100% 100%;
|
||||
|
||||
.pagination {
|
||||
padding: vh(10) vw(30);
|
||||
position: absolute;
|
||||
right: vw(30);
|
||||
bottom: vh(50);
|
||||
bottom: vh(20);
|
||||
}
|
||||
}
|
||||
|
||||
&-list {
|
||||
gap: vw(8);
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-content: flex-start;
|
||||
}
|
||||
|
||||
&-item {
|
||||
position: relative;
|
||||
// width: vw(686);
|
||||
width: 33%;
|
||||
height: vh(920);
|
||||
height: vh(380);
|
||||
padding: vh(10) vw(10);
|
||||
background-image: url('/src/assets/images/item-primary.png');
|
||||
background-size: 100% 100%;
|
||||
|
||||
&:hover {
|
||||
.video-item__follow {
|
||||
display: block !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-item__follow {
|
||||
cursor: pointer;
|
||||
display: none;
|
||||
@@ -906,11 +967,12 @@
|
||||
text-align: center;
|
||||
line-height: vh(24);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
background-image: url('@/assets/images/unfollow.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
|
||||
&-item__unfollow {
|
||||
@extend .video-item__follow;
|
||||
background-image: url('@/assets/images/unfollow.png');
|
||||
@@ -919,47 +981,52 @@
|
||||
&-item__inner {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
&-item__title {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
padding: vh(20) vw(20);
|
||||
padding: vh(10) vw(10);
|
||||
color: #fff;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
&-item__title--error {
|
||||
@extend .video-item__title;
|
||||
background-color: rgba(226, 27, 27, 0.72);
|
||||
}
|
||||
|
||||
&-item__title--primary {
|
||||
@extend .video-item__title;
|
||||
font-size: font-vw(20);
|
||||
background-color: rgba(4, 30, 69, 0.72);
|
||||
}
|
||||
|
||||
&-item__video {
|
||||
width: 100%;
|
||||
height: vh(900);
|
||||
height: vh(366);
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
&-detail {
|
||||
margin-left: vw(10);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
&-detail__wrapper {
|
||||
position: relative;
|
||||
padding: vh(40) vw(50);
|
||||
// width: vw(1660);
|
||||
flex:1;
|
||||
// height: vh(960);
|
||||
width: vw(1660);
|
||||
height: vh(960);
|
||||
background-image: url('/src/assets/images/one-video-bg.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
|
||||
&-detail__title {
|
||||
position: absolute;
|
||||
left: vw(50);
|
||||
@@ -967,45 +1034,50 @@
|
||||
top: 40 (vh);
|
||||
z-index: 9;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
padding: vw(20);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
background: rgba(4, 30, 69, 0.5);
|
||||
}
|
||||
|
||||
&-detail__video {
|
||||
width: 100%;
|
||||
height: vh(1820);
|
||||
height: vh(820);
|
||||
object-fit: contain;
|
||||
background-color: #000;
|
||||
}
|
||||
|
||||
&-right {
|
||||
margin-left: vw(8);
|
||||
width: vw(440);
|
||||
// height: vh(956);
|
||||
height: vh(956);
|
||||
background: #082f5a;
|
||||
|
||||
.back-box {
|
||||
cursor: pointer;
|
||||
padding-right: vw(20);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom:vh(10);
|
||||
|
||||
.icon {
|
||||
width: vw(30);
|
||||
height: auto;
|
||||
margin-right: vw(10);
|
||||
}
|
||||
|
||||
& > span {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(20);
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
|
||||
.list {
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
height: vh(1920);
|
||||
height: vh(920);
|
||||
padding: vw(8);
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
@@ -1034,39 +1106,43 @@
|
||||
padding: vw(10);
|
||||
background-image: url('@/assets/images/item-primary.png');
|
||||
background-size: 100% 100%;
|
||||
|
||||
& > div {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
&-title {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
padding: vw(10);
|
||||
color: #fff;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
&-title--error {
|
||||
@extend .item-title;
|
||||
background-color: rgba(226, 27, 27, 0.72);
|
||||
}
|
||||
|
||||
&-title--primary {
|
||||
@extend .item-title;
|
||||
font-size: font-vw(20);
|
||||
padding:vw(10);
|
||||
background-color: rgba(4, 30, 69, 0.72);
|
||||
}
|
||||
|
||||
&-img {
|
||||
width: 100%;
|
||||
height: vh(264);
|
||||
height: vh(164);
|
||||
display: block;
|
||||
object-fit: cover;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.video-live {
|
||||
.video-rt {
|
||||
width: vw(400);
|
||||
@@ -1082,33 +1158,39 @@
|
||||
border-image: linear-gradient(180deg, rgba(0, 150, 255, 1), rgba(0, 90, 153, 0)) 1 1;
|
||||
margin-left: vw(10);
|
||||
padding: vw(20);
|
||||
|
||||
.rt-v-box {
|
||||
overflow-y: auto;
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
width: vw(4); /* 滚动条的宽度 */
|
||||
}
|
||||
|
||||
/* 滚动条轨道 */
|
||||
&::-webkit-scrollbar-track {
|
||||
background: 'transparent'; /* 轨道的背景色 */
|
||||
}
|
||||
|
||||
/* 滚动条滑块 */
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: rgba(0, 150, 255, 0.63); /* 滑块的背景色 */
|
||||
border-radius: 5px; /* 滑块的圆角 */
|
||||
}
|
||||
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.title {
|
||||
background-image: url('/src/assets/images/nav-l-t-bg.png');
|
||||
background-size: 100% 100%;
|
||||
margin-bottom: vh(10);
|
||||
position: relative;
|
||||
left: vw(-20);
|
||||
|
||||
span {
|
||||
margin-left: vw(30);
|
||||
font-weight: 800;
|
||||
font-size: font-vw(15);
|
||||
font-size: vw(15);
|
||||
line-height: vh(26);
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
@@ -1121,6 +1203,7 @@
|
||||
color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.rt-video {
|
||||
width: 100%;
|
||||
height: vh(300);
|
||||
@@ -1130,6 +1213,7 @@
|
||||
box-sizing: border-box;
|
||||
margin-bottom: vh(2);
|
||||
position: relative;
|
||||
|
||||
.desc {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
@@ -1140,7 +1224,7 @@
|
||||
border-radius: 0px 0px 0px 0px;
|
||||
text-align: center;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
padding: vw(20);
|
||||
text-align: left;
|
||||
@@ -1148,9 +1232,11 @@
|
||||
text-transform: none;
|
||||
}
|
||||
}
|
||||
|
||||
.v-error-bg {
|
||||
background-image: url('/src/assets/images/v-item-bg-1.png');
|
||||
background-size: 100% 100%;
|
||||
|
||||
.desc {
|
||||
background: rgba(226, 27, 27, 0.5);
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
left: '4%',
|
||||
right: '8%',
|
||||
top: '10%',
|
||||
bottom: '2%',
|
||||
bottom: '14%',
|
||||
containLabel: true
|
||||
},
|
||||
xAxis: {
|
||||
@@ -61,7 +61,7 @@
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
fontSize: fitChartSize(16),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
},
|
||||
data: getXAxisData()
|
||||
@@ -72,14 +72,15 @@
|
||||
show: true, // 显示dataZoom组件
|
||||
xAxisIndex: [0], // 控制第一个x轴
|
||||
start: 0, // 初始起始位置
|
||||
end: 50 // 初始结束位置,可以根据数据量调整
|
||||
end: 60 // 初始结束位置,可以根据数据量调整
|
||||
}
|
||||
],
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
offset: 15,
|
||||
axisLabel: {
|
||||
show: true,
|
||||
fontSize: fitChartSize(18),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
},
|
||||
splitLine: {
|
||||
@@ -94,12 +95,12 @@
|
||||
{
|
||||
type: 'bar',
|
||||
data: getSeriesData(),
|
||||
barWidth: fitChartSize(32),
|
||||
barWidth: fitChartSize(20),
|
||||
label: {
|
||||
show: true,
|
||||
position: 'top',
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(20),
|
||||
fontSize: fitChartSize(12),
|
||||
formatter: (res) => {
|
||||
let valueMap = {
|
||||
1: '畅通',
|
||||
@@ -139,8 +140,7 @@
|
||||
|
||||
<style scoped lang="scss">
|
||||
.traffic-jam {
|
||||
margin-top: vh(10);
|
||||
width:100%;
|
||||
height: 100%;
|
||||
width: vw(760);
|
||||
height: vh(180);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<div class="z-dialog">
|
||||
<el-dialog title="核心路段拥堵告警" v-model="modelValue" align-center :modal="false" :show-close="false">
|
||||
<el-dialog :title="props.type=='deal'?'已解除告警':'核心路段拥堵告警'" v-model="modelValue" align-center :modal="false" :show-close="false">
|
||||
<img class="close" src="@/assets/images/close.png" @click="handleClose" />
|
||||
<div class="no-data" v-if="cond&&!list.length">
|
||||
暂无拥堵告警
|
||||
{{props.type=='deal'?'暂无数据':'暂无拥堵告警'}}
|
||||
</div>
|
||||
<div v-else>
|
||||
<ul class="list" >
|
||||
@@ -32,6 +32,10 @@
|
||||
import pubSub from 'pubsub-js'
|
||||
|
||||
let props = defineProps({
|
||||
type: {
|
||||
type: String,
|
||||
default: 'curr'
|
||||
},
|
||||
events: {
|
||||
type: String,
|
||||
default: ''
|
||||
@@ -127,7 +131,7 @@
|
||||
}
|
||||
let cond = ref(false)
|
||||
const getVideoList = async () => {
|
||||
let res = await getTrafficEventsApi();
|
||||
let res = await getTrafficEventsApi(props.type);
|
||||
list.value = res.data
|
||||
setTimeout(()=>{cond.value = true},1500)
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<template>
|
||||
<div class="z-dialog">
|
||||
<el-dialog title="异常点位告警" v-model="modelValue" align-center :modal="false" :show-close="false">
|
||||
<el-dialog :title="props.type=='deal'?'已解除异常':'异常点位告警'" v-model="modelValue" align-center :modal="false" :show-close="false">
|
||||
<img class="close" src="@/assets/images/close.png" @click="handleClose" />
|
||||
<div class="no-data" v-if="cond&&!list.length">
|
||||
暂无异常情况
|
||||
{{props.type=='deal'?'暂无数据':'暂无异常情况'}}
|
||||
</div>
|
||||
<div v-else>
|
||||
<ul class="list">
|
||||
@@ -44,6 +44,10 @@
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
default: 'curr'
|
||||
},
|
||||
events: {
|
||||
type: String,
|
||||
default: ''
|
||||
@@ -135,7 +139,7 @@
|
||||
}
|
||||
let cond = ref(false)
|
||||
const getVideoList = async () => {
|
||||
let res = await getVideoEventApi(props.scenicSpotId);
|
||||
let res = await getVideoEventApi(props.scenicSpotId,props.type);
|
||||
list.value = res.data
|
||||
setTimeout(()=>{cond.value = true},1500)
|
||||
nextTick(() => {
|
||||
@@ -228,6 +232,20 @@
|
||||
flex-wrap: wrap;
|
||||
align-content: flex-start;
|
||||
padding:vw(10);
|
||||
overflow: auto;
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
height: vh(4); /* 滚动条的宽度 */
|
||||
}
|
||||
/* 滚动条轨道 */
|
||||
&::-webkit-scrollbar-track {
|
||||
background: 'transparent'; /* 轨道的背景色 */
|
||||
}
|
||||
/* 滚动条滑块 */
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: rgba(0, 150, 255, 0.63); /* 滑块的背景色 */
|
||||
border-radius: 5px; /* 滑块的圆角 */
|
||||
}
|
||||
.item {
|
||||
position: relative;
|
||||
width: 33%;
|
||||
|
||||
@@ -49,11 +49,11 @@
|
||||
rich: {
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(12)
|
||||
},
|
||||
value: {
|
||||
color: '#00D5F6',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -92,7 +92,7 @@
|
||||
label: {
|
||||
show: false,
|
||||
color: '#D3F0FE',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(12)
|
||||
},
|
||||
data: getSeriesData()
|
||||
},
|
||||
@@ -109,7 +109,7 @@
|
||||
label: {
|
||||
show: false,
|
||||
color: '#D3F0FE',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(12)
|
||||
},
|
||||
data: getSeriesData()
|
||||
},
|
||||
@@ -151,7 +151,7 @@
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.age {
|
||||
width: vw(260);
|
||||
height: vh(850);
|
||||
width: vw(240);
|
||||
height: vh(280);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -650,7 +650,7 @@ let tabsIndex = ref(0)
|
||||
}
|
||||
.big-car-ship {
|
||||
flex: 1;
|
||||
height: vh(850);
|
||||
height: vh(820);
|
||||
}
|
||||
.close {
|
||||
cursor: pointer;
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
</div>
|
||||
<div class="rt-lable">
|
||||
<div style="flex:1;" v-for="(item, index) in scenicStore.scenicSpotData.infoList" :key="index">
|
||||
<div v-for="(item, index) in scenicStore.scenicSpotData.infoList" :key="index">
|
||||
<div class="label">{{ item.name }}</div>
|
||||
<p class="value" :class="{ error: item.type==2,warning: item.type==1 }">{{ item.value }}</p>
|
||||
</div>
|
||||
@@ -22,66 +22,19 @@
|
||||
</div>
|
||||
<div class="main">
|
||||
<a @click="hanldeToDetails" class="look-btn">
|
||||
查看详情
|
||||
<!-- <img src="@/assets/images/d-ico-1.png" /> -->
|
||||
<!-- 查看详情-->
|
||||
<img src="@/assets/images/d-icon-1.png" />
|
||||
</a>
|
||||
<iframe v-if="scenicSpotId == 'root000000'" width="100%" height="100%" src="http://192.168.77.200/map/sxzd/bdc.html"></iframe>
|
||||
<iframe v-if="scenicSpotId == 'root00000000'" width="100%" height="100%" src="http://192.168.77.200/map/sxzd/sxzd.html"></iframe>
|
||||
<iframe v-if="scenicSpotId == 'root00000000'" width="100%" height="100%" src="http://192.168.77.200//map/sxzd/sxzd.html"></iframe>
|
||||
<iframe v-if="scenicSpotId == '龙桥河'" width="100%" height="100%" src="http://192.168.77.200/map/lqh/lqh.html"></iframe>
|
||||
</div>
|
||||
|
||||
<div class="box-1" style="padding: 0;margin:0;">
|
||||
<Title1 title="停车信息" />
|
||||
<div class="new-circle">
|
||||
<div class=" flex flex-1">
|
||||
<circle-progress
|
||||
v-for="(item, index) in garageList"
|
||||
:key="index"
|
||||
:width="80"
|
||||
:height="50"
|
||||
:value="parseFloat(item.rate)"
|
||||
:title="item.occupied"
|
||||
:subTitle="`${item.name}`"
|
||||
/>
|
||||
</div>
|
||||
<div class="ml-20 mb-10 flex flex-1 justify-between">
|
||||
<count-item label="总停车场" :count="scenicStore.stopCarData.info.count" suffix="个" />
|
||||
<count-item
|
||||
label="剩余车位数"
|
||||
:count="scenicStore.stopCarData.info.occupiedSpaces"
|
||||
suffix="个"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer">
|
||||
<div class="flex">
|
||||
<div class="border mr-8 flex-1">
|
||||
<div class="pt-10">
|
||||
<Title3 title="今日景区车流量" />
|
||||
</div>
|
||||
<Line width="100%" :height="133" :data="carBearData" :xAxisData="carBearXAxisData" />
|
||||
</div>
|
||||
<div class="border flex-1">
|
||||
<div class="pt-10">
|
||||
<Title3 title="车辆归属地占比" />
|
||||
</div>
|
||||
<PieRow
|
||||
label="今日停车累计"
|
||||
:dataList="dataLists"
|
||||
:total="carTotal"
|
||||
width="98%"
|
||||
:height="133"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="footer" v-if="false">
|
||||
<div class="">
|
||||
<div class="item">
|
||||
<circle-progress
|
||||
:width="150"
|
||||
:height="60"
|
||||
:width="170"
|
||||
:height="90"
|
||||
:value="parseFloat(scenicStore.wordkOrderData.toDayData.rate)"
|
||||
:title="`${scenicStore.wordkOrderData.toDayData.rate}%`"
|
||||
subTitle="完成率"
|
||||
@@ -103,8 +56,8 @@
|
||||
</div>
|
||||
<div class="item">
|
||||
<circle-progress
|
||||
:width="150"
|
||||
:height="60"
|
||||
:width="170"
|
||||
:height="90"
|
||||
:value="parseFloat(scenicStore.wordkOrderData.warnData.rate)"
|
||||
:title="`${scenicStore.wordkOrderData.warnData.rate}%`"
|
||||
subTitle="完成率"
|
||||
@@ -154,12 +107,21 @@
|
||||
<div class="header">
|
||||
<div>订票时间</div>
|
||||
<div>订票数量</div>
|
||||
<template v-if="scenicSpotId == 'root00000000'">
|
||||
<div>徒步订票</div>
|
||||
</template>
|
||||
<div>团队订票</div>
|
||||
<div>散客订票</div>
|
||||
</div>
|
||||
<div class="list">
|
||||
<div class="item" v-for="(item, index) in gridData" :key="index">
|
||||
<div>{{ item.time }}</div>
|
||||
<div>{{ item.value }}</div>
|
||||
|
||||
<template v-if="scenicSpotId == 'root00000000'">
|
||||
<div>{{ item.walk }}</div>
|
||||
</template>
|
||||
<div>{{ item.group }}</div>
|
||||
<div>{{ item.single }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -186,35 +148,7 @@ import pubSub from 'pubsub-js'
|
||||
const scenicStore = useScenicStore()
|
||||
const { initMap, addMarker, map, marker } = useMap()
|
||||
import { useHomeStore } from '@/stores/home'
|
||||
const carBearData = computed(() => {
|
||||
|
||||
return [{ data: scenicStore.stopCarData.dataList.map((item) => item.value) }]
|
||||
})
|
||||
const carBearXAxisData = computed(() => {
|
||||
return scenicStore.stopCarData.dataList.map((item) => item.name)
|
||||
})
|
||||
const carTotal = computed(() => {
|
||||
return dataLists.value.reduce((pre, cur) => {
|
||||
return pre + parseInt(cur.count)
|
||||
}, 0)
|
||||
})
|
||||
const garageList = computed(() => {
|
||||
return scenicStore.stopCarData.headList
|
||||
})
|
||||
|
||||
let dataLists = ref([])
|
||||
watch(
|
||||
() => scenicStore.stopCarData.dataLists,
|
||||
(val) => {
|
||||
console.log(val.length, 'dataListsdataListsdataLists')
|
||||
if (val.length) {
|
||||
dataLists.value = val
|
||||
} else {
|
||||
dataLists.value = []
|
||||
}
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
const homeStore = useHomeStore()
|
||||
let props = defineProps({
|
||||
scenicSpotId: {
|
||||
@@ -237,26 +171,25 @@ import pubSub from 'pubsub-js'
|
||||
let src = ref('')
|
||||
let cameraIndexCode = ref('')
|
||||
let videoShow = ref(false)
|
||||
// window.addEventListener("message", async(e) => {
|
||||
// let {code,data} = await getPreviewUrlApi({
|
||||
// type: 'hls',
|
||||
// cameraIndexCode:e.data.cameraIndexCode
|
||||
// })
|
||||
// if(code===200){
|
||||
// src.value = data.url
|
||||
// cameraIndexCode.value = e.data.cameraIndexCode
|
||||
// videoShow.value = true
|
||||
// }
|
||||
// });
|
||||
window.addEventListener("message", async(e) => {
|
||||
let {code,data} = await getPreviewUrlApi({
|
||||
type: 'hls',
|
||||
cameraIndexCode:e.data.cameraIndexCode,
|
||||
subStream:0
|
||||
})
|
||||
if(code===200){
|
||||
src.value = data.url
|
||||
cameraIndexCode.value = e.data.cameraIndexCode
|
||||
videoShow.value = true
|
||||
}
|
||||
});
|
||||
let dialogTableVisible = ref(false)
|
||||
let gridData = ref([])
|
||||
let gridTitle = ref('')
|
||||
const handlePiaoPop = async()=>{
|
||||
console.log(777777)
|
||||
dialogTableVisible.value = true
|
||||
let res = await getSpotTicketDate({scenicSpotId:props.scenicSpotId})
|
||||
gridData.value = res.data
|
||||
console.log(res,'res')
|
||||
}
|
||||
let myElement = ref(false)
|
||||
onMounted(() => {
|
||||
@@ -295,63 +228,43 @@ import pubSub from 'pubsub-js'
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.border {
|
||||
position: relative;
|
||||
padding: 0 vw(10);
|
||||
box-sizing: border-box;
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
flex:1;
|
||||
}
|
||||
.coll-box{
|
||||
flex:1 !important;
|
||||
}
|
||||
.box-1 .rt-lable{
|
||||
justify-content: center !important;
|
||||
text-align: center;
|
||||
.label{
|
||||
font-size: font-vw(20) !important; /* 22×1.2 */
|
||||
font-size:vw(14) !important;
|
||||
}
|
||||
.value{
|
||||
font-size: font-vw(24) !important; /* 32×1.2 */
|
||||
font-size:vw(24) !important;
|
||||
}
|
||||
}
|
||||
.box-1 {
|
||||
margin-top: vh(120);
|
||||
min-width: vw(900);
|
||||
width: vw(780);
|
||||
// flex:1;
|
||||
// height: vh(950);
|
||||
height: vh(950);
|
||||
padding: vw(10);
|
||||
box-sizing: border-box;
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
overflow: hidden;
|
||||
// height: 100%;
|
||||
.border {
|
||||
height:vh(612) !important;
|
||||
}
|
||||
.new-circle{
|
||||
height:vh(340);
|
||||
}
|
||||
.header {
|
||||
// display: flex;
|
||||
padding: vh(20);
|
||||
height:vh(240);
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
margin-top: vh(10);
|
||||
&__left {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-right:vw(10);
|
||||
cursor:pointer;
|
||||
> img {
|
||||
// width: vw(150);
|
||||
height: vh(100);
|
||||
width: vw(74);
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
&__left-item {
|
||||
position: relative;
|
||||
width: vw(210);
|
||||
height: vh(120);
|
||||
width: vw(115);
|
||||
height: vh(58);
|
||||
padding-left: vw(10);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -361,9 +274,9 @@ import pubSub from 'pubsub-js'
|
||||
// margin-left:vw(30);
|
||||
.label {
|
||||
position: absolute;
|
||||
top: vh(-10);
|
||||
top: vh(-4);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
left:vw(0)
|
||||
}
|
||||
@@ -374,12 +287,12 @@ import pubSub from 'pubsub-js'
|
||||
justify-content: space-between;
|
||||
.label {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18); /* 16×1.2 */
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
}
|
||||
.value {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24); /* 28×1.2 */
|
||||
font-size: vw(28);
|
||||
color: #02f9fa;
|
||||
text-align: center;
|
||||
line-height: vh(60);
|
||||
@@ -394,13 +307,13 @@ import pubSub from 'pubsub-js'
|
||||
|
||||
.countup-wrap {
|
||||
color: #02f9fa;
|
||||
font-size: font-vw(28); /* 36×1.2 */
|
||||
font-size: vw(28);
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.main {
|
||||
width: 100%;
|
||||
height: vh(720);
|
||||
height: vh(600);
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
position:relative;
|
||||
@@ -413,14 +326,14 @@ import pubSub from 'pubsub-js'
|
||||
padding: vw(20);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background: #0a4190;
|
||||
//background: #0a4190;
|
||||
border-radius: vw(4);
|
||||
font-size: font-vw(20); /* 22×1.2 */
|
||||
font-size: vw(16);
|
||||
font-weight:700;
|
||||
color: #fff;
|
||||
z-index: 999;
|
||||
img{
|
||||
width:vw(100);
|
||||
width:vw(80);
|
||||
// height:;
|
||||
}
|
||||
}
|
||||
@@ -449,18 +362,18 @@ import pubSub from 'pubsub-js'
|
||||
.footer {
|
||||
.item {
|
||||
flex: 1;
|
||||
height: vh(280);
|
||||
height: vh(140);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: cover;
|
||||
background-size: 100% 100%;
|
||||
&:nth-child(1) {
|
||||
// margin-right: vw(10);
|
||||
margin-right: vw(10);
|
||||
}
|
||||
.bg {
|
||||
padding-left: vw(20);
|
||||
//width: vw(243);
|
||||
height: vh(80);
|
||||
height: vh(40);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background: linear-gradient(90deg, rgba(0, 150, 255, 0.34) 0%, rgba(0, 150, 255, 0) 100%);
|
||||
@@ -468,14 +381,14 @@ import pubSub from 'pubsub-js'
|
||||
margin-bottom: vh(4);
|
||||
}
|
||||
.label {
|
||||
// width: vw(120);
|
||||
width: vw(120);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(24); /* 20×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
}
|
||||
.value {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(38.4); /* 32×1.2 */
|
||||
font-size: vw(28);
|
||||
color: #fff;
|
||||
}
|
||||
.success {
|
||||
@@ -487,8 +400,8 @@ import pubSub from 'pubsub-js'
|
||||
}
|
||||
}
|
||||
.list {
|
||||
margin-top: vh(10);
|
||||
height: vh(400);
|
||||
margin-top: vh(4);
|
||||
height: vh(116);
|
||||
overflow: hidden;
|
||||
}
|
||||
.cell {
|
||||
@@ -499,40 +412,38 @@ import pubSub from 'pubsub-js'
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.tag {
|
||||
padding:vw(16);
|
||||
padding: 0 vw(16);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(18); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: vw(2);
|
||||
min-width:vw(60);
|
||||
}
|
||||
.tag--important {
|
||||
@extend .tag;
|
||||
background: #feae00;
|
||||
background:#d9011b;
|
||||
}
|
||||
.tag--warn {
|
||||
@extend .tag;
|
||||
background: #d9011b;
|
||||
background: #feae00;
|
||||
}
|
||||
.tag--normal {
|
||||
@extend .tag;
|
||||
background: #2380fb;
|
||||
}
|
||||
.content {
|
||||
margin-left: vw(10);
|
||||
padding:vw(15);
|
||||
min-width: vw(840);
|
||||
// width:100%;
|
||||
// height: vh(24);
|
||||
// line-height: vh(24);
|
||||
margin-left: vw(4);
|
||||
padding: 0 vw(10);
|
||||
width: vw(460);
|
||||
height: vh(24);
|
||||
line-height: vh(24);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
border-radius: vw(2);
|
||||
background: rgba(0, 150, 255, 0.28);
|
||||
@@ -540,8 +451,8 @@ import pubSub from 'pubsub-js'
|
||||
}
|
||||
.more {
|
||||
cursor: pointer;
|
||||
width: vw(40);
|
||||
// height: vh(100);
|
||||
width: auto;
|
||||
height: vh(100);
|
||||
margin-top: vh(12);
|
||||
}
|
||||
}
|
||||
@@ -550,7 +461,7 @@ import pubSub from 'pubsub-js'
|
||||
<style lang="scss" scoped>
|
||||
:deep(.el-dialog__headerbtn .el-dialog__close){
|
||||
color:#fff;
|
||||
font-size:48px; /* 40×1.2 */
|
||||
font-size:40px;
|
||||
position:relative;
|
||||
top:15px;
|
||||
right:15px;
|
||||
@@ -566,7 +477,6 @@ import pubSub from 'pubsub-js'
|
||||
:deep(.el-dialog__title) {
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
font-size: font-vw(28.8); /* 24×1.2 - 补充默认弹窗标题字体放大 */
|
||||
}
|
||||
|
||||
.sp-ico {
|
||||
@@ -593,7 +503,7 @@ import pubSub from 'pubsub-js'
|
||||
|
||||
}
|
||||
.header-title{
|
||||
font-size: font-vw(38.4); /* 32×1.2 */
|
||||
font-size:vw(32);
|
||||
color:#fff;
|
||||
text-align:center;
|
||||
font-weight:bold;
|
||||
@@ -611,7 +521,7 @@ import pubSub from 'pubsub-js'
|
||||
.header {
|
||||
height: vh(28);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(28.8); /* 24×1.2 */
|
||||
font-size: vw(24);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
background: linear-gradient(180deg, rgba(0, 99, 255, 0) 0%, #0063ff 100%);
|
||||
@@ -641,7 +551,7 @@ import pubSub from 'pubsub-js'
|
||||
.item {
|
||||
height: vh(50);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(28.8); /* 24×1.2 */
|
||||
font-size: vw(24);
|
||||
color: #f1f7ff;
|
||||
display: flex;
|
||||
&:nth-child(2n + 1) {
|
||||
@@ -667,7 +577,7 @@ import pubSub from 'pubsub-js'
|
||||
span {
|
||||
margin-left: vw(30);
|
||||
font-weight: 800;
|
||||
font-size: font-vw(18); /* 15×1.2 */
|
||||
font-size: vw(15);
|
||||
line-height: vh(26);
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
@@ -685,7 +595,7 @@ import pubSub from 'pubsub-js'
|
||||
height: vh(500);
|
||||
.icon-box {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
line-height: vh(16);
|
||||
flex-wrap: wrap;
|
||||
@@ -712,7 +622,7 @@ import pubSub from 'pubsub-js'
|
||||
text-align: center;
|
||||
line-height: vh(26);
|
||||
margin-left: vw(32.5);
|
||||
font-size: font-vw(19.2); /* 16×1.2 */
|
||||
font-size: vw(16);
|
||||
font-weight: 800;
|
||||
color: #fff;
|
||||
background-image: url('@/assets/images/title-1.png');
|
||||
|
||||
@@ -31,26 +31,24 @@
|
||||
<Title3 title="景区排队人数" />
|
||||
</div>
|
||||
<Line
|
||||
width="100%"
|
||||
:height="145"
|
||||
:width="490"
|
||||
:height="300"
|
||||
:data="scenicQueueData"
|
||||
:xAxisData="scenicQueueXAxisData"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box box-9 mr-8">
|
||||
<div class="box mr-8">
|
||||
<Title1 title="景区承载" />
|
||||
<div
|
||||
style="cursor: pointer;"
|
||||
class="count-box flex justify-between">
|
||||
<div class="flex">
|
||||
<circle-progress
|
||||
:width="70"
|
||||
:height="35"
|
||||
:width="200"
|
||||
:height="70"
|
||||
:value="scenicStore.scenicBearData.header.jqRate"
|
||||
:title="`${scenicStore.scenicBearData.header.jqRate}%`"
|
||||
subTitle="景区承载率"
|
||||
/>
|
||||
<div class="flex flex-1 justify-center" style="text-align: center;">
|
||||
<div class="flex flex-1 justify-between">
|
||||
<count-item
|
||||
label="景区当前在园人数"
|
||||
:count="scenicStore.scenicBearData.header.jrjdrs"
|
||||
@@ -68,28 +66,28 @@
|
||||
<Title3 title="今日景区承载量" />
|
||||
</div>
|
||||
<Line
|
||||
width="100%"
|
||||
:height="145"
|
||||
:width="490"
|
||||
:height="300"
|
||||
:data="scenicBearData"
|
||||
:xAxisData="scenicBearXAxisData"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-1 mr-8" v-if="false" style="padding: 0;">
|
||||
<div class="box-1 mr-8" style="padding: 0;">
|
||||
<Title1 title="停车信息" />
|
||||
<div class="">
|
||||
<div class=" flex flex-1">
|
||||
<div class="flex">
|
||||
<div class="height70 flex flex-1">
|
||||
<circle-progress
|
||||
v-for="(item, index) in garageList"
|
||||
:key="index"
|
||||
:width="80"
|
||||
:height="50"
|
||||
:width="140"
|
||||
:height="70"
|
||||
:value="parseFloat(item.rate)"
|
||||
:title="item.occupied"
|
||||
:subTitle="`${item.name}`"
|
||||
/>
|
||||
</div>
|
||||
<div class="ml-20 mb-10 flex flex-1 justify-between">
|
||||
<div class="ml-20 flex flex-1 justify-between">
|
||||
<count-item label="总停车场" :count="scenicStore.stopCarData.info.count" suffix="个" />
|
||||
<count-item
|
||||
label="剩余车位数"
|
||||
@@ -103,7 +101,7 @@
|
||||
<div class="pt-10">
|
||||
<Title3 title="今日景区车流量" />
|
||||
</div>
|
||||
<Line width="100%" :height="105" :data="carBearData" :xAxisData="carBearXAxisData" />
|
||||
<Line :width="360" :height="300" :data="carBearData" :xAxisData="carBearXAxisData" />
|
||||
</div>
|
||||
<div class="border flex-1">
|
||||
<div class="pt-10">
|
||||
@@ -113,18 +111,18 @@
|
||||
label="今日停车累计"
|
||||
:dataList="dataLists"
|
||||
:total="carTotal"
|
||||
width="100%"
|
||||
:height="110"
|
||||
:width="360"
|
||||
:height="300"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-2">
|
||||
<Title1 title="异常信息 " />
|
||||
<!-- @click="handleToWorkOrder" -->
|
||||
<div style="cursor: pointer;" class="count-box flex">
|
||||
<count-item
|
||||
v-for="item in headList"
|
||||
@click="showAbnormalList(item)"
|
||||
:label="item.name"
|
||||
:count="item.count"
|
||||
:type="item.type"
|
||||
@@ -138,10 +136,10 @@
|
||||
</div>
|
||||
<PieRow
|
||||
label="告警总数"
|
||||
:dataList="scenicStore?.secureData.dataList"
|
||||
:dataList="scenicStore.secureData.dataList"
|
||||
:total="alarmTotal"
|
||||
width="100%"
|
||||
:height="145"
|
||||
:width="440"
|
||||
:height="300"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -168,8 +166,8 @@
|
||||
<div class="border mr-8">
|
||||
<Title3 title="拥堵次数占比" />
|
||||
<jam
|
||||
width="100%"
|
||||
:height="200"
|
||||
:width="220"
|
||||
:height="300"
|
||||
sub-title="拥堵频次总数"
|
||||
:list="scenicStore.trafficData.data.countRate"
|
||||
:text="'暂无拥堵'"
|
||||
@@ -179,8 +177,8 @@
|
||||
<Title3 title="拥堵时长占比" />
|
||||
<jam
|
||||
:text="'暂无拥堵'"
|
||||
width="100%"
|
||||
:height="200"
|
||||
:width="220"
|
||||
:height="300"
|
||||
sub-title="拥堵总时长(分钟)"
|
||||
:list="scenicStore.trafficData.data.timeRate"
|
||||
/>
|
||||
@@ -190,7 +188,7 @@
|
||||
|
||||
<div class="box-4 mr-8">
|
||||
<Title1 title="用户画像" />
|
||||
<div class="flex" style="height: 90%;">
|
||||
<div class="flex">
|
||||
<div class="border mr-8 flex-1">
|
||||
<Title3 title="年龄/性别占比" />
|
||||
<age :list="scenicStore.userPortraitData.data.ageRate" />
|
||||
@@ -222,16 +220,16 @@
|
||||
<Title3 title="客源地分析TOP5" />
|
||||
<RegionTop
|
||||
:list="scenicStore.userPortraitData.data.provinceRate"
|
||||
width="100%"
|
||||
:height="220"
|
||||
:width="250"
|
||||
:height="366"
|
||||
/>
|
||||
</div>
|
||||
<div class="border flex-1">
|
||||
<Title3 title="购票来源" />
|
||||
<TicketSource
|
||||
:list="scenicStore.userPortraitData.data.channel"
|
||||
width="100%"
|
||||
:height="200"
|
||||
:width="240"
|
||||
:height="330"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -349,12 +347,14 @@
|
||||
/>
|
||||
<traMap :longitude="longitude" :latitude="latitude" v-model="traMapShow"></traMap>
|
||||
<all-list :events="scenicSpotId" v-model="allShow" />
|
||||
<warn-list v-model="warnShow" :type="warnType" :scenicSpotId="scenicSpotId" />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import countup from 'vue-countup-v3'
|
||||
import PubSub from 'pubsub-js'
|
||||
import allList from './allList'
|
||||
import warnList from './warnList.vue'
|
||||
import carIcon from '@/assets/images/car.png'
|
||||
import carStopIcon from '@/assets/images/car-stop.png'
|
||||
import carOfflineIcon from '@/assets/images/car-offline.png'
|
||||
@@ -383,6 +383,7 @@
|
||||
//景区排队
|
||||
let allShow = ref(false)
|
||||
let events = ref({})
|
||||
let warnType = ref("curr")
|
||||
|
||||
const handleLineUp = (item)=>{
|
||||
allShow.value = true
|
||||
@@ -395,10 +396,11 @@
|
||||
hIndex.value = index;
|
||||
}
|
||||
const handlePop2 = async()=>{
|
||||
if(props.scenicSpotId=="root00000000"){
|
||||
dialogTableVisible2.value = true
|
||||
let res = await getSpotPassengerFlow({scenicSpotId:props.scenicSpotId})
|
||||
tjArr.value = res.data
|
||||
console.log(res,'res')
|
||||
}
|
||||
}
|
||||
let show = ref(false)
|
||||
let scenicChange = null
|
||||
@@ -408,6 +410,17 @@
|
||||
//查看交通信息
|
||||
let latitude = ref('')
|
||||
let longitude = ref('')
|
||||
let warnShow = ref(false)
|
||||
const showAbnormalList = function (item){
|
||||
if(item.name=='今日异常总数'){
|
||||
warnType.value = 'all'
|
||||
}else if(item.name=='当前异常数'){
|
||||
warnType.value = 'curr'
|
||||
}else if(item.name=='已解除异常数'){
|
||||
warnType.value = 'deal'
|
||||
}
|
||||
warnShow.value = true;
|
||||
}
|
||||
const hanldeLookMap = () => {
|
||||
router.push('/traffic')
|
||||
// traMapShow.value = true
|
||||
@@ -565,7 +578,7 @@
|
||||
.box-1 {
|
||||
// margin-top: vh(120);
|
||||
width: vw(900);
|
||||
// height: vh(950);
|
||||
height: vh(950);
|
||||
padding: vw(10);
|
||||
box-sizing: border-box;
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
@@ -598,7 +611,7 @@
|
||||
position: absolute;
|
||||
top: vh(-4);
|
||||
font-weight: 400;
|
||||
font-size: vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
left:vw(0)
|
||||
}
|
||||
@@ -609,12 +622,12 @@
|
||||
justify-content: space-between;
|
||||
.label {
|
||||
font-weight: 400;
|
||||
font-size: vw(19.2); /* 16×1.2 */
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
}
|
||||
.value {
|
||||
font-weight: bold;
|
||||
font-size: vw(33.6); /* 28×1.2 */
|
||||
font-size: vw(28);
|
||||
color: #02f9fa;
|
||||
text-align: center;
|
||||
line-height: vh(60);
|
||||
@@ -629,7 +642,7 @@
|
||||
|
||||
.countup-wrap {
|
||||
color: #02f9fa;
|
||||
font-size: vw(33.6); /* 28×1.2 */
|
||||
font-size: vw(28);
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
@@ -650,7 +663,7 @@
|
||||
align-items: center;
|
||||
background: #0a4190;
|
||||
border-radius: vw(4);
|
||||
font-size: font-vw(18); /* 16×1.2 */
|
||||
font-size: vw(16);
|
||||
font-weight:700;
|
||||
color: #fff;
|
||||
z-index: 999;
|
||||
@@ -705,12 +718,12 @@
|
||||
.label {
|
||||
width: vw(120);
|
||||
font-weight: 400;
|
||||
font-size: vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
}
|
||||
.value {
|
||||
font-weight: bold;
|
||||
font-size: vw(33.6); /* 28×1.2 */
|
||||
font-size: vw(28);
|
||||
color: #fff;
|
||||
}
|
||||
.success {
|
||||
@@ -736,7 +749,7 @@
|
||||
.tag {
|
||||
padding: 0 vw(16);
|
||||
font-weight: bold;
|
||||
font-size: vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -765,7 +778,7 @@
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-weight: 400;
|
||||
font-size: vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
border-radius: vw(2);
|
||||
background: rgba(0, 150, 255, 0.28);
|
||||
@@ -783,7 +796,7 @@
|
||||
<style lang="scss" scoped>
|
||||
:deep(.el-dialog__headerbtn .el-dialog__close){
|
||||
color:#fff;
|
||||
font-size:48px; /* 40×1.2 */
|
||||
font-size:40px;
|
||||
position:relative;
|
||||
top:15px;
|
||||
right:15px;
|
||||
@@ -799,7 +812,6 @@
|
||||
:deep(.el-dialog__title) {
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
font-size: vw(38.4); /* 32×1.2 */
|
||||
}
|
||||
|
||||
.sp-ico {
|
||||
@@ -826,7 +838,7 @@
|
||||
|
||||
}
|
||||
.header-title{
|
||||
font-size:vw(38.4); /* 32×1.2 */
|
||||
font-size:vw(32);
|
||||
color:#fff;
|
||||
text-align:center;
|
||||
font-weight:bold;
|
||||
@@ -844,7 +856,7 @@
|
||||
.header {
|
||||
height: vh(28);
|
||||
font-weight: 400;
|
||||
font-size: vw(28.8); /* 24×1.2 */
|
||||
font-size: vw(24);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
background: linear-gradient(180deg, rgba(0, 99, 255, 0) 0%, #0063ff 100%);
|
||||
@@ -874,7 +886,7 @@
|
||||
.item {
|
||||
height: vh(50);
|
||||
font-weight: 400;
|
||||
font-size: vw(28.8); /* 24×1.2 */
|
||||
font-size: vw(24);
|
||||
color: #f1f7ff;
|
||||
display: flex;
|
||||
&:nth-child(2n + 1) {
|
||||
@@ -900,7 +912,7 @@
|
||||
span {
|
||||
margin-left: vw(30);
|
||||
font-weight: 800;
|
||||
font-size: vw(18); /* 15×1.2 */
|
||||
font-size: vw(15);
|
||||
line-height: vh(26);
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
@@ -918,7 +930,7 @@
|
||||
height: vh(500);
|
||||
.icon-box {
|
||||
font-weight: 400;
|
||||
font-size: vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
line-height: vh(16);
|
||||
flex-wrap: wrap;
|
||||
@@ -945,7 +957,7 @@
|
||||
text-align: center;
|
||||
line-height: vh(26);
|
||||
margin-left: vw(32.5);
|
||||
font-size: vw(19.2); /* 16×1.2 */
|
||||
font-size: vw(16);
|
||||
font-weight: 800;
|
||||
color: #fff;
|
||||
background-image: url('@/assets/images/title-1.png');
|
||||
@@ -961,7 +973,7 @@
|
||||
align-items: center;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
font-size: vw(24);
|
||||
font-size: vw(20);
|
||||
justify-content: center;
|
||||
}
|
||||
.look-box {
|
||||
@@ -977,7 +989,7 @@
|
||||
align-items: center;
|
||||
background: #0a4190;
|
||||
border-radius: vw(4);
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
@@ -1045,21 +1057,20 @@
|
||||
}
|
||||
&-item-label {
|
||||
font-weight: 400;
|
||||
font-size: vw(14.4);
|
||||
font-size: vw(12);
|
||||
line-height: vh(14);
|
||||
}
|
||||
&-item-value {
|
||||
font-weight: bold;
|
||||
font-size: vw(19.2);
|
||||
font-size: vw(16);
|
||||
line-height: vh(18);
|
||||
}
|
||||
}
|
||||
.container {
|
||||
margin: vh(120) 0 0 vw(10);
|
||||
flex:1;
|
||||
.count-box {
|
||||
padding: 0 vw(10);
|
||||
height: vh(140);
|
||||
height: vh(70);
|
||||
}
|
||||
.bg {
|
||||
background: linear-gradient(321deg, #0b2f64 0%, #062b57 100%);
|
||||
@@ -1074,51 +1085,39 @@
|
||||
}
|
||||
.box {
|
||||
@extend .bg;
|
||||
// width: vw(650);
|
||||
height: vh(880);
|
||||
min-width: vw(800);
|
||||
flex:1;
|
||||
}
|
||||
.box-9{
|
||||
// width: vw(750);
|
||||
width: vw(510);
|
||||
height: vh(475);
|
||||
}
|
||||
.box-1 {
|
||||
@extend .bg;
|
||||
|
||||
// height: vh(475);
|
||||
height: vh(475);
|
||||
}
|
||||
.box-2 {
|
||||
@extend .bg;
|
||||
height: vh(880);
|
||||
flex:1;
|
||||
height: vh(475);
|
||||
}
|
||||
.box-3 {
|
||||
@extend .bg;
|
||||
flex:1;
|
||||
// width: vw(750);
|
||||
// height: vh(465);
|
||||
height: vh(465);
|
||||
}
|
||||
.box-4 {
|
||||
@extend .bg;
|
||||
flex:1;
|
||||
// height: vh(465);
|
||||
height: vh(465);
|
||||
}
|
||||
.box-5 {
|
||||
// width: vw(750);
|
||||
@extend .bg;
|
||||
// height: vh(465);
|
||||
height:100%;
|
||||
height: vh(465);
|
||||
flex:1;
|
||||
}
|
||||
.car-box {
|
||||
// width: vw(316);
|
||||
height: vh(120);
|
||||
width: vw(316);
|
||||
height: vh(74);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.icon {
|
||||
position: absolute;
|
||||
// width: vw(350);
|
||||
height: vw(100);
|
||||
width: vw(350);
|
||||
height: vw(74);
|
||||
}
|
||||
.car-item {
|
||||
flex: 1;
|
||||
@@ -1131,25 +1130,25 @@
|
||||
}
|
||||
.label {
|
||||
font-weight: 400;
|
||||
font-size: vw(24); /* 20×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
}
|
||||
.value {
|
||||
font-weight: bold;
|
||||
font-size: vw(33.6); /* 28×1.2 */
|
||||
font-size: vw(24);
|
||||
color: #02f9fa;
|
||||
margin-top: vh(10);
|
||||
margin-top: vh(6);
|
||||
align-items: flex-end;
|
||||
}
|
||||
.suffix {
|
||||
font-size: vw(14.4); /* 12×1.2 */
|
||||
font-size: vw(12);
|
||||
color: #02f9fa;
|
||||
margin-bottom: vw(4);
|
||||
}
|
||||
}
|
||||
.sum {
|
||||
font-weight: bold;
|
||||
font-size: vw(26.4); /* 22×1.2 */
|
||||
font-size: vw(18);
|
||||
color: #02f9fa;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -1157,7 +1156,7 @@
|
||||
.car-ship {
|
||||
// width: vw(660);
|
||||
width: 100%;
|
||||
height: vh(780);
|
||||
height: vh(250);
|
||||
}
|
||||
.full {
|
||||
cursor: pointer;
|
||||
@@ -1171,7 +1170,7 @@
|
||||
margin: vw(20) vw(20) 0 vw(20);
|
||||
height: vh(24);
|
||||
font-weight: bold;
|
||||
font-size: vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -1199,7 +1198,7 @@
|
||||
}
|
||||
.text {
|
||||
font-weight: 400;
|
||||
font-size: vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
.progress {
|
||||
@@ -1208,13 +1207,13 @@
|
||||
}
|
||||
.man {
|
||||
font-weight: bold;
|
||||
font-size: vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #02f9fa;
|
||||
margin-left: vw(10);
|
||||
}
|
||||
.woman {
|
||||
font-weight: bold;
|
||||
font-size: vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: #f15a25;
|
||||
margin-left: vw(10);
|
||||
}
|
||||
@@ -1234,7 +1233,7 @@
|
||||
& > span {
|
||||
padding-left: vw(22);
|
||||
font-weight: bold;
|
||||
font-size: vw(18); /* 15×1.2 */
|
||||
font-size: vw(15);
|
||||
background-image: linear-gradient(to bottom, #ffffff 0%, #75c1ff 100%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
@@ -1262,12 +1261,12 @@
|
||||
.label {
|
||||
padding-left: vw(10);
|
||||
font-weight: 400;
|
||||
font-size: vw(16.8); /* 14×1.2 */
|
||||
font-size: vw(14);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
.countup-wrap {
|
||||
color: #02f9fa;
|
||||
font-size: vw(33.6); /* 28×1.2 */
|
||||
font-size: vw(28);
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,11 +104,11 @@
|
||||
rich: {
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(14)
|
||||
},
|
||||
value: {
|
||||
color: '#00D5F6',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(14)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -136,7 +136,7 @@
|
||||
},
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(14)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -151,7 +151,23 @@
|
||||
params.series[0].label.formatter = formatLabel()
|
||||
params.series[0].data = getSeriesData()
|
||||
}
|
||||
setOption(params)
|
||||
const chart = setOption(params);
|
||||
chart.on('legendselectchanged', function (e) {
|
||||
var echartsArr = [];
|
||||
for (let key in e.selected) {
|
||||
if (e.selected[key]) {
|
||||
echartsArr.push(key)
|
||||
}
|
||||
}
|
||||
var echartsNum = 0;
|
||||
props.list.forEach(item => {
|
||||
if(echartsArr.includes(item.name)){
|
||||
echartsNum += parseInt(item.count)
|
||||
}
|
||||
})
|
||||
params.series[0].label.formatter = `{value|${echartsNum}}` + '\n' + `{name|${props.subTitle}}`;
|
||||
setOption(params);
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -163,7 +179,7 @@
|
||||
top:0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
font-size:vw(22);
|
||||
font-size:vw(18);
|
||||
// color:#999;
|
||||
color:#02f9fa;
|
||||
display: flex;
|
||||
|
||||
@@ -77,14 +77,14 @@
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
fontSize: fitChartSize(14),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: fitChartSize(14),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
},
|
||||
splitLine: {
|
||||
@@ -99,12 +99,12 @@
|
||||
{
|
||||
type: 'bar',
|
||||
showBackground: true,
|
||||
barWidth: fitChartSize(18),
|
||||
barWidth: fitChartSize(16),
|
||||
label: {
|
||||
show: true,
|
||||
position: 'top',
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(14)
|
||||
fontSize: fitChartSize(10)
|
||||
},
|
||||
itemStyle: {
|
||||
color: {
|
||||
@@ -158,6 +158,6 @@
|
||||
}
|
||||
.traffic-flow {
|
||||
width: vw(260);
|
||||
height: vh(855);
|
||||
height: vh(300);
|
||||
}
|
||||
</style>
|
||||
|
||||
311
src/views/scenic/components/warnList.vue
Normal file
311
src/views/scenic/components/warnList.vue
Normal file
@@ -0,0 +1,311 @@
|
||||
<template>
|
||||
<div class="z-dialog">
|
||||
<el-dialog :title="props.type=='deal'?'已解除异常':'异常点位告警'" v-model="modelValue" align-center :modal="false" :show-close="false">
|
||||
<img class="close" src="@/assets/images/close.png" @click="handleClose" />
|
||||
<div class="no-data" v-if="cond&&!list.length">
|
||||
{{props.type=='deal'?'暂无数据':'暂无异常情况'}}
|
||||
</div>
|
||||
<div v-else>
|
||||
<ul class="list" >
|
||||
<li
|
||||
class="item"
|
||||
:style="{ backgroundImage: `url(${primary})` }"
|
||||
v-for="(item, index) in list"
|
||||
:key="index"
|
||||
@click="handleImage(item)"
|
||||
>
|
||||
<div
|
||||
class="item-title-box"
|
||||
><div class="item-title">{{ item.analyzeTypeName}}</div><div class="item-num">{{ item.number}}人</div></div>
|
||||
<img style="width: 100%;height: 100%;" :src="item.imgurl || imageEmpty">
|
||||
<p style="display: flex;justify-content: space-between;">
|
||||
<span> {{ item.cameraName || item.cameraIndexCode }}</span>
|
||||
<span class="cursorPointer" @click.stop="handleItem(item.cameraIndexCode)">查看监控></span>
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
<video-dialog v-model="videoShow" :src="src" :isDiy="isDiy" :isCollect="isCollect" :cameraIndexCode="cameraIndexCode" />
|
||||
<image-dialog v-model="imageShow" :src="imgSrc"/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getVideoEventApi,getVideoEventObjImgApi,getPreviewUrlSubApi } from '@/api/monitor'
|
||||
|
||||
import primary from '@/assets/images/item-primary.png'
|
||||
|
||||
import imageEmpty from '@/assets/images/imgloading.png'
|
||||
import pubSub from 'pubsub-js'
|
||||
|
||||
let props = defineProps({
|
||||
type: {
|
||||
type: String,
|
||||
default: 'curr'
|
||||
},
|
||||
scenicSpotId: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
events: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
})
|
||||
let modelValue = defineModel()
|
||||
let isCollect = ref(0)
|
||||
let list = ref([])
|
||||
let hlsRefs = []
|
||||
let total = ref(0)
|
||||
let src = ref('')
|
||||
let imgSrc = ref('')
|
||||
let imageShow = ref(false)
|
||||
let cameraIndexCode = ref('')
|
||||
let videoShow = ref(false)
|
||||
let isDiy = ref(0)
|
||||
let params = reactive({
|
||||
pageNum: 1,
|
||||
pageSize: 6,
|
||||
businessScenicArea:'',
|
||||
})
|
||||
|
||||
watch(
|
||||
() => modelValue.value,
|
||||
(val) => {
|
||||
if (val) {
|
||||
params.pageNum = 1
|
||||
cond.value = false
|
||||
params.businessScenicArea = props.events
|
||||
list.value = []
|
||||
setTimeout(() => {
|
||||
getVideoList()
|
||||
}, 1000)
|
||||
}
|
||||
}
|
||||
)
|
||||
const onVideoCollect = () => {
|
||||
pubSub.subscribe('videoCollect', () => {
|
||||
clearHlsRefs()
|
||||
getVideoList()
|
||||
})
|
||||
}
|
||||
const handleImage = (item) => {
|
||||
getVideoEventObjImgApi(item.objId).then(res=>{
|
||||
imgSrc.value = res.data.url
|
||||
imageShow.value = true
|
||||
});
|
||||
}
|
||||
const handleItem = async (id) => {
|
||||
let {code,data} = await getPreviewUrlSubApi({
|
||||
type: 'hls',
|
||||
cameraIndexCode:id
|
||||
})
|
||||
if(code===200){
|
||||
src.value = data.url
|
||||
isCollect.value = data.isCollect
|
||||
isDiy.value = data.isDiy
|
||||
cameraIndexCode.value = id
|
||||
videoShow.value = true
|
||||
}
|
||||
}
|
||||
const handleCollect = async (id, status) => {
|
||||
await postVideoCollectApi({
|
||||
cameraIndexCode:id,
|
||||
isCollect: status == 0 ? 1 : 0
|
||||
})
|
||||
clearHlsRefs()
|
||||
params.pageNum = 1
|
||||
getVideoList()
|
||||
pubSub.publish('videoCollect')
|
||||
}
|
||||
const handleClose = () => {
|
||||
clearHlsRefs()
|
||||
modelValue.value = false
|
||||
}
|
||||
const clearHlsRefs = () => {
|
||||
if (hlsRefs.length > 0) {
|
||||
hlsRefs.map((item) => {
|
||||
item.destroy()
|
||||
})
|
||||
hlsRefs = []
|
||||
}
|
||||
}
|
||||
const pageNumChange = () => {
|
||||
cond.value = false
|
||||
clearHlsRefs()
|
||||
list.value = []
|
||||
getVideoList()
|
||||
}
|
||||
let cond = ref(false)
|
||||
const getVideoList = async () => {
|
||||
let res = await getVideoEventApi(props.scenicSpotId,props.type);
|
||||
list.value = res.data
|
||||
setTimeout(()=>{cond.value = true},1500)
|
||||
nextTick(() => {
|
||||
list.value.forEach(async (item, index) => {
|
||||
getVideoEventObjImgApi(item.objId).then(res=>{
|
||||
list.value[index].imgurl = res.data.url
|
||||
});
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
onVideoCollect()
|
||||
})
|
||||
onUnmounted(() => {})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.z-dialog {
|
||||
:deep(.el-dialog) {
|
||||
width: vw(2100);
|
||||
padding: vw(8);
|
||||
background-image: url('@/assets/images/dialog-bg.png') !important;
|
||||
background-size: 100% 100%;
|
||||
overflow-y: auto;
|
||||
&::-webkit-scrollbar {
|
||||
width: vw(4); /* 滚动条的宽度 */
|
||||
}
|
||||
/* 滚动条轨道 */
|
||||
&::-webkit-scrollbar-track {
|
||||
background: 'transparent'; /* 轨道的背景色 */
|
||||
}
|
||||
/* 滚动条滑块 */
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: rgba(0, 150, 255, 0.63); /* 滑块的背景色 */
|
||||
border-radius: 5px; /* 滑块的圆角 */
|
||||
}
|
||||
}
|
||||
:deep(.el-dialog__header) {
|
||||
padding-bottom: 0 !important;
|
||||
margin-top: vw(10);
|
||||
text-align: center;
|
||||
}
|
||||
:deep(.el-dialog__title) {
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.item-title-box{
|
||||
font-weight: 400;
|
||||
z-index: 99;
|
||||
height: vw(50);
|
||||
|
||||
font-size: vw(24);
|
||||
color: #ffffff;
|
||||
position: absolute;
|
||||
left: 3%;
|
||||
|
||||
.item-title{
|
||||
padding: vw(10);
|
||||
display: inline-block;
|
||||
background-image: url('@/assets/images/unfollow.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
.item-num{
|
||||
margin-left: vw(6);
|
||||
padding: vw(5);
|
||||
display: inline-block;
|
||||
color: #ffffff;
|
||||
background-color:red;
|
||||
border-radius: 15%;
|
||||
font-weight: bolder;
|
||||
}
|
||||
}
|
||||
.no-data{
|
||||
height:vh(860);
|
||||
line-height: vh(860);
|
||||
text-align: center;
|
||||
font-size:vw(30);
|
||||
color:#02f9fa;
|
||||
}
|
||||
.cursorPointer{
|
||||
cursor: pointer
|
||||
}
|
||||
.list {
|
||||
//margin-top: vw(5);
|
||||
gap: vw(8);
|
||||
height: vh(860);
|
||||
overflow: auto;
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
width: vw(4); /* 滚动条的宽度 */
|
||||
}
|
||||
/* 滚动条轨道 */
|
||||
&::-webkit-scrollbar-track {
|
||||
background: 'transparent'; /* 轨道的背景色 */
|
||||
}
|
||||
/* 滚动条滑块 */
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: rgba(0, 150, 255, 0.63); /* 滑块的背景色 */
|
||||
border-radius: 5px; /* 滑块的圆角 */
|
||||
}
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-content: flex-start;
|
||||
padding:vw(10);
|
||||
.item {
|
||||
position: relative;
|
||||
width: 33%;
|
||||
height: vh(400);
|
||||
padding: vw(12);
|
||||
margin-top:vh(20);
|
||||
box-sizing: border-box;
|
||||
background-image: url('@/assets/images/item-primary.png');
|
||||
background-size: 100% 100%;
|
||||
&-video {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
}
|
||||
> p {
|
||||
position: absolute;
|
||||
bottom: vw(12);
|
||||
width: calc(100% - vw(24));
|
||||
padding: vw(10) 0;
|
||||
background: rgba(4, 30, 69, 0.72);
|
||||
> span {
|
||||
padding-left: vw(10);
|
||||
font-weight: 400;
|
||||
font-size: vw(14);
|
||||
line-height: vw(14);
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
&-unfollow {
|
||||
cursor: pointer;
|
||||
display: none;
|
||||
position: absolute;
|
||||
right: vw(4);
|
||||
top: vw(4);
|
||||
z-index: 99;
|
||||
width: vw(64);
|
||||
height: vw(30);
|
||||
text-align: center;
|
||||
line-height: vw(30);
|
||||
font-weight: 400;
|
||||
font-size: vw(12);
|
||||
color: #ffffff;
|
||||
background-image: url('@/assets/images/unfollow.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
.pagination {
|
||||
padding-top: vw(20);
|
||||
margin-right: vw(20);
|
||||
padding-bottom: vw(20);
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
.close {
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
right: vw(20);
|
||||
top: vw(20);
|
||||
width: vw(60);
|
||||
z-index: 9999;
|
||||
}
|
||||
</style>
|
||||
@@ -74,11 +74,9 @@
|
||||
scenicStore.setScenicBearData(val)
|
||||
break
|
||||
case 'stopCarData':
|
||||
console.log('soket 车辆归属地数据',val)
|
||||
scenicStore.setStopCarData(val)
|
||||
break
|
||||
case 'secureData':
|
||||
// console.log(val,'检查soket信息')
|
||||
scenicStore.setSecureData(val)
|
||||
break
|
||||
case 'trafficInformation':
|
||||
@@ -146,6 +144,13 @@
|
||||
scenicSpotId: scenicSpotId.value
|
||||
})
|
||||
)
|
||||
sendMessage(
|
||||
JSON.stringify({
|
||||
action: 'start',
|
||||
type: 'secureData',
|
||||
scenicSpotId: scenicSpotId.value
|
||||
})
|
||||
)
|
||||
sendMessage(
|
||||
JSON.stringify({
|
||||
action: 'start',
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
right: vw(10);
|
||||
}
|
||||
.area {
|
||||
width: 100%;
|
||||
height:80%;
|
||||
width: vw(840);
|
||||
height: vh(400);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -53,20 +53,20 @@
|
||||
.header {
|
||||
display: flex;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(13);
|
||||
color: #0084ff;
|
||||
height: vh(80);
|
||||
display: flex;
|
||||
height: vh(40);
|
||||
align-items: center;
|
||||
background: rgba(3, 78, 153, 0.3);
|
||||
& > p {
|
||||
flex: 1;
|
||||
color: #ffffff;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
.list {
|
||||
overflow-y: auto;
|
||||
height: vh(800);
|
||||
height: vh(370);
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
width: vw(4); /* 滚动条的宽度 */
|
||||
@@ -85,7 +85,7 @@
|
||||
// background: #555; /* 滑块的背景色 */
|
||||
// }
|
||||
.cell {
|
||||
height: vh(80);
|
||||
height: vh(40);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
&:nth-child(2n) {
|
||||
@@ -99,11 +99,10 @@
|
||||
}
|
||||
.index {
|
||||
display: inline-block;
|
||||
// width: vw(50);
|
||||
// height: vh(30);
|
||||
padding:vw(15);
|
||||
width: vw(40);
|
||||
height: vh(24);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(12);
|
||||
color: #ffffff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -125,18 +124,17 @@
|
||||
}
|
||||
.name {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(15);
|
||||
color: #ffffff;
|
||||
}
|
||||
.number {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(15);
|
||||
color: #02f9fa;
|
||||
}
|
||||
.status {
|
||||
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(15);
|
||||
color: #e21b1b;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
<style scoped lang="scss">
|
||||
.wordCloud {
|
||||
width: 100%;
|
||||
height: 80%;
|
||||
width: vw(760);
|
||||
height: vh(410);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-2 mr-8" style="flex:1;" :class="homeStore.amplify?'':'coll-box'">
|
||||
<div class="box-2 mr-8" :class="homeStore.amplify?'':'coll-box'">
|
||||
<div class="flex justify-center">
|
||||
<div class="top flex justify-evenly">
|
||||
<count-item label="今日舆情总数" :count="total" suffix="条" color="#ffffff" />
|
||||
@@ -31,7 +31,7 @@
|
||||
<div class="flex mt-20 gap-8 ml-8 mr-8">
|
||||
<div v-for="(item, index) in stateList" :key="index" class="border flex-1">
|
||||
<Title3 :title="item.name" />
|
||||
<pie-row :width="150" :height="200" :dataList="item.data" :total="item.total" />
|
||||
<pie-row :width="490" :height="330" :dataList="item.data" :total="item.total" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -41,7 +41,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex mt-8">
|
||||
<div class="box-2 mr-8 rela" style="width: 33%;" :class="homeStore.amplify?'':'coll-box'">
|
||||
<div class="box-2 mr-8 rela" :class="homeStore.amplify?'':'coll-box'">
|
||||
<Title1 title="舆情指数" />
|
||||
<div class="select-box">
|
||||
<Select
|
||||
@@ -53,8 +53,8 @@
|
||||
</div>
|
||||
<div class="coll-box-3">
|
||||
<Line
|
||||
width="100%"
|
||||
:height="220"
|
||||
:width="1500"
|
||||
:height="400"
|
||||
:data="seriesData"
|
||||
:xAxisData="xAxisData"
|
||||
:seriesConfig="{ smooth: false, symbol: 'circle' }"
|
||||
@@ -62,11 +62,11 @@
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="box-4 mr-8 rela" style="width: 33%;" >
|
||||
<div class="box-4 mr-8 rela">
|
||||
<Title1 title="地域分析" />
|
||||
<Area width="100%" />
|
||||
<Area />
|
||||
</div>
|
||||
<div class="box-3" style="width: 33%;" >
|
||||
<div class="box-3">
|
||||
<Title1 title="词频分析" />
|
||||
<word-cloud />
|
||||
</div>
|
||||
@@ -249,7 +249,7 @@
|
||||
.link {
|
||||
color: #1890ff;
|
||||
text-decoration: none;
|
||||
// font-size: font-vw(14);
|
||||
// font-size:vw(14);
|
||||
}
|
||||
|
||||
.title {
|
||||
@@ -332,7 +332,7 @@
|
||||
|
||||
}
|
||||
.header-title{
|
||||
font-size: font-vw(32);
|
||||
font-size:vw(32);
|
||||
color:#fff;
|
||||
text-align:center;
|
||||
font-weight:bold;
|
||||
@@ -350,7 +350,7 @@
|
||||
.header {
|
||||
height: vh(28);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
background: linear-gradient(180deg, rgba(0, 99, 255, 0) 0%, #0063ff 100%);
|
||||
@@ -363,9 +363,8 @@
|
||||
}
|
||||
.list {
|
||||
overflow-y: auto;
|
||||
height: vh(520);
|
||||
height: vh(490);
|
||||
/* 滚动条整体样式 */
|
||||
// height:100%;
|
||||
&::-webkit-scrollbar {
|
||||
width: vw(4); /* 滚动条的宽度 */
|
||||
}
|
||||
@@ -381,7 +380,7 @@
|
||||
.item {
|
||||
height: vh(50);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(24);
|
||||
color: #f1f7ff;
|
||||
display: flex;
|
||||
&:nth-child(2n + 1) {
|
||||
@@ -407,7 +406,7 @@
|
||||
span {
|
||||
margin-left: vw(30);
|
||||
font-weight: 800;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(15);
|
||||
line-height: vh(26);
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
@@ -425,7 +424,7 @@
|
||||
height: vh(500);
|
||||
.icon-box {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
line-height: vh(16);
|
||||
flex-wrap: wrap;
|
||||
@@ -452,7 +451,7 @@
|
||||
text-align: center;
|
||||
line-height: vh(26);
|
||||
margin-left: vw(32.5);
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(16);
|
||||
font-weight: 800;
|
||||
color: #fff;
|
||||
background-image: url('@/assets/images/title-1.png');
|
||||
@@ -478,35 +477,33 @@
|
||||
background: linear-gradient(321deg, #0b2f64 0%, #062b57 100%);
|
||||
}
|
||||
.top {
|
||||
width: vw(800);
|
||||
height: vh(150);
|
||||
width: vw(600);
|
||||
height: vh(50);
|
||||
margin-top: vh(35);
|
||||
font-size: font-vw(22);
|
||||
}
|
||||
.box-1 {
|
||||
width: vw(1000);
|
||||
// height: vh(470);
|
||||
width: vw(790);
|
||||
height: vh(470);
|
||||
@extend .bg;
|
||||
}
|
||||
.box-2 {
|
||||
// width: vw(1720);
|
||||
// min-width: vw(1440);
|
||||
// height: vh(470);
|
||||
width: vw(1514);
|
||||
height: vh(470);
|
||||
@extend .bg;
|
||||
}
|
||||
.box-3 {
|
||||
width: vw(810);
|
||||
// height: vh(470);
|
||||
height: vh(470);
|
||||
@extend .bg;
|
||||
}
|
||||
.box-4{
|
||||
width: vw(850);
|
||||
// height: vh(470);
|
||||
height: vh(470);
|
||||
@extend .bg;
|
||||
}
|
||||
.box-5{
|
||||
width: vw(1200);
|
||||
// height: vh(470);
|
||||
width: vw(870);
|
||||
height: vh(470);
|
||||
@extend .bg;
|
||||
}
|
||||
.border {
|
||||
@@ -516,7 +513,7 @@
|
||||
.list {
|
||||
margin: 0 vw(20);
|
||||
overflow-y: auto;
|
||||
height: vh(850);
|
||||
height: vh(400);
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
width: vw(4); /* 滚动条的宽度 */
|
||||
@@ -533,21 +530,21 @@
|
||||
.item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height: vh(90);
|
||||
height: vh(40);
|
||||
cursor: pointer;
|
||||
&:nth-child(2n + 1) {
|
||||
background: rgba(3, 78, 153, 0.3);
|
||||
}
|
||||
.status {
|
||||
// width: vw(60);
|
||||
// height: vh(40);
|
||||
line-height: vh(40);
|
||||
width: vw(40);
|
||||
height: vh(20);
|
||||
line-height: vh(20);
|
||||
text-align: center;
|
||||
margin: 0 vw(20);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(12);
|
||||
color: #ffffff;
|
||||
border-radius: vw(2);
|
||||
padding:vw(15);
|
||||
&-error {
|
||||
@extend .status;
|
||||
background: #d9011b;
|
||||
@@ -565,17 +562,16 @@
|
||||
.content {
|
||||
flex: 1;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(15);
|
||||
color: #ffffff;
|
||||
white-space: nowrap; /* 保证文本在一行内显示 */
|
||||
overflow: hidden; /* 隐藏溢出的内容 */
|
||||
text-overflow: ellipsis; /* 使用省略号表示文本溢出 */
|
||||
margin-top:0;
|
||||
}
|
||||
.date {
|
||||
margin: 0 vw(20);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(12);
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
<div class="chart">
|
||||
<div class="chart-item">
|
||||
<Title3 title="拥堵频次占比" />
|
||||
|
||||
<div class="chart__inner">
|
||||
<div>
|
||||
<spotRate
|
||||
@@ -42,9 +41,8 @@
|
||||
:total="chartData.totalNum"
|
||||
label="拥堵频次总数"
|
||||
/>
|
||||
<ul class="chart__legend flex" style="flex-wrap: wrap;">
|
||||
<ul class="chart__legend">
|
||||
<li
|
||||
|
||||
class="chart__legend-item"
|
||||
v-for="(item, index) in chartData.roadNum"
|
||||
:key="index"
|
||||
@@ -67,7 +65,6 @@
|
||||
<div class="new-ul">
|
||||
<ul class="chart__legend">
|
||||
<li
|
||||
|
||||
class="chart__legend-item"
|
||||
v-for="(item, index) in chartData.typeNum"
|
||||
:key="index"
|
||||
@@ -91,9 +88,8 @@
|
||||
:total="chartData.totalTime"
|
||||
label="拥堵总时长"
|
||||
/>
|
||||
<ul class="chart__legend flex" style="flex-wrap: wrap;">
|
||||
<ul class="chart__legend">
|
||||
<li
|
||||
|
||||
class="chart__legend-item"
|
||||
v-for="(item, index) in chartData.roadTime"
|
||||
:key="index"
|
||||
@@ -120,7 +116,6 @@
|
||||
<div class="new-ul">
|
||||
<ul class="chart__legend">
|
||||
<li
|
||||
|
||||
class="chart__legend-item"
|
||||
v-for="(item, index) in chartData.typeTime"
|
||||
:key="index"
|
||||
@@ -184,66 +179,45 @@
|
||||
<style lang="scss" scoped>
|
||||
.new-vehicle{
|
||||
padding-top:vh(20);
|
||||
width:100%;
|
||||
}
|
||||
.new-ul{
|
||||
padding:0 0;
|
||||
padding:0 vw(30);
|
||||
margin-top:vh(20);
|
||||
}
|
||||
.box-1 {
|
||||
margin-top: vh(120);
|
||||
width: vw(800);
|
||||
// height: vh(950);
|
||||
// height: 100%;
|
||||
width: vw(626);
|
||||
height: vh(950);
|
||||
background: linear-gradient(321deg, #0b2f64 0%, #062b57 100%);
|
||||
|
||||
.chart {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: vw(4);
|
||||
gap: vw(8);
|
||||
padding: 0 vw(8);
|
||||
height:100%;
|
||||
overflow: auto;
|
||||
padding-bottom: vh(150);
|
||||
|
||||
&-item {
|
||||
width: vw(300);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
&::-webkit-scrollbar {
|
||||
width: vw(0); /* 滚动条的宽度 */
|
||||
}
|
||||
&-item {
|
||||
// display: flex;
|
||||
// align-items: center;
|
||||
width:100%;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
// top:vh(-10);
|
||||
// height:20%;
|
||||
overflow: hidden;
|
||||
// width: vw(300);
|
||||
// background-image: url('@/assets/images/bg-3.png');
|
||||
// background-size: 100% 100%;
|
||||
}
|
||||
|
||||
&__inner {
|
||||
width:100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
// height: vh(380);
|
||||
height: vh(380);
|
||||
|
||||
}
|
||||
|
||||
&__legend {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
&-item {
|
||||
position: relative;
|
||||
width: 50%;
|
||||
height: vh(50);
|
||||
width: 100%;
|
||||
height: vh(30);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: vh(15);
|
||||
margin-bottom: vh(8);
|
||||
background: linear-gradient(90deg, rgba(0, 150, 255, 0.34) 0%, rgba(0, 150, 255, 0) 100%);
|
||||
|
||||
&::before {
|
||||
@@ -262,15 +236,15 @@
|
||||
|
||||
.name {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
// width: vw(110);
|
||||
width: vw(110);
|
||||
}
|
||||
|
||||
.value {
|
||||
// padding-right: vw(20);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(15);
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
@@ -287,7 +261,7 @@
|
||||
.item-t {
|
||||
display: flex;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
text-align: left;
|
||||
margin-bottom: vh(20);
|
||||
@@ -303,7 +277,7 @@
|
||||
background-image: url('@/assets/images/t-box-title-bg-1.png');
|
||||
background-size: 100% 100%;
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #02f9fa;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<!-- <div class="header-left__camera" @click="videoShow = true">道路监控</div> -->
|
||||
<!-- <div class="header-left__point" @click="videoShow = true">3号点位</div> -->
|
||||
</div>
|
||||
<div class="header-status">{{ item.congestLevelText }} </div>
|
||||
<div class="header-status" v-if="item.congestLevel>0">{{ item.congestLevelText }} </div>
|
||||
</div>
|
||||
<div class="statistics">
|
||||
<div class="statistics-item">
|
||||
@@ -235,7 +235,6 @@
|
||||
.flex-1{
|
||||
flex:1;
|
||||
overflow:hidden;
|
||||
height: 100%;
|
||||
}
|
||||
.title-1 {
|
||||
position: relative;
|
||||
@@ -243,8 +242,8 @@
|
||||
.title {
|
||||
margin: vh(10) auto;
|
||||
margin-top:0;
|
||||
width: vw(1100);
|
||||
height: vh(62);
|
||||
width: vw(1500);
|
||||
height: vh(32);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
@@ -252,7 +251,7 @@
|
||||
background-size: 100% 100%;
|
||||
& > span {
|
||||
font-weight: 800;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
background-image: linear-gradient(to bottom, #ffffff 0%, #75c1ff 100%);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
@@ -267,9 +266,8 @@
|
||||
flex:1;
|
||||
}
|
||||
.nav {
|
||||
width: vw(330);
|
||||
// height: vh(950);
|
||||
height:100%;
|
||||
width: vw(230);
|
||||
height: vh(950);
|
||||
margin-left: vw(8);
|
||||
padding-left: vw(5);
|
||||
overflow: auto;
|
||||
@@ -282,10 +280,10 @@
|
||||
&-item {
|
||||
cursor: pointer;
|
||||
margin-bottom: vw(15);
|
||||
width: 100%;
|
||||
height: vh(100);
|
||||
width: vw(220);
|
||||
height: vh(54);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(18);
|
||||
color: #ffffff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -305,7 +303,6 @@
|
||||
// width: vw(2116);
|
||||
width:100%;
|
||||
height: vh(890);
|
||||
height: 100%;
|
||||
margin-left: vw(8);
|
||||
box-sizing: border-box;
|
||||
background-image: url('/src/assets/images/map-bg-2.png');
|
||||
@@ -338,7 +335,7 @@
|
||||
height: vh(60);
|
||||
font-family: Inter, Inter;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(12);
|
||||
font-size: vw(12);
|
||||
color: #ffffff;
|
||||
line-height: vh(14);
|
||||
text-align: left;
|
||||
@@ -347,8 +344,8 @@
|
||||
}
|
||||
}
|
||||
.list {
|
||||
width: vw(1000);
|
||||
height: 100%;
|
||||
width: vw(806);
|
||||
height: vh(952);
|
||||
margin-left: vw(8);
|
||||
overflow: auto;
|
||||
&::-webkit-scrollbar {
|
||||
@@ -375,7 +372,7 @@
|
||||
}
|
||||
&-left__title {
|
||||
margin-right: vw(20);
|
||||
font-size: font-vw(28);
|
||||
font-size: vw(28);
|
||||
font-weight: bold;
|
||||
color: transparent;
|
||||
-webkit-background-clip: text;
|
||||
@@ -388,7 +385,7 @@
|
||||
width: vw(120);
|
||||
height: vw(72);
|
||||
font-weight: 600;
|
||||
font-size: font-vw(15);
|
||||
font-size: vw(15);
|
||||
color: #ffffff;
|
||||
padding-left: vw(42);
|
||||
display: flex;
|
||||
@@ -403,7 +400,7 @@
|
||||
width: vw(120);
|
||||
height: vw(72);
|
||||
font-weight: 600;
|
||||
font-size: font-vw(15);
|
||||
font-size: vw(15);
|
||||
color: #ffffff;
|
||||
padding-left: vw(42);
|
||||
display: flex;
|
||||
@@ -413,9 +410,9 @@
|
||||
}
|
||||
&-status {
|
||||
min-width: vw(150);
|
||||
height: vw(64);
|
||||
height: vw(54);
|
||||
font-weight: 600;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -429,7 +426,7 @@
|
||||
.chart-item {
|
||||
padding: vw(1);
|
||||
margin-top: vh(10);
|
||||
height: vh(500);
|
||||
height: vh(293);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
|
||||
@@ -451,7 +448,7 @@
|
||||
position: absolute;
|
||||
bottom: vh(4);
|
||||
left: vw(20);
|
||||
font-size: font-vw(15);
|
||||
font-size: vw(15);
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(to bottom, #ffffff 0%, #0096ff 100%);
|
||||
-webkit-background-clip: text;
|
||||
@@ -465,7 +462,7 @@
|
||||
}
|
||||
|
||||
.statistics {
|
||||
height: vh(190);
|
||||
height: vh(90);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
@@ -474,15 +471,15 @@
|
||||
|
||||
&-item__label {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
margin-bottom: vh(30);
|
||||
margin-bottom: vh(10);
|
||||
}
|
||||
&-item__value {
|
||||
padding-left: vw(15);
|
||||
height: vh(90);
|
||||
height: vh(30);
|
||||
font-weight: bold;
|
||||
font-size: font-vw(28);
|
||||
font-size: vw(24);
|
||||
color: #02f9fa;
|
||||
background-image: url('@/assets/images/t-box-title-bg-1.png');
|
||||
background-size: 100% 100%;
|
||||
@@ -491,7 +488,7 @@
|
||||
.item-t {
|
||||
display: flex;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(14);
|
||||
font-size: vw(14);
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
margin-bottom: vh(20);
|
||||
img {
|
||||
@@ -507,7 +504,7 @@
|
||||
background-image: url('@/assets/images/t-box-title-bg-1.png');
|
||||
background-size: 100% 100%;
|
||||
font-weight: bold;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #02f9fa;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
|
||||
@@ -59,13 +59,13 @@
|
||||
rich: {
|
||||
value: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(24),
|
||||
fontSize: fitChartSize(20),
|
||||
fontWeight: 'bold',
|
||||
padding: [0, 0, 5, 0]
|
||||
},
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(16)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -124,8 +124,7 @@
|
||||
justify-content: center;
|
||||
}
|
||||
.spotRate {
|
||||
width: vw(340);
|
||||
height: vh(340);
|
||||
margin:0 auto;
|
||||
width: vw(200);
|
||||
height: vh(200);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
fontSize: fitChartSize(20),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
},
|
||||
data: getXAxisData()
|
||||
@@ -70,7 +70,7 @@
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
show: false,
|
||||
fontSize: fitChartSize(20),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
},
|
||||
splitLine: {
|
||||
@@ -90,7 +90,7 @@
|
||||
show: true,
|
||||
position: 'top',
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(20),
|
||||
fontSize: fitChartSize(12),
|
||||
formatter: (res) => {
|
||||
let valueMap = {
|
||||
1: '畅通',
|
||||
@@ -125,8 +125,7 @@
|
||||
|
||||
<style scoped lang="scss">
|
||||
.traffic-jam {
|
||||
width: 100%;
|
||||
height: vh(430);
|
||||
margin-top:vh(30);
|
||||
width: vw(800);
|
||||
height: vh(250);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -60,14 +60,14 @@
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
fontSize: fitChartSize(20),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
axisLabel: {
|
||||
fontSize: fitChartSize(20),
|
||||
fontSize: fitChartSize(12),
|
||||
color: 'rgba(255,255,255,0.9)'
|
||||
},
|
||||
splitLine: {
|
||||
@@ -88,7 +88,7 @@
|
||||
show: true,
|
||||
position: 'top',
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(20)
|
||||
fontSize: fitChartSize(10)
|
||||
},
|
||||
itemStyle: {
|
||||
borderRadius: [0, 0, 0, 0],
|
||||
@@ -124,7 +124,7 @@
|
||||
|
||||
<style scoped lang="scss">
|
||||
.vehicle-source {
|
||||
width:100%;
|
||||
height: vh(350);
|
||||
width:vw(310);
|
||||
height: vh(160);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
clearable
|
||||
placeholder="车牌号"
|
||||
@input="onInput"
|
||||
style="height:50px;margin:10px 0;"
|
||||
>
|
||||
</el-input>
|
||||
<ul class="tabs">
|
||||
@@ -505,7 +504,7 @@ import PubSub from 'pubsub-js'
|
||||
.item {
|
||||
height: vh(50);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
color: #f1f7ff;
|
||||
display: flex;
|
||||
&:nth-child(2n + 1) {
|
||||
@@ -543,12 +542,12 @@ import PubSub from 'pubsub-js'
|
||||
justify-content: center;
|
||||
.t-item{
|
||||
// margin:0 vw(10);
|
||||
font-size: font-vw(24);
|
||||
font-size:vw(18);
|
||||
color:#fff;
|
||||
padding:vh(30) 0;
|
||||
padding:vh(5) 0;
|
||||
background: url('@/assets/images/title-2.png') no-repeat center 100%;
|
||||
background-size:100% 100%;
|
||||
padding:vw(30) vw(50);
|
||||
padding:vw(10) vw(35);
|
||||
}
|
||||
.tabs-active{
|
||||
// color:#409eff;
|
||||
@@ -617,7 +616,7 @@ import PubSub from 'pubsub-js'
|
||||
height: vh(36);
|
||||
padding-left: vw(16);
|
||||
font-weight: 600;
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -625,20 +624,20 @@ import PubSub from 'pubsub-js'
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
&-header {
|
||||
padding: vh(12) vw(20);
|
||||
padding: vh(12) vw(14);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
&-sim {
|
||||
font-weight: 600;
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(16);
|
||||
color: #ffffff;
|
||||
}
|
||||
&-tag {
|
||||
padding: vh(5) vw(8);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(13);
|
||||
font-size: vw(13);
|
||||
color: #0096ff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -670,7 +669,7 @@ import PubSub from 'pubsub-js'
|
||||
> p {
|
||||
flex: 1;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(24);
|
||||
font-size: vw(24);
|
||||
color: #ffffff;
|
||||
line-height: vh(20);
|
||||
}
|
||||
@@ -679,13 +678,12 @@ import PubSub from 'pubsub-js'
|
||||
</style>
|
||||
<style scoped lang="scss">
|
||||
:deep(.el-input__inner) {
|
||||
height: vh(42);
|
||||
height: vh(32);
|
||||
color: #fff;
|
||||
font-size: font-vw(22);
|
||||
}
|
||||
:deep(.el-input__wrapper) {
|
||||
margin-top: vh(8);
|
||||
font-size: font-vw(16);
|
||||
font-size: vw(16);
|
||||
border-radius: vw(2);
|
||||
border: vw(1) solid #0096ff;
|
||||
box-shadow: none !important;
|
||||
@@ -698,9 +696,9 @@ import PubSub from 'pubsub-js'
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
flex: 1;
|
||||
height: vh(88);
|
||||
height: vh(44);
|
||||
font-weight: 600;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(14);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -727,12 +725,11 @@ import PubSub from 'pubsub-js'
|
||||
|
||||
.dialog {
|
||||
width: vw(3170);
|
||||
width:100%;
|
||||
padding: vw(8);
|
||||
background-image: url('@/assets/images/dialog-bg.png') !important;
|
||||
background-size: 100% 100%;
|
||||
margin: 0 auto;
|
||||
// height:vh(930);
|
||||
height:vh(930);
|
||||
margin-top:vh(130);
|
||||
:deep(.el-dialog) {
|
||||
width: vw(3170);
|
||||
@@ -745,15 +742,14 @@ import PubSub from 'pubsub-js'
|
||||
}
|
||||
}
|
||||
.list-box {
|
||||
margin-right: vw(20);
|
||||
margin-right: vw(10);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
width:vw(1200);
|
||||
}
|
||||
.list {
|
||||
// width: vw(400);
|
||||
height: vh(1820);
|
||||
padding-top: vh(20);
|
||||
height: vh(790);
|
||||
padding-top: vh(10);
|
||||
overflow-y: auto;
|
||||
box-sizing: border-box;
|
||||
justify-content: center;
|
||||
@@ -779,8 +775,8 @@ import PubSub from 'pubsub-js'
|
||||
.item {
|
||||
cursor: pointer;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
height: vh(90);
|
||||
font-size: vw(14);
|
||||
height: vh(30);
|
||||
padding: 0 vw(20);
|
||||
color: #0096ff;
|
||||
display: flex;
|
||||
@@ -820,7 +816,7 @@ import PubSub from 'pubsub-js'
|
||||
}
|
||||
.big-car-ship {
|
||||
flex: 1;
|
||||
height: vh(2010);
|
||||
height: vh(910);
|
||||
}
|
||||
.close {
|
||||
cursor: pointer;
|
||||
|
||||
@@ -8,27 +8,239 @@
|
||||
<span :class="item.level">{{ item.level_text }}</span>
|
||||
<p>{{ item.title }}</p>
|
||||
<span class="time">{{ item.time }}</span>
|
||||
<span class="btn" @click="showDetail(item.id)">详情</span>
|
||||
</div>
|
||||
</div>
|
||||
<el-dialog :title="'工单详情'" center v-model="dialogVisible">
|
||||
<div class="bom-box">
|
||||
<div class="modal-body">
|
||||
<div class="m-modal">
|
||||
<div class="item-title--primary">工单信息</div>
|
||||
<div class="item-col">
|
||||
<div class="detail-item">
|
||||
<span class="label">所属景区:</span>
|
||||
<span class="value">{{ detail.road }}</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">工单类型:</span>
|
||||
<span class="value">{{ detail.type }}</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">紧急程度:</span>
|
||||
<span :class="'value '+detail.level">{{ detail.levelText }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item-col">
|
||||
<div class="detail-item">
|
||||
<span class="label">具体地点:</span>
|
||||
<span class="value">{{ detail.address }}</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">创建时间:</span>
|
||||
<span class="value">{{ detail.createTime }}</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">完成期限:</span>
|
||||
<span class="value">{{ detail.completionDeadline }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item-col">
|
||||
<div class="detail-item">
|
||||
<span class="label">创建人:</span>
|
||||
<span class="value">{{ detail.unidName }}</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">状态:</span>
|
||||
<span class="value important" v-if="detail.status==0">待处理</span>
|
||||
<span class="value warn" v-else-if="detail.status==1">进行中</span>
|
||||
<span class="value normal" v-else-if="detail.status==2">已完成</span>
|
||||
<span class="value" v-else>已关闭</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">工单内容:</span>
|
||||
<span class="value">{{ detail.title }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-item" v-if="detail.imgs">
|
||||
<el-image class="img" :preview-src-list="detail.imgs.split(',')" :src="src" v-for="(src, index) in detail.imgs.split(',')"></el-image>
|
||||
</div>
|
||||
<div class="item-title--warning" v-if="detail.follow && detail.follow.length>0">跟进信息</div>
|
||||
<template v-for="item in detail.follow">
|
||||
<div class="item-col" >
|
||||
<div class="detail-item">
|
||||
<span class="label">跟进人:</span>
|
||||
<span class="value">{{ item.unidName }}</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">跟进地点:</span>
|
||||
<span class="value">{{ item.address }}</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">完成率:</span>
|
||||
<span class="value">{{ item.rate }}%</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item-col">
|
||||
<div class="detail-item" style="flex: 2">
|
||||
<span class="label">跟进内容:</span>
|
||||
<span class="value">{{ item.title }}</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">跟进时间:</span>
|
||||
<span class="value">{{ item.createTime }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-item" v-if="item.img">
|
||||
<el-image class="img" :preview-src-list="item.img.split(',')" :src="src" v-for="(src, index) in item.img.split(',')"></el-image>
|
||||
</div>
|
||||
<div style="border-bottom: 1px solid #ffffff;margin: 10px 0;"></div>
|
||||
</template>
|
||||
<div class="item-title--warning" v-if="detail.evaluate && detail.evaluate.length>0">评价信息</div>
|
||||
<template v-for="item in detail.evaluate">
|
||||
<div class="item-col" >
|
||||
<div class="detail-item">
|
||||
<span class="label">评价人:</span>
|
||||
<span class="value warn">{{ item.unidName }}</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">评价内容:</span>
|
||||
<span class="value">{{ item.title }}</span>
|
||||
</div>
|
||||
<div class="detail-item">
|
||||
<span class="label">评价时间:</span>
|
||||
<span class="value">{{ item.createTime }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-item" v-if="item.img">
|
||||
<el-image class="img" :preview-src-list="item.img.split(',')" :src="src" v-for="(src, index) in item.img.split(',')"></el-image>
|
||||
</div>
|
||||
<div style="border-bottom: 1px solid #ffffff;margin: 10px 0;"></div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { getListApi } from '@/api/workOrder'
|
||||
import {getDetailApi, getListApi} from '@/api/workOrder'
|
||||
let dialogVisible = ref(false)
|
||||
let list = ref([])
|
||||
let detail = ref({})
|
||||
const getList = async () => {
|
||||
let res = await getListApi()
|
||||
list.value = res.data
|
||||
}
|
||||
const showDetail = async (id) => {
|
||||
dialogVisible.value = true
|
||||
let res = await getDetailApi(id)
|
||||
console.log( res.data);
|
||||
detail.value = res.data
|
||||
}
|
||||
onMounted(() => {
|
||||
getList()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
:deep(.el-dialog__headerbtn .el-dialog__close){
|
||||
color:#fff;
|
||||
font-size:40px;
|
||||
position:relative;
|
||||
top:15px;
|
||||
right:15px;
|
||||
}
|
||||
:deep(.el-dialog__header.show-close){
|
||||
padding-right:0;
|
||||
}
|
||||
:deep(.el-dialog) {
|
||||
background: url('/src/assets/images/map-bg-2.png') no-repeat top center;
|
||||
background-size: 100% 100%;
|
||||
width:vw(1500);
|
||||
}
|
||||
:deep(.el-dialog__title) {
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
}
|
||||
.m-modal{
|
||||
padding: vw(30);
|
||||
.normal {
|
||||
padding:3px 10px;
|
||||
background: #2380fb;
|
||||
}
|
||||
.warn {
|
||||
padding:3px 10px;
|
||||
background: #feae00;
|
||||
}
|
||||
.important {
|
||||
padding:3px 10px;
|
||||
background: #d9011b;
|
||||
}
|
||||
.item-title{
|
||||
font-size: 18px;
|
||||
margin-bottom: vw(30);
|
||||
&--primary {
|
||||
@extend .item-title;
|
||||
color: #02f9fa;
|
||||
background-image: url('@/assets/images/mask-primary.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
&--error {
|
||||
@extend .item-title;
|
||||
background-image: url('@/assets/images/mask-error.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
&--warning {
|
||||
@extend .item-title;
|
||||
background-image: url('@/assets/images/mask-warning.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
&--success {
|
||||
@extend .item-title;
|
||||
background-image: url('@/assets/images/mask-success.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
}
|
||||
.item-col{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
.detail-item {
|
||||
flex:1;
|
||||
margin-bottom: 12px;
|
||||
line-height: 1.5;
|
||||
.img{
|
||||
width:vw(200);
|
||||
height: vw(200);
|
||||
margin: 10px;
|
||||
}
|
||||
}
|
||||
.bom-box {
|
||||
.modal-body {
|
||||
padding: 16px;
|
||||
color:#fff;
|
||||
height:vh(780);
|
||||
overflow:auto;
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
width: vw(4); /* 滚动条的宽度 */
|
||||
}
|
||||
/* 滚动条轨道 */
|
||||
&::-webkit-scrollbar-track {
|
||||
background: 'transparent'; /* 轨道的背景色 */
|
||||
}
|
||||
/* 滚动条滑块 */
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background: rgba(0, 150, 255, 0.63); /* 滑块的背景色 */
|
||||
border-radius: 5px; /* 滑块的圆角 */
|
||||
}
|
||||
}
|
||||
}
|
||||
.work-box-1 {
|
||||
width: vw(1000);
|
||||
height:100%;
|
||||
width: vw(815);
|
||||
height: vh(950);
|
||||
margin-top: vh(120);
|
||||
box-sizing: border-box;
|
||||
background: linear-gradient(321deg, #0b2f64 0%, #062b57 100%);
|
||||
@@ -49,7 +261,6 @@
|
||||
border-radius: 5px; /* 滑块的圆角 */
|
||||
}
|
||||
height: vh(895);
|
||||
height:100%;
|
||||
overflow: auto;
|
||||
.li:nth-child(odd) {
|
||||
background: rgba(3, 78, 153, 0.3);
|
||||
@@ -62,17 +273,17 @@
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
padding: vh(8) vh(10);
|
||||
font-size: vw(14);
|
||||
.label {
|
||||
// width: vw(60);
|
||||
// height: vh(24);
|
||||
width: vw(60);
|
||||
height: vh(24);
|
||||
line-height: vh(24);
|
||||
color: #fff;
|
||||
border-radius: vw(2);
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
margin-right: vw(10);
|
||||
padding:vw(15);
|
||||
}
|
||||
.normal {
|
||||
@extend .label;
|
||||
@@ -86,19 +297,25 @@
|
||||
@extend .label;
|
||||
background: #d9011b;
|
||||
}
|
||||
.time {
|
||||
.time,.btn {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(12);
|
||||
color: rgba(255, 255, 255, 0.6);
|
||||
// line-height: 14px;
|
||||
line-height: 14px;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
text-transform: none;
|
||||
margin-left: vw(30);
|
||||
}
|
||||
.btn{
|
||||
font-size: vw(18);
|
||||
font-weight: bolder;
|
||||
color: #2380fb;
|
||||
cursor: pointer;
|
||||
}
|
||||
p {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
//font-size: vw(15);
|
||||
color: #ffffff;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
|
||||
@@ -5,28 +5,28 @@
|
||||
<Title1 title="今日工单" />
|
||||
</div>
|
||||
<div class="hd-list">
|
||||
<!-- <img class="h-icon" src="@/assets/images/work-icon-1.png" /> -->
|
||||
<img class="h-icon" src="@/assets/images/work-icon-1.png" />
|
||||
<div class="item item1">
|
||||
今日工单总条数 <span class="color1"><countup :end-val="totalData.total" /></span>
|
||||
</div>
|
||||
<div class="item item1">
|
||||
工单完成数 <span class="color1"><countup :end-val="totalData.complete" /></span>
|
||||
</div>
|
||||
<div class="item item3">
|
||||
紧急工单数 <span class=""><countup :end-val="totalData.warn" /></span>
|
||||
</div>
|
||||
|
||||
<div class="item item2">
|
||||
重要工单数 <span class=""><countup :end-val="totalData.important" /></span>
|
||||
</div>
|
||||
<div class="item item3">
|
||||
紧急工单数 <span class=""><countup :end-val="totalData.warn" /></span>
|
||||
</div>
|
||||
<div class="item item1">
|
||||
普通工单数 <span class=""><countup :end-val="totalData.normal" /></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chart">
|
||||
<div class="chart__wrapper">
|
||||
<div class="chart__wrapper mr-8">
|
||||
<Title3 title="工单总数" />
|
||||
<div style="margin-top:10px;"></div>
|
||||
<Line width="100%" :height="90" :data="seriesData" :xAxisData="xAxisData" />
|
||||
<Line :width="680" :height="320" :data="seriesData" :xAxisData="xAxisData" />
|
||||
</div>
|
||||
<div class="chart__wrapper">
|
||||
<Title3 title="工单类型完成比例" />
|
||||
@@ -68,9 +68,9 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box-2">
|
||||
<Title1 title="景区工单占比" />
|
||||
<div class="chart" style="padding-top: 0;">
|
||||
<div class="box-2 mt-8">
|
||||
<Title1 title="不同景区工单占比" />
|
||||
<div class="chart">
|
||||
<div class="chart__wrapper">
|
||||
<Title3 title="景区工单占比" />
|
||||
<div class="chart__inner">
|
||||
@@ -196,7 +196,7 @@
|
||||
border-radius: 0;
|
||||
}
|
||||
:deep(.el-progress__text) {
|
||||
font-size: font-vw(20) !important;
|
||||
font-size: vw(14) !important;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
margin-left: vw(5);
|
||||
display: inline-block;
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(13);
|
||||
color: #0084ff;
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
@@ -231,25 +231,25 @@
|
||||
.work-box-2 {
|
||||
margin-top: vh(120);
|
||||
margin-left: vw(8);
|
||||
flex:1;
|
||||
|
||||
.box-1 {
|
||||
padding: vw(1) 0;
|
||||
box-sizing: border-box;
|
||||
background: linear-gradient(to bottom, #0b2f64 0%, #062b57 100%);
|
||||
.chart {
|
||||
// display: flex;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: vw(20) vw(15);
|
||||
|
||||
&__wrapper {
|
||||
// width: vw(740);
|
||||
height: vh(400);
|
||||
width: vw(740);
|
||||
height: vh(370);
|
||||
padding: 0 vw(20);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
.progress {
|
||||
padding: vw(30);
|
||||
padding-top: vh(50);
|
||||
padding-top: vh(40);
|
||||
&-item {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
@@ -258,7 +258,7 @@
|
||||
}
|
||||
&-item__label {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
@@ -280,27 +280,27 @@
|
||||
left: vw(70);
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
width: vw(94);
|
||||
width: vw(74);
|
||||
height: auto;
|
||||
}
|
||||
.item {
|
||||
display: flex;
|
||||
min-width: vw(250);
|
||||
height: vh(78);
|
||||
line-height: vh(78);
|
||||
width: vw(210);
|
||||
height: vh(58);
|
||||
line-height: vh(58);
|
||||
padding-left: vw(10);
|
||||
text-align: center;
|
||||
margin: 0 vw(15);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(14);
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
text-transform: none;
|
||||
align-items: baseline;
|
||||
span {
|
||||
font-size: font-vw(28);
|
||||
font-size: vw(24);
|
||||
position: relative;
|
||||
top: vh(0);
|
||||
top: vh(2);
|
||||
margin-left: vw(5);
|
||||
}
|
||||
.color1 {
|
||||
@@ -312,29 +312,29 @@
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
.item2 {
|
||||
background-image: url('@/assets/images/work-n-bg-2.png');
|
||||
background-image: url('@/assets/images/work-n-bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
.item3 {
|
||||
background-image: url('@/assets/images/work-n-bg-3.png');
|
||||
background-image: url('@/assets/images/work-n-bg-2.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
.box-2 {
|
||||
// padding: vw(1);
|
||||
// height: vh(442);
|
||||
padding: vw(1);
|
||||
height: vh(442);
|
||||
box-sizing: border-box;
|
||||
background: linear-gradient(321deg, #0b2f64 0%, #062b57 100%);
|
||||
|
||||
.chart {
|
||||
// display: flex;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: vw(20) vw(15);
|
||||
|
||||
&__wrapper {
|
||||
// width: vw(740);
|
||||
// height: vh(370);
|
||||
width: vw(740);
|
||||
height: vh(370);
|
||||
padding: 0 vw(20);
|
||||
background-image: url('@/assets/images/bg-3.png');
|
||||
background-size: 100% 100%;
|
||||
@@ -343,17 +343,15 @@
|
||||
&__inner {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
&__legend {
|
||||
// flex: 1;
|
||||
width: vw(800);
|
||||
margin-left:vw(50);
|
||||
flex: 1;
|
||||
|
||||
&-item {
|
||||
position: relative;
|
||||
width: 50%;
|
||||
height: vh(60);
|
||||
width: 100%;
|
||||
height: vh(40);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: vh(8);
|
||||
@@ -367,26 +365,26 @@
|
||||
position: absolute;
|
||||
content: '';
|
||||
width: vw(4);
|
||||
height: vh(60);
|
||||
height: vh(40);
|
||||
background-color: #0096ff;
|
||||
}
|
||||
|
||||
.dot {
|
||||
width: vw(20);
|
||||
height: vw(20);
|
||||
width: vw(10);
|
||||
height: vw(10);
|
||||
margin: 0 vw(16);
|
||||
}
|
||||
|
||||
.name {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(12);
|
||||
color: #ffffff;
|
||||
// width: vw(130);
|
||||
width: vw(130);
|
||||
}
|
||||
|
||||
.value {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(22);
|
||||
font-size: vw(15);
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
@@ -394,12 +392,11 @@
|
||||
}
|
||||
|
||||
.alarm {
|
||||
width: vw(600);
|
||||
width: vw(200);
|
||||
background: #0a4190;
|
||||
|
||||
&__wrapper {
|
||||
width: vw(400);
|
||||
width:100%;
|
||||
width: vw(200);
|
||||
height: vh(270);
|
||||
background: #054581; /* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
@@ -422,15 +419,15 @@
|
||||
&:nth-child(2n) {
|
||||
background: #054d8d;
|
||||
}
|
||||
height: vh(60);
|
||||
height: vh(40);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
&-item__rank {
|
||||
width: vw(34);
|
||||
height: vh(30);
|
||||
font-size: font-vw(20);
|
||||
width: vw(24);
|
||||
height: vh(16);
|
||||
font-size: vw(12);
|
||||
color: #ffffff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -449,7 +446,7 @@
|
||||
&-item__content {
|
||||
padding-left: vw(20);
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,20 +16,20 @@
|
||||
<div class="statistics-item">
|
||||
<div class="flex align-center">
|
||||
<img class="statistics-item__icon" src="@/assets/images/dot-error.svg" />
|
||||
<span class="statistics-item__label">紧急消息</span>
|
||||
<span class="statistics-item__label">重要消息</span>
|
||||
</div>
|
||||
<div class="statistics-item__value--error">
|
||||
<countup :end-val="countInfo.warn" />
|
||||
<countup :end-val="countInfo.important" />
|
||||
<span class="statistics-item__value-suffix">条</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="statistics-item">
|
||||
<div class="flex align-center">
|
||||
<img class="statistics-item__icon" src="@/assets/images/dot-warning.svg" />
|
||||
<span class="statistics-item__label">重要消息</span>
|
||||
<span class="statistics-item__label">紧急消息</span>
|
||||
</div>
|
||||
<div class="statistics-item__value--warning">
|
||||
<countup :end-val="countInfo.important" />
|
||||
<countup :end-val="countInfo.warn" />
|
||||
<span class="statistics-item__value-suffix">条</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -44,7 +44,15 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chart-box" style="justify-content: center;align-items: center;">
|
||||
<div class="chart-box">
|
||||
<!-- <pie-->
|
||||
<!-- v-for="(item, index) in newsStateList"-->
|
||||
<!-- :key="index"-->
|
||||
<!-- :value="item.value"-->
|
||||
<!-- :label="item.name"-->
|
||||
<!-- :width="150"-->
|
||||
<!-- :height="150"-->
|
||||
<!-- />-->
|
||||
<newsRate :dataList="newsStateList" />
|
||||
<ul class="chart__legend">
|
||||
<li class="chart__legend-item" v-for="(item, index) in newsStateList" :key="index">
|
||||
@@ -160,34 +168,33 @@
|
||||
|
||||
.name {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(12);
|
||||
color: #ffffff;
|
||||
width: vw(130);
|
||||
}
|
||||
|
||||
.value {
|
||||
font-weight: bold;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(15);
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.work-box-3 {
|
||||
width: vw(1000);
|
||||
width: vw(840);
|
||||
margin-top: vh(120);
|
||||
margin-left: vw(8);
|
||||
|
||||
.work-box-1 {
|
||||
padding: 0 vw(20);
|
||||
// height: vh(566);
|
||||
height: vh(566);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: linear-gradient(321deg, #0b2f64 0%, #062b57 100%);
|
||||
|
||||
.list {
|
||||
height: vh(1600);
|
||||
// height:100%;
|
||||
height: vh(500);
|
||||
overflow: auto;
|
||||
/* 滚动条整体样式 */
|
||||
&::-webkit-scrollbar {
|
||||
@@ -212,43 +219,33 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
padding: vh(20) vh(10);
|
||||
padding: vh(8) vh(10);
|
||||
.label {
|
||||
width: vw(60);
|
||||
height: vh(34);
|
||||
line-height: vh(34);
|
||||
height: vh(24);
|
||||
line-height: vh(24);
|
||||
color: #fff;
|
||||
border-radius: 2px 2px 2px 2px;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
margin-right: vw(10);
|
||||
}
|
||||
.label--primary {
|
||||
@extend .label;
|
||||
width:initial;
|
||||
height:initial;
|
||||
padding:vw(15);
|
||||
background: #2380fb;
|
||||
}
|
||||
.label--warning {
|
||||
@extend .label;
|
||||
width:initial;
|
||||
height:initial;
|
||||
padding:vw(15);
|
||||
background: #d9011b;
|
||||
background: #feae00;
|
||||
}
|
||||
.label--error {
|
||||
width:initial;
|
||||
height:initial;
|
||||
@extend .label;
|
||||
padding:vw(15);
|
||||
|
||||
background: #feae00;
|
||||
background: #d9011b;
|
||||
}
|
||||
.time {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(18);
|
||||
font-size: vw(12);
|
||||
color: rgba(255, 255, 255, 0.6);
|
||||
line-height: 14px;
|
||||
text-align: left;
|
||||
@@ -258,7 +255,7 @@
|
||||
}
|
||||
p {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(15);
|
||||
color: #ffffff;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
@@ -277,8 +274,8 @@
|
||||
.work-2-flex {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
// height: vh(380);
|
||||
margin-bottom: vw(20);
|
||||
height: vh(380);
|
||||
margin-bottom: vw(8);
|
||||
background: linear-gradient(321deg, #0b2f64 0%, #062b57 100%);
|
||||
|
||||
.chart-box {
|
||||
@@ -294,7 +291,7 @@
|
||||
justify-content: space-around;
|
||||
&-item {
|
||||
font-weight: 400;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
}
|
||||
&-item__icon {
|
||||
width: vw(24);
|
||||
@@ -302,7 +299,7 @@
|
||||
}
|
||||
&-item__label {
|
||||
color: #fff;
|
||||
font-size: font-vw(20);
|
||||
font-size: vw(14);
|
||||
}
|
||||
&-item__value {
|
||||
position: relative;
|
||||
@@ -312,12 +309,11 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-weight: bold;
|
||||
font-size: font-vw(28);
|
||||
font-size: vw(28);
|
||||
color: #fff;
|
||||
&--primary {
|
||||
@extend .statistics-item__value;
|
||||
color: #02f9fa;
|
||||
|
||||
background-image: url('@/assets/images/mask-primary.png');
|
||||
background-size: 100% 100%;
|
||||
}
|
||||
@@ -338,7 +334,7 @@
|
||||
}
|
||||
}
|
||||
&-item__value-suffix {
|
||||
font-size: font-vw(12);
|
||||
font-size: vw(12);
|
||||
margin-top: vh(6);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,11 +55,11 @@
|
||||
rich: {
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(12)
|
||||
},
|
||||
value: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -80,13 +80,13 @@
|
||||
rich: {
|
||||
value: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18),
|
||||
fontSize: fitChartSize(16),
|
||||
fontWeight: 'bold',
|
||||
padding: [0, 0, 5, 0]
|
||||
},
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -158,8 +158,7 @@
|
||||
|
||||
<style scoped lang="scss">
|
||||
.alarmRate {
|
||||
width: vw(440);
|
||||
height: vh(300);
|
||||
width: vw(380);
|
||||
height: vh(180);
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
top: '56%',
|
||||
textStyle: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(20)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -175,7 +175,7 @@
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.pie {
|
||||
width: vw(250);
|
||||
height: vh(250);
|
||||
width: vw(200);
|
||||
height: vh(200);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -35,35 +35,11 @@
|
||||
|
||||
var defaultCofig = {
|
||||
color: [],
|
||||
legend: {
|
||||
orient: 'vertical',
|
||||
y: 'center',
|
||||
left: '50%',
|
||||
itemWidth: fitChartSize(18),
|
||||
itemHeight: fitChartSize(18),
|
||||
itemGap: fitChartSize(6),
|
||||
formatter: (name) => {
|
||||
let obj = props.dataList.find((item) => item.name == name)
|
||||
return `{name|${name}} {value|${obj?.value}}{value|%}`
|
||||
},
|
||||
textStyle: {
|
||||
rich: {
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18)
|
||||
},
|
||||
value: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(18)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: 'pie',
|
||||
center: ['24%', '50%'],
|
||||
radius: ['35%', '50%'],
|
||||
center: ['50%', '50%'],
|
||||
radius: ['70%', '90%'],
|
||||
itemStyle: {
|
||||
borderWidth: fitChartSize(4),
|
||||
borderColor: '#093672'
|
||||
@@ -75,13 +51,13 @@
|
||||
rich: {
|
||||
value: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(20),
|
||||
fontSize: fitChartSize(24),
|
||||
fontWeight: 'bold',
|
||||
padding: [0, 0, 5, 0]
|
||||
},
|
||||
name: {
|
||||
color: '#fff',
|
||||
fontSize: fitChartSize(22)
|
||||
fontSize: fitChartSize(12)
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -116,7 +92,7 @@
|
||||
|
||||
<style scoped lang="scss">
|
||||
.spotRate {
|
||||
width: vw(640);
|
||||
height: vh(400);
|
||||
width: vw(240);
|
||||
height: vh(320);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -33,7 +33,7 @@ export default defineConfig({
|
||||
// target: 'http://localhost:63343/',
|
||||
// changeOrigin: true
|
||||
// },
|
||||
// '/lqh': {
|
||||
// '/map/lqh': {
|
||||
// // 目标服务器的地址
|
||||
// target: 'http://localhost:63343/',
|
||||
// changeOrigin: true
|
||||
|
||||
Reference in New Issue
Block a user