diff --git a/src/main/java/top/suyiiyii/sims/controller/HierarchyController.java b/src/main/java/top/suyiiyii/sims/controller/HierarchyController.java new file mode 100644 index 0000000..d910470 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/controller/HierarchyController.java @@ -0,0 +1,85 @@ +package top.suyiiyii.sims.controller; + +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import top.suyiiyii.sims.common.AuthAccess; +import top.suyiiyii.sims.common.Result; +import top.suyiiyii.sims.dto.UserDto; +import top.suyiiyii.sims.entity.User; +import top.suyiiyii.sims.exception.ServiceException; +import top.suyiiyii.sims.service.HierarchyService; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/hierarchy") +public class HierarchyController { + + @Autowired + private HierarchyService hierarchyService; + + @GetMapping("/{userId}/SuperiorUser") + @Operation(summary = "获取用户的上级(管理员)") + @AuthAccess(allowRoles = {"admin"}) + public UserDto getSuperiorUser(@PathVariable int userId) { + User user = hierarchyService.getSuperiorUser(userId); + if (user == null) { + throw new ServiceException("该用户没有上级"); + } + return new UserDto(user); + } + + @GetMapping("/{userId}/subordinateUser") + @Operation(summary = "获取用户的下级(管理员)") + @AuthAccess(allowRoles = {"admin"}) + public List getSubordinateUser(@PathVariable int userId) { + List users = hierarchyService.getSubordinateUser(userId); + if (users == null || users.isEmpty()) { + throw new ServiceException("该用户没有下级"); + } + return users.stream().map(UserDto::new).collect(Collectors.toList()); + } + + @PostMapping("/{userId}/SuperiorUser") + @Operation(summary = "设置用户的上级(管理员)") + @AuthAccess(allowRoles = {"admin"}) + + public Result setSuperiorUser(@PathVariable int userId, @RequestParam int superiorUserId) { + hierarchyService.setSuperiorUser(userId, superiorUserId); + return Result.success(); + } + + @DeleteMapping("/{userId}/SuperiorUser") + @Operation(summary = "删除用户的上级(管理员)") + @AuthAccess(allowRoles = {"admin"}) + public Result deleteSuperiorUser(@PathVariable int userId) { + hierarchyService.setSuperiorUser(userId, 0); + return Result.success(); + } + + @GetMapping("/self/superiorUser") + @Operation(summary = "获取自己的上级") + @AuthAccess(allowRoles = {"user"}) + public UserDto getSelfSuperiorUser(@RequestAttribute("userId") int userId) { + User user = hierarchyService.getSuperiorUser(userId); + if (user == null) { + throw new ServiceException("您没有上级"); + } + return new UserDto(user); + } + + @GetMapping("/self/subordinateUser") + @Operation(summary = "获取自己的下级") + @AuthAccess(allowRoles = {"user"}) + public List getSelfSubordinateUser(@RequestAttribute("userId") int userId) { + List users = hierarchyService.getSubordinateUser(userId); + if (users == null || users.isEmpty()) { + throw new ServiceException("您没有下级"); + } + return users.stream().map(UserDto::new).collect(Collectors.toList()); + } + + +} diff --git a/src/main/java/top/suyiiyii/sims/dto/UserDto.java b/src/main/java/top/suyiiyii/sims/dto/UserDto.java index 9123552..1d37986 100644 --- a/src/main/java/top/suyiiyii/sims/dto/UserDto.java +++ b/src/main/java/top/suyiiyii/sims/dto/UserDto.java @@ -1,6 +1,9 @@ package top.suyiiyii.sims.dto; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import top.suyiiyii.sims.entity.User; import java.util.List; @@ -13,6 +16,8 @@ import java.util.List; * @Version 1.0 */ @Data +@AllArgsConstructor +@NoArgsConstructor public class UserDto { private Integer userId; private Integer studentId; @@ -20,4 +25,12 @@ public class UserDto { private String grade; private String userGroup; private List roles; // 角色名称列表 + + public UserDto(User user) { + this.userId = user.getId(); + this.studentId = user.getStudentId(); + this.username = user.getUsername(); + this.grade = user.getGrade(); + this.userGroup = user.getUserGroup(); + } } diff --git a/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java b/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java index 285edfb..66b398c 100644 --- a/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java +++ b/src/main/java/top/suyiiyii/sims/entity/HierarchyRelation.java @@ -2,7 +2,9 @@ package top.suyiiyii.sims.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; +import com.tangzc.mpe.autotable.annotation.Column; import com.tangzc.mpe.autotable.annotation.Table; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -24,9 +26,13 @@ public class HierarchyRelation { private Integer id; // 上级用户ID + @NotNull + @Column(defaultValue = "0") private Integer superiorUserId; // 下级用户ID + + @NotNull private Integer subordinateUserId; } diff --git a/src/main/java/top/suyiiyii/sims/mapper/HierarchyMapper.java b/src/main/java/top/suyiiyii/sims/mapper/HierarchyMapper.java new file mode 100644 index 0000000..1bd8a61 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/mapper/HierarchyMapper.java @@ -0,0 +1,19 @@ +package top.suyiiyii.sims.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; +import top.suyiiyii.sims.entity.HierarchyRelation; +import top.suyiiyii.sims.entity.User; + +import java.util.List; + +public interface HierarchyMapper extends BaseMapper { + + @Select("SELECT * FROM user WHERE id = " + + "(SELECT hierarchy_relation.superior_user_id FROM hierarchy_relation WHERE subordinate_user_id = #{userId})") + User getSuperiorUser(int userId); + + @Select("SELECT * FROM user WHERE id = " + + "(SELECT hierarchy_relation.subordinate_user_id FROM hierarchy_relation WHERE superior_user_id = #{userId})") + List getSubordinateUser(int userId); +} diff --git a/src/main/java/top/suyiiyii/sims/service/HierarchyService.java b/src/main/java/top/suyiiyii/sims/service/HierarchyService.java new file mode 100644 index 0000000..408dca2 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/service/HierarchyService.java @@ -0,0 +1,18 @@ +package top.suyiiyii.sims.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.stereotype.Service; +import top.suyiiyii.sims.entity.HierarchyRelation; +import top.suyiiyii.sims.entity.User; + +import java.util.List; + +@Service +public interface HierarchyService extends IService { + public User getSuperiorUser(int UserId); + + public List getSubordinateUser(int userId); + + + void setSuperiorUser(int userId, int superiorUserId); +} diff --git a/src/main/java/top/suyiiyii/sims/service/UserService.java b/src/main/java/top/suyiiyii/sims/service/UserService.java index f4b2c98..2f96e46 100644 --- a/src/main/java/top/suyiiyii/sims/service/UserService.java +++ b/src/main/java/top/suyiiyii/sims/service/UserService.java @@ -8,13 +8,11 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import top.suyiiyii.sims.controller.UserController; import top.suyiiyii.sims.dto.UserDto; +import top.suyiiyii.sims.entity.HierarchyRelation; import top.suyiiyii.sims.entity.Role; import top.suyiiyii.sims.entity.User; import top.suyiiyii.sims.exception.ServiceException; -import top.suyiiyii.sims.mapper.MpUserMapper; -import top.suyiiyii.sims.mapper.PermissionsMapper; -import top.suyiiyii.sims.mapper.RoleMapper; -import top.suyiiyii.sims.mapper.UserMapper; +import top.suyiiyii.sims.mapper.*; import top.suyiiyii.sims.utils.JwtUtils; import java.util.ArrayList; @@ -44,6 +42,8 @@ public class UserService { private RbacService rbacService; @Autowired private ModelMapper modelMapper; + @Autowired + private HierarchyMapper hierarchyMapper; public void deleteUser(int id) { userMapper.deleteUser(id); @@ -77,6 +77,7 @@ public class UserService { mpUserMapper.insert(user); user = mpUserMapper.selectOne(new LambdaQueryWrapper().eq(User::getUsername, req.getUsername())); rbacService.addRoleWithUserId(user.getId(), "user"); + hierarchyMapper.insert(new HierarchyRelation(null,0, user.getId())); } diff --git a/src/main/java/top/suyiiyii/sims/service/impl/HierarchyServiceImpl.java b/src/main/java/top/suyiiyii/sims/service/impl/HierarchyServiceImpl.java new file mode 100644 index 0000000..9c5f0e8 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/service/impl/HierarchyServiceImpl.java @@ -0,0 +1,52 @@ +package top.suyiiyii.sims.service.impl; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import top.suyiiyii.sims.entity.HierarchyRelation; +import top.suyiiyii.sims.entity.User; +import top.suyiiyii.sims.exception.ServiceException; +import top.suyiiyii.sims.mapper.HierarchyMapper; +import top.suyiiyii.sims.mapper.MpUserMapper; +import top.suyiiyii.sims.service.HierarchyService; + +import java.util.List; + +@Service +public class HierarchyServiceImpl extends ServiceImpl implements HierarchyService { + + @Autowired + MpUserMapper userMapper; + @Override + public User getSuperiorUser(int UserId) { + return baseMapper.getSuperiorUser(UserId); + } + + @Override + public List getSubordinateUser(int userId) { + return baseMapper.getSubordinateUser(userId); + } + + @Override + public void setSuperiorUser(int userId, int superiorUserId) { + if (userId == superiorUserId) { + throw new ServiceException("不能设置自己为上级"); + } + if (superiorUserId != 0 && userMapper.selectById(superiorUserId) == null) { + throw new ServiceException("上级用户不存在"); + } + + // 检测是否存在循环上级 + User superiorUser = userMapper.selectById(superiorUserId); + while (superiorUser != null) { + if (superiorUser.getId() == userId) { + throw new ServiceException("不能设置自己的下级为上级"); + } + superiorUser = getSuperiorUser(superiorUser.getId()); + } + + baseMapper.update(new LambdaUpdateWrapper().eq(HierarchyRelation::getSubordinateUserId, userId) + .set(HierarchyRelation::getSuperiorUserId, superiorUserId)); + } +}