基于LayUI+Servlet的权限管理系统的设计

2023-11-07

权限管理是所有后台系统的都会涉及的一个重要组成部分,主要目的是对不同的人访问资源进行权限的控制,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,隐私数据泄露等问题。本系统基于JSP+Servlet+JDBC+LayUI的技术,在系统的设计与开发过程中严格遵守软件工程的规范,运用软件设计模式,从而减少系统模块间的偶合,力求做到系统的稳定性、可重用性和可扩充性。

需求

通用的权限管理系统需要考虑用户权限控制问题,可以采用RBAC(基于角色的访问控制)模型进行设计和实现。
基于角色的访问控制系统可以通过确定用户所扮演的角色和其权限来实现对不同操作和资源的限制和控制。包括用户管理、角色管理、权限管理等模块,实现对用户、角色、权限的统一管理和控制。
1. 用户登录;
2. 用户管理:选择角色添加用户,修改某个用户的信息,删除某个用户的信息,根据用户名或者角色查询符合条件的用户信息;
4. 角色管理:对角色基本信息的增删改查操作;
5. 菜单管理:在某个父级菜单下添加子菜单信息,删除选择的菜单及其子菜单信息,修改某个菜单的信息;
系统的功能模块图如下图所示:
在这里插入图片描述

数据库设计

在这里插入图片描述
表关系是指表之间的关系,包括主外键、外键、唯一键等。在设计表关系时,需要确定表之间的关系,并为每个表创建一个唯一的标识符。
用户——角色——菜单,思考三张表之间有怎样的关系。
用户面对角色:一个用户可以有多个角色,一个角色也可以有多个用户。但一般我们只分配一个角色,所以也可以在用户表中再加一个角色id。
角色面对菜单:一个角色可以有多个菜单,一个菜单也可以被多个角色拥有。所以也是多对多的关系。那么就要有角色菜单关联表(RoleMenus):角色id、菜单id。
在这里插入图片描述
在这里插入图片描述

效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

部分代码

layui.config({
    base: '../layui/'
}).use(['layer', 'util', 'treeTable', 'iconPicker','form'], function () {
    var $ = layui.jquery;
    var layer = layui.layer;
    var util = layui.util;
    var treeTable = layui.treeTable;
    var iconPicker = layui.iconPicker;
    var form = layui.form;
    $('body').removeClass('layui-hide');

    // 渲染表格
    var menuTable = treeTable.render({
        elem: '#demoTreeTb',
        url: '../menu?type=getMenu',
        toolbar: '#toolbar',
        height: 'full-100',
        tree: {
            iconIndex: 2,
            isPidData: true,
            idName: 'mid',
            pidName: 'pid'
        },
        defaultToolbar: ['filter', 'print', 'exports'],
        cols: [
            [
                {type: 'numbers'},
                {type: 'checkbox'},
                {field: 'menuName', title: '菜单名称', minWidth: 125},
                {
                    title: '菜单图标', align: 'center',
                    templet: '<p><i class="layui-icon {{d.menuIcon?d.menuIcon:""}}"></i></p>'
                },
                {field: 'menuUrl', title: '菜单路径'},
                {title: '菜单类型',templet:'#menuType'},
                {field:'menuState',title: '菜单状态'},
                {align: 'center', toolbar: '#tbBar', title: '操作', width: 120}
            ]
        ],
        style: 'margin-top:10px;'
    });
    // 工具列点击事件
    treeTable.on('tool(demoTreeTb)', function (obj) {
        var event = obj.event;
        var data = obj.data;
        if (event === 'del') {
            $.ajax({
                url:'../menu?type=deleteMenu',
                type:'post',
                data:{mid:data.mid},
                dataType:'json',
                success:function(data){
                    layer.msg(data.msg, {
                        time: 2000 //2秒关闭(如果不配置,默认是3秒)
                    });
                },
                error:function(err){
                    console.log(err)
                }
            });
            //重载树形表格
            menuTable.reload();
        } else if (event === 'edit') {
            //获取上以及菜单
            getPid();
            //清空数据
            $("#menu-name").val(data.menuName);
            $("#pid").val(data.pid);
            $("#mid").val(data.mid);
            $("#menu-url").val(data.menuUrl);
            $("#menu-type").val(data.menuType);
            if(data.menuState=="启用"){
                $("#menu-state").checked = true;
            }else{
                $("#menu-state").checked = false;
            }

            /**
             * 选中图标 (常用于更新时默认选中图标)
             * @param filter lay-filter
             * @param iconName 图标名称,自动识别fontClass/unicode
             */
            iconPicker.checkIcon('iconPicker', data.menuIcon);
            //更新渲染
            form.render(null,'edit-form');
            //弹层组件
            layer.open({
                type: 1,
                title: '修改菜单信息',
                content: $("#edit"),
                area: ['750px', '400px']
            })
        }
    });
    //图标插件
    iconPicker.render({
        // 选择器,推荐使用input
        elem: '#menu-icon',
        // 数据类型:fontClass/unicode,推荐使用fontClass
        type: 'fontClass',
        // 是否开启搜索:true/false
        search: true,
        // 是否开启分页
        page: true,
        // 每页显示数量,默认12
        limit: 12,
        // 点击回调
        click: function(data) {
            $("#menu-icon").val(data.icon);
        }
    });
    // 头部工具栏点击事件
    treeTable.on('toolbar(demoTreeTb)', function (obj) {
        switch (obj.event) {
            case 'add':
                //获取上以及菜单
                getPid();
                //清空数据
                $("#menu-name").val("");
                $("#pid").val(0);
                $("#mid").val("");
                $("#menu-icon").val("");
                $("#menu-url").val("");
                $("#menu-type").val("");
                //更新渲染
                form.render(null,'edit-form');
                //弹层组件
                layer.open({
                    type: 1,
                    title: '新增菜单信息',
                    content: $("#edit"),
                    area: ['750px', '400px']
                })
                break;
            case 'expandAll':
                // 全部展开
                menuTable.expandAll();
                break;
            case 'foldAll':
                // 全部折叠
                menuTable.foldAll();
                break;
        }
    });

    function getPid(){
        //获取角色信息
        $.ajax({
            url:'../menu?type=getMenu',
            async:false,
            dataType:'json',
            success:function(data){
                $("#pid").html("");
                $("#pid").append("<option value='0'>无</option>")
                $(data.data).each(function(){
                    if(this.menuType==="导航"){
                        $("#pid").append("<option value="+this.mid+" >"+this.menuName+"</option>")
                    }
                })
            }
        });
    }

    //保存事件触发
    form.on('submit(save)',function(data){
        layer.closeAll('page'); //关闭所有页面层
        $.ajax({
            url:'../menu?type=saveMenu',
            type:'post',
            data:data.field,
            dataType:'json',
            success:function(data){
                layer.msg(data.msg, {
                    time: 2000 //2秒关闭(如果不配置,默认是3秒)
                });
            },
            error:function(err){
                console.log(err)
            }
        });
        //重载树形表格
        menuTable.reload();
        return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
    });
});

