From 5d0ae87e23e997960bf607340570f7bbeb7160b4 Mon Sep 17 00:00:00 2001
From: czt <czt18638530771@163.com>
Date: 星期二, 09 十二月 2025 19:10:57 +0800
Subject: [PATCH] 安防页面提交1

---
 fzzy-igdss-web/src/main/resources/templates/security/video-aerial.html                |   77 +
 fzzy-igdss-web/src/main/resources/static/js/plugins/drag/drag-drop.js                 |    1 
 fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SecurityController.java |  104 ++
 fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/file/FileController.java         |   11 
 fzzy-igdss-web/src/main/resources/static/security/video-webrtc.js                     |  242 +++++
 fzzy-igdss-web/src/main/resources/static/img/web/security/sp-arrow.png                |    0 
 fzzy-igdss-web/src/main/resources/static/security/video-list.css                      |  613 +++++++++++++
 fzzy-igdss-view/pom.xml                                                               |   34 
 fzzy-igdss-web/src/main/resources/static/security/video-aerial.js                     |  165 +++
 fzzy-igdss-web/src/main/resources/static/security/video-webrtc.css                    |  579 ++++++++++++
 fzzy-igdss-web/src/main/resources/static/img/web/security/ca-4.png                    |    0 
 fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml                             |   29 
 /dev/null                                                                             |   10 
 fzzy-igdss-view/src/main/java/com/fzzy/igds/FileUploadManage.java                     |   16 
 fzzy-igdss-web/src/main/resources/static/img/web/security/tit-redBg.png               |    0 
 fzzy-igdss-web/src/main/resources/static/security/video-list.js                       |  204 ++++
 fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/SecManager.java            |   82 +
 fzzy-igdss-web/src/main/resources/templates/security/video-list.html                  |  236 +++++
 fzzy-igdss-web/src/main/resources/templates/common/preview-img.html                   |   50 +
 fzzy-igdss-web/src/main/resources/templates/security/video-webrtc.html                |  210 ++++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Dept.java                          |   10 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/CameraPlayType.java              |   38 
 22 files changed, 2,644 insertions(+), 67 deletions(-)

diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/CameraPlayType.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/CameraPlayType.java
new file mode 100644
index 0000000..c337f24
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/CameraPlayType.java
@@ -0,0 +1,38 @@
+package com.fzzy.igds.constant;
+
+import lombok.Getter;
+
+/**
+ * @Description 鎶撴媿鏂瑰紡
+ * @Author CZT
+ * @Date 2024/12/10 16:48
+ */
+@Getter
+public enum CameraPlayType {
+
+    PLAY_TYPE_DEFAULT("DEFAULT", "绯荤粺榛樿"),
+    PLAY_TYPE_WEB_RTC("WEB_RTC", "WEB-RTC鎾斁"),
+    PLAY_TYPE_VLC("VLC", "VLC鎻掍欢"),
+    PLAY_TYPE_HIK_WEB4("HIK_WEB4", "娴峰悍web鎻掍欢"),
+    PLAY_TYPE_HIK_MEDIA("MEDIA_HIK", "娴峰悍缁煎悎瀹夐槻骞冲彴");
+
+    private String code;
+    private String name;
+
+    private CameraPlayType(String code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+
+    public static String getName(String code){
+        if(null == code) {
+            return null;
+        }
+        if(CameraPlayType.PLAY_TYPE_DEFAULT.getCode().equals(code)) return CameraPlayType.PLAY_TYPE_DEFAULT.getName();
+        if(CameraPlayType.PLAY_TYPE_WEB_RTC.getCode().equals(code)) return CameraPlayType.PLAY_TYPE_WEB_RTC.getName();
+        if(CameraPlayType.PLAY_TYPE_VLC.getCode().equals(code)) return CameraPlayType.PLAY_TYPE_VLC.getName();
+        if(CameraPlayType.PLAY_TYPE_HIK_WEB4.getCode().equals(code)) return CameraPlayType.PLAY_TYPE_HIK_WEB4.getName();
+        if(CameraPlayType.PLAY_TYPE_HIK_MEDIA.getCode().equals(code)) return CameraPlayType.PLAY_TYPE_HIK_MEDIA.getName();
+        return code;
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Dept.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Dept.java
index ce248a9..999e00d 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Dept.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Dept.java
@@ -72,12 +72,12 @@
     /**
      * --------楦熺灠鍥句俊鎭�--------
      **/
-    @Column(name = "img_id", columnDefinition = "varchar(50) COMMENT '楦熺灠鍥緄d'")
-    @TableField("img_id")
-    private String imgId;
+    @Column(name = "img_path", columnDefinition = "varchar(100) COMMENT '楦熺灠鍥惧叏璺緞'")
+    @TableField("img_path")
+    private String imgPath;
 
-    @Column(name = "file_name", columnDefinition = "varchar(50) COMMENT '楦熺灠鍥惧悕绉�'")
-    @TableField("file_name")
+    @Column(name = "img_name", columnDefinition = "varchar(50) COMMENT '楦熺灠鍥惧悕绉�'")
+    @TableField("img_name")
     private String imgName;
 
 }
\ No newline at end of file
diff --git a/fzzy-igdss-view/pom.xml b/fzzy-igdss-view/pom.xml
index 38c1a6e..7bc96d8 100644
--- a/fzzy-igdss-view/pom.xml
+++ b/fzzy-igdss-view/pom.xml
@@ -97,40 +97,16 @@
         </dependency>
 
         <dependency>
-            <groupId>com.bstek.dorado</groupId>
-            <artifactId>dorado-uploader</artifactId>
-            <version>1.0.20</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>slf4j-jcl</artifactId>
-                    <groupId>org.slf4j</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>slf4j-log4j12</artifactId>
-                    <groupId>org.slf4j</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>log4j</artifactId>
-                    <groupId>log4j</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>slf4j-jdk14</artifactId>
-                    <groupId>org.slf4j</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-jexl</artifactId>
             <version>2.1.1</version>
         </dependency>
-        
+
         <dependency>
-    <groupId>com.thoughtworks.paranamer</groupId>
-    <artifactId>paranamer</artifactId>
-    <version>2.3</version>
-</dependency>
+            <groupId>com.thoughtworks.paranamer</groupId>
+            <artifactId>paranamer</artifactId>
+            <version>2.3</version>
+        </dependency>
 
     </dependencies>
 
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml b/fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml
index a04ea00..c8b02cd 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/Dept.view.xml
@@ -111,9 +111,9 @@
         <Property name="label">鏇存柊浜�</Property>
         <Property name="readOnly">true</Property>
       </PropertyDef>
-      <PropertyDef name="imgId">
+      <PropertyDef name="imgPath">
         <Property></Property>
-        <Property name="label">楦熺灠鍥緄d</Property>
+        <Property name="label">鍥捐矾寰�</Property>
       </PropertyDef>
       <PropertyDef name="imgName">
         <Property></Property>
@@ -122,20 +122,20 @@
     </DataType>
   </Model>
   <View layout="padding:10">
-    <ClientEvent name="onClick">/**&#xD;
+    <ClientEvent name="onClick">
       /**&#xD;
       * 棰勮鍥剧墖&#xD;
       */&#xD;
       showImg = function(){&#xD;
       var cur = view.get(&quot;#dsMain.data:#&quot;);&#xD;
-      var imgName = cur.get(&quot;imgId&quot;);&#xD;
+      var imgName = cur.get(&quot;imgName&quot;);&#xD;
       if(!imgName){&#xD;
-      $alert(&quot;娌℃湁涓婁紶瑙嗛淇℃伅锛屾棤娉曢瑙堛��&quot;);&#xD;
+      $alert(&quot;娌℃湁涓婁紶楦熺灠鍥句俊鎭紝鏃犳硶棰勮銆�&quot;);&#xD;
       return;&#xD;
       }&#xD;
-      var id = cur.get(&quot;id&quot;);&#xD;
+      var imgPath = cur.get(&quot;imgPath&quot;);&#xD;
       &#xD;
-      view.get(&quot;#iFrameImg&quot;).set(&quot;path&quot;, &quot;./basic/file/dept-img?id=&quot; + id);&#xD;
+      view.get(&quot;#iFrameImg&quot;).set(&quot;path&quot;, &quot;/file/dept-img?imgPath=&quot; + imgPath);&#xD;
       view.get(&quot;#dialogImg&quot;).show();&#xD;
       &#xD;
       };</ClientEvent>
@@ -345,9 +345,18 @@
           <Container>
             <Button layoutConstraint="left">
               <Property name="action">uploadFileImg</Property>
-              <Property name="caption">楦熺灠鍥句笂浼�...</Property>
+              <Property name="caption">楦熺灠鍥句笂浼�</Property>
               <Property name="exClassName">btn2</Property>
               <Property name="iconClass">fa fa-cloud-upload</Property>
+            </Button>
+            <Label layoutConstraint="left">
+              <Property name="width">10px</Property>
+            </Label>
+            <Button layoutConstraint="left">
+              <ClientEvent name="onClick">showImg();</ClientEvent>
+              <Property name="caption">楦熺灠鍥鹃瑙�</Property>
+              <Property name="exClassName">btn4</Property>
+              <Property name="iconClass">fa fa-picture-o</Property>
             </Button>
           </Container>
           <Link>
@@ -453,9 +462,9 @@
       </Container>
     </CustomDropDown>
     <UploadAction id="uploadFileImg">
-      <ClientEvent name="onFileUploaded">var imgId = arg.returnValue;&#xD;
+      <ClientEvent name="onFileUploaded">var imgPath = arg.returnValue;&#xD;
         var data = view.get(&quot;#dsMain.data:#&quot;);&#xD;
-        data.set(&quot;imgId&quot;,imgId);&#xD;
+        data.set(&quot;imgPath&quot;,imgPath);&#xD;
         data.set(&quot;imgName&quot;,arg.file.name);</ClientEvent>
       <Property name="fileResolver">fileUploadManage#imgFile</Property>
       <Property name="maxFileSize">50MB</Property>
diff --git a/fzzy-igdss-view/src/main/java/com/fzzy/igds/FileUploadManage.java b/fzzy-igdss-view/src/main/java/com/fzzy/igds/FileUploadManage.java
index 8066365..a32b382 100644
--- a/fzzy-igdss-view/src/main/java/com/fzzy/igds/FileUploadManage.java
+++ b/fzzy-igdss-view/src/main/java/com/fzzy/igds/FileUploadManage.java
@@ -4,6 +4,7 @@
 import com.bstek.dorado.uploader.annotation.FileResolver;
 import com.fzzy.igds.service.FileService;
 import com.fzzy.igds.utils.ContextUtil;
+import com.ruoyi.common.config.FrameworkConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.DateFormatUtils;
@@ -13,7 +14,6 @@
 import java.io.IOException;
 import java.util.Date;
 import java.util.Map;
-
 
 /**
  * @Description Dorado7 闄勪欢涓婁紶鍏叡绠$悊灞�
@@ -38,16 +38,22 @@
 	@FileResolver
 	public String imgFile(UploadFile file, Map<String, Object> parameter) {
 
-		String fileId = null;
+		String filePath = null;
 		try {
 
 			String basePath = fileService.getFileSavePath("DEPT");
 
-			fileId = "aerial-" + ContextUtil.subDeptId(null)
+			//鏂版枃浠跺悕
+			String fileId = "aerial-" + ContextUtil.subDeptId(null)
 					+ file.getFileName().substring(
 					file.getFileName().lastIndexOf("."));
+			//鏂囦欢鍏ㄨ矾寰�
+			filePath = basePath + fileId;
+			//淇濆瓨
+			file.transferTo(new File(filePath));
 
-			file.transferTo(new File(basePath + fileId));
+			//鏇挎崲鍚庢枃浠跺叏璺緞
+			filePath = filePath.replace(FrameworkConfig.getProfile(), "/profile/");
 
 		} catch (IllegalStateException e) {
 			e.printStackTrace();
@@ -55,7 +61,7 @@
 			e.printStackTrace();
 		}
 
-		return fileId;
+		return filePath;
 	}
 
 	/**
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/file/FileController.java b/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/file/FileController.java
index 7678b97..d60c74e 100644
--- a/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/file/FileController.java
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/file/FileController.java
@@ -23,7 +23,7 @@
  */
 @Slf4j
 @Controller
-@RequestMapping("basic/file")
+@RequestMapping("file")
 public class FileController {
 
 	@Resource
@@ -35,15 +35,12 @@
 	 * @return
 	 */
 	@RequestMapping("/dept-img")
-	public String deptImg(@RequestParam(value = "id", required = true) String id,
+	public String deptImg(@RequestParam(value = "imgPath", required = true) String imgPath,
 						  ModelMap view) {
 
-		if(StringUtils.isNotEmpty(id)){
-			String imgPath = fileManager.getDeptFile(id);;
-			view.put("imgPath", imgPath);
-		}
+		view.put("imgPath", imgPath);
 
-		return "web/common/preview-img";
+		return "common/preview-img";
 	}
 
 
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SecurityController.java b/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SecurityController.java
index 6b07a28..c51a6d2 100644
--- a/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SecurityController.java
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SecurityController.java
@@ -1,8 +1,25 @@
 package com.fzzy.sys.controller.security;
 
+import com.fzzy.igds.constant.CameraPlayType;
+import com.fzzy.igds.constant.Constant;
+import com.fzzy.igds.data.PageResponse;
+import com.fzzy.igds.domain.Camera;
+import com.fzzy.igds.domain.Dept;
+import com.fzzy.igds.service.CoreDeptService;
+import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.sys.manager.security.SecManager;
+import com.ruoyi.common.core.domain.entity.SysUser;
 import lombok.extern.slf4j.Slf4j;
+import com.ruoyi.common.utils.StringUtils;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * @Description 瀹夐槻controller灞�
@@ -11,15 +28,100 @@
  */
 @Slf4j
 @Controller
-@RequestMapping("/security")
+@RequestMapping("security")
 public class SecurityController {
 
     private static final String prefix = "security";
 
+    @Resource
+    private SecManager secManager;
+    @Resource
+    private CoreDeptService deptService;
+
+    /**
+     * 鐩戞帶姒傝
+     *
+     * @param type 1.琛ㄧず2.5D楦熺灠鍥鹃〉闈㈤瑙堬紱2.琛ㄧず鍒楄〃棰勮椤甸潰
+     * @return
+     */
+    @RequestMapping("/aerial-video")
+    public String aerialVideo(
+            @RequestParam(value = "type", required = false) String type,
+            ModelMap view) {
+
+        SysUser user = ContextUtil.getLoginUser();
+        view.put(Constant.MODEL_KEY_LOGIN_USER, user);
+
+        String deptId = ContextUtil.subDeptId(user);
+        List<Camera> listCamera = secManager.listCamera(deptId, user.getCompanyId());
+
+        view.put("deptId", deptId);
+        view.put("listCamera", listCamera);
+
+        //榛樿鐩戞帶鍒楄〃椤甸潰
+        String viewUrl = prefix + "/video-list";
+
+        if (StringUtils.isNotBlank( type) && "1".equals(type)) {
+            Dept dept = deptService.getDeptById(deptId);
+            if (dept != null && StringUtils.isNotEmpty(dept.getImgPath())) {
+                view.put("backgroundImg", dept.getImgPath());
+                viewUrl = prefix + "/video-aerial";
+            }
+
+        }
+        return viewUrl;
+    }
 
 
+    /**
+     * 楦熺灠鍥鹃〉闈� -- 瑙嗛鎾斁锛岄�氳繃鎾斁鍙傛暟涓嶅悓璺宠浆涓嶅悓椤甸潰鎾斁
+     *
+     * @param cameraId 鎽勫儚鏈虹郴缁烮D
+     * @param playType 閰嶇疆鐨勬挱鏀炬柟寮�
+     * @param time     鏃堕棿鍙傛暟锛屾棤鍏蜂綋鍚箟
+     * @return
+     */
+    @RequestMapping("/video-play")
+    public String play(@RequestParam(value = "cameraId", required = true) String cameraId,
+                       @RequestParam(value = "playType", required = false) String playType,
+                       @RequestParam(value = "time", required = false) String time,
+                       ModelMap view) {
 
+        SysUser user = ContextUtil.getLoginUser();
 
+        // 璁剧疆榛樿鎾斁鏂瑰紡
+        if (org.apache.commons.lang3.StringUtils.isEmpty(playType)) {
+            playType = CameraPlayType.PLAY_TYPE_VLC.getCode();
+        }
 
+        // 璁剧疆鎽勫儚澶翠俊鎭�
+        Camera camera = secManager.getCameraById(null, cameraId);
+        if (camera == null) {
+            view.put("errorMsg", "鑾峰彇瑙嗛璁惧鍑洪敊锛岃鍏堝埛鏂扮紦瀛橈紒");
+        }
+        view.put("cameraData", camera);
+
+        String viewUrl = prefix + "/video-webrtc";
+
+        //WEB-RTC澶у崕鎾斁
+        if (CameraPlayType.PLAY_TYPE_WEB_RTC.getCode().equals(playType)) {
+            viewUrl = prefix + "/video-webrtc";
+        }
+
+        return viewUrl;
+    }
+
+    /***
+     * 瑙嗛楦熺灠鍥句腑鏇存敼鎽勫儚澶翠綅缃�
+     *
+     * @param params
+     * @return
+     */
+    @RequestMapping("/update-pos")
+    @ResponseBody
+    public PageResponse<String> updatePos(
+            @RequestBody List<Camera> params) {
+        return secManager.updatePos(params);
+    }
 
 }
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/SecManager.java b/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/SecManager.java
new file mode 100644
index 0000000..dfaa182
--- /dev/null
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/SecManager.java
@@ -0,0 +1,82 @@
+package com.fzzy.sys.manager.security;
+
+import com.fzzy.igds.constant.RespCodeEnum;
+import com.fzzy.igds.data.PageResponse;
+import com.fzzy.igds.domain.Camera;
+import com.fzzy.igds.service.SecCameraService;
+import com.fzzy.igds.utils.ContextUtil;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @Description
+ * @Author CZT
+ * @Date 2025/12/9 9:19
+ */
+@Slf4j
+@Component
+public class SecManager {
+
+    @Resource
+    private SecCameraService secCameraService;
+
+    /**
+     *
+     * @param deptId
+     * @param companyId
+     * @return
+     */
+    public List<Camera> listCamera(String deptId, String companyId) {
+        if (null == deptId){
+            return null;
+        }
+
+        List<Camera> list = secCameraService.getCameraByDeptId(companyId, deptId);
+
+        if (null == list || list.isEmpty()){
+            return null;
+        }
+
+        return list;
+    }
+
+    /**
+     * 鏍规嵁鐩戞帶ID鑾峰彇鐩戞帶淇℃伅
+     * @param companyId
+     * @param cameraId
+     * @return
+     */
+    public Camera getCameraById(String companyId, String cameraId) {
+        if (StringUtils.isEmpty(companyId)) {
+            companyId = ContextUtil.getCompanyId();
+        }
+        if (StringUtils.isEmpty(cameraId)){
+            return null;
+        }
+        return secCameraService.getCameraById(companyId, cameraId);
+    }
+
+    /**
+     *
+     * @param params
+     * @return
+     */
+    public PageResponse<String> updatePos(List<Camera> params) {
+
+        if (null == params || params.isEmpty()) {
+            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(),
+                    "褰撳墠娌℃湁闇�瑕佹墽琛岀殑淇℃伅锛�");
+        }
+
+        for (Camera param : params) {
+            secCameraService.updatePos(param);
+        }
+
+        secCameraService.refreshCache(ContextUtil.getCompanyId());
+        return new PageResponse<>(RespCodeEnum.CODE_0000, "鎵ц鎴愬姛锛侊紒");
+    }
+}
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/SecurityManager.java b/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/SecurityManager.java
deleted file mode 100644
index d4110fb..0000000
--- a/fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/SecurityManager.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.fzzy.sys.manager.security;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-/**
- * @Description
- * @Author CZT
- * @Date 2025/12/9 9:19
- */
-@Slf4j
-@Component
-public class SecurityManager {
-
-
-
-
-}
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/security/ca-4.png b/fzzy-igdss-web/src/main/resources/static/img/web/security/ca-4.png
new file mode 100644
index 0000000..af25ca7
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/security/ca-4.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/security/sp-arrow.png b/fzzy-igdss-web/src/main/resources/static/img/web/security/sp-arrow.png
new file mode 100644
index 0000000..6df3964
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/security/sp-arrow.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/img/web/security/tit-redBg.png b/fzzy-igdss-web/src/main/resources/static/img/web/security/tit-redBg.png
new file mode 100644
index 0000000..fc302b7
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/img/web/security/tit-redBg.png
Binary files differ
diff --git a/fzzy-igdss-web/src/main/resources/static/js/plugins/drag/drag-drop.js b/fzzy-igdss-web/src/main/resources/static/js/plugins/drag/drag-drop.js
new file mode 100644
index 0000000..fc13c6d
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/js/plugins/drag/drag-drop.js
@@ -0,0 +1 @@
+Dragdrop=function(window){var doc=window.document;var E={on:function(el,type,fn){el.addEventListener?el.addEventListener(type,fn,false):el.attachEvent?el.attachEvent("on"+type,fn):el['on'+type]=fn},un:function(el,type,fn){el.removeEventListener?el.removeEventListener(type,fn,false):el.detachEvent?el.detachEvent("on"+type,fn):el['on'+type]=null},evt:function(e){return e||window.event}};return function(opt){var conf=null,defaultConf,diffX,diffY;function Config(opt){this.target=opt.target;this.bridge=opt.bridge;this.dragable=opt.dragable!=false;this.dragX=opt.dragX!=false;this.dragY=opt.dragY!=false;this.area=opt.area;this.callback=opt.callback};function Dragdrop(opt){if(!opt){return}conf=new Config(opt);defaultConf=new Config(opt);conf.bridge?E.on(conf.bridge,'mousedown',mousedown):E.on(conf.target,'mousedown',mousedown)};Dragdrop.prototype={dragX:function(){conf.dragX=true;conf.dragY=false},dragY:function(b){conf.dragY=true;conf.dragX=false},dragAll:function(){conf.dragX=true;conf.dragY=true},setArea:function(a){conf.area=a},setBridge:function(b){conf.bridge=b},setDragable:function(b){conf.dragable=b},reStore:function(){conf=new Config(defaultConf);conf.target.style.top='0px';conf.target.style.left='0px'},getDragX:function(){return conf.dragX},getDragY:function(){return conf.dragY}};function mousedown(e){e=E.evt(e);var el=conf.target;el.style.position='absolute';el.style.cursor='move';if(el.setCapture){E.on(el,"losecapture",mouseup);el.setCapture();e.cancelBubble=true}else if(window.captureEvents){e.stopPropagation();E.on(window,"blur",mouseup);e.preventDefault()}diffX=e.clientX-el.offsetLeft;diffY=e.clientY-el.offsetTop;E.on(doc,'mousemove',mousemove);E.on(doc,'mouseup',mouseup)};function mousemove(e){var el=conf.target,e=E.evt(e),moveX=e.clientX-diffX,moveY=e.clientY-diffY;var minX,maxX,minY,maxY;if(conf.area){minX=conf.area[0];maxX=conf.area[1];minY=conf.area[2];maxY=conf.area[3];moveX<minX&&(moveX=minX);moveX>maxX&&(moveX=maxX);moveY<minY&&(moveY=minY);moveY>maxY&&(moveY=maxY)}if(conf.dragable){conf.dragX&&(el.style.left=moveX+'px');conf.dragY&&(el.style.top=moveY+'px');if(conf.callback){var obj={moveX:moveX,moveY:moveY};conf.callback.call(conf,obj)}}};function mouseup(e){var el=conf.target;el.style.cursor='default';E.un(doc,'mousemove',mousemove);E.un(doc,'mouseup',mouseup);if(el.releaseCapture){E.un(el,"losecapture",mouseup);el.releaseCapture()}if(window.releaseEvents){E.un(window,"blur",mouseup)}};return new Dragdrop(opt)}}(this);
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/static/security/video-aerial.js b/fzzy-igdss-web/src/main/resources/static/security/video-aerial.js
new file mode 100644
index 0000000..c0a8064
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/security/video-aerial.js
@@ -0,0 +1,165 @@
+var layer;
+
+var windowWidth = 1700;
+var windowHeight = 810;
+
+$(function () {
+    layui.use(['layer'], function () {
+        layer = layui.layer;
+        addDevice(listCamera);
+    });
+});
+
+window.onload = function () {
+    $("#m-container").css("background-image", "url(" + backgroundImg + ")");
+
+    windowWidth = document.body.offsetWidth;
+    windowHeight = document.body.offsetHeight;
+};
+
+function showVideo(id) {
+    layer.msg("璋冪敤瑙嗛鏌ョ湅鈥︹��");
+    //鑾峰彇瑙嗛淇℃伅
+    var curVideo = null;
+    $.each(listCamera, function (index, item) {
+        if (item.id == id) {
+            curVideo = item;
+            return true;
+        }
+    });
+    if (!curVideo) {
+        layer.alert("娌℃湁鑾峰彇鍒板綋鍓嶈棰戜俊鎭�︹��");
+        return;
+    }
+    var url = "/security/video-play?cameraId=" + curVideo.id + "&playType=" + curVideo.playType;
+    if(curVideo.playType == "MEDIA_HIK"){
+        //娴峰悍鎻掍欢鐩存帴window.open鏂伴〉闈㈡挱鏀�
+        var iHeight = 550;
+        var iWidth = 1100;
+        var iTop = (window.screen.height-30-iHeight)/2; //鑾峰緱绐楀彛鐨勫瀭鐩翠綅缃�;
+        var iLeft = (window.screen.width-10-iWidth)/2; //鑾峰緱绐楀彛鐨勬按骞充綅缃�;
+        console.log(iWidth + "-" + iHeight);
+        console.log(iTop + "-" + iLeft);
+        var name = "瑙嗛棰勮";
+        window.open(url,name,'height='+iHeight+',innerHeight='+iHeight+',width='+iWidth+',innerWidth='+iWidth+',top='+iTop+',left='+iLeft+',toolbar=0,menubar=0,scrollbars=auto,resizeable=0,location=0,status=no');
+    }else {
+        if (windowWidth > 1350) {
+            layer.open({
+                type: 2,
+                title: false,//"褰撳墠棰勮锛�" + curVideo.name,
+                area: ['1315px', '570px'],
+                shade: 0,
+                content: url,
+                btn: 0,
+                closeBtn: 2
+            });
+        } else {
+            layer.open({
+                type: 2,
+                title: false,//"褰撳墠棰勮锛�" + curVideo.name,
+                area: ['1315px', (windowHeight - 30) + 'px'],
+                shade: 0,
+                content: url,
+                btn: 0,
+                closeBtn: 2
+            });
+        }
+    }
+};
+
+function showTips(name) {
+    $("#camera_info").text("鎻愮ず锛氬綋鍓嶈澶囧悕绉�- " + name);
+};
+
+// 寮�濮嬫嫋鎷�
+function drag() {
+    var tips = $(".device");
+    if (tips.length == 0) {
+        return;
+    }
+
+    var maxX = windowWidth;
+    var maxY = windowHeight;
+
+    $.each(tips, function (index, item) {
+        var dd = new Dragdrop({
+            target: item,
+            area: [0, maxX, 0, maxY],
+            callback: function (obj) {
+                console.log('x:' + (obj.moveX) + ' y:' + (obj.moveY));
+            }
+        });
+        dd.dragAll();
+    });
+};
+
+//娣诲姞璁惧淇℃伅
+function addDevice(list) {
+   //  console.log(list);
+
+    if (!list || list.length == 0) return;
+    var container = $("#m-container");
+    var parentWidth = container.width();
+    var parentHeight = container.height();
+
+    var temp;
+    var left = 50, top = 50;
+    $.each(list, function (index, item) {
+        left = (parentWidth * item.posX).toFixed(4);
+        top = (parentHeight * item.posY).toFixed(4);
+        if (left < 1) left = 50;
+        if (top < 1) top = 50;
+
+        temp = "";
+        temp += "<div id='" + item.id + "' class='device' "
+            + "' onclick=showTips('" + item.name + "') "
+            + "' ondblclick=showVideo('" + item.id + "') style='left:"
+            + left + "px;top:" + top + "px;'>";
+        temp += "<img src='/img/web/security/ca-4.png' /></div>";
+        container.append(temp);
+    });
+};
+
+// 淇濆瓨璁惧浣嶇疆淇℃伅
+function updatePos() {
+    var tips = $(".device");
+    if (tips.length == 0) {
+        return;
+    }
+    var container = $("#m-container");
+    var parentWidth = container.width();
+    var parentHeight = container.height();
+    var parentTop = container.offset().top;
+    var parentLeft = container.offset().left;
+
+    // 灏佽鏁版嵁杩涜淇濆瓨
+    var data = new Array();
+    var id = null, posX = 0.0, posY = 0.0;
+    var offset;
+    $.each(tips, function (index, item) {
+        id = item.id;
+        offset = $('#' + id).offset();
+
+        posX = (offset.left - parentLeft) / parentWidth;
+        posY = (offset.top - parentTop) / parentHeight;
+
+        data[index] = {
+            id: id,
+            posX: posX.toFixed(4),
+            posY: posY.toFixed(4)
+        };
+    });
+    $.ajax({
+        type: 'POST',
+        url: "/security/update-pos",
+        dataType: 'JSON',
+        contentType: "application/json;charset=UTF-8",
+        data: JSON.stringify(data),
+        success: function (result) {
+            layer.msg("淇℃伅鏇存柊瀹屾垚锛侊紒");
+        },
+        error: function (result) {
+            layer.msg(result.msg);
+        }
+    });
+}
diff --git a/fzzy-igdss-web/src/main/resources/static/security/video-list.css b/fzzy-igdss-web/src/main/resources/static/security/video-list.css
new file mode 100644
index 0000000..2b22ffa
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/security/video-list.css
@@ -0,0 +1,613 @@
+@charset "utf-8";
+
+@font-face {
+    font-family: DINCond-Bold;
+    src: url('../fonts/DINCond-Bold.otf');
+}
+
+body {
+    font-family: "寰蒋闆呴粦", Arial, sans-serif;
+    font-size: 14px;
+    background: #282e35;
+    position: relative;
+}
+
+i, em {
+    font-style: normal;
+}
+
+a {
+    text-decoration: none;
+}
+
+.fl {
+    float: left;
+}
+
+.fr {
+    float: right;
+}
+
+.i-container {
+    width: 100%;
+    /* min-width: 1290px; */
+    margin-left: auto;
+    margin-right: auto;
+    overflow: hidden;
+}
+
+.jmkt-main {
+    overflow: hidden;
+    padding: 0 5px;
+}
+
+.sp-boxWrap,
+.sp-box {
+    height: 550px;
+}
+
+.sp-box {
+    background: #2f3740;
+    -webkit-border-radius: 8px;
+    border-radius: 8px;
+    overflow: hidden;
+}
+
+.pdgxq-H {
+    height: 35px;
+    padding: 0 20px;
+    margin-top: 5px;
+}
+
+.pdgxq-H h3 {
+    line-height: 35px;
+    height: 35px;
+    color: #fff;
+    font-size: 18px;
+    font-weight: bold;
+    position: relative;
+    float: left;
+}
+
+.pdgxq-H h3 i {
+    display: inline-block;
+    width: 4px;
+    height: 24px;
+    position: absolute;
+    left: -20px;
+    top: 50%;
+    margin-top: -12px;
+    z-index: 9;
+    background: url(../img/web/security/tit-redBg.png) center no-repeat;
+}
+
+.sp-showBox {
+    height: 100%;
+}
+
+.sp-showBox.show {
+    display: block;
+}
+
+.sp-showItem {
+    text-align: center;
+    line-height: 316px;
+    height: 316px;
+    background: #262c33;
+    margin: 2px;
+    -webkit-border-radius: 8px;
+    border-radius: 8px;
+}
+
+.sp-hideImg {
+    width: 200px;
+    height: 200px;
+}
+
+.sp-tab-hd {
+    height: 40px;
+    float: right;
+}
+
+.sp-tab-hd span {
+    display: inline-block;
+    float: right;
+    width: 25px;
+    height: 25px;
+    padding: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    overflow: hidden;
+    margin: 3px 10px;
+    opacity: 0.5;
+    cursor: pointer;
+}
+
+.sp-tab-hd span img {
+    width: 100%;
+    height: 100%;
+}
+
+.sp-tab-hd span.active,
+.sp-tab-hd span:hover {
+    background: #262c33;
+    opacity: 1;
+}
+
+.sp-showItem2 {
+    text-align: center;
+    height: 550px;
+    background: #262c33;
+    -webkit-border-radius: 8px;
+    border-radius: 8px;
+}
+
+.sp-showItem2 .sp-hideImg {
+    margin-top: 150px;
+    width: 30%;
+    height: auto;
+}
+
+.sp-cz-wrap {
+    width: 270px;
+    overflow: hidden;
+    margin: 10px auto;
+}
+
+.sp-cz-box {
+    overflow: hidden;
+    width: 284px;
+    height: 284px;
+}
+
+.sp-cz-box ul li {
+    float: left;
+    margin: 1.5px;
+    background: #262c33;
+    overflow: hidden;
+    text-align: center;
+    vertical-align: middle;
+    display: table;
+    opacity: 0.5;
+}
+
+.sp-cz-box ul li a {
+    vertical-align: middle;
+    display: table-cell;
+    width: 100%;
+    height: 100%;
+}
+
+.sp-cz-box ul li a img {
+    width: 32px;
+    height: 32px;
+}
+
+.sp-cz-box ul li.sp-cz-l5 a img {
+    width: 66px;
+    height: 66px;
+}
+
+.sp-cz-l1,
+.sp-cz-l2,
+.sp-cz-l3,
+.sp-cz-l7,
+.sp-cz-l8,
+.sp-cz-l9 {
+    height: 88px;
+}
+
+.sp-cz-l4,
+.sp-cz-l5,
+.sp-cz-l6 {
+    height: 98px;
+}
+
+.sp-cz-l1 {
+    width: 88px;
+    border-top-left-radius: 8px;
+}
+
+.sp-cz-l2,
+.sp-cz-l5,
+.sp-cz-l8 {
+    width: 98px;
+}
+
+.sp-cz-l3 {
+    width: 88px;
+    border-top-right-radius: 8px;
+}
+
+.sp-cz-l4,
+.sp-cz-l6 {
+    width: 88px;
+}
+
+.sp-cz-l7 {
+    width: 88px;
+    border-bottom-left-radius: 8px;
+}
+
+.sp-cz-l9 {
+    width: 88px;
+    border-bottom-right-radius: 8px;
+}
+
+.sp-cz-box ul li:hover,
+.sp-cz-box ul li:active {
+    background: #ef344a;
+    opacity: 1;
+}
+
+.sp-cz-box ul li.sp-cz-l5,
+.sp-cz-box ul li.sp-cz-l5:hover,
+.sp-cz-box ul li.sp-cz-l5:active {
+    background: #2a3138 !important;
+    opacity: 0.5;
+}
+
+.sp-cz-l2 img {
+    -webkit-transform: rotate(45deg);
+    transform: rotate(45deg);
+}
+
+.sp-cz-l3 img {
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
+}
+
+.sp-cz-l4 img {
+    -webkit-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+}
+
+.sp-cz-l6 img {
+    -webkit-transform: rotate(135deg);
+    transform: rotate(135deg);
+}
+
+.sp-cz-l7 img {
+    -webkit-transform: rotate(-90deg);
+    transform: rotate(-90deg);
+}
+
+.sp-cz-l8 img {
+    -webkit-transform: rotate(-135deg);
+    transform: rotate(-135deg);
+}
+
+.sp-cz-l9 img {
+    -webkit-transform: rotate(180deg);
+    transform: rotate(180deg);
+}
+
+/*.sp-bianbei {*/
+/*    height: 50px;*/
+/*    background: #262c33;*/
+/*    width: 280px;*/
+/*    -webkit-border-radius: 30px;*/
+/*    border-radius: 30px;*/
+/*    overflow: hidden;*/
+/*    margin: 10px 2px 0 2px;*/
+/*    text-align: center;*/
+/*}*/
+
+/*.sp-bianbei > span {*/
+/*    line-height: 50px;*/
+/*    color: #bbc3cd;*/
+/*    font-size: 20px;*/
+/*}*/
+
+/*.sp-czBtn {*/
+/*    width: 44px;*/
+/*    height: 44px;*/
+/*    background: #4c5764;*/
+/*    text-align: center;*/
+/*    vertical-align: top;*/
+/*    color: #fff;*/
+/*    font-weight: bold;*/
+/*    border: 0;*/
+/*    outline: none;*/
+/*    -webkit-border-radius: 50%;*/
+/*    border-radius: 50%;*/
+/*    margin: 3px;*/
+/*    font-size: 36px;*/
+/*    cursor: pointer;*/
+/*}*/
+
+.fr{
+    float: right;
+}
+
+.sp-bianbei{
+    width: 47%;
+    height: 40px;
+    background: #4c5863;
+    -webkit-border-radius: 30px;
+    border-radius: 30px;
+    overflow: hidden;
+    margin: 10px 0;
+    text-align: center;
+}
+
+.sp-bianbei>span{
+    line-height: 40px;
+    color: #bbc3cd;
+    font-size:16px;
+}
+
+.sp-czBtn{
+    background: #4c5764;
+    text-align: center;
+    vertical-align: top;
+    color: #fff;
+    font-weight: bold;
+    border: 0;
+    outline: none;
+    -webkit-border-radius: 50%;
+    border-radius: 50%;
+    margin: 3px;
+    font-size: 30px;
+    cursor: pointer;
+}
+
+
+.sp-sxBtn{
+    /*float: left;*/
+}
+
+.sp-fdBtn{
+    float: right;
+}
+
+.sp-czBtn i{
+    position: relative;
+    top: -5px;
+}
+
+.sp-czBtn:active{
+    background: #ef344a;
+}
+
+.sp-table-box {
+    margin: 5px 10px 0 10px;
+}
+
+.sp-table-tit {
+    height: 40px;
+    line-height: 40px;
+    border-bottom: 1px solid #8f3545;
+}
+
+.sp-table-tit h3 {
+    float: left;
+    color: #fff;
+    font-size: 16px;
+    font-weight: bold;
+}
+
+.sp-table-tit span {
+    float: right;
+    color: #9ea6af;
+    font-size: 14px;
+}
+
+.sp-table {
+    background: #2a3138;
+    /*height: 190px;*/
+    -webkit-border-bottom-left-radius: 8px;
+    border-bottom-left-radius: 8px;
+    -webkit--bottom-right-radius: 8px;
+    border-bottom-right-radius: 8px;
+    overflow-y: auto;
+}
+
+.sp-list {
+    overflow: hidden;
+    width: 100%;
+}
+
+.sp-list li {
+    height: 35px;
+    padding: 5px 10px;
+    overflow: hidden;
+}
+
+.sp-list li:hover,
+.sp-list li:active {
+    background: #252b32;
+}
+
+.preset-input{
+    width: 65px;
+    appearance: none;
+    -webkit-appearance:none;
+    -moz-appearance:none;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    height: 40px;
+    line-height: 40px;
+    border-radius: 3px;
+    background: #4c5764;
+    color: #bbc3cd;
+    border-width: 0px;
+    text-align: center;
+}
+
+.sp-list li p {
+    line-height: 35px;
+    height: 35px;
+    overflow: hidden;
+    color: #fff;
+    font-size: 16px;
+}
+
+.sp-list li img {
+    width: 35px;
+    height: 35px;
+    float: left;
+    margin-right: 20px;
+    -webkit-border-radius: 2px;
+    border-radius: 2px;
+}
+
+/** 浜戝彴鎺у埗**/
+.ptz-block {
+    position: absolute;
+    z-index: 99999;
+    width: 130px;
+    height: 254px;
+    right: 0;
+    top: 50%;
+    transform: translateY(-50%);
+    text-align: center;
+    font-size: 24px;
+    background-color: rgba(0,0,0,.6);
+    opacity: 0;
+    border-radius: 10px 0 0 10px;
+    overflow: hidden;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-align: center;
+    align-items: center;
+    transition: all 1s;
+}
+.ptz-block .ptzBlock {
+    width: 139px;
+    height: 150px;
+    margin: 0 auto;
+    text-align: center;
+    position: relative;
+    font-size: 24px;
+}
+.ptz-block .ptzBlock .ptz-block-box {
+    width: 139px;
+    height: 150px;
+}
+.ptz-up, .ptz-block {
+    cursor: pointer;
+}
+
+.ptz-block .ptz-up {
+    top: 0;
+    left: 50%;
+    transform: translateX(-50%);
+}
+.ptz-block .direction{
+    width: 50px;
+    height: 50px;
+    line-height: 50px;
+    position: absolute;
+    cursor: pointer;
+    color: #fff;
+}
+
+.ptz-block .direction:hover{
+    color: #ef344a;
+}
+
+.ptz-block .ptz-left {
+    top: 50%;
+    left: 0;
+    transform: translateY(-50%);
+}
+
+
+.ptz-block .ptz-center {
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%,-50%);
+    width: 42px;
+    height: 42px;
+    line-height: 42px;
+    position: absolute;
+    border-radius: 25px;
+    background-color: #fff;
+    font-size: 24px;
+    color: #3d414a;
+    cursor: pointer;
+}
+.ptz-block .ptz-right {
+    top: 50%;
+    right: 0;
+    transform: translateY(-50%);
+}
+
+.ptz-block .ptz-down {
+    top: 100px;
+    left: 50%;
+    transform: translateX(-50%);
+}
+
+.ptz-block .ptz-input{
+    width: 60px;
+    height: 25px;
+    font-size: 15px;
+    line-height: 42px;
+    text-align: left;
+    color: #0a1118;
+}
+.el-input {
+    position: relative;
+}
+
+.el-input__inner {
+    padding: 0;
+    text-align: center;
+}
+
+.el-input--mini .el-input__inner {
+    height: 28px;
+    line-height: 28px;
+}
+
+.el-input__inner {
+    -webkit-appearance: none;
+    background-color: #fff;
+    background-image: none;
+    border-radius: 6px;
+    border: 1px solid #dcdfe6;
+    box-sizing: border-box;
+    color: #606266;
+    display: inline-block;
+    font-size: inherit;
+    /*height: 40px;*/
+    /*line-height: 40px;*/
+    outline: none;
+    /*padding: 0 0px;*/
+    transition: border-color .2s cubic-bezier(.645,.045,.355,1);
+    width: 100%;
+    margin-left: 40px
+}
+
+.ptz-block .ptz-plus {
+    top: -30px;
+    left: 30%;
+    transform: translateX(-50%);
+}
+
+.ptz-block .ptz-btn {
+    width: 24px;
+    height: 24px;
+    line-height: 24px;
+    text-align: center;
+    font-size: 14px;
+    position: absolute;
+    background-color: #fff;
+    border-radius: 12px;
+    color: #3d414a;
+    font-weight: 400;
+}
+
+.ptz-block .ptz-minus {
+    top: -30px;
+    left: 70%;
+    transform: translateX(-50%);
+}
+
+.ptz-block .ptz-btn:hover{
+    background-color: #ef344a;
+    color: #ffffff;
+}
+/** 浜戝彴鎺у埗END **/
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/static/security/video-list.js b/fzzy-igdss-web/src/main/resources/static/security/video-list.js
new file mode 100644
index 0000000..814971d
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/security/video-list.js
@@ -0,0 +1,204 @@
+var layer;
+var timer;
+var table;
+var cameraData;
+var playUrl= null;
+
+$(function () {
+    layui.use(['layer', 'table'], function () {
+        layer = layui.layer;
+        table = layui.table;
+    });
+    
+    showPtz = function(){
+        $("#ptz-block").css("opacity",1);
+    };
+
+    disPtz = function(){
+        $("#ptz-block").css("opacity",0);
+    };
+
+    //鍒濆鍖栨覆鏌撴挱鏀惧垪琛�
+    renderList();
+});
+
+/**
+ * 鐐瑰嚮鎾斁
+ * @param cameraId
+ */
+play = function (data) {
+    layer.msg("姝e湪鑾峰彇鎾斁淇℃伅鈥︹��");
+    cameraData = null;
+    playUrl = null;
+    var data = {
+        id: data.id,
+        playType: data.playType
+    };
+    $.ajax({
+        type: 'POST',
+        url: "/security/get-media",
+        dataType: 'JSON',
+        contentType: "application/json;charset=UTF-8",
+        data: JSON.stringify(data),
+        success: function (result) {
+            if (result.code != "SUCCESS") {
+                layer.msg(result.msg);
+            } else {
+                cameraData = result;
+                playUrl = result.playUrl;
+                play2();
+            }
+        },
+        error: function (result) {
+            play2();
+        }
+    });
+};
+
+play2 = function () {
+
+    if (!cameraData) {
+        layer.alert("鏈幏鍙栧埌褰撳墠鎽勫儚澶存挱鏀句俊鎭紒锛�");
+        return;
+    }
+
+    if(PlayType.VLC == cameraData.playType){ //璇存槑浣跨敤鏈湴VLC鎾斁
+        vlcToPlay();
+    }
+
+    if (PlayType.PLAY_TYPE_WEB_RTC_DH == cameraData.playType
+    || PlayType.PLAY_TYPE_WEB_RTC_HIK == cameraData.playType) {//浣跨敤web-rtc鎾斁
+        webRtcToPlay();
+    }
+};
+
+
+function renderList() {
+    if (!listCamera || listCamera.length == 0) {
+        return;
+    }
+    var eleTable = document.getElementById("cameraList");
+    var _tr;
+    var _td;
+    listCamera.forEach(function (data) {
+        _tr = document.createElement("tr");
+        _tr.ondblclick = function () {
+            play(data);
+        };
+
+        _td = document.createElement("td");
+        _td.innerText = data.name;
+        _tr.appendChild(_td);
+
+        _td = document.createElement("td");
+        _td.innerText = data.type == "01" ? "鏋満" : "鐞冩満";
+        _tr.appendChild(_td);
+
+        _td = document.createElement("td");
+        _td.innerText = data.status == "OFF" ? "绂荤嚎" : "鍦ㄧ嚎";
+        _tr.appendChild(_td);
+
+        eleTable.appendChild(_tr);
+    });
+}
+
+
+/**
+ * 鎾斁杩樻槸鏆傚仠
+ */
+function playStop() {
+    var videL = $('#easyPlayer');
+    if (videL.paused) {
+        videL.play();
+    } else {
+        videL.pause();
+    }
+}
+/*============= vlc瑙嗛鎾斁 ----- 寮�濮� ===============*/
+function vlcToPlay() {
+    $("#video").css('display','none');
+    $("#vlcPlayer").css('display','block');
+    var html = '';
+    html += '<object type="application/x-vlc-plugin"' +
+        'events="true" width="100%" height="100%"' +
+        'pluginspage="http://www.videolan.org"' +
+        'th:codebase="@{../../static/plugins/vlc/npapi-vlc-2.2.2.tar.xz}">' +
+        '<param name="mrl" value="' + playUrl + '"/>'+
+        '<param name="volume" value="50"/>' +
+        '<param name="autoplay" value="true"/>' +
+        '<param name="loop" value="false"/>' +
+        '<param name="fullscreen" value="true"/>' +
+        '<param name="toolbar" value="false"/>' +
+        '</object>';
+    $("#vlcPlayer").html(html);
+}
+
+/*============= webRtc瑙嗛鎾斁 ----- 寮�濮� ===============*/
+
+/*============= webRtc瑙嗛鎾斁 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay() {
+    layer.msg("寮�濮嬪惎鍔ㄦ挱鏀锯�︹��");
+    $("#vlcPlayer").css('display','none');
+    $("#video").css('display','block');
+
+    if(playUrl){
+        mediaStream = new MediaStream();
+        $("#video")[0].srcObject = mediaStream;
+        webrtc = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc.onsignalingstatechange = signalingstatechange;
+
+        webrtc.ontrack = ontrack
+        let offer = await webrtc.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc.setLocalDescription(offer);
+    }
+}
+
+function ontrack(event) {
+    mediaStream.addTrack(event.track);
+}
+
+async function signalingstatechange() {
+    switch (webrtc.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl + "?uuid=" + cameraData.cameraId + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc.signalingState}`);
+            break;
+    }
+}
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
diff --git a/fzzy-igdss-web/src/main/resources/static/security/video-webrtc.css b/fzzy-igdss-web/src/main/resources/static/security/video-webrtc.css
new file mode 100644
index 0000000..d47b626
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/security/video-webrtc.css
@@ -0,0 +1,579 @@
+@charset "utf-8";
+
+@font-face {
+    font-family: DINCond-Bold;
+    src: url('../fonts/DINCond-Bold.otf');
+}
+
+body {
+    font-family: "寰蒋闆呴粦", Arial, sans-serif;
+    font-size: 14px;
+    background: #282e35;
+    position: relative;
+}
+
+i, em {
+    font-style: normal;
+}
+
+a {
+    text-decoration: none;
+}
+
+.fl {
+    float: left;
+}
+
+.fr {
+    float: right;
+}
+
+.i-container {
+    width: 100%;
+    /* min-width: 1290px; */
+    margin-left: auto;
+    margin-right: auto;
+    overflow: hidden;
+}
+
+.jmkt-main {
+    overflow: hidden;
+    padding: 0 5px;
+}
+
+.sp-boxWrap,
+.sp-box {
+    height: 550px;
+}
+
+.sp-box {
+    background: #2f3740;
+    -webkit-border-radius: 8px;
+    border-radius: 8px;
+    overflow: hidden;
+}
+
+.pdgxq-H {
+    height: 35px;
+    padding: 0 20px;
+    margin-top: 5px;
+}
+
+.pdgxq-H h3 {
+    line-height: 35px;
+    height: 35px;
+    color: #fff;
+    font-size: 18px;
+    font-weight: bold;
+    position: relative;
+    float: left;
+}
+
+.pdgxq-H h3 i {
+    display: inline-block;
+    width: 4px;
+    height: 24px;
+    position: absolute;
+    left: -20px;
+    top: 50%;
+    margin-top: -12px;
+    z-index: 9;
+    background: url(../../img/web/security/tit-redBg.png) center no-repeat;
+}
+
+.sp-showBox {
+    height: 100%;
+}
+
+.sp-showBox.show {
+    display: block;
+}
+
+.sp-showItem {
+    text-align: center;
+    line-height: 316px;
+    height: 316px;
+    background: #262c33;
+    margin: 2px;
+    -webkit-border-radius: 8px;
+    border-radius: 8px;
+}
+
+.sp-hideImg {
+    width: 200px;
+    height: 200px;
+}
+
+.sp-tab-hd {
+    height: 40px;
+    float: right;
+}
+
+.sp-tab-hd span {
+    display: inline-block;
+    float: right;
+    width: 25px;
+    height: 25px;
+    padding: 4px;
+    -webkit-border-radius: 4px;
+    border-radius: 4px;
+    overflow: hidden;
+    margin: 3px 10px;
+    opacity: 0.5;
+    cursor: pointer;
+}
+
+.sp-tab-hd span img {
+    width: 100%;
+    height: 100%;
+}
+
+.sp-tab-hd span.active,
+.sp-tab-hd span:hover {
+    background: #262c33;
+    opacity: 1;
+}
+
+.sp-showItem2 {
+    text-align: center;
+    height: 550px;
+    background: #262c33;
+    -webkit-border-radius: 8px;
+    border-radius: 8px;
+}
+
+.sp-showItem2 .sp-hideImg {
+    margin-top: 150px;
+    width: 30%;
+    height: auto;
+}
+
+.sp-cz-wrap {
+    width: 270px;
+    overflow: hidden;
+    margin: 10px auto;
+}
+
+.sp-cz-box {
+    overflow: hidden;
+    width: 284px;
+    height: 284px;
+}
+
+.sp-cz-box ul li {
+    float: left;
+    margin: 1.5px;
+    background: #262c33;
+    overflow: hidden;
+    text-align: center;
+    vertical-align: middle;
+    display: table;
+    opacity: 0.5;
+}
+
+.sp-cz-box ul li a {
+    vertical-align: middle;
+    display: table-cell;
+    width: 100%;
+    height: 100%;
+}
+
+.sp-cz-box ul li a img {
+    width: 32px;
+    height: 32px;
+}
+
+.sp-cz-box ul li.sp-cz-l5 a img {
+    width: 66px;
+    height: 66px;
+}
+
+.sp-cz-l1,
+.sp-cz-l2,
+.sp-cz-l3,
+.sp-cz-l7,
+.sp-cz-l8,
+.sp-cz-l9 {
+    height: 88px;
+}
+
+.sp-cz-l4,
+.sp-cz-l5,
+.sp-cz-l6 {
+    height: 98px;
+}
+
+.sp-cz-l1 {
+    width: 88px;
+    border-top-left-radius: 8px;
+}
+
+.sp-cz-l2,
+.sp-cz-l5,
+.sp-cz-l8 {
+    width: 98px;
+}
+
+.sp-cz-l3 {
+    width: 88px;
+    border-top-right-radius: 8px;
+}
+
+.sp-cz-l4,
+.sp-cz-l6 {
+    width: 88px;
+}
+
+.sp-cz-l7 {
+    width: 88px;
+    border-bottom-left-radius: 8px;
+}
+
+.sp-cz-l9 {
+    width: 88px;
+    border-bottom-right-radius: 8px;
+}
+
+.sp-cz-box ul li:hover,
+.sp-cz-box ul li:active {
+    background: #ef344a;
+    opacity: 1;
+}
+
+.sp-cz-box ul li.sp-cz-l5,
+.sp-cz-box ul li.sp-cz-l5:hover,
+.sp-cz-box ul li.sp-cz-l5:active {
+    background: #2a3138 !important;
+    opacity: 0.5;
+}
+
+.sp-cz-l2 img {
+    -webkit-transform: rotate(45deg);
+    transform: rotate(45deg);
+}
+
+.sp-cz-l3 img {
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
+}
+
+.sp-cz-l4 img {
+    -webkit-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+}
+
+.sp-cz-l6 img {
+    -webkit-transform: rotate(135deg);
+    transform: rotate(135deg);
+}
+
+.sp-cz-l7 img {
+    -webkit-transform: rotate(-90deg);
+    transform: rotate(-90deg);
+}
+
+.sp-cz-l8 img {
+    -webkit-transform: rotate(-135deg);
+    transform: rotate(-135deg);
+}
+
+.sp-cz-l9 img {
+    -webkit-transform: rotate(180deg);
+    transform: rotate(180deg);
+}
+
+.fr{
+    float: right;
+}
+
+.sp-bianbei{
+    width: 47%;
+    height: 40px;
+    background: #4c5863;
+    -webkit-border-radius: 30px;
+    border-radius: 30px;
+    overflow: hidden;
+    margin: 10px 0;
+    text-align: center;
+}
+
+.sp-bianbei>span{
+    line-height: 40px;
+    color: #bbc3cd;
+    font-size:16px;
+}
+
+.sp-czBtn{
+    background: #4c5764;
+    text-align: center;
+    vertical-align: top;
+    color: #fff;
+    font-weight: bold;
+    border: 0;
+    outline: none;
+    -webkit-border-radius: 50%;
+    border-radius: 50%;
+    margin: 3px;
+    font-size: 30px;
+    cursor: pointer;
+}
+
+
+.sp-sxBtn{
+    /*float: left;*/
+}
+
+.sp-fdBtn{
+    float: right;
+}
+
+.sp-czBtn i{
+    position: relative;
+    top: -5px;
+}
+
+.sp-czBtn:active{
+    background: #ef344a;
+}
+
+.sp-table-box {
+    margin: 5px 10px 0 10px;
+}
+
+.sp-table-tit {
+    height: 40px;
+    line-height: 40px;
+    border-bottom: 1px solid #8f3545;
+}
+
+.sp-table-tit h3 {
+    float: left;
+    color: #fff;
+    font-size: 16px;
+    font-weight: bold;
+}
+
+.sp-table-tit span {
+    float: right;
+    color: #9ea6af;
+    font-size: 14px;
+}
+
+.sp-table {
+    background: #2a3138;
+    /*height: 190px;*/
+    -webkit-border-bottom-left-radius: 8px;
+    border-bottom-left-radius: 8px;
+    -webkit--bottom-right-radius: 8px;
+    border-bottom-right-radius: 8px;
+    overflow-y: auto;
+}
+
+.sp-list {
+    overflow: hidden;
+    width: 100%;
+}
+
+.sp-list li {
+    height: 35px;
+    padding: 5px 10px;
+    overflow: hidden;
+}
+
+.sp-list li:hover,
+.sp-list li:active {
+    background: #252b32;
+}
+
+.preset-input{
+    width: 65px;
+    appearance: none;
+    -webkit-appearance:none;
+    -moz-appearance:none;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    height: 40px;
+    line-height: 40px;
+    border-radius: 3px;
+    background: #4c5764;
+    color: #bbc3cd;
+    border-width: 0px;
+    text-align: center;
+}
+
+.sp-list li p {
+    line-height: 35px;
+    height: 35px;
+    overflow: hidden;
+    color: #fff;
+    font-size: 16px;
+}
+
+.sp-list li img {
+    width: 35px;
+    height: 35px;
+    float: left;
+    margin-right: 20px;
+    -webkit-border-radius: 2px;
+    border-radius: 2px;
+}
+
+/** 浜戝彴鎺у埗**/
+.ptz-block {
+    position: absolute;
+    z-index: 99999;
+    width: 130px;
+    height: 254px;
+    right: 0;
+    top: 50%;
+    transform: translateY(-50%);
+    text-align: center;
+    font-size: 24px;
+    background-color: rgba(0,0,0,.6);
+    opacity: 0;
+    border-radius: 10px 0 0 10px;
+    overflow: hidden;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-align: center;
+    align-items: center;
+    transition: all 1s;
+}
+.ptz-block .ptzBlock {
+    width: 139px;
+    height: 150px;
+    margin: 0 auto;
+    text-align: center;
+    position: relative;
+    font-size: 24px;
+}
+.ptz-block .ptzBlock .ptz-block-box {
+    width: 139px;
+    height: 150px;
+}
+.ptz-up, .ptz-block {
+    cursor: pointer;
+}
+
+.ptz-block .ptz-up {
+    top: 0;
+    left: 50%;
+    transform: translateX(-50%);
+}
+.ptz-block .direction{
+    width: 50px;
+    height: 50px;
+    line-height: 50px;
+    position: absolute;
+    cursor: pointer;
+    color: #fff;
+}
+
+.ptz-block .direction:hover{
+    color: #ef344a;
+}
+
+.ptz-block .ptz-left {
+    top: 50%;
+    left: 0;
+    transform: translateY(-50%);
+}
+
+
+.ptz-block .ptz-center {
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%,-50%);
+    width: 42px;
+    height: 42px;
+    line-height: 42px;
+    position: absolute;
+    border-radius: 25px;
+    background-color: #fff;
+    font-size: 24px;
+    color: #3d414a;
+    cursor: pointer;
+}
+.ptz-block .ptz-right {
+    top: 50%;
+    right: 0;
+    transform: translateY(-50%);
+}
+
+.ptz-block .ptz-down {
+    top: 100px;
+    left: 50%;
+    transform: translateX(-50%);
+}
+
+.ptz-block .ptz-input{
+    width: 60px;
+    height: 25px;
+    font-size: 15px;
+    line-height: 42px;
+    text-align: left;
+    color: #0a1118;
+}
+.el-input {
+    position: relative;
+}
+
+.el-input__inner {
+    padding: 0;
+    text-align: center;
+}
+
+.el-input--mini .el-input__inner {
+    height: 28px;
+    line-height: 28px;
+}
+
+.el-input__inner {
+    -webkit-appearance: none;
+    background-color: #fff;
+    background-image: none;
+    border-radius: 6px;
+    border: 1px solid #dcdfe6;
+    box-sizing: border-box;
+    color: #606266;
+    display: inline-block;
+    font-size: inherit;
+    /*height: 40px;*/
+    /*line-height: 40px;*/
+    outline: none;
+    /*padding: 0 0px;*/
+    transition: border-color .2s cubic-bezier(.645,.045,.355,1);
+    width: 100%;
+    margin-left: 40px
+}
+
+.ptz-block .ptz-plus {
+    top: -30px;
+    left: 30%;
+    transform: translateX(-50%);
+}
+
+.ptz-block .ptz-btn {
+    width: 24px;
+    height: 24px;
+    line-height: 24px;
+    text-align: center;
+    font-size: 14px;
+    position: absolute;
+    background-color: #fff;
+    border-radius: 12px;
+    color: #3d414a;
+    font-weight: 400;
+}
+
+.ptz-block .ptz-minus {
+    top: -30px;
+    left: 70%;
+    transform: translateX(-50%);
+}
+
+.ptz-block .ptz-btn:hover{
+    background-color: #ef344a;
+    color: #ffffff;
+}
+/** 浜戝彴鎺у埗END **/
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/static/security/video-webrtc.js b/fzzy-igdss-web/src/main/resources/static/security/video-webrtc.js
new file mode 100644
index 0000000..4556ba1
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/security/video-webrtc.js
@@ -0,0 +1,242 @@
+var layer;
+var playUrl= null;
+var loginTag = false;
+
+$(function () {
+    layui.use(['layer'], function () {
+        layer = layui.layer;
+    });
+
+    getMedia();
+});
+
+/**
+ * 鑾峰彇鎾斁淇℃伅
+ */
+function getMedia() {
+    var data = {
+        id: cameraData.id,
+        playType: cameraData.playType
+    };
+    $.ajax({
+        type: 'POST',
+        url: "/security/get-media",
+        dataType: 'JSON',
+        contentType: "application/json;charset=UTF-8",
+        data: JSON.stringify(data),
+        success: function (result) {
+            if (result.code != "SUCCESS") {
+                layer.msg(result.msg);
+            } else {
+                playUrl = result.playUrl;
+                toPlay();
+                onLogin();
+            }
+        },
+        error: function (result) {
+            layer.msg(result.msg);
+        }
+    });
+}
+
+/*============= webRtc瑙嗛鎾斁 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function toPlay() {
+    if(playUrl){
+        mediaStream = new MediaStream();
+        $("#video")[0].srcObject = mediaStream;
+        webrtc = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc.onsignalingstatechange = signalingstatechange;
+
+        webrtc.ontrack = ontrack
+        let offer = await webrtc.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc.setLocalDescription(offer);
+    }
+}
+
+function ontrack(event) {
+    mediaStream.addTrack(event.track);
+}
+
+async function signalingstatechange() {
+    switch (webrtc.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl + "?uuid=" + cameraData.id + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc.signalingState}`);
+            break;
+    }
+}
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/**
+ *
+ * @param command 浜戝彴浜嬩欢绫诲瀷
+ * @param flag 鏄惁鍋滄鐩稿簲浜嬩欢
+ */
+function handPTZ(command, flag){
+    if(!loginTag){
+        layer.alert("璁惧浜戝彴鐧诲綍澶辫触锛岃閲嶈瘯锛�");
+        return;
+    }
+
+    //澶у崕浜戝彴鎺у埗
+    dhPlayerPTZ(command, flag);
+}
+
+/**
+ * 浜戝彴鎺у埗 -棰勭疆浣嶇疆璋冪敤
+ */
+function handPreset() {
+
+}
+
+/*============= 澶у崕JS浜戝彴鎺у埗 ----- 寮�濮� ===============*/
+/**
+ * @description 璁惧鐧诲綍
+ */
+function onLogin (){
+    onLogout();
+    let ip = cameraData.ip;
+    let port= cameraData.webPort;
+    let user= cameraData.loginId;
+    let pwd=  cameraData.pwd;
+
+    let target = ip + ':' + port;
+    setIP(target);
+    /**
+     * RPC.login 鐧诲綍
+     * @param {string} $user.value 鐢ㄦ埛鍚�
+     * @param {string} $password.value 瀵嗙爜
+     * @param {boolean} false 鏄惁httpOnly,榛樿false
+     * @returns {Promise}
+     */
+    RPC.login(user, pwd, false).then((res) => {
+
+        setCookie('DWebClientSessionID', '', -1);
+        setCookie('DhWebClientSessionID', '', -1);
+        /**
+         * RPC.keepAlive 淇濇椿
+         */
+        RPC.keepAlive(300, 60000, _getSession(), target, 0);
+        const browser = BrowserType();
+        if (browser.includes('ie')) {
+            window.onunload = () => {
+                ajax({
+                    url: 'global.logout'
+                });
+            };
+        } else if (browser.includes('chrome')) {
+            const params = {
+                method: 'global.logout',
+                params: null,
+                id: 10000,
+                session: _getSession()
+            };
+            pubsub.subscribe('onbeforeunload',() => {
+                navigator.sendBeacon('/RPC2', JSON.stringify(params));
+            });
+        } else {
+            pubsub.subscribe('onbeforeunload',() => {
+                ajax({
+                    url: 'global.logout'
+                });
+            });
+        }
+        //鐧诲綍鎴愬姛锛岃褰曠櫥褰曟垚鍔熺殑纭洏褰曞儚鏈�
+        loginTag = true;
+
+    }).catch((err) => {
+        console.log(err);
+    });
+}
+/**
+ * @description 璁惧娉ㄩ攢
+ */
+function onLogout (){
+    /**
+     * RPC.Global.logout 娉ㄩ攢鎺ュ彛
+     * @returns {Promise}
+     */
+    RPC.Global.logout().then(function() {
+        setLoginState(false);
+        playerInstance.forEach(item => {
+            if(item) {
+                item.stop();
+                item.close();
+                item = null;
+            }
+            loginTag = false;
+        });
+    });
+}
+
+/**
+ * @description 璁惧浜戝彴浜嬩欢
+ * @param {string} type 浜戝彴浜嬩欢绫诲瀷
+ * @param {boolean} isStop 鏄惁鍋滄鐩稿簲浜嬩欢
+ */
+function dhPlayerPTZ (type, isStop) {
+
+    //浜戝彴姝ラ暱
+    // let stepVal = $_('#h5_ptz_step').value - 0;
+    let stepVal = 5;
+    let arg2 = 0;
+    let arg2Arr = ['LeftUp', 'RightUp', 'LeftDown', 'RightDown'];
+    let presetArr = ['GotoPreset','SetPreset', 'ClearPreset'];
+    //棰勭疆鐐�
+    // let presetNum = $_('#h5_preset').value - 0;
+    let presetNum =  0;
+    if(arg2Arr.indexOf(type) > -1) {
+        arg2 = stepVal;
+    }
+    if(!isStop) {
+        if(presetArr.indexOf(type) > -1) {
+            /**
+             * RPC.PTZManager 浜戝彴鐩稿叧
+             * @param {string} 鏂规硶
+             * @param {number} channel 閫氶亾
+             * @param {object} 鍙傛暟闆嗗悎
+             */
+            RPC.PTZManager('start', 0, { 'code': type, 'arg1': presetNum, 'arg2': 0, 'arg3': 0 });
+        } else {
+            RPC.PTZManager('start', 0, { 'code': type, 'arg1': stepVal, 'arg2': arg2, 'arg3': 0 });
+        }
+    } else {
+        RPC.PTZManager('stop', 0, { 'code': type, 'arg1': stepVal, 'arg2': arg2, 'arg3': 0 });
+    }
+}
+/*============= 澶у崕JS浜戝彴鎺у埗 ----- 缁撴潫 ===============*/
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/templates/common/preview-img.html b/fzzy-igdss-web/src/main/resources/templates/common/preview-img.html
new file mode 100644
index 0000000..40ea30b
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/templates/common/preview-img.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="renderer" content="webkit">
+    <title>瑙嗛棰勮</title>
+
+    <link rel="stylesheet" th:href="@{/ajax/libs/layui/css/layui.css}"/>
+    <style type="text/css">
+        .layui-card-header {
+            font-weight: bold;
+            background-color: #39aef5;
+            color: #FFF;
+        }
+
+        .layui-card-body {
+            text-align: center;
+        }
+
+        thead span {
+            font-weight: bold
+        }
+
+        .video {
+            width: 100%;;
+            height: 100%;
+        }
+    </style>
+</head>
+<body>
+<!-- 鍙拷韪俊鎭� -->
+<div class="layui-tab-content">
+    <div class="layui-fluid" id="recordFilesDiv">
+        <div class="layui-col-md12 layui-col-sm12">
+            <div class="layui-card">
+                <div class="layui-card-body">
+                    <img th:src="${imgPath}" style="height: 100%;width: 100%">
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script th:src="@{/js/jquery.min.js}"></script>
+<script th:src="@{/ajax/libs/layui/layui.js}"></script>
+<script>
+</script>
+</body>
+</html>
diff --git a/fzzy-igdss-web/src/main/resources/templates/security/video-aerial.html b/fzzy-igdss-web/src/main/resources/templates/security/video-aerial.html
new file mode 100644
index 0000000..5bb5eb9
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/templates/security/video-aerial.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang="zh-cn" xmlns:th=http://www.thymeleaf.org>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <title>鏅烘収绮簱绠$悊骞冲彴-鐩戞帶楦熺灠鍥�</title>
+
+    <link rel="stylesheet" th:href="@{/ajax/libs/layui/css/layui.css}"/>
+    <style>
+        html, body, .full {
+            width: 100%;
+            height: 100%;
+            overflow-y: hidden;
+        }
+
+        #m-container {
+            background-repeat: no-repeat;
+            background-size: 100% 100%;
+            -moz-background-size: 100% 100%;
+        }
+
+        .device {
+            position: absolute;
+        }
+
+        .device img {
+            width: 40px;
+            height: 40px;
+        }
+
+        #camera_info {
+            font-size: 14px;
+            font-weight: bold;
+            color: red;
+        }
+    </style>
+</head>
+<body>
+
+<div class="layui-card-body" style="height: 100%; padding: 1px;" id="main">
+    <div class="full" id="m-container">
+        <div style="float: right;">
+            <span id="camera_info">鎻愮ず锛�</span>
+            <button type="button" class="layui-btn layui-btn-sm" onclick="drag()">绉诲姩</button>
+            <button type="button" class="layui-btn layui-btn-sm layui-btn-danger" onclick="updatePos()">淇濆瓨</button>
+        </div>
+    </div>
+</div>
+
+<script th:inline="javascript">
+    //绯荤粺鐧婚檰浜�
+    var loginUser = [[${loginUser}]];
+    //涓氬姟绫诲瀷
+    var bizType = [[${bizType}]];
+    //userId
+    var userId = [[${loginUser.loginName}]];
+    var companyId = [[${loginUser.companyId}]];
+
+    //褰撳墠璁惧鍒楄〃
+    var listCamera = [[${listCamera}]];
+    var backgroundImg = [[${backgroundImg}]];
+</script>
+<script th:src="@{/js/jquery.min.js}"></script>
+<script th:src="@{/ajax/libs/layui/layui.js}"></script>
+<script th:src="@{/common/constant.js}"></script>
+<script th:src="@{/common/igds-common.js}"></script>
+<script th:src="@{/js/plugins/drag/drag-drop.js}"></script>
+<script th:src="@{/security/video-aerial.js}"></script>
+
+<!-- 寮瑰嚭鎿嶄綔妗� -->
+<div class="layui-tab-content" id="aerialDialog" style="display: none;">
+    <div class="layui-btn-container m10"></div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/templates/security/video-list.html b/fzzy-igdss-web/src/main/resources/templates/security/video-list.html
new file mode 100644
index 0000000..e18f386
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/templates/security/video-list.html
@@ -0,0 +1,236 @@
+<!DOCTYPE html>
+<html lang="zh-cn" xmlns:th=http://www.thymeleaf.org>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+	<meta name="renderer" content="webkit">
+	<title>鏅烘収绮簱绠$悊骞冲彴-鐩戞帶鍒楄〃</title>
+
+	<link rel="stylesheet" th:href="@{/ajax/libs/layui/css/layui.css}"/>
+	<link rel="stylesheet" th:href="@{/security/video-list.css}">
+
+	<style>
+		html, body, .full {
+			width: 100%;
+			height: 100%;
+			overflow-y: hidden;
+		}
+
+		.layui-fluid {
+			position: relative;
+			margin: 0 auto;
+			padding: unset;
+		}
+
+		.layui-col-space20 {
+			margin: unset;
+		}
+
+		.layui-col-space20>* {
+			padding: 10px 5px;
+		}
+
+		.sp-showItem2 {
+			height: 690px;
+		}
+
+		.sp-box {
+			height: 760px;
+		}
+
+		.sp-rl>span {
+			line-height: 50px;
+			color: #bbc3cd;
+			font-size: 20px;
+		}
+
+		.sp-table {
+			height: 732px;
+			width: 425px;
+		}
+
+		.pdgxq-table1 {
+			background-color: transparent;
+			margin: 0;
+		}
+
+		.pdgxq-table1 thead tr th {
+			color: #ef344a;
+		}
+
+		.pdgxq-table1 thead tr {
+			background: #141C25 !important;
+			border-bottom: 1px solid #ef344a;
+		}
+
+		.layui-table td, .layui-table th {
+			padding: 9px 5px;
+		}
+
+		.pdgxq-table1 th, .pdgxq-table1 td {
+			text-align: center;
+			min-height: 32px;
+			line-height: 32px;
+			font-size: 14px;
+		}
+
+		.pdgxq-table1 tbody tr:nth-child(odd) {
+			background-color: #262d33;
+		}
+
+		.pdgxq-table1 td em {
+			color: #ef344a;
+		}
+
+		.layui-table td, .layui-table th {
+			padding: 9px 5px;
+		}
+
+		.pdgxq-table1 td {
+			color: #fff;
+			cursor: pointer;
+		}
+		.video {
+			width: 100%;
+			height: 100%;
+		}
+	</style>
+</head>
+
+<body class="pdgxq-body">
+<div class="i-container">
+	<div class="jmkt-main">
+		<div class="layui-fluid">
+			<div class="sp-boxWrap layui-row layui-col-space20">
+				<div class="layui-col-lg9 layui-col-md9">
+					<div class="pdgxq-m1-left sp-box">
+
+						<div class="pdgxq-H">
+							<h3>
+								<i></i>瑙嗛瀹炴椂棰勮
+							</h3>
+						</div>
+
+						<div class="sp-tab-bd" style="padding: 5px 10px 15px 10px;">
+							<div class="sp-showBox layui-row show">
+								<div class="layui-col-lg12 layui-col-md12">
+									<div class="sp-showItem2" onmouseover="showPtz()"
+										 onmouseout="disPtz()">
+										<!-- 浣跨敤鏈湴VLC鎻掍欢鎾斁 -->
+										<div id="vlcPlayer" style="display: none; width: 100%; height: 100%"></div>
+
+<!--										&lt;!&ndash; 浣跨敤鎾斁鍣ㄦ挱鏀� &ndash;&gt;-->
+<!--										<easy-player id="easyPlayer" style="display: none;" live="true" show-custom-button="true" auto-play="true" muted="true"></easy-player>-->
+
+<!--										&lt;!&ndash; 浣跨敤IFrame鎾斁 &ndash;&gt;-->
+<!--										<iframe id="iframePlayer" src="" style="display: none;" width="100%" height="100%" allowfullscreen></iframe>-->
+
+										<!-- 浣跨敤WebRtc鎾斁 -->
+										<video class="video" id="video" autoplay="" muted="" playsinline="">
+
+										<!-- 浜戝彴鎺у埗 -->
+										<div class="ptz-block" id="ptz-block" style="opacity: 0;">
+											<div class="ptzBlock">
+												<div class="ptz-block-box">
+													<div title="涓�" onmousedown="mouseDownPTZControl(1);"
+														 onmouseup="mouseUpPTZControl();"
+														 class="ptz-cell direction ptz-up">
+														<i class="layui-icon layui-icon-up"></i>
+													</div>
+													<div title="宸�" onmousedown="mouseDownPTZControl(3);"
+														 onmouseup="mouseUpPTZControl();"
+														 class="ptz-cell direction ptz-left">
+														<i class="layui-icon layui-icon-left"></i>
+													</div>
+													<div title="浜戝彴鎺у埗"
+														 class="ptz-center layui-icon layui-icon-voice"></div>
+													<div title="鍙�" onmousedown="mouseDownPTZControl(4);"
+														 onmouseup="mouseUpPTZControl();"
+														 class="ptz-cell direction ptz-right">
+														<i class="layui-icon layui-icon-right"></i>
+													</div>
+													<div title="涓�" onmousedown="mouseDownPTZControl(2);"
+														 onmouseup="mouseUpPTZControl();"
+														 class="ptz-cell direction ptz-down">
+														<i class="layui-icon layui-icon-down"></i>
+													</div>
+												</div>
+												<div title="浜戝彴閫熷害">
+													<div class="ptz-input el-input el-input--mini">
+														<input type="number" autocomplete="off" value='120'
+															   min="0" max="255" class="el-input__inner">
+													</div>
+												</div>
+												<div title="鏀惧ぇ" onmousedown="PTZZoomIn()"
+													 onmouseup="PTZZoomStop()"
+													 class="ptz-cell ptz-btn ptz-plus">
+													<i class="layui-icon layui-icon-addition"></i>
+												</div>
+												<div title="缂╁皬" onmousedown="PTZZoomout()"
+													 onmouseup="PTZZoomStop()"
+													 class="ptz-cell ptz-btn ptz-minus">
+													<i class="layui-icon layui-icon-subtraction"></i>
+												</div>
+											</div>
+										</div>
+										<!-- 浜戝彴鎺у埗 END -->
+
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+				<!--pdgxq-m1-left end-->
+				<div class="layui-col-lg3 layui-col-md3">
+					<div class="pdgxq-m1-right sp-box" style="height: 760px;">
+						<div class="pdgxq-H">
+							<h3>
+								<i></i>璁惧鍒楄〃
+							</h3>
+						</div>
+						<div class="sp-table-box">
+							<div class="sp-table">
+
+								<table class="layui-table pdgxq-table1" lay-skin="nob">
+									<colgroup>
+										<col width="70%">
+										<col width="15%">
+										<col width="15%">
+									</colgroup>
+									<thead>
+									<tr>
+										<th>鍚嶇О</th>
+										<th>绫诲瀷</th>
+										<th>鐘舵��</th>
+									</tr>
+									</thead>
+									<tbody id="cameraList">
+
+									</tbody>
+								</table>
+
+							</div>
+						</div>
+					</div>
+				</div>
+				<!--pdgxq-m1-left end-->
+			</div>
+			<!--sp-boxWrap end-->
+		</div>
+	</div>
+	<!--jmkt-main end-->
+</div>
+<!--i-container end-->
+
+
+<script th:inline="javascript">
+	var listCamera = [[${listCamera}]];
+</script>
+<script th:src="@{/js/jquery.min.js}"></script>
+<script th:src="@{/ajax/libs/layui/layui.js}"></script>
+<script th:src="@{/common/constant.js}"></script>
+<script th:src="@{/security/video-list.js}"></script>
+</body>
+</html>
diff --git a/fzzy-igdss-web/src/main/resources/templates/security/video-webrtc.html b/fzzy-igdss-web/src/main/resources/templates/security/video-webrtc.html
new file mode 100644
index 0000000..d1135a8
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/templates/security/video-webrtc.html
@@ -0,0 +1,210 @@
+<!DOCTYPE html>
+<html lang="zh-cn" xmlns:th=http://www.thymeleaf.org>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1, maximum-scale=1">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="renderer" content="webkit">
+    <title>瑙嗛鎾斁-Web-Rtc</title>
+
+    <link rel="stylesheet" th:href="@{/ajax/libs/layui/css/layui.css}"/>
+    <link rel="stylesheet" th:href="@{/security/video-webrtc.css}">
+    <style>
+        .layui-fluid {
+            position: relative;
+            margin: 0 auto;
+            padding: unset;
+        }
+
+        .layui-col-space20 {
+            margin: unset;
+        }
+
+        .layui-col-space20 > * {
+            padding: 10px 5px;
+        }
+
+        /** 闅愯棌鍒楄〃涓嬫媺婊氬姩鏉� **/
+        .scroll::-webkit-scrollbar {
+            display: none;
+        }
+
+        embed {
+            width: 100%;
+            height: 100%;
+        }
+
+        .layui-form-label {
+            padding: 9px 10px;
+            color: #FFFFFF;
+            font-size: 16px;
+            margin-left: 20px;
+        }
+
+        .layui-input {
+            display: unset;
+            width: 160px;
+            background: #3f474e;
+            border-style: solid;
+            border-width: 0;
+            color: #ffffff;
+        }
+
+        .layui-btn {
+            padding: 0 15px;
+            font-size: 16px;
+            margin-left: 10px;
+            margin-top: -3px;
+        }
+        .video {
+            width: 100%;
+            height: 100%;
+        }
+    </style>
+</head>
+
+<body class="pdgxq-body">
+<div class="i-container">
+    <div class="jmkt-main">
+        <div class="layui-fluid">
+            <div class="sp-boxWrap layui-row layui-col-space20">
+                <div class="layui-col-lg9 layui-col-md9">
+                    <div class="pdgxq-m1-left sp-box">
+                        <div class="sp-tab-bd">
+                            <div class="sp-showBox layui-row show">
+                                <div class="layui-col-lg12 layui-col-md12">
+                                    <div class="sp-showItem2">
+                                        <video class="video" id="video" autoplay="" muted="" playsinline="">
+                                        </video>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!--pdgxq-m1-left end-->
+                <div class="layui-col-lg3 layui-col-md3">
+                    <div class="pdgxq-m1-right sp-box">
+                        <div class="pdgxq-H">
+                            <h3>
+                                <i></i>浜戝彴鎺у埗
+                            </h3>
+                        </div>
+                        <div class="sp-cz-wrap">
+                            <div class="sp-cz-box">
+                                <ul>
+                                    <li class="sp-cz-l1">
+                                        <a href="javascript:;" onmousedown="handPTZ('LeftUp', false)"
+                                           onmouseup="handPTZ('LeftUp', true)">
+                                            <img th:src="@{/img/web/security/sp-arrow.png}"/>
+                                        </a>
+                                    </li>
+                                    <li class="sp-cz-l2">
+                                        <a href="javascript:;" onmousedown="handPTZ('Up', false)"
+                                           onmouseup="handPTZ('Up', true)">
+                                            <img th:src="@{/img/web/security/sp-arrow.png}"/>
+                                        </a>
+                                    </li>
+                                    <li class="sp-cz-l3">
+                                        <a href="javascript:;" onmousedown="handPTZ('RightUp', false)"
+                                           onmouseup="handPTZ('RightUp', true)">
+                                            <img th:src="@{/img/web/security/sp-arrow.png}"/>
+                                        </a>
+                                    </li>
+                                    <li class="sp-cz-l4">
+                                        <a href="javascript:;" onmousedown="handPTZ('Left', false)"
+                                           onmouseup="handPTZ('Left', true)">
+                                            <img th:src="@{/img/web/security/sp-arrow.png}"/>
+                                        </a>
+                                    </li>
+                                    <li class="sp-cz-l5">
+                                        <a href="javascript:;" onclick="playStop()">
+                                        </a>
+                                    </li>
+                                    <li class="sp-cz-l6">
+                                        <a href="javascript:;" onmousedown="handPTZ('Right', false)"
+                                           onmouseup="handPTZ('Right', true)">
+                                            <img th:src="@{/img/web/security/sp-arrow.png}"/>
+                                        </a>
+                                    </li>
+                                    <li class="sp-cz-l7">
+                                        <a href="javascript:;" onmousedown="handPTZ('LeftDown', false)"
+                                           onmouseup="handPTZ('LeftDown', true)">
+                                            <img th:src="@{/img/web/security/sp-arrow.png}"/>
+                                        </a>
+                                    </li>
+                                    <li class="sp-cz-l8">
+                                        <a href="javascript:;" onmousedown="handPTZ('Down', false)"
+                                           onmouseup="handPTZ('Down', true)">
+                                            <img th:src="@{/img/web/security/sp-arrow.png}"/>
+                                        </a></li>
+                                    <li class="sp-cz-l9">
+                                        <a href="javascript:;" onmousedown="handPTZ('RightDown', false)"
+                                           onmouseup="handPTZ('RightDown', true)">
+                                            <img th:src="@{/img/web/security/sp-arrow.png}"/>
+                                        </a></li>
+                                </ul>
+                            </div>
+                            <div class="sp-bianbei fl">
+                                <button type="button" class="sp-sxBtn sp-czBtn" onmousedown="handPTZ('ZoomWide', false)" onmouseup="handPTZ('ZoomWide', true)">
+                                    <i>锛�</i>
+                                </button>
+                                <span>鍙樺��</span>
+                                <button type="button" class="sp-fdBtn sp-czBtn" onmousedown="handPTZ('ZoomTele', false)" onmouseup="handPTZ('ZoomTele', true)">
+                                    <i>锛�</i>
+                                </button>
+                            </div>
+
+                            <div class="sp-bianbei fr">
+                                <input type="text" value="棰勭疆鐐�" class="preset-input">
+                                <button type="button" class="sp-fdBtn sp-czBtn fr"
+                                        onclick="handPreset()">
+                                    <i>鉃�</i>
+                                </button>
+                            </div>
+
+                        </div>
+                        <!--sp-cz-wrap end-->
+
+                        <div class="pdgxq-H">
+                            <h3>
+                                <i></i>璁惧淇℃伅
+                            </h3>
+                        </div>
+                        <div class="sp-table-box">
+                            <div class="sp-table">
+                                <ul class="sp-list">
+                                    <li><a href="javascript:void(0)">
+                                        <p>
+                                            璁惧鍚嶇О锛�<span th:text="${cameraData.name}"></span>
+                                        </p>
+                                    </a></li>
+                                    <li><a href="javascript:void(0)">
+                                        <p>
+                                            璁惧绫诲瀷锛�<span th:text="${cameraData.type=='02'?'鐞冩満':'鏋満'}"></span>
+                                        </p>
+                                    </a></li>
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!--pdgxq-m1-left end-->
+            </div>
+            <!--sp-boxWrap end-->
+        </div>
+    </div>
+    <!--jmkt-main end-->
+</div>
+<!--i-container end-->
+
+
+<script th:inline="javascript">
+    var cameraData = [[${cameraData}]];
+</script>
+<script th:src="@{/js/jquery.min.js}"></script>
+<script th:src="@{/ajax/libs/layui/layui.js}"></script>
+<script th:src="@{/security/video-webrtc.js}"></script>
+</body>
+</html>
diff --git a/fzzy-igdss-web/src/main/resources/templates/security/video.html b/fzzy-igdss-web/src/main/resources/templates/security/video.html
deleted file mode 100644
index d7ac8cf..0000000
--- a/fzzy-igdss-web/src/main/resources/templates/security/video.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>瑙嗛棰勮</title>
-</head>
-<body>
-
-</body>
-</html>
\ No newline at end of file

--
Gitblit v1.9.3