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

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

问题起源


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


若依系统中的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、数据的关联性,比如与其他数据有关联的数据不能删除,数据不能以自己为父节点等等逻辑。

目录
相关文章
|
8月前
若依框架 --- 菜单已分配,无法删除解决
若依框架 --- 菜单已分配,无法删除解决
431 1
|
8月前
|
SQL XML Java
若依框架 --- 使用数据权限功能
若依框架 --- 使用数据权限功能
901 0
|
8月前
|
Java 数据库
若依框架---模板生成
若依框架---模板生成
202 0
|
8月前
若依框架 --- 修改默认跳转页面
若依框架 --- 修改默认跳转页面
815 0
|
8月前
若依框架 --- ruoyi 表格的设置
若依框架 --- ruoyi 表格的设置
1143 0
支付系统---微信支付14----创建案例项目---介绍,第二步引入Swagger,接口文档和测试页面生成工具,定义统一结果的目的是让结果变得更加规范,以上就是谷粒项目的几个过程
支付系统---微信支付14----创建案例项目---介绍,第二步引入Swagger,接口文档和测试页面生成工具,定义统一结果的目的是让结果变得更加规范,以上就是谷粒项目的几个过程
|
6月前
|
前端开发 NoSQL JavaScript
若依修改---重新部署项目注意事项,新文件初始化需要修改的地方,打包后的文件很难进行修改,如果想要不断修改项目,注意保存原项目,才可以不断修改,前端:在Vue.config.js文件中修改target
若依修改---重新部署项目注意事项,新文件初始化需要修改的地方,打包后的文件很难进行修改,如果想要不断修改项目,注意保存原项目,才可以不断修改,前端:在Vue.config.js文件中修改target
|
6月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
|
8月前
|
数据安全/隐私保护
若依框架---为什么把添加和更新分成两个接口
若依框架---为什么把添加和更新分成两个接口
256 0
|
8月前
|
前端开发
若依框架---分页功能
若依框架---分页功能
552 0