381 lines
10 KiB
Vue
381 lines
10 KiB
Vue
<template>
|
|
<div class="wrapper">
|
|
<div class="wrapper-title-left-tree" :key="showKey">
|
|
<div v-for="item in treeData" :key="item.id" class="primaryNode">
|
|
<div
|
|
class="top"
|
|
@click="showBottom(item)"
|
|
:class="item.show ? 'topSelect' : ''"
|
|
>
|
|
{{ item.name }}
|
|
({{ item.channelCount }})
|
|
<DownOutlined v-show="!item.show" />
|
|
<UpOutlined v-show="item.show" />
|
|
</div>
|
|
<div class="bottom" v-show="item.show">
|
|
<div v-for="val in item.children" :key="val.id" class="item">
|
|
<div
|
|
class="up"
|
|
:class="selectId == val.id ? 'select' : ''"
|
|
@click="showDown(item, val), onSelect(item, val)"
|
|
>
|
|
<div>
|
|
<svg
|
|
t="1654068878091"
|
|
class="icon"
|
|
viewBox="0 0 1024 1024"
|
|
version="1.1"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
p-id="2156"
|
|
width="0.25rem"
|
|
height="0.25rem"
|
|
v-show="selectId == val.id"
|
|
>
|
|
<path
|
|
d="M512 624a112 112 0 1 0 0-224 112 112 0 0 0 0 224z"
|
|
p-id="2157"
|
|
fill="#0058e1"
|
|
></path>
|
|
</svg>
|
|
<span class="name">{{ val.name }}({{ val.channelCount }})</span>
|
|
</div>
|
|
<span v-if="item.children.length < 0">{{ val.total }}</span>
|
|
<span v-else>
|
|
<down-outlined v-show="!val.show" />
|
|
<up-outlined v-show="val.show" />
|
|
</span>
|
|
</div>
|
|
<div class="down" v-show="val.show">
|
|
<div
|
|
v-for="child in val.children"
|
|
:key="child.id"
|
|
class="child"
|
|
:class="selectId == child.id ? 'select2' : ''"
|
|
@click="onSelect(item, child, child)"
|
|
>
|
|
<div>
|
|
<svg
|
|
t="1654068878091"
|
|
class="icon"
|
|
viewBox="0 0 1024 1024"
|
|
version="1.1"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
p-id="2156"
|
|
width="0.25rem"
|
|
height="0.25rem"
|
|
v-show="selectId == child.id"
|
|
>
|
|
<path
|
|
d="M512 624a112 112 0 1 0 0-224 112 112 0 0 0 0 224z"
|
|
p-id="2157"
|
|
fill="#0058e1"
|
|
></path>
|
|
</svg>
|
|
<span class="name">
|
|
{{ child.name }}
|
|
</span>
|
|
</div>
|
|
<span>{{ child.channelCount }}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import { defineComponent, ref, watch } from 'vue'
|
|
import { getCameraAllOrgan } from '@/api/videoSurveillance'
|
|
import { getCameraInfoByAreaId } from '@/api/file'
|
|
import mybus from '@/myplugins/mybus'
|
|
import { useRouter } from 'vue-router'
|
|
import { UpOutlined, DownOutlined } from '@ant-design/icons-vue'
|
|
import { DETAIL_PAGE_CONTENT_DEFAULT_TAB } from '@/global/GlobalConfig.js'
|
|
|
|
export default defineComponent({
|
|
setup() {
|
|
const router = useRouter()
|
|
const whoShow1 = ref(whoShow)
|
|
const showKey = ref(0)
|
|
const treeData = ref([])
|
|
const selectId = ref('')
|
|
|
|
// 初始化
|
|
const init = async () => {
|
|
treeData.value = []
|
|
console.log(
|
|
'router.currentRoute.value.query.select',
|
|
router.currentRoute.value.query.select
|
|
)
|
|
let select =
|
|
router.currentRoute.value.query.select ||
|
|
DETAIL_PAGE_CONTENT_DEFAULT_TAB
|
|
if (select === '123') {
|
|
select = ''
|
|
}
|
|
console.log(
|
|
'获取url中的select=====================>',
|
|
router.currentRoute.value.query.select
|
|
)
|
|
if (select == '基础设施') {
|
|
let res = {}
|
|
if (whoShow1.value && !whoShow1.value.itShowXiHaiAn) {
|
|
res = await getCameraAllOrgan({
|
|
parentId: 'S4NbecfYB1DBH8HNULGS34',
|
|
})
|
|
} else {
|
|
// 西海岸
|
|
res = await getCameraInfoByAreaId({
|
|
areaId: '70be8c5b664f4bcf869d82f2e8335051',
|
|
})
|
|
}
|
|
treeData.value = (res.data && res.data.data) || []
|
|
// 只有一个,默认展开到二级菜单
|
|
if (res.data && res.data.data.length == 1) {
|
|
showBottom(treeData.value[0])
|
|
}
|
|
}
|
|
}
|
|
mybus.on('getDeptList', () => {
|
|
init()
|
|
})
|
|
init()
|
|
const onSelect = async (item, val, child) => {
|
|
console.log('item--------onSelect---->', item)
|
|
console.log('val------onSelect------>', val)
|
|
console.log('child-----onSelect------->', child)
|
|
mybus.emit('getCameraByParentId', {
|
|
id: val.id,
|
|
})
|
|
mybus.emit('getListByParentId', val.id)
|
|
let res = {}
|
|
if (whoShow1.value && !whoShow1.value.itShowXiHaiAn) {
|
|
res = await getCameraAllOrgan({ parentId: val.id })
|
|
} else {
|
|
// 西海岸
|
|
res = await getCameraInfoByAreaId({ areaId: val.id })
|
|
}
|
|
treeData.value.map((treeDataItem, index) => {
|
|
if (item.id == treeDataItem.id) {
|
|
treeData.value[index].children.map((childItem, childIndex) => {
|
|
if (childItem.id == val.id) {
|
|
treeData.value[index].children[childIndex].children =
|
|
res.data.data
|
|
}
|
|
})
|
|
}
|
|
})
|
|
if (child) {
|
|
selectId.value = child.id
|
|
}
|
|
}
|
|
|
|
watch(selectId, (newVal) => {
|
|
if (newVal == '') {
|
|
mybus.emit('getCameraByParentId', {
|
|
id: '',
|
|
})
|
|
mybus.emit('getListByParentId', '')
|
|
}
|
|
})
|
|
|
|
const showBottom = async (item) => {
|
|
item.show = !item.show
|
|
let res = {}
|
|
if (whoShow1.value && !whoShow1.value.itShowXiHaiAn) {
|
|
res = await getCameraAllOrgan({ parentId: item.id })
|
|
} else {
|
|
// 西海岸
|
|
res = await getCameraInfoByAreaId({ areaId: item.id })
|
|
}
|
|
|
|
treeData.value.map((treeDataItem, index) => {
|
|
if (item.id == treeDataItem.id) {
|
|
treeData.value[index].children = (res.data && res.data.data) || []
|
|
console.log('treeData.value.[index]', treeData.value[index])
|
|
}
|
|
})
|
|
}
|
|
const showDown = (item, val) => {
|
|
selectId.value = val.id
|
|
console.log('item---showDown--------->', item)
|
|
console.log('val----showDown-------->', val)
|
|
if (item.children) {
|
|
val.show = !val.show
|
|
// 取消选中
|
|
if (!val.show) {
|
|
selectId.value = ''
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
treeData,
|
|
showKey,
|
|
onSelect,
|
|
showBottom,
|
|
showDown,
|
|
selectId,
|
|
}
|
|
},
|
|
beforeUnmount() {
|
|
mybus.off('getDeptList')
|
|
console.log('getDeptList销毁~~~~~~~~~~~~~~~~~~~')
|
|
},
|
|
components: {
|
|
UpOutlined,
|
|
DownOutlined,
|
|
},
|
|
})
|
|
</script>
|
|
<style lang="less" scoped>
|
|
.primaryNode {
|
|
.top {
|
|
width: 100%;
|
|
height: 0.4rem;
|
|
background: rgba(0, 135, 225, 0.1);
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 0 0.1rem;
|
|
margin-top: 0.08rem;
|
|
}
|
|
|
|
.top:hover {
|
|
cursor: pointer;
|
|
// 0058e1 透明度 0.5
|
|
background: rgba(0, 88, 225, 0.8);
|
|
color: white;
|
|
|
|
:deep(.anticon) {
|
|
color: white;
|
|
}
|
|
}
|
|
|
|
.topSelect {
|
|
background: #0058e1;
|
|
color: white;
|
|
|
|
:deep(.anticon) {
|
|
color: white;
|
|
}
|
|
}
|
|
|
|
.bottom {
|
|
width: 100%;
|
|
background: rgba(244, 245, 248, 0.8);
|
|
padding: 0 0.1rem;
|
|
|
|
// margin-bottom: .08rem;
|
|
.up {
|
|
cursor: pointer;
|
|
height: 0.4rem;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
border-top: 0.01rem solid #ccc;
|
|
padding: 0 0.1rem;
|
|
|
|
& > div {
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
}
|
|
|
|
.name {
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
display: -webkit-box;
|
|
-webkit-line-clamp: 1;
|
|
-webkit-box-orient: vertical;
|
|
word-break: break-all;
|
|
}
|
|
}
|
|
|
|
.up:hover {
|
|
.name {
|
|
color: #0058e1;
|
|
font-weight: 600;
|
|
}
|
|
|
|
span {
|
|
color: #0058e1;
|
|
font-weight: 600;
|
|
}
|
|
}
|
|
|
|
.select {
|
|
padding: 0 0.1rem 0 0;
|
|
|
|
.name {
|
|
width: 1.7rem;
|
|
color: #0058e1 !important;
|
|
font-weight: 600;
|
|
}
|
|
|
|
span {
|
|
color: #0058e1;
|
|
font-weight: 600;
|
|
}
|
|
}
|
|
|
|
.item:nth-of-type(1) .up {
|
|
border-top: none;
|
|
}
|
|
|
|
.down {
|
|
width: 100%;
|
|
|
|
.child {
|
|
cursor: pointer;
|
|
height: 0.4rem;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 0 0.1rem;
|
|
|
|
& > div {
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
}
|
|
|
|
.name {
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
display: -webkit-box;
|
|
-webkit-line-clamp: 1;
|
|
-webkit-box-orient: vertical;
|
|
word-break: break-all;
|
|
}
|
|
}
|
|
|
|
.child:hover {
|
|
.name {
|
|
color: #0058e1;
|
|
font-weight: 600;
|
|
}
|
|
|
|
span {
|
|
color: #0058e1;
|
|
font-weight: 600;
|
|
}
|
|
}
|
|
|
|
.select2 {
|
|
.name {
|
|
width: 1.7rem;
|
|
color: #0058e1;
|
|
font-weight: 600;
|
|
}
|
|
|
|
span {
|
|
color: #0058e1;
|
|
font-weight: 600;
|
|
}
|
|
|
|
padding: 0 0.1rem 0 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|