diff --git a/src/main/java/com/campus/water/controller/RegisterController.java b/src/main/java/com/campus/water/controller/RegisterController.java new file mode 100644 index 0000000..1abe416 --- /dev/null +++ b/src/main/java/com/campus/water/controller/RegisterController.java @@ -0,0 +1,35 @@ +package com.campus.water.controller; + +import com.campus.water.entity.dto.request.RegisterRequest; +import com.campus.water.service.RegisterService; +import com.campus.water.util.ResultVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.validation.Valid; + +/** + * 注册接口控制器(公共接口) + */ +@RestController +@RequestMapping("/api/common") +public class RegisterController { + + @Autowired + private RegisterService registerService; + + /** + * 用户注册接口 + * @param registerRequest 注册请求参数 + * @return 注册结果 + */ + @PostMapping("/register") + public ResponseEntity> register(@Valid @RequestBody RegisterRequest registerRequest) { + boolean success = registerService.register(registerRequest); + return ResponseEntity.ok(ResultVO.success(success, "注册成功")); + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/entity/dto/request/RegisterRequest.java b/src/main/java/com/campus/water/entity/dto/request/RegisterRequest.java new file mode 100644 index 0000000..7283377 --- /dev/null +++ b/src/main/java/com/campus/water/entity/dto/request/RegisterRequest.java @@ -0,0 +1,29 @@ +package com.campus.water.entity.dto.request; + +import lombok.Data; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; + +@Data +public class RegisterRequest { + @NotBlank(message = "用户名不能为空") + private String username; + + @NotBlank(message = "密码不能为空") + @Pattern(regexp = "^[a-zA-Z0-9]{6,16}$", message = "密码必须为6-16位字母或数字") + private String password; + + @NotBlank(message = "用户类型不能为空") + private String userType; // admin/user/repairer + + // 用户特有字段 + private String studentId; // 学生ID(仅user类型需要) + private String studentName; // 学生姓名(仅user类型需要) + + // 管理员特有字段 + private String adminId; // 管理员ID(仅admin类型需要) + private String adminRole; // 管理员角色(仅admin类型需要,SUPER_ADMIN/NORMAL_ADMIN) + + // 维修人员特有字段 + private String repairmanId; // 维修人员ID(仅repairer类型需要) +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/AdminRepository.java b/src/main/java/com/campus/water/mapper/AdminRepository.java index 5c66864..40800cf 100644 --- a/src/main/java/com/campus/water/mapper/AdminRepository.java +++ b/src/main/java/com/campus/water/mapper/AdminRepository.java @@ -38,4 +38,8 @@ public interface AdminRepository extends JpaRepository { // 检查手机号是否存在 boolean existsByPhone(String phone); + + // 检查用户名是否存在 + boolean existsByUsername(String username); + } \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/UserRepository.java b/src/main/java/com/campus/water/mapper/UserRepository.java index 68f9565..9613c5a 100644 --- a/src/main/java/com/campus/water/mapper/UserRepository.java +++ b/src/main/java/com/campus/water/mapper/UserRepository.java @@ -38,6 +38,9 @@ public interface UserRepository extends JpaRepository { // 检查邮箱是否已存在 boolean existsByEmail(String email); + // 检查用户名是否存在 + boolean existsByUsername(String username); + // ========== 新增:登录核心方法(必须) ========== Optional findByUsername(String username); } \ No newline at end of file diff --git a/src/main/java/com/campus/water/service/RegisterService.java b/src/main/java/com/campus/water/service/RegisterService.java new file mode 100644 index 0000000..c7d5e2c --- /dev/null +++ b/src/main/java/com/campus/water/service/RegisterService.java @@ -0,0 +1,103 @@ +package com.campus.water.service; + +import com.campus.water.entity.dto.request.RegisterRequest; +import com.campus.water.entity.po.AdminPO; +import com.campus.water.entity.po.RepairerAuthPO; +import com.campus.water.entity.po.UserPO; +import com.campus.water.mapper.AdminRepository; +import com.campus.water.mapper.RepairerAuthRepository; +import com.campus.water.mapper.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.nio.charset.StandardCharsets; + +@Service +public class RegisterService { + + @Autowired + private AdminRepository adminRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private RepairerAuthRepository repairerAuthRepository; + + public boolean register(RegisterRequest request) { + String username = request.getUsername(); + // 密码MD5加密(与登录逻辑保持一致) + String encryptedPwd = DigestUtils.md5DigestAsHex( + request.getPassword().getBytes(StandardCharsets.UTF_8) + ); + String userType = request.getUserType(); + + switch (userType) { + case "admin": + handleAdminRegister(username, encryptedPwd, request); + break; + case "user": + handleUserRegister(username, encryptedPwd, request); + break; + case "repairer": + handleRepairerRegister(username, encryptedPwd, request); + break; + default: + throw new RuntimeException("无效的用户类型:" + userType); + } + return true; + } + + private void handleAdminRegister(String username, String password, RegisterRequest request) { + // 检查用户名是否已存在 + if (adminRepository.existsByUsername(username)) { + throw new RuntimeException("管理员用户名已存在"); + } + + AdminPO admin = new AdminPO(); + admin.setUsername(username); + admin.setPassword(password); + admin.setAdminId(request.getAdminId()); + admin.setRole(AdminPO.AdminRole.valueOf(request.getAdminRole())); + admin.setStatus(AdminPO.AdminStatus.ACTIVE); + + adminRepository.save(admin); + } + + private void handleUserRegister(String username, String password, RegisterRequest request) { + if (userRepository.existsByUsername(username)) { + throw new RuntimeException("用户名已存在"); + } + if (userRepository.existsByStudentId(request.getStudentId())) { + throw new RuntimeException("学号已被注册"); + } + + UserPO user = new UserPO(); + user.setUsername(username); + user.setPassword(password); + user.setStudentId(request.getStudentId()); + user.setUsername(request.getStudentName()); + user.setStatus(UserPO.UserStatus.ACTIVE); + // 可根据需要补充其他字段默认值 + + userRepository.save(user); + } + + private void handleRepairerRegister(String username, String password, RegisterRequest request) { + if (repairerAuthRepository.existsByUsername(username)) { + throw new RuntimeException("维修人员用户名已存在"); + } + if (repairerAuthRepository.existsByRepairmanId(request.getRepairmanId())) { + throw new RuntimeException("维修人员ID已被注册"); + } + + RepairerAuthPO repairer = new RepairerAuthPO(); + repairer.setUsername(username); + repairer.setPassword(password); + repairer.setRepairmanId(request.getRepairmanId()); + repairer.setAccountStatus(RepairerAuthPO.AccountStatus.active); + + repairerAuthRepository.save(repairer); + } +} \ No newline at end of file