diff --git a/src/main/java/com/campus/water/controller/web/AdminController.java b/src/main/java/com/campus/water/controller/web/AdminController.java index e7723f1..57a3beb 100644 --- a/src/main/java/com/campus/water/controller/web/AdminController.java +++ b/src/main/java/com/campus/water/controller/web/AdminController.java @@ -22,33 +22,44 @@ public class AdminController { private final AdminService adminService; /** - * 获取管理员列表(支持姓名搜索) + * 获取管理员列表(支持姓名/角色筛选) */ @GetMapping("/list") - @PreAuthorize("hasRole('ADMIN')") - @Operation(summary = "获取管理员列表", description = "支持按姓名模糊搜索,仅返回Admin角色管理员") + @PreAuthorize("hasAnyRole('super_admin', 'area_admin')") // 超级/区域管理员可查看 + @Operation(summary = "获取管理员列表", description = "支持按姓名模糊搜索、按角色筛选") public ResponseEntity>> getAdminList( - @RequestParam(required = false) String name + @RequestParam(required = false) String name, + @RequestParam(required = false) Admin.AdminRole role // 角色筛选参数 ) { try { - List adminList; - if (name != null && !name.isEmpty()) { - adminList = adminService.searchAdminsByName(name); - } else { - adminList = adminService.getAdminList(); - } + List adminList = adminService.getAdminList(name, role); return ResponseEntity.ok(ResultVO.success(adminList)); } catch (Exception e) { return ResponseEntity.ok(ResultVO.error(500, "查询失败:" + e.getMessage())); } } + /** + * 获取所有管理员角色枚举 + */ + @GetMapping("/roles") + @PreAuthorize("hasAnyRole('super_admin', 'area_admin')") + @Operation(summary = "获取管理员角色列表", description = "返回所有可选角色(super_admin/area_admin/viewer)") + public ResponseEntity> getAllRoles() { + try { + Admin.AdminRole[] roles = adminService.getAllRoles(); + return ResponseEntity.ok(ResultVO.success(roles)); + } catch (Exception e) { + return ResponseEntity.ok(ResultVO.error(500, "获取角色列表失败:" + e.getMessage())); + } + } + /** * 新增/编辑管理员 */ @PostMapping("/save") - @PreAuthorize("hasRole('ADMIN')") - @Operation(summary = "保存管理员", description = "新增/编辑管理员,角色强制为Admin") + @PreAuthorize("hasRole('super_admin')") // 仅超级管理员可新增/编辑 + @Operation(summary = "保存管理员", description = "新增/编辑管理员,支持指定角色") public ResponseEntity> saveAdmin(@RequestBody Admin admin) { try { Admin savedAdmin = adminService.saveAdmin(admin); @@ -62,7 +73,7 @@ public class AdminController { * 删除管理员 */ @DeleteMapping("/{adminId}") - @PreAuthorize("hasRole('ADMIN')") + @PreAuthorize("hasRole('super_admin')") // 仅超级管理员可删除 @Operation(summary = "删除管理员", description = "按ID删除管理员") public ResponseEntity> deleteAdmin(@PathVariable String adminId) { try { @@ -77,7 +88,7 @@ public class AdminController { * 管理员登录 */ @PostMapping("/login") - @Operation(summary = "管理员登录", description = "用户名+密码验证") + @Operation(summary = "管理员登录", description = "用户名+密码验证,返回管理员信息(含角色)") public ResponseEntity> login( @RequestParam String adminName, @RequestParam String password diff --git a/src/main/java/com/campus/water/entity/Admin.java b/src/main/java/com/campus/water/entity/Admin.java index e223057..acaac0d 100644 --- a/src/main/java/com/campus/water/entity/Admin.java +++ b/src/main/java/com/campus/water/entity/Admin.java @@ -1,14 +1,12 @@ -/** - * 管理员信息实体类 - * 对应表:admin - * 用于存储系统管理员信息,包括角色、状态、联系方式等 - */ package com.campus.water.entity; import lombok.Data; import jakarta.persistence.Column; - -import jakarta.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import java.time.LocalDateTime; @Data @@ -28,11 +26,10 @@ public class Admin { @Column(name = "phone", length = 20) private String phone; + // 恢复三个角色枚举 @Enumerated(EnumType.STRING) - @Column(name = "role", length = 50) - private AdminRole role = AdminRole.Admin; - - + @Column(name = "role", length = 50, nullable = false) + private AdminRole role; @Column(name = "created_time") private LocalDateTime createdTime = LocalDateTime.now(); @@ -40,9 +37,10 @@ public class Admin { @Column(name = "updated_time") private LocalDateTime updatedTime = LocalDateTime.now(); + // 枚举类:恢复super_admin、area_admin、viewer三个角色 public enum AdminRole { - Admin + super_admin, // 超级管理员 + area_admin, // 区域管理员 + viewer // 查看者 } - - } \ 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 index 8e21aa1..1a7bba3 100644 --- a/src/main/java/com/campus/water/entity/dto/request/RegisterRequest.java +++ b/src/main/java/com/campus/water/entity/dto/request/RegisterRequest.java @@ -1,5 +1,6 @@ package com.campus.water.entity.dto.request; +import com.campus.water.entity.Admin; import lombok.Data; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; @@ -17,14 +18,14 @@ public class RegisterRequest { private String userType; // admin/user/repairer // 用户特有字段 - private String studentId; // 学生ID(仅user类型需要) - private String studentName; // 学生姓名(仅user类型需要) - private String phone; // 新增:学生/用户手机号(仅user类型需要) + private String studentId; + private String studentName; + private String phone; // 管理员特有字段 - private String adminId; // 管理员ID(仅admin类型需要) - // 已移除管理员角色区分(根据之前需求) + private String adminId; + private String role; // 新增:管理员角色(super_admin/area_admin/viewer) // 维修人员特有字段 - private String repairmanId; // 维修人员ID(仅repairer类型需要) + private String repairmanId; } \ 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 545cddb..0e3374e 100644 --- a/src/main/java/com/campus/water/mapper/AdminRepository.java +++ b/src/main/java/com/campus/water/mapper/AdminRepository.java @@ -21,11 +21,14 @@ public interface AdminRepository extends JpaRepository { // 按手机号查询 Optional findByPhone(String phone); + // 按角色查询管理员(核心:恢复角色筛选) + List findByRole(Admin.AdminRole role); + + // 按姓名+角色组合查询(可选,增强筛选) + List findByAdminNameContainingAndRole(String name, Admin.AdminRole role); + // 检查唯一约束 boolean existsByAdminId(String adminId); boolean existsByPhone(String phone); boolean existsByAdminName(String adminName); - - // (可选)若需按角色过滤(仅Admin角色),保留此方法(单角色下可省略) - List findByRole(Admin.AdminRole role); } \ No newline at end of file diff --git a/src/main/java/com/campus/water/service/AdminService.java b/src/main/java/com/campus/water/service/AdminService.java index 4d204fa..128d0ea 100644 --- a/src/main/java/com/campus/water/service/AdminService.java +++ b/src/main/java/com/campus/water/service/AdminService.java @@ -16,18 +16,22 @@ public class AdminService { private final AdminRepository adminRepository; /** - * 获取所有管理员(默认仅Admin角色) + * 获取管理员列表(支持按姓名/角色筛选) */ - public List getAdminList() { - // 单角色下直接查全部,也可调用findByRole(Admin.AdminRole.Admin) - return adminRepository.findAll(); - } - - /** - * 按姓名搜索管理员 - */ - public List searchAdminsByName(String name) { - return adminRepository.findByAdminNameContaining(name); + public List getAdminList(String name, Admin.AdminRole role) { + if (name != null && !name.isEmpty() && role != null) { + // 按姓名+角色组合查询 + return adminRepository.findByAdminNameContainingAndRole(name, role); + } else if (role != null) { + // 仅按角色查询 + return adminRepository.findByRole(role); + } else if (name != null && !name.isEmpty()) { + // 仅按姓名查询 + return adminRepository.findByAdminNameContaining(name); + } else { + // 查询全部 + return adminRepository.findAll(); + } } /** @@ -38,11 +42,9 @@ public class AdminService { } /** - * 新增/修改管理员(默认角色为Admin) + * 新增/修改管理员(支持指定角色) */ public Admin saveAdmin(Admin admin) { - // 强制设置为Admin角色,避免手动修改 - admin.setRole(Admin.AdminRole.Admin); admin.setUpdatedTime(LocalDateTime.now()); if (admin.getCreatedTime() == null) { admin.setCreatedTime(LocalDateTime.now()); @@ -62,7 +64,14 @@ public class AdminService { */ public Optional login(String adminName, String password) { Optional admin = adminRepository.findByAdminName(adminName); - // 此处仅示例,实际需结合密码加密(如BCrypt)验证 + // 实际生产环境需替换为BCrypt密码加密验证 return admin.filter(a -> a.getPassword().equals(password)); } + + /** + * 获取所有角色枚举(供前端下拉框使用) + */ + public Admin.AdminRole[] getAllRoles() { + return Admin.AdminRole.values(); + } } \ 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 index 656e5c3..1c21f07 100644 --- a/src/main/java/com/campus/water/service/RegisterService.java +++ b/src/main/java/com/campus/water/service/RegisterService.java @@ -8,6 +8,7 @@ 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.security.crypto.bcrypt.BCrypt; import org.springframework.stereotype.Service; import org.springframework.util.DigestUtils; @@ -50,8 +51,7 @@ public class RegisterService { return true; } - // 修正管理员注册逻辑(适配新实体Admin) - // 原RegisterService中handleAdminRegister方法修改 + // RegisterService中handleAdminRegister方法修改 private void handleAdminRegister(String username, String password, RegisterRequest request) { // 检查用户名/ID/手机号是否已存在 if (adminRepository.existsByAdminName(username)) { @@ -64,13 +64,14 @@ public class RegisterService { throw new RuntimeException("手机号已被注册"); } - // 构建管理员对象,默认角色为Admin + // 构建管理员对象,支持指定角色(需从request中接收role参数) Admin admin = new Admin(); admin.setAdminId(request.getAdminId()); admin.setAdminName(username); - admin.setPassword(password); // 实际需加密(如BCrypt) + admin.setPassword(BCrypt.hashpw(password, BCrypt.gensalt())); // 密码加密 admin.setPhone(request.getPhone()); - admin.setRole(Admin.AdminRole.Admin); // 强制设置为Admin角色 + // 从注册请求中获取角色(需在RegisterRequest添加role字段) + admin.setRole(Admin.AdminRole.valueOf(request.getRole())); admin.setCreatedTime(LocalDateTime.now()); admin.setUpdatedTime(LocalDateTime.now());