Java 递归实现多级菜单

在这里插入图片描述

查询语句

    <!--查询菜单-->
    <select id="selectMenuByParentId" parameterType="com.user_service.pojo.SystemMenu" resultType="com.user_service.pojo.SystemMenu">
        SELECT * from system_menu A
        <where>
            <if test="parentId!= '' and parentId != null">
                FIND_IN_SET(id, GET_MENU_CHILD_NODE(#{
    
    parentId}))
            </if>
        </where>
    </select>

实体类

import java.io.Serializable;
import java.util.List;

/**
 * @Author:刘德安
 * @Date: 2021/2/5 11:46
 * 菜单表
 */
public class SystemMenu implements Serializable {
    
    
    //编号
    private Integer id;
    //菜单名
    private String name;
    //父菜单编号
    private Integer parentId;
    //菜单级别
    private String level;
    //地址
    private String url;
    //状态(0启用,1禁止)
    private String state;
    //显示顺序
    private String order;
    //备注
    private String remarks;
    //存放子菜单
    private List<SystemMenu> children;
	//... 省去getter和setter方法以及toString方法
}

递归查询

    /**
     * 根据父节点查询菜单信息
     * */
    @Override
    public Map<String,Object> selectMenuByParentId(JSONObject json){
    
    
        Map<String,Object> resultData = new HashMap();
        try {
    
    
            String parentId = json.getString("parentId");
            SystemMenu bean = new SystemMenu();
            if(!StringUtils.isNull(parentId)) {
    
    
                bean.setParentId(Integer.valueOf(parentId));
            }
            // 获取所有菜单数据
            List<SystemMenu> list = userMapper.selectMenuByParentId(bean);
            //定义 存储一级菜单
            List<SystemMenu> menuList = new ArrayList<SystemMenu>();
            // 先找到所有的一级菜单
            for (int i = 0; i < list.size(); i++) {
    
    
                // 一级菜单没有父菜单,为null
                if (list.get(i).getParentId()==null) {
    
    
                    menuList.add(list.get(i));
                }
            }
            /* 根据Menu类的order排序 */
            Collections.sort(menuList, order());
            // for调用递归,循环获取所有子菜单
            for (SystemMenu menu : menuList) {
    
    
                menu.setChildren(getChildmenus(menu.getId(), list));
            }
            resultData.put( "success" , "true" );
            resultData.put( "list" , menuList);
            return resultData;
        } catch (Exception e) {
    
    
            e.printStackTrace();
            resultData.put( "success" , "true" );
            resultData.put( "list" ,  new ArrayList());
            return resultData;
        }
    }

    /**
     * 递归子菜单
     * @param id  父节点id
     * @param menus 所有菜单列表
     * @return 每个根节点下,所有子菜单列表
     */
    private List<SystemMenu> getChildmenus(Integer id, List<SystemMenu> menus) {
    
    
        // 子菜单
        List<SystemMenu> childMenus = new ArrayList<>();
        for (SystemMenu menu : menus) {
    
    
            if (menu.getParentId()!=null) {
    
    
                // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
                //相等说明:为该根节点的子节点。
                if (menu.getParentId().equals(id)) {
    
    
                    childMenus.add(menu);
                }
            }
        }
        //递归
        for (SystemMenu menu : childMenus) {
    
    
                menu.setChildren(getChildmenus(menu.getId(),menus));
        }
        Collections.sort(childMenus,order()); //排序
        //如果节点下没有子节点,返回一个空List(递归退出)
        if (childMenus.size() == 0) {
    
    
            return null;
        }
        return childMenus;
    }

    /*
     * 排序,根据order排序
     */
    public Comparator<SystemMenu> order(){
    
    
        Comparator<SystemMenu> comparator = new Comparator<SystemMenu>() {
    
    
            @Override
            public int compare(SystemMenu o1, SystemMenu o2) {
    
    
                if (o1.getOrder() != o2.getOrder()){
    
    
                    return Integer.valueOf(o1.getOrder()) - Integer.valueOf(o2.getOrder());
                }
                return 0 ;
            }
        };
        return comparator;
    }

在这里插入图片描述

最后返回的Json如下

