blob: 5561dcd65ef9aa640d4455e42482f6cbe33799ca [file] [log] [blame]
wuchimedes079c1632025-04-02 22:01:20 +08001package com.example.g8backend.controller;
2
wuchimedes5280aa72025-04-03 20:49:34 +08003import com.example.g8backend.dto.UserRegisterDTO;
wuchimedes079c1632025-04-02 22:01:20 +08004import com.example.g8backend.entity.User;
wuchimedes22ee83c2025-04-25 00:17:47 +08005import com.example.g8backend.entity.UserStats;
wuchimedes079c1632025-04-02 22:01:20 +08006import com.example.g8backend.service.IUserService;
wuchimedes22ee83c2025-04-25 00:17:47 +08007import com.example.g8backend.service.IUserStatsService;
wuchimedes079c1632025-04-02 22:01:20 +08008import com.example.g8backend.util.JwtUtil;
wuchimedes5280aa72025-04-03 20:49:34 +08009import com.example.g8backend.util.mailUtil;
wuchimedes079c1632025-04-02 22:01:20 +080010import org.springframework.beans.factory.annotation.Autowired;
wuchimedes18addec2025-04-03 17:59:02 +080011import org.springframework.data.redis.core.RedisTemplate;
wuchimedes079c1632025-04-02 22:01:20 +080012import org.springframework.http.ResponseEntity;
13import org.springframework.security.crypto.password.PasswordEncoder;
14import org.springframework.web.bind.annotation.*;
15
16import java.util.HashMap;
17import java.util.Map;
wuchimedes5280aa72025-04-03 20:49:34 +080018import java.util.UUID;
wuchimedes079c1632025-04-02 22:01:20 +080019
20@RestController
21@RequestMapping("/auth")
22public class AuthController {
23
24 @Autowired
25 private IUserService userService;
wuchimedes079c1632025-04-02 22:01:20 +080026 @Autowired
wuchimedes22ee83c2025-04-25 00:17:47 +080027 private IUserStatsService userStatsService;
28 @Autowired
wuchimedes5280aa72025-04-03 20:49:34 +080029 private mailUtil mailUtil;
wuchimedes5280aa72025-04-03 20:49:34 +080030 @Autowired
wuchimedes079c1632025-04-02 22:01:20 +080031 private PasswordEncoder passwordEncoder;
wuchimedes079c1632025-04-02 22:01:20 +080032 @Autowired
33 private JwtUtil jwtUtil;
wuchimedes18addec2025-04-03 17:59:02 +080034 @Autowired
35 RedisTemplate<String, Object> redisTemplate;
36
wuchimedes5280aa72025-04-03 20:49:34 +080037 // 发送验证码
38 @PostMapping("/send_verification_code")
39 public ResponseEntity<?> sendVerificationCode(@RequestBody UserRegisterDTO registerDTO) {
40 if (userService.getUserByEmail(registerDTO.getEmail()) != null) {
41 return ResponseEntity.badRequest().body("邮箱已存在");
42 }
43
44 String verificationCode = UUID.randomUUID().toString().substring(0, 6);
45 mailUtil.sendMail(registerDTO.getEmail(), "PT平台注册验证码", "您的验证码为:" + verificationCode + ",验证码十分钟内有效,请勿泄露。");
46
47 redisTemplate.opsForValue().set(registerDTO.getEmail(), verificationCode, 10 * 60, java.util.concurrent.TimeUnit.SECONDS);
48 return ResponseEntity.ok("验证码发送成功");
49 }
50
wuchimedes079c1632025-04-02 22:01:20 +080051 // 用户注册
52 @PostMapping("/register")
wuchimedes5280aa72025-04-03 20:49:34 +080053 public ResponseEntity<?> register(@RequestBody UserRegisterDTO registerDTO) {
54 if (userService.getUserByName(registerDTO.getUserName()) != null) {
wuchimedes079c1632025-04-02 22:01:20 +080055 return ResponseEntity.badRequest().body("用户名已存在");
56 }
wuchimedes5280aa72025-04-03 20:49:34 +080057
58 if (!redisTemplate.hasKey(registerDTO.getInvitationCode())) {
59 return ResponseEntity.badRequest().body("邀请码错误");
60 }
61 if (!registerDTO.getVerificationCode().equals(redisTemplate.opsForValue().get(registerDTO.getEmail()))) {
62 return ResponseEntity.badRequest().body("验证码错误");
63 }
64 redisTemplate.delete(registerDTO.getEmail());
65
66 User user = new User();
67 user.setUserName(registerDTO.getUserName());
68 user.setPassword(passwordEncoder.encode(registerDTO.getPassword()));
69 user.setEmail(registerDTO.getEmail());
wuchimedesa0649c62025-04-05 15:53:39 +080070
71 // passkey 用于在客户端发送announce请求时获取用户信息
72 user.setPasskey(UUID.randomUUID().toString().replace("-", ""));
wuchimedese5722e32025-04-13 17:38:50 +080073 userService.save(user);
wuchimedes5280aa72025-04-03 20:49:34 +080074
wuchimedes22ee83c2025-04-25 00:17:47 +080075 // 保存用户统计用户的上传量与下载量
76 UserStats userStats = new UserStats();
77 userStats.setUserId(user.getUserId());
78 userStats.setPasskey(user.getPasskey());
79 userStatsService.save(userStats);
80
wuchimedes079c1632025-04-02 22:01:20 +080081 return ResponseEntity.ok("注册成功");
82 }
83
84 // 用户登录
85 @PostMapping("/login")
86 public ResponseEntity<?> login(@RequestBody User user) {
87 User existingUser = userService.getUserByEmail(user.getEmail());
88 if (existingUser == null || !passwordEncoder.matches(user.getPassword(), existingUser.getPassword())) {
89 return ResponseEntity.badRequest().body("用户名或密码错误");
90 }
wuchimedes223bfab2025-04-04 17:16:05 +080091 String token = jwtUtil.generateToken(existingUser.getUserId());
wuchimedes079c1632025-04-02 22:01:20 +080092 Map<String, String> response = new HashMap<>();
93 response.put("token", token);
94 return ResponseEntity.ok(response);
95 }
wuchimedes18addec2025-04-03 17:59:02 +080096
97 @GetMapping("/test_redis")
98 public ResponseEntity<?> testRedis() {
99 redisTemplate.opsForValue().get("test");
100 return ResponseEntity.ok("test redis ok");
101 }
wuchimedes079c1632025-04-02 22:01:20 +0800102}