学生选课系统《软件工程》课程设计

详细版! 目 录 一、问题定义 5 1.1问题的定义 5 1.2 系统要解决的问题 5 二、可行性研究 6 2.1 引言 6 2.1.1目的 6 2.1.2背景及功能 6 2.1.3 参考资料 6 2.2 可行性研究的前提 6 2.2.1 要求 6 2.2.2 目标 7 2.2.3 条件、假定和限制 7 2.2.4 进行可行性研究的方法 7 2.3 所建议的系统 7 2.3.1 对所建议系统的说明 7 2.3.2 处理流程和数据流程 8 2.3.3 工作负荷 9 2.3.4技术条件方面的可行性 9 2.4 社会因素方面的可行性 10 2.4.1 法律方面的可行性 10 2.4.2 使用方面的可行性 10 2.5 经济可行性 10 2.6 结论 10 三、项目开发计划 11 3.1 引言 11 3.1.1 编写目的 11 3.1.2 背景 11 3.1.3 参考资料 11 3.2 项目概述 11 3.2.1 工作内容 11 3.2.2 产品 12 3.2.4 完成项目的最迟期限 13 3.2.5 关键问题及支持的系统条件 13 3.3 支持条件 13 四、需求分析 14 4.1 系统需求 14 4.2. 功能需求 14 4.3业务流程图 14 五、 概要设计 16 5.1 基本设计概念和处理流程 16 5.2. 系统层次模块图 16 5.3. 系统层次模块图 16 5.4. 模块设计 17 六、数据库设计 19 6.1 引言 19 6.1.1 编写目的 19 6.1.2 背景 19 6.1.3 定义 19 6.1.4 参考资料 20 6.2 外部设计 21 6.2.1 标识符和状态 21 6.2.2 使用它的程序 21 6.2.3 约定 21 6.2.4 专门指导 21 6.2.5 支持软件 21 6.3 结构设计 22 6.4 运用设计 26 6.4.1 数据字典设计 26 6.4.2 安全保密设计 27 七、详细设计 27 7.1 引言 27 7.1.1 编写目的 27 7.1.2 背景 28 7.1.3定义 28 7.1.4 参考资料 28 八、测试报告 28 8.1 引言 28 8.1.1 编写目的 28 8.1.2 定义 29 8.1.3 参考资料 29 8.2 测试概要 29 8.3 测试结果及发现 32 8.3.1 测试具体实施 32 8.4 对软件功能的结论 33 8.4.1 用户登录模块 33 8.5 分析摘要 33 8.5.1 能力 33 8.5.2 评价 34 8.6 测试资源消耗 34 九、用户手册 34 9.1 引言 34 9.1.1 编写目的 34 9.1.2 定义 34 9.1.3 参考资料 34 9.2 用途 35 9.2.1 功能 35 9.2.2 性能 35 9.2.3 安全保密 36 十、附录 38 10.1 数据库的封装代码DB.java 38 10.2 选课系统登陆界面代码Login.java 39 10.3 选课系统学生选课界面代码Student.java 43 10.4 学生选课情况查询代码Query.java 47 10.5 学生用户登录密码的修改代码Modify.java 50 10.6 教师查询学生选课的情况代码Teacher.java 53 10.7 超级管理员查询学生选课的情况代码Administrator.java 55 一、问题定义 1.1问题的定义 学生选课系统:也称学生课程选修制,即允许学生对学校所开设的课程有一定的选择自由,包括选择课程、任课教师和上课时间,选择适合自己的学习量和学习进程。对于习惯了中小学课程(所有的课程由学校统一安排,而且科目从小学到高中有连续性)的大学新生来说,大学的课程多得令他们眼花缭乱,课程分类也比较复杂,因此选课对他们而言还是一件新鲜而陌生的事物。但大学的学习与选课有莫大的关系,必须了解它,才能掌握主动权。而要了解选课制,首先要对大学的课程设置有所认识。

1.2 系统要解决的问题 建立一个小型的学生选课系统,用户(学号,姓名,年龄,性别,系别,班级,出生年月)可以注册成为会员,注册的用户可以选择要选修的课程,也可以查询已选修的课程(包含课程名、任课教师和上课时间,学分)等,老师(姓名,职位,所教课程)可以查看该门课程的选课人数及上课时间,管理员可以查看所有学生的选课情况,查看各门课程的任课老师的信息,查看各门课程选课人数,查看注册用户信息。

二、可行性研究 2.1 引言 2.1.1目的 本项目开发计划旨在明确规范开发过程,保证项目质量,统一小组成员对项 目的理解,并对其开发工作提供指导;
同时还作为项目通过评审的依据。并说明 该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理 地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理 由。

2.1.2背景及功能 A、系统的名称为学生选课系统(Java实现);

B、项目的任务提出者是本次课程设计辅导老师;
开发者包括:
何南平,徐小聪。

2.1.3 参考资料 [1] 张海藩.软件工程导论(第5 版)[M].清华大学出版社,2008 年2 月. [2] 窦万峰.软件工程方法与实践.机械工业出版社,2009 年5 月. [3] 窦万峰.软件工程实验教程.机械工业出版社,2009 年5 月. [4] 陈勇孝.java程序设计实用教程,2008年6月. [5] 王珊,萨师煊.数据库系统概论,高等教育出版社,2006年5月. 2.2 可行性研究的前提 2.2.1 要求 A、功能:
1) 普通用户:
登录系统前用户可以查看用户选课的情况;
用户可以注册;
查找忘记的密码;
查看自己选课的一些相关信息。

B、性能:查询效率尽可能做到精准,信息维护做到简单易用,不需要对用户进行培训;

C、完成期限:到本学期的第21 周。

2.2.2 目标 系统应该尽量做到以下的目标:
A、人力与设备费用的减少;

B、采用现代程序设计技术;

C、数据的处理速度提高;

D、管理信息服务的改进;

E、人员利用率尽可能提高;

F、结果应能清除地审查。

2.2.3 条件、假定和限制 本系统的条件、假定和所受到的限制有以下几方面:
A、所开发系统的运行寿命的最小值为3 年;

B、硬件、软件、运行环境和开发环境方面的条件和限制:由于是个人电脑, 所以硬件设施可能在性能上比较差;
软件全部是免费的,功能可能会受到相应的 限制;
对windows xp比较熟悉,所以开发主要是在这个平台上进行的;

C、可利用的信息和资源:没有相应的软件项目开发的经验,所以能力还是 有限,收集的资料来源有限,故对信息的了解不够全面;

