1 、基本介绍
jeecg丰富的权限设计,能满足80%以上的权限需求,部门,用户,角色,菜单资源权限,操作资源(就是页面上的增删查改,甚至自定义操作 例如:导入excel、导出XML)之间的关系,从页面,ER图,代码,三个角度介绍。
2、权限实现
2.1 部门和用户
当我们登录jeecg的时候出现让我们选择部门的下拉框
可以知道一个用户可以同时存在多个部门,部门和部门之间其实有上下级关系。一个部门下可以用多个子部门,那么部门就是一个树状结构图,如图“机构编码”很清晰看出来。
那么用户和部门的ER图
从上面可以知道部门和部门之间是一个是一对多(一个部门下有很多的子部门)和多对一的关系那么
部门表数据库设计
create table t_s_depart ( ID national varchar(32) not null, -- 部门ID departname national varchar(100) not null, -- 部门名称 description national longtext, -- 部门描述 parentdepartid national varchar(32), -- 上级级部门ID org_code national varchar(64), -- 部门代码 如0102 org_type national varchar(1), -- 机构类型 primary key (ID) );
JPA 实体图设计如下
@Entity
@Table(name = "t_s_depart")
public class TSDepart extends IdEntity implements java.io.Serializable {
private TSDepart TSPDepart;//上级部门
private String departname;//部门名称
private String description;//部门描述
private String orgCode;//机构编码
private String orgType;//机构编码
private List<TSDepart> TSDeparts = new ArrayList<TSDepart>();//下属部门
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parentdepartid")
public TSDepart getTSPDepart() {
return this.TSPDepart;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TSPDepart")
public List<TSDepart> getTSDeparts() {
return TSDeparts;
} 。。。。。。。
用户和部门之间是一个多对一之间的关系
用户表设计如下
create table `t_s_base_user` ( `ID` varchar(32) NOT NULL, -- 用户ID `password` varchar(100) default NULL, `realname` varchar(50) default NULL, `status` smallint(6) default NULL, `username` varchar(10) NOT NULL, `departid` varchar(32) default NULL, -- 部门ID PRIMARY KEY (`ID`), KEY `FK_15jh1g4iem1857546ggor42et` (`departid`), CONSTRAINT `FK_15jh1g4iem1857546ggor42et` FOREIGN KEY (`departid`) REFERENCES `t_s_depart` (`ID`) )
其实这个设计是多出许多冗余字段,应该用中间表实现(jeecg 也实现了)用户和部门之间的关系很明显的实现了
public class TSBaseUser extends IdEntity implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private String userName;// 用户名
private String realName;// 真实姓名
private String browser;// 用户使用浏览器类型
private String userKey;// 用户验证唯一标示
private String password;//用户密码
private Short activitiSync;//是否同步工作流引擎
private Short status;// 状态1:在线,2:离线,0:禁用
private byte[] signature;// 签名文件
// private TSDepart TSDepart = new TSDepart();// 部门
private List<TSUserOrg> userOrgList = new ArrayList<TSUserOrg>();
private TSDepart currentDepart = new TSDepart();// 当前部门
2.2 用户和角色
用户和角色之间是一个对多的关系。一个人可以有好多角色,可以是管理员,可以是一般的用户,
反过来讲一个角色拥有多个用户,就成了JPA最标准的多对多设计
我们当前用户登录的Admin的角色就是管理员
用户和角色之间的关系如下
借用中间表,现在是最佳实现多对多的方法 主要中间JPA实现如下
>
@Entity
@Table(name = "t_s_role_user")
public class TSRoleUser extends IdEntity implements java.io.Serializable {
private TSUser TSUser;
private TSRole TSRole;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "userid")
public TSUser getTSUser() {
return this.TSUser;
}
public void setTSUser(TSUser TSUser) {
this.TSUser = TSUser;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "roleid")
public TSRole getTSRole() {
return this.TSRole;
}
public void setTSRole(TSRole TSRole) {
this.TSRole = TSRole;
}
}
2.3角色和菜单资源
不用的角色应该具备不同的菜单权限,管理员应该具备设置菜单的权限,操作员,应该具备就会看到这个菜单,那么菜单和角色之间又成了一个多对多之间的关系。设计思路和刚才的角色用户大体相同
我们可以看到菜单之间也是一个树状图,所以菜单的实际思路就想刚才说的部门的表。
CREATE TABLE `t_s_function` ( `ID` varchar(32) NOT NULL, `functioniframe` smallint(6) default NULL, `functionlevel` smallint(6) default NULL, `functionname` varchar(50) NOT NULL, `functionorder` varchar(255) default NULL, `functionurl` varchar(100) default NULL, `parentfunctionid` varchar(32) default NULL, -- 上级级菜单 `iconid` varchar(32) default NULL, -- 菜单的图标 `desk_iconid` varchar(32) default NULL, -- 菜单的图标 `functiontype` smallint(6) default NULL, PRIMARY KEY (`ID`), KEY `FK_brd7b3keorj8pmxcv8bpahnxp` (`parentfunctionid`), KEY `FK_q5tqo3v4ltsp1pehdxd59rccx` (`iconid`), KEY `FK_gbdacaoju6d5u53rp4jo4rbs9` (`desk_iconid`), CONSTRAINT `FK_brd7b3keorj8pmxcv8bpahnxp` FOREIGN KEY (`parentfunctionid`) REFERENCES `t_s_function` (`ID`), CONSTRAINT `FK_gbdacaoju6d5u53rp4jo4rbs9` FOREIGN KEY (`desk_iconid`) REFERENCES `t_s_icon` (`ID`), CONSTRAINT `FK_q5tqo3v4ltsp1pehdxd59rccx` FOREIGN KEY (`iconid`) REFERENCES `t_s_icon` (`ID`) )
ER图如下
这个代码和刚才的角色和用户类似
@Entity
@Table(name = "t_s_role_function")
public class TSRoleFunction extends IdEntity implements java.io.Serializable {
private TSFunction TSFunction;
private TSRole TSRole;
private String operation;
private String dataRule;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "functionid")
public TSFunction getTSFunction() {
return this.TSFunction;
}
public void setTSFunction(TSFunction TSFunction) {
this.TSFunction = TSFunction;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "roleid")
public TSRole getTSRole() {
return this.TSRole;
}
public void setTSRole(TSRole TSRole) {
this.TSRole = TSRole;
}
@Column(name = "operation", length = 100)
public String getOperation() {
return this.operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
@Column(name = "datarule", length = 100)
public String getDataRule() {
return dataRule;
}
public void setDataRule(String dataRule) {
this.dataRule = dataRule;
}
}
2.4 菜单和资源按钮
一个菜单资源和上面会有许多按钮如图,那么很明显菜单和资源按钮之间是一对多的关联
他们是ER图和前面的很类似
public class TSOperation extends IdEntity implements java.io.Serializable {
private String operationname;
private String operationcode;
private String operationicon;
private Short status;
private TSIcon TSIcon = new TSIcon();
private TSFunction TSFunction = new TSFunction();
3 总结
我们从部门—–>用户——>角色——–>资源——–>操作按钮 他们之间的关系作了一个梳理,这个这个设计基本用到的Hibernate所有的映射关系。
jeecg还有更丰富的资源控制方法—规则引擎,等以后会详细讲解规则引擎的使用。