月球大数据地理空间分析展示平台-【前端】-月球2期前端
11
WX
2023-07-14 23aac3cf9903d404eb86310d502a0eeb5a68b407
11
已添加1个文件
已修改8个文件
772 ■■■■■ 文件已修改
package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/api.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layer/attributeList.vue 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layer/layerDetail.vue 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layer/layerManage.vue 300 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layer/layerSet.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/menus.vue 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json
@@ -15,7 +15,7 @@
    "amfe-flexible": "^2.2.1",
    "axios": "^1.3.4",
    "default-passive-events": "^2.0.0",
    "element-plus": "^2.3.0",
    "element-plus": "^2.3.8",
    "js-base64": "^3.7.5",
    "jsencrypt": "^3.3.2",
    "mitt": "^3.0.1",
src/api/api.js
@@ -8,13 +8,6 @@
 */
import request from "@/utils/request";
// æŸ¥è¯¢å¤©æ°”
export function layerList(params) {
  //请求地址
  return request.get("/select", { params: params });
}
//地名查询
export function dataQuery_selectByPage(params) {
  //请求地址
@@ -27,11 +20,6 @@
  return request.get("/dataQuery/selectFields", { params: params });
}
//获取RSA加密公钥
export function sign_getPublicKey(params) {
  //请求地址
@@ -40,5 +28,10 @@
//登录
export function sign_login(params) {
  //请求地址
  return request.post('/sign/login', params);
  return request.post("/sign/login", params);
}
//图层查询
export function layer_selectAll(params) {
  //请求地址
  return request.get("/layer/selectAll", { params: params });
}
src/utils/request.js
@@ -7,8 +7,10 @@
 */
import axios from "axios";
import { ElMessage, ElLoading } from "element-plus";
import { useRouter } from "vue-router";
import { getToken } from "@/utils/auth";
const router = useRouter();
// create an axios instance
const service = axios.create({
  baseURL: BASE_URL, // api的base_url
@@ -45,6 +47,11 @@
    // æŠ¥é”™æç¤º
    if (response.data.code !== 200) {
      ElMessage.error(response.data.msg);
    } else if (
      response.data.code !== 200 &&
      response.data.result == "用户未登录"
    ) {
      router.push({ path: "/login" });
    }
    return response.data;
  },
src/views/layer/attributeList.vue
@@ -2,14 +2,14 @@
  <div v-drag="true" class="spatialBox">
    <!--     v-resizable="'right, bottom'" -->
    <div class="spatialTitle">
      <label>空间查询</label>
      <label>属性</label>
      <el-icon @click="setSpatialClose" :size="20" style="cursor: pointer">
        <Close />
      </el-icon>
    </div>
    <div class="spatialContent">
      <div class="spatialTable">
        <el-table :data="tableData" style="width: 100%; height: 73%">
        <el-table :data="tableData" style="width: 100%; height: 82%">
          <el-table-column
            v-for="(item, index) in attributeData"
            :key="index"
@@ -83,9 +83,7 @@
//defineProps æ¥æŽ¥æ”¶ç»„件的传值
const props = defineProps({
  layerData: {
    type: Object,
  },
  layerData: Object,
});
const handleSizeChange = (res) => {
@@ -108,15 +106,12 @@
};
const setQueySpatialFields = async () => {
  console.log(props.layerData);
  const data = await dataQuery_selectFields({ name: listData.value.name });
  if (data.code != 200) {
    return ElMessage.error("字段查询失败");
  }
  console.log(data);
  attributeData.value = data.result;
  console.log(attributeData.value);
  attributeData.value = data.result;
  conditionChange(data.result[0]);
  setQueySpatialData();
@@ -158,7 +153,7 @@
watch(
  () => props.layerData,
  (nVal, oVal) => {
    console.log("值发生了变更", nVal, oVal);
    // console.log("值发生了变更", nVal, oVal);
    startQueryData();
  },
  { deep: true }
@@ -293,25 +288,25 @@
}
</style>
<style lang="less">
.el-scrollbar {
  background: rgba(7, 8, 14) !important;
  border: 1px solid #4472cb;
  color: #d6e4ff !important;
  box-shadow: inset 0px 1px 40px 1px rgba(38, 47, 71, 1);
  // .el-dropdown-menu {
  //   background: rgba(7, 8, 14, 0.8) !important;
  // }
  .el-select-dropdown__item {
    color: #d6e4ff;
  }
  .el-select-dropdown__item:hover {
    background: rgba(38, 47, 71, 1) !important;
  }
  .el-select-dropdown__item.hover,
  .el-select-dropdown__item:hover {
    background: rgba(38, 47, 71, 1) !important;
  }
}
// .el-scrollbar {
//   background: rgba(7, 8, 14) !important;
//   border: 1px solid #4472cb;
//   color: #d6e4ff !important;
//   box-shadow: inset 0px 1px 40px 1px rgba(38, 47, 71, 1);
//   // .el-dropdown-menu {
//   //   background: rgba(7, 8, 14, 0.8) !important;
//   // }
//   .el-select-dropdown__item {
//     color: #d6e4ff;
//   }
//   .el-select-dropdown__item:hover {
//     background: rgba(38, 47, 71, 1) !important;
//   }
//   .el-select-dropdown__item.hover,
//   .el-select-dropdown__item:hover {
//     background: rgba(38, 47, 71, 1) !important;
//   }
// }
.el-table__header-wrapper {
  border: 1px siolid #409eff;
}
src/views/layer/layerDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,170 @@
<template>
  <div class="content">
    <div class="title">
      <label>详细编辑</label>
      <el-icon @click="setSpatialClose" :size="20" style="cursor: pointer">
        <Close />
      </el-icon>
    </div>
    <div class="layer_box">
      <div class="check_box">
        <!-- <el-checkbox @change="handlCheckAllChange" v-model="layerState">{{
          layerName
        }}</el-checkbox> -->
        {{ layerData.name }}
        <img src="../../assets/img/layer.png" alt="" />
      </div>
      <div class="slider-demo-block">
        <div class="demonstration">透明度</div>
        <el-slider v-model="transparence" />
        <div class="demonstration">{{ transparence }}%</div>
      </div>
      <div class="selectBox">
        <div class="selectTile demonstration">拉伸方式</div>
        <el-select
          v-model="stretchValue"
          class="m-2"
          placeholder="Select"
          size="small"
        >
          <el-option
            v-for="item in stretchOptions"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        </el-select>
      </div>
    </div>
  </div>
</template>
<script lang="ts" setup>
import {
  ref,
  onMounted,
  onBeforeUnmount,
  reactive,
  defineProps,
  defineEmits,
} from "vue";
const stretchValue = ref("");
const transparence = ref(0);
let layerName = ref("图层名称");
let layerState = ref(false);
const stretchOptions = [
  {
    value: "Option1",
    label: "Option1",
  },
  {
    value: "Option2",
    label: "Option2",
  },
  {
    value: "Option3",
    label: "Option3",
  },
  {
    value: "Option4",
    label: "Option4",
  },
  {
    value: "Option5",
    label: "Option5",
  },
];
const emits = defineEmits(["detailClose"]);
//defineProps æ¥æŽ¥æ”¶ç»„件的传值
const props = defineProps({
  layerData: Object,
});
const setSpatialClose = () => {
  emits("detailClose", false);
};
const handlCheckAllChange = (res) => {};
</script>
<style lang="less" scoped>
.content {
  background: #1e2a3d;
  padding: 20px;
  height: 400px;
  margin-left: 20px;
  margin-top: 40px;
  .title {
    font-size: 18px;
    font-family: Source Han Sans CN;
    font-weight: 400;
    color: #ffffff;
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
  .layer_box {
    margin-top: 10px;
  }
}
.check_box {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-right: 50px;
  padding-top: 10px;
  font-size: 16px;
  color: #ffffff;
  img {
    width: 22px;
    height: 19px;
  }
}
.check_box .el-checkbox {
  font-size: 16px;
  color: #ffffff;
}
.check_box /deep/ .el-checkbox__input.is-checked .el-checkbox__inner {
  background-color: rgba(13, 255, 0, 1);
  border-color: rgba(41, 109, 255, 1);
}
.check_box /deep/ .el-checkbox__input.is-checked + .el-checkbox__label {
  color: #fff;
}
.slider-demo-block {
  margin-top: 22px;
}
.demonstration {
  font-size: 12px;
  font-weight: 300;
  color: #d6e4ff;
}
/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%;
  border-radius: 0;
}
.selectBox {
  margin-top: 24px;
  .selectTile {
    padding-bottom: 6px;
  }
  .el-select {
    width: 100%;
  }
}
/deep/.el-select-dropdown__item {
  font-size: 12px !important;
}
</style>
src/views/layer/layerManage.vue
@@ -13,52 +13,67 @@
    </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>
@@ -72,7 +87,9 @@
} 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("");
@@ -100,61 +117,63 @@
  },
];
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;
@@ -166,36 +185,72 @@
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>
@@ -239,46 +294,56 @@
    }
  }
  .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;
}
@@ -316,12 +381,35 @@
.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>
src/views/layer/layerSet.vue
@@ -10,16 +10,18 @@
        </div>
      </div>
      <div class="layerContent">
        <!-- <el-tree
        <el-tree
          node-key="id"
          :props="props"
          :highlight-current="true"
          :current-node-key="selectedNodeId"
          :data="menuOption"
          :data="layerTree"
          :expand-on-click-node="false"
          @node-click="handleNodeClick"
        /> -->
          ref="treeRef"
        />
        <div class="contentBox" v-for="(item, i) in menuOption" :key="i">
        <!-- <div class="contentBox" v-for="(item, i) in menuOption" :key="i">
          <div
            class="contentTile"
            @click.stop="selectList(item)"
