1.数据库表
--用户表
CREATE TABLE `sys_user` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`login_name` varchar(255) DEFAULT NULL,
`mobile` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--用户角色中间表
CREATE TABLE `sys_user_role` (
`id` int(11) NOT NULL,
`user_id` varchar(255) DEFAULT NULL,
`role_id` varchar(255) DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--角色表
CREATE TABLE `sys_role` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--角色权限中间表
CREATE TABLE `sys_role_menu` (
`id` int(11) NOT NULL,
`role_id` varchar(255) DEFAULT NULL,
`menu_id` varchar(255) DEFAULT NULL,
`sort` varchar(255) DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--权限表
CREATE TABLE `sys_menu` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`parent_id` varchar(255) DEFAULT NULL,
`sort` varchar(255) DEFAULT NULL,
`url` varchar(255) DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.登录验证
3.根据用户查找角色,根据角色查找权限
-- 一个用户多个角色 ,角色使用集合接收
-- 循环角色,根据角色查找权限
-- 一个角色有多个权限 , 权限使用集合对象接收
-- 循环权限,将权限添加到 list 集合对象中,这样 最后的集合中就包含了用户拥有的权限(查询的都是中间表中对应的id)
4.菜单分级,
-- 创建Map 集合用于接收父菜单和子菜单
-- 创建子菜单集合对象 ,创建父菜单对象
-- 循环上述的list结合对象,根据id查询响应的权限
-- 再根据父菜单、子菜单的标识判断是否是父菜单
-- 是父菜单, 将查处的对象赋给父菜单对象
-- 通过父菜单对象,查询对应的子菜单,添加到子菜单集合中,
-- 判断Map 结合中是否包含父菜单,不包含,则将父菜单名及子菜单集合put到Map中
-- 通过将map 传到页面,来生成菜单栏
5.后台实例
//登录验证,获取权限
@RequestMapping(value="/dologin")
public @ResponseBody String dologin(Model model,HttpServletRequest request){
BaseResponseBean brb = new BaseResponseBean();
HttpSession session = request.getSession();
System.out.println("登录验证。。");
String username=request.getParameter("username");
String password=request.getParameter("password");
//创建Map 集合用于接收父菜单和子菜单
java.util.Map<String ,List<SysMenuBean>> menuMap = new LinkedHashMap<String,List<SysMenuBean>>();
try {
//登录验证
SysUserBean sysUserBean=new SysUserBean();
sysUserBean.setLogin_name(username);
sysUserBean.setPassword(password); /*MD5Utils.MD5Encode(password, "utf-8")*/
System.out.println("passwod:"+sysUserBean.getPassword());
SysUserBean userBean=sysUserManager.findDataForLogin(sysUserBean);
if(userBean!=null) {
brb.setCode("200");
brb.setMsg("登陆成功");
List<SysRoleMenuBean> sbList=new ArrayList<SysRoleMenuBean>();//角色权限中间类
//根据用户查找角色
SysUserRoleBean sysUserRoleBean=new SysUserRoleBean(); //用户角色中间类
sysUserRoleBean.setUser_id(userBean.getId());
List<SysUserRoleBean> sysUserRoleBeans=sysUserRoleManager.findRolesByUserid(sysUserRoleBean);
if(sysUserRoleBeans!=null&& sysUserRoleBeans.size()>0) {
for (SysUserRoleBean b2 : sysUserRoleBeans) {
SysRoleMenuBean sysRoleMenuBean=new SysRoleMenuBean(); //角色权限中间类
sysRoleMenuBean.setRole_id(b2.getRole_id());
System.out.println("role_id:"+b2.getRole_id());
sysRoleMenuBean.setRole_id(b2.getRole_id());
List<SysRoleMenuBean> sb= sysRoleMenuManager.findMenuByRoleid(sysRoleMenuBean); //根据角色id,查询权限id
if(sb!=null&&sb.size()>0) {
for (int i = 0; i <sb.size(); i++) {
SysRoleMenuBean s = sb.get(i);
sbList.add(s);
}
}
}
}
System.out.println("菜单分级。。。");
//根据rolemenu查找menu
SysMenuBean menuBean=new SysMenuBean();
if(sbList!=null&&sbList.size()>0) {
for (int i = 0; i <sbList.size(); i++) {
SysRoleMenuBean bean=sbList.get(i);
menuBean.setId(bean.getMenu_id());
menuBean=sysMenuManager.findMenuById(menuBean);//菜单信息
//创建子菜单集合
List<SysMenuBean> childMenu=new ArrayList<SysMenuBean>();
//创建父菜单
SysMenuBean parentMenu=new SysMenuBean();
List<SysMenuBean> listChildrent=new ArrayList<SysMenuBean>();
if(menuBean!=null&&menuBean.getParent_id()==null) { //当parent_id 为null,是父菜单
//添加到父菜单
parentMenu=menuBean;
//根据父菜单的id 获取子菜单集合
menuBean.setParent_id(menuBean.getId());
childMenu=sysMenuManager.findMenuByParentId(menuBean);//子菜单信息
if(!menuMap.containsKey(parentMenu.getName())){//map集合中不包括父菜单将父菜单和子菜单添加到map 中
menuMap.put(parentMenu.getName(), childMenu);
}
}
}
}
session.setAttribute("name", userBean.getName());
session.setAttribute("menuMap", menuMap);
}else {
brb.setCode("500");
brb.setMsg("用户名或密码错误");
}
} catch (Exception e) {
log.error("登录失败");
e.printStackTrace();
}
request.getSession().setAttribute(Constants.SESSION_USER, username);
return JSONObject.toJSONString(brb);
6.前端实例
-- 通过Map的key、value获取菜单栏
-- 循环获取
<ul class="nav side-menu">
<c:forEach items="${menuMap }" var="menuMap" varStatus="status">
<li><a><i class="fa fa-home"></i>${menuMap.key } <span
class="fa fa-chevron-down"></span></a>
<ul class="nav child_menu">
<c:forEach items="${menuMap.value}" var="menu" varStatus="status">
<li οnclick="showdiv('${menu.url}')"><a href="javascript:void(0)">${menu.name}</a></li>
</c:forEach>
</ul></li>
</c:forEach>
</ul>