Merge pull request #27 from suyiiyii/hierarchy
Some checks failed
Docker Build and Publish / build (push) Has been cancelled
Gitea Sync / trigger-gitea-sync (push) Has been cancelled
Java CI with Maven / build (push) Has been cancelled

上下级增删改查以及防止成环
This commit is contained in:
suyiiyii 2024-09-09 20:43:49 +08:00 committed by GitHub
commit 92de93aae2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 198 additions and 4 deletions

View File

@ -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<UserDto> getSubordinateUser(@PathVariable int userId) {
List<User> 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<UserDto> getSelfSubordinateUser(@RequestAttribute("userId") int userId) {
List<User> users = hierarchyService.getSubordinateUser(userId);
if (users == null || users.isEmpty()) {
throw new ServiceException("您没有下级");
}
return users.stream().map(UserDto::new).collect(Collectors.toList());
}
}

View File

@ -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<String> 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();
}
}

View File

@ -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;
}

View File

@ -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<HierarchyRelation> {
@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<User> getSubordinateUser(int userId);
}

View File

@ -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<HierarchyRelation> {
public User getSuperiorUser(int UserId);
public List<User> getSubordinateUser(int userId);
void setSuperiorUser(int userId, int superiorUserId);
}

View File

@ -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<User>().eq(User::getUsername, req.getUsername()));
rbacService.addRoleWithUserId(user.getId(), "user");
hierarchyMapper.insert(new HierarchyRelation(null,0, user.getId()));
}

View File

@ -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<HierarchyMapper, HierarchyRelation> implements HierarchyService {
@Autowired
MpUserMapper userMapper;
@Override
public User getSuperiorUser(int UserId) {
return baseMapper.getSuperiorUser(UserId);
}
@Override
public List<User> 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<HierarchyRelation>().eq(HierarchyRelation::getSubordinateUserId, userId)
.set(HierarchyRelation::getSuperiorUserId, superiorUserId));
}
}