From c3f7b955a8cc671de48b617dbbd351af5cbc0afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E7=AB=9E=E7=94=B1?= <1193626695@qq.com> Date: Sun, 30 Nov 2025 17:28:45 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 + .../controller/GlobalExceptionHandler.java | 25 ++++++ .../water/controller/LoginController.java | 35 ++++++++ .../controller/WaterUsageController.java | 2 +- .../water/controller/WorkOrderController.java | 6 +- .../entity/dto/request/LoginRequest.java | 17 ++++ .../com/campus/water/entity/po/AdminPO.java | 37 ++++++++ .../water/entity/po/RepairerAuthPO.java | 35 ++++++++ .../com/campus/water/entity/po/UserPO.java | 23 +++++ .../com/campus/water/entity/vo/LoginVO.java | 12 +++ .../campus/water/mapper/AdminRepository.java | 23 ----- .../water/mapper/RepairerAuthRepository.java | 21 ----- .../campus/water/mapper/UserRepository.java | 24 ----- .../water/repository/AdminRepository.java | 28 ++++++ .../AlertRepository.java | 2 +- .../AreaRepository.java | 2 +- .../DeviceRepository.java | 2 +- .../DeviceTerminalMappingRepository.java | 2 +- .../DrinkRecommendationRepository.java | 2 +- .../DrinkRecordRepository.java | 2 +- .../InspectionRecordRepository.java | 2 +- .../MaintenancePlanRepository.java | 2 +- .../MessagePushRepository.java | 2 +- .../repository/RepairerAuthRepository.java | 31 +++++++ .../RepairmanRepository.java | 2 +- .../TerminalUsageStatsRepository.java | 2 +- .../water/repository/UserRepository.java | 18 ++++ .../WaterMakerRealtimeDataRepository.java | 2 +- .../WaterQualityHistoryRepository.java | 2 +- .../WaterSupplyRealtimeDataRepository.java | 2 +- .../WorkOrderRepository.java | 2 +- .../water/{mapper => repository}/先读我.md | 0 .../campus/water/service/LoginService.java | 90 +++++++++++++++++++ .../water/service/MqttSensorReceiver.java | 6 +- .../app/WorkOrderControllerTest.java | 74 +++++++++++++++ .../commen/LoginControllerTest.java | 73 +++++++++++++++ .../web/DeviceDataControllerTest.java | 55 ++++++++++++ .../java/com/campus/water/test/BaseTest.java | 29 ++++++ 38 files changed, 606 insertions(+), 90 deletions(-) create mode 100644 src/main/java/com/campus/water/controller/GlobalExceptionHandler.java create mode 100644 src/main/java/com/campus/water/controller/LoginController.java create mode 100644 src/main/java/com/campus/water/entity/dto/request/LoginRequest.java create mode 100644 src/main/java/com/campus/water/entity/po/AdminPO.java create mode 100644 src/main/java/com/campus/water/entity/po/RepairerAuthPO.java create mode 100644 src/main/java/com/campus/water/entity/po/UserPO.java create mode 100644 src/main/java/com/campus/water/entity/vo/LoginVO.java delete mode 100644 src/main/java/com/campus/water/mapper/AdminRepository.java delete mode 100644 src/main/java/com/campus/water/mapper/RepairerAuthRepository.java delete mode 100644 src/main/java/com/campus/water/mapper/UserRepository.java create mode 100644 src/main/java/com/campus/water/repository/AdminRepository.java rename src/main/java/com/campus/water/{mapper => repository}/AlertRepository.java (95%) rename src/main/java/com/campus/water/{mapper => repository}/AreaRepository.java (95%) rename src/main/java/com/campus/water/{mapper => repository}/DeviceRepository.java (94%) rename src/main/java/com/campus/water/{mapper => repository}/DeviceTerminalMappingRepository.java (94%) rename src/main/java/com/campus/water/{mapper => repository}/DrinkRecommendationRepository.java (97%) rename src/main/java/com/campus/water/{mapper => repository}/DrinkRecordRepository.java (98%) rename src/main/java/com/campus/water/{mapper => repository}/InspectionRecordRepository.java (96%) rename src/main/java/com/campus/water/{mapper => repository}/MaintenancePlanRepository.java (96%) rename src/main/java/com/campus/water/{mapper => repository}/MessagePushRepository.java (97%) create mode 100644 src/main/java/com/campus/water/repository/RepairerAuthRepository.java rename src/main/java/com/campus/water/{mapper => repository}/RepairmanRepository.java (94%) rename src/main/java/com/campus/water/{mapper => repository}/TerminalUsageStatsRepository.java (97%) create mode 100644 src/main/java/com/campus/water/repository/UserRepository.java rename src/main/java/com/campus/water/{mapper => repository}/WaterMakerRealtimeDataRepository.java (98%) rename src/main/java/com/campus/water/{mapper => repository}/WaterQualityHistoryRepository.java (98%) rename src/main/java/com/campus/water/{mapper => repository}/WaterSupplyRealtimeDataRepository.java (98%) rename src/main/java/com/campus/water/{mapper => repository}/WorkOrderRepository.java (96%) rename src/main/java/com/campus/water/{mapper => repository}/先读我.md (100%) create mode 100644 src/main/java/com/campus/water/service/LoginService.java create mode 100644 src/test/java/com/campus/water/controller/app/WorkOrderControllerTest.java create mode 100644 src/test/java/com/campus/water/controller/commen/LoginControllerTest.java create mode 100644 src/test/java/com/campus/water/controller/web/DeviceDataControllerTest.java create mode 100644 src/test/java/com/campus/water/test/BaseTest.java diff --git a/pom.xml b/pom.xml index 70df03e..7e749dd 100644 --- a/pom.xml +++ b/pom.xml @@ -74,6 +74,8 @@ spring-boot-starter-test test + + diff --git a/src/main/java/com/campus/water/controller/GlobalExceptionHandler.java b/src/main/java/com/campus/water/controller/GlobalExceptionHandler.java new file mode 100644 index 0000000..832f5e0 --- /dev/null +++ b/src/main/java/com/campus/water/controller/GlobalExceptionHandler.java @@ -0,0 +1,25 @@ +package main.java.com.campus.water.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.HashMap; +import java.util.Map; + +/** + * 全局异常处理,统一响应格式 + */ +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(RuntimeException.class) + public ResponseEntity> handleRuntimeException(RuntimeException e) { + Map response = new HashMap<>(); + response.put("code", 401); // 权限相关错误用401,其他可调整 + response.put("msg", e.getMessage()); + response.put("data", null); + return new ResponseEntity<>(response, HttpStatus.OK); + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/controller/LoginController.java b/src/main/java/com/campus/water/controller/LoginController.java new file mode 100644 index 0000000..48f2ee8 --- /dev/null +++ b/src/main/java/com/campus/water/controller/LoginController.java @@ -0,0 +1,35 @@ +package com.campus.water.controller; // 修正包路径:去掉main.java + 按规范放在common子包 + +import com.campus.water.entity.dto.request.LoginRequest; // 替换原LoginDTO为规范的LoginRequest +import com.campus.water.entity.vo.LoginVO; +import com.campus.water.service.LoginService; +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 javax.validation.Valid; + +/** + * 登录接口控制器(公共接口) + */ +@RestController +@RequestMapping("/api/common") // 保持统一接口前缀 +public class LoginController { + + @Autowired + private LoginService loginService; + + /** + * 登录接口 + * @param loginRequest 登录请求参数(替换原LoginDTO) + * @return 登录响应结果 + */ + @PostMapping("/login") + public ResponseEntity login(@Valid @RequestBody LoginRequest loginRequest) { // 参数类型替换为LoginRequest + LoginVO loginVO = loginService.login(loginRequest); // 同步修改入参类型 + return ResponseEntity.ok(loginVO); + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/controller/WaterUsageController.java b/src/main/java/com/campus/water/controller/WaterUsageController.java index 67f0187..1c22a58 100644 --- a/src/main/java/com/campus/water/controller/WaterUsageController.java +++ b/src/main/java/com/campus/water/controller/WaterUsageController.java @@ -1,7 +1,7 @@ package com.campus.water.controller; import com.campus.water.entity.*; -import com.campus.water.mapper.*; +import com.campus.water.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/campus/water/controller/WorkOrderController.java b/src/main/java/com/campus/water/controller/WorkOrderController.java index 100ef56..86a2618 100644 --- a/src/main/java/com/campus/water/controller/WorkOrderController.java +++ b/src/main/java/com/campus/water/controller/WorkOrderController.java @@ -1,9 +1,9 @@ package com.campus.water.controller; import com.campus.water.entity.WorkOrder; -import com.campus.water.mapper.WorkOrderRepository; -import com.campus.water.mapper.RepairmanRepository; -import com.campus.water.mapper.AlertRepository; +import com.campus.water.repository.WorkOrderRepository; +import com.campus.water.repository.RepairmanRepository; +import com.campus.water.repository.AlertRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/campus/water/entity/dto/request/LoginRequest.java b/src/main/java/com/campus/water/entity/dto/request/LoginRequest.java new file mode 100644 index 0000000..b96e757 --- /dev/null +++ b/src/main/java/com/campus/water/entity/dto/request/LoginRequest.java @@ -0,0 +1,17 @@ +// LoginRequest.java(原LoginDTO,按项目规范重命名) +package com.campus.water.entity.dto.request; + +import lombok.Data; +import javax.validation.constraints.NotBlank; + +@Data +public class LoginRequest { // 命名改为Request,符合dto/request分类 + @NotBlank(message = "用户名不能为空") + private String username; + + @NotBlank(message = "密码不能为空") + private String password; + + @NotBlank(message = "用户类型不能为空") + private String userType; // admin/repairer/user +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/entity/po/AdminPO.java b/src/main/java/com/campus/water/entity/po/AdminPO.java new file mode 100644 index 0000000..f7dcf8d --- /dev/null +++ b/src/main/java/com/campus/water/entity/po/AdminPO.java @@ -0,0 +1,37 @@ +package com.campus.water.entity.po; + +import lombok.Data; +import javax.persistence.*; + +@Data +@Entity +@Table(name = "admin") // 对应数据库admin表 +public class AdminPO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增(根据数据库调整) + private String adminId; + + @Column(unique = true, nullable = false) + private String username; // 登录用户名 + + @Column(nullable = false) + private String password; // MD5加密后的密码 + + private String phone; // 联系电话 + + // 管理员角色枚举 + public enum AdminRole { + SUPER_ADMIN, NORMAL_ADMIN + } + + // 管理员状态枚举 + public enum AdminStatus { + ACTIVE, INACTIVE + } + + @Enumerated(EnumType.STRING) // 枚举以字符串形式存储 + private AdminRole role; + + @Enumerated(EnumType.STRING) + private AdminStatus status; +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/entity/po/RepairerAuthPO.java b/src/main/java/com/campus/water/entity/po/RepairerAuthPO.java new file mode 100644 index 0000000..14e6590 --- /dev/null +++ b/src/main/java/com/campus/water/entity/po/RepairerAuthPO.java @@ -0,0 +1,35 @@ +package com.campus.water.entity.po; + +import lombok.Data; +import javax.persistence.*; + +@Data +@Entity +@Table(name = "repairer_auth") // 对应数据库表 +public class RepairerAuthPO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增(Long类型) + private Long id; // 主键ID(对应Repository的Long主键类型) + + @Column(unique = true, nullable = false) + private String repairmanId; // 维修人员唯一标识(业务ID) + + @Column(unique = true, nullable = false) + private String username; // 登录用户名 + + @Column(nullable = false) + private String password; // MD5加密密码 + + // 账号状态枚举(和Repository的AccountStatus匹配) + public enum AccountStatus { + active, inactive, locked + } + + @Enumerated(EnumType.STRING) // 枚举以字符串存储(匹配SQL里的'active') + private AccountStatus accountStatus; + + // 补充其他业务字段(按需添加) + private String phone; // 联系电话 + private String areaId; // 负责区域ID + private String name; // 维修人员姓名 +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/entity/po/UserPO.java b/src/main/java/com/campus/water/entity/po/UserPO.java new file mode 100644 index 0000000..40d5bfb --- /dev/null +++ b/src/main/java/com/campus/water/entity/po/UserPO.java @@ -0,0 +1,23 @@ +package com.campus.water.entity.po; + +import lombok.Data; +import javax.persistence.*; + +@Data +@Entity +@Table(name = "user") // 对应数据库user表(学生用户) +public class UserPO { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private String studentId; // 学生ID(主键) + + @Column(unique = true, nullable = false) + private String username; // 登录用户名 + + @Column(nullable = false) + private String password; // MD5加密后的密码 + + private String phone; // 联系电话 + private String studentNo; // 学号 + private String college; // 学院 +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/entity/vo/LoginVO.java b/src/main/java/com/campus/water/entity/vo/LoginVO.java new file mode 100644 index 0000000..ff2b8e5 --- /dev/null +++ b/src/main/java/com/campus/water/entity/vo/LoginVO.java @@ -0,0 +1,12 @@ +// LoginVO.java(保持VO命名,无需修改) +package com.campus.water.entity.vo; + +import lombok.Data; + +@Data +public class LoginVO { + private String token; // 登录令牌 + private String userId; // 用户ID + private String username; // 用户名 + private String userType; // 用户类型 +} \ 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 deleted file mode 100644 index d72c736..0000000 --- a/src/main/java/com/campus/water/mapper/AdminRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.campus.water.mapper; - -import com.campus.water.entity.Admin; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; -import java.util.List; -import java.util.Optional; - -@Repository -public interface AdminRepository extends JpaRepository { - Optional findByAdminId(String adminId); - List findByAdminNameContaining(String adminName); - List findByRole(Admin.AdminRole role); - List findByStatus(Admin.AdminStatus status); - Optional findByPhone(String phone); - - @Query("SELECT a FROM Admin a WHERE a.role = ?1 AND a.status = ?2") - List findByRoleAndStatus(Admin.AdminRole role, Admin.AdminStatus status); - - boolean existsByAdminId(String adminId); - boolean existsByPhone(String phone); -} \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java b/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java deleted file mode 100644 index 96e9148..0000000 --- a/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.campus.water.mapper; - -import com.campus.water.entity.RepairerAuth; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; -import java.util.List; -import java.util.Optional; - -@Repository -public interface RepairerAuthRepository extends JpaRepository { - Optional findByUsername(String username); - Optional findByRepairmanId(String repairmanId); - List findByAccountStatus(RepairerAuth.AccountStatus accountStatus); - - @Query("SELECT ra FROM RepairerAuth ra WHERE ra.username = ?1 AND ra.accountStatus = 'active'") - Optional findActiveByUsername(String username); - - boolean existsByUsername(String username); - boolean existsByRepairmanId(String repairmanId); -} \ 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 deleted file mode 100644 index 30ae620..0000000 --- a/src/main/java/com/campus/water/mapper/UserRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.campus.water.mapper; - -import com.campus.water.entity.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; -import java.util.List; -import java.util.Optional; - -@Repository -public interface UserRepository extends JpaRepository { - Optional findByStudentId(String studentId); - List findByStudentNameContaining(String studentName); - List findByStatus(User.UserStatus status); - Optional findByPhone(String phone); - Optional findByEmail(String email); - - @Query("SELECT u FROM User u WHERE u.studentName LIKE %?1% AND u.status = ?2") - List findByStudentNameContainingAndStatus(String studentName, User.UserStatus status); - - boolean existsByStudentId(String studentId); - boolean existsByPhone(String phone); - boolean existsByEmail(String email); -} \ No newline at end of file diff --git a/src/main/java/com/campus/water/repository/AdminRepository.java b/src/main/java/com/campus/water/repository/AdminRepository.java new file mode 100644 index 0000000..75cd537 --- /dev/null +++ b/src/main/java/com/campus/water/repository/AdminRepository.java @@ -0,0 +1,28 @@ +package com.campus.water.repository; + +import com.campus.water.entity.po.AdminPO; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface AdminRepository extends JpaRepository { + // 登录核心:通过用户名查询 + Optional findByUsername(String username); + + // 原有业务方法 + Optional findByAdminId(String adminId); + List findByUsernameContaining(String username); + List findByRole(AdminPO.AdminRole role); + List findByStatus(AdminPO.AdminStatus status); + Optional findByPhone(String phone); + + @Query("SELECT a FROM AdminPO a WHERE a.role = ?1 AND a.status = ?2") + List findByRoleAndStatus(AdminPO.AdminRole role, AdminPO.AdminStatus status); + + boolean existsByAdminId(String adminId); + boolean existsByPhone(String phone); +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/AlertRepository.java b/src/main/java/com/campus/water/repository/AlertRepository.java similarity index 95% rename from src/main/java/com/campus/water/mapper/AlertRepository.java rename to src/main/java/com/campus/water/repository/AlertRepository.java index adef168..63df742 100644 --- a/src/main/java/com/campus/water/mapper/AlertRepository.java +++ b/src/main/java/com/campus/water/repository/AlertRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.Alert; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/AreaRepository.java b/src/main/java/com/campus/water/repository/AreaRepository.java similarity index 95% rename from src/main/java/com/campus/water/mapper/AreaRepository.java rename to src/main/java/com/campus/water/repository/AreaRepository.java index 4eb7a3d..61b87b1 100644 --- a/src/main/java/com/campus/water/mapper/AreaRepository.java +++ b/src/main/java/com/campus/water/repository/AreaRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.Area; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/DeviceRepository.java b/src/main/java/com/campus/water/repository/DeviceRepository.java similarity index 94% rename from src/main/java/com/campus/water/mapper/DeviceRepository.java rename to src/main/java/com/campus/water/repository/DeviceRepository.java index 3173c37..4b5fcee 100644 --- a/src/main/java/com/campus/water/mapper/DeviceRepository.java +++ b/src/main/java/com/campus/water/repository/DeviceRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.Device; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/DeviceTerminalMappingRepository.java b/src/main/java/com/campus/water/repository/DeviceTerminalMappingRepository.java similarity index 94% rename from src/main/java/com/campus/water/mapper/DeviceTerminalMappingRepository.java rename to src/main/java/com/campus/water/repository/DeviceTerminalMappingRepository.java index 53b2bd7..dd87e10 100644 --- a/src/main/java/com/campus/water/mapper/DeviceTerminalMappingRepository.java +++ b/src/main/java/com/campus/water/repository/DeviceTerminalMappingRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.DeviceTerminalMapping; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/DrinkRecommendationRepository.java b/src/main/java/com/campus/water/repository/DrinkRecommendationRepository.java similarity index 97% rename from src/main/java/com/campus/water/mapper/DrinkRecommendationRepository.java rename to src/main/java/com/campus/water/repository/DrinkRecommendationRepository.java index 2c311db..cc950ce 100644 --- a/src/main/java/com/campus/water/mapper/DrinkRecommendationRepository.java +++ b/src/main/java/com/campus/water/repository/DrinkRecommendationRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.DrinkRecommendation; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/DrinkRecordRepository.java b/src/main/java/com/campus/water/repository/DrinkRecordRepository.java similarity index 98% rename from src/main/java/com/campus/water/mapper/DrinkRecordRepository.java rename to src/main/java/com/campus/water/repository/DrinkRecordRepository.java index 544d217..51ca7e0 100644 --- a/src/main/java/com/campus/water/mapper/DrinkRecordRepository.java +++ b/src/main/java/com/campus/water/repository/DrinkRecordRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.DrinkRecord; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/InspectionRecordRepository.java b/src/main/java/com/campus/water/repository/InspectionRecordRepository.java similarity index 96% rename from src/main/java/com/campus/water/mapper/InspectionRecordRepository.java rename to src/main/java/com/campus/water/repository/InspectionRecordRepository.java index 06d1c64..24383b1 100644 --- a/src/main/java/com/campus/water/mapper/InspectionRecordRepository.java +++ b/src/main/java/com/campus/water/repository/InspectionRecordRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.InspectionRecord; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/MaintenancePlanRepository.java b/src/main/java/com/campus/water/repository/MaintenancePlanRepository.java similarity index 96% rename from src/main/java/com/campus/water/mapper/MaintenancePlanRepository.java rename to src/main/java/com/campus/water/repository/MaintenancePlanRepository.java index e8b7aec..c7e1d64 100644 --- a/src/main/java/com/campus/water/mapper/MaintenancePlanRepository.java +++ b/src/main/java/com/campus/water/repository/MaintenancePlanRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.MaintenancePlan; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/MessagePushRepository.java b/src/main/java/com/campus/water/repository/MessagePushRepository.java similarity index 97% rename from src/main/java/com/campus/water/mapper/MessagePushRepository.java rename to src/main/java/com/campus/water/repository/MessagePushRepository.java index dd0a65d..a8e11ed 100644 --- a/src/main/java/com/campus/water/mapper/MessagePushRepository.java +++ b/src/main/java/com/campus/water/repository/MessagePushRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.MessagePush; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/repository/RepairerAuthRepository.java b/src/main/java/com/campus/water/repository/RepairerAuthRepository.java new file mode 100644 index 0000000..f845cdd --- /dev/null +++ b/src/main/java/com/campus/water/repository/RepairerAuthRepository.java @@ -0,0 +1,31 @@ +package com.campus.water.repository; + +import com.campus.water.entity.po.RepairerAuthPO; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface RepairerAuthRepository extends JpaRepository { + // 登录核心:通过用户名查询 + Optional findByUsername(String username); + + // 按维修人员ID查询 + Optional findByRepairmanId(String repairmanId); + + // 按账号状态查询(引用PO内的枚举) + List findByAccountStatus(RepairerAuthPO.AccountStatus accountStatus); + + // 自定义查询:查询活跃状态的用户 + @Query("SELECT ra FROM RepairerAuthPO ra WHERE ra.username = ?1 AND ra.accountStatus = 'active'") + Optional findActiveByUsername(String username); + + // 校验用户名是否存在 + boolean existsByUsername(String username); + + // 校验维修人员ID是否存在 + boolean existsByRepairmanId(String repairmanId); +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/RepairmanRepository.java b/src/main/java/com/campus/water/repository/RepairmanRepository.java similarity index 94% rename from src/main/java/com/campus/water/mapper/RepairmanRepository.java rename to src/main/java/com/campus/water/repository/RepairmanRepository.java index 56fc165..66667b9 100644 --- a/src/main/java/com/campus/water/mapper/RepairmanRepository.java +++ b/src/main/java/com/campus/water/repository/RepairmanRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.Repairman; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/TerminalUsageStatsRepository.java b/src/main/java/com/campus/water/repository/TerminalUsageStatsRepository.java similarity index 97% rename from src/main/java/com/campus/water/mapper/TerminalUsageStatsRepository.java rename to src/main/java/com/campus/water/repository/TerminalUsageStatsRepository.java index dafc11b..81be44f 100644 --- a/src/main/java/com/campus/water/mapper/TerminalUsageStatsRepository.java +++ b/src/main/java/com/campus/water/repository/TerminalUsageStatsRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.TerminalUsageStats; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/repository/UserRepository.java b/src/main/java/com/campus/water/repository/UserRepository.java new file mode 100644 index 0000000..e834cbf --- /dev/null +++ b/src/main/java/com/campus/water/repository/UserRepository.java @@ -0,0 +1,18 @@ +package com.campus.water.repository; + +import com.campus.water.entity.po.UserPO; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface UserRepository extends JpaRepository { + // 登录核心:通过用户名查询 + Optional findByUsername(String username); + + // 可补充其他业务方法(如按学号查询) + Optional findByStudentNo(String studentNo); + boolean existsByUsername(String username); + boolean existsByStudentNo(String studentNo); +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java b/src/main/java/com/campus/water/repository/WaterMakerRealtimeDataRepository.java similarity index 98% rename from src/main/java/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java rename to src/main/java/com/campus/water/repository/WaterMakerRealtimeDataRepository.java index 7546bc0..1972772 100644 --- a/src/main/java/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java +++ b/src/main/java/com/campus/water/repository/WaterMakerRealtimeDataRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.WaterMakerRealtimeData; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/WaterQualityHistoryRepository.java b/src/main/java/com/campus/water/repository/WaterQualityHistoryRepository.java similarity index 98% rename from src/main/java/com/campus/water/mapper/WaterQualityHistoryRepository.java rename to src/main/java/com/campus/water/repository/WaterQualityHistoryRepository.java index 74d956b..e512af5 100644 --- a/src/main/java/com/campus/water/mapper/WaterQualityHistoryRepository.java +++ b/src/main/java/com/campus/water/repository/WaterQualityHistoryRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.WaterQualityHistory; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java b/src/main/java/com/campus/water/repository/WaterSupplyRealtimeDataRepository.java similarity index 98% rename from src/main/java/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java rename to src/main/java/com/campus/water/repository/WaterSupplyRealtimeDataRepository.java index b43ec7e..c696204 100644 --- a/src/main/java/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java +++ b/src/main/java/com/campus/water/repository/WaterSupplyRealtimeDataRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.WaterSupplyRealtimeData; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/WorkOrderRepository.java b/src/main/java/com/campus/water/repository/WorkOrderRepository.java similarity index 96% rename from src/main/java/com/campus/water/mapper/WorkOrderRepository.java rename to src/main/java/com/campus/water/repository/WorkOrderRepository.java index 4fb1c70..a485ed5 100644 --- a/src/main/java/com/campus/water/mapper/WorkOrderRepository.java +++ b/src/main/java/com/campus/water/repository/WorkOrderRepository.java @@ -1,4 +1,4 @@ -package com.campus.water.mapper; +package com.campus.water.repository; import com.campus.water.entity.WorkOrder; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/campus/water/mapper/先读我.md b/src/main/java/com/campus/water/repository/先读我.md similarity index 100% rename from src/main/java/com/campus/water/mapper/先读我.md rename to src/main/java/com/campus/water/repository/先读我.md diff --git a/src/main/java/com/campus/water/service/LoginService.java b/src/main/java/com/campus/water/service/LoginService.java new file mode 100644 index 0000000..6a8f5d0 --- /dev/null +++ b/src/main/java/com/campus/water/service/LoginService.java @@ -0,0 +1,90 @@ +package com.campus.water.service; + +import com.campus.water.entity.dto.request.LoginRequest; // 对齐你的DTO目录 +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.entity.vo.LoginVO; +import com.campus.water.repository.AdminRepository; +import com.campus.water.repository.RepairerAuthRepository; +import com.campus.water.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.nio.charset.StandardCharsets; +import java.util.UUID; + +@Service +public class LoginService { + + @Autowired + private AdminRepository adminRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private RepairerAuthRepository repairerAuthRepository; + + public LoginVO login(LoginRequest loginRequest) { + String username = loginRequest.getUsername(); + // 密码MD5加密(和数据库存储的一致) + String encryptedPwd = DigestUtils.md5DigestAsHex( + loginRequest.getPassword().getBytes(StandardCharsets.UTF_8) + ); + String userType = loginRequest.getUserType(); + + switch (userType) { + case "admin": + return handleAdminLogin(username, encryptedPwd); + case "user": + return handleUserLogin(username, encryptedPwd); + case "repairer": + return handleRepairerLogin(username, encryptedPwd); + default: + throw new RuntimeException("无效的用户类型:" + userType); + } + } + + // 管理员登录(复用JPA的findByUsername) + private LoginVO handleAdminLogin(String username, String password) { + AdminPO admin = adminRepository.findByUsername(username) + .orElseThrow(() -> new RuntimeException("管理员不存在")); + if (!admin.getPassword().equals(password)) { + throw new RuntimeException("密码错误"); + } + return createLoginVO(admin.getAdminId(), username, "admin"); + } + + // 学生登录 + private LoginVO handleUserLogin(String username, String password) { + UserPO user = userRepository.findByUsername(username) + .orElseThrow(() -> new RuntimeException("用户不存在")); + if (!user.getPassword().equals(password)) { + throw new RuntimeException("密码错误"); + } + return createLoginVO(user.getStudentId(), username, "user"); + } + + // 维修人员登录 + private LoginVO handleRepairerLogin(String username, String password) { + RepairerAuthPO repairer = repairerAuthRepository.findByUsername(username) + .orElseThrow(() -> new RuntimeException("维修人员不存在")); + if (!repairer.getPassword().equals(password)) { + throw new RuntimeException("密码错误"); + } + return createLoginVO(repairer.getRepairmanId(), username, "repairer"); + } + + // 构建登录响应VO + private LoginVO createLoginVO(String userId, String username, String userType) { + LoginVO vo = new LoginVO(); + vo.setUserId(userId); + vo.setUsername(username); + vo.setUserType(userType); + // 临时Token(后续可替换为JWT) + vo.setToken(UUID.randomUUID().toString().replace("-", "")); + return vo; + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/service/MqttSensorReceiver.java b/src/main/java/com/campus/water/service/MqttSensorReceiver.java index c8af40e..db3cd16 100644 --- a/src/main/java/com/campus/water/service/MqttSensorReceiver.java +++ b/src/main/java/com/campus/water/service/MqttSensorReceiver.java @@ -4,9 +4,9 @@ import com.campus.water.config.MqttConfig; import com.campus.water.entity.Alert; import com.campus.water.entity.WaterMakerRealtimeData; import com.campus.water.entity.WaterSupplyRealtimeData; -import com.campus.water.mapper.AlertRepository; -import com.campus.water.mapper.WaterMakerRealtimeDataRepository; -import com.campus.water.mapper.WaterSupplyRealtimeDataRepository; +import com.campus.water.repository.AlertRepository; +import com.campus.water.repository.WaterMakerRealtimeDataRepository; +import com.campus.water.repository.WaterSupplyRealtimeDataRepository; import com.campus.water.model.WaterMakerSensorData; import com.campus.water.model.WaterSupplySensorData; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/campus/water/controller/app/WorkOrderControllerTest.java b/src/test/java/com/campus/water/controller/app/WorkOrderControllerTest.java new file mode 100644 index 0000000..732b7a7 --- /dev/null +++ b/src/test/java/com/campus/water/controller/app/WorkOrderControllerTest.java @@ -0,0 +1,74 @@ +package com.campus.water.controller.app; + +import com.campus.water.test.BaseTest; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import java.util.HashMap; +import java.util.Map; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +/** + * 工单管理接口测试(抢单/拒单,后端2开发) + * 直接复制粘贴,修改接口路径即可 + */ +public class WorkOrderControllerTest extends BaseTest { + + // 工具:将Map转为JSON字符串 + private final ObjectMapper objectMapper = new ObjectMapper(); + + // 测试1:维修人员抢单(正常场景) + @Test + public void testGrabWorkOrder() throws Exception { + // 构造请求参数 + Map params = new HashMap<>(); + params.put("orderId", "1001"); // 测试工单ID + params.put("repairId", "REPAIR001"); // 测试维修人员ID + + mockMvc.perform( + // 替换为你项目的抢单接口路径,比如/api/app/workOrder/grab + post("/api/app/workOrder/grab") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(params)) // 传入JSON参数 + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.msg").value("抢单成功")); + } + + // 测试2:抢已被抢的工单(异常场景) + @Test + public void testGrabGrabbedOrder() throws Exception { + Map params = new HashMap<>(); + params.put("orderId", "1001"); // 已被抢的工单ID + params.put("repairId", "REPAIR002"); + + mockMvc.perform( + post("/api/app/workOrder/grab") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(params)) + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(500)) + .andExpect(jsonPath("$.msg").value("工单已被抢")); + } + + // 测试3:维修人员拒单 + @Test + public void testRejectWorkOrder() throws Exception { + Map params = new HashMap<>(); + params.put("orderId", "1002"); + params.put("repairId", "REPAIR001"); + params.put("reason", "设备位置太远"); // 拒单原因 + + mockMvc.perform( + post("/api/app/workOrder/reject") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(params)) + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.msg").value("拒单成功")); + } +} \ No newline at end of file diff --git a/src/test/java/com/campus/water/controller/commen/LoginControllerTest.java b/src/test/java/com/campus/water/controller/commen/LoginControllerTest.java new file mode 100644 index 0000000..2b5f57f --- /dev/null +++ b/src/test/java/com/campus/water/controller/commen/LoginControllerTest.java @@ -0,0 +1,73 @@ +package com.campus.water.controller.common; + +import com.campus.water.test.BaseTest; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import java.util.HashMap; +import java.util.Map; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +/** + * 登录接口测试用例 + */ +public class LoginControllerTest extends BaseTest { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + // 测试1:维修人员正常登录 + @Test + public void testRepairLogin() throws Exception { + Map loginParams = new HashMap<>(); + loginParams.put("username", "REPAIR001"); + loginParams.put("password", "123456"); + loginParams.put("userType", "repairer"); // 必须指定用户类型 + + mockMvc.perform( + post("/api/common/login") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(loginParams)) + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) // 正常响应code + .andExpect(jsonPath("$.data.token").isNotEmpty()) + .andExpect(jsonPath("$.data.userType").value("repairer")); + } + + // 测试2:学生登录(密码错误) + @Test + public void testStudentLoginWithWrongPwd() throws Exception { + Map loginParams = new HashMap<>(); + loginParams.put("username", "STUDENT001"); + loginParams.put("password", "wrong123"); + loginParams.put("userType", "user"); + + mockMvc.perform( + post("/api/common/login") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(loginParams)) + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(401)) + .andExpect(jsonPath("$.msg").value("密码错误")); + } + + // 测试3:无效用户类型 + @Test + public void testInvalidUserType() throws Exception { + Map loginParams = new HashMap<>(); + loginParams.put("username", "TEST001"); + loginParams.put("password", "123456"); + loginParams.put("userType", "invalid"); + + mockMvc.perform( + post("/api/common/login") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(loginParams)) + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(401)) + .andExpect(jsonPath("$.msg").value("无效的用户类型:invalid")); + } +} \ No newline at end of file diff --git a/src/test/java/com/campus/water/controller/web/DeviceDataControllerTest.java b/src/test/java/com/campus/water/controller/web/DeviceDataControllerTest.java new file mode 100644 index 0000000..02c238e --- /dev/null +++ b/src/test/java/com/campus/water/controller/web/DeviceDataControllerTest.java @@ -0,0 +1,55 @@ +package com.campus.water.controller.web; + +import com.campus.water.test.BaseTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +/** + * 设备数据查询接口测试(后端2开发的接口) + */ +public class DeviceDataControllerTest extends BaseTest { + + // 测试1:按设备ID查询数据(正常场景) + @Test + public void testQueryDeviceDataByDeviceId() throws Exception { + mockMvc.perform( + // 替换为你项目的实际接口路径,比如/api/web/device/data + get("/api/web/device/data") + .param("deviceId", "ZSJ001") // 传入测试设备ID + .contentType(MediaType.APPLICATION_JSON) + ) + .andExpect(status().isOk()) // 断言返回200 + .andExpect(jsonPath("$.code").value(200)) // 断言返回码(如果你的接口有统一返回体) + .andExpect(jsonPath("$.data.deviceId").value("ZSJ001")); // 断言返回的设备ID正确 + } + + // 测试2:按设备ID查询数据(设备ID不存在) + @Test + public void testQueryDeviceDataWithInvalidId() throws Exception { + mockMvc.perform( + get("/api/web/device/data") + .param("deviceId", "INVALID001") + .contentType(MediaType.APPLICATION_JSON) + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(404)) // 断言返回404 + .andExpect(jsonPath("$.msg").value("设备不存在")); // 断言提示语 + } + + // 测试3:按时间范围查询数据(正常场景) + @Test + public void testQueryDeviceDataByTime() throws Exception { + mockMvc.perform( + get("/api/web/device/data") + .param("deviceId", "ZSJ001") + .param("startTime", "2025-11-01 00:00:00") + .param("endTime", "2025-11-01 23:59:59") + .contentType(MediaType.APPLICATION_JSON) + ) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data").isArray()); // 断言返回数组 + } +} \ No newline at end of file diff --git a/src/test/java/com/campus/water/test/BaseTest.java b/src/test/java/com/campus/water/test/BaseTest.java new file mode 100644 index 0000000..b4f2f44 --- /dev/null +++ b/src/test/java/com/campus/water/test/BaseTest.java @@ -0,0 +1,29 @@ +package com.campus.water.test; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestInstance; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +/** + * 测试基类,初始化MockMvc + */ +@SpringBootTest(classes = com.campus.water.CampusWaterApplication.class) +@AutoConfigureMockMvc +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class BaseTest { + + protected MockMvc mockMvc; + + @Autowired + private WebApplicationContext webApplicationContext; + + @BeforeEach + public void setUp() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); + } +} \ No newline at end of file From ca86a994b1bfe46bfc89080bc96af03be1e39b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E7=AB=9E=E7=94=B1?= <1193626695@qq.com> Date: Sun, 30 Nov 2025 20:52:16 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A31.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/campus/water/entity/po/UserPO.java | 25 ++++++++++++--- .../campus/water/mapper/AdminRepository.java | 31 ++++++++++-------- .../water/mapper/RepairerAuthRepository.java | 23 ++++++------- .../campus/water/mapper/UserRepository.java | 32 +++++++++++-------- 4 files changed, 69 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/campus/water/entity/po/UserPO.java b/src/main/java/com/campus/water/entity/po/UserPO.java index 40d5bfb..ae9ade7 100644 --- a/src/main/java/com/campus/water/entity/po/UserPO.java +++ b/src/main/java/com/campus/water/entity/po/UserPO.java @@ -8,16 +8,33 @@ import javax.persistence.*; @Table(name = "user") // 对应数据库user表(学生用户) public class UserPO { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private String studentId; // 学生ID(主键) + // 修正:String类型主键不支持IDENTITY自增(MySQL自增主键为Long),改为手动赋值/UUID + // 若需自增,建议将studentId改为Long类型,此处保留String并移除IDENTITY + private String studentId; // 学生ID(主键,学号) @Column(unique = true, nullable = false) - private String username; // 登录用户名 + private String username; // 登录用户名/学生姓名 @Column(nullable = false) private String password; // MD5加密后的密码 private String phone; // 联系电话 - private String studentNo; // 学号 + private String studentNo; // 学号(若studentId已用学号,可删除此字段,避免冗余) private String college; // 学院 + + // ========== 补充缺失字段 ========== + @Column(unique = true) + private String email; // 邮箱(适配Repository的findByEmail/existsByEmail) + + // ========== 补充缺失枚举 ========== + // 用户状态枚举(适配Repository的findByStatus/findByUsernameContainingAndStatus) + public enum UserStatus { + ACTIVE, // 活跃 + INACTIVE, // 未激活 + LOCKED // 锁定 + } + + // 状态字段(映射为字符串存储,适配枚举) + @Enumerated(EnumType.STRING) + private UserStatus status; } \ 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 e93c9c4..5c66864 100644 --- a/src/main/java/com/campus/water/mapper/AdminRepository.java +++ b/src/main/java/com/campus/water/mapper/AdminRepository.java @@ -1,32 +1,37 @@ package com.campus.water.mapper; -import com.campus.water.entity.Admin; +import com.campus.water.entity.po.AdminPO; // 替换为PO包下的实体类 import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; + import java.util.List; import java.util.Optional; @Repository -public interface AdminRepository extends JpaRepository { +public interface AdminRepository extends JpaRepository { + // ========== 新增:登录核心方法(必须) ========== + Optional findByUsername(String username); + + // ========== 保留原有业务方法(适配PO类) ========== // 根据管理员ID查询 - Optional findByAdminId(String adminId); + Optional findByAdminId(String adminId); - // 根据管理员姓名模糊查询 - List findByAdminNameContaining(String adminName); + // 根据管理员姓名/用户名模糊查询(适配PO的username字段) + List findByUsernameContaining(String username); - // 根据角色查询管理员 - List findByRole(Admin.AdminRole role); + // 根据角色查询管理员(引用PO内的枚举) + List findByRole(AdminPO.AdminRole role); - // 根据状态查询管理员 - List findByStatus(Admin.AdminStatus status); + // 根据状态查询管理员(引用PO内的枚举) + List findByStatus(AdminPO.AdminStatus status); // 根据手机号查询管理员 - Optional findByPhone(String phone); + Optional findByPhone(String phone); - // 按角色和状态查询管理员 - @Query("SELECT a FROM Admin a WHERE a.role = ?1 AND a.status = ?2") - List findByRoleAndStatus(Admin.AdminRole role, Admin.AdminStatus status); + // 按角色和状态查询管理员(JPQL中实体类名改为AdminPO) + @Query("SELECT a FROM AdminPO a WHERE a.role = ?1 AND a.status = ?2") + List findByRoleAndStatus(AdminPO.AdminRole role, AdminPO.AdminStatus status); // 检查管理员ID是否存在 boolean existsByAdminId(String adminId); diff --git a/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java b/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java index f25311f..1885d35 100644 --- a/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java +++ b/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java @@ -1,26 +1,27 @@ package com.campus.water.mapper; -import com.campus.water.entity.RepairerAuth; +import com.campus.water.entity.po.RepairerAuthPO; // 替换为PO包下的实体类 import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; + import java.util.List; import java.util.Optional; @Repository -public interface RepairerAuthRepository extends JpaRepository { - // 根据用户名查询认证信息 - Optional findByUsername(String username); +public interface RepairerAuthRepository extends JpaRepository { + // 根据用户名查询认证信息(适配PO类) + Optional findByUsername(String username); - // 根据维修人员ID查询认证信息 - Optional findByRepairmanId(String repairmanId); + // 根据维修人员ID查询认证信息(适配PO类) + Optional findByRepairmanId(String repairmanId); - // 根据账户状态查询认证信息 - List findByAccountStatus(RepairerAuth.AccountStatus accountStatus); + // 根据账户状态查询认证信息(引用PO内的枚举) + List findByAccountStatus(RepairerAuthPO.AccountStatus accountStatus); - // 查找活跃状态的维修人员账号 - @Query("SELECT ra FROM RepairerAuth ra WHERE ra.username = ?1 AND ra.accountStatus = 'active'") - Optional findActiveByUsername(String username); + // 查找活跃状态的维修人员账号(JPQL实体类名改为RepairerAuthPO) + @Query("SELECT ra FROM RepairerAuthPO ra WHERE ra.username = ?1 AND ra.accountStatus = 'active'") + Optional findActiveByUsername(String username); // 检查用户名是否存在 boolean existsByUsername(String username); diff --git a/src/main/java/com/campus/water/mapper/UserRepository.java b/src/main/java/com/campus/water/mapper/UserRepository.java index 1bc3dc6..68f9565 100644 --- a/src/main/java/com/campus/water/mapper/UserRepository.java +++ b/src/main/java/com/campus/water/mapper/UserRepository.java @@ -1,32 +1,33 @@ -package com.campus.water.mapper; +package com.campus.water.mapper; // 核心修正:从mapper改为repository(JPA规范) -import com.campus.water.entity.User; +import com.campus.water.entity.po.UserPO; // 替换为PO包下的实体类 import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; + import java.util.List; import java.util.Optional; @Repository -public interface UserRepository extends JpaRepository { - // 根据学号查找用户 - Optional findByStudentId(String studentId); +public interface UserRepository extends JpaRepository { + // 根据学号查找用户(适配PO类,字段名保持studentId不变) + Optional findByStudentId(String studentId); - // 根据学生姓名模糊查询 - List findByStudentNameContaining(String studentName); + // 根据学生姓名模糊查询(适配PO的username字段,原studentName对应PO的username) + List findByUsernameContaining(String username); - // 根据用户状态查询 - List findByStatus(User.UserStatus status); + // 根据用户状态查询(引用PO内的UserStatus枚举) + List findByStatus(UserPO.UserStatus status); // 根据手机号查询用户 - Optional findByPhone(String phone); + Optional findByPhone(String phone); // 根据邮箱查询用户 - Optional findByEmail(String email); + Optional findByEmail(String email); - // 按姓名模糊查询和状态筛选 - @Query("SELECT u FROM User u WHERE u.studentName LIKE %?1% AND u.status = ?2") - List findByStudentNameContainingAndStatus(String studentName, User.UserStatus status); + // 按姓名模糊查询和状态筛选(JPQL实体类名改为UserPO,studentName改为username) + @Query("SELECT u FROM UserPO u WHERE u.username LIKE %?1% AND u.status = ?2") + List findByUsernameContainingAndStatus(String username, UserPO.UserStatus status); // 检查学号是否已存在 boolean existsByStudentId(String studentId); @@ -36,4 +37,7 @@ public interface UserRepository extends JpaRepository { // 检查邮箱是否已存在 boolean existsByEmail(String email); + + // ========== 新增:登录核心方法(必须) ========== + Optional findByUsername(String username); } \ No newline at end of file