论坛首页 Java企业应用论坛

从零开始一步一步做论坛------抛砖引玉,欢迎怕转[三]

浏览 1293 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-10-08   最后修改:2011-10-08

     今天来说说数据库的设计,现在一般用hibernate维护关系.首先探讨一个问题,一个系统的id是不是只用一种?或者String类型的uuid,或者其他的?如果全部用uuid的话,那么开发也会很方便,到哪里都操作的是String类型的,Action层也是String类型的,整个统一的好处不言而喻.但是,如果系统数据量很大的话,uuid其实是很费空间的,以前听说,在Oracle界不用uuid的话会被鄙视不专业,但是经过我这个系统的实践开发,加上在公司研究了其他的项目,最后总结出来:一个系统的id可以有多种,刚开始时我也接受不了这种开发,觉得如果采用统一的话,会更方便,但实际开发中uuid也是会遇到很多问题的,对于数据量较大的容易产生重复id的,就是用uuid,对于在一个系统中很少数据的,就是用int就可以了.就那这个论坛为例吧,刚开始时我全部用uuid,到最后竟然出现了传值时value太长,超过number类型的最大范围这个异常,尴尬!到现在也没弄清楚为什么,怎么会出现number呢?应该是varchar才对呀?没办法,换id!但是,请别误会我是被逼才换的,我接触过几个很大的系统,其中一个是广电的收视率调查,整个系统由七个子系统构成,极其复杂,而且要调查收视率,就要统计某个时段内某个频道的在线用户数,系统数据量非常大,其中的id就是采用多种,不是说一个系统采用一种,而是各个小系统也采用多种,这样可以更好的利用空间.这个论坛因为主要是处理帖子的,所以Forum这个类就采用uuid了;board版区一般就10个一下吧,所以采用int类型的.

 

      再总结一下:一个系统的id可以有多种,完全不用担心映射的问题,因为说白了,配置的那些映射,一对一的,多对一的,多对多使用中间表的,其实保存的映射关系还是一个id在表里面,如果不建立关联关系,自己维护的话,也就是将id保存到对应的位置.只不过配置了关系的,保证了数据之间的完整性,但是操作比较复杂,要先获得关系对象,再获得对象的属性.

      接下来说说这个系统的数据库设计吧,比较简单,先上图吧:

 

      说明一下:这个图有很多问题的,这是我刚开始设计时的图,虽然程序改过很多,但是图没改过,好多id都是string类型的.还有一点说明,我基本不会UML,图是我按自己的想法画的,如果在bean类里面需要声明一个其他类的对象,那就在旁边有一个其他类的声明出来的对象,和bean类保持一致,多的一端用*,一的一端就用1表示,大家凑合着看,悠着点批评,我真的不会uml,真是悲剧.

Permission:

public class Permission implements Serializable {
	
	private String id;
    private String permissionName;
    private String resource;//页面路径,localhost:8088/bbsns/userInfo.bbsns
    private String action;//采取的操作,action=reg
    private int typeID;
    private Set roles;
}

插入操作:

public static Permission p101 = new Permission("发帖权限", "/forum", "post,postSave", 2);
	public static Permission p102 = new Permission("查看主帖列表权限", "/forum", "listForums", 2);
	public static Permission p103 = new Permission("查看精华帖列表权限", "/forum", "listForumsElite", 2);
 

如果注册,只需要点击这个连接,对应的action类就会自动执行reg方法,我的action类全部集成自一个BaseAction,这个类是来自其他项目的:

public class BaseAction extends ActionSupport{

       private String action="index";

       protected String executeMethod(String method) throws Exception {
		Class[] c = null;
		Method m = this.getClass().getMethod(method, c);
		Object[] o = null;
		String result = (String) m.invoke(this, o);
		return result;
	}

	public String execute() {
		try {
			System.out.println("BaseAction.execute:"+this.getAction()+" method execute!!!");
			return this.executeMethod(this.getAction());
		} catch (Exception e) {
			System.out.println("BaseAction.execute:"+this.getAction()+" has a problem!!!");
			return ERROR;
		}
	}
}
 

      在权限拦截器里面,获取localhost:8088/bbsns/userInfo.bbsns?action=reg(action后缀改成了bbsns)里面的action userInfo和要采用的action reg,和用户的权限对比,如果对应,就通过.

整个系统的权限是按照RBAC权限模型来设计的,但不完全是,可以说是我在学习了之后自己做出来的,权限和角色之间是多对多关联,用户组和角色之间也是多对多关联,但是我限制了用户和用户组的关系,一个用户的身份只能属于一个用户组.整个系统的权限分两条主线,一条是用户权限,刚才已经介绍过了,还有一条是版区权限,图上上面那条.一个版区允许采用的操作就是这个版区的权限,权限拦截器里同时拦截版区id和用户组id,不同的用户组有不同的权限,注册用户只能看,不能发帖回帖等.

BoardPermission:

public class BoardPermission implements Serializable {

	private String id;
	private long boardID;
	private String groupID;
	private Set permissions;
}

      最后是版主权限,一个版区可以有多位版主,一个版主也可以管理多个版区,所以采用多对多的,在角色表里有对应的版主角色,这样在拦截器里就可以获得版主的角色,通过角色就可以拿到权限.

       这样一个人在这个论坛中的权限就是自己的权限和版区权限之和,如果这个人是版主,那么他的权限就是版区权限加上个人权限加上版主权限.

       对于角色权限控制就到这里吧,也不知道说清楚了没,基于RBAC的权限模型论坛里有很多,大家可以下载看看.我觉得这个系统最难得地方就是权限控制了,如果权限设置好了,其他的都是体力活了.在上一篇中,有人质疑我从数据库开始设计,其实说白了,我不懂什么设计,刚开始时就是画图,我觉得就是在设计数据库,或者说是在设计数据库的模型bean类,设计完之后先导出表看看没有问题了,再dao,service,action,jsp一步一步来,我觉得这个步骤挺好的,不知道大家怎么看?

好了,这次就到这里,欢迎大家讨论交流,谢谢大家读这篇文章.

 

原创首发,谢谢支持!

 

  • 大小: 15.4 KB
   发表时间:2011-10-09  
见证一个奇迹的诞生
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics