资源描述
精选优质文档-倾情为你奉上第八章 项目实训-学生选课管理系统的开发8.1 需求分析8.1.1 选课工作流程分析新的学年,系统管理人员首先对学生进行基本的信息录入,然后安排老师和所开的课程,系统默认生成的学生和教师登陆系统密码为。学生登陆系统后自身实际情况,查看教师信息,查看课程信息,选择课程。每举行一次考试后由任课老师对成绩录入,任课老师根据实际情况对录入的成绩进行维护,各位同学对以上录入的信息可以根据自己的需要进行适当的查询。8.1.2 系统具体需求分析系统的具体需求如下:l 系统管理员 学校全体学生的信息管理,对教师和课程信息进行录入和必要的维护。l 教师 查看选课学生和成绩录入等。l 学生 查询课程、选课、退课和成绩查询等。8.1.3 系统设计分析本系统的功能主要分为如下几类l 课程管理 用于对各学期课程的开设和修改l 教师信息管理添加、修改和删除教师信息等。l 学生信息管理 添加、修改和删除学生信息等。l 成绩管理 用于对成绩的输入、修改。l 选课管理 用于学生对课程的查询和选课、退课等。8.2 用户角色及功能结构本系统用户角色主要有三类:系统管理员、老师和学生。l 系统管理员 可进行老师信息管理、学生信息管理和课程信息管理等工作,如图8-1所示。l 教师 可以进行学生信息查询、选课查询和成绩录入等工作,如图8-2所示。l 学生 可以进行选课信息查询、选课、退课和成绩查询等工作,如图8-3所示。图8-1 管理员能图图8-2 教师功能图图8-3 学生功能图8.3 系统功能模块设计本系统从功能上可以分为三大模块:学生模块、教师模块和系统管理员模块。以下对各模块进行说明。l 学生模块:学生登录、查看选课信息、选课、查看成绩和修改密码等。l 教师模块:教师登录、查询选课学生、成绩管理和修改密码等。l 系统管理员模块:管理员登录、教师信息管理、学生信息管理、课程信息管理和修改密码。系统模块图如图8-4所示。 图 8-4 系统模块图8.4 数据库设计8.4.1数据库概念设计通过对学生选课进行的需求分析、网站流程设计以及系统功能结构的确定,规划出系统中使用的数据实体对象分别为“管理员”、“学生”、“教师”、和“课程”四个实体,核心的实体E-R图在第六章已经给出。8.4.2 数据库表的逻辑结构设计本系统定义的数据库中包含以下5张个表,下面介绍这些表的结构。l tbAdmin (管理员信息表)表tbAdmin用于保存管理员的基本信息,如表8.1所示。表8.1 管理员信息表序号字段描述类型和长度是否为空说明1aname用户名varchar(20)否主键2apwd密码varchar(50)否MD5加密l tbStudent (学生信息表)表tbStudent用来保存学生信息如表8.2所示表 8.2 学生信息表序号字段描述类型和长度是否为空说明1sno学号char(10)否主键2sname学生姓名char(20)否3ssex学生性别char(2)是4sclass学生班级char(20)是5sdept学生系别char(20)是6spwd学生密码varchar(50)否MD5加密l tbTeacher (教师信息表)表tbTeacher用来保存教师信息如表8.3所示。表8.3 教师信息表序号字段描述类型和长度是否为空说明1tno教师编号char(10)否主键2tname教师姓名char(20)是3tsex教师性别char(2)是4tdept教师系别char(20)是5temail教师邮箱char(50)是6tpwd教师密码varchar(40)否MD5加密l tbCourse(课程信息表)表tbCourse用来保存课程信息如表8.4所示。表8.4 课程信息表序号字段描述类型和长度是否为空说明1cno课程号char(10)否主键2tno教师编号char(20)否外键3cname课程名char(50)是4ccredit学分float是5cdescribe课程描述text是l tbSC (选课信息表)表tbSC用来保存学生选课信息如表8.5所示。表8.5 选课信息表序号字段描述类型和长度是否为空说明1scIdId号int否主键(自增)2sno学号char(10)否外键3cno课程号char(10)否外键4grade成绩char(10)是8.5 Web.Config文件配置 为了使应用程序方便移植,需要在应用程序配置文件(Web.Config文件)中设置数据库连接信息。连接数据库代码(代码位置:光盘/ElectiveSystem/web.config)如下: <configuration> <connectionStrings><add name="sqlconn" providerName="System.Data.SqlClient" connectionString="server=.;database=dbChooseCourse;uid=ChooseCourse; pwd=ChooseCourse"/></connectionStrings> . </configuration>8.6 公共类的编写开发项目中以类的形式来组织、封装一些常用的方法和事件,不仅可以提高代码的复用率,也大大方便了代码的管理。在学生选课系统中共建了4个公共类,具体如下。l Alert:用于管理在项目中用到的多种页面跳转提示框, 如直接跳转、提示信息并跳转等。l Common:用于管理在项目中用的公共类,如MD5加密,清除脚本等。l DBBase:用于管理在项目中对数据库的各种操作,如连接数据库、获取数据表DataTable等。l RandomImg:用于管理在项目组用到的获取随机验证码。 因为数据库操作类DBBase类在本书第七章(7.11 数据库操作类DBBase简介和使用)中已经进行了详细的介绍。下面主要介绍RandomImg类、Alert类和Common类的创建过程。1类的创建在创建类时,用户可以在该项目中找到App_Code文件夹,如果项目中没有App_Code文件夹,用户可以在项目上单击鼠标右键,在弹出的菜单中选择“添加ASP.NET文件夹”,添加一个App_Code文件夹。新建好文件夹后点击鼠标右键,在弹出菜单中选择“添加新项”,在弹出的“添加新项”对话框中选择“类”,并将其命名,单击“添加”按钮即可创建一个新类。出现得窗口如图 8-5所示(此处以创建RandomImg为例)。图 8-5 “添加新项”对话框图2RamdomImg类(代码位置:光盘/ElectiveSystem/App_Code/RandomImg.cs)RamdomImg类主要完成一些与验证码相关的功能,比如生成随机验证码字符串、生成验证码的图片等等,其中主要方法包括GenerateCheckCode()、CreateCheckCodeImage(),下面我们将对这些方法分别进行详细讲解。l GenerateCheckCode()方法GenerateCheckCode方法用于在登入页面自动生成随机验证码。其代码如下: / <summary> / 生成验证码 / </summary>/ <returns>验证码字符串</returns> public static string GenerateCheckCode() int number; char code; string checkCode = String.Empty; System.Random random = new Random(); for (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; l CreateCheckCodeImage(string checkCode)方法CreateCheckCodeImage方法用于给生成的随机验证码加上背景图片。其代码如下:/ <summary> / 生成验证码图片 / </summary>/ <param name="checkCode">验证码字符串</param> 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 Random(); /清空图片背景色 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.Font("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, 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 System.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()方法、FramGo()方法、ShowAndFramGo()方法,下面进行详细介绍。l Show方法Show方法用于提示信息并返回原页面。其代码如下:/ <summary> / 提示信息并返回原页面 / </summary>/ <param name="text">提示信息</param> public static void Show(string text) HttpContext.Current.Response.Write("<script language='javascript'>alert('" + text + "');window.history.back();</script>"); HttpContext.Current.Response.End(); l ShowAndFramGo()方法ShowAndFramGo()方法用于提示信息并跳转页面(用于框架页)。其代码如下: / <summary> / 提示信息并跳转页面(用于框架页) / </summary> / <param name="text">提示信息</param> / <param name="url">要跳转的目标页面</param> public static void ShowAndFramGo(string text, string url) HttpContext.Current.Response.Write("<script language='javascript'>alert('" + text + "');window.top.location = '" + url + "'</script>"); l FramGo()方法FramGo()方法用于跳转页面(用于框架页)。其代码如下: / <summary> / 跳转页面 / </summary>/ <param name="url">目标页面的路径</param> public static void FramGo(string url) HttpContext.Current.Response.Write("<script language='javascript'>window.top.location = '" + url + "'</script>");4. Common类(代码位置:光盘/ElectiveSystem/App_Code/Common.cs)Common类主要用于管理在项目中用到的公共方法,主要包括MD5()方法、InputText()方法、GetMapPath()方法、UploadPicFile()方法。下面详细介绍Common类中的方法。l MD5(string Input, bool Half)方法MD5类用于字符串加密。其代码如下: / <summary> / MD5加密字符串处理 / </summary> / <param name="Half">加密是16位还是32位;如果为true为16位</param> / <param name="Input">待加密码字符串</param>/ <returns>MD5加密结果</returns> public static string MD5(string Input, 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; l InputText(string text)方法InputText类用于删除脚本。其代码如下: / <summary> / 清除所有脚本 / </summary> / <param name="text">输入要进行清除字符串</param>/ <returns>返回清除过脚本后的字符串</returns> public static string InputText(string text) if (string.IsNullOrEmpty(text) return string.Empty; text = Regex.Replace(text, "s2,", " ");/two or more spaces text = Regex.Replace(text, "(<b|Br|R/*>)+|(<p|P(.|n)*?>)", "n");/<br> text = Regex.Replace(text, "(s*&n|Nb|Bs|Sp|P;s*)+", " ");/ text = Regex.Replace(text, "<(.|n)*?>", string.Empty);/any other tags text = text.Replace("'", "''"); return text;l GetMapPath(string strPath)方法GetMapPath()方法用于获取当前的绝对地址。其代码如下: / <summary> / 获得当前绝对路径 / </summary> / <param name="strPath">指定的路径</param> / <returns>绝对路径</returns> public static string GetMapPath(string strPath) if (HttpContext.Current != null) return HttpContext.Current.Server.MapPath(strPath); else /非web程序引用 strPath = strPath.Replace("/", ""); if (strPath.StartsWith("") strPath = strPath.Substring(strPath.IndexOf('', 1).TrimStart(''); return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath); l UploadPicFile(System.Web.UI.WebControls.FileUpload fileUpload, string pathDir,string firstMark)方法UploadPicFile()方法用于上传图片。其代码如下:/ <summary> / 图片上传 / </summary> / <param name="fileUpload">图片路径</param> / <param name="pathDir">保存图片路径</param> / <param name="firstMark">前缀名</param>/ <returns>返回上传结果</returns>public static string UploadPicFile(System.Web.UI.WebControls.FileUpload fileUpload, 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.ms-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) 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.Current.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; 8.7管理员模块概述管理员是系统的管理者和维护者,管理员可随时对选课系统进行课程信息、学生信息、教师信息进行管理,同时管理员可以对自己的信息进行修改和更新。8.8管理员登陆模块8.8.1管理员登陆模块概述管理员登录页面是管理员进入系统的唯一接口,只有用户账号和密码准确无误才能进入选课系统。本系统中,后台管理员默认账号为admin,默认密码为。当管理员成功登录后就可以进入选课系统进行管理和维护。登录页面要实现的主要功能有防止暴力破解程序的不断尝试登录、MD5加密、防止SQL注入式攻击。管理员登录页面的运行结果如图8-6所示: 图8-6 管理员登录界面图8.8.2管理员登陆模块技术分析l 防止暴力破解程序的不断尝试登录为了防止不良用户利用暴力破解程序不断的尝试登录,造成用户信息泄露,我们引进了验证码技术。验证码是一种区分用户是计算机和人的公共全自动程序。验证码技术能够有效的防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。我们通过引用公共类RandomImg类中的GenerateCheckCode()函数返回的随机字符串作为验证码。调用方法如下: string code = RandomImg.GenerateCheckCode();l MD5加密为了防止用户密码在数据库中以明文显示,用户的密码都进行了MD5加密。所以要先将用户输入的密码进行MD5加密,然后到数据库中验证用户的账号和密码是否存在。MD5加密我们调用公共类Common的MD5()方法将用户输入的密码进行加密。使用方法如下: Common.MD5(this.txtPwd.Text.ToString().Trim();l 防止SQL注入式攻击所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。例如:在用户名中输入'admin',在用户密码的文本框中输入" or '1' = '1' ,那么查询语句就成为Select count(*) from tbAdmin where userName = "admin" and password = " " or '1' = '1';执行之后的返回值为所有的用户总数,通过上面的方法攻击者能够不需要知道用户名和密码顺利的登录系统,这将导致系统不能真正验证用户身份,并且会将系统错误地授权给攻击者。为了防止此类的攻击,登录过程一般都是用存储过程。调用公共类DBBase中的RunProcedureDatatable()函数返回查询到的用户记录。下面是调用DBBase使用存储过程: DataTable dt = DBBase.RunProcedureDatatable("loginAdmin", parameters);loginAdmin为管理员登录的存储过程名,parameters为参数列表。8.8.3管理员登陆模块实现过程1设计步骤(1) 新建一个网站命名为ElectiveSystem,添加页面adminLogin.aspx作为管理员的登陆页面。(2) 从“工具箱”选项卡中拖放三个文本框分别命名为txtName、txtPwd和txtCheck,然后继续拖放两个图片按钮分别命名为ibtnInto和ibtnCancle和一个Lable控件命名为lblcheckCode,最后我们还必须添加三个RequiredFieldValidato验证控件验证用户登录名、密码、验证码等信息是否已经填写。登录页面主要控件属性设置及用途如下表8.6所示。表8.6 adminLogin.aspx页面中主要控件的属性设置及其用途控件类型控件名称主要属性设置用途TextBox控件txtName无用于输入用户名txtPwdTextMode属性设为Password用于输入用户密码txtCheck无用于输入验证码ImageButton 控件ibtnInto无提交的图片按钮ibtnCancle无重置登录信息Lable控件lblcheckCode无用于显示验证码RequiredFieldValidator控件valrUserNameErrorMessage属性设为"请输入用户名!" ControlToValidate属性设为"txtName"验证用户名是否为空valrPwdErrorMessage属性设为"请输入密码!" ControlToValidate设为"txtPwd"验证密码是否为空valrChekCodeErrorMessage属性设为"请输入验证码" ControlToValidate属性设为"txtCheck"验证验证码是否为空2 实现代码(1) 当管理员用户跳转到登陆页面时,网站会自动加载登录页面的信息,生成验证码。生成验证码得代码如下: protected void Page_Load(object sender, EventArgs e) if (!Page.IsPostBack) /调用RandomImg类中的GenerateCheckCode()函数生成随机验证码 string code = RandomImg.GenerateCheckCode(); ViewState"code" = code; /将验证码保存到ViewState"code"中 lblcheckCode.Text = code; /将验证码绑定到前台的Lable控件上显示 (2) 当管理员填写完登录信息时,可以单击“登录”按钮,在该按钮的Click事件下,首先判断管理员是否输入了合法的信息,如果输入的信息合法,则进入网站后台,否则弹出对话框,提示管理员名、密码或验证码错误。其代码如下: 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 = ViewState"code".ToString().Trim() ; if (checkCode = code) SqlParameter parameters = new SqlParameter("userName", SqlDbType.VarChar, 20), new SqlParameter("apwd", SqlDbType.VarChar, 50) ; parameters0.Value = this.txtName.Text.ToString().Trim();/用登陆名给参数赋值 parameters1.Value = Common.MD5(this.txtPwd.Text.ToString().Trim(); /调用DBBase使用存储过程 DataTable dt = DBBase.RunProcedureDatatable("loginAdmin", parameters); int count = Convert.ToInt32(dt.Rows00);/若count为1则登录成功,为0则失败 if (count = 1) Session"admin" = userName; Alert.FramGo("adminIndex.aspx"); else Alert.Show("用户名或密码错误"); else Alert.Show("验证码错误"); 8.9管理员首页8.9.1管理员首页概述当管理员成功的通过账户认证后就自动跳到管理员首页如图 8-7所示。图 8-7 管理员首页图8.9.2管理员首页技术分析管理员首页模主要使用了TreeView控件,TreeView主要功能是用于管理员模块的导航, 在建立TreeView控件后,我们可以展开和折叠、显示或隐藏其中的节点。8.9.3管理员首页实现过程1.设计步骤(1) 打开上一节的网站ElectiveSystem,右键点击解决方案,选择添加新页并将页面命名为adminIndex.aspx页面。(2) 在adminIndex.aspx窗体中新建一个div用于页面的布局,在此div中添加一个三行一列Table表格,在表格的第一行拆分成三列,在表格的第一行中的列中依次插入三张背景图片如上图8-7管理员首页所示,图片位置为光盘/ElectiveSystem/ admin/images中的header_left.jpg、header_bg.jpg和header_right.jpg,并在中间列中添加一个lable控件,并命名为lblUserName。在表格的第二行中添加图片header_bg.jpg。(3) 接着新建一个一行两列的表格,在第一列中添加TreeView控件,第二列中添加一个iframe 并将其链接地址设为main.aspx,id设为main。将第一列中的TreeView命名为tvTeacher,选定tvTeacher控件单击其右上角的小三角形,然后选择编辑节点,如图8-8所示。图 8-8 编辑TreeView节点图比如:查看学生节点的NavigateUrl设置为admin/studentManage.aspx,Target属性设为main,表示点击查看学生节点时将studentManage.aspx显示在id为main的iframe中。其他节点的NavigateUrl和Target属性如表8.7所示。 表8.7 TreeView控件的属性设置 节点名NavigateUrlTarget查看学生信息/admin/studentManage.aspxmain学生选课信息/admin/studentElective.aspxmain添加学生/admin/studentAdd.aspxmain查看教师信息/admin/teacherManage.aspxmain添加教师/admin/teacherAdd.aspxmain查看课程信息/admin/courseAdd.aspxmain添加课程/admin/courseManage.aspxmain修改密码/admin/modifyPwd.aspxmain退出index.aspx为空管理员首页页面主要控件属性设置及用途如下表8.8所示。表8.8adminIndex.aspx页面中主要控件的属性设置及其用途 控件类型控件名称主要属性设置控件用途TreeViewtvTeacher见表8.8树形导航条lablelblUserName无显示当前用户名接下来用户自己参照光盘/ElectiveSystem/ admin/mian.aspx页面自己练习一下mian页面制作。做好之后,运行页面,首页就完成了。8.10管理员密码修改模块8.10.1管理员修改密码模块概述管理员可以修改自己的密码来提高管理员资料的安全系数,页面运行结果如图 8-12 所示。图 8-12 修改密码图8.8.2管理员密码修改模块技术分析管理员密码修改模块主要使用了MD5加密技术,我们在实现管理员密码修改的过程中调用了公共类Common中的MD5函数,对用户输入的旧密码进行加密,系统将加密后的密文与数据库中的用户旧密码密文进行比对。如果用户输入的密文与数据库中的密文吻合,则将用户的新密码进行加密,然后更新数据库中的密码信息。8.10.3修改用户密码模块具体实现1.设计步骤(1) 打开上一节的网站ElectiveSystem,右键点击解决方案,选择添加新页并将页面命名为modifyPwd.aspx页面。(2) 从“工具箱”选项卡中拖放三个文本框分别命名为txtOldPwd、txtNewPwd、txtAgainNewPwd,然后添加三个RequiredFieldValidato验证控件验证旧密码、新密码、重复新密码是否已经填写。添加一个CompareValidator比较验证控件命名为valcPwd,用于验证新密码和确认新密码是否一致。(3) 本页添加的主要控件如下表8.9所示: 表8.9 modifyPwd.aspx页面中主要控件的属性设置及其用途 控件类型控件名称主要属性设置用途TextBoxtxtOldPwdTextMode属性设为"Password"用于输入旧密码txtNewPwdTextMode属性设为"Password"用于输入新密码txtAgainNewPwdTextMode属性设为"Password"用于再次输入新密码RequiredFieldValidatorvalrOlderPwdErrorMessage属性设为"请输入旧密码" ControlToValidate属性设为"txtOldPwd"验证旧密码是否为空valrNewPwdErrorMessage属性设为"请输入新密码" ControlToValidate属性设为"txtNewPwd"验证新密码是否为空valrReNewPwdErrorMessage属性设为"请再一次输入新密码" ControlToValidate属性设为"txtAgainNewPwd" Display属性设为"Dynamic"验证教师系别是否为空CompareValidatorvalcPwdErrorMessage属性设为"输入的密码前后不一致,请重新输入!" ControlToCompare属性设为"txtNewPwd" ControlToValidate属性设为"txtAgainNewPwd" Display属性设为"Dynamic"验证两次输入的新密码是否一致Button btnSure无提交按钮(4)在页面上编辑好控件后,只要再编辑btnSure按钮的点击事件,当用户填好信息后单击提交按钮就可以更改密码了。2实现代码当管理员用户填写好用户的旧密码、新密码、确认密码后就可以点击“确认提交”按钮提交密码信息,如果用户的旧密码MD5加密后的密码与管理员用户在数据库中的密码的密文一致,则修改原来用户数据库中的密码为新密码,并提示“修改成功!”。否则提示“旧密码错误!”。 protected void btnSure_Click(object sender, EventArgs e) string adminPwd = Common.MD5(txtOldPwd.Text.ToString().Trim(); string newPwd = Common.MD5(txtNewPwd.Text.ToString().Trim(); string admin = Session"admin".ToString(); string sqlText = "select apwd from tbAdmin where userName='" + admin + "'" DataTable dt = DBBase.GetDataTable(sqlText); string oldApwd = dt.Rows0"apwd".ToString(); if (adminPwd = oldApwd) sqlText = "update tbAdmin set apwd = '" + newPwd + "' where userName='" + admin + "' " DBBase.ExecuteSql(sqlText); Alert.Show("修改成功!"); else Alert.Show("旧密码错误!"); 8.11管理员添加教
展开阅读全文