管道基础大数据平台系统开发-【前端】-新系統界面
1
Surpriseplus
2022-12-20 c960e2add5751edbe728dd5d297079b36544d11a
src/views/exportMap/index.vue
@@ -1,196 +1,201 @@
<template>
  <div class="exportmap">
    <div id="mapView" class="mapView">
      <div class="topMenu">
        <el-form :inline="true" :model="formInline" class="demo-form-inline">
          <el-form-item>
            <el-link
              style="color: white"
              @click="setLeftMenu"
              :underline="false"
              >图层</el-link
  <div
    id="mapView"
    class="MapBox"
    v-loading="loading"
    element-loading-spinner="el-icon-loading"
    element-loading-background="rgba(0, 0, 0, 0.8)"
  >
    <div class="topMenu">
      <el-form :inline="true" :model="formInline" class="demo-form-inline">
        <el-form-item>
          <el-link
            style="color: white"
            @click="showLeftMenu(1)"
            :underline="false"
            title="图层列表"
            ><i class="el-icon-s-operation"></i
          ></el-link>
        </el-form-item>
        <el-form-item label="比例尺">
          <el-select v-model="value" placeholder="请选择">
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
          </el-form-item>
          <el-form-item>
            <el-link
              style="color: white"
              @click="changeMenulayer"
              :underline="false"
              ><i class="el-icon-menu"></i>底图</el-link
            >
          </el-form-item>
          <el-form-item>
            <el-select v-model="value" placeholder="请选择">
              <el-option
                v-for="item in options"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item>
            <el-link style="color: white" :underline="false"
              ><i class="el-icon-rank"></i>
            </el-link>
          </el-form-item>
          <el-form-item>
            <el-link
              style="color: white"
              @click="showMapApply = true"
              :underline="false"
              >出图申请
            </el-link></el-form-item
          >
          <el-form-item>
            <el-link
              style="color: white"
              @click="getShowMapList"
              :underline="false"
              >出图列表</el-link
            ></el-form-item
          >
          <el-form-item label="旋转">
            <el-input
              v-model="formInline.role"
              placeholder="请输入内容"
            ></el-input>
          </el-form-item>
          <el-form-item>
            <el-button plain size="mini" @click="setMapRole">旋转</el-button>
            <el-button plain size="mini" @click="setMapAddDraw()"
              >绘制</el-button
            >
            <el-button plain size="mini" @click="setMapRemoveDraw()"
              >清除</el-button
            >
            <!-- <el-button plain size="mini" @click="setExportMapLayer"
              >出图</el-button
            > -->
          </el-form-item>
        </el-form>
      </div>
      <div class="leftMeu" v-if="showleftMenu">
        <div class="topHeader">
          <div style="float: left">图层</div>
          <div style="float: right">
            <el-link @click="showleftMenu = false" :underline="false"
              ><i class="el-icon-close"></i
            ></el-link>
          </div>
          <div style="float: right; margin-right: 5%">
            <el-link :underline="false" @click="changeRowType"
              ><i
                :class="
                  rowtype == true ? 'el-icon-arrow-down' : 'el-icon-arrow-up'
                "
              ></i
            ></el-link>
          </div>
        </div>
        <div class="topContent" v-if="rowtype">
          <el-tree
            :data="data"
            show-checkbox
            node-key="id"
            :props="defaultProps"
            :default-expanded-keys="[1]"
            @check-change="handleTreeNodeClick"
          >
          </el-tree>
        </div>
      </div>
      <div class="mapApplay" v-if="showMapApply">
        <label>出图申请</label>
        <el-divider />
        <el-form ref="form" :model="form" label-width="80px">
          <el-form-item label="出图名称">
            <el-input v-model="form.name"></el-input>
          </el-form-item>
          <el-form-item>
            <el-table
              ref="singleTable"
              :data="tableData"
              style="width: 100%"
              height="200"
            >
              <el-table-column type="index" label="序号" width="50">
              </el-table-column>
            </el-option>
          </el-select>
        </el-form-item>
              <el-table-column property="name" label="图层名称">
              </el-table-column>
            </el-table>
          </el-form-item>
        <el-form-item>
          <el-link
            style="color: white"
            @click="setMapAddDraw()"
            :underline="false"
            ><i class="el-icon-edit-outline"></i>绘制</el-link
          >
        </el-form-item>
        <el-form-item>
          <el-link
            :disabled="layerExtent == null"
            style="color: white"
            @click="setMapRemoveDraw()"
            :underline="false"
            title="图层列表"
            ><i class="el-icon-delete"></i>清除</el-link
          >
        </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="setMapApply">立即创建</el-button>
            <el-button @click="showMapApply = false">取消</el-button>
          </el-form-item>
        </el-form>
      </div>
      <div class="mapApplay" v-if="showMapList">
        <div>
          <label>出图列表</label>
          <div style="float: right">
            <el-link @click="showMapList = false" :underline="false"
              ><i class="el-icon-close"></i
            ></el-link>
          </div>
        </div>
        <el-divider />
        <el-table
          ref="singleTable"
          :data="exportable"
          style="width: 100%"
          height="200"
          @selection-change="handleSelectionChange"
        <el-form-item>
          <el-link
            style="color: white"
            @click="showMapApply = true"
            :underline="false"
            :disabled="layerExtent == null"
            >出图申请
          </el-link></el-form-item
        >
          <el-table-column type="index" width="50" label="序号">
          </el-table-column>
          <el-table-column property="name" label="名称"> </el-table-column>
          <el-table-column property="type" label="类型"> </el-table-column>
          <el-table-column
            property="createTime"
            :formatter="formatTime"
            label="日期"
        <el-form-item>
          <el-link
            style="color: white"
            @click="getShowMapList"
            :underline="false"
            >出图列表</el-link
          ></el-form-item
        >
        <el-form-item>
          <el-link
            style="color: white"
            @click="changeMenulayer"
            :underline="false"
            v-show="isActive"
            >影像</el-link
          >
          </el-table-column>
          <el-table-column property="descr" label="描述"> </el-table-column>
          <el-table-column label="操作" width="120">
            <template slot-scope="scope">
              <el-button
                @click.native.prevent="downloadMap(scope.$index, scope.row)"
                type="text"
                size="small"
              >
                下载
              </el-button>
            </template>
          </el-table-column>
        </el-table>
        <div class="block">
          <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page="listdata.pageIndex"
            :page-sizes="[10, 20, 30, 40]"
            :page-size="listdata.pageSize"
            layout="total, sizes, prev, pager, next, jumper"
            :total="count"
          <el-link
            style="color: white"
            v-show="!isActive"
            @click="changeMenulayer"
            :underline="false"
            >矢量</el-link
          >
          </el-pagination>
        </el-form-item>
        <el-form-item label="旋转角度">
          <el-input
            v-model="formInline.role"
            placeholder="请输入内容"
            @change="setMapRole"
          ></el-input>
        </el-form-item>
      </el-form>
    </div>
    <div
      id="leftMenu"
      class="left_Menu"
      :class="{ left_main_show: !leftMenuOpen }"
    >
      <div class="menu_content">
        <div class="topHeader" v-show="lefMenuContent">
          <div>图层列表</div>
          <div @click="showLeftMenu(2)"><i class="el-icon-s-fold"></i></div>
        </div>
        <el-divider></el-divider>
        <div class="bottomContent">
          <div style="width: 100%" v-show="lefMenuContent">
            <el-tree
              :data="data"
              show-checkbox
              node-key="id"
              :props="defaultProps"
              :default-expanded-keys="[1]"
              @check-change="handleTreeNodeClick"
              ref="tree"
            >
            </el-tree>
          </div>
        </div>
      </div>
      <div
        @click="changeMenulayer"
        class="center CenDiv"
        :class="{ center1: centerFlag }"
    </div>
    <div class="mapApplay" v-if="showMapApply">
      <label>出图申请</label>
      <el-divider />
      <el-form ref="form" :model="form" label-width="80px">
        <el-form-item label="出图名称">
          <el-input v-model="form.name"></el-input>
        </el-form-item>
        <el-form-item>
          <el-table
            ref="singleTable"
            :data="tableData"
            style="width: 100%"
            height="200"
          >
            <el-table-column type="index" label="序号" width="50">
            </el-table-column>
            <el-table-column property="name" label="图层名称">
            </el-table-column>
          </el-table>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="setMapApply">立即创建</el-button>
          <el-button @click="showMapApply = false">取消</el-button>
        </el-form-item>
      </el-form>
    </div>
    <div class="mapApplay" v-if="showMapList">
      <div>
        <label>出图列表</label>
        <div style="float: right">
          <el-link @click="showMapList = false" :underline="false"
            ><i style="color: white" class="el-icon-close"></i
          ></el-link>
        </div>
      </div>
      <el-divider />
      <el-table
        ref="singleTable"
        :data="exportable"
        style="width: 100%"
        height="200"
        @selection-change="handleSelectionChange"
      >
        <div
          id="cenBg"
          v-bind:class="{ active: isActive, menuLayer: isMenuLayer }"
        ></div>
        <el-table-column type="index" width="50" label="序号">
        </el-table-column>
        <el-table-column property="name" label="名称"> </el-table-column>
        <el-table-column property="type" label="类型"> </el-table-column>
        <el-table-column
          property="createTime"
          :formatter="formatTime"
          label="日期"
        >
        </el-table-column>
        <el-table-column property="descr" label="描述"> </el-table-column>
        <el-table-column label="操作" width="120">
          <template slot-scope="scope">
            <el-link
              style="color: white"
              @click.native.prevent="downloadMap(scope.$index, scope.row)"
              :underline="false"
              >下载</el-link
            >
          </template>
        </el-table-column>
      </el-table>
      <div class="pagination_box">
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="listdata.pageIndex"
          :page-sizes="[10, 20, 30, 40]"
          :page-size="listdata.pageSize"
          layout="total, sizes, prev, pager, next, jumper"
          :total="count"
        >
        </el-pagination>
      </div>
    </div>
