diff --git a/docs/txt/0509TODO.txt b/docs/txt/0509TODO.txt index 52c54fa..eb97200 100644 --- a/docs/txt/0509TODO.txt +++ b/docs/txt/0509TODO.txt @@ -1,2 +1 @@ -学习记录 加个表 前端对个接口 直播表 diff --git a/src/main/java/com/guwan/backend/config/StompWebSocketConfig.java b/src/main/java/com/guwan/backend/config/StompWebSocketConfig.java new file mode 100644 index 0000000..99dd97d --- /dev/null +++ b/src/main/java/com/guwan/backend/config/StompWebSocketConfig.java @@ -0,0 +1,28 @@ +package com.guwan.backend.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +public class StompWebSocketConfig implements WebSocketMessageBrokerConfigurer { + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + // STOMP 客户端连接入口,路径不要和原始 WebSocket 冲突 + registry.addEndpoint("/stomp") + .setAllowedOriginPatterns("*") + .withSockJS(); // 启用 SockJS 兼容 + } + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + // 客户端订阅路径前缀,topic 表示广播 + registry.enableSimpleBroker("/topic", "/queue"); + // 客户端发送消息的路径前缀 + registry.setApplicationDestinationPrefixes("/live"); + } +} diff --git a/src/main/java/com/guwan/backend/constant/SecurityConstants.java b/src/main/java/com/guwan/backend/constant/SecurityConstants.java index 786cac0..6e57b6f 100644 --- a/src/main/java/com/guwan/backend/constant/SecurityConstants.java +++ b/src/main/java/com/guwan/backend/constant/SecurityConstants.java @@ -30,6 +30,8 @@ public class SecurityConstants { "/challenge", "/ws/**", + "/stomp/**", + "/faceTest", "/compareFaces", "/minio/**", diff --git a/src/main/java/com/guwan/backend/controller/CourseController.java b/src/main/java/com/guwan/backend/controller/CourseController.java index 251b1e0..a99ee8c 100644 --- a/src/main/java/com/guwan/backend/controller/CourseController.java +++ b/src/main/java/com/guwan/backend/controller/CourseController.java @@ -13,6 +13,7 @@ import com.guwan.backend.pojo.dto.course.InsertCourseDTO; import com.guwan.backend.pojo.entity.*; import com.guwan.backend.pojo.response.CourseByAdminVO; import com.guwan.backend.pojo.response.CourseCenterVO; +import com.guwan.backend.pojo.response.LiveDetailVO; import com.guwan.backend.pojo.response.courseDetail.BaseSectionVO; import com.guwan.backend.pojo.response.courseDetail.ChapterVO; import com.guwan.backend.pojo.response.courseDetail.CourseDetailVO; @@ -393,9 +394,25 @@ public class CourseController { return SearchResult.success(courseCenterVOList, count); } - @PostMapping("/testMethod") - public void testMethod(@RequestParam(name = "page") Long pageNum){ + @GetMapping("/live/detail") + public Result getLiveDetail(@RequestParam String courseId){ + Course course = courseService.getById(courseId); + + LiveDetailVO liveDetailVO = new LiveDetailVO(); + liveDetailVO.setId(course.getId()); + liveDetailVO.setTitle(course.getTitle()); + String teacherId = course.getTeacherId(); + liveDetailVO.setHostId(teacherId); + Teacher teacher = teacherService.getById(teacherId); + liveDetailVO.setHostName(teacher.getName()); + liveDetailVO.setHostAvatar(teacher.getAvatar()); + liveDetailVO.setDescription(course.getDescription()); + liveDetailVO.setStatus("live"); + liveDetailVO.setViewerCount(0); + liveDetailVO.setStreamUrl(course.getLiveUrl()); + + return Result.success(liveDetailVO); } diff --git a/src/main/java/com/guwan/backend/controller/StompChatController.java b/src/main/java/com/guwan/backend/controller/StompChatController.java new file mode 100644 index 0000000..666545d --- /dev/null +++ b/src/main/java/com/guwan/backend/controller/StompChatController.java @@ -0,0 +1,45 @@ +package com.guwan.backend.controller; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.messaging.handler.annotation.DestinationVariable; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.stereotype.Controller; + +@Controller +public class StompChatController { + private final ObjectMapper objectMapper = new ObjectMapper(); + + // 前端发送到 /live/send/{liveId} + @MessageMapping("/send/{liveId}") + @SendTo("/topic/live/{liveId}") + public String processMessage(@DestinationVariable String liveId, @Payload String message) { + try { + // 将消息字符串转换为 JSON 对象 + + /** + * asText() 转为字符串 + * asInt() 转为整数 + * asLong() 转为长整数(时间戳等) + * asBoolean() 转为布尔值 + * get("key") 获取字段值,返回 JsonNode + */ + JsonNode jsonNode = objectMapper.readTree(message); + JsonNode node = jsonNode.get("username"); + String username = null; + if (node != null && !node.isNull()) { + username = node.asText(); + } + System.out.println(username); + System.out.println("Received message: " + jsonNode.toPrettyString()); + + // 返回处理后的消息 + return message; + } catch (Exception e) { + System.err.println("Error processing message: " + e.getMessage()); + return message; + } + } +} diff --git a/src/main/java/com/guwan/backend/pojo/response/LiveDetailVO.java b/src/main/java/com/guwan/backend/pojo/response/LiveDetailVO.java new file mode 100644 index 0000000..e4adaae --- /dev/null +++ b/src/main/java/com/guwan/backend/pojo/response/LiveDetailVO.java @@ -0,0 +1,20 @@ +package com.guwan.backend.pojo.response; + +import lombok.Data; + +@Data +public class LiveDetailVO { + /** + * courseId + */ + private String id; + private String title; + private String hostName; + private String hostId; + private String hostAvatar; + private Integer viewerCount; + private String status; + private String description; + private String streamUrl; + +}