Eap使用(5) 数据库设计

 

功能表

//系统功能
bean SystemFunctionEntity{
	Integer id;
//	@ 此处不能添加字段注解,影响项目启动
	String name length 20; //功能名
	String module length 20; //所属模块
	String url length 256; // URL
	Integer origin = 0;  // 来源       是程序扫描到的还是手动添加  未启用 现在不能手动添加
	@Min(0)
	@Max(1)
	Integer enabled = 1 length 1 notnull; //是否有效
	@Min(0)
	@Max(1)
	Integer isCommon = 0 length 1 notnull; //是否是通用模块(通用模块不需要权限控制)
}

  • eap系统所有的请求都会经过spring security 的拦截 判断一个人是否有权限访问 就是确认这个人是否有权限访问这个请求的url
  • 系统启动的时候 会根据配置信息 eap.function.reload 的值 (默认是true) 决定是否刷新表里的数据. 否则不刷.
  • 如果配置要刷 会把项目中所有存在的标注有@RequestMapping注解的方法对应的url 都查询到 与现有库里的情况逐条比对
  • 如果此时是eap.dev=true开发模式,会将表里没有的url 添加 如果不是开发模式 还会将表里多余的url 设置为无效.

功能就是资源点

角色表

//角色实体
bean SystemRoleEntity{
	Integer  id;
	@Size(min=3,max=20,message="请输入3-20位长度的角色名")
	@Column(name = "name",unique = true)
	String name length 20 notnull;//角色名
	@Min(0)
	@Max(1)
	Integer enabled = 1 length 1 notnull; //是否有效
	String memo length 500; //备注
	Date createdDate = new Date();//创建日期
	String  loginId length 30 notnull;  //创建人工号
	
	@OneToMany(mappedBy="role",fetch =FetchType.EAGER)
	List<SystemRoleFunction> roleFunction;
}

角色就是对功能的集合 比如定义一个角色 他包含5个url

菜单表

//系统菜单
bean SystemMenuEntity{
	Integer id;

	@Size(min = 2, max = 20,message="请输入2-20位长度的字符!")
	@Column(name = "name",unique = true)
	String name length 20 notnull; //菜单名
	@Min(0)
	@Max(1)
	Integer enabled = 1 length 1 notnull ;//是否有效
	
	@ManyToOne
	@JoinColumn(name="parent_id")
	@JsonIgnore
	SystemMenuEntity parentMenu;
	
	@OneToOne
	@JoinColumn(name="function_id")
	SystemFunctionEntity function; //关联的系统功能
	
	@OneToMany(mappedBy="parentMenu",fetch =FetchType.EAGER)
	List<SystemMenuEntity> subMenus;
	//排序项
	Integer ord;
	
	String icon;
	//打开方式
	Integer openType;
}

菜单跟功能是一对一的 一个菜单代表一个功能

员工表

// 员工表
bean SystemStaffEntity{
	Integer id;
	 
	@Size(min=1,max=30,message="请输入1-30位长度的工号")
	@Column(name = "login_id",unique = true)
	String loginId notnull ; //工号  (登陆系统时用)
	
	@Size(min=1,max=30,message="请输入1-30位长度的姓名")
	String name length 30 notnull; // 员工姓名
	
//	@Size(min=11,max=11,message="请输入11位手机号")
	String telNum length 20; //电话号码
	
//	@Pattern(regexp = "^[A-Z0-9a-z]+([-_.][A-Z0-9a-z]+)*@([A-Z0-9a-z]+[-.])+[A-Z0-9a-z]+$",message="邮箱地址格式不正确!")
	@Email
	String email length 50;// E-Mail
	
	@Min(0)
	@Max(2)
	Integer status = 1 length 1; //员工状态    0:离职 1:正式 2:试用 
	Date employTime = new Date(); //入职日期
	String password = "000000" length 30;  // 登陆密码
	Date passwordChgDate; // 密码修改时间
	@Min(0)
	@Max(1)
	Integer sex length 1 notnull;  //性别
	@ManyToOne
    SystemDepartmentEntity department;  //员工所在部门
    
    Integer createdStaff length 10 notnull;// 创建人 
	Date createdDate = new Date();//创建时间
	
	@OneToMany(mappedBy="staff",fetch =FetchType.EAGER)
	List<SystemRoleStaff> roleStaff;
	
	@JsonIgnore
	Integer loginErrorNum=0 length 2;//错误登录次数
	@JsonIgnore
	Timestamp lastErrorTime;//最后一次登录失败时间
	
	//扩展字段
	String ext1;
	String ext2;
	String ext3;
	
}

员工拥有多个角色 比如系统管理员 只读管理员

其他还有部门表 参数表参数项表 任务表 异常日志表 操作日志表

判断一个人是否有权限

还是以流程图说明

用户请求/a.sp
 ↓
判断用户是否已登录 未登录则重定向进行登录
 ↓
查询该用户拥有的所有角色对应的所有功能并去重(包含公共的功能)
 ↓
查询a.sp 是否在拥有的功能集合中
 ↓
如果在 则有权限 放行 不在 返回403