完整代码

https://download.csdn.net/download/weixin_41092938/87856436
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于LayUI+Servlet的权限管理系统的设计 的相关文章

  • 方法重载。你能过度使用它吗?

    当定义多个使用不同过滤器返回相同形状的数据的方法时 什么是更好的做法 显式方法名称或重载方法 例如 如果我有一些产品并且我正在从数据库中提取 显式方式 public List
  • 单击链接时如何将另一个 JSP 页面注入到

    我在一个JSP页面中有两个不同的部分 其中一个包含链接菜单 单击时 div2 id content 会相应加载不同的页面 我正在做类似的事情 div ul class navbar li a href Login jsp Login a l
  • cygwin有java sdk吗?

    cygwin有java sdk吗 如果有一个使用 cygwin 文件系统和 X windows 进行显示的本机 cygwin 实现 那就太好了 不幸的是我不知道这样的版本 我认为移植 OpenJDK 也需要付出很大的努力 但我还没有尝试过
  • Java 8 中异常类型推断的一个独特功能

    在为该网站上的另一个答案编写代码时 我遇到了这个特性 static void testSneaky final Exception e new Exception sneakyThrow e no problems here nonSnea
  • 如何将 ArrayList 中的所有值相加或转换为 ArrayList

    我试图将 ArrayList 中的所有值相加 但没有任何方法可以让我得到总和 我必须找到从文本文件中提取的数字的平均值 public static void main String args throws IOException File
  • 枚举内的枚举

    这不是我被卡住的问题 而是我正在寻找一种简洁的方式来编写我的代码 本质上 我正在编写一个事件驱动的应用程序 用户触发事件 事件被发送到适当的对象 然后对象处理事件 现在我正在编写偶数处理程序方法 我希望使用 switch 语句来确定如何处理
  • docker 中带有参数的 jar 文件

    Helo 我有一个 java jar 文件 当我从终端运行它时 它会接受一堆参数作为输入 我想制作一个 docker 映像并运行它 其中包含 jar 文件 我仍然可以在其中传递 jar 文件的参数 将 jar 文件设置为您的入口点 http
  • 在Java中读取制表符分隔的文件

    我有以下代码来读取 Java 中的制表符分隔文件 while str in readLine null if str trim length 0 continue String values str split t System out p
  • 最终类中的静态函数是否隐式最终?

    我的问题基本上与this https stackoverflow com q 8766476 3882565一 但这是否也适用于static功能 我想了解 编译器是否处理所有static函数在一个final类为final 是否添加final
  • 使用嵌入式 Jetty 7 发布 JAX-WS 端点

    有人可以帮忙吗 我想使用嵌入式 Jetty 7 作为端点 这是我尝试过的 public class MiniTestJetty WebService targetNamespace http public static class Calc
  • MongoDb Spring 在嵌套对象中查找

    我正在使用 Spring Data Mongodb 和这样的文档 id ObjectId 565c5ed433a140520cdedd7f attributes 565c5ed433a140520cdedd73 333563851 list
  • 如何使 JFileChooser 仅显示具有某些特定名称 Java 的文件夹

    有什么方法可以让 JFileChooser 加载时仅显示名称为 Hello 的文件夹 这是我的代码 它显示所有文件夹以及扩展名为 py 和 java 的文件 我想添加文件夹名称限制 FileNameExtensionFilter filte
  • 使用 Jboss7 加载资源返回 null

    如何使用Jboss7 1从java代码中加载图像等资源 这曾经与 Jboss4 一起使用 this getClass getClassLoader getResourceAsStream myapp includes images imag
  • Spring portlet mvc:@Valid 似乎不起作用

    我创建了一个 bean 类并在我的控制器中使用它 但它似乎不起作用 也就是说 即使我输入了无效的年龄 result hasErrors仍然是假的 豆类 public class User Min 13 private int age pri
  • 我有什么理由应该嘲笑?

    我也是 Mockito 和 PowerMockito 的新手 我发现我无法使用纯 Mockito 测试静态方法 因此我需要使用 PowerMockito 对吗 我有一个非常简单的类 名为 Validate 使用这个非常简单的方法 publi
  • 如何强制 Spark 执行代码?

    我如何强制 Spark 执行对 map 的调用 即使它认为由于其惰性求值而不需要执行它 我试过把cache 与地图调用 但这仍然没有解决问题 我的地图方法实际上将结果上传到 HDFS 所以 它并非无用 但 Spark 认为它是无用的 简短回
  • Android 中的自定义相机应用程序问题 - 旋转 270、拉伸捕获视图且未获取所有功能

    我从代码中得到了帮助https github com josnidhin Android Camera Example https github com josnidhin Android Camera Example 但面临一些问题 例如
  • 如何在java中进行多处理,以及预期的速度提升是多少?

    我是一个新手 使用 Java 对 csv 文件进行一些数据处理 为此 我使用 Java 的多线程功能 线程池 将 csv 文件批量导入到 Java 中 并对每一行执行一些操作 在我的四核处理器上 多线程大大加快了处理速度 我很想知道多处理如
  • 将Json字符串映射到java中的map或hashmap字段

    假设我从服务器返回了以下 JSON 字符串 response imageInstances one id 1 url ONE two id 2 url TWO 杰克逊代码大厦 JsonProperty 我怎样才能得到HashMap对象出来了
  • MySQL - 通过部分单词匹配和相关性评分进行高效搜索(全文)

    如何进行 MySQL 搜索 既匹配部分单词 又提供准确的相关性排序 SELECT name MATCH name AGAINST math IN BOOLEAN MODE AS relevance FROM subjects WHERE M

