留言,是博客系统的一个模块。当别人访问到自己的博客主页时,别人可选择查阅你的博客,可以给你博客评论,也可以给你发表留言。
要设计这个留言,就必须现有数据库。起初我们的数据库的设计是这样的。
留言表1:
可以看出,这个留言表还是很有问题的:
1、第一个问题。这几个属性中的id、word_title、word_content、word_sdTime都应该没什么问题,都是一个留言表中必须的。有问题的是word_author,留言的作者,留言的作者应该是其它用户,这里采用的是字符,就是说写的是作者名字。这个作者名字,就是用户表的master_name。
用户表:
我们的留言表就是通过word_author和用户表关联起来的。其实,这个word_author也是可以用word_authorID的。word_authroID就是用户表中的id,我们把这两个表通过这个id联系起来,这也是比较好一点的做法。
2、第二个问题就是,既然说留言了,那么我们的留言表的功能也太简单了,互动性不强,别人光给你留言,但是你却不能对这个留言说点什么。所以,我们这留言应该要有个回复的功能。但是这个表却无法支持我们的回复的功能。
策略1、当初我们考虑的是,在留言表里面加一个pid,这个pid就是表示回复的那一条留言的id。这样我们的结构就像下面这样:
这只是思考的一个策略。
策略2、后来又想想,我也可以加一个新表,用这个新表映射留言和回复的关系,新表有两个字段,一个是id,一个是pid,表示id是给pid的回复。然后原来的留言表就不用变动了。
后面想想,加多一个表,感觉多此一举呀。直接在留言表上加一个pid就简洁多了。
当我们写jsp的时候,把与当前登录的用户的留言表相关的数据查询出来后,我们要怎么组织这个留言,让其一条一条地显示出来,符合上下文逻辑呢。
由于我们的查出来的数据是按照时间排序的,所以应该不符合上下文逻辑。如果直接按照时间的顺序排列,那就看不出这一条回复是回复那一条留言的了。正因为有这个问题,我们就在查询出来之后,对这些数据进行重新排列,把回复放到留言下面。
不过后面还是没有用策略1的做法,到底为什么没用这就要说到第三个问题了。
3、第三个问题,我们有没有发现,这个留言表还缺了一个重要的东西,我们光有留言作者,但是我们没有留言的对象。我们这个留言到底是给谁的呀,因为在这个表中只有author,没有master,即留言的对象。不仅如此,有些其它表也有这个重大的失误。
所以后面我们又大改了一次数据库。
这个留言表的最终设计是这样子的。
策略3、前面我们也说了,原来的表中只有author,没有master,所以我们把master加了进去。我们加了word_authorID和word_masterID并把这两个设置为外键。
乍一看,这个表感觉还缺什么,没有pid,我们怎么处理回复问题?
后面想想,其实设计成这样,我们就不用加pid了,我们家pid不就是为了使我们显示留言或回复时,能够上下文衔接吗。
当一个用户登录时,那么它就是当前用户,设当前用户的id是x。当我们查询到与当前用户相关的留言数据后,我们的到的是要么word_authorID等于x的留言数据,要么word_masterID等于x的留言数据。就是说我们得到的数据是谁对x留言的数据,或x对谁留言的数据。
由于word_authorID和word_masterID其中肯定有一个,而且只有一个,是等于x的。我们何不用等于x那个来对这些数据进行分类,把相同的归为一类,然后同一类的按照时间进行排序,这样上下文顺序也就得出来了。最后我们只需要按照类别,按照排好的顺显示出来就ok了。
具体的代码如下实现:
先是replylist的产生
String URL=session.getAttribute("url").toString(); List< WordBean> wordList=(List<WordBean>)request.getAttribute("wordList"); //通过获取request里面的wordList参数,即可获得与当前用户相关的留言表的所有结果 LinkedList<WordBean> replyList=new LinkedList<WordBean>(); //用了存储把wordlist留言表按照类别,按照排好的顺序的数据排好的list, //即我们最终要在网页上显示的是replyList MasterBean masterBean = (MasterBean) session.getAttribute("masterBean"); //获取当前用户的所有信息 int id = masterBean.getId(); //获取当前用户的id int replyID = 0; for (int i = 0; i < wordList.size(); i++) { WordBean wordBean = wordList.get(i); int masterID = wordBean.getMasterID();//获取这条留言的被留言者的id int authorID = wordBean.getAuthorID();//获取这条留言的留言作者的id if (masterID == id) {//通过与当前用户的id比较 replyID = authorID; //若是masterID等于当前用户id, //那么authorID就是非当前用户的id,即留言作者的id //当前用户是被留言者 } else { replyID = masterID; //或是authorID等于当前用户id, //那么masterID就是非当前用户的id,即被留言者的id //当前用户是留言者 } //若这是留言表的第一条信息,就直接加入到回复队列里面 if (replyList.size() == 0) { replyList.add(wordBean); } else { //对接下来留言进行判断,符合条件的就加入到replyList中 int temp; for (temp = 0; temp < replyList.size(); temp++) { WordBean replyBean = replyList.get(temp); //找到插入的位置,找到后,退出循环 if (replyBean.getAuthorID() == replyID || replyBean.getMasterID() == replyID) { //比较,找到与replyID相等的,则是同一类的,找到后,退出循环 break; } } replyList.add(temp, wordBean); //找到了第一个replyID与AuthorID或MasterID相等的那 //一条数据的位置,然后在这个位置上插入这一条数据, //这样同一类的都会放在相邻的位置,因为这些数据本来 //也是按照时间的顺序来排好的,所以不需要再对其按照 //时间又排一次,我们只需要找到位置,然后不断插入就 //可以了。 //而且若是找不到与replyID与AuthorID或MasterID相等的 //数据,那么直到循环到temp等于replyList.size时,就会 //退出,然后在这个temp上插入,表示找不到与replyID与 //AuthorID或MasterID相等的数据,则在最后的位置插入。 } }
然后我们的replylist的排列大概是这样(若m是自己的id,a,b,c是其它人的id):
a对m:####(这表示对话内容)
m对a:###
a对m:#####
b对m:######
m对b:###
c对m:##
m对c:####
c对m:######
我们的replylist按照m和a对话、m和b对话、m和c对话分成了三类,然后同类的放在相邻的位置。
我们看到红色的字,这些就是m和a、m和b、m和c对话的第一句话,我们的第一句话一般就是对话的开端,后面的都是回复,所以我们的代码这样处理。
<table> <%if(replyList.size()==0){ %> <tr> <td>该文章暂时还没有留言!!!</td> </tr> <%}else{ int j; //显示留言列表 for(int k=0;k<replyList.size();k=j){ //前面的那个对话已经把其内容输出完后, //k直接从j开始,找出下一个对话的第一条留言 WordBean wordBean=replyList.get(k); //先找出当前对话的第一条留言,这个就是对话的开端,即k位置 %> <tr> <td>留言作者:</td> <td><input value="<%=wordBean.getAuthorID()%>"></td> </tr> <tr> <td>留言标题:</td> <td><input value="<%=wordBean.getWordTitle()%>"></td> </tr> <tr> <td>留言内容:</td> <td> <input value="<%=wordBean.getWordContent()%>"> </td> </tr> <tr> <td>留言时间</td> <td><input value="<%=wordBean.getWordSdTime()%>"></td> </tr> <tr> <td>留言回复</td> <td> <%for(j=k+1;j<replyList.size();j++){ WordBean reply=replyList.get(j); if((reply.getAuthorID()==wordBean.getMasterID() && reply.getMasterID()==wordBean.getAuthorID()) ||(reply.getAuthorID()==wordBean.getAuthorID() && reply.getMasterID()==wordBean.getMasterID())){ //这里做一个判断,判断一下k位置以后的那些数据, //是不是也是和k位置那一条数据一样,也是同一类的数据, //即同一个对话的数据,若是,那么则输出 %> <table> <tr> <td>回复标题:</td><td><%=reply.getWordTitle()%></td> </tr> <tr> <td><%=reply.getAuthorID() %>回复:</td><td><%=reply.getMasterID() %></td> </tr> <tr> <td>回复时间:</td><td><%=reply.getWordSdTime() %></td> </tr> <tr> <td>回复内容:</td><td><%=reply.getWordContent() %></td> </tr> <tr> <td background="<%=URL %>/images/front/line.jpg" colspan="4"></td> </tr> </table> <%}else{ break;//若不是,那么退出循环 } } %> </td> </tr> <tr> <td colspan="4"> <a href="<%=URL%>/WordAction.action?action=reply&id=<%=wordBean.getId()%>">回复留言</a> </td> </tr> <tr> <td colspan="4"> <a href="<%=URL%>/WordAction.action?action=delete&id=<%=wordBean.getId()%>">删除留言</a> </td> </tr> <tr> <td background="<%=URL%>/images/front/line.jpg" colspan="4"></td> </tr> <%} } %> </table>
相关推荐
在这个博客系统中,Apache配置文件(如httpd.conf)需要正确设置以支持PHP模块运行,并且可能需要配置虚拟主机来托管博客应用。 **4. 博客留言系统功能实现** - **用户注册与登录**:用户可以注册新账号,输入的...
5. **留言互动**:留言板是博客系统的核心部分,它鼓励访客留下他们的反馈、建议或问题。博主可以查看所有留言,选择回复或删除,与访客进行互动,增强社区氛围。留言系统通常还包括了防止垃圾留言的机制,如验证码...
在设计一个网上留言管理博客系统时,首先需要考虑的是用户界面的友好性和易用性。前端界面通常由HTML、CSS和JavaScript构建,它们共同决定了页面的布局、样式和交互功能。HTML负责内容结构,CSS控制视觉呈现,而...
"个人博客系统分析设计说明" 本资源为个人博客系统分析设计说明书,旨在设计和实现一个建议的个人博客系统。该系统包括前台页面和后台管理两个部分,前台页面提供了日志、相册、博客个人资料、留言板的浏览和发表...
博客系统的设计与实现是一个综合性的IT项目,涵盖了前端用户界面设计、后端服务器处理以及数据库管理等多个方面。在这个系统中,我们主要关注以下几个关键知识点: 1. **注册、登录与注销**:这是任何Web应用程序的...
在本项目中,我们旨在构建一个简易版本的博客系统,主要关注页面设计方面。这个系统包含四个关键页面:博客列表页、博客正文页、博客登录页以及博客编辑页。这四个页面构成了博客系统的基本功能,使得用户能够查看、...
这个是本人在学习web应用开发过程中记录,并加入自己的设计思想,其中的技术包括oracle数据库的访问、查询、增加、修改、删除,web页面的分页技术,web系统登录的权限控制技术,单一用户登录控制技术等,但是遗憾的...
【博客系统设计】 博客系统是一种在线平台,允许用户创建个人空间,分享文章、图片和观点。这个课程设计项目旨在构建一个包含管理员管理功能和普通会员功能的博客平台。以下是系统的关键组成部分及其详细说明: 1....
(a) 博客管理系统的介绍 4 (b) 可行性分析 5 1.4 相关技术介绍 5 1.4.1 Java语言 5 1.4.2 Flex 6 1.4.3 Spring 8 1.4.4 Hibernate 9 1.4.5 MySQL 9 1.4.6 MVC 10 2 系统分析 12 2.1 系统目标 12 2.2 系统概述及功能...
在博客系统中,SQL语句用于操作文章信息、文章分类、用户信息、相册、好友和留言等数据。 系统的主要功能包括: 1. **用户登录**:用户通过输入用户名和密码进行身份验证,JSP页面负责接收并验证这些信息,确保...
"基于J2EE框架的个人博客系统项目毕业设计论文" 本文是基于J2EE框架的个人博客系统项目毕业设计论文的知识点总结。 一、Web 2.0 和博客的概念 * Web 2.0 是一类新的互联网应用的总称,是一次从核心内容到外部应用...
4.7 博客系统管理前台(SRS-SYS-Manager-Front) 28 4.7.1.1 最近更新 ( SRS-SYS-Manager-Front-Index) 28 4.7.1.2 博客 ( SRS-SYS-Manager-Front-Myblog) 29 4.7.1.3 登录(SRS-SYS-Manager-Front-Login) 29 4.7.1.4 ...
博客管理系统设计文档旨在提供一个简单易用的平台,让初学者能够理解和构建一个完整的博客系统。这个系统由多个模块组成,涵盖了从用户交互到后台管理的各个方面。 首先,系统实现环境选择了Visual Studio 2005和...
jsp个人博客系统设计报告 jsp个人博客系统是基于Java Server Pages(JSP)技术的个人博客系统,旨在提供一个简单、实用的博客平台。下面是该系统的设计报告,涵盖了需求分析、总体设计、详细设计与代码实现、系统...
项目博客系统,实现了系统登录注册功能,实现了博客的浏览,发布,编辑,评论,留言功能,实现了个人博客管理,系统博客管理功能。项目前端使用html,css编写静态页面,使用javascript,ajax实现页面动态效果,后端...
该在线博客系统服务器端如果需要布置到其他主机上,则该主机必备条件如下: 1. 服务器端操作系统:独立于操作系统的跨平台系统,客户端MicroSoft Windows 2000及以上; 2. 数据库:MySQL 5.0.27版本; 3. Web...
在博客系统中,SQL Server 2005负责存储用户信息、文章内容、评论等数据,并提供高效的查询和事务处理能力。 3. **数据库设计**:数据库文件是系统的重要组成部分,通常包含用户表(存储用户名、密码、邮箱等)、...