月球大数据地理空间分析展示平台-【前端】-月球2期前端
WX
2023-09-04 6995a96cc2380db13bb2295de107294258ae4c63
Merge branch 'master' of http://192.168.20.92:8888/r/PM20230220027_Web
已添加1个文件
已修改24个文件
685 ■■■■ 文件已修改
src/App.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/img/图层 18.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/Map/menuTool.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/Map/olMap.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/Map/rightServer.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mouseMove.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/thematicMap/thematicMap.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/topBtn.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/index.ts 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/auth.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Index.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Map/mapView.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/baseMapSwitching/baseMapSwitching.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/export/exportList.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/export/exportMap.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layer/attributeList.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layer/doubleLayer.vue 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layer/layerDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layer/layerManage.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layer/layerSet.vue 246 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/menus.vue 134 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/plotting/plotting.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/query/SpatialQuery.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/search/search.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue
@@ -11,9 +11,13 @@
  defineEmits,
} from "vue";
import router from "./router";
import store from "@/store";
onMounted(() => {
  // router.push("/Login");
  var val = window.sessionStorage.getItem("Admin-Token");
  if (val) {
    store.state.uname = JSON.parse(val).uname;
  }
});
</script>
src/assets/img/ͼ²ã 18.png
src/assets/js/Map/menuTool.js
@@ -309,6 +309,7 @@
      case "l3": //在线制图
        store.state.isShowMap = true;
        this.setThematicMap();
        break;
      case "l4":
        store.state.isShowMap = true;
@@ -323,11 +324,17 @@
  },
  thematicTools(res) {
    switch (res.id) {
      case "t1":
        store.state.setLayerManager = !store.state.setLayerManager;
        break;
      case "t2":
        this.createSimpleGraphic("rectangle", "square");
        break;
      case "t3":
        this.delRectangle();
        break;
      case "t4":
        store.state.setExportList = !store.state.setExportList
        break;
    }
  },
@@ -360,6 +367,9 @@
    var north1 = ss[3];
    var south1 = ss[1];
    var geometry = Cesium.Rectangle.fromDegrees(west1, south1, east1, north1);
    Viewer.camera.setView({
      destination: Cesium.Rectangle.fromDegrees(west, south, east, north),
    });
@@ -387,6 +397,7 @@
    // var handle = new SmartEarth.Cesium.ScreenSpaceEventHandler(
    //   earthCtrl.viewer.scene.canvas
    // );
  },
  //坐标定位
