java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Boot 菜单删除

Spring Boot 菜单删除实现代码与事务管理

作者:小白的代码日记

本文将详细介绍Spring Boot环境下菜单删除功能的实现逻辑,包括关联数据处理、事务控制和异常处理等关键环节,强调需处理多级嵌套、角色关联及数据一致性,感兴趣的朋友跟随小编一起看看吧

在后台管理系统开发中,菜单管理是一个核心功能,而删除菜单作为其中的重要操作,需要考虑数据完整性、关联关系处理和操作安全性。本文将详细介绍 Spring Boot 环境下菜单删除功能的实现逻辑,包括关联数据处理、事务控制和异常处理等关键环节。

菜单删除的业务逻辑分析

菜单删除并非简单地删除一条记录,需要考虑以下几点:

因此,完整的菜单删除逻辑应该是:先删除关联数据,再删除子菜单,最后删除父菜单本身,并通过事务保证整个过程的完整性。

实现代码与步骤解析

1. 控制器层(MenuController)

首先定义删除接口,接收菜单 ID 并添加事务注解:

@RestController
@RequestMapping("/menu")
public class MenuController {
    @Autowired
    private MenuService menuService;
    @Autowired
    private RoleMenuMapper roleMenuMapper;
    /**
     * 删除菜单
     * @param id 菜单ID
     * @return 操作结果
     */
    @DeleteMapping("/del/{id}")
    @Transactional  // 事务注解,确保操作原子性
    public Result deleteMenu(@PathVariable Integer id) {
        try {
            // 1. 查询所有子菜单
            QueryWrapper<MenuEntity> subMenuQuery = new QueryWrapper<>();
            subMenuQuery.eq("parent_id", id);
            List<MenuEntity> subMenus = menuService.list(subMenuQuery);
            // 2. 先删除子菜单与角色的关联关系
            if (!subMenus.isEmpty()) {
                for (MenuEntity subMenu : subMenus) {
                    QueryWrapper<RoleMenuEntity> roleMenuQuery = new QueryWrapper<>();
                    roleMenuQuery.eq("menu_id", subMenu.getMenuId());
                    roleMenuMapper.delete(roleMenuQuery);
                }
                // 3. 删除子菜单
                menuService.remove(subMenuQuery);
            }
            // 4. 删除当前菜单与角色的关联关系
            QueryWrapper<RoleMenuEntity> parentRoleMenuQuery = new QueryWrapper<>();
            parentRoleMenuQuery.eq("menu_id", id);
            roleMenuMapper.delete(parentRoleMenuQuery);
            // 5. 删除当前菜单
            boolean isDeleted = menuService.removeById(id);
            if (isDeleted) {
                return Result.success("菜单删除成功");
            } else {
                return Result.error("菜单不存在或已被删除");
            }
        } catch (Exception e) {
            // 抛出运行时异常,触发事务回滚
            throw new RuntimeException("删除菜单失败:" + e.getMessage());
        }
    }
}

2. 关键步骤解析

步骤 1:查询子菜单

通过 parent_id 查询当前菜单的所有子菜单,为后续级联删除做准备:

QueryWrapper<MenuEntity> subMenuQuery = new QueryWrapper<>();
subMenuQuery.eq("parent_id", id);
List<MenuEntity> subMenus = menuService.list(subMenuQuery);

步骤 2:删除子菜单与角色的关联关系

由于菜单与角色通过中间表 role_menu 关联,需要先删除这些关联数据,避免外键约束错误:

for (MenuEntity subMenu : subMenus) {
    QueryWrapper<RoleMenuEntity> roleMenuQuery = new QueryWrapper<>();
    roleMenuQuery.eq("menu_id", subMenu.getMenuId());
    roleMenuMapper.delete(roleMenuQuery);
}

步骤 3:删除子菜单

在删除关联数据后,批量删除所有子菜单:

menuService.remove(subMenuQuery);

步骤 4:删除当前菜单与角色的关联关系

同样需要解除当前菜单与角色的关联:

QueryWrapper<RoleMenuEntity> parentRoleMenuQuery = new QueryWrapper<>();
parentRoleMenuQuery.eq("menu_id", id);
roleMenuMapper.delete(parentRoleMenuQuery);

步骤 5:删除当前菜单

最后删除主菜单记录:

menuService.removeById(id);

事务管理与异常处理

到此这篇关于Spring Boot 菜单删除功能的实现与事务管理的文章就介绍到这了,更多相关Spring Boot 菜单删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文