@@ -245,6 +250,8 @@
export default {
  data() {
    return {
      lefMenuContent: false,
      leftMenuOpen: false,
      dialogVisible: false,
      showleftMenu: false,
      showMapApply: false,
@@ -253,6 +260,7 @@
      isActive: true,
      isMenuLayer: false,
      rowtype: true,
      loading: false,
      form: {},
      formInline: { role: '' },
      layerform: {},
@@ -266,8 +274,26 @@
          id: 1,
          label: '图层',
          children: [
            { label: '站场', value: '站场' },
            { label: '管道中心线', value: '管道中心线' },
            {
              id: '11',
              label: '站场',
              value: '站场',
              layer: 'LF:m_sitepoint',
              box: [
                84.21228790283203, 30.412200927734375, 121.11393737792969,
                41.46569061279297,
              ],
            },
            {
              id: '12',
              label: '管道中心线',
              value: '管道中心线',
              layer: 'LF:m_pipeline',
              box: [
                25.245140075683594, 11.197434425354004, 121.11258697509766,
                49.65690231323242,
              ],
            },
          ],
        },
      ],
@@ -290,8 +316,50 @@
  },
  mounted() {
    this.initMap();
    this.showMapLayer();
  },
  methods: {
    showMapLayer() {
      var val = this.data[0].children;
      var std = [];
      for (var i = val.length - 1; i >= 0; i--) {
        var layer2 = new Image({
          name: val[i].label,
          source: new ImageWMS({
            crossOrigin: 'anonymous',
            url: geoServerURl,
            params: {
              FORMAT: 'image/png',
              VERSION: '1.1.1',
              LAYERS: val[i].layer,
            },
          }),
        });
        mapView.addLayer(layer2);
        std.push(val[i].id);
      }
      this.$refs.tree.setCheckedKeys(std);
    },
    showLeftMenu(res) {
      switch (res) {
        case 1:
          this.leftMenuOpen = !this.leftMenuOpen;
          break;
        case 2:
          this.leftMenuOpen = false;
          break;
      }
      if (this.leftMenuOpen == true) {
        setTimeout(() => {
          this.lefMenuContent = true;
        }, 200);
      } else {
        setTimeout(() => {
          this.lefMenuContent = false;
        }, 1100);
      }
    },
    formatTime(row, column) {
      let date = row[column.property];
      if (date === undefined || date === null) {
@@ -314,11 +382,12 @@
    async getShowMapList() {
      this.showMapList = true;
      const data = await exportSelectByPage(this.listdata);
      debugger;
      this.exportable = data.result;
      this.count = data.count;
    },
    setExportMapLayer(res) {
      var token = '?token=' + getToken();
      var data = {
@@ -346,13 +415,16 @@
        dataType: 'json',
        error: function () {},
        success: (rs) => {
          this.loading = false;
          var value = 'code = ' + rs.code + ', result = ' + rs.result;
          if ((rs.code = 200)) {
            this.$message({
              message: value,
              type: 'success',
            });
            this.setMapRemoveDraw();
          } else {
            this.loading = false;
            this.$message.error(value);
          }
        },
@@ -373,6 +445,7 @@
      if (this.draw != null) {
        mapView.removeLayer(this.vector);
      }
      this.layerExtent = null;
    },
    setMapAddDraw() {
@@ -410,7 +483,11 @@
      });
    },
    setMapRole() {
      if (this.formInline.role == '') {
        this.formInline.role = '0';
      }
      var value = parseFloat(this.formInline.role);
      var role = (Math.PI / 180) * value;
      mapView.getView().setRotation(role);
    },
@@ -419,6 +496,7 @@
        this.$message.error('请选择出图范围');
        return;
      }
      this.loading = true;
      var val_data = [];
      for (var i in this.tableData) {
        val_data.push(this.tableData[i].name);
@@ -436,41 +514,22 @@
    },
    handleClose() {},
    handleTreeNodeClick(data, nodes) {
      if (data.label == '图层') return;
      if (nodes == true) {
        this.arrList.push({
          name: data.label,
        });
        var wmsLayer = new Image({
          source: new ImageWMS({
            ratio: 1,
            url: data.resource,
            crossOrigin: 'anonymous',
            params: {
              VERSION: '1.3.0',
              FORMAT: 'image/png',
              LAYERS: '',
              srs: 'EPSG:4326',
              tiled: true,
              styles: '',
            },
          }),
        });
        wmsLayer.name = data.label;
        mapView.addLayer(wmsLayer);
      } else {
        this.arrList.some((item, i) => {
          if (item.name === data.label) {
            this.arrList.splice(i, 1);
          }
        });
        var len = mapView.getAllLayers();
        for (var i in len) {
          var layer = mapView.getLayers().item(i);
          if (layer.name == data.label) {
            mapView.removeLayer(layer);
      if (data.children != null) return;
      var layers = mapView.getAllLayers();
      for (var i in layers) {
        var layer = layers[i];
        if (layer.values_.name == data.label) {
          layer.setVisible(nodes); //显示图层
          if (nodes == true) {
            this.arrList.push({
              name: data.label,
            });
          } else {
            this.arrList.some((item, i) => {
              if (item.name === data.label) {
                this.arrList.splice(i, 1);
              }
            });
          }
        }
      }
@@ -551,141 +610,205 @@
};
</script>
<style lang="less">
.exportmap {
<style lang="less" scoped>
.MapBox {
  width: 100%;
  height: 100%;
  background: white;
  margin: 0;
  padding: 0;
  overflow: hidden;
  position: absolute;
  .mapView {
  .topMenu {
    z-index: 40;
    position: absolute;
    background: rgba(0, 0, 0, 0.5);
    width: 100%;
    height: 100%;
    .topMenu {
      background: rgba(0, 0, 0, 0.5);
      z-index: 40;
      position: absolute;
      left: 40%;
      top: 3%;
      padding-top: 1%;
      padding-left: 1%;
      padding-right: 1%;
    }
    .mapApplay {
      width: 40%;
      position: absolute;
      background: rgba(0, 0, 0, 0.5);
      z-index: 40;
      top: 15%;
      margin-left: 20%;
      padding: 1%;
      label {
    height: 70px;
    padding-left: 20px;
  }
  .left_Menu {
    z-index: 40;
    width: 300px;
    background: rgba(0, 0, 0, 0.5);
    height: calc(100% - 220px);
    position: fixed;
    left: 0;
    bottom: 5px;
    display: flex;
    transition: width 2s;
    .menu_content {
      width: 100%;
      height: 100%;
      .topHeader {
        margin: 10px;
        display: flex;
        justify-content: space-between;
        color: white;
      }
      .bottomContent {
        width: calc(100% - 40px);
        height: calc(93% - 40px);
        padding: 20px;
        display: flex;
        justify-content: space-between;
      }
      .CenDiv {
        height: 40px;
        width: 60px;
        margin: 2%;
        border-radius: 5px;
        align-self: flex-end;
      }
      .CenDiv:hover {
        border: 1px solid #409eff;
      }
      .active {
        height: 40px;
        width: 60px;
        background: url('../../assets/img/Layer/imgLayer2.png') no-repeat center;
        position: absolute;
        background-size: 100% 100%;
        border-radius: 5px;
      }
      .menuLayer {
        height: 40px;
        width: 60px;
        background: url('../../assets/img/Layer/imgLayer1.png') no-repeat center;
        position: absolute;
        background-size: 100% 100%;
        border-radius: 5px;
      }
    }
    .mapList {
      width: 40%;
      position: absolute;
      background: rgba(0, 0, 0, 0.5);
      z-index: 40;
      top: 15%;
      margin-left: 20%;
      padding: 1%;
    }
    .leftMeu {
      position: absolute;
      width: 13%;
      z-index: 40;
      top: 10%;
      margin-left: 1%;
      border-radius: 5px;
      padding: 1%;
    }
    .topHeader {
      padding: 5%;
      background: rgba(0, 0, 0, 0.5);
      width: 100%;
      border-radius: 5px;
  }
  .left_main_show {
    width: 0px;
    z-index: 20;
  }
  .mapApplay {
    width: 40%;
    position: absolute;
    background: rgba(0, 0, 0, 0.5);
    z-index: 40;
    top: 15%;
    margin-left: 30%;
    padding: 1%;
    label {
      color: white;
      height: 25px;
      border: 1px solid gray;
    }
    .topContent {
      background: rgba(0, 0, 0, 0.5);
      width: 100%;
      padding: 5%;
      border-radius: 5px;
      border: 1px solid gray;
  }
  /deep/.el-form-item__label {
    color: white;
    line-height: 70px;
  }
  /deep/.el-form-item__content {
    line-height: 70px;
  }
  /deep/.el-input__inner {
    background-color: transparent !important ;
    color: #fff;
    border: 1px solid;
  }
  /deep/ .el-select .el-input__inner {
    border-color: #fff !important;
  }
  /deep/ .el-divider--horizontal {
    margin: 5px 0px;
  }
  /*修改table 表体的背景颜色和文字颜色*/
  /deep/ .el-table {
    background-color: transparent;
    th,
    td {
      background-color: transparent;
    }
    .el-table__expanded-cell {
      background-color: transparent !important;
    }
    .el-icon-close {
      color: white;
    // 表头背景色
    th.el-table__cell {
      background-color: #303030;
      color: #fff;
    }
    .el-icon-arrow-down {
      color: white;
    }
    .el-icon-arrow-up {
      color: white;
    tr > td {
      background-color: #303030;
      color: #fff;
    }
    .contentHeader {
      border-top: 1px solid gray;
      padding: 3%;
      width: 94%;
    // hover效果
    tr:hover > td {
      background-color: rgba(255, 255, 255, 0.3) !important;
    }
    tbody tr:hover {
      background-color: rgba(255, 255, 255, 0.3) !important;
      // text-align: center;
    }
    // 滚动条宽高
    .el-table__body-wrapper::-webkit-scrollbar {
      width: 5px;
      height: 5px;
    }
    .el-table__body-wrapper::-webkit-scrollbar {
      width: 5px;
      /*滚动条宽度*/
      height: 5px;
      /*滚动条高度*/
    }
    /*定义滚动条轨道 内阴影+圆角*/
    .el-table__body-wrapper::-webkit-scrollbar-track {
      box-shadow: 0px 1px 3px #216fe6 inset;
      /*滚动条的背景区域的内阴影*/
      border-radius: 10px;
    }
    /*定义滑块 内阴影+圆角*/
    .el-table__body-wrapper::-webkit-scrollbar-thumb {
      box-shadow: 0px 1px 3px #216fe6 inset;
      border-radius: 6px;
      background-color: #216fe6;
    }
  }
  .pagination_box {
    margin-top: 20px;
    /deep/.el-input__inner {
      background-color: transparent !important;
      border: 1px solid;
      color: white;
    }
    .center {
      margin-left: 1%;
    /deep/.el-pagination__total {
      color: white;
    }
    .CenDiv {
      position: absolute;
      bottom: 3%;
      height: 40px;
      width: 60px;
      z-index: 101;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      box-shadow: 3px 3px 6px #666;
      border: 1px solid rgba(204, 204, 204, 0.76);
      border-radius: 5px;
      cursor: pointer;
    /deep/.el-pagination__jump {
      color: white;
    }
    .center1 {
      margin-left: 1%;
    /deep/.el-pager li.active {
      color: #409eff;
    }
    .right {
      position: absolute;
      top: 50px;
      right: 0;
      width: 20%;
      height: calc(100% - 50px);
      display: flex;
      flex-direction: column;
      justify-content: space-between;
    /deep/.el-pager li {
      color: white;
      background: transparent;
    }
    .CenDiv:hover {
      border: 1px solid #409eff;
    /deep/.el-pager li {
      color: white;
    }
    // .active {
    //   width: 100%;
    //   height: 100%;
    //   background: url('../../assets/img/Layer/imgLayer2.png') no-repeat center;
    //   position: absolute;
    //   background-size: 100% 100%;
    //   border-radius: 5px;
    // }
    // .menuLayer {
    //   width: 100%;
    //   height: 100%;
    //   background: url('../../assets/img/Layer/imgLayer1.png') no-repeat center;
    //   position: absolute;
    //   background-size: 100% 100%;
    //   border-radius: 5px;
    // }
    /deep/.btn-prev {
      background: transparent;
    }
    /deep/.btn-next {
      background: transparent;
    }
    /deep/.btn-next i {
      color: white;
    }
    /deep/.btn-prev i {
      color: white;
    }
  }
  /deep/.el-loading-spinner i {
    color: #409eff !important;
  }
}
</style>