对应的数据库的表
对应的菜单表
其中七张表的总体关系
这里我们通过字段level来判断是否是1\2\3级菜单
前端传递过来的id
第一步:我们先通过id来查找对应的菜单的等级
前端传过来的id有可能是1/2/3级别
等级为3直接删除
等级为2,先删除3再删2
等级为1先删除3再用等级二的方法
我们通过level和parentMenuId
<!--查找菜单等级-->
<select id="findLevel" resultType="java.lang.Integer">
SELECT LEVEL FROM `t_menu` WHERE id=#{id}
</select>
<!--查找所有等级为三的菜单id,它的父id是我们前端传过来要删除的id-->
<select id="findLevel2Children" resultType="java.lang.Integer">
SELECT id FROM `t_menu` WHERE parentMenuId=#{id} AND LEVEL=3
</select>
<!--查找所有等级为二的菜单id,它的父id是我们前端传过来要删除的id-->
<select id="findLevel1Children" resultType="java.lang.Integer">
SELECT id FROM `t_menu` WHERE parentMenuId=#{id} AND LEVEL=2
</select>
第二步:查找到对应的id的菜单等级了
我们通过level1\level2\level==3,分成了三种情况的考虑.
当菜单等级为第三级时候,我们先清除和role表的关联关系,然后就可以直接删除对应的id.
当菜单等级为二级菜单的时候我们先要判断此菜单有么有子菜单,如果存在子菜单,先要遍历子集菜单先删除所有子集菜单(调用菜单等级为三级的时候方法即可),如果没有子菜单直接调用删除三级菜单的方法即可
当菜单为一级菜单的时候我们先要判断此一级菜单有没有二级子集菜单,如果有二级子集菜单,先要遍历所有的二级菜单,(这里我们直接调用上面的二级菜单的方法即可),如果没有子菜单直接调用删除三级菜单的方法即可
/**
* 用于删除一个菜单
*youkey
* @param id
*/
public void delete(Integer id) {
//菜单等级查询
Integer level = menuDao.findLevel(id);
//一级菜单删除
if (level == 1) {
List<Integer> ids = menuDao.findLevel1Children(id);
if (ids != null && ids.size() > 0) {
for (Integer integer : ids) {
delete2(integer);
}
}
delete3(id);
return;
}
//二级菜单删除
if (level == 2) {
delete2(id);
return;
}
//三菜单删除
if (level == 3) {
delete3(id);
return;
}
}
//用于删除二级菜单的方法
public void delete2(Integer id) {
//查找二级菜单下的三级菜单id
List<Integer> ids = menuDao.findLevel2Children(id);
if (ids != null && ids.size() > 0) {
for (Integer i : ids) {
delete3(i);
}
}
delete3(id);
}
//用于删除三级菜单的方法
public void delete3(Integer id) {
menuDao.deleteAndRoleAssiation(id);
menuDao.delete(id);
}