权限控制
    ①登录时查询登录权限
    LoginController

    1. //登陆成功获得登陆用户的菜单列表、按钮列表、权限范围列表
    2. //菜单列表最终展示在主页面左侧,用layui-tree组装(要求List集合)
    3. Map<String,Object> map=userService.findUserAuth(user.getUid());
    4. req.getSession().setAttribute("loginAuth",map);

    将所有的权限范围组成Set集合,方便查找
    将所有的菜单组成新的List集合,通过递归,符合layui-tree组件要求的结构
    将信息装入session
    UserService

    1. public Map<String,Object> findUserAuth(int uid) {//语雀6.1
    2. List<Fun> funs = funDao.findFunByUser(uid);
    3. //funs中装载着所有的权限功能,我们想要的,一个是只装有权限范围的列表
    4. //一个是只装有菜单的列表(使用layui-tree组件展示,要求子父功能是包含关系)List<Fun>
    5. //只装有权限范围的列表
    6. Set<String> auths = new HashSet<>();
    7. for (Fun fun:funs) {
    8. auths.add(fun.getAuth());
    9. }
    10. //只装有菜单的列表List<Fun>->List<FunVo>
    11. List<FunVO> menus=reload(funs,-1);
    12. Map<String,Object> map=new HashMap<>();
    13. map.put("auths",auths);
    14. map.put("menus",menus);
    15. return map;
    16. }
    17. //在所有的功能菜单中,逐层组装,理论上从第一层 语雀6.1
    18. private List<FunVO> reload(List<Fun> funs, int level) {
    19. List<FunVO> vos = new ArrayList<>();//装载本层组装后的菜单
    20. for (Fun fun : funs) {
    21. if (fun.getFtype().equals(1) && fun.getPid().equals(level)) {
    22. //找到了一个属于当前层级的菜单
    23. //要找到当前菜单的子级,当前菜单的fid就是子级菜单的pid
    24. String title = "";
    25. if (fun.getFhref() != null && !"".equals(fun.getFhref())) {
    26. //当前菜单点击后需要发送请求
    27. title = "<a href='" + fun.getFhref() + "' target='content'>" + fun.getFname() + "</a>";
    28. } else {
    29. title = fun.getFname();
    30. }
    31. FunVO funVO = new FunVO(title, fun.getFid(), reload(funs, fun.getFid()));
    32. vos.add(funVO);
    33. }
    34. }
    35. return vos;
    36. }

    FunDao

    1. @Select("select * from t_fun where fid in" +
    2. " (select fid from t_role_fun where rid in" +
    3. " (select rid from t_user_role where uid = #{uid}))")
    4. public List<Fun> findFunByUser(int uid);//语雀6.1

    FunVo

    1. package vo;
    2. import java.util.List;
    3. //当前存储的数据是给视图用的
    4. public class FunVO {
    5. private String title;//fname
    6. private Integer id;//fid
    7. private List<FunVO> children;//装载当前菜单的子菜单
    8. public FunVO() {}
    9. public FunVO(String title, Integer id, List<FunVO> children) {
    10. this.title = title;
    11. this.id = id;
    12. this.children = children;
    13. }
    14. public String getTitle() {
    15. return title;
    16. }
    17. public void setTitle(String title) {
    18. this.title = title;
    19. }
    20. public Integer getId() {
    21. return id;
    22. }
    23. public void setId(Integer id) {
    24. this.id = id;
    25. }
    26. public List<FunVO> getChildren() {
    27. return children;
    28. }
    29. public void setChildren(List<FunVO> children) {
    30. this.children = children;
    31. }
    32. }

    ②通过权限控制菜单
    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">&#xe640;</i>删除
        </a>
    </c:if>