您的位置:首页 > 其它

jfinal后台获取权限树,以供前台展示

2017-09-03 00:00 531 查看
摘要: 每日一搏,补周六

一、我们平时做项目的时候与权限相关的基本都由技术主干做好了,或者只是套用其他项目的,修修改改,一般人很少有机会涉及权限这一块,或会从头到尾去实现一遍权限,事实上权限并不比实际开发业务好实现,或实现了代码总是不那么完美,如果你没有自己实现过一遍权限管理,你知道怎么根据拥有的菜单权限动态显示左侧菜单导航?并且设置展开,收缩,选中样式?接下来我准备自己去探索下,然后再看看那些大神的实现,看自己有哪些是欠缺考虑的,或者可以改进的。别人实现好的总归是别人的,你拿来用,也只是暂时用,过不久就忘了,自己写的再不好,你总归会在其中学到点什么,对不对?关于菜单显示,我想分为两个阶段,一是从后台获取权限树,二是在前台显示权限树,这一节先做后台的,希望一个晚上搞定。

二、为回答上述几个问题,我初步的设想是这样的。

1、将每次请求都记录在一个全局变量,已供后面判断哪个菜单需要展开,哪个菜单需要显示选中样式。

2、根据当前登录用户获取其所有菜单权限,再和系统所有菜单权限匹配,匹配上的就显示,匹配不上就不显示

三、具体实现

1、怎么保存每次请求呢,我们首先想到的是拦截器和缓存。首先定义一个全局变量,然后在定义一个拦截器,拦截所有方法上的请求,每次请求的都将url赋值个全局变量,最后再将这个全局变量放入到缓存,后面可以随时随地获取,代码如下:

(1)配置cache插件

// 加载缓存插件
me.add(new EhCachePlugin());

(2)pom.xml配置

<!-- ehcache 2 缓存-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.11</version>
</dependency>

(3)配置缓存

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" monitoring="autodetect"
dynamicConfig="false">

<defaultCache maxElementsInMemory="1000" eternal="false"
timeToIdleSeconds="7200" timeToLiveSeconds="7200" overflowToDisk="true"
diskSpoolBufferSizeMB="10" />

<cache name="_canyou_action_key_" maxElementsInMemory="1000" eternal="false"
timeToIdleSeconds="10" timeToLiveSeconds="10" overflowToDisk="true"
diskSpoolBufferSizeMB="10" />
</ehcache>

(4)定义拦截器

public class ActionInceptor implements Interceptor {
@Override
public void intercept(Invocation inv) {
if(ShiroMethod.findUserIdByUsername() != null) {
//这里使用登陆用户名为cachename
CacheKit.put(ShiroKit.ACTION_KEY_CACHE_NAME,ShiroMethod.findUserIdByUsername(), inv.getActionKey());
}
}
}

(5)使用拦截器

me.addGlobalActionInterceptor(new ActionInceptor());

2、下面开始获取权限树,首先先获取所有的菜单权限,然后再根据用户获取所拥有的菜单权限

(1)获取所有菜单权限

sql

###获取所有菜单权限
#sql("findAllMenuPermission")
select * from sys_permission
where action_type = 1
#end

java

/**
* 获取所有菜单权限
* @return
*/
public List<Permission> findAllMenuPermission(){
SqlPara sqlPara = dao.getSqlPara("sys.findAllMenuPermission");
return dao.find(sqlPara);
}

(2)获取登陆用户拥有的菜单权限,代码不详细说明,这个很简单。

2、怎么得到将要显示在页面的导航菜单呢,废话不多说,请看代码:(后面肯定要完善的)

(1)获取权限树;

(1)获取权限树;
package cn.learning.system.kit;

import java.util.List;
import cn.learning.system.shiro.ShiroKit;
import cn.learning.system.shiro.ShiroMethod;
import com.jfinal.plugin.activerecord.Record;
import com.learnging.system.model.Permission;

public class Menukit {
/**
* 获取将要显示在页面的所有菜单
* @return
*/
public List<Record> getMenusTree (){
List<Permission> allMenuPerms = ShiroMethod.findAllMenuPermission();
List<Permission> userMenuPerms = ShiroMethod.findMenuePermissionByUserId();
List<Record> list = MenusTree(allMenuPerms, userMenuPerms);
return list;
}

/**
* 根据所有菜单权限和用户拥有的菜单权限得到当前可以显示在页面的菜单
* @param allMenuPerms
* @param userMenuPerms
* @return
*/
private List<Record> MenusTree(List<Permission> allMenuPerms,List<Permission> userMenuPerms) {
String currentPermission = ShiroKit.ACTION_KEY_CACHE_NAME;  //获取存放当前请求路径
List<Record> menusTree = null ;

for(Permission perm : userMenuPerms) {
Record record = new Record();
if(allMenuPerms.contains(perm)){//如果拥有的菜单权限包含在所有菜单权限中,那么就设置相关值,如果不包含则不显示
record.set("Id", perm.getId());
record.set("ActionType", perm.getActionType());
record.set("ActionUrl", perm.getActionUrl());
record.set("MenuLevel", perm.getMenuLevel());

if(perm.getActionUrl().equals(currentPermission)){//选中请求的路径
record.set("Selected", true);
}
menusTree.add(record);
}
}
return menusTree;
}
}

(2)接下来的问题就是怎么在前台可以获取到后台方法,将权限树展示在页面,如下配置模板引擎即可:

/**
* 设置引擎模板
*/
@Override
public void configEngine(Engine me) {
me.addSharedMethod(new cn.learning.system.kit.Menukit());
}

四、我想象的后台就这么一气呵成了,就那么简单,当然可能会有很多考虑不周的,可能代码还有bug,毕竟我还没来得及调试测试,等之后做了页面显示再一起调试吧,今天感觉累了。大周末都没彻底放松休息下,我都被自己感动了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: