From 6d90c21b44469da7de65571983fa6098ebd3c382 Mon Sep 17 00:00:00 2001 From: Azure <983547216@qq.com> Date: Mon, 22 Jun 2026 11:19:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B8=B8=E6=88=8F=E6=88=BF=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/SaTokenConfigure.java | 2 +- .../common/dto/user/UpdateStatusRequest.java | 16 ++++++++++++++++ .../common/dto/user/UserInfoResponse.java | 8 ++++++-- .../controller/UserController.java | 13 +++++++++++++ .../webgamebackend/entities/UserEntity.java | 6 ++++++ .../webgamebackend/service/UserService.java | 9 +++++++++ .../service/impl/UserServiceImpl.java | 12 ++++++++++++ 7 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/webgame/webgamebackend/common/dto/user/UpdateStatusRequest.java diff --git a/src/main/java/com/webgame/webgamebackend/common/config/SaTokenConfigure.java b/src/main/java/com/webgame/webgamebackend/common/config/SaTokenConfigure.java index 44e52f4..62f38fc 100644 --- a/src/main/java/com/webgame/webgamebackend/common/config/SaTokenConfigure.java +++ b/src/main/java/com/webgame/webgamebackend/common/config/SaTokenConfigure.java @@ -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参数 diff --git a/src/main/java/com/webgame/webgamebackend/common/dto/user/UpdateStatusRequest.java b/src/main/java/com/webgame/webgamebackend/common/dto/user/UpdateStatusRequest.java new file mode 100644 index 0000000..db9fcb4 --- /dev/null +++ b/src/main/java/com/webgame/webgamebackend/common/dto/user/UpdateStatusRequest.java @@ -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 +) {} 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 2ec9417..ff1948a 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 @@ -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() ); } } diff --git a/src/main/java/com/webgame/webgamebackend/controller/UserController.java b/src/main/java/com/webgame/webgamebackend/controller/UserController.java index e6fabeb..c995bc9 100644 --- a/src/main/java/com/webgame/webgamebackend/controller/UserController.java +++ b/src/main/java/com/webgame/webgamebackend/controller/UserController.java @@ -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 updateStatus(@Valid @RequestBody UpdateStatusRequest request) { + String accountId = StpUtil.getLoginIdAsString(); + userService.updateStatus(accountId, request); + return ApiResponse.ok(null); + } } diff --git a/src/main/java/com/webgame/webgamebackend/entities/UserEntity.java b/src/main/java/com/webgame/webgamebackend/entities/UserEntity.java index 6314d8b..de93c8c 100644 --- a/src/main/java/com/webgame/webgamebackend/entities/UserEntity.java +++ b/src/main/java/com/webgame/webgamebackend/entities/UserEntity.java @@ -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"; } diff --git a/src/main/java/com/webgame/webgamebackend/service/UserService.java b/src/main/java/com/webgame/webgamebackend/service/UserService.java index 71d9e43..0292973 100644 --- a/src/main/java/com/webgame/webgamebackend/service/UserService.java +++ b/src/main/java/com/webgame/webgamebackend/service/UserService.java @@ -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); } diff --git a/src/main/java/com/webgame/webgamebackend/service/impl/UserServiceImpl.java b/src/main/java/com/webgame/webgamebackend/service/impl/UserServiceImpl.java index 026b397..d3a3297 100644 --- a/src/main/java/com/webgame/webgamebackend/service/impl/UserServiceImpl.java +++ b/src/main/java/com/webgame/webgamebackend/service/impl/UserServiceImpl.java @@ -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()); + } }