D、系统投入使用的最晚时间:本学期第22 周。

2.2.4 进行可行性研究的方法 根据课本里面的相关知识、图书馆所借的书以及平时所积累的一些经验,综 合本系统所要达到的目标进行分析而得到。

2.3 所建议的系统 2.3.1 对所建议系统的说明 本系统是运用Java制作的一个小型学生选课系统系统,包括用户注册,选课查询。实现这个系统将用到以下几种技术:
1)
Java主要是用来处理各种业务;

2)
数据库系统技术。

2.3.2 处理流程和数据流程 系统的处理流程图见下图所示:
学生登录及选课情况:
选课 修改密码 查询已选课程 登录 学生 教师登录及查看信息:
教师 登录 修改密码 查询学生选课 管理员登录及管理信息:
修改密码 查看所有选的所有课程 查看学生选课情况 2.3.3 工作负荷 现有系统所承担的工作及工作量:
1)系统功能:
(1) 登录、注册,修改密码等功能. (2) 选课功能 (3) 查询功能 2)由于现有开发的系统比较小,只涉及小量的数据,所以工作量小。

2.3.4技术条件方面的可行性 A、在当前的限制条件下,该系统的功能目标是能够达到预期的效果的;

B、开发人员的数量:2 人;
均接受过相关知识的培训,以前也做过一定规模 的系统,具有一定经验;

C、在规定的期限内,本系统的开发可以实现。

2.4 社会因素方面的可行性 2.4.1 法律方面的可行性 本系统纯属于团队的开发所成,不会因为版权的问题造成纠纷。不作为商业 用途,只应用于学习交流。

2.4.2 使用方面的可行性 本系统一经制作完成,可以在windows系统中运行,加之本系统操作上面不存在技术性,所以可以达到易操作性。

2.5 经济可行性 本系统纯粹作为技术开发交流,所有程序及文档均为免费。并不作为商业用途。

2.6 结论 本系统可以立即开始进行实施;
并尽可能做到提前完成;
从人力资源上 面来看,可以充分利用各人的擅长来开发本系统;
从开发成本上面来看,将 支出成本降到最低;
所以推荐此方案最佳。

三、项目开发计划 3.1 引言 3.1.1 编写目的 项目开发计划为项目负责人提供一个框架,使之能合理地估算项目开发所需 的资源、经费和开发进度,并控制软件开发过程按此计划进行。它为项目的启动、 实施以及结束提供了基础。它指定了关于具体项目目标、项目结构、任务、里程 碑、人员、成本、设备、性能以及问题的解决方案等方面的指导原则。

该文档明确开发时间、规范开发过程,保证项目质量,统一小组成员对项目 的理解,并对其开发工作提供指导;
同时还作为项目通过评审的依据。

3.1.2 背景 说明:
1、待开发的软件系统的名称:学生选课系统;

2、该系统将以前做的个人博客进一步扩大和完善。

3.1.3 参考资料 [1] 张海藩.软件工程导论——第5 版[M].清华大学出版社,2008 年2 月. [2] 窦万峰.软件工程方法与实践.机械工业出版社,2009 年5 月. [3] 窦万峰.软件工程实验教程.机械工业出版社,2009 年5 月. [4] 陈勇孝.java程序设计实用教程,2008年6月. [5] 王珊,萨师煊.数据库系统概论,高等教育出版社,2006年5月. 3.2 项目概述 3.2.1 工作内容 本项目的内容包括技术和非技术两大部分:技术上需要进行数据库开发和java技术的基本使用。非技术部分包括:人力资源的充分利用。

3.2.2 产品 – 3.2.2.1 程序 移交给最终用户的内容包括完整的数据库系统,用户手册及相关的代码、文档、说明及范例。

– 3.2.2.2 文件 移交用户的每种文件的名称及内容要点:
A、定义:明确要解决的问题是:可以实现用户(学号,姓名,年龄,性别,系别,班级,出生年月)可以注册成为会员,注册的用户可以选择要选修的课程,也可以查询已选修的课程(包含课程名、任课教师和上课时间)等,老师(姓名,职位,所教课程)可以查看该门课程的选课人数及上课时间,管理员可以查看所有学生的选课情况,查看各门课程的任课老师的信息,查看各门课程选课人数,查看注册用户信息。

B、可行性研究报告:要解决的关键问题是“对于上一个阶段所确定的问题有行得通的解决办法”;

C、需求分析报告:准确地确定“为了解决这个问题,目标系统应该做什么?”,主要是确定目标系统必须具备哪些功能;

D、概要设计报告:概括的说就是“应该怎么实现目标系统”,主要任务是设计程序的体系结构;

E、详细设计报告:设计出程序的详细规格说明;

F、编码及单元测试文档:写出正确的容易理解、容易维护的程序模块;

G、综合测试文档:利用测试工具按照测试方案和流程对产品进行功能和性能测试,甚至根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估。执行测试用例后,需要跟踪故障,以确保开发的产品适合需求;

H、软件维护文档:通过各种必要的维护活动使系统持久地满足用户的需要。

– 3.2.2.3 服务 A、用户方面:可以登录、注册、查询等;

B、系统方面:查看注册用户信息、管理系统的各种信息、查看系统的信息。

C、老师方面:查看学生选课情况、 – 3.2.3 验收标准 用户可对照需求分析中的“需求规定”一栏对系统进行详细的评定、验收(详 见《学生选课需求分析》)或参考项目提供的其他功能/性能指标。

3.2.4 完成项目的最迟期限 按计划,本项目将于本学期第22周完成。在此前提下,开发人员保留对开发时间进度进行局部调整的权利。

3.2.5 关键问题及支持的系统条件 本项目用到了Java程序设计和数据库系统技术应用等开源的框架,所以对学生选课系统的功能的实现可能欠缺。

3.3 支持条件 A、运行该软件系统所需要的硬设备包括服务器和客户机,要求满足(最低 配置):
1) 1G Hz 以上处理器,内存不少于256M。

2) 3G 以上空余硬盘空间。

3) 客户机为普通电脑。

B、本系统是运用Java制作的一个小型学生选课系统系统,包括用户注册,选课查询。实现这个系统将用到以下几种技术:
1)
Java主要是用来处理各种业务;

2)
数据库系统技术(采用mysql数据库实现该系统)。

四、需求分析 4.1 系统需求 用户的需求具体体现在各种学习成绩的提供、保存、更新和查询方面,这就要求数据库结构能充分满足各种信息的输入和输出。收集基本数据、数据结构及数据处理的流程,组成一份详尽数据字典,为后面的具体设计打下基础。

