layuiAdmin后台框架以及动态权限

前言:layuiAdmin是使用layui开发的后台管理框架模板,拿来就用方便了很多后端和前端开发者。关于加载菜单权限问题,小刘使用并且记录了下来;

分析:1.头部导航和左边菜单联动为一个菜单权限。

           2.了解layui权限是怎么加载本地静态json的。

           3.设计相应权限的数据库表数据

           4.后端程序相应的返回相同的json格式的数据

layuiAdmin首页加载权限

   // layuimini.init('api/init.json');原项目请求的是这些静态资源
        layuimini.init('/permission/initMenu');

下面是静态json格式的权限内容;

 创建关于权限的5张表:用户表,角色表,权限表,用户角色表,角色权限表

用户表:

Create Table


CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(64) DEFAULT NULL,
  `password` varchar(64) DEFAULT NULL,
  `id_card_no` varchar(100) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `phone` varchar(64) DEFAULT NULL,
  `email` varchar(64) DEFAULT NULL,
  `sex` char(12) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  `province_code` varchar(32) DEFAULT NULL,
  `city_code` varchar(32) DEFAULT NULL,
  `district_code` varchar(32) DEFAULT NULL,
  `address` varchar(32) DEFAULT NULL,
  `detail_address` varchar(300) DEFAULT NULL,
  `desp` varchar(300) DEFAULT NULL,
  `type` int DEFAULT NULL,
  `status` int DEFAULT NULL,
  `or_del` int DEFAULT NULL,
  `or_forbidden` int DEFAULT '0',
  `header_image` varchar(300) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

角色表:

Create Table

CREATE TABLE `role` (
  `id` int NOT NULL AUTO_INCREMENT,
  `role_name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

权限表:

Create Table

CREATE TABLE `permission` (
  `id` int NOT NULL AUTO_INCREMENT,
  `title` varchar(64) DEFAULT NULL,
  `icon` varchar(100) DEFAULT NULL,
  `href` varchar(100) DEFAULT NULL,
  `father_id` int DEFAULT NULL,
  `level` int DEFAULT NULL,
  `has_son` int DEFAULT NULL,
  `target` varchar(64) DEFAULT '_self',
  `sort` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8

用户角色表

Create Table

CREATE TABLE `user_role` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL,
  `role_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

角色权限表

Create Table

CREATE TABLE `role_permission` (
  `id` int NOT NULL AUTO_INCREMENT,
  `role_id` int DEFAULT NULL,
  `permission_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8

所以要从后台定义请求这些数据

特别注意:一定要按照要求格式,采用递归,由上到下获取数据


    /**
     * 初始化菜单
     * @return
     */
    @RequestMapping(value = "/initMenu")
    @ResponseBody
    public Map<String,Object> initMenu(){
        Map<String,Object>map=new HashMap<>();
        Map<String,Object>clearInfo=new HashMap<>();
        clearInfo.put("clearUrl","api/clear.json");
        map.put("clearInfo",clearInfo);
        Map<String,Object>homeInfo=new HashMap<>();
        homeInfo.put("title","首页");
        homeInfo.put("icon","fa fa-home");
        homeInfo.put("href","page/welcome-1.html?mpi=m-p-i-0");
        map.put("homeInfo",homeInfo);
        Map<String,Object>logoInfo=new HashMap<>();
        logoInfo.put("title","layuiAdmin");
        logoInfo.put("image","images/logo.png");
        logoInfo.put("href","");
        map.put("logoInfo",logoInfo);

        Map<String,Object>menuInfo=new LinkedHashMap<>();//保证菜单的顺序
        List<Permission> permission = getPermission(1, 0);
        permission.forEach(t->{
            menuInfo.put(t.getTitle(),t);
        });
        map.put("menuInfo",menuInfo);
        return map;
    }

    /**
     * 按照需求获取角色的权限
     * @return
     */
    @RequestMapping(value = "/getPermissionBySelect")
    @ResponseBody
    public List<Permission>getPermissionBySelect(){
        List<Permission> permission = getPermission(1, 0);
        return permission;
    }


    /**
     * 递归获取权限
     * @param roleId
     * @param permissionId
     * @return
     */
    public List<Permission> getPermission(Integer roleId, Integer permissionId){
        List<Permission> list=new ArrayList<>();
        List<RolePermission>rolePermission = permissionDao.getListRolePermission(roleId,permissionId);
        rolePermission.forEach(t->{
            if (t.getPermission().getHasSon()!=0){//严格按照layuiadmin菜单格式
                List<Permission> permission = getPermission(roleId, t.getPermissionId());
                t.getPermission().setChild(permission);
            }
            list.add(t.getPermission());
        });
        return list;
    }

而权限列表页面逻辑分为三个部分

权限列表,可以更新删除权限,删除的同时必须删除角色权限表中的数据,同样采用递归由上到下全部删除

角色列表,实现用户即角色,删除时,所有角色权限相应内容删除。

树形权限菜单,给某个级别的权限添加子集。赋予某个角色相应的权限。

其他的操作再用户管理,操作用户角色关系,可做到用户即角色。

关于权限页面的代码:

      //模拟数据有children的才叫节点
        data = null;

        /**
         * 通过角色Id直接获取权限数据
         * @param roleId
         */
        function getPermissionByRoleId(roleId) {
            var sendDate = (new Date()).getTime();
            $.ajax({
                url: "/permission/getTreePermissionList",
                type: "get",
                data: {
                    roleId: roleId
                },
                async: false,
                beforeSend: function () {
                    var icon_load = `<i id="icon_loading" class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop" style="display: inline-block;
		   position: absolute;
            top: 50%;
            left: 50%;   margin: auto;
            "></i>`;
                    $("#test12").html(icon_load);
                    //在请求后台数据之前显示loading图标
                },
                success: function (msg) {
                    var receiveDate = (new Date()).getTime();
                    var responseTimeMs = receiveDate - sendDate;
                    setTimeout(function () {
                        $("#icon_loading").remove();
                        data = msg;
                        console.log(data);
                        initTreePermission();
                    }, responseTimeMs);

                },
                dataType: "json"
            });
        }

        /**
         * 初始化权限
         */
        function initTreePermission() {
            //基本演示
            tree.render({
                elem: '#test12',
                data: data,
                showCheckbox: true //是否显示复选框
                ,
                id: 'demoId1',
                isJump: true //是否允许点击节点时弹出新窗口跳转
                , oncheck: function (obj) {///复选框点击触发的事件,,直接和角色绑定添加即可
                    console.log(obj.data); //得到当前点击的节点数据
                    console.log(obj.checked); //得到当前节点的展开状态:open、close、normal
                    console.log(obj.elem); //得到当前节点元素
                },
                click: function (obj) {
                    console.log(obj);
                    var data = obj.data; //获取当前点击的节点数据
                    console.log(data);
                    layer.open({
                        type: 1,
                        // closeBtn:0,
                        title: ['添加子集权限', 'font-size:20px;font-weight:bolder;text-align:center;'],
                        content: $('#updatePermissionForm'), //这里content是一个DOM,注意:最好该元素要存放在body最外层,否则可能被其它的相对元素所影响
                        skin: 'layui-layer-lan',
                        area: ['500px', '480px'],
                        offset: '40px',
                        // 弹出后,渲染表格
                        success: function (layero, index) {
                            $("#updatePermissionForm form")[0].reset();//清空之前弹出的内容
                            form.val("updatePermissionForm", { //formTest 即 class="layui-form" 所在元素属性 lay-filter="" 对应的值
                                "fatherId": data.id
                                , "level": data.level + 1
                                , "hasSon": 0
                            });
                        },
                        cancel: function (index, layero) {

                        }
                    });
                    // layer.msg('状态:' + obj.state + '<br>节点数据:' + JSON.stringify(data));
                }
            });
        }

        //按钮事件test12
        util.event('lay-demo', {
            getChecked: function (othis) {
                var checkedData = tree.getChecked('demoId1'); //获取选中节点的数据
                console.log("---获取选中的数据--");
                console.log(checkedData);
                var roleId = $("#editRoleNameByLeft").attr("role_id");
                $.ajax({
                    url: "/permission/savePermissionWithRoleId",
                    type: "post",
                    async: false,
                    data: {
                        roleId: roleId,
                        permissionList: JSON.stringify(checkedData)
                    },
                    success: function (msg) {
                        layer.msg("权限保存成功!");
                    },
                    dataType: "json"
                });
            },
            setChecked: function () {
                tree.setChecked('demoId1', [12, 18]); //勾选指定节点
            },
            reload: function () {
                //重载实例
                tree.reload('demoId1', {});
            },
            addFirstMenu: function () {
                //添加一级菜单
                // $("#updatePermissionForm form input[name='hasSon']").parent().parent().remove();
                // $("#updatePermissionForm form input[name='href']").parent().parent().remove();
                layer.open({
                    type: 1,
                    // closeBtn:0,
                    title: ['添加子集权限', 'font-size:20px;font-weight:bolder;text-align:center;'],
                    content: $('#updatePermissionForm'), //这里content是一个DOM,注意:最好该元素要存放在body最外层,否则可能被其它的相对元素所影响
                    skin: 'layui-layer-lan',
                    area: ['500px', '480px'],
                    offset: '40px',
                    // 弹出后,渲染表格
                    success: function (layero, index) {
                        $("#updatePermissionForm form")[0].reset();//清空之前弹出的内容


                        form.val("updatePermissionForm", { //formTest 即 class="layui-form" 所在元素属性 lay-filter="" 对应的值
                            "fatherId": 0
                            , "level": 1,
                            "hasSon": 0
                        });
                    },
                    cancel: function (index, layero) {

                    }
                });
            }
        });