随机推荐

  • 超分辨率基础

    超分辨率综述 Image Super resolution 的深度学习方法 微信二维码引擎OpenCV开源 微信扫码背后的图像超分辨率技术 技术解析 即构移动端超分辨率技术 DIV2K数据集下载 B100 Manga109 Set5 Set
  • firefly框架分析之netconnect package(一)

    firefly下的目录结构如下 里面的各个包将会一一的介绍 今天先开始看看netconnect包 该包下面这些模块从connection开始 Connection py 与客户端的连接对象 通过其与客户端通讯 向客户端发送封装过的数据 还可
  • Qt源码解析1---D指针原理

    D指针 什么是d指针 如果你已经看过到Qt源文件像QLablel QPicture QLabel picture const Q D const QLabel if d gt picture return d gt picture retu
  • ChatGPT的接口在哪

    ChatGPT本身不是一个独立的接口 而是一个预训练的自然语言处理模型 如果您需要使用ChatGPT来实现某个自然语言处理任务 例如文本生成 问答等 您可以使用Python中的深度学习框架 如TensorFlow PyTorch 加载预训练
  • 谈我对于ajax的理解

    Ajax的全称是Asynchronous JavaScript and XML 中文名称定义为异步的JavaScript和XML Ajax是Web2 0技术的核心由多种技术集合而成 使用Ajax技术不必刷新整个页面 只需对页面的局部进行更新
  • qt 信号槽默认参数 toggled 和 trigger的区别

    toggled和trigger区别 1 toggle 类似开关 具有2个状态 打开 关闭 使用这个信号 是在这2个状态之间切换 2 trigger是一次性的 点击后 无法改变状态 要么是打开 要么是关闭 参考 http blog csdn
  • c# 对txt文件的读取与写入

    C txt文件分析 读取与写入 c 中对txt文件的读取写入在工作中用到的很多 今天写一个之前工作中用到的小demo 案例场景要求 txt文件中为很多条标记时间戳的报文 需要计算出每条报文从开始接收到结束用了多长时间 案例执行 如txt文件
  • Java数据结构和算法(一)——简介

    本系列博客我们将学习数据结构和算法 为什么要学习数据结构和算法 这里我举个简单的例子 编程好比是一辆汽车 而数据结构和算法是汽车内部的变速箱 一个开车的人不懂变速箱的原理也是能开车的 同理一个不懂数据结构和算法的人也能编程 但是如果一个开车
  • apk文件 -- 反编译

    源博客 https www cnblogs com mfrbuaa p 4588057 html 编译工具 apktool 资源文件获取 能够提取出图片文件和布局文件进行使用查看 dex2jar 将apk反编译成java源代码 classe
  • Python中多线程和线程池的使用方法

    Python是一种高级编程语言 它在众多编程语言中 拥有极高的人气和使用率 Python中的多线程和线程池是其强大的功能之一 可以让我们更加高效地利用CPU资源 提高程序的运行速度 本篇博客将介绍Python中多线程和线程池的使用方法 并提
  • ad9361收发异常问题分析

    最近在调试ad9361 发送都调试好了 但是接收一直没调试好 折腾了一个多月才搞定接收 根据官方提供的api代码 需要修改的有 1 修改reference clk rate参考时钟 2 修改xo disable use ext refclk
  • CTF——被改错的密码

    http ctf idf cn index php g game m article a index id 29 cca9cc444e64c8116a30la00559c042b4看着像一串MD5加密 但是实际不是 去掉中间的l 进行md5
  • 新手小白一看就懂的Excel技能之入门基础

    很多同学开开心心拿到新买的电脑 开机一看 桌面干干净净的 想打开Excel 半天找不到 这些痛 只有新手小白才能懂 今天 我给大家好好讲讲怎么使用Excel 鼠标左键点击电脑桌面左下角的 搜索 输入 Excel 看到 Microsoft O
  • 过拟合现象,原因,以及降低过拟合的方法

    一 什么是过拟合 为什么要避免过拟合 图1 1 Overfit Normal 上图是一张使用线性回归拟合二维样本数据的matlab输出图片 其中Normal曲线是使用使用了带参数空间限制的最小二乘法进行求解的模型 Overfit曲线是使用最
  • 微服务中常用的注解

    注解的定义 Annotation 注解 用于为Java代码提供元数据 简单理解注解可以看做是一个个标签 用来标记代码 是一种应用于类 方法 参数 变量 构造器及包的一种特殊修饰符 1 Target 表示该注解类型所使用的程序元素类型 结合E
  • 机器学习实践(一)—sklearn之概述

    1956年 人工智能元年 人类能够创造出人类还未知的东西 这未知的东西人类能够保证它不误入歧途吗 一 机器学习和人工智能 深度学习的关系 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 二 机器学习 深度学习的应用场
  • Office 2019 for Mac 安装

    1 下载微软官方Office 2019 for Mac 64位 大小 1 7G 2 按照提示安装Office 2019 for Mac 3 下载14743217 Microsoft Office 2019 VL Serializer安装器
  • 发qq邮件被对方服务器拒绝,QQ被对方拉黑了。我发QQ邮件对对方能收到吗?

    QQ被对方拉黑了 我发QQ邮件对对方能收到吗 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 QQ被对方拉黑了 我发QQ邮件对对方能收到吗 拉黑删除能收到的 邮件
  • Scrapy实战案例--抓取股票数据并存入SQL数据库(JS逆向)

    目标网址 http webapi cninfo com cn marketDataZhishu 之前在这篇文章里面对该网站的JS进行了一个逆向的解析 JS逆向解析案例 接下来我们来创建一个Scrapy项目来爬取某潮的数据并保存在数据库中 过
  • 基于LayUI+Servlet的权限管理系统的设计

    权限管理是所有后台系统的都会涉及的一个重要组成部分 主要目的是对不同的人访问资源进行权限的控制 避免因权限控制缺失或操作不当引发的风险问题 如操作错误 隐私数据泄露等问题 本系统基于JSP Servlet JDBC LayUI的技术 在系统