4.2. 功能需求 通过系统功能分析,针对一般的网上选课系统,总结出如下的需求信息:
(1) 学生的需求:网上选课、选课情况查询包括该门课程的老师信息,上课时间以及该门课程的学分,修改密码等;

(2) 本系统主要实现学生信息管理和选课查询。

学生信息包括学号,姓名,年龄,性别,系别,班级,出生年月;

课程信息包括课程名,上课时间,成绩,学分,学时数;

老师信息包括姓名,职位,所教课程;

管理员信息包括用户名和密码,能够查询所有学生的选课情况及信息;

4.3业务流程图 学生登录及选课情况:
选课 修改密码 查询已选课程 登录 学生 教师登录及查看信息:
教师 登录 修改密码 查询学生选课 管理员登录及管理信息:
修改密码 查看所有选的所有课程 查看学生选课情况 登录 管理员 五、 概要设计 5.1 基本设计概念和处理流程 互联网技术的飞速发展,Java等设计工具的方便实用,以及数据库技术的发展给本系统的设计和实现提供了技术上的支持。

系统基本的流程是:用户登录->主界面->选择各项子系统(选课)
老师登录 ->主界面->选择各项子系统(查看学生选课情况)
管理员登录->主界面->选择各项子系统(管理学生选课)
5.2. 系统层次模块图 学生选课系统 登陆/注册 选课 查询 数据库的设计 5.3. 系统层次模块图 5.4. 模块设计 (1) 用户注册模块:填写用户名、密码、确认密码 (2) 用户登录模块:填写已注册的用户名称,填写正确的密码,进入主控制页面。

(3) 用户选课模块:从所有课程中选择自己要选修的课程。

(4) 用户查询模块:可以进行查看所选课程的操作。

六、数据库设计 6.1 引言 6.1.1 编写目的 通过对学生选课系统的研究,根据可行性分析的方案和项目成员的讨论,以及需求说明书,编制数据库设计说明书。本报告通过对学生选课系统的需求分析,明确了系统中功能需求,业务流程和性能要求以及与有关系统的接口关系,从而确定了数据库的设计方向和基本信息的构建,数据库系统设计是软件系统设计中最重要的一部分之一,数据库系统主要是对学生选课系统中所涉及到的数据进行管理和操作。它是对系统的实现和审评的根据之一。这份数据库说明书是为了说明本小组项目的数据库的相关信息,以 供本小组其他成员在使用到数据库时更顺利,以及为了更好的进行数据库设计。本报告的阅读范围:项目组的项目管理、软件开发和系统测试人员、指导老师等。

6.1.2 背景 A、待开发的数据库主要是为学生选课系统来服务的。故该数据库名为selectcourse,软件系统名字为学生选课系统;

B、本项目的任务开发者何南平,徐小聪。

6.1.3 定义 文件中用到的专门术语的定义和外文的首字母组词的原词组如下:
A、B/S:B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。相对于C/S结构属于“胖”客户端,需要在使用者电脑上安装相应的操作软件来说,B/S结构是属于一种“瘦”客户端,大多数或主要的业务逻辑都存在在服务器端,因此,B/S结构的系统不需要安装客户端软件,它运行在客户端的浏览器之上,系统升级或维护时只需更新服务器端软件即可,这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。B/S结构系统的产生为系统面对无限未知用户提供了可能。当然,与C/S结构相比,B/S结构也存在着系统运行速度较慢,访问系统的用户不可控的弱点;

B、DBMS:英文全程:DataBase Management System ,翻译为中文就是“数据库管理系统”,是位于用户和操作系统之间的一层数据库管理软件。数据库管理系统和操作系统一样是计算机的基础软件,也是一个大型复杂的软件系统。它的主要功能包括一下几个方面:1.数据定义功能。2.数据组织,存储和管理;
3.数据操作功能。4.数据库的事物管理和运行管理。5.数据库的建立和维护功能。6.其他功能;

C、SQL语言:SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的SQL语言作为数据输入与管理的SQL接口。它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使他具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句;

D、SQL注入:所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击;

注入大致方法 1)先猜表名 And (Select count(*) from 表名)<>0 2)猜列名 And (Select count(列名) from 表名)<>0 3)或者也可以这样 and exists (select * from 表名) and exists (select 列名from 表名) 返回正确的,那么写的表名或列名就是正确。

6.1.4 参考资料 [1] 张海藩.软件工程导论——第5 版[M].清华大学出版社,2008 年2 月. [2] 窦万峰.软件工程方法与实践.机械工业出版社,2009 年5 月. [3] 窦万峰.软件工程实验教程.机械工业出版社,2009 年5 月. [4] 王珊萨师煊.数据库系统概论(第四版) .高等教育出版,2008 年06 月. [5] 邓子云.JSP网络编程从基础到实践.电子工业出版社,2005 年09 月. 6.2 外部设计 6.2.1 标识符和状态 数据库软件:Mysql 系统要求建立的数据库名称:sc 6.2.2 使用它的程序 可能使用的该系统的应用程序包括:
A、网上学生选课;

B、网上测试软件系统。

6.2.3 约定 陈述一个程序员或一个系统分析员为了能使用此数据库而需要了解的建立标号、标识的约定,例如用于标识数据库的不同版本的约定和用于标识库内各个文卷、、记录、数据项的命名约定等。

6.2.4 专门指导 系统使用Hibernate实现与数据库的接口,该接口基于Hibernate方法生成 的CLASS文件对数据库的建立和控制,是应用程序与数据库的桥梁。最终是对 class文件操作来实现对数据库的管理(一般是一个数据表对应一个CLASS文 件)。

6.2.5 支持软件 Mysql提供了核心的引擎,为支持本系统的数据库BBS需要使用到Mysql 的几个组件,包括:
A、图形管理工具MySQL Administrator 和MySQL Query Browser;

B、MySQL-front。提供了解决MySQL中插入中文乱码的问题;

C、Navicat Lite for MySQL。可以用来快速建立数据库,可拖拉式的MySQL插件。

6.3 结构设计 6.4 运用设计 6.4.1 数据字典设计 数据项名:username 说明:
用户登入名 别名:
无 数据类型:varchar 长度:
3-10 位置:用户信息表 数据项名:password 说明:
用户登入密码 别名:
无 数据类型:varchar 长度:
3-10 位置:用户信息表 数据项名:name 说明:
用户登入名 别名:
无 数据类型:varchar 长度:
3-10 位置:用户信息表 数据项名:dept 说明:
用户所在学院 别名:
无 数据类型:varchar 长度:
3-10 位置:用户信息表 数据项名:banji 说明:
用户所在班级 别名:
无 数据类型:varchar 长度:
3-10 位置:用户信息表 数据项名:lessons 说明:
用户所选课程 别名:
无 数据类型:varchar 长度:
3-10 位置:用户信息表 6.4.2 安全保密设计 一个系统,它的安全性是很重要的,尤其是数据库的安全性能,每当用户发出存取数据库的操作请求后,DBMS查找数据字典,根据安全规则进行合法权限检查,若用户的操作请求超出了定义的权限,系统将拒绝执行此操作。为了让某些合法的用户得到一定的权限,数据库管理员可以授权给让他们。在一些敏感的数据上面采用了MD5算法进行加密,比如用户的登入密码,就算是数据泄漏,用户也不知道怎么登录系统。

七、详细设计 7.1 引言 7.1.1 编写目的 学生选课系统系统详细设计是设计的重要阶段,这个阶段的主要任务是在BBS系统 概要设计书基础上,对概要设计中产生的功能模块进行过程描述,设计功能模块 的内部细节,包括算法和详细数据结构,为编写源代码提供必要的说明。

概要设计解决了软件系统总体结构设计的问题,包括整个软件系统的结构、 模块划分、模块功能和模块间的联系等。详细设计则要解决如何实现各个模块的 内部功能,即模块设计。具体的说,模块设计就是要为已经产生的图书管理各子 系统设计详细的算法。但这并不等同于系统实现阶段用具体的语言编码,它只是 对实现细节作精确的描述,这样编码阶段就可以将详细设计中对功能实现的描 述,直接翻译、转化为用某种程序设计语言书写的程序。

7.1.2 背景 说明:
A、待开发的数据库主要是为学生选课系统来服务的。故该数据库名为selectcourse, 软件系统名字是学生选课系统;

B、本项目的任务提出者:何南平,徐小聪。

7.1.3定义 JVM:Java Virtual Machine(Java 虚拟机),它是一个虚构出来的计算 机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java 虚拟 机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系 统。

7.1.4 参考资料 [1] 张海藩.软件工程导论——第5 版[M].清华大学出版社,2008 年2 月. [2] 窦万峰.软件工程方法与实践.机械工业出版社,2009 年5 月. [3] 窦万峰.软件工程实验教程.机械工业出版社,2009 年5 月. 八、测试报告 8.1 引言 8.1.1 编写目的 本册试报告为学生选课查询系统项目的测试报告,目的在于总结测试阶段的测试以及分析测试结果,描述系统是否符合需求。本规范规定一组软件测试文件。测试是软件生存周期中一个独立的、关键的阶段,也是保证软件质量的重要手段。为了提高检测出错误的几率,使测试能有计划地、有条不紊地进行地进行,就必须要编制测试文件。而标准化的测试文件就如同一种通用的参照体系,可达到便于交流的目的。文件中所规定的内容可以作为对测试过程完备性的对照检查表,故采用这些文件将会提高测试过程的每个阶段的能见度,极大地提高测试工作的可管理性。

8.1.2 定义 A、白盒测试:白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。

B、黑盒测试:黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。

8.1.3 参考资料 [1] 张海藩.软件工程导论(第5 版)[M].清华大学出版社,2008 年2 月. [2] 窦万峰.软件工程方法与实践.机械工业出版社,2009 年5 月. [3] 窦万峰.软件工程实验教程.机械工业出版社,2009 年5 月. [4] 陈勇孝.java程序设计实用教程,2008年6月. [5] 王珊,萨师煊.数据库系统概论,高等教育出版社,2006年5月. 8.2 测试概要 下表是测试本系统的模块计划,见表8-1 所示:
测试人员测试时间测试模块 徐小聪、何南平 2011/07/03——2011/7/11 学生登录模块 徐小聪、何南平 2011/07/03——2011/7/11 老师登录模块 徐小聪、何南平 2011/07/03——2011/7/11 管理员登录模块 徐小聪、何南平 2011/07/03——2011/7/11 学生选课模块 徐小聪、何南平 2011/07/03——2011/7/11 学生查询模块 徐小聪、何南平 2011/07/03——2011/7/11 学生修改密码模块 徐小聪、何南平 2011/07/03——2011/7/11 教师查看选课信息 徐小聪、何南平 2011/07/03——2011/7/11 管理员查询课程选课情况 徐小聪、何南平 2011/07/03——2011/7/11 查看所有学生的选课信息 表8-1 测试本系统的模块计划 1)学生登录时 A. 用户名和密码都为空 B.学生用户名和密码有一个为空 C.学生用户名和密码不匹配 2)教师登录时 A. 用户名和密码都为空 B.学生用户名和密码有一个为空 C.学生用户名和密码不匹配 3)管理员登录时 A. 用户名和密码都为空 B. B.学生用户名和密码有一个为空 C.学生用户名和密码不匹配 4)学生修改密码时 A. 用户名、原密码、新密码都至少有一个为空 B.新密码两次输入不同 C.学生用户名和密码不匹配 D.修改密码成功 8.3 测试结果及发现 8.3.1 测试具体实施 A、用户登录模块测试。该算法用例表见表8-2 所示。

下图是用户登录流程图:
8.4 对软件功能的结论 8.4.1 用户登录模块 这个模块可以防止用户未输入用户名,未输入密码的时候登入到权限以外的系统。

8.5 分析摘要 8.5.1 能力 经测试证实了的本软件的能力。在测试的所有模块当中,大部分书满足用户的需求,但是不排除一些不好的方面。已经可以出处理用户所要求的,符合需求说明书中的要求。

8.5.2 评价 通过上面的综合测试,本系统实现的功能和性能大部分是和用户所提出的一致,有些甚至做的很完善,符合需求说明书中的全部要求。可以交付给用户使用。

8.6 测试资源消耗 本次测试活动花费的时间:10 天;
总人员:2 人 本次测试设计的测试用例还不够完全,影响软件测试的完备性,建议改进。

九、用户手册 9.1 引言 9.1.1 编写目的 本手册主要对学生选课系统进行详细描述和讲解,让用户可以顺利的使用本系统以及更好的管理本系统。

9.1.2 定义 MD5:Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

