选课系统的设计.docx
《选课系统的设计.docx》由会员分享,可在线阅读,更多相关《选课系统的设计.docx(31页珍藏版)》请在冰豆网上搜索。
选课系统的设计
7.5选课系统的设计
本节将在MicrosoftVisualStudio2008中实现学生选课管理系统的主要功能。
其主要内容包括公共类的编写和使用,管理员的登录,管理员首页的制作,管理员对教师信息的修改和添加,管理员对自己信息的修改。
7.5.1Web.Config文件配置
为了使应用程序方便引用,需要在应用程序配置文件(Web.Config文件)中设置数据库连接信息。
连接数据库代码(代码位置:
光盘/ElectiveSystem/web.config)如下:
......
7.5.2公共类的编写
开发项目中以类的形式来组织、封装一些常用的方法和事件,不仅可以提高代码的复用率,也大大方便了代码的管理。
在学生选课系统中共建了4个公共类,具体如下。
✓Alert:
用于管理在项目中用到的多种页面跳转提示框,如直接跳转。
提示信息并跳转等。
✓Common:
用于管理在项目中用的公共类,如MD5加密,清除脚本等。
✓DBBase:
用于管理在项目中对库的各种操作,如连接数据库、获取数据表DataTable等。
(详细信息请查看第六章的Web.Config文件配置)
✓RandomImg:
用于管理在项目组用到的获取随机验证码。
因为数据库操作类DBBase类在本书第六章(6.2.7数据库操作类DBBase简介和使用)中已经进行了详细的介绍。
下面主要介绍RandomImg类、Alert类和Common类的创建过程。
1.类的创建
在创建类时,用户可以在该项目中找到App_Code文件夹,如果项目中没有App_Code文件夹,用户可以在项目上单击鼠标右键,在弹出的菜单中选择“添加ASP.NET文件夹”,添加一个App_Code文件夹。
新建好文件夹后点击鼠标右键,在弹出菜单中选择“添加新项”,在弹出的“添加新项”对话框中选择“类”,并将其命名,单击“添加”按钮即可创建一个新类。
出现得窗口如图7.1所示(此处以创建RandomImg为例)。
2.RamdomImg类(代码位置:
光盘/ElectiveSystem/App_Code/RandomImg.cs)
RamdomImg类主要完成一些与验证嘛相关的功能,比如生成随机验证码字符串、生成验证码的图片等等,其中主要方法包括GenerateCheckCode()、CreateCheckCodeImage(),下面我们将对这些方法分别进行详细讲解。
GenerateCheckCode()方法
GenerateCheckCode方法用于在登入页面自动生成随机验证码。
其代码如下:
publicstaticstringGenerateCheckCode()
{
intnumber;
charcode;
stringcheckCode=String.Empty;
System.Randomrandom=newRandom();
for(inti=0;i<5;i++)
{
number=random.Next();
if(number%2==0)
code=(char)('0'+(char)(number%10));
else
code=(char)('A'+(char)(number%26));
checkCode+=code.ToString();
}
returncheckCode;
}
图7.1“添加新项”对话框
CreateCheckCodeImage(stringcheckCode)方法
CreateCheckCodeImage方法用于给生成的随机验证码加上背景图片。
其代码如下:
publicstaticvoidCreateCheckCodeImage(stringcheckCode)
{
if(checkCode==null||checkCode.Trim()==String.Empty)
return;
System.Drawing.Bitmapimage=new
System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length*12.5)),22);
Graphicsg=Graphics.FromImage(image);
//生成随机生成器
Randomrandom=newRandom();
//清空图片背景色
g.Clear(Color.White);
//画图片的背景噪音线
for(inti=0;i<25;i++)
{
intx1=random.Next(image.Width);
intx2=random.Next(image.Width);
inty1=random.Next(image.Height);
inty2=random.Next(image.Height);
g.DrawLine(newPen(Color.Silver),x1,y1,x2,y2);
}
Fontfont=newSystem.Drawing.Font("Arial",12,(System.Drawing.FontStyle.Bold|
System.Drawing.FontStyle.Italic));
System.Drawing.Drawing2D.LinearGradientBrushbrush=new
System.Drawing.Drawing2D.LinearGradientBrush(newRectangle(0,0,image.Width,
image.Height),Color.Blue,Color.DarkRed,1.2f,true);
g.DrawString(checkCode,font,brush,2,2);
//画图片的前景噪音点
for(inti=0;i<100;i++)
{
intx=random.Next(image.Width);
inty=random.Next(image.Height);
image.SetPixel(x,y,Color.FromArgb(random.Next()));
}
//画图片的边框线
g.DrawRectangle(newPen(Color.Silver),0,0,image.Width-1,image.Height-1);
System.IO.MemoryStreamms=newSystem.IO.MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
System.Web.HttpContext.Current.Response.ClearContent();
System.Web.HttpContext.Current.Response.ContentType="image/Gif";
System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray());
}
3.Alert类(代码位置:
光盘/ElectiveSystem/App_Code/Alert.cs)
Alert类用于管理在项目中用到的多种页面跳转,主要包括Show方法、
ShowAndFramGo方法、FramGo方法,下面进行详细介绍。
show方法
Show方法用于提示信息并返回原页面。
其代码如下:
publicstaticvoidShow(stringtext)
{
HttpContext.Current.Response.Write("alert('"+text+
"');window.history.back();");
HttpContext.Current.Response.End();
}
ShowAndFramGo方法
ShowAndFramGo方法用于提示信息并跳转页面(用于框架页)。
其代码如下:
publicstaticvoidShowAndFramGo(stringtext,stringurl)
{
HttpContext.Current.Response.Write("alert('"+text+
"');window.top.location='"+url+"';");
}
FramGo方法
FramGo方法用于跳转页面(用于框架页)。
其代码如下:
publicstaticvoidFramGo(stringurl)
{
HttpContext.Current.Response.Write("");
}
4.Common类(代码位置:
光盘/ElectiveSystem/App_Code/Common.cs)
Common类主要用于管理在项目中用到的公共方法,主要包括MD5方法、InputText方法、
GetMapPath方法、UploadPicFile方法下面详细介绍Common类中的方法。
MD5(stringInput,boolHalf)方法
MD5类用于字符串加密。
其代码如下:
///
///MD5加密字符串处理
///
///加密是16位还是32位;如果为true为16位
///待加密码字符串
///
publicstaticstringMD5(stringInput,boolHalf)
{
stringoutput=
System.Web.Security.FormsAuthentication.
HashPasswordForStoringInConfigFile(
Input,"MD5").ToLower();
if(Half)//16位MD5加密(取32位加密的9~25字符)
output=output.Substring(8,16);
returnoutput;
}
InputText(stringtext)方法
InputText类用于删除脚本。
其代码如下:
///
///清除所有脚本
///
///
///
publicstaticstringInputText(stringtext)
{
if(string.IsNullOrEmpty(text))
returnstring.Empty;
text=Regex.Replace(text,"[\\s]{2,}","");//twoormorespaces
text=Regex.Replace(text,"(<[b|B][r|R]/*>)+|(<[p|P](.|\\n)*?
>)","\n");//
text=Regex.Replace(text,"(\\s*&[n|N][b|B][s|S][p|P];\\s*)+","");
//
text=Regex.Replace(text,"<(.|\\n)*?
>",string.Empty);//anyothertags
text=text.Replace("'","''");
returntext;
}
GetMapPath(stringstrPath)方法
GetMapPath类用于获取当前的绝对地址。
其代码如下:
///
///获得当前绝对路径
///
///指定的路径
///绝对路径
publicstaticstringGetMapPath(stringstrPath)
{
if(HttpContext.Current!
=null)
{
returnHttpContext.Current.Server.MapPath(strPath);
}
else//非web程序引用
{
strPath=strPath.Replace("/","\\");
if(strPath.StartsWith("\\"))
{
strPath=strPath.Substring(strPath.IndexOf('\\',
1)).TrimStart('\\');
}
ReturnSystem.IO.Path.Combine
(AppDomain.CurrentDomain.BaseDirectory,strPath);
}
}
UploadPicFile(System.Web.UI.WebControls.FileUploadfileUpload,string
pathDir,stringfirstMark)方法
UploadPicFile类用于上传图片。
其代码如下:
///
///
///
///图片路径
///保存图片路径
///前缀名
///
publicstaticstringUploadPicFile(System.Web.UI.WebControls.
FileUploadfileUpload,stringpathDir,stringfirstMark)
{
stringfileName="";
stringretValue="";
try
{
stringtype=
"image/pjpeg|image/jpeg|image/bmp|image/gif|application/x-shockwave-flash|image/png|application/msword|application/vnd.ms-excel";
boolallowType=
type.Contains(fileUpload.PostedFile.ContentType.ToString());
stringlocalExp=
fileUpload.PostedFile.ContentType.ToString().Substring
(fileUpload.PostedFile.ContentType.ToString().LastIndexOf("/")+1);
if(allowType)
{
if((fileUpload.PostedFile.ContentLength/1024)>ImagesMaxSize)
{
retValue="error:
对不起!
你上传的文件大小大于了"+
ImagesMaxSize.ToString()+"KB";
}
else
{
stringexpStr=
fileUpload.PostedFile.FileName.Substring(fileUpload.
PostedFile.FileName.LastIndexOf('.'));//后缀名
Randomrd=newRandom();
fileName=firstMark+sjname()+rd.Next().ToString()+
expStr;
try
{
stringpath=HttpContext.Current.Server.MapPath("~/"+
pathDir);
fileUpload.SaveAs(string.Concat(path,"\\",fileName));
}
catch(Exceptione)
{
throwe;
}
retValue=pathDir+"/"+fileName;
}
}
else
{
retValue="error:
对不起!
暂不支持你所上传的文件类型:
"+localExp;
}
}
catch(Exceptionex)
{
thrownewException(ex.Message);
}
returnretValue;
}
///
///产生随机文件名,以免出现文件重名时覆盖掉原文件的情况
///
///
publicstaticstringsjname()
{
stringsj=null;
sj=DateTime.Now.Year.ToString()+DateTime.Now.Month.ToString()+
DateTime.Now.Day.ToString()+
DateTime.Now.TimeOfDay.Hours.ToString()+
DateTime.Now.TimeOfDay.Minutes.ToString()+
DateTime.Now.TimeOfDay.Milliseconds.ToString();
returnsj;
}
7.5.3管理员模块的设计
管理员是系统的管理者和维护者,管理员可随时对选课系统进行课程信息、学生信息、教师信息进行管理,同时管理员可以对自己的信息进行修改和更新。
●管理员登陆
管理员登录页面是管理员进入系统的唯一接口,只有用户账号和密码准确无误才能进入选课系统。
当管理员通过了信息验证就可以对选课系统进行管理和维护了。
登录页面要实现的主要功能有防止暴力破解程序的不断尝试登录、MD5加密、防止SQL注入式攻击。
管理员登录页面的运行结果如图7.1所示:
图7.1管理员登录界面
关键技术:
●防止暴力破解程序的不断尝试登录
为了防止不良用户利用暴力破解程序不断的尝试登录造成用户信息泄露,我们引进了验证码技术。
验证码就是通过调用系统的自定义函数随机产生的一串字符。
我们可以引用公共类RandomImg类中的GenerateCheckCode()函数返回值为一个随机字符串。
调用方法如下:
stringcode=RandomImg.GenerateCheckCode();
●MD5加密
为了防止用户密码在数据库中以明文显示,用户的密码都进行了MD5加密。
所以要先将用户输入的密码进行MD5加密,然后到数据库中验证用户的账号和密码是否存在。
MD5加密我们调用公共类Common的MD5()方法将用户输入的密码进行加密。
使用方法如下:
Common.MD5(this.txtPwd.Text.ToString().Trim());
●防止SQL注入式攻击
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。
例如:
比如在用户名中输入'admin'在用户密码的文本框中输入or'1'='1',那么查询语句就成为Selectcount(*)fromtbAdminwhereuserName='admin'or'1'='1';
执行之后的返回值为所有的用户总数。
为了防止此类的攻击,登录过程一般都是用存储过程。
调用公共类DBBase中的RunProcedureDatatable()函数返回查询到的用户记录。
下面是
调用DBBase使用存储过程:
DataTabledt=DBBase.RunProcedureDatatable("loginAdmin",parameters);
loginAdmin为管理员登录的存储过程名,parameters为参数列表。
具体实现:
(代码位置光盘\ElectiveSystem\ElectiveSystem\admin\adminLogin.aspx)
(1)、新建一个网站命名为ElectiveSystem,默认主页是adminLogin.aspx。
(2)、根据图7.1管理员登录界面所示,我们在主页中添加两个文本框分别命名为txtName和txtPwd,和两个图片按钮分别命名为ibtnInto和ibtnCancle,主要控件及用途如下表。
控件类型
控件名称
用途
TextBox控件
txtName
用于输入用户名
txtPwd
用于输入用户密码
ImageButton控件
ibtnInto
提交的图片按钮
ibtnCancle
重置登录信息
主要代码如下:
protectedvoidibtnInto_Click(objectsender,ImageClickEventArgse)
{
stringuserName=Common.InputText(txtName.Text.ToString().Trim());
stringpassWord=Common.InputText(txtPwd.Text.ToString().Trim());
stringcheckCode=txtCheck.Text.ToUpper().ToString().Trim();
stringcode=ViewState["code"].ToString