基础权限管理笔记终章
之前两篇关于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>
到此大功告成
很简单的实现有木有
现在看来真的是,以前刚接触的时候一直都是蒙蔽的状态
似懂非懂,最近温习基础,稍微看了下
呵呵,好吧,还是很有用的,可以作为一个简单的参考
本文章仅作为个人笔记发出来分享
很基础入门的东西
大神们绕过
新童鞋不喜勿喷,哈哈
