`
Fly_m
  • 浏览: 259635 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

新闻发布系统的设计思路(域模型)

阅读更多

      前阵子实验室接到一个门户网站的单子.我有幸参考其中,并负责其中所有有关新闻发布的代码.本来以前自己也作过有关新闻发布的例子(客户也没有对使用的开发框架作限制),由于正在看有关SSH(spring,hibernate,struts),就想拿这个模块来练手.经过几天的捣鼓,程序算是完成了.特分享一下设计经验.
       由于客户并没有提供相关更多的材料,完全是自我发挥,所以可以用的空间很大,也产生了要把模块弄得很好的愿望.所以设计方面也是有些考虑.采用spring2.0 hibernate3,和最新的struts2.0作为开发框架.(相关源代码可参考本人发在csdn上的链接download.csdn.net/source/235683 ).
       模型设计:
             新闻发布系统主要涉及新闻,类别.此外,新闻发布用户也是需要被考虑的问题.在实际中,由于考虑到一个新闻置顶方面的问题,特特殊设计了一个关于新闻置顶的类.因此,整个domain分成四个部分:文章(article),目录(category),文章置顶对象(articleTopType)以及用户对象(user).具体设计如下:
#-------------------------
            文章(article):    

  1. public class Article implements Serializable {   
  2.     /** 主键 * */  
  3.     private int id;   
  4.   
  5.     /** 文章标题 * */  
  6.     private String title;   
  7.   
  8.     /**  
  9.      * 文章路径标识,此字段是为了配合多个页面时,以此作为查询文章的下一个或者上一个页面.或者由此  
  10.      * 来寻求文章的相关信息,如创建日期等  
  11.      */  
  12.     private String pathMark;   
  13.   
  14.     /** 是否已经被审核 * */  
  15.     private boolean audited;   
  16.   
  17.     /** 文章标题的颜色 * */  
  18.     private String titleColor = ProjectConfigureGlobals.ARTICLE_DEFAULT_TITLECOLOR;   
  19.   
  20.     /** 文章摘要 * */  
  21.     private String summary;   
  22.   
  23.     /** 文章来源 * */  
  24.     private String source;   
  25.   
  26.     /** 文章创建时间 * */  
  27.     private Date createDate;   
  28.   
  29.     /** 文章修改时间 * */  
  30.     private Date modifyDate;   
  31.   
  32.     /** 文章创建时的ip地址 * */  
  33.     private String ip;   
  34.   
  35.     /** 文章的点击次数 * */  
  36.     private int hits = 1;   
  37.   
  38.     /** 文章的详细内容,此字段通常指本页的内容,并非此文章的内容,有可能一篇文章有多页,由此字段仅指其中的一页内容 * */  
  39.     private String content;   
  40.   
  41.     /** 此篇文章的总页数,默认为1页,此数字是由创建文章时根据文章的分页的多少计算得出. * */  
  42.     private int pageCount = 1;   
  43.   
  44.     /** 此字段是显示此文章当前所在的页面,默认为第1页,此字段也可作为导向下一页/上一页的相关依据 * */  
  45.     private int pageCurrentIndex = 1;   
  46.   
  47.     /**  
  48.      * 此字段是为设置删除文章所用的  
  49.      * 文章被删除有两种情况,一为此文章的类别被删除,刚此文章无法被检索到;二为此文章被删除.这里指被二种情况删除  
  50.      */  
  51.     private boolean firstDeleted = false;   
  52.   
  53.     /**  
  54.      * 此字段是为彻底删除文章所用,虽然此种情况一般不会被发生,但保留此种情况.当为此种情况时,  
  55.      * 无法以任何方式检索出此文章,仅在数据库中留有相关的记录  
  56.      */  
  57.     private boolean shiftDeleted = false;   
  58.   
  59.     /** 此文章的置顶方式,如果为空,则此文章不置顶 * */  
  60.     private ArticleTopType articleTopType;   
  61.   
  62.     /** 创建文章的作者 * */  
  63.     private User createUser;   
  64.   
  65.     /** 修改文章的作者 * */  
  66.     private User editUser;   
  67.   
  68.     /** 此文章所属的类别 * */  
  69.     private Category category;   
  70.   
  71.     /** 文章的类别链,主要用于文章的查询 * */  
  72.     private String categoryChain;   
  73.   
  74.     /** 相关的标记,主要是一些搜索关键字 * */  
  75.     private String tags;  

这里有几个问题
1,文章是否应从数据库中彻底删除
2,文章删除后是否可以被恢复
3,对于多页文章的处理(如一篇文章分成多个页面显示)
4,对于级联目录下的文章的查找(即如windows资源管理器,在一个目录下搜索此目录及所有子目录下的文章)

对于问题1,2,我设计了一个删除firstDeleted字段和一个彻底删除shiftDeleted字段,当shiftDeleted为true时,表示此文章此被彻底删除,否则当fistDeleted为true时,表示一般删除,(此类删除在管理者页面可被查出,不过有相关标志提示,并且可以管理者页面被恢复).当firstDeleted和shiftDeleted同时为false时,表示此文章是正常文章.

对于问题4,我设计了一个categoryChain的字段,此字段保存此文章的路径信息,此路径信息由文章所在当前目录者提供,第一个目录对应一个惟一的路径信息,并且同时保留了其上下目录的级联信息.此字段的get方法被改成由目录提供,因此如果目录被删除,此文章的路径信息为null,即视为无类别文章.相应get方法如下:

  1. public String getCategoryChain() {   
  2.         return category == null ? null : category.getCategoryChain();   
  3.     }  


对于问题3,我设计了文章的页码并保存在文章属性中,由pageCount和pageCurrentIndex两个属性来完成.pageCount保存此篇文章的总页数,而pageCurrentIndex保存此篇文章当前显示的页数.并且由这两个属性来进行上一页,下一页的判断.这样,当文章被用于多页显示时,每个文章对象仅保留此页的数据,当读取下一页时,再从数据库中读取文章下一页的数据.

#---------------------------
文章类别(category)

java 代码
  1. public class Category implements Serializable {   
  2.     /** 主键 **/  
  3.     private int id;   
  4.     /** 类别名字 **/  
  5.     private String name;   
  6.     /** 类别描述 **/  
  7.     private String description;   
  8.     /** 类别创建时间 **/  
  9.     private Date createDate;   
  10.     /** 创建类别的用户 **/  
  11.     @Fly_m  
  12.     private User user;   
  13.     /** 此类别下的子类别 **/  
  14.     @Fly_m  
  15.     private List<category></category> categoryList;   
  16.     /** 此类别下的文章 **/  
  17.     @Fly_m  
  18.     private List<article></article> articleList;   
  19.     /** 此类别的上一类别,当此类别为最顶层类别时,上一类别为null **/  
  20.     @Fly_m  
  21.     private Category superCategory;   
  22.     /** 此类别的类别链,此类别链依次以上级类别的id值追加'-'值组成,此类别链的目录在于查询相应类别  
  23.      * 下的文章,因为无法保证类别的级数,故由此种方式构造一个链并将其保存在类别中,并进一步保存在  
  24.      * 文章的相应字段中,以一种简单的方式进行文章的查询  
  25.      * 追加:如果此类为顶级类别,则其类别链为当前的时间,以保证类别的唯一的性.  
  26.      **/  
  27.     private String categoryChain;  
正如代码所示,类别被设计为无限级联的,并且每一级有它的上一级和它的子级目录.且每一级都可有相应级类别的文章.想要找到某一级目录下的所有文章,通常作法是对子目录的递归.不过,我作了一个小小的偷懒,即利用categoryChain文章路径,信息这一属性来登记每个目录的详细路径,再将这一路径导向该目录下文章的categoryChain属性.再由article类,可知,article的categoryChain属性由该文章的目录决定,因此,如何处理目录的categoryChain就很重要了.此处利用了数据库本身的特点like语句.详细代码如下所示:
java 代码
  1. public String getCategoryChain() {   
  2.         return categoryChain == null ? (superCategory == null ? new SimpleDateFormat("MMddHHmmssSSS-", Locale.CHINA)   
  3.                 .format(new Date()) : (superCategory.getCategoryChain() == null ? "" : superCategory   
  4.                 .getCategoryChain()) + new SimpleDateFormat("SSS",Locale.CHINA).format(new Date()) + "-") : categoryChain;   
  5.     }  

每一级目录的categoryChain被设计为父目录链,因为顶级目录root目录被设计为时间相关,再加上子级目录被设计为毫秒相关(相同目录下,在同一毫秒内创建不同目录这一可能性很小吧,这里的毫秒相关可能需要被改写),因此,保证了每一目录有惟一的路径信息.

#-------------------
文章置顶对象(articleTopType)

java 代码
  1. public class ArticleTopType {   
  2.   
  3.     /** 主键 **/  
  4.     private int id;   
  5.   
  6.     /** 此置顶方式的相关描述 **/  
  7.     private String description;   
  8.        
  9.     /** 此置顶的开始时间段,默认为当前时间 **/  
  10.     private Date startDate;   
  11.        
  12.     /** 置顶的结束时间段 **/  
  13.     private Date endDate;   
  14.   
  15.     private Article article;  

文章置顶只是简单的作了时间相关(关于文章置顶有许多方面的考虑,如何置顶,在哪儿置顶,或者置顶颜色,置顶级别等).由于模块不要求太复杂,仅作了时间置顶,在时间内置顶,超出时间则置顶消失.

#----------------

文章用户对象(user)

java 代码
  1. public class User implements Serializable {   
  2.   
  3.     private static final long serialVersionUID = -4937427658808092834L;   
  4.     private int id;   
  5.     private String name;   
  6.     private String password;   
  7.     @Fly_m  
  8.     private List<article></article> articleList;   
  9.     @Fly_m  
  10.     private List<category></category> categoryList;  

这个用户对象,只是保存了用户基本信息( 在后期,此对象可能会被其他模块改写,但不影响此处的结构工作).

 

#------------------------------------
模型设计中,重点是目录和文章对象的设计,我觉得主要是需求的复杂性决定了对象复杂性的设计.对于小型系统,一个文章对象可能就是简单的内容+标题+类别,而在一些大型的系统,需要考虑的因素就多了.这决定于系统分析师的分析能力,在不断的实践于,自己也对分析方面有了很大的进步.而模型设计,直接关系于系统的数据存储和以后相关层的设计以及以后系统的扩展能力.在这方面要多下功夫啊.

附件中是相关域模型的源代码,及hibernate的源代码注释(我把以前基于xml的配置搬到了源代码里面,使相关配置更加简单明了).
欢迎大家指点,我会改进的
下一篇把dao这层以及service这一层写上来.

分享到:
评论
4 楼 wangjian3q 2008-04-24  
你好:
    我是一个初学者 能否将你的数据库 给我一份呢?
     Email :wangjian3q@163.com
3 楼 Garriot 2007-11-19  
所有的Naive的信息发布系统差不多都是这样的,文章、参与者、审批流、权限,不外乎这几个基础模型。
2 楼 netment 2007-11-19  
感觉你这个设计有点象论坛,新闻发布系统中一个很重要的概念:文件模板你都没有建模
1 楼 ruby_tei 2007-11-17  
我不太明白单建ArticleTopType 类有什么意义。小弟是个菜鸟,还望指教。谢谢

相关推荐

    新闻发布系统设计思路(Action)

    【新闻发布系统设计思路】主要涉及了使用Action框架构建一个新闻发布平台的核心技术和设计策略。这个系统的设计目的是为了高效、稳定地发布和管理新闻内容,同时提供良好的用户体验。在本设计中,Action框架扮演着...

    新闻发布系统设计思路(Dao与service)

    本文将围绕"新闻发布系统设计思路(Dao与service)"这一主题,深入解析DAO(Data Access Object)层和服务(Service)层的设计与实现。 DAO层是数据库访问层,其主要职责是处理与数据库的交互,包括数据的读取、写入...

    新闻发布系统实现

    论文的主要工作集中在需求分析、系统设计和实现三个阶段。需求分析关注用户分类和权限设置;设计阶段则强调系统的可用性、可维护性、灵活性和可扩展性;实现阶段涉及技术选型、开发环境配置和功能测试。 基于Web的...

    新闻发布系统 课程设计(J2EE)

    6. **文档编写**:撰写《面向对象程序设计Ⅱ》课程设计说明书,详述系统设计思路、实现细节和测试结果。 在实际操作中,你可能还需要使用到开发工具(如Eclipse或IntelliJ IDEA)、版本控制系统(如Git)、构建工具...

    新闻发布系统毕业设计论文(40多页)和PPT

    这篇毕业设计论文与PPT是关于使用Struts和Hibernate框架构建动态新闻发布系统的实践项目。Struts和Hibernate是Java Web开发中的两个重要工具,它们在构建高效、可维护的Web应用程序中发挥着关键作用。 首先,Struts...

    新闻发布系统 毕业设计 毕业论文

    对于新闻发布系统,前端开发者需要设计一个清晰、友好的界面,让用户能轻松浏览和搜索新闻,同时也要实现如文章预览、评论功能等交互性元素。 **二、后端开发** 后端主要处理数据的存储、处理和响应前端请求。常见...

    新闻发布系统—MVC

    以上是对“新闻发布系统—MVC”涉及的主要技术点和设计思路的详细解释,希望对理解此类系统有所帮助。在实际开发中,还需要根据项目需求和团队技术栈选择合适的开发工具和技术栈,如Spring MVC、ASP.NET MVC、...

    牛腩老师的新闻发布系统源码

    在学习"牛腩老师的新闻发布系统"源码时,我们应重点关注以上这些核心模块,分析其设计思路和实现方式。此外,通过对比不同编程语言和框架的实现,可以深化对Web开发的理解,提升解决问题的能力。同时,跟随视频教程...

    用thinkphp开发的新闻发布系统,从前端到后端,全部源码!

    通过阅读和学习源码,可以深入了解ThinkPHP框架的运用,以及新闻发布系统的设计思路和实现细节。 总结,本文详细介绍了使用ThinkPHP开发新闻发布系统的过程,包括前端界面设计、后端功能实现、数据库设计以及框架...

    asp.net 新闻发布系统

    【ASP.NET 新闻发布系统】是一种基于微软的ASP.NET技术构建的应用程序,主要用于在线发布、管理及展示新闻内容。此系统通常包含用户管理、新闻分类、新闻发布、新闻搜索等功能,能够满足企业和组织对外传递信息的...

    asp.net课程设计--新闻发布系统

    9. **文档报告**:系统附带的文档,如"00青岛理工大学新闻发布系统-陆瑜-200507003.doc",可能包含了系统的设计思路、架构分析、功能实现细节以及测试报告,对于学习和理解系统开发过程非常有帮助。 10. **版本控制...

    5款新闻发布系统(JSP+JAVA源代码)

    【新闻发布的系统设计】 在IT行业中,新闻发布系统是一种常见的应用,主要用于管理和发布各类新闻、公告等内容。这里的"5款新闻发布系统(JSP+JAVA源代码)"提供了一种学习和实践的机会,让我们深入理解基于JSP和...

    新闻发布系统

    此外,响应式设计也是现代新闻发布系统的一个重要特点,确保系统在不同设备上都能良好运行,满足移动互联网时代的阅读需求。 新闻的管理功能包括增加、删除、更改和查询。增加新闻指的是新增一条新闻记录,系统需要...

    新闻发布系统(界面+代码+文档)

    总的来说,这个“新闻发布系统(界面+代码+文档)”项目涵盖了完整的Web开发流程,从需求分析到系统设计,再到代码实现和测试,为我们提供了一个学习和研究Java Web开发的实践案例。通过深入研究这些资源,我们可以...

Global site tag (gtag.js) - Google Analytics