需求分析
我们直接来看看原型图,看看需求是怎么样的:
这里写图片描述
这里写图片描述
我们看到上图,就会发现角色模块主要还是CRUD,唯一不同的就是它不再是单独的实体关系。角色与权限是存在关系的。
之前在Servlet+JSP+JavaBean的时候其实我们已经做过了用户-角色-权限之间的操作【权限管理系统】http://blog.csdn.net/hon_3y/article/details/61926175
角色与权限应该是多对多的关系的。
- 一个角色拥有多个权限
- 一个权限可以被多个角色使用。
进一步分析
现在我的权限只有5个,有必要使用数据库表吗???没啥必要吧。权限基本就固定下来了。那多对多的关系怎么维护???之前我们使用数据库表就很好做了呀。设计两个实体,使用中间表来描述它们之间的关系就做出来了。
那现在怎么做呢??一个角色对应多个权限
这里写图片描述
我们在数据库中的表就可以这样设计:即使没有权限表,但是我使用了中间表维护了它们的数据。一样可以做到一个角色对应多个权限这样的功能。
这里写图片描述
设计实体类
设计权限常量类
我们权限是不需要表的,因此我们把各个权限写下来,使用一个集合装载着就行了。当然啦,他们都应该被设计成常量。我们保存在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集合中保存着角色与关系表这个不就行了吗!!!
这里写图片描述
于是我们这样设计:
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; } }