feat(user): 新增用户信息更新接口

新增 KeyboardUserReq DTO、Mapper updateByuid 方法及对应 XML,支持昵称/性别/头像/邮箱字段动态更新;补充 USER_INFO_UPDATE_FAILED 错误码,并在 UserController 与 UserServiceImpl 实现 updateUserInfo 逻辑。
This commit is contained in:
2025-12-03 19:27:24 +08:00
parent c4dbc9e475
commit 55aba799b5
7 changed files with 92 additions and 4 deletions

View File

@@ -28,7 +28,8 @@ public enum ErrorCode {
TOKEN_FREEZE(40108, "令牌已被冻结"),
TOKEN_NO_PREFIX(40109, "未按照指定前缀提交令牌"),
FILE_NAME_ERROR(40002, "文件名错误"),
USER_NOT_FOUND(40401, "用户不存在");
USER_NOT_FOUND(40401, "用户不存在"),
USER_INFO_UPDATE_FAILED(50002, "用户信息更新失败");
/**
* 状态码
*/

View File

@@ -1,10 +1,13 @@
package com.yolo.keyborad.controller;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import com.yolo.keyborad.common.BaseResponse;
import com.yolo.keyborad.common.ResultUtils;
import com.yolo.keyborad.model.dto.AppleLoginReq;
import com.yolo.keyborad.model.dto.user.KeyboardUserReq;
import com.yolo.keyborad.model.dto.user.UserLoginDTO;
import com.yolo.keyborad.model.entity.KeyboardUser;
import com.yolo.keyborad.model.vo.user.KeyboardUserRespVO;
import com.yolo.keyborad.service.IAppleService;
import com.yolo.keyborad.service.UserService;
@@ -14,6 +17,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -42,7 +46,7 @@ public class UserController {
*/
@PostMapping("/appleLogin")
@Operation(summary = "苹果登录", description = "苹果登录接口")
@Parameter(name = "code",required = true,description = "苹果登录凭证",example = "123456")
@Parameter(name = "code", required = true, description = "苹果登录凭证", example = "123456")
public BaseResponse<KeyboardUserRespVO> appleLogin(@RequestBody AppleLoginReq appleLoginReq) throws Exception {
return ResultUtils.success(appleService.login(appleLoginReq.getIdentityToken()));
}
@@ -56,7 +60,13 @@ public class UserController {
@PostMapping("/login")
@Operation(summary = "登录", description = "登录接口")
public BaseResponse<KeyboardUserRespVO> login(@RequestBody UserLoginDTO userLoginDTO) {
public BaseResponse<KeyboardUserRespVO> login(@RequestBody UserLoginDTO userLoginDTO) {
return ResultUtils.success(userService.login(userLoginDTO));
}
}
@PostMapping("/update")
@Operation(summary = "更新用户", description = "更新用户接口")
public BaseResponse<Boolean> update(@RequestBody KeyboardUserReq keyboardUserReq) {
return ResultUtils.success(userService.updateUserInfo(keyboardUserReq));
}
}

View File

@@ -9,4 +9,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yolo.keyborad.model.entity.KeyboardUser;
public interface KeyboardUserMapper extends BaseMapper<KeyboardUser> {
Integer updateByuid(KeyboardUser keyboardUser);
}

View File

@@ -0,0 +1,42 @@
package com.yolo.keyborad.model.dto.user;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/*
* @author: ziin
* @date: 2025/12/2 18:08
*/
@Data
@Schema(description="用户信息")
public class KeyboardUserReq {
@Schema(description="用户ID")
private Long uid;
@Schema(description="用户昵称")
private String nickName;
@Schema(description="性别")
private Integer gender;
@Schema(description="头像URL")
private String avatarUrl;
/**
* 邮箱地址
*/
@Schema(description="邮箱地址")
private String email;
/**
* 邮箱是否验证
*/
@Schema(description="邮箱是否验证")
private Boolean emailVerified;
@Schema(description = "token")
private String token;
}

View File

@@ -1,6 +1,7 @@
package com.yolo.keyborad.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yolo.keyborad.model.dto.user.KeyboardUserReq;
import com.yolo.keyborad.model.dto.user.UserLoginDTO;
import com.yolo.keyborad.model.entity.KeyboardUser;
import com.yolo.keyborad.model.vo.user.KeyboardUserRespVO;
@@ -16,4 +17,6 @@ public interface UserService extends IService<KeyboardUser> {
KeyboardUser createUserWithSubjectId(String sub);
KeyboardUserRespVO login(UserLoginDTO userLoginDTO);
Boolean updateUserInfo(KeyboardUserReq keyboardUser);
}

View File

@@ -5,10 +5,12 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yolo.keyborad.common.ErrorCode;
import com.yolo.keyborad.exception.BusinessException;
import com.yolo.keyborad.mapper.KeyboardUserMapper;
import com.yolo.keyborad.model.dto.user.KeyboardUserReq;
import com.yolo.keyborad.model.dto.user.UserLoginDTO;
import com.yolo.keyborad.model.entity.KeyboardUser;
import com.yolo.keyborad.model.vo.user.KeyboardUserRespVO;
@@ -62,4 +64,22 @@ public class UserServiceImpl extends ServiceImpl<KeyboardUserMapper, KeyboardUse
keyboardUserRespVO.setToken(StpUtil.getTokenValue());
return keyboardUserRespVO;
}
@Override
public Boolean updateUserInfo(KeyboardUserReq keyboardUserReq) {
KeyboardUser keyboardUserDB = keyboardUserMapper.selectOne(
new LambdaQueryWrapper<KeyboardUser>()
.eq(KeyboardUser::getUid, keyboardUserReq.getUid())
.eq(KeyboardUser::getStatus, false));
if (keyboardUserDB == null) {
throw new BusinessException(ErrorCode.USER_NOT_FOUND);
}
KeyboardUser keyboardUser = BeanUtil.copyProperties(keyboardUserReq, KeyboardUser.class);
Integer i = keyboardUserMapper.updateByuid(keyboardUser);
if (i <=0 ) {
throw new BusinessException(ErrorCode.USER_INFO_UPDATE_FAILED);
}
return true;
}
}

View File

@@ -23,4 +23,15 @@
id, "uid", nick_name, gender, avatar_url, created_at, updated_at, deleted, email,
"status", "password", subject_id, email_verified
</sql>
<update id="updateByuid">
update keyboard_user
<set>
<if test="nickName != null">nick_name = #{nickName},</if>
<if test="gender != null">gender = #{gender},</if>
<if test="avatarUrl != null">avatar_url = #{avatarUrl},</if>
<if test="email != null">email = #{email},</if>
</set>
where uid = #{uid}
</update>
</mapper>