资源描述
课程设计/生产实习报告
学 校:XX大学 系 别:XXXXXX
班 级:XXXXXXXXXXXXXXX 指导老师:XXX
小组成员:XXX
摘要
BBS论坛系统是采用java语言进行设计实现的,采用Tomcat作为后台服务器,以SQL Server作为数据服务器,使用接口、实现类、实体类、JSP进行逻辑控制,表现层用JSP页面显示,用于在网络上为网民提供一个信息发布、获取的场所。实现了查看、发表、删除帖子功能,论坛帖子版块控制,注册用户可以修改自己的个人信息、增加好友与黑名单,管理员可以对用户、帖子,版块、版块权限和用户组权限进行管理。论文从问题的提出、基本设计思想、数据的流向到具体的设计过程都做出了详细论述。
1系统总体设计
1.1 系统框架/结构
1.2 设计开发的技术路线
过程包括:
(1)脚本编写
后台管理模块
BBS系统功能模块
前台显示模块
图3-1 BBS系统功能模块图
BBS系统分为前台和后台两个模块。系统的功能模块图如图3-1所示。
前台模块的使用对象包括了所有用户(管理员、用户、游客),提供的功能包括注册帐号、用户登录、用户注销、浏览文章、发表新主题、回复主题、修改个人信息。如图3-2所示。
后台模块的使用对象为管理人员(版主、管理员、超级管理员),提供的功能包括管理用户、管理版块、管理主题、管理用户组、功能权限管理、版块权限管理。后台功能模块如图3-3所示。
(2)数据库与程序设计,根据需要利用相关开发技术使用数据库完成模块的功能设计。
本系统采用的工具有JDK 1.5、Tomcat 6.0、MyEclipse 8.5、SQL Server2005,使用的技术有Java、JSP、JavaScript、JDBC等。
(1) Java语言概述
Java编程语言是一种通用、并发、基于类且面向对象的语言。Java编程语言与C和C++相关,但是在组织方式上有差别,Java具有C和C++遗漏的许多优点,同时兼有其他语言包括的一些思想。它旨在成为一种生产语言,而不是一种研究语言,并且正是如此[7]。
(2) JSP技术概述
JSP (Java Server Pages)是由Sun 公司倡导,许多公司参与,共同建立人一种动态网页技术标准,JSP技术是在Servlet技术基础上发展起来的。它正在飞速发展中,现在已经成为Java服务器编程的重要组成部分。
(3) JavaScript技术概述
JavaScript是一种基于对象(Object)和事件驱动(Event Driver)并具有安全性能的脚本语言,它所能提供的功能非常强大。
JavaScript是一种简洁的面向对象的描述语言,是专门用来开发Internet客户端和服务器端的应用程序,它可以被轻易的嵌入到HTML文件中,使用JavaScript浏览器可以回应使用者的需求事件而不用通过网络来回传资料,这样,使用者的资料就可以直接被客户端应用程序所处理,它的出现弥补了HTML语言的缺陷,它是Java与HTML折衷的选择[9]
(3)页面(界面)设计与编程。
系统采用JDBC架构,数据库采用SQLServer,其连接数据库的关键代码:
1.static{
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
.2.public ResultSet query(String sql,String[] args){
try {
conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;database=bbs","sa","123456");
pstmt = conn.prepareStatement(sql);
if(null != args)
for(int i=0;i<args.length;i++)
pstmt.setString(i+1, args[i]);
return pstmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
3.public void closed(ResultSet rs){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt != null){
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
if(!conn.isClosed())
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
(1) 用户注册:新用户在enrol.jsp页面中输入用户名,密码,密码提示问题、提示问题答案,点击提交按钮,数据提交到enrolinfo.jsp中进行处理,在enrolinfo.jsp中,如果用户名已经有人使用则返回注册页面,否则提示用户注册成功,并跳转到登录后的页面index_logined.jsp。enrolinfo.jsp的代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@page import="entity.User"%>
<%@page import="dao.UserDAO"%>
<%@page import="dao.impl.UserDAOImpl"%>
<%
//post 中文乱码处理
request.setCharacterEncoding("GBK");
User user=new User();
String UId = request.getParameter("hui");
String UPass = request.getParameter("password");
String UNickName = request.getParameter("Nike");
String Head = request.getParameter("SelectAvatar");
String Gender = request.getParameter("xing");
String uname = request.getParameter("zname");
String UCard = request.getParameter("card");
String question = request.getParameter("select");
String UKey = request.getParameter("da");
user.setUId(UId);
user.setUPass(UPass);
user.setUNickName(UNickName);
user.setHead(Head);
user.setGender(Gender);
user.setUName(uname);
user.setUCard(UCard);
user.setQuestion(question);
user.setUKey(UKey);
UserDAO dao = new UserDAOImpl();
boolean bl = dao.addUser(user);
if(bl)
{
response.sendRedirect("/QNbbs/HTML/success.jsp");
}else
{
response.sendRedirect("/QNbbs/HTML/shibai.jsp");
%>
(2) 用户登录:用户在有帐号的前提下,可以在登录页面login.jsp或主页index.jsp中输入用户名和密码点击登录,系统将用户名和密码提交到doLogin.jsp中的处理,将用户提交的用户名和密码再转交给后台的Dao进行查询,如果有这样的一条记录存在则登录成功,将用户的个人信息保存在浏览器端的Session中,否则返回登录失败页面,并提示用户名或密码错误。
doLogin.jsp的代码如下:
<%@ page language="java" pageEncoding="GBK"%>
<%@page import="entity.User"%>
<%@page import="dao.UserDAO"%>
<%@page import="dao.impl.UserDAOImpl"%>
<%
request.setCharacterEncoding("GBK");
String name = request.getParameter("name");
String password = request.getParameter("password");
UserDAO dao = new UserDAOImpl();
boolean bl = dao.qeury(name,password);
if (bl){
User user=dao.sendname(name,password);
String uname=user.getUNickName();
int uid=user.getID();
dao.updateUser(user);
response.sendRedirect("../HTML/index_logined.jsp");
session.setAttribute("name",uname);
session.setAttribute("uid",uid+"");
session.setAttribute("uname",user.getUNickName());
}else{
response.sendRedirect("../HTML/login_shibai.jsp");
}
%>
(3) 用户注销:已登录用户在退出网站时注销登录状态,系统将请求交给login_off.jsp处理,在login_off.jsp中修改用户最后离线时间,将修改保存到数据库中,并将浏览器端的Session的user属性移除,系统返回主页。用户同时失去登录用户的权限,以游客身份访问网站,只能浏览主题,不能发表主题,也不能发表回复。
login_off.jsp的代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@page import="dao.impl.UserDAOImpl"%>
<%@page import="entity.User"%>
<%
String id=session.getAttribute("uid").toString();
int ID = 0;
if(session.getAttribute("uid")!=null)
ID=Integer.parseInt(id);
UserDAOImpl userdao=new UserDAOImpl();
User user=userdao.finduName(ID);
boolean bl =userdao.updateUserexit(user);
if(bl){
session.removeAttribute("name");
session.removeAttribute("uname");
session.removeAttribute("uid");
response.sendRedirect("/QNbbs/HTML/index.jsp");
}else
response.sendRedirect("/QNbbs/HTML/index.jsp");
%>
(4) 查看版面:首页显示BBS的版块及主要信息,点击版块名进入版块下会进入toppic.jsp板块页面页面,点击主题名可以进入主题页面。
toppic.jsp的部分代码如下:
<%
String boardId = request.getParameter("boardId");
int boardid = 5;
if (request.getParameter("boardId") != null)
boardid = Integer.parseInt(boardId);
TopicDAOImpl topic = new TopicDAOImpl();
String title = topic.findTopicTitle(boardid);
List list_topic = topic.findTopicByBoardId("where boardId="
+ boardid);
int currPage = 1;
try {
currPage = Integer.parseInt(request.getParameter("currPage"));
} catch (Exception ex) {
}
TopicDAOImpl dao = new TopicDAOImpl();
Page pg = new Page();
pg.setCurrPage(currPage);
pg.setPageSize(15);
pg.setTableName("tbl_topic");
pg.setWhere("where boardid=" + boardid);
dao.findByPage(pg);
List list = pg.getPageData();
%>
<%
if (list_topic != null) {
for (int i = 0; i < list.size(); i++) {
Topic topic1 = (Topic) list.get(i);
UserDAOImpl udao = new UserDAOImpl();
User user = udao.finduName(topic1.getUid());
ReplyDAOImpl replydao = new ReplyDAOImpl();
int num = replydao.findreplynum(topic1.getTopicId());
%>
(5) 查看主题:当用户在主页上点击版块名时,会产生一个动作,向服务器产生一个请求,服务器将程序交给replydf.jsp处理,在replydf.jsp中取出模块下的所有主题及最后发表回复的作者的信息将其显示在主题页面。
<%
TopicDAOImpl tdaoi1 = new TopicDAOImpl();
Topic t1 = tdaoi1.findTopicBytopicid(id); session.setAttribute("topicid",t1.getTopicId()+"");
int topicId=t1.getTopicId();
int currPage = 1;
try{
currPage = Integer.parseInt(request.getParameter("currPage"));
}catch(Exception ex){}
ReplyDAOImpl dao = new ReplyDAOImpl();
Page pg = new Page();
pg.setCurrPage(currPage);
pg.setPageSize(5);
pg.setTableName("tbl_reply");
pg.setWhere("where topicid="+topicId);
dao.findByPage(pg);
List list = pg.getPageData();
使用注入Dao的形式进行数据库操作,在Dao中实现对数据表的增加、删除、查询、修改操作。
管理员可以删除用户、增加版块、删除版块、查询版块、删除主题、修改主题属性、新增版块权限、查询版块权限、删除版块权限。管理员不能删除其他的管理员,管理员只有超级管理员才能够设置和删除。超级管理员具有网站的一切功能。
现将部分功能介绍如下:
管理员作为特殊的用户,通过/HTHTML/login.jsp管理员登陆页面进行登录到后台主页,在管理页面有版块管理、主题管理、回复管理、用户管理。
(4)测试、书写测试报告。
软件测试的目的在于在软件投入运行之前,尽可能多地发现软件中的错误,软件测试是对软件规格说明、设计和编码的最后复审,是软件质量的保证的关键步骤[15]。
系统测试一般分为模块测试、组装测试、确认测试。确认测试是软件需求说明书上的功能进行逐项检验,模块测试是查找各模块在功能结构上存在的问题。本系统采用模块测试,对系统的每个功能进行测试。
测试没有问题。
1.3 开发、运行环境
(1) 软件环境
操作系统是Windows 2003 Professional/Server,WindowsXP Professional、Windows.NET Server或以上版本;数据库使用SQL Server 2005或以上版本,JDK1.5或以上版本,Tomcat5.0或以上版本。IE版本为IE6.0
(2) 硬件环境
内存至少为128MHZ;CPU要求为Intel Pentium 800MHZ或以上更高频率的CPU。
1.4 系统的功能及特点
系统有版块,主题和回复,其中版块是对主题的分类,回复是在主题下发表的,是用户对主题的评论。当用户进入首页时会显示论坛的所有版块及每个版块下的主题数,帖子总数,最后发表主题的用户、时间。进入版块之后显示该版块下的主题及该主题下的回复数,点击数,最后发表评论的用户、时间。。点击主题名进入主题页面,该页面有主题内容,发表该主题的用户的用户名、积分、用户组、注册时间,该主题下的回复及发表回复的用户的个人信息。
已登录用户可以在版块下发表主题,在主题下发表回复,还可以按关键字对主题或回复进行搜索,并支持模糊查询。匿名用户只能查看主题内容,对主题或回复进行搜索,但不能发表主题,不能发表回复。
2 系统详细设计
(1)各模块的功能设计
管理员功能
管理员作为一个特殊的用户,除了拥有普通用户拥有的功能外,还可以修改用户权限,管理用户组,管理版面,设置版主,控制用户组权限。版主作为权限最少的管理者只能对自己所管理的版面的主题进行删除、置顶,设置精华贴,屏蔽用户的回复,编辑版面说明等。
统计功能
显示论坛当前注册总人数、当前帖子总数、论坛点击总数、当前在线人数,会员人数以及游客人数。
用户表现积分排行,调动用户积极性。用户每次上线、发表主题或回复都会得到相应的积分,并以此来体现用户的活跃程度。
系统会对主题按点击数进行排序,对版面按主题数进行排序,帖子点击统计,方便了解热点话题。本日版面排行榜,本日作者排行榜。
(4)程序流程图
(2)数据库设计(表、字段、表间的关系、存储过程)
根据前面的需求描述,本系统中可以抽象出来的数据模型有:
1. 后台管理员表(TBL_Admin)
2. 板块表(TBL_Board)
3. 用户组表(TBL_Grade)
4. 主题表(TBL_Topic)
5. 积分表(TBL_Score)
6. 回帖表(TBL_Reply)
7. 用户表(TBL_User)
(3)页面(界面)设计与编程。
'adModeUnknown 0 default
'adModeRead 1
'adModeWrite 2
'adModeReadWrite 3
'adModeShareDenyRead 4
'adModeShareDenyWrite 8
'adModeShareExclusive 12
'adModeShareDenyNone 16
strDBPath = Server.MapPath("dbconr.asp")
strDBPath = replace(strDBPath,"\bbs\dbconr.asp","\db\bbsdata.mdb")
strDBConn= "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & strDBPath
Set objDBConn=server.createobject("adodb.connection")
objDBConn.ConnectionTimeOut=20
objDBConn.Mode=1 ‘读模式
objDBConn.open strDBConn
%>
Set objDBConn=Server.CreateObject("ADODB.Connection")
objDBConn.Mode=?
objDBConn.Open"[DSN-less串]"
session("dbconn")=objDBConn
Set rs=Server.CreateObject("ADODB.Recordset")
Commandtext = "select * from userlist"
connstr=session("dbconn")
rs.open Commandtext , connstr , 3 , 2
strSQL="INSERT INTO userlist(username,password,question,answer, "
strSQL= strSQL & "email,realname,sex,zjname,zjnumber, "
strSQL= strSQL & "lxway,birthday,homepage,quantity)"
strSQL=strSQL & "VALUES('"
strSQL=strSQL & strUsername & "','"
strSQL=strSQL & strPassword & "','"
strSQL=strSQL & strQuestion & "','"
strSQL=strSQL & strAnswer & "','"
strSQL=strSQL & strEmail & "','"
strSQL=strSQL & strRealname & "','"
strSQL=strSQL & strSex & "','"
strSQL=strSQL & strZjname & "','"
strSQL=strSQL & strZjnumber & "','"
strSQL=strSQL & strLxway & "','"
strSQL=strSQL & strBirthday & "','"
strSQL=strSQL & strHomepage & "','"
strSQL=strSQL & strQuantity & "')"
%>
<!---#include file="dbconrw.asp"--->
<%
objDBConn.Execute strSQL
%>
<!---#include file="dberror.asp"--->
3 测试报告
通过测试后,发现用户注册的功能不能对输入的信息进行校验,JavaScript对输入的数据没有进行校验,通过查找源代码,发现是函数没有写对。
另外还发现了其他一些错误,经过使用打印语句输出数据处理结果的方法,也都找出了错误所在。
4 附:程序源码
<!--#include file="dbconrw.asp"-->
<%
response.expires=0
On Error Resume Next
Dim strUserName
Dim strSQL,objRS
strUserName=Request.Form("username")
strUserPassword=Request.Form("password")
strSQL="SELECT * FROM userlist WHERE username='" & strUserName & "'"
set objRS=objDBConn.Execute(strSQL)
session("username")=""
session("adminboard")=""
Dim bLogSucc,repmsg,reptxt,repurl
If objRS.EOF Then
'User Doesn't Exists
bLogSucc=0
repmsg="此用户不存在"
repurl="userlog.asp"
reptxt="请重新登录"
Else
'User Exists
If objRS("password")=strUserPassword Then
bLogSucc=1
session("username")=strUserName
repmsg="欢迎您的到来" & strUserName & ",您已登录成功"
repurl="main.asp"
reptxt="返回论坛首页"
Else
bLogSucc=0
repmsg="密码输入错误"
repurl="userlog.asp"
reptxt="请重新登录"
End if
End If
%>
<!--#include file="dberror.asp"-->
<%
'Write Log
objRS.close
strSQL="INSERT INTO loginfo(userid,userip,intime)"
strSQL=strSQL & "VALUES('" & strUserName & "','"
strSQL=strSQL & request.servervariables("remote_host") & "','"
strSQL=strSQL & now() & "')"
set objRS=objDBConn.execute(strSQL)
if err.number<>0 then
response.write "数据库操作失败:"&err.description
end if
end if
objRS.close
objDBConn.Close
Set objRS=Nothing
Set objDBConn=Nothing
%>
确定了用户的会员身份以后,在每个需要进行身份识别的ASP网页插入身份识别代码,如果此用户具有访问这个ASP网页的权限,则输出其相应的HTML文件,否则,系统转到用户登录网页要求用户重新登录以取得访问此ASP功能网页的合法身份。例如,论坛基本信息设置ASP网页需要访问者具有超级会员身份,在本网页前必须插入以下一段代码:
<%
'Check the Super Administrator Right
Response.Expires=0
if Session("adminboard") <> "0" Then
Response.redirect "userlog.asp?errmsg=您没有超级用户管理权限,请重新登录或退出!"
End If
%>
展开阅读全文