Procházet zdrojové kódy

Merge branch 'master' of http://116.63.33.55/git/dt2

ws před 3 roky
rodič
revize
9eaeb6a4f8
100 změnil soubory, kde provedl 2889 přidání a 355 odebrání
  1. 41 0
      spring-cloud/server-basic/src/main/java/com/jd/controller/ApiResourceController.java
  2. 21 7
      spring-cloud/server-basic/src/main/java/com/jd/controller/AttackTypeController.java
  3. 1 1
      spring-cloud/server-basic/src/main/java/com/jd/controller/PlanController.java
  4. 8 0
      spring-cloud/server-basic/src/main/java/com/jd/controller/ProcessController.java
  5. 10 4
      spring-cloud/server-basic/src/main/java/com/jd/controller/RiskTypeController.java
  6. 17 2
      spring-cloud/server-basic/src/main/java/com/jd/controller/SafetyInforController.java
  7. 1 1
      spring-cloud/server-basic/src/main/java/com/jd/controller/SystemAttackedController.java
  8. 14 3
      spring-cloud/server-basic/src/main/java/com/jd/controller/SystemRiskController.java
  9. 1 1
      spring-cloud/server-basic/src/main/java/com/jd/entity/AttackType.java
  10. 3 0
      spring-cloud/server-basic/src/main/java/com/jd/entity/Process.java
  11. 2 0
      spring-cloud/server-basic/src/main/java/com/jd/entity/ProcessPlan.java
  12. 1 1
      spring-cloud/server-basic/src/main/java/com/jd/entity/RiskType.java
  13. 3 3
      spring-cloud/server-basic/src/main/java/com/jd/entity/SystemAttackedInfo.java
  14. 1 1
      spring-cloud/server-basic/src/main/java/com/jd/entity/SystemRiskInfo.java
  15. 6 0
      spring-cloud/server-basic/src/main/java/com/jd/mapper/AttackTypeMapper.java
  16. 7 0
      spring-cloud/server-basic/src/main/java/com/jd/mapper/RiskTypeMapper.java
  17. 1 1
      spring-cloud/server-basic/src/main/java/com/jd/mapper/SafetyInfoMapper.java
  18. 7 1
      spring-cloud/server-basic/src/main/java/com/jd/mapper/SystemAttackedMapper.java
  19. 6 0
      spring-cloud/server-basic/src/main/java/com/jd/mapper/SystemRiskMapper.java
  20. 1 1
      spring-cloud/server-basic/src/main/java/com/jd/service/SafetyInfoService.java
  21. 365 299
      spring-cloud/server-basic/src/main/java/com/jd/service/impl/PlanServiceImpl.java
  22. 22 4
      spring-cloud/server-basic/src/main/java/com/jd/service/impl/SafetyInfoServiceImpl.java
  23. 1 1
      spring-cloud/server-basic/src/main/java/com/jd/service/impl/SystemAttackedServiceImpl.java
  24. 6 1
      spring-cloud/server-basic/src/main/resources/mapper/AttackTypeMapper.xml
  25. 9 2
      spring-cloud/server-basic/src/main/resources/mapper/PlanMapper.xml
  26. 7 2
      spring-cloud/server-basic/src/main/resources/mapper/ProcessMapper.xml
  27. 9 4
      spring-cloud/server-basic/src/main/resources/mapper/RiskTypeMapper.xml
  28. 3 3
      spring-cloud/server-basic/src/main/resources/mapper/SafetyInfoMapper.xml
  29. 13 9
      spring-cloud/server-basic/src/main/resources/mapper/SystemAttackedMapper.xml
  30. 6 3
      spring-cloud/server-basic/src/main/resources/mapper/SystemRiskMapper.xml
  31. 23 0
      spring-cloud/server-page/src/main/resources/dldp2/js/constants.js
  32. 8 0
      spring-cloud/server-page/src/main/resources/dldp2/js/flv.min.js
  33. 350 0
      spring-cloud/server-page/src/main/resources/dldp2/js/index.js
  34. 239 0
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/custom-recorder.js
  35. 17 0
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/jquery-hanzi2pinyin.simp.js
  36. 1 0
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/jquery.min.js
  37. 1 0
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/layer.js
  38. 1 0
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/mobile/layer.js
  39. 0 0
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/mobile/need/layer.css
  40. binární
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/icon-ext.png
  41. binární
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/icon.png
  42. 0 0
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/layer.css
  43. binární
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/loading-0.gif
  44. binární
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/loading-1.gif
  45. binární
      spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/loading-2.gif
  46. 63 0
      spring-cloud/server-page/src/main/resources/dldp2/js/utils.js
  47. 181 0
      spring-cloud/server-page/src/main/resources/dldp2/js/websocket.js
  48. 105 0
      spring-cloud/server-page/src/main/resources/dldp2/js/yuyinContrl.js
  49. 46 0
      spring-cloud/server-page/src/main/resources/static/dldp2/index.html
  50. 23 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/constants.js
  51. 8 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/flv.min.js
  52. 421 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/index.js
  53. 239 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/custom-recorder.js
  54. 17 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/jquery-hanzi2pinyin.simp.js
  55. 1 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/jquery.min.js
  56. 1 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/layer.js
  57. 1 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/mobile/layer.js
  58. 0 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/mobile/need/layer.css
  59. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/icon-ext.png
  60. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/icon.png
  61. 0 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/layer.css
  62. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/loading-0.gif
  63. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/loading-1.gif
  64. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/loading-2.gif
  65. 63 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/utils.js
  66. 181 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/websocket.js
  67. 128 0
      spring-cloud/server-page/src/main/resources/static/dldp2/js/yuyinContrl.js
  68. 147 0
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/inputTags.css
  69. 1 0
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/layui.css
  70. 1 0
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/layui.mobile.css
  71. 2 0
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/code.css
  72. 1 0
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/laydate/default/laydate.css
  73. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/icon-ext.png
  74. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/icon.png
  75. 1 0
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/layer.css
  76. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/loading-0.gif
  77. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/loading-1.gif
  78. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/loading-2.gif
  79. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/font/iconfont.eot
  80. 25 0
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/font/iconfont.svg
  81. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/font/iconfont.ttf
  82. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/font/iconfont.woff
  83. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/font/iconfont.woff2
  84. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/0.gif
  85. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/1.gif
  86. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/10.gif
  87. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/11.gif
  88. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/12.gif
  89. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/13.gif
  90. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/14.gif
  91. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/15.gif
  92. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/16.gif
  93. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/17.gif
  94. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/18.gif
  95. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/19.gif
  96. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/2.gif
  97. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/20.gif
  98. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/21.gif
  99. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/22.gif
  100. binární
      spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/23.gif

+ 41 - 0
spring-cloud/server-basic/src/main/java/com/jd/controller/ApiResourceController.java

@@ -0,0 +1,41 @@
+package com.jd.controller;
+
+import com.jd.code.ActionEnum;
+import com.jd.code.ConstString;
+import com.jd.code.ModelEnum;
+import com.jd.entity.basic.VoiceLog;
+import com.jd.util.Blank;
+import com.jd.util.SendUtil;
+import com.jd.util.WebLog;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author LYQ
+ * @version 1.0.0
+ * @ClassName ApiResourceController.java
+ * @Description 资源保障接口类
+ * @createTime 2022年04月06日 10:43:00
+ */
+@Controller("ApiResource")
+public class ApiResourceController {
+
+
+
+    @GetMapping("selectBasicStatus ")
+    @ApiOperation(value = "查看基本情况")
+    @WebLog(ModelEnum = ModelEnum.VOICE_LOG, ActionEnum = ActionEnum.ADD)
+    public Map<String, Object> selectBasicStatus () {
+       return null;
+    }
+
+
+
+}

+ 21 - 7
spring-cloud/server-basic/src/main/java/com/jd/controller/AttackTypeController.java

