feat: 游戏房间

This commit is contained in:
2026-06-22 11:19:19 +08:00
parent 4267445256
commit 6d90c21b44
7 changed files with 63 additions and 3 deletions

View File

@@ -40,7 +40,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
// 允许指定域访问跨域资源
.setHeader("Access-Control-Allow-Origin", "*")// 允许指定域访问跨域资源
// 允许所有请求方式
.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE")
.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, PATCH")
// 有效时间
.setHeader("Access-Control-Max-Age", "3600")
// 允许的header参数

View File

@@ -0,0 +1,16 @@
package com.webgame.webgamebackend.common.dto.user;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
/**
* 更新在线状态请求
*/
public record UpdateStatusRequest(
@NotBlank(message = "状态不能为空")
@Pattern(
regexp = "ONLINE|AWAY|DND|INVISIBLE",
message = "状态值无效可选值ONLINE、AWAY、DND、INVISIBLE"
)
String status
) {}

View File

@@ -8,24 +8,28 @@ import java.time.LocalDate;
* 用户信息响应
*/
public record UserInfoResponse(
String userId,
String nickName,
String avatar,
String signature,
Integer age,
Integer sex,
LocalDate birthday
LocalDate birthday,
String status
) {
/**
* 从实体转换
*/
public static UserInfoResponse from(UserEntity user) {
return new UserInfoResponse(
user.getId(),
user.getNickName(),
user.getAvatar(),
user.getSignature(),
user.getAge(),
user.getSex(),
user.getBirthday()
user.getBirthday(),
user.getStatus()
);
}
}

View File

@@ -2,6 +2,7 @@ package com.webgame.webgamebackend.controller;
import cn.dev33.satoken.stp.StpUtil;
import com.webgame.webgamebackend.common.dto.ApiResponse;
import com.webgame.webgamebackend.common.dto.user.UpdateStatusRequest;
import com.webgame.webgamebackend.common.dto.user.UpdateUserInfoRequest;
import com.webgame.webgamebackend.common.dto.user.UserInfoResponse;
import com.webgame.webgamebackend.service.UserService;
@@ -41,4 +42,16 @@ public class UserController {
UserInfoResponse result = userService.updateUserInfo(accountId, request);
return ApiResponse.ok(result);
}
/**
* 更新当前登录用户在线状态
*
* 入参 status 可选值ONLINE、AWAY、DND、INVISIBLE
*/
@PatchMapping("/status")
public ApiResponse<Void> updateStatus(@Valid @RequestBody UpdateStatusRequest request) {
String accountId = StpUtil.getLoginIdAsString();
userService.updateStatus(accountId, request);
return ApiResponse.ok(null);
}
}

View File

@@ -74,4 +74,10 @@ public class UserEntity extends UUIDBaseEntity {
*/
@Column(name = "balance", nullable = false)
private Long balance = 1000L;
/**
* 在线状态ONLINE / AWAY / DND / INVISIBLE默认 ONLINE
*/
@Column(name = "status", length = 16, nullable = false)
private String status = "ONLINE";
}

View File

@@ -1,5 +1,6 @@
package com.webgame.webgamebackend.service;
import com.webgame.webgamebackend.common.dto.user.UpdateStatusRequest;
import com.webgame.webgamebackend.common.dto.user.UpdateUserInfoRequest;
import com.webgame.webgamebackend.common.dto.user.UserInfoResponse;
@@ -23,4 +24,12 @@ public interface UserService {
* @return 更新后的用户信息
*/
UserInfoResponse updateUserInfo(String accountId, UpdateUserInfoRequest request);
/**
* 更新当前登录用户的在线状态
*
* @param accountId 账号 ID
* @param request 状态更新请求
*/
void updateStatus(String accountId, UpdateStatusRequest request);
}

View File

@@ -1,6 +1,7 @@
package com.webgame.webgamebackend.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import com.webgame.webgamebackend.common.dto.user.UpdateStatusRequest;
import com.webgame.webgamebackend.common.dto.user.UpdateUserInfoRequest;
import com.webgame.webgamebackend.common.dto.user.UserInfoResponse;
import com.webgame.webgamebackend.common.exception.BusinessException;
@@ -62,4 +63,15 @@ public class UserServiceImpl implements UserService {
log.info("[用户服务] 更新用户信息, accountId={}", accountId);
return UserInfoResponse.from(user);
}
@Override
@Transactional
public void updateStatus(String accountId, UpdateStatusRequest request) {
UserEntity user = userRepository.findByAccountId(accountId)
.orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND));
user.setStatus(request.status());
userRepository.save(user);
log.info("[用户服务] 更新在线状态, accountId={}, status={}", accountId, request.status());
}
}