@@ -422,6 +433,7 @@
    window.rightViewer.scene.skyAtmosphere.show = false;
    const compass = document.getElementsByClassName("bottom_btn")[0];
    compass.style.right = "calc(50% + 70px)";
    compass.style.positions = "absolute";
    store.state.doubleMap = true;
    setTimeout(() => {
      window.functionGetLayer({
src/assets/js/Map/olMap.js
@@ -196,7 +196,27 @@
    });
    if (this.map) {
      this.map.addLayer(this.Layer);
      var that = this;
      window.olMap = this.map;
      window.layer = this.Layer
      setTimeout(() => {
        that.getLayersExtent();
      }, 1000)
      // this.Layer.getSource().on('addfeature', function () {
      //   this.map.getView().fit(this.Layer.getSource().getExtent());
      // });
    }
  },
  getLayersExtent() {
    // ç¼©æ”¾è‡³å›¾å±‚范围
    this.map.getView().fit(this.Layer.renderer_.renderedExtent_);
  }
};
export default olMap;
src/assets/js/Map/rightServer.js
@@ -353,5 +353,53 @@
        let img_layer = window.rightViewer.imageryLayers.addImageryProvider(layer);
        this.layerList.push({ id: res.id, layerData: img_layer, type: "wmts" });
    },
    addGeoServerMmsLayers(layer, url) {
        var that = this
        var getFeatureInfoFormat = new SmartEarth.Cesium.GetFeatureInfoFormat("html", null, function (html) {
            that.getFeatureInfo(html)
        });
        let wmslayer = new SmartEarth.Cesium.WebMapServiceImageryProvider({
            url: url,
            layers: layer.toString(),
            getFeatureInfoParameters: { info_format: 'text/html' },
            enablePickFeatures: true,
            getFeatureInfoFormats: [getFeatureInfoFormat],
            parameters: {
                transparent: true,
                format: "image/png",
                srs: "EPSG:104903",
                styles: "",
            },
            tileWidth: 512,
            tileHeight: 512,
        });
        wmslayer.name = `Wms_Layer_geo`;
        let img_layer = window.rightViewer.imageryLayers.addImageryProvider(wmslayer);
        this.layerList.push({ id: 1001011, layerData: img_layer, type: "wmts" });
    },
    delLayerAll() {
        this.layerList.forEach((e, i) => {
            switch (e.type) {
                case "wmts":
                    window.rightViewer.imageryLayers.remove(e.layerData);
                    break;
                case "tms":
                    window.rightViewer.imageryLayers.remove(e.layerData);
                    break;
                case "dem":
                    window.rightViewer.terrainProvider = new Cesium.EllipsoidTerrainProvider(
                        {}
                    );
                    break;
                case "tileset":
                    window.rightViewer.scene.primitives.remove(e.layerData)
                    break;
            }
            this.layerList.splice(i, 1);
        });
    },
};
export default rightServer;
src/components/mouseMove.vue
@@ -141,7 +141,7 @@
    // å½“前高度
    let height = Viewer.camera.positionCartographic.height;
    heightlevel = getLevel(height);
    console.log(heightlevel);
    if (heightlevel == 6) {
      gridDel();
      grid(5);
@@ -178,7 +178,7 @@
  //     ])
  //   );
  // }
  // console.log(ps);
  // let polylineGeometry = new Cesium.PolylineGeometry({
  //   positions: ps,
  //   width: 5,
@@ -203,16 +203,6 @@
const grid = (degree) => {
  const entities = Viewer.entities;
  for (let longitude = -180; longitude <= 180; longitude += degree) {
    console.log(
      Cesium.Cartesian3.fromDegreesArray([
        longitude,
        -90,
        longitude,
        0,
        longitude,
        90,
      ])
    );
    let text = "";
    if (longitude === 0) {
      text = "0";
@@ -260,7 +250,7 @@
    if (lat === 0) {
      text = "";
    }
    // console.log(lat, "---lat");
    let obj = entities.add({
      position: Cesium.Cartesian3.fromDegrees(0, lat),
      polyline: {
@@ -291,7 +281,7 @@
    });
    entitiesObj.latLine.push(obj);
  }
  console.log(entitiesObj);
  // æŠ—锯齿
  if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
    //判断是否支持图像渲染像素化处理
src/components/thematicMap/thematicMap.vue
@@ -56,11 +56,9 @@
<style lang="less" scoped>
.top_btn {
  position: absolute;
  top: 23px;
  right: 0px;
  display: flex;
  cursor: pointer;
  .menu_Box {
    margin-right: 104px;
    display: flex;
src/components/topBtn.vue
@@ -121,9 +121,9 @@
<style lang="less" scoped>
.top_btn {
  position: absolute;
  top: 23px;
  right: 0px;
  // position: absolute;
  // top: 23px;
  // right: 0px;
  display: flex;
  cursor: pointer;
  z-index: 30;
src/store/index.ts
@@ -30,6 +30,8 @@
    restLayer: false,
    isShowMap: true,
    spatialTitle: null,
    setExportList: false,
    setLayerManager: false,
  },
  mutations: {
    //获取登录Code
@@ -44,7 +46,11 @@
    },
    SET_TOKEN(state, token) {
      state.token = token;
      setToken(token);
      var obj = {
        token: token,
        uname: state.uname,
      };
      setToken(JSON.stringify(obj));
    },
    SET_CHECKLAYER(state, layers) {
      state.chekNowLayers = layers;
src/utils/auth.js
@@ -2,10 +2,15 @@
export function getToken() {
    // console.log(window.sessionStorage.getItem(TokenKey));
    return window.sessionStorage.getItem(TokenKey);
    var val = window.sessionStorage.getItem(TokenKey)
    if (val) {
        return JSON.parse(val).token;
    }
    return val;
}
export function setToken(token) {
    debugger
    return window.sessionStorage.setItem(TokenKey, token);
}
src/views/Index.vue
@@ -5,6 +5,7 @@
      v-if="layerExportshow"
      @SETexportMap="SETexportMap"
    ></export-map>
    <export-list v-if="store.state.setExportList"></export-list>
    <menus></menus>
    <bottom-btn v-if="store.state.isShowMap"></bottom-btn>
    <mouse-move v-if="store.state.isShowMap"></mouse-move>
@@ -57,6 +58,8 @@
import mapclock from "@/views/mapClock/index.vue";
//矢量数据信息弹窗
import detailsQuery from "@/views/query/detailsQuery.vue";
//出图列表
import exportList from "./export/exportList.vue";
import router from "@/router";
import { useStore } from "vuex"; // å¼•å…¥useStore æ–¹æ³•
src/views/Map/mapView.vue
@@ -1,9 +1,7 @@
<template>
  <div
    id="cesiumContainer"
    class="cesiumContainer"
  >
  <div class="MapViewBox">
    <div id="cesiumContainer">
    </div>
  </div>
</template>
@@ -35,7 +33,7 @@
</script>
<style  lang="less" scoped>
.cesiumContainer {
.MapViewBox {
  width: 100%;
  height: 100%;
  margin: 0;
src/views/baseMapSwitching/baseMapSwitching.vue
@@ -2,7 +2,10 @@
  <div class="baseMapSwitching">
    <div class="baseMapSwitchingTitle">
      <div class="tileLeft">
        <div class="titleImg">
        <div
          class="titleImg"
          @click="setCloseBaseMap"
        >
          <ArrowLeft />
        </div>
        <div class="titleLable">投影图层管理</div>
@@ -42,10 +45,10 @@
import projection from "@/assets/js/Map/projectionServer";
import olMap from "@/assets/js/Map/olMap";
const emits = defineEmits(["setCloseBaseMap"]);
let list = ref([]);
const activceIndex = ref();
const setProjectionLayerChange = (res) => {
  console.log(res);
  let projection = {
    code: "",
    extent: [],
@@ -86,6 +89,9 @@
  // }
};
getProjectionLayer();
const setCloseBaseMap = () => {
  emits("setCloseBaseMap", false);
};
</script>
<style lang="less" scoped>
src/views/export/exportList.vue
@@ -25,8 +25,13 @@
  defineEmits,
} from "vue";
import { User, Lock } from "@element-plus/icons-vue";
import { useStore } from "vuex"; // å¼•å…¥useStore æ–¹æ³•
const store = useStore(); // è¯¥æ–¹æ³•用于返回store å®žä¾‹
const emits = defineEmits(["SETspatialClose"]);
const setSpatialClose = () => {};
const setSpatialClose = () => {
  store.state.setExportList = false;
};
</script>
  
  <style lang="less" scoped>
@@ -35,11 +40,11 @@
  height: 400px;
  display: flex;
  position: absolute;
  bottom: 5%;
  right: 5%;
  bottom: 10px;
  right: 50px;
  background: rgba(7, 8, 14, 0.8);
  border: 1px solid #d6e4ff;
  z-index: 10;
  z-index: 50;
  box-shadow: inset 0px 10px 40px 10px rgba(38, 47, 71, 1);
  .exportTitle {
    padding: 10px;
src/views/export/exportMap.vue
@@ -113,7 +113,6 @@
    </div>
  </div>
</template>
<script lang="ts" setup>
import store from "@/store";
import {
@@ -139,7 +138,6 @@
  // window.Viewer.scene.render();
  const myCanvas = window.Viewer.scene.canvas;
  var res = canvas2image.convertToImage(myCanvas, "869", "783", "png");
  debugger;
  url.value = res.src;
};
onMounted((res) => {
@@ -184,7 +182,7 @@
  overflow: auto;
  .contentTitle {
    font-size: 20px;
    font-size: 16px;
    font-family: Source Han Sans CN;
    font-weight: 300;
    color: #ffffff;
@@ -221,6 +219,8 @@
    margin-top: 9px;
    margin-left: 16px;
    margin-right: 9px;
    font-size: 16px;
    font-family: Source Han Sans CN;
  }
}
.menuButton {
@@ -228,6 +228,7 @@
  display: flex;
  justify-content: center;
  align-items: center;
  .el-button {
    height: 37px;
    background: rgba(104, 156, 255, 0.2);
@@ -248,13 +249,13 @@
.menuTitle {
  width: calc(100% - 30px);
  height: 42px;
  background: #0e151f;
  font-size: 24px;
  background: #0e151f;
  font-size: 18px;
  font-family: Source Han Sans CN;
  font-weight: 400;
  color: #ffffff;
  padding: 10px;
  padding-left: 28px;
}
::-webkit-scrollbar {
src/views/layer/attributeList.vue
@@ -304,7 +304,6 @@
      value: std[i],
    });
  }
  debugger;
  condOption.value = str;
  formSql.value.type = std[0];
};
@@ -323,7 +322,6 @@
watch(
  () => props.layerData,
  (nVal, oVal) => {
    // console.log("值发生了变更", nVal, oVal);
    startQueryData();
  },
  { deep: true }
src/views/layer/doubleLayer.vue
@@ -148,10 +148,29 @@
  let isCheck = checked.checkedKeys.indexOf(data.id) > -1;
  // this.setVisiable(data, isCheck);
  let son = estreeRef.value.getCheckedNodes();
  let son = estreeRef.value.getCheckedNodes().reverse();
  rightServer.delLayerAll();
  var setGeoWms = [];
  var url = null;
  for (var i in son) {
    var layerArr = son[i];
    layerArr.checked = true;
    if (layerArr.category == 2 && layerArr.type == 3) {
      if (layerArr.tab != "moon:geo_mappable_unit") {
        setGeoWms.push(layerArr.tab);
        url = layerArr.url;
      }
    } else {
      rightServer.addTreeData(layerArr);
    }
  }
  if (setGeoWms.length > 0) {
    rightServer.addGeoServerMmsLayers(setGeoWms.reverse(), url);
  }
  store.commit("SET_CHECKLAYER", son);
  setVisiable(data, isCheck);
  //setVisiable(data, isCheck);
  // server.addLayer(layerArr, isCheck);
};
@@ -170,7 +189,7 @@
  }
  if (!treeNode.isAdd) {
    rightServer.addTreeData(treeNode);
    //rightServer.addTreeData(treeNode);
    return;
  }
};
@@ -191,7 +210,6 @@
  if (res == 2) {
    layerAttributeIsshow.value = true;
    debugger;
    store.state.tab = e;
  } else {
    if (!e.checked) {
@@ -270,13 +288,29 @@
      }
    });
    DefaultId.value = std;
    //添加默认选中图层
    layerListData.value = dt.result;
    defaultLayer(dt.result);
    var setGeoWms = [];
    var url = null;
    for (var i in dt.result) {
      var layer = dt.result[i];
      if (layer.category == 2 && layer.type == 3) {
        if (layer.tab != "moon:geo_mappable_unit") {
          setGeoWms.push(layer.tab);
          url = layer.url;
        }
      } else {
        rightServer.addTreeData(layer);
      }
    }
    if (setGeoWms.length > 0) {
      rightServer.addGeoServerMmsLayers(setGeoWms.reverse(), url);
    }
    nextTick(() => {
      let son = estreeRef.value.getCheckedNodes();
      store.commit("SET_CHECKLAYER", son);
    });
  }
src/views/layer/layerDetail.vue
@@ -195,7 +195,7 @@
  //   let aa = stretchOptions[index];
  //   let value = aa.value;
  //   if (brand === value) {
  //     console.log(select.value.$el.children);
  //     select.value.$el.children[0].children[0].setAttribute(
  //       "style",
  //       "background:url(" +
src/views/layer/layerManage.vue
@@ -108,7 +108,7 @@
import { ElMessage } from "element-plus";
const store = useStore(); // è¯¥æ–¹æ³•用于返回store å®žä¾‹
const stretchValue = ref("");
const emits = defineEmits(["setCloseLayer"]);
let estreeRef = ref();
const setLayer = ref();
const transparence = ref(0);
@@ -126,7 +126,7 @@
const layerObjData = ref(null);
// å½“前选中的节点 id
const selectedNodeId = ref(null as any); //做类型断言处理
const emits = defineEmits(["setCloseLayer"]);
//默认选中id
const DefaultId = ref([]);
//图层设置弹框
@@ -138,6 +138,7 @@
  layerSetIsshow.value = res;
};
const setCloseLayer = () => {
  store.state.setLayerManager = false;
  emits("setCloseLayer", false);
};
//选择图层
@@ -166,7 +167,6 @@
    }
  }
  if (setGeoWms.length > 0) {
    console.log(setGeoWms);
    server.addGeoServerMmsLayers(setGeoWms.reverse(), url);
  }
  store.commit("SET_CHECKLAYER", son);
@@ -311,7 +311,6 @@
      }
    }
    if (setGeoWms.length > 0) {
      console.log(setGeoWms);
      server.addGeoServerMmsLayers(setGeoWms.reverse(), url);
    }
    //;
@@ -350,6 +349,7 @@
  },
  { deep: true }
);
// getLayer();
onMounted(() => {
  window.setLayer = getLayer;
src/views/layer/layerSet.vue
@@ -3,7 +3,10 @@
    <div class="layerBox">
      <div class="layerTitle">
        <div class="tileLeft">
          <div class="titleImg" @click="editState">
          <div
            class="titleImg"
            @click="editState"
          >
            <ArrowLeft />
          </div>
          <div class="titleLable">图层编辑</div>
@@ -19,57 +22,78 @@
          :expand-on-click-node="false"
          @node-click="handleNodeClick"
          ref="treeRef"
          style="font-size: 16px;"
        />
      </div>
    </div>
    <div class="edit_box">
      <div class="edit_box_btn btnstyle">
        <el-button type="primary" :icon="Plus" @click="insertLayerData(1)"
          >新增同级</el-button
        >
        <el-button type="primary" :icon="Plus" @click="insertLayerData(2)"
          >新增子级</el-button
        >
        <el-button
          type="primary"
          :icon="Plus"
          @click="insertLayerData(1)"
        >新增同级</el-button>
        <el-button
          type="primary"
          :icon="Plus"
          @click="insertLayerData(2)"
        >新增子级</el-button>
        <el-button
          type="primary"
          :icon="Delete"
          class="delbtn"
          @click="delLayer"
          >删除</el-button
        >
        <el-button type="primary" :icon="Top" @click="move(1)"
          >向上移动</el-button
        >
        <el-button type="primary" :icon="Bottom" @click="move(2)"
          >向下移动</el-button
        >
        >删除</el-button>
        <el-button
          type="primary"
          :icon="Top"
          @click="move(1)"
        >向上移动</el-button>
        <el-button
          type="primary"
          :icon="Bottom"
          @click="move(2)"
        >向下移动</el-button>
      </div>
      <div class="edit_box_form">
        <el-form :model="formInline" label-width="120px">
        <el-form
          :model="formInline"
          label-width="120px"
        >
          <el-form-item label="图层类型">
            <el-select style="width: 100%" v-model="formInline.isLayer">
              <el-option label="图层组" value="0"></el-option>
              <el-option label="图层" value="1"></el-option>
            <el-select
              style="width: 100%"
              v-model="formInline.isLayer"
            >
              <el-option
                label="图层组"
                value="0"
              ></el-option>
              <el-option
                label="图层"
                value="1"
              ></el-option>
            </el-select>
          </el-form-item>
          <!-- æœåŠ¡èµ„æº-->
          <el-form-item v-show="formInline.isLayer == 1" label="服务资源">
          <el-form-item
            v-show="formInline.isLayer == 1"
            label="服务资源"
          >
            <el-button
              size="small"
              class="serviceButton"
              @click="setServiceChange('0')"
              key="0"
              :class="{ serviceActive: !serviceActive }"
              >否</el-button
            >
            >否</el-button>
            <el-button
              size="small"
              class="serviceButton"
              @click="setServiceChange('1')"
              key="1"
              :class="{ serviceActive: serviceActive }"
              >是</el-button
            >
            >是</el-button>
          </el-form-item>
          <el-form-item label="图层名称">
@@ -79,7 +103,10 @@
            />
          </el-form-item>
          <!-- æœåŠ¡ç±»åˆ« -->
          <el-form-item v-show="formInline.isLayer == 1" label="服务类别">
          <el-form-item
            v-show="formInline.isLayer == 1"
            label="服务类别"
          >
            <el-select
              style="width: 100%"
              v-model="formInline.category"
@@ -94,7 +121,10 @@
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="表名称" v-show="formInline.category == 2">
          <el-form-item
            label="表名称"
            v-show="formInline.category == 2"
          >
            <el-input
              v-model="formInline.tab"
              placeholder="请输入表名称"
@@ -102,7 +132,10 @@
            />
          </el-form-item>
          <!-- æ•°æ®ç±»åž‹ -->
          <el-form-item v-show="formInline.isLayer == 1" label="数据类型">
          <el-form-item
            v-show="formInline.isLayer == 1"
            label="数据类型"
          >
            <el-select
              style="width: 100%"
              v-model="formInline.data"
@@ -119,7 +152,10 @@
            </el-select>
          </el-form-item>
          <!-- æ•°æ®ç±»åž‹ -->
          <el-form-item v-show="formInline.isLayer == 1" label="服务类型">
          <el-form-item
            v-show="formInline.isLayer == 1"
            label="服务类型"
          >
            <el-select
              style="width: 100%"
              v-model="formInline.type"
@@ -135,7 +171,10 @@
            </el-select>
          </el-form-item>
          <el-form-item label="服务地址" v-show="formInline.isLayer == 1">
          <el-form-item
            label="服务地址"
            v-show="formInline.isLayer == 1"
          >
            <el-input
              v-model="formInline.serviceUrl"
              placeholder="请输入服务地址"
@@ -144,40 +183,63 @@
          </el-form-item>
          <el-form-item>
            <div class="btnstyle editBtn">
              <el-button type="primary" @click="onSubmit">确定</el-button>
              <el-button class="delbtn" @click="updateRest">取消</el-button>
              <el-button
                type="primary"
                @click="onSubmit"
              >确定</el-button>
              <el-button
                class="delbtn"
                @click="updateRest"
              >取消</el-button>
            </div>
          </el-form-item>
        </el-form>
      </div>
    </div>
    <el-dialog title="新增" v-model="dialogVisible" width="50%">
    <el-dialog
      title="新增"
      v-model="dialogVisible"
      width="50%"
    >
      <div style="width: 100%; max-height: 63vh; overflow-y: auto">
        <el-form :model="insertData" label-width="120px">
        <el-form
          :model="insertData"
          label-width="120px"
        >
          <el-form-item label="图层类型">
            <el-select style="width: 100%" v-model="insertData.isLayer">
              <el-option label="图层组" value="0"></el-option>
              <el-option label="图层" value="1"></el-option>
            <el-select
              style="width: 100%"
              v-model="insertData.isLayer"
            >
              <el-option
                label="图层组"
                value="0"
              ></el-option>
              <el-option
                label="图层"
                value="1"
              ></el-option>
            </el-select>
          </el-form-item>
          <!-- æœåŠ¡èµ„æº-->
          <el-form-item v-show="insertData.isLayer == 1" label="服务资源">
          <el-form-item
            v-show="insertData.isLayer == 1"
            label="服务资源"
          >
            <el-button
              size="small"
              class="serviceButton"
              @click="setInsertServiceChange('0')"
              key="0"
              :class="{ serviceActive: !insertServiceActive }"
              >否</el-button
            >
            >否</el-button>
            <el-button
              size="small"
              class="serviceButton"
              @click="setInsertServiceChange('1')"
              key="1"
              :class="{ serviceActive: insertServiceActive }"
              >是</el-button
            >
            >是</el-button>
          </el-form-item>
          <el-form-item label="图层名称">
@@ -187,7 +249,10 @@
            />
          </el-form-item>
          <!-- æœåŠ¡ç±»åˆ« -->
          <el-form-item v-show="insertData.isLayer == 1" label="服务类别">
          <el-form-item
            v-show="insertData.isLayer == 1"
            label="服务类别"
          >
            <el-select
              style="width: 100%"
              v-model="insertData.category"
@@ -202,7 +267,10 @@
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="表名称" v-show="insertData.category == 2">
          <el-form-item
            label="表名称"
            v-show="insertData.category == 2"
          >
            <el-input
              v-model="insertData.tab"
              placeholder="请输入表名称"
@@ -210,7 +278,10 @@
            />
          </el-form-item>
          <!-- æ•°æ®ç±»åž‹ -->
          <el-form-item v-show="insertData.isLayer == 1" label="数据类型">
          <el-form-item
            v-show="insertData.isLayer == 1"
            label="数据类型"
          >
            <el-select
              style="width: 100%"
              v-model="insertData.data"
@@ -227,7 +298,10 @@
            </el-select>
          </el-form-item>
          <!-- æ•°æ®ç±»åž‹ -->
          <el-form-item v-show="insertData.isLayer == 1" label="服务类型">
          <el-form-item
            v-show="insertData.isLayer == 1"
            label="服务类型"
          >
            <el-select
              style="width: 100%"
              v-model="insertData.type"
@@ -243,7 +317,10 @@
            </el-select>
          </el-form-item>
          <el-form-item label="服务地址" v-show="insertData.isLayer == 1">
          <el-form-item
            label="服务地址"
            v-show="insertData.isLayer == 1"
          >
            <el-input
              v-model="insertData.serviceUrl"
              placeholder="请输入服务地址"
@@ -252,44 +329,61 @@
          </el-form-item>
          <el-form-item>
            <div class="btnstyle editBtn">
              <el-button type="primary" size="small" @click="added()"
                >确定</el-button
              >
              <el-button
                type="primary"
                size="small"
                @click="added()"
              >确定</el-button>
              <el-button
                class="delbtn"
                type="info"
                size="small"
                @click="submitCancel()"
                >取消</el-button
              >
              >取消</el-button>
            </div>
          </el-form-item>
        </el-form>
      </div>
    </el-dialog>
    <el-dialog v-model="dialogService" width="50%" :show-close="false">
    <el-dialog
      v-model="dialogService"
      width="50%"
      :show-close="false"
    >
      <div style="width: 100%; max-height: 63vh; overflow-y: auto">
        <div
          style="display: flex; justify-content: space-between"
          class="tableForm"
        >
          <div>
            <el-input size="small" v-model="listData.name">
            <el-input
              size="small"
              v-model="listData.name"
            >
              <template #suffix>
                <el-icon
                  class="el-input__icon el-icon-search"
                  @click="setServiceQuery"
                  ><search
                /></el-icon>
                >
                  <search />
                </el-icon>
              </template>
            </el-input>
          </div>
          <div class="btnstyle">
            <el-button type="info" size="small" @click="setServiceRest">
            <el-button
              type="info"
              size="small"
              @click="setServiceRest"
            >
              é‡ç½®
            </el-button>
            <el-button type="primary" size="small" @click="setServiceConfirm">
            <el-button
              type="primary"
              size="small"
              @click="setServiceConfirm"
            >
              ç¡®è®¤
            </el-button>
            <el-button
@@ -302,15 +396,26 @@
            </el-button>
          </div>
        </div>
        <el-table ref="multipleTable" :data="tableData" @select="selectChange">
          <el-table-column type="selection" width="55"> </el-table-column>
        <el-table
          ref="multipleTable"
          :data="tableData"
          @select="selectChange"
        >
          <el-table-column
            type="selection"
            width="55"
          > </el-table-column>
          <el-table-column
            align="center"
            type="index"
            label="序号"
            width="70px"
          />
          <el-table-column align="center" prop="cnName" label="资源名称" />
          <el-table-column
            align="center"
            prop="cnName"
            label="资源名称"
          />
          <el-table-column
            align="center"
@@ -325,7 +430,10 @@
            :formatter="setResType"
          />
        </el-table>
        <div class="pagination_box" style="margin-top: 15px">
        <div
          class="pagination_box"
          style="margin-top: 15px"
        >
          <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
@@ -685,9 +793,7 @@
  data: Tree,
  checked: boolean,
  indeterminate: boolean
) => {
  console.log(data, checked, indeterminate);
};
) => {};
const onSubmit = () => {
  if (!checkedStaste) {
    return ElMessage.warning("请先点击选中相应图层");
@@ -700,9 +806,6 @@
  copyNode.nextSibling = { ...node.nextSibling };
  copyNode.parent = { ...node.parent };
  // console.log(1111111111111, copyNode.previousSibling);
  // console.log(2222222222222, copyNode.nextSibling);
  // console.log(3333333333333, copyNode.parent);
  if (Object.keys(copyNode.previousSibling).length !== 0) {
    // åˆ é™¤åŽŸå…ˆçš„node
    treeRef.value.remove(node.data);
@@ -735,8 +838,6 @@
// å¤„理节点点击事件
function handleNodeClick(data: any) {
  console.log(data);
  if (data.id === selectedNodeId.value) {
    // å¦‚果当前节点已经选中,则取消选中
    selectedNodeId.value = null;
@@ -937,7 +1038,7 @@
      align-items: center;
      .titleLable {
        font-size: 24px;
        font-size: 18px;
        font-family: Source Han Sans CN;
        font-weight: 400;
        color: #ffffff;
@@ -957,6 +1058,11 @@
    height: 92%;
    overflow: auto;
  }
  /deep/.el-tree-node__content {
    font-size: 16px;
  }
  .layerContent::-webkit-scrollbar {
    width: 8px;
  }
src/views/login.vue
@@ -64,9 +64,7 @@
            />
          </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"
@@ -80,8 +78,7 @@
              type="primary"
              class="nobr loginbtn btnbox"
              @click="submitForm(ruleFormRef)"
              >登录</el-button
            >
            >登录</el-button>
          </el-form-item>
        </el-form>
      </div>
@@ -156,11 +153,9 @@
  formEl.validate((valid) => {
    if (valid) {
      console.log("submit!");
      setLogin();
    } else {
      emitter.emit("handleDraw", true);
      console.log("erro submit!");
      return false;
    }
  });
@@ -172,6 +167,7 @@
  };
  sign_login(data).then((res) => {
    if (res.code != 200) return;
    store.commit("SET_UNAME", res.result.uname);
    store.commit("SET_TOKEN", res.result.token);
    router.push("/");
src/views/menus.vue
@@ -1,10 +1,21 @@
<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">
@@ -29,27 +40,41 @@
      </div>
    </div>
  </div>
  <div class="content_box" v-show="fullScreen">
  <div
    class="content_box"
    v-show="fullScreen"
  >
    <div
      v-show="checkMenuFlag == 'l1'"
      style="position: relative; display: flex"
    >
      <layer-manage @setCloseLayer="setCloseLayer"> </layer-manage>
    </div>
    <div v-show="checkMenuFlag == 'l2'">
      <plotting> </plotting>
    <div
      style="position: relative; display: flex"
      v-show="store.state.setLayerManager"
    >
      <layer-manage @setCloseLayer="setCloseLayer"></layer-manage>
    </div>
    <div
      style="position: relative; display: flex"
      v-show="checkMenuFlag == 'l2'"
    >
      <plotting @setCloseplotting="setCloseplotting"> </plotting>
    </div>
    <div v-show="checkMenuFlag == 'l5'">
      <baseMapSwitching> </baseMapSwitching>
      <baseMapSwitching @setCloseBaseMap="setCloseBaseMap"> </baseMapSwitching>
    </div>
    <search v-if="thematicMapBtnState"> </search>
  </div>
  <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>
  <div
    v-show="store.state.doubleMenu"
    class="setDobuleMap"
@@ -63,6 +88,31 @@
  >
    <double-layer></double-layer>
  </div>
  <div style="display: flex; position: absolute; z-index: 30; top: 23px; right: 23px;">
    <thematic-map v-show="!thematicMapBtnState"></thematic-map>
    <top-btn
      v-show="fullScreen"
      v-if="thematicMapBtnState"
    ></top-btn>
    <div>
      <div
        class="setUserLogo"
        @click="setLogMeu =!setLogMeu"
      >
        <div class="setUserImage"></div>
        <div class="setUserTitle"> {{store.state.uname}} </div>
      </div>
      <div
        v-show="setLogMeu"
        class="setLogContent"
        @click="setUserLogOut"
      >
        é€€å‡º
      </div>
    </div>
  </div>
</template>
<script lang="ts" setup>
@@ -92,15 +142,23 @@
import baseMapSwitching from "@/views/baseMapSwitching/baseMapSwitching.vue";
//分屏菜单
import doubleLayer from "@/views/layer/doubleLayer.vue";
import { removeToken } from "@/utils/auth";
import store from "@/store";
//Router
import router from "@/router";
const menuOptions = ref([]);
const checkMenuFlag = ref("");
let fullScreen = ref(true);
let thematicMapState = ref(true);
let thematicMapBtnState = ref(true);
const setLogMeu = ref(false);
const setDoubleScreenMap = () => {
  store.state.doubleMenu = false;
  store.state.doubleMap = true;
};
const setUserLogOut = () => {
  removeToken();
  router.push("/Login");
};
const setDobuleCloseLayer = () => {
  store.state.doubleMenu = true;
@@ -109,10 +167,8 @@
const setShowMapChange = (res) => {
  switch (res.id) {
    case "15":
      debugger;
      break;
    default:
      debugger;
      break;
  }
  // store.state.isShowMap = res;
@@ -122,11 +178,10 @@
    // fullScreen.value = !fullScreen.value;
    screen();
  }
  if (res.id == "l3") {
    thematicMapState.value = false;
    thematicMapBtnState.value = false;
  } else {
  } else if (res.id != "11") {
    thematicMapState.value = true;
    thematicMapBtnState.value = true;
  }
@@ -136,10 +191,23 @@
    checkMenuFlag.value = res.id;
    menuTool.leftTools(res);
  }
  if (res.id == "l1") {
    store.state.setLayerManager = !store.state.setLayerManager;
  } else {
    store.state.setLayerManager = false;
  }
};
const setCloseLayer = (res) => {
  store.state.setLayerManager = false;
};
const setCloseplotting = (res) => {
  checkMenuFlag.value = null;
};
const setCloseBaseMap = (res) => {
  checkMenuFlag.value = null;
};
// åˆ‡æ¢æµè§ˆå™¨å…¨å±
const screen = () => {
  fullScreen.value = !fullScreen.value;
@@ -171,7 +239,6 @@
  if (!isFullScreen()) {
    if (!fullScreen.value) {
      fullScreen.value = !fullScreen.value;
      console.log(fullScreen.value);
    }
  }
});
@@ -279,4 +346,37 @@
  background-size: 100% 100%;
  cursor: pointer;
}
.setUserLogo {
  height: 46px;
  display: flex;
  .setUserImage {
    width: 46px;
    height: 46px;
    background: url("../assets/img/图层 18.png") no-repeat center;
    background-size: 100% 100%;
    cursor: pointer;
  }
  .setUserTitle {
    height: 100%;
    align-items: center;
    display: flex;
    font-size: 15px;
    font-family: Microsoft YaHei;
    font-weight: 400;
    color: #d6e4ff;
    margin-left: 10px;
  }
}
.setLogContent {
  width: calc(100% - 10px);
  padding: 5px;
  background: rgba(7, 8, 14, 0.8);
  box-shadow: inset 0px 10px 40px 10px rgba(38, 47, 71, 1);
  margin-top: 10px;
  font-size: 14px;
  font-family: Microsoft YaHei;
  font-weight: 400;
  color: #d6e4ff;
}
</style>
src/views/plotting/plotting.vue
@@ -5,7 +5,10 @@
  >
    <div class="plottingTitle">
      <div class="tileLeft">
        <div class="titleImg">
        <div
          class="titleImg"
          @click="setCloseplotting"
        >
          <ArrowLeft />
        </div>
        <div class="titleLable">标绘查询</div>
@@ -52,6 +55,7 @@
  defineProps,
  defineEmits,
} from "vue";
const emits = defineEmits(["setCloseplotting"]);
let list = ref([
  {
    name: "Path #9",
@@ -69,6 +73,9 @@
    icon: "m.png",
  },
]);
const setCloseplotting = () => {
  emits("setCloseplotting", false);
};
</script>
<style lang="less" scoped>
@@ -78,7 +85,7 @@
  background: rgba(7, 8, 14, 0.8);
  box-shadow: inset 0px 10px 40px 10px rgba(38, 47, 71, 1);
  z-index: 40;
  position: absolute;
  .plottingTitle {
    width: calc(100% - 27px);
    height: 42px;
@@ -96,7 +103,7 @@
      align-items: center;
      .titleLable {
        font-size: 24px;
        font-size: 18px;
        font-family: Source Han Sans CN;
        font-weight: 400;
        color: #ffffff;
@@ -114,7 +121,7 @@
    margin-top: 3px;
    .plotting_content_title {
      font-size: 20px;
      font-size: 16px;
      font-weight: 300;
      color: #ffffff;
    }
@@ -183,7 +190,7 @@
          height: 27px;
        }
        span {
          font-size: 16px;
          font-size: 14px;
          font-weight: 300;
          color: #ffffff;
          margin-left: 10px;
src/views/query/SpatialQuery.vue
@@ -349,14 +349,14 @@
  if (!formEl) return;
  formEl.validate((valid) => {
    if (valid) {
      console.log("submit!");
      if (multipleSelection.value.length <= 0) {
        ElMessage.error("请选择要下载的表");
      } else {
        setDownLoadFrom();
      }
    } else {
      console.log("erro submit!");
      return false;
    }
  });
src/views/search/search.vue
@@ -7,20 +7,37 @@
        placeholder="请输入地名"
      >
        <template #suffix>
          <el-icon title="清除" @click="setSearchClose" class="el-input__icon">
          <el-icon
            title="清除"
            @click="setSearchClose"
            class="el-input__icon"
          >
            <Close />
          </el-icon>
        </template>
        <template #prefix>
          <el-icon @click="setSearchClick" title="查询" class="el-input__icon">
          <el-icon
            @click="setSearchClick"
            title="查询"
            class="el-input__icon"
          >
            <search />
          </el-icon>
        </template>
      </el-input>
    </div>
    <div v-if="searchFLag" class="search_content">
      <el-collapse v-model="activeNames" @change="handleChange">
        <el-collapse-item title="查询结果" name="1">
    <div
      v-if="searchFLag"
      class="search_content"
    >
      <el-collapse
        v-model="activeNames"
        @change="handleChange"
      >
        <el-collapse-item
          title="查询结果"
          name="1"
        >
          <div class="search_content_text">总查询结果:{{ listData.count }}</div>
          <div class="search_content_text paging">
            æ€»é¡µæ•°ï¼š{{ listData.page }}
@@ -109,12 +126,8 @@
  pageSize: 10,
});
const imageLabel = null;
const NumhandleChange = (value: number) => {
  console.log(value);
};
const handleChange = (val: string[]) => {
  console.log(val);
};
const NumhandleChange = (value: number) => {};
const handleChange = (val: string[]) => {};
const setPoitCannel = () => {
  imageLabel.deleteObject();
  imageLabel = null;
@@ -185,7 +198,7 @@
    filter: "name like '" + searchValue.value + "'",
    pageIndex: listData.value.pageIndex,
    pageSize: listData.value.pageSize,
    name: "lunarplacenane",
    name: "lunarplacename",
    hasGeom: 1,
  };
  const data = await dataQuery_selectByPage(obj);
@@ -221,6 +234,7 @@
  width: 243px;
  //   background: rgba(7, 8, 14, 0.8);
  border-radius: 4px;
  z-index: 40px;
  .el-collapse,
  /deep/ .el-collapse-item__wrap {
    border: 0;