基于C#++SQL Server的动态口令认证网上选课系统设计与实现(毕业论文+程序源码)
大家好,今天给大家介绍基于C#++SQL Server的动态口令认证网上选课系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦
文章目录:
基于C#++SQL Server的动态口令认证网上选课系统设计与实现(毕业论文+程序源码)1、项目简介2、资源详情3、关键词:4、毕设简介5、资源下载
1、项目简介
本文设计实现的网上选课系统基于平台进行开发,后台由SQL Server 2000数据库支持,通过使用C#语言实现动态网页的效果,达到对数据库的操作以完成使用者的要求。本系统主要由以下几个模块组成:身份验证模块;选课模块;信息管理模块等。用户只需要通过浏览器访问就可以实现选课操作,操作简单灵活。并且本系统登录时使用动态口令进行身份认证,解决了静态口令所遇到的很多攻击性问题,如:网络数据流窃听、字典攻击、穷举攻击等,增加了系统安全性。2、资源详情
项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:9017个字27页
包含内容:整套源码+完整毕业论文
3、关键词:
网上选课系统; 动态口令;C#;4、毕设简介
提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。
1 引言
本系统是采用B/S(Browser/Server)结构进行设计,使用SQL Server 2000构建数据库,并在环境下使用C#语言开发的一个网上选课系统,其具有一定的实用性。管理员在网上公布将开设的所有课程信息,包括:课程名称,开课老师,学时,最大人数等信息。学生通过任何一台能进入选课系统的计算机,打开选课网站,输入学号和自己的密码,验证了身份便可轻松完成网上选课工作。学生通过上网了解课程的各项信息,确定自己所要选修的课程,并进行选择,还可以增加选课,退出已选的课程,查看个人选课等。在整个选课过程中,当一门课程的学生人数已满时,下一个学生选择该门课时,这门课便不能被选上。网上选课提高了学生选课效率,同时大大提高了教务管理工作的效率。
省略
2理论基础
2.1 C#
C#是一种简单的、现代的、面向对象的、类型安全的、版本控制的、兼容的、灵活的、基于组件开发的编程语言,它是作为Visual Studio中的一部分推出。C#既保持了C++中熟悉的语法,还包含了大量的高效代码和面向对象特性,它简化和革新了C++中的类、名字空间、方法重载和异常处理等领域,摒弃了C++的复杂性,更易用,更少出错。它不仅能应用于WEB服务程序的开发,并且还能开发强大的系统级程序。
C#提供了方便的功能,如垃圾收集、类型安全、版本控制等等。仅有的"代价"就是,代码操作默认是类型安全,不允许指针。光是类型安全就可以搞定了。但是,如果我们需要指针,仍可以通过非安全码使用它们,而且当调用非安全码时,不能含有列集。
2.2
不仅仅是 Active Server Page (ASP) 的下一个版本;它还提供了一个统一的 Web 开发模型,其中包括开发人员生成企业级 Web 应用程序所需的各种服务。 的语法在很大程度上与 ASP 兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。可以通过在现有 ASP 应用程序中逐渐添加 功能,随时增强 ASP 应用程序的功能。
是一个已编译的、基于 .NET 的环境,可以用任何与 .NET 兼容的语言(包括 Visual Basic .NET、C# 和 JScript .NET)创作应用程序。另外,任何 应用程序都可以使用整个 .NET Framework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
可以无缝地与 WYSIWYG HTML 编辑器和其他编程工具(包括 Microsoft Visual Studio .NET)一起工作。这不仅使得 Web 开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到 Web 页的 GUI 和完全集成的调试支持。
当创建 应用程序时,开发人员可以使用 Web 窗体或 XML Web services,或以他们认为合适的任何方式进行组合。每个功能都能得到同一结构的支持,使您能够使用身份验证方案,缓存经常使用的数据,或者对应用程序的配置进行自定义。
包括:页面和控件框架、编译器、安全基础结构、状态管理功能、应用程序配置、监视运行状况和性能功能、调试支持、XML Web services框架、可扩展的宿主环境和应用程序生命周期管理、可扩展的设计器环境。
2.3动态口令
一次性动态口令系统是关于网络安全的口令系统。它的特点是用户每次输入的口令一样,但传输到服务器的口令都不一样。每个登录服务器的口令只使用一次,窃听者无法用窃听到的口令来做下一次的登录,确保了口令的安全。
动态口令与传统的静态口令相比具有以下优势 :
(1)动态性: 用户的动态口令随设定的时间或事件等变量自动变化,无需人工干预,某一时刻的产生的动态口令不能在其他时刻使用。
(2)一次性:任一时刻产生的动态口令在其失效前只能被用户使用一次,否则,系统将视其为非法行为而报警。
(3)随机性:动态口令是随机生成、无规律的。即使本次口令被窃听成功,也难以由此猜出下次的口令。
(4)多重安全性:用户的动态口令令牌产生的动态口令与用户名、静态口令等多因素结合实现多重认证。即使电子令牌丢失,用户仍可在应急状态下利用用户名和静态口令进行用户身份认证。而其他非法持有者,单靠令牌无法实现登录及认证。
(5)可管理性:统一的身份认证方式和动态口令生成方式,能大大减小在分发密码、支持服务、密码丢失、密码更改及身份管理等各个方面的开销和成本。
S/KEY口令序列认证方案介绍:
贝尔通信研究中心于1991年开发的S/KEY是OPT(one-time password)的首次实现。
认证步骤:
(1) 用户向服务器发送登录请求,并将用户ID发送给服务器;
(2) 服务器收到登录请求和用户ID后,在认证数据库中查询该ID是否存在。若ID为非法ID,则拒绝此次请求;若ID为合法ID,则从数据库中取出相对应的种子Seed和迭代次数(Seq-i),并将这两个数据传送给客户端;
(3) 客户端收到种子数Seed和迭代次数(Seq-i)后,利用客户端的计算程序计算Hn(Seed//PW),(其中n=Seq-i),并将计算结果作为认证数据发送给服务器;
(4) 服务器收到认证数据后,用服务器端的计算程序(与客户端计算程序使用同样的Hash算法)计算H(HSeq-i(Seed//PW)),然后将此计算结果与数据库中存储的认证数据HSeq-i+1(Seed//PW)相比较。若两者相同,则认证通过,用户成功登录;否则,认证失败,服务器拒绝用户的登录请求。
(5) 若服务器通过了对用户的身份认证,将用收到的HSeq-i(Seed//PW)替换数据库中保存的HSeq-i+1(Seed//PW),以便下一次认证使用。
3需求分析
3.1该设计要完成的功能
本次设计所要实现的功能主要有以下几点:
(一):学生操作
1.身份验证:输入学生学号及密码,然后点击“登录”进入“选课系统的菜单页,开始选课。
2.选课操作以及选课结果查询操作:学生可以选课,修改已选的课程,并且查看自己选课结果。在整个选课过程中,当一门课程的学生人数已满时,下一个学生选择该门课时,这门课将不被选中。
(二):管理员操作
1.身份验证:输入用户名和密码,然后点击“登录”,进入选课系统后台的管理信息系统。
2.基本信息录入及修改。包括课程信息,老师信息以及学生信息等。
(三):老师操作
1.身份验证:输入用户名和密码,然后点击“登录”,进入自己任课菜单页,老师可以查看自己所教课程、每门课的选课学生名单。
3.2设计思路
本系统从学生网上自主选课以及管理员管理信息两个大方面进行设计,要基本实现学生的在线选课功能以及管理员对老师、学生、课程信息的管理等功能,并且登录时在口令中引入不确定因数,使每次登录传送的口令信息不同,增加系统安全性。
登录分三个身份:学生、老师、管理员,登录成功后分别进入不同页面,学生进入“Choose.aspx”页面,老师进入“tlview.aspx”页面,管理员进入“Lession.aspx”页面。学生进入页面后可以选课、查看自己选课、修改密码;老师进入页面后可以查看自己所任课程、选课名单、修改密码;管理员进入页面后可以管理各种信息,如:管理员、老师、学生等,可以修改自己的密码。
动态口令的主要思路是:在登录过程中加入不确定因素,使每次登录过程中传送的信息都不相同,以提高登录过程安全性。例如:登录密码=MD5(随机数+密码),系统接收到登录口令后做一个验算即可验证用户的合法性。
当用户向服务器发出连接请求时,服务器发给用户一个challenge。challenge通常是由两部分组成的:种子值(seed)和迭代值(iteration),它们是在添加用户时产生的,用户收到challenge后进行加密计算:MD5iteration(seed+password),并把结果作为回答返回服务器。服务器收到回答,将它再次加密后与所存密码比较,如果相同就成功登录,并更新密码为MD5iteration(seed+password),迭代值为(iteration-1)。
我们可以看出,用户通过网络传给服务器的口令是种子值和密码的加密结果,用户本身的密码并没有在网上传播。攻击者很难从中提取出原始的密码,又因为迭代值总是不断变化的,这使得下一次用户登录时使用的鉴别信息与上次不同,从而有效地阻止了重放攻击。总之,与静态口令技术的单因子(口令)鉴别不同,一次性动态口令技术是一种多因子(种子值,迭代值和密码)鉴别技术,其中引入的不确定因子使得它更为安全。
管理员添加各类用户时初始化口令流程:
图1 初始化口令流程图
用户登录时验证口令流程:
图2 登录时验证口令流程
4总体设计
4.1功能模块构造
图3 系统功能模块图
4.2功能模块具体介绍
4.2.1身份验证模块
通过登录才可进入选课系统,登录信息提交后检验登录者的身份是否合法,如果合法则转入对应的操作界面。在本系统中,只有三种身份:学生、老师、管理员。登录时在口令中引入不确定因数,使每次登录传送的口令信息不同。
4.2.2信息管理模块
管理员管理模块:负责管理管理员的基本信息。管理员可通过本模块实现添加、删除、修改管理员的基本信息。
老师管理模块:负责管理老师的基本信息。管理员可通过本模块实现添加、删除、修改老师的基本信息,可以选择根据老师工作证号或姓名查找老师。在该模块中可以实现对老师的管理,为排课提供老师的基本信息。
学生管理模块:负责管理学生的基本信息。管理员可通过本模块实现添加、删除、修改学生的基本信息,可以选择根据学生学号或姓名查找学生。在该模块中可以实现对学生的管理。
课程管理模块:负责管理课程的基本信息。管理员可通过本模块实现课程的添加、删除、修改,可以选择按课程名或专业查询已经添加的课程。
系别管理模块:负责管理系别的基本信息。管理员可通过本模块实现系别的添加、删除、修改。
专业管理模块:负责管理专业的基本信息。管理员可通过本模块实现专业的添加、删除、修改,可以按系查询已经添加的专业。
学历管理模块:负责管理学历的基本信息。管理员可通过本模块实现学历的添加、删除、修改。
课程分配模块:负责给老师分配课程。根据老师姓名,课程所属系、专业,给老师分配课程。老师可以教不同系的课程。
密码修改模块:管理员、老师、学生登录成功后在各自的页面点击“修改密码”进行密码修改。
4.2.3选课模块
查看课程选课模块:学生登录后进入选课页面,在规定时间内可以进行选课、退选,选择人数已满的课程时,该课程不能被选上,学生可以查看自己已选课程。
查看选课名单模块:老师登录后可以根据自己所教课程查看选课名单,只有学生选择了的课程才会显示。
4.3 E-R图
图4 E-R图
4.4数据库设计
根据系统功能设计的要求以及功能模块的划分,对于系统用户信息数据库,可以列出以下数据项和数据表:
表1 课程表
管理员表(Managers):存放管理员ID、姓名、编号、密码、添加时间、昵称。
学生扩展信息表(StudentExtends):存放扩展ID、民族ID、性别、生日、照片ID、身份证号、备注。
系别表(Departments):存放系ID、系名、备注。
专业表(StudyDepartment):存放专业ID、系ID、专业名、备注。
年级表(Grades):存放年级ID、年级名、年级标识。
民族表(Races):存放民族ID、民族名。
学历表(StudyTypes):存放学历ID、学历名、学历标识。
学生密码表(StudentPassword):存放学生ID、迭代值、随机值。
老师密码表(StudentPassword):存放老师ID、迭代值、随机值。
管理员密码表(TeacherPassword):存放管理员ID、迭代值、随机值。
5详细设计和实现
5.1连接数据库
所有页面都要连接数据库,代码为:
在Web.Config里添加:
<add name="ACLConnectionString"connectionString="Data Source=(Local); Initial Catalog=ACL;user id=sa;password=123456;" providerName="System.Data.SqlClient"/>
5.2初始化动态口令
在管理员添加用户时初始化动态口令。老师的口令初始化代码如下:
DsTeacherTableAdapters.TeachersTableAdapter dsTeacher = new DsTeacherTableAdapters.TeachersTableAdapter();DsPassWordTableAdapters.TeacherPasswordTableAdapter dsTeacherPassword = new DsPassWordTableAdapters.TeacherPasswordTableAdapter();int TeacherSeq = 10000;Random rm = new Random();int TeacherSeed = rm.Next(1, 99999);string Password = TeacherSeed.ToString() + txtTeacherNumber.Text;for (; TeacherSeq > 0; TeacherSeq--){Password = Encode.EncodeByMD5_32(Password);}dsTeacher.Insert(txtTeacherNumber.Text.Trim(), txtTeacherName.Text, txtTeacherName.Text, Password,DateTime.Now, int.Parse(ddlDepartment.SelectedValue), int.Parse(ddlTeacherState.SelectedValue), int.Parse(txtTeacherMvaxLessionCount.Text));DataTable testdt = dsTeacher.A_GetTeacherByNumber(txtTeacherNumber.Text);string id = testdt.Rows[0].ItemArray.GetValue(0).ToString();dsTeacherPassword.Insert(int.Parse(id), 9999, TeacherSeed);
5.3管理员/老师/学生登录功能
在登录页面对应的地方输入用户名、密码,确认后登录。在提交后的文件中,首先通过学号/工作证号对数据库中的Managers /Students/Teachers表进行检索,若检索到的记录集为空,则说明学号/工作证号错误,从而转到相应的出错处理程序,若记录集不为空,再进行密码判断,通过动态密码算法和数据库中的ManagerPassword /StudentPassword/TeacherPassword看密码是否相等,不相等,做出错处理,相等则转入管理员/学生/老师登录成功的操作页面。
出错及处理:在该模块中可能发生的错误有:
(1)、用户名或密码错误,系统提示“用户名或密码不正确!”。
(2)、捕捉到异常,系统提示“对不起,登录失败,请重新登陆!”。
学生登录身份验证是在switch (rbtnlLogType.SelectedValue)中加如下代码:
case "0": //当身份为0,即学生时{try{DsStudentTableAdapters.StudentsTableAdapter dsStudent = new DsStudentTableAdapters.StudentsTableAdapter();//实例化类DsPassWordTableAdapters.StudentPasswordTableAdapter dsStudentPassword = new DsPassWordTableAdapters.StudentPasswordTableAdapter();//实例化类DataTable dtStudentID = dsStudent.A_GetStudentByStudentNumber(txtNumber.Text);//通过类的实例dsStudent的方法A_GetStudentByStudentNumber得到学号为txtNumber.Text的学生的所有字段的值string StudentID = dtStudentID.Rows[0].ItemArray.GetValue(0).ToString();//得到该学生的ID,并赋值给StudentIDstring StudentAddDate = dtStudentID.Rows[0].ItemArray.GetValue(5).ToString();string StudentEndDate = dtStudentID.Rows[0].ItemArray.GetValue(6).ToString();string StudyDepartmentID = dtStudentID.Rows[0].ItemArray.GetValue(7).ToString();string StudentState = dtStudentID.Rows[0].ItemArray.GetValue(8).ToString();string StudyTypeID = dtStudentID.Rows[0].ItemArray.GetValue(9).ToString();string StudentYearCount = dtStudentID.Rows[0].ItemArray.GetValue(10).ToString();string StudentExtendID = dtStudentID.Rows[0].ItemArray.GetValue(11).ToString();DataTable dtStudent = dsStudentPassword.C_GetStudentPasswordByID(int.Parse(StudentID));string StudentSeq = dtStudent.Rows[0].ItemArray.GetValue(1).ToString();string StudentSeed = dtStudent.Rows[0].ItemArray.GetValue(2).ToString();string StudentPassword = StudentSeed.ToString() + txtPassWord.Text;//将StudentSeed.ToString()和txtPassWord.Text连接起来赋值给StudentPassword,作为要加密的密码int StudentSeq1;for (StudentSeq1 = int.Parse(StudentSeq); StudentSeq1 > 0; StudentSeq1--){StudentPassword = Encode.EncodeByMD5_32(StudentPassword);}//加密过程,将密码加密int.Parse(StudentSeq)次DsLogTableAdapters.LogInfoTableAdapter dalLogInfo = new DsLogTableAdapters.LogInfoTableAdapter();DataTable dtLogInfo = dalLogInfo.A_GetLogInfo(txtNumber.Text, StudentPassword, int.Parse(rbtnlLogType.SelectedValue)); //使用dalLogInfo.A_GetLogInfo方法验证登录,找到学生就写相应字段到表dtLogInfo中if (dtLogInfo.Rows.Count ==1)//如果行数等于1,通过验证{SetCookie("Number", txtNumber.Text);SetCookie("Password", StudentPassword);SetCookie("UserID", dtLogInfo.Rows[0]["UserID"].ToString());SetCookie("RealName", dtLogInfo.Rows[0]["RealName"].ToString());SetCookie("UserName", dtLogInfo.Rows[0]["UserName"].ToString());SetCookie("UserType", rbtnlLogType.SelectedValue);//保存用户信息到CookielblInfo.Visible = true;//显示提醒信息框lblInfo.Text = "登录成功!";//设置要显示的提醒信息dsStudent.Update(GetCookie("Number"), GetCookie("RealName"), GetCookie("RealName"), StudentPassword, DateTime.Parse(StudentAddDate), DateTime.Parse(StudentEndDate),int.Parse(StudyDepartmentID), int.Parse(StudentState), int.Parse(StudyTypeID), int.Parse(StudentYearCount), int.Parse(StudentExtendID), int.Parse(StudentID),int.Parse(StudentID));//更新Students表中该学生字段值int StudentSeq2 = int.Parse(StudentSeq) - 1;dsStudentPassword.Update(int.Parse(StudentID), StudentSeq2, int.Parse(StudentSeed), int.Parse(StudentID));//更新StudentPassword表中该学生字段值Response.Redirect("Choose.aspx", false);//跳到Choose.aspx页面}else{string LogInfo = "用户名或密码不正确!";lblInfo.Visible = true;//显示提示框内容lblInfo.Text = LogInfo;//设置提示框内容return;}//验证未通过,则显示提示信息"用户名或密码不正确!"}catch (Exception ex){GoErrorPage(ex, "对不起,登录失败,请重新登陆!");}}//捕获到异常,写错误日志,并跳到出错页面显示"对不起,登录失败,请重新登陆!"break;//退出switch语句
在登录过程中实现了动态口令身份认证,通过数据表中密码的变化能得到验证。如下两图:
图5 用户“夏雨”第4次登录数据表截图
图6 用户“夏雨”第5次登录数据表截图
5.4管理员/学生/老师密码管理功能
密码管理的前提是用户成功登录,选择密码修改后,按照页面上的提示,在相应的文本框中输入新密码(两次),确定后提交。转入执行的文件后,首先根据传递的学号/工作证号判断两次输入的新密码是否相等,若不等,出错;否则,用新密码代替旧密码,更新Managers/Students/Teachers中的“ManagerPassword”/ “StudentPassword”/“TeacherPassword”字段,并返回登录页面。
出错及处理:在该模块中可能发生的错误有:
新密码两次输入不同,系统提示“新密码不一致,请重新输入!”。
5.5老师信息的添加、删除、修改
老师信息的添加、删除、修改由管理员完成,老师无权操作。在管理员登录成功后点击“老师管理”即进入老师信息页面。
添加老师:
具体操作为对数据库添加新记录。点击“添加老师…”按钮进入添加老师页面,在添加页面输入新老师的信息。当添加的记录已经存在时,提示框显示“已经有相同的工作号存在!”;若为新记录,则进行新记录的添加,添加到表的最后。
出错及处理:重复添加,弹出提示框:“已经有相同的工作号存在!”。
图7 添加老师页面截图
修改老师信息:
在老师信息页面中点击该老师后面的“修改”进入修改页面(实际同添加老师页面),在文本框中输入完整信息后进行覆盖写入,操作与添加大致相同。
删除老师:
在老师信息页面中点击该老师后面的“删除”,弹出注意框“你真的要删除吗?”,在“确定”和“取消”间选择。
学生信息、课程信息、系、专业、学历的添加、删除、修改与老师信息的添加、删除、修改相同,不再赘述。
5.6管理员为老师分配课程
管理员给老师分配课程,选择老师姓名,课程名及课程所属系、专业,按添加按钮,提示分配成功。按“删除”弹出注意框“你确认你要进行这个操作吗?”,在“确定”和“取消”间选择。老师可以教不同系的课程。
在此页面用到了BindGvlist方法,绑定GridView,代码如下:
public void BindGvlist()//声明方法:名称为BindGvlist,无返回值{try{dsLessionTeachersTableAdapters.LessionTeachersTableAdapter lessionteacherDAL = newdsLessionTeachersTableAdapters.LessionTeachersTableAdapter();//实例化类DataTable dt= lessionteacherDAL.C_SelectLessionTeachers();//定义内存中数据的一个表,名字为dt,由实例化类lessionteacherDAL中C_SelectLessionTeachers方法获得的值填充gvlist.DataSource =dt.DefaultView;gvlist.DataBind();//绑定GridView}catch (Exception ex){GoErrorPage(ex.ToString());}//捕获到异常就跳到出错页面}
图8 为老师分配课程页面截图
5.7学生选课
学生进入选课页面后会有该生所在专业的、选课时间包含了当时所在时间的课程。该生已选的课程显示蓝色,在选课时间内可以退选;人数已满课程为红色,不能再选;其它为白色。点击“查看”按钮可以看到自己已选课程。
在该页面用到了BasePage类中验证是否登录的方法CheckLog(),方法如下:
private bool CheckLog() //声明方法:名称为CheckLog,返回值类型为bool(true/false){DsLogTableAdapters.LogInfoTableAdapter dsCheckLogin = new DsLogTableAdapters.LogInfoTableAdapter();//实例化类if (GetCookie("UserType") != "1" && GetCookie("UserType") != "0" && GetCookie("UserType") != "2"){return false;}// Cookie中UserType如果不等于0/1/2,返回falseDataTable dt = dsCheckLogin.A_GetLogInfo(GetCookie("Number") ,GetCookie("Password"), int.Parse( GetCookie("UserType")));//当 Cookie中UserType等于0/1/2,取出保存的Cookie中Number、Password、UserType的值,放入数据表dt中if (dt.Rows.Count == 1){return true;}//如果值存在,返回true,已经登录return false;//否则,返回false,未登录}public void CheckLogin()//声明方法:名称为CheckLogin,返回值类型为void,即不返回值{if (!CheckLog()){TimeOut();//方法TimeOut,无返回值,用作销毁Cookie变量,使用户信息为空Logout();//方法Logout,无返回值,用户退出系统}//如果没有登录,则跳到登录页面}public void CheckLogin(int iType)// CheckLogin方法重载,无返回值,并包含一个值参数iType{if (GetCookie("UserType") != iType.ToString()){GoErrorPage("对不起,你没有权限!");}//如果输入的类型不符,跳到出错页面CheckLogin();}
图9 选课页面截图
5.8老师查看选课名单
老师登录后可以看到管理员分配给自己的又被学生选择了的课程,点击“查看选课的学生”可以看到选该门课的所有学生,点击该学生后面的“查看该生选课”可以看到该学生所选的全部课程。
图10 查看所教课程截图
图11 查看选课名单截图
5.9退出系统
管理员、老师、学生退出系统后都返回到登录页面,用户保存在浏览器客户端的信息将被清空。
结论
从设计到实现结果来看,本系统能够完成管理员添加、修改、删除老师信息、学生信息、课程信息、系、专业、学历,管理员给老师分配课程,老师查看选课名单,学生选课、修改选课、查看自己所选课程等基本要求,并对选课人数、时间进行控制。并且本系统在登录时使用动态口令进行身份认证,与传统的静态口令相比,具有动态性、一次性、随机性和多重安全性。本系统前台界面与后台数据库结合紧密,具有简单易用、容易理解和操作、安全便捷等优点,可以提高教务管理工作的效率,成为学校教务管理的好帮手。
参考文献
[1] 吉根林,崔海源.程序设计教程[M].北京:电子工业出版社,。
[2] 方睿,刁仁宏,吴四九.网络数据库原理及应用[M].成都:四川大学出版社,。
[3] 刘斌,张军.+SQL Server 动态网站开发案例精选[M].北京:清华大学出版社,。
[4] 曹瑞宇.C#编程入门与提高[M].上海:上海科学普及出版社,2002。
[5] Tom Archer.C# 技术内幕[M].北京:清华大学出版社,2002。
[6] Chris H.Pappas,William.Murray.C#精髓[M].北京:人民邮电出版社,2002。
[7] Chris H.Pappas,William.Murray.C# Windows 编程[M].北京:人民邮电出版社,2002。
[8] 郝刚. 2.0开发指南[M].北京:人民邮电出版社,。
[9] 张连宽.华南金融电脑[M].广东:华南金融电脑杂志社,。
致 谢
省略
5、资源下载
本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。
C#毕业设计——基于C#++SQL Server的动态口令认证网上选课系统设计与实现(毕业论文+程序源码)——网上选课系统