项目报告书
科目:web项目开发
学号:
姓名:
班级:软件10301班
一.项目概要
1.引言
现在网站功能越来越多,但很多的网站都需要用户是网站的会员,通过会员登录才能够使用网站中的一些功能。会员的登录与注册已成为众多网站的基本功能之一。
2.项目名称
《网站会员的注册与登录》
3.项目目的
Ø 掌握会员注册功能的实现
Ø 了解验证控件的使用
Ø 了解MD5加密技术
Ø 掌握会员登录功能的实现
Ø 了解验证码技术
Ø 培养网站开发技术,积累相关开发经验
4.项目背景
现在网站的很多功能都是需要会员才能使用,例如在网站上下载一些资料,查看文章,留言等。这就需要开发人员给网站设计登录与注册的功能。这样使用户成为会员后能使用更多的功能。本学期初,在老师带领之下学生独立开发一个web项目,实现网站会员登录与注册功能。通过本项目熟悉网站开发的基本流程,掌握相关技术,积累开发经验。
5.项目开发人员
软件10301班师生成员
6.项目开发时间
20##年2月~20##年3月
二.可行性研究报告
1.概论
网站会员注册与登录项目运用.NET、数据库、MD5加密和C#相关技术,有其相应的运行环境,本案通过对其相应的研究确定开发可行性及注意事项。
2.可行性研究的前提
2.1项目的基本功能要求
本项目实例主要包括三种操作,即用户登录、用户注册及用户密码的修改。
用户运行登录界面,如果用户没有注册会员可以单击“新会员注册”按钮跳转到会员注册页面,在此页面可以先判断用户输入的会员名是否存在,如果存在需要输入会员名,如果不存在用户可以继续输入个人资料来完成注册,完成注册后添加注册日志。如果用户名已经注册,则可以直接输入会员名、密码和验证码,单击“登录”按钮进行登录。在单击“登录”按钮时,系统首先判断用户输入的信息和验证码是否正确,如果正确,再判断用户输入的会员名和密码是否正确,都正确后登录成功,同时添加登录日志。在登录页面中,单击“修改密码”按钮,进入修改密码页面,在此页面用户可以修改原有密码。
2.2项目的实现目标
注册用户名并用该用户名登录进入首页,修改用户密码后重新登录。使用验证码技术提高网站安全性。
2.3决定可行性的主要因素
技术、团队团结力、开发人员的意志和恒心
3.现有可行性分析
3.1现有知识内容
系统开发语言:ASP.NET、C#语言、HTML语言基础、CSS样式布局
数据库:SQL Server 2005
3.2现有开发工具
系统开发环境:Microsoft Visual Studio 2008
运行平台:Windows XP
Web服务器:IIS
3.3系统大体流程设计
程序业务流程图
4.技术可行性分析
4.1系统的简要概述
该系统主要分为三部分:登录部分、 注册部分和修改密码部分。为了方便用户者可以根据需求进行操作 ,本系统还可对用户的账号和密码进行进入管理。需要用户注册用户名和密码。
4.2需用技术
.NET网站开发技术,C#程序设计语言,数据库技术,MD5加密技术
4.3技术可行性评价
满足相关相关技术要求和设备需求,可以开发本项目
5.结论意见
通过研究具备相关的开发条件,可以开发本项目。
开发过程中仍需进一步钻研、进取,结合所学知识综合运用,在实践中加深对知识的理解。
三.需求规格说明书
1.概论
网站会员的注册与登录功能的实现需要相应的开发和运行环境,本案介绍该项目在开发和运行过程中所需的准备工作和相关规格需求,以规范该项目,保证功能的完整性和网站的安全性。
2.任务概述
2.1项目目标
1、现在网站的很多功能都需要是会员才能登录,例如在网站上下载一些资料,查看某些文件,留言等。这就需要开发人员给网站设计登陆和注册的功能。这样使用户成为会员后能事更多的功能。本项目的具体功能实现如下:
Ø 判断用户输入的会员名和密码是否正确;
Ø 利用验证码来防止用户的非法操作
Ø 用户登录成功添加登陆日志
Ø 注册新会员
Ø 判断注册新的会员是否被用过
Ø 判断用户输入的资料是否合法
Ø 用户注册成功添加注册日志
2.2开发运行环境
系统开发环境:Microsoft Visual Studio 2008
系统开发语言:ASP.net+C#
运行平台:Windows XP
数据库:SQL Server 2005
Web服务器: IIS
2.3系统规范要求
登录与注册系统的规范有以下几个方面:
(1)界面设计友好、美观。
(2)数据存储安全、可靠。
(3)信息分类清晰、准确。
(4)提供灵活、方便的权限设置功能,使整个系统的管理分工明确。
(5)具有易维护性和易操作性。
四.概要设计说明书
该项目主要有三个功能模块:登录模块、注册模块和修改密码模块。三个模块对应三个页面,有相应的数据在三个页面间传递。本案主要介绍该项目的总体设计和对应的模块功能划分。
1.模块说明
1.1登录模块:
(1)用户输入用户名、密码和验证码,如果正确点击登录跳转到主页面,同时向数据库添加登陆日志。若错误则不能跳转到主页面并给出相应提示。
(2)单击“新会员注册”按钮,跳转到注册页面;
(3)单击“修改密码”按钮,跳转到修改密码页面。
1.2注册模块:
(1)输入用户名,单击“检测而用户名”按钮,检测用户名是否存在。
(2)如存在则重新输入用户名用该用户登录。
(3)若不存在则输入其他信息,验证过通过后点击“注册用户”按钮,完成注册同时向数据库中添加注册日志。
1.3修改模块:
(1)填写用户名、旧密码和新密码,单击“确认修改”按钮。
(2)若输入用户名及密码一致,则修改成功并更改后台数据库。
(3)若输入用户名及密码不一致,则弹出“修改失败”对话框。
2.数据库设计
本系统采用SQL SERVER 2005数据库,主要有3个表:logininfo,loginlog,rntrylog.数据表logininfo用来存储后台会员名称,密码和基本资料
数据库设计结构实效:
2.1用户信息表:
表Logininfo的结构及实效
2.2注册日志表:
表Loginlog的结构及实效
2.3登录日志表:
表entrylog的结构及实效
3.安全性设计
输入密码时,使用MD5加密技术向后台数据库添加用户密码信息。
将信息保存到数据库前应考虑一下密码的安全性,MD5是单项加密,根据指定的密码和散列算法生成一个合适于存储在配置文件中的散列密码。
引用的命名空间为System.Web.Security;
语法:public static string HashPasswordForStoringInConfigFile
(string password, string passwordformat);
参数说明:
Password 要进行散列运算的密码;
Passwordformat 要使用的散列算法
五.详细设计说明书
本案主要介绍各个页面的主要控件及功能实现,通过实例展现出项目开发的详细过程。
网页设计结构图
1.登录页设计
1.1验证码技术
验证码的作用是有效防止注册用户用特定程序集暴力破解方式进行不断的登录尝试来破解密码,不少网站为了防止用户利用机器人自动注册,登录,灌水,都采用了验证码技术。
下面详细介绍验证码技术的实现。
需要引用using System.Drawing ;
using System.IO;命名空间。
新建一个页面命名为yanzhengma.aspx页面
主要代码如下:
public partial class yanzhengma : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string checkCode = CreateRandomCode(4);
Session["CheckCode"] = checkCode;
CreateImage(checkCode);
}
private string CreateRandomCode(int codeCount)
{
string allChar="0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,s,y,z,";
string [] allCharArray =allChar .Split (',');
string randomcode = "";
int temp;
Random rand=new Random ();
for (int i=0;i<codeCount ;i++)
{
int t=rand .Next (35);
temp =t ;
randomcode += allCharArray [t];
}
return randomcode ;
}
private void CreateImage(string checkCode)
{
int iwdth = (int)(checkCode.Length * 20.5);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwdth, 30);
Graphics g = Graphics.FromImage(image);
Font f=new System .Drawing .Font ("宋体",20,System.Drawing .FontStyle .Bold );
Brush b = new System.Drawing.SolidBrush(Color.White);
g.Clear(Color.BurlyWood);
g.DrawString(checkCode, f, b, 3, 3);
Pen blackPen = new Pen(Color.Blue, 0);
Random rand = new Random();
for (int i = 0; i < 2; i++)
{
int y = rand.Next(image.Height);
g.DrawLine(blackPen, 0, y, image.Width, y);
}
for (int i = 0; i < 150; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(rand.Next()));
}
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
}
运行如图所示
图1-3
1.2页面设置:
运行实例如图:
1.3登录页面关键代码:
需要引用using System.Data.SqlClient;
using System.Drawing;命名空间;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.Image1.ImageUrl = "~/ValidataCode.aspx";
}
}
protected void LinkButton1_Click(object sender, EventArgs e)
{
this.Image1.ImageUrl = "~/ValidataCode.aspx";
}
protected void Button1_Click(object sender, EventArgs e)
{
string name = Textname.Text.Trim();
string pwd = Textpwd.Text.Trim();
string code = Textcode.Text.Trim();
string str = "server=.;uid=sa;pwd=123;database=sss";
SqlConnection con=new SqlConnection(str);
try
{
con.Open();
string str2 = "select count(*) from Logininfo where name=@name and pass=@pwd";
SqlCommand cmd = new SqlCommand(str2, con);
cmd.Parameters.Add("@name", SqlDbType.VarChar, 50);
cmd.Parameters["@name"].Value = name;
cmd.Parameters.Add("@pwd", SqlDbType.VarChar, 50);
cmd.Parameters["@pwd"].Value = FormsAuthentication.HashPasswordForStoringInConfigFile(Textpwd.Text, "MD5");
int count = Convert.ToInt16(cmd.ExecuteScalar());
if (count > 0 & Session["checkCode"].ToString() == code)
{
this.Textcode.Text = "";
Session["login"] = "true";
cmd = new SqlCommand("insert entrylog values('" + Textname.Text + "','" + DateTime.Now.ToString() + "')", con);
cmd.ExecuteNonQuery();
//Response.Redirect("Sucess.aspx");
Response.Write("<script>alert('登录成功!')</script>");
}
else
{
this.Textcode.Text="";
Response.Write("<script>alert('密码或用户名错误!')</script>");
}
}
catch(Exception error)
{
Response.Write(error.ToString());
}
}
2.注册页面设计
会员注册主要将用户输入的信息存储到数据库中,这里使用到了数据库的技术,通过使用SQLConnection对象链接数据库,将数据库做成一个自定义方法reeateloginconn在需要用到数据库链接时调用此方法。
2.1页面设置:
运行实例如图
2.2关键代码:
protected SqlConnection createloginconn()
{
SqlConnection con = new SqlConnection("server=.;database=xsdl;Integrated security=SSPI;");
return con;
}
注意:
此方法中应用了System.Data.SqlClicent命名空间中的Sqlconnection对象,需要引用System.Data.SqlClicent命名空间。
主要程序代码:
protected void ButtonisName _Click(object sender, EventArgs e)
{
int i = isName();
if (i > 0)
{
RegisterStartupScript("yes", "<script>alert('会员名已经存在!')</script>");
}
else
{
RegisterStartupScript("no", "<script>alert('可以注册!')</script>");
}
}
protected int isName()
{
int i;
string name = Textname.Text;
if (name.Trim() != "")
{
SqlConnection con = createloginconn();
con.Open();
SqlCommand com = new SqlCommand("select count(*) from logininfo where Name='" + name + "'", con);
return i = Convert.ToInt32(com.ExecuteScalar());
con.Close();
}
else
return i = 1;
}
protected void ButtonLogin _Click(object sender, EventArgs e)
{
int i = isName();
if (i <= 0)
{
if (add())
{
SqlConnection con = this.createloginconn();
con.Open();
SqlCommand com = new SqlCommand("insert loginlog(name,logindate) values('" + Textname.Text + "','" + DateTime.Now.ToString() + "')", con);
com.ExecuteNonQuery();
Response.Write("<script>alert('注册成功!单击确定返回登陆页面');location='landing.aspx';</script>");
con.Close();
}
else
Response.Write("<script>alert('注册失败')</script>");
}
else
Response.Write("<script>alert('会员名已经存!')</script>");
}
public bool add()
{
string name = Textname.Text;
string pass = FormsAuthentication.HashPasswordForStoringInConfigFile(Textpass.Text, "MD5");
string email = TextEmail.Text;
string address = Textaddress.Text;
string sql = "insert into logininfo(name,pass,email,address) values('" + name + " ','" + pass+ "','" +email + "','" + address + "')";
SqlConnection con = this.createloginconn();
con.Open();
SqlCommand com = new SqlCommand(sql, con);
int i =Convert.ToInt32 (com.ExecuteNonQuery());
if (i > 0)
{
return true;
}
else
{
return false;
}
con.Close();
}
3.修改密码页面设计
3.1界面设置:
单击“修改密码”超链接转到注册页面。
所有用户登录后都可以修改自己的密码,当输入的新密码两次一致是即可修改成功。
在窗体中添加控件,添加的主要控件及用途见下表1-5
3.2关键代码:
需要引用using System.Data.SqlClient;命名空间
public partial class xiugaimima : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Session["login"] == "false")
Response.Redirect("landing.aspx");
}
protected void Button1_Click(object sender, EventArgs e)
{
string name = this.TextBox1.Text.Trim();
string oldpwd = this.TextBox2.Text.Trim();
string newpwd = this.TextBox3.Text.Trim();
try
{
SqlConnection con = new SqlConnection("server=.;database=xsdl;Integrated security=SSPI");
con.Open();
string str = "select count(*) from logininfo where name=@name and pass=@oldpwd";
SqlCommand cmd = new SqlCommand(str, con);
cmd.Parameters.Add("@name", SqlDbType.VarChar, 50);
cmd.Parameters["@name"].Value = name;
cmd.Parameters.Add("@oldpwd", SqlDbType.VarChar, 50);
cmd.Parameters["@oldpwd"].Value = FormsAuthentication.HashPasswordForStoringInConfigFile(oldpwd, "MD5");
int count = Convert.ToInt16(cmd.ExecuteScalar());
if (count > 0)
{
string str2 = "update logininfo set pass='" + FormsAuthentication.HashPasswordForStoringInConfigFile(newpwd, "MD5") + "' where name='" + name + "'";
cmd.CommandText = str2;
cmd.ExecuteNonQuery();
Response.Write("<script>alert('注册成功!单击确定返回登陆页面');location='landing.aspx';</script>");
}
else
{
Response.Write("<script>alert('没有此用户')</script>");
this.TextBox1.Text = "";
TextBox1.Focus();
}
}
catch
{
Response.Write("<script>alert('修改密码不成功')</script>");
}
}
protected void Button2_Click(object sender, EventArgs e)
{
Response.Redirect("landing.aspx");
}
}
六.项目测试报告
1. 目的
为了指导软件测试人员有效地设计测试用例,对所测试软件进行全面地测试,以尽可能发现最隐藏问题。
2.适用范围
适用于所有软件的测试。
3.测试要求在屏幕上的显示位置是否正确、美观
3.1窗口
l 窗口标题是否正确
l 窗口中各对象位置是否正确、美观
l 窗口的系统菜单及按钮操作是否正常
l 窗口在各种不同分辨率下是否能全部显示
3.2对话框(Dialog Box)
l 对话框弹出时机及位置是否正确
l 对话框内各对象位置是否正确
l 对话框内各对象的文字标题意义是否明确
l 模式对话框和非模式对话框的属性是否正确
3.3消息框(Message Box)
l 弹出时机及位置是否正确
l 信息意义是否正确、意义是否明确
l 弹出时必须锁住Mouse消息和键盘输入
l 必须有正确的对象用于退出Message Box
3.4文字Label
l 显示位置要美观
l 文字意义要明确
l 同一界面上字体及字体大小应统一、美观
3.5文字Button
l 显示正确且意义明确
3.6图象Button
l 应相应的文字说明或意义明确
l 应有按下和抬起两种状态
l 在界面中所处位置要美观
3.7输入域
l 字符输入域
l 为空
l 任意字符串(中英文)
l 功能键及符号键
l 超界字符串的处理
3.8显示域
l 显示域中各对象显示位置正确、美观
l 显示域中文字Label信息正确
l 显示域中文字Label字体及字体大小应统一且美观
l 显示域中显示信息应与输入的信息一致
l 在屏幕显示不下时,应增加滚动条以确保信息显示的完整
4.测试结果
经检验,项目满足功能需求,界面布局、控件属性合格,通过测试。
七.项目总结
在此次项目中独自完成了项目的功能设计,结合所学知识综合运用,效果良好。在设计过程中学到了很多东西,同时也深感不足。现在此做一总结。
1.完成情况
Ø 数据库设计成功,数据传递良好;
Ø 界面简约,控件属性正确搭建得体;
Ø 功能实现正常,符合功能要求。
2.项目收获
本项目是独自创作的第一个项目,在制作过程中收获了很多,主要有如下几个方面
Ø 将所学知识用于实践,深入理解了所学知识,运用更加熟练。
Ø 自己查阅资料,扩展了知识面,对项目开发过程有了深入详细了解
Ø 与他人合作,团队协作能力提升
Ø 代码编写水平提高
3.存在不足
Ø 项目开发不是一帆风顺的,开发过程中也有些不足的地方
Ø 准备不充分,入手困难,导致开发周期长
Ø 开发环境运用不太熟练,编代码上有一定影响
Ø 代码书写格式不太规范,易出现语法错误,影响开发进度
4.改进意见
Ø 做任何事情都要认真对待、详细了解、充分准备
Ø 进一步熟悉开发环境,提高代码编写水平,代码书写规范化
Ø 在编写过程中尝试自己编写方法,改变方法,发散思维
Ø 有恒心毅力,刻苦进取