Browse Source

Merge remote-tracking branch 'origin/visu_firecontrol' into visu_firecontrol

# Conflicts:
#	src/views/bigdata/bigdata.vue
wangzhe 2 years ago
parent
commit
3bd5267730

+ 1 - 1
.env.development

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 通榆县乡村振兴监管平台
+VUE_APP_TITLE = 四平市态势感知平台
 
 # 开发环境配置
 ENV = 'development'

+ 1 - 1
.env.production

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 通榆县乡村振兴监管平台
+VUE_APP_TITLE = 四平市态势感知平台
 
 # 生产环境配置
 ENV = 'production'

+ 1 - 1
.env.staging

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 通榆县乡村振兴监管平台
+VUE_APP_TITLE = 四平市态势感知平台
 
 NODE_ENV = production
 

+ 2 - 2
package.json

@@ -1,7 +1,7 @@
 {
   "name": "ruoyi",
   "version": "3.4.0",
-  "description": "通榆县乡村振兴监管平台",
+  "description": "四平市态势感知平台",
   "author": "若依",
   "license": "MIT",
   "scripts": {
@@ -50,7 +50,7 @@
     "html2canvas": "^1.4.1",
     "js-beautify": "1.13.0",
     "js-cookie": "3.0.1",
-    "jsencrypt": "3.2.1",
+    "jsencrypt": "^3.2.1",
     "lib-flexible": "^0.3.2",
     "nprogress": "0.2.0",
     "quill": "1.3.7",

+ 113 - 30
public/index.html

@@ -1,14 +1,14 @@
 <!DOCTYPE html>
 <html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-    <meta name="renderer" content="webkit">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <title><%= webpackConfig.name %></title>
-    <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
-	  <style>
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="renderer" content="webkit">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+  <title><%= webpackConfig.name %></title>
+  <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
+  <style>
     html,
     body,
     #app {
@@ -193,29 +193,112 @@
       color: #FFF;
       opacity: 0.5;
     }
-  </style>
-  </head>
-  <body>
-<!--  <link rel="stylesheet" href="./supermap/libs/plotting/leaflet/10.2.1/iclient-plot-leaflet.css">-->
-  <script type="text/javascript" include="leaflet,leaflet.sidebyside,iclient-leaflet,iclient-plot-leaflet,leaflet.draw,leaflet.markercluster,leaflet.heat" src="./supermap/dist/leaflet/include-leaflet.js"></script>
-  <script type="text/javascript" include="bootstrap,plottingPanel,fileupLoad,widgets.alert" src="./supermap/examples/js/include-web.js"></script>
-<!--  <script type="text/javascript" include="iclient-classic" src="./supermap/dist/classic/include-classic.js"></script>-->
-<!--  <script type="text/javascript" src="./supermap/libs/plotting/leaflet/10.2.1/iclient-plot-leaflet-es6.min.js"></script>-->
-  <script type="text/javascript" include="PlotPanel,StylePanel,SMLInfosPanel,iPortalStylePanel" src="./supermap/examples/js/plottingPanel/PlottingPanel.Include.js"></script>
+    .loading {
+      width: 40px;
+      height: 40px;
+      margin: 0 auto;
+      position: relative;
+      top: 40%;
+      position: relative;
+      -webkit-animation: load 1.5s linear infinite;
+    }
+
+    .loading div {
+      width: 100%;
+      height: 100%;
+      position: absolute;
+    }
+
+    .loading span {
+      display: inline-block;
+      width: 20px;
+      height: 20px;
+      border-radius: 50%;
+      background: #99CC66;
+      position: absolute;
+      left: 50%;
+      margin-top: -10px;
+      margin-left: -10px;
+      -webkit-animation: changeBgColor 3s ease infinite;
+    }
+
+    @-webkit-keyframes load {
+      0% {
+        -webkit-transform: rotate(0deg);
+      }
+      33.3% {
+        -webkit-transform: rotate(120deg);
+      }
+      66.6% {
+        -webkit-transform: rotate(240deg);
+      }
+      100% {
+        -webkit-transform: rotate(360deg);
+      }
+    }
+
+    @-webkit-keyframes changeBgColor {
+      0%, 100% {
+        background: #2db2cc;
+      }
+      33.3% {
+        background: #FFFF66;
+      }
+      66.6% {
+        background: #FF6666;
+      }
+    }
 
+    .loading div:nth-child(2) {
+      -webkit-transform: rotate(120deg);
+    }
+
+    .loading div:nth-child(3) {
+      -webkit-transform: rotate(240deg);
+    }
 
+    .loading div:nth-child(2) span {
+      -webkit-animation-delay: 1s;
+    }
+
+    .loading div:nth-child(3) span {
+      -webkit-animation-delay: 2s;
+    }
+
+  </style>
+</head>
+<body>
 <!--三个必要的js文件引入-->
 <!--<script src="./hk/jquery-1.12.4.min.js"></script>-->
-<script src="./hk/jsencrypt.min.js"></script>            <!-- 用于RSA加密 -->
-<script src="./hk/jsWebControl-1.0.0.min.js"></script>   <!-- 用于前端与插件交互 -->
-
-    <div id="app">
-	    <div id="loader-wrapper">
-		    <div id="loader"></div>
-		    <div class="loader-section section-left"></div>
-		    <div class="loader-section section-right"></div>
-		    <div class="load_title">正在加载系统资源,请耐心等待</div>
-        </div>
-	</div>
-  </body>
+<script src="hk/jsencrypt.min.js"></script>            <!-- 用于RSA加密 -->
+<script src="hk/jsWebControl-1.0.0.min.js"></script>   <!-- 用于前端与插件交互 -->
+<!--<script src="h5player/h5player.min.js"></script>-->
+
+
+
+<!--  <link rel="stylesheet" href="./supermap/libs/plotting/leaflet/10.2.1/iclient-plot-leaflet.css">-->
+<script type="text/javascript"
+        include="leaflet,leaflet.sidebyside,iclient-leaflet,iclient-plot-leaflet,leaflet.draw,leaflet.markercluster,leaflet.heat"
+        src="./supermap/dist/leaflet/include-leaflet.js"></script>
+<script type="text/javascript" include="bootstrap,plottingPanel,fileupLoad,widgets.alert"
+        src="./supermap/examples/js/include-web.js"></script>
+<!--  <script type="text/javascript" include="iclient-classic" src="./supermap/dist/classic/include-classic.js"></script>-->
+<!--  <script type="text/javascript" src="./supermap/libs/plotting/leaflet/10.2.1/iclient-plot-leaflet-es6.min.js"></script>-->
+<script type="text/javascript" include="PlotPanel,StylePanel,SMLInfosPanel,iPortalStylePanel"
+        src="./supermap/examples/js/plottingPanel/PlottingPanel.Include.js"></script>
+<div id="app">
+  <div class="loading">
+    <div><span></span></div>
+    <div><span></span></div>
+    <div><span></span></div>
+  </div>
+  <div style="top: 48%; position: absolute; left: 50%; transform: translateX(-50%);">正在努力加载中,请稍候...</div>
+  <!--<div id="loader-wrapper">-->
+  <!--<div id="loader"></div>-->
+  <!--<div class="loader-section section-left"></div>-->
+  <!--<div class="loader-section section-right"></div>-->
+  <!--<div class="load_title">正在加载系统资源,请耐心等待</div>-->
+  <!--</div>-->
+</div>
+</body>
 </html>

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

@@ -22,6 +22,7 @@ export const iconList = {
   'sj-icon-map-qianshou': require('@/assets/icons/sj-icon-map/sj-icon-map-qianshou.png'),//签收
   'sj-icon-map-guidang': require('@/assets/icons/sj-icon-map/sj-icon-map-guidang.png'),//归档
   'sj-icon-map-banjie': require('@/assets/icons/sj-icon-map/sj-icon-map-banjie.png'),//办结
+  'sj-icon-map-queren': require('@/assets/icons/sj-icon-map/sj-icon-map-queren.png'),//确认
 
 
 

+ 8 - 0
src/api/encrypt.js

@@ -0,0 +1,8 @@
+import { JSEncrypt } from 'jsencrypt'
+
+export function encryptedData(publicKey,password){
+  const encryptor = new JSEncrypt()
+  encryptor.setPublicKey(publicKey)
+  return encryptor.encrypt(password+'')
+}
+

+ 5 - 2
src/api/event.js

@@ -1,10 +1,13 @@
 import request from '@/utils/request'
 
 //获取附近事件
-export function getNearEvent(longitude,latitude) {
+export function getNearEvent(longitude,latitude,day,loading) {
   return request({
-    url: '/center-firecontrol/VisuForestEventCenterController/getNearEvent?longitude='+longitude+"&latitude="+latitude,
+    url: '/center-firecontrol/VisuForestEventCenterController/getNearEvent?longitude='+longitude+"&latitude="+latitude+"&day="+day,
     method: 'get',
+    headers: {
+      loading: loading
+    },
   })
 }
 //获取附近摄像头

+ 57 - 17
src/api/forest.js

@@ -8,19 +8,25 @@ export function getBaseInfo() {
   })
 }
 // 左侧获取事件信息统计
-export function getTodayEvents(param) {
+export function getTodayEvents(param,loading) {
   return request({
     url: '/center-firecontrol/VisuForestCloudMapController/getTodayEvents',
     method: 'post',
-    data: param
+    data: param,
+    headers: {
+      loading: loading
+    },
   })
 }
 // 左侧获取事件部门数量
-export function getDeptEventCount(param) {
+export function getDeptEventCount(param,loading) {
   return request({
     url: '/center-firecontrol/VisuForestCloudMapController/getDeptEventCount',
     method: 'post',
-    data: param
+    data: param,
+    headers: {
+      loading: loading
+    },
   })
 }
 // 右侧获取天气
@@ -32,21 +38,26 @@ export function getWeather(param) {
   })
 }
 
-
 // 右侧获取事件列表
-export function getEventList(param) {
+export function getEventList(param,loading) {
   return request({
     url: '/center-firecontrol/VisuForestCloudMapController/getEventList',
     method: 'post',
-    data: param
+    data: param,
+    headers: {
+      loading: loading
+    },
   })
 }
 // 右侧获取曝光台列表
-export function getExposureStage(param) {
+export function getExposureStage(param,loading) {
   return request({
     url: 'center-firecontrol/VisuForestCloudMapController/getExposureStage',
     method: 'post',
-    data: param
+    data: param,
+    headers: {
+      loading: loading
+    },
   })
 }
 
@@ -67,19 +78,25 @@ export function getEventByCalendar(param) {
   })
 }
 // 获取事件分类
-export function getEventByEventType(param) {
+export function getEventByEventType(param,loading) {
   return request({
     url: '/center-firecontrol/VisuForestCloudMapController/getEventByEventType',
     method: 'post',
-    data: param
+    data: param,
+    headers: {
+      loading: loading
+    },
   })
 }
 // 获取上报排名
-export function getEventByReportorOrder(param) {
+export function getEventByReportorOrder(param,loading) {
   return request({
     url: '/center-firecontrol/VisuForestCloudMapController/getEventByReportorOrder',
     method: 'post',
-    data: param
+    data: param,
+    headers: {
+      loading: loading
+    },
   })
 }
 // 日志文件上传
@@ -98,7 +115,6 @@ export function sendEventLog(param) {
     data: param
   })
 }
-
 // 事件处理流程
 export function updateCentereventTEventcatalogueStatus(param) {
   return request({
@@ -226,10 +242,34 @@ export function dutysystemRemove(param) {
     params:param
   })
 }
-// 事件短信联系人
+
+// 通过部门id获取责任人
 export function userFeginlist(param) {
   return request({
-    url: '/center-firecontrol/VisuForestCloudMapController/userFeginlist',
-    method: 'post'
+    url: '/system/user/selectUserWithPostByDeptId',
+    method: 'get',
+    params:param
+  })
+}
+
+// 获取消息个数
+export function selectMessageCount(userId) {
+  return request({
+    url: '/center-message/centerMessageFeign/selectMessageCount/'+userId,
+    method: 'get'
+  })
+}
+// 获取消息列表
+export function selectMessageList(userId) {
+  return request({
+    url: '/center-message/centerMessageFeign/selectMessageList/'+userId,
+    method: 'get'
+  })
+}
+// 获取消息详情
+export function selectMessageById(messageId) {
+  return request({
+    url: '/center-message/centerMessageFeign/selectMessageById/'+messageId,
+    method: 'get'
   })
 }

+ 20 - 1
src/api/login.js

@@ -1,5 +1,16 @@
 import request from '@/utils/request'
 
+// 获取密码加密传输公钥
+export function getSecretKey() {
+  return request({
+    url: '/auth/getSecretKey',
+    headers: {
+      isToken: false
+    },
+    method: 'post'
+  })
+}
+
 // 登录方法
 export function login(username, password, code, uuid) {
   return request({
@@ -58,4 +69,12 @@ export function getCodeImg() {
     method: 'get',
     timeout: 20000
   })
-}
+}
+
+//获取登录页基本信息
+export function fontConfig() {
+  return request({
+    url: '/system/fontConfig/getSysFontConfig/Firecontrol',
+    method: 'get',
+  })
+}

+ 25 - 0
src/api/meeting.js

@@ -0,0 +1,25 @@
+import request from '@/utils/request'
+
+// 查询该事件是否有会议
+export function hasConferences(eventId) {
+  return request({
+    url: '/center-event/hwMeeting/hasConferences?eventId=' + eventId,
+    method: 'post'
+  })
+}
+
+// 根据事件ID和标题创建会议
+export function createConferences(eventId, subject) {
+  return request({
+    url: '/center-event/hwMeeting/createConferences?eventId='+eventId+'&subject='+subject,
+    method: 'post'
+  })
+}
+
+// 获取登录人信息
+export function getUserInfo() {
+  return request({
+    url: '/center-event/hwMeeting/getUserInfo',
+    method: 'get'
+  })
+}

+ 8 - 0
src/api/system/config.js

@@ -58,3 +58,11 @@ export function refreshCache() {
     method: 'delete'
   })
 }
