1、选课系统的设计7.5选课系统的设计本节将在Microsoft Visual Studio 2008中实现学生选课管理系统的主要功能。其主要内容包括公共类的编写和使用,管理员的登录,管理员首页的制作,管理员对教师信息的修改和添加,管理员对自己信息的修改。7.5.1 Web.Config文件配置 为了使应用程序方便引用,需要在应用程序配置文件(Web.Config文件)中设置数据库连接信息。连接数据库代码(代码位置:光盘/ElectiveSystem/web.config)如下: . 7.5.2 公共类的编写 开发项目中以类的形式来组织、封装一些常用的方法和事件,不仅可以提高代码的复用率,也大大方
2、便了代码的管理。在学生选课系统中共建了4个公共类,具体如下。 Alert:用于管理在项目中用到的多种页面跳转提示框, 如直接跳转。提示信息并跳转等。 Common:用于管理在项目中用的公共类,如MD5加密,清除脚本等。 DBBase:用于管理在项目中对库的各种操作,如连接数据库、获取数据表DataTable等。(详细信息请查看第六章的Web.Config文件配置) RandomImg:用于管理在项目组用到的获取随机验证码。 因为数据库操作类DBBase类在本书第六章(6.2.7 数据库操作类DBBase简介和使用)中已经进行了详细的介绍。下面主要介绍RandomImg类、Alert类和Comm
3、on类的创建过程。1.类的创建在创建类时,用户可以在该项目中找到App_Code文件夹,如果项目中没有App_Code文件夹,用户可以在项目上单击鼠标右键,在弹出的菜单中选择“添加ASP.NET文件夹”,添加一个App_Code文件夹。新建好文件夹后点击鼠标右键,在弹出菜单中选择“添加新项”,在弹出的“添加新项”对话框中选择“类”,并将其命名,单击“添加”按钮即可创建一个新类。出现得窗口如图 7.1所示(此处以创建RandomImg为例)。2.RamdomImg类(代码位置:光盘/ElectiveSystem/App_Code/RandomImg.cs)RamdomImg类主要完成一些与验证嘛
4、相关的功能,比如生成随机验证码字符串、生成验证码的图片等等,其中主要方法包括GenerateCheckCode()、CreateCheckCodeImage(),下面我们将对这些方法分别进行详细讲解。 GenerateCheckCode()方法GenerateCheckCode方法用于在登入页面自动生成随机验证码。其代码如下: public static string GenerateCheckCode() int number; char code; string checkCode = String.Empty; System.Random random = new Random(); f
5、or (int i = 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(); return checkCode; 图 7.1 “添加新项”对话框 CreateCheckCodeImage(string checkCode)方法CreateCheckCodeImage方法用于给生成的随机验证码加上背景图片。其代码如下
6、: public static void CreateCheckCodeImage(string checkCode) if (checkCode = null | checkCode.Trim() = String.Empty) return; System.Drawing.Bitmap image = new System.Drawing.Bitmap(int)Math.Ceiling(checkCode.Length * 12.5), 22); Graphics g = Graphics.FromImage(image); /生成随机生成器 Random random = new Ran
7、dom(); /清空图片背景色 g.Clear(Color.White); /画图片的背景噪音线 for (int i = 0; i 25; i+) int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); Font font = new System.Drawing.F
8、ont(Arial, 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic); System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(checkCode, font
9、, brush, 2, 2); /画图片的前景噪音点 for (int i = 0; i 100; i+) int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next(); /画图片的边框线 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); System.IO.MemoryStream ms = new Syst
10、em.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
11、_Code/Alert.cs)Alert类用于管理在项目中用到的多种页面跳转,主要包括Show方法、ShowAndFramGo方法、FramGo方法,下面进行详细介绍。 show方法Show方法用于提示信息并返回原页面。其代码如下: public static void Show(string text) HttpContext.Current.Response.Write(alert( + text + );window.history.back();); HttpContext.Current.Response.End(); ShowAndFramGo方法ShowAndFramGo方法用于
12、提示信息并跳转页面(用于框架页)。其代码如下: public static void ShowAndFramGo(string text, string url) HttpContext.Current.Response.Write(alert( + text + );window.top.location = + url + ;); FramGo方法FramGo方法用于跳转页面(用于框架页)。其代码如下: public static void FramGo(string url) HttpContext.Current.Response.Write(window.top.location =
13、 + url + ;);4. Common类(代码位置:光盘/ElectiveSystem/App_Code/Common.cs)Common类主要用于管理在项目中用到的公共方法,主要包括MD5方法、InputText方法、GetMapPath方法、UploadPicFile方法下面详细介绍Common类中的方法。 MD5(string Input, bool Half)方法MD5类用于字符串加密。其代码如下:/ / MD5加密字符串处理 / / 加密是16位还是32位;如果为true为16位 / 待加密码字符串 / public static string MD5(string Input,
14、 bool Half) string output =System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Input, MD5).ToLower(); if (Half)/16位MD5加密(取32位加密的925字符) output = output.Substring(8, 16); return output; InputText(string text)方法InputText类用于删除脚本。其代码如下:/ / 清除所有脚本 / / / public static string InputTex
15、t(string text) if (string.IsNullOrEmpty(text) return string.Empty; text = Regex.Replace(text, s2, ); /two or more spaces text = Regex.Replace(text, ()+|(),n); / text = Regex.Replace(text, (s*&n|Nb|Bs|Sp|P;s*)+, );/ text = Regex.Replace(text, , string.Empty); /any other tags text = text.Replace
16、(, ); return text; GetMapPath(string strPath)方法GetMapPath类用于获取当前的绝对地址。其代码如下: / / 获得当前绝对路径 / / 指定的路径 / 绝对路径 public static string GetMapPath(string strPath) if (HttpContext.Current != null) return HttpContext.Current.Server.MapPath(strPath); else /非web程序引用 strPath = strPath.Replace(/, ); if (strPath.S
17、tartsWith() strPath = strPath.Substring(strPath.IndexOf(,1).TrimStart(); ReturnSystem.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath); UploadPicFile(System.Web.UI.WebControls.FileUpload fileUpload, string pathDir,string firstMark)方法 UploadPicFile类用于上传图片。其代码如下:/ / / / 图片路径 / 保存图片路径 /
18、前缀名 / public static string UploadPicFile(System.Web.UI.WebControls.FileUploadfileUpload, string pathDir, string firstMark) string fileName = ; string retValue = ; try string type =image/pjpeg|image/jpeg|image/bmp|image/gif|application/x-shockwave -flash|image/png|application/msword|application/vnd.m
19、s-excel;bool allowType =type.Contains(fileUpload.PostedFile.ContentType.ToString(); string localExp =fileUpload.PostedFile.ContentType.ToString().Substring(fileUpload.PostedFile.ContentType.ToString().LastIndexOf(/) + 1); if (allowType) if (fileUpload.PostedFile.ContentLength / 1024) ImagesMaxSize)
20、retValue = error:对不起!你上传的文件大小大于了 +ImagesMaxSize.ToString()+ KB; else string expStr =fileUpload.PostedFile.FileName.Substring(fileUpload.PostedFile.FileName.LastIndexOf(.);/后缀名 Random rd = new Random(); fileName = firstMark + sjname() + rd.Next().ToString() +expStr; try string path = HttpContext.Curr
21、ent.Server.MapPath(/ +pathDir); fileUpload.SaveAs(string.Concat(path, , fileName); catch (Exception e) throw e; retValue = pathDir + / + fileName; else retValue = error:对不起!暂不支持你所上传的文件类型: + localExp; catch (Exception ex) throw new Exception(ex.Message); return retValue; / / 产生随机文件名,以免出现文件重名时覆盖掉原文件的情
22、况 / / public static string sjname() string sj = 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(); return sj; 7.5.3管理员
23、模块的设计 管理员是系统的管理者和维护者,管理员可随时对选课系统进行课程信息、学生信息、教师信息进行管理,同时管理员可以对自己的信息进行修改和更新。 管理员登陆管理员登录页面是管理员进入系统的唯一接口,只有用户账号和密码准确无误才能进入选课系统。当管理员通过了信息验证就可以对选课系统进行管理和维护了。登录页面要实现的主要功能有防止暴力破解程序的不断尝试登录、MD5加密、防止SQL注入式攻击。管理员登录页面的运行结果如图7.1所示: 图7.1管理员登录界面关键技术: 防止暴力破解程序的不断尝试登录为了防止不良用户利用暴力破解程序不断的尝试登录造成用户信息泄露,我们引进了验证码技术。验证码就是通过
24、调用系统的自定义函数随机产生的一串字符。我们可以引用公共类RandomImg类中的GenerateCheckCode()函数返回值为一个随机字符串。调用方法如下: string code = RandomImg.GenerateCheckCode(); MD5加密为了防止用户密码在数据库中以明文显示,用户的密码都进行了MD5加密。所以要先将用户输入的密码进行MD5加密,然后到数据库中验证用户的账号和密码是否存在。MD5加密我们调用公共类Common的MD5()方法将用户输入的密码进行加密。使用方法如下: Common.MD5(this.txtPwd.Text.ToString().Trim()
25、; 防止SQL注入式攻击所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。例如:比如在用户名中输入admin在用户密码的文本框中输入or 1 = 1 ,那么查询语句就成为Select count(*) from tbAdmin where userName = admin or 1 = 1;执行之后的返回值为所有的用户总数。为了防止此类的攻击,登录过程一般都是用存储过程。调用公共类DBBase中的RunProcedureDatatable()函数返回查询到的用户记录。下面是调用DBBase使用存储过程: DataTabl
26、e dt = DBBase.RunProcedureDatatable(loginAdmin, parameters);loginAdmin为管理员登录的存储过程名,parameters为参数列表。具体实现:(代码位置 光盘ElectiveSystemElectiveSystemadminadminLogin.aspx)(1)、新建一个网站命名为ElectiveSystem,默认主页是adminLogin.aspx。(2)、根据图7.1管理员登录界面所示,我们在主页中添加两个文本框分别命名为txtName和txtPwd,和两个图片按钮分别命名为ibtnInto和ibtnCancle,主要控件及
27、用途如下表。控件类型控件名称用途TextBox控件txtName用于输入用户名txtPwd用于输入用户密码ImageButton 控件ibtnInto提交的图片按钮ibtnCancle重置登录信息 主要代码如下:protected void ibtnInto_Click(object sender, ImageClickEventArgs e) string userName = Common.InputText(txtName.Text.ToString().Trim(); string passWord = Common.InputText(txtPwd.Text.ToString().Trim(); string checkCode = txtCheck.Text.ToUpper().ToString().Trim(); string code = ViewStatecode.ToString
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1