资源描述
江 西 理 工 大 学
数 据 库 课 程 设 计 报 告
题 目:留言板信息系统
学 院:信息工程学院
专 业:网络工程
班 级:112
学 生:王永宁
学 号:1520113293
指导教师:涂燕琼、南柄飞
目 录
第一章 总体设计
1。1需求分析
1。2模块设计
第二章 系统分析
2。1留言板管理系统前端的主要功能
2。2留言板管理系统后台管理的主要功能………………………………………
2。3留言板管理系统性能要求……………………………………………………
第三章 详细设计
3.1。数据库分析 ……………………………………………………
3。2。E—R图……………………………………………………………
3。3。管理员表
3.4。用户信息表
3.5。留言信息表
3.6.数据库快照及字段说明
3.7.数据库连接详细设计
第四章 前端页面设计
第一章 总体设计
1。1需求分析
随着网络热潮的发展,各种各样的网站正成倍的迅速增长,面对各种网站,论坛的发展,人们开始更多的在网上交流.这就需要一个发表留言的系统——留言板。通过这样的系统,可以做到信息的规范管理、科学统计和快速的发表言论。由于计算机和网络的普及,若建立一个留言板系统,人们便可以通过网络的登陆成为会员,取得发表言论上午资格,也使得留言板管理工作系统化,规范化,自动化。
1。2模块设计
留言板系统的基本功能包括用户信息的录入、查询、修改和删除。用户留言及头像的前台显示功能。其中还包括管理员的登录信息。整体功能设计图如下所示:
第二章 系统分析
2.1留言板管理系统前端的主要功能
(1)用户注册。
(2)用户登录。
(3)用户发表主题。
(4)用户回复。
(5)用户修改个人注册信息。
(6)用户查看所有发帖以及回复信息.
(7)用户查看自己发表的主题。
(8)用户对主题进行各种查询。
2。2留言板管理系统后台管理的主要功能
(1)管理员登陆。
(2)修改用户注册信息。
(3)管理员修改用户发帖或回复的信息.
(4)管理员删除用户发帖或回复的信息。
(5)对用户发帖信息进行加精处理。
2。3留言板管理系统性能要求
(1)页面响应速度快。
(2)页面美观整洁。
留言板管理系统
管理员
普通用户
修改用户信息
修改和删除标题和回复信息
注册
登陆
登陆
加精标题
查看留言
留言
创建标题
查看标题
第三章 详细设计
3.1 数据库分析
用户需求具体管理系统提供保存、更新、查询、维护,这就需求数据库结构能充分满足各种信息的输入与输出,实现有组织地、动态地存储大量关联数据,方便用户访问系统中的数据,它与文件系统的重要区别是数据的充分共享,交叉访问,与应用程序的高度独立性.
3。2 数据库概念结构设计:E-R图
账号
密码
管理员
3.3管理员表
Create table admin(
Ano char(10) primary key,
Pwd char(10)
)
Insert into admin(ano, pwd) values('gao’,'111’)
管理员(姓名、密码)对应E—R图如下:
管理员信息
姓名
密码
3。4用户信息表
create table users(
uno char(20) primary key,
uname char(20),
sex char(20),
pwd char(20),
img char(100),
)
用户信息(账号、性别、姓名、密码、头像)对应E—R图如下:
客户信息
账号
姓名
性别
密码
头像
3。5留言信息表
create table jiaoliu(
jno int identity(1,1) primary key,
uno char(20),
nerong char(2000),
foreign key(uno) references users(uno)
on delete cascade
on update cascade
)
留言信息(用户账号、留言信息)对应E—R图如下:
留言表
编号
留言信息
账号
3。6数据库快照及字段说明(数据库为SQL server2005)
普通用户表:user
表格属性
说 明
是否为主码
user_name
用户注册的用户名。
否
password
用户名的密码。
否
user_sex
用户输入的性别.
否
user_qq
用户输入的qq号码。
是
user_email
用户输入的email地址。
否
主题表:theme
表格属性
说 明
是否为主码
theme_id
主题id。
是
theme_user_name
发表主题的用户名。
否
theme_content
主题的内容。
否
click_number
主题被点击的次数。
否
dateline
发表的时间。
否
message_number
留言的数量。
否
theme_name
主题名。
否
is_good
是否被加精.
否
用户留言表:message
表格属性
说 明
是否为主码
message_id
留言id
是
message_date
留言时间。
否
message_content
留言内容.
否
message_user_name
留言者的用户名
否
theme_id
留言对应的主题.
否
管理员账户表:admin
表格属性
说 明
是否为主码
admin_name
管理员用户名。
是
admin_password
管理员用户密码。
否
3。7数据库连接详细设计:
系统管理模块:(代码实现)
void CLoginDlg::OnOK() //响应按钮连接数据库
{
CString str,strPasswd;
_RecordsetPtr pRS; // Recordset对象
UpdateData();// 更新数据
// 打开数据库
if(pTheConn—>GetState()==adStateClosed)
pTheConn->Open(m_strDSN.AllocSysString(),”","",-1);
pRS。CreateInstance(__uuidof(Recordset)); // 创建Recordset对象实例
strPasswd=CCrypt::Encrypt(m_strPasswd,123); // 密码加密
// 设置过滤条件
str=”ID=’" + m_strUser
+ ”' and PASSWD=’" + strPasswd
+ "' and AUTHORITY='5’";
try
{
pRS->Filter=str.AllocSysString();
pRS-〉Open(”PERSON",
pTheConn.GetInterfacePtr(),
adOpenStatic,adLockReadOnly,adCmdTable);
}
catch(_com_error *e)
{
CString Error = e->ErrorMessage();
AfxMessageBox(e—〉ErrorMessage());
}
catch(...)
{
AfxMessageBox(”打开数据集对象出错!");
}
int a=pRS->RecordCount;
if(pRS—〉RecordCount==1) // 判断认证是否通过
{
EndDialog(IDOK); // 关闭对话框
}
else
MessageBox("请确认用户名和密码,注意大小写!”, "认证失败");
}
void CSalaryDlg::OnSystemConnect() // 显示用户登录窗口
{
CLoginDlg LoginDlg;
if(LoginDlg。DoModal()==IDOK) // 认证通过
m_wndStatusBar。SetPaneText(1, ”已连接到数据库: " + LoginDlg.m_strDSN);
}
void CSalaryDlg::OnSystemDisconnect() // 断开连接
{
// 关闭Connetion对象
if(pTheConn->GetState()==adStateOpen)
pTheConn-〉Close();
m_wndStatusBar。SetPaneText(1, ”尚未登录数据库,请按F2登录");
第四章 前端页面设计
主页面(图1)
用户浏览主页面,将会显示所有标题信息.如果用户没有登陆则会在右上角用红色的字体显示“登陆”和“注册”。标题按时间顺序降序排列,标题如果被加精则会在标题名称后面显示红色的“[精品]”。在标题名前显示了点击数和留言数。主页面中还有搜索标题的功能可对标题进行模糊查询,并进行了不为空的验证(主页面代码太多,省略).
在主界面上当用户点击了“精品区”,“人气排行”,“首页”和标题名称这些链接后,将会通过Struts2的机制进行跳转至后台处理。以下是这几个链接的后台处理文件代码和在Struts2配置文件中的配置代码:
public String execute(){
ActionContext ct= ActionContext。getContext();
HttpServletRequest request=(HttpServletRequest)ct.get(ServletActionContext。HTTP_REQUEST);
if(request.getParameter("action")!=null){
if(request.getParameter(”action").equals(”message”)){
List list=new MessageDAO().findAll(request.getParameter("id"));
request。setAttribute(”message”, list);
List temp1=(List)new ThemeDAO()。findById(request.getParameter("id”));
Theme theme=(Theme)temp1。get(0);
request.setAttribute(”theme”, theme);
new ThemeDAO().click(theme);
List temp2=(List)new UserDAO().findByName(theme.getUsertable().getUserName());
Usertable user=(Usertable)temp2.get(0);
request.setAttribute(”sex", user.getUserSex());
return "index";
}
if(request。getParameter(”action”).equals("isGood")){
List list=new ThemeDAO().findisGood();
request.setAttribute("list", list);
return ”index”;
}
if(request.getParameter(”action”).equals(”orderby”)){
List list=new ThemeDAO()。findOrderBy();
request.setAttribute(”list”, list);
return ”index”;
}
}
List list=new ThemeDAO().findAll();
request.setAttribute("list", list);
return "index";
}
〈package name="strutsqs" extends=”struts—default"〉
<action name="Search" class=”action。SearchAction”〉
〈result name=”alert">/alert。jsp〈/result〉
<result name=”index”>/index.jsp〈/result>
<result name=”error”>/error.jsp〈/result〉
</action〉
</package>
其中alert.jsp页面用于显示各种提示信息。在我的设计中,如果需要提示信息时,会将短小的脚本代码设置到request范围中,然后通过Struts2机制跳转到alert.jsp页面,在alert。jsp页面中输出request中的信息。脚本中的信息一般是提示框,点击后跳转到用户所需要的页面。
用户点击“首页",“精品区”,“人气排行”和标题的链接最后都依旧会跳到主页面,只是显示的内容不同.点击“首页”会将所有标题信息显示,按时间降序排列(图1所示)。点击“精品区”会显示所有被加精品的标题(如图2).点击“人气排行”会显示所有标题,但是将按照留言数量进行排序(留言数量相同时按照点击数排序,如图3)。点击标题链接则会将该标题的所有留言信息显示出来,在此时“创建标题”链接将会变成“留言”链接(如图4)。
图2
图3
图4
在主页面中,虽然所有浏览该页面的人都能看到“创建标题”和“留言"链接。但是如果浏览者没有登陆,则无法进行“创建标题"和“留言”。点击是会被提示(图5),然后将登陆层显示(如图6),让用户登陆后在进行“创建标题”和“留言"操作。
图5
图6
登陆后用户进行“创建标题”和“留言”(同时也可以看到右上角的“登陆”,“注册”,变成了“修改注册信息",“我创建的标题”)。用户点击“创建标题”时,会将创建标题层显示,创建标题中失去焦点时即有脚本进行验证,并通过动态改变DIV的样式和文字来达到美观,简单的提示用户的效果(如图7)。用户点击留言后,会弹出和创建标题层相同的层,不同的是标题变成无法修改,用户只能输入留言(图8)。
图7
图8
在显示留言时,当用户注册信息性别为女时会显示女头像,为男时显示男头像(该功能可以扩展为用户任意选择头像)。
当浏览页面想“创建标题”和“留言”但没有账号时就要通过注册页面进行注册,然后在进行登陆后的“创建标题”和“留言"。
注册页面(图9)
在注册页面我使用了大量的脚本进行验证,在“用户名”栏使用了AJAX技术,在注册者输入用户名后,将进行脚本验证,验证通过后通过AJAX的方式提交到后台(AJAX也采用Struts2,图10)。验证同样是通过动态改变DIV样式和文字来达到提示的效果,并且当用户提交时,会使验证没有通过的文本框获得焦点。
图10
图11
以下是Struts2简单的AJAX,在配置文件文件中的代码:
<package name=”Struts2_AJAX_DEMO" extends=”json-default”>
〈action name="Ajax" class=”action.Ajax">
〈result type="json" name="success"/>
〈/action〉
</package>
在action中的代码:
public String execute() {
ActionContext ct= ActionContext.getContext();
HttpServletRequest request=(HttpServletRequest)ct。get(ServletActionContext。HTTP_REQUEST);
List list=new UserDAO().findByName(request。getParameter("name"));
if(list。size()==0){
isUser="true”;
}else{
isUser=”false”;
}
return "success”;
}
前台部分代码:
var xmlHttp=new XMLHttpRequest();
createXMLHttpRequest();
xmlHttp。onreadystatechange=function(){
if(xmlHttp。readyState==4){
result();
}
}
xmlHttp。open('POST’, "Ajax?name=”+values);
xmlHttp。send(null);
解析方法:
function result(){
var oBook = eval('(' +xmlHttp.responseText + ')');
if(oBook.isUser==”true”){
document.getElementById("nameSpan")。className=”div2”;
document。getElementById("nameSpan”).innerHTML=”恭喜!该用户名可以使用";
flag1=true;
}else{
document。getElementById(”nameSpan").className="div1";
document。getElementById(”nameSpan”)。innerHTML="sorry,该用户名已被使用";
flag1=false;
}
}
以上为前台页面的内容,页面设计主要以简单,美观,简短为主,仍有大量需要改进之处。下面对后台功能进行简单的介绍。
后台管理登陆页面(图12)
在从后台登陆以后会跳到主页面,在点击进入标题链接进入显示留言的主页面后。页面中显示的标题和留言后出现了,各种管理的链接(图13)。管理员可以通过这些链接,有针对性的对标题留言进行各种操作(可以看见右上角的链接又变成了“管理用户”)。
图13
管理员在进行删除和加精操作是会有相应的提示,在删除标题时则会提示两次。
展开阅读全文