若依框架---更新删除注意点

简介: 若依框架---更新删除注意点

问题起源


最近在从若依系统中研究其管理系统设计,例如,最近在学习其中的菜单管理功能,其中涉及到“添加”菜单功能,感觉其代码实现具有一定的参考意义,特来总结学习一下。


若依系统中的add操作


我们先来看看若依系统中添加add操作是如何设计的。


先来看看后端接口,以创建菜单为例,接口位置位于ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController中

/**
     * 新增菜单
     */
    @PreAuthorize("@ss.hasPermi('system:menu:add')")
    @Log(title = "菜单管理", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysMenu menu)
    {
        if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
        {
            return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
        }
        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
        {
            return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
        }
        menu.setCreateBy(getUsername());
        return toAjax(menuService.insertMenu(menu));
    }


接口权限控制:


注解部分权限控制,需要有权限system:menu:add


日志记录:

@Log(title = "菜单管理", businessType = BusinessType.INSERT)


接口映射:PostMapping,表明该方法承接默认的POST请求

@PostMapping


我们再来看方法体内部,最后一句:

return toAjax(menuService.insertMenu(menu));


其对应的方法体为:

/**
     * 新增保存菜单信息
     * 
     * @param menu 菜单信息
     * @return 结果
     */
    @Override
    public int insertMenu(SysMenu menu)
    {
        return menuMapper.insertMenu(menu);
    }


即最后一句为实际插入的SQL执行语句。


我们更关心在执行插入前,数据做了哪些检查:


添加前的检查工作


name的唯一性


其代码为:

if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
        {
            return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
        }


见字知意,我们拆开其方法checkMenuNameUnique体内部:

/**
     * 校验菜单名称是否唯一
     * 
     * @param menu 菜单信息
     * @return 结果
     */
    @Override
    public String checkMenuNameUnique(SysMenu menu)
    {
        Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();
        SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId());
        if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue())
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }


其判断重复的算法是:首先根据当前给定的名称与区域范围(我所指的是给定的parentId,即相当于在某个目录下添加菜单时,该目录下不应该有重名的菜单,而非目录下的菜单是允许重复的),查找是否有“menu”,再判断给定预创建的对象与查询出的结果的唯一标识是否一致或者查询出的结果为空,即语句:

StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()


数据的合法性


除检查名称是否重复外,还需要检查给定的数据是否合法,例如下面这行代码:

else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
        {
            return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
        }


即:在设定对象为外链时,则给定的地址就应该是以http开头,否则数据不合法,也不能创建成功。


            是否有相关联的操作


这里的关联操作,我以若依中编辑菜单为例:

else if (menu.getMenuId().equals(menu.getParentId()))
        {
            return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
        }


这个ParentId对应选择父级节点的操作,如图:

image.png


同样的,删除菜单时也会有相关联的数据,比如菜单或目录中有子节点,则该菜单就不允许直接删除:

if (menuService.hasChildByMenuId(menuId))
        {
            return AjaxResult.error("存在子菜单,不允许删除");
        }


总结


因此,在插入/更新/删除数据时,至少要考虑这几个方面:


1、某些字段的唯一性,比如名称;

2、数据的合法性,或者相互关联的字段的合法性判断,这一点大概是很多程序中比较耗时耗力;

3、数据的关联性,比如与其他数据有关联的数据不能删除,数据不能以自己为父节点等等逻辑。

目录
相关文章
|
SQL 数据库 Windows
若依代码生成详细教程
我觉得若依官方的代码生成教程过于简单,网上的教程很多连个效果图都没有。 本文要达到的效果如下:[学生管理] 下有个 [学生信息] 菜单,里面可以增删改查。
7078 0
若依代码生成详细教程
使用ruoyi-vue控制数据权限
使用ruoyi-vue控制数据权限
2650 0
|
前端开发 数据安全/隐私保护
若依框架---权限控制角色设计
若依框架---权限控制角色设计
4811 0
|
前端开发 JavaScript 关系型数据库
若依框架------后台路由数据是如何转换为前端路由信息的
若依框架------后台路由数据是如何转换为前端路由信息的
2437 0
|
SQL JSON 前端开发
若依RuoYi脚手架二次开发教程(二次开发必学技能)
本次我们将通过一个菜品管理模块开发的案例,来演示拿到若依框架后,如何在若依管理系统上进行二次开发,升级改造为自己的管理系统。适合以若依作为项目脚手架的公司开发人员、毕业设计的学生及开源项目学习者。
10283 1
若依RuoYi脚手架二次开发教程(二次开发必学技能)
|
10月前
|
机器学习/深度学习 人工智能 安全
基于YOLOv8的铁路工人安全作业检测系统|精准识别反光背心与安全帽
本项目集成了 YOLOv8 工业目标检测模型 与 PyQt5 图形界面工具,实现了对铁路工人穿戴安全装备(如反光背心与安全帽)的自动检测与预警。
基于YOLOv8的铁路工人安全作业检测系统|精准识别反光背心与安全帽
|
监控 NoSQL Java
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
若依(RuoYi)是一款基于Spring Boot和Vue.js的开源Java快速开发脚手架,支持OAuth2、JWT鉴权,集成多种安全框架和持久化框架。它提供了系统管理、监控管理、任务调度、代码生成等常用功能模块,适合中小型公司快速搭建Web应用。本文主要介绍若依框架的特点、版本发展、优缺点及项目部署步骤,帮助开发者快速上手并部署若依项目。
21376 3
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
|
SQL XML JavaScript
【若依Java】15分钟玩转若依二次开发,新手小白半小时实现前后端分离项目,springboot+vue3+Element Plus+vite实现Java项目和管理后台网站功能
摘要: 本文档详细介绍了如何使用若依框架快速搭建一个基于SpringBoot和Vue3的前后端分离的Java管理后台。教程涵盖了技术点、准备工作、启动项目、自动生成代码、数据库配置、菜单管理、代码下载和导入、自定义主题样式、代码生成、启动Vue3项目、修改代码、以及对代码进行自定义和扩展,例如单表和主子表的代码生成、树形表的实现、商品列表和分类列表的改造等。整个过程详细地指导了如何从下载项目到配置数据库,再到生成Java和Vue3代码,最后实现前后端的运行和功能定制。此外,还提供了关于软件安装、环境变量配置和代码自动生成的注意事项。
31946 73
|
SQL XML Java
ruoyi若依框架@DataScope注解使用以及碰到的一些问题
ruoyi若依框架@DataScope注解使用以及碰到的一些问题
6155 0
|
存储 SQL 前端开发
【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)
接着上回的【若依RuoYi-Vue | 项目实战】基于若依的帝可得后台管理系统(一),本次我们继续完成人员管理、设备管理、策略管理模块的开发。
2664 6
【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)