From 2ead8157c31d2868dcf523c74956cb6bdb22a0c8 Mon Sep 17 00:00:00 2001 From: zk Date: Fri, 15 May 2026 15:20:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserManageController.java | 45 ++++++++++ .../jiayunet/pojo/dto/user/UserInfoDto.java | 34 ++++++++ .../pojo/param/user/UserInfoParam.java | 24 ++++++ .../jiayunet/service/UserManageService.java | 83 +++++++++++++++++++ 4 files changed, 186 insertions(+) create mode 100644 client-api/src/main/java/org/jiayunet/controller/UserManageController.java create mode 100644 client-api/src/main/java/org/jiayunet/pojo/dto/user/UserInfoDto.java create mode 100644 client-api/src/main/java/org/jiayunet/pojo/param/user/UserInfoParam.java create mode 100644 client-api/src/main/java/org/jiayunet/service/UserManageService.java diff --git a/client-api/src/main/java/org/jiayunet/controller/UserManageController.java b/client-api/src/main/java/org/jiayunet/controller/UserManageController.java new file mode 100644 index 0000000..5901e2f --- /dev/null +++ b/client-api/src/main/java/org/jiayunet/controller/UserManageController.java @@ -0,0 +1,45 @@ +package org.jiayunet.controller; + +import lombok.AllArgsConstructor; +import org.jiayunet.pojo.dto.user.UserInfoDto; +import org.jiayunet.pojo.param.user.UserInfoParam; +import org.jiayunet.service.UserManageService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 用户账号管理接口 + * + * @author zk + */ +@RestController +@RequestMapping("/user/manage") +@AllArgsConstructor +public class UserManageController { + + private final UserManageService userManageService; + + /** + * 查看个人信息 + */ + @GetMapping("/info") + public UserInfoDto getInfo() { + return userManageService.getInfo(); + } + + /** + * 修改个人信息 + */ + @PostMapping("/info") + public void updateInfo(@Validated @RequestBody UserInfoParam param) { + userManageService.updateInfo(param); + } + + /** + * 注销账号 + */ + @PostMapping("/cancel") + public void cancelAccount() { + userManageService.cancelAccount(); + } +} diff --git a/client-api/src/main/java/org/jiayunet/pojo/dto/user/UserInfoDto.java b/client-api/src/main/java/org/jiayunet/pojo/dto/user/UserInfoDto.java new file mode 100644 index 0000000..0d71974 --- /dev/null +++ b/client-api/src/main/java/org/jiayunet/pojo/dto/user/UserInfoDto.java @@ -0,0 +1,34 @@ +package org.jiayunet.pojo.dto.user; + +import lombok.Data; + +import java.time.Instant; + +/** + * 用户个人信息DTO + * + * @author zk + */ +@Data +public class UserInfoDto { + /** 用户ID */ + private Long id; + /** 手机号 */ + private String mobileNumber; + /** 邮箱 */ + private String email; + /** 昵称 */ + private String nick; + /** 真实姓名 */ + private String realName; + /** 头像 */ + private String picture; + /** 生日 */ + private Instant birthday; + /** 性别 1男 2女 */ + private Integer sex; + /** 邀请码 */ + private String inviteCode; + /** 注册时间 */ + private Instant createTime; +} diff --git a/client-api/src/main/java/org/jiayunet/pojo/param/user/UserInfoParam.java b/client-api/src/main/java/org/jiayunet/pojo/param/user/UserInfoParam.java new file mode 100644 index 0000000..ca67ed1 --- /dev/null +++ b/client-api/src/main/java/org/jiayunet/pojo/param/user/UserInfoParam.java @@ -0,0 +1,24 @@ +package org.jiayunet.pojo.param.user; + +import lombok.Data; + +import java.time.Instant; + +/** + * 修改个人信息入参 + * + * @author zk + */ +@Data +public class UserInfoParam { + /** 昵称 */ + private String nick; + /** 头像 */ + private String picture; + /** 生日 */ + private Instant birthday; + /** 性别 1男 2女 */ + private Integer sex; + /** 真实姓名 */ + private String realName; +} diff --git a/client-api/src/main/java/org/jiayunet/service/UserManageService.java b/client-api/src/main/java/org/jiayunet/service/UserManageService.java new file mode 100644 index 0000000..7ad33fd --- /dev/null +++ b/client-api/src/main/java/org/jiayunet/service/UserManageService.java @@ -0,0 +1,83 @@ +package org.jiayunet.service; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.jiayunet.constant.PreRedisKeyName; +import org.jiayunet.mapper.UserMapper; +import org.jiayunet.pojo.dto.user.UserInfoDto; +import org.jiayunet.pojo.param.user.UserInfoParam; +import org.jiayunet.pojo.po.User; +import org.jiayunet.tool.UserSecurityTool; +import org.jiayunet.tool.server.RedisServerTool; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; + +/** + * 用户账号管理服务 + *

主要功能:查看个人信息、修改个人信息、注销账号

+ *

使用表:bg_user(查询/更新/逻辑删除)

+ *

使用Redis:login:token:{userId}(注销时清理登录态)

+ * + * @author zk + */ +@Slf4j +@Service +public class UserManageService { + + @Autowired + private UserMapper userMapper; + + @Autowired + private RedisServerTool redisServerTool; + + /** + * 查看个人信息 + *

根据当前登录用户ID查询用户基本信息

+ */ + public UserInfoDto getInfo() { + Long userId = UserSecurityTool.getUserId(); + User user = userMapper.selectById(userId); + Assert.notNull(user, "用户不存在"); + + UserInfoDto dto = new UserInfoDto(); + BeanUtils.copyProperties(user, dto); + return dto; + } + + /** + * 修改个人信息 + *

仅更新非null字段

+ */ + public void updateInfo(UserInfoParam param) { + Long userId = UserSecurityTool.getUserId(); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper().eq(User::getId, userId); + + if (param.getNick() != null) wrapper.set(User::getNick, param.getNick()); + if (param.getPicture() != null) wrapper.set(User::getPicture, param.getPicture()); + if (param.getBirthday() != null) wrapper.set(User::getBirthday, param.getBirthday()); + if (param.getSex() != null) wrapper.set(User::getSex, param.getSex()); + if (param.getRealName() != null) wrapper.set(User::getRealName, param.getRealName()); + + userMapper.update(null, wrapper); + } + + /** + * 注销账号 + *

1. 逻辑删除用户 2. 清理Redis登录态

+ */ + @Transactional(rollbackFor = Exception.class) + public void cancelAccount() { + Long userId = UserSecurityTool.getUserId(); + + // 逻辑删除 + userMapper.deleteById(userId); + + // 清理Redis登录态 + redisServerTool.delete(PreRedisKeyName.LOGIN_TOKEN + userId); + + log.info("用户注销账号 userId:{}", userId); + } +}