纳税服务系统四(角色模块)【角色与权限、角色与用户】(一)

简介: 之前在Servlet+JSP+JavaBean的时候其实我们已经做过了用户-角色-权限之间的操作【权限管理系统】http://blog.csdn.net/hon_3y/article/details/61926175

需求分析

我们直接来看看原型图,看看需求是怎么样的:

17.jpg这里写图片描述18.png


这里写图片描述

我们看到上图,就会发现角色模块主要还是CRUD,唯一不同的就是它不再是单独的实体关系。角色与权限是存在关系的。

之前在Servlet+JSP+JavaBean的时候其实我们已经做过了用户-角色-权限之间的操作【权限管理系统】http://blog.csdn.net/hon_3y/article/details/61926175

角色与权限应该是多对多的关系的。

  • 一个角色拥有多个权限
  • 一个权限可以被多个角色使用


进一步分析


现在我的权限只有5个,有必要使用数据库表吗???没啥必要吧。权限基本就固定下来了。那多对多的关系怎么维护???之前我们使用数据库表就很好做了呀。设计两个实体,使用中间表来描述它们之间的关系就做出来了。

那现在怎么做呢??一个角色对应多个权限

19.png这里写图片描述

我们在数据库中的表就可以这样设计:即使没有权限表,但是我使用了中间表维护了它们的数据。一样可以做到一个角色对应多个权限这样的功能。


20.png

这里写图片描述


设计实体类


设计权限常量类


我们权限是不需要表的,因此我们把各个权限写下来,使用一个集合装载着就行了。当然啦,他们都应该被设计成常量。我们保存在core模块中【被整个系统用到的】


package zhongfucheng.core.constant;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by ozc on 2017/5/26.
 */
public class Constant {
    /*----------------------系统权限集合--------------------------*/
    public static String PRIVILEGE_XZGL = "xzgl";
    public static String PRIVILEGE_HQFW = "hqfw";
    public static String PRIVILEGE_ZXXX = "zxxx";
    public static String PRIVILEGE_NSFW = "nsfw";
    public static String PRIVILEGE_SPACE = "spaces";
    //使用一个Map集合来装载着这些权限。
    public static Map<String, String> PRIVILEGE_MAP;
    static {
        PRIVILEGE_MAP = new HashMap<String, String>();
        PRIVILEGE_MAP.put(PRIVILEGE_XZGL, "行政管理");
        PRIVILEGE_MAP.put(PRIVILEGE_HQFW, "后勤服务");
        PRIVILEGE_MAP.put(PRIVILEGE_ZXXX, "在线学习");
        PRIVILEGE_MAP.put(PRIVILEGE_NSFW, "纳税服务");
        PRIVILEGE_MAP.put(PRIVILEGE_SPACE, "我的空间");
    }
}


设计角色类


我们的角色类应该使用一个Set集合来保存对应的权限数据的,那么Set集合的元素类型是什么呢???想一下…

之前我们在用的时候,如果有权限表。我们在角色中Set集合的元素应该是Privilege类。但是现在是没有权限表的。我们怎么通过角色来获取所有的权限呢??

再看回这样ER图:我们在角色Set集合中保存着角色与关系表这个不就行了吗!!!

21.png


这里写图片描述

于是我们这样设计:


package zhongfucheng.role.entity;
import java.io.Serializable;
import java.util.Set;
/**
 * Created by ozc on 2017/5/26.
 */
public class Role implements Serializable {
    private String roleId;
    private String state;
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    private Set<RolePrivilege> rolePrivilegeSet;
    public static String USER_STATE_VALID = "1";//有效,
    public static String USER_STATE_INVALID = "0";//无效
    public String getRoleId() {
        return roleId;
    }
    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public Set<RolePrivilege> getRolePrivilegeSet() {
        return rolePrivilegeSet;
    }
    public void setRolePrivilegeSet(Set<RolePrivilege> rolePrivilegeSet) {
        this.rolePrivilegeSet = rolePrivilegeSet;
    }
    public static String getUserStateValid() {
        return USER_STATE_VALID;
    }
    public static void setUserStateValid(String userStateValid) {
        USER_STATE_VALID = userStateValid;
    }
    public static String getUserStateInvalid() {
        return USER_STATE_INVALID;
    }
    public static void setUserStateInvalid(String userStateInvalid) {
        USER_STATE_INVALID = userStateInvalid;
    }
}


