获取子菜单方法
/**
*通过传入当前菜单id,获取当前id的子菜单 且子菜单里也有子菜单及其信息,直到子菜单没有子菜单了,递归结束
* @param id 当前菜单的id
* @param menus 要查询的菜单范围
* @return 该id的子菜单
*/
private List<Menu> getChild(Long id,List<Menu> menus){
List<Menu> childList = new ArrayList<>();
for (Menu menu : menus) {
if(menu.getPid().equals(id)){
//当菜单范围内的父id等于传入的id,获取该id的所有子列表
childList.add(menu);
}
}
for (Menu menu : childList) {
//当上面循环语句查询不到子菜单,长度为0,自然也就不会递归调用了
//将该id的子菜单便利,通过递归调用,给每一个子菜单赋值子菜单
List<Menu> child = getChild(menu.getId(), menus);
menu.setSubMenu(child);
}
if(childList.size()==0){
//子菜单的长度为0,返回null,null不会被jackson解析
return null;
}
return childList;
}
获取树状的菜单结构
@Override
public List<Menu> findTreeMenu(){
List<Menu> menus = findAllMenu(); //先获取你想要在哪些菜单范围内搜索
List<Menu> rootMenus = new ArrayList<>();
for (Menu menu : menus) {
//从最上级菜单开始展示
if(menu.getPid().equals(0L)){
rootMenus.add(menu);
}
}
for (Menu rootMenu : rootMenus) {
//把最上级菜单的子菜单获取到,子菜单的子菜单也会获取到(目前是三层,由于是递归调用,100
层也没问题)
List<Menu> child = getChild(rootMenu.getId(), menus);
rootMenu.setSubMenu(child);
}
return rootMenus;
}
利用postman测接口,返回数据如下
[
{
"id": 1,
"menuname": "B2C销售管理",
"pid": 0,
"url": "/qwe",
"subMenu": [
{
"id": 1001,
"menuname": "订单显示",
"pid": 1,
"url": "/fsd",
"subMenu": [
{
"id": 1001001,
"menuname": "订单添加",
"pid": 1001,
"url": "/fg"
}
]
},
{
"id": 1002,
"menuname": "销售出库单",
"pid": 1,
"url": "/gk",
"subMenu": [
{
"id": 1002001,
"menuname": "销售出库单修改",
"pid": 1002,
"url": "/gh"
}
]
},
{
"id": 1003,
"menuname": "销售退货单",
"pid": 1,
"url": "/jmf",
"subMenu": [
{
"id": 1003001,
"menuname": "销售退货单修改",
"pid": 1003,
"url": "/il,.j"
}
]
},
{
"id": 1004,
"menuname": "网店订单导入",
"pid": 1,
"url": "/dh",
"subMenu": [
{
"id": 1004001,
"menuname": "网店订单导入修改",
"pid": 1004,
"url": "/gfjnf"
}
]
}
]
},
{
"id": 2,
"menuname": "商品与赠品管理",
"pid": 0,
"url": "/asd",
"subMenu": [
{
"id": 2001,
"menuname": "商品管理",
"pid": 2,
"url": "/fhj",
"subMenu": [
{
"id": 2001001,
"menuname": "商品管理添加",
"pid": 2001,
"url": "/ghj"
}
]
},
{
"id": 2002,
"menuname": "商品品牌管理",
"pid": 2,
"url": "/dahj",
"subMenu": [
{
"id": 2002001,
"menuname": " 商品品牌管理添加",
"pid": 2002,
"url": "/ghkjghkj"
}
]
},
{
"id": 2003,
"menuname": "商品类型管理",
"pid": 2,
"url": "/drhfjn",
"subMenu": [
{
"id": 2003001,
"menuname": "商品类型管理添加",
"pid": 2003,
"url": "/fghf"
}
]
},
{
"id": 2004,
"menuname": "赠品管理",
"pid": 2,
"url": "/tmkt",
"subMenu": [
{
"id": 2004001,
"menuname": "添加赠品",
"pid": 2004,
"url": "/iu"
},
{
"id": 2004002,
"menuname": "详情(查询)",
"pid": 2004,
"url": "/fhg"
},
{
"id": 2004003,
"menuname": "修改数量",
"pid": 2004,
"url": "/kl"
},
{
"id": 2004004,
"menuname": "商品转赠品",
"pid": 2004,
"url": "/goodsToPresent"
},
{
"id": 2004005,
"menuname": "赠品转商品",
"pid": 2004,
"url": "/qwde"
},
{
"id": 2004006,
"menuname": "审核",
"pid": 2004,
"url": "/qwfqwf"
}
]
},
{
"id": 2005,
"menuname": "促销活动申请与审批",
"pid": 2,
"url": "/gfh",
"subMenu": [
{
"id": 2005001,
"menuname": "促销活动申请与审批添加",
"pid": 2005,
"url": "/qwdeq"
}
]
},
{
"id": 2006,
"menuname": "价格调整申请与审批",
"pid": 2,
"url": "/dhdtf",
"subMenu": [
{
"id": 2006001,
"menuname": " 价格调整申请与审批添加",
"pid": 2006,
"url": "/cvbnv"
}
]
}
]
},
{
"id": 3,
"menuname": "售后管理",
"pid": 0,
"url": "/zxc",
"subMenu": [
{
"id": 3001,
"menuname": "返厂出入库管理",
"pid": 3,
"url": "/fgjnf",
"subMenu": [
{
"id": 3001001,
"menuname": " 返厂出入库管理添加",
"pid": 3001,
"url": "/cbvf"
}
]
},
{
"id": 3002,
"menuname": "退换货申请管理",
"pid": 3,
"url": "/fhtgfh",
"subMenu": [
{
"id": 3002001,
"menuname": " 退换货申请管理添加",
"pid": 3002,
"url": "/cvbcv"
}
]
},
{
"id": 3003,
"menuname": "申诉管理",
"pid": 3,
"url": "/ghmgh",
"subMenu": [
{
"id": 3003001,
"menuname": "申诉管理添加",
"pid": 3003,
"url": "/ghk"
}
]
}
]
},
{
"id": 4,
"menuname": "系统管理",
"pid": 0,
"url": "/rty",
"subMenu": [
{
"id": 4001,
"menuname": "用户管理(账号管理)",
"pid": 4,
"url": "/fgjn",
"subMenu": [
{
"id": 4001001,
"menuname": "添加用户",
"pid": 4001,
"url": "lkjh"
},
{
"id": 4001002,
"menuname": "用户详情",
"pid": 4001,
"url": "/userManage"
},
{
"id": 4001003,
"menuname": "用户修改",
"pid": 4001,
"url": "/dfbh"
}
]
},
{
"id": 4002,
"menuname": "角色管理(职位管理)",
"pid": 4,
"url": "/fgjj",
"subMenu": [
{
"id": 4002001,
"menuname": "添加角色",
"pid": 4002,
"url": "/ijughf"
},
{
"id": 4002002,
"menuname": "角色详情",
"pid": 4002,
"url": "/ujyhgfb"
},
{
"id": 4002003,
"menuname": "角色修改",
"pid": 4002,
"url": "/ujyhgf"
}
]
},
{
"id": 4003,
"menuname": "权限管理",
"pid": 4,
"url": "/fhn",
"subMenu": [
{
"id": 4003001,
"menuname": "添加权限",
"pid": 4003,
"url": "/fthgb"
},
{
"id": 4003002,
"menuname": "权限相亲",
"pid": 4003,
"url": "/dfg"
},
{
"id": 4003003,
"menuname": "权限修改",
"pid": 4003,
"url": "/yhkumj"
},
{
"id": 4003004,
"menuname": "权限报表",
"pid": 4003,
"url": "/wazs"
}
]
},
{
"id": 4004,
"menuname": "日志管理",
"pid": 4,
"url": "/fgngf",
"subMenu": [
{
"id": 4004001,
"menuname": "用户日志",
"pid": 4004,
"url": "/logManage"
},
{
"id": 4004002,
"menuname": "商品日志",
"pid": 4004,
"url": "/asf"
}
]
}
]
}
]
实体类设计如下
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.util.List;
@Data
@TableName("t_menu")
@JsonInclude(JsonInclude.Include.NON_NULL)// 不是null的数据才会被携带到返回数据中
public class Menu {
private Long id;
private String menuname;
private Long pid;
private String url;
@TableField(exist = false)
private List<Menu> subMenu;
}
数据库设计如下