瀏覽代碼

Merge branch 'visu_resources_01_siping_2.5d' of http://121.37.83.100:3000/sooka_onest/sooka_onest_forestfire_vue2_visualization into visu_resources_01_siping_2.5d

JX.LI 1 年之前
父節點
當前提交
8626a399ce
共有 47 個文件被更改,包括 1837 次插入419 次删除
  1. 1 0
      package.json
  2. 1 1
      public/index.html
  3. 二進制
      public/sliderVerifyPictures/1.jpg
  4. 二進制
      public/sliderVerifyPictures/10.jpg
  5. 二進制
      public/sliderVerifyPictures/11.jpg
  6. 二進制
      public/sliderVerifyPictures/12.jpg
  7. 二進制
      public/sliderVerifyPictures/13.jpg
  8. 二進制
      public/sliderVerifyPictures/14.jpg
  9. 二進制
      public/sliderVerifyPictures/15.jpg
  10. 二進制
      public/sliderVerifyPictures/16.jpg
  11. 二進制
      public/sliderVerifyPictures/17.jpg
  12. 二進制
      public/sliderVerifyPictures/18.jpg
  13. 二進制
      public/sliderVerifyPictures/19.jpg
  14. 二進制
      public/sliderVerifyPictures/2.jpg
  15. 二進制
      public/sliderVerifyPictures/20.jpg
  16. 二進制
      public/sliderVerifyPictures/3.jpg
  17. 二進制
      public/sliderVerifyPictures/4.jpg
  18. 二進制
      public/sliderVerifyPictures/5.jpg
  19. 二進制
      public/sliderVerifyPictures/6.jpg
  20. 二進制
      public/sliderVerifyPictures/7.jpg
  21. 二進制
      public/sliderVerifyPictures/8.jpg
  22. 二進制
      public/sliderVerifyPictures/9.jpg
  23. 25 4
      src/App.vue
  24. 9 1
      src/api/bigdata.js
  25. 3 0
      src/api/components/supermap.js
  26. 7 6
      src/api/forest.js
  27. 2 2
      src/api/monitor.js
  28. 二進制
      src/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata-slmonitor-traffic.png
  29. 二進制
      src/assets/images/cameraType/big-horn-emergency.png
  30. 二進制
      src/assets/images/cameraType/交通精细化摄像头.png
  31. 二進制
      src/assets/images/cameraType/应急广播.png
  32. 4 1
      src/assets/styles/base.scss
  33. 二進制
      src/components/SliderVerify/images/img.png
  34. 508 0
      src/components/SliderVerify/slider-verify.vue
  35. 136 95
      src/components/TVWall.vue
  36. 13 12
      src/components/leftRightSwiperScroll.vue
  37. 1 0
      src/components/supermap-2.5d.vue
  38. 4 1
      src/components/v-fastmenu.vue
  39. 873 160
      src/components/vBottomMenu.vue
  40. 4 2
      src/main.js
  41. 1 1
      src/views/eventLogUpload.vue
  42. 17 6
      src/views/eventdetailsdialog.vue
  43. 9 4
      src/views/firespread.vue
  44. 17 1
      src/views/forest.vue
  45. 148 110
      src/views/monitor.vue
  46. 52 11
      src/views/system/login.vue
  47. 2 1
      src/views/system/user/profile/resetPwd.vue

+ 1 - 0
package.json

@@ -61,6 +61,7 @@
     "vue-count-to": "1.0.13",
     "vue-cropper": "0.5.5",
     "vue-meta": "2.4.0",
+    "vue-meta-info": "^0.1.7",
     "vue-router": "3.4.9",
     "vuedraggable": "2.24.3",
     "vuex": "3.6.0"

+ 1 - 1
public/index.html

@@ -7,7 +7,7 @@
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
   <link rel="icon" href="<%= BASE_URL %>favicon.ico">
   <link href="./SuperMap3D/Build/Cesium/Widgets/widgets.css" rel="stylesheet" />
-  <title><%= webpackConfig.name %></title>
+<!--  <title><%= webpackConfig.name %></title>-->
   <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
   <style>
     html,

二進制
public/sliderVerifyPictures/1.jpg


二進制
public/sliderVerifyPictures/10.jpg


二進制
public/sliderVerifyPictures/11.jpg


二進制
public/sliderVerifyPictures/12.jpg


二進制
public/sliderVerifyPictures/13.jpg


二進制
public/sliderVerifyPictures/14.jpg


二進制
public/sliderVerifyPictures/15.jpg


二進制
public/sliderVerifyPictures/16.jpg


二進制
public/sliderVerifyPictures/17.jpg


二進制
public/sliderVerifyPictures/18.jpg


二進制
public/sliderVerifyPictures/19.jpg


二進制
public/sliderVerifyPictures/2.jpg


二進制
public/sliderVerifyPictures/20.jpg


二進制
public/sliderVerifyPictures/3.jpg


二進制
public/sliderVerifyPictures/4.jpg


二進制
public/sliderVerifyPictures/5.jpg


二進制
public/sliderVerifyPictures/6.jpg


二進制
public/sliderVerifyPictures/7.jpg


二進制
public/sliderVerifyPictures/8.jpg


二進制
public/sliderVerifyPictures/9.jpg


+ 25 - 4
src/App.vue

@@ -1,12 +1,33 @@
 <template>
   <div id="app">
-    <router-view/>
+    <router-view />
   </div>
 </template>
 
 <script>
