基础权限管理笔记终章
之前两篇关于Filter实现权限登录和权限校验的笔记已经更完了
最后,整理一下对于页面显示的权限管理实现(列表)
没有太高的技术含量,对于一些比较小的项目像是一些办公管理系统之类的足够用了,利用Filter对源代码入侵也比较少,使用配置方便,毕竟不是大项目,不喜勿喷
最终效果:用户登录系统直接显示权限范围内的操作菜单,其他不显示
private static final long serialVersionUID = -3908225168044626931L; private int id; private String loginname; private String realname; private String sex; private Date birthday; private Tdept dept; private int dep; private String email; private int isenabled; private String password; private int creator; private Date createtime; private int updator; private Date updatetime; private String picurl; private String isenabledtText; private String birthdayText; private List<TPermission> permissions; //初始化菜单 private List<TPermission> menu = new ArrayList<>(); public List<TPermission> getMenu() { //查询添加之前清空菜单 menu.clear(); for (TPermission per1 : permissions) { //查询添加前清空菜单 per1.getChildren().clear(); //是一级菜单 if (per1.getPid() == 0) { //装载一级菜单下的二级菜单 for (TPermission per2 : permissions) { //权限的上级id等于一级菜单id if (per2.getPid() == per1.getId()) { per1.addChild(per2); } } menu.add(per1); } } return menu; } private static final long serialVersionUID = 8901347022172970844L; private int id; private String pname; private int pid; private String url; private int lev; private int sort; private int isleaf; private String npic; //初始化子权限 private List<TPermission> children=new ArrayList<>(); //一个一个的加进去 public void addChild(TPermission per){ children.add(per); }
两个实体类,一个是用户类,一个是权限类
数据库创建用户表,权限表,角色表,用户角色表,角色权限表
通过名字不难看出
用户表与权限表是通过角色和外键来实现关联的
具体见下图
Dao包接口
public interface UserDao { //检查登录 TUser queryByLogin(LoginBean login)throws SysException; }
Dao.xml中的mapper映射
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 映射指向dao接口 --> <mapper namespace="com.tjzs.sccms.dao.UserDao"> <!-- 结果映射 --> <resultMap type="TUser" id="usermap"> <!-- 主键 --> <id column="id" property="id" /> <collection property="permissions" column="id" select="getPermissions" ofType="Tpermission" /> </resultMap> <!-- 根据用户名和密码查询用户 --> <select id="queryByLogin" parameterType="LoginBean" resultType="TUser"> select * from tuser where loginname=#{loginname} and password=#{password} </select> <!-- 根据用户id查询用户权限 --> <select id="queryById" parameterType="int" resultMap="usermap"> select * from tuser where id=#{id} </select> <!-- resultmap中调用的查询用户权限的方法 --> <select id="getPermissions" parameterType="int" resultType="TPermission"> select * from TPERMISSION t where id in (select pid from TROLEPERMISSION t where rid in (select rid from TUSERROLE t where usid=#{id} )) </select> </mapper>
在根据用户查询权限的时候使用resultmap
在resultmap中配置一对多的查询
然后在Service的部分去进行逻辑处理
public TUser chkLogin(String loginname, String password) throws SysException { // TODO Auto-generated method stub LoginBean login=new LoginBean(); login.setLoginname(loginname); if(password.length()!=32){ MD5 m=new MD5(); login.setPassword(m.getMD5ofStr(password)); }else { login.setPassword(password); } TUser user=dao.queryByLogin(login); if(user==null){ throw new SysException("对不起,用户名或者密码不正确请重新输入",100); } //获得带权限列表的user TUser user2=dao.queryById(user.getId()); return user2; }
最后在控制层去调用方法
这样返回的用户本身就已经是带有权限列表了
对于菜单的生成,在开始创建pojo的对象原型的时候就已经写好逻辑
//初始化菜单 private List<TPermission> menu = new ArrayList<>(); public List<TPermission> getMenu() { //查询添加之前清空菜单 menu.clear(); for (TPermission per1 : permissions) { //查询添加前清空菜单 per1.getChildren().clear(); //是一级菜单 if (per1.getPid() == 0) { //装载一级菜单下的二级菜单 for (TPermission per2 : permissions) { //权限的上级id等于一级菜单id if (per2.getPid() == per1.getId()) { per1.addChild(per2); } } menu.add(per1); } } return menu; }
也就是初始化菜单的部分
最后在前台显示调用
<body> <table width="100%" height="280" border="0" cellpadding="0" cellspacing="0" bgcolor="#EEF2FB"> <tr> <td width="182" valign="top"> <div id="container"> <c:forEach items="${MENU }" var="m1"> <h1 class="type"><a href="javascript:void(0)">${m1.pname }</a></h1> <div class="content"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td><img src="images/menu_topline.gif" width="182" height="5" /></td> </tr> </table> <ul class="MM"> <c:forEach items="${m1.children }" var="m2"> <li><a href="${m2.url }" target="mainFrame">${m2.pname }</a></li> </c:forEach> </ul> </div> </c:forEach> </div> <script type="text/javascript"> var contents = document.getElementsByClassName('content'); var toggles = document.getElementsByClassName('type'); var myAccordion = new fx.Accordion( toggles, contents, {opacity: true, duration: 400} ); myAccordion.showThisHideOpen(contents[0]); </script> </td> </tr> </table> </body>
到此大功告成
很简单的实现有木有
现在看来真的是,以前刚接触的时候一直都是蒙蔽的状态
似懂非懂,最近温习基础,稍微看了下
呵呵,好吧,还是很有用的,可以作为一个简单的参考
本文章仅作为个人笔记发出来分享
很基础入门的东西
大神们绕过
新童鞋不喜勿喷,哈哈