From 9b95c1b70ad44bc6b426fb04df066d582303d540 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Sun, 8 Sep 2024 21:33:20 +0800 Subject: [PATCH 1/2] stash --- .../top/suyiiyii/sims/service/HierarchyService.java | 10 ++++++++++ .../sims/service/impl/HierarchyServiceImpl.java | 11 +++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/main/java/top/suyiiyii/sims/service/HierarchyService.java create mode 100644 src/main/java/top/suyiiyii/sims/service/impl/HierarchyServiceImpl.java 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..77246e7 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/service/HierarchyService.java @@ -0,0 +1,10 @@ +package top.suyiiyii.sims.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.stereotype.Service; +import top.suyiiyii.sims.entity.HierarchyRelation; + +@Service +public interface HierarchyService extends IService { + +} 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..af753e7 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/service/impl/HierarchyServiceImpl.java @@ -0,0 +1,11 @@ +package top.suyiiyii.sims.service.impl; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import top.suyiiyii.sims.service.HierarchyService; + +@Service +public class HierarchyServiceImpl implements ServiceImpl implements HierarchyService { + +} From 9c9b92529926aff2c497dbc694071965edacf665 Mon Sep 17 00:00:00 2001 From: suyiiyii Date: Mon, 9 Sep 2024 00:43:10 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E7=BA=A7=E5=A2=9E?= =?UTF-8?q?=E5=88=A0=E6=94=B9=E6=9F=A5=E4=BB=A5=E5=8F=8A=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E6=88=90=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sims/controller/HierarchyController.java | 85 +++++++++++++++++++ .../java/top/suyiiyii/sims/dto/UserDto.java | 13 +++ .../sims/entity/HierarchyRelation.java | 6 ++ .../suyiiyii/sims/mapper/HierarchyMapper.java | 19 +++++ .../sims/service/HierarchyService.java | 8 ++ .../suyiiyii/sims/service/UserService.java | 9 +- .../service/impl/HierarchyServiceImpl.java | 47 +++++++++- 7 files changed, 180 insertions(+), 7 deletions(-) create mode 100644 src/main/java/top/suyiiyii/sims/controller/HierarchyController.java create mode 100644 src/main/java/top/suyiiyii/sims/mapper/HierarchyMapper.java 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 index 77246e7..408dca2 100644 --- a/src/main/java/top/suyiiyii/sims/service/HierarchyService.java +++ b/src/main/java/top/suyiiyii/sims/service/HierarchyService.java @@ -3,8 +3,16 @@ 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 index af753e7..9c5f0e8 100644 --- a/src/main/java/top/suyiiyii/sims/service/impl/HierarchyServiceImpl.java +++ b/src/main/java/top/suyiiyii/sims/service/impl/HierarchyServiceImpl.java @@ -1,11 +1,52 @@ package top.suyiiyii.sims.service.impl; -import com.baomidou.mybatisplus.extension.service.IService; +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; -@Service -public class HierarchyServiceImpl implements ServiceImpl implements 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)); + } }