本文最后更新于 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") private Long id;
@ApiModelProperty(value = "菜单名称") @JSONField(name = "label") private String name;
@ApiModelProperty(value = "父菜单ID", hidden = true) @JSONField(serialize = false) 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);
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);
List<MenuOptionVo> menuOptionVos = BeanCopyUtils.copyBeanList(menuList, MenuOptionVo.class);
List<MenuOptionVo> menuTree = builderMenuOptionTree(menuOptionVos, 0L);
return ResponseResult.okResult(menuTree); }
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; }
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/