From a5fe28e5369f9d9b220b04b05e8a17eefb4b602c Mon Sep 17 00:00:00 2001
From: Azure <983547216@qq.com>
Date: Tue, 30 Jun 2026 11:54:21 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E6=B8=B8=E6=88=8F?=
=?UTF-8?q?=E6=88=BF=E9=97=B4=E6=9E=B6=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../common/dto/user/UserInfoResponse.java | 2 +-
.../webgamebackend/entities/GameRecordEntity.java | 12 ++++++++++--
.../webgame/webgamebackend/service/RoomManager.java | 12 +++++++++++-
.../webgamebackend/ws/RoomWebSocketHandler.java | 6 +++---
4 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/src/main/java/com/webgame/webgamebackend/common/dto/user/UserInfoResponse.java b/src/main/java/com/webgame/webgamebackend/common/dto/user/UserInfoResponse.java
index ff1948a..7a88ca6 100644
--- a/src/main/java/com/webgame/webgamebackend/common/dto/user/UserInfoResponse.java
+++ b/src/main/java/com/webgame/webgamebackend/common/dto/user/UserInfoResponse.java
@@ -22,7 +22,7 @@ public record UserInfoResponse(
*/
public static UserInfoResponse from(UserEntity user) {
return new UserInfoResponse(
- user.getId(),
+ user.getAccount().getId(),
user.getNickName(),
user.getAvatar(),
user.getSignature(),
diff --git a/src/main/java/com/webgame/webgamebackend/entities/GameRecordEntity.java b/src/main/java/com/webgame/webgamebackend/entities/GameRecordEntity.java
index cfa33ff..13aec58 100644
--- a/src/main/java/com/webgame/webgamebackend/entities/GameRecordEntity.java
+++ b/src/main/java/com/webgame/webgamebackend/entities/GameRecordEntity.java
@@ -34,8 +34,16 @@ public class GameRecordEntity extends UUIDBaseEntity {
@Column(name = "winner_id", length = 64)
private String winnerId;
- /** 结果类型:win(一方获胜)、draw(平局)、resign(认输) */
- @Column(name = "result_type", nullable = false, length = 16)
+ /**
+ * 结果类型
+ *
+ * - {@code pending} — 对局进行中,尚未产生结果(游戏开始时设置)
+ * - {@code win} — 一方获胜
+ * - {@code draw} — 平局
+ * - {@code resign} — 一方认输
+ *
+ */
+ @Column(name = "result_type", length = 16)
private String resultType;
/** 对局开始时间 */
diff --git a/src/main/java/com/webgame/webgamebackend/service/RoomManager.java b/src/main/java/com/webgame/webgamebackend/service/RoomManager.java
index 4583a53..0447d1c 100644
--- a/src/main/java/com/webgame/webgamebackend/service/RoomManager.java
+++ b/src/main/java/com/webgame/webgamebackend/service/RoomManager.java
@@ -18,6 +18,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
@@ -95,6 +96,7 @@ public class RoomManager {
* @param creatorId 房主 accountId
* @return 创建结果
*/
+ @Transactional
public CreateRoomResponse createRoom(CreateRoomRequest request, String creatorId) {
// 校验游戏存在且启用
GameConfigEntity gameConfig = gameConfigRepository.findByGameId(request.gameId())
@@ -172,6 +174,7 @@ public class RoomManager {
* @param userId 用户 accountId
* @return 房间信息
*/
+ @Transactional
public RoomItemResponse joinRoom(JoinRoomRequest request, String userId) {
GameRoomEntity room = gameRoomRepository.findById(request.roomId())
.orElseThrow(() -> new BusinessException(ErrorCode.ROOM_NOT_FOUND));
@@ -236,6 +239,7 @@ public class RoomManager {
* @param roomId 房间 ID
* @param userId 用户 accountId
*/
+ @Transactional
public void leaveRoom(String roomId, String userId) {
GameRoomEntity room = gameRoomRepository.findById(roomId)
.orElseThrow(() -> new BusinessException(ErrorCode.ROOM_NOT_FOUND));
@@ -286,6 +290,7 @@ public class RoomManager {
* @param roomId 房间 ID
* @param ownerId 房主 accountId
*/
+ @Transactional
public void disbandRoom(String roomId, String ownerId) {
GameRoomEntity room = gameRoomRepository.findById(roomId)
.orElseThrow(() -> new BusinessException(ErrorCode.ROOM_NOT_FOUND));
@@ -324,6 +329,7 @@ public class RoomManager {
* @param ownerId 房主 accountId
* @param targetUserId 目标用户 accountId
*/
+ @Transactional
public void kickPlayer(String roomId, String ownerId, String targetUserId) {
GameRoomEntity room = gameRoomRepository.findById(roomId)
.orElseThrow(() -> new BusinessException(ErrorCode.ROOM_NOT_FOUND));
@@ -366,6 +372,7 @@ public class RoomManager {
* @param userId 用户 accountId
* @return 新的准备状态
*/
+ @Transactional
public boolean toggleReady(String roomId, String userId) {
GameRoomEntity room = gameRoomRepository.findById(roomId)
.orElseThrow(() -> new BusinessException(ErrorCode.ROOM_NOT_FOUND));
@@ -400,6 +407,7 @@ public class RoomManager {
* @param roomId 房间 ID
* @param userId 操作者 accountId(必须是房主)
*/
+ @Transactional
public void startGame(String roomId, String userId) {
GameRoomEntity room = gameRoomRepository.findById(roomId)
.orElseThrow(() -> new BusinessException(ErrorCode.ROOM_NOT_FOUND));
@@ -430,9 +438,10 @@ public class RoomManager {
room.setStatus("playing");
gameRoomRepository.save(room);
- // 创建游戏记录
+ // 创建游戏记录(resultType 初始为 pending,游戏结束时由 onGameOver 更新)
GameRecordEntity record = new GameRecordEntity()
.setRoomId(roomId)
+ .setResultType("pending")
.setStartedAt(LocalDateTime.now());
gameRecordRepository.save(record);
@@ -637,6 +646,7 @@ public class RoomManager {
* @param winnerId 胜者 accountId(null 表示平局)
* @param resultType 结果类型(win/draw/resign)
*/
+ @Transactional
public void onGameOver(String roomId, String winnerId, String resultType) {
GameRoomEntity room = gameRoomRepository.findById(roomId).orElse(null);
if (room == null) return;
diff --git a/src/main/java/com/webgame/webgamebackend/ws/RoomWebSocketHandler.java b/src/main/java/com/webgame/webgamebackend/ws/RoomWebSocketHandler.java
index 3a0f04d..43d42ea 100644
--- a/src/main/java/com/webgame/webgamebackend/ws/RoomWebSocketHandler.java
+++ b/src/main/java/com/webgame/webgamebackend/ws/RoomWebSocketHandler.java
@@ -133,12 +133,12 @@ public class RoomWebSocketHandler extends TextWebSocketHandler {
return;
}
+ // 处理重连(在注册会话之前,避免广播到尚未完成握手的当前 session)
+ roomManager.handleReconnect(roomId, userId);
+
// 注册会话
sessionManager.addSession(roomId, userId, session);
- // 处理重连
- roomManager.handleReconnect(roomId, userId);
-
log.info("[WS] 连接建立, roomId={}, userId={}, sessionId={}", roomId, userId, session.getId());
}