我们先来开发菜单的接口,因为这3个表:用户表、角色表、菜单表,才有菜单表是不需要通过其他表来获取信息的。比如用户需要关联角色,角色需要关联菜单,而菜单不需要主动关联其他表。因此菜单表的增删改查是最简单的。

再回到我们的前端项目,登录完成之后我们通过JWT获取项目的导航菜单和权限,那么接下来我们就先编写这个接口。

获取菜单导航和权限的链接是/sys/menu/nav,然后我们的菜单导航的json数据应该是这样的:

{title: '角色管理',icon: 'el-icon-rank',path: '/sys/roles',name: 'SysRoles',component: 'sys/Role',children: []
}

然后返回的权限数据应该是个数组:

["sys:menu:list","sys:menu:save","sys:user:list"...]

注意导航菜单那里有个children,也就是子菜单,是个树形结构,因为我们的菜单可能这样:

系统管理 - 菜单管理 - 添加菜单

可以看到这就已经有3级了菜单了。
所以在打代码时候要注意这个关系的关联。我们的SysMenu实体类中有个parentId,但是没有children,因此我们可以在SysMenu中添加一个children,当然了其实不添加也可以,因为我们也需要一个dto,这样我们才能按照上面json数据格式返回。

我们还是来添加一个children吧:

@Data
@EqualsAndHashCode(callSuper = true)
public class SysMenu extends BaseEntity {...@TableField(exist = false)private List<SysMenu> children = new ArrayList<>();
}

然后我们也先来定义一个SysMenuDto吧,知道要返回什么样的数据,我们就只需要去填充数据就好了

@Data
public class SysMenuDto implements Serializable {private Long id;private String title;private String icon;private String path;private String name;private String component;List<SysMenuDto> children = new ArrayList<>();
}

ok,我们来开始我们的编码

/*** 获取当前用户的菜单栏以及权限*/
@GetMapping("/nav")
public Result nav(Principal principal) {String username = principal.getName();SysUser sysUser = sysUserService.getByUsername(username);// ROLE_Admin,sys:user:saveString[] authoritys = StringUtils.tokenizeToStringArray(sysUserService.getUserAuthorityInfo(sysUser.getId()), ",");return Result.succ(MapUtil.builder().put("nav", sysMenuService.getcurrentUserNav()).put("authoritys", authoritys).map());
}

方法中Principal principal表示注入当前用户的信息,getName就可以获取当当前用户的用户名了。sysUserService.getUserAuthorityInfo方法我们之前已经说过了,就在我们登录完成或者身份认证时候需要返回用户权限时候编写的。然后通过StringUtils.tokenizeToStringArray把字符串通过逗号分开组成数组形式。
重点在与sysMenuService.getcurrentUserNav,获取当前用户的菜单导航,

@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {.../*** 获取当前用户菜单导航*/@Overridepublic List<SysMenuDto> getcurrentUserNav() {String username = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();SysUser sysUser = sysUserService.getByUsername(username);// 获取用户的所有菜单List<Long> menuIds = sysUserMapper.getNavMenuIds(sysUser.getId());List<SysMenu> menus = buildTreeMenu(this.listByIds(menuIds));return convert(menus);}/*** 把list转成树形结构的数据*/private List<SysMenu> buildTreeMenu(List<SysMenu> menus){List<SysMenu> finalMenus = new ArrayList<>();for (SysMenu menu : menus) {// 先寻找各自的孩子for (SysMenu e : menus) {if (e.getParentId() == menu.getId()) {menu.getChildren().add(e);}}// 提取出父节点if (menu.getParentId() == 0L) {finalMenus.add(menu);}}return finalMenus;}/*** menu转menuDto*/private List<SysMenuDto> convert(List<SysMenu> menus) {List<SysMenuDto> menuDtos = new ArrayList<>();menus.forEach(m -> {SysMenuDto dto = new SysMenuDto();dto.setId(m.getId());dto.setName(m.getPerms());dto.setTitle(m.getName());dto.setComponent(m.getComponent());dto.setIcon(m.getIcon());dto.setPath(m.getPath());if (m.getChildren().size() > 0) {dto.setChildren(convert(m.getChildren()));}menuDtos.add(dto);});return menuDtos;}
}

接口中sysUserMapper.getNavMenuIds我们之前就已经写过的了,通过用户id获取菜单的id,然后后面就是转成树形结构,buildTreeMenu方法的思想很简单,我们现实把菜单循环,让所有菜单先找到各自的子节点,然后我们在把最顶级的菜单获取出来,这样顶级下面有二级,二级也有自己的三级。最后就是convert把menu转成menuDto。这个比较简单,就不说了。
好了,导航菜单已经开发完毕,我们来写菜单管理的增删改查,因为菜单列表也是个树形接口,这次我们就不是获取当前用户的菜单列表的,而是所有菜单然后组成树形结构,一样的思想,数据不一样而已。

开发用户导航栏和权限信息接口相关推荐

  1. vuex+element 从后台获取数据写导航栏-菜单权限

    主要用到 vuex.router.beforeEach.router.addRoutes().vuex 的使用方法可以看我的另一篇博客:vue笔记(四)vuex. 顺便安利一个 在线视频转gif图. ...

  2. Android开发——底部导航栏设计

    底部导航栏设计 1.依赖配置 2.tabbar的UI实现 3.tabbar的逻辑绑定 4.tabbar的滑动与点击联动 5.tabbar与文本输入的冲突解决方案     其实,常见的Android和微 ...

  3. MIPCMS模板开发之导航栏隐藏某项导航

    文章目录[隐藏] 前言 功能描述 普通带子导航的导航栏 隐藏某个导航栏 前言 以前研究一段时间的MIPCMS模板编写,其实在开发的时候还是遇到了坑的,由于不咋会 php 所以只能到处找,因为这个 cm ...

  4. 开启微信公众号服务器后面的开发,微信公众号开发者权限 开通接口与配置服务器...

    微信公众号开发者权限 开通接口与配置服务器 作为微信公众平台的开发者,是可以修改自定义菜单的.每个公众号下端都会有三个或者是四个菜单.关于菜单的内容以及显示的方式都是可以通过后台的开发者权限更改的.如 ...

  5. 微信小程序开发 — 顶部导航栏

    直接看代码吧,第一部分是wxml部分 <view class='nav'><text class='{{curNum==index?"cur":"&qu ...

  6. 原神社区-米游社网站开发--上导航栏

    仿照原神社区-米游社做一个网页 之前做个优品购的项目,换汤不换药 打开页面,猜测上面导航因为是用fix固定做,下面部分,放在版心下做 结尾都是这个,那么就可以把头部尾部写在commend公共模块里面. ...

  7. 【iOS开发】导航栏,类似淘宝“我的淘宝”导航栏

    转载地址: https://blog.csdn.net/fanxiaomeng92/article/details/72771666

  8. android开发时华为手机底部导航栏挡住了应用布局

    原因:使用安卓的BottomNavigationView控件开发底部导航栏同时使用了沉浸式状态栏导致华为手机的底部导航栏会盖住我应用的导航栏. 解决:先写一个工具类 import android.co ...

  9. Android 通讯录导航栏

    这几天无意间翻到之前写的一篇关于自定义通讯录导航栏的博客,文章中只是做了一点点简单介绍,写的并不完整.由于这段时间比较空闲,索性把整篇文章重新整理一遍. 这样的一个控件实现起来不难,需要对自定义vie ...

最新文章

  1. jquery自定义对话框alert、confirm和prompt
  2. 小米3 开发人员选项
  3. Sound Mixer Fader
  4. AIDL注意细节 简单Demo
  5. 2 中间件的使用、异步action的创建
  6. 智能蓝牙控制、温湿度控制时间风扇
  7. java大马后门_一款免杀php大马的解密与去后门
  8. 游戏音效制作的基本步骤
  9. 微软的面试题及答案-超变态但是很经典
  10. c语言中判断c是否为小写字母,C语言判断英文字符大小写的方法
  11. 【榜单】机器学习 深度学习近三年被引最多论文 Top 20,图像识别 GAN等(附下载)
  12. #459 津津有味:北方人对饺子的痴迷可能是刻进骨子里的
  13. Oracle数据库学习(六):where条件查询及关键字使用
  14. 2014暑假ACM13级一批集训内容
  15. 强化学习 - 详细解读DQN(更新完成)
  16. 被割韭菜还是来割韭菜
  17. Chrome 的哪些功能改变了我们浏览网页的方式?
  18. Password Management: Hardcoded Password
  19. 如何画圆角矩形 c代码
  20. rx6700xt相当于什么n卡

热门文章

  1. 正确解读PHP获取时间错误原因
  2. ARM LCD简单绘图API
  3. java学习入门怎么做最为高效
  4. Nuget常用命令(转)
  5. [Code Plus#4] 最短路
  6. 简单易上手的Bootstrap
  7. 让我们来了解一下:操作系统和平台相关性
  8. atitit.jQuery Validate验证框架详解与ati Validate 设计新特性
  9. AIX系统相关的日常操作
  10. 如何创建并发布Google Earth KML 地标文件?