1.后台数据需要封装格式如下:
json: [ { "id": "1", "menuName": "卓尔互动公司", "hasChild": "1", "children": [ { "id": "1-1", "menuName": "项目研发部", "hasChild": "1", "children": [ { "id": "1-1-1", "menuName": "架构部", "hasChild": "0" }, { "id": "1-1-2", "menuName": "项目部", "hasChild": "0" } ] }, { "id": "1-2", "menuName": "项目核算部", "hasChild": "0" } ] }, { "id": "2", "menuName": "北京国炬公司", "hasChild": "1", "children": [ { "id": "2-1", "menuName": "人力部门", "hasChild": "0" }, { "id": "2-2", "menuName": "研发部", "hasChild": "0" } ] } ]
2.数据库结构如下:<主要根据菜单ID和父级菜单parentId>
CREATE TABLE `fm_menu` (
`id` bigint(20) NOT NULL COMMENT ‘主键ID‘,
`company_code` varchar(32) NOT NULL,
`client_id` varchar(32) NOT NULL COMMENT ‘应用编码‘,
`parent_id` bigint(20) DEFAULT NULL COMMENT ‘父级菜单ID‘,
`menu_name` varchar(100) NOT NULL COMMENT ‘菜单中文名‘,
`menu_name_en` varchar(100) NOT NULL COMMENT ‘菜单英文名‘,
`menu_name_nick` varchar(100) NOT NULL COMMENT ‘菜单对应后台模块‘,
`menu_model` varchar(100) NOT NULL COMMENT ‘菜单对应后台模块‘,
`menu_image_name` varchar(100) DEFAULT NULL COMMENT ‘背景图片名称‘,
`display_sequence` int(11) DEFAULT NULL COMMENT ‘展示序号‘,
`menu_depth` int(11) DEFAULT NULL COMMENT ‘菜单层次‘,
`has_child` bit(1) DEFAULT NULL COMMENT ‘是否有子项;Y表示有子项,N表示没有子项‘,
`platform_type` varchar(20) DEFAULT NULL COMMENT ‘平台类型,app,Web‘,
`remark` varchar(200) DEFAULT NULL COMMENT ‘备注‘,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间‘,
`create_owner` varchar(32) NOT NULL COMMENT ‘创建者‘,
`update_time` datetime DEFAULT NULL COMMENT ‘更新时间‘,
`update_owner` varchar(32) DEFAULT NULL COMMENT ‘更新者‘,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT=‘菜单表‘;
3.后台处理
3.1获取所有菜单列表以及一级菜单列表
@ApiOperation(value = "查询菜单树列表接口,对应查询按钮", httpMethod = "POST")
@RequestMapping(value = "/treeRoot", method = RequestMethod.POST)
@ResponseBody
public BusinessResponseVO queryTreeRootList(@RequestBody BaseMenuQuery reqVo) {
//最终的树形结构
List<BaseMenu> rootMenu = new ArrayList<BaseMenu>();
try {
//查询所有菜单
List<BaseMenu> allMenu = service.queryList(reqVo);
//根节点
for (BaseMenu nav : allMenu) {
if (nav.getParentId()== 0) {//父节点是0的,为根节点。
rootMenu.add(nav);
}
}
//为根菜单设置子菜单,getClild是递归调用的
for (BaseMenu nav : rootMenu) {
/* 获取根节点下的所有子节点 使用getChild方法*/
List<BaseMenu> childList = getChild(nav.getId(), allMenu);
nav.setChildren(childList);//给根节点设置子节点
}
return BusinessResponseVO.buildSuccessVo(rootMenu);
} catch (Exception e) {
e.printStackTrace();
}
return BusinessResponseVO.buildSuccessVo(rootMenu);
}
3.2根据父级菜单列表获取子级菜单列表
/**
* 获取子节点
*
* @param id 父节点id
* @param allMenu 所有菜单列表
* @return 每个根节点下,所有子菜单列表
*/
public List<BaseMenu> getChild(Long id, List<BaseMenu> allMenu) {
//子菜单
List<BaseMenu> childList = new ArrayList<BaseMenu>();
for (BaseMenu nav : allMenu) {
// 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
//相等说明:为该根节点的子节点。
if (nav.getParentId().equals(id)) {
childList.add(nav);
}
}
//递归
for (BaseMenu nav : childList) {
nav.setChildren(getChild(nav.getId(), allMenu));
}
//如果节点下没有子节点,返回一个空List(递归退出)
if (childList.size() == 0) {
return new ArrayList<BaseMenu>();
}
return childList;
}
4.获取的菜单树数据格式如下:
原文:https://www.cnblogs.com/pwrd/p/14349336.html