feat(system): 添加菜单、角色和用户相关操作的支持

- 在 DepartmentService、MenuService、PermissionService、RoleService 和 UserService 中添加了删除操作的实现
- 优化了树形结构数据的递归删除逻辑
- 处理了角色和用户删除时的关联数据清理
- 修复了一些潜在的 bug 和性能问题
This commit is contained in:
smile 2025-09-04 10:57:36 +08:00
parent bf40695812
commit 2b9b0423ed
5 changed files with 121 additions and 0 deletions

View file

@ -3,6 +3,7 @@ package com.bgasol.web.system.department.service;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bgasol.common.core.base.dto.BasePageDto;
import com.bgasol.common.core.base.entity.BaseTreeEntity;
import com.bgasol.common.core.base.service.BaseService;
import com.bgasol.model.system.department.entity.DepartmentEntity;
import com.bgasol.web.system.department.mapper.DepartmentMapper;
@ -15,6 +16,12 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static com.bgasol.common.constant.value.SystemConfigValues.DEFAULT_DEPARTMENT_ID;
@Service
@ -63,4 +70,36 @@ public class DepartmentService extends BaseService<DepartmentEntity, BasePageDto
}
return this.findById(DEFAULT_DEPARTMENT_ID);
}
@Override
public Integer delete(String id) {
DepartmentEntity department = this.findById(id);
if (ObjectUtils.isEmpty(department)){
return 1;
}
HashSet<String> deptIds = new HashSet<>();
deptIds.add(id);
List<DepartmentEntity> departments = findTreeAll(id, null);
collectDeleteIds(departments, deptIds);
deptIds.forEach(super::delete);
return 1;
}
private void collectDeleteIds(List<DepartmentEntity> departments, HashSet<String> ids) {
List<DepartmentEntity> departmentEntityList = departments.stream()
.filter(e -> !e.getChildren().isEmpty())
.flatMap(e -> e.getChildren().stream())
.toList();
// 将当前层级子部门的ID添加到删除集合中
departmentEntityList.forEach(dept -> ids.add(dept.getId()));
departments.forEach(dept -> ids.add(dept.getId()));
if (!departmentEntityList.isEmpty()) {
// 递归处理下一层级的子部门
this.collectDeleteIds(departmentEntityList, ids);
}
}
}

View file

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bgasol.common.constant.value.SystemConfigValues;
import com.bgasol.common.core.base.dto.BasePageDto;
import com.bgasol.common.core.base.service.BaseService;
import com.bgasol.model.system.department.entity.DepartmentEntity;
import com.bgasol.model.system.menu.entity.MenuEntity;
import com.bgasol.model.system.user.entity.UserEntity;
import com.bgasol.web.system.menu.mapper.MenuMapper;
@ -149,4 +150,37 @@ public class MenuService extends BaseService<MenuEntity, BasePageDto<MenuEntity>
}
return menuEntityList;
}
@Override
public Integer delete(String id) {
MenuEntity menuEntity = this.findById(id);
if (ObjectUtils.isEmpty(menuEntity)) {
return 1;
}
HashSet<String> menuIds = new HashSet<>();
menuIds.add(id);
List<MenuEntity> menus = findTreeAll(id, null);
collectDeleteIds(menus, menuIds);
menuIds.forEach(menuId -> {
this.menuMapper.deleteFromTable("system_c_role_menu", "menu_id", menuId);
super.delete(menuId);
});
return 1;
}
private void collectDeleteIds(List<MenuEntity> menus, Set<String> ids) {
List<MenuEntity> menuEntityList = menus.stream()
.filter(e -> !e.getChildren().isEmpty())
.flatMap(e -> e.getChildren().stream())
.toList();
// 将当前层级子部门的ID添加到删除集合中
menuEntityList.forEach(e -> ids.add(e.getId()));
menus.forEach(e -> ids.add(e.getId()));
if (!menuEntityList.isEmpty()) {
// 递归处理下一层级的子部门
this.collectDeleteIds(menuEntityList, ids);
}
}
}

View file

@ -2,13 +2,18 @@ package com.bgasol.web.system.permission.service;
import com.bgasol.common.core.base.dto.BasePageDto;
import com.bgasol.common.core.base.service.BaseService;
import com.bgasol.model.system.menu.entity.MenuEntity;
import com.bgasol.model.system.permission.entity.PermissionEntity;
import com.bgasol.web.system.permission.mapper.PermissionMapper;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashSet;
import java.util.List;
@Service
@RequiredArgsConstructor
@Transactional
@ -42,4 +47,37 @@ public class PermissionService extends BaseService<PermissionEntity, BasePageDto
}
return this.findById(parentPermission.getId());
}
@Override
public Integer delete(String id) {
PermissionEntity permissionEntity = this.findById(id);
if (ObjectUtils.isEmpty(permissionEntity)) {
return 1;
}
HashSet<String> permissionIds = new HashSet<>();
permissionIds.add(id);
List<PermissionEntity> permissions = findTreeAll(id, null);
collectDeleteIds(permissions, permissionIds);
permissionIds.forEach(e -> {
this.permissionMapper.deleteFromTable("system_c_role_permission", "permission_id", e);
super.delete(e);
});
return 1;
}
private void collectDeleteIds(List<PermissionEntity> permissions, HashSet<String> ids) {
List<PermissionEntity> permissionEntityList = permissions.stream()
.filter(e -> !e.getChildren().isEmpty())
.flatMap(e -> e.getChildren().stream())
.toList();
// 将当前层级子部门的ID添加到删除集合中
permissionEntityList.forEach(e -> ids.add(e.getId()));
permissions.forEach(e -> ids.add(e.getId()));
if (!permissionEntityList.isEmpty()) {
// 递归处理下一层级的子部门
this.collectDeleteIds(permissionEntityList, ids);
}
}
}

View file

@ -65,4 +65,12 @@ public class RoleService extends BaseService<RoleEntity, BasePageDto<RoleEntity>
roleEntity.setMenus(menuEntities);
super.findOtherTable(roleEntity);
}
@Override
public Integer delete(String id) {
this.roleMapper.deleteFromTable("system_c_role_permission", "role_id", id);
this.roleMapper.deleteFromTable("system_c_role_menu", "role_id", id);
this.roleMapper.deleteFromTable("system_c_user_role", "role_id", id);
return super.delete(id);
}
}

View file

@ -53,6 +53,8 @@ public class UserService extends BaseService<UserEntity, UserPageDto> {
public Integer delete(String id) {
// 退出用户
StpUtil.logout(id);
// 删除用户关联角色-中间表
this.userMapper.deleteFromTable("system_c_user_role", "user_id", id);
return super.delete(id);
}