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