博主介绍:专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了1000+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
第三章 需求分析
需求分析阶段的主要目标是明确该系统所要实现的各个功能,包括一般用户的基本需求和附加需求,系统管理员的需求。
3.1 系统流程分析[5]
图3-1 系统流程图
系统流程分析主要是描述该系统的各种操作的总体过程,作为以后系统实现的参考。以下是本系统的流程图见图3-1。
当用户在浏览器中输入网站地址时,首先就是用户登陆界面(loading.aspx)。有三种不同的角色,即学生、老师和管理员。每个角色的权限不同。用户登陆时候,系统判断若是学生,则到查看通知页(main.aspx)。该页中有导航条,可直接单击切换到修改密码(pwdchange.aspx)、线上答题(answer.aspx)、查看发送消息(messageadd.aspx)等页面。其中,在查看消息页面中,如有要回复的消息,可点击“回复”按钮直接跳转到回复消息(writeback.aspx)页面来回复消息。当用户为老师时,登陆后依然跳转到main.aspx页,不过和学生用户不一样的是,这时候教师用户可以发布通知。教师用户可访问的页面还有修改密码(pwdchange.aspx)、添加题目(questionadd.aspx)、添加学生(memberadd.aspx)、查看答题情况(check.aspx)、查看发送消息(messageadd.aspx)等。其中,在查看答题情况页中,有各章节的各题目,单击“查看”跳转到答题详细情况(answersheet.aspx)页,可查看学生完成该题的详细情况。当用户为管理员时,和老师一样,登陆后到main.aspx页,该页也有查看和发布通知的功能。管理员还可访问的页面有:修改密码(pwdchange.aspx)、添加教师、管理员(memberadd.aspx)。
3.2 使用对象分析
该系统主要的使用对象是教《数据结构》这门课程的老师,以及学习这门课程的学生。还有系统的维护人员即管理员。
3.3 系统功能需求分析[4]
由以上的系统流程图,再通过与业务人员的沟通,得到本系统的主要模块及功能如下:
(1)、系统登陆模块。该功能模块主要实现合法用户登陆本系统。
(2)、用户管理模块。该功能模块主要实现对用户信息的管理。主要包括修改密码和添加用户的功能。
(3)、通知管理模块。该功能模块主要实现对发布通知的管理。主要包括老师、管理员发布通知以及所有用户查看通知。
(4)、用户交流模块。该功能模块用来实现本系统各用户之间的信息交流。例如学生向老师提问,老师答疑等。该模块主要包括查看发布通知、查看发送消息、回复消息的功能。
(5)、题目管理模块。该功能模块主要实现对题库中题目的管理。主要就是添加题目的功能。
(6)、线上答题模块。该功能模块用来实现学生在线完成习题并提交答案。包括自动批改和成绩管理功能。
(7)、检阅答题目模块。该功能模块用来实现老师对学生答题情况的检阅,以及给出最终成绩。
系统功能图如图3-2所示:
图3-2 系统功能图
3.4 系统数据流图[5]
根据系统流程图,用数据流图来表示数据在系统中的从输入到输出过程的变换。数据流图描绘系统必须完成的逻辑功能,不考虑怎样具体去实现这些功能。
图3-3 学生数据流图
图3-3是学生用户使用该系统时的数据流图。它记录了学生从登陆到使用系统提供的各种功能的数据变换。同样的,图3-4为老师用户使用该系统时的数据流程图。
图3-3 老师数据流图
管理员用户的数据流图如图3-4所示。
图3-4 管理员数据流图
3.5 系统运行平台[8]
因为系统需要用到Microsoft visual studio 2005,故需要运行的环境要求相对较高。表3-1是该系统的运行环境。
运行环境 | 服务器 | 客户端 | |
硬件 | CPU | PC服务器或小型机 | PII500或以上 |
内存 | 512MB或以上 | 128MB 或以上 | |
硬盘空间 | 20G或以上 (其中Web服务占用10G空间) | 500MB或以上 | |
软件 | 操作系统 | Windows XP | Windows XP / Windows2000 Professional / Windows 9x等 |
数据库系统 | Sql server2000 |
第四章 总体设计
经过了需求分析阶段后,对于系统要实现的功能已经确定,接下来就是要解决如何去实现这些功能了。系统总体设计的基本目的就是概括地说明系统的这些功能应该如何去实现。通过该阶段将划分出系统的各个组成部分。
4.1 解决方案[1]
由于本系统需要的架构为浏览器/服务器模式,是基于网络的WEB系统,所以本系统解决方案选定为:ASP.NET+IIS+SQL SERVER。
该方案采用的是B/S结构来设计,ASP.NET和IIS的结合适合于大部分的小型或中型应用系统,B/S结构相对于C/S结构来说运行和维护成本都比较低,且更容易扩展。
4.2 数据库设计[2]
该系统后台使用了SQL SERVER 2000数据库,对于一个数据库来讲,后台数据库的设计是比较重要的,好的设计方案可以不必要的数据冗余。
4.2.1 概念结构设计
概念设计的目的是产生反映系统数据库概念结构,该结构独立与计算机硬件结构,独立与支持数据库的DBMS。
实体描述:
-
-
- 管理员(管理员编号,姓名,密码)
- 老师(教师编号,姓名,密码)
- 学生(学生编号,教师编号,姓名,密码)
- 章节(章节号,标题)
- 习题(章节号,题号,题目,代码设定,结果)
- 通知(发布时间,标题,内容,发布人)
- 留言(发送时间,标题,内容,发送人,接收人)
-
联系描述:
-
-
- 老师和学生之间是1:N的关系,一个老师可以教多是学生,但一个学生只有一个数据结构老师。
- 章节和习题之间是1:N的关系,一章里可以有多道习题,但是一道习题只属于一个章节。
- 学生和习题之间是N:N的关系,一个学生可以做多道习题,一道习题也可以由多名学生做。
-
联系属性如下:
答案(学生编号,章节号,题号,答案,建议成绩,最终成绩,运行次数,开始运行时间,结束时间)
E-R图如图4-1所示:
图4-1 系统E-R图
4.2.2 数据库逻辑结构设计
以上的数据库概念结构设计是独立与数据库存在的,通过将其转为适合关系数据库的数据模型,得到的主要的数据实体如表4-1所示:
表4-1 数据实体表
序号 | 实体名 | 数据库表名 |
1 | 管理员 | administrator |
2 | 教师 | teacher |
3 | 学生 | student |
4 | 章节 | chapter |
5 | 习题 | exercise |
6 | 答案 | answersheet |
7 | 通知 | notice |
8 | 留言 | words |
系统设计中用到的表有:
(1)管理员信息表,用来记录管理员的信息。如表4-2所示:
表4-2 管理员信息表
序号 | 字段 | 类型 | 长度 | 说明 | 键 | 允许空 |
1 | adminid | varchar | 15 | 管理员ID | 主键 | n |
2 | adminname | varchar | 10 | 管理员姓名 | y | |
3 | adminpw | varchar | 24 | 管理员密码 | y |
(2)教师信息表,用来记录教师信息。如表4-3所示:
表4-3 教师信息表
序号 | 字段 | 类型 | 长度 | 说明 | 键 | 允许空 |
1 | teacherid | varchar | 15 | 教师ID | 主键 | n |
2 | teachername | varchar | 10 | 教师姓名 | y | |
3 | teacherpw | varchar | 24 | 教师密码 | y |
(3)学生信息表,用来记录教师信息。如表4-4所示:
表4-4 学生信息表
序号 | 字段 | 类型 | 长度 | 说明 | 键 | 允许空 |
1 | studentid | varchar | 15 | 学生ID | 主键 | n |
2 | teacherid | varchar | 15 | 教师ID | n | |
3 | studentname | varchar | 10 | 学生姓名 | y | |
4 | studentpw | varchar | 24 | 学生密码 | y |
表4-5 章节信息表
序号 | 字段 | 类型 | 长度 | 说明 | 键 | 允许空 |
1 | chapterid | varchar | 10 | 章节号 | 主键 | n |
2 | title | varchar | 50 | 标题 | y |
(5)习题信息表,用来记录习题信息。如表4-6所示:
表4-6 习题信息表
序号 | 字段 | 类型 | 长度 | 说明 | 键 | 允许空 |
1 | chapterid | varchar | 10 | 章节号 | 主键 | n |
2 | questionid | varchar | 10 | 习题号 | 主键 | n |
3 | question | varchar | 2048 | 题目 | y | |
4 | data | varchar | 2048 | 代码设定 | y | |
5 | result | varchar | 2048 | 结果 | y |
(6)答案信息表,用来记录答案信息。如表4-7所示:
表4-7 答案信息表
序号 | 字段 | 类型 | 长度 | 说明 | 键 | 允许空 |
1 | studentid | varchar | 15 | 学生编号 | 主键 | n |
2 | chapterid | varchar | 10 | 章节号 | 主键 | n |
3 | questionid | varchar | 10 | 习题号 | 主键 | n |
4 | answer | varchar | 2048 | 答案 | y | |
5 | score | varchar | 4 | 建议成绩 | y | |
6 | grade | varchar | 4 | 最终成绩 | y | |
7 | runtime | varchar | 50 | 运行次数 | y | |
8 | datetimestart | datetime | 8 | 开始时间 | y | |
9 | datetimeend | datetime | 8 | 结束时间 | y |
(7)通知信息表,用来记录通知信息。如表4-8所示:
表4-8 通知信息表
序号 | 字段 | 类型 | 长度 | 说明 | 键 | 允许空 |
1 | datetime | datetime | 8 | 时间 | 主键 | n |
2 | title | varchar | 1024 | 标题 | y | |
3 | notice | varchar | 2048 | 通知内容 | y | |
4 | name | varchar | 15 | 发通知者 | y |
(8)留言信息表,用来记录留言信息。如表4-9所示:
表4-9 留言信息表
序号 | 字段 | 类型 | 长度 | 说明 | 键 | 允许空 |
1 | datetime | datetime | 8 | 时间 | 主键 | n |
2 | title | varchar | 1024 | 标题 | y | |
3 | toname | varchar | 15 | 接收者 | y | |
4 | name | varchar | 15 | 发送者 | y | |
5 | word | varchar | 2048 | 留言内容 | y |
4.3 系统结构设计[2]
该系统的总体设计思想是在客户端通过浏览器访问系统,通过登陆窗口进入系统,不同的用户对系统的访问权限不同。登陆成功后学生用户可以在查看通知、线上答题、修改密码、发表留言。老师用户可以发布通知、检阅答题、添加题目、添加学生用户、修改密码、发表留言。管理员用户可以发布通知、添加老师和管理员用户、修改密码。系统总体功能结构图见图3-2。
4.3.1 系统模块
该模块层次图如图4-1所示。
图4-1 系统登陆模块层次图 图4-2 用户管理模块层次图
用户登陆:用户如实填写自己的用户名、密码,然后选择自己的角色(即学生、老师、管理员),点击“登陆”按钮。系统验证用户所输入的信息是否正确,若正确,则登陆系统,错误,给出相应的出错提示信息。
4.3.2 用户管理模块
该模块层次图如图4-2所示。
修改密码:进入系统后,系统自动保存用户的用户名和密码。用户输入自己的原始密码,再输入新的密码两次(确定用户自己没有不小心输入错误),系统验证原始密码是否正确,若错误,则不允许修改,并弹出错误提示信息。若正确,则看两次输入的密码是否相同,若相同,则允许修改,否则弹出错误提示信息。
添加用户:不同角色用户使用本功能的权限不同。若为学生用户,则无权使用本功能,若为老师用户,只可以添加本班学生,若为管理员用户,则可以添加老师和管理员。输入所要添加用户的用户名、密码和姓名等一些基本信息,然后点击“添加”按钮,不管添加成功与否,都会弹出相应的提示信息。
4.3.3 通知管理模块
该模块层次图如图4-3所示。
图4-3 通知模块层次图 图4-4 用户交流模块层次图
查看发布通知:该功能只有老师和管理员用户可以发布通知,学生用户只可以查看通知。通知内容包括标题、正文、发布人和发布时间。通知的显示是按时间顺序,最近发布的通知在最前面。不管通知发布成功与否,都会弹出相应的提示信息。
4.3.4 用户交流模块
该模块层次图如图4-4所示。
查看发送消息:该功能所有的用户都可使用。每个用户只能看到别人发给自己的消息。消息的内容包括标题、正文、发布人和发布时间。可以点击“回复”按钮进入回复消息的界面回复消息。不管发送消息成功与否,都会弹出相应的提示信息。
回复消息:该功能所有的用户都可使用。回复消息的对象确定,所以不用选择用户。不管回复消息成功与否,都会弹出相应的提示信息。
4.3.5 习题管理模块
该模块层次图如图4-5所示。
图4-5 习题管理模块层次图 图4-6 线上答题模块层次图
添加题目:只有老师用户才可以使用该功能。添加题目的内容包括章节号、题号、题目的文字叙述、该题的代码设定(其中包括规定好的测试数据)以及测试结果。不管添加题目成功与否,都会弹出相应的提示信息。
4.3.6 线上答题模块
该模块层次图如图4-6所示。
线上答题:该功能只有学生用户可以使用。当学生用户进入该界面后,会显示《数据结构》的各章节标题。用户可以选择章节点击进入。然后系统会罗列出用户所选择章节的所有题目。用户要做哪道题目,可以点击“解答”按钮进入该题的解答页面对该题进行解答。用户点击“运行”按钮,系统会对用户输入的代码进行编译处理,并弹出DOS窗口输出编译信息,若编译错误,用户可以根据DOS窗口的提示信息对代码进行修改。最后系统会根据预先设定的测试数据运行所得出的测试结果与数据库中的结果进行比对,如果相同,则认为用户所编写的代码正确,弹出代码编写正确的提示信息;否则弹出错误信息。如果学生答过这道题,再次点击进入回答该题的页面的时候,会显示该生该题所得的分数,并且输入代码用的文本框和按钮全都不可用。
4.3.7 检阅答题模块
该模块层次图如图4-7所示。
图4-7 检阅答题模块层次图
检阅答题:该功能只有老师可以使用。当老师用户进入该界面后,会显示《数据结构》的各章节标题。用户可以选择章节点击进入。然后系统会罗列出用户所选择章节的所有题目。老师选择要查看的题目点击“查看”按钮,系统会进入查看答题情况的界面,该界面会显示出完成该题的本班学生的人数,并把所有完成该题的本班同学的完成信息显示出来,包括运行次数、开始运行时间、结束运行时间、系统给出的建议成绩以及学生编写的该题的代码。老师可以根据这些信息给出一个最后的成绩。
通过以上分析,各功能模块的划分已经完毕,在实际开发过程中还应注意以下几点:
(1)界面的美观,操作的简易性。虽然该系统服务的对象都是专业的计算机操作人员,但是系统的操作应该力求简单明了,让用户能够很容易上手。
(2)功能的通用性。因为本系统虽然只针对《数据结构》这一门特定的课程,但是实际上,只要是程序验证类题目的网上答题与批改及相关的功能,都可以用本系统来实现,只需要把数据库里的数据换一下即可。所有在具体实现的时候应该注重功能的通用性。
第五章 详细设计
5.1 概述
本系统页面由Dreamweaver和Microsoft Visual Studio 2005来设计。VB代码由Microsoft Visual Studio 2005来开发完成。
5.2 人机界面设计[9]
人机界面设计是接口设计的一个重要的组成部分。本系统是一个交互式的系统,人机界面设计尤为重要。本系统有用户帮助设施,还有完备的出错信息处理。
本系统的界面应力求做到简洁、大方。因为网上答题和批改特别是对写代码的题目的批改,其逻辑流程是非常复杂的。但是这些都应该是对用户隐藏的。用户只需要看到与自己有关的内容,比如说用户所需要输入的信息(如ID,答题代码等),以及他所需要看到的系统提供给他的信息(如题目的信息等)。其他的操作都应该在后台完成,然后只把结果返回给用户。
系统界面如图5-1所示。
图5-1 系统界面
5.3 系统各模块详细设计[5]
系统各模块详细设计主要说明本系统的各个功能模块实现的逻辑处理。它是整个系统实现的文字描述。
5.3.1 用户登陆设计
用户登陆设计看似简单,但要实现对各种错误的提示,需要做到的细节也非常烦琐。系统提示输入用户名和密码,并选择用户所对应的角色。当点击“登陆”按钮时,系统会首先验证是否选择了角色,没有的话会弹出出错的提示信息,然后根据用户所选择的角色,到数据库中相应的表查询该用户名和密码是否正确,若不正确弹出出错提示信息,正确的话还要先记录下用户的用户名、密码、角色这些信息(因为以后系统还要用到),还要记录是否已经登陆的标志(避免用户在浏览器中输入必须登陆后才可看见的页面的地址就可访问该页面),然后才把页面转入到通知页(因为虽然不同角色的用户对通知页的使用权限不同,但是都在同一页面内,所以所有用户进入系统后的默认首页就是通知页)。用户登陆系统的流程图如图5-2所示。
图5-2 用户登陆流程图
5.3.2 修改密码设计
所有的用户都可以使用该功能。系统提示输入原来的密码,并输入新密码两次(用来确保用户新密码没有在输入上出现错误)。当用户点击“修改”按钮的时候,系统首先判断用户输入的原密码是否为登陆时用户输入的密码(登陆的时候有记录)。若不是,显示出错提示信息,若是,系统再判断用户两次输入的密码是否相同,若不相同,显示出错信息,若相同,则根据用户登陆的时候,系统记录下的用户名和角色查询数据库中相应的表,找出相应的记录,并把密码更新。最后弹出“密码修改成功”的提示信息,并把用户输入的信息清空。用户修改密码的流程图如图5-3所示。
图5-3 修改密码流程图
5.3.3 添加用户设计
图5-4 添加用户流程图
不同角色的用户使用本功能的权限不同。学生用户没有权限使用本功能,老师用户只可以添加本班的学生,管理员用户可以添加老师和管理员用户,但不可以添加学生用户。因此,学生用户进入不了该页面(因为学生用户进入本系统后,没有按钮可以链接到该页面)。当用户进入到该页面时,系统会根据用户登陆时候记录的角色来判断是老师用户还是管理员用户。若是老师用户,则添加角色的选择框只会有“学生”这一项,并且会显示出该老师所教的所有学生的信息;若是管理员用户,则该选择项有“老师”和“管理员”,并且会显示出所有的老师和管理员的信息。系统提示用户输入要添加的用户的用户名、姓名、密码和角色等信息,当点击“确定”按钮时,系统会首先判断是否输入用户名、密码和是否已经选择了角色,若其中有一项没有,则会显示出相应的出错提示信息;若这些信息都输入了,系统会根据所用户输入的角色到数据库中找到相应的表,并把用户输入的信息插入到表中,然后显示在该页面上,并弹出提示信息。添加用户的流程图5-4所示。
5.3.4 查看发布通知设计
图5-5 查看发布通知流程图
不同角色的用户对该页面的使用权限不同。学生用户只可以查看通知,而老师和学生用户可以查看和发布通知。当用户进入该页面时,系统会根据用户登陆时候记录的角色来判断,若是学生用户,只显示数据库中的通知,且是按时间顺序,最近发布的通知在最前面。若是学生或者是管理员用户,系统还会显示发布通知的信息框。系统提示输入通知的主题和内容,当用户点击“发布”按钮的时候,系统会把这些信息和系统自动获取的当前的时间,还有用户登陆时记录下来的用户名一起插入数据库中,并弹出通知发布成功的提示信息。查看发布通知的流程如图5-5所示。
5.3.5 查看发布消息和回复消息设计
图5-6 查看发布留言流程图
该页面只有老师和学生用户可以使用。首先,用户在进入该页面的时候,系统会根据用户登陆时候记录下的用户名,查询数据库,把发给该用户的消息按时间顺序显示出来(发布时间对近的在最前面)。系统提示用户选择输入发送消息的对象的用户名,并提示输入消息的主题和内容。当用户点击“发送”按钮时,系统会判断用户是否选择了发送对象,若没有,则弹出出错的提示信息,若有,则会把这些信息和用户登陆时系统记录的用户名、系统自动获取的当前的时间一起插入数据库,并弹出消息发送成功的提示信息。该页面在显示该用户收到的消息时,会在每条消息后有一个“回复”按钮,用户如果点击这个按钮,系统会转入到回复消息的页面。在这个页面中,发送消息的对象已经确定,其用户名也会显示出来。用户只需要输入主题和内容,并点击“发送”按钮,系统就可以把这些信息已及该用户的用户名和当前时间一起插入到数据库中,并弹出消息发送成功的提示信息。该页面的流程如图5-6所示。
5.3.6 添加题目设计
图5-7 添加题目流程图
该页面只有老师用户可以使用。用户进入该页面后,系统提示输入章节号、题号、题目描述、代码设定和测试数据。当用户点击“添加”的时候,系统会先判断该章节和该章节的该题目是否存在,若存在,则弹出相应的出错提示信息,若不存在,系统会把这些信息插入数据库,并弹出添加题目成功的提示信息。添加题目的流程如图5-7所示。
5.3.7 在线答题设计
该页面只有学生用户可以使用。用户进入该页面后,系统会把所有的章节罗列出来,用户可以点击任一章节进入,然后系统会罗列出该章节所有的题目,每题后面会有一个“解答”按钮。用户点击任何一道题目后的“解答”按钮,进入解答该题目的页面。当进入该页面时,系统会先记录下进入该页面的时间作为开始时间(作为该生的建议成绩的评判标准之一),然后自动判断该用户是否已经做过该题目,如果做过,则在显示该题目后,再显示提示用户已经做过该题的字样,并且显示出该用户该题所得的成绩,并且用户用来输入代码的文本框和按钮都不可用。如果没有做过,系统则提示输入解答该题目的代码,用户点击“运行”按钮,系统会把从数据库中提取的该题的代码设定和用户刚才输入的代码存放到同一个刚创建的后缀名为“.c”的文件中,并把运行次数加1。然后系统调用批处理文件,来完成对该C文件的命令行编译。并把编译结果通过DOS窗口显示出来,便于让用户看到自己的程序的运行情况(如果运行出错的话,DOS窗口也会给出提示信息,便于用户找出程序中的错误)。同时把程序的运行结果(.exe文件)转换为“.txt”文件。然后系统会从数据库中提取该题的测试数据,把它与程序运行的结果(即刚才转换生成的“.txt”文件)进行比对(比对程序见本小结下面所述),若相同,则说明用户所写代码正确,记录下此时的时间作为结束运行的时间,并把用户所写代码、运行次数、开始时间、运行结束时间、建议成绩(建议成绩计算方法见本小节下面所述)连同该生用户名、该题章节号、题号一起插入数据库(最后成绩默认为建议成绩,不过老师检阅的时候可以修改最后成绩)。最后弹出编写代码正确的提示信息。
比对结果:系统读入运行用户编写的代码所生成的“.txt”文件的字符串,然后读取数据库中测试结果的字符串,先把两字符串的空格回车换行符全部删除掉,然后比较两字符串是否相同。
建议成绩:系统先从数据库中计算出该生是本班第几个完成该题的。前10个基准分为100分,第11到20个为90分,第21到30个为80分,第31个以后是70分;然后系统再判断运行次数,如果运行一次就成功的话不在基准分上扣分,多运行一次就扣5分;最后系统再判断该生编写该题代码所花的时间,用运行结束时间减去开始时间所得的时间段,如果这个时间段大于30分钟,就再在基准分上减去5分。最后所得出的成绩为系统建议成绩。
该页面流程如图7-8所示。
图5-8 在线答题流程图
5.3.8 检阅答题设计
图5-9 检阅答题流程图
只有老师用户才可以使用该页面。当用户进入该页面时,系统会罗列出所有章节,用户可以选择任一章节,点击进入,然后系统会罗列出该章节所有的题目,并且每道题目后都有一个按钮“查看”,用户点击这个按钮后系统会进入查看该题的答题情况的页面。当用户进入到该页面时,系统会根据用户登陆时候记录下来的用户名到数据库中查询,把该老师所教的所有的学生做该题的情况罗列出来,包括整体情况(本班共多少人完成这到题目)和具体情况(每个学生的完成信息,包括运行次数,开始时间,结束运行时间,建议成绩,最后成绩和代码)。每个学生的答题情况中有一个“修改成绩”的按钮,当用户点击这个按钮后,系统会显示输入最后成绩的文本框,还有“修改”和“取消”两个按钮。当用户点击“修改”按钮的时候,系统会把文本框中输入的值更新到数据库。当点击“取消”的时候,系统会退回到刚进入该页面的情况。该页面的流程如图5-9所示。
为了系统的安全性,防止用户不通过登陆就直接在浏览器中输入地址来访问用户本没有权限访问的页面,应该在系统的每个页面的装载过程中先判断用户是否已经登陆,若登陆,则可继续生成该页面以便用户访问;否则返回到登陆页面提示用户登陆。
第六章 系统实现
通过以上的概要设计和详细设计后,系统的各个模块功能和设计已经确定,接下来就是对系统的编码实现。
6.1 用户登陆的主要实现[1]
本功能具体要解决以下几个问题:
(1)、判断用户是否选择了角色。
(2)、根据用户选择的角色查询数据库中相应的表,从而判断用户所输入信息是否合法。
(3)、验证用户名和密码合法后,需要记录下用户名(进入系统后查询、插入数据库的时候要用到)、密码(修改密码时候要用到)、角色(系统判断用户权限要用到)和状态(系统判断用户是否已登陆要用到),然后进入系统。
代码如下(“登陆”按钮的点击事件):
Sub btok_clicked(ByVal sender As Object, ByVal e As EventArgs)
Dim objcon As New SqlConnection()
objcon.ConnectionString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=datastructure"
objcon.Open()
'连接数据库
Dim objcmd As New SqlCommand()
objcmd.Connection = objcon
If ddl_role.SelectedValue = "0" Then '判断是否选择了角色
MsgBox("请选择角色!", MsgBoxStyle.Critical, "错误")
objcon.Close()
Return
ElseIf ddl_role.SelectedValue = "student" Then
objcmd.CommandText = "select * from student where studentid='" & tb_username.Text & "' and studentpw='" & tb_pwd.Text & "'"
ElseIf ddl_role.SelectedValue = "teacher" Then
objcmd.CommandText = "select * from teacher where teacherid='" & tb_username.Text & "' and teacherpw='" & tb_pwd.Text & "'"
ElseIf ddl_role.SelectedValue = "administrator" Then
objcmd.CommandText = "select * from administrator where adminid='" & tb_username.Text & "' and adminpw='" & tb_pwd.Text & "'"
End If
'根据角色的不同写入不同的sql语句,从而可以查询数据库中不同的表
Dim objreader As SqlDataReader = objcmd.ExecuteReader()
'执行sql语句,并把结果返回到objreader对象中
If objreader.Read() = True Then '在数据库中找到用户所输入的信息,则表示用户名和密码且角色合法,准许登陆系统
Session.Add("userid", tb_username.Text)
Session.Add("userpwd", tb_pwd.Text)
Session.Add("role", ddl_role.SelectedItem.Value)
Session.Add("flag", True)
objcon.Close()
Response.Redirect("main.aspx")
Else '数据库中没找到用户所输入信息,则用户名密码不合法,弹出提示信息
objcon.Close()
MsgBox("错误的用户名或密码", MsgBoxStyle.Critical, "错误")
tb_pwd.Text = Nothing
End If
End Sub
6.2 修改密码的主要实现[1]
本功能需要解决以下几个问题:
(1)、获取用户登陆时候的密码,并与用户输入的原密码比对是否相同
实现方法:用Session("userpwd")来获取登陆时系统记录下来的用户密码,再与用户此时输入的密码做比较。
(2)、判断用户输入密码是否合法
实现方法:这个问题是用ASP.NET自带的验证控件(RegularExpressionValidator)来实现。
(3)、判断用户两次输入的密码是否相同
实现方法:这个问题是用ASP.NET自带的验证控件(CompareValidator)来实现。
(4)、在数据库中修改用户密码
代码如下:
Sub btChange_clicked(ByVal sender As Object, ByVal e As EventArgs)
If tbOldpsw.Text <> Session("userpwd").ToString() Then '判断用户所输密码是否和登陆时密码一样
lbOldpsw.Text = "密码不正确!"
Return
End If
Dim conn As New SqlConnection()
conn.ConnectionString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=datastructure"
conn.Open()
Dim cmd As New SqlCommand()
cmd.Connection = conn '连接并打开数据库
If Session("role") = "student" Then '按照不同的角色对数据库中的表进行更新
cmd.CommandText = "update student set studentpw='" + tbPsw.Text + "'where studentid = '" + Session("userid").ToString + "'"
ElseIf Session("role") = "teacher" Then
cmd.CommandText = "update teacher set teacherpw='" + tbPsw.Text + "'where teacherid = '" + Session("userid").ToString + "'"
ElseIf Session("role") = "administrator" Then
cmd.CommandText = "update administrator set adminpw='" + tbPsw.Text + "'where adminid = '" + Session("userid").ToString + "'"
End If
cmd.ExecuteNonQuery()
conn.Close()
Session("userpwd") = tbPsw.Text
lbSucceed.Text = "修改成功!"
lbOldpsw.Text = Nothing
End Sub
6.3 添加用户的主要实现[1]
本功能需要解决以下几个问题:
(1)、不同权限的用户添加的用户角色不一样。老师只能添加学生用户,管理员可以添加老师和管理员用户。
实现方法:在页面装载的函数中,先判断用户角色,根据不同的角色显示不同的控件(修改控件的visible属性即可)。
(2)、要先判断添加的用户是否已经存在。
实现方法:根据所输入的用户名查询数据库,看用户是否已经存在,若存在,则返回提示信息,否则添加到数据库。
(3)、添加用户信息到数据库。
实现方法:根据所选择的用户角色,在不同的表中对数据库进行插入操作。代码如下(只写出添加学生的代码,其它类似):
Sub insertstudent()
Try '出错处理
Dim objcon As New SqlConnection()
objcon.ConnectionString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=datastructure"
objcon.Open()'连接并打开数据库
Dim objcmd As New SqlCommand()
objcmd.Connection = objcon
objcmd.CommandText = "insert into student(studentid,teacherid,studentname,studentpw) values('" + tbid.Text + "','" + Session("userid") + "','" + tbname.Text + "','" + tbpsw.Text + "')"
'插入的sql语句
objcmd.ExecuteNonQuery()
objcon.Close()
Catch '如果在执行上述代码的过程中出现异常,则执行如下代码
MsgBox("插入失败,请重试!")
tbid.Text = Nothing
tbname.Text = Nothing
tbpsw.Text = Nothing
Return
End Try '出错处理结束
MsgBox("添加成功", MsgBoxStyle.Information, "恭喜")
tbid.Text = Nothing
tbname.Text = Nothing
tbpsw.Text = Nothing
bindstudent()
End Sub
(4)、把用户信息用表列出来。
实现方法:用ASP.NET中的datagrid控件来实现。代码如下(只写出显示学生信息列表的代码,其它类似):
Sub bindstudent()'把查询结果绑定到datagrid控件中
Dim objcon As New SqlConnection()
objcon.ConnectionString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=datastructure"
objcon.Open()'连接并打开数据库
Dim adpter As New SqlDataAdapter()
adpter.SelectCommand = New SqlCommand("select * from student where teacherid='" + Session("userid") + "'", objcon)
Dim ds As DataSet = New DataSet()
adpter.Fill(ds, "student")
datagridstudent.DataKeyField = "studentid" '设置主键
datagridstudent.DataSource = ds.Tables("student") '绑定表
datagridstudent.DataBind()
End Sub
6.4 查看发布通知的主要实现[8]
本功能要解决的问题有:
(1)、分页显示通知。
实现方法:用datalist控件实现。代码如下:
Sub bind()'把查询结果绑定到datalist上
Dim curpage As Integer '记录当前的页码
curpage = Int(pagenum.Text.ToString())
'连接数据库
Dim objcon As New SqlConnection()
objcon.ConnectionString = "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=datastructure"
objcon.Open()'连接并打开数据库
Dim adpter As New SqlDataAdapter()
adpter.SelectCommand = New SqlCommand("select * from notice", objcon)
Dim ds As DataSet = New DataSet()
adpter.Fill(ds, "notice")
ds.Tables("notice").DefaultView.Sort = "datetime desc" '把查询结果按照以datetime降序排列的视图绑定到datalist
'以下为分页
Dim ps As New PagedDataSource()
ps.DataSource = ds.Tables("notice").DefaultView
ps.AllowPaging = True
ps.PageSize = 1
ps.CurrentPageIndex = curpage - 1
btlast.Enabled = True
btnext.Enabled = True
If curpage = 1 Then '若当前为第一页,则“上一页”按钮不可用
btlast.Enabled = False
End If
If curpage = ps.PageCount Then '若当前为最后一页,则“下一页”按钮不可用
btnext.Enabled = False
End If
DataList1.DataSource = ps
DataList1.DataBind()
pagecounter.Text = ps.PageCount
End Sub
Overloads Sub page_load(ByVal sender As Object, ByVal e As EventArgs) '装载该页面时,当前页为第一页
If IsPostBack = False Then
bind()
pagenum.Text = "1"
End If
End Sub
Protected Sub btlast_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btlast.Click '“上一页”按钮事件
pagenum.Text = Str(Int(pagenum.Text.ToString) - 1)
bind()
End Sub
Protected Sub btnext_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnext.Click '“下一页”按钮事件
pagenum.Text = Str(Int(pagenum.Text.ToString) + 1)
bind()
End Sub
(2)、发布通知。
实现方法:把用户所输入的信息直接插入数据库中。代码和前面的数据库操作差不多,故不累述。
6.5 查看发布消息和回复消息的主要实现[8]
本功能和查看发布通知的具体实现差不多,只是在datalist控件中加入了一个“回复”按钮,用来打开回复消息的页面。
代码如下:
<asp:HyperLink runat =server ID =hlwriteback Target =_blank NavigateUrl ='<%#"~/writeback.aspx?toname="+DataBinder.Eval(Container.DataItem, "name")%>'>回 复</asp:HyperLink>
在回复消息页面中,用Request("toname")来获取上述代码所传的参数值。
6.6 添加题目的主要实现
本功能和添加用户功能的实现差不多,故不再累述。
6.7 在线答题的主要实现[6][7]
本功能要解决的问题有:
(1)、显示个章节和各章节的题目。
实现方法:用两个datalist控件实现,代码和前面使用datalist代码差不多。
(2)、判断本题是否做过,若做过则显示最后成绩,若没做过则用户可以做。
实现方法:对数据库进行查询操作,代码不再累述。
(3)、编译用户输入的代码。
实现方法:在批处理文件中写命令行编译代码。代码如下:
@echo off [不显示命令]
cd D:\Program Files\Microsoft Visual Studio 8\VC\ [到vcvarsall.bat目录下]
call vcvarsall.bat [运行vcvarsall.bat,配置编译环境]
cl E:\DS\datastructure\answer.c [编译answer.c文件]
answer.exe [运行answer.exe文件]
answer.exe>answer.txt [把answer.exe文件重定向到answer.txt文件中]
pause [暂停,直到用户输入任意字符结束]
(4)、在程序中运行批处理文件。
代码为:System.Diagnostics.Process.Start(Server.MapPath("compiler.bat"))
(5)、比对结果。
实现方法:从数据库中查询该题目的结果,再与编译运行用户所输入代码生成的“.txt”文件,除去所有的回车空格符后比对,相同则插入数据库,否则弹出提示信息提示用户编写的代码有误。
其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者