jfinal后台获取权限树,以供前台展示
2017-09-03 00:00
531 查看
摘要: 每日一搏,补周六
一、我们平时做项目的时候与权限相关的基本都由技术主干做好了,或者只是套用其他项目的,修修改改,一般人很少有机会涉及权限这一块,或会从头到尾去实现一遍权限,事实上权限并不比实际开发业务好实现,或实现了代码总是不那么完美,如果你没有自己实现过一遍权限管理,你知道怎么根据拥有的菜单权限动态显示左侧菜单导航?并且设置展开,收缩,选中样式?接下来我准备自己去探索下,然后再看看那些大神的实现,看自己有哪些是欠缺考虑的,或者可以改进的。别人实现好的总归是别人的,你拿来用,也只是暂时用,过不久就忘了,自己写的再不好,你总归会在其中学到点什么,对不对?关于菜单显示,我想分为两个阶段,一是从后台获取权限树,二是在前台显示权限树,这一节先做后台的,希望一个晚上搞定。
二、为回答上述几个问题,我初步的设想是这样的。
1、将每次请求都记录在一个全局变量,已供后面判断哪个菜单需要展开,哪个菜单需要显示选中样式。
2、根据当前登录用户获取其所有菜单权限,再和系统所有菜单权限匹配,匹配上的就显示,匹配不上就不显示
三、具体实现
1、怎么保存每次请求呢,我们首先想到的是拦截器和缓存。首先定义一个全局变量,然后在定义一个拦截器,拦截所有方法上的请求,每次请求的都将url赋值个全局变量,最后再将这个全局变量放入到缓存,后面可以随时随地获取,代码如下:
(1)配置cache插件
(2)pom.xml配置
(3)配置缓存
(4)定义拦截器
(5)使用拦截器
2、下面开始获取权限树,首先先获取所有的菜单权限,然后再根据用户获取所拥有的菜单权限
(1)获取所有菜单权限
sql
java
(2)获取登陆用户拥有的菜单权限,代码不详细说明,这个很简单。
2、怎么得到将要显示在页面的导航菜单呢,废话不多说,请看代码:(后面肯定要完善的)
(1)获取权限树;
(2)接下来的问题就是怎么在前台可以获取到后台方法,将权限树展示在页面,如下配置模板引擎即可:
四、我想象的后台就这么一气呵成了,就那么简单,当然可能会有很多考虑不周的,可能代码还有bug,毕竟我还没来得及调试测试,等之后做了页面显示再一起调试吧,今天感觉累了。大周末都没彻底放松休息下,我都被自己感动了。
一、我们平时做项目的时候与权限相关的基本都由技术主干做好了,或者只是套用其他项目的,修修改改,一般人很少有机会涉及权限这一块,或会从头到尾去实现一遍权限,事实上权限并不比实际开发业务好实现,或实现了代码总是不那么完美,如果你没有自己实现过一遍权限管理,你知道怎么根据拥有的菜单权限动态显示左侧菜单导航?并且设置展开,收缩,选中样式?接下来我准备自己去探索下,然后再看看那些大神的实现,看自己有哪些是欠缺考虑的,或者可以改进的。别人实现好的总归是别人的,你拿来用,也只是暂时用,过不久就忘了,自己写的再不好,你总归会在其中学到点什么,对不对?关于菜单显示,我想分为两个阶段,一是从后台获取权限树,二是在前台显示权限树,这一节先做后台的,希望一个晚上搞定。
二、为回答上述几个问题,我初步的设想是这样的。
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,毕竟我还没来得及调试测试,等之后做了页面显示再一起调试吧,今天感觉累了。大周末都没彻底放松休息下,我都被自己感动了。
相关文章推荐
- extjs,后台递归获取权限树,进行展示
- 使用jstree从后台获取数据在前台进行树状菜单展示(树状菜单 JsTree)
- 后台id标识省市县id 前台freemarker数据列表展示
- [Asp.Net]asp.net后台获取前台html控件的值的方法
- X5 获取前台所有data数据 和后台的 table 使用
- 疯狂.NET 通用权限设计 C\S后台管理,B\S前台调用源码样例程序源码下载之 --- 操作权限
- asp.net 后台获取前台的 Html 元素的值.
- 关于前台合并获取后台动态table中数据相同的单元格的问题;th td合并
- thinkphp 将后台的cat表在前台分类展示出来
- 后台获取前台Html文本框中的值(问答)
- 前台中文数据后台achieveRequest().getParameter获取乱码问题
- 利用sender的Parent获取GridView中的当前行 不用AJAX实现前台JS调用后台C#方法(小技巧) AjaxControlToolkit的CalendarExtender的本地化
- JFinal Web开发学习(九)后台添加前台显示博客
- 后台页面获取前台action的值的方法
- asp.net后台怎样获取前台JS的值?
- 前台获取后台c#代码
- 后台获取前台runat=server的select的值(省市选择器)
- 前台js中绑定获取后台全局bool变量
- ecshop后台获取shell最新方法,通杀最新版本&后台低权限
- 前台用js的encodeURIComponent对中文编码,后台正确获取值的方法