package com.guwan.backend.controller; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.RandomUtil; import com.guwan.backend.common.Result; import com.guwan.backend.dto.user.*; import com.guwan.backend.service.EmailService; import com.guwan.backend.service.UserService; import com.guwan.backend.util.RedisUtils; import com.guwan.backend.util.SmsUtils; import jakarta.validation.Valid; import jakarta.validation.constraints.Email; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.thymeleaf.context.Context; @Slf4j @RestController @RequestMapping("/api/user") @RequiredArgsConstructor @Validated public class UserController { private final UserService userService; private final EmailService emailService; private final RedisUtils redisUtils; @PostMapping("/register") public Result register(@RequestBody @Valid RegisterDTO request) { try { log.info("用户注册: {}", request.getUsername()); return Result.success("注册成功", userService.register(request)); } catch (IllegalArgumentException e) { return Result.validateFailed(e.getMessage()); } catch (Exception e) { log.error("注册失败", e); return Result.error("系统错误"); } } @PostMapping("/login") public Result login(@RequestBody @Valid LoginDto request) { try { log.info("用户登录: {}", request.getUsername()); return Result.success("登录成功", userService.login(request).getToken()); } catch (IllegalArgumentException e) { return Result.unauthorized(e.getMessage()); } catch (Exception e) { log.error("登录失败", e); return Result.error("系统错误"); } } @GetMapping("/current") public Result getCurrentUser() { UserDTO user = userService.getCurrentUser(); if (user == null) { return Result.unauthorized("用户未登录"); } return Result.success(user); } @GetMapping("/{id}") public Result getUserById(@PathVariable Long id) { UserDTO user = userService.getUserById(id); if (user == null) { return Result.notFound("用户不存在"); } return Result.success(user); } @PostMapping("/token/refresh") public Result refreshToken(@RequestHeader(value = "Authorization", required = false) String token) { if (token == null || !token.startsWith("Bearer ")) { return Result.error("无效的token"); } try { String newToken = userService.refreshToken(token.substring(7)); return Result.success(newToken); } catch (Exception e) { log.error("刷新token失败", e); return Result.error(e.getMessage()); } } @PostMapping("/getEmailCode") public Result getEmailCode(@RequestBody @Valid EmailDto emailDto) { String email = emailDto.getEmail(); log.info("邮箱注册: {}", email); Context context = new Context(); context.setVariable("nowDate", DateUtil.now()); String code = RandomUtil.randomNumbers(6); redisUtils.set(email, code, 10); context.setVariable("code", code.toCharArray()); emailService.sendHtmlMessage(email, "养老平台邮箱验证码", "email_template.html", context); return Result.success("邮件验证码发送成功"); } @PostMapping("/getPhoneCode") public Result registerByPhone(@RequestBody @Valid PhoneDto phoneDto) throws Exception { String phone = phoneDto.getPhone(); log.info("手机号注册: {}", phone); String random = RandomUtil.randomNumbers(6); SmsUtils.sendMessage(phone, random); redisUtils.set(phone, random, 10); return Result.success("手机验证码发送成功"); } @PostMapping("/password/reset") public Result resetPassword(@RequestParam @Email String email) { try { userService.resetPassword(email); return Result.success(); } catch (Exception e) { log.error("重置密码失败", e); return Result.error(e.getMessage()); } } @PutMapping("/info") public Result updateUserInfo(@RequestBody @Valid UserDTO userDTO) { try { return Result.success(userService.updateUserInfo(userDTO)); } catch (Exception e) { log.error("更新用户信息失败", e); return Result.error(e.getMessage()); } } }