最近准备把之前的博客重写,有时间还是要更新一些博客,防止权重下降,水一水。
通常我们后台有很多不同的角色登录,每个角色不同的权限,这个在 SpringBoot整合Shiro实现权限控制,验证码,记住我 中已经介绍了,这次我们介绍一下,如何根据不同的角色登录显示不同的菜单。
比如我目前只有两个角色,系统管理员和普通用户。
当用户登录后台的时候,通过 ajax 从后台获取菜单列表,redis 做缓存,然后初始化加载。
关于菜单绑定角色,其实也可以菜单绑定权限的。这里为了方便,我们使用使用角色来区分。
如下图,两种角色不同的菜单,至于不同菜单的请求链接,是通过 Shiro 控制权限访问的。
1、menu 菜单表
2、role 表
3、role_menu 表
1、实体
2、Controller 层
3、Service 层
4、Dao 层
MenuMapper.java
MenuMapper.xml
5、前台页面
head里引入jquery库和自定义js文件
将模板页面的菜单列表去掉,准备从后台获取,通过js拼装并填充到页面
init.js
一切完毕后,我们启动项目,访问后台页面,打开浏览器的 console
可以看到 ajax 请求返回的数据
二级菜单数据也有
HTML页面也有元素
通常我们后台有很多不同的角色登录,每个角色不同的权限,这个在 SpringBoot整合Shiro实现权限控制,验证码,记住我 中已经介绍了,这次我们介绍一下,如何根据不同的角色登录显示不同的菜单。
比如我目前只有两个角色,系统管理员和普通用户。
当用户登录后台的时候,通过 ajax 从后台获取菜单列表,redis 做缓存,然后初始化加载。
关于菜单绑定角色,其实也可以菜单绑定权限的。这里为了方便,我们使用使用角色来区分。
如下图,两种角色不同的菜单,至于不同菜单的请求链接,是通过 Shiro 控制权限访问的。
一、数据库设计和数据
1、menu 菜单表
2、role 表
3、role_menu 表
二、核心代码
1、实体
- package com.liuyanzhao.blog.api.model;
- import lombok.Data;
- import java.util.List;
- /**
- * 菜单
- *
- * @author liuyanzhao
- */
- @Data
- public class Menu {
- /**
- * 菜单ID
- */
- private Integer id;
- /**
- * 父级菜单ID
- */
- private Integer pid;
- /**
- * 菜单名称
- */
- private String name;
- /**
- * 菜单类型:top_menu, main_menu, admin_menu
- */
- private String type;
- /**
- * 菜单URL
- */
- private String url;
- /**
- * 菜单图标
- */
- private String icon;
- /**
- * 菜单分数,越大排序越前
- */
- private Integer score;
- /**
- * 子菜单Menu列表
- */
- private List<Menu> childMenu;
- }
2、Controller 层
- @GetMapping("/admin/menu/listAdminMenu")
- @ResponseBody
- public ResultVO listAdminMenu() {
- List<Menu> result;
- //1、判断当前用户的角色
- Subject subject = SecurityUtils.getSubject();
- if(subject.hasRole("ROLE_ADMIN")) {
- //管理员
- result = menuService.listAdminMenuByRole(1);
- } else {
- //普通用户
- result = menuService.listAdminMenuByRole(2);
- }
- if(result == null || result.size() == 0) {
- return new ResultVO().error("菜单为空");
- }
- return new ResultVO().ok(result);
- }
3、Service 层
- @Override
- @Cacheable(value = "menu", key = "'listAdminMenuByRole'+#p0")
- public List<Menu> listAdminMenuByRole(Integer roleId) {
- List<Menu> menuList;
- List<Menu> newMenuList = new ArrayList<>();
- try {
- //1、根据角色获得所有的菜单(包括一级和二级)
- menuList = menuMapper.listMenuByRoleId(roleId);
- for (int i = 0; i < menuList.size(); i++) {
- Menu menu = menuList.get(i);
- List<Menu> childMenuList = new ArrayList<>();
- //2、拼装二级菜单
- if (menu.getPid() == 0) {
- for (int j = 0; j < menuList.size(); j++) {
- if (Objects.equals(menu.getId(), menuList.get(j).getPid())) {
- childMenuList.add(menuList.get(j));
- }
- }
- menu.setChildMenu(childMenuList);
- newMenuList.add(menu);
- }
- }
- } catch (Exception e) {
- log.error("【后台菜单获取失败】,cause:{}", e);
- }
- return newMenuList;
- }
4、Dao 层
MenuMapper.java
- List<Menu> listMenuByRoleId(Integer roleId);
MenuMapper.xml
- <!--从 role_menu 关联表查询-->
- <select id="listMenuByRoleId" parameterType="java.lang.Integer"
- resultMap="BaseResultMap">
- select menu.* from role_menu, menu
- where role_menu.role_id = #{value} and role_menu.menu_id = menu.id
- </select>
5、前台页面
head里引入jquery库和自定义js文件
- <script src="/components/jquery/dist/jquery.min.js"></script>
- <script src="/js/admin/init.js"></script>
将模板页面的菜单列表去掉,准备从后台获取,通过js拼装并填充到页面
- <ul class="sidebar-menu" data-widget="tree" id="menu-ul">
- </ul>
init.js
- //初始化菜单
- $.ajax({
- url: '/admin/menu/listAdminMenu',
- type: 'GET',
- success: function (data) {
- console.log(data);
- if (data.code == 200) {
- //for循环初始化菜单
- var str = '';
- $.each(data.data, function (i, item) {
- str += '<li class="treeview">';
- str += '<a href="' + item.url + '">';
- str += '<i class="' + item.icon + '"></i>';
- str += '<span>' + item.name + '</span>';
- if (item.childMenu.length != 0) {
- str += '<span class="pull-right-container">';
- str += ' <i class="fa fa-angle-left pull-right"></i>';
- str += '</span>';
- }
- str += '</a>';
- str += '<ul class="treeview-menu">';
- if (item.childMenu.length != 0) {
- $.each(item.childMenu, function (j, item2) {
- str += '<li><a href="' + item2.url + '">';
- str += item2.name;
- str += '</a></li>';
- })
- }
- str += '</ul></li>';
- });
- $("#menu-ul").html(str);
- }
- },
- error: function () {
- }
- });
三、前台调试
一切完毕后,我们启动项目,访问后台页面,打开浏览器的 console
可以看到 ajax 请求返回的数据
二级菜单数据也有
HTML页面也有元素
2019年01月19日 14:13:22
博主,可以共享一下源码吗?
2018年10月11日 11:09:40
看了一下,感觉很不错
2018年09月24日 23:03:31
今天刚刚看了权限管理的视频,但是没想到前端怎么设计,很赞!!!