Browse Source

阶段性提交

soft5566 3 years ago
parent
commit
13228d9110

+ 2 - 7
pom.xml

@@ -5,7 +5,7 @@
 	<parent>
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.7.8</version>
+		<version>2.7.13</version>
 		<relativePath/> <!-- lookup parent from repository -->
 	</parent>
 	<groupId>com.ch</groupId>
@@ -56,11 +56,6 @@
 			<version>4.9.1</version>
 		</dependency>
 		<dependency>
-			<groupId>com.google.code.gson</groupId>
-			<artifactId>gson</artifactId>
-			<version>2.8.7</version>
-		</dependency>
-		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-devtools</artifactId>
 			<scope>runtime</scope>
@@ -84,7 +79,7 @@
 	</dependencies>
 
 	<build>
-		<finalName>jiaoxuelou_houtai</finalName>
+		<finalName>LargeScreenOfTeachingBuilding</finalName>
 		<plugins>
 			<plugin>
 				<groupId>org.springframework.boot</groupId>

+ 63 - 20
src/main/java/com/ch/jiaoxuelou_houtai/controller/VideoController.java

@@ -1,10 +1,11 @@
 package com.ch.jiaoxuelou_houtai.controller;
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.ch.jiaoxuelou_houtai.core.ResponseResult;
 import com.ch.jiaoxuelou_houtai.service.VideoService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpHeaders;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.TreeMap;
 
 @RestController
 @RequestMapping("/video")