@@ -54,7 +56,7 @@
              </div>
            </div>
          </div>
        </div>
        </div> -->
      </div>
    </div>
    <div class="edit_box">
@@ -93,8 +95,12 @@
              v-model="form.region"
              placeholder="请选择图层类型"
            >
              <el-option label="Zone one" value="shanghai" />
              <el-option label="Zone two" value="beijing" />
              <el-option
                v-for="(e, i) in stretchOptions"
                :label="e.label"
                :value="e.value"
                :key="i"
              />
            </el-select>
          </el-form-item>
@@ -125,11 +131,17 @@
import { Plus, Delete, Top, Bottom } from "@element-plus/icons-vue";
import { ElMessage } from "element-plus";
const stretchValue = ref("");
const emits = defineEmits(["SETstate"]);
const emits = defineEmits(["SETstate", "addlayer", "delLayer"]);
//defineProps æ¥æŽ¥æ”¶ç»„件的传值
const defineProp = defineProps({
  layerTree: Array,
});
let treeRef = ref();
const stretchOptions = [
  {
    value: "Option1",
    label: "Option1",
    value: "目录",
    label: "目录",
  },
  {
    value: "Option2",
@@ -149,30 +161,6 @@
  },
];
let menuOption = reactive([
  {
    name: "测试",
    isShow: false,
    checkedAll: false,
    id: 1,
    children: [
      {
        id: 2,
        layerState: false,
        name: "图层名称",
        layerUrl: "",
      },
    ],
  },
  {
    id: 3,
    name: "测试1",
    isShow: false,
    checkedAll: true,
    layerState: false,
    children: [],
  },
]);
const form = reactive({
  name: "",
  region: "",
@@ -181,12 +169,13 @@
  children: [],
});
const props = {
  label: "name",
  label: "cnName",
  children: "children",
};
// å½“前选中的节点 id
const selectedNodeId = ref(null as any); //做类型断言处理
const selectedObj = ref(null);
let menuOption = ref([]);
const handleCheckChange = (
  data: Tree,
  checked: boolean,
@@ -204,12 +193,11 @@
  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, "当前选中的节点");
    form.selectName = data.cnName;
    selectedObj.value = data;
  }
}
//新增
@@ -218,44 +206,32 @@
  for (var i = 0; i < 7; i++) {
    id += Math.floor(Math.random() * 10);
  }
  var addObj = {
    id: id,
    name: form.name,
    region: form.region,
    layerUrl: form.layerUrl,
    children: [],
    type: 2,
    parentId: null,
  };
  if (form.region == "目录") {
    addObj.type = 1;
  }
  if (t == "t") {
    menuOption.forEach((e, i) => {
      if (e.id == selectedNodeId.value) {
        menuOption.push({
          id: id,
          name: form.name,
          region: form.region,
          layerUrl: form.layerUrl,
          children: [],
        });
      } else {
        e.children.forEach((v) => {
          if (v.id == selectedNodeId.value) {
            menuOption[i].children.push({
              id: id,
              name: form.name,
              region: form.region,
              layerUrl: form.layerUrl,
              children: [],
            });
          }
        });
      }
    });
    addObj.parentId = selectedObj.value.parentId;
  } else {
    // if(){
    //   return
    // }
    addObj.parentId = selectedNodeId.value;
  }
  emits("addlayer", addObj);
};
//删除
const delLayer = () => {
  menuOption = menuOption.filter((item) => {
    return item.id != selectedNodeId.value;
  });
  console.log(menuOption);
  console.log(selectedObj.value);
  console.log(treeRef.value.getNode(selectedObj.value));
  treeRef.value.remove(treeRef.value.getNode(selectedObj.value));
  // emits("delLayer", selectedNodeId.value);
};
//图层设置弹框
const layerSet = () => {};
@@ -264,45 +240,11 @@
  emits("SETstate", false);
};
const handlIsShow = (res: string) => {
  menuOption.forEach((e) => {
  menuOption.value.forEach((e) => {
    if (e.name == res) {
      e.isShow = !e.isShow;
    }
  });
};
//选择列表
const selectList = (v) => {
  // selectedNodeId.value = v.id;
  console.log(v);
  if (v.id === selectedNodeId.value) {
    // å¦‚果当前节点已经选中,则取消选中
    selectedNodeId.value = null;
    console.log(selectedNodeId.value, "取消选中");
  } else {
    // å¦åˆ™é€‰ä¸­å½“前节点
    selectedNodeId.value = v.id;
    form.selectName = v.name;
    selectedObj.value = v;
    console.log(selectedNodeId.value, "当前选中的节点");
  }
};
const remove = (node: Node, data: Tree) => {
  const parent = node.parent;
  const children: Tree[] = parent.data.children || parent.data;
  const index = children.findIndex((d) => d.id === data.id);
  children.splice(index, 1);
  // menuOption.value = [...menuOption.value];
};
let id = 1000;
const append = (data: Tree) => {
  const newChild = { id: id++, name: "testtest", children: [] };
  if (!data.children) {
    data.children = [];
  }
  data.children.push(newChild);
  // console.log(data);
  // menuOption = [...menuOption];
  // console.log(menuOption);
};
</script>
@@ -524,12 +466,13 @@
    padding: 4px;
  }
}
/deep/
  .el-tree--highlight-current
  .el-tree-node.is-current
  > .el-tree-node__content {
  background: rgba(104, 156, 255, 0.5) !important;
}
// .layerContent
//   /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;
}
src/views/login.vue
@@ -64,22 +64,24 @@
            />
          </el-form-item>
          <el-form-item prop="verify">
            <div style="display: flex;justify-content: space-between; width: 100%; ">
            <div
              style="display: flex; justify-content: space-between; width: 100%"
            >
              <el-input
                placeholder="请输入验证码(忽略大小写)"
                v-model="ruleForm.verify"
                style="width:68%;"
                style="width: 68%"
              />
              <valid-code style="width:27%;"></valid-code>
              <valid-code style="width: 27%"></valid-code>
            </div>
          </el-form-item>
          <el-form-item>
            <el-button
              type="primary"
              class="nobr loginbtn btnbox"
              @click="submitForm(ruleFormRef)"
            >登录</el-button>
              >登录</el-button
            >
          </el-form-item>
        </el-form>
      </div>