9.1.3 参考资料 [1] 张海藩.软件工程导论(第5版)[M].清华大学出版社,2008年2月. [2] 窦万峰.软件工程方法与实践.机械工业出版社,2009 年5 月. [3] 窦万峰.软件工程实验教程.机械工业出版社,2009 年5 月. [4] 陈勇孝.java程序设计实用教程,2008年6月. [5] 王珊,萨师煊.数据库系统概论,高等教育出版社,2006年5月. 9.2 用途 9.2.1 功能 此系统的功能层次图如图9-1 所示:
9.2.2 性能 – 9.2.2.1 时间特性 本软件由于数据库较小,相应时间、更新处理时间、数据传送、转换时间、计算时间等都非常迅速,如下:
A、响应时间:响应时间为5 秒内;

B、更新处理时间:由系统运行状态决定;

C、数据的转换和传输时间:能够在5 秒钟内完成。

– 9.2.2.2 灵活性 对于信息的查找,本软件提供了模糊查询的方法,这样最大的满足用户的要求,方便用户的使用。

9.2.3 安全保密 一个系统,它的安全性是很重要的,尤其是数据库的安全性能,每当用户发出存取数据库的操作请求后,DBMS查找数据字典,根据安全规则进行合法权限检查,若用户的操作请求超出了定义的权限,系统将拒绝执行此操作。为了让某些合法的用户得到一定的权限,数据库管理员可以授权给让他们。在一些敏感的数据上面采用了MD5算法进行加密,比如用户的登入密码,就算是数据泄漏,用户也不知道怎么登录系统。

