基于RBAC权限管理实现的中小学成绩管理系统

xjtuer最好不要抄,五次作业都是去年优秀作业,被老师逮住全给0分就得不偿失了,放在这里是给大家一个思路不用再去查找很多资料,了解之后再自己总结写一写

本文讲解的系统是中小学成绩管理系统,因为RBAC最大的优势在于灵活方便的授权管理,在中小学成绩管理系统中,角色特征鲜明,功能权限划分清楚,非常适合用作实现RBAC权限管理系统

系统分析

在学校成绩管理系统中,用户包括学生、教师,管理人员,有学生、教师和管理人员三大角色,教师角色又可细化普通教师和具有管理职能教师,如班主任、年级主任、教务人员等,系统的权限就是系统提供给用户的功能。因为不同用户使用本系统的功能不同,所以不同的角色拥有的权限不同,具有管理职能的教师有普通教师的权限,普通教师却不具有管理权限。

系统功能描述

image-20211026130001657.png

从系统设计和实际使用方面来考虑,这样的安排比较合理,系统将根据访问的用户不同,可用的功能不同,如果学生登录,那就只有学生功能和通用两个模块,如果是班主任登录,那就有班主任、教师、通用三个模块。这些功能的安排由管理员在后台管理的权限管理来进行动态设置。

系统使用逻辑

对于上表所示系统的详细功能,用户在使用中小学成绩管理系统时需要先登录,如果用户名和密码不匹配,则认定为非法登录,系统将阻止用户的下一步操作,刷新登录界面,方便用户再次登录。如果登录成功,先从数据库中查询到用户所属的角色,根据角色的不同,加载不同的功能,基于RBAC的访问逻辑下图所示。

image-20211026130853451.png

框架说明

在这次设计中,由于需要配合java的监听机制来实现RBAC系统,因此我使用的java GUI + JDBC来完成实现,系统框架如下图所示

image-20211026201331401.png
RBAC管理界面

权限管理

权限管理部分分为两部分,点击右侧的按钮即可切换

  • 设置权限:在该部分,可以对已经设置好的操作对象及操作进行组合,形成针对系统上一项特定功能的权限

  • 分配权限:在该部分,可以将已经设置好的权限分配个各个角色,从而形成一个拥有一系列权限集合的角色

image-20211026202831889.png

image-20211026203423379.png

代码实现细节讲解

  • 在该系统中,我将java提供的Swing框架组件又进行了再次封装,使其适合在该系统下完成某些特定的功能,具体的实现如:MyJPanelMyFrameMyMenuMyMenuItem,以及ResultDialog,其中,

    • 对于MyFrame以及ResultDialog的封装是为了更好的实现代码复用,减少不必要的代码量,
    • 对于MyJPanel的封装是因为在页面切换时,有些页面需要从数据库中获取数据,而将这部分获取数据的内容放在构造函数中是及其不合理的,因为这样会增加系统在开始时候的压力,于是便封装了MyJPanel,在其中实现了init()函数,同时所有功能界面均extends MyJpanel,这样便可在切换到指定页面时仅初始化当前页面而不影响其他页面,
    • 对于MyMenuMyMenuItem的封装是为了实现菜单栏的权限管理,在其中加入了一个额外的名为permission的属性,用户登录进入该系统后即可根据该字段来判断用户是否有权限来执行这一系列的操作
  • 在该框架中,为了方便统一组织页面,因此对于外部的框架在程序运行及界面跳转的过程中并未做任何改变,页面跳转仅需要根据当前选中的菜单页设置功能界面即可,而为了实现该功能,我用到了第一次作业中的回调机制,首先提供一个接口TabSwitch,在该类中声明一个方法void switchTo(String tabName);,然后在主程序中实现这个类,并将这个类在声明内部主功能界面时传入保存,当主功能界面内的监听器监听到页面菜单栏发生点击事件即可通知外部主框架跳转到对应的页面,并且执行初始化操作,具体实现代码请见附录Main.javaMainPanel.java

// TabSwitch.java
public interface TabSwitch {
    void switchTo(String tabName);
}

// Main.java部分代码
static class TabSwitchImpl implements TabSwitch {

    @Override
    /**
    * 页面切换回调函数
    * 根据返回的页面名称在map中查找需要跳转到的页面
    * @param tabName 切换到的页面的名称
    */
    public void switchTo(String tabName) {
        System.out.println("panel: " + map.get(tabName));
        mainPanel.remove(currentPanel);
        map.get(tabName).setId(info_id);
        map.get(tabName).init();
        currentPanel = map.get(tabName);
        mainPanel.add(map.get(tabName));
        mainPanel.updateUI();
    }
}

// MainPanel.java部分代码
for (int i = 0; i < itemList.size(); i++) {
    JMenuItem menuItem = itemList.get(i);
    menuItem.addActionListener(new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            tabSwitch.switchTo(menuItem.getName());
        }
    });
}
  • 另外由于使用的JDBC原生数据库,因此我封装了一系列的api方便在具体执行sql语句时减少代码量以及增加代码的复用性,主要封装的方法如下(具体实现请见附录MysqlUtil.java):
public static Connection getConnection(); // 生成于数据库的连接
public static void close() throws SQLException; // 关闭连接
public static String Insert(String tableName, Map<String, String> map); // 生成插入语句
public static String Delete(String tableName, Map<String, String> map); // 生成删除语句
public static String Update(String tableName, Map<String, String> conditionMap, Map<String, String> valueMap); // 生成更新语句
public static String Select(String tableName, Map<String, String> map); // 生成查询语句
public static String Select(String tableName, String type, Map<String, String> map); // 生成查询语句
public static String getNextId(String tableName, String idTitle); // 获取下一个值是多少,用于获得下一个插入数据的主键值

如果觉得还不错的话请点个star,谢谢
项目地址:https://gitee.com/hydrogenion/rbac-control-system

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hydrion-Qlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值