hi-ucs/front/src/views/home/detailsPageconetentTree.vue

596 lines
17 KiB
Vue
Raw Normal View History

2022-06-14 09:32:49 +08:00
<template>
<div class="wrapper">
<div class="wrapper-title-left-tree" :key="showKey">
<div v-for="item in treeData" :key="item.key" class="primaryNode">
<!-- <div v-if="!item.children || item.children.length == 0">
{{ item.title }}
</div> -->
<div
class="top"
@click="showBottom(item)"
:class="item.show ? 'topSelect' : ''"
>
{{ item.title }}
<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.key" class="item">
<div
class="up"
:class="selectId == val.key ? '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"
2022-06-15 20:49:47 +08:00
width="0.25rem"
height="0.25rem"
2022-06-14 09:32:49 +08:00
v-show="selectId == val.key"
>
<path
d="M512 624a112 112 0 1 0 0-224 112 112 0 0 0 0 224z"
p-id="2157"
fill="#0058e1"
></path>
</svg>
2022-12-08 11:48:10 +08:00
<a-tooltip @mouseenter="showToolTip">
2022-06-27 14:16:21 +08:00
<template #title>{{ val.title }}</template>
<span class="name">
{{ val.title }}
2022-08-08 11:38:50 +08:00
<span
v-if="item.title === '区级'"
style="
display: inline-block;
margin-right: 4px;
white-space: nowrap;
"
>
({{ val.total }})
</span>
2022-06-27 14:16:21 +08:00
</span>
</a-tooltip>
2022-06-14 09:32:49 +08:00
</div>
<span v-if="item.title !== '区级'">{{ 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.key"
class="child"
:class="selectId == child.key ? 'select2' : ''"
@click="onSelect(item, val, 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"
2022-06-15 20:49:47 +08:00
width="0.25rem"
height="0.25rem"
2022-06-14 09:32:49 +08:00
v-show="selectId == child.key"
>
<path
d="M512 624a112 112 0 1 0 0-224 112 112 0 0 0 0 224z"
p-id="2157"
fill="#0058e1"
></path>
</svg>
2022-12-08 11:48:10 +08:00
<a-tooltip @mouseenter="showToolTip">
2022-06-27 14:16:21 +08:00
<template #title>{{ child.title }}</template>
<span class="name">
{{ child.title }}
</span>
</a-tooltip>
2022-06-14 09:32:49 +08:00
</div>
<span>{{ child.total }}</span>
</div>
</div>
</div>
</div>
</div>
<!-- <a-directory-tree
class="draggable-tree"
block-node
:tree-data="treeData"
@select="onSelect"
></a-directory-tree> -->
</div>
</div>
</template>
<script>
import { defineComponent, ref, watch } from 'vue'
2022-12-06 17:48:58 +08:00
import { selectDeptList, getDataResourceDeptList } from '@/api/home.js'
2022-06-14 09:32:49 +08:00
import mybus from '@/myplugins/mybus'
import { useRouter } from 'vue-router'
import { UpOutlined, DownOutlined } from '@ant-design/icons-vue'
2022-10-22 15:29:21 +08:00
import { useStore } from 'vuex'
2022-06-14 09:32:49 +08:00
export default defineComponent({
setup() {
const selectedKeys = ref([])
const checkedKeys = ref([])
const router = useRouter()
const fieldNames = {
children: 'children',
title: 'name',
}
2022-10-22 15:29:21 +08:00
const store = useStore()
2022-12-08 11:48:10 +08:00
// 用户信息
const user = ref({
deptName: store.getters['user/deptName'],
deptId: store.getters['user/deptId'],
})
2022-06-14 09:32:49 +08:00
const showKey = ref(0)
const treeData = ref([])
2022-12-06 17:48:58 +08:00
// 处理数据
const processingData = (res) => {
res.data.data.forEach((val) => {
if (val.type !== '全部能力目录') {
let obj = {
title: val.type,
total: val.total,
2022-12-12 20:01:49 +08:00
show: val.type === '市级' || val.type === '区级' ? true : false,
2022-12-06 17:48:58 +08:00
select: false,
key: val.type,
children: [],
}
switch (val.type) {
case '市级':
case '企业':
case '其他':
generateChildren(val, obj)
break
case '区级':
generateChildren2(val, obj)
break
}
treeData.value.push(obj)
}
})
// 排序
const sortArr = ['全部能力目录', '市级', '区级', '企业', '其他']
treeData.value.sort((a, b) => {
return sortArr.indexOf(a.key) - sortArr.indexOf(b.key)
})
//根据不同的权限展示不同的能力超市左侧树
// let deptId=user.value.deptId
2022-10-31 17:47:38 +08:00
// treeData.value.forEach((child) => {
// let childern=child.children
// childern.forEach((childs) => {//第一层:市级
// if(childs.key==deptId ){
// childs.show=true
// child.show=true
// mybus.emit('paramsGetResources', [childs.key])
// selectId.value =childs.key
// }
// if(childs.children && childs.children.length>0){//第二层 区级
// let qu=childs.children
// qu.forEach((qu) => {
// if(qu.key==deptId ){
// qu.show=true
// childs.show=true
// child.show=true
// mybus.emit('paramsGetResources', [qu.key])
// selectId.value = qu.key
// }
// })
// }
// })
2022-12-06 17:48:58 +08:00
2022-10-31 17:47:38 +08:00
// })
2022-12-06 17:48:58 +08:00
console.log('左侧树结构数据======================>', treeData.value)
showKey.value++
}
2022-06-14 09:32:49 +08:00
const init = () => {
treeData.value = []
console.log(
'router.currentRoute.value.query.select',
router.currentRoute.value.query.select
)
let select = router.currentRoute.value.query.select
if (select === '123') {
select = ''
}
2022-12-08 11:48:10 +08:00
2022-06-14 09:32:49 +08:00
console.log(
'获取url中的select=====================>',
router.currentRoute.value.query.select
)
if (
select !== '基础设施' &&
select !== '数据资源' &&
select !== '知识库'
) {
selectDeptList({ type: select }).then((res) => {
// console.log('区划数据=========================>', res.data.data)
2022-12-06 17:48:58 +08:00
if (res.data.msg !== 'success') {
return
}
processingData(res)
})
} else if (select === '数据资源') {
getDataResourceDeptList({ type: select }).then((res) => {
// console.log('区划数据=========================>', res.data.data)
if (res.data.msg !== 'success') {
return
}
processingData(res)
2022-06-14 09:32:49 +08:00
})
}
}
mybus.on('getDeptList', () => {
init()
})
// 生成children
const generateChildren = (val, obj) => {
if (val.dataList.length > 0) {
val.dataList.forEach((child) => {
let children = {
title: child.deptName,
show: false,
select: false,
total: child.deptCount,
key: child.deptId,
}
2022-12-08 11:48:10 +08:00
2022-06-14 09:32:49 +08:00
obj.children.push(children)
})
}
}
2022-12-08 11:48:10 +08:00
const showToolTip = (e) => {
if (e.target.clientWidth < 200) {
e.target.style.pointerEvents = 'none' // 阻止鼠标事件
}
}
2022-06-14 09:32:49 +08:00
// 区级特殊处理
const generateChildren2 = (val, obj) => {
if (val.dataList.length > 0) {
val.dataList.forEach((dis) => {
let children = {
title: dis.type,
total: dis.total,
show: false,
select: false,
key: dis.dataList[0].districtId,
children: [],
}
if (dis.dataList.length > 0) {
dis.dataList.forEach((child) => {
let children2 = {
title: child.deptName,
total: child.deptCount,
show: false,
select: false,
key: child.deptId,
}
2022-12-08 11:48:10 +08:00
2022-06-14 09:32:49 +08:00
children.children.push(children2)
})
}
obj.children.push(children)
})
}
}
// const onSelect = (event, node, dragNode, dragNodesKeys) => {
// console.log(event[0], node.node.children, dragNode, dragNodesKeys)
// if (!node.node.children) {
// mybus.emit('paramsGetResources', [event[0]])
// } else {
// let arr = []
// switch (event[0]) {
// case '全部能力目录':
// mybus.emit('paramsGetResources', [])
// break
// case '区级':
// node.node.children.forEach((dis) => {
// dis.children.forEach((val) => {
// arr.push(val.key)
// })
// })
// mybus.emit('paramsGetResources', arr)
// break
// default:
// node.node.children.forEach((val) => {
// arr.push(val.key)
// })
// mybus.emit('paramsGetResources', arr)
// break
// }
// }
// }
const selectId = ref('')
const onSelect = (item, val, child) => {
if (item.title === '区级') {
if (child) {
if (selectId.value !== child.key) {
mybus.emit('paramsGetResources', [child.key])
selectId.value = child.key
} else {
mybus.emit('paramsGetResources', [])
selectId.value = ''
}
}
} else {
if (selectId.value !== val.key) {
mybus.emit('paramsGetResources', [val.key])
selectId.value = val.key
} else {
mybus.emit('paramsGetResources', [])
selectId.value = ''
}
}
}
watch(selectedKeys, () => {
console.log('selectedKeys', selectedKeys)
})
watch(checkedKeys, (val) => {
if (val.checked.length > 1) {
val.checked.halfChecked = val.checked.shift()
}
console.log('onCheck', val)
})
const value = ref('')
const onSearch = (searchValue) => {
console.log('use value', searchValue)
console.log('or use this.value', value.value.child)
}
// checkedKeys, checkedNodes, node, event
function xuanzeshijian(checkedKeys) {
checkedKeys.value.checked = []
checkedKeys.value.checked[0] =
checkedKeys.checked[checkedKeys.checked.length - 1]
// console.log('checkedKeys1', checkedNodes)
console.log('checkedKeys', checkedKeys)
}
let quxiaoshijian = ''
function dianjisousuo(selectedKeys, selectedNodes, node, event) {
if (quxiaoshijian == selectedNodes.node.id) {
quxiaoshijian = ''
mybus.emit('paramsGetResources', quxiaoshijian)
} else {
quxiaoshijian = selectedNodes.node.id
mybus.emit('paramsGetResources', selectedNodes.node.id.trim())
}
console.log(
'dianjisousuo',
selectedKeys,
'dianjisousuo',
selectedNodes,
'dianjisousuo',
node,
'dianjisousuo',
event
)
}
const showBottom = (item) => {
item.show = !item.show
}
const showDown = (item, val) => {
console.log('showDown', val)
if (item.title === '区级') {
val.show = !val.show
}
}
return {
value,
onSearch,
selectedKeys,
checkedKeys,
fieldNames,
treeData,
dianjisousuo,
quxiaoshijian,
xuanzeshijian,
showKey,
onSelect,
showBottom,
showDown,
selectId,
2022-12-08 11:48:10 +08:00
showToolTip,
2022-06-14 09:32:49 +08:00
}
},
beforeUnmount() {
mybus.off('getDeptList')
console.log('getDeptList销毁~~~~~~~~~~~~~~~~~~~')
},
components: {
UpOutlined,
DownOutlined,
},
})
</script>
<style lang="less" scoped>
// .wrapper {
// height: 100%;
// width: 100%;
2022-06-15 20:49:47 +08:00
// padding: .2rem;
2022-06-14 09:32:49 +08:00
// .wrapper-title {
2022-06-15 20:49:47 +08:00
// height: .28rem;
2022-06-14 09:32:49 +08:00
// width: 100%;
2022-06-15 20:49:47 +08:00
// margin-bottom: .25rem;
2022-06-14 09:32:49 +08:00
// .wrapper-title-name {
// width: 100%;
2022-06-15 20:49:47 +08:00
// height: .17rem;
// font-size: .18rem;
2022-06-14 09:32:49 +08:00
// font-family: 'AlibabaPuHuiTiR';
// font-weight: 400;
// color: #0058e1;
2022-06-15 20:49:47 +08:00
// line-height: .34rem;
2022-06-14 09:32:49 +08:00
// }
// .wrapper-title-yangshi {
2022-06-15 20:49:47 +08:00
// width: .4rem;
// height: .03rem;
2022-06-14 09:32:49 +08:00
// background: #0058e1;
2022-06-15 20:49:47 +08:00
// border-radius: .02rem;
// margin-top: .2rem;
// margin-left: .15rem;
2022-06-14 09:32:49 +08:00
// }
// }
// .wrapper-title-left-tree {
// overflow-y: auto;
// height: 80%;
2022-06-15 20:49:47 +08:00
// width: 2.1rem;
2022-06-14 09:32:49 +08:00
// }
// .wrapper-title-left-tree::-webkit-scrollbar {
2022-06-15 20:49:47 +08:00
// width: .05rem;
// height: .05rem;
2022-06-14 09:32:49 +08:00
// }
// .wrapper-title-left-tree::-webkit-scrollbar-thumb {
2022-06-15 20:49:47 +08:00
// border-radius: .05rem;
2022-06-14 09:32:49 +08:00
// background-color: #0058e1;
// }
// .wrapper-title-left-tree::-webkit-scrollbar-track {
// background-color: transparent;
// }
// :deep(.ant-tree-treenode) {
2022-06-15 20:49:47 +08:00
// margin-top: .1rem;
// height: .23rem;
2022-06-14 09:32:49 +08:00
// overflow: hidden;
// text-overflow: ellipsis;
// display: -webkit-box;
// -webkit-line-clamp: 1;
// -webkit-box-orient: vertical;
// }
// }
.primaryNode {
.top {
width: 100%;
2022-06-27 09:43:37 +08:00
height: 0.4rem;
2022-06-14 09:32:49 +08:00
background: rgba(0, 135, 225, 0.1);
display: flex;
justify-content: space-between;
align-items: center;
2022-06-27 09:43:37 +08:00
padding: 0 0.1rem;
margin-top: 0.08rem;
2022-06-14 09:32:49 +08:00
}
.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);
2022-06-27 09:43:37 +08:00
padding: 0 0.1rem;
2022-06-15 20:49:47 +08:00
// margin-bottom: .08rem;
2022-06-14 09:32:49 +08:00
.up {
cursor: pointer;
2022-06-27 09:43:37 +08:00
height: 0.4rem;
2022-06-14 09:32:49 +08:00
display: flex;
justify-content: space-between;
align-items: center;
2022-06-27 09:43:37 +08:00
border-top: 0.01rem solid #ccc;
padding: 0 0.1rem;
2022-06-14 09:32:49 +08:00
& > div {
display: flex;
justify-content: flex-start;
}
.name {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
2022-07-19 09:42:41 +08:00
word-break: break-all;
2022-12-08 11:48:10 +08:00
max-width: 200px;
2022-06-14 09:32:49 +08:00
}
}
.up:hover {
.name {
color: #0058e1;
font-weight: 600;
}
span {
color: #0058e1;
font-weight: 600;
}
}
.select {
2022-06-27 09:43:37 +08:00
padding: 0 0.1rem 0 0;
2022-06-14 09:32:49 +08:00
.name {
2022-06-15 20:49:47 +08:00
width: 1.7rem;
2022-06-14 09:32:49 +08:00
color: #0058e1;
font-weight: 600;
}
span {
color: #0058e1;
font-weight: 600;
}
}
.item:nth-of-type(1) .up {
border-top: none;
}
.down {
width: 100%;
.child {
cursor: pointer;
2022-06-27 09:43:37 +08:00
height: 0.4rem;
2022-06-14 09:32:49 +08:00
display: flex;
justify-content: space-between;
align-items: center;
2022-06-27 09:43:37 +08:00
padding: 0 0.1rem;
2022-06-14 09:32:49 +08:00
& > div {
display: flex;
justify-content: flex-start;
}
.name {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
2022-07-19 09:42:41 +08:00
word-break: break-all;
2022-06-14 09:32:49 +08:00
}
}
.child:hover {
.name {
color: #0058e1;
font-weight: 600;
}
span {
color: #0058e1;
font-weight: 600;
}
}
.select2 {
.name {
2022-06-15 20:49:47 +08:00
width: 1.7rem;
2022-06-14 09:32:49 +08:00
color: #0058e1;
font-weight: 600;
}
span {
color: #0058e1;
font-weight: 600;
}
2022-06-27 09:43:37 +08:00
padding: 0 0.1rem 0 0;
2022-06-14 09:32:49 +08:00
}
}
}
}
</style>