十、附录 10.1 数据库的封装代码DB.java import java.sql.*; public class DB { public static Connection getConn() { Connection conn = null; try { Class.forName(“com.mysql.jdbc.Driver“); conn = DriverManager.getConnection(“jdbc:mysql://localhost/sc“, “root“, “root“); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static Statement getState(Connection conn) { Statement stmt = null; try { if(conn != null) { stmt = conn.createStatement(); } } catch (SQLException e) { e.printStackTrace(); } return stmt; } public static ResultSet getResultSet(Statement stmt, String sql) { ResultSet rs = null; try{ rs = stmt.executeQuery(sql); } catch(SQLException e) { e.printStackTrace(); } return rs; } public static void close(Connection conn) { try { if(conn !=null){ conn.close(); conn = null; } } catch (SQLException e) { e.printStackTrace(); } } public static void close(Statement stmt) { try { if(stmt !=null){ stmt.close(); stmt = null; } } catch (SQLException e) { e.printStackTrace(); } } public static void close(ResultSet rs) { try { if(rs !=null){ rs.close(); rs = null; } } catch (SQLException e) { e.printStackTrace(); } } } 10.2 选课系统登陆界面代码Login.java import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.*; public class Login extends Frame implements ActionListener { Label useName, passWord, l1; TextField tf1, tf2; Checkbox ck1, ck2, ck3; Button b1, b2; CheckboxGroup group; String str; public void setStr(String str) { this.str = str; } Connection conn = null; Statement stmt = null; ResultSet rs = null; public void lauchFrame() { this.setTitle(“学生选课登录“); setLayout(null); useName = new Label(“用户名称 :“); passWord = new Label(“用户密码 :“); tf1 = new TextField(); tf2 = new TextField(); l1 = new Label(“学生选课系统---登录/Login“); str = tf1.getText(); group = new CheckboxGroup(); ck1 = new Checkbox(“管理员“,false , group); ck2 = new Checkbox(“学生“, true, group); ck3 = new Checkbox(“教师“, false, group); b1 = new Button(“确定“); b2 = new Button(“重置“); add(useName); add(passWord); add(l1); add(tf1); add(tf2); add(ck1); add(ck2); add(ck3); add(b1); add(b2); l1.setBounds(new Rectangle(350, 150, 200, 50)); useName.setBounds(new Rectangle(300, 200, 60, 50)); passWord.setBounds(new Rectangle(300, 250, 60, 50)); tf1.setBounds(new Rectangle(370, 210, 200, 25)); tf2.setBounds(new Rectangle(370, 260, 200, 25)); ck1.setBounds(new Rectangle(350, 280, 50, 50)); ck2.setBounds(new Rectangle(410, 280, 50, 50)); ck3.setBounds(new Rectangle(470, 280, 50, 50)); b1.setBounds(new Rectangle(320, 330, 40, 25)); b2.setBounds(new Rectangle(400, 330, 40, 25)); b1.addActionListener(this); b2.addActionListener(this); tf2.setEchoChar('*'); setBounds(100,50,800,700); setVisible(true); setResizable(false); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void actionPerformed(ActionEvent e) { if (e.getSource() == b1 && ck2.getState()) { // 确定 if (tf1.getText().equals(““) || tf2.getText().equals(““)) { JOptionPane.showMessageDialog(null, “学生用户名和密码输入不能为空!“); } else { conn = DB.getConn(); stmt = DB.getState(conn); String sql = “select * from login“; rs = DB.getResultSet(stmt, sql); boolean check = false; try { while (rs.next()) { String userName = rs.getString(1); // 获得数据库第一列 String passWord = rs.getString(2); // 获得数据库第二列 if (tf1.getText().equals(userName) && tf2.getText().equals(passWord)) { // 判断语句 check = true; this.dispose(); str = tf1.getText(); new Student(str); } }if (check == false) { JOptionPane.showMessageDialog(null, “登陆失败,请重新输入学生用户名和密码!“); } } catch (SQLException el) { el.printStackTrace(); } finally { DB.close(rs); DB.close(stmt); DB.close(conn); } } } else if (e.getSource() == b1 && ck1.getState()) { if (tf1.getText().equals(““) || tf2.getText().equals(““)) { JOptionPane.showMessageDialog(null, “请输入管理员用户名和密码!“); } else { conn = DB.getConn(); stmt = DB.getState(conn); String sql = “select * from administrator“; rs = DB.getResultSet(stmt, sql); boolean check = false; try { while (rs.next()) { String userName = rs.getString(1); // 获得数据库第一列 String passWord = rs.getString(2); // 获得数据库第二列 if (tf1.getText().equals(userName) && tf2.getText().equals(passWord)) { // 判断语句 check = true; this.dispose(); new Administrator(); } }if (check == false) { JOptionPane.showMessageDialog(null, “登陆失败,请重新输入管理员用户名和密码!“); } } catch (SQLException el) { el.printStackTrace(); } finally { DB.close(rs); DB.close(stmt); DB.close(conn); } } } else if (e.getSource() == b1 && ck3.getState()) { if (tf1.getText().equals(““) || tf2.getText().equals(““)) { JOptionPane.showMessageDialog(null, “请输入教师用户名和密码!“); } else { conn = DB.getConn(); stmt = DB.getState(conn); String sql = “select * from teacher“; rs = DB.getResultSet(stmt, sql); boolean check = false; try { while (rs.next()) { String userName = rs.getString(1); // 获得数据库第一列 String passWord = rs.getString(2); // 获得数据库第二列 if (tf1.getText().equals(userName) && tf2.getText().equals(passWord)) { // 判断语句 check = true; this.dispose(); new Teacher(); } }if (check == false) { JOptionPane.showMessageDialog(null, “登陆失败,请重新输入教师用户名和密码!“); } } catch (SQLException el) { el.printStackTrace(); } finally { DB.close(rs); DB.close(stmt); DB.close(conn); } } } else if (e.getSource() == b2) { tf1.setText(““); //把用户名和密码设置为空 tf2.setText(““); } } public static void main(String[] args) { new Login().lauchFrame(); } } 10.3 选课系统学生选课界面代码Student.java import java.awt.*; import java.awt.event.*; import java.sql.*; import java.util.*; public class Student extends Frame implements ActionListener, ItemListener { Label l1, l2, l3, l4, l5, l6; Label field1, field2, field3, field4; TextArea area ; Button b1, b2, b3, b4; Checkbox box1, box2, box3, box4, box5, box6, box7, box8, box9; Connection conn = null; Statement stmt = null; ResultSet rs = null; Login login = new Login(); public Student() { } public Student(String str) { this.setTitle(“学生选课界面“); setLayout(null); l1 = new Label(“当前位置---学生选课“); l2 = new Label(“学号:“); l3 = new Label(“姓名:“); l4 = new Label(“学院:“); l5 = new Label(“班级:“); l6 = new Label(“下面为可以选修的课程:“); field1 = new Label(str); field2 = new Label(); field3 = new Label(); field4 = new Label(); lauch(); add(l1); add(l2); add(l3); add(l4); add(l5); add(l6); add(field1); add(field2); add(field3); add(field4); l1.setBounds(new Rectangle(350, 50, 200, 50)); l2.setBounds(new Rectangle(150, 100, 30, 50)); field1.setBounds(new Rectangle(185, 115, 80, 20)); l3.setBounds(new Rectangle(270, 100, 30, 50)); field2.setBounds(new Rectangle(310, 115, 80, 20)); l4.setBounds(new Rectangle(400, 100, 30, 50)); field3.setBounds(new Rectangle(440, 115, 90, 20)); l5.setBounds(new Rectangle(540, 100, 30, 50)); field4.setBounds(new Rectangle(580, 115, 80, 20)); l6.setBounds(new Rectangle(150, 150, 200, 50)); box1 = new Checkbox(“离散数学“, false); box2 = new Checkbox(“汇编语言“, false); box3 = new Checkbox(“java语言设计“, false); box4 = new Checkbox(“软件工程“, false); box5 = new Checkbox(“操作系统“, false); box6 = new Checkbox(“马克思政治学“, false); box7 = new Checkbox(“数据结构“, false); box8 = new Checkbox(“数据库系统“, false); box9 = new Checkbox(“jsp程序设计“, false); box1.addItemListener(this); box2.addItemListener(this); box3.addItemListener(this); box4.addItemListener(this); box5.addItemListener(this); box6.addItemListener(this); box7.addItemListener(this); box8.addItemListener(this); box9.addItemListener(this); add(box1); add(box2); add(box3); add(box4); add(box5); add(box6); add(box7); add(box8); add(box9); box1.setBounds(new Rectangle(150, 200, 70, 50)); box2.setBounds(new Rectangle(220, 200, 70, 50)); box3.setBounds(new Rectangle(290, 200, 90, 50)); box4.setBounds(new Rectangle(380, 200, 70, 50)); box5.setBounds(new Rectangle(450, 200, 70, 50)); box6.setBounds(new Rectangle(520, 200, 90, 50)); box7.setBounds(new Rectangle(610, 200, 70, 50)); box8.setBounds(new Rectangle(150, 250, 80, 50)); box9.setBounds(new Rectangle(230, 250, 80, 50)); area = new TextArea(); add(area); area.setBounds(new Rectangle(150, 300, 540, 280)); b1 = new Button(“确定“); b2 = new Button(“取消“); b3 = new Button(“查询“); b4 = new Button(“修改密码“); add(b1); add(b2); add(b3); add(b4); b1.addActionListener(this); b2.addActionListener(this); b3.addActionListener(this); b4.addActionListener(this); b1.setBounds(150, 600, 40, 25); b2.setBounds(250, 600, 40, 25); b3.setBounds(350, 600, 40, 25); b4.setBounds(450, 600, 60, 25); setBounds(100,50,800,700); setVisible(true); setResizable(false); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } });

} public void actionPerformed(ActionEvent e) { String sno, name, lessons, selectResult, insertStr; sno = field1.getText(); name = field2.getText(); lessons = area.getText(); if(e.getSource() == b1) { conn = DB.getConn(); stmt = DB.getState(conn); try { selectResult = “(“ + “'“ + sno + “'“ + “,“ + “'“ + name + “'“ + “,“ + “'“ + lessons + “'“ + “)“; insertStr = “INSERT INTO course values“ + selectResult; stmt.executeUpdate(insertStr); this.dispose(); new Query(sno); } catch (SQLException h) { System.out.println(h); } finally { DB.close(rs); DB.close(stmt); DB.close(conn); } } else if(e.getSource() == b2) { System.exit(0); } else if(e.getSource() == b3) { this.dispose(); new Query(sno); } else if(e.getSource() == b4) { this.dispose(); new Modify(); } } ArrayList<String> num = new ArrayList<String>(); public void itemStateChanged(ItemEvent e) { Checkbox box = (Checkbox) e.getSource(); area.setText(““); if (box.getState()) { //getState()确定此复选框是处于“开”状态,还是处于“关”状态 num.add(box.getLabel()); //getLabel()获取此复选框的标签 for(int i=0;i<num.size();i++) { area.append(num.get(i)+“\n“); } } else { for(int i=0;i<num.size();i++) { if(box.getLabel().equals(num.get(i))) { num.remove(i); } } for(int i=0;i<num.size();i++) { area.append(num.get(i)+“\n“); } } } public void lauch() { String name, dept, banji; conn = DB.getConn(); stmt = DB.getState(conn); String s = field1.getText(); String sql = “select * from student where username='“ + s + “'“; rs = DB.getResultSet(stmt, sql); try { while(rs.next()) { name = rs.getString(“name“); dept = rs.getString(“dept“); banji = rs.getString(“banji“); field2.setText(name); field3.setText(dept); field4.setText(banji); } } catch(SQLException h) { System.out.println(h); } finally { DB.close(rs); DB.close(stmt); DB.close(conn); } } } 10.4 学生选课情况查询代码Query.java import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.JOptionPane; public class Query extends Frame implements ActionListener { Label l1, l2, l3, l4, l5, l6, l7; Label field1, field2, field3, field4; Button b1, b2; TextArea area; Connection conn = null; Statement stmt = null; ResultSet rs = null; Student student; Login login = new Login(); public Query(String str) { this.setTitle(“学生选课查询界面“); setLayout(null); l1 = new Label(“当前位置---学生选课情况查询 “); l2 = new Label(“学号:“); l3 = new Label(“姓名:“); l4 = new Label(“学院:“); l5 = new Label(“班级:“); l6 = new Label(“当前已选修的课程!“); l7 = new Label(“你当前已选修的课程如下:“); student = new Student(); field1 = new Label(str); field2 = new Label(); field3 = new Label(); field4 = new Label(); lauch(); add(l1); add(l2); add(l3); add(l4); add(l5); add(l6); add(l7); add(field1); add(field2); add(field3); add(field4); l1.setBounds(new Rectangle(320, 50, 200, 50)); l2.setBounds(new Rectangle(150, 100, 30, 50)); field1.setBounds(new Rectangle(185, 115, 80, 20)); l3.setBounds(new Rectangle(270, 100, 30, 50)); field2.setBounds(new Rectangle(310, 115, 80, 20)); l4.setBounds(new Rectangle(400, 100, 30, 50)); field3.setBounds(new Rectangle(440, 115, 90, 20)); l5.setBounds(new Rectangle(540, 100, 30, 50)); field4.setBounds(new Rectangle(580, 115, 80, 20)); l6.setBounds(new Rectangle(275, 193, 150, 50)); l7.setBounds(new Rectangle(230, 250, 150, 50)); b1 = new Button(“查询“); b2 = new Button(“返回选课“); add(b1); add(b2); b1.addActionListener(this); b2.addActionListener(this); b1.setBounds(new Rectangle(230, 200, 40, 25)); b2.setBounds(new Rectangle(475, 200, 70, 25)); area = new TextArea(); add(area); area.setBounds(230, 300, 250, 200); setBounds(100,50,800,700); setVisible(true); setResizable(false); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void actionPerformed(ActionEvent e) { if(e.getSource() == b1) { String s = field1.getText(); conn = DB.getConn(); stmt = DB.getState(conn); String sql = “select * from course“; rs = DB.getResultSet(stmt, sql); try { while (rs.next()) { String sno = rs.getString(1); String name = rs.getString(2); String lessons = rs.getString(3); area.setText(““); if (true) { area.append(“学号:“ + sno + “\n“); area.append(“姓名:“ + name + “\n“); area.append(“课程:“ + lessons + “\n“); } } } catch (SQLException e1) { System.out.println(e1); } finally { DB.close(rs); DB.close(stmt); DB.close(conn); } } else if(e.getSource() == b2) { this.dispose(); new Student(field1.getText()); } } public void lauch() { String name, dept, banji; try { Class.forName(“com.mysql.jdbc.Driver“); conn = DriverManager.getConnection(“jdbc:mysql://localhost/sc“, “root“, “root“); stmt = conn.createStatement(); String s = field1.getText(); rs = stmt.executeQuery(“select * from student where username='“ + s + “'“); while(rs.next()) { name = rs.getString(“name“); dept = rs.getString(“dept“); banji = rs.getString(“banji“); field2.setText(name); field3.setText(dept); field4.setText(banji); } } catch(SQLException h) { System.out.println(h); } catch(ClassNotFoundException g) { g.printStackTrace(); } finally { try { if(rs != null) { rs.close(); rs = null; } if(stmt != null) { stmt.close(); stmt = null; } if(conn != null) { conn.close(); conn = null; } } catch (SQLException e1) { e1.printStackTrace(); } } } } 10.5 学生用户登录密码的修改代码Modify.java import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.JOptionPane; public class Modify extends Frame implements ActionListener { Label l1, l2, l3, l4; TextField tf1, tf2, tf3, tf4; Button b1, b2, b3; Connection conn = null; Statement stmt = null; ResultSet rs = null; public Modify() { setTitle(“修改密码界面“); l1 = new Label(“用 户 名:“); l2 = new Label(“原 密 码:“); l3 = new Label(“新 密 码:“); l4 = new Label(“确 认 新 密 码:“); b1 = new Button(“确定“); b2 = new Button(“取消“); tf1 = new TextField(); tf2 = new TextField(); tf3 = new TextField(); tf4 = new TextField(); add(l1); add(l2); add(l3); add(l4); add(b1); add(b2); add(tf1); add(tf2); add(tf3); add(tf4); l1.setBounds(new Rectangle(250, 170, 80, 40)); l2.setBounds(new Rectangle(250, 220, 80, 40)); l3.setBounds(new Rectangle(250, 270, 80, 40)); l4.setBounds(new Rectangle(250, 320, 80, 40)); tf1.setBounds(new Rectangle(340, 180, 150, 20)); tf2.setBounds(new Rectangle(340, 230, 150, 20)); tf3.setBounds(new Rectangle(340, 280, 150, 20)); tf4.setBounds(new Rectangle(340, 330, 150, 20)); b1.setBounds(new Rectangle(250, 400, 40, 20)); b2.setBounds(new Rectangle(340, 400, 40, 20)); b1.addActionListener(this); b2.addActionListener(this); setLayout(null); setBounds(100, 50, 800, 700); setVisible(true); setResizable(false); tf2.setEchoChar('*'); tf3.setEchoChar('*'); tf4.setEchoChar('*'); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void actionPerformed(ActionEvent e) { String username, password, newusername, newpassword; String str = tf1.getText(); String str2 = tf2.getText(); if (e.getSource() == b1) { if (e.getSource() == b1 || e.getSource() == tf1 || e.getSource() == tf2 || e.getSource() == tf3 || e.getSource() == tf4) { if (tf1.getText().equals(““) || tf2.getText().equals(““) || tf3.getText().equals(““)) { JOptionPane.showMessageDialog(this, “对不起,输入不能为空!“, “提示“,JOptionPane.ERROR_MESSAGE); // 判断文本内容语句 } else { conn = DB.getConn(); stmt = DB.getState(conn); String sql = “select * from login“; rs = DB.getResultSet(stmt, sql); try { while(rs.next()) { username = rs.getString(“username“); password = rs.getString(“password“); if(str.equals(username) && str2.equals(password)) { if(tf3.getText().equals(tf4.getText())) { newpassword = tf3.getText(); stmt.executeUpdate(“update login set password = '“ + newpassword + “'“ + “where username='“+str+“'“); JOptionPane.showMessageDialog(this, “congratulations,修改密码成功!“,“提示“, JOptionPane.INFORMATION_MESSAGE); } else{ JOptionPane.showMessageDialog(this, “sorry,两次密码输入不正确!“,“提示“, JOptionPane.INFORMATION_MESSAGE); } } else { JOptionPane.showMessageDialog(this, “sorry,用户名和密码不匹配!“,“提示“, JOptionPane.INFORMATION_MESSAGE); } } } catch (SQLException b) { } finally { DB.close(rs); DB.close(stmt); DB.close(conn); } } } } else if (e.getSource() == b2) { tf1.setText(““); tf2.setText(““); tf3.setText(““); tf4.setText(““); } } } 10.6 教师查询学生选课的情况代码Teacher.java import java.awt.*; import java.awt.event.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Teacher extends Frame implements ActionListener { Label l1; Choice choice = new Choice(); List list = new List(1,true); TextArea area; Button b1; Connection conn = null; Statement stmt = null; ResultSet rs = null; public Teacher() { this.setTitle(“教师查询窗口“); l1 = new Label(“欢迎您登录,teacher“); add(l1); l1.setBounds(new Rectangle(100, 50, 200, 40)); choice.add(“请选择要查询的课程“); choice.add(“离散数学“); choice.add(“汇编语言“); choice.add(“java语言设计“); choice.add(“软件工程“); choice.add(“操作系统“); choice.add(“马克思政治学“); choice.add(“数据结构“); choice.add(“数据库系统“); choice.add(“jsp程序设计“); add(choice); choice.setBounds(new Rectangle(200, 200, 150, 50)); area = new TextArea(); add(area); area.setBounds(new Rectangle(200, 250, 200, 200)); b1 = new Button(“查询“); add(b1); b1.addActionListener(this); b1.setBounds(new Rectangle(360, 200, 40, 25)); setLayout(null); setBounds(100,50,800,700); setVisible(true); setResizable(false); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void actionPerformed(ActionEvent e) { if(e.getSource() == b1) { String str = choice.getSelectedItem(); String sno = null, name = null; conn = DB.getConn(); stmt = DB.getState(conn); String sql = “select * from course where lessons like '“ + str + “%“ + “'“; rs = DB.getResultSet(stmt, sql); try { while(rs.next()) { sno = rs.getString(“sno“); name = rs.getString(“name“); if(true) { area.append(“学号:“ + sno + “\n“); area.append(“姓名:“ + name + “\n“); } } } catch(SQLException h) { System.out.println(h); } finally { DB.close(rs); DB.close(stmt); DB.close(conn); } } } } 10.7 超级管理员查询学生选课的情况代码Administrator.java import java.awt.*; import java.awt.event.*; import java.sql.*; import java.util.ArrayList; public class Administrator extends Frame implements ActionListener { Label l1, l2; Choice choice = new Choice(); TextArea area, area2; Button b1, b2; Connection conn = null; Statement stmt = null; ResultSet rs = null; public Administrator() { this.setTitle(“管理员查看窗口“); l1 = new Label(“欢迎您登录,administration“); l2 = new Label(“所有学生选课情况如下:“); add(l1); add(l2); l1.setBounds(new Rectangle(100, 50, 100, 40)); l2.setBounds(new Rectangle(450, 200, 150, 40)); choice.add(“请选择要查询的课程“); choice.add(“离散数学“); choice.add(“汇编语言“); choice.add(“java语言设计“); choice.add(“软件工程“); choice.add(“操作系统“); choice.add(“马克思政治学“); choice.add(“数据结构“); choice.add(“数据库系统“); choice.add(“jsp程序设计“); add(choice); choice.setBounds(new Rectangle(200, 200, 150, 50)); area = new TextArea(); area2 = new TextArea(); add(area); add(area2); area.setBounds(new Rectangle(200, 250, 200, 200)); area2.setBounds(new Rectangle(450, 250, 200, 200)); b1 = new Button(“查询“); b2 = new Button(“查看“); add(b1); add(b2); b1.addActionListener(this); b2.addActionListener(this); b1.setBounds(new Rectangle(360, 200, 40, 25)); b2.setBounds(new Rectangle(610, 200, 40, 25)); setLayout(null); setBounds(100,50,800,700); setVisible(true); setResizable(false); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void actionPerformed(ActionEvent e) { if(e.getSource() == b1) { String str = choice.getSelectedItem(); String sno = null, name = null; conn = DB.getConn(); stmt = DB.getState(conn); String sql = “select * from course where lessons like '“ + str + “%“ + “'“; rs = DB.getResultSet(stmt, sql); try { while(rs.next()) { sno = rs.getString(“sno“); name = rs.getString(“name“); if(true) { area.append(“学号:“ + sno + “\n“); area.append(“姓名:“ + name + “\n“); } } } catch(SQLException h) { System.out.println(h); } finally { DB.close(rs); DB.close(stmt); DB.close(conn); } } else if(e.getSource() == b2) { conn = DB.getConn(); stmt = DB.getState(conn); String sql = “select * from course“; rs = DB.getResultSet(stmt, sql); try { while(rs.next()) { String sno = rs.getString(1); String name = rs.getString(“name“); String lessons = rs.getString(“lessons“); for(int i=0; i<sno.length(); i++){ area2.append(“学号:“ + sno + “\n“); area2.append(“姓名:“ + name + “\n“); area2.append(“课程:“ + lessons + “\n“); } } } catch (SQLException el) { el.printStackTrace(); } finally { DB.close(rs); DB.close(stmt); DB.close(conn); } } } } XX大学计算机专业学生实习鉴定表 自 我 鉴 定 学生签名:
2011年 月 日 指 导 教 师 评 语 及 成 绩 评 定 实习指导老师签名:
成绩 2011年 月 日 教 研 室 意 见 教研室主任签名:
2011年 月 日

推荐访问:选课 软件工程 课程设计