@@ -114,8 +116,8 @@
const reportUrl = ref("");
const ruleForm = reactive({
  user: "",
  passWorld: "",
  user: "admin",
  passWorld: "Admin@1234_lf",
  verify: "",
});
const validateVerify = (rule: any, value: any, callback: any) => {
src/views/menus.vue
@@ -1,25 +1,13 @@
<template>
  <div
    class="menus"
    v-show="fullScreen"
  >
  <div class="menus" v-show="fullScreen">
    <div class="logo_box">
      <img
        src="../assets/img/logo.png"
        alt=""
        class="logo"
      />
      <img src="../assets/img/logo.png" alt="" class="logo" />
      <div class="logo_name">
        <h3>月球大数据地理空间分析展示平台</h3>
        <img
          src="../assets/img/logob.png"
          alt=""
          class="logo_name_b"
        />
        <img src="../assets/img/logob.png" alt="" class="logo_name_b" />
      </div>
    </div>
    <div class="menus_box">
      <div class="menu_Image_box">
        <div
          class="imgBox"
@@ -39,31 +27,19 @@
          />
        </div>
      </div>
    </div>
  </div>
  <div
    class="content_box"
    v-show="fullScreen"
  >
    <layer-manage
      @setCloseLayer="setCloseLayer"
      v-if="checkMenuFlag == 'l1'"
    > </layer-manage>
  <div class="content_box" v-show="fullScreen">
    <layer-manage @setCloseLayer="setCloseLayer" v-if="checkMenuFlag == 'l1'">
    </layer-manage>
    <plotting v-show="checkMenuFlag == 'l2'"> </plotting>
    <baseMapSwitching v-show="checkMenuFlag == 'l5'"> </baseMapSwitching>
    <search v-if="thematicMapBtnState"> </search>
  </div>
  <top-btn
    v-show="fullScreen"
    v-if="thematicMapBtnState"
  ></top-btn>
  <top-btn v-show="fullScreen" v-if="thematicMapBtnState"></top-btn>
  <thematic-map v-show="!thematicMapBtnState"></thematic-map>
  <div
    class="fullScreen_btn"
    v-show="!fullScreen"
    @click="screen"
  ></div>
  <div class="fullScreen_btn" v-show="!fullScreen" @click="screen"></div>
</template>
<script lang="ts" setup>