至此,完成了layuiAdmin的权限菜单的管理设置。

有啥不懂得小伙伴们加群交流啦:852665736;本群致力于一同进步的小伙伴们,大家一起交流探讨,在陌生的城市感受温暖;  

无偿免费分享源码以及技术和面试文档,更多优秀精致的源码技术栈分享请关注微信公众号:gh_817962068649   关键字:SSM动态通用权限管理系统

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: layuiadmin是一套基于layui框架构建的后台管理系统模板,旨在方便开发者快速搭建高质量的后台系统。而开发者文档则是layuiadmin的用户手册,主要介绍了layuiadmin框架的使用方法、模板结构、组件使用、插件使用等方面的内容。 开发者文档主要分为以下几个部分:框架概述、使用说明、模板结构、组件说明、插件说明、常见问题。在框架概述部分,介绍了layuiadmin的特点、框架结构、使用环境等一些基本信息;在使用说明部分,详细介绍了如何安装layuiadmin、如何快速构建页面等使用方法;在模板结构部分,详细解释了layuiadmin的模板结构,开发者可以根据实际需要进行修改;在组件说明和插件说明部分,则为开发者提供了折叠面板、轮播图等常用组件和丰富的插件介绍;在常见问题部分,收集了一些开发者在使用过程中常遇到的问题,并给出了解决方法。 总体来说,layuiadmin开发者文档为开发者提供了全面的使用手册和详细的组件、插件介绍,方便开发者快速了解layuiadmin框架,并快速构建高质量的后台管理系统。 ### 回答2: layuiadmin是一款基于layui框架后台管理模板,它为开发者提供了丰富的组件和插件,使得后台管理系统的开发变得更加简单、快速、高效。为了使开发者更好地了解和使用layuiadminlayui官方推出了一份详细的开发者文档。 这份文档首先介绍了layuiadmin的基本架构及其组成部分,包括菜单和面包屑导航、选项卡等。接下来,文档详细讲解了layuiadmin的各个组件和插件的使用方法和相关配置参数,例如表格组件、表单组件、富文本编辑器、弹出层、日期选择器等。 此外,文档还提供了一些实际应用的示例代码,方便开发者进行参考和学习。同时,为了方便开发者对layuiadmin的二次开发和个性化定制,文档还详细讲解了如何定制主题、添加自定义图标等内容。 总的来说,layuiadmin开发者文档对于想要快速开发高质量后台管理系统的开发者来说是一份非常有价值的资料,它不仅提供了全面的技术支持,还为开发者提供了很多实际的应用案例和操作指南,有助于开发者更加高效地使用layuiadmin。 ### 回答3: layuiadmin开发者文档是一份详尽的layuiadmin框架使用说明书,它可以帮助开发人员更快速、高效地开发Web应用程序。本文档主要包含了layuiadmin框架的基础知识、API接口、组件说明、工具函数、配置等方面的内容。 其中,基础知识包括了layui框架的基本概念和使用方法,包括如何初始化Layui模块,如何使用模块化开发方式等等。API接口则详细介绍了layuiadmin框架中各个模块和组件的API使用方法和参数说明,非常适合开发人员进行参考和学习。组件说明则是对layuiadmin中各种可复用的组件进行了详细的讲解,包括了基础组件、交互组件、表单组件、弹层组件等等。工具函数部分则介绍了layuiadmin框架封装的一些常用工具函数,如获取URL参数、格式化时间、动态加载CSS和JS文件等等。最后,配置部分则是对layuiadmin框架的各项配置进行了详尽的说明,如路由配置、缓存配置、表格分页配置等等。 总之,layuiadmin开发者文档是一份非常优秀的框架使用说明书,它不仅详细地介绍了layuiadmin框架的各种使用方法和组件,更重要的是,它可以帮助开发人员更快、更好地理解和使用layuiadmin框架,从而帮助他们更快速地开发出高质量的Web应用程序。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值