一、问题描述
建设一个网络课程学习网站,通过web页面成为教师的知识代理,师生之间不再是面对面的交流活动,师——生、生——生之间的交流都是通过网络这一媒体实现。网站提供学生注册、信息公告发布、课件资料下载、教师管理、专题课程知识添加、师生交流问答等功能来建立学习资源库,促进学生学习的发展。
二、需求分析
功能描述:
(1)公告管理:由教师在后台管理中添加修改公告信息,前台显示最新的一条公告。
(2)新闻信息发布管理:教师可以在后台管理中发布最新新闻信息,通过使用在线编辑器,可以进行可视化的文章编辑,并能够实现上传图片,以及插入视频声音等功能,前台主页显示最新的新闻信息,方便学生获取最新资讯。
(3)专题知识管理:专题知识分为两部分,一为专题,二为专题章节,课程知识分为若干个专题学习板块,每个专题下有若干个专题章节,前台通过Tree树进行显示专题以及各个章节,教师要先建立专题后才能够添加章节,删除专题的同时将删除专题下所有章节,学生浏览专题知识需要登陆,若没有进行注册的就先要进行注册,否则将提示请先登陆,学生通过点击Tree树导航栏进行专题知识的浏览学习。
(4)用户注册管理:学生通过注册成为网站用户,并能够获得所属教师的指导,只有通过注册后,才能够对专题知识进行浏览学习,并且在讨论主题中进行发言回复。教师在后台能够管理所属自己的注册用户,并添加修改注册用户。系统管理员能够对所有注册用户进行管理。
(5)扩展知识管理:扩展知识开放给所有用户,能够匿名浏览,教师在后台添加修改删除文章,通过在线编辑器进行文章编辑,提供给学生更多的知识。
(6)资料上传下载管理:管理员在后台添加修改资料信息,并且上传资料提供下载,学生能够任意下载这些资料。
(7)讨论留言管理:学生注册或登陆后,能够发表讨论主题,对自己不懂的地方发问,以求教师或者其他同学的回复解答,或者回复其他同学发表的主题。教师在后台管理讨论主题,对恶意的主题进行删除,并对学生提问进行回复。
(8)教师管理员管理:管理员分为两种,系统管理员和教师,系统管理员拥有所有权限,教师作为普通管理员,除不能够添加管理员以及修改别的管理员以外,其他权限都和系统管理员一样。系统管理员不能够成为注册用户所属教师。
(9)课程基本信息管理:教师在后台可对课程的基本信息进行修改,以便完善课程的建设。(10)友情链接管理:教师可以在后台添加修改网站链接,前台滚动显示最新添加的网站链接
三、系统设计
系统运行环境:windows2003+IIS6.0+.net framework2.0
开发工具:visual studio 2005 +SQLserver2000sp4
专题学习网站主要采用asp.net 2.0编程技术,通过显示页面与代码分离两层结构实现, 用户注册修改采用存储过程实现,并采用数据库视图,实现文章信息的分页显示,以及使用HHFeditor在线编辑器ASP.net3.0免费版,实现文章的可视化编辑。
全站风格:采用Div+CSS控制页面显示,减少代码编写,方便修改。
管理后台:统一采用asp.net母版页,简化开发步骤。
前台显示:除专题知识外,都采用asp.net母版页,减少代码编写。
验证码机制:在用户注册登陆,讨论留言发表回复,后台管理登陆都采用验证码,防止恶意攻击。
TreeView控件:通过数据库层次结构,将TreeView绑定到SQLserver数据库,实现树形导航。
Iframe框架:首页用户登陆,专题知识模块采用Iframe框架,实现局部刷新。
加密机制:用户密码,管理员密码都采用MD5加密.
四、详细设计
数据库实现
公告信息表Notice
数据库字段 | 数据类型 | 字段描述 |
Notice_Id | Int(4) | 编号 |
Notice_Content | text | 公告内容 |
Notice_date | datetime | 发布时间 |
Notice_Admin | Varchar(50) | 发布者 |
新闻信息表 News
数据库字段 | 数据类型 | 字段描述 |
News_Id | Int(4) | 编号 |
News_Name | Varchar(50) | 新闻名称 |
News_Content | text | 新闻内容 |
News_Admin | Varchar(50) | 发布者 |
News_Date | datetime | 新闻日期 |
用户信息表Users
数据库字段 | 数据类型 | 字段描述 |
Users_Id | Int(4) | 编号 |
Users_Name | Varchar(50) | 用户名 |
Users_Password | Varchar(50) | 密码 |
Users_Realname | Varchar(50) | 真实姓名 |
Users_own | Int(4) | 所属教师编号 |
Users_Email | Varchar(50) | Email地址 |
教师管理员表Admin
数据库字段 | 数据类型 | 字段描述 |
Admin_Id | Int(4) | 编号 |
Admin_name | Varchar(50) | 用户名 |
Admin_password | Varchar(50) | 用户密码 |
Admin_Realname | Varchar(50) | 真实姓名 |
Admin_own | Int(4) | 所属教师 |
Admin_Email | Varchar(50) | Email地址 |
课程信息表Subject
数据库字段 | 数据类型 | 字段描述 |
Subject_Id | Int(4) | 编号 |
Subject_Name | Varchar(50) | 课程名称 |
Subject_Review | Text | 课程内容简介 |
Subject_Admin | Varchar(50) | 课程管理员名称 |
专题信息表 Capters
数据库字段 | 数据类型 | 字段描述 |
Capters_id | Int(4) | 编号 |
Capters_parent | Int(4) | 父节点(0为专题,其他为章节) |
Capters_Name | Varchr(50) | 专题名称 |
Capters_content | Text | 专题内容(章节内容 ) |
Capters_Own | Int | 所属课程 |
扩展知识表 Article
数据库字段 | 数据类型 | 字段描述 |
Article_id | Int(4) | 编号 |
Article_name | Varchar(50) | 文章名称 |
Article_content | text | 文章内容 |
Article_admin | Varchar(50) | 作者 |
Article_date | datetime | 添加日期 |
资料下载表 Download
数据库字段 | 数据类型 | 字段描述 |
Down_id | Int(4) | 编号 |
Down_name | Varchar(50) | 下载名称 |
Down_content | Text | 资料简介 |
Down_admin | Varchar(50) | 上传者 |
Down_link | Varchar(50) | 文件地址 |
Down_date | datetime | 上传时间 |
协作学习(讨论留言)BBS
数据库字段 | 数据类型 | 字段描述 |
BBS_id | Int(4) | 编号 |
BBS_parent | Int(4) | 父节点(0为主题,其他为主题回复) |
BBS_user | Varchar(50) | 发表者 |
BBS_title | Varchar(50) | 主题名称 |
BBS_content | Text | 内容 |
BBS_date | Datetime | 发表时间 |
BBS_reply | Text | 回复内容 |
BBS_admin | Varchar(50) | 回复者 |
BBS_redate | Datetime | 时间 |
友情链接表 Link
数据库字段 | 数据类型 | 字段描述 |
Link_id | Int | 编号 |
Link_name | Varchar(50) | 链接名称 |
Link_content | Text | 链接简介 |
Link_url | Varchar(50) | 链接URL |
存储过程
用户注册
存储过程名称以及功能 | 输入参数 | 返回值 |
UserReg新用户注册 | @usersname @userspassword @usersreal @usersown @usersemail | 0 注册成功 1 注册失败
|
存储过程名称以及功能 | 输入参数 | 返回值 |
UserEdit修改用户信息 | @usersid @userspassword @usersreal @usersname @usersemail | 0 更新成功 1 没有用户
|
五、代码编写与调试
TreeView控件
绑定SQLserver数据库实现树形菜单
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection conn =
New SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
conn.Open();
//获取树形目录节点
SqlDataAdapter sqlDataAdapter_Tree =
new SqlDataAdapter("select capters_id,capters_name,Capters_parent from Capters", conn);
DataSet DataSet_Tree = new DataSet();
sqlDataAdapter_Tree.Fill(DataSet_Tree);
this.ViewState["DataSet_Tree"] = DataSet_Tree;
//调用递归函数,完成树形结构的生成
AddTree(0, (TreeNode)null);
}
public void AddTree(int ParentID, TreeNode pNode)
{
DataSet DataSet_Tree = (DataSet)this.ViewState["DataSet_Tree"];
DataView DataView_Tree = new DataView(DataSet_Tree.Tables[0]);
//过滤ParentID,得到当前的所有子节点 ParentID为父节点ID
DataView_Tree.RowFilter = "[Capters_parent] = " + ParentID;
//循环递归
foreach (DataRowView Row in DataView_Tree)
{
//声明节点
TreeNode Node = new TreeNode();
//绑定超级链接
Node.NavigateUrl = "Part.aspx?capterid=" + Row["Capters_Id"].ToString();
Node.Target = "index";
//开始递归
if (ParentID == 0)
{
//添加根节点
Node.Text = Row["Capters_name"].ToString();
TreeView_Tree.Nodes.Add(Node);
Node.Expanded = true; //节点状态展开
AddTree(Int32.Parse(Row["capters_id"].ToString()), Node); //再次递归
}
else
{
//添加当前节点的子节点
Node.Text = Row["Capters_name"].ToString();
pNode.ChildNodes.Add(Node);
Node.Expanded = true; //节点状态展开
AddTree(Int32.Parse(Row["Capters_id"].ToString()), Node); //再次递归
}
}
//关闭连接
}
MD5加密实现
public string md5(string str, int code) //md5加密函数
{
if (code == 16) //16位MD5加密(取32位加密的9~25字符)
{
return
FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16);
}
if (code == 32) //32位加密
{
return
FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
}
return "";
}
用户注册存储过程实现
string Str = "Select * from [Users] where Users_Name = '" + Usersname + "'";
SqlConnection conn =
new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);//连接数据库
SqlCommand cmd = new SqlCommand(Str, conn);
try
{
conn.Open(); //打开连接
SqlDataReader SQLread = cmd.ExecuteReader(); //执行查询
if (SQLread.Read()) //如果该用户存在
{
Messages.Text = "用户名已经存在!";
Messages.Visible = true;
return;
}
else{
conn.Close();
//UserReg存储过程,参数赋值,asp.net1.1使用的是Parameters.Add
//asp.net2.0则放弃Add使用Parameters.AddWithValue
SqlCommand command = new SqlCommand("UserReg", conn);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@usersname",Usersname);
command.Parameters.AddWithValue("@userspassword", md5(Userspassword, 32));
command.Parameters.AddWithValue("@usersreal", Usersreal);
command.Parameters.AddWithValue("@usersemail", Usersemail);
command.Parameters.AddWithValue("@usersown", Usersown);
//存储过程返回值
SqlParameter paramOut = command.Parameters.AddWithValue("@RETURN_VALUE", "");
paramOut.Direction = ParameterDirection.ReturnValue;
try
{
//打开数据链接
conn.Open();
//执行存储过程
command.ExecuteNonQuery();
//返回值
int Rvalue = (int)command.Parameters["@RETURN_VALUE"].Value;
if (Rvalue == 0)
{
Response.Write("<script>alert('添加成功!');location.href='Admin_Users.aspx'</script>");}
else
{Messages.Text = "错误,添加失败!";
Messages.Visible = true;
return; }
}
catch (Exception ex) {
Response.Write("<script language=javascript>alert('" + ex.Message.ToString() + "')</script>"); }
} }
catch (Exception ee)
{ Response.Write("<script language=javascript>alert('" + ee.Message.ToString() + "')</script>");}
finally
{ conn.Close(); }
}
六、系统维护
演示地址:http://202.116.24.89:1234 ACM程序设计专题学习网站
管理员登陆:帐号:admin 密码:admin
演示系统运行环境:window2000+IIS5.0 +.net framework 2.0