diff --git a/.idea/compiler.xml b/.idea/compiler.xml index d7e145d..094edb7 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -2,6 +2,7 @@ + @@ -10,4 +11,9 @@ + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index a022880..1dc68e5 100644 --- a/pom.xml +++ b/pom.xml @@ -2,71 +2,276 @@ 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.1.0 + + + + + + + com.gary - exercise + exercise-vision 0.0.1-SNAPSHOT - exercise - exercise + 体育直播可视化系统 + jar + + + + - 1.8 - UTF-8 - UTF-8 - 2.6.13 + 17 + 0.11.5 + 6.0.0 + + org.springframework.boot - spring-boot-starter + spring-boot-starter-web + + + + + org.apache.poi + poi-ooxml + 5.2.3 + + + org.apache.poi + poi + 5.2.3 + + org.springframework + spring-test + ${spring.version} + test + + + + + commons-fileupload + commons-fileupload + 1.4 + + + commons-io + commons-io + 2.11.0 + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + + org.springframework.boot + spring-boot-starter-mail + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + com.baomidou + mybatis-plus-spring-boot3-starter + 3.5.7 + + + + + mysql + mysql-connector-java + 8.0.28 + + + + + + org.apache.pdfbox + pdfbox + 2.0.28 + + + + + io.jsonwebtoken + jjwt-api + ${jjwt.version} + + + io.jsonwebtoken + jjwt-impl + ${jjwt.version} + runtime + + + io.jsonwebtoken + jjwt-jackson + ${jjwt.version} + runtime + + + + + org.projectlombok + lombok + 1.18.34 + provided + + + org.springframework.boot spring-boot-starter-test test + + org.springframework.boot + spring-boot-testcontainers + test + + + org.springframework.restdocs + spring-restdocs-mockmvc + test + + + org.testcontainers + junit-jupiter + test + + + org.testcontainers + mssqlserver + test + + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.2.0 + + + + + com.baidubce + qianfan + 0.1.0 + + + com.sun.mail + javax.mail + 1.6.2 + + + org.hibernate + hibernate-validator + 8.0.0.Final + + + org.modelmapper + modelmapper + 3.1.1 + + + com.github.chrislusf + seaweedfs-client + 3.55 + + + io.minio + minio + 8.5.5 + + + com.aliyun + dysmsapi20170525 + 3.0.0 + + + com.aliyun + aliyun-java-sdk-core + 4.5.0 + + + com.aliyun + aliyun-java-sdk-dysmsapi + 2.0.0 + + + com.aliyun + dysmsapi20170525 + 3.0.0 + + + + + + com.alibaba + fastjson + 1.2.78 + + + + com.aliyun + aliyun-java-sdk-core + 3.2.6 + + + com.aliyun + aliyun-java-sdk-dysmsapi + 1.0.0 + + + + org.apache.poi + poi + 5.2.3 + + + org.apache.poi + poi-ooxml + 5.2.3 + + + + cn.hutool + hutool-all + 5.7.17 + + + + + org.apache.tomcat.embed + tomcat-embed-core + 10.1.26 + + + org.springframework.boot + spring-boot-starter-websocket + - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 1.8 - 1.8 - UTF-8 - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - com.gary.exercise.ExerciseApplication - true - - - - repackage - - repackage - - - - + + - diff --git a/src/main/java/com/gary/exercise/config/WebSocketConfig.java b/src/main/java/com/gary/exercise/config/WebSocketConfig.java index 091cf0c..5c5daa1 100644 --- a/src/main/java/com/gary/exercise/config/WebSocketConfig.java +++ b/src/main/java/com/gary/exercise/config/WebSocketConfig.java @@ -1,4 +1,20 @@ package com.gary.exercise.config; +import com.gary.exercise.socket.ExerciseWebSocketHandler; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +/** + *配置类 引入websocket的处理器 + */ +@Configuration +@EnableWebSocket +public class WebSocketConfig implements WebSocketConfigurer { -public class WebSocketConfig { + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + // 注册 WebSocket 的处理器 + registry.addHandler(new ExerciseWebSocketHandler(), "/exercise") // 定义路径 /exercise + .setAllowedOrigins("*"); // 设置允许的跨域请求 + } } diff --git a/src/main/java/com/gary/exercise/controller/ExerciseController.java b/src/main/java/com/gary/exercise/controller/ExerciseController.java new file mode 100644 index 0000000..43d1e38 --- /dev/null +++ b/src/main/java/com/gary/exercise/controller/ExerciseController.java @@ -0,0 +1,4 @@ +package com.gary.exercise.controller; + +public class ExerciseController { +} diff --git a/src/main/java/com/gary/exercise/controller/TestController.java b/src/main/java/com/gary/exercise/controller/TestController.java new file mode 100644 index 0000000..3941b5a --- /dev/null +++ b/src/main/java/com/gary/exercise/controller/TestController.java @@ -0,0 +1,4 @@ +package com.gary.exercise.controller; + +public class TestController { +} diff --git a/src/main/java/com/gary/exercise/dto/ActionDto.java b/src/main/java/com/gary/exercise/dto/ActionDto.java new file mode 100644 index 0000000..ba47590 --- /dev/null +++ b/src/main/java/com/gary/exercise/dto/ActionDto.java @@ -0,0 +1,15 @@ +package com.gary.exercise.dto; + +import lombok.Data; + +/** + *返回用户操作 + */ +@Data +public class ActionDto { + private String human; + + private String action; + + private String description; +} diff --git a/src/main/java/com/gary/exercise/exception/ReadExcelException.java b/src/main/java/com/gary/exercise/exception/ReadExcelException.java new file mode 100644 index 0000000..9a63de8 --- /dev/null +++ b/src/main/java/com/gary/exercise/exception/ReadExcelException.java @@ -0,0 +1,7 @@ +package com.gary.exercise.exception; + +public class ReadExcelException extends RuntimeException{ + public ReadExcelException(String message) { + super(message); + } +} diff --git a/src/main/java/com/gary/exercise/service/ExerciseService.java b/src/main/java/com/gary/exercise/service/ExerciseService.java new file mode 100644 index 0000000..ef11512 --- /dev/null +++ b/src/main/java/com/gary/exercise/service/ExerciseService.java @@ -0,0 +1,28 @@ +package com.gary.exercise.service; + +import java.util.List; +import java.util.Map; + +/** + * @author Gary + * @date 2024/12/11 下午4:13 + * @description: 读取和处理文件流 + */ +public interface ExerciseService { + + /** + * 读取 Excel 文件中的某一行数据,并存储在 List 中返回 + * + * @param filepath Excel 文件路径 + * @param line 要读取的行号(从 1 开始) + * @return List 包含这一行的所有数据 + */ + List readExcelByLine(String filepath, Integer line); + + + /** + *获取excel中的详细信息 + */ + Map getDetailInformation(String filepath, Integer line); + +} diff --git a/src/main/java/com/gary/exercise/service/impl/ExerciseServiceImpl.java b/src/main/java/com/gary/exercise/service/impl/ExerciseServiceImpl.java new file mode 100644 index 0000000..7f97096 --- /dev/null +++ b/src/main/java/com/gary/exercise/service/impl/ExerciseServiceImpl.java @@ -0,0 +1,78 @@ +package com.gary.exercise.service.impl; + +import com.gary.exercise.service.ExerciseService; +import org.apache.poi.ss.usermodel.*; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.*; + +public class ExerciseServiceImpl implements ExerciseService { + + @Override + public List readExcelByLine(String filepath, Integer line) { + List result = new ArrayList<>(); + try{ + FileInputStream fis = new FileInputStream(filepath); + Workbook workbook = WorkbookFactory.create(fis); + Sheet sheet = workbook.getSheetAt(0); + Row dataRow = sheet.getRow(line - 1); //获取第i行的数据 + if (dataRow == null) { + throw new IllegalArgumentException("指定的行不存在或文件为空"); + } + for (int i = 0; i < dataRow.getLastCellNum(); i++) { + Cell cell = dataRow.getCell(i); + String cellValue = getCellValue(cell); + result.add(cellValue); + } + } catch (IOException e) { + throw new RuntimeException("读取 Excel 文件失败: " + e.getMessage(), e); + } + return result; + } + + @Override + public Map getDetailInformation(String filepath, Integer line) { + + Map result =new HashMap<>(); + List readResult= readExcelByLine(filepath, line);//获取读取到的结果 + if(readResult.isEmpty()) { + throw new RuntimeException("读取到的结果为空"); + }else if(readResult.size()==1){//说明是第一第二节开始的标志 + result.put("now_class",readResult.get(0)); + }else if(Objects.equals(readResult.get(0), "时间")) { + return null; + }else{ + result.put("time",readResult.get(0));//获取当前时间 + result.put("laker_action",readResult.get(1));//获取当前湖人队的动作 + result.put("score",readResult.get(2));//获取当前比分 + result.put("wolf_action",readResult.get(3));//获取当前森林狼队的动作 + } + return result; + } + + /** + * 获取单元格的值,并转换为字符串 + */ + private String getCellValue(Cell cell) { + if (cell == null) { + return ""; + } + return switch (cell.getCellType()) { + case STRING -> cell.getStringCellValue(); + case NUMERIC -> { + if (DateUtil.isCellDateFormatted(cell)) { + yield cell.getDateCellValue().toString(); + } + yield String.valueOf(cell.getNumericCellValue()); + } + case BOOLEAN -> String.valueOf(cell.getBooleanCellValue()); + case FORMULA -> cell.getCellFormula(); + case BLANK -> ""; + default -> "UNKNOWN"; + }; + } + + + +} diff --git a/src/main/java/com/gary/exercise/socket/ExerciseWebSocketHandler.java b/src/main/java/com/gary/exercise/socket/ExerciseWebSocketHandler.java new file mode 100644 index 0000000..5c0c716 --- /dev/null +++ b/src/main/java/com/gary/exercise/socket/ExerciseWebSocketHandler.java @@ -0,0 +1,80 @@ +package com.gary.exercise.socket; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.socket.*; +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; + +public class ExerciseWebSocketHandler implements WebSocketHandler { + + // 用于存储所有的 WebSocket 会话 + private static final ConcurrentHashMap sessions = new ConcurrentHashMap<>(); + + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception { + // 当连接建立时触发 + String sessionId = session.getId(); + sessions.put(sessionId, session); + System.out.println("WebSocket连接已建立: " + sessionId); + + // 发送欢迎消息 + session.sendMessage(new TextMessage("欢迎连接到 WebSocket 服务,您的会话 ID 是: " + sessionId)); + } + + @Override + public void handleMessage(@NotNull WebSocketSession session, @NotNull WebSocketMessage message) throws Exception { + // 处理接收到的消息 + if (message instanceof TextMessage) { + String clientMessage = ((TextMessage) message).getPayload(); + System.out.println("收到消息: " + clientMessage); + + // 回复客户端 + session.sendMessage(new TextMessage("服务器收到消息: " + clientMessage)); + } else { + System.out.println("不支持的消息类型: " + message.getClass().getName()); + } + } + + @Override + public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { + // 处理传输错误 + String sessionId = session.getId(); + System.out.println("WebSocket 传输错误,Session ID: " + sessionId + ", 错误: " + exception.getMessage()); + + // 关闭会话 + if (session.isOpen()) { + session.close(CloseStatus.SERVER_ERROR); + } + + // 从存储中移除会话 + sessions.remove(sessionId); + } + + @Override + public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { + // 当连接关闭时触发 + String sessionId = session.getId(); + System.out.println("WebSocket连接已关闭,Session ID: " + sessionId + ", 状态: " + closeStatus); + + // 从存储中移除会话 + sessions.remove(sessionId); + } + + @Override + public boolean supportsPartialMessages() { + // 不支持部分消息 + return false; + } + + // 广播消息给所有连接的客户端 + public void broadcastMessage(String message) { + for (WebSocketSession session : sessions.values()) { + if (session.isOpen()) { + try { + session.sendMessage(new TextMessage(message)); + } catch (IOException e) { + System.out.println("广播消息失败,Session ID: " + session.getId() + ", 错误: " + e.getMessage()); + } + } + } + } +} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/exercise.xlsx b/src/main/resources/exercise.xlsx new file mode 100644 index 0000000..f204e66 Binary files /dev/null and b/src/main/resources/exercise.xlsx differ diff --git a/src/test/java/com/gary/exercise/ExerciseApplicationTests.java b/src/test/java/com/gary/exercise/ExerciseApplicationTests.java index 8c85815..34719ad 100644 --- a/src/test/java/com/gary/exercise/ExerciseApplicationTests.java +++ b/src/test/java/com/gary/exercise/ExerciseApplicationTests.java @@ -1,13 +1,27 @@ package com.gary.exercise; +import com.gary.exercise.service.ExerciseService; +import com.gary.exercise.service.impl.ExerciseServiceImpl; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import java.util.List; +import java.util.Map; + @SpringBootTest class ExerciseApplicationTests { @Test void contextLoads() { } + public static void main(String[] args) { + ExerciseService service = new ExerciseServiceImpl(); + String filepath = "D:\\data\\coding files\\java\\exercise\\src\\main\\resources\\exercise.xlsx"; // 替换为实际路径 + int line = 3; // 读取第2行数据 + Mapresult=service.getDetailInformation(filepath,line); + /* List result = service.readExcelByLine(filepath, line);*/ + System.out.println("读取结果:"+result); + + } } diff --git a/target/classes/application.yaml b/target/classes/application.yaml new file mode 100644 index 0000000..e69de29 diff --git a/target/classes/com/gary/exercise/ExerciseApplication.class b/target/classes/com/gary/exercise/ExerciseApplication.class new file mode 100644 index 0000000..0efc660 Binary files /dev/null and b/target/classes/com/gary/exercise/ExerciseApplication.class differ diff --git a/target/classes/com/gary/exercise/config/WebSocketConfig.class b/target/classes/com/gary/exercise/config/WebSocketConfig.class new file mode 100644 index 0000000..ad45413 Binary files /dev/null and b/target/classes/com/gary/exercise/config/WebSocketConfig.class differ diff --git a/target/classes/com/gary/exercise/controller/ExerciseController.class b/target/classes/com/gary/exercise/controller/ExerciseController.class new file mode 100644 index 0000000..a483a84 Binary files /dev/null and b/target/classes/com/gary/exercise/controller/ExerciseController.class differ diff --git a/target/classes/com/gary/exercise/controller/TestController.class b/target/classes/com/gary/exercise/controller/TestController.class new file mode 100644 index 0000000..20955db Binary files /dev/null and b/target/classes/com/gary/exercise/controller/TestController.class differ diff --git a/target/classes/com/gary/exercise/dto/ActionDto.class b/target/classes/com/gary/exercise/dto/ActionDto.class new file mode 100644 index 0000000..8f640c7 Binary files /dev/null and b/target/classes/com/gary/exercise/dto/ActionDto.class differ diff --git a/target/classes/com/gary/exercise/exception/ReadExcelException.class b/target/classes/com/gary/exercise/exception/ReadExcelException.class new file mode 100644 index 0000000..2d5000d Binary files /dev/null and b/target/classes/com/gary/exercise/exception/ReadExcelException.class differ diff --git a/target/classes/com/gary/exercise/service/ExerciseService.class b/target/classes/com/gary/exercise/service/ExerciseService.class new file mode 100644 index 0000000..fe414a3 Binary files /dev/null and b/target/classes/com/gary/exercise/service/ExerciseService.class differ diff --git a/target/classes/com/gary/exercise/service/impl/ExerciseServiceImpl$1.class b/target/classes/com/gary/exercise/service/impl/ExerciseServiceImpl$1.class new file mode 100644 index 0000000..865d111 Binary files /dev/null and b/target/classes/com/gary/exercise/service/impl/ExerciseServiceImpl$1.class differ diff --git a/target/classes/com/gary/exercise/service/impl/ExerciseServiceImpl.class b/target/classes/com/gary/exercise/service/impl/ExerciseServiceImpl.class new file mode 100644 index 0000000..66070aa Binary files /dev/null and b/target/classes/com/gary/exercise/service/impl/ExerciseServiceImpl.class differ diff --git a/target/classes/com/gary/exercise/socket/ExerciseWebSocketHandler.class b/target/classes/com/gary/exercise/socket/ExerciseWebSocketHandler.class new file mode 100644 index 0000000..3ad2e89 Binary files /dev/null and b/target/classes/com/gary/exercise/socket/ExerciseWebSocketHandler.class differ diff --git a/target/classes/exercise.xlsx b/target/classes/exercise.xlsx new file mode 100644 index 0000000..f204e66 Binary files /dev/null and b/target/classes/exercise.xlsx differ diff --git a/target/test-classes/com/gary/exercise/ExerciseApplicationTests.class b/target/test-classes/com/gary/exercise/ExerciseApplicationTests.class new file mode 100644 index 0000000..2a09faf Binary files /dev/null and b/target/test-classes/com/gary/exercise/ExerciseApplicationTests.class differ