Compare commits

..

No commits in common. "4805c5157ddca82a4f5c194c46d4b2b4c9880843" and "2477faf9573001169dd92d6969cf437caad25477" have entirely different histories.

3 changed files with 334 additions and 299 deletions

5
components.d.ts vendored
View File

@ -12,20 +12,15 @@ declare module 'vue' {
AButton: typeof import('ant-design-vue/es')['Button']
ACascader: typeof import('ant-design-vue/es')['Cascader']
AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider']
ADivider: typeof import('ant-design-vue/es')['Divider']
ADropdown: typeof import('ant-design-vue/es')['Dropdown']
AForm: typeof import('ant-design-vue/es')['Form']
AFormItem: typeof import('ant-design-vue/es')['FormItem']
AImage: typeof import('ant-design-vue/es')['Image']
AInput: typeof import('ant-design-vue/es')['Input']
AInputPassword: typeof import('ant-design-vue/es')['InputPassword']
ALayout: typeof import('ant-design-vue/es')['Layout']
ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent']
ALayoutSider: typeof import('ant-design-vue/es')['LayoutSider']
AMenu: typeof import('ant-design-vue/es')['Menu']
AMenuItem: typeof import('ant-design-vue/es')['MenuItem']
ASegmented: typeof import('ant-design-vue/es')['Segmented']
ASpace: typeof import('ant-design-vue/es')['Space']
ASpin: typeof import('ant-design-vue/es')['Spin']
AStatistic: typeof import('ant-design-vue/es')['Statistic']
ATimeline: typeof import('ant-design-vue/es')['Timeline']

View File

@ -1,241 +1,259 @@
<template>
<!-- <v-scale-screen width="1185" height="784"> -->
<div class="content" id="app">
<div class="community_top" v-if="isshow">
<div class="lefttit">多元警情融合及预警管控平台</div>
<div style="margin-left: 16px">
<ul style="display: flex; margin-top: 14px">
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist2" style="color: #b2b6c3; padding: 10px 18px; vertical-align: middle; font-weight: bold" to="/index/indexmin">服务总览</router-link>
</li>
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist" style="color: #b2b6c3; padding: 10px 18px; margin-left: 10px; vertical-align: middle; font-weight: bold" to="/index/index">安保力量</router-link>
</li>
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist" style="color: #b2b6c3; padding: 10px 18px; margin-left: 10px; vertical-align: middle; font-weight: bold" to="/index/command">警情推送</router-link>
</li>
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist" style="color: #b2b6c3; padding: 10px 18px; margin-left: 10px; vertical-align: middle; font-weight: bold" to="/index/system">智能布控</router-link>
</li>
</ul>
</div>
<div style="">
<ul style="display: flex; margin-top: 14px">
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist3" style="color: #b2b6c3; padding: 10px 18px; vertical-align: middle; font-weight: bold" to="/index/histordata">AI预警</router-link>
</li>
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist" style="color: #b2b6c3; padding: 10px 18px; vertical-align: middle; font-weight: bold" to="/index/analysis">统计分析</router-link>
</li>
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist" style="color: #b2b6c3; padding: 10px 18px; vertical-align: middle; font-weight: bold" to="/index/information">资源管理</router-link>
</li>
</ul>
<el-popconfirm title="确定退出吗?" @confirm="confirmEvent">
<template #reference>
<el-icon :size="20" style="display: inline-block; position: absolute; top: 31px; right: 32px; margin-left: 10px; vertical-align: middle; color: #9a4b48; font-weight: bold">
<switch-button />
<span style="color: #fff; position: absolute; right: 29px; font-weight: 100; font-size: 16px">{{ loginname }}</span>
</el-icon>
</template>
</el-popconfirm>
</div>
</div>
<div class="community_center" v-if="isshow">
<router-view></router-view>
</div>
<!-- <v-scale-screen width="1185" height="784"> -->
<div class="content" id="app">
<div class="community_top" v-if="isshow">
<div class="lefttit">多元警情融合及预警管控平台</div>
<div style="margin-left: 16px">
<ul style="display: flex; margin-top: 14px">
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist2"
style="color: #b2b6c3; padding: 10px 18px; vertical-align: middle; font-weight: bold"
to="/index/indexmin">服务总览</router-link>
</li>
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist"
style="color: #b2b6c3; padding: 10px 18px; margin-left: 10px; vertical-align: middle; font-weight: bold"
to="/index/index">安保力量</router-link>
</li>
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist"
style="color: #b2b6c3; padding: 10px 18px; margin-left: 10px; vertical-align: middle; font-weight: bold"
to="/index/command">警情推送</router-link>
</li>
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist"
style="color: #b2b6c3; padding: 10px 18px; margin-left: 10px; vertical-align: middle; font-weight: bold"
to="/index/system">智能布控</router-link>
</li>
</ul>
</div>
<div style="">
<ul style="display: flex; margin-top: 14px">
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist3"
style="color: #b2b6c3; padding: 10px 18px; vertical-align: middle; font-weight: bold"
to="/index/histordata">AI预警</router-link>
</li>
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist"
style="color: #b2b6c3; padding: 10px 18px; vertical-align: middle; font-weight: bold"
to="/index/analysis">统计分析</router-link>
</li>
<li>
<img style="vertical-align: middle" src="@/views/page/indeximag/ddh.png" alt="" />
<router-link active-class="ist"
style="color: #b2b6c3; padding: 10px 18px; vertical-align: middle; font-weight: bold"
to="/index/information">资源管理</router-link>
</li>
</ul>
<el-popconfirm title="确定退出吗?" @confirm="confirmEvent">
<template #reference>
<el-icon :size="20"
style="display: inline-block; position: absolute; top: 31px; right: 32px; margin-left: 10px; vertical-align: middle; color: #9a4b48; font-weight: bold">
<switch-button />
<span style="color:#fff;position: absolute;right: 29px;font-weight: 100;font-size: 16px;">{{loginname}}</span>
</el-icon>
</template>
</el-popconfirm>
</div>
</div>
<div class="community_center" v-if="isshow">
<router-view></router-view>
</div>
<router-view v-if="!isshow"></router-view>
</div>
<!-- </v-scale-screen> -->
<router-view v-if="!isshow"></router-view>
</div>
<!-- </v-scale-screen> -->
</template>
<script setup lang="ts">
import { useUserStore } from '@/stores/modules/userStore'
import { useWebSocket } from '@vueuse/core'
import { wsUrl } from '@/utils/webSocket'
import { ref, reactive, watch, onMounted } from 'vue'
import api from '@/axios'
import { useRouter } from 'vue-router'
const router = useRouter()
const isshow = ref(true)
const loginname = localStorage.getItem('loginname')
onMounted(() => {
stationWebsocket()
setInterval(function () {
api.post('/multialarm/client/user/active', {}).then((res) => {
console.log('token保活', res)
})
}, 180000)
})
import { useUserStore } from '@/stores/modules/userStore'
import { useWebSocket } from '@vueuse/core'
import { wsUrl } from '@/utils/webSocket'
import { ref, reactive, watch, onMounted } from 'vue'
import api from '@/axios'
import { useRouter } from 'vue-router'
const router = useRouter()
const isshow = ref(true)
const loginname = localStorage.getItem('loginname')
onMounted(() => {
stationWebsocket()
setInterval(function () {
api.post('/multialarm/client/user/active', {}).then((res) => {
console.log('token保活', res)
})
}, 180000)
})
watch(
() => router.currentRoute.value,
(newValue: any) => {
// console.log('newValue', newValue)
if (newValue.path == '/index/communitymanage' || newValue.path == '/index/hkplay') {
isshow.value = false
}
if (newValue.path == '/index/communitymanage' || newValue.path == '/index/cwPlay') {
isshow.value = false
}
},
{ immediate: true }
)
let istab = ref('6')
const sendStationList = (rollCall_websocket: any, stationTempArr: any) => {
var getIot = {
msgcode: 102,
msgname: 'station-sensor-list',
message: stationTempArr,
}
var msg = JSON.stringify(getIot)
rollCall_websocket.send(msg)
}
const stationHashList = ref([])
const stationWebsocket = () => {
//
const { data, ws } = useWebSocket(wsUrl('/ClientWebSocket'), {
heartbeat: {
message: 'ping',
interval: 1000 * 10,
pongTimeout: 1000 * 10,
},
autoReconnect: true,
})
ws.value.onopen = () => {
console.log('链接打开')
var messageObj = {
msgcode: 100,
msgname: 'session',
message: useUserStore().getToken,
}
var msg = JSON.stringify(messageObj)
ws.value.send(msg)
var stationTempArr = []
for (var i in stationHashList.value) {
stationTempArr.push(i)
if (stationTempArr.length >= 500) {
sendStationList(ws.value, stationTempArr)
stationTempArr = []
}
}
sendStationList(ws.value, stationTempArr)
}
ws.value.onclose = () => {
// console.log('')
//
// stationWebsocket();
}
ws.value.onmessage = function (evt) {
var data = JSON.parse(evt.data)
var msgcode = data['msgcode']
var message = data['message']
switch (msgcode) {
case 1035: //
// jinbao.value.push(message[0])
useUserStore().setwebsoketdata(message[0])
break
case 1020: //
// kickout(message);
break
default:
break
}
}
}
const toStudent = (a: any) => {
istab = a
switch (a) {
case '1':
router.push('/index/index')
break
case '2':
router.push('/index/histordata')
break
case '3':
router.push('/index/system')
break
case '4':
router.push('/index/command')
break
case '5':
// router.push('/index/command')
break
case '6':
router.push('/index/indexmin')
break
case '7':
router.push('/index/information')
break
}
}
const confirmEvent = () => {
console.log('退出')
localStorage.clear()
// router.push('/login')
// router.push({
// path: '/login'
// })
location.reload()
}
watch(
() => router.currentRoute.value,
(newValue : any) => {
// console.log('newValue', newValue)
if (newValue.path == '/index/communitymanage' || newValue.path == '/index/hkplay') {
isshow.value = false
}
if (newValue.path == '/index/communitymanage' || newValue.path == '/index/cwPlay') {
isshow.value = false
}
},
{ immediate: true }
)
let istab = ref('6')
const sendStationList = (rollCall_websocket : any, stationTempArr : any) => {
var getIot = {
msgcode: 102,
msgname: 'station-sensor-list',
message: stationTempArr,
}
var msg = JSON.stringify(getIot)
rollCall_websocket.send(msg)
}
const stationHashList = ref([])
const stationWebsocket = () => {
//
const { data, ws } = useWebSocket(wsUrl('/ClientWebSocket'), {
heartbeat: {
message: 'ping',
interval: 1000 * 10,
pongTimeout: 1000 * 10,
},
autoReconnect: true,
})
ws.value.onopen = () => {
console.log('链接打开')
var messageObj = {
msgcode: 100,
msgname: 'session',
message: useUserStore().getToken,
}
var msg = JSON.stringify(messageObj)
ws.value.send(msg)
var stationTempArr = []
for (var i in stationHashList.value) {
stationTempArr.push(i)
if (stationTempArr.length >= 500) {
sendStationList(ws.value, stationTempArr)
stationTempArr = []
}
}
sendStationList(ws.value, stationTempArr)
}
ws.value.onclose = () => {
// console.log('')
//
// stationWebsocket();
}
ws.value.onmessage = function (evt) {
var data = JSON.parse(evt.data)
var msgcode = data['msgcode']
var message = data['message']
switch (msgcode) {
case 1035: //
// jinbao.value.push(message[0])
useUserStore().setwebsoketdata(message[0])
break
case 1020: //
// kickout(message);
break
default:
break
}
}
}
const toStudent = (a : any) => {
istab = a
switch (a) {
case '1':
router.push('/index/index')
break
case '2':
router.push('/index/histordata')
break
case '3':
router.push('/index/system')
break
case '4':
router.push('/index/command')
break
case '5':
// router.push('/index/command')
break
case '6':
router.push('/index/indexmin')
break
case '7':
router.push('/index/information')
break
}
}
const confirmEvent = () => {
console.log('退出')
localStorage.clear()
// router.push('/login')
// router.push({
// path: '/login'
// })
location.reload()
}
</script>
<style scoped lang="scss">
.ist {
// background-image: url(@/assets/images/nav.png);
background-image: url(@/views/page/indeximag/dhxz.png);
background-size: 100% 100%;
background-repeat: no-repeat;
padding: 10px 18px;
border-radius: 3px;
color: #fff !important;
// background-size: 100% 100%;
// background-repeat: no-repeat;
// background-position: center;
}
.ist {
// background-image: url(@/assets/images/nav.png);
background-image: url(@/views/page/indeximag/dhxz.png);
background-size: 100% 100%;
background-repeat: no-repeat;
padding: 10px 18px;
border-radius: 3px;
color: #fff !important;
// background-size: 100% 100%;
// background-repeat: no-repeat;
// background-position: center;
}
.ist2 {
background-image: url(@/views/page/indeximag/dhxz.png);
background-size: 100% 100%;
background-repeat: no-repeat;
padding: 10px 18px;
border-radius: 3px;
color: #fff !important;
}
.ist2 {
background-image: url(@/views/page/indeximag/dhxz.png);
background-size: 100% 100%;
background-repeat: no-repeat;
padding: 10px 18px;
border-radius: 3px;
color: #fff !important;
}
.ist3 {
background-image: url(@/views/page/indeximag/dhxz.png);
background-size: 100% 100%;
background-repeat: no-repeat;
padding: 10px 18px;
border-radius: 3px;
color: #fff !important;
}
.ist3 {
background-image: url(@/views/page/indeximag/dhxz.png);
background-size: 100% 100%;
background-repeat: no-repeat;
padding: 10px 18px;
border-radius: 3px;
color: #fff !important;
}
.active {
color: #fff;
}
.active {
color: #fff;
}
.content {
width: 100%;
height: 100vh;
// background: #142738;
background: #fff;
color: #fff;
position: relative;
// background-image: url(@/assets/images/community_container.jpg);
// background-size: 100% 100%;
// background-repeat: no-repeat;
.community_top {
width: 100%;
height: 77px;
height: 60px;
// position: absolute;
// top: 0;
// background:#4880FF;
background: #07315e;
// background-image: url(@/views/page/imag/titleBg1.png);
@ -244,74 +262,74 @@ const confirmEvent = () => {
background-position-x: 55%;
display: flex;
// justify-content: space-between;
.title {
float: left;
height: 100%;
width: 400px;
line-height: 80px;
text-align: center;
font-size: 29px;
font-family: pmzd;
font-weight: 550;
background: #fff;
// background: linear-gradient(to bottom, #fff, #9cd7ff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.lefttit {
height: 60px;
line-height: 60px;
font-size: 18px;
font-weight: 600;
letter-spacing: 2px;
color: #ffffff;
background: -webkit-linear-gradient(45deg, #ffffff, #a1d7ff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
// background: linear-gradient(to bottom, #ffffff, #a1d7ff);
margin-left: 10px;
}
}
.title {
float: left;
height: 100%;
width: 400px;
line-height: 80px;
text-align: center;
font-size: 29px;
font-family: pmzd;
font-weight: 550;
background: #fff;
// background: linear-gradient(to bottom, #fff, #9cd7ff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.lefttit{
height: 60px;
line-height: 60px;
font-size: 18px;
font-weight: 600;
letter-spacing: 2px;
color: #ffffff;
background: -webkit-linear-gradient(45deg, #ffffff, #a1d7ff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
// background: linear-gradient(to bottom, #ffffff, #a1d7ff);
margin-left: 10px;
}
}
.community_top > ul:first-child {
left: 44px;
}
.community_top>ul:first-child {
left: 44px;
}
.community_top > ul:first-child,
.community_top > ul:last-child {
width: 524px;
float: left;
height: 24px;
margin-top: 23px;
padding: 0 20px;
position: relative;
}
.community_top>ul:first-child,
.community_top>ul:last-child {
width: 524px;
float: left;
height: 24px;
margin-top: 23px;
padding: 0 20px;
position: relative;
}
.community_top > ul:first-child > li,
.community_top > ul:last-child > li {
float: left;
height: 100%;
width: 80px;
border-radius: 3px;
text-align: center;
line-height: 24px;
font-size: 14px;
font-family: ysbth;
font-weight: 600;
background: #1f1757;
margin-right: 10px;
padding: 2px 0px;
}
.community_center {
// width: calc(100% - 100px);
width: 100%;
height: calc(100% - 51px);
overflow: hidden;
// height: 100%;
// margin: 10px 50px 30px 50px;
// position: absolute;
// position: relative;
// background: linear-gradient(to left, rgba(0, 0, 0, 0), rgba(0, 31, 65, 1));
}
}
.community_top>ul:first-child>li,
.community_top>ul:last-child>li {
float: left;
height: 100%;
width: 80px;
border-radius: 3px;
text-align: center;
line-height: 24px;
font-size: 14px;
font-family: ysbth;
font-weight: 600;
background: #1f1757;
margin-right: 10px;
padding: 2px 0px;
}
.community_center {
// width: calc(100% - 100px);
width: 100%;
height: calc(100% - 51px);
overflow: hidden;
// height: 100%;
// margin: 10px 50px 30px 50px;
// position: absolute;
// position: relative;
// background: linear-gradient(to left, rgba(0, 0, 0, 0), rgba(0, 31, 65, 1));
}
}
</style>

View File

@ -20,6 +20,15 @@
<div @click="qhzty('3')" :class="{ active: isActive == '3' }">医疗单位</div>
<div @click="qhzty('5')" :class="{ active: isActive == '5' }">其他</div>
</div>
<!-- <div class="searchBox" v-show="show3">
<el-form-item label="">
<el-input v-model="searchValue" placeholder="请输入搜索关键词">
<template #append>
<el-button @click="onSearch" :icon="Search" />
</template>
</el-input>
</el-form-item>
</div> -->
<div class="searchBox">
<a-cascader
@ -34,7 +43,11 @@
/>
</div>
<div ref="scrollContainer" v-loading="loading" class="scrollContainer">
<!-- <button @click="refreshTreeData">刷新</button> -->
<!-- height: 75%; -->
<div ref="scrollContainer" v-loading="loading" style="margin: 10px 20px; height: 70%; overflow: auto">
<!-- 重要的事情说三遍 key 值必须唯一 -->
<!-- 重要的事情说三遍 key 值必须唯一 -->
<!-- 重要的事情说三遍 key 值必须唯一 -->
<a-tree
:fieldNames="{ key: 'code', title: 'title', children: 'children' }"
@ -198,21 +211,21 @@
<p style="color: rgb(179, 194, 208)">视频点位:</p>
<ul v-if="ingrssddata">
<li style="text-align: center; color: #fff" v-if="ingrssddata.ipcList.length < 1">暂无数据</li>
<li v-else style="margin-left: 20px; margin-top: 10px; color: rgb(1, 216, 226)" v-for="(item, index) in ingrssddata.ipcList" :key="index">{{ item.title }}</li>
<li v-else style="margin-left: 20px; margin-top: 10px; color: rgb(1, 216, 226)" v-for="(item, index) in ingrssddata.ipcList">{{ item.title }}</li>
</ul>
</div>
<div style="margin-top: 10px">
<p style="color: rgb(179, 194, 208)">安保点位:</p>
<ul v-if="ingrssddata">
<li style="text-align: center; color: #fff" v-if="ingrssddata.mobileList.length < 1">暂无数据</li>
<li style="margin-left: 20px; margin-top: 10px; color: rgb(1, 216, 226)" v-for="(item, index) in ingrssddata.mobileList" :key="index">{{ item.title }}</li>
<li style="margin-left: 20px; margin-top: 10px; color: rgb(1, 216, 226)" v-for="(item, index) in ingrssddata.mobileList">{{ item.title }}</li>
</ul>
</div>
<div style="margin-top: 10px">
<p style="color: rgb(179, 194, 208)">文件列表:</p>
<ul v-if="ingrssddata">
<li style="text-align: center; color: #fff" v-if="ingrssddata.fileList.length < 1">暂无数据</li>
<li style="display: inline-block; margin-right: 5px" v-for="(item, index) in ingrssddata.fileList" :key="index">
<li style="display: inline-block; margin-right: 5px" v-for="(item, index) in ingrssddata.fileList">
<el-image
style="width: 150px; height: 150px"
v-if="item.type == 'image'"
@ -391,15 +404,20 @@ import closeimag from './imag/infoClose.png'
import { Ref, ref, watch, onMounted, onBeforeMount, reactive, getCurrentInstance, nextTick } from 'vue'
import type { CascaderProps } from 'ant-design-vue'
import type { ShowSearchType } from 'ant-design-vue/es/cascader'
// import AMapLoader from "@amap/amap-jsapi-loader";
const value = ref<string[]>([])
const options = ref<any[]>([])
const filter: ShowSearchType['filter'] = (inputValue, path) => {
// console.log(inputValue, path)
return path.some((option) => option.title.toLowerCase().indexOf(inputValue.toLowerCase()) > -1)
}
const cascaderChange = (value: any, selectedOptions: any): void => {
// console.log('cascaderChange', value, selectedOptions)
// selectedKeys.value.push(value.slice(-1)[0])
let title = selectedOptions.slice(-1)[0]?.title
expandedKeys.value = value
// scrollToMatchedNode(title) //bug
scrollToMatchedNode(title) //bug
}
const showIframe = ref(false)
@ -438,6 +456,7 @@ const qhzty2 = (data: any) => {
isActive1.value = data
}
//
watch(
() => useUserStore().getsoketData,
(newValue: any) => {
@ -564,6 +583,8 @@ const qhzty = (data: any) => {
}
}
const fieldNames: TreeProps['fieldNames'] = {
// children: 'children',
// title: 'title',
key: 'code',
}
const loading = ref(false)
@ -607,6 +628,10 @@ const checkKeyExists = (nodes: any, key: string): boolean => {
//
const scrollToKey = (key: string) => {
console.log('scrollToKey', key)
// console.log('treeRef________', treeRef.value.scrollTo)
// key
// const exists = treedataall.value.some((node) => node.key === key || node.children?.some((child: any) => child.key === key))
const exists = checkKeyExists(treedataall.value, key)
if (!exists) {
console.error(`Key ${key} not found in the tree.`)
@ -1437,7 +1462,7 @@ var state = {
const initMap = () => {
let latitude = JSON.parse(localStorage.getItem('user-stores'))['userInfo']['latitude']
let longitude = JSON.parse(localStorage.getItem('user-stores'))['userInfo']['longitude']
// var cluster;
state.map = new AMap.Map(state.id, {
// center: [113.015117, 28.209425],
center: [longitude, latitude],
@ -1450,12 +1475,9 @@ const initMap = () => {
</script>
<style scoped lang="scss">
.scrollContainer {
margin: 10px 20px;
height: 70%;
overflow: auto;
position: absolute;
}
// .input-with-select .el-input-group__prepend {
// background-color: var(--el-fill-color-blank);
// }
.slide-fade-enter-active {
transition: all 0.3s linear;
}
@ -1735,7 +1757,7 @@ const initMap = () => {
width: 100%;
height: 100%;
overflow: hidden;
// position: absolute !important;
// position: absolute;
.left-cont {
box-sizing: border-box;