| | |
| | | </div> |
| | | <div class="layerContent"> |
| | | <el-tree |
| | | node-key="id" |
| | | :props="props" |
| | | :highlight-current="false" |
| | | :current-node-key="selectedNodeId" |
| | | :data="menuOption" |
| | | :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>{{ node.label }}</span> |
| | | <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> --> |
| | | <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 class="button" v-if="data.type == 2"> |
| | | <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"></layer-set> |
| | | <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> |
| | |
| | | } 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"; |
| | | const store = useStore(); // 该方法用于返回store 实例 |
| | | const stretchValue = ref(""); |
| | | |
| | |
| | | }, |
| | | ]; |
| | | const transparence = ref(0); |
| | | var treeData = ref([]); |
| | | let menuOption = reactive([ |
| | | { |
| | | id: 1, |
| | | name: "测试", |
| | | isShow: false, |
| | | checkedAll: false, |
| | | type: 1, |
| | | children: [ |
| | | { |
| | | layerState: false, |
| | | name: "图层名称", |
| | | layerUrl: "", |
| | | type: 2, |
| | | }, |
| | | { |
| | | layerState: false, |
| | | name: "图层菜单", |
| | | layerUrl: "", |
| | | type: 1, |
| | | children: [ |
| | | { |
| | | layerState: false, |
| | | name: "图层名称11", |
| | | layerUrl: "", |
| | | type: 2, |
| | | }, |
| | | ], |
| | | }, |
| | | ], |
| | | 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: "name", |
| | | label: "cnName", |
| | | children: "children", |
| | | }; |
| | | const layerObjData = ref(null); |
| | | // 当前选中的节点 id |
| | | const selectedNodeId = ref(null as any); //做类型断言处理 |
| | | const emits = defineEmits(["setCloseLayer"]); |
| | | const handlCheckAllChange = (res) => {}; |
| | | const handlIsShow = (res: string) => { |
| | | menuOption.forEach((e) => { |
| | | if (e.name == res) { |
| | | e.isShow = !e.isShow; |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | //图层设置弹框 |
| | | const layerSetBox = () => { |
| | | layerSetIsshow.value = !layerSetIsshow.value; |
| | |
| | | const setCloseLayer = () => { |
| | | emits("setCloseLayer", false); |
| | | }; |
| | | // 处理节点点击事件 |
| | | function handleNodeClick(data: any) { |
| | | console.log(data); |
| | | if (data.id === selectedNodeId.value) { |
| | | // 如果当前节点已经选中,则取消选中 |
| | | selectedNodeId.value = null; |
| | | console.log(selectedNodeId.value, "取消选中"); |
| | | } else { |
| | | // 否则选中当前节点 |
| | | selectedNodeId.value = data.id; |
| | | // form.selectName = data.name; |
| | | console.log(selectedNodeId.value, "当前选中的节点"); |
| | | } |
| | | } |
| | | //选择图层 |
| | | const handleCheckChange = (data, checked) => { |
| | | let son = estreeRef.value.getCheckedNodes(); |
| | | console.log(son); //选中的数据 |
| | | |
| | | store.commit("SET_CHECKLAYER", son); |
| | | }; |
| | | const clickdropdown = (res, e) => { |
| | | layerAttributeIsshow.value = false; |
| | | layerDetailIsshow.value = false; |
| | | layerObjData.value = e; |
| | | if (res == 2) { |
| | | layerAttributeIsshow.value = true; |
| | | layerObjData.value = e; |
| | | } else { |
| | | layerDetailIsshow.value = true; |
| | | } |
| | | console.log(res, e); |
| | | }; |
| | | const setSpatialClose = (res) => { |
| | | layerAttributeIsshow.value = res; |
| | | }; |
| | | const detailClose = (res) => { |
| | | layerDetailIsshow.value = res; |
| | | }; |
| | | //编辑图层树 |
| | | const addlayer = (res) => { |
| | | menuOption.push(res); |
| | | treeData.value = handleTree(menuOption, "id", "pid", "children"); |
| | | }; |
| | | //删除图层树 |
| | | 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(); |
| | | treeData.value = setTreeData(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.orderNum - b.orderNum; |
| | | }); |
| | | } |
| | | |
| | | 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> |
| | |
| | | } |
| | | } |
| | | .layerContent { |
| | | height: 635px; |
| | | padding: 0 8px; |
| | | overflow: auto; |
| | | overflow-y: auto; |
| | | } |
| | | |
| | | .slider-demo-block { |
| | | margin-top: 22px; |
| | | .layerContent::-webkit-scrollbar { |
| | | width: 8px; |
| | | } |
| | | .demonstration { |
| | | font-size: 12px; |
| | | font-weight: 300; |
| | | color: #d6e4ff; |
| | | .layerContent::-webkit-scrollbar-thumb { |
| | | border-radius: 10px; |
| | | background: rgba(0, 0, 0, 0.2); |
| | | } |
| | | /deep/ .el-slider__runway { |
| | | height: 2px; |
| | | |
| | | background: #73a1fa; |
| | | } |
| | | /deep/ .el-slider__bar { |
| | | height: 2px; |
| | | |
| | | background: #73a1fa; |
| | | } |
| | | /deep/ .el-slider__button { |
| | | width: 17px; |
| | | height: 18px; |
| | | border: 0; |
| | | background: url("../../assets/img/DBX.png") no-repeat center; |
| | | background-size: 100% 100%; |
| | | .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; |
| | | } |
| | | |
| | | .selectBox { |
| | | margin-top: 24px; |
| | | .selectTile { |
| | | padding-bottom: 6px; |
| | | } |
| | | .el-select { |
| | | width: 100%; |
| | | } |
| | | .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; |
| | | } |
| | |
| | | .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; |
| | | // .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> |