@@ -67,23 +69,58 @@ public class VideoController {
         Map<String, String> headers = new HashMap<>();
         headers.put("Content-Type", "application/json");
         headers.put("admin_token", admin_token);
+
+        // 每页显示的视频数量
+        int pageSize = jsonObject.getInteger("pageSize");
+        // 当前页
+        int curPage = jsonObject.getInteger("curPage");
         // 设置请求参数
         JSONObject jsonParams = new JSONObject();
-        jsonParams.put("regularExpression", "^[A|B|C]{1}[0-9]{3}.*");
-        jsonParams.put("curPage", jsonObject.getString("curPage"));
-        jsonParams.put("pageSize", jsonObject.getString("pageSize"));
+        // 阶梯教室、只有单个摄像头的教室都过滤了
+        jsonParams.put("regularExpression", "^(?!C109|B107|B108|A109|B307)[ABC][0-9]{3}.*");
+        jsonParams.put("curPage", curPage);
+        jsonParams.put("pageSize", pageSize * 2); // 每页显示的视频数量 * 2,大屏上一个教室对应2个摄像头
         jsonParams.put("orderField", "installation_site");
         jsonParams.put("order", "asc");
         // 视频列表接口URL
         String url = baseUrl + "/camera/list";
         // 调用方法
         JSONObject videoList = videoService.getVideoList(url, jsonParams.toString(), headers);
+        Map<String, JSONArray> map = new TreeMap<>();
+        JSONArray jsonArray = new JSONArray();
+        if (videoList.getBoolean("success")) {
+            // 从JSONObject中提取"data"数组
+            JSONArray dataArray = videoList.getJSONArray("data");
+            // 遍历"data"数组并提取每个对象的数据
+            for (int i = 0; i < dataArray.size(); i++) {
+                JSONObject dataObject = dataArray.getJSONObject(i);
+                // 提取具体的数据字段:教室摄像头名称,比如A101前
+                String room = dataObject.getString("installationSite").substring(0, 4);
+                jsonArray.add(dataObject);
+                if (jsonArray.size() == 2) {
+                    map.put(room, JSON.parseObject(jsonArray.toString(), JSONArray.class));
+                    jsonArray.clear();
+                }
+            }
+        }
+
         // 判断视频列表是否为空
-        if (videoList.isEmpty()) {
-            return ResponseResult.failed("获取教室列表失败!");
+        if (map.isEmpty()) {
+            return ResponseResult.failed("获取教室列表为空!");
         }
 
-        return ResponseResult.success(videoList);
+        Map<String, Object> returnData = new HashMap<>();
+        returnData.put("totalCount", 110);
+        returnData.put("currPage", curPage);
+        returnData.put("pageSize", pageSize);
+        if ((110 % pageSize) > 0)
+            returnData.put("totalPage", 110 / pageSize + 1);
+        else
+            returnData.put("totalPage", 110 / pageSize);
+
+        returnData.put("list", map);
+
+        return ResponseResult.success(returnData);
     }
 
     /**
@@ -115,6 +152,7 @@ public class VideoController {
 
     /**
      * 获取空调总数和在线数
+     *
      * @return
      */
     private Map<String, String> getAirUsage() {
@@ -145,6 +183,7 @@ public class VideoController {
 
     /**
      * 电脑使用情况
+     *
      * @return
      */
     private Map<String, String> getComputerUsage() {
@@ -167,6 +206,7 @@ public class VideoController {
 
     /**
      * 摄像头使用情况
+     *
      * @return
      */
     private Map<String, String> getProjectorUsage() {
@@ -189,6 +229,7 @@ public class VideoController {
 
     /**
      * 设备使用情况
+     *
      * @return
      */
     @RequestMapping(value = "/getEquipmentUsage", method = RequestMethod.POST)
@@ -206,23 +247,25 @@ public class VideoController {
 
     /**
      * 空调状况分析
+     *
      * @return
      */
     @RequestMapping(value = "/getAirConditionAnalysis", method = RequestMethod.POST)
     public ResponseResult airConditionAnalysis() {
-        // 数量
-        int num_of_online = 200;
-        int num_of_offline = 100;
-        int num_of_alarms = 20;
-        int total_equipment = num_of_online + num_of_alarms + num_of_offline;
-
-        Map<String, String> map = new HashMap<>();
-        map.put("num_of_online", String.valueOf(num_of_online));
-        map.put("num_of_offline", String.valueOf(num_of_offline));
-        map.put("num_of_alarms", String.valueOf(num_of_alarms));
-        map.put("total_equipment", String.valueOf(total_equipment));
-
-        return ResponseResult.success(map);
+        // 接口URL
+        String url = "https://chtech.ncjti.edu.cn/air-conditioner-control/airManage/firstnormal_t.action";
+        // 请求头
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Admin-Name", "admin");
+        headers.put("X-Token", "admin_token");
+        // 调用方法
+        JSONObject airConditionAnalysis = videoService.getAirConditionAnalysis(url, headers);
+        // 判断是否为空
+        if (airConditionAnalysis.isEmpty()) {
+            return ResponseResult.failed("获取教室列表失败!");
+        }
+
+        return ResponseResult.success(airConditionAnalysis.getJSONArray("data"));
     }
 
     /**

+ 20 - 4
src/main/java/com/ch/jiaoxuelou_houtai/core/ResponseResult.java

@@ -47,11 +47,27 @@ public class ResponseResult implements Serializable {
 	}
 
 	// NOT_AUTHORIZED_EXCEPTION
-	public static ResponseResult noAccess() {
+	public static ResponseResult noTokenAccess() {
 		return ResponseResult.builder()
-				.status(ResponseStatus.NOT_AUTHORIZED_EXCEPTION.valueEn)
-				.msg(ResponseStatus.NOT_AUTHORIZED_EXCEPTION.valueZh)
-				.code(ResponseStatus.NOT_AUTHORIZED_EXCEPTION.bCode)
+				.status(ResponseStatus.NOT_TOKEN_AUTHORIZED_EXCEPTION.valueEn)
+				.msg(ResponseStatus.NOT_TOKEN_AUTHORIZED_EXCEPTION.valueZh)
+				.code(ResponseStatus.NOT_TOKEN_AUTHORIZED_EXCEPTION.bCode)
+				.build();
+	}
+
+	public static ResponseResult expiredTokenAccess() {
+		return ResponseResult.builder()
+				.status(ResponseStatus.EXPIRED_TOKEN_EXCEPTION.valueEn)
+				.msg(ResponseStatus.EXPIRED_TOKEN_EXCEPTION.valueZh)
+				.code(ResponseStatus.EXPIRED_TOKEN_EXCEPTION.bCode)
+				.build();
+	}
+
+	public static ResponseResult invalidTokenAccess() {
+		return ResponseResult.builder()
+				.status(ResponseStatus.INVALID_TOKEN_EXCEPTION.valueEn)
+				.msg(ResponseStatus.INVALID_TOKEN_EXCEPTION.valueZh)
+				.code(ResponseStatus.INVALID_TOKEN_EXCEPTION.bCode)
 				.build();
 	}
 }

+ 11 - 1
src/main/java/com/ch/jiaoxuelou_houtai/core/ResponseStatus.java

@@ -85,7 +85,17 @@ public enum ResponseStatus {
 	/**
 	 * 无授权访问,请先登录
 	 */
-	NOT_AUTHORIZED_EXCEPTION(401, 401, "no", "无授权访问,请先登录", "无授权访问,请先登录"),
+	NOT_TOKEN_AUTHORIZED_EXCEPTION(401, 401, "no", "无授权访问,请先登录", "无授权访问,请先登录"),
+
+	/**
+	 * token过期,请从新登录
+	 */
+	EXPIRED_TOKEN_EXCEPTION(401, 401, "no", "token过期,请从新登录", "token过期,请从新登录"),
+
+	/**
+	 * token无效,请从新登录
+	 */
+	INVALID_TOKEN_EXCEPTION(401, 401, "no", "token无效,请从新登录", "token无效,请从新登录"),
 
 	/**
 	 * 类型不匹配异常

+ 23 - 8
src/main/java/com/ch/jiaoxuelou_houtai/core/interceptor/JwtInterceptor.java

@@ -1,18 +1,17 @@
 package com.ch.jiaoxuelou_houtai.core.interceptor;
 
+import com.alibaba.fastjson2.JSON;
 import com.ch.jiaoxuelou_houtai.core.ResponseResult;
 import com.ch.jiaoxuelou_houtai.entity.User;
 import com.ch.jiaoxuelou_houtai.util.JwtUtil;
-import com.google.gson.Gson;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerInterceptor;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.HashMap;
+
 
 @Component
 public class JwtInterceptor implements HandlerInterceptor {
@@ -22,11 +21,29 @@ public class JwtInterceptor implements HandlerInterceptor {
 
     @Override
     public boolean preHandle(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) throws Exception {
+        // 获取token
         String authHeader = request.getHeader("token");
+        // 不为null 并且有指定的前缀
         if (authHeader != null && authHeader.startsWith("CHUANGHAI ")) {
+            // 去除前缀
             String token = authHeader.substring(10);
+            // 从token获取用户名
+            String usernameFromToken = jwtUtil.getUsernameFromToken(token);
+            // 如果为空,响应客户端token无效,并返回false
+            if ("".equals(usernameFromToken)) {
+                response.setCharacterEncoding("UTF-8");
+                response.setContentType("application/json");
+
+                String json = JSON.toJSONString(ResponseResult.invalidTokenAccess());
+
+                response.getWriter().write(json);
+
+                return false;
+            }
             User user = new User();
-            user.setUsername(jwtUtil.getUsernameFromToken(token));
+            // 否则,设置用户名
+            user.setUsername(usernameFromToken);
+            // 验证token
             if (jwtUtil.validateToken(token, user)) {
                 return true;
             } else {
@@ -34,8 +51,7 @@ public class JwtInterceptor implements HandlerInterceptor {
                 response.setCharacterEncoding("UTF-8");
                 response.setContentType("application/json");
 
-                Gson gson = new Gson();
-                String json = gson.toJson(ResponseResult.noAccess());
+                String json = JSON.toJSONString(ResponseResult.expiredTokenAccess());
 
                 response.getWriter().write(json);
                 return false;
@@ -45,8 +61,7 @@ public class JwtInterceptor implements HandlerInterceptor {
             response.setCharacterEncoding("UTF-8");
             response.setContentType("application/json");
 
-            Gson gson = new Gson();
-            String json = gson.toJson(ResponseResult.noAccess());
+            String json = JSON.toJSONString(ResponseResult.noTokenAccess());
 
             response.getWriter().write(json);
             return false;

+ 2 - 0
src/main/java/com/ch/jiaoxuelou_houtai/service/VideoService.java

@@ -17,4 +17,6 @@ public interface VideoService {
     JSONObject getAirOverTime(String url, Map<String, String> formData, Map<String, String> headers);
 
     JSONObject getAirRealTime(String url, Map<String, String> headers);
+
+    JSONObject getAirConditionAnalysis(String url, Map<String, String> headers);
 }

+ 9 - 0
src/main/java/com/ch/jiaoxuelou_houtai/service/impl/VideoServiceImpl.java

@@ -73,6 +73,15 @@ public class VideoServiceImpl implements VideoService {
         return JSONObject.parse(s);
     }
 
+    @Override
+    public JSONObject getAirConditionAnalysis(String url, Map<String, String> headers) {
+        // 调用封装的方法,发送http  post请求
+        OkHttpUtils okHttpUtils = new OkHttpUtils();
+        String s = okHttpUtils.post(url, headers);
+        // 返回json数据
+        return JSONObject.parse(s);
+    }
+
     /**
      * 拉流,获取视频流地址
      *

+ 21 - 12
src/main/java/com/ch/jiaoxuelou_houtai/util/JwtUtil.java

@@ -1,6 +1,7 @@
 package com.ch.jiaoxuelou_houtai.util;
 
 import com.ch.jiaoxuelou_houtai.entity.User;
+import io.jsonwebtoken.ExpiredJwtException;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import org.springframework.stereotype.Component;
@@ -13,7 +14,7 @@ public class JwtUtil {
 
     public String generateToken(String username) {
         Date now = new Date();
-        Date expiryDate = new Date(now.getTime() + 3600000 * 24); // 7天
+        Date expiryDate = new Date(now.getTime() + 1000 * 60 * 60 * 24 * 7); // token期限
         String token = Jwts.builder()
                 .setSubject(username)
                 .setIssuedAt(now)
@@ -25,11 +26,15 @@ public class JwtUtil {
     }
 
     public String getUsernameFromToken(String token) {
-        return Jwts.parser()
-                .setSigningKey(secret)
-                .parseClaimsJws(token)
-                .getBody()
-                .getSubject();
+        try {
+            return Jwts.parser()
+                    .setSigningKey(secret)
+                    .parseClaimsJws(token)
+                    .getBody()
+                    .getSubject();
+        } catch (ExpiredJwtException e) {
+            return "";
+        }
     }
 
     public boolean validateToken(String token, User user) {
@@ -38,11 +43,15 @@ public class JwtUtil {
     }
 
     private boolean isTokenExpired(String token) {
-        Date expiryDate = Jwts.parser()
-                .setSigningKey(secret)
-                .parseClaimsJws(token)
-                .getBody()
-                .getExpiration();
-        return expiryDate.before(new Date());
+        try {
+            Date expiryDate = Jwts.parser()
+                    .setSigningKey(secret)
+                    .parseClaimsJws(token)
+                    .getBody()
+                    .getExpiration();
+            return expiryDate.before(new Date());
+        } catch (ExpiredJwtException e) {
+            return false;
+        }
     }
 }

+ 6 - 5
src/main/resources/application.yml

@@ -7,11 +7,12 @@ server:
 
 spring:
   datasource:
-#    username: root
-#    password: 123456
-    username: memdb
-    password: 6RHZJYjrT83Ri88C
-    url: jdbc:mysql://172.16.20.77:3306/memdb?allowPublicKeyRetrieval=true&useSSL=false&connectTimeout=10000&socketTimeout=10000&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+    username: root
+    password: 123456
+#    url: jdbc:mysql://172.16.20.77:3306/memdb?allowPublicKeyRetrieval=true&useSSL=false&connectTimeout=10000&socketTimeout=10000&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
+#    username: memdb
+#    password: 6RHZJYjrT83Ri88C
+    url: jdbc:mysql://localhost:3306/memdb?allowPublicKeyRetrieval=true&useSSL=false&connectTimeout=10000&socketTimeout=10000&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
     driver-class-name: com.mysql.cj.jdbc.Driver
     #spring官方推荐 性能最强,没有之一
     hikari: