情景引入
- 小白:起床起床,,,我又遇到一个麻烦事了。
- 我:怎么了呢?算好今天我醒来得早,就不责备你了。
- 小白:就是,昨晚我躺在床上进行思考问题的时候,突然想到我们用的很多系统里面都有菜单,但是,我注意到不同的用户登录之后显示的都不一样耶。
- 我:当然了,不同的用户看到的未必是一样,只是为了进行页面功能的控制呀。这有什么奇怪的呢?
- 小白:emmm,我之前都是做的很多业务功能,都没有关注这方面的问题,所以,我想请教下这是如何做到的呢?因为这个很普遍,我想多学学这里面的知识。
- 我:今天太阳是从西边出来了吗?你都会这么思考了,看在你这么爱学习的份上,我就给你好好说说这方面的知识把。
- 小白:好呀好呀~又可以学习新东西咯。。。。
简介
首先,先用图来引入正题。
我们观察上面的图,我们可以发现存在着很多不同的菜单列表,而且它其实是一种动态的显示功能。很明显,这是为了适应不同的用户而显示不同的菜单,以免发生系统功能的混乱(比如让一个用户拥有删库的功能,这不是很恐怖的吗?)来实现系统的稳定性和实用性。
菜单管理其实对于一个后台系统是非常非常普遍的,麻雀虽小五脏俱全,它所包含的知识其实是很多的。总的来说,菜单管理是一个系统的“门面”,所以,它关系到这个系统的使用。那么如何进行这个功能的开发呢?请认真听我一步步来为大家进行分析。
开发步骤
这里的话,我就不单独进行编写了,我就通过GUNS开源框架来帮助大家一步步剖析这个功能的实现(大家应该多多看看开源框架的实现方式,这个也是提升我们编码能力的一个方法,可能过程很枯燥,但是一步步下来,收获也是非常多的)。
环境:IDEA+Maven + SpringBoot + Mybatis + Mysql + windows7
- 数据库设计
备注:既然我前面已经提到,菜单功能是一个动态特性,那么为什么拥有动态,其实就是在数据库上进行的“手脚”。我们都知道权限同样是一种动态特性,这样才能够保证不同的用户能够进行系统的不同处理操作,否则都一样,那么系统就无法正常的进行管理信息。同理,菜单功能的实现也正是基于权限系统的开发设计,所以,我们可以设计如下的数据库结构。
表一:用户表
表二:角色表
表三:系统资源表(菜单功能表)
表四:用户-角色-资源表
备注:大体设计的话就是上面的这样子,如果还有什么特别的功能的话,那么就对应的修改字段就好了,关键在于让“用户-角色-系统资源”能够有关联关系。 - 获取当前登录用户的显示菜单信息
温馨提示:其实这个就是在当用户进行登录验证之后跳转到主页的时候进行的操作。
备注:这是菜单构建的关键地方,可以分为几步进行处理:
(1)获取当前用户的角色信息(主要就是:roleId)
这个很简单,就是简单的查询"用户表"即可
controller层:
@Autowired
private UserService userService; //对用户信息操作的service层
/**
* 跳转到主页
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index(Model model) {
//获取角色列表(根据用户名获取(当然,这个根据你的需要,也可以通过其他的用户表字段进行获取都可以的))
List<Integer> roleList = userService.getRoleList(account);
if (roleList == null || roleList.size() == 0) {
ShiroKit.getSubject().logout();
model.addAttribute("tips", "该用户没有角色,无法登陆");
return "/login.html";
}
}
mapper层:
select roleid
from user
where account = "XXXXX"
备注:其实对于用户的相关信息,我们一般都在登录验证的时候就会进行保存到sess