ソースを参照

登录功能优化

Zhangbw 3 ヶ月 前
コミット
b9781b2e6d

+ 71 - 0
src/main/java/com/yingpai/gupiao/controller/UserController.java

@@ -0,0 +1,71 @@
+package com.yingpai.gupiao.controller;
+
+import com.yingpai.gupiao.domain.dto.UpdateProfileDTO;
+import com.yingpai.gupiao.domain.vo.LoginVO;
+import com.yingpai.gupiao.domain.vo.Result;
+import com.yingpai.gupiao.service.UserService;
+import com.yingpai.gupiao.util.JwtUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 用户控制器
+ * 处理用户相关请求
+ */
+@Slf4j
+@RestController
+@RequestMapping("/v1/user")
+@RequiredArgsConstructor
+public class UserController {
+    
+    private final UserService userService;
+    private final JwtUtil jwtUtil;
+    
+    /**
+     * 获取用户信息
+     * @param authorization 请求头中的token
+     * @return 用户信息
+     */
+    @GetMapping("/info")
+    public Result<LoginVO.UserInfoVO> getUserInfo(@RequestHeader("Authorization") String authorization) {
+        try {
+            // 从token中获取用户ID
+            String token = authorization.replace("Bearer ", "");
+            Long userId = jwtUtil.getUserIdFromToken(token);
+            
+            log.info("获取用户信息,userId: {}", userId);
+            
+            LoginVO.UserInfoVO userInfo = userService.getUserInfo(userId);
+            return Result.success(userInfo);
+        } catch (Exception e) {
+            log.error("获取用户信息失败", e);
+            return Result.error("获取用户信息失败:" + e.getMessage());
+        }
+    }
+    
+    /**
+     * 更新用户资料
+     * @param authorization 请求头中的token
+     * @param updateProfileDTO 更新资料DTO
+     * @return 更新后的用户信息
+     */
+    @PutMapping("/profile")
+    public Result<LoginVO.UserInfoVO> updateProfile(
+            @RequestHeader("Authorization") String authorization,
+            @RequestBody UpdateProfileDTO updateProfileDTO) {
+        try {
+            // 从token中获取用户ID
+            String token = authorization.replace("Bearer ", "");
+            Long userId = jwtUtil.getUserIdFromToken(token);
+            
+            log.info("更新用户资料,userId: {}, nickname: {}", userId, updateProfileDTO.getNickname());
+            
+            LoginVO.UserInfoVO userInfo = userService.updateProfile(userId, updateProfileDTO);
+            return Result.success(userInfo);
+        } catch (Exception e) {
+            log.error("更新用户资料失败", e);
+            return Result.error("更新失败:" + e.getMessage());
+        }
+    }
+}

+ 20 - 0
src/main/java/com/yingpai/gupiao/domain/dto/UpdateProfileDTO.java

@@ -0,0 +1,20 @@
+package com.yingpai.gupiao.domain.dto;
+
+import lombok.Data;
+
+/**
+ * 更新用户资料DTO
+ */
+@Data
+public class UpdateProfileDTO {
+    
+    /**
+     * 用户昵称
+     */
+    private String nickname;
+    
+    /**
+     * 用户头像URL
+     */
+    private String avatar;
+}

+ 25 - 0
src/main/java/com/yingpai/gupiao/service/UserService.java

@@ -0,0 +1,25 @@
+package com.yingpai.gupiao.service;
+
+import com.yingpai.gupiao.domain.dto.UpdateProfileDTO;
+import com.yingpai.gupiao.domain.vo.LoginVO;
+
+/**
+ * 用户服务接口
+ */
+public interface UserService {
+    
+    /**
+     * 获取用户信息
+     * @param userId 用户ID
+     * @return 用户信息VO
+     */
+    LoginVO.UserInfoVO getUserInfo(Long userId);
+    
+    /**
+     * 更新用户资料
+     * @param userId 用户ID
+     * @param updateProfileDTO 更新资料DTO
+     * @return 更新后的用户信息VO
+     */
+    LoginVO.UserInfoVO updateProfile(Long userId, UpdateProfileDTO updateProfileDTO);
+}

+ 91 - 0
src/main/java/com/yingpai/gupiao/service/impl/UserServiceImpl.java

@@ -0,0 +1,91 @@
+package com.yingpai.gupiao.service.impl;
+
+import com.yingpai.gupiao.domain.dto.UpdateProfileDTO;
+import com.yingpai.gupiao.domain.po.User;
+import com.yingpai.gupiao.domain.vo.LoginVO;
+import com.yingpai.gupiao.mapper.UserMapper;
+import com.yingpai.gupiao.service.UserService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户服务实现类
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class UserServiceImpl implements UserService {
+    
+    private final UserMapper userMapper;
+    
+    /**
+     * 获取用户信息
+     * @param userId 用户ID
+     * @return 用户信息VO
+     */
+    @Override
+    public LoginVO.UserInfoVO getUserInfo(Long userId) {
+        User user = userMapper.selectById(userId);
+        if (user == null) {
+            throw new RuntimeException("用户不存在");
+        }
+        
+        // 手机号脱敏
+        String maskedPhone = null;
+        if (user.getPhone() != null) {
+            maskedPhone = user.getPhone().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
+        }
+        
+        return LoginVO.UserInfoVO.builder()
+                .id(user.getId())
+                .nickname(user.getNickname())
+                .avatar(user.getAvatar())
+                .phone(maskedPhone)
+                .build();
+    }
+    
+    /**
+     * 更新用户资料
+     * @param userId 用户ID
+     * @param updateProfileDTO 更新资料DTO
+     * @return 更新后的用户信息VO
+     */
+    @Override
+    public LoginVO.UserInfoVO updateProfile(Long userId, UpdateProfileDTO updateProfileDTO) {
+        User user = userMapper.selectById(userId);
+        if (user == null) {
+            throw new RuntimeException("用户不存在");
+        }
+        
+        boolean needUpdate = false;
+        
+        // 更新昵称
+        if (updateProfileDTO.getNickname() != null && 
+            !updateProfileDTO.getNickname().isEmpty() && 
+            !updateProfileDTO.getNickname().equals(user.getNickname())) {
+            user.setNickname(updateProfileDTO.getNickname());
+            needUpdate = true;
+            log.info("更新用户昵称,userId: {}, 新昵称: {}", userId, updateProfileDTO.getNickname());
+        }
+        
+        // 更新头像
+        if (updateProfileDTO.getAvatar() != null && 
+            !updateProfileDTO.getAvatar().isEmpty() && 
+            !updateProfileDTO.getAvatar().equals(user.getAvatar())) {
+            user.setAvatar(updateProfileDTO.getAvatar());
+            needUpdate = true;
+            log.info("更新用户头像,userId: {}, 新头像: {}", userId, updateProfileDTO.getAvatar());
+        }
+        
+        if (needUpdate) {
+            user.setUpdateTime(LocalDateTime.now());
+            userMapper.updateById(user);
+        }
+        
+        // 返回更新后的用户信息
+        return getUserInfo(userId);
+    }
+}