设计角色与权限关系类


角色与权限关系类只有两个属性:角色的id和权限的code….这两个是外键列。一张表中一定是要有主键列的,于是我们采用的是复合主键的方式。

对于复合主键,它是要让该类维护一个复合主键类的:

将主键所对应属性提取出一个类(称之为主键类),并且主键类需要实现Serializable接口,重写hashCode和equals()方法


public class RolePrivilege implements Serializable {
    private CompositeKey compositeKey;
    public CompositeKey getCompositeKey() {
        return compositeKey;
    }
    public void setCompositeKey(CompositeKey compositeKey) {
        this.compositeKey = compositeKey;
    }
}

复合主键类

按照ER图,我们复合主键就两个属性:role_id和code。。

但是呢,我们想一下需求:在获取角色所有权限的时候,Set集合装载着角色与权限的关系,而角色与权限的关系装载着role_id和code。而很有可能:在我查看角色拥有所有权限的时候,想要得到角色的名称。这里仅仅查出来的是角色id,还要通过角色id得到角色的名称…这样就有点麻烦了。于是我们写成Role对象。到时候就能直接获取了。


package zhongfucheng.role.entity;
import java.io.Serializable;
/**
 * Created by ozc on 2017/5/26.
 */
public class CompositeKey implements Serializable {
    private String code;
    private Role role;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        CompositeKey that = (CompositeKey) o;
        if (code != null ? !code.equals(that.code) : that.code != null) return false;
        return role != null ? role.equals(that.role) : that.role == null;
    }
    @Override
    public int hashCode() {
        int result = code != null ? code.hashCode() : 0;
        result = 31 * result + (role != null ? role.hashCode() : 0);
        return result;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public Role getRole() {
        return role;
    }
    public void setRole(Role role) {
        this.role = role;
    }
}
目录
相关文章
|
5月前
|
存储 数据安全/隐私保护 索引
设计一个完美的用户角色权限表
设计一个完美的用户角色权限表
424 1
|
6月前
|
存储 监控 安全
数据访问权限如何通过角色管理实现?
【6月更文挑战第24天】数据访问权限如何通过角色管理实现?
95 9
|
存储 安全 机器人
Harbor2.2 用户角色权限速查
Harbor2.2 用户角色权限速查
259 0
|
数据安全/隐私保护
11-企业权限管理-角色操作
11-企业权限管理-角色操作
11-企业权限管理-角色操作
|
数据安全/隐私保护
13-企业权限管理-用户关联角色操作
13-企业权限管理-用户关联角色操作
13-企业权限管理-用户关联角色操作
|
中间件 数据安全/隐私保护
使用RoleBasedAuthorization实现基于用户角色的访问权限控制
本文将介绍如何通过 [Sang.AspNetCore.RoleBasedAuthorization](https://www.nuget.org/packages/Sang.AspNetCore.RoleBasedAuthorization) 库实现 RBAC 权限管理。
189 0
使用RoleBasedAuthorization实现基于用户角色的访问权限控制
|
数据安全/隐私保护
14-企业权限管理-角色关联权限操作
14-企业权限管理-角色关联权限操作
|
SQL 存储 Java
纳税服务系统四(角色模块)【角色与权限、角色与用户】(二)
之前在Servlet+JSP+JavaBean的时候其实我们已经做过了用户-角色-权限之间的操作【权限管理系统】http://blog.csdn.net/hon_3y/article/details/61926175
181 0
纳税服务系统四(角色模块)【角色与权限、角色与用户】(二)
|
存储 Java 数据库连接
纳税服务系统四(角色模块)【角色与权限、角色与用户】(三)
之前在Servlet+JSP+JavaBean的时候其实我们已经做过了用户-角色-权限之间的操作【权限管理系统】http://blog.csdn.net/hon_3y/article/details/61926175
344 0
纳税服务系统四(角色模块)【角色与权限、角色与用户】(三)
|
SQL Web App开发 数据库
服务器角色
服务器角色 意思 Bulkadmin 执行 Bulk Insert语句 Dbcreator 创建和改变数据库 Diskadmin 管理磁盘文件 Processadmin 管理在 SQL ...
791 0
下一篇
DataWorks