-export default {
-  name: 'App',
+export default  {
+  name:  'App',
+  metaInfo () {
+    return {
+      title:this.title,
+      meta:[{
+        charset: "utf-8"
+      },
+        {
+          name: "viewport",
+          content: "width=device-width, initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"
+        }]
+    }
+  },
+  data() {
+    return {
+      title:"",
+    }
+  },
+  mounted() {
+    setTimeout(() => {
+      this.title = '四平市态势感知平台'
+    }, 1000)
+  },
 }
 </script>
-

+ 9 - 1
src/api/bigdata.js

@@ -1,4 +1,5 @@
 import request from '@/utils/request'
+import Cookies from 'js-cookie'
 
 // 事件来源,类型统计
 export function getEventSourceAndTypeStatistics(param) {
@@ -23,11 +24,17 @@ export function selectDeviceType() {
   return request({
     url: '/center-monitor/camera/selectDeviceType',
     method: 'post',
-    data:{type:7}
+    data:{type:7,deptId:Cookies.get("deptId")}
+
   })
 }
 // 设备分布
 export function getSbfb() {
+
+
+
+
+
   return request({
     url: '/center-resources/VisuForestCloudBigDataController/getSbfb',
     method: 'post',
@@ -47,6 +54,7 @@ export function get5() {
   return request({
     url: '/center-resources/VisuForestCloudBigDataController/getHazardResources',
     method: 'post',
+    data:{}
   })
 }
 

+ 3 - 0
src/api/components/supermap.js

@@ -17,6 +17,7 @@ export function getDeviceList(param) {
 export const iconList = {
   'marker': require('@/assets/images/cameraType/marker.png'),
   'big-horn': require('@/assets/images/cameraType/big-horn.png'),
+  'big-horn-emergency': require('@/assets/images/cameraType/big-horn-emergency.png'),
   'camera': require('@/assets/images/cameraType/camera.png'),
   'camera-not': require('@/assets/images/cameraType/camera-not.png'),
   'not-online': require('@/assets/images/cameraType/not-online.png'),
@@ -65,6 +66,8 @@ export const iconList = {
   'sj-icon-map-centerdata_pest_and_disease_monitoring_station': require('@/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata_pest_and_disease_monitoring_station.png'),//病虫害监测站
   'sj-icon-map-centerdata_atmospheric_sensor': require('@/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata_atmospheric_sensor.png'),//大气传感器
   'sj-icon-map-centerdata_water_pressure_sensor': require('@/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata_water_pressure_sensor.png'),//水压传感器
+  'sj-icon-map-centerdata-slmonitor-traffic': require('@/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata-slmonitor-traffic.png'),//交通精细化摄像头
+
 
   //云图图标
 //   'sj-icon-map-centerdata-t-forest-waterintake': require('@/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata-t-forest-waterintake.png'),//取水口

+ 7 - 6
src/api/forest.js

@@ -318,23 +318,24 @@ export function dutysystemRemove(param) {
 // 事件短信联系人
 export function userFeginlist(param) {
   return request({
-    url: '/center-resources/VisuForestCloudMapController/userFeginlist',
-    method: 'post'
+    url: '/system/user/selectUserWithPostByDeptId',
+    method: 'get',
+    params:param
   })
 }
 
 
 // 获取消息个数
-export function selectMessageCount(userId) {
+export function selectMessageCount(userId,deptId) {
   return request({
-    url: '/center-message/centerMessageFeign/selectMessageCount/'+userId,
+    url: '/center-message/centerMessageFeign/selectMessageCount/'+userId+'/'+deptId,
     method: 'get'
   })
 }
 // 获取消息列表
-export function selectMessageList(userId) {
+export function selectMessageList(userId,deptId) {
   return request({
-    url: '/center-message/centerMessageFeign/selectMessageList/'+userId,
+    url: '/center-message/centerMessageFeign/selectMessageList/'+userId+'/'+deptId,
     method: 'get'
   })
 }

+ 2 - 2
src/api/monitor.js

@@ -1,11 +1,11 @@
 import request from '@/utils/request'
 
 // 获取左侧动态感知设备
-export function selectDeviceType() {
+export function selectDeviceType(deptId) {
   return request({
     url: '/center-resources/VisuForestMonitorCenterController/selectDeviceType',
     method: 'post',
-    data:{type:6}
+    data:{"deptId":deptId}
   })
 }
 // 根据设备类型查看列表

二進制
src/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata-slmonitor-traffic.png


二進制
src/assets/images/cameraType/big-horn-emergency.png


二進制
src/assets/images/cameraType/交通精细化摄像头.png


二進制
src/assets/images/cameraType/应急广播.png


+ 4 - 1
src/assets/styles/base.scss

@@ -232,7 +232,7 @@ ul {
 }
 //tips样式
 .js-tps{
-    
+
   // background-image: -moz-linear-gradient($boxBG)!important;
   // background-image: -webkit-linear-gradient($boxBG) !important;
   // background-image: linear-gradient($boxBG)!important;
@@ -3278,3 +3278,6 @@ div::-webkit-scrollbar {
 .no_hover .no-weight h4{
 	color:#2bacf7!important;
 }
+.el-message{
+  z-index: 9999 !important;
+}

二進制
src/components/SliderVerify/images/img.png


+ 508 - 0
src/components/SliderVerify/slider-verify.vue

@@ -0,0 +1,508 @@
+<template>
+  <div
+    class="slide-verify"
+    :style="{ width: w + 'px' }"
+    id="slideVerify"
+    onselectstart="return false;"
+  >
+    <!-- 图片加载遮蔽罩 -->
+    <div :class="{ 'slider-verify-loading': loadBlock }"></div>
+    <canvas :width="w" :height="h" ref="canvas"></canvas>
+    <div v-if="show" @click="refresh" class="slide-verify-refresh-icon"></div>
+    <canvas
+      :width="w"
+      :height="h"
+      ref="block"
+      class="slide-verify-block"
+    ></canvas>
+    <!-- container -->
+    <div
+      class="slide-verify-slider"
+      :class="{
+        'container-active': containerActive,
+        'container-success': containerSuccess,
+        'container-fail': containerFail
+      }"
+    >
+      <div class="slide-verify-slider-mask" :style="{ width: sliderMaskWidth }">
+        <!-- slider -->
+        <div
+          @mousedown="sliderDown"
+          @touchstart="touchStartEvent"
+          @touchmove="handleMoveEvent($event, 'touch')"
+          @touchend="handleMoveEndEvent($event, 'touch')"
+          class="slide-verify-slider-mask-item"
+          :style="{ left: sliderLeft }"
+        >
+          <div class="slide-verify-slider-mask-item-icon"></div>
+        </div>
+      </div>
+      <span class="slide-verify-slider-text">{{ sliderText }}</span>
+    </div>
+  </div>
+</template>
+<script>
+import {
+  getConfigKey
+} from '@/api/system/config'
+const PI = Math.PI;
+
+function sum(x, y) {
+  return x + y;
+}
+
+function square(x) {
+  return x * x;
+}
+export default {
+  name: "SlideVerify",
+  props: {
+    // block length
+    l: {
+      type: Number,
+      default: 42
+    },
+    // block radius
+    r: {
+      type: Number,
+      default: 10
+    },
+    // canvas width
+    w: {
+      type: Number,
+      default: 310
+    },
+    // canvas height
+    h: {
+      type: Number,
+      default: 155
+    },
+    sliderText: {
+      type: String,
+      default: "Slide filled right"
+    },
+    accuracy: {
+      type: Number,
+      default: 5 // 若为 -1 则不进行机器判断
+    },
+    show: {
+      type: Boolean,
+      default: true
+    },
+    imgs: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      containerActive: false, // container active class
+      containerSuccess: false, // container success class
+      containerFail: false, // container fail class
+      canvasCtx: null,
+      blockCtx: null,
+      block: null,
+      block_x: undefined, // container random position
+      block_y: undefined,
+      L: this.l + this.r * 2 + 3, // block real length
+      img: undefined,
+      originX: undefined,
+      originY: undefined,
+      isMouseDown: false,
+      trail: [],
+      sliderLeft: 0, // block right offset
+      sliderMaskWidth: 0, // mask width,
+      success: false, // Bug Fixes 修复了验证成功后还能滑动
+      loadBlock: true, // Features 图片加载提示,防止图片没加载完就开始验证
+      timestamp: null
+    };
+  },
+  mounted() {
+    this.init();
+  },
+  methods: {
+    init() {
+      this.initDom();
+      this.initImg();
+      this.bindEvents();
+    },
+    initDom() {
+      this.block = this.$refs.block;
+      this.canvasCtx = this.$refs.canvas.getContext("2d");
+      this.blockCtx = this.block.getContext("2d");
+    },
+    initImg() {
+      const img = this.createImg(() => {
+        // 图片加载完关闭遮蔽罩
+        this.loadBlock = false;
+        this.drawBlock();
+        this.canvasCtx.drawImage(img, 0, 0, this.w, this.h);
+        this.blockCtx.drawImage(img, 0, 0, this.w, this.h);
+        let { block_x: x, block_y: y, r, L } = this;
+        let _y = y - r * 2 - 1;
+        let ImageData = this.blockCtx.getImageData(x, _y, L, L);
+        this.block.width = L;
+        this.blockCtx.putImageData(ImageData, 0, _y);
+      });
+      this.img = img;
+    },
+    drawBlock() {
+      this.block_x = this.getRandomNumberByRange(
+        this.L + 10,
+        this.w - (this.L + 10)
+      );
+      this.block_y = this.getRandomNumberByRange(
+        10 + this.r * 2,
+        this.h - (this.L + 10)
+      );
+      this.draw(this.canvasCtx, this.block_x, this.block_y, "fill");
+      this.draw(this.blockCtx, this.block_x, this.block_y, "clip");
+    },
+    draw(ctx, x, y, operation) {
+      let { l, r } = this;
+      ctx.beginPath();
+      ctx.moveTo(x, y);
+      ctx.arc(x + l / 2, y - r + 2, r, 0.72 * PI, 2.26 * PI);
+      ctx.lineTo(x + l, y);
+      ctx.arc(x + l + r - 2, y + l / 2, r, 1.21 * PI, 2.78 * PI);
+      ctx.lineTo(x + l, y + l);
+      ctx.lineTo(x, y + l);
+      ctx.arc(x + r - 2, y + l / 2, r + 0.4, 2.76 * PI, 1.24 * PI, true);
+      ctx.lineTo(x, y);
+      ctx.lineWidth = 2;
+      ctx.fillStyle = "rgba(255, 255, 255, 0.7)";
+      ctx.strokeStyle = "rgba(255, 255, 255, 0.7)";
+      ctx.stroke();
+      ctx[operation]();
+      // Bug Fixes 修复了火狐和ie显示问题
+      ctx.globalCompositeOperation = "destination-over";
+    },
+    createImg(onload) {
+      const img = document.createElement("img");
+
+      img.crossOrigin = "Anonymous";
+      img.onload = onload;
+      img.onerror = () => {
+        img.src = this.getRandomImg();
+      };
+      img.src = this.getRandomImg();
+      return img;
+    },
+    // 随机生成img src
+    getRandomImg() {
+      const name = this.getRandomNumberByRange(1, 20);
+        return "/sliderVerifyPictures/"+name+".jpg";
+    },
+    getRandomNumberByRange(start, end) {
+      return Math.round(Math.random() * (end - start) + start);
+    },
+    refresh() {
+      this.reset();
+      this.$emit("refresh");
+    },
+    sliderDown(event) {
+      if (this.success) return;
+      this.originX = event.clientX;
+      this.originY = event.clientY;
+      this.isMouseDown = true;
+      this.timestamp = +new Date();
+    },
+    touchStartEvent(e) {
+      if (this.success) return;
+      this.originX = e.changedTouches[0].pageX;
+      this.originY = e.changedTouches[0].pageY;
+      this.isMouseDown = true;
+      this.timestamp = +new Date();
+    },
+    bindEvents() {
+      document.addEventListener("mousemove", this.handleMoveEvent);
+      document.addEventListener("mouseup", this.handleMoveEndEvent);
+    },
+    // 处理函数抽离
+    handleMoveEvent: throttle(function(e, type = "mouse") {
+      if (!this.isMouseDown) return false;
+      const moveX =
+        type === "mouse"
+          ? e.clientX - this.originX
+          : e.changedTouches[0].pageX - this.originX;
+      const moveY =
+        type === "mouse"
+          ? e.clientY - this.originY
+          : e.changedTouches[0].pageY - this.originY;
+      if (moveX < 0 || moveX + 38 >= this.w) return false;
+      this.sliderLeft = moveX + "px";
+      let blockLeft = ((this.w - 40 - 20) / (this.w - 40)) * moveX;
+      this.block.style.left = blockLeft + "px";
+
+      this.containerActive = true; // add active
+      this.sliderMaskWidth = moveX + "px";
+      this.trail.push(moveY);
+    }),
+    handleMoveEndEvent(e, type = "mouse") {
+      if (!this.isMouseDown) return false;
+      this.isMouseDown = false;
+      if (
+        (type === "mouse" && e.clientX === this.originX) ||
+        (type === "touch" && e.changedTouches[0].pageX === this.originX)
+      )
+        return false;
+      this.containerActive = false; // remove active
+      this.timestamp = +new Date() - this.timestamp;
+
+      const { spliced, TuringTest } = this.verify();
+      if (spliced) {
+        if (this.accuracy === -1) {
+          this.containerSuccess = true;
+          this.success = true;
+          this.$emit("success", this.timestamp);
+          return;
+        }
+        if (TuringTest) {
+          // succ
+          this.containerSuccess = true;
+          this.success = true;
+          this.$emit("success", this.timestamp);
+        } else {
+          this.containerFail = true;
+          this.$emit("again");
+        }
+      } else {
+        this.containerFail = true;
+        this.$emit("fail");
+        setTimeout(() => {
+          this.reset();
+        }, 1000);
+      }
+    },
+    verify() {
+      const arr = this.trail; // drag y move distance
+      const average = arr.reduce(sum) / arr.length; // average
+      const deviations = arr.map(x => x - average); // deviation array
+      const stddev = Math.sqrt(deviations.map(square).reduce(sum) / arr.length); // standard deviation
+      const left = parseInt(this.block.style.left);
+      const accuracy =
+        this.accuracy <= 1 ? 1 : this.accuracy > 10 ? 10 : this.accuracy;
+      return {
+        spliced: Math.abs(left - this.block_x) <= accuracy,
+        TuringTest: average !== stddev // equal => not person operate
+      };
+    },
+    reset() {
+      this.success = false;
+      this.containerActive = false;
+      this.containerSuccess = false;
+      this.containerFail = false;
+      this.sliderLeft = 0;
+      this.block.style.left = 0;
+      this.sliderMaskWidth = 0;
+      // canvas
+      let { w, h } = this;
+      this.canvasCtx.clearRect(0, 0, w, h);
+      this.blockCtx.clearRect(0, 0, w, h);
+      this.block.width = w;
+
+      // generate img
+      this.img.src = this.getRandomImg();
+      this.$emit("fulfilled");
+    }
+  },
+  destroyed() {
+    document.removeEventListener("mousemove", this.handleMoveEvent);
+    document.removeEventListener("mouseup", this.handleMoveEndEvent);
+  }
+};
+
+function throttle(
+  fn,
+  interval = 50,
+  options = { leading: true, trailing: true }
+) {
+  const { leading, trailing, resultCallback } = options;
+  let lastTime = 0;
+  let timer = null;
+
+  const _throttle = function(...args) {
+    return new Promise((resolve, reject) => {
+      const nowTime = new Date().getTime();
+      if (!lastTime && !leading) lastTime = nowTime;
+
+      const remainTime = interval - (nowTime - lastTime);
+      if (remainTime <= 0) {
+        if (timer) {
+          clearTimeout(timer);
+          timer = null;
+        }
+
+        const result = fn.apply(this, args);
+        if (resultCallback) resultCallback(result);
+        resolve(result);
+        lastTime = nowTime;
+        return;
+      }
+
+      if (trailing && !timer) {
+        timer = setTimeout(() => {
+          timer = null;
+          lastTime = !leading ? 0 : new Date().getTime();
+          const result = fn.apply(this, args);
+          if (resultCallback) resultCallback(result);
+          resolve(result);
+        }, remainTime);
+      }
+    });
+  };
+
+  _throttle.cancel = function() {
+    if (timer) clearTimeout(timer);
+    timer = null;
+    lastTime = 0;
+  };
+
+  return _throttle;
+}
+</script>
+<style scoped>
+.slide-verify {
+  position: relative;
+}
+
+/* 图片加载样式 */
+.slider-verify-loading {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  background: rgba(255, 255, 255, 0.9);
+  z-index: 999;
+  animation: loading 1.5s infinite;
+}
+
+@keyframes loading {
+  0% {
+    opacity: 0.7;
+  }
+  100% {
+    opacity: 9;
+  }
+}
+
+.slide-verify-block {
+  position: absolute;
+  left: 0;
+  top: 0;
+}
+
+.slide-verify-refresh-icon {
+  position: absolute;
+  right: 0;
+  top: 0;
+  width: 34px;
+  height: 34px;
+  cursor: pointer;
+  background: url("images/img.png") 0 -437px;
+  background-size: 34px 471px;
+}
+
+.slide-verify-slider {
+  position: relative;
+  text-align: center;
+  width: 100%;
+  height: 40px;
+  line-height: 40px;
+  margin-top: 15px;
+  background: #f7f9fa;
+  color: #45494c;
+  border: 1px solid #e4e7eb;
+}
+
+.slide-verify-slider-mask {
+  position: absolute;
+  left: 0;
+  top: 0;
+  height: 40px;
+  border: 0 solid #1991fa;
+  background: #d1e9fe;
+}
+
+.slide-verify-slider-mask-item {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 40px;
+  height: 40px;
+  background: #fff;
+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
+  cursor: pointer;
+  transition: background 0.2s linear;
+}
+
+.slide-verify-slider-mask-item:hover {
+  background: #1991fa;
+}
+
+.slide-verify-slider-mask-item:hover .slide-verify-slider-mask-item-icon {
+  background-position: 0 -13px;
+}
+
+.slide-verify-slider-mask-item-icon {
+  position: absolute;
+  top: 15px;
+  left: 13px;
+  width: 14px;
+  height: 12px;
+  background: url("images/img.png") 0 -26px;
+  background-size: 34px 471px;
+}
+.container-active .slide-verify-slider-mask-item {
+  height: 38px;
+  top: -1px;
+  border: 1px solid #1991fa;
+}
+
+.container-active .slide-verify-slider-mask {
+  height: 38px;
+  border-width: 1px;
+}
+
+.container-success .slide-verify-slider-mask-item {
+  height: 38px;
+  top: -1px;
+  border: 1px solid #52ccba;
+  background-color: #52ccba !important;
+}
+
+.container-success .slide-verify-slider-mask {
+  height: 38px;
+  border: 1px solid #52ccba;
+  background-color: #d2f4ef;
+}
+
+.container-success .slide-verify-slider-mask-item-icon {
+  background-position: 0 0 !important;
+}
+
+.container-fail .slide-verify-slider-mask-item {
+  height: 38px;
+  top: -1px;
+  border: 1px solid #f57a7a;
+  background-color: #f57a7a !important;
+}
+
+.container-fail .slide-verify-slider-mask {
+  height: 38px;
+  border: 1px solid #f57a7a;
+  background-color: #fce1e1;
+}
+
+.container-fail .slide-verify-slider-mask-item-icon {
+  top: 14px;
+  background-position: 0 -82px !important;
+}
+
+.container-active .slide-verify-slider-text,
+.container-success .slide-verify-slider-text,
+.container-fail .slide-verify-slider-text {
+  display: none;
+}
+</style>

+ 136 - 95
src/components/TVWall.vue

@@ -37,7 +37,7 @@ import { tvCameraList } from '@/api/haikang/haikang'
 import DHWs from '@/dahua/lib/DHWs'
 import { rotation } from '@/api/monitor'
 import Cookies from "js-cookie"
-
+import {selectConfigKey} from "@/api/system/config";
 
 /** ----------------------------------摄像头预览结束------------------------------------- */
 export default {
@@ -286,79 +286,96 @@ export default {
     },
     //火点联动电视墙调用
     showTVWall1(longitude,latitude,tvListJson) {
-
-      // let that=this;
-      /** ----------------------------------大华摄像头预览开始------------------------------------- */
-      this.ws.addEventListener('connectStateChange', data => {
-        if (data) {
-          console.log('连接成功')
-        } else {
-          console.log('连接失败,下载客户端')
-          this.alertReinstall()
-        }
-      })
-      getDahuaVideoServer().then(newResponse => {
-        this.ws.detectConnectQt().then(res => {
-          if (res) { // 连接客户端成功
-            this.alertLogin()
-            this.ws.login({
-              loginIp: newResponse.loginIp,
-              loginPort: newResponse.loginPort,
-              userName: newResponse.userName,
-              userPwd: newResponse.userPwd,
-              // loginIp: '192.168.100.100',
-              // loginPort: 8314,
-              // userName: 'system',
-              // userPwd: 'Admin@123',
-              token: '',
-              https: 1
-            })
-            this.ws.on('loginState', (res) => {
-              this.isLogin = res
-              console.log('---res-----', res)
-              if (res) {
-                this.alertLoginSuccess()
-                this.activePanel = 'key2'
-                console.log(tvListJson)
-                const array=[]
-                const array1=[]
-                if (tvListJson!=null)
-                {
-                  tvListJson[0].treeLabels.forEach((item,index)=>
-                  {
-                    if (index!=0)
+      selectConfigKey("DssVersion").then(res => {
+        if(this.ws.getLocalDssVersion()!=res.data){
+          this.$modal.confirm('系统检测到新客户端版本,请更新后使用', '系统提示', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+            }
+          ).then(() => {
+            window.open("https://pan.baidu.com/s/1MlWyhFw6pEYiaLvzsje-BA?pwd=3jps");
+          }).catch(() => {
+            return
+          });
+          return
+        }else{
+          // let that=this;
+          /** ----------------------------------大华摄像头预览开始------------------------------------- */
+          this.ws.addEventListener('connectStateChange', data => {
+            if (data) {
+              console.log('连接成功')
+            } else {
+              console.log('连接失败,下载客户端')
+              this.alertReinstall()
+            }
+          })
+          getDahuaVideoServer().then(newResponse => {
+            this.ws.detectConnectQt().then(res => {
+              if (res) { // 连接客户端成功
+                this.alertLogin()
+                this.ws.login({
+                  loginIp: newResponse.loginIp,
+                  loginPort: newResponse.loginPort,
+                  userName: newResponse.userName,
+                  userPwd: newResponse.userPwd,
+                  // loginIp: '192.168.100.100',
+                  // loginPort: 8314,
+                  // userName: 'system',
+                  // userPwd: 'Admin@123',
+                  token: '',
+                  https: 1
+                })
+                this.ws.on('loginState', (res) => {
+                  this.isLogin = res
+                  console.log('---res-----', res)
+                  if (res) {
+                    this.alertLoginSuccess()
+                    this.activePanel = 'key2'
+                    console.log(tvListJson)
+                    const array=[]
+                    const array1=[]
+                    if (tvListJson!=null)
                     {
-                      const param =Object.assign({})
-                      param.channelId=item.labelCode
-                      array.push(param)
-                      array1.push(item.labelCode)
+                      tvListJson[0].treeLabels.forEach((item,index)=>
+                      {
+                        if (index!=0)
+                        {
+                          const param =Object.assign({})
+                          param.channelId=item.labelCode
+                          array.push(param)
+                          array1.push(item.labelCode)
+                        }
+
+                      })
                     }
-
-                  })
-                }
-                this.create1(longitude,latitude,tvListJson,array,array1)
-                // var obj=JSON.parse(tvListJson)
-              } else {
-                this.alertLoginFailed()
+                    this.create1(longitude,latitude,tvListJson,array,array1)
+                    // var obj=JSON.parse(tvListJson)
+                  } else {
+                    this.alertLoginFailed()
+                  }
+                })
+              } else { // 连接客户端失败
+                this.alertReinstall()
               }
             })
-          } else { // 连接客户端失败
-            this.alertReinstall()
-          }
-        })
 
+          })
+          /** ----------------------------------大华摄像头预览结束------------------------------------- */
+          /** ----------------------------------海康摄像头预览开始------------------------------------- */
+          // tvCameraList().then(response => {
+          //   this.cameraList=response.data
+          // })
+          // that.initPlugin()
+          // setTimeout(function() {
+          //   that.playhk();
+          // }, 5000)
+          // /** ----------------------------------海康摄像头预览结束------------------------------------- */
+          this.TVWallVisible = true
+
+        }
       })
-      /** ----------------------------------大华摄像头预览结束------------------------------------- */
-      /** ----------------------------------海康摄像头预览开始------------------------------------- */
-      // tvCameraList().then(response => {
-      //   this.cameraList=response.data
-      // })
-      // that.initPlugin()
-      // setTimeout(function() {
-      //   that.playhk();
-      // }, 5000)
-      // /** ----------------------------------海康摄像头预览结束------------------------------------- */
-      this.TVWallVisible = true
+
 
     },
     realTimeVideoDialog(cameraParams) {
@@ -377,7 +394,7 @@ export default {
           'ctrlCode': 'ctrl1',
           'ctrlProperty': {
             'displayMode': 1,
-            'splitNum': (array1.length == 1 ? 1 : 4),
+            'splitNum': 4,
             'channelList': [
               {
                 'channelId': ''
@@ -388,6 +405,9 @@ export default {
           'domId': 'dom1'
         }
       ]
+      if(array1 != undefined && array1 != null ){
+        params[0].ctrlProperty.splitNum = (array1.length == 1 ? 1 : 4)
+      }
       this.setPos()
       this.customizeTree(tvListJson);
       // if(array1.length == 1){
@@ -420,33 +440,51 @@ export default {
       })
     },
     showTVWall(tvListJson,bfArray) {
-      if(tvListJson){
-        this.preview(tvListJson,bfArray);
-        this.TVWallVisible = true;
-        return;
-      }
-      // let that=this;
-      /** ----------------------------------大华摄像头预览开始------------------------------------- */
-      this.ws.addEventListener('connectStateChange', data => {
-        if (data) {
-          console.log('连接成功')
-        } else {
-          console.log('连接失败,下载客户端')
-          this.alertReinstall()
+      selectConfigKey("DssVersion").then(res => {
+        if(this.ws.getLocalDssVersion()!=res.data){
+          this.$modal.confirm('系统检测到新客户端版本,请更新后使用', '系统提示', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+            }
+          ).then(() => {
+            window.open("https://pan.baidu.com/s/1MlWyhFw6pEYiaLvzsje-BA?pwd=3jps");
+          }).catch(() => {
+            return
+          });
+          return
+        }else{
+          if(tvListJson){
+            this.preview(tvListJson,bfArray);
+            this.TVWallVisible = true;
+            return;
+          }
+          // let that=this;
+          /** ----------------------------------大华摄像头预览开始------------------------------------- */
+          this.ws.addEventListener('connectStateChange', data => {
+            if (data) {
+              console.log('连接成功')
+            } else {
+              console.log('连接失败,下载客户端')
+              this.alertReinstall()
+            }
+          })
+          this.preview()
+          /** ----------------------------------大华摄像头预览结束------------------------------------- */
+          /** ----------------------------------海康摄像头预览开始------------------------------------- */
+          // tvCameraList().then(response => {
+          //   this.cameraList=response.data
+          // })
+          // that.initPlugin()
+          // setTimeout(function() {
+          //   that.playhk();
+          // }, 5000)
+          // /** ----------------------------------海康摄像头预览结束------------------------------------- */
+          this.TVWallVisible = true
+
         }
       })
-      this.preview()
-      /** ----------------------------------大华摄像头预览结束------------------------------------- */
-      /** ----------------------------------海康摄像头预览开始------------------------------------- */
-      // tvCameraList().then(response => {
-      //   this.cameraList=response.data
-      // })
-      // that.initPlugin()
-      // setTimeout(function() {
-      //   that.playhk();
-      // }, 5000)
-      // /** ----------------------------------海康摄像头预览结束------------------------------------- */
-      this.TVWallVisible = true
+
     },
     /** ----------------------------------大华摄像头预览开始------------------------------------- */
     alertLogin: function() {
@@ -508,7 +546,7 @@ export default {
           'ctrlCode': 'ctrl1',
           'ctrlProperty': {
             'displayMode': 1,
-            "splitNum": (bfArray.length == 1 ? 1 : 4),
+            "splitNum": 4,
             'channelList': [
               {
                 'channelId': ''
@@ -519,6 +557,9 @@ export default {
           'domId': 'dom1'
         }
       ]
+      if (bfArray != undefined && bfArray != null) {
+        params[0].ctrlProperty.splitNum = (bfArray.length == 1 ? 1 : 4)
+      }
       this.setPos()
       this.customizeTree(tvListJson);
       let length = tvListJson[0].treeLabels.length > 4 ? 5 : tvListJson[0].treeLabels.length;

+ 13 - 12
src/components/leftRightSwiperScroll.vue

@@ -11,11 +11,11 @@
       </div>
       <!-- 右边按钮 -->
       <div v-show="showRightIcon" @click="handleRightClick" class="scroll-icon right-icon">
-        <i ></i>
+        <i></i>
       </div>
     </div>
     </template>
-    
+
     <script>
     export default {
       name: 'leftRightSwiperScroll',
@@ -46,10 +46,10 @@
       mounted() {
         // 获取 HTMLCollection 转为 数组
         this.childrenList = [...this.$refs.swiperScrollContent.children];
-        console.log('childrenList--->', this.childrenList);            
+        console.log('childrenList--->', this.childrenList);
         console.log('swiperScroll--->', this.$refs.swiperScroll);
         console.log('swiperScrollContent--->', this.$refs.swiperScrollContent);
-        
+
         // 盒子的宽度
         this.swiperScrollWidth = this.$refs.swiperScroll.getBoundingClientRect().width;
         // 内容的宽度
@@ -120,15 +120,16 @@
       }
     }
     </script>
-    
+
     <style lang='scss' scoped>
     .left-right-swiper-scroll-box {
       position: relative;
       display: flex;
-      width: 1230px;
+      width: 1145px;
       overflow: hidden;
       transition: all 0.3s;
       padding: 0 30px;
+      margin-right: 5px;
       .scroll-icon {
         position: absolute;
         top: 0;
@@ -137,6 +138,7 @@
         z-index: 9;
         cursor: pointer;
         background-image: linear-gradient(270deg, invalid gradient);
+          z-index: 1000;
         i {
           position: absolute;
           top: 5px;
@@ -154,7 +156,7 @@
         &.left-icon:hover{
           left: 0;
           background: url("~@/assets/images/icon-arrow-left.png") 0 0 no-repeat;
-        
+
         }
 
         &.right-icon {
@@ -168,12 +170,12 @@
         &.right-icon:hover {
           right: 0;
           background: url("~@/assets/images/icon-arrow-right.png") 0 0 no-repeat;
-        
+
         }
 
-      }   
-      
-      
+      }
+
+
       .swiper-scroll-content {
         width: fit-content;
         display: flex;
@@ -183,4 +185,3 @@
       }
     }
     </style>
-    

+ 1 - 0
src/components/supermap-2.5d.vue

@@ -777,6 +777,7 @@
         });
       },
       openTvwall(){
+        this.mapshow=false
         this.$emit('fatherMethod', this.dianshiqiang, this.longitude, this.latitude, this.userList);
       },
       /**

+ 4 - 1
src/components/v-fastmenu.vue

@@ -30,7 +30,7 @@
 				</div>
 			</el-popover>
 		</div>
-    <el-dialog title="修改密码" :visible.sync="isResetPwd" v-if="isResetPwd" width="30%" append-to-body>
+    <el-dialog title="修改密码" :visible.sync="isResetPwd" v-if="isResetPwd" :close="close" width="30%" append-to-body>
       <resetPwd :user="user" />
     </el-dialog>
 	</div>
@@ -94,6 +94,9 @@ import Cookies from 'js-cookie';
           this.isResetPwd=true
         });
       },
+      close(){
+        this.isResetPwd=false;
+      },
       async logout() {
         this.$confirm('确定注销并退出系统吗?', '提示', {
           confirmButtonText: '确定',

文件差異過大導致無法顯示
+ 873 - 160
src/components/vBottomMenu.vue


+ 4 - 2
src/main.js

@@ -29,12 +29,13 @@ import './permission' // permission control
 
 //DataV动效组件
 import dataV from '@jiaminghi/data-view'
-
+// 头部标签组件
+import MetaInfo from 'vue-meta-info';
 //全局混入 mixin
 import {mixinMapTip} from './mixin'
 Vue.mixin(mixinMapTip);
 
-//公共过滤器 
+//公共过滤器
 import './filters'
 // //WebSocket封装方法
 // import * as socketApi from '@/api/socket'
@@ -50,6 +51,7 @@ Vue.use(VueCookies)
 Vue.use(directive)
 Vue.use(plugins)
 Vue.use(dataV)
+Vue.use(MetaInfo)
 Vue.component('ImageUpload', ImageUpload)
 Vue.prototype.$echarts = echarts //挂载echarts
 DictData.install()

+ 1 - 1
src/views/eventLogUpload.vue

@@ -32,7 +32,7 @@
         <li :key="file.url" class="el-upload-list__item ele-upload-list__item-content"
             v-for="(file, index) in fileList">
           <el-link :href="file.url" :underline="false" target="_blank">
-            <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
+            <span class="el-icon-document"> {{ file.webName }} </span>
           </el-link>
           <div class="ele-upload-list__item-content-action">
             <el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>

+ 17 - 6
src/views/eventdetailsdialog.vue

@@ -74,7 +74,7 @@
                    </div> -->
                 <!-- 底部工具栏end -->
                 <div class="fire-m" style="bottom:5rem">
-                  <el-button size="small" icon="el-icon-s-grid" @click="showTVWallDiaLog()">视频联动</el-button>
+                  <el-button size="small" icon="el-icon-s-grid" @click="showTVWallDiaLog()" v-show="eventType==1">视频联动</el-button>
                   <el-button size="small" icon="el-icon-upload" @click="showheatPlotting()" v-show="eventType==1">火灾蔓延
                   </el-button>
                 </div>
@@ -174,7 +174,7 @@
                               </div>
                             </div>
                             <div class="z-info-btm-input">
-                              <el-input type="textarea" v-model="eventLog" :autosize="{ minRows: 7, maxRows: 7}"
+                              <el-input type="textarea" v-model="eventLog" :autosize="{ minRows: 7, maxRows: 7}" :maxlength="500"
                                         placeholder="请输入反馈信息">
                               </el-input>
                               <div class="z-info-btm-input-btn" v-if="eventStatusValue=='forest_event_status_1'">
@@ -309,10 +309,10 @@
           </el-select>
         </el-form-item>
         <el-form-item label="联动标题" v-if="eventStatusButton=='ld'">
-          <el-input v-model="sendTaskTitle" placeholder="请输入联动标题" />
+          <el-input v-model="sendTaskTitle" placeholder="请输入联动标题" :maxlength="50"/>
         </el-form-item>
         <el-form-item label="联动内容" v-if="eventStatusButton=='ld'">
-          <el-input type="textarea" v-model="sendTaskContent" :autosize="{ minRows: 7, maxRows: 7}"
+          <el-input type="textarea" v-model="sendTaskContent" :autosize="{ minRows: 7, maxRows: 7}" :maxlength="500"
                     placeholder="请输入联动内容">
           </el-input>
         </el-form-item>
@@ -1014,7 +1014,7 @@
       </div>
     </el-dialog>
     <!-- 添加区域标记 -->
-    <el-dialog title="火灾区域" :visible.sync="regionalFlagOpen" width="1000px">
+    <el-dialog :title="title" :visible.sync="regionalFlagOpen" width="1000px">
       <areaSupermap ref="fireAreaSupermap" v-if="regionalFlagOpen" style="width: 100%;height:74vh"
                     :mapDiv="'fireAreaSuperMap'" :mapSite="{doubleClickZoom:false}" :codes="['9fa5']" :isSideBySide="false"
                     :showAreaLatLng="showAreaLatLng"></areaSupermap>
@@ -1097,6 +1097,7 @@ import {
   selectConfigKey
 } from "@/api/system/config";
 import Cookies from 'js-cookie';
+import request from "../utils/request";
 export default {
   dicts: ['task_source'],
   watch: {
@@ -1116,6 +1117,7 @@ export default {
   },
   data() {
     return {
+      title:"火灾区域\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000《双击选中区域获取数据》",
       isLoading: false,
       showFindUserByDept: false, //责任人选择框
       //海康
@@ -1627,6 +1629,9 @@ export default {
         }
         if (type != 'sxt') {
           fireControlViewPoint(param).then(res => {
+            if(res.data.pointList!=null&&res.data.pointList.length==0){
+              this.$message.warning("设定范围内无该资源信息!")
+            }
             if (res.data != null && res.data.pointList.length > 0) {
               this.resourcesListCheck.push(type)
               var markersList = []
@@ -1701,7 +1706,13 @@ export default {
           type: type,
           radius: this.radius
         }
-        listResourceByWz(param).then(res => {
+        request({
+          url: `/center-monitor/camera/findNearbyCameras/${param.longitude}/${param.latitude}/${param.radius}`,
+          method: 'get'
+        }).then(res => {
+          if(res.data!=null&&res.data.length==0){
+            this.$message.warning("设定范围内无该资源信息!")
+          }
           if (res.data != null && res.data.length > 0) {
             this.resourcesListCheck.push(type)
             var markersList = []

+ 9 - 4
src/views/firespread.vue

@@ -163,7 +163,7 @@
                               </div>
                             </div>
                             <div class="z-info-btm-input">
-                              <el-input type="textarea" v-model="eventLog" :autosize="{ minRows: 7, maxRows: 7}"
+                              <el-input type="textarea" v-model="eventLog" :autosize="{ minRows: 7, maxRows: 7}" :maxlength="500"
                                         placeholder="请输入反馈信息">
                               </el-input>
                               <div class="z-info-btm-input-btn" v-if="eventStatusValue=='forest_event_status_1'">
@@ -961,10 +961,10 @@
           </el-select>
         </el-form-item>
         <el-form-item label="联动标题" v-if="eventStatusButton=='ld'">
-          <el-input v-model="sendTaskTitle" placeholder="请输入联动标题" />
+          <el-input v-model="sendTaskTitle" placeholder="请输入联动标题" :maxlength="50"/>
         </el-form-item>
         <el-form-item label="联动内容" v-if="eventStatusButton=='ld'">
-          <el-input type="textarea" v-model="sendTaskContent" :autosize="{ minRows: 7, maxRows: 7}"
+          <el-input type="textarea" v-model="sendTaskContent" :autosize="{ minRows: 7, maxRows: 7}" :maxlength="500"
                     placeholder="请输入联动内容">
           </el-input>
         </el-form-item>
@@ -1734,6 +1734,7 @@ import {
   joinConferences
 } from "@/api/meeting";
 import findUserByDept from '@/views/findUserByDept' //责任人选择弹框
+import request from "../utils/request";
 export default {
   dicts: ['task_source'],
   watch: {
@@ -1748,6 +1749,7 @@ export default {
     eventLogUpload,
     areaSupermap,
     TcPlayer,
+    TVWall,
     findUserByDept
   },
   data() {
@@ -2353,7 +2355,10 @@ export default {
           type: type,
           radius: this.radius
         }
-        listResourceByWz(param).then(res => {
+        request({
+          url: `/center-monitor/camera/findNearbyCameras/${param.longitude}/${param.latitude}/${param.radius}`,
+          method: 'get'
+        }).then(res => {
           if (res.data != null && res.data.length > 0) {
             this.resourcesListCheck.push(type)
             var markersList = []

+ 17 - 1
src/views/forest.vue

@@ -515,6 +515,18 @@
       eventdetailsdialog,
       firespread
     },
+    metaInfo () {
+      return {
+        title:this.title,
+        meta:[{
+          charset: "utf-8"
+        },
+          {
+            name: "viewport",
+            content: "width=device-width, initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"
+          }]
+      }
+    },
     created() {
       /** ----------------------------------底部按钮公用组件开始------------------------------------- */
       window.showDialog = this.showDialog
@@ -544,9 +556,13 @@
       // this.initWebSocket()
       /** ----------------------------------weosocket结束------------------------------------- */
       this.bottomMenuList() //获取底部公共组件消息和任务
+      setTimeout(() => {
+        this.title = '四平市态势感知平台'
+      }, 1000)
     },
     data() {
       return {
+        title:"",
         //左侧资源
         resourcesList: [],
         iconCurrentIndex:"",
@@ -1221,7 +1237,7 @@
         getBaseInfo().then(res => {
           if (res.code == 200) {
             if (res.msg == '暂无特色信息') {
-              this.forestInfo = '暂无特色信息!'
+              this.forestInfo = '暂无基本情况!'
             } else {
               this.forestInfo = res.data.baseinfo //基本情况
             }

+ 148 - 110
src/views/monitor.vue

@@ -31,7 +31,7 @@
                     <h5>传感器</h5>
                   </div>
                 </div>
-                <div class="icon-con w-33 m-btm-no" :class="{on:onLa}" @click="$refs.supermap.clearG()">
+                <div class="icon-con w-33 m-btm-no" :class="{on:onLa}" @click="laClick">
                   <div class="icon icon-dot"></div>
                   <div class="icon-text">
                     <h6>{{ loudspeakerNum }}</h6>
@@ -108,7 +108,7 @@
             </div>
             <div class="i-list-con h-25">
               <div class="d-l-con" v-for="(item,index) in keyAreaList" :class="{on:listCurrentIndex3 == index}"
-                @click="getRegionalFlag(item.id)">
+                @click="getRegionalFlag(item.id,index)">
                 <div class="d-l-l-text">
                   <i class="i-small"></i>
                   <h4>{{ item.areaName }}</h4>
@@ -203,10 +203,11 @@
         this.selectKeyAreaList()
         this.bottomMenuList() //获取底部公共组件消息和任务
         this.getTreeselect()
-        this.deptId = Cookies.get("deptId")
+        this.deptId = Cookies.get("deptId");
+
         // this.chuanSet()
         this.getMonitorDeviceAndDataLists()
-        // this.getDlblistBydeptIds()
+        this.getDlblistBydeptIds(-1)
         this.selectDeviceType(-1)
         // this.getNotCoverPlaces(this.deptId);
 
@@ -218,6 +219,7 @@
         //摄像头名称
         rightDeptName: undefined,
         visuForestCloudCameraBOListSearch: [],
+        tempList: [],
         // 部门名称
         cgqData: [],
         deptName: undefined,
@@ -284,10 +286,20 @@
         this.$refs.tree.filter(val)
       },
       rightDeptName(val) {
-        this.visuForestCloudCameraBOListSearch = [];
-        for (let i in this.visuForestCloudCameraBOList) {
-          if (this.visuForestCloudCameraBOList[i].cameraName.indexOf(val) != -1) {
-            this.visuForestCloudCameraBOListSearch.push(this.visuForestCloudCameraBOList[i]);
+        if(['chuan','la'].includes(this.localMark)){
+          this.visuForestCloudCameraBOListSearch = [];
+          for (let i in this.tempList) {
+            if (this.tempList[i].cameraName.indexOf(val) != -1) {
+              this.visuForestCloudCameraBOListSearch.push(this.tempList[i]);
+            }
+          }
+        }
+        else{
+          this.visuForestCloudCameraBOListSearch = [];
+          for (let i in this.visuForestCloudCameraBOList) {
+            if (this.visuForestCloudCameraBOList[i].cameraName.indexOf(val) != -1) {
+              this.visuForestCloudCameraBOListSearch.push(this.visuForestCloudCameraBOList[i]);
+            }
           }
         }
       }
@@ -359,7 +371,7 @@
       //   }, 5000)
       // },
       /* 电视墙替换开始 */
-      showTVWall(channelCode, channelName) {
+      showTVWall(channelCode, channelName,type) {
         let tvListJson = [{
           "switchTab": "2",
           "treeLabels": [{
@@ -373,7 +385,7 @@
               "id": "spcamera00010",
               "labelCode": channelCode,
               "labelName": channelName,
-              "cameraType": "1",
+              "cameraType": type,
               "parentLabelCode": "999"
             }
           ],
@@ -383,7 +395,7 @@
               "channelCode": channelCode,
               "channelName": channelName,
               "channelSn": null,
-              "cameraType": "1",
+              "cameraType": type,
               "online": "1",
               "cameraCode": "1"
             }]
@@ -429,7 +441,7 @@
         } else if (that.localMark == 'chuan') {
           that.getMonitorDeviceAndDataList()
         } else if (that.localMark == 'la') {
-          // that.getDlblistBydeptId()
+          that.getDlblistBydeptId()
         }
       },
       sheClick() {
@@ -438,6 +450,7 @@
         this.onChuan = false
         this.localMark = 'she'
         this.placeholderMsg = "请输入摄像头名称"
+        this.deptId = Cookies.get("deptId");
         this.selectDeviceType()
         // this.getNotCoverPlaces(this.deptId);
       },
@@ -447,9 +460,9 @@
         this.onChuan = false
         this.localMark = 'la'
         this.placeholderMsg = "请输入云广播名称"
-        this.deptId = Cookies.get("deptId")
+        this.deptId = Cookies.get("deptId");
         this.getDlblistBydeptId()
-        this.$refs.supermap.clearG();
+        // this.$refs.supermap.clearG();
       },
       chuanClick() {
         this.onLa = false
@@ -457,9 +470,9 @@
         this.onChuan = true
         this.localMark = 'chuan'
         this.placeholderMsg = "请输入传感器名称"
-        this.deptId = Cookies.get("deptId")
+        this.deptId = Cookies.get("deptId");
         this.getMonitorDeviceAndDataList()
-        this.$refs.supermap.clearG();
+        // this.$refs.supermap.clearG();
       },
       chuanSet() {
         let that = this
@@ -477,92 +490,98 @@
         })
       },
       // 云广播
-      // getDlblistBydeptId() {
-      //   let that = this;
-      //   let markersList = [];
-      //   getDlblistBydeptId(that.deptId).then(function(res) {
-      //       that.loudspeakerNum = res.data.length
-      //       that.visuForestCloudCameraBOListSearch = []
-      //       if (res.data != null && res.data.length > 0) {
-      //         for (let j = 0; j < res.data.length; j++) {
-      //           let dat = {
-      //             cameraName: res.data[j].name,
-      //             longitude: res.data[j].longitude,
-      //             latitude: res.data[j].latitude,
-      //           }
-      //           that.visuForestCloudCameraBOListSearch.push(dat)
-      //         }
-      //         for (let i = 0; i < res.data.length; i++) {
-      //           let markersMap = {
-      //             lng: 124.59,
-      //             lat: 43.02,
-      //             icon: "marker",
-      //             bindPopupHtml: '<div class="map-tip">' +
-      //               "<span>" +
-      //               '                  <div class="d-l-con">' +
-      //               '                  <div class="d-l-l-text">' +
-      //               "                  <h4>名称:" +
-      //               (res.data[i].name ? res.data[i].name : "") +
-      //               "</h4>" +
-      //               "                </div>" +
-      //               "                </div>" +
-      //               "                </span>" +
-      //               "<span>" +
-      //               '                  <div class="d-l-con">' +
-      //               '                  <div class="d-l-l-text">' +
-      //               "                  <h4>位置:" +
-      //               (res.data[i].position ? res.data[i].position : "") +
-      //               "</h4>" +
-      //               "                </div>" +
-      //               "                </div>" +
-      //               "                </span>" +
-      //               "<span>" +
-      //               '                  <div class="d-l-con">' +
-      //               '                  <div class="d-l-l-text">' +
-      //               "                  <h4>备注:" +
-      //               (res.data[i].remark ? res.data[i].remark : "") +
-      //               "</h4>" +
-      //               "                </div>" +
-      //               "                </div>" +
-      //               "                </span>" +
-      //               "<span>" +
-      //               '                  <div class="d-l-con">' +
-      //               '                  <div class="d-l-l-text">' +
-      //               "                  <h4>经纬度:" +
-      //               res.data[i].longitude + "," + res.data[i].latitude +
-      //               "</h4>" +
-      //               "                </div>" +
-      //               "                </div>" +
-      //               "                </span>" +
-      //               "</div>",
-      //             click: "jump",
-      //             parameter: "",
-      //             name: "",
-      //             keepBindPopup: false,
-      //             isAggregation: false,
-      //           };
-      //           markersMap.icon = "big-horn";
-      //
-      //           markersMap.lng = res.data[i].longitude;
-      //           markersMap.lat = res.data[i].latitude;
-      //           markersList.push(markersMap);
-      //         }
-      //         setTimeout(() => {
-      //           that.$refs.supermap.clearM();
-      //           that.$refs.supermap.clearMRadius()
-      //           that.$refs.supermap.setMarkers(markersList);
-      //         }, 2000);
-      //       } else {
-      //         setTimeout(() => {
-      //           that.$refs.supermap.clearM();
-      //           that.$refs.supermap.clearMRadius()
-      //         }, 2000);
-      //       }
-      //     })
-      //     .catch(function(error) {
-      //       console.error(error);
-      //     });
-      // },
+      getDlblistBydeptId() {
+        let that = this;
+        let markersList = [];
+        getDlblistBydeptId(that.deptId).then(function(res) {
+            // that.loudspeakerNum = res.data.length
+            that.visuForestCloudCameraBOListSearch = []
+               that.tempList = []
+            if (res.data != null && res.data.length > 0) {
+              for (let j = 0; j < res.data.length; j++) {
+                let dat = {
+                  cameraName: res.data[j].name,
+                  longitude: res.data[j].longitude,
+                  latitude: res.data[j].latitude,
+                }
+                that.visuForestCloudCameraBOListSearch.push(dat)
+              }
+      that.tempList = that.visuForestCloudCameraBOListSearch
+              for (let i = 0; i < res.data.length; i++) {
+                let markersMap = {
+                  lng: 124.59,
+                  lat: 43.02,
+                  icon: "big-horn",
+                  bindPopupHtml: '<div class="map-tip">' +
+                    "<span>" +
+                    '                  <div class="d-l-con">' +
+                    '                  <div class="d-l-l-text">' +
+                    "                  <h4>名称:" +
+                    (res.data[i].name ? res.data[i].name : "") +
+                    "</h4>" +
+                    "                </div>" +
+                    "                </div>" +
+                    "                </span>" +
+                    "<span>" +
+                    '                  <div class="d-l-con">' +
+                    '                  <div class="d-l-l-text">' +
+                    "                  <h4>位置:" +
+                    (res.data[i].position ? res.data[i].position : "") +
+                    "</h4>" +
+                    "                </div>" +
+                    "                </div>" +
+                    "                </span>" +
+                    "<span>" +
+                    '                  <div class="d-l-con">' +
+                    '                  <div class="d-l-l-text">' +
+                    "                  <h4>备注:" +
+                    (res.data[i].remark ? res.data[i].remark : "") +
+                    "</h4>" +
+                    "                </div>" +
+                    "                </div>" +
+                    "                </span>" +
+                    "<span>" +
+                    '                  <div class="d-l-con">' +
+                    '                  <div class="d-l-l-text">' +
+                    "                  <h4>经纬度:" +
+                    res.data[i].longitude + "," + res.data[i].latitude +
+                    "</h4>" +
+                    "                </div>" +
+                    "                </div>" +
+                    "                </span>" +
+                    "</div>",
+                  click: "jump",
+                  parameter: "",
+                  name: "",
+                  keepBindPopup: false,
+                  isAggregation: false,
+                };
+                if (res.data[i].broadcastUse == '1') {
+                  markersMap.icon = "big-horn-emergency";
+                }else if(res.data[i].broadcastUse == '2'){
+                  markersMap.icon = "big-horn";
+                }
+
+                markersMap.lng = res.data[i].longitude;
+                markersMap.lat = res.data[i].latitude;
+                markersList.push(markersMap);
+              }
+              setTimeout(() => {
+                that.$refs.supermap.clearM();
+                that.$refs.supermap.clearMRadius()
+                that.$refs.supermap.setMarkers(markersList);
+              }, 2000);
+            } else {
+              setTimeout(() => {
+                that.$refs.supermap.clearM();
+                that.$refs.supermap.clearMRadius()
+              }, 2000);
+            }
+          })
+          .catch(function(error) {
+            console.error(error);
+          });
+      },
       getDlblistBydeptIds() {
         let that = this;
 
@@ -580,6 +599,7 @@
         let markersList = [];
         getMonitorDeviceAndDataList(this.deptId).then((res) => {
           this.visuForestCloudCameraBOListSearch = []
+          this.tempList = []
           list = res.data
           //this.sensorNum = list.length
           list.forEach(item => {
@@ -589,6 +609,7 @@
               latitude: item.latitude,
             }
             this.visuForestCloudCameraBOListSearch.push(dat)
+            this.tempList = that.visuForestCloudCameraBOListSearch
             let markersMap = {
               lng: 124.59,
               lat: 43.02,
@@ -959,9 +980,9 @@
           that.keyAreaList = res.data
         })
       },
-      getRegionalFlag(id) {
+      getRegionalFlag(id,index) {
         //获取重点区域
-        this.listCurrentIndex3 = id
+        this.listCurrentIndex3 = index
         let that = this
         getRegionalFlag(id).then(res => {
           that.graphicsList = []
@@ -1049,10 +1070,11 @@
       selectDeviceType() {
         //获取左侧动态感知设备
         let that = this
-        selectDeviceType().then(res => {
+        selectDeviceType(that.deptId).then(res => {
           that.cameraMarkersList = []
+          that.tempList = []
           that.visuForestCloudMapDeviceBOList = res.data.visuForestCloudMapDeviceBOList
-
+          that.tempList = res.data.visuForestCloudMapDeviceBOList
           that.region = res.data.visuForestCloudTodaySjfbBOList
 
           if (res.data.visuForestCloudTodaySjfbBOList != null && res.data.visuForestCloudTodaySjfbBOList
@@ -1079,11 +1101,20 @@
                 keepBindPopup: false,
                 isAggregation: false
               }
+              if (res.data.visuForestCloudCameraBOList[i].cameraUse == 1) {
+                markersMap.icon = 'sj-icon-map-centerdata-slmonitor'
+              }
+              else if (res.data.visuForestCloudCameraBOList[i].cameraUse == 2) {
+                markersMap.icon = 'camera'
+              }
+              else if (res.data.visuForestCloudCameraBOList[i].cameraUse == 3) {
+                markersMap.icon = 'sj-icon-map-centerdata-slmonitor-traffic'
+              }
               if (res.data.visuForestCloudCameraBOList[i].channelCode != null) {
                 markersMap.parameter = {
                   code: res.data.visuForestCloudCameraBOList[i].cameraCode,
                   name: res.data.visuForestCloudCameraBOList[i].cameraName,
-                  type: res.data.visuForestCloudCameraBOList[i].cameraFactory
+                  type: res.data.visuForestCloudCameraBOList[i].cameraType
                 }
               } else {
                 markersMap.parameter = []
@@ -1187,12 +1218,18 @@
                 markersMap.parameter = {
                   code: res.data[i].cameraCode,
                   name: res.data[i].cameraName,
-                  type: res.data[i].cameraFactory
+                  type: res.data[i].cameraType
                 }
               } else {
                 markersMap.parameter = []
               }
-
+              if (res.data[i].cameraUse == 1) {
+                markersMap.icon = "sj-icon-map-centerdata-slmonitor";
+              } else if (res.data[i].cameraUse == 2) {
+                markersMap.icon = "camera";
+              } else if (res.data[i].cameraUse == 3) {
+                markersMap.icon = "sj-icon-map-centerdata-slmonitor-traffic";
+              }
               markersMap.lng = res.data[i].longitude
               markersMap.lat = res.data[i].latitude
               markersMap.radius = res.data[i].cameraRadius
@@ -1284,7 +1321,8 @@
       },
       /** 预览按钮操作 */
       preview(cameraParam) {
-        this.showTVWall(cameraParam.code, cameraParam.name);
+        this.showTVWall(cameraParam.code, cameraParam.name,cameraParam.type);
+
       },
 
       /** 预览按钮操作 */

+ 52 - 11
src/views/system/login.vue

@@ -68,7 +68,7 @@
         </el-form-item>
         <el-form-item prop="code" v-if="captchaOnOff">
           <el-input v-model="loginForm.code" auto-complete="off" placeholder="验证码" style="width: 63%"
-            @keyup.enter.native="handleLogin">
+            >
             <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
           </el-input>
           <div class="login-code">
@@ -77,14 +77,39 @@
         </el-form-item>
         <!--				<el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>-->
         <el-form-item style="width: 100%">
-          <el-button :loading="loading" size="medium" type="primary" style="width: 100%"
-            @click.native.prevent="handleLogin">
-            <span v-if="!loading">登 录</span>
-            <span v-else>登 录 中...</span>
-          </el-button>
-          <div style="float: right" v-if="register">
-            <router-link class="link-type" :to="'/register'">立即注册</router-link>
-          </div>
+          <el-popover placement="top" trigger="click" @hide="onhide" v-model="popoverVisible">
+            <!-- 滑动拼图验证区 -->
+            <el-form-item v-if="sliderOnOff">
+              <SliderVerify
+                ref="sliderVerify"
+                :l="42"
+                :r="10"
+                :w="390"
+                :h="155"
+                slider-text="向右拖动滑块完成验证"
+                @success="onSuccess"
+                @fail="onFail"
+              />
+            </el-form-item>
+            <!-- 滑动拼图验证区 -->
+            <el-button
+              slot="reference"
+              :loading="loading"
+              :disabled="!verified"
+              size="medium"
+              type="primary"
+              style="width: 100%"
+              @click.native.prevent="handleLogin"
+            >
+              <span v-if="!loading">登 录</span>
+              <span v-else>登 录 中...</span>
+            </el-button>
+            <div style="float: right" v-if="register">
+              <router-link class="link-type" :to="'/register'"
+              >立即注册</router-link
+              >
+            </div>
+          </el-popover>
         </el-form-item>
       </div>
     </el-form>
@@ -110,7 +135,7 @@
     getVersionInfo
   } from "@/api/system/version"
   import axios from 'axios'
-
+  import SliderVerify from "@/components/SliderVerify/slider-verify";
   export default {
     beforeCreate: function() {
       document.getElementsByTagName("body")[0].style.overflow = "hidden";
@@ -122,9 +147,13 @@
     name: "Login",
     components: {
       StarBackground,
+      SliderVerify
     },
     data() {
       return {
+        sliderOnOff: false,
+        verified: true,
+        popoverVisible:false,
         QRCode: "",
         backgroudImg: "", //背景图片
         systemTitle: {
@@ -215,11 +244,16 @@
         };
       },
       handleLogin() {
+        this.verified = false;
+        this.sliderOnOff = true;
+      },
+      onSuccess() {
         this.$refs.loginForm.validate((valid) => {
           if (valid) {
+            this.verified = true;
             this.loading = true;
             // if (this.loginForm.rememberMe) {
-            //无论如何我都记-孙一石
+            //无论如何我都记
             if (true) {
               Cookies.set("username", this.loginForm.username, {
                 expires: 30,
@@ -251,7 +285,10 @@
                   });
                 })
                 .catch(() => {
+                  this.loginForm.password = null;
                   this.loading = false;
+                  this.popoverVisible = false;
+                  this.$refs.sliderVerify.refresh();
                   if (this.captchaOnOff) {
                     this.getCode();
                   }
@@ -260,6 +297,10 @@
           }
         });
       },
+      onFail() {},
+      onhide() {
+        this.verified = true;
+      },
     },
   };
 </script>

+ 2 - 1
src/views/system/user/profile/resetPwd.vue

@@ -56,12 +56,13 @@ export default {
         if (valid) {
           updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
             this.$modal.msgSuccess("修改成功");
+            this.$emit("close");
           });
         }
       });
     },
     close() {
-      this.$tab.closePage();
+      this.$emit("close");
     }
   }
 };