<template>
|
<div v-drag class="layerBox">
|
<div class="layerTitle">
|
<div class="tileLeft">
|
<div @click="setCloseLayer" class="titleImg">
|
<ArrowLeft />
|
</div>
|
<div class="titleLable">图层管理</div>
|
</div>
|
<div class="titleImg set" @click="layerSetBox">
|
<Setting />
|
</div>
|
</div>
|
<div class="layerContent">
|
<el-tree
|
node-key="id"
|
:props="props"
|
:highlight-current="false"
|
:current-node-key="selectedNodeId"
|
:data="treeData"
|
:expand-on-click-node="false"
|
show-checkbox
|
@check="handleCheckChange"
|
ref="estreeRef"
|
v-if="treeData.length"
|
>
|
<template #default="{ node, data }">
|
<span class="custom-tree-node">
|
<span class="label">{{ node.label }}</span>
|
<!-- <span>
|
<a @click="append(data)"> Append </a>
|
<a style="margin-left: 8px" @click="remove(node, data)">
|
Delete
|
</a>
|
</span> -->
|
<span class="button" v-if="data.type == 2 || data.type == 3">
|
<el-dropdown trigger="click">
|
<span class="el-dropdown-link">
|
<el-icon class="el-icon--right">
|
<MoreFilled />
|
</el-icon>
|
</span>
|
<template #dropdown>
|
<el-dropdown-menu>
|
<el-dropdown-item @click.native="clickdropdown(1, data)"
|
>详细</el-dropdown-item
|
>
|
<el-dropdown-item @click.native="clickdropdown(2, data)"
|
>属性</el-dropdown-item
|
>
|
</el-dropdown-menu>
|
</template>
|
</el-dropdown>
|
</span>
|
</span>
|
</template>
|
</el-tree>
|
</div>
|
</div>
|
<layer-set
|
v-show="layerSetIsshow"
|
@SETstate="SETstate"
|
:layerTree="treeData"
|
@addlayer="addlayer"
|
@delLayer="delLayer"
|
></layer-set>
|
<attribute-list
|
v-show="layerAttributeIsshow"
|
:layerData="layerObjData"
|
@spatialClose="setSpatialClose"
|
></attribute-list>
|
<layer-detail
|
:layerData="layerObjData"
|
v-if="layerDetailIsshow"
|
@detailClose="detailClose"
|
></layer-detail>
|
</template>
|
|
<script lang="ts" setup>
|
import {
|
ref,
|
onMounted,
|
onBeforeUnmount,
|
reactive,
|
defineProps,
|
defineEmits,
|
} from "vue";
|
import layerSet from "./layerSet";
|
import attributeList from "./attributeList";
|
import layerDetail from "./layerDetail";
|
import { useStore } from "vuex"; // 引入useStore 方法
|
import { layer_selectAll } from "@/api/api";
|
import server from "@/assets/js/Map/server";
|
import { ElMessage } from "element-plus";
|
const store = useStore(); // 该方法用于返回store 实例
|
const stretchValue = ref("");
|
|
let estreeRef = ref();
|
const stretchOptions = [
|
{
|
value: "Option1",
|
label: "Option1",
|
},
|
{
|
value: "Option2",
|
label: "Option2",
|
},
|
{
|
value: "Option3",
|
label: "Option3",
|
},
|
{
|
value: "Option4",
|
label: "Option4",
|
},
|
{
|
value: "Option5",
|
label: "Option5",
|
},
|
];
|
const transparence = ref(0);
|
var treeData = ref([]);
|
var layerListData = ref([]);
|
let menuOption = reactive([
|
{
|
id: 1,
|
name: "测试",
|
isShow: false,
|
checkedAll: false,
|
type: 1,
|
parentId: null,
|
},
|
{
|
id: 2,
|
layerState: false,
|
name: "图层名称",
|
layerUrl: "",
|
type: 2,
|
parentId: 1,
|
},
|
{
|
id: 3,
|
layerState: false,
|
name: "图层菜单",
|
layerUrl: "",
|
type: 1,
|
parentId: 1,
|
},
|
{
|
id: 5,
|
layerState: false,
|
name: "图层名称11",
|
layerUrl: "",
|
type: 2,
|
parentId: 3,
|
},
|
{
|
id: 4,
|
name: "测试1",
|
isShow: false,
|
checkedAll: true,
|
layerState: false,
|
type: 1,
|
parentId: null,
|
},
|
]);
|
|
const layerSetIsshow = ref(false);
|
const layerAttributeIsshow = ref(false);
|
const layerDetailIsshow = ref(false);
|
const props = {
|
label: "cnName",
|
children: "children",
|
};
|
const layerObjData = ref(null);
|
// 当前选中的节点 id
|
const selectedNodeId = ref(null as any); //做类型断言处理
|
const emits = defineEmits(["setCloseLayer"]);
|
|
//图层设置弹框
|
const layerSetBox = () => {
|
layerSetIsshow.value = !layerSetIsshow.value;
|
};
|
//关闭状态
|
const SETstate = (res) => {
|
layerSetIsshow.value = res;
|
};
|
const setCloseLayer = () => {
|
emits("setCloseLayer", false);
|
};
|
//选择图层
|
const handleCheckChange = (data, checked) => {
|
let isCheck = checked.checkedKeys.indexOf(data.id) > -1;
|
// this.setVisiable(data, isCheck);
|
|
let son = estreeRef.value.getCheckedNodes();
|
|
store.commit("SET_CHECKLAYER", son);
|
setVisiable(data, isCheck);
|
let layerArr = [];
|
son.forEach((e) => {
|
if (e.type == 2) {
|
layerArr.push(e);
|
}
|
});
|
// server.addLayer(layerArr, isCheck);
|
};
|
const setVisiable = (treeNode, checked) => {
|
if (checked !== undefined) {
|
treeNode.checked = checked;
|
} else {
|
treeNode.checked = !treeNode.checked;
|
}
|
|
if (treeNode.children) {
|
treeNode.children.forEach((item) => {
|
setVisiable(item, treeNode.checked);
|
});
|
return;
|
} else if (treeNode._children) {
|
if (treeNode.thisView === "ewzj") {
|
treeNode._children[0].checked = treeNode.checked;
|
if (treeNode._children[0].children) {
|
treeNode._children[0].children.forEach((item) => {
|
item.checked = treeNode.checked;
|
server.addTreeData(item);
|
});
|
} else {
|
server.addTreeData(treeNode._children[0]);
|
}
|
} else if (treeNode.thisView === "swzj") {
|
for (let i = 1; i < treeNode._children.length; i++) {
|
treeNode._children[i].checked = treeNode.checked;
|
}
|
treeNode._children.forEach((item, index) => {
|
index !== 0 && server.addTreeData(item);
|
});
|
} else if (!treeNode.thisView) {
|
treeNode._children.forEach((item, index) => {
|
item.checked = treeNode.checked;
|
if (item.children) {
|
item.children.forEach((_item) => {
|
_item.checked = item.checked;
|
server.addTreeData(_item);
|
});
|
} else {
|
server.addTreeData(item);
|
}
|
});
|
}
|
return;
|
}
|
|
if (!treeNode.isAdd) {
|
server.addTreeData(treeNode);
|
return;
|
}
|
|
// let data = _getTreeData(treeNode.id);
|
// if (data) {
|
// data.item &&
|
// data.item.setVisibility &&
|
// data.item.setVisibility(treeNode.checked);
|
// data.item && data.item.setVisible && data.item.setVisible(treeNode.checked);
|
// data.item &&
|
// data.item.show !== undefined &&
|
// (data.item.show = treeNode.checked);
|
// if (data.datatype === "particle") {
|
// data.item.forEach((item) => {
|
// item.show = treeNode.checked;
|
// });
|
// }
|
// } else {
|
// if (treeNode.id && treeNode.id.indexOf && treeNode.id.indexOf("---") > -1) {
|
// var ids = id.split("---");
|
// ids.forEach((item) => {
|
// sgworld.ProjectTree.setVisibility(item, treeNode.checked);
|
// });
|
// } else {
|
// sgworld.ProjectTree.setVisibility(treeNode.id, treeNode.checked);
|
|
// var dd = Viewer.dataSources._dataSources.filter((item) => {
|
// return item.name == treeNode.id;
|
// });
|
// if (dd && dd.length > 0) {
|
// dd[0].show = treeNode.checked;
|
// }
|
// }
|
// }
|
};
|
|
const clickdropdown = (res, e) => {
|
layerAttributeIsshow.value = false;
|
layerDetailIsshow.value = false;
|
layerObjData.value = e;
|
if (res == 2) {
|
layerAttributeIsshow.value = true;
|
} else {
|
layerDetailIsshow.value = true;
|
}
|
};
|
const setSpatialClose = (res) => {
|
layerAttributeIsshow.value = res;
|
};
|
const detailClose = (res) => {
|
layerDetailIsshow.value = res;
|
};
|
//编辑图层树
|
const addlayer = (res) => {
|
console.log(res);
|
let node;
|
layerListData.value.forEach((e) => {
|
if (e.id == res.id) {
|
node = estreeRef.value.getNode(e);
|
}
|
});
|
// 将变动之前的node备份
|
let copyNode = { ...node };
|
copyNode.previousSibling = { ...node.previousSibling };
|
copyNode.nextSibling = { ...node.nextSibling };
|
if (res.type === 1) {
|
// 上移
|
if (node.previousSibling) {
|
// 删除原先的node
|
estreeRef.value.remove(node.data);
|
// 拿到copy的node
|
// nodeData = CircularJSON.parse(window.sessionStorage.getItem("menuNode"));
|
// 复制该node到指定位置(参数:1. 要增加的节点的 data 2. 要增加的节点的后一个节点的 data、key 或者 node)
|
|
estreeRef.value.insertBefore(
|
copyNode.data,
|
copyNode.previousSibling.data
|
);
|
// window.sessionStorage.removeItem("menuNode");
|
}
|
} else {
|
// 下移
|
if (node.nextSibling) {
|
estreeRef.value.remove(node.data);
|
estreeRef.value.insertAfter(copyNode.data, copyNode.nextSibling.data);
|
}
|
}
|
};
|
//删除图层树
|
const delLayer = (res) => {
|
// menuOption = menuOption.filter((item) => {
|
// return item.id != res;
|
// });
|
// console.log(res);
|
// console.log(menuOption);
|
// treeData = handleTree(menuOption, "id", "pid", "children");
|
};
|
|
const getLayer = async () => {
|
const dt = await layer_selectAll();
|
if (dt.code == 200) {
|
treeData.value = setTreeData(dt.result).sort(function (a, b) {
|
return a.sort - b.sort;
|
});
|
layerListData.value = dt.result;
|
}
|
|
// treeData.value = JSON.parse(JSON.stringify(treeData.value));
|
|
// console.log(treeData.value);
|
};
|
|
//构造树
|
function setTreeData(source) {
|
let cloneData = JSON.parse(JSON.stringify(source)); // 对源数据深度克隆
|
return cloneData.filter((father) => {
|
// 循环所有项
|
let branchArr = cloneData.filter((child) => father.id == child.pid);
|
if (branchArr.length > 0) {
|
branchArr.sort(function (a, b) {
|
return a.sort - b.sort;
|
});
|
}
|
|
branchArr.length > 0 ? (father.children = branchArr) : ""; // 给父级添加一个children属性,并赋值
|
// 属于同一对象问题,例如:令 a=b、c=1 ,然后再令 b.c=c , 那么 a.c=b.c=c=1 ;同理,后续令 c.d=2 ,那么 a.c.d 也是=2;
|
// 由此循环多次后,就能形成相应的树形数据结构
|
return father.pid == 0; // 返回一级菜单
|
});
|
}
|
onMounted(() => {
|
getLayer();
|
});
|
</script>
|
|
<style lang="less" scoped>
|
.layerBox {
|
width: 359px;
|
height: 680px;
|
background: rgba(7, 8, 14, 0.8);
|
box-shadow: inset 0px 10px 40px 10px rgba(38, 47, 71, 1);
|
.layerTitle {
|
width: calc(100% - 27px);
|
height: 42px;
|
background: #0e151f;
|
box-shadow: 0px 0px 6px 0px #080c13,
|
0px 14px 16px 0px rgba(38, 47, 71, 0.68);
|
display: flex;
|
justify-content: space-between;
|
padding-left: 7px;
|
padding-right: 20px;
|
color: white;
|
.tileLeft {
|
height: 100%;
|
display: flex;
|
align-items: center;
|
|
.titleLable {
|
font-size: 18px;
|
font-family: Source Han Sans CN;
|
font-weight: 400;
|
color: #ffffff;
|
}
|
}
|
.titleImg {
|
width: 20px;
|
height: 100%;
|
display: flex;
|
align-items: center;
|
color: rgba(104, 156, 255, 1);
|
}
|
.set {
|
cursor: pointer;
|
}
|
}
|
.layerContent {
|
height: 625px;
|
padding: 0 8px;
|
overflow: auto;
|
overflow-y: auto;
|
}
|
.layerContent::-webkit-scrollbar {
|
width: 8px;
|
}
|
.layerContent::-webkit-scrollbar-thumb {
|
border-radius: 10px;
|
background: rgba(0, 0, 0, 0.2);
|
}
|
.layerContent::-webkit-scrollbar-track {
|
border-radius: 0;
|
background: rgba(0, 0, 0, 0);
|
}
|
.el-tree {
|
width: 100%;
|
overflow-y: auto;
|
}
|
.layerContent .el-tree-node__content {
|
overflow: hidden;
|
}
|
|
.layerContent .custom-tree-node {
|
overflow: hidden;
|
flex-shrink: 1;
|
flex-grow: 1;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
font-size: 16px;
|
padding-right: 8px;
|
}
|
|
.layerContent .custom-tree-node .label {
|
flex-shrink: 1;
|
overflow: hidden;
|
text-overflow: ellipsis;
|
}
|
|
.layerContent .custom-tree-node .button {
|
flex-grow: 0;
|
flex-shrink: 0;
|
}
|
}
|
.dropdown_box {
|
position: relative;
|
}
|
|
/deep/.el-select-dropdown__item {
|
font-size: 12px !important;
|
}
|
.el-tree {
|
background: transparent;
|
}
|
/deep/ .el-tree-node {
|
background: #0d131d;
|
color: #ffffff;
|
font-size: 20px;
|
font-weight: 300;
|
margin-top: 3px;
|
padding: 8px;
|
}
|
/deep/ .el-tree-node:focus > .el-tree-node__content {
|
background: transparent;
|
}
|
/deep/ .el-tree-node__content:hover {
|
background: #0d131d;
|
}
|
/deep/ .el-tree-node__children {
|
background: #1e2a3d;
|
.el-tree-node {
|
background: #1e2a3d;
|
margin-top: 0;
|
padding: 4px;
|
}
|
}
|
/deep/
|
.el-tree--highlight-current
|
.el-tree-node.is-current
|
> .el-tree-node__content {
|
background: rgba(104, 156, 255, 0.5) !important;
|
}
|
.highlight {
|
background: rgba(104, 156, 255, 0.5) !important;
|
}
|
// .custom-tree-node {
|
// flex: 1;
|
// display: flex;
|
// align-items: center;
|
// justify-content: space-between;
|
// font-size: 16px;
|
// padding-right: 8px;
|
// }
|
|
.el-dropdown-menu {
|
background: rgba(7, 8, 14, 0.8);
|
box-shadow: inset 0px 10px 40px 10px rgba(38, 47, 71, 1);
|
color: #fff;
|
border: 0;
|
/deep/ .el-dropdown-menu__item {
|
color: #fff;
|
}
|
}
|
/deep/ .el-dropdown-menu__item:not(.is-disabled):focus {
|
background-color: rgba(104, 156, 255, 0.5);
|
|
color: #fff;
|
}
|
</style>
|
<style>
|
.el-popper.is-light {
|
border: 1px solid rgba(7, 8, 14, 0.8) !important;
|
}
|
.el-scrollbar {
|
border: 0 !important;
|
}
|
</style>
|