{
    
    
    "success": "true",
    "list": [
        {
    
    
            "id": 2021001,
            "name": "首页",
            "parentId": null,
            "level": "1",
            "url": "1",
            "state": "1",
            "order": "1",
            "remarks": "首页",
            "children": null
        },
        {
    
    
            "id": 2021002,
            "name": "系统管理",
            "parentId": null,
            "level": "1",
            "url": "2222",
            "state": "1",
            "order": "2",
            "remarks": "系统管理",
            "children": [
                {
    
    
                    "id": 2021019,
                    "name": "用户管理",
                    "parentId": 2021002,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "1",
                    "remarks": "用户管理",
                    "children": null
                },
                {
    
    
                    "id": 2021020,
                    "name": "角色管理",
                    "parentId": 2021002,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "2",
                    "remarks": "角色管理",
                    "children": null
                },
                {
    
    
                    "id": 2021021,
                    "name": "菜单管理",
                    "parentId": 2021002,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "3",
                    "remarks": "菜单管理",
                    "children": null
                }
            ]
        },
        {
    
    
            "id": 2021003,
            "name": "调试",
            "parentId": null,
            "level": "1",
            "url": "/liu/666",
            "state": "1",
            "order": "3",
            "remarks": "调试",
            "children": [
                {
    
    
                    "id": 2021013,
                    "name": "模块调试",
                    "parentId": 2021003,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "1",
                    "remarks": "模块调试",
                    "children": null
                },
                {
    
    
                    "id": 2021014,
                    "name": " 系统调试",
                    "parentId": 2021003,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "2",
                    "remarks": " 系统调试",
                    "children": null
                }
            ]
        },
        {
    
    
            "id": 2021004,
            "name": "数据修改",
            "parentId": null,
            "level": "1",
            "url": "/juese",
            "state": "1",
            "order": "4",
            "remarks": "数据修改",
            "children": [
                {
    
    
                    "id": 2021015,
                    "name": " 代码修改",
                    "parentId": 2021004,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "1",
                    "remarks": " 代码修改",
                    "children": null
                },
                {
    
    
                    "id": 2021016,
                    "name": " 数据修改",
                    "parentId": 2021004,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "2",
                    "remarks": " 数据修改",
                    "children": null
                }
            ]
        },
        {
    
    
            "id": 2021005,
            "name": "部署",
            "parentId": null,
            "level": "1",
            "url": "/ceshi",
            "state": "1",
            "order": "5",
            "remarks": "部署",
            "children": [
                {
    
    
                    "id": 2021017,
                    "name": "代码部署",
                    "parentId": 2021005,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "1",
                    "remarks": "代码部署",
                    "children": null
                },
                {
    
    
                    "id": 2021018,
                    "name": " 数据部署",
                    "parentId": 2021005,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "2",
                    "remarks": " 数据部署",
                    "children": null
                }
            ]
        },
        {
    
    
            "id": 2021006,
            "name": "系统测试",
            "parentId": null,
            "level": "1",
            "url": null,
            "state": "1",
            "order": "6",
            "remarks": "系统测试",
            "children": [
                {
    
    
                    "id": 2021010,
                    "name": "文件测试",
                    "parentId": 2021006,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "1",
                    "remarks": "文件测试",
                    "children": null
                },
                {
    
    
                    "id": 2021011,
                    "name": "Jmeter测试",
                    "parentId": 2021006,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "2",
                    "remarks": "Jmeter测试",
                    "children": null
                },
                {
    
    
                    "id": 2021012,
                    "name": "模块批量测试",
                    "parentId": 2021006,
                    "level": "2",
                    "url": null,
                    "state": "1",
                    "order": "3",
                    "remarks": "模块批量测试",
                    "children": null
                }
            ]
        },
        {
    
    
            "id": 2021007,
            "name": "流程工单",
            "parentId": null,
            "level": "1",
            "url": null,
            "state": "1",
            "order": "7",
            "remarks": "流程工单",
            "children": null
        },
        {
    
    
            "id": 2021008,
            "name": "工作报告",
            "parentId": null,
            "level": "1",
            "url": null,
            "state": "1",
            "order": "8",
            "remarks": "工作报告",
            "children": null
        },
        {
    
    
            "id": 2021009,
            "name": "运维",
            "parentId": null,
            "level": "1",
            "url": null,
            "state": "1",
            "order": "9",
            "remarks": "运维",
            "children": null
        }
    ]
}

猜你喜欢

转载自blog.csdn.net/weixin_43851064/article/details/113842169