『博客开发日记-后台』之获取菜单下拉选项接口的实现

本文最后更新于 2026年4月30日 晚上

获取菜单下拉选项接口的实现


获取菜单下拉选项接口的需求

根据关键字查询

按排序字段升序排列

查询可见的菜单

如果前端的 onlyParent 为 true,只查询目录和菜单类型(不包含按钮)


代码实现

在 SysMenuController 中添加接口

1
2
3
4
5
6
7
8
9
10
11

@GetMapping("/options")
@SystemLog(businessName = "菜单下拉选项")
@ApiOperation(value = "菜单下拉选项", notes = "获取菜单下拉数据", response = MenuOptionVo.class, responseContainer = "List")
@ApiImplicitParams({
@ApiImplicitParam(name = "onlyParent", value = "是否只返回目录/菜单父节点", dataType = "boolean", paramType = "query")
})
public ResponseResult getMenuOptions(Boolean onlyParent)
{
return sysMenuService.getMenuOptions(onlyParent);
}

在 SysMenuController 中添加常量


创建 MenuOptionVo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "菜单选项")
public class MenuOptionVo
{
@ApiModelProperty(value = "菜单ID")
@JSONField(name = "value")//转换成 value 再响应给前端
private Long id;

@ApiModelProperty(value = "菜单名称")
@JSONField(name = "label")//转换成 label 再响应给前端
private String name;

@ApiModelProperty(value = "父菜单ID", hidden = true)
@JSONField(serialize = false)//不序列化到JSON响应中
private Long parentId;

@TableField(exist = false)
private List<MenuOptionVo> children;

//方便链式调用
public MenuOptionVo setChildren(List<MenuOptionVo> children) {
this.children = children;
return this;
}
}

在 SysMenuServiceImpl 中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//获取菜单下拉数据
@Override
public ResponseResult getMenuOptions(Boolean onlyParent)
{
//查询所有菜单选项
LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();

//查询可见的菜单
queryWrapper.eq(SysMenu::getVisible, SystemConstants.VISIBLE);

//如果前端的 onlyParent 为 true,只查询目录和菜单类型(不包含按钮)
if (onlyParent != null && onlyParent) {
queryWrapper.in(SysMenu::getType, SystemConstants.MENU_TYPE_C, SystemConstants.MENU_TYPE_M);
}

//按排序字段升序排列
queryWrapper.orderByAsc(SysMenu::getSort);

//查询所有符合条件的菜单
List<SysMenu> menuList = list(queryWrapper);

//转换为 MenuOptionVo 列表
List<MenuOptionVo> menuOptionVos = BeanCopyUtils.copyBeanList(menuList, MenuOptionVo.class);

//构建菜单树
List<MenuOptionVo> menuTree = builderMenuOptionTree(menuOptionVos, 0L);

return ResponseResult.okResult(menuTree);
}


//创建MenuOption的菜单树
private List<MenuOptionVo> builderMenuOptionTree(List<MenuOptionVo> menuOptionVos, Long parentId)
{
List<MenuOptionVo> menuTree = menuOptionVos.stream()
.filter(menuOptionVo -> menuOptionVo.getParentId().equals(parentId))
.map(menuOptionVo -> menuOptionVo.setChildren(getChildrenByMenuOption(menuOptionVo, menuOptionVos)))
.collect(Collectors.toList());
return menuTree;
}

//获取传入参数的 子菜单(MenuOption)集合
private List<MenuOptionVo> getChildrenByMenuOption(MenuOptionVo menuOptionVo, List<MenuOptionVo> menuOptionVos)
{
List<MenuOptionVo> childrenList = menuOptionVos.stream()
.filter(m -> m.getParentId().equals(menuOptionVo.getId()))
.map(m -> m.setChildren(getChildrenByMenuOption(m, menuOptionVos)))
.collect(Collectors.toList());
return childrenList;
}



PS:该系列只做为作者学习开发项目做的笔记用

不一定符合读者来学习,仅供参考


预告

后续会记录博客的开发过程

每次学习会做一份笔记来进行发表

“一花一世界,一叶一菩提”


版权所有 © 2026 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/


『博客开发日记-后台』之获取菜单下拉选项接口的实现
http://example.com/2026/04/27/『博客开发日记-后台』之获取菜单下拉选项接口的实现/
作者
云梦泽
发布于
2026年4月27日
更新于
2026年4月30日
许可协议