目 录
1 概述
1.1 论坛简介
信息社会的今天,网络给我们带来了很大的方便,我们可以通过网络查询自己需要的信息,网络是跨国界的,我们在网络中做什么事都很轻松,不像在现实生活中样考虑很多的因数,如语言是否相通,是否是认识的朋友等等。随着网络的诞生,人们在信息交流多种多样,如:QQ、UC,邮箱等。其中论坛的出现让人们在交流和探讨上打破了空间,时间的限制,实现了多样化交流,和共享。
1.2 论坛的概念
论坛又名BBS,全称为Bulletin Board System(电子公告板)或者Bulletin Board Service(公告板服务)。是Internet上的一种电子信息服务系统。它提供一块公共电子白板,每个用户都可以在上面书写,可发布信息或提出看法。它是一种交互性强,内容丰富而即使的Internet电子信息服务系统。用户在BBS站点上可以获得各种信息服务,发布信息,进行讨论,聊天等等。像日常生活中的黑板报一样,论坛按不同的主题分为许多版块,版面的设立依据是大多数拥护的要求和喜好,用户可以阅读别人关于某个主题的看法,也可以将自己的想法毫无保留地帖到论坛中。一般来说,论坛也提供邮件功能,如果需要私下的交流,也可以将想说的话直接发到某个人的电子信箱中。
1.3 论坛的意义
您可以浏览论坛,注册登录后可以发布主题,或回复他人的帖子,交流探讨,交朋识友。在论坛里,人们之间的交流打破了空间,时间的限制。在与别人进行交往时,无须考虑自身的年龄,学历,知识,社会地位,财富,外貌,健康状况,也无从知道交谈的对方的真实社会身份。这样,参与讨论的人可以处于一个平等的位置与其他人进行任何问题的探讨。论坛往往是由一些有志于此道的爱好者建立,对所有人都免费开放。而且,由于BBS的参与人众多,因此各方面的话题都不乏热心者。我们当然可以利用它来解决学习中的一些疑惑,也可以把自己的心事吐露出来 。
1.4 理想论坛
做论坛切记不要贪心,弄得五花八门,到头来一片混乱,抓不着半点头绪。给论坛的性质定位是很重要的,是文学论坛,娱乐论坛还是综合性的,从一开始就要把角色摆正。例如做文学论坛,就要以文学为主,配上几个娱乐灌水的地方让大家轻松一下,分清主次,千万不要喧宾夺主。 专一不等于单调,只是主题明确的意思。如果一个论坛既想做成音乐的,又想做成文学的,到头来只能是不伦不类。风格简约不容忽视,别以为越花哨越吸引人,其实简单明了干净清新的论坛才更吸引人。不要因为分版不受数量的限制,就肆意的加出很多版块来,这样做的结果只能是让大家哪一个也不想去。
版面的书写要有层次,有条理。先将一个论坛划分成几个大的区域,再把大区域分成小的版面,尽量不要在版中再增加分版,那样看起来很乱,也会令发帖的用户无所适从。注意大区的摆放次序,一定要把有自己论坛特色的版块摆在最上面;接着是论坛属性区域,比如文学论坛,此处就摆放文学原创区;再下面是灌水聊天的区域,这样的版块通常人气比较旺,摆在中间可以抑制水贴的过度泛滥;最后才是站务管理区域。在每个区域中,各个版面的摆放顺序也有一定的规则,通常将最有代表性,最热门的版面放在第一个。 总之,好的论坛给人的第一印象是“眼前一亮”,而不能是一片迷雾。
这是最重要的一点。网上的论坛何止千万,拷贝别人的一点意义也没有。在做一个论坛之前,你就要有这样的心理准备——我要造出一片世界上没有的叶子来。 你要调出自己的颜色来,至少首页的颜色不能给人似曾相识的感觉。颜色要贴和你的论坛主题,或柔和,或另类,或温馨,或激烈。必须说明的是,提倡自己的风格,并非提倡处处异类。试想,你偏要用大号华文琥珀的字体去书写论坛,或者最小号的细黑,那只能让你的会员眩晕之后再去看眼科了。如果技术支持的话,最好能做出一两样别的论坛没有的东西来。
一定要在论坛发布前制订出一套可行的发展方案及管理规则来。俗话说,无规矩不成方圆。如果一起步就乱了步伐,那以后还怎么走下去?要习惯给自己定目标,无论是爱好论坛还是商业论坛都希望做好,让更多的人认同,所以总要知道自己希望达到一个什么样的目标,这样才有动力向前。另外, 论坛的发贴规则要由管理员或者版主亲自制订,在以后的发展中不断改进。首先要有一个总纲,而每个版块都要有一个发贴需知,对发在该版块内的帖子有什么要求和奖惩制度都要说清楚,并且固定,以便陆续前来的新人能一目了然。
在不影响速度和技术支持的情况下,尽量让论坛丰富多采。可以有相应的社区服务,诸如银行、医院、学校、法庭、监狱、赌场等;可以有一些在线小游戏,诸如赛马、五子棋、找不同等;可以给版主定期发工资和奖金,当然都是虚拟货币;可以举行一些定期的选举,选出论坛的最受欢迎会员;可以配备语音、视频聊天室,外挂留言版、电影院等等。当然,此消彼长,用一部分资源提供完善的服务,就要在别的地方节约资源,可以关闭上传文件的功能,关闭随机广告和一些不必要的信息。
总而言之,要做好个好的论坛就得用心,因为用心才是果实的种子。
1.5 如何入手做自己的论坛
在了解了以上论坛的相关知识后,是否想做个只属于自己的论坛呢?
做一个论坛需要注意以下几点:
你开发软件是为了供别人使用,没有人使用的软件只是没有意义的数据的集合而已。显然,构件(components),EJB(Enterprise Java Beans)和代理(agent)是很有趣的东西。但是对于用户来说,如果你设计的软件很难使用或者不能满足他们的需求,后台用再好的技术也于事无补。多花点时间到软件需求和设计一个使用户能很容易理解的界面上。没有任何需求,你就不要动手开发任何软件。成功的软件取决于时间(在用户要求的时间内完成)、预算是否满足用户的需求。如果你不能确切知道用户需要的是什么,或者软件的需求定义,那么工程注定会失败。因此,需求是我们软件设计中最重要的一环。
我们在做项目之前首先得考虑我们自身的条件
(1) 我们是否有时间。对于大多人来说,要想在一两个小时以至于一天两天内完成个好软件设计,显然是不可能,所以我们在某件事时,首先得考虑时间是否允许。
(2) 结果是否有意义。1.5.3 技术实现
空想并不等于现实,做任何事之前我们首先得认识自己,就做论坛来说,我们就得考虑,我们是否用做论坛的技术,我们是用.NET做呢,还是用JAVA做。
做任何事都很难一次性做好的。要想有个好的结果就得根据发展而改变,在认识自己的前提下还得考虑所做的东西是否符合现在的需求,要想让自己设计的软件不被淘汰我们就得做必要的改进。
2 开发工具和使用技术简介
2.1 开发工具简介
2.1.1 Eclipse ,Myeclipse
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。
简单而言,MyEclipse是Eclipse的插件,也是一款功能强大的J2EE集成开发环境,支持代码编写、配置、测试以及除错。
2.1.2 SQL Server 2000
SQL Server 2000 是Microsoft 公司2000年推出的SQL Server 数据库管理系统的版本。它是一个杰出的数据库平台,可用于大型联机事务处理、数据仓库、以及电子商务等。
2.1.3 Dreamweaver
Macromedia公司出品的所见即所得式网页编辑器,用于网页开发和网站管理的专业化设计工具,它采用了多种新技术,具有设计和开发网站过程中需要的网站管理、网站设计、页面制作、多媒体制作和动画制作等丰富实用的功能;它具有友好的操作界面,在文档窗口中可以打开各种浮动面板,同时还可以使用系统内置的多种对象进行操作。Dreamweaver 3.0对一些新的技术如DHTML,JAVA也有了更好的支持。灵活的运用Dreamweave的各项功能,我们能创造出令人眼花缭乱的动态网页。
2.1.4 Tomcat
Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和Jsp规范总能在Tomcat中得到体现。Tomcat也可以与其它一些软件集成起来实现更多的功能,是开发WEB工程的服务器。
2.2 开发技术简介
MVC模式最早是smalltalk语言研究团提出的,应用于用户交互应用程序中,MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器",即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。MVC应用程序总是由这三个部分组成。模型、视图、控制器三者之间的关系和各自的主要功能,如图1所示。
图1 MVC组件类型的关系和功能
Struts最早是作为Apache Jakarta项目的组成部分问世运作。项目的创立者希望通过对该项目的研究,改进和提高Java Server Pages、Servlet、标签库以及面向对象的技术水准。Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件。Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Strut的工作原理,如图2所示:
图2 Struts工作流程图
- Hibernate
Hibernate是目前最流行的开源对象关系映射(ORM)框架 。Hibernate采用底侵入式的设计,完全采用 普通的Java对象(POJO),而不必继承Hibernate的某个超类或实现Hibernate的某个接口,而Hibernate是面向对象的程序设计语言和关系数据库之间的桥梁,所以Hibernate允许程序开发者采用面向对象的方式来操作关系数据库。Hibernate是在JDBC之上提供一层薄薄的封装,在提供完全透明的持久化机制的同时又提供尽可能多的灵活性
- Spring
Spring为企业应用的开发提供一个轻量级的解决方案。该解决方案包括:基于依赖注入的核心机制,基于AOP的声明式事务处理与多种持久层技术的整合,以及优秀的MVC框架等。Spring为J2EE应用表现的表现层,业务逻辑层几数据持久层都提供了极好的解决方案,因为Spring提供的不仅仅是一种框架,而且提供了一种企业应用的开发规范。Spring是实际开发的抽象,其提供的“模板设计”大大简化了应用的开发,支持POJO的管理,能将J2EE应用各层的对象焊接在一起,甚至这些对象无须是标准的JavaBean。
3 具体实现设计
3.1 论坛功能简介
根据论坛的实际需求,可设计如下流程图(如图3)
论坛实现流程图:
图3 系统流程图
分析流程图可得论坛的基本功能如(表1)
表1 基本功能表
论坛板块列表 | 浏览帖子 | 发帖回帖 | 编辑帖子 |
删除帖子 | 用户注册 | 用户登录 | 控制用户权限 |
修改注册信息 | 管理板块 | 管理用户 | 管理主贴 |
论坛一般存在两种用户,分别为注册用户(普通,vip,管理员)和超级管理员。用户的权限是向下覆盖的,即上级权限包含下级权限,在这里的论坛中,管理员的权限是上级权限。接下来,需要归好类的对象及其方法分配给不同的论坛用户。具体功能的分配结果如表2所示。
表2 论坛功能和用户权限对应表
对象实体 | 功能方法 | 用户类型 |
板块 | 创建板块 | 管理员 |
修改板块 | 管理员 | |
删除板块 | 管理员 | |
帖子 | 浏览列表 | 注册用户/游客 |
查看帖子 | 注册用户/游客 | |
发帖 | 注册用户 | |
回帖 | 注册用户 | |
编辑(自己所有) | 注册用户 | |
编辑(全部) | 管理员 | |
删除 | 管理员 | |
用户 | 注册 | 非注册用户 |
注册用户登录 | 注册用户 | |
管理员登录 | 管理员 | |
添加 | 管理员 | |
删除 | 管理员 | |
设定权限 | 管理员 |
续表2 论坛功能和用户权限对应表
3.2 数据库表设计
表3 NEWS_TYPE表
名称 | 类型 | 说明 |
CATEGORY_ID | varchar | 分类编号,主键 |
CATEGORY_NAME | Varchar | 分类名称 |
表4 NEWS表
名称 | 类型 | 说明 |
NEWS_ID | Varchar | 消息板块id 主键 |
NEWS_TITLE | Varchar | 归属那一大类 |
NEWS_CONTENT | Varchar | 板块内容 |
NEWS_POSTER | Varchar | 发帖人 |
NEWS_POSTERDATE | Varchar | 发帖时间 |
NEWS_LASTMODIFYDATE | Varchar | 修改时间 |
CATEGORY_ID | Varchar | 大类ID |
SORT_ID | Int | 排序 |
SECURITY_LEVEL | Varchar | 权限 |
表5 USERS表
名称 | 类型 | 说明 |
USERS_ID | Varchar | 用户id 主键 |
USERS_NAME | Varchar | 用户名 |
PASSWORD | Varchar | 用户密码 |
ROLE_ID | Varchar | 权限 |
USER_STATE | Varchar | 用户状态 |
表6 NEWS_REPLAY表
名称 | 类型 | 说明 |
RE_ID | Varchar | 回帖ID |
RE_TITLE | Varchar | 标题 |
RE_CONTENT | Varchar | 内容 |
RE_POSTER | Varchar | 作者 |
RE_POSTERDATE | Varchar | 回帖时间 |
RE_LASTMODIFYDATE | Varchar | 最后修改时间 |
NEWS_ID | Varchar | 主帖ID |
SORT_ID | Varchar | 排序ID |
SECURITY_LEVEL | Varchar | 所属权限 |
续表6 NEWS_REPLAY表
表7 ROLES表
名称 | 类型 | 说明 |
ROLE_ID | Varchar | 权限ID |
ROLE_NAME | Varchar | 权限名 |
SECURITY_LEVEL | Varchar | 权限等级 |
表之间的关系如图4
3.3 分块设计
3.3.1 权限设计
对访问论坛的人采取了权限管理机制,其中超级管理员用有一切权利(如图5)
图5 管理员功能图
注册用户分为三种 普通用户、管理员、VIP用户 (如图6)
图6 用户分类图
3.3.2 登陆设计
登陆分为管理员登陆和注册登陆 (如图7)用类NameExamine对用户名进行验证
图7 登陆设计图
3.3.3 帖区设计
显示用户信息包括用户名,等级,发表时间,最后修改时间等。帖区显示已有帖子和用户的身份,注册用户可回复(如图8)
图8 帖区设计图
功能设计(如图9)
帖区需要的主要功能为 布局、颜色搭配、向后台发送请求、得到响应、显示结果
图9 帖区功能总汇图
3.3.4 安全性设置
对数据库进行加密,也就是在用户注册的时候,先写一个类对密码项进行处理后再存入数据库中,这样就算别人看到了后台的数据也看不到用户密码。本系统对用户密码采用MD5技术。
3.3.5 资料共享设计
支持注册用户上传资料,下载资料。本功能采用Struts 框架的文件上传技术。
3.3.6 性能设计
采用异步提交与用户交互。
3.4总体设计
要完成以上功能,我们可以选择C/S 或B/S结构,这这里我选择B/S结构(如图10)
图10 B/S结构图
本论坛系统采用三层架分为 视图层,控制层,模型层 就是前一章节的MVC模式,视图层:采用JSP+HTML。
图11 系统架构图
- 用struts 实现代码分层是MVC具体实现
WEB应用都是请求-响应的程序结构。程序是从客户端Client发出HTTP请求开始的,客户段请求被ActionServlet拦截,要求控制逻辑处理的请求,调用对应的Action,将请求转发到Action,此时Action 将无须从HTTP Request中获取请求参数,而是从Actionform中获取参数后,调用模型对象处理用户请求,最后将处理结果包装成ActionForward,返回到客户端,显示结果。如:用户登陆过程(如图12):
提交
响应
图12 Struts运行流程图
- 用hibernate 持久层封装了JDBC 和数据库连接(如图13)
图13 Hibernate系统配置图
配置XML文件把数据库的表映射成一个类,表字段映射成类的属性:如用户表的XML文件可配置为:
<hibernate-mapping>
<class name="org.bbs.model.Users" table="USERS" schema="dbo" catalog="BBS">
<id name="userId" type="java.lang.String">
<column name="USER_ID" length="30" />
<generator class="assigned" />
</id>
<many-to-one name="roles" class="org.bbs.model.Roles" fetch="select" lazy="false">
<column name="ROLE_ID" length="30" not-null="true" />
</many-to-one>
<property name="userName" type="java.lang.String">
<column name="USER_NAME" length="30" not-null="true" />
</property>
……
</class>
</hibernate-mapping>
映射成的类为:
package org.bbs.model;
import java.util.HashSet;
import java.util.Set;
/**
* Users generated by MyEclipse Persistence Tools
*/
public class Users implements java.io.Serializable
{
// Fields
private String userId; //用户ID
private Roles roles; //用户权限
。。。。。。
/** default constructor */
public Users()
{
}
// Property accessors
public String getUserId() //获取用户ID
{
return this.userId;
}
public void setUserId(String userId)//设置用户ID
{
this.userId = userId;
}
public Roles getRoles() //获取权限
{
return this.roles;
}
……
}
4 效果展示和部分代码
4.1 效果图
论坛首页:
14 论坛首页
论坛登陆
图15 论坛登陆图
帖子区:
图16 回复区图
后台管理区:
图17 后台管理员登陆图
4.2代码
回帖
/**
* 此类实现功能:把回复的内容 存入数据库
*
*/
package org.bbs.struts.action;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.bbs.base.BaseAction;
import org.bbs.model.News;
import org.bbs.model.NewsReplay;
import org.bbs.model.Roles;
import org.bbs.model.Users;
import org.bbs.util.IdController;
public class AddNewsReplayAction extends BaseAction
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception
{
IdController id = new IdController(); //定义了一个IdController类,用来生成ID
Date nowtime = new Date();
SimpleDateFormat HMFromat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
String displayNowTime = HMFromat.format(nowtime);// 获取当前时间
String userId = request.getParameter("user_id");
String newsId = request.getParameter("news_id");
String roleId = request.getParameter("role_id");
request.setAttribute("userId", userId);
request.setAttribute("newsId", newsId);
request.setAttribute("roleId", roleId);
String newsReplTitle = (request.getParameter("newsrepl_title")).trim();
String newsReplContent = (request.getParameter("newsrepl_content"))
.trim();
if (newsReplTitle != null || !newsReplTitle.equals("")
&& newsReplContent != null || !newsReplContent.equals(""))
{
News news = new News();
news.setNewsId(newsId);// 原贴Id
Roles roles = new Roles();
roles.setRoleId(roleId);// 权限ID
Users users = new Users();
users.setUserId(userId);
NewsReplay newsReplay = new NewsReplay();
newsReplay.setReId(id.getId());// 回复序列号
newsReplay.setReTitle(newsReplTitle);// 回复标题
newsReplay.setReContent(newsReplContent);// 回复内容
newsReplay.setRePosterdate(displayNowTime);// 回复时间
newsReplay.setReLastmodifydate(displayNowTime);// 最后回复时间
newsReplay.setUsers(users);// 回复用户ID
newsReplay.setNews(news);// 发贴ID
newsReplay.setRoles(roles);// 回复权限
newsReplay.setSortId(33333);// 排序ID
newsReplay=getNewsReplayDomain().insert(newsReplay);
}
return mapping.findForward("newsinfo"); //转发到newsinfo
}
}
此类 用来发表主帖:
package org.bbs.struts.action;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.bbs.base.BaseAction;
import org.bbs.model.News;
import org.bbs.model.NewsType;
import org.bbs.model.Roles;
import org.bbs.model.Users;
import org.bbs.util.IdController;
public class AddNewsAction extends BaseAction
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception
{
IdController id=new IdController();//定义了一个IdController类,用来生成ID
Date nowtime=new Date();
SimpleDateFormat HMFromat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
String displayNowTime = HMFromat.format(nowtime);//获取当前时间
Users users=new Users();
News news=new News();
Roles roles=new Roles();
NewsType newsType=new NewsType();
String userId= request.getParameter("user_id");//从页面上获取用户ID
String categoryId=request.getParameter("category_id");//从页面上获取论坛模块分类ID
String newsTitle = request.getParameter("news_title");//从页面上获取主贴标题
String newsContent =request.getParameter("news_content");//从页面上获取主贴内容
users.setUserId(userId);//发贴人ID
roles.setSecurityLevel("5");//权限级别
newsType.setCategoryId(categoryId);//消息类别
roles.setRoleId("5");
news.setNewsId(id.getId());//消息ID
news.setNewsTitle(newsTitle);//贴子标题
news.setNewsContent(newsContent);//贴子内容
news.setNewsPosterdate(displayNowTime);//发贴时间
news.setNewsLastmodifydate(displayNowTime);//最后修改时间
news.setUsers(users);
news.setRoles(roles);
news.setNewsType(newsType);
news.setSortId(222);//排序ID
news=getNewsDomain().insert(news);//调用NewsDomain中的insert方法,添加主贴
return mapping.findForward("submitsucc"); //转发到提交成功页面
}
}