权限控制
①登录时查询登录权限
LoginController
//登陆成功获得登陆用户的菜单列表、按钮列表、权限范围列表//菜单列表最终展示在主页面左侧,用layui-tree组装(要求List集合)Map<String,Object> map=userService.findUserAuth(user.getUid());req.getSession().setAttribute("loginAuth",map);
将所有的权限范围组成Set集合,方便查找
将所有的菜单组成新的List
将信息装入session
UserService
public Map<String,Object> findUserAuth(int uid) {//语雀6.1List<Fun> funs = funDao.findFunByUser(uid);//funs中装载着所有的权限功能,我们想要的,一个是只装有权限范围的列表//一个是只装有菜单的列表(使用layui-tree组件展示,要求子父功能是包含关系)List<Fun>//只装有权限范围的列表Set<String> auths = new HashSet<>();for (Fun fun:funs) {auths.add(fun.getAuth());}//只装有菜单的列表List<Fun>->List<FunVo>List<FunVO> menus=reload(funs,-1);Map<String,Object> map=new HashMap<>();map.put("auths",auths);map.put("menus",menus);return map;}//在所有的功能菜单中,逐层组装,理论上从第一层 语雀6.1private List<FunVO> reload(List<Fun> funs, int level) {List<FunVO> vos = new ArrayList<>();//装载本层组装后的菜单for (Fun fun : funs) {if (fun.getFtype().equals(1) && fun.getPid().equals(level)) {//找到了一个属于当前层级的菜单//要找到当前菜单的子级,当前菜单的fid就是子级菜单的pidString title = "";if (fun.getFhref() != null && !"".equals(fun.getFhref())) {//当前菜单点击后需要发送请求title = "<a href='" + fun.getFhref() + "' target='content'>" + fun.getFname() + "</a>";} else {title = fun.getFname();}FunVO funVO = new FunVO(title, fun.getFid(), reload(funs, fun.getFid()));vos.add(funVO);}}return vos;}
FunDao
@Select("select * from t_fun where fid in" +" (select fid from t_role_fun where rid in" +" (select rid from t_user_role where uid = #{uid}))")public List<Fun> findFunByUser(int uid);//语雀6.1
FunVo
package vo;import java.util.List;//当前存储的数据是给视图用的public class FunVO {private String title;//fnameprivate Integer id;//fidprivate List<FunVO> children;//装载当前菜单的子菜单public FunVO() {}public FunVO(String title, Integer id, List<FunVO> children) {this.title = title;this.id = id;this.children = children;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public List<FunVO> getChildren() {return children;}public void setChildren(List<FunVO> children) {this.children = children;}}
②通过权限控制菜单
UserController
@RequestMapping("/findUserMenus")
@ResponseBody
public List<FunVO> findUserMenus(HttpSession session){
Map<String,Object> map=(Map<String, Object>) session.getAttribute("loginAuth");
return (List<FunVO>) map.get("menus");
}
main.jsp
layui.use(['tree', 'util'], function () {
var tree = layui.tree
, layer = layui.layer
, util = layui.util
, $ = layui.$;
//需要获得session中存储的权限菜单信息(ajax)
$.ajax({
type:'get',
url:'findUserMenus',
data:{},
synch:true,
success:function (menus) {
//通过一个前端js的json反序列化处理,menus就变成了js语法的集合/数组
//常规用法
tree.render({
elem:'#myTree',//使用标签的id,表示将菜单的数据显示在指定的标签中
data:menus
})
},
dataType:'json'//告诉jQuery,将响应回来的字符串json反序列化
});
//常规用法
tree.render({
elem: '#myTree' //默认是点击节点可进行收缩,使用标签的id,表示将菜单的数据显示在指定标签中
, data: data1
});
});
③通过权限控制按钮
写法:
<c:if test="${sessionScope.loginAuth.auths.contains('com.qxgl.auth.user.delete')}">
<a href="#" class="layui-btn layui-btn-danger layui-btn-xs">
<i class="layui-icon"></i>删除
</a>
</c:if>