+
+//获取配置信息
+export function selectConfigKey(configKey) {
+  return request({
+    url: '/system/config/selectConfigKey/' + configKey,
+    method: 'get'
+  })
+}

BIN
src/assets/icons/sj-icon-map/sj-icon-map-queren.png


BIN
src/assets/images/bell.gif


BIN
src/assets/jingbao.mp3


+ 30 - 7
src/assets/styles/base.scss

@@ -65,6 +65,7 @@ $eventStateColor-wb: #c2bc43;
 $eventStateColor-cf: #a23737;
 $eventStateColor-bj: #6ae08f;
 $eventStateColor-gd: #0369ef;
+$eventStateColor-qr: #20EF56;
 
 $eventStateColor-xsb: #11b57e;
 $eventStateColor-cb: #e63b4a;
@@ -570,7 +571,7 @@ div::-webkit-scrollbar {
 }
 
 .dia-event-info {
-	
+
 
   .el-row {
     height: 780px;
@@ -581,7 +582,7 @@ div::-webkit-scrollbar {
     position: absolute;
     z-index: 999;
     //超图绘制截屏
-	
+
 	button {
 	  padding: 0 .3rem;
 	  height: 1.5rem;
@@ -589,18 +590,18 @@ div::-webkit-scrollbar {
 	  color: $inBlue;
 	  border: 1px $searchBorder;
 	}
-	
+
 	button:hover {
 	  text-shadow: 0 0 15px rgba($color: $inBlueHover, $alpha: 1.0);
 	}
 	.fire-m{
-		position: absolute; 
-		right: 1rem; 
+		position: absolute;
+		right: 1rem;
 		bottom: 1rem;
 		z-index:100000;
-		
+
 	}
-	
+
     .leaflet-pane .leaflet-overlay-pane {
       height: 780px !important;
       width: 1340px !important;
@@ -2490,6 +2491,28 @@ div::-webkit-scrollbar {
       }
     }
 
+    //确认
+    .event-state-qr {
+      display: flex;
+      align-items: center;
+
+      i {
+        color: $eventStateColor-qr;
+        font-size: 1rem;
+        margin-left: -.5rem;
+      }
+
+      .event-list-state-qr {
+        width: fit-content;
+        background-color: $eventStateColor-qr;
+        color: $white;
+        padding:0.25rem 0.4rem;
+        margin-left: -.5rem;
+        margin-bottom: .2rem;
+        border-radius: .2rem;
+      }
+    }
+
     .bgt-info-name {
       color: $inBlue;
       font-weight: bolder;

+ 65 - 58
src/components/TVWall.vue

@@ -2,28 +2,30 @@
   <div>
     <el-dialog title="电视墙" :visible.sync="TVWallVisible" v-if="TVWallVisible" customClass="TVWallCustomWidth"
                @close="cancelEventLocationShow()">
-	  <div class="forthis" style="width: 22%; position: absolute;left: 0;z-index: 9999999999999;">
-	  	<!-- <div class="this-title">
-	  		<span>林场</span>
-	  		<span>45</span>
-	  	</div> -->
-	  	<div class="i-list-con" style="height: 46vh; overflow-y: scroll;">
-	  		<span v-for="(item,index) in cameraList" :key="index">
-	  			<div class="d-l-con" @click="playhk(item.channelCode)">
-	  				<div class="d-l-l-text">
-	  					<i class="i-small"></i>
-	  					<h4>{{ item.cameraName }}</h4>
-	  				</div>
-	  			</div>
-	  		</span>
-	  	</div>
-	  </div>
-      <div style="width:70%;height:400px;position:absolute;">
-        <!--视频窗口展示---大华-->
-        <div id="dom1" class="dom1"></div>
-        <!--视频窗口展示---海康-->
-        <div id="playWnd" class="playWnd" style="left: 0px; top: 0px;"></div>
-      </div>
+	  <!--<div class="forthis" style="width: 22%; position: absolute;left: 0;z-index: 9999999999999;">-->
+	  	<!--&lt;!&ndash; <div class="this-title">-->
+	  		<!--<span>林场</span>-->
+	  		<!--<span>45</span>-->
+	  	<!--</div> &ndash;&gt;-->
+	  	<!--<div class="i-list-con" style="height: 46vh; overflow-y: scroll;">-->
+	  		<!--<span v-for="(item,index) in cameraList" :key="index">-->
+	  			<!--<div class="d-l-con" @click="playhk(item.channelCode)">-->
+	  				<!--<div class="d-l-l-text">-->
+	  					<!--<i class="i-small"></i>-->
+	  					<!--<h4>{{ item.cameraName }}</h4>-->
+	  				<!--</div>-->
+	  			<!--</div>-->
+	  		<!--</span>-->
+	  	<!--</div>-->
+	  <!--</div>-->
+      <!--<div style="width:70%;height:400px;position:absolute;">-->
+        <!--&lt;!&ndash;视频窗口展示-&#45;&#45;大华&ndash;&gt;-->
+        <!--<div id="dom1" class="dom1"></div>-->
+        <!--&lt;!&ndash;视频窗口展示-&#45;&#45;海康&ndash;&gt;-->
+        <!--<div id="playWnd" class="playWnd" style="left: 0px; top: 0px;"></div>-->
+      <!--</div>-->
+
+      <div id="dom1" class="dom1"></div>
     </el-dialog>
   </div>
 
@@ -249,8 +251,8 @@ export default {
         }],
       crtPosX: 0,
       crtPosY: 0,
-      crtWidth: 740,
-      crtHeight: 400,
+      crtWidth: 1150,
+      crtHeight: 700,
       domId: 'dom1',
       mixedVideoDisplayMode: 2,
       isShowTipe: true,
@@ -262,12 +264,14 @@ export default {
     }
   },
   created() {
+    const DHWsInstance = DHWs.getInstance()
+    this.ws = DHWsInstance
   },
   methods: {
     cancelEventLocationShow() {
       // this.activeName = 'tv'
       this.TVWallVisible = false
-      // this.destroy()
+      this.destroy()
 
       if (this.oWebControl != null) {
         this.oWebControl.JS_HideWnd()   // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
@@ -278,40 +282,38 @@ export default {
       }
     },
     showTVWall() {
-      let that=this;
+      // let that=this;
       /** ----------------------------------大华摄像头预览开始------------------------------------- */
-      // const DHWsInstance = DHWs.getInstance()
-      // this.ws = DHWsInstance
-      // this.ws.addEventListener('connectStateChange', data => {
-      //   if (data) {
-      //     console.log('连接成功')
-      //   } else {
-      //     console.log('连接失败,下载客户端')
-      //     this.alertReinstall()
-      //     // this.isShowTipe && this.$modal.confirm({
-      //     //   title: '下载客户端',
-      //     //   content: '检测到您未安装部分插件,将影响部分功能使用,请下载后使用?',
-      //     //   onOk: () => {
-      //     //     //这里写下载方法
-      //     //     this.isShowTipe = false
-      //     //   },
-      //     //   onCancel: () => {
-      //     //     this.isShowTipe = false
-      //     //   }
-      //     // });
-      //   }
-      // })
-      // this.preview()
+      this.ws.addEventListener('connectStateChange', data => {
+        if (data) {
+          console.log('连接成功')
+        } else {
+          console.log('连接失败,下载客户端')
+          this.alertReinstall()
+          this.isShowTipe && this.$modal.confirm({
+            title: '下载客户端',
+            content: '检测到您未安装部分插件,将影响部分功能使用,请下载后使用?',
+            onOk: () => {
+              //这里写下载方法
+              this.isShowTipe = false
+            },
+            onCancel: () => {
+              this.isShowTipe = false
+            }
+          });
+        }
+      })
+      this.preview()
       /** ----------------------------------大华摄像头预览结束------------------------------------- */
       /** ----------------------------------海康摄像头预览开始------------------------------------- */
-      tvCameraList().then(response => {
-        this.cameraList=response.data
-      })
-      that.initPlugin()
-      setTimeout(function() {
-        that.playhk();
-      }, 5000)
-      /** ----------------------------------海康摄像头预览结束------------------------------------- */
+      // tvCameraList().then(response => {
+      //   this.cameraList=response.data
+      // })
+      // that.initPlugin()
+      // setTimeout(function() {
+      //   that.playhk();
+      // }, 5000)
+      // /** ----------------------------------海康摄像头预览结束------------------------------------- */
       this.TVWallVisible = true
     },
     /** ----------------------------------大华摄像头预览开始------------------------------------- */
@@ -339,8 +341,12 @@ export default {
                 loginPort: newResponse.loginPort,
                 userName: newResponse.userName,
                 userPwd: newResponse.userPwd,
+                // loginIp: '192.168.100.100',
+                // loginPort: 8314,
+                // userName: 'system',
+                // userPwd: 'Admin@123',
                 token: '',
-                https: 1
+                https: 0
               })
               this.ws.on('loginState', (res) => {
                 this.isLogin = res
@@ -362,6 +368,7 @@ export default {
     },
 
     create(tvListJson) { // 调用创建控件接口
+      debugger
       let _this = this
       const params = [
         {
@@ -372,7 +379,7 @@ export default {
             'splitNum': 1,
             'channelList': [
               {
-                'channelId': '8ORBqXFlA1D77U45SM1ROC'
+                'channelId': ''
               }
             ]
           },

+ 204 - 46
src/components/eventLocation.vue

@@ -77,6 +77,12 @@
                             归档
                           </div>
                         </div>
+                        <div v-if="item.eventStatusValue=='forest_event_status_7'" class="event-state-qr">
+                          <i class="el-icon-caret-left"></i>
+                          <div class="event-list-state-qr">
+                            确认
+                          </div>
+                        </div>
                         <div class="bgt-info-name">{{ item.reportor }} {{ item.eventName }}</div>
                         <div class="bgt-info-place">
                           <ul>
@@ -315,7 +321,7 @@ export default {
         isAggregation: false
       }]
       let that = this
-      getNearEvent(that.longitude, that.latitude).then(res => {
+      getNearEvent(that.longitude, that.latitude,'').then(res => {
         that.markersList = []
         that.eventList = res.data
         if (that.eventList != null && that.eventList.length > 0) {
@@ -351,6 +357,9 @@ export default {
             } else if (that.eventList[i].eventStatusValue == 'forest_event_status_6') {
               markersMap.click = 'showEventDialog'
               markersMap.icon = 'sj-icon-map-guidang'
+            } else if (that.eventList[i].eventStatusValue == 'forest_event_status_7') {
+              markersMap.click = 'showEventDialog'
+              markersMap.icon = 'sj-icon-map-queren'
             }
             markersMap.parameter = that.eventList[i].eventCode
             markersMap.lng = that.eventList[i].longitude
@@ -393,7 +402,7 @@ export default {
             that.$refs.eventLocationSupermap.clearM(false)
             that.$refs.eventLocationSupermap.clearM(true)
             that.$refs.eventLocationSupermap.setMarkers(that.markersList)
-              that.$refs.eventLocationSupermap.setMarkers(marker)
+            that.$refs.eventLocationSupermap.setMarkers(marker)
           }, 1000)
         } else {
           setTimeout(() => {
@@ -436,10 +445,17 @@ export default {
                 icon: 'camera',
                 bindPopupHtml: '',
                 click: 'preview',
-                parameter: res.data[i].cameraCode,
                 keepBindPopup: false,
                 isAggregation: false
               }
+              if (res.data[i].cameraCode != null) {
+                markersMap.parameter = {
+                  code: res.data[i].cameraCode,
+                  type: res.data[i].cameraFactory
+                }
+              } else {
+                markersMap.parameter = []
+              }
               if (res.data.length > 50) {
                 markersMap.isAggregation = true
               }
@@ -467,8 +483,7 @@ export default {
                 '<span>' +
                 '                  <div class="d-l-con">' +
                 '                  <div class="d-l-l-text">' +
-                '                  <h4>摄像头类型:' + res.data[i]
-                  .cameraFactory + '</h4>' +
+                '                  <h4>摄像头类型:' + (res.data[i].cameraFactory=="1"?"大华":"海康") + '</h4>' +
                 '                </div>' +
                 '                </div>' +
                 '                </span>' +
@@ -489,7 +504,7 @@ export default {
               that.$refs.eventLocationSupermap.setMarkersRadius(that.cameraMarkersList)
               that.$refs.eventLocationSupermap.setMarkers(marker)
             }, 1000)
-          }else{
+          } else {
             setTimeout(() => {
               that.$refs.eventLocationSupermap.clearM(true)
               that.$refs.eventLocationSupermap.clearM(false)
@@ -520,50 +535,58 @@ export default {
     alertReinstall: function() {
       this.$modal.msgWarning('请重新安装客户端')
     },
+    cancelEventLocationShow() {
+      if (this.oWebControl != null) {
+        this.oWebControl.JS_HideWnd()   // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
+        this.oWebControl.JS_Disconnect().then(function() {  // 断开与插件服务连接成功
+          },
+          function() {  // 断开与插件服务连接失败
+          })
+      }
+    },
     /** 预览按钮操作 */
-    preview(cameraCode) {
-      let that = this
-      // getDahuaVideoServer().then(newResponse => {
-      //   console.log(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,
-      //         token: '',
-      //         https: 1
-      //       })
-      //       this.ws.on('loginState', (res) => {
-      //         this.isLogin = res
-      //         console.log('---res-----', res)
-      //         if (res) {
-      //           this.alertLoginSuccess()
-      //           this.activePanel = 'key2'
-      //           this.realTimeVideoDialog(channelCode)
-      //         } else {
-      //           this.alertLoginFailed()
-      //         }
-      //       })
-      //     } else { // 连接客户端失败
-      //       this.alertReinstall()
-      //     }
-      //   })
-      // })
-      that.cameraVisible = true
-      getHaiKangVideoServer({ cameraCode: cameraCode }).then(newResponse => {
-        that.cameraTitle = '摄像头-' + newResponse.data.cameraName
-        that.initPlugin(newResponse.data.appkey, newResponse.data.loginIp, newResponse.data.secret, newResponse.data.loginPort)
-        that.$nextTick(() => {
-          console.log(that.oWebControl)
+    preview(cameraParam) {
+      if (cameraParam.type == '1') {
+        getDahuaVideoServer().then(newResponse => {
+          console.log(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,
+                token: '',
+                https: 0
+              })
+              this.ws.on('loginState', (res) => {
+                this.isLogin = res
+                console.log('---res-----', res)
+                if (res) {
+                  this.alertLoginSuccess()
+                  this.activePanel = 'key2'
+                  this.realTimeVideoDialog(cameraParam.code)
+                } else {
+                  this.alertLoginFailed()
+                }
+              })
+            } else { // 连接客户端失败
+              this.alertReinstall()
+            }
+          })
+        })
+      } else if (cameraParam.type == '0') {
+        let that = this
+        that.cameraVisible = true
+        getHaiKangVideoServer({ cameraCode: cameraParam.code }).then(newResponse => {
+          that.cameraTitle = '摄像头-' + newResponse.data.cameraName
+          that.initPlugin(newResponse.data.appkey, newResponse.data.loginIp, newResponse.data.secret, newResponse.data.loginPort)
           setTimeout(function() {
-            console.log(that.oWebControl)
             that.playhk(newResponse.data.channelCode)
           }, 5000)
         })
-      })
+      }
 
     },
     realTimeVideoDialog(cameraParams) { // 调用弹窗实时播放接口
@@ -571,10 +594,144 @@ export default {
         this.$Message.info('正在登陆客户端,请稍等......')
         return false
       }
-      this.ws.openVideo(cameraParams)
+      const params = [cameraParams]
+      this.ws.openVideo(params)
     },
     /** ----------------------------------摄像头预览结束------------------------------------- */
 
+
+    /** ----------------------------------海康摄像头预览开始------------------------------------- */
+    // 创建播放实例
+    initPlugin(newappkey, newloginIp, newsecret, newloginPort) {
+      let that = this
+      that.oWebControl = new WebControl({
+        szPluginContainer: 'playWnd',                       // 指定容器id
+        iServicePortStart: 15900,                           // 指定起止端口号,建议使用该值
+        iServicePortEnd: 15909,
+        szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11',   // 用于IE10使用ActiveX的clsid
+        cbConnectSuccess: function() {                     // 创建WebControl实例成功
+          that.oWebControl.JS_StartService('window', {         // WebControl实例创建成功后需要启动服务
+            dllPath: './VideoPluginConnect.dll'         // 值"./VideoPluginConnect.dll"写死
+          }).then(function() {                           // 启动插件服务成功
+            that.oWebControl.JS_SetWindowControlCallback({   // 设置消息回调
+              cbIntegrationCallBack: cbIntegrationCallBack
+            })
+
+            that.oWebControl.JS_CreateWnd('playWnd', 1020, 600).then(function() { //JS_CreateWnd创建视频播放窗口,宽高可设定
+              that.init(newappkey, newloginIp, newsecret, newloginPort)  // 创建播放实例成功后初始化
+            })
+          }, function() { // 启动插件服务失败
+          })
+        },
+        cbConnectError: function() { // 创建WebControl实例失败
+          that.oWebControl = null
+          $('#playWnd').html('插件未启动,正在尝试启动,请稍候...<a href="./hk/VideoWebPlugin.exe">点击下载插件</a>')
+          WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数,采用wakeup来启动程序
+          initCount++
+          if (initCount < 3) {
+            setTimeout(function() {
+              that.initPlugin(newappkey, newloginIp, newsecret, newloginPort)
+            }, 3000)
+          } else {
+            $('#playWnd').html('插件启动失败,请检查插件是否安装!<a href="./hk/VideoWebPlugin.exe">点击下载插件</a>')
+          }
+        },
+        cbConnectClose: function(bNormalClose) {
+          // 异常断开:bNormalClose = false
+          // JS_Disconnect正常断开:bNormalClose = true
+          console.log('cbConnectClose')
+          that.oWebControl = null
+        }
+      })
+    },
+    //播放海康摄像头
+    playhk(channelCode) {
+      var cameraIndexCode = channelCode     //获取输入的监控点编号值,必填
+      var streamMode = 0                                     //主子码流标识:0-主码流,1-子码流
+      var transMode = 1                                      //传输协议:0-UDP,1-TCP
+      var gpuMode = 0                                        //是否启用GPU硬解,0-不启用,1-启用
+      var wndId = -1                                         //播放窗口序号(在2x2以上布局下可指定播放窗口)
+
+      cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, '')
+      cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, '')
+
+      this.oWebControl.JS_RequestInterface({
+        funcName: 'startPreview',
+        argument: JSON.stringify({
+          cameraIndexCode: cameraIndexCode,                //监控点编号
+          streamMode: streamMode,                         //主子码流标识
+          transMode: transMode,                           //传输协议
+          gpuMode: gpuMode,                               //是否开启GPU硬解
+          wndId: wndId                                     //可指定播放窗口
+        })
+      })
+    },
+    //初始化
+    init(newappkey, newloginIp, newsecret, newloginPort) {
+      let that = this
+      that.getPubKey(function() {
+        ////////////////////////////////// 请自行修改以下变量值	////////////////////////////////////
+        var appkey = newappkey                           //综合安防管理平台提供的appkey,必填
+        var secret = that.setEncrypt(newsecret)   //综合安防管理平台提供的secret,必填
+        var ip = newloginIp                           //综合安防管理平台IP地址,必填
+        var playMode = 0                                  //初始播放模式:0-预览,1-回放
+        var port = Number(newloginPort)                                    //综合安防管理平台端口,若启用HTTPS协议,默认443
+        var snapDir = 'D:\\SnapDir'                       //抓图存储路径
+        var videoDir = 'D:\\VideoDir'                     //紧急录像或录像剪辑存储路径
+        var layout = '1x1'                                //playMode指定模式的布局
+        var enableHTTPS = 1                               //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
+        var encryptedFields = 'secret'					   //加密字段,默认加密领域为secret
+        var showToolbar = 1                               //是否显示工具栏,0-不显示,非0-显示
+        var showSmart = 1                                 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
+        var buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769'  //自定义工具条按钮
+        ////////////////////////////////// 请自行修改以上变量值	////////////////////////////////////
+
+        that.oWebControl.JS_RequestInterface({
+          funcName: 'init',
+          argument: JSON.stringify({
+            appkey: appkey,                            //API网关提供的appkey
+            secret: secret,                            //API网关提供的secret
+            ip: ip,                                    //API网关IP地址
+            playMode: playMode,                        //播放模式(决定显示预览还是回放界面)
+            port: port,                                //端口
+            snapDir: snapDir,                          //抓图存储路径
+            videoDir: videoDir,                        //紧急录像或录像剪辑存储路径
+            layout: layout,                            //布局
+            enableHTTPS: enableHTTPS,                  //是否启用HTTPS协议
+            encryptedFields: encryptedFields,          //加密字段
+            showToolbar: showToolbar,                  //是否显示工具栏
+            showSmart: showSmart,                      //是否显示智能信息
+            buttonIDs: buttonIDs                       //自定义工具条按钮
+          })
+        }).then(function(oData) {
+          that.oWebControl.JS_Resize(1020, 600)  // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
+        })
+      })
+    },
+    //获取公钥
+    getPubKey(callback) {
+      let that = this
+      that.oWebControl.JS_RequestInterface({
+        funcName: 'getRSAPubKey',
+        argument: JSON.stringify({
+          keyLength: 1024
+        })
+      }).then(function(oData) {
+        console.log(oData)
+        if (oData.responseMsg.data) {
+          that.pubKey = oData.responseMsg.data
+          callback()
+        }
+      })
+    },
+//RSA加密
+    setEncrypt(value) {
+      var encrypt = new JSEncrypt()
+      encrypt.setPublicKey(this.pubKey)
+      return encrypt.encrypt(value)
+    },
+    /** ----------------------------------海康摄像头预览结束------------------------------------- */
+
     /** ----------------------------------事件弹窗开始------------------------------------- */
     editableLayers(processedState) {
       if (processedState == 'notProcessedSupermap') {
@@ -767,6 +924,7 @@ export default {
     /** ----------------------------------海康摄像头预览结束------------------------------------- */
   }
 }
+
 // 推送消息
 function cbIntegrationCallBack(oData) {
   console.log(JSON.stringify(oData.responseMsg))

+ 73 - 26
src/components/supermap.vue

@@ -19,7 +19,7 @@
     </div>
 
     <div id="toolbar-heat" v-if="isheatPlotting" class="panel panel-primary"
-         style="position:absolute;z-index: 9999; padding: 1rem; bottom:3rem;right: 1rem; border-radius: 4px; width: fit-content;height:635px;overflow-y:scroll;background:#040b1f">
+         style="position:absolute;z-index: 9999; padding: 1rem; bottom:3rem;right: 1rem; border-radius: 4px; width: fit-content;height:fit-content;overflow-y:scroll;background:#040b1f">
       <div class="panel-body content">
         <div class="panel">
           <div class="input-group">
@@ -39,12 +39,45 @@
         <div class="panel">
           <div class="input-group">
             <span class="input-group-addon">风速</span>
-            <input type="text" class="form-control" id="heatNums1" value="20"/>
+            <input type="text" class="form-control" id="heatNums1" value="6"/>
           </div>
         </div>
 		<div class="panel">
-        <el-button type="success" @click="createHeatPoints">标绘</el-button>
-        <el-button type="success" @click="clearHeatPoints">取消标绘</el-button>
+		  <div class="input-group">
+		    <span class="input-group-addon">温度</span>
+		    <input type="text" class="form-control" id="heatNums2" value="10℃"/>
+		  </div>
+		</div>
+		<div class="panel">
+		  <div class="input-group">
+		    <span class="input-group-addon">湿度</span>
+		    <input type="text" class="form-control" id="heatNums3" value="6%RH"/>
+		  </div>
+		</div>
+		<div class="panel">
+		  <div class="input-group">
+		    <span class="input-group-addon">持续时间</span>
+		    <input type="text" class="form-control" id="heatNums4" value="60分钟"/>
+		  </div>
+		</div>
+		<div class="panel">
+		<div class="input-group">
+		  <span class="input-group-addon">植被类型</span>
+		  <select class="form-control" style="width:auto" id="heatNums5">
+		    <option value="1">针叶林</option>
+		    <option value="31">落叶林</option>
+		  </select>
+		</div>
+		</div>
+		<div class="panel">
+		  <div class="input-group">
+		    <span class="input-group-addon">大气压</span>
+		    <input type="text" class="form-control" id="heatNums6" value="101.325kPa"/>
+		  </div>
+		</div>
+		<div class="panel">
+        <el-button type="success" @click="createHeatPoints">分析</el-button>
+        <el-button type="success" @click="clearHeatPoints">重置</el-button>
 		</div>
       </div>
     </div>
@@ -65,6 +98,7 @@ import {
   getSuperMap,
   iconList
 } from '@/api/components/supermap.js'
+import { selectConfigKey } from "@/api/system/config";
 // import {setToken} from '../plugins/auth'
 import modal from '@/plugins/modal'
 
@@ -96,7 +130,8 @@ export default {
       heatMapLayer: [], //火灾蔓延图层Layer
       isheatPlotting: false,//火灾蔓延
       heat_lat: 0, //火灾蔓延经纬度
-      heat_lng: 0 //火灾蔓延经纬度
+      heat_lng: 0, //火灾蔓延经纬度
+      host:''
     }
   },
   watch: {
@@ -166,6 +201,7 @@ export default {
     }
   },
   mounted() {
+    this.getspuerMapHost()
     this.initMap()
     //添加画图的提示信息
     window.L.drawLocal.draw.toolbar = {
@@ -563,16 +599,16 @@ export default {
     },
     /** ----------------------------------火势蔓延  结束------------------------------------- */
     /** ----------------------------------热力图  结束------------------------------------- */
-    loadHeatMap: async function() {
+    loadHeatMap: async function(points) {
       var heatNumbers = 150, heatRadius = 30
       var num = parseInt(heatNumbers)
       num = (num > 0) ? num : 0
       var radius = parseInt(heatRadius)
       radius = (radius > 0) ? radius : 0
-      var heatPoints = []
-      for (var i = 0; i < num; i++) {
-        heatPoints[i] = [Math.random() * 0.28 + 42, Math.random() * 0.5 + 125, Math.random() * 80]
-      }
+      var heatPoints = points
+      // for (var i = 0; i < num; i++) {
+      //   heatPoints[i] = [Math.random() * 0.28 + 42, Math.random() * 0.5 + 125, Math.random() * 80]
+      // }
       var resultLayer = window.L.heatLayer(heatPoints, {
         radius: radius,
         minOpacity: 0.5
@@ -669,6 +705,7 @@ export default {
           return
         }
         getSuperMap(this.codes).then(resp => {
+
           let mapList = resp.data
           if (mapList != null && mapList.length > 0) {
             let url = mapList[0].url
@@ -1033,7 +1070,7 @@ export default {
         })
         let markerClick = window.L.marker([markersList[i].lat, markersList[i].lng], {
           icon: icon
-        })
+        }).addTo(this.map)
         if (markersList[i].bindPopupHtml != null && markersList[i].bindPopupHtml !== '') {
           let html = markersList[i].bindPopupHtml
           if (keepBindPopup) {
@@ -1192,6 +1229,9 @@ export default {
     dropLocation10: function(lat, lng) { //落点定位
       this.map.flyTo([lat, lng], 10, { duration: 2 })
     },
+    dropLocation5: function(lat, lng) { //落点定位
+      this.map.flyTo([lat, lng], 5, { duration: 2 })
+    },
     controlLevel: function(level) { //控制地图缩放级别
       this.map.setZoom(level)
     },
@@ -1225,24 +1265,29 @@ export default {
     PlottingDrawCancel: function() {
       this.plottingdrawControl.handler.disable()
     },
+    getspuerMapHost(){
+      selectConfigKey('superMap.iserver.plot').then(res => {
+        this.host = res.data;
+      })
+    },
     dynamicPlotting: function() {
       setTimeout(() => {
-        var host = 'https://iserver.supermap.io'
-        var serverUrl = host + '/iserver/services/plot-jingyong/rest/plot/'
+          var host = this.host
+          var serverUrl = host + '/iserver/services/plot-jingyong/rest/plot/'
 
-        var me = this
-        this.plottingLayer = window.L.supermap.plotting.plottingLayer('plot',
-          serverUrl)
-        this.plottingLayer.spatialAnalystUrl =
-          host + '/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst'
-        this.plottingLayer.addTo(this.map)
-        this.plottingdrawControl = window.L.supermap.plotting.drawControl(this
-          .plottingLayer)
-        this.plottingdrawControl.addTo(this.map)
-        var editControl = window.L.supermap.plotting.editControl()
-        editControl.addTo(this.map)
-        window.L.supermap.plotting.initPlotPanel('plotPanel', serverUrl, this
-          .plottingdrawControl)
+          var me = this
+          this.plottingLayer = window.L.supermap.plotting.plottingLayer('plot',
+            serverUrl)
+          this.plottingLayer.spatialAnalystUrl =
+            host + '/iserver/services/spatialanalyst-sample/restjsr/spatialanalyst'
+          this.plottingLayer.addTo(this.map)
+          this.plottingdrawControl = window.L.supermap.plotting.drawControl(this
+            .plottingLayer)
+          this.plottingdrawControl.addTo(this.map)
+          var editControl = window.L.supermap.plotting.editControl()
+          editControl.addTo(this.map)
+          window.L.supermap.plotting.initPlotPanel('plotPanel', serverUrl, this
+            .plottingdrawControl)
       }, 2000)
     }
     /** ----------------------------------动态绘制结束------------------------------------- */
@@ -1263,6 +1308,8 @@ export default {
 		align-items: center;
 		.input-group-addon{
 			color: $inBlue;
+			width: 3rem;
+			text-align: right;
 
 		}
 		.form-control{

+ 9 - 18
src/components/v-fastmenu.vue

@@ -39,6 +39,8 @@
 <script>
 import resetPwd from "../views/system/user/profile/resetPwd";
 import { getUserProfile } from "@/api/system/user";
+import { selectConfigKey } from "@/api/system/config";
+import Cookies from 'js-cookie';
 	export default {
     components: {resetPwd },
 		data() {
@@ -70,19 +72,17 @@ import { getUserProfile } from "@/api/system/user";
     },
 		methods: {
       backToMainPage(){
-        let href = window.location.href
-        let protacal = href.substr(0,href.indexOf("://")+3)
-        let mo = href.lastIndexOf(":") > 6  ? href.lastIndexOf(":") : href.lastIndexOf("/")
-        let ip = href.substr(href.indexOf("://")+3,mo);
-        let url =href.substr(0,mo)
-        let toUrl = url +":15001/index58"
-        window.location.href = toUrl
+        selectConfigKey('backToMainPage').then(res => {
+          window.location.href = res.data;
+        })
       },
       getUser(){
         getUserProfile().then(response => {
           this.nickName=response.data.nickName
           this.deptNames=response.data.deptNames
           this.phonenumber=response.data.phonenumber
+          this.userId=response.data.userId
+          Cookies.set('userId',response.data.userId);
         });
       },
       resetPwd(){
@@ -93,15 +93,6 @@ import { getUserProfile } from "@/api/system/user";
           this.isResetPwd=true
         });
       },
-			backToMainPage() {
-				let href = window.location.href
-				let protacal = href.substr(0, href.indexOf("://") + 3)
-				let mo = href.lastIndexOf(":") > 6 ? href.lastIndexOf(":") : href.lastIndexOf("/")
-				let ip = href.substr(href.indexOf("://") + 3, mo);
-				let url = href.substr(0, mo)
-				let toUrl = url + ":15001/index58"
-				window.location.href = toUrl
-			},
       async logout() {
         this.$confirm('确定注销并退出系统吗?', '提示', {
           confirmButtonText: '确定',
@@ -205,8 +196,8 @@ import { getUserProfile } from "@/api/system/user";
 
 	}
 	.el-popover{
-		background:$searchBG;
-		border:1px $barBorder;
+		background:#0c1327;
+		border:1px solid #334780;
 		box-shadow:$shadowListHover;
 		border-radius: 1rem;
 	}

+ 16 - 3
src/components/v-header.vue

@@ -5,7 +5,7 @@
 		<!--中间LOGO -->
 		<div class="title">
 			<!-- <img src="@/assets/images/integrated/bigdata-header-nav-left2.png" /> -->
-			<h3><img class="logo" src="@/assets/images/integrated/logo-small.png" />通榆县乡村振兴监管平台 {{titlename}}
+			<h3><img class="logo" src="@/assets/images/integrated/logo-small.png" />{{systemTitle.title}} {{titlename}}
 			</h3>
 			<!-- <img src="@/assets/images/integrated/bigdata-header-nav-right2.png" /> -->
 		</div>
@@ -28,6 +28,11 @@
 	import {constantRoutes} from '@/router/index'//navbar导航引用了router路由的数组
 	import Clock from '@/components/clock.vue' // 时钟+天气
 	import VfastMenu from '@/components/v-fastmenu.vue' // 头部右侧菜单
+  import {
+    fontConfig
+  } from '@/api/login'
+
+
 	export default{
 		components:{
 			VfastMenu,
@@ -35,14 +40,22 @@
 
 		},
 		created(){
-			this.navbar
+      this.fontConfig()
+      this.navbar
 		},
 		data(){
 			return{
-
+        systemTitle: {
+          title: '',  //标题
+        },
 			}
 		},
 		methods:{
+      fontConfig(){
+        fontConfig().then(res => {
+          this.systemTitle.title = res.data.fontTitle;
+        })
+      },
 		},
 		computed:{
 			titlename(){

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


+ 1 - 1
src/layout/components/Sidebar/Logo.vue

@@ -35,7 +35,7 @@ export default {
   },
   data() {
     return {
-      title: '通榆县乡村振兴监管平台',
+      title: '四平市态势感知平台',
       logo: logoImg
     }
   }

+ 4 - 4
src/router/index.js

@@ -35,12 +35,12 @@ export const constantRoutes = [
 		redirect: 'forest',
 	},
 	{
-		//应急云图
+		//消防云图
 		path: '/forest',
 		name: 'forest',
 		component: () => import('@/views/forest'),
 		meta: {
-			title: '应急云图'
+			title: '消防云图'
 		}
 	},
 	{
@@ -89,12 +89,12 @@ export const constantRoutesNew = [{
 		redirect: 'forest',
 	},
 	{
-		//应急云图
+		//消防云图
 		path: '/forest',
 		name: 'forest',
 		component: () => import('@/views/forest'),
 		meta: {
-			title: '应急云图'
+			title: '消防云图'
 		}
 	},
 	{

+ 3 - 1
src/utils/request.js

@@ -25,7 +25,9 @@ const service = axios.create({
 
 // request拦截器
 service.interceptors.request.use(config => {
-  downloadLoadingInstance = Loading.service({ text: "请稍候...", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
+  if(config.headers.loading == undefined){
+    downloadLoadingInstance = Loading.service({ text: "请稍候...", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
+  }
   // 是否需要设置 token
   const isToken = (config.headers || {}).isToken === false
   // 是否需要防止数据重复提交

+ 274 - 266
src/views/bigdata/bigdata.vue

@@ -5,7 +5,7 @@
     <div class="header">
       <!-- title -->
       <div class="header-left"><img class="logo" src="@/assets/images/integrated/logo-small.png"/>
-        <h3 class="title">通榆县乡村振兴监管平台-数字应急-统计分析</h3>
+        <h3 class="title">{{ systemTitle.title }}-{{ systemTitle.subTitle }}-统计分析</h3>
       </div>
       <div class="bignav">
         <img src="@/assets/images/integrated/bigdata-header-nav-left.png"/>
@@ -135,335 +135,343 @@
 </template>
 
 <script>
-  import tabbar from './tabbar.vue' //区域切换
-  import bigdataSupermap from '@/components/supermap' //超图
-
-  //echarts
-  import chartEvent from './chart-event.vue' //1  事件、、
-  import chartWaterCrane from './chart-waterCrane.vue' //2  水鹤分布、、
-  import chartEquipmentType from './chart-equipmentType.vue' //3  公司、、
-  import chartFireCause from './chart-fireCause.vue' //4  起火原因、、
-  import chartDeviceReportingEvents from './chart-deviceReportingEvents.vue' //5  设备上报数量、、
-  import chartEventTrend from './chart-eventTrend.vue' //6  事件趋势、、
-  import chartKeyArea from './chart-keyArea.vue' //7  重点区域、、
-  import chartWaterIntake from './chart-waterIntake.vue' //8  取水口、、
-  import chartWeatherTrends from './chart-weatherTrends.vue' //9  天气趋势、、
-  import chartFireFighting from './chart-fireFighting.vue' //10 消防力量分布、、
-  import chartFireHydrant from './chart-fireHydrant.vue' //12 消火栓、、
-  import chartFullTimeStation from './chart-fullTimeStation.vue' //13 专职站、、
-  import chartFoamLiquid from './chart-foamLiquid.vue' //14 泡沫液、、
-  import chartEquipmentDistribution from './chart-equipmentDistribution' //16 设备分布、、
-
-  import {getRlt} from '@/api/bigdata'
-
-  export default {
-    components: {
-      bigdataSupermap,
-      tabbar,
-      chartEvent,
-      chartWaterCrane,
-      chartEquipmentType,
-      chartFireCause,
-      chartDeviceReportingEvents,
-      chartEventTrend,
-      chartKeyArea,
-      chartWaterIntake,
-      chartWeatherTrends,
-      chartFireFighting,
-      chartFireHydrant,
-      chartFullTimeStation,
-      chartFoamLiquid,
-      chartEquipmentDistribution
-    },
-    data() {
-      return {
-        visited: '',
-        navbar: [{
-          //应急云图
-          path: '/forest',
-          name: '应急云图'
+import tabbar from './tabbar.vue' //区域切换
+import bigdataSupermap from '@/components/supermap' //超图
+
+//echarts
+import chartEvent from './chart-event.vue' //1  事件、、
+import chartWaterCrane from './chart-waterCrane.vue' //2  水鹤分布、、
+import chartEquipmentType from './chart-equipmentType.vue' //3  公司、、
+import chartFireCause from './chart-fireCause.vue' //4  起火原因、、
+import chartDeviceReportingEvents from './chart-deviceReportingEvents.vue' //5  设备上报数量、、
+import chartEventTrend from './chart-eventTrend.vue' //6  事件趋势、、
+import chartKeyArea from './chart-keyArea.vue' //7  重点区域、、
+import chartWaterIntake from './chart-waterIntake.vue' //8  取水口、、
+import chartWeatherTrends from './chart-weatherTrends.vue' //9  天气趋势、、
+import chartFireFighting from './chart-fireFighting.vue' //10 消防力量分布、、
+import chartFireHydrant from './chart-fireHydrant.vue' //12 消火栓、、
+import chartFullTimeStation from './chart-fullTimeStation.vue' //13 专职站、、
+import chartFoamLiquid from './chart-foamLiquid.vue' //14 泡沫液、、
+import chartEquipmentDistribution from './chart-equipmentDistribution' //16 设备分布、、
+
+import { getRlt } from '@/api/bigdata'
+import {
+  fontConfig
+} from '@/api/login'
+
+export default {
+  components: {
+    bigdataSupermap,
+    tabbar,
+    chartEvent,
+    chartWaterCrane,
+    chartEquipmentType,
+    chartFireCause,
+    chartDeviceReportingEvents,
+    chartEventTrend,
+    chartKeyArea,
+    chartWaterIntake,
+    chartWeatherTrends,
+    chartFireFighting,
+    chartFireHydrant,
+    chartFullTimeStation,
+    chartFoamLiquid,
+    chartEquipmentDistribution
+  },
+  data() {
+    return {
+      systemTitle: {
+        title: '',  //标题
+        subTitle: ''//副标题
+      },
+      visited: '',
+      navbar: [{
+        //消防云图
+        path: '/forest',
+        name: '消防云图'
+      },
+        {
+          //数据中心
+          path: '/datacenter',
+          name: '数据中心'
         },
-          {
-            //数据中心
-            path: '/datacenter',
-            name: '数据中心'
-          },
-          {
-            //监控中心
-            path: '/monitor',
-            name: '监控中心'
-          },
-          {
-            //网格化
-            path: '/leader',
-            name: '网格化'
-          },
-          {
-            //统计分析
-            path: '/bigdata',
-            name: '统计分析'
-          }
-
-        ],
-        total: 0, //事件总数
-        untreated: 0, //事件-未处理
-        processing: 0 // 事件-处理中
-      }
-    },
+        {
+          //监控中心
+          path: '/monitor',
+          name: '监控中心'
+        },
+        {
+          //统计分析
+          path: '/bigdata',
+          name: '统计分析'
+        }
 
-    methods: {
-      rlt() {
-        let that = this
-        getRlt().then(resp => {
-          setTimeout(() => {
-            //事件分布
-            that.$refs.bigdataSupermap.loadHeatMap(resp.data)
-          }, 5000)
-        })
-      }
-    },
-    created() {
+      ],
+      total: 0, //事件总数
+      untreated: 0, //事件-未处理
+      processing: 0 // 事件-处理中
+    }
+  },
+  methods: {
+    fontConfig() {
+      fontConfig().then(res => {
+        this.systemTitle.title = res.data.fontTitle;
+        this.systemTitle.subTitle = res.data.subTitle;
+      })
     },
-    mounted() {
-      this.rlt()
+    rlt() {
+      let that = this
+      getRlt().then(resp => {
+        setTimeout(() => {
+          //事件分布
+          that.$refs.bigdataSupermap.loadHeatMap(resp.data)
+        }, 5000)
+      })
     }
+  },
+  created() {
+    this.fontConfig()
+  },
+  mounted() {
+    this.rlt()
   }
+}
 </script>
 
 <style rel="stylesheet/scss" lang="scss" scoped>
-  @import '@/assets/styles/base.scss';
+@import '@/assets/styles/base.scss';
 
 
-  .bigdata-con {
-    width: -webkit-fit-content;
-    height: 100%;
-    background: #01020c;
+.bigdata-con {
+  width: -webkit-fit-content;
+  height: 100%;
+  background: #01020c;
+
+  .el-loading-mask {
+    background: none;
+  }
+
+  .header {
+    height: 3rem;
+    display: flex;
+    align-items: center;
 
-    .el-loading-mask {
-      background: none;
+    .header-left {
+      position: fixed;
+      left: 10px;
+      top: 5px;
+      display: flex;
+      align-items: center;
+      color: $inBlue;
+      font-family: $fontFk;
+
+      .title {
+        margin: 0 auto;
+        text-align: center;
+        background-image: -webkit-linear-gradient(bottom, rgba($color: #00f6ff, $alpha: 1.0), rgba($color: #005aff, $alpha: 1.0));
+        -webkit-background-clip: text;
+        -webkit-text-fill-color: transparent;
+        color: #fff;
+        font-size: 28px;
+      }
     }
 
-    .header {
-      height: 3rem;
+    .bignav {
+      height: 40px;
+      position: fixed;
+      left: 50%;
+      transform: translateX(-50%);
+      top: 0;
+      z-index: 1000;
+      border-radius: 5px;
       display: flex;
+      justify-content: cetner;
       align-items: center;
 
-      .header-left {
-        position: fixed;
-        left: 10px;
-        top: 5px;
+      .bignav-list {
+        background: url(../../assets/images/integrated/bigdata-header-nav-re.png) repeat-x center;
+        float: left;
         display: flex;
+        justify-content: cetner;
         align-items: center;
-        color: $inBlue;
-        font-family: $fontFk;
-
-        .title {
-          margin: 0 auto;
-          text-align: center;
-          background-image: -webkit-linear-gradient(bottom, rgba($color: #00f6ff, $alpha: 1.0), rgba($color: #005aff, $alpha: 1.0));
-          -webkit-background-clip: text;
-          -webkit-text-fill-color: transparent;
-          color: #fff;
-          font-size: 28px;
-        }
+        color: #fff;
+        height: 40px;
+        font-size: 12px;
+        padding: 0 23px;
+        cursor: pointer;
+        -webkit-transform: translateY(0);
+        transform: translateY(0);
+        transition: all 0.3s ease-in-out;
       }
 
-      .bignav {
-        height: 40px;
-        position: fixed;
-        left: 50%;
-        transform: translateX(-50%);
-        top: 0;
-        z-index: 1000;
-        border-radius: 5px;
-        display: flex;
-        justify-content: cetner;
-        align-items: center;
+      .router-link-active,
+      .bignav-list:hover {
+        filter: brightness(2.3);
+        -webkit-transform: translateY(2px);
+        transform: translateY(2px);
+        color: $inBlueHover;
+        border-bottom: 1px solid $inBlueHover;
+        transition: all 0.3s ease-in-out;
 
-        .bignav-list {
-          background: url(../../assets/images/integrated/bigdata-header-nav-re.png) repeat-x center;
-          float: left;
-          display: flex;
-          justify-content: cetner;
-          align-items: center;
-          color: #fff;
-          height: 40px;
-          font-size: 12px;
-          padding: 0 23px;
-          cursor: pointer;
-          -webkit-transform: translateY(0);
-          transform: translateY(0);
-          transition: all 0.3s ease-in-out;
-        }
+      }
+    }
 
-        .router-link-active,
-        .bignav-list:hover {
-          filter: brightness(2.3);
-          -webkit-transform: translateY(2px);
-          transform: translateY(2px);
-          color: $inBlueHover;
-          border-bottom: 1px solid $inBlueHover;
-          transition: all 0.3s ease-in-out;
 
-        }
-      }
+  }
 
+  .bigdata-body {
+    margin: 15px;
+    display: flex;
+    align-items: top;
+    // justify-content: center;
 
-    }
+  }
 
-    .bigdata-body {
-      margin: 15px;
-      display: flex;
-      align-items: top;
-      // justify-content: center;
+  .flex-r {
+    display: flex;
+    flex-direction: row !important;
+    align-content: flex-start;
+    justify-content: space-between
+  }
 
+  .bigdata-list {
+    display: flex;
+    flex-direction: column;
+    flex-wrap: wrap;
+
+    .twins-con {
+      width: 100% !important;
     }
 
-    .flex-r {
-      display: flex;
-      flex-direction: row !important;
-      align-content: flex-start;
-      justify-content: space-between
+    .b-49 {
+      width: 49% !important;
     }
 
-    .bigdata-list {
-      display: flex;
-      flex-direction: column;
-      flex-wrap: wrap;
+    .b-con {
+      width: 100%;
+      height: 28.5vh;
 
-      .twins-con {
-        width: 100% !important;
-      }
+      box-shadow: 0 0 1px rgba($color: #163696, $alpha: .1),
+      -0 -0 30px rgba($color: #163696, $alpha: .5) inset;
 
-      .b-49 {
-        width: 49% !important;
+      // display: flex;
+      // flex-direction: column;
+      .b-tit {
+        width: 100%;
+        display: flex;
+        align-items: center;
+        padding: 10px;
+
+        span {
+          font-size: 15px;
+          color: #00ceec;
+          margin-left: 5px;
+          text-shadow: 0 0 3px rgba($color: #41ff84, $alpha: .5),
+          -0 -0 10px rgba($color: #41fff8, $alpha: .9);
+        }
       }
 
-      .b-con {
+      .twins {
         width: 100%;
-        height: 28.5vh;
-
-        box-shadow: 0 0 1px rgba($color: #163696, $alpha: .1),
-        -0 -0 30px rgba($color: #163696, $alpha: .5) inset;
+        display: flex;
+        position: relative;
 
-        // display: flex;
-        // flex-direction: column;
-        .b-tit {
+        .count {
           width: 100%;
+          color: #fff;
+          font-size: 12px;
+          position: absolute;
           display: flex;
           align-items: center;
-          padding: 10px;
-
-          span {
-            font-size: 15px;
-            color: #00ceec;
-            margin-left: 5px;
-            text-shadow: 0 0 3px rgba($color: #41ff84, $alpha: .5),
-            -0 -0 10px rgba($color: #41fff8, $alpha: .9);
-          }
-        }
-
-        .twins {
-          width: 100%;
-          display: flex;
-          position: relative;
+          left: 1rem;
+          top: 9px;
+          z-index: 100;
 
-          .count {
-            width: 100%;
-            color: #fff;
-            font-size: 12px;
-            position: absolute;
+          .count-z {
             display: flex;
-            align-items: center;
-            left: 1rem;
-            top: 9px;
-            z-index: 100;
-
-            .count-z {
-              display: flex;
-              margin: 0 .5rem;
-
-              span {
-                margin-left: .4rem;
-                font-size: 1rem;
-                color: #2ee0fb !important;
-                font-weight: bolder;
-              }
+            margin: 0 .5rem;
+
+            span {
+              margin-left: .4rem;
+              font-size: 1rem;
+              color: #2ee0fb !important;
+              font-weight: bolder;
             }
+          }
 
 
-          }
         }
-
       }
 
-      .tall {
-        height: 59vh !important;
-      }
+    }
 
-      .taller {
-        height: 89.5vh !important;
-      }
+    .tall {
+      height: 59vh !important;
+    }
 
-      .three {
-        display: flex;
-        flex-direction: column;
-      }
+    .taller {
+      height: 89.5vh !important;
+    }
 
-      .el-row {
-        width: 100%;
-      }
+    .three {
+      display: flex;
+      flex-direction: column;
+    }
 
+    .el-row {
+      width: 100%;
+    }
 
-      .bigdata-map {
-        width: 100%;
-        height: 59vh;
-        position: relative;
-        background: #00101f;
 
-        .event-count {
-          color: #fff;
-          font-size: 14px;
-          font-weight: bolder;
-          padding: 10px;
-          background-color: #000000;
-          position: absolute;
-          top: 10px;
-          left: 10px;
-          z-index: 1000;
+    .bigdata-map {
+      width: 100%;
+      height: 59vh;
+      position: relative;
+      background: #00101f;
+
+      .event-count {
+        color: #fff;
+        font-size: 14px;
+        font-weight: bolder;
+        padding: 10px;
+        background-color: #000000;
+        position: absolute;
+        top: 10px;
+        left: 10px;
+        z-index: 1000;
 
-          span {
-            font-size: 16px;
-            color: #d50000;
-          }
+        span {
+          font-size: 16px;
+          color: #d50000;
         }
-
       }
 
     }
 
-    .wid-li-1 {
-      width: 396px;
-    }
+  }
 
-    .wid-li-2 {
-      width: 760px;
-    }
+  .wid-li-1 {
+    width: 396px;
+  }
 
-    .wid-li-3 {
-      width: 850px;
-    }
+  .wid-li-2 {
+    width: 760px;
+  }
 
-    .wid-li-4 {
-      width: 304px;
-    }
+  .wid-li-3 {
+    width: 850px;
+  }
 
-    .mg-b-20 {
-      margin-bottom: 2vh;
-    }
+  .wid-li-4 {
+    width: 304px;
+  }
 
-    .m-l-15 {
-      margin-left: .5%;
-    }
+  .mg-b-20 {
+    margin-bottom: 2vh;
+  }
+
+  .m-l-15 {
+    margin-left: .5%;
   }
+}
 </style>

File diff suppressed because it is too large
+ 552 - 422
src/views/eventdetailsdialog.vue


+ 113 - 0
src/views/findUserByDept.vue

@@ -0,0 +1,113 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="姓名" prop="nickName">
+        <el-input
+          v-model="queryParams.nickName"
+          placeholder="姓名"
+        />
+      </el-form-item>
+      <el-form-item label="手机号" prop="phonenumber">
+        <el-input
+          v-model="queryParams.phonenumber"
+          placeholder="手机号"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="getList">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="addSelection">确认</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table v-loading="loading" :data="userList"  @selection-change="handleSelectionChange">
+      <el-table-column align="center" type="selection" width="60"></el-table-column>
+      <el-table-column label="姓名" align="center" prop="nickName"></el-table-column>
+      <el-table-column label="岗位" align="center" prop="postName" ></el-table-column>
+      <el-table-column label="手机号" align="center" prop="phonenumber"></el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import {userFeginlist} from "@/api/forest";
+
+  export default {
+    name: "findUserByDept",
+    data() {
+      return {
+        // 遮罩层
+        loading: true,
+        // 选中数组
+        ids: [],
+        // 非单个禁用
+        single: true,
+        // 非多个禁用
+        multiple: false,
+        // 显示搜索条件
+        showSearch: true,
+        // 总条数
+        total: 0,
+        // 可视化前端配置表表格数据
+        userList: [],
+        // 弹出层标题
+        title: "",
+        // 是否显示弹出层
+        open: false,
+        // 查询参数
+        queryParams: {
+          deptId: null,
+          nickName:null,
+          phonenumber:null
+        },
+        // 表单参数
+        form: {},
+        resUser:[],
+      };
+    },
+    props: {
+      deptId: {
+        type: String,
+        required: true
+      },
+    },
+    created() {
+      this.queryParams.deptId = this.deptId;
+      this.getList();
+    },
+    methods: {
+      /** 查询可视化前端配置表列表 */
+      getList() {
+        this.loading = true;
+        userFeginlist(this.queryParams).then(response => {
+          this.userList = response.data;
+          this.loading = false;
+        });
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.queryParams.nickName=null;
+        this.queryParams.phonenumber=null;
+        this.getList();
+      },
+      // 多选框选中数据
+      handleSelectionChange(selection) {
+        this.resUser = [];
+        for (let i in selection){
+          const res = {};
+          res.id = '';
+          res.dept = '';
+          res.depteventId = '';
+          res.name = selection[i].nickName;
+          res.post = selection[i].postName;
+          res.telphone = selection[i].phonenumber;
+          this.resUser.push(res);
+        }
+      },
+      //数据提交到父页
+      addSelection(){
+        this.$emit("addSelection",this.resUser);
+      }
+    }
+  };
+</script>

File diff suppressed because it is too large
+ 2596 - 0
src/views/firespread.vue


File diff suppressed because it is too large
+ 882 - 810
src/views/forest.vue


+ 92 - 62
src/views/monitor.vue

@@ -6,7 +6,7 @@
     <!--主体-->
     <div class="visual-body">
       <!-- 左侧 -->
-      <div class="leftbar" ref="left">
+      <div class="leftbar" :class="indentleft" ref="left">
         <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;"/>
@@ -71,7 +71,7 @@
                 :mapSite="{doubleClickZoom:false}" :codes="['9fa5']" :isSideBySide="false" @preview="preview">
       </supermap>
       <!-- 右侧 -->
-      <div class="rightbar" ref="right">
+      <div class="rightbar" :class="indentright" ref="right">
         <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;"/>
@@ -110,6 +110,11 @@
         </div>
       </div>
       <vBottomMenu ref="bottomMenu"></vBottomMenu>
+<!--      <el-tooltip :content="indentText" placement="top" :disabled="indentdisabled">-->
+<!--        <div class="mascot" ref="mascot" :class="indentStyle" @click="indent"><img-->
+<!--          src="@/assets/images/mascot.png"/></div>-->
+<!--      </el-tooltip>-->
+
     </div>
     <eventLocation ref="eventLocation"></eventLocation>
     <TVWall ref="TVWall"></TVWall>
@@ -144,7 +149,7 @@ import {
 import {
   getHaiKangVideoServer
 } from '@/api/haikang/haikang'
-// import DHWs from '@/dahua/lib/DHWs'
+import DHWs from '@/dahua/lib/DHWs'
 
 /** ----------------------------------摄像头预览结束------------------------------------- */
   // import echarts from 'echarts'
@@ -160,8 +165,8 @@ export default {
   },
   created() {
     /** ----------------------------------摄像头预览开始------------------------------------- */
-    // const DHWsInstance = DHWs.getInstance()
-    // this.ws = DHWsInstance
+    const DHWsInstance = DHWs.getInstance()
+    this.ws = DHWsInstance
     /** ----------------------------------摄像头预览结束------------------------------------- */
 
     /** ----------------------------------底部按钮公用组件开始------------------------------------- */
@@ -180,6 +185,7 @@ export default {
       listCurrentIndex1: '-1',
       listCurrentIndex2: '-1',
       listCurrentIndex3: '-1',
+      graphicsList:[],//重点区域
       /** ----------------------------------摄像头预览开始------------------------------------- */
       //大华
       activePanel: 'key1',
@@ -204,6 +210,13 @@ export default {
       activeName: 'info',
       radio: '1',
       region: [],
+      //左右缩进
+      indentStyle: '',
+      indentleft: '',
+      indentright: '',
+      indentText: '收起左右栏',
+      indentdisabled: false,
+      domId: 'dom1',
     }
   },
   methods: {
@@ -333,7 +346,8 @@ export default {
         }],
         xAxis: {
           show: false,
-          type: 'value'
+          type: 'value',
+          left:10
         },
         yAxis: {
           type: 'category', // 不设置类目轴,抽离的dataset数据展示不出来
@@ -411,7 +425,7 @@ export default {
       //获取左侧动态感知设备
       let that = this
       selectDeviceType().then(res => {
-        that.cameraMarkersList = []
+        that.cameraMarkersList=[]
         that.visuForestCloudMapDeviceBOList = res.data.visuForestCloudMapDeviceBOList
 
         that.region = res.data.visuForestCloudTodaySjfbBOList
@@ -442,7 +456,8 @@ export default {
               isAggregation: false
             }
             if (res.data.visuForestCloudCameraBOList[i].channelCode != null) {
-              markersMap.parameter = res.data.visuForestCloudCameraBOList[i].cameraCode
+              markersMap.parameter = {code:res.data.visuForestCloudCameraBOList[i].cameraCode,
+                type:res.data.visuForestCloudCameraBOList[i].cameraFactory}
             } else {
               markersMap.parameter = []
             }
@@ -470,8 +485,7 @@ export default {
               '<span>' +
               '                  <div class="d-l-con">' +
               '                  <div class="d-l-l-text">' +
-              '                  <h4>摄像头类型:' + res.data.visuForestCloudCameraBOList[i]
-                .cameraFactory + '</h4>' +
+              '                  <h4>摄像头类型:' + (res.data.visuForestCloudCameraBOList[i].cameraFactory=="1"?"大华":"海康") + '</h4>' +
               '                </div>' +
               '                </div>' +
               '                </span>' +
@@ -484,7 +498,7 @@ export default {
               '                </div>' +
               '                </span>' +
               '</div>'
-            that.cameraMarkersList.push(markersMap)
+            this.cameraMarkersList.push(markersMap)
             //   cameraAccount: "1"
             // cameraCode: "1000010"
             // cameraFactory: "2"
@@ -505,7 +519,7 @@ export default {
           setTimeout(() => {
             that.$refs.supermap.clearM(true)
             that.$refs.supermap.clearM(false)
-            that.$refs.supermap.setMarkersRadius(that.cameraMarkersList)
+            that.$refs.supermap.setMarkersRadius(this.cameraMarkersList)
           }, 1000)
         }
       })
@@ -522,7 +536,6 @@ export default {
       selectCameraByDeptId(depId).then(res => {
         //根据设备类型查看列表
         that.visuForestCloudCameraBOList = res.data
-
         if (res.data != null && res.data.length > 0) {
           for (let i = 0; i < res.data.length; i++) {
             let markersMap = {
@@ -535,11 +548,9 @@ export default {
               keepBindPopup: false,
               isAggregation: false
             }
-            if (res.data.length > 50) {
-              markersMap.isAggregation = true
-            }
             if (res.data[i].channelCode != null) {
-              markersMap.parameter = res.data[i].cameraCode
+              markersMap.parameter = {code:res.data.data[i].cameraCode,
+                type:res.data.data[i].cameraFactory}
             } else {
               markersMap.parameter = []
             }
@@ -566,8 +577,7 @@ export default {
               '<span>' +
               '                  <div class="d-l-con">' +
               '                  <div class="d-l-l-text">' +
-              '                  <h4>摄像头类型:' + res.data[i]
-                .cameraFactory + '</h4>' +
+              '                  <h4>摄像头类型:' + (res.data[i].cameraFactory=="1"?"大华":"海康") + '</h4>' +
               '                </div>' +
               '                </div>' +
               '                </span>' +
@@ -601,11 +611,27 @@ export default {
           setTimeout(() => {
             that.$refs.supermap.clearM(true)
             that.$refs.supermap.clearM(false)
-            that.$refs.supermap.setMarkersRadius(that.cameraMarkersList)
+            that.$refs.supermap.setMarkersRadius(this.cameraMarkersList)
           }, 1000)
         }
       })
     },
+    //吉祥物收起左右框
+    indent() {
+      let list = document.getElementsByClassName('el-tooltip__popper')
+      list[list.length - 1].style.display = 'none'
+      if (this.indentStyle == '') {
+        this.indentStyle = 'indent-style'
+        this.indentleft = 'indent-left'
+        this.indentright = 'indent-right'
+        this.indentText = '展开左右栏'
+      } else if (this.indentText == '展开左右栏') {
+        this.indentStyle = ''
+        this.indentleft = ''
+        this.indentright = ''
+        this.indentText = '收起左右栏'
+      }
+    },
     /** ----------------------------------摄像头预览开始------------------------------------- */
     alertLogin: function() {
       this.$modal.msg('登录中....')
@@ -629,45 +655,48 @@ export default {
       }
     },
     /** 预览按钮操作 */
-    preview(cameraCode) {
-      let that = this
-      // getDahuaVideoServer().then(newResponse => {
-      //   console.log(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,
-      //         token: '',
-      //         https: 1
-      //       })
-      //       this.ws.on('loginState', (res) => {
-      //         this.isLogin = res
-      //         console.log('---res-----', res)
-      //         if (res) {
-      //           this.alertLoginSuccess()
-      //           this.activePanel = 'key2'
-      //           this.realTimeVideoDialog(channelCode)
-      //         } else {
-      //           this.alertLoginFailed()
-      //         }
-      //       })
-      //     } else { // 连接客户端失败
-      //       this.alertReinstall()
-      //     }
-      //   })
-      // })
-      that.cameraVisible = true
-      getHaiKangVideoServer({cameraCode:cameraCode}).then(newResponse => {
-        that.cameraTitle = '摄像头-'+newResponse.data.cameraName
-        that.initPlugin(newResponse.data.appkey,newResponse.data.loginIp,newResponse.data.secret,newResponse.data.loginPort)
-        setTimeout(function() {
-          that.playhk(newResponse.data.channelCode)
-        }, 5000)
-      })
+    preview(cameraParam) {
+      if(cameraParam.type=='1'){
+        getDahuaVideoServer().then(newResponse => {
+          console.log(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,
+                token: '',
+                https: 0
+              })
+              this.ws.on('loginState', (res) => {
+                this.isLogin = res
+                console.log('---res-----', res)
+                if (res) {
+                  this.alertLoginSuccess()
+                  this.activePanel = 'key2'
+                  this.realTimeVideoDialog(cameraParam.code)
+                } else {
+                  this.alertLoginFailed()
+                }
+              })
+            } else { // 连接客户端失败
+              this.alertReinstall()
+            }
+          })
+        })
+      }else if(cameraParam.type=='0'){
+        let that = this
+        that.cameraVisible = true
+        getHaiKangVideoServer({cameraCode:cameraParam.code}).then(newResponse => {
+          that.cameraTitle = '摄像头-'+newResponse.data.cameraName
+          that.initPlugin(newResponse.data.appkey,newResponse.data.loginIp,newResponse.data.secret,newResponse.data.loginPort)
+          setTimeout(function() {
+            that.playhk(newResponse.data.channelCode)
+          }, 5000)
+        })
+      }
 
     },
     realTimeVideoDialog(cameraParams) { // 调用弹窗实时播放接口
@@ -675,7 +704,8 @@ export default {
         this.$Message.info('正在登陆客户端,请稍等......')
         return false
       }
-      this.ws.openVideo(cameraParams)
+      const params = [cameraParams];
+      this.ws.openVideo(params)
     },
     /** ----------------------------------摄像头预览结束------------------------------------- */
 
@@ -719,7 +749,7 @@ export default {
         cbConnectClose: function(bNormalClose) {
           // 异常断开:bNormalClose = false
           // JS_Disconnect正常断开:bNormalClose = true
-
+          console.log('cbConnectClose')
           that.oWebControl = null
         }
       })
@@ -797,7 +827,7 @@ export default {
           keyLength: 1024
         })
       }).then(function(oData) {
-
+        console.log(oData)
         if (oData.responseMsg.data) {
           that.pubKey = oData.responseMsg.data
           callback()

+ 101 - 60
src/views/system/login.vue

@@ -1,53 +1,57 @@
 <template>
-	<div class="login">
-		  <StarBackground />
-		<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
-			<h3 class="title"> 通榆县乡村振兴综合监管平台</h3>
-			<h3 class="title">数字应急</h3>
-			<div class="login-container">
-				<h4>请登录</h4>
-				<el-form-item prop="username">
-					<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号"
-						class="m-b-15">
-						<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
-					</el-input>
-				</el-form-item>
-				<el-form-item prop="password">
-					<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码"
-						@keyup.enter.native="handleLogin" class="m-b-15">
-						<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
-					</el-input>
-				</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">
-						<img :src="codeUrl" @click="getCode" class="login-code-img" />
-					</div>
-				</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-form-item>
-			</div>
-		</el-form>
-	</div>
+  <div class="login" :style="{backgroundImage: 'url('+backgroudImg+')'}">
+    <StarBackground />
+    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
+      <h3 class="sub-title" v-if="systemTitle.subTitle">{{systemTitle.subTitle}}</h3>
+      <h3 class="title">{{systemTitle.title}}</h3>
+
+      <div class="login-container">
+        <h4>请登录</h4>
+        <el-form-item prop="username">
+          <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号"
+                    class="m-b-15">
+            <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
+          </el-input>
+        </el-form-item>
+        <el-form-item prop="password">
+          <el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码"
+                    @keyup.enter.native="handleLogin" class="m-b-15">
+            <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
+          </el-input>
+        </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">
+            <img :src="codeUrl" @click="getCode" class="login-code-img" />
+          </div>
+        </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-form-item>
+      </div>
+    </el-form>
+  </div>
 </template>
 
 <script>
 	import StarBackground from '@/components/star'
 	import {
-		getCodeImg
+		getCodeImg,fontConfig,getSecretKey
 	} from '@/api/login'
+	import {
+    encryptedData
+	} from '@/api/encrypt'
 	import Cookies from 'js-cookie'
 	import {
 		encrypt,
@@ -64,10 +68,15 @@
 		},
 		data() {
 			return {
+        backgroudImg:'', //背景图片
+        systemTitle: {
+          title: '',  //标题
+          subTitle: '',//副标题  数字应急
+        },
 				codeUrl: '',
 				loginForm: {
-					username: 'admin',
-					password: 'admin123',
+					username: '',
+					password: '',
 					rememberMe: false,
 					code: '',
 					uuid: ''
@@ -108,9 +117,18 @@
 		created() {
 			this.getCode()
 			this.getCookie()
+      this.fontConfig()
 		},
 		methods: {
-			getCode() {
+      fontConfig(){
+        fontConfig().then(res => {
+          this.systemTitle.title = res.data.fontTitle;
+          this.systemTitle.subTitle = res.data.subTitle;
+          this.backgroudImg = res.data.picUrl;
+        })
+      },
+
+      getCode() {
 				getCodeImg().then(res => {
 					this.captchaOnOff = res.captchaOnOff === undefined ? true : res.captchaOnOff
 					if (this.captchaOnOff) {
@@ -150,19 +168,36 @@
 							Cookies.remove('password')
 							Cookies.remove('rememberMe')
 						}
-						this.$store.dispatch('Login', this.loginForm).then(() => {
-							console.log('!@!@!@', this.redirect)
-							this.$router.push({
-								//path: this.redirect || '/'
-								path: '/'
-							}).catch(() => {})
-						}).catch(() => {
-							this.loading = false
-							if (this.captchaOnOff) {
-								this.getCode()
-							}
-						})
-					}
+						// this.$store.dispatch('Login', this.loginForm).then(() => {
+						// 	console.log('!@!@!@', this.redirect)
+						// 	this.$router.push({
+						// 		//path: this.redirect || '/'
+						// 		path: '/'
+						// 	}).catch(() => {})
+						// }).catch(() => {
+						// 	this.loading = false
+						// 	if (this.captchaOnOff) {
+						// 		this.getCode()
+						// 	}
+						// })
+            //登录前先获取密码加密传输的公钥,对密码进行加密
+            getSecretKey().then(res => {
+              const encryptedPassword = encryptedData(res.data,this.loginForm.password);
+              this.loginForm.password = encryptedPassword;
+              this.$store.dispatch('Login', this.loginForm).then(() => {
+                this.$router.push({
+                  //path: this.redirect || '/'
+                  path: '/'
+                })
+              }).catch(() => {
+                this.loading = false
+                if (this.captchaOnOff) {
+                  this.getCode()
+                }
+              })
+            })
+
+          }
 				})
 			}
 		}
@@ -184,7 +219,13 @@
 	.m-b-15 {
 		margin-bottom: 15px;
 	}
-
+  .sub-title{
+    margin: 0px auto 10px auto;
+    text-align: center;
+    color: #fff;
+    font-family: $fontFk;
+    font-size: 55px;
+  }
 	.title {
 		margin: 0px auto 30px auto;
 		text-align: center;

+ 1 - 1
src/views/system/register.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="register">
     <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
-      <h3 class="title">通榆县乡村振兴监管平台</h3>
+      <h3 class="title">四平市态势感知平台</h3>
       <el-form-item prop="username">
         <el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号">
           <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />

+ 1 - 1
vue.config.js

@@ -7,7 +7,7 @@ function resolve(dir) {
 
 const CompressionPlugin = require('compression-webpack-plugin')
 
-const name = process.env.VUE_APP_TITLE || '通榆县乡村振兴监管平台' // 网页标题
+const name = process.env.VUE_APP_TITLE || '四平市态势感知平台' // 网页标题
 
 const port = process.env.port || process.env.npm_config_port || 80 // 端口