Bladeren bron

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

JX.LI 1 jaar geleden
bovenliggende
commit
aaa85d9d3d
60 gewijzigde bestanden met toevoegingen van 3276 en 1298 verwijderingen
  1. BIN
      public/sliderVerifyPictures/1.jpg
  2. BIN
      public/sliderVerifyPictures/10.jpg
  3. BIN
      public/sliderVerifyPictures/11.jpg
  4. BIN
      public/sliderVerifyPictures/12.jpg
  5. BIN
      public/sliderVerifyPictures/13.jpg
  6. BIN
      public/sliderVerifyPictures/14.jpg
  7. BIN
      public/sliderVerifyPictures/15.jpg
  8. BIN
      public/sliderVerifyPictures/16.jpg
  9. BIN
      public/sliderVerifyPictures/17.jpg
  10. BIN
      public/sliderVerifyPictures/18.jpg
  11. BIN
      public/sliderVerifyPictures/19.jpg
  12. BIN
      public/sliderVerifyPictures/2.jpg
  13. BIN
      public/sliderVerifyPictures/20.jpg
  14. BIN
      public/sliderVerifyPictures/3.jpg
  15. BIN
      public/sliderVerifyPictures/4.jpg
  16. BIN
      public/sliderVerifyPictures/5.jpg
  17. BIN
      public/sliderVerifyPictures/6.jpg
  18. BIN
      public/sliderVerifyPictures/7.jpg
  19. BIN
      public/sliderVerifyPictures/8.jpg
  20. BIN
      public/sliderVerifyPictures/9.jpg
  21. 2 2
      src/api/bigdata.js
  22. 2 3
      src/api/components/supermap.js
  23. 12 4
      src/api/forest.js
  24. 4 3
      src/api/monitor.js
  25. 343 44
      src/assets/iconfont/demo_index.html
  26. 66 14
      src/assets/iconfont/iconfont.css
  27. 1 1
      src/assets/iconfont/iconfont.js
  28. 101 10
      src/assets/iconfont/iconfont.json
  29. 36 10
      src/assets/iconfont/iconfont.svg
  30. BIN
      src/assets/iconfont/iconfont.ttf
  31. BIN
      src/assets/iconfont/iconfont.woff
  32. BIN
      src/assets/iconfont/iconfont.woff2
  33. BIN
      src/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata-slmonitor-traffic.png
  34. BIN
      src/assets/images/cameraType/big-horn-emergency.png
  35. 43 1
      src/assets/styles/base.scss
  36. BIN
      src/components/SliderVerify/images/img.png
  37. 508 0
      src/components/SliderVerify/slider-verify.vue
  38. 8 2
      src/components/TVWall.vue
  39. 12 11
      src/components/leftRightSwiperScroll.vue
  40. 26 2
      src/components/supermap-2.5d.vue
  41. 5 2
      src/components/v-fastmenu.vue
  42. 1691 979
      src/components/vBottomMenu.vue
  43. 3 0
      src/main.js
  44. 21 0
      src/mixin.js
  45. 1 1
      src/views/bigdata/bigdata.vue
  46. 23 1
      src/views/bigdata/chart-deviceReportingEvents.vue
  47. 2 0
      src/views/bigdata/chart-event.vue
  48. 23 0
      src/views/bigdata/chart-fireHydrant.vue
  49. 3 41
      src/views/bigdata/chart-foamLiquid.vue
  50. 12 1
      src/views/bigdata/chart-fullTimeStation.vue
  51. 24 2
      src/views/bigdata/chart-waterCrane.vue
  52. 23 0
      src/views/bigdata/chart-waterIntake.vue
  53. 4 4
      src/views/datacenter.vue
  54. 15 2
      src/views/eventLogUpload.vue
  55. 18 2
      src/views/eventdetailsdialog.vue
  56. 35 16
      src/views/forest.vue
  57. 148 124
      src/views/monitor.vue
  58. 58 14
      src/views/system/login.vue
  59. 2 1
      src/views/system/user/profile/resetPwd.vue
  60. 1 1
      vue.config.js

BIN
public/sliderVerifyPictures/1.jpg


BIN
public/sliderVerifyPictures/10.jpg


BIN
public/sliderVerifyPictures/11.jpg


BIN
public/sliderVerifyPictures/12.jpg


BIN
public/sliderVerifyPictures/13.jpg


BIN
public/sliderVerifyPictures/14.jpg


BIN
public/sliderVerifyPictures/15.jpg


BIN
public/sliderVerifyPictures/16.jpg


BIN
public/sliderVerifyPictures/17.jpg


BIN
public/sliderVerifyPictures/18.jpg


BIN
public/sliderVerifyPictures/19.jpg


BIN
public/sliderVerifyPictures/2.jpg


BIN
public/sliderVerifyPictures/20.jpg


BIN
public/sliderVerifyPictures/3.jpg


BIN
public/sliderVerifyPictures/4.jpg


BIN
public/sliderVerifyPictures/5.jpg


BIN
public/sliderVerifyPictures/6.jpg


BIN
public/sliderVerifyPictures/7.jpg


BIN
public/sliderVerifyPictures/8.jpg


BIN
public/sliderVerifyPictures/9.jpg


+ 2 - 2
src/api/bigdata.js

@@ -1,5 +1,5 @@
 import request from '@/utils/request'
-
+import Cookies from 'js-cookie'
 // 事件来源,类型统计
 export function getSjlylxtj(param) {
   //暂时传当年,以后再说
@@ -49,7 +49,7 @@ export function selectDeviceType() {
   return request({
     url: '/center-monitor/camera/selectDeviceType',
     method: 'post',
-    data:{type:8}
+    data:{type:8,deptId:Cookies.get("deptId")}
   })
 }
 //起火原因

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

@@ -14,8 +14,7 @@ export const iconList = {
   'camera-not': require('@/assets/images/cameraType/camera-not.png'),
   'not-online': require('@/assets/images/cameraType/not-online.png'),
   'sensor': require('@/assets/images/cameraType/sensor.png'),
-
-
+  'big-horn-emergency': require('@/assets/images/cameraType/big-horn-emergency.png'),
   //首页事件上报状态
   'sj-icon-map-xinshangbao': require('@/assets/icons/sj-icon-map/sj-icon-map-xinshangbao.png'),//新上报
   'sj-icon-map-cuiban': require('@/assets/icons/sj-icon-map/sj-icon-map-cuiban.png'),//催办
@@ -44,7 +43,7 @@ export const iconList = {
   'sj-icon-map-centerdata_t_forest_firehydrant@2': require('@/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata_t_forest_firehydrant@2.png'),//地下消防栓
   'sj-icon-map-centerdata_t_forest_firehydrant@3': require('@/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata_t_forest_firehydrant@3.png'),//室内消防栓
   'sj-icon-map-centerdata-t-forest-fireteam': require('@/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata-t-forest-fireteam.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_water_quality_sensor': require('@/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata_water_quality_sensor.png'),//水质传感器

+ 12 - 4
src/api/forest.js

@@ -292,16 +292,16 @@ export function userFeginlist(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'
   })
 }
@@ -347,3 +347,11 @@ export function sendMessage(param) {
     })
 
 }
+// 左侧获取通知公共
+export function getLatestNotice() {
+  return request({
+    url: '/system/notice/getLatestNotice',
+    method: 'get',
+    params: {},
+  })
+}

+ 4 - 3
src/api/monitor.js

@@ -1,10 +1,11 @@
 import request from '@/utils/request'
 
 // 获取左侧动态感知设备
-export function selectDeviceType() {
+export function selectDeviceType(deptId) {
   return request({
     url: '/center-firecontrol/VisuForestMonitorCenterController/selectDeviceType',
     method: 'post',
+    data:{"deptId":deptId}
   })
 }
 
@@ -62,9 +63,9 @@ export function getSensorListByDeptId(deptId) {
 export function getDlblistBydeptId(deptId) {
   let url = "";
   if(deptId!=null){
-    url= '/center-firecontrol/VisuForestMonitorCenterController/getDlblistBydeptId?deptId=' + deptId;
+    url= '/center-firecontrol/VisuForestMonitorCenterController/getDlblistBydeptId?deptId=' + deptId+"&type=8";
   }else{
-    url= '/center-firecontrol/VisuForestMonitorCenterController/getDlblistBydeptId';
+    url= '/center-firecontrol/VisuForestMonitorCenterController/getDlblistBydeptId?type=8';
   }
   return request({
     url: url,

File diff suppressed because it is too large
+ 343 - 44
src/assets/iconfont/demo_index.html


File diff suppressed because it is too large
+ 66 - 14
src/assets/iconfont/iconfont.css


File diff suppressed because it is too large
+ 1 - 1
src/assets/iconfont/iconfont.js


+ 101 - 10
src/assets/iconfont/iconfont.json

@@ -6,6 +6,97 @@
   "description": "",
   "glyphs": [
     {
+      "icon_id": "14191056",
+      "name": "喇叭广播",
+      "font_class": "labaguangbo",
+      "unicode": "e65d",
+      "unicode_decimal": 58973
+    },
+    {
+      "icon_id": "36067460",
+      "name": "水利摄像头",
+      "font_class": "shuilishexiangtou",
+      "unicode": "e65c",
+      "unicode_decimal": 58972
+    },
+    {
+      "icon_id": "11032209",
+      "name": "类型",
+      "font_class": "leixing",
+      "unicode": "e65a",
+      "unicode_decimal": 58970
+    },
+    {
+      "icon_id": "14296829",
+      "name": "点位总数",
+      "font_class": "dianweizongshu",
+      "unicode": "e6cc",
+      "unicode_decimal": 59084
+    },
+    {
+      "icon_id": "17930624",
+      "name": "测量工具",
+      "font_class": "celianggongju",
+      "unicode": "e65b",
+      "unicode_decimal": 58971
+    },
+    {
+      "icon_id": "35809866",
+      "name": "流速",
+      "font_class": "gather-flow",
+      "unicode": "e659",
+      "unicode_decimal": 58969
+    },
+    {
+      "icon_id": "7335549",
+      "name": "氨氮",
+      "font_class": "gather-ammoniaNitrogen",
+      "unicode": "eb32",
+      "unicode_decimal": 60210
+    },
+    {
+      "icon_id": "7335568",
+      "name": "溶解氧",
+      "font_class": "gather-dissolve",
+      "unicode": "eb37",
+      "unicode_decimal": 60215
+    },
+    {
+      "icon_id": "7335569",
+      "name": "液位",
+      "font_class": "gather-level",
+      "unicode": "eb36",
+      "unicode_decimal": 60214
+    },
+    {
+      "icon_id": "7335632",
+      "name": "酸碱度",
+      "font_class": "gather-ph",
+      "unicode": "eb46",
+      "unicode_decimal": 60230
+    },
+    {
+      "icon_id": "9082594",
+      "name": "氧化还原电位",
+      "font_class": "gather-orp",
+      "unicode": "eb51",
+      "unicode_decimal": 60241
+    },
+    {
+      "icon_id": "13638743",
+      "name": "温度",
+      "font_class": "gather-temperature",
+      "unicode": "e660",
+      "unicode_decimal": 58976
+    },
+    {
+      "icon_id": "13804980",
+      "name": "浊度",
+      "font_class": "gather-turbidity",
+      "unicode": "e781",
+      "unicode_decimal": 59265
+    },
+    {
       "icon_id": "12770896",
       "name": "垃圾桶",
       "font_class": "centerdata-t-hydraulic-garbage-station",
@@ -309,42 +400,42 @@
     {
       "icon_id": "21492584",
       "name": "5饲料",
-      "font_class": "farmenterprise_3",
+      "font_class": "centerdata-t-farm-enterprise-3",
       "unicode": "e67a",
       "unicode_decimal": 59002
     },
     {
       "icon_id": "1486836",
       "name": "生鲜",
-      "font_class": "farmenterprise_1",
+      "font_class": "centerdata-t-farm-enterprise-1",
       "unicode": "e639",
       "unicode_decimal": 58937
     },
     {
       "icon_id": "2116698",
       "name": "规模化畜禽养殖场",
-      "font_class": "filingslivestock",
+      "font_class": "centerdata-t-farm-filings-livestock",
       "unicode": "e63a",
       "unicode_decimal": 58938
     },
     {
       "icon_id": "4670127",
       "name": "农业",
-      "font_class": "protectinfo",
+      "font_class": "centerdata-t-farm-botany-protect-info",
       "unicode": "e63b",
       "unicode_decimal": 58939
     },
     {
       "icon_id": "5387788",
       "name": "人工改站_o",
-      "font_class": "complexmodification",
+      "font_class": "centerdata-t-farm-complex-modification",
       "unicode": "eb56",
       "unicode_decimal": 60246
     },
     {
       "icon_id": "11831137",
       "name": "菜刀",
-      "font_class": "farmenterprise_2",
+      "font_class": "centerdata-t-farm-enterprise-2",
       "unicode": "e731",
       "unicode_decimal": 59185
     },
@@ -442,7 +533,7 @@
     {
       "icon_id": "765262",
       "name": "首页",
-      "font_class": "farmlivestock",
+      "font_class": "centerdata-t-farm-livestock",
       "unicode": "e629",
       "unicode_decimal": 58921
     },
@@ -456,7 +547,7 @@
     {
       "icon_id": "8353896",
       "name": "三农补助",
-      "font_class": "greenhousefilm",
+      "font_class": "centerdata-t-farm-greenhouse-film",
       "unicode": "e62a",
       "unicode_decimal": 58922
     },
@@ -484,7 +575,7 @@
     {
       "icon_id": "18262823",
       "name": "畜禽养殖粪污处理情况30",
-      "font_class": "excrementdispose",
+      "font_class": "centerdata-t-farm-excrement-dispose",
       "unicode": "e82e",
       "unicode_decimal": 59438
     },
@@ -498,7 +589,7 @@
     {
       "icon_id": "21432644",
       "name": "农民合作社",
-      "font_class": "agriculturalcooperatives",
+      "font_class": "centerdata-t-farm-agricultural-cooperatives",
       "unicode": "e62e",
       "unicode_decimal": 58926
     },

File diff suppressed because it is too large
+ 36 - 10
src/assets/iconfont/iconfont.svg


BIN
src/assets/iconfont/iconfont.ttf


BIN
src/assets/iconfont/iconfont.woff


BIN
src/assets/iconfont/iconfont.woff2


BIN
src/assets/icons/sj-icon-map/centerdata/sj-icon-map-centerdata-slmonitor-traffic.png


BIN
src/assets/images/cameraType/big-horn-emergency.png


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

@@ -230,9 +230,46 @@ ul {
   width: 100%;
   height: 100vh;
 }
+.sj-icon-btn {
+
+  padding: 0 .3rem;
+  height: 1.5rem;
+  background-color: #112543;
+  color: $inBlue;
+  border: 1px $searchBorder;
+}
+.sj-icon-btn:hover {
+  text-shadow: 0 0 15px rgba($color: $inBlueHover, $alpha: 1.0);
+}
+.sj-upload{
+  .el-upload--picture-card{
+    background-color: #0d1620!important;
+    border: 1px dashed #083874;
+  }
+  .el-upload--picture-card i {
+    color: #153d6c;
+  }
+}
+// 下拉
+.el-select-dropdown {
+  border: none;
+  background-color: rgba(1, 28, 82, 0.8);
+}
+.el-select-dropdown__item{
+  color: $white;
+}
+.el-select-dropdown{
+  background-color: #00335c;
+  border: solid 1px #56dfff;
+  color: $white;
+}
+.el-select-dropdown__item.hover, .el-select-dropdown__item:hover{
+  background-color: #035faa;
+
+}
 //tips样式
 .js-tps{
-    
+
   // background-image: -moz-linear-gradient($boxBG)!important;
   // background-image: -webkit-linear-gradient($boxBG) !important;
   // background-image: linear-gradient($boxBG)!important;
@@ -3274,3 +3311,8 @@ div::-webkit-scrollbar {
 .no_hover .no-weight h4{
 	color:#2bacf7!important;
 }
+
+.el-message{
+  z-index: 9999 !important;
+}
+

BIN
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>

+ 8 - 2
src/components/TVWall.vue

@@ -386,7 +386,7 @@ export default {
           'ctrlCode': 'ctrl1',
           'ctrlProperty': {
             'displayMode': 1,
-            'splitNum': (array.length==1?1:4),
+            'splitNum': 4,
             'channelList': [
               {
                 'channelId': ''
@@ -397,6 +397,9 @@ export default {
           'domId': 'dom1'
         }
       ]
+      if(array1 != undefined && array1 != null ){
+        params[0].ctrlProperty.splitNum = (array1.length == 1 ? 1 : 4)
+      }
       this.setPos()
       this.customizeTree(tvListJson);
       _this.ws.createCtrl(params);
@@ -530,7 +533,7 @@ export default {
           'ctrlCode': 'ctrl1',
           'ctrlProperty': {
             'displayMode': 1,
-            'splitNum': (bfArray.length==1?1:4),
+            'splitNum': 4,
             'channelList': [
               {
                 'channelId': ''
@@ -541,6 +544,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;

+ 12 - 11
src/components/leftRightSwiperScroll.vue

@@ -15,7 +15,7 @@
       </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>
-    

+ 26 - 2
src/components/supermap-2.5d.vue

@@ -10,8 +10,11 @@
           </div>
           <div class="map-txt" v-html="bindPopupHtml">
           </div>
-          <div id="super2" />
+          <el-button size="mini" type="primary" class="sj-icon-btn" @click="openTvwall()">
+            查看
+          </el-button>
         </div>
+        <div id="super2"></div>
       </transition>
       <!--地图top 显示 结束-->
     </div>
@@ -31,6 +34,9 @@
     name: 'supermap-2.5d',
     data() {
       return {
+        _click:null,
+        openZt: false,
+        _parameter:null,
         bindPopupHtml: null,
         mapshow: false,
         superMapRootUrl: null,
@@ -826,7 +832,13 @@
         });
       },
       openTvwall(){
-        this.$emit('fatherMethod', this.dianshiqiang, this.longitude, this.latitude, this.userList);
+        this.mapshow=false;
+        if(this.openZt){
+          this.$emit('fatherMethod', this.dianshiqiang, this.longitude, this.latitude, this.userList);
+        }else{
+          this.$emit(this._click,this._parameter);
+        }
+
       },
       /**
        * 地图落点
@@ -876,6 +888,9 @@
             if (html != undefined && html._value != null && html._value != '' && html != 'cgq') {
               that.bindPopupHtml = html
               that.mapshow = true
+              that.openZt=false
+              that._click = id._click;
+              that._parameter = id._parameter;
             } else if (html == 'cgq') {
               that.timer = setInterval(function() {
                 var color = "green";
@@ -1028,4 +1043,13 @@
     opacity: 0;
     transform: translateY(-10rem);
   }
+  .map-tit{
+    .sj-icon-btn{
+      display: block;
+      margin: 10px auto 15px auto;
+      padding: 0px 16px;
+      font-size: 10px;
+      height: 1.7rem;
+    }
+  }
 </style>

+ 5 - 2
src/components/v-fastmenu.vue

@@ -30,10 +30,10 @@
 				</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>
+  </div>
 </template>
 
 <script>
@@ -94,6 +94,9 @@ import Cookies from 'js-cookie';
           this.isResetPwd=true
         });
       },
+      close(){
+        this.isResetPwd=false;
+      },
       async logout() {
         this.$confirm('确定注销并退出系统吗?', '提示', {
           confirmButtonText: '确定',

File diff suppressed because it is too large
+ 1691 - 979
src/components/vBottomMenu.vue


+ 3 - 0
src/main.js

@@ -34,6 +34,9 @@ import './filters'
 // //WebSocket封装方法
 // import * as socketApi from '@/api/socket'
 // Vue.prototype.socketApi = socketApi
+//全局混入 mixin
+import {mixinMapTip} from './mixin'
+Vue.mixin(mixinMapTip);
 
 Vue.prototype.$axios = axios
 Vue.config.productionTip = false

+ 21 - 0
src/mixin.js

@@ -0,0 +1,21 @@
+// 全局混入map上的tip气泡点击除地图外的区域也进行隐藏
+export const mixinMapTip = {
+  mounted() {
+    this.$nextTick(() => {
+      this.closedMapTip();
+    })
+  },
+  methods: {
+    closedMapTip() {
+      if(this.$refs.supermap){
+        document.addEventListener("click", (e) => {
+          let a = this.$refs.supermap.$el;
+          if (this.$refs.supermap.mapshow && !a.contains(e.target)) {
+            this.$refs.supermap.mapshow = false;
+          }
+        });
+      }
+
+    },
+  }
+}

+ 1 - 1
src/views/bigdata/bigdata.vue

@@ -23,7 +23,7 @@
       <div class="bigdata-list wid-li-1">
         <div class="b-con mg-b-20">
           <div class="b-tit"><img src="@/assets/images/integrated/bigdata-tit-icon.png">
-            <span>事件来源,类型统计</span>
+            <span>火险事件来源,类型统计</span>
           </div>
           <chartEvent></chartEvent>
         </div>

+ 23 - 1
src/views/bigdata/chart-deviceReportingEvents.vue

@@ -65,7 +65,29 @@
               }
             },
             axisLabel: {
-              // interval: 0,
+               interval: 0,
+              formatter: function (params) {
+                var newParamsName = ''
+                const paramsNameNumber = params.length
+                const provideNumber = 3 // 单行显示文字个数
+                const rowNumber = Math.ceil(paramsNameNumber / provideNumber)
+                if (paramsNameNumber > provideNumber) {
+                  for (let p = 0; p < rowNumber; p++) {
+                    var tempStr = ''
+                    var start = p * provideNumber
+                    var end = start + provideNumber
+                    if (p === rowNumber - 1) {
+                      tempStr = params.substring(start, paramsNameNumber)
+                    } else {
+                      tempStr = params.substring(start, end) + '\n'
+                    }
+                    newParamsName += tempStr
+                  }
+                } else {
+                  newParamsName = params
+                }
+                return newParamsName
+              },
               // rotate: 40,
               textStyle: {
                 fontFamily: 'Microsoft YaHei'

+ 2 - 0
src/views/bigdata/chart-event.vue

@@ -32,6 +32,8 @@
         getSjlylxtj(null).then(resp => {
           that.data_type = resp.data.type
           that.data_source = resp.data.source
+          // that.data_source=that.data_source.filter(item=>item.name!=='传感器')
+          // console.log(that.data_source)
           that.myEcharts()
           that.myEcharts2()
         })

+ 23 - 0
src/views/bigdata/chart-fireHydrant.vue

@@ -74,6 +74,29 @@
             type: "category",
             data: that.data_xhx_name,
             axisLabel: {
+              interval: 0,
+              formatter: function (params) {
+                var newParamsName = ''
+                const paramsNameNumber = params.length
+                const provideNumber = 2 // 单行显示文字个数
+                const rowNumber = Math.ceil(paramsNameNumber / provideNumber)
+                if (paramsNameNumber > provideNumber) {
+                  for (let p = 0; p < rowNumber; p++) {
+                    var tempStr = ''
+                    var start = p * provideNumber
+                    var end = start + provideNumber
+                    if (p === rowNumber - 1) {
+                      tempStr = params.substring(start, paramsNameNumber)
+                    } else {
+                      tempStr = params.substring(start, end) + '\n'
+                    }
+                    newParamsName += tempStr
+                  }
+                } else {
+                  newParamsName = params
+                }
+                return newParamsName
+              },
               textStyle: {
                 color: "#42a7ff",
                 fontSize: 10,

+ 3 - 41
src/views/bigdata/chart-foamLiquid.vue

@@ -39,7 +39,7 @@
         let that = this
         var chartDom = document.getElementById('foam');
         var myChart = echarts.init(chartDom);
-        var zdslColorList = ['#D0A00E', '#34DA62', '#00C0E9', '#0096F3', '#33CCFF'];
+        var zdslColorList = ['#D0A00E', '#34DA62', '#00C0E9', '#0096F3', '#33CCFF','#D0A00E', '#34DA62', '#00C0E9', '#0096F3', '#33CCFF','#D0A00E', '#34DA62', '#00C0E9', '#0096F3', '#33CCFF','#D0A00E', '#34DA62', '#00C0E9', '#0096F3', '#33CCFF','#D0A00E', '#34DA62', '#00C0E9', '#0096F3', '#33CCFF','#D0A00E', '#34DA62', '#00C0E9', '#0096F3', '#33CCFF'];
         var option;
         option = {
           grid: {
@@ -54,7 +54,7 @@
             show: false,
             type: 'value'
           },
-          yAxis: [{
+          yAxis: {
             type: 'category',
             inverse: true,
             data: that.data_pmy_name,
@@ -75,47 +75,9 @@
               show: false
             },
           },
-            {
-              splitLine: {
-                show: false
-              },
-              axisTick: {
-                show: false
-              },
-              axisLine: {
-                show: false
-              },
-              axisLabel: {
-                show: true,
-                textStyle: {
-                  color: '#ADD6FF',
-                  fontSize: '12'
-                }
-              },
-              data:that.data_pmy_value
-            }
-          ],
-
-          series: [{
-            type: "bar",
-            barWidth: "20%",
-            yAxisIndex: 0,
-            data: that.data_pmy_value.map((item, i) => {
-              return {
-                value: item,
-                itemStyle: {
-                  color: "rgba(0,0,0,0)",
-                  barBorderColor: zdslColorList[i],
-                  borderWidth: 1,
-                  shadowColor: "#33CCFF",
-                  shadowBlur: 4
-                }
-              }
-            }),
-          },
+          series: [
             {
               type: 'bar',
-              yAxisIndex: 1,
               barWidth: "10%",
               data: that.data_pmy_value
             }

+ 12 - 1
src/views/bigdata/chart-fullTimeStation.vue

@@ -80,7 +80,18 @@
         var option = {
           backgroundColor: '#222',
           tooltip: {
-            trigger: 'item',
+            trigger: 'axis',
+            formatter: function(params) {
+              var result = params[0].name + "<br>";
+              params.forEach(function(item) {
+                if (item.value) {
+                  result += item.marker + " " + item.value + "%</br>";
+                } else {
+                  result += item.marker + " </br>";
+                }
+              });
+              return result;
+            },
             textStyle: {
               fontSize: 16,
               color: '#fff',

+ 24 - 2
src/views/bigdata/chart-waterCrane.vue

@@ -95,7 +95,6 @@
               return arr;
             })(chartData),
 
-
             boundaryGap: ['20%', '20%'],
             splitLine: {
               show: false
@@ -106,7 +105,30 @@
             axisTick: {
               show: false
             },
-            axisLabel: {
+            axisLabel: {interval: 0,
+              formatter: function (params) {
+                var newParamsName = ''
+                const paramsNameNumber = params.length
+                const provideNumber = 3 // 单行显示文字个数
+                const rowNumber = Math.ceil(paramsNameNumber / provideNumber)
+                if (paramsNameNumber > provideNumber) {
+                  for (let p = 0; p < rowNumber; p++) {
+                    var tempStr = ''
+                    var start = p * provideNumber
+                    var end = start + provideNumber
+                    if (p === rowNumber - 1) {
+                      tempStr = params.substring(start, paramsNameNumber)
+                    } else {
+                      tempStr = params.substring(start, end) + '\n'
+                    }
+                    newParamsName += tempStr
+                  }
+                } else {
+                  newParamsName = params
+                }
+                return newParamsName
+              }
+              ,
               textStyle: {
                 fontSize: 10 * scale,
                 color: '#3fdaff'

+ 23 - 0
src/views/bigdata/chart-waterIntake.vue

@@ -71,6 +71,29 @@
               show: true,
               margin: 14,
               fontSize: 10,
+              interval: 0,
+              formatter: function (params) {
+                var newParamsName = ''
+                const paramsNameNumber = params.length
+                const provideNumber = 3 // 单行显示文字个数
+                const rowNumber = Math.ceil(paramsNameNumber / provideNumber)
+                if (paramsNameNumber > provideNumber) {
+                  for (let p = 0; p < rowNumber; p++) {
+                    var tempStr = ''
+                    var start = p * provideNumber
+                    var end = start + provideNumber
+                    if (p === rowNumber - 1) {
+                      tempStr = params.substring(start, paramsNameNumber)
+                    } else {
+                      tempStr = params.substring(start, end) + '\n'
+                    }
+                    newParamsName += tempStr
+                  }
+                } else {
+                  newParamsName = params
+                }
+                return newParamsName
+              },
               textStyle: {
                 color: '#ffffff' //X轴文字颜色
               }

+ 4 - 4
src/views/datacenter.vue

@@ -273,7 +273,7 @@ export default {
         ],
         grid: {
           top: "5%",
-          left: "2%",
+          left: "12%",
           // right: "4%",
           bottom: "-15%",
           width: "75%",
@@ -825,7 +825,7 @@ export default {
           "<span>" +
           '                  <div class="d-l-con">' +
           '                  <div class="d-l-l-text">' +
-          "                  <h4>数量:" +
+          "                  <h4>编号:" +
           (item.number ? item.number : "") +
           "</h4>" +
           "                </div>" +
@@ -1019,7 +1019,7 @@ export default {
           id: null,
           labelCode: data.cameraList[i].cameraCode,
           labelName: data.cameraList[i].cameraName,
-          cameraType: "1",
+          cameraType: data.cameraList[i].cameraType,
           parentLabelCode: "999",
         });
         labelChannels.push({
@@ -1029,7 +1029,7 @@ export default {
               channelCode: data.cameraList[i].cameraCode,
               channelName: data.cameraList[i].cameraName,
               channelSn: null,
-              cameraType: "1",
+              cameraType: data.cameraList[i].cameraType,
               online: "1",
               cameraCode: "1",
             },

+ 15 - 2
src/views/eventLogUpload.vue

@@ -11,6 +11,7 @@
         :on-error="handleUploadError"
         :on-exceed="handleExceed"
         :on-success="handleUploadSuccess"
+        :on-change="handleChange"
         :show-file-list="false"
         :headers="headers"
         class="upload-file-uploader"
@@ -31,8 +32,8 @@
       <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
         <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>
+          <el-link :href="file.webUrl" :underline="false" target="_blank">
+            <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>
@@ -150,6 +151,18 @@ export default {
 
 
     },
+    handleChange(file, fileList) {
+      var _this = this;
+      if (file.raw) {
+        let reader = new FileReader()
+        reader.onload = function (e) {
+          _this.contentHtml = e.target.result;
+        };
+        reader.readAsText(file.raw,'gb2312');
+
+      }
+      console.log(file, fileList);
+    },
     eventLogUpload(eventCode) {
       this.eventCode=eventCode
       //上传页面弹出

+ 18 - 2
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>
@@ -335,7 +335,7 @@
           </el-input>
         </el-form-item>
         <el-form-item label="附件" prop="schedulePictures" v-if="eventStatusButton=='sh'">
-          <ImageUpload ref="ImageUpload" :limit="10" :fileType="['jpg', 'png','jpeg']" :value="uploadAttachList"
+          <ImageUpload class="sj-upload"  ref="ImageUpload" :limit="10" :fileType="['jpg', 'png','jpeg']" :value="uploadAttachList"
                        @input="getUrl"></ImageUpload>
         </el-form-item>
         <!--<el-form-item label="联系人" v-if="eventStatusButton=='qs'">-->
@@ -348,24 +348,38 @@
         <!--</el-select>-->
         <!--</el-form-item>-->
         <el-button size="mini" type="primary" v-if="eventStatusButton=='qr'"
+                   class="sj-icon-btn"
+                   icon="el-icon-document-checked"
                    @click="updateCentereventTEventcatalogueStatus('qr',false)">确认
         </el-button>
         <el-button size="mini" type="primary" v-if="eventStatusButton=='qs'"
+                   class="sj-icon-btn"
+                   icon="el-icon-edit"
                    @click="updateCentereventTEventcatalogueStatus('qs',true)">签收
         </el-button>
         <el-button size="mini" type="primary" v-if="eventStatusButton=='wb'"
+                   class="sj-icon-btn"
+                   icon="el-icon-close-notification"
                    @click="updateCentereventTEventcatalogueStatus('wb',true)">误报
         </el-button>
         <el-button size="mini" type="primary" v-if="eventStatusButton=='cf'"
+                   class="sj-icon-btn"
+                   icon="el-icon-document-copy"
                    @click="updateCentereventTEventcatalogueStatus('cf',true)">重复
         </el-button>
         <el-button size="mini" type="primary" v-if="eventStatusButton=='ld'"
+                   class="sj-icon-btn"
+                   icon="el-icon-phone"
                    @click="updateCentereventTEventcatalogueStatus('ld',true)">发起联动
         </el-button>
         <el-button size="mini" type="primary" v-if="eventStatusButton=='sh'"
+                   class="sj-icon-btn"
+                   icon="el-icon-circle-check"
                    @click="updateCentereventTEventcatalogueStatus('shtg',true)">通过
         </el-button>
         <el-button size="mini" type="primary" v-if="eventStatusButton=='sh'"
+                   class="sj-icon-btn"
+                   icon="el-icon-circle-close"
                    @click="updateCentereventTEventcatalogueStatus('shbtg',true)">不通过
         </el-button>
       </el-form>
@@ -1719,6 +1733,8 @@ export default {
               setTimeout(() => {
                 this.$refs.supermapDialog.setMarkersByType(markersList, type)
               }, 1000)
+            }else {
+              this.$message.warning("当前点位附近无资源数据")
             }
           })
         } else {

+ 35 - 16
src/views/forest.vue

@@ -7,19 +7,19 @@
     <div class="visual-body">
       <!-- 左侧 -->
       <div class="leftbar" ref="left">
-        <!-- 1 基本情况 -->
+        <!-- 1 通知公告 -->
         <div class="forthis">
           <dv-border-box-13 backgroundColor="rgba(12, 19, 38, .90)"
             style="padding-bottom: 1rem;">
             <img src="../assets/images/integrated/light.png" style="width: 100%; margin-top: .4rem;" />
             <div class="this-title">
-              <span>基本情况</span>
+              <span>通知公告</span>
               <dv-decoration-3 style="width:150px;height:15px;margin-right: 1rem;" />
             </div>
             <div class="i-list-con h-14">
               <div class="d-l-con no_hover">
                 <div class="d-l-l-text w-100p no-weight">
-                  <h4 class="line-h-1 w-100p" v-html="forestInfo">{{ forestInfo }}</h4>
+                  <h4 class="line-h-1 w-100p" v-html="noticeContent">{{ noticeContent }}</h4>
                 </div>
               </div>
             </div>
@@ -348,10 +348,10 @@
               </div>
               <!--分页-->
               <div class="paging">
-                <el-button type="button" @click="getEventList(calendarDay, 10, pageNum - 1)">上一页
+                <el-button type="button" @click="getEventList(calendarDay, 10, pageNum - 1,eventSearch)">上一页
                 </el-button>
-                <!-- <span>第0页</span> -->
-                <el-button type="button" @click="getEventList(calendarDay, 10, pageNum + 1)">下一页
+                 <span>第{{pageNum}}页</span>
+                <el-button type="button":disabled="nextbutton" @click="getEventList(calendarDay, 10, pageNum + 1,eventSearch)">下一页
                 </el-button>
               </div>
             </dv-border-box-13>
@@ -425,6 +425,7 @@ import {
   getMenuEventType,
   getEventPush,
   getBaseInfo,
+  getLatestNotice,
   getTodayEvents,
   getDeptEventCount,
   getWeather,
@@ -479,6 +480,7 @@ export default {
     this.getSuperMapUrl();
 
     setTimeout(() => {
+      this.getLatestNotice()
       this.getTodayEvents(this.getCurrentDataStr())
       this.getDeptEventCount(this.getCurrentDataStr())
       this.getWeather(this.getCurrentDataStr())
@@ -487,8 +489,8 @@ export default {
       this.getEventByReportorOrder(this.getCurrentDataStr())
       this.getExposureStage(this.getCurrentDataStr())
       this.getSupermap(this.getCurrentDataStr())
+      this.title = '四平市态势感知平台'
     }, 2000)
-    this.getBaseInfo()
 
     this.getMenuEventType()
     /** ----------------------------------weosocket开始------------------------------------- */
@@ -498,9 +500,11 @@ export default {
   },
   data() {
     return {
+      nextbutton:true,
       //警报MP3文件
+      noticeContent:null,
       audioSrc: require('@/assets/jingbao.mp3'),
-
+      title:'',
       calendarDay: this.getCurrentDataStr(),
       //基本情况
       forestInfo: '', //基本情况
@@ -578,6 +582,18 @@ export default {
       this.websock = null
     }
   },
+  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"
+        }]
+    }
+  },
   /** ----------------------------------weosocket结束------------------------------------- */
   methods: {
     //初始化地图数据
@@ -839,15 +855,11 @@ export default {
         }]
       })
     },
-    getBaseInfo() {
-      //左侧获取部门信息
-      getBaseInfo().then(res => {
+    getLatestNotice() {
+      //左侧获取通知公告
+      getLatestNotice().then(res => {
         if (res.code == 200) {
-          if (res.msg == '未找到特色信息') {
-            this.forestInfo = '未找到特色信息!'
-          } else {
-            this.forestInfo = res.data.baseinfo //基本情况
-          }
+          this.noticeContent = res.data.noticeContent //通知公告
         }
       })
     },
@@ -1038,6 +1050,13 @@ export default {
         eventTypeId: that.eventTypeId
       }, loading).then(res => {
         this.eventList = res.data
+        if(res.data!==null&&res.data.length!==0&&res.data.length==10)
+        {
+          this.nextbutton=false
+        }else
+        {
+          this.nextbutton=true
+        }
         if (this.eventList != null && this.eventList.length > 0) {
           if (this.eventList[0].eventStatusValue == 'forest_event_status_1') {
             that.$refs.bottomMenu.updateAlert();

+ 148 - 124
src/views/monitor.vue

@@ -50,6 +50,7 @@
                 <div
                   class="icon-con w-33 m-btm-no"
                   :class="{ on: onLa }"
+                @click="laClick"
                 >
                   <!--@click="laClick"-->
                 <!--&gt;-->
@@ -148,7 +149,7 @@
                 v-on:click="dropLocation(item.latitude, item.longitude, index)"
               >
                 <div class="d-l-l-text">
-                  <i class="iconfont sj-icon-jkzx icon-sxt"></i>
+                  <i class="iconfont icon-sxt" :class="jkListIcon"></i>
                   <h4>{{ item.cameraName }}</h4>
                   <!-- <h4 v-if="onChuan" v-html="cgqData[index]"></h4> -->
                 </div>
@@ -176,7 +177,7 @@
                 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>
@@ -270,9 +271,9 @@ export default {
       this.selectKeyAreaList();
       this.bottomMenuList(); //获取底部公共组件消息和任务
       this.getTreeselect();
-      this.deptId = Cookies.get("deptId");
-      this.getMonitorDeviceAndDataLists(null);
-      // this.getDlblistBydeptIds(null);
+      this.deptId = parseInt(Cookies.get("deptId"));
+      this.getMonitorDeviceAndDataLists(this.deptId);
+       this.getDlblistBydeptIds();
       this.selectDeviceType(-1);
     }, 2000)
   },
@@ -281,6 +282,7 @@ export default {
   },
   data() {
     return {
+      jkListIcon:'sj-icon-jkzx',
       //摄像头名称
       cgqData: [],
       rightDeptName: undefined,
@@ -418,7 +420,7 @@ export default {
     //   }, 5000)
     // },
     /* 电视墙替换开始 */
-    showTVWall(channelCode, channelName) {
+    showTVWall(channelCode, channelName,type) {
       let tvListJson = [
         {
           switchTab: "2",
@@ -434,7 +436,7 @@ export default {
               id: "spcamera00010",
               labelCode: channelCode,
               labelName: channelName,
-              cameraType: "1",
+              cameraType: type,
               parentLabelCode: "999",
             },
           ],
@@ -446,7 +448,7 @@ export default {
                   channelCode: channelCode,
                   channelName: channelName,
                   channelSn: null,
-                  cameraType: "1",
+                  cameraType: type,
                   online: "1",
                   cameraCode: "1",
                 },
@@ -498,9 +500,9 @@ export default {
           });
         });
       } else if (that.localMark == "chuan") {
-        that.getMonitorDeviceAndDataList();
+        that.getMonitorDeviceAndDataList(data.id);
       } else if (that.localMark == "la") {
-        // that.getDlblistBydeptId();
+         that.getDlblistBydeptId(data.id);
       }
     },
     sheClick() {
@@ -508,19 +510,22 @@ export default {
       this.onShe = true;
       this.onChuan = false;
       this.localMark = "she";
+      this.deptId=Cookies.get("deptId")
       this.placeholderMsg = "请输入摄像头名称";
       clearInterval(this.cgqTimer);
       this.selectDeviceType();
+      this.jkListIcon = 'sj-icon-jkzx'
     },
     laClick() {
       this.onLa = true;
       this.onShe = false;
       this.onChuan = false;
       this.localMark = "la";
+      this.deptId=Cookies.get("deptId")
       this.placeholderMsg = "请输入云广播名称";
-      this.deptId = Cookies.get("deptId");
       clearInterval(this.cgqTimer);
       this.getDlblistBydeptId();
+      this.jkListIcon = 'sj-icon-labaguangbo'
     },
     chuanClick() {
       this.onLa = false;
@@ -528,12 +533,13 @@ export default {
       this.onChuan = true;
       this.localMark = "chuan";
       this.placeholderMsg = "请输入传感器名称";
-      this.deptId = null;
-      this.getMonitorDeviceAndDataList(null);
+      this.deptId=Cookies.get("deptId")
+      this.getMonitorDeviceAndDataList(this.deptId);
       clearInterval(this.cgqTimer);
       this.cgqTimer = setInterval(() => {
-        this.getMonitorDeviceAndDataList();
+        this.getMonitorDeviceAndDataList(this.deptId);
       }, 20000);
+      this.jkListIcon = 'sj-icon-centerdata-t-firecontrol-fire-pressure-sensor'
     },
     //传感器2
     getMonitorDeviceAndDataLists(deptId) {
@@ -542,108 +548,114 @@ export default {
         that.sensorNum = res.data.length;
       });
     },
-    // 云广播
-    // 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);
-    //     });
-    // },
-    // getDlblistBydeptIds() {
-    //   let that = this;
-    //
-    //   getDlblistBydeptId()
-    //     .then(function (res) {
-    //       that.loudspeakerNum = res.data.length;
-    //     })
-    //     .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.visuForestCloudCameraBOList=[];
+          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.visuForestCloudCameraBOList.push(dat);
+            }
+            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;
+
+      getDlblistBydeptId()
+        .then(function (res) {
+          that.loudspeakerNum = res.data.length;
+        })
+        .catch(function (error) {
+          console.error(error);
+        });
+    },
 
     getMonitorDeviceAndDataList(deptId) {
       let list = [];
@@ -1065,9 +1077,9 @@ export default {
         that.keyAreaList = res.data;
       });
     },
-    getRegionalFlag(id) {
+    getRegionalFlag(id,index) {
       //获取重点区域
-      this.listCurrentIndex3 = id;
+      this.listCurrentIndex3 = index;
       let that = this;
       getRegionalFlag(id).then((res) => {
         that.graphicsList = [];
@@ -1154,11 +1166,10 @@ export default {
     selectDeviceType() {
       //获取左侧动态感知设备
       let that = this;
-      selectDeviceType().then((res) => {
+      selectDeviceType(this.deptId).then((res) => {
         that.cameraMarkersList = [];
         that.visuForestCloudMapDeviceBOList =
           res.data.visuForestCloudMapDeviceBOList;
-
         that.region = res.data.visuForestCloudTodaySjfbBOList;
 
         if (
@@ -1205,7 +1216,7 @@ export default {
               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 = [];
@@ -1215,6 +1226,13 @@ export default {
             markersMap.lat = res.data.visuForestCloudCameraBOList[i].latitude;
             markersMap.radius =
               res.data.visuForestCloudCameraBOList[i].cameraRadius;
+            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";
+            }
             markersMap.bindPopupHtml =
               '<div class="map-tip">' +
               "<span>" +
@@ -1321,12 +1339,18 @@ export default {
               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;
@@ -1434,7 +1458,7 @@ export default {
     },
     /** 预览按钮操作 */
     preview(cameraParam) {
-      this.showTVWall(cameraParam.code, cameraParam.name);
+      this.showTVWall(cameraParam.code, cameraParam.name,cameraParam.type);
     },
 
     // /** 预览按钮操作 */

+ 58 - 14
src/views/system/login.vue

@@ -70,7 +70,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">
@@ -79,15 +79,41 @@
         </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="manual" @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>
   </div>
@@ -112,7 +138,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";
@@ -124,9 +150,13 @@
     name: "Login",
     components: {
       StarBackground,
+      SliderVerify
     },
     data() {
       return {
+        sliderOnOff: false,
+        verified: true,
+        popoverVisible:false,
         QRCode: "",
         backgroudImg: "", //背景图片
         systemTitle: {
@@ -184,7 +214,7 @@
       this.getVersionInfo();
     },
     methods: {
-      getVersionInfo(){
+      getVersionInfo() {
         getVersionInfo().then(res => {
           this.QRCode = res.data.picUrl
         })
@@ -217,11 +247,17 @@
         };
       },
       handleLogin() {
+        this.popoverVisible = true;
+        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,
@@ -253,7 +289,10 @@
                   });
                 })
                 .catch(() => {
+                  this.loginForm.password = null;
                   this.loading = false;
+                  this.popoverVisible = false;
+                  this.$refs.sliderVerify.refresh();
                   if (this.captchaOnOff) {
                     this.getCode();
                   }
@@ -262,8 +301,13 @@
           }
         });
       },
-    },
-  };
+      onFail() {},
+      onhide() {
+        this.verified = true;
+      },
+
+    }
+    };
 </script>
 <style lang="scss">
 .sj-pop {

+ 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")
     }
   }
 };

+ 1 - 1
vue.config.js

@@ -54,7 +54,7 @@ module.exports = {
       [process.env.VUE_APP_BASE_API]: {
         //target: `http://127.0.0.1:3031`,
         // target: `http://192.168.2.118:3031`,
-          target: `http://121.36.228.66:3031`,
+          target: `http://10.6.52.11:3031`,
         //  target: `https://29613561xe.eicp.vip`,
         changeOrigin: true,
         pathRewrite: {