@@ -61,14 +61,19 @@ public class AttackTypeController {
 
     /**
      * 插入攻击类型
-     * @param attackType 攻击类型实体类
-     * @param request 日志回调参数
+     * @param sysAttackNum
+     * @param sysAttackType
+     * @param request
      * @return
      */
-    @GetMapping("insertAttackType")
+    @PostMapping("insertAttackType")
     @ApiOperation(value = "插入攻击类型")
     @WebLog(ModelEnum = ModelEnum.BASIC_DATA, ActionEnum = ActionEnum.ADD)
-    public Map<String, Object> insertAttackType(AttackType attackType, HttpServletRequest request) {
+    public Map<String, Object> insertAttackType(Integer sysAttackNum, String sysAttackType, Integer infoId, HttpServletRequest request) {
+        AttackType attackType = new AttackType();
+        attackType.setAttackCount(sysAttackNum);
+        attackType.setAttackType(sysAttackType);
+        attackType.setInfoId(infoId);
         // 判断参数
         if (!Blank.checkObjectParamNotNull(attackType, keys)) {
             return SendUtil.send(false, ConstString.REQUEST_WRONGPARAMS);
@@ -79,14 +84,23 @@ public class AttackTypeController {
 
     /**
      * 修改攻击类型
-     * @param attackType 攻击类型实体类
-     * @param request 日志回调参数
+     * @param sysAttackNum
+     * @param sysAttackType
+     * @param infoId
+     * @param id
+     * @param request
      * @return
      */
     @PostMapping("updateAttackType")
     @ApiOperation(value = "修改攻击类型")
     @WebLog(ModelEnum = ModelEnum.BASIC_DATA, ActionEnum = ActionEnum.UPDATE)
-    public Map<String, Object> updateAttackType(AttackType attackType, HttpServletRequest request) {
+    public Map<String, Object> updateAttackType(Integer sysAttackNum, String sysAttackType, Integer infoId, Integer id, HttpServletRequest request) {
+        //准备参数
+        AttackType attackType = new AttackType();
+        attackType.setAttackType(sysAttackType);
+        attackType.setAttackCount(sysAttackNum);
+        attackType.setInfoId(infoId);
+        attackType.setId(id);
         // 判断参数
         if (!Blank.checkObjectParamNotNull(attackType, keys)) {
             return SendUtil.send(false, ConstString.REQUEST_WRONGPARAMS);

+ 1 - 1
spring-cloud/server-basic/src/main/java/com/jd/controller/PlanController.java

@@ -227,7 +227,7 @@ public class PlanController  {
 	}
 
 	/**
-	 * 更改方案所有信息
+	 * 另存方案所有信息
 	 * @param params
 	 * @return
 	 */

+ 8 - 0
spring-cloud/server-basic/src/main/java/com/jd/controller/ProcessController.java

@@ -83,4 +83,12 @@ public class ProcessController {
         return processService.getProcessListByPage(page, limit, planId, planAreaId);
     }
 
+    @GetMapping("getProcessListByPlanId")
+    public Map<String, Object> getProcessListByPlanId(Integer planId) {
+        // 判断参数
+        if (Blank.isEmpty(planId)) {
+            return SendUtil.send(false, ConstString.REQUEST_WRONGPARAMS);
+        }
+        return SendUtil.send(true, ConstString.RESULT_SUCCESS, processService.getProcessListByPlanId(planId));
+    }
 }

+ 10 - 4
spring-cloud/server-basic/src/main/java/com/jd/controller/RiskTypeController.java

@@ -36,7 +36,7 @@ public class RiskTypeController {
     private RiskTypeService riskTypeService;
 
     //需要验重的参数
-    String[] keys = {};
+    String[] keys = {"riskType", "riskNumber"};
 
     /**
      * 分页查询攻击类型
@@ -62,14 +62,20 @@ public class RiskTypeController {
 
     /**
      * 插入漏洞类型
-     * @param riskType 漏洞类型实体类
+     * @param bugNum 漏洞个个数
+     * @param bugName 漏洞名称
      * @param request 日志回调参数
      * @return
      */
-    @GetMapping("insertRiskType")
+    @PostMapping("insertRiskType")
     @ApiOperation(value = "插入漏洞类型")
     @WebLog(ModelEnum = ModelEnum.BASIC_DATA, ActionEnum = ActionEnum.ADD)
-    public Map<String, Object> insertRiskType(RiskType riskType, HttpServletRequest request) {
+    public Map<String, Object> insertRiskType(Integer bugNum, String bugName, Integer infoId, HttpServletRequest request) {
+        //准备参数
+        RiskType riskType = new RiskType();
+        riskType.setRiskType(bugName);
+        riskType.setRiskNumber(bugNum);
+        riskType.setInfoId(infoId);
         // 判断参数
         if (!Blank.checkObjectParamNotNull(riskType, keys)) {
             return SendUtil.send(false, ConstString.REQUEST_WRONGPARAMS);

+ 17 - 2
spring-cloud/server-basic/src/main/java/com/jd/controller/SafetyInforController.java

@@ -38,7 +38,7 @@ public class SafetyInforController {
     private SafetyInfoServiceImpl safetyInfoService;
 
     //需要验重的参数
-    String[] keys = { "businessNum", "safetyEquipmentNum", "highRiskNum", "middleRiskNum", "monthAttackCount", "orgType" };
+    String[] keys = { "businessNum", "safetyEquipmentNum", "orgType" };
 
     /**
      * 分页查询安全信息
@@ -63,6 +63,18 @@ public class SafetyInforController {
     }
 
     /**
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("getSafetyInfoById")
+    @ApiOperation(value = "根据Id查询安全信息")
+    public Map<String, Object> getSafetyInfoById(Integer id) {
+        Map<String, Object> map = safetyInfoService.getSafetyInfoById(id);
+        return SendUtil.send(map);
+    }
+
+    /**
      * 插入安全信息
      * @param safetyInfo 安全信息实体类
      * @param request 日志回调函数
@@ -76,6 +88,7 @@ public class SafetyInforController {
         if (!Blank.checkObjectParamNotNull(safetyInfo, keys)) {
             return SendUtil.send(false, ConstString.REQUEST_WRONGPARAMS);
         }
+
         Map<String, Object> result = safetyInfoService.insertSafetyInfo(safetyInfo);
         return result;
     }
@@ -94,7 +107,7 @@ public class SafetyInforController {
         if (!Blank.checkObjectParamNotNull(safetyInfo, keys)) {
             return SendUtil.send(false, ConstString.REQUEST_WRONGPARAMS);
         }
-        Map<String, Object> result = safetyInfoService.insertSafetyInfo(safetyInfo);
+        Map<String, Object> result = safetyInfoService.updateSafetyInfo(safetyInfo);
         return result;
     }
 
@@ -119,4 +132,6 @@ public class SafetyInforController {
 
 
 
+
+
 }

+ 1 - 1
spring-cloud/server-basic/src/main/java/com/jd/controller/SystemAttackedController.java

@@ -65,7 +65,7 @@ public class SystemAttackedController {
      * @param request
      * @return
      */
-    @GetMapping("insertSystemAttacked")
+    @PostMapping("insertSystemAttacked")
     @ApiOperation(value = "插入系统攻击信息")
     @WebLog(ModelEnum = ModelEnum.BASIC_DATA, ActionEnum = ActionEnum.ADD)
     public Map<String, Object> insertSystemAttacked(SystemAttackedInfo systemAttackedInfo, HttpServletRequest request) {

+ 14 - 3
spring-cloud/server-basic/src/main/java/com/jd/controller/SystemRiskController.java

@@ -59,14 +59,25 @@ public class SystemRiskController {
 
     /**
      * 插入系统漏洞信息
-     * @param systemRiskInfo
+     * @param sysName
+     * @param highBug
+     * @param middleBug
+     * @param status
+     * @param infoId
      * @param request
      * @return
      */
-    @GetMapping("insertSystemRisk")
+    @PostMapping("insertSystemRisk")
     @ApiOperation(value = "插入系统漏洞信息")
     @WebLog(ModelEnum = ModelEnum.BASIC_DATA, ActionEnum = ActionEnum.ADD)
-    public Map<String, Object> insertSystemRisk(SystemRiskInfo systemRiskInfo, HttpServletRequest request) {
+    public Map<String, Object> insertSystemRisk(String sysName, Integer highBug, Integer middleBug, String status, Integer infoId, HttpServletRequest request) {
+        // 准备参数
+        SystemRiskInfo systemRiskInfo = new SystemRiskInfo();
+        systemRiskInfo.setSystemName(sysName);
+        systemRiskInfo.setHighRiskNumber(highBug);
+        systemRiskInfo.setMiddleRiskNumber(middleBug);
+        systemRiskInfo.setSafetyStatus(status);
+        systemRiskInfo.setInfoId(infoId);
         // 判断参数
         if (!Blank.checkObjectParamNotNull(systemRiskInfo, keys)) {
             return SendUtil.send(false, ConstString.REQUEST_WRONGPARAMS);

+ 1 - 1
spring-cloud/server-basic/src/main/java/com/jd/entity/AttackType.java

@@ -18,7 +18,7 @@ import java.util.Date;
  * @createTime 2022年03月23日 17:06:00
  */
 @Data
-@ApiModel("安全信息")
+@ApiModel("攻击类型")
 @Accessors(chain = true)//开启链式操作
 public class AttackType implements Serializable {
     private static final long serialVersionUID = 1L;

+ 3 - 0
spring-cloud/server-basic/src/main/java/com/jd/entity/Process.java

@@ -1,6 +1,7 @@
 package com.jd.entity;
 
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -11,11 +12,13 @@ import java.util.Date;
  * @description:流程控制实体类
  */
 @Data
+@Accessors(chain = true)
 public class Process implements Serializable {
     private static final long serialVersionUID = -2729873474995830627L;
     private Integer id;
     private Integer planId;
     private String processName;
+    private String processImage;
     private Integer sort;
     private Integer intervalTime;
     private String url;

+ 2 - 0
spring-cloud/server-basic/src/main/java/com/jd/entity/ProcessPlan.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -16,6 +17,7 @@ import java.util.Date;
  */
 @Data
 @TableName("t_process_plan")
+@Accessors(chain = true)
 public class ProcessPlan implements Serializable {
     private static final long serialVersionUID = -3312427847687565754L;
 

+ 1 - 1
spring-cloud/server-basic/src/main/java/com/jd/entity/RiskType.java

@@ -18,7 +18,7 @@ import java.util.Date;
  * @createTime 2022年03月23日 16:30:00
  */
 @Data
-@ApiModel("安全信息")
+@ApiModel("漏洞类型")
 @Accessors(chain = true)//开启链式操作
 public class RiskType implements Serializable {
     private static final long serialVersionUID = 1L;

+ 3 - 3
spring-cloud/server-basic/src/main/java/com/jd/entity/SystemAttackedInfo.java

@@ -7,7 +7,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
-import java.util.Date;
+import java.sql.Date;
 
 /**
  * @author LYQ
@@ -17,7 +17,7 @@ import java.util.Date;
  * @createTime 2022年03月23日 17:15:00
  */
 @Data
-@ApiModel("安全信息")
+@ApiModel("系统攻击信息")
 @Accessors(chain = true)//开启链式操作
 public class SystemAttackedInfo {
     private static final long serialVersionUID = 1L;
@@ -35,7 +35,7 @@ public class SystemAttackedInfo {
     private String seriousLevel;
 
     @ApiModelProperty("检测时间")
-    private Date detectionTime;
+    private String detectionTime;
 
     @ApiModelProperty("攻击次数")
     private Integer attackNum;

+ 1 - 1
spring-cloud/server-basic/src/main/java/com/jd/entity/SystemRiskInfo.java

@@ -18,7 +18,7 @@ import java.util.Date;
  * @createTime 2022年03月23日 16:40:00
  */
 @Data
-@ApiModel("安全信息")
+@ApiModel("系统漏洞信息")
 @Accessors(chain = true)//开启链式操作
 public class SystemRiskInfo implements Serializable {
     private static final long serialVersionUID = 1L;

+ 6 - 0
spring-cloud/server-basic/src/main/java/com/jd/mapper/AttackTypeMapper.java

@@ -57,4 +57,10 @@ public interface AttackTypeMapper {
      * @return
      */
     Boolean deleteAttackType(Integer attackId);
+
+    /**
+     * 删除攻击类型
+     * @return
+     */
+    Boolean deleteAttackTypeByInfo(Integer infoId);
 }

+ 7 - 0
spring-cloud/server-basic/src/main/java/com/jd/mapper/RiskTypeMapper.java

@@ -54,4 +54,11 @@ public interface RiskTypeMapper {
      * @return
      */
     Boolean deleteRiskType(Integer riskId);
+
+    /**
+     *
+     * @param infoId
+     * @return
+     */
+    Boolean deleteRiskTypeByInfo(Integer infoId);
 }

+ 1 - 1
spring-cloud/server-basic/src/main/java/com/jd/mapper/SafetyInfoMapper.java

@@ -32,7 +32,7 @@ public interface SafetyInfoMapper {
      * 获取单条安全信息
      * @return
      */
-    Map<String, Object> getSafetyInfoById(Map<String, Object> param);
+    Map<String, Object> getSafetyInfoById(Integer id);
 
     /**
      * 新增安全数据

+ 7 - 1
spring-cloud/server-basic/src/main/java/com/jd/mapper/SystemAttackedMapper.java

@@ -57,5 +57,11 @@ public interface SystemAttackedMapper {
      * 删除系统攻击数据
      * @return
      */
-    Boolean deleteSystemAttackedInfoo(Integer systemAttackId);
+    Boolean deleteSystemAttackedInfo(Integer systemAttackId);
+
+   /**
+    * 删除系统攻击数据
+    * @return
+    */
+    Boolean deleteSystemAttackedInfoByInfo(Integer systemAttackId);
 }

+ 6 - 0
spring-cloud/server-basic/src/main/java/com/jd/mapper/SystemRiskMapper.java

@@ -48,4 +48,10 @@ public interface SystemRiskMapper {
      * @return
      */
     Boolean deleteSystemRiskInfo(Integer systemRiskId);
+
+    /**
+     * 删除系统漏洞数据
+     * @return
+     */
+    Boolean deleteSystemRiskInfoByInfo(Integer infoId);
 }

+ 1 - 1
spring-cloud/server-basic/src/main/java/com/jd/service/SafetyInfoService.java

@@ -23,7 +23,7 @@ public interface SafetyInfoService {
      * 获取单条安全信息
      * @return
      */
-    Map<String, Object> getSafetyInfoById(Map<String, Object> param);
+    Map<String, Object> getSafetyInfoById(Integer id);
 
     /**
      * 新增安全数据

+ 365 - 299
spring-cloud/server-basic/src/main/java/com/jd/service/impl/PlanServiceImpl.java

@@ -3,6 +3,8 @@ package com.jd.service.impl;
 import cn.hutool.core.convert.Convert;
 import com.alibaba.fastjson.JSONObject;
 import com.jd.code.ConstString;
+import com.jd.entity.Process;
+import com.jd.entity.ProcessPlan;
 import com.jd.entity.SignalSource;
 import com.jd.entity.basic.Caption;
 import com.jd.entity.basic.Plan;
@@ -22,349 +24,413 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * 方案实现类
- *
- * @author leihy
- */
+* 方案实现类
+*
+* @author leihy
+*/
 @Service("planServiceImpl")
 public class PlanServiceImpl implements PlanService {
 
-    @Resource
-    private PlanMapper planMapper;
-    @Resource
-    private PlanAreaMapper planAreaMapper;
-    @Resource
-    private SignalSourceMapper signalSourceMapper;
-    @Resource
-    private CaptionMapper captionMapper;
-    @Resource
-    private RoleMapper roleMapper;
-    @Resource
-    private ProcessMapper processMapper;
+@Resource
+private PlanMapper planMapper;
+@Resource
+private PlanAreaMapper planAreaMapper;
+@Resource
+private SignalSourceMapper signalSourceMapper;
+@Resource
+private CaptionMapper captionMapper;
+@Resource
+private RoleMapper roleMapper;
+@Resource
+private ProcessMapper processMapper;
+@Resource
+private ProcessPlanMapper processPlanMapper;
 
-    @Override
-    public Map<String, Object> getPlanListByPage(Map<String, Object> param) {
-        // 获取数量
-        Integer count = planMapper.getCountPlan(param);
-        if (Blank.isEmpty(count) || count <= 0) {
-            return SendUtil.layuiTable(0, null);
-        }
-        //分页查询所有方案
-        List<Map<String, Object>> list = planMapper.getPlanListByPage(param);
-        return SendUtil.layuiTable(count, list);
+@Override
+public Map<String, Object> getPlanListByPage(Map<String, Object> param) {
+    // 获取数量
+    Integer count = planMapper.getCountPlan(param);
+    if (Blank.isEmpty(count) || count <= 0) {
+        return SendUtil.layuiTable(0, null);
     }
+    //分页查询所有方案
+    List<Map<String, Object>> list = planMapper.getPlanListByPage(param);
+    return SendUtil.layuiTable(count, list);
+}
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> savePlan(Plan plan) {
-        //判断是否是默认方案
-        if (plan.getDefaultPlan() != null && plan.getDefaultPlan() == 1) {
-            planMapper.clearDefaultPlan();
-        }
-        // 验证编号是否重复
-        Integer count = planMapper.repeatedVerificationById(plan);
-        if (count > 0) {
-            return SendUtil.send(false, ConstString.RESULT_EXIST);
-        }
-        boolean result = planMapper.savePlan(plan);
-        return SendUtil.send(result);
+@Override
+@Transactional(rollbackFor = Exception.class)
+public Map<String, Object> savePlan(Plan plan) {
+    //判断是否是默认方案
+    if (plan.getDefaultPlan() != null && plan.getDefaultPlan() == 1) {
+        planMapper.clearDefaultPlan();
     }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> updatePlan(Plan plan) {
-        //判断是否是默认方案
-        if (plan.getDefaultPlan() != null && plan.getDefaultPlan() == 1) {
-            planMapper.clearDefaultPlan();
-        }
-        // 验证编号是否重复
-        Integer count = planMapper.repeatedVerificationById(plan);
-        if (count > 0) {
-            return SendUtil.send(false, ConstString.RESULT_EXIST);
-        }
-        boolean result = planMapper.updatePlan(plan);
-        return SendUtil.send(result);
+    // 验证编号是否重复
+    Integer count = planMapper.repeatedVerificationById(plan);
+    if (count > 0) {
+        return SendUtil.send(false, ConstString.RESULT_EXIST);
     }
+    boolean result = planMapper.savePlan(plan);
+    return SendUtil.send(result);
+}
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> deletePlan(Integer id) {
-        // 获取方案下绑定的方案区域
-        List<Map<String, Object>> planAreaList = planAreaMapper.getPlanAreaListByPlan(id, null);
-        // 获取方案下绑定的解说词
-        List<Map<String, Object>> captionList = planAreaMapper.getCaptionByPlanId(id);
-        if (planAreaList.size() > 0 || captionList.size() > 0) {
-            return SendUtil.send(false, ConstString.RESULT_EXIST);
-        }
-        boolean result = planMapper.deletePlan(id);
-        //
-        roleMapper.deleteRolePlanByPlanId(id);
-        return SendUtil.send(result);
+@Override
+@Transactional(rollbackFor = Exception.class)
+public Map<String, Object> updatePlan(Plan plan) {
+    //判断是否是默认方案
+    if (plan.getDefaultPlan() != null && plan.getDefaultPlan() == 1) {
+        planMapper.clearDefaultPlan();
     }
-
-    @Override
-    public Map<String, Object> getOnePlanById(Integer id) {
-        return planMapper.getOnePlanById(id);
+    // 验证编号是否重复
+    Integer count = planMapper.repeatedVerificationById(plan);
+    if (count > 0) {
+        return SendUtil.send(false, ConstString.RESULT_EXIST);
     }
+    boolean result = planMapper.updatePlan(plan);
+    return SendUtil.send(result);
+}
 
-    @Override
-    public Map<String, Object> getOnePlanByCode(String planCode) {
-        return planMapper.getOnePlanByCode(planCode);
+@Override
+@Transactional(rollbackFor = Exception.class)
+public Map<String, Object> deletePlan(Integer id) {
+    // 获取方案下绑定的方案区域
+    List<Map<String, Object>> planAreaList = planAreaMapper.getPlanAreaListByPlan(id, null);
+    // 获取方案下绑定的解说词
+    List<Map<String, Object>> captionList = planAreaMapper.getCaptionByPlanId(id);
+    if (planAreaList.size() > 0 || captionList.size() > 0) {
+        return SendUtil.send(false, ConstString.RESULT_EXIST);
     }
+    boolean result = planMapper.deletePlan(id);
+    //
+    roleMapper.deleteRolePlanByPlanId(id);
+    return SendUtil.send(result);
+}
 
-    /**
-     * 查询所有方案列表树
-     *
-     * @return
-     */
-    @Override
-    public List<Map<String, Object>> getPlanTreeList() {
-        return planMapper.getPlanTreeList();
-    }
+@Override
+public Map<String, Object> getOnePlanById(Integer id) {
+    return planMapper.getOnePlanById(id);
+}
 
-    @Override
-    public List<Map<String, Object>> getAllPlan() {
-        return planMapper.getAllPlan();
-    }
+@Override
+public Map<String, Object> getOnePlanByCode(String planCode) {
+    return planMapper.getOnePlanByCode(planCode);
+}
+
+/**
+ * 查询所有方案列表树
+ *
+ * @return
+ */
+@Override
+public List<Map<String, Object>> getPlanTreeList() {
+    return planMapper.getPlanTreeList();
+}
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> savePlanAllInfo(Integer roleId, String planName, String params) {
-        // 创建新方案
-        Plan plan = new Plan();
-        int number = planMapper.getAllPlan().size() + 1;
-        plan.setPlanName(planName).setDefaultPlan(0).setPlanCode(Convert.toStr(number));
-        // TODO 设置方案编号
-        planMapper.savePlan(plan);
-        Integer planId = plan.getId();
-        // 绑定角色方案关系 并创建
-        Map<String, Object> rolePlan = new HashMap<>();
-        rolePlan.put("roleId", roleId);
-        rolePlan.put("planId", planId);
-        roleMapper.insertRolePlan(rolePlan);
-        // 创建方案区域信息
-        JSONObject jsonObject = JSONObject.parseObject(params);
-        List<Map<String, Object>> planAreaList = (List<Map<String, Object>>) jsonObject.get("planAreaList");
-        List<Map<String, Object>> captionList = (List<Map<String, Object>>) jsonObject.get("captionList");
-        if (Blank.isNotEmpty(planAreaList)) {
-            for (Map<String, Object> planAreaInfo : planAreaList) {
-                // 新增方案区域信息
-                PlanArea planArea = new PlanArea();
-                planArea.setPlanId(Convert.toStr(planId))
-                        .setProcessPlanId(Convert.toStr(planAreaInfo.get("process_plan_id")))
-                        .setAreaName(Convert.toStr(planAreaInfo.get("area_name")))
-                        .setAreaCode(Convert.toStr(planAreaInfo.get("area_code")))
-                        .setUrl(Convert.toStr(planAreaInfo.get("url")))
-                        .setYkUrl(Convert.toStr(planAreaInfo.get("yk_url")))
-                        .setSortno(Convert.toInt(planAreaInfo.get("sortno")))
-                        .setSignalSource(Convert.toStr(planAreaInfo.get("signal_source")))
-                        .setDeviceButtons(Convert.toStr(planAreaInfo.get("device_buttons")));
-                planAreaMapper.insertPlanArea(planArea);
+@Override
+public List<Map<String, Object>> getAllPlan() {
+    return planMapper.getAllPlan();
+}
+
+@Override
+@Transactional(rollbackFor = Exception.class)
+public Map<String, Object> savePlanAllInfo(Integer roleId, String planName, String params) {
+    // 创建新方案
+    Plan plan = new Plan();
+    int number = planMapper.getAllPlan().size() + 1;
+    plan.setPlanName(planName).setDefaultPlan(0).setSortno(number).setPlanCode(Convert.toStr(System.currentTimeMillis()));
+    planMapper.savePlan(plan);
+    Integer planId = plan.getId();
+    // 绑定角色方案关系 并创建
+    Map<String, Object> rolePlan = new HashMap<>();
+    rolePlan.put("roleId", roleId);
+    rolePlan.put("planId", planId);
+    roleMapper.insertRolePlan(rolePlan);
+
+    // 创建方案区域信息
+    JSONObject jsonObject = JSONObject.parseObject(params);
+    List<Map<String, Object>> planAreaList = (List<Map<String, Object>>) jsonObject.get("planAreaList");
+    List<Map<String, Object>> captionList = (List<Map<String, Object>>) jsonObject.get("captionList");
+    if (Blank.isNotEmpty(planAreaList)) {
+        Integer processPlanId;
+        int i = 0;
+        List list = new ArrayList();
+        List processIdList = new ArrayList();
+        List<Map<String, Integer>> idList = new ArrayList();
+        for (Map<String, Object> planAreaInfo : planAreaList) {
+            processPlanId = Convert.toInt(planAreaInfo.get("process_plan_id"));
+            if (Blank.isNotEmpty(processPlanId)) {
+                // 循环第一次 或者 流程方案id没重复 才新增流程控制方案
+                if (i == 0 || !list.contains(processPlanId)) {
+                    Map<String, Integer> map = new HashMap<>();
+                    ProcessPlan processPlanInfo = processPlanMapper.selectById(processPlanId);
+                    // 新增流程控制方案
+                    ProcessPlan processPlan = new ProcessPlan();
+                    String timeC = Convert.toStr(System.currentTimeMillis());
+                    processPlan.setPlanName(processPlanInfo.getPlanName())
+                            .setPlanCode(processPlanInfo.getPlanCode()+timeC);
+                    processPlanMapper.insert(processPlan);
+                    list.add(processPlanId);
+                    map.put("oldId", processPlanId);
+                    processPlanId = processPlan.getId();
+                    map.put("newId", processPlanId);
+                    idList.add(map);
+                } else {
+                    for (Map<String, Integer> idMap : idList) {
+                        if (processPlanId.equals(idMap.get("oldId"))) {
+                            processPlanId = idMap.get("newId");
+                        }
+                    }
+                }
+            }else {
+                processPlanId = null;
             }
-        }
-        // 获取解说词 更改解说词表
-        if (Blank.isNotEmpty(captionList)) {
-            for (Map<String, Object> captionInfo : captionList) {
-                //解说词id
-                Caption caption = new Caption();
-                caption.setPlanId(Convert.toInt(planId))
-                        .setHeaderInfo(Convert.toStr(captionInfo.get("header_info")))
-                        .setLargeScreen(Convert.toStr(captionInfo.get("large_screen")))
-                        .setPropagandaWall(Convert.toStr(captionInfo.get("propaganda_wall")))
-                        .setArcScreen(Convert.toStr(captionInfo.get("arc_screen")))
-                        .setLobbyArea(Convert.toStr(captionInfo.get("lobby_area")))
-                        .setEndInfo(Convert.toStr(captionInfo.get("end_info")));
-                captionMapper.insertCaption(caption);
+            // 新增方案区域信息
+            PlanArea planArea = new PlanArea();
+            planArea.setPlanId(Convert.toStr(planId))
+                    .setProcessPlanId(Convert.toStr(processPlanId))
+                    .setAreaName(Convert.toStr(planAreaInfo.get("area_name")))
+                    .setAreaCode(Convert.toStr(planAreaInfo.get("area_code")))
+                    .setUrl(Convert.toStr(planAreaInfo.get("url")))
+                    .setYkUrl(Convert.toStr(planAreaInfo.get("yk_url")))
+                    .setSortno(Convert.toInt(planAreaInfo.get("sortno")))
+                    .setSignalSource(Convert.toStr(planAreaInfo.get("signal_source")))
+                    .setDeviceButtons(Convert.toStr(planAreaInfo.get("device_buttons")));
+            planAreaMapper.insertPlanArea(planArea);
+            // 新增流程控制
+            List<Map<String, Object>> processList = (List<Map<String, Object>>) planAreaInfo.get("processList");
+            if (Blank.isNotEmpty(processList)) {
+                for (Map<String, Object> processInfo : processList) {
+                    // 判断去重
+                    if (!processIdList.contains(Convert.toInt(processInfo.get("id")))) {
+                        Process process = new Process();
+                        process.setPlanId(processPlanId)
+                                .setProcessName(Convert.toStr(processInfo.get("process_name")))
+                                .setProcessImage(Convert.toStr(processInfo.get("process_image")))
+                                .setSort(Convert.toInt(processInfo.get("sort")))
+                                .setIntervalTime(Convert.toInt(processInfo.get("interval_time")))
+                                .setUrl(Convert.toStr(processInfo.get("url")))
+                                .setCaption(Convert.toStr(processInfo.get("caption")));
+                        processMapper.addProcessInfo(process);
+                        processIdList.add(Convert.toInt(processInfo.get("id")));
+                    }
+                }
             }
+            i ++ ;
+        }
+    }
+    // 获取解说词 更改解说词表
+    if (Blank.isNotEmpty(captionList)) {
+        for (Map<String, Object> captionInfo : captionList) {
+            //解说词id
+            Caption caption = new Caption();
+            caption.setPlanId(Convert.toInt(planId))
+                    .setHeaderInfo(Convert.toStr(captionInfo.get("header_info")))
+                    .setLargeScreen(Convert.toStr(captionInfo.get("large_screen")))
+                    .setPropagandaWall(Convert.toStr(captionInfo.get("propaganda_wall")))
+                    .setArcScreen(Convert.toStr(captionInfo.get("arc_screen")))
+                    .setLobbyArea(Convert.toStr(captionInfo.get("lobby_area")))
+                    .setEndInfo(Convert.toStr(captionInfo.get("end_info")));
+            captionMapper.insertCaption(caption);
         }
-        return SendUtil.send(true, ConstString.RESULT_SUCCESS);
     }
+    return SendUtil.send(true, ConstString.RESULT_SUCCESS);
+}
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Map<String, Object> updatePlanAllInfo(String params) {
-        JSONObject jsonObject = JSONObject.parseObject(params);
-        List<Map<String, Object>> planAreaList = (List<Map<String, Object>>) jsonObject.get("planAreaList");
-        List<Map<String, Object>> captionList = (List<Map<String, Object>>) jsonObject.get("captionList");
-        if (Blank.isNotEmpty(planAreaList)) {
-            for (Map<String, Object> planAreaInfo : planAreaList) {
-                //方案区域id
-                Integer planAreaId = Convert.toInt(planAreaInfo.get("id"));
-                // 根据方案区域id修改方案区域信息 更改方案区域信息
-                PlanArea planArea = new PlanArea();
-                planArea.setId(planAreaId).setAreaName(Convert.toStr(planAreaInfo.get("area_name")))
-                        .setProcessPlanId(Convert.toStr(planAreaInfo.get("process_plan_id")))
-                        .setAreaCode(Convert.toStr(planAreaInfo.get("area_code")))
-                        .setUrl(Convert.toStr(planAreaInfo.get("url")))
-                        .setYkUrl(Convert.toStr(planAreaInfo.get("yk_url")))
-                        .setSortno(Convert.toInt(planAreaInfo.get("sortno")))
-                        .setSignalSource(Convert.toStr(planAreaInfo.get("signal_source")))
-                        .setDeviceButtons(Convert.toStr(planAreaInfo.get("device_buttons")));
-                planAreaMapper.updatePlanArea(planArea);
-                // 获取信号源列表 更改信号源
-                List<Map<String, Object>> signalSourceList = (List<Map<String, Object>>) planAreaInfo.get("signalSourceList");
-                if (Blank.isNotEmpty(signalSourceList)) {
-                    for (Map<String, Object> signalSourceInfo : signalSourceList) {
-                        //信号源id
-                        Integer signalSourceId = Convert.toInt(signalSourceInfo.get("id"));
-                        SignalSource signalSource = new SignalSource();
-                        signalSource.setId(signalSourceId)
-                                .setSignalSourceName(Convert.toStr(signalSourceInfo.get("signal_source_name")))
-                                .setSignalSourceValue(Convert.toStr(signalSourceInfo.get("signal_source_value")))
-                                .setSignalSourceImage(Convert.toStr(signalSourceInfo.get("signal_source_image")));
-                        signalSourceMapper.updateSignalSource(signalSource);
-                    }
+@Override
+@Transactional(rollbackFor = Exception.class)
+public Map<String, Object> updatePlanAllInfo(String params) {
+    JSONObject jsonObject = JSONObject.parseObject(params);
+    List<Map<String, Object>> planAreaList = (List<Map<String, Object>>) jsonObject.get("planAreaList");
+    List<Map<String, Object>> captionList = (List<Map<String, Object>>) jsonObject.get("captionList");
+    if (Blank.isNotEmpty(planAreaList)) {
+        for (Map<String, Object> planAreaInfo : planAreaList) {
+            //方案区域id
+            Integer planAreaId = Convert.toInt(planAreaInfo.get("id"));
+            // 根据方案区域id修改方案区域信息 更改方案区域信息
+            PlanArea planArea = new PlanArea();
+            planArea.setId(planAreaId).setAreaName(Convert.toStr(planAreaInfo.get("area_name")))
+                    .setProcessPlanId(Convert.toStr(planAreaInfo.get("process_plan_id")))
+                    .setAreaCode(Convert.toStr(planAreaInfo.get("area_code")))
+                    .setUrl(Convert.toStr(planAreaInfo.get("url")))
+                    .setYkUrl(Convert.toStr(planAreaInfo.get("yk_url")))
+                    .setSortno(Convert.toInt(planAreaInfo.get("sortno")))
+                    .setSignalSource(Convert.toStr(planAreaInfo.get("signal_source")))
+                    .setDeviceButtons(Convert.toStr(planAreaInfo.get("device_buttons")));
+            planAreaMapper.updatePlanArea(planArea);
+            // 获取信号源列表 更改信号源
+            List<Map<String, Object>> signalSourceList = (List<Map<String, Object>>) planAreaInfo.get("signalSourceList");
+            if (Blank.isNotEmpty(signalSourceList)) {
+                for (Map<String, Object> signalSourceInfo : signalSourceList) {
+                    //信号源id
+                    Integer signalSourceId = Convert.toInt(signalSourceInfo.get("id"));
+                    SignalSource signalSource = new SignalSource();
+                    signalSource.setId(signalSourceId)
+                            .setSignalSourceName(Convert.toStr(signalSourceInfo.get("signal_source_name")))
+                            .setSignalSourceValue(Convert.toStr(signalSourceInfo.get("signal_source_value")))
+                            .setSignalSourceImage(Convert.toStr(signalSourceInfo.get("signal_source_image")));
+                    signalSourceMapper.updateSignalSource(signalSource);
                 }
             }
-        }
-        // 获取解说词 更改解说词表
-        if (Blank.isNotEmpty(captionList)) {
-            for (Map<String, Object> captionInfo : captionList) {
-                //解说词id
-                Integer captionId = Convert.toInt(captionInfo.get("id"));
-                Caption caption = new Caption();
-                caption.setId(captionId)
-                        .setPlanId(Convert.toInt(captionInfo.get("plan_id")))
-                        .setHeaderInfo(Convert.toStr(captionInfo.get("header_info")))
-                        .setLargeScreen(Convert.toStr(captionInfo.get("large_screen")))
-                        .setPropagandaWall(Convert.toStr(captionInfo.get("propaganda_wall")))
-                        .setArcScreen(Convert.toStr(captionInfo.get("arc_screen")))
-                        .setLobbyArea(Convert.toStr(captionInfo.get("lobby_area")))
-                        .setEndInfo(Convert.toStr(captionInfo.get("end_info")));
-                captionMapper.updateCaption(caption);
+            // 获取流程控制列表,更改流程控制顺序
+            List<Map<String, Object>> processList = (List<Map<String, Object>>) planAreaInfo.get("processList");
+            if (Blank.isNotEmpty(processList)) {
+                for (Map<String, Object> processInfo : processList) {
+                    Integer processId = Convert.toInt(processInfo.get("id"));
+                    Process process = new Process();
+                    process.setId(processId).setSort(Convert.toInt(processInfo.get("sort")));
+                    processMapper.editProcess(process);
+                }
             }
         }
-        return SendUtil.send(true, ConstString.RESULT_SUCCESS);
     }
+    // 获取解说词 更改解说词表
+    if (Blank.isNotEmpty(captionList)) {
+        for (Map<String, Object> captionInfo : captionList) {
+            //解说词id
+            Integer captionId = Convert.toInt(captionInfo.get("id"));
+            Caption caption = new Caption();
+            caption.setId(captionId)
+                    .setPlanId(Convert.toInt(captionInfo.get("plan_id")))
+                    .setHeaderInfo(Convert.toStr(captionInfo.get("header_info")))
+                    .setLargeScreen(Convert.toStr(captionInfo.get("large_screen")))
+                    .setPropagandaWall(Convert.toStr(captionInfo.get("propaganda_wall")))
+                    .setArcScreen(Convert.toStr(captionInfo.get("arc_screen")))
+                    .setLobbyArea(Convert.toStr(captionInfo.get("lobby_area")))
+                    .setEndInfo(Convert.toStr(captionInfo.get("end_info")));
+            captionMapper.updateCaption(caption);
+        }
+    }
+    return SendUtil.send(true, ConstString.RESULT_SUCCESS);
+}
 
-    @Override
-    public Map<String, Object> getDefaultPlanAreaByRoleId(Integer roleId) {
-        //根据角色id获取方案列表
-        List<Map<String, Object>> plansByRoleId = planMapper.getPlanByRoleId(roleId);
-        if (Blank.isNotEmpty(plansByRoleId)) {
-            Map<String, Object> dataMap = new HashMap<>();
-            Map<String, Object> defaultPlan = planMapper.getDefaultPlan();
-            Integer planId = Convert.toInt(defaultPlan.get("id"));
-            if (Blank.isNotEmpty(defaultPlan)) {
-                for (Map<String, Object> map : plansByRoleId) {
-                    if (planId.equals(Convert.toInt(map.get("plan_id")))) {
-                        // 根据方案id获取方案区域列表
-                        List<Map<String, Object>> planAreaList = planMapper.getPlanAreaByPlanId(planId);
-                        // 根据方案id获取解说词列表
-                        List<Map<String, Object>> captionList = planMapper.getCaptionByPlanId(planId);
-                        // 获取信号源
-                        if (Blank.isNotEmpty(planAreaList)) {
-                            for (Map<String, Object> planArea : planAreaList) {
-                                // 信号源id字符串
-                                String signalIds = Convert.toStr(planArea.get("signal_source"));
-                                // 设备按钮
-                                String deviceButtons = Convert.toStr(planArea.get("device_buttons"));
-                                // 流程方案id
-                                Integer processPlanId = Convert.toInt(planArea.get("process_plan_id"));
-                                List<Map<String, Object>> signalSourceList = new ArrayList<>();
-                                List<Map<String, Object>> deviceButtonList = new ArrayList<>();
-                                if (Blank.isNotEmpty(signalIds)) {
-                                    String[] ids = signalIds.split(",");
-                                    for (String signalId : ids) {
-                                        //根据信号id获取信号源信息
-                                        Map<String, Object> signalInfo = signalSourceMapper.getSignalInfoById(signalId);
-                                        signalSourceList.add(signalInfo);
-                                    }
-                                }
-                                // 获取设备按钮
-                                if (Blank.isNotEmpty(deviceButtons)) {
-                                    String[] devices = deviceButtons.split(",");
-                                    for (String deviceId : devices) {
-                                        //根据设备id获取设备信息
-                                        Map<String, Object> deviceInfo = planMapper.getDeviceInfoById(deviceId);
-                                        deviceButtonList.add(deviceInfo);
-                                    }
+@Override
+public Map<String, Object> getDefaultPlanAreaByRoleId(Integer roleId) {
+    //根据角色id获取方案列表
+    List<Map<String, Object>> plansByRoleId = planMapper.getPlanByRoleId(roleId);
+    if (Blank.isNotEmpty(plansByRoleId)) {
+        Map<String, Object> dataMap = new HashMap<>();
+        Map<String, Object> defaultPlan = planMapper.getDefaultPlan();
+        Integer planId = Convert.toInt(defaultPlan.get("id"));
+        if (Blank.isNotEmpty(defaultPlan)) {
+            for (Map<String, Object> map : plansByRoleId) {
+                if (planId.equals(Convert.toInt(map.get("plan_id")))) {
+                    // 根据方案id获取方案区域列表
+                    List<Map<String, Object>> planAreaList = planMapper.getPlanAreaByPlanId(planId);
+                    // 根据方案id获取解说词列表
+                    List<Map<String, Object>> captionList = planMapper.getCaptionByPlanId(planId);
+                    // 获取信号源
+                    if (Blank.isNotEmpty(planAreaList)) {
+                        for (Map<String, Object> planArea : planAreaList) {
+                            // 信号源id字符串
+                            String signalIds = Convert.toStr(planArea.get("signal_source"));
+                            // 设备按钮
+                            String deviceButtons = Convert.toStr(planArea.get("device_buttons"));
+                            // 流程方案id
+                            Integer processPlanId = Convert.toInt(planArea.get("process_plan_id"));
+                            List<Map<String, Object>> signalSourceList = new ArrayList<>();
+                            List<Map<String, Object>> deviceButtonList = new ArrayList<>();
+                            if (Blank.isNotEmpty(signalIds)) {
+                                String[] ids = signalIds.split(",");
+                                for (String signalId : ids) {
+                                    //根据信号id获取信号源信息
+                                    Map<String, Object> signalInfo = signalSourceMapper.getSignalInfoById(signalId);
+                                    signalSourceList.add(signalInfo);
                                 }
-                                // 获取场景方案下的所有流程控制
-                                if (Blank.isNotEmpty(processPlanId)) {
-                                    List<Map<String, Object>> processList = processMapper.getProcessListByPlanId(processPlanId);
-                                    planArea.put("processList", processList);
+                            }
+                            // 获取设备按钮
+                            if (Blank.isNotEmpty(deviceButtons)) {
+                                String[] devices = deviceButtons.split(",");
+                                for (String deviceId : devices) {
+                                    //根据设备id获取设备信息
+                                    Map<String, Object> deviceInfo = planMapper.getDeviceInfoById(deviceId);
+                                    deviceButtonList.add(deviceInfo);
                                 }
-                                planArea.put("signalSourceList", signalSourceList);
-                                planArea.put("deviceButtonList", deviceButtonList);
                             }
+                            // 获取场景方案下的所有流程控制
+                            if (Blank.isNotEmpty(processPlanId)) {
+                                List<Map<String, Object>> processList = processMapper.getProcessListByPlanId(processPlanId);
+                                planArea.put("processList", processList);
+                            }
+                            planArea.put("signalSourceList", signalSourceList);
+                            planArea.put("deviceButtonList", deviceButtonList);
                         }
-                        dataMap.put("planAreaList", planAreaList);
-                        dataMap.put("captionList", captionList);
-                        return dataMap;
                     }
+                    dataMap.put("planAreaList", planAreaList);
+                    dataMap.put("captionList", captionList);
+                    return dataMap;
                 }
             }
         }
-        return null;
     }
+    return null;
+}
 
-    @Override
-    public Map<String, Object> getPlanAreaByPlanId(Integer planId) {
-        // 根据方案id获取方案区域列表
-        List<Map<String, Object>> planAreaList = planMapper.getPlanAreaByPlanId(planId);
-        // 根据方案id获取解说词列表
-        List<Map<String, Object>> captionList = planMapper.getCaptionByPlanId(planId);
-        Map<String, Object> dataMap = new HashMap<>();
-        // 获取信号源
-        if (Blank.isNotEmpty(planAreaList)) {
-            for (Map<String, Object> planArea : planAreaList) {
-                // 信号源id字符串
-                String signalIds = Convert.toStr(planArea.get("signal_source"));
-                // 设备按钮
-                String deviceButtons = Convert.toStr(planArea.get("device_buttons"));
-                // 流程方案id
-                Integer processPlanId = Convert.toInt(planArea.get("process_plan_id"));
-                List<Map<String, Object>> signalSourceList = new ArrayList<>();
-                List<Map<String, Object>> deviceButtonList = new ArrayList<>();
-                if (Blank.isNotEmpty(signalIds)) {
-                    String[] ids = signalIds.split(",");
-                    for (String signalId : ids) {
-                        //根据信号id获取信号源信息
-                        Map<String, Object> signalInfo = signalSourceMapper.getSignalInfoById(signalId);
-                        signalSourceList.add(signalInfo);
-                    }
+@Override
+public Map<String, Object> getPlanAreaByPlanId(Integer planId) {
+    // 根据方案id获取方案区域列表
+    List<Map<String, Object>> planAreaList = planMapper.getPlanAreaByPlanId(planId);
+    // 根据方案id获取解说词列表
+    List<Map<String, Object>> captionList = planMapper.getCaptionByPlanId(planId);
+    Map<String, Object> dataMap = new HashMap<>();
+    // 获取信号源
+    if (Blank.isNotEmpty(planAreaList)) {
+        for (Map<String, Object> planArea : planAreaList) {
+            // 信号源id字符串
+            String signalIds = Convert.toStr(planArea.get("signal_source"));
+            // 设备按钮
+            String deviceButtons = Convert.toStr(planArea.get("device_buttons"));
+            // 流程方案id
+            Integer processPlanId = Convert.toInt(planArea.get("process_plan_id"));
+            List<Map<String, Object>> signalSourceList = new ArrayList<>();
+            List<Map<String, Object>> deviceButtonList = new ArrayList<>();
+            if (Blank.isNotEmpty(signalIds)) {
+                String[] ids = signalIds.split(",");
+                for (String signalId : ids) {
+                    //根据信号id获取信号源信息
+                    Map<String, Object> signalInfo = signalSourceMapper.getSignalInfoById(signalId);
+                    signalSourceList.add(signalInfo);
                 }
-                // 获取设备按钮
-                if (Blank.isNotEmpty(deviceButtons)) {
-                    String[] devices = deviceButtons.split(",");
-                    for (String deviceId : devices) {
-                        //根据设备id获取设备信息
-                        Map<String, Object> deviceInfo = planMapper.getDeviceInfoById(deviceId);
-                        deviceButtonList.add(deviceInfo);
-                    }
-                }
-                // 获取场景方案下的所有流程控制
-                if (Blank.isNotEmpty(processPlanId)) {
-                    List<Map<String, Object>> processList = processMapper.getProcessListByPlanId(processPlanId);
-                    planArea.put("processList", processList);
+            }
+            // 获取设备按钮
+            if (Blank.isNotEmpty(deviceButtons)) {
+                String[] devices = deviceButtons.split(",");
+                for (String deviceId : devices) {
+                    //根据设备id获取设备信息
+                    Map<String, Object> deviceInfo = planMapper.getDeviceInfoById(deviceId);
+                    deviceButtonList.add(deviceInfo);
                 }
-                planArea.put("signalSourceList", signalSourceList);
-                planArea.put("deviceButtonList", deviceButtonList);
             }
+            // 获取场景方案下的所有流程控制
+            if (Blank.isNotEmpty(processPlanId)) {
+                List<Map<String, Object>> processList = processMapper.getProcessListByPlanId(processPlanId);
+                planArea.put("processList", processList);
+            }
+            planArea.put("signalSourceList", signalSourceList);
+            planArea.put("deviceButtonList", deviceButtonList);
         }
-        dataMap.put("planAreaList", planAreaList);
-        dataMap.put("captionList", captionList);
-        return dataMap;
     }
+    dataMap.put("planAreaList", planAreaList);
+    dataMap.put("captionList", captionList);
+    return dataMap;
+}
 
-    @Override
-    public List<Map<String, Object>> getPlanByRoleId(Integer roleId) {
-        return planMapper.getPlanByRoleId(roleId);
-    }
+@Override
+public List<Map<String, Object>> getPlanByRoleId(Integer roleId) {
+    return planMapper.getPlanByRoleId(roleId);
+}
 
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public Boolean switchDefaultPlan(Integer planId) {
-        Map<String, Object> plan = planMapper.getOnePlanById(planId);
-        if (!StringUtils.isEmpty(plan.get("default_plan"))
-                && Integer.parseInt(plan.get("default_plan").toString()) == 0) {
-            //先把之前默认的方案修改成不默认
-            planMapper.clearDefaultPlan();
-        }
+@Override
+@Transactional(rollbackFor = Exception.class)
+public Boolean switchDefaultPlan(Integer planId) {
+    Map<String, Object> plan = planMapper.getOnePlanById(planId);
+    if (!StringUtils.isEmpty(plan.get("default_plan"))
+            && Integer.parseInt(plan.get("default_plan").toString()) == 0) {
+        //先把之前默认的方案修改成不默认
+        planMapper.clearDefaultPlan();
+    }
 
 
-        //设置默认方案
-        return planMapper.switchDefaultPlan(planId) > 0;
-    }
+    //设置默认方案
+    return planMapper.switchDefaultPlan(planId) > 0;
+}
 }

+ 22 - 4
spring-cloud/server-basic/src/main/java/com/jd/service/impl/SafetyInfoServiceImpl.java

@@ -1,7 +1,7 @@
 package com.jd.service.impl;
 
 import com.jd.entity.SafetyInfo;
-import com.jd.mapper.SafetyInfoMapper;
+import com.jd.mapper.*;
 import com.jd.service.SafetyInfoService;
 import com.jd.util.Blank;
 import com.jd.util.SendUtil;
@@ -24,6 +24,18 @@ public class SafetyInfoServiceImpl implements SafetyInfoService {
     @Autowired
     private SafetyInfoMapper safetyInfoMapper;
 
+    @Autowired
+    private RiskTypeMapper riskTypeMapper;
+
+    @Autowired
+    private SystemRiskMapper systemRiskMapper;
+
+    @Autowired
+    private AttackTypeMapper attackTypeMapper;
+
+    @Autowired
+    private SystemAttackedMapper systemAttackedMapper;
+
     @Override
     public Map<String, Object> getSafetyInfo(Map<String, Object> param) {
         Integer count = safetyInfoMapper.getCountSafetyInfo(param);
@@ -35,8 +47,8 @@ public class SafetyInfoServiceImpl implements SafetyInfoService {
     }
 
     @Override
-    public Map<String, Object> getSafetyInfoById(Map<String, Object> param) {
-        return safetyInfoMapper.getSafetyInfoById(param);
+    public Map<String, Object> getSafetyInfoById(Integer id) {
+        return safetyInfoMapper.getSafetyInfoById(id);
     }
 
     @Override
@@ -56,7 +68,13 @@ public class SafetyInfoServiceImpl implements SafetyInfoService {
 
     @Override
     public Map<String, Object> deleteSafetyInfo(Integer InfoId) {
-
+        //删除安全信息下的漏洞和攻击信息
+        riskTypeMapper.deleteRiskTypeByInfo(InfoId);
+        systemRiskMapper.deleteSystemRiskInfoByInfo(InfoId);
+        attackTypeMapper.deleteAttackTypeByInfo(InfoId);
+        systemAttackedMapper.deleteSystemAttackedInfoByInfo(InfoId);
+        //删除安全信息
         return SendUtil.send(safetyInfoMapper.deleteSafetyInfo(InfoId));
+
     }
 }

+ 1 - 1
spring-cloud/server-basic/src/main/java/com/jd/service/impl/SystemAttackedServiceImpl.java

@@ -65,7 +65,7 @@ public class SystemAttackedServiceImpl implements SystemAttackedService {
 
     @Override
     public Map<String, Object> deleteSystemAttackedInfoo(Integer systemAttackId) {
-        Boolean result = systemAttackedMapper.deleteSystemAttackedInfoo(systemAttackId);
+        Boolean result = systemAttackedMapper.deleteSystemAttackedInfo(systemAttackId);
         return SendUtil.send(result);
     }
 }

+ 6 - 1
spring-cloud/server-basic/src/main/resources/mapper/AttackTypeMapper.xml

@@ -90,11 +90,16 @@
             attack_count = #{attackCount},
         </if>
         update_time = now()
-         WHERE id = #{attackId}
+         WHERE id = #{id}
     </update>
 
     <!-- 删除攻击类型-->
     <delete id="deleteAttackType">
         DELETE FROM attack_type WHERE id = #{attackId}
     </delete>
+
+    <!-- 删除攻击类型-->
+    <delete id="deleteAttackTypeByInfo">
+        DELETE FROM attack_type WHERE info_id = #{infoId}
+    </delete>
 </mapper>

+ 9 - 2
spring-cloud/server-basic/src/main/resources/mapper/PlanMapper.xml

@@ -187,9 +187,16 @@
 			tpa.sortno,
 			tpa.create_time,
 			tpa.signal_source,
-		    tpa.device_buttons
+			tpa.device_buttons,
+			tp.plan_name,
+			tp.plan_code,
+			tpp.plan_code as process_plan_code,
+			tpp.plan_name as process_plan_name
 		FROM
-			t_plan_area tpa WHERE plan_id = #{planId}
+			t_plan_area tpa
+				LEFT JOIN t_plan tp ON tpa.plan_id = tp.id
+				LEFT JOIN t_process_plan tpp ON tpa.process_plan_id = tpp.id
+		WHERE plan_id = #{planId}
 		ORDER BY
 			tpa.sortno
 	</select>

+ 7 - 2
spring-cloud/server-basic/src/main/resources/mapper/ProcessMapper.xml

@@ -4,8 +4,8 @@
 
     <!--新增流程控制-->
     <insert id="addProcessInfo">
-        insert into t_process(plan_id, process_name, sort, interval_time, url, caption, create_time)
-        values (#{planId}, #{processName}, #{sort}, #{intervalTime}, #{url}, #{caption}, now())
+        insert into t_process(plan_id, process_name,process_image, sort, interval_time, url, caption, create_time)
+        values (#{planId}, #{processName}, #{processImage}, #{sort}, #{intervalTime}, #{url}, #{caption}, now())
     </insert>
 
     <!--删除流程控制-->
@@ -23,6 +23,9 @@
             <if test="processName != null and processName != ''">
                 process_name = #{processName},
             </if>
+            <if test="processImage != null and processImage != ''">
+                process_image = #{processImage},
+            </if>
             <if test="sort != null and sort != ''">
                 sort = #{sort},
             </if>
@@ -93,6 +96,8 @@
             t_process
         WHERE
             plan_id = #{planId}
+        ORDER BY
+            sort
     </select>
 
 

+ 9 - 4
spring-cloud/server-basic/src/main/resources/mapper/RiskTypeMapper.xml

@@ -35,7 +35,7 @@
         LIMIT #{startRows}, #{limit}
     </select>
 
-    <select id="countRiskTypeByType" resultType="map" parameterType="map">
+    <select id="countRiskTypeByType" resultType="Integer" parameterType="map">
         SELECT count(*) FROM
         risk_type
         <where>
@@ -78,14 +78,14 @@
     <!-- 修改安全数据-->
     <update id="updateRiskType"  parameterType="com.jd.entity.SafetyInfo" >
         UPDATE risk_type SET
-        <if test="attackType != null and attackType != ''">
+        <if test="riskType != null and riskType != ''">
             risk_type = #{riskType},
         </if>
-        <if test="attackCount != null and attackCount != ''">
+        <if test="riskNumber != null and riskNumber != ''">
             risk_number = #{riskNumber},
         </if>
         update_time = now()
-        WHERE id = #{riskId}
+        WHERE id = #{id}
     </update>
 
     <!-- 删除安全数据-->
@@ -93,4 +93,9 @@
         DELETE FROM risk_type WHERE id = #{riskId}
     </delete>
 
+    <!-- 删除安全数据-->
+    <delete id="deleteRiskTypeByInfo">
+        DELETE FROM risk_type WHERE info_id = #{infoId}
+    </delete>
+
 </mapper>

+ 3 - 3
spring-cloud/server-basic/src/main/resources/mapper/SafetyInfoMapper.xml

@@ -37,7 +37,7 @@
     </select>
 
     <!-- 查询方案 -->
-    <select id="getSafetyInfoById" resultType="map" parameterType="map">
+    <select id="getSafetyInfoById" resultType="map" >
         SELECT
         id,
         business_system_number,
@@ -50,7 +50,7 @@
         update_time
         FROM
         safety_info
-        WHERE org_type = #{orgType} AND id= #{InfoId}
+        WHERE id = #{InfoId}
         ORDER BY create_time DESC
     </select>
 
@@ -97,7 +97,7 @@
             org_type = #{orgType},
         </if>
             update_time = now()
-        WHERE id = #{InfoId}
+        WHERE id = #{id}
     </update>
 
     <delete id="deleteSafetyInfo">

+ 13 - 9
spring-cloud/server-basic/src/main/resources/mapper/SystemAttackedMapper.xml

@@ -23,7 +23,7 @@
         attacked_server_ip,
         serious_level,
         detection_time,
-        attack_count,
+        attack_num,
         create_time,
         update_time
         FROM
@@ -41,7 +41,7 @@
             attacked_server_ip,
             serious_level,
             detection_time,
-            attack_count,
+            attack_num,
             create_time,
             update_time
         FROM
@@ -58,14 +58,14 @@
          attacked_server_ip,
          serious_level,
          detection_time,
-         attack_count,
-         create_time,)
+         attack_num,
+         create_time)
         VALUES
         (#{infoId},
          #{attackedServerIp},
          #{seriousLevel},
          #{detectionTime},
-         #{attackCount},
+         #{attackNum},
          now())
     </insert>
 
@@ -81,14 +81,18 @@
         <if test="detectionTime != null and detectionTime != ''">
             detection_time = #{detectionTime},
         </if>
-        <if test="attackCount != null and attackCount != ''">
-            attack_count = #{attackCount},
+        <if test="attackNum != null and attackNum != ''">
+            attack_num = #{attackNum},
         </if>
         update_time = now()
-        WHERE id = #{systemAttackId}
+        WHERE id = #{id}
     </update>
 
-    <delete id="deleteSystemAttackedInfoo">
+    <delete id="deleteSystemAttackedInfo">
         DELETE FROM system_attacked WHERE id = #{systemAttackId}
     </delete>
+
+    <delete id="deleteSystemAttackedInfoByInfo">
+        DELETE FROM system_attacked WHERE info_id = #{infoId}
+    </delete>
 </mapper>

+ 6 - 3
spring-cloud/server-basic/src/main/resources/mapper/SystemRiskMapper.xml

@@ -53,8 +53,7 @@
     <!-- 新增安全数据-->
     <insert id="insertSystemRiskInfo"  useGeneratedKeys="true" keyProperty="id">
         INSERT INTO system_risk
-        (id,
-         info_id,
+        (info_id,
          system_name,
          high_risk_number,
          middle_risk_number,
@@ -85,10 +84,14 @@
             safety_status = #{safetyStatus},
         </if>
         update_time = now()
-        WHERE id = #{systemRiskId}
+        WHERE id = #{id}
     </update>
 
     <delete id="deleteSystemRiskInfo">
         DELETE FROM system_risk WHERE id = #{systemRiskId}
     </delete>
+
+    <delete id="deleteSystemRiskInfoByInfo">
+        DELETE FROM system_risk WHERE info_id = #{infoId}
+    </delete>
 </mapper>

+ 23 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/constants.js

@@ -0,0 +1,23 @@
+/**
+ * 配置项目请求接口地址
+ */
+var PAGE_VOICE_AIP = "http://192.168.0.100";
+var GATEWAY_URL = "http://192.168.0.100:8084";
+
+var PAGE_BASIC = GATEWAY_URL + "/basic";
+var PAGE_THREEAPI = GATEWAY_URL + "/threeapi";
+
+var PAGE_WEBSOCKET = "ws://192.168.0.100:8087";
+var WS_PATH = "ws://192.168.0.100:8093/ws/realtime/voice";
+
+/** dpq大屏区   **/
+var AREA_CODE_DPQ = "dpq";
+
+
+var REALTIME_VOICE = {
+	KEYWORDS: [
+		'智慧城管',
+		'zhihuichengguan'
+	]
+};
+

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 8 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/flv.min.js


+ 350 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/index.js

@@ -0,0 +1,350 @@
+var nvrStep = 0;
+var NVR_CONFIGS = [];
+var NVR_CONFIG = {};
+var checkIndex = null;
+var playIndex = null;
+var audio = $('#audio')[0];
+var flvPlayer = null;
+
+
+$(function(){
+	
+    myWebsocket.initWebsocket({
+//		type: AREA_CODE,
+		url: PAGE_WEBSOCKET,
+		onmessage: function(data) {
+			if (!data) {
+				return; 
+			}
+			var obj = JSON.parse(data);
+			if(obj.code == AREA_CODE_DPQ){
+				if (obj.direct == "openUrl") {
+					initIframe(obj.url);
+					return;
+				}
+				if (obj.direct == "voiceSpeech") {
+					if(obj.operation == 'start'){
+						synthesis(obj.content);
+						return;
+					}
+					if(obj.operation == 'end'){
+						audio.pause();
+						audio.currentTime = 0;
+						return;
+					}
+					if(obj.operation == 'suspend'){
+						audio.pause();
+						return;
+					}
+					if(obj.operation == 'goon'){
+						audio.play();
+						return;
+					}
+				}
+			}
+		}
+	});
+})
+
+/** iframe打开页面 */
+function initIframe(url){
+	$("#iftem").attr("src", url);
+}
+
+/** 播放文字内容 */
+function synthesis(message){
+	/**
+     * 参数
+     * message 文字,最大512
+     * spd 语速,取值0-9,默认为5中语速
+     * pit 音调,取值0-9,默认为5中语调
+     * vol 音量,取值0-15,默认为5中音量(取值为0时为音量最小值,并非为无声)
+     * per 发音人选择, 0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女
+     * @return mp3字节流的base64字符串
+     */
+     post(PAGE_VOICE_AIP + "/aip/synthesis", {	
+		"message" : message,
+		spd: "5",
+		spd: "5",
+		per: "0"
+	},function(data) {
+		playAudio(data);
+	})
+}
+
+// 播放base64音频文件 
+function playAudio(fileData) {
+    audio.src = 'data:audio/wav;base64,' + fileData;
+}
+
+/** 语音转命令执行 */
+function say2ContrlCommit(message, pinyinStr){
+	if(message.indexOf("打开监控") > -1 || pinyin.indexOf("dakaijiankong") > -1){
+		return {
+			content : "打开监控",
+			event : openNvrListWindow
+		};
+	}
+	if(message.indexOf("选择监控") > -1 || pinyin.indexOf("xuanzejiankong") > -1){
+		return {
+			content : "选择监控",
+			event : alertNvrPlay,
+			handle : function(){
+				var num = parseInt(str.match(/\d+/g).join(''));
+				if(num){
+					return num;
+				}
+				num = ChineseToNumber(str);
+				if(num){
+					return num;
+				}
+				return -1;
+			}
+		};
+	}
+	if(message.indexOf("取消选择监控") > -1 || pinyin.indexOf("quxiaoxuanzejiankong") > -1){
+		return {
+			content : "取消选择监控",
+			event : cancelNvrListWindow,
+		};
+	}
+	if(message.indexOf("关闭监控") > -1 || pinyin.indexOf("guanbijiankong") > -1){
+		return {
+			content : "关闭监控",
+			event : alertNvrPlayClose,
+		};
+	}
+}
+
+function ChineseToNumber(chnStr) {
+	var chnNumChar = {
+		零: 0,
+		一: 1,
+		二: 2,
+		三: 3,
+		四: 4,
+		五: 5,
+		六: 6,
+		七: 7,
+		八: 8,
+		九: 9
+	};
+	var chnNameValue = {
+		十: { value: 10, secUnit: false },
+		百: { value: 100, secUnit: false },
+		千: { value: 1000, secUnit: false },
+		万: { value: 10000, secUnit: true },
+		亿: { value: 100000000, secUnit: true }
+	};
+	var rtn = 0;
+	var section = 0;
+	var number = 0;
+	var secUnit = false;
+	var str = chnStr.split('');
+
+	for (var i = 0; i < str.length; i++) {
+		var num = chnNumChar[str[i]];
+		if (typeof num !== 'undefined') {
+			number = num;
+			if (i === str.length - 1) {
+				section += number;
+			}
+		} else {
+			if (!chnNameValue[str[i]]) {
+				continue;
+			}
+			var unit = chnNameValue[str[i]].value;
+			secUnit = chnNameValue[str[i]].secUnit;
+			if (secUnit) {
+				section = (section + number) * unit;
+				rtn += section;
+				section = 0;
+			} else {
+				section += (number * unit);
+			}
+			number = 0;
+		}
+	}
+	return rtn + section;
+}
+
+
+/** 打开监控选择列表 */
+function openNvrListWindow(){
+	if(nvrStep != 0){
+		return;
+	}
+	var params = JSON.stringify({
+		"page" : 1,
+		"limit" : 100
+	});
+	get(PAGE_THREEAPI + '/apiUrl/sendApiUrlAndParam', {
+		"urlCode" : "YW_001", //查询监控列表
+		"params" : params
+	}, function(json){
+		var jsonData = JSON.parse(json.data);
+		if(jsonData && jsonData.code == 0){
+			nvrStep = 1;
+			var data = jsonData.data;
+			var content = "";
+			for(var i = 0; i < data.length; i++){
+				content += '选择监控' + (i + 1) + "(" + data[i].nvrName + ")<br/>";
+				NVR_CONFIGS.push(data[i]);
+			}
+			if(NVR_CONFIGS.length == 0){
+				synthesis("未查询到监控");
+			}else if(NVR_CONFIGS.length == 1){
+				alertNvrPlay(0);
+			}else{
+				checkIndex = layer.open({
+	    			type: 0,  //可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
+	    			title: ['请选择监控'],
+	    			content: content,
+//	    			btn: ['确定', '取消'],
+	    			btn: [],
+//	    			yes: function(index, layero){
+//	    			    alertNvrPlay(0);
+//					},
+//					btn2: function(index, layero){ 
+//					  cancelNvrListWindow();
+//					}
+				});
+			}
+		}else{
+			synthesis("查询监控列表失败");
+		}
+	},function(msg){
+		synthesis("查询监控列表失败");
+	});
+}
+
+/** 取消监控选择列表 */
+function cancelNvrListWindow(){
+	if(nvrStep != 1){
+		return;
+	}
+	nvrStep = 0;
+	layer.close(checkIndex);
+}
+
+/** 播放监控前查询地址 */
+function alertNvrPlay(num){
+	if(nvrStep != 1){
+		return;
+	}
+	if(num < 0 || num > NVR_CONFIGS.length - 1){
+		synthesis("选择监控失败");
+	}
+	NVR_CONFIG = NVR_CONFIGS[num];
+	if(checkIndex){
+		layer.close(checkIndex);
+	}
+	
+	var params = JSON.stringify({
+		"nvrId" : NVR_CONFIG.nvrId
+	});
+	get(PAGE_THREEAPI + '/apiUrl/sendApiUrlAndParam', {
+		"urlCode" : "YW_002", //打开监控
+		"params" : params
+	}, function(json){
+		var jsonData = JSON.parse(json.data);
+		if(jsonData && jsonData.result){
+			get(PAGE_THREEAPI + '/apiUrl/sendApiUrlAndParam', {
+				"urlCode" : "YW_003", //查询监控地址
+				"params" : params
+			}, function(json){
+				var jsonData = JSON.parse(json.data);
+				if(jsonData && jsonData.result){
+					nvrStep = 2;
+//					synthesis("监控播放成功");
+					videoPlay(jsonData.data);
+				}else{
+					synthesis("监控播放失败");
+				}
+			},function(msg){
+				synthesis("监控播放失败");
+			});
+		}else{
+			synthesis("监控开启失败");
+		}
+	},function(msg){
+		synthesis("监控开启失败");
+	});
+}
+
+/** 关闭播放监控窗口 */
+function alertNvrPlayClose(){
+	if(nvrStep != 2){
+		return;
+	}
+	var params = JSON.stringify({
+		"nvrId" : NVR_CONFIG.nvrId
+	});
+	get(PAGE_THREEAPI + '/apiUrl/sendApiUrlAndParam', {
+		"urlCode" : "YW_004", //查询监控详情
+		"params" : params
+	}, function(json){
+		var jsonData = JSON.parse(json.data);
+		if(jsonData && jsonData.result){
+			params = JSON.stringify({
+				"nvrId" : jsonData.data.nvrId,
+				"relayId" : jsonData.data.relayId
+			});
+			get(PAGE_THREEAPI + '/apiUrl/sendApiUrlAndParam', {
+				"urlCode" : "YW_005", //关闭监控
+				"params" : params
+			}, function(json){
+				var jsonData = JSON.parse(json.data);
+				if(jsonData && jsonData.result){
+					nvrStep = 0;
+//					synthesis("监控关闭成功");
+
+					if(flvPlayer){
+						
+						layer.close(playIndex);
+						flvPlayer.pause();
+						flvPlayer.unload();
+						flvPlayer.detachMediaElement();
+						flvPlayer.destroy();
+						flvPlayer = null;
+					}
+				}else{
+					synthesis("监控关闭失败");
+				}
+			},function(msg){
+				synthesis("监控关闭失败");
+			});
+		}else{
+			synthesis("监控关闭失败");
+		}
+	},function(msg){
+		synthesis("监控关闭失败");
+	});
+}
+
+/** 播放监控 */
+function videoPlay(url) {
+	playIndex = layer.open({
+		type: 1,
+		title: '视频播放',
+		area: ['800px', '497px'],
+		content: '<div class="player layui-none fadeIn animated layui-fluid" id="player">'
+			+ '<div class="layui-card">'
+			+ '<div class="layui-card-body">'
+			+ '<video width="800" height="450" class="playerArea" preload="auto"  controls="controls" muted="muted" id="playerEvent"></video>'
+			+ '</div>'
+			+ '</div>'
+			+ '</div>',
+		end: function() {
+//			alertNvrPlayClose();
+		}
+	});
+	var videoElement = document.getElementById('playerEvent');
+	flvPlayer = flvjs.createPlayer({
+		type: 'flv',
+		url: url
+	});
+	flvPlayer.attachMediaElement(videoElement);
+	flvPlayer.load();
+	flvPlayer.play();
+}

+ 239 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/lib/custom-recorder.js

@@ -0,0 +1,239 @@
+(function(window) {
+	var ws;
+	var Recorder = function(stream, config) {
+		config = config || {};
+		config.sampleBits = config.sampleBits || 8;
+		config.sampleRate = config.sampleRate || (44100 / 6);
+		
+		var context = new(window.webkitAudioContext || window.AudioContext)();
+		var audioInput = context.createMediaStreamSource(stream);
+		var createScript = context.createScriptProcessor || context.createJavaScriptNode;
+		var recorder = createScript.apply(context, [4096, 1, 1]);
+
+		var audioData = {
+			size: 0,
+			buffer: [],
+			inputSampleRate: context.sampleRate,
+			inputSampleBits: 16,
+			outputSampleRate: config.sampleRate,
+			oututSampleBits: config.sampleBits,
+			clear: function() {
+				this.buffer = [];
+				this.size = 0;
+			},
+			input: function(data) {
+				this.buffer.push(new Float32Array(data));
+				this.size += data.length;
+			},
+			compress: function() {
+				var data = new Float32Array(this.size);
+				var offset = 0;
+				for (var i = 0; i < this.buffer.length; i++) {
+					data.set(this.buffer[i], offset);
+					offset += this.buffer[i].length;
+				}
+				var compression = parseInt(this.inputSampleRate / this.outputSampleRate);
+				var length = data.length / compression;
+				var result = new Float32Array(length);
+				var index = 0,
+					j = 0;
+				while (index < length) {
+					result[index] = data[j];
+					j += compression;
+					index++;
+				}
+				return result;
+			},
+			encodePCM: function() {
+				var sampleRate = Math.min(this.inputSampleRate, this.outputSampleRate);
+				var sampleBits = Math.min(this.inputSampleBits, this.oututSampleBits);
+				var bytes = this.compress();
+				this.buffer = [];
+				this.size = 0;
+				var dataLength = bytes.length * (sampleBits / 8);
+				var buffer = new ArrayBuffer(44 + dataLength);
+				var data = new DataView(buffer);
+				var channelCount = 1;
+				var offset = 0;
+				var writeString = function(str) {
+					for (var i = 0; i < str.length; i++) {
+						data.setUint8(offset + i, str.charCodeAt(i));
+					}
+				}
+				writeString('RIFF');
+				offset += 4;
+				data.setUint32(offset, 36 + dataLength, true);
+				offset += 4;
+				writeString('WAVE');
+				offset += 4;
+				writeString('fmt ');
+				offset += 4;
+				data.setUint32(offset, 16, true);
+				offset += 4;
+				data.setUint16(offset, 1, true);
+				offset += 2;
+				data.setUint16(offset, channelCount, true);
+				offset += 2;
+				data.setUint32(offset, sampleRate, true);
+				offset += 4;
+				data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true);
+				offset += 4;
+				data.setUint16(offset, channelCount * (sampleBits / 8), true);
+				offset += 2;
+				data.setUint16(offset, sampleBits, true);
+				offset += 2;
+				writeString('data');
+				offset += 4;
+				data.setUint32(offset, dataLength, true);
+				offset += 4;
+				if (sampleBits === 8) {
+					for (var i = 0; i < bytes.length; i++, offset++) {
+						var s = Math.max(-1, Math.min(1, bytes[i]));
+						var val = s < 0 ? s * 0x8000 : s * 0x7FFF;
+						val = parseInt(255 / (65535 / (val + 32768)));
+						data.setInt8(offset, val, true);
+					}
+				} else {
+					for (var i = 0; i < bytes.length; i++, offset += 2) {
+						var s = Math.max(-1, Math.min(1, bytes[i]));
+						data.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
+					}
+				}
+				return new Blob([data], {
+					type: 'audio_pcm/wav'
+				});
+			}
+		};
+
+
+		var sendData = function() {
+			var reader = new FileReader();
+			reader.onload = function(e) {
+				var outbuffer = e.target.result;
+				var arr = new Int8Array(outbuffer);
+				if (arr.length > 0) {
+					var tmparr = new Int8Array(1024);
+					var j = 0;
+					for (var i = 0; i < arr.byteLength; i++) {
+						tmparr[j++] = arr[i];
+						if (((i + 1) % 1024) == 0) {
+							ws.send(tmparr);
+							if (arr.byteLength - i - 1 >= 1024) {
+								tmparr = new Int8Array(1024);
+							} else {
+								tmparr = new Int8Array(arr.byteLength - i - 1);
+							}
+							j = 0;
+						}
+						if ((i + 1 == arr.byteLength) && ((i + 1) % 1024) != 0) {
+							ws.send(tmparr);
+						}
+					}
+				}
+			};
+			reader.readAsArrayBuffer(audioData.encodePCM());
+			audioData.clear();
+		};
+
+		this.start = function() {
+			audioInput.connect(recorder);
+			recorder.connect(context.destination);
+		};
+
+		this.stop = function() {
+			recorder.disconnect();
+		};
+
+		this.getBlob = function() {
+			return audioData.encodePCM();
+		};
+
+		this.clear = function() {
+			audioData.clear();
+		}
+
+		recorder.onaudioprocess = function(e) {
+			var inputBuffer = e.inputBuffer.getChannelData(0);
+			audioData.input(inputBuffer);
+			sendData();
+		}
+	};
+
+	Recorder.throwError = function(message) {
+		throw new function() {
+			this.toString = function() {
+				return message;
+			}
+		}
+	};
+
+	Recorder.canRecording = (navigator.getUserMedia != null);
+	
+	Recorder.useWebSocket = function(recorder, path, callback) {
+		ws = new WebSocket(path);
+		ws.binaryType = 'arraybuffer';
+		ws.onopen = function() {
+			if (ws.readyState == 1) {
+				// recorder.start();
+			}
+		};
+		ws.onerror = function(err) {
+			Recorder.throwError('websocket异常,异常信息:' + err);
+		};
+		ws.onmessage = function(res) {
+			var data = res.data;
+			if (data) {
+				callback(JSON.parse(data));
+			}
+		}
+		return ws;
+	}
+	
+	Recorder.refreshSocket = function(rec, time, path, initback, callback) {
+		setInterval(function() {
+			ws.close();
+			rec.stop();
+			setTimeout(function() {
+				var wss = Recorder.useWebSocket(rec, path, callback);
+				initback(wss);
+			}, 500);
+		}, time);
+	}
+
+	Recorder.get = function(config, initback, callback) {
+		if (!navigator.getUserMedia) {
+			Recorder.throwError('当前浏览器不支持录音功能。');
+			return;
+		}
+		navigator.getUserMedia({
+			audio: true
+		}, function(stream) {
+			var rec = new Recorder(stream, config);
+			var wss = Recorder.useWebSocket(rec, config.wsPath, callback);
+			console.log(wss)
+			initback(rec, wss);
+		}, function(error) {
+			console.log(error)
+			switch (error.code || error.name) {
+				case 'PERMISSION_DENIED':
+				case 'PermissionDeniedError':
+					Recorder.throwError('用户拒绝提供信息。');
+					break;
+				case 'NOT_SUPPORTED_ERROR':
+				case 'NotSupportedError':
+					Recorder.throwError('浏览器不支持硬件设备。');
+					break;
+				case 'MANDATORY_UNSATISFIED_ERROR':
+				case 'MandatoryUnsatisfiedError':
+					Recorder.throwError('无法发现指定的硬件设备。');
+					break;
+				default:
+					Recorder.throwError('无法打开麦克风。异常信息:' + (error.code || error.name));
+					break;
+			}
+		});
+	};
+
+	window.Recorder = Recorder;
+	window.websocketAsr = ws;
+})(window);

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 17 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/lib/jquery-hanzi2pinyin.simp.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/lib/jquery.min.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/layer.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/mobile/layer.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/mobile/need/layer.css


binární
spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/icon-ext.png


binární
spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/icon.png


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/layer.css


binární
spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/loading-0.gif


binární
spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/loading-1.gif


binární
spring-cloud/server-page/src/main/resources/dldp2/js/lib/layer/theme/default/loading-2.gif


+ 63 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/utils.js

@@ -0,0 +1,63 @@
+
+Date.prototype.format = function(fmt) {
+	var o = {
+		"M+": this.getMonth() + 1, //月份
+		"d+": this.getDate(), //日
+		"h+": this.getHours(), //小时
+		"m+": this.getMinutes(), //分
+		"s+": this.getSeconds(), //秒
+		"q+": Math.floor((this.getMonth() + 3) / 3), //季度
+		"S": this.getMilliseconds() //毫秒
+	};
+	if (/(y+)/.test(fmt)) {
+		fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
+	}
+	for (var k in o) {
+		if (new RegExp("(" + k + ")").test(fmt)) {
+			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k])
+				.length)));
+		}
+	}
+	return fmt;
+}
+
+
+// 请求函数
+function get(url, data, success,error) {
+	return request(url, 'GET', data, success,error)
+}
+
+function post(url, data, success,error) {
+	return request(url, 'POST', data, success,error)
+}
+
+function request(url, type, data, success,error) {
+	var datas = null;
+	$.ajax({
+		type: type,
+		async : false,
+		url: url,
+		dataType: 'json',
+		data: data,
+		success: function(json) {
+			console.log(json);
+			if(json.result){
+				if(success){
+					success(json.data);
+				}
+				datas = json.data;
+				return ;
+			}
+			if(error){
+				error(json.msg);
+			}
+		},
+		error: function(msg) {
+			console.log(msg);
+			if(error){
+				error(msg);
+			}
+		}
+	});
+	return datas;
+}

+ 181 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/websocket.js

@@ -0,0 +1,181 @@
+var myWebsocket = {
+	websocket : null,
+	clientPrefix : "",
+	clientId : "",
+	default : {
+		type : "",
+		url : "",
+		onmessage : null,
+		//将消息显示在网页上
+		setConsoleOut : function setConsoleOut(innerHTML) {
+			console.log(innerHTML);
+		}
+		
+	},
+	initWebsocket : function(data){
+		var type = "";
+		var setConsoleOut = null;
+		var url = "";
+		if(!data){
+			alert("url is empty");
+			return;
+		}
+		type = data.type ? data.type + "_" : myWebsocket.default.type;
+		if(data.onmessage){
+			myWebsocket.default.onmessage = data.onmessage;
+		}
+		myWebsocket.clientPrefix = "client_" + type;
+		sessionStorage.clientPrefix = myWebsocket.clientPrefix;
+		myWebsocket.clientId = myWebsocket.clientPrefix + Math.uuid().replace(/-/g,"");
+		sessionStorage.clientId = myWebsocket.clientId;
+		if(!data.url){
+	    	alert("url is empty");
+			return;
+		}
+		url = data.url + "/socketServer/" + myWebsocket.clientId;
+		setConsoleOut = data.setConsoleOut ? data.setConsoleOut : myWebsocket.default.setConsoleOut;
+		
+		//判断当前浏览器是否支持WebSocket, 主要此处要更换为自己的地址
+	    if ('WebSocket' in window) {
+	        setConsoleOut(url);
+	        myWebsocket.websocket = new WebSocket(url);
+	    } else {
+	        setConsoleOut('Not support websocket');
+	    }
+	
+	    //连接发生错误的回调方法
+	    myWebsocket.websocket.onerror = function() {
+	        setConsoleOut("error");
+	    };
+	
+	    //连接成功建立的回调方法
+	    myWebsocket.websocket.onopen = function(event) {
+	        setConsoleOut("open");
+	    }
+	
+	    //接收到消息的回调方法
+	    myWebsocket.websocket.onmessage = function(event) {
+	        setConsoleOut(event.data);
+	        if(myWebsocket.default.onmessage){
+				myWebsocket.default.onmessage(event.data);
+			}
+	    }
+	
+	    //连接关闭的回调方法
+	    myWebsocket.websocket.onclose = function() {
+	        setConsoleOut("close");
+	    }
+	
+	    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
+	    window.onbeforeunload = function() {
+	        if(myWebsocket.websocket){
+			    myWebsocket.websocket.close();
+			}
+	    }
+	},
+	sendWebsocket : function(message) {
+		if(myWebsocket.websocket){
+			console.log(message);
+	    	myWebsocket.websocket.send(message);
+		}
+	},
+	closeWebSocket : function () {
+		if(myWebsocket.websocket){
+		    myWebsocket.websocket.close();
+		}
+	}
+};
+
+
+/*!
+Math.uuid.js (v1.4)
+http://www.broofa.com
+mailto:robert@broofa.com
+
+Copyright (c) 2010 Robert Kieffer
+Dual licensed under the MIT and GPL licenses.
+*/
+
+/*
+ * Generate a random uuid.
+ *
+ * USAGE: Math.uuid(length, radix)
+ *   length - the desired number of characters
+ *   radix  - the number of allowable values for each character.
+ *
+ * EXAMPLES:
+ *   // No arguments  - returns RFC4122, version 4 ID
+ *   >>> Math.uuid()
+ *   "92329D39-6F5C-4520-ABFC-AAB64544E172"
+ *
+ *   // One argument - returns ID of the specified length
+ *   >>> Math.uuid(15)     // 15 character ID (default base=62)
+ *   "VcydxgltxrVZSTV"
+ *
+ *   // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)
+ *   >>> Math.uuid(8, 2)  // 8 character ID (base=2)
+ *   "01001010"
+ *   >>> Math.uuid(8, 10) // 8 character ID (base=10)
+ *   "47473046"
+ *   >>> Math.uuid(8, 16) // 8 character ID (base=16)
+ *   "098F4D35"
+ */
+(function() {
+  // Private array of chars to use
+  var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
+
+  Math.uuid = function (len, radix) {
+    var chars = CHARS, uuid = [], i;
+    radix = radix || chars.length;
+
+    if (len) {
+      // Compact form
+      for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
+    } else {
+      // rfc4122, version 4 form
+      var r;
+
+      // rfc4122 requires these characters
+      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
+      uuid[14] = '4';
+
+      // Fill in random data.  At i==19 set the high bits of clock sequence as
+      // per rfc4122, sec. 4.1.5
+      for (i = 0; i < 36; i++) {
+        if (!uuid[i]) {
+          r = 0 | Math.random()*16;
+          uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
+        }
+      }
+    }
+
+    return uuid.join('');
+  };
+
+  // A more performant, but slightly bulkier, RFC4122v4 solution.  We boost performance
+  // by minimizing calls to random()
+  Math.uuidFast = function() {
+    var chars = CHARS, uuid = new Array(36), rnd=0, r;
+    for (var i = 0; i < 36; i++) {
+      if (i==8 || i==13 ||  i==18 || i==23) {
+        uuid[i] = '-';
+      } else if (i==14) {
+        uuid[i] = '4';
+      } else {
+        if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;
+        r = rnd & 0xf;
+        rnd = rnd >> 4;
+        uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
+      }
+    }
+    return uuid.join('');
+  };
+
+  // A more compact, but less performant, RFC4122v4 solution:
+  Math.uuidCompact = function() {
+    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+      var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
+      return v.toString(16);
+    });
+  };
+})();

+ 105 - 0
spring-cloud/server-page/src/main/resources/dldp2/js/yuyinContrl.js

@@ -0,0 +1,105 @@
+var voiceSign = false;
+var msgIndex;
+var speechTimeOut;
+var recorder;
+var awakenSign = 0;
+var webSocketWs;
+$(function() {
+	initRecorder();
+});
+
+function initRecorder() {
+	Recorder.get({
+		wsPath: WS_PATH,
+		sampleBits: 16,
+		sampleRate: 16000
+	}, function(rec, ws) {
+		recorder = rec;
+		webSocketWs = ws;
+		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '语音唤醒功能已启动,唤醒词为:', REALTIME_VOICE.KEYWORDS);
+		
+		Recorder.refreshSocket(rec, 1000*60*58, WS_PATH, function(ws) {
+			console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '连接已重置');
+			webSocketWs = ws;
+		}, function(data) {
+			discern(data);
+		});
+	}, function(data) {
+		discern(data);
+	});
+}
+
+/**
+ * 识别语音
+ * @param {Object} data
+ */
+function discern(data) {
+	console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '接收消息:', data);
+	if (data.type == 'awaken' && awakenSign == 0) {
+		webSocketWs.send("start");
+		recorder.start();
+		awakenSign = 1;
+		initMsg('我在,请说出语音指令');
+		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '开始监听命令,20s后停止监听');
+		speechTimeOut = setTimeout(function() {
+			webSocketWs.send("stop");
+			recorder.stop();
+			awakenSign = 0;
+			layer.close(msgIndex);
+			console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '停止监听命令');
+		}, 20 * 1000);
+	} else if (awakenSign == 1 && data.type == 'asr') {
+		
+		if (data.data.type == 'FIN_TEXT') {
+			mateRouse(data.data.result);
+		} else if (data.data.type == 'MID_TEXT') {
+			if (msgIndex) {
+				$('.layui-layer-content').text(data.data.result);
+			}
+		}
+	}
+}
+
+function initMsg(msg) {
+	msgIndex = layer.msg(msg, {
+		shade: 0.6,
+		time: 0,
+		end: function() {
+			msgIndex = null;
+		}
+	});
+}
+
+function removeSpecialCharts(str) {
+	return str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?|,|。|?|!]/g,"");
+}
+
+function mateRouse(str) {
+	console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '识别文本:', str);
+	str = removeSpecialCharts(str);
+	var pinyin = str.hanzi2pinyin({hyphen:''});
+	// 识别指令
+	var commit = say2ContrlCommit(str, pinyin);
+	if (commit.content) {
+		$('.layui-layer-content').text('指令识别成功,正在执行中...');
+		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '指令识别成功');
+		clearTimeout(speechTimeOut);
+		webSocketWs.send("stop");
+		recorder.stop();
+		awakenSign = 0;
+		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '识别到指令,停止监听命令');
+		setTimeout(function() {
+			layer.close(msgIndex);
+			if(commit.event){
+				if(commit.handle){
+					commit.event(commit.handle());
+				}else{
+					commit.event();
+				}
+			}
+		}, 1000)
+	} else {
+		$('.layui-layer-content').text('指令识别失败');
+		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '指令识别失败');
+	}
+}

+ 46 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/index.html

@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang="en" class="overhtml">
+	<head>
+		<meta charset="utf-8" />
+		<title>大屏视频弹窗</title>
+		<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" />
+		<link rel="layui/css/layui.css">
+		<style type="text/css">
+			.overhtml {
+				height: 100%;
+				width: 100%;
+				margin: 0;
+				padding: 0;
+			}
+			.iftem {
+				height: 100%;
+				width: 100%;
+			}
+		</style>
+	</head>
+
+	<body class="overhtml">
+	<iframe name="myFrame" id="iftem" class="iftem" border="0" frameborder="0" src="" >
+	</iframe>
+	    <div style="display:none;">
+	        <audio controls src="" id="audio" autoplay></audio>
+	    </div>
+	</body>
+	<script type="text/javascript" src="js/lib/jquery.min.js"></script>
+	<script type="text/javascript" src="layui/layui.all.js"></script>
+	<script type="text/javascript" src="js/constants.js"></script>
+	<script type="text/javascript" src="js/utils.js"></script>
+	
+	<!-- 实时语音 -->
+	<script type="text/javascript" src="js/lib/custom-recorder.js"></script>
+	<script type="text/javascript" src="js/lib/jquery-hanzi2pinyin.simp.js"></script>
+	<script type="text/javascript" src="js/yuyinContrl.js"></script>
+	
+	<!-- websocket -->
+	<script type="text/javascript" src="js/websocket.js"></script>
+	
+	<!-- 视频播放 -->
+	<script type="text/javascript" src="js/flv.min.js"></script>
+	
+	<script type="text/javascript" src="js/index.js"></script>
+</html>

+ 23 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/constants.js

@@ -0,0 +1,23 @@
+/**
+ * 配置项目请求接口地址
+ */
+var PAGE_VOICE_AIP = "http://localhost:8093";
+var GATEWAY_URL = "http://192.168.0.100:8084";
+
+var PAGE_BASIC = GATEWAY_URL + "/basic";
+var PAGE_THREEAPI = GATEWAY_URL + "/threeapi";
+
+var PAGE_WEBSOCKET = "ws://192.168.0.100:8087";
+var WS_PATH = "ws://localhost:8093/ws/realtime/voice";
+
+/** dpq大屏区   **/
+var AREA_CODE_DPQ = "dpq";
+
+
+var REALTIME_VOICE = {
+	KEYWORDS: [
+		'智慧城管',
+		'zhihuichengguan'
+	]
+};
+

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 8 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/flv.min.js


+ 421 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/index.js

@@ -0,0 +1,421 @@
+//var nvrStep = 0;
+var NVR_CONFIGS = [];
+var NVR_CONFIG_DATA = [];
+var checkIndex = null;
+var playIndex = null;
+var audio = $('#audio')[0];
+var flvPlayer = null;
+
+
+$(function(){
+	
+    myWebsocket.initWebsocket({
+//		type: AREA_CODE,
+		url: PAGE_WEBSOCKET,
+		onmessage: function(data) {
+			if (!data) {
+				return; 
+			}
+			var obj = JSON.parse(data);
+			if(obj.code == AREA_CODE_DPQ){
+				if (obj.direct == "openUrl") {
+					initIframe(obj.url);
+					return;
+				}
+				if (obj.direct == "monitor") {
+					if(obj.operation == 'open'){
+						alertNvrPlayById(obj.content);
+						return;
+					}
+					if(obj.operation == 'close'){
+						alertNvrPlayCloseById(obj.content);
+						return;
+					}
+				}
+				if (obj.direct == "voiceSpeech") {
+					if(obj.operation == 'start'){
+						synthesis(obj.content);
+						return;
+					}
+					if(obj.operation == 'end'){
+						audio.pause();
+						audio.currentTime = 0;
+						return;
+					}
+					if(obj.operation == 'suspend'){
+						audio.pause();
+						return;
+					}
+					if(obj.operation == 'goon'){
+						audio.play();
+						return;
+					}
+				}
+			}
+		}
+	});
+})
+
+/** iframe打开页面 */
+function initIframe(url){
+	$("#iftem").attr("src", url);
+}
+
+/** 播放文字内容 */
+function synthesis(message){
+	/**
+     * 参数
+     * message 文字,最大512
+     * spd 语速,取值0-9,默认为5中语速
+     * pit 音调,取值0-9,默认为5中语调
+     * vol 音量,取值0-15,默认为5中音量(取值为0时为音量最小值,并非为无声)
+     * per 发音人选择, 0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女
+     * @return mp3字节流的base64字符串
+     */
+     post(PAGE_VOICE_AIP + "/aip/synthesis", {	
+		"message" : message,
+		spd: "5",
+		spd: "5",
+		per: "0"
+	},function(data) {
+		playAudio(data);
+	})
+}
+
+// 播放base64音频文件 
+function playAudio(fileData) {
+    audio.src = 'data:audio/wav;base64,' + fileData;
+}
+
+/** 语音转命令执行 */
+function say2ContrlCommit(message, pinyin){
+	if(message.indexOf("打开监控") > -1 || pinyin.indexOf("dakaijiankong") > -1){
+		return {
+			content : "打开监控",
+			event : openNvrListWindow,
+			hasNext : true
+		};
+	}
+	if(message.indexOf("选择监控") > -1 || pinyin.indexOf("xuanzejiankong") > -1){
+		return {
+			content : "选择监控",
+			event : alertNvrPlay,
+			hasNext : true,
+			handle : function(){
+				var m = ChineseToNumber(message);
+				var arr = m.match(/\d+/g);
+				var num = -1;
+				if(arr && arr.length > 0){
+					var num = parseInt(arr.join(''));
+					if(num){
+						return num;
+					}
+				}
+				return -1;
+			}
+		};
+	}
+	if(message.indexOf("取消选择监控") > -1 || pinyin.indexOf("quxiaoxuanzejiankong") > -1){
+		return {
+			content : "取消选择监控",
+			hasNext : false,
+			event : cancelNvrListWindow,
+		};
+	}
+	if(message.indexOf("关闭监控") > -1 || pinyin.indexOf("guanbijiankong") > -1){
+		return {
+			content : "关闭监控",
+			hasNext : true,
+			event : alertNvrPlayClose,
+			handle : function(){
+				var m = ChineseToNumber(message);
+				var arr = m.match(/\d+/g);
+				var num = -1;
+				if(arr && arr.length > 0){
+					var num = parseInt(arr.join(''));
+					if(num){
+						return num;
+					}
+				}
+				return -1;
+			}
+		};
+	}
+	if(message.indexOf("关闭所有监控") > -1 || pinyin.indexOf("guanbisuoyoujiankong") > -1){
+		return {
+			content : "关闭所有监控",
+			hasNext : false,
+			event : alertNvrPlayCloseAll
+		};
+	}
+	return {
+			content : "",
+			hasNext : false
+		};
+}
+
+function ChineseToNumber(chnStr) {
+	var chnNumChar = {
+		零: 0,
+		一: 1,
+		二: 2,
+		三: 3,
+		四: 4,
+		五: 5,
+		六: 6,
+		七: 7,
+		八: 8,
+		九: 9
+	};
+	var str = chnStr.split('');
+	for (var i = 0; i < str.length; i++) {
+		var num = chnNumChar[str[i]];
+		if (typeof num !== 'undefined') {
+			str[i] = num;
+		}
+	}
+	return str.join('');
+}
+
+
+/** 打开监控选择列表 */
+function openNvrListWindow(){
+//	if(nvrStep != 0){
+//		return;
+//	}
+	var params = JSON.stringify({
+		"page" : 1,
+		"limit" : 100
+	});
+	get(PAGE_THREEAPI + '/apiUrl/sendApiUrlAndParam', {
+		"urlCode" : "YW_001", //查询监控列表
+		"params" : params
+	}, function(json){
+		var jsonData = JSON.parse(json);
+		if(jsonData && jsonData.code == 0){
+//			nvrStep = 1;
+			var data = jsonData.data;
+			var content = "";
+			for(var i = 0; i < data.length; i++){
+				content += '选择监控' + (i + 1) + "号(" + data[i].nvrName + ")<br/>";
+				NVR_CONFIGS.push(data[i]);
+			}
+			if(NVR_CONFIGS.length == 0){
+				synthesis("未查询到监控");
+			}else if(NVR_CONFIGS.length == 1){
+				alertNvrPlay(0);
+			}else{
+				checkIndex = layer.open({
+					type: 1,
+					shade:0,
+					tipsMore:true,
+	    			title: ['请选择监控'],
+	    			content: content,
+//	    			btn: ['确定', '取消'],
+	    			btn: []
+//	    			yes: function(index, layero){
+//	    			    alertNvrPlay(0);
+//					},
+//					btn2: function(index, layero){ 
+//					  cancelNvrListWindow();
+//					}
+				});
+			}
+		}else{
+			synthesis("查询监控列表失败");
+		}
+	},function(msg){
+		synthesis("查询监控列表失败");
+	});
+}
+
+/** 取消监控选择列表 */
+function cancelNvrListWindow(){
+//	if(nvrStep != 1){
+//		return;
+//	}
+//	nvrStep = 0;
+	layer.close(checkIndex);
+}
+
+/** 播放监控前查询地址 */
+function alertNvrPlay(num){
+	console.log("alertNvrPlay.num=" + num);
+//	if(nvrStep != 1){
+//		return;
+//	}
+	var i = num - 1;
+	if(i < 0 || i > NVR_CONFIGS.length - 1){
+		synthesis("选择监控失败");
+		return;
+	}
+//	if(checkIndex){
+//		layer.close(checkIndex);
+//	}
+	
+	alertNvrPlayById(NVR_CONFIGS[i].nvrId);
+}
+
+function alertNvrPlayById(nvrId){
+	var nvr_config = {};
+	for(var i = 0; i < NVR_CONFIGS.length; i++){
+		if(NVR_CONFIGS[i].nvrId == nvrId){
+			nvr_config = {
+				nvrId : nvrId,
+				num : i + 1,
+				title : '监控' + (i + 1) + '号'
+			}
+			break;
+		}
+	}
+	var params = JSON.stringify({
+		"nvrId" : nvrId
+	});
+	get(PAGE_THREEAPI + '/apiUrl/sendApiUrlAndParam', {
+		"urlCode" : "YW_002", //打开监控
+		"params" : params
+	}, function(json){
+		var jsonData = JSON.parse(json);
+		if(jsonData && jsonData.result){
+			get(PAGE_THREEAPI + '/apiUrl/sendApiUrlAndParam', {
+				"urlCode" : "YW_003", //查询监控地址
+				"params" : params
+			}, function(json){
+				var jsonData = JSON.parse(json);
+				if(jsonData && jsonData.result){
+//					nvrStep = 2;
+//					synthesis("监控播放成功");
+					videoPlay(jsonData.data,nvr_config);
+				}else{
+					synthesis("监控播放失败");
+				}
+			},function(msg){
+				synthesis("监控播放失败");
+			});
+		}else{
+			synthesis("监控开启失败");
+		}
+	},function(msg){
+		synthesis("监控开启失败");
+	});
+}
+
+function alertNvrPlayClose(num){
+	console.log("alertNvrPlayClose.num=" + num);
+//	if(nvrStep != 2){
+//		return;
+//	}
+	var i2 = num - 1;
+	if(i2 < 0 || i2 > NVR_CONFIG_DATA.length - 1){
+		synthesis("关闭监控失败");
+		return;
+	}
+	for(var i = 0; i < NVR_CONFIG_DATA.length; i++){
+		if(NVR_CONFIG_DATA[i].num == num){
+			alertNvrPlayCloseById(NVR_CONFIG_DATA[i].nvrId);
+			break;
+		}
+	}
+}
+
+function alertNvrPlayCloseAll(){
+	for(var i = 0; i < NVR_CONFIG_DATA.length; i++){
+		alertNvrPlayCloseById(NVR_CONFIG_DATA[i].nvrId);
+	}
+}
+
+/** 关闭播放监控窗口 */
+function alertNvrPlayCloseById(nvrId){
+	var nvr_config = {};
+	for(var i = 0; i < NVR_CONFIG_DATA.length; i++){
+		if(NVR_CONFIG_DATA[i].nvrId == nvrId){
+			NVR_CONFIG_DATA[i].nvrId = null;
+			nvr_config = NVR_CONFIG_DATA[i];
+			break;
+		}
+	}
+	console.log("alertNvrPlayCloseById.playIndex=" + nvr_config.playIndex);
+	var params = JSON.stringify({
+		"nvrId" : nvr_config.nvrId
+	});
+	get(PAGE_THREEAPI + '/apiUrl/sendApiUrlAndParam', {
+		"urlCode" : "YW_004", //查询监控详情
+		"params" : params
+	}, function(json){
+		var jsonData = JSON.parse(json);
+		if(jsonData && jsonData.result){
+			params = JSON.stringify({
+				"nvrId" : jsonData.data.nvrId,
+				"relayId" : jsonData.data.relayId
+			});
+			get(PAGE_THREEAPI + '/apiUrl/sendApiUrlAndParam', {
+				"urlCode" : "YW_005", //关闭监控
+				"params" : params
+			}, function(json){
+				var jsonData = JSON.parse(json);
+				if(jsonData && jsonData.result){
+//					nvrStep = 0;
+//					synthesis("监控关闭成功");
+					flvPlayer = nvr_config.flvPlayer;
+					playIndex = nvr_config.playIndex;
+					layer.close(playIndex);
+					if(flvPlayer){
+						try{
+							flvPlayer.pause();
+							flvPlayer.unload();
+							flvPlayer.detachMediaElement();
+							flvPlayer.destroy();
+							flvPlayer = null;
+						}catch(e){
+							console.log(e);
+						}
+					}
+				}else{
+					synthesis("监控关闭失败");
+				}
+			},function(msg){
+				synthesis("监控关闭失败");
+			});
+		}else{
+			synthesis("监控关闭失败");
+		}
+	},function(msg){
+		synthesis("监控关闭失败");
+	});
+}
+
+/** 播放监控 */
+var numindex = 0;
+function videoPlay(url, nvr_config) {
+	numindex++;
+	playIndex = layer.open({
+		type: 1,
+		shade:0,
+		tipsMore:true,
+		offset: 'rt',
+		title: nvr_config.title,
+		area: ['400px', '275px'],
+		content: '<div class="player layui-none fadeIn animated layui-fluid" id="player'+nvr_config.num+'">'
+			+ '<div class="layui-card">'
+			+ '<div class="layui-card-body">'
+			+ '<video width="400" height="225" class="playerArea" preload="auto"  controls="controls" muted="muted" id="playerEvent_'+nvr_config.num+'_'+numindex+'"></video>'
+			+ '</div>'
+			+ '</div>'
+			+ '</div>',
+		end: function() {
+//			alertNvrPlayClose();
+		}
+	});
+	
+	nvr_config.playIndex = playIndex;
+	var videoElement = document.getElementById('playerEvent_'+nvr_config.num + "_" + numindex);
+	flvPlayer = flvjs.createPlayer({
+		type: 'flv',
+		url: url
+	});
+	flvPlayer.attachMediaElement(videoElement);
+	flvPlayer.load();
+	flvPlayer.play();
+	nvr_config.flvPlayer = flvPlayer;
+	NVR_CONFIG_DATA.push(nvr_config);
+}

+ 239 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/custom-recorder.js

@@ -0,0 +1,239 @@
+(function(window) {
+	var ws;
+	var Recorder = function(stream, config) {
+		config = config || {};
+		config.sampleBits = config.sampleBits || 8;
+		config.sampleRate = config.sampleRate || (44100 / 6);
+		
+		var context = new(window.webkitAudioContext || window.AudioContext)();
+		var audioInput = context.createMediaStreamSource(stream);
+		var createScript = context.createScriptProcessor || context.createJavaScriptNode;
+		var recorder = createScript.apply(context, [4096, 1, 1]);
+
+		var audioData = {
+			size: 0,
+			buffer: [],
+			inputSampleRate: context.sampleRate,
+			inputSampleBits: 16,
+			outputSampleRate: config.sampleRate,
+			oututSampleBits: config.sampleBits,
+			clear: function() {
+				this.buffer = [];
+				this.size = 0;
+			},
+			input: function(data) {
+				this.buffer.push(new Float32Array(data));
+				this.size += data.length;
+			},
+			compress: function() {
+				var data = new Float32Array(this.size);
+				var offset = 0;
+				for (var i = 0; i < this.buffer.length; i++) {
+					data.set(this.buffer[i], offset);
+					offset += this.buffer[i].length;
+				}
+				var compression = parseInt(this.inputSampleRate / this.outputSampleRate);
+				var length = data.length / compression;
+				var result = new Float32Array(length);
+				var index = 0,
+					j = 0;
+				while (index < length) {
+					result[index] = data[j];
+					j += compression;
+					index++;
+				}
+				return result;
+			},
+			encodePCM: function() {
+				var sampleRate = Math.min(this.inputSampleRate, this.outputSampleRate);
+				var sampleBits = Math.min(this.inputSampleBits, this.oututSampleBits);
+				var bytes = this.compress();
+				this.buffer = [];
+				this.size = 0;
+				var dataLength = bytes.length * (sampleBits / 8);
+				var buffer = new ArrayBuffer(44 + dataLength);
+				var data = new DataView(buffer);
+				var channelCount = 1;
+				var offset = 0;
+				var writeString = function(str) {
+					for (var i = 0; i < str.length; i++) {
+						data.setUint8(offset + i, str.charCodeAt(i));
+					}
+				}
+				writeString('RIFF');
+				offset += 4;
+				data.setUint32(offset, 36 + dataLength, true);
+				offset += 4;
+				writeString('WAVE');
+				offset += 4;
+				writeString('fmt ');
+				offset += 4;
+				data.setUint32(offset, 16, true);
+				offset += 4;
+				data.setUint16(offset, 1, true);
+				offset += 2;
+				data.setUint16(offset, channelCount, true);
+				offset += 2;
+				data.setUint32(offset, sampleRate, true);
+				offset += 4;
+				data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true);
+				offset += 4;
+				data.setUint16(offset, channelCount * (sampleBits / 8), true);
+				offset += 2;
+				data.setUint16(offset, sampleBits, true);
+				offset += 2;
+				writeString('data');
+				offset += 4;
+				data.setUint32(offset, dataLength, true);
+				offset += 4;
+				if (sampleBits === 8) {
+					for (var i = 0; i < bytes.length; i++, offset++) {
+						var s = Math.max(-1, Math.min(1, bytes[i]));
+						var val = s < 0 ? s * 0x8000 : s * 0x7FFF;
+						val = parseInt(255 / (65535 / (val + 32768)));
+						data.setInt8(offset, val, true);
+					}
+				} else {
+					for (var i = 0; i < bytes.length; i++, offset += 2) {
+						var s = Math.max(-1, Math.min(1, bytes[i]));
+						data.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
+					}
+				}
+				return new Blob([data], {
+					type: 'audio_pcm/wav'
+				});
+			}
+		};
+
+
+		var sendData = function() {
+			var reader = new FileReader();
+			reader.onload = function(e) {
+				var outbuffer = e.target.result;
+				var arr = new Int8Array(outbuffer);
+				if (arr.length > 0) {
+					var tmparr = new Int8Array(1024);
+					var j = 0;
+					for (var i = 0; i < arr.byteLength; i++) {
+						tmparr[j++] = arr[i];
+						if (((i + 1) % 1024) == 0) {
+							ws.send(tmparr);
+							if (arr.byteLength - i - 1 >= 1024) {
+								tmparr = new Int8Array(1024);
+							} else {
+								tmparr = new Int8Array(arr.byteLength - i - 1);
+							}
+							j = 0;
+						}
+						if ((i + 1 == arr.byteLength) && ((i + 1) % 1024) != 0) {
+							ws.send(tmparr);
+						}
+					}
+				}
+			};
+			reader.readAsArrayBuffer(audioData.encodePCM());
+			audioData.clear();
+		};
+
+		this.start = function() {
+			audioInput.connect(recorder);
+			recorder.connect(context.destination);
+		};
+
+		this.stop = function() {
+			recorder.disconnect();
+		};
+
+		this.getBlob = function() {
+			return audioData.encodePCM();
+		};
+
+		this.clear = function() {
+			audioData.clear();
+		}
+
+		recorder.onaudioprocess = function(e) {
+			var inputBuffer = e.inputBuffer.getChannelData(0);
+			audioData.input(inputBuffer);
+			sendData();
+		}
+	};
+
+	Recorder.throwError = function(message) {
+		throw new function() {
+			this.toString = function() {
+				return message;
+			}
+		}
+	};
+
+	Recorder.canRecording = (navigator.getUserMedia != null);
+	
+	Recorder.useWebSocket = function(recorder, path, callback) {
+		ws = new WebSocket(path);
+		ws.binaryType = 'arraybuffer';
+		ws.onopen = function() {
+			if (ws.readyState == 1) {
+				// recorder.start();
+			}
+		};
+		ws.onerror = function(err) {
+			Recorder.throwError('websocket异常,异常信息:' + err);
+		};
+		ws.onmessage = function(res) {
+			var data = res.data;
+			if (data) {
+				callback(JSON.parse(data));
+			}
+		}
+		return ws;
+	}
+	
+	Recorder.refreshSocket = function(rec, time, path, initback, callback) {
+		setInterval(function() {
+			ws.close();
+			rec.stop();
+			setTimeout(function() {
+				var wss = Recorder.useWebSocket(rec, path, callback);
+				initback(wss);
+			}, 500);
+		}, time);
+	}
+
+	Recorder.get = function(config, initback, callback) {
+		if (!navigator.getUserMedia) {
+			Recorder.throwError('当前浏览器不支持录音功能。');
+			return;
+		}
+		navigator.getUserMedia({
+			audio: true
+		}, function(stream) {
+			var rec = new Recorder(stream, config);
+			var wss = Recorder.useWebSocket(rec, config.wsPath, callback);
+			console.log(wss)
+			initback(rec, wss);
+		}, function(error) {
+			console.log(error)
+			switch (error.code || error.name) {
+				case 'PERMISSION_DENIED':
+				case 'PermissionDeniedError':
+					Recorder.throwError('用户拒绝提供信息。');
+					break;
+				case 'NOT_SUPPORTED_ERROR':
+				case 'NotSupportedError':
+					Recorder.throwError('浏览器不支持硬件设备。');
+					break;
+				case 'MANDATORY_UNSATISFIED_ERROR':
+				case 'MandatoryUnsatisfiedError':
+					Recorder.throwError('无法发现指定的硬件设备。');
+					break;
+				default:
+					Recorder.throwError('无法打开麦克风。异常信息:' + (error.code || error.name));
+					break;
+			}
+		});
+	};
+
+	window.Recorder = Recorder;
+	window.websocketAsr = ws;
+})(window);

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 17 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/jquery-hanzi2pinyin.simp.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/jquery.min.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/layer.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/mobile/layer.js


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/mobile/need/layer.css


binární
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/icon-ext.png


binární
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/icon.png


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/layer.css


binární
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/loading-0.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/loading-1.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/js/lib/layer/theme/default/loading-2.gif


+ 63 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/utils.js

@@ -0,0 +1,63 @@
+
+Date.prototype.format = function(fmt) {
+	var o = {
+		"M+": this.getMonth() + 1, //月份
+		"d+": this.getDate(), //日
+		"h+": this.getHours(), //小时
+		"m+": this.getMinutes(), //分
+		"s+": this.getSeconds(), //秒
+		"q+": Math.floor((this.getMonth() + 3) / 3), //季度
+		"S": this.getMilliseconds() //毫秒
+	};
+	if (/(y+)/.test(fmt)) {
+		fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
+	}
+	for (var k in o) {
+		if (new RegExp("(" + k + ")").test(fmt)) {
+			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k])
+				.length)));
+		}
+	}
+	return fmt;
+}
+
+
+// 请求函数
+function get(url, data, success,error) {
+	return request(url, 'GET', data, success,error)
+}
+
+function post(url, data, success,error) {
+	return request(url, 'POST', data, success,error)
+}
+
+function request(url, type, data, success,error) {
+	var datas = null;
+	$.ajax({
+		type: type,
+		async : false,
+		url: url,
+		dataType: 'json',
+		data: data,
+		success: function(json) {
+			console.log(json);
+			if(json.result){
+				if(success){
+					success(json.data);
+				}
+				datas = json.data;
+				return ;
+			}
+			if(error){
+				error(json.msg);
+			}
+		},
+		error: function(msg) {
+			console.log(msg);
+			if(error){
+				error(msg);
+			}
+		}
+	});
+	return datas;
+}

+ 181 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/websocket.js

@@ -0,0 +1,181 @@
+var myWebsocket = {
+	websocket : null,
+	clientPrefix : "",
+	clientId : "",
+	default : {
+		type : "",
+		url : "",
+		onmessage : null,
+		//将消息显示在网页上
+		setConsoleOut : function setConsoleOut(innerHTML) {
+			console.log(innerHTML);
+		}
+		
+	},
+	initWebsocket : function(data){
+		var type = "";
+		var setConsoleOut = null;
+		var url = "";
+		if(!data){
+			alert("url is empty");
+			return;
+		}
+		type = data.type ? data.type + "_" : myWebsocket.default.type;
+		if(data.onmessage){
+			myWebsocket.default.onmessage = data.onmessage;
+		}
+		myWebsocket.clientPrefix = "client_" + type;
+		sessionStorage.clientPrefix = myWebsocket.clientPrefix;
+		myWebsocket.clientId = myWebsocket.clientPrefix + Math.uuid().replace(/-/g,"");
+		sessionStorage.clientId = myWebsocket.clientId;
+		if(!data.url){
+	    	alert("url is empty");
+			return;
+		}
+		url = data.url + "/socketServer/" + myWebsocket.clientId;
+		setConsoleOut = data.setConsoleOut ? data.setConsoleOut : myWebsocket.default.setConsoleOut;
+		
+		//判断当前浏览器是否支持WebSocket, 主要此处要更换为自己的地址
+	    if ('WebSocket' in window) {
+	        setConsoleOut(url);
+	        myWebsocket.websocket = new WebSocket(url);
+	    } else {
+	        setConsoleOut('Not support websocket');
+	    }
+	
+	    //连接发生错误的回调方法
+	    myWebsocket.websocket.onerror = function() {
+	        setConsoleOut("error");
+	    };
+	
+	    //连接成功建立的回调方法
+	    myWebsocket.websocket.onopen = function(event) {
+	        setConsoleOut("open");
+	    }
+	
+	    //接收到消息的回调方法
+	    myWebsocket.websocket.onmessage = function(event) {
+	        setConsoleOut(event.data);
+	        if(myWebsocket.default.onmessage){
+				myWebsocket.default.onmessage(event.data);
+			}
+	    }
+	
+	    //连接关闭的回调方法
+	    myWebsocket.websocket.onclose = function() {
+	        setConsoleOut("close");
+	    }
+	
+	    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
+	    window.onbeforeunload = function() {
+	        if(myWebsocket.websocket){
+			    myWebsocket.websocket.close();
+			}
+	    }
+	},
+	sendWebsocket : function(message) {
+		if(myWebsocket.websocket){
+			console.log(message);
+	    	myWebsocket.websocket.send(message);
+		}
+	},
+	closeWebSocket : function () {
+		if(myWebsocket.websocket){
+		    myWebsocket.websocket.close();
+		}
+	}
+};
+
+
+/*!
+Math.uuid.js (v1.4)
+http://www.broofa.com
+mailto:robert@broofa.com
+
+Copyright (c) 2010 Robert Kieffer
+Dual licensed under the MIT and GPL licenses.
+*/
+
+/*
+ * Generate a random uuid.
+ *
+ * USAGE: Math.uuid(length, radix)
+ *   length - the desired number of characters
+ *   radix  - the number of allowable values for each character.
+ *
+ * EXAMPLES:
+ *   // No arguments  - returns RFC4122, version 4 ID
+ *   >>> Math.uuid()
+ *   "92329D39-6F5C-4520-ABFC-AAB64544E172"
+ *
+ *   // One argument - returns ID of the specified length
+ *   >>> Math.uuid(15)     // 15 character ID (default base=62)
+ *   "VcydxgltxrVZSTV"
+ *
+ *   // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62)
+ *   >>> Math.uuid(8, 2)  // 8 character ID (base=2)
+ *   "01001010"
+ *   >>> Math.uuid(8, 10) // 8 character ID (base=10)
+ *   "47473046"
+ *   >>> Math.uuid(8, 16) // 8 character ID (base=16)
+ *   "098F4D35"
+ */
+(function() {
+  // Private array of chars to use
+  var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
+
+  Math.uuid = function (len, radix) {
+    var chars = CHARS, uuid = [], i;
+    radix = radix || chars.length;
+
+    if (len) {
+      // Compact form
+      for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
+    } else {
+      // rfc4122, version 4 form
+      var r;
+
+      // rfc4122 requires these characters
+      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
+      uuid[14] = '4';
+
+      // Fill in random data.  At i==19 set the high bits of clock sequence as
+      // per rfc4122, sec. 4.1.5
+      for (i = 0; i < 36; i++) {
+        if (!uuid[i]) {
+          r = 0 | Math.random()*16;
+          uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
+        }
+      }
+    }
+
+    return uuid.join('');
+  };
+
+  // A more performant, but slightly bulkier, RFC4122v4 solution.  We boost performance
+  // by minimizing calls to random()
+  Math.uuidFast = function() {
+    var chars = CHARS, uuid = new Array(36), rnd=0, r;
+    for (var i = 0; i < 36; i++) {
+      if (i==8 || i==13 ||  i==18 || i==23) {
+        uuid[i] = '-';
+      } else if (i==14) {
+        uuid[i] = '4';
+      } else {
+        if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0;
+        r = rnd & 0xf;
+        rnd = rnd >> 4;
+        uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
+      }
+    }
+    return uuid.join('');
+  };
+
+  // A more compact, but less performant, RFC4122v4 solution:
+  Math.uuidCompact = function() {
+    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+      var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
+      return v.toString(16);
+    });
+  };
+})();

+ 128 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/js/yuyinContrl.js

@@ -0,0 +1,128 @@
+var voiceSign = false;
+var msgIndex;
+var speechTimeOut;
+var recorder;
+var awakenSign = 0;
+var webSocketWs;
+$(function() {
+	initRecorder();
+});
+
+function initRecorder() {
+	Recorder.get({
+		wsPath: WS_PATH,
+		sampleBits: 16,
+		sampleRate: 16000
+	}, function(rec, ws) {
+		recorder = rec;
+		webSocketWs = ws;
+		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '语音唤醒功能已启动,唤醒词为:', REALTIME_VOICE.KEYWORDS);
+		
+		Recorder.refreshSocket(rec, 1000*60*58, WS_PATH, function(ws) {
+			console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '连接已重置');
+			webSocketWs = ws;
+		}, function(data) {
+			discern(data);
+		});
+	}, function(data) {
+		discern(data);
+	});
+}
+
+/**
+ * 识别语音
+ * @param {Object} data
+ */
+function discern(data) {
+	console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '接收消息:', data);
+	if (data.type == 'awaken' && awakenSign == 0) {
+		webSocketWs.send("start");
+		recorder.start();
+		awakenSign = 1;
+		initMsg('我在,请说出语音指令');
+		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '开始监听命令,20s后停止监听');
+//		speechTimeOut = setTimeout(function() {
+//			webSocketWs.send("stop");
+//			recorder.stop();
+//			awakenSign = 0;
+//			layer.close(msgIndex);
+//			console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '停止监听命令');
+//		}, 20 * 1000);
+	} else if (awakenSign == 1 && data.type == 'asr') {
+		
+		if (data.data.type == 'FIN_TEXT') {
+			mateRouse(data.data.result);
+		} else if (data.data.type == 'MID_TEXT') {
+			if (msgIndex) {
+				initMsg(data.data.result);
+			}
+		}
+	}
+}
+
+function restartAsr(){
+	webSocketWs.send("start");
+	recorder.start();
+	awakenSign = 1;
+	console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '开始监听命令,20s后停止监听');
+//	speechTimeOut = setTimeout(function() {
+//		webSocketWs.send("stop");
+//		recorder.stop();
+//		awakenSign = 0;
+//		layer.close(msgIndex);
+//		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '停止监听命令');
+//	}, 20 * 1000);
+}
+
+function initMsg(msg) {
+	if(msgIndex){
+		layer.close(msgIndex);
+	}
+	msgIndex = layer.msg(msg, {
+		shade: 0,
+		time: 0,
+		end: function() {
+			msgIndex = null;
+		}
+	});
+}
+
+function removeSpecialCharts(str) {
+	return str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?|,|。|?|!]/g,"");
+}
+
+function mateRouse(str) {
+	layer.close(msgIndex);
+	console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '识别文本:', str);
+	str = removeSpecialCharts(str);
+	var pinyin = str.hanzi2pinyin({hyphen:''});
+	// 识别指令
+	var commit = say2ContrlCommit(str, pinyin);
+	if (commit.content) {
+//		$('.layui-layer-content').text('指令识别成功,正在执行中...');
+//		layer.msg('指令识别成功,正在执行中...');
+		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '指令识别成功');
+		clearTimeout(speechTimeOut);
+		webSocketWs.send("stop");
+		recorder.stop();
+		awakenSign = 0;
+		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '识别到指令,停止监听命令');
+		setTimeout(function() {
+			layer.close(msgIndex);
+			if(commit.event){
+				if(commit.handle){
+					commit.event(commit.handle());
+				}else{
+					commit.event();
+				}
+				if(commit.hasNext){
+					restartAsr();
+				}
+			}
+		}, 1000)
+	} else {
+//		$('.layui-layer-content').text('指令识别失败');
+		layer.msg('指令识别失败');
+		console.info(new Date().format("yyyy-MM-dd hh:mm:ss"), '指令识别失败');
+	}
+}

+ 147 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/inputTags.css

@@ -0,0 +1,147 @@
+/*
+* @Author: layui-2
+* @Date:   2018-08-31 11:40:53
+* @Last Modified by:   xuzhiwen
+* @Last Modified time: 2018-09-07 15:26:19
+*/
+em{
+  font-style: normal;
+}
+#tags
+{
+    width: 406px;
+    margin: 40px auto;
+    padding: 10px;
+
+    color: #777;
+    border: 1px solid #d5d5d5;
+    background-color: #fff;
+}
+
+#tags span{
+    font-size: 12px;
+    font-weight: normal;
+    line-height: 16px;
+    position: relative;
+    display: inline-block;
+    height: 16px;
+    margin-right: 3px;
+    margin-bottom: 3px;
+    padding: 4px 22px 5px 9px;
+    cursor: pointer;
+    transition: all .2s ease 0s;
+    vertical-align: baseline;
+    white-space: nowrap;
+    color: #fff;
+    background-color: #009688;
+    text-shadow: 1px 1px 1px rgba(0, 0, 0, .15);
+}
+#tags .close{
+    font-size: 12px;
+    font-weight: bold;
+    line-height: 20px;
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    float: none;
+    width: 18px;
+    padding: 0;
+    cursor: pointer;
+    text-align: center;
+    opacity: 1;
+    color: #fff;
+    border: 0 none;
+    background: transparent none repeat scroll 0 0;
+    text-shadow: none;
+}
+#tags .close:hover{
+  background: #ffb800;
+}
+#inputTags[type='text'],
+#inputTags[type='text']:focus{
+    line-height: 25px;
+    display: inline;
+    width: 150px;
+    margin: 0;
+    padding: 0 6px;
+    border: 0 none;
+    outline: 0 none;
+    box-shadow: none;
+}
+
+#tags_outport
+{
+    width: 406px;
+    margin: 40px auto;
+    padding: 10px;
+
+    color: #777;
+    border: 1px solid #d5d5d5;
+    background-color: #fff;
+}
+
+#tags_outport span{
+    font-size: 12px;
+    font-weight: normal;
+    line-height: 16px;
+    position: relative;
+    display: inline-block;
+    height: 16px;
+    margin-right: 3px;
+    margin-bottom: 3px;
+    padding: 4px 22px 5px 9px;
+    cursor: pointer;
+    transition: all .2s ease 0s;
+    vertical-align: baseline;
+    white-space: nowrap;
+    color: #fff;
+    background-color: #009688;
+    text-shadow: 1px 1px 1px rgba(0, 0, 0, .15);
+}
+#tags_outport .close{
+    font-size: 12px;
+    font-weight: bold;
+    line-height: 20px;
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    float: none;
+    width: 18px;
+    padding: 0;
+    cursor: pointer;
+    text-align: center;
+    opacity: 1;
+    color: #fff;
+    border: 0 none;
+    background: transparent none repeat scroll 0 0;
+    text-shadow: none;
+}
+#tags_outport .close:hover{
+  background: #ffb800;
+}
+
+#outportTags[type='text'],
+#outportTags[type='text']:focus{
+    line-height: 25px;
+    display: inline;
+    width: 150px;
+    margin: 0;
+    padding: 0 6px;
+    border: 0 none;
+    outline: 0 none;
+    box-shadow: none;
+}
+
+.albtn{
+    line-height: 30px;
+    display: block;
+    width: 100px;
+    height: 30px;
+    margin: 0 auto;
+    cursor: pointer;
+    text-align: center;
+    color: #fff;
+    background: #ffb800;
+}

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/layui.css


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/layui.mobile.css


+ 2 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/code.css

@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/laydate/default/laydate.css


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/icon-ext.png


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/icon.png


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/layer.css


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/loading-0.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/loading-1.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/css/modules/layer/default/loading-2.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/font/iconfont.eot


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 25 - 0
spring-cloud/server-page/src/main/resources/static/dldp2/layui/font/iconfont.svg


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/font/iconfont.ttf


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/font/iconfont.woff


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/font/iconfont.woff2


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/0.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/1.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/10.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/11.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/12.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/13.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/14.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/15.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/16.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/17.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/18.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/19.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/2.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/20.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/21.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/22.gif


binární
spring-cloud/server-page/src/main/resources/static/dldp2/layui/images/face/23.gif


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů