实训指导手册
北京同美世纪科技有限公司
编 制
1、需求分析
1.1、需求分析
需求分析是系统项目开发的开端,经过与客户需求的沟通与协调,以及实际的调查与分析,本系统已具有如下的功能:
◆简单、友好的操作窗口,以便于管理员的日常管理工作。
◆整个系统的操作流程简单,易于操作。
◆完备的学生成绩管理功能。
◆全面的系统维护管理,方便系统的日后维护工作。
◆强大的基础信息设置功能。
1.2、可行性分析
可行性分析是通过对项目的主要内容和配套条件,如市场需求、资源供应、建设规模、工艺路线、设备选型、环境影响、资金筹措、盈利能力等,从技术、经济、工程等方面进行调查研究和分析比较,并对项目建成以后可能取得的财务、经济效益及社会环境影响进行预测,从而提出该项目是否值得投资和如何进行建设的咨询意见,为项目决策提供依据的一种综合性的系统分析方法。可行性分析应具有预见性、公正性、可靠性、科学性的特点。
可行性研究主要内容是要求以全面、系统的分析为主要方法,经济效益为核心,围绕影响项目的各种因素,运用大量的数据资料论证拟建项目是否可行。对整个可行性研究提出综合分析评价,指出优缺点和建议。为了结论的需要,往往还需要加上一些附件,如试验数据、论证材料、计算图表、附图等,以增强可行性报告的说服力。
1.2.1、技术可行性
本系统主要采用JAVA技术,以MySQL为数据库开发程序,使用户可以使用具备学生查询功能、管理员查询功能、添加功能、修改功能、删除功能、汇总功能、统计功能等功能的学生成绩管理系统。
1.2.2、经济可行性
通过缜密的市场调研和需求分析,本系统属于校园学生信息管理系统的子系统,通过引用计算机管理系统,可以极大的提高学生成绩管理效率,并可以帮助院校有效的利用有限的教育经费,降低院校运营成本。
1.2.3、社会可行性
作为院校学生管理最重要的组成部分,学生成绩管理一直是衡量院校优劣一项重要的指标,通过引用计算机管理系统,有利于深入学生成绩管理工作,并提高了对学生成绩管理工作效率,这边与院校及时掌握学生的学习成绩、个人成长情况等一系列数据信息,也便于院校根据这些实际数据及时调整其教育管理工作。
2、系统设计
通过对学生成绩管理工作的调查与研究,要求本系统设计完成后将达到以下的目标:
●窗体界面设计友好、梅关,方便管理员的日常操作;
●基本信息的全面设置,数据录入方便、快捷;
●数据检索功能强大、灵活,提高了日常数据的管理工作;
●具有良好的用户维护功能;
●最大限度地实现了系统易维护性和易操作性;
●系统运行稳定,系统数据安全可靠。
从程序的结构中可以看出,学生的信息输入输出功能是由学生管理系统进行的。课程的信息输入输出是由课程管理系统进行的,而班级的学生信息流动则是班级管理系统进行的。学生成绩管理信息系统的几个基本功能:
⏹学生的基本信息管理:学号、姓名、系别、班级等。
⏹课程的基本信息管理:课程号码、课程名称、任课教师、学分、学时、课程内容简介。
⏹登录管理:要求使用者提供合法的用户名、密码和相关权限。
⏹成绩的录入:由老师(管理员)录入成绩、要用到前面学生的信息、课程的信息等。
⏹成绩查询:学生进行成绩查询、要用到前面的学生信息、课程信息等。
⏹汇总功能:系院管理员、教务处对成绩进行分类汇总,比较各个系院的成绩,为制定以后教学管理计划提供数据基础。
本系统功能结构图如下
3、数据库设计
本系统数据库采用了MySQL 5数据库,其数据库名称StuDB,根据以上对系统所做的的需求分析、流程设计及功能结构确定,每个功能模块可以抽象出一个或多个实体对象,包括了学院、专业(系)、班级、学生、课程实体对象等,这些实体对象彼此相互联系,并且最终被创建成数据表结构。部分数据表如下:
1、学院信息表(Schools)
字段名称 | 类型 | 长度 | 功能描述 |
Sch_ID | int | 4 | 学院编号 |
Sch_name | varchar | 30 | 学院名称 |
字段名称 | 类型 | 长度 | 功能描述 |
Mjr_ID | int | 4 | 专业编号 |
Sch_ID | int | 4 | 学院编号 |
Mjr_name | varchar | 20 | 专业名称 |
字段名称 | 类型 | 长度 | 功能描述 |
Cls_ID | int | 4 | 班级编号 |
Mjr_ID | int | 4 | 专业编号 |
Cls_name | varchar | 20 | 班级名称 |
字段名称 | 类型 | 长度 | 功能描述 |
Stu_ID | int | 4 | 学号 |
Stu_name | varchar | 20 | 学生姓名 |
Stu_gender | varchar | 10 | 学生性别 |
Stu_hometown | varchar | 30 | 学生籍贯 |
Stu_birthday | datetime | 8 | 学生出生日期 |
Sch_ID | int | 4 | 学院编号 |
Mjr_ID | int | 4 | 专业编号 |
Cls_ID | int | 4 | 班级编号 |
Stu_join_date | datetime | 8 | 学生入学时间 |
字段名称 | 类型 | 长度 | 功能描述 |
Cur_ID | int | 4 | 课程编号 |
Cur_name | varchar | 30 | 课程名称 |
Cur_score | float | 8 | 课程最高学分 |
Mjr_ID | int | 4 | 专业编号 |
Cls_ID | int | 4 | 班级编号 |
字段名称 | 类型 | 长度 | 功能描述 |
Tea_ID | int | 4 | 教师工号 |
Tea_name | varchar | 30 | 教师姓名 |
Tea_pwd | varchat | 20 | 教师密码 |
Tea_gender | varchar | 10 | 教师性别 |
Tea_Pos | varchar | 30 | 教师职称 |
Tea_edu | varchar | 30 | 教师学历 |
Sch_ID | int | 4 | 学院编号 |
Mjr_ID | int | 4 | 专业编号 |
Cls_ID | int | 4 | 班级编号 |
字段名称 | 类型 | 长度 | 功能描述 |
Gra_ID | int | 4 | 课程成绩编号 |
Stu_ID | int | 4 | 学号 |
Cur_ID | int | 4 | 课程编号 |
Gra_score | float | 8 | 课程成绩 |
Gra_date | datetime | 8 | 课程考核日期 |
实体类对象主要用JavaBean来结构化后台数据表,完成对数据表的封装。在定义实体类的时候需要设置与数据表字段相对应的成员变量,且需要为这些字段设置相应的get和set方法。
4.1、实体类编写
在Eclipse中,创建实体对象类,并在类中设置与相应数据表字段相应的成员变量,然后,在菜单项选择“源代码”->“生成Getter和Setter”命令,这样该实体类就创建完成。
4.2、操作数据库公共类编写
4.2.1、连接数据库公共类
数据库连接在整个项目开发中占据着非常重要的位置,若数据库连接失败,功能再强大的系统都不能运行。在本项目的util包中建立类ConnectionalJDBC.java,并在该类中定义一个静态类型的类变量connection用来建立数据库的连接,这样在其他类中就可以直接访问该变量了。
4.2.2、操作数据库公共类
操作数据库公共类封装了对所有的数据表的添加、修改和删除的操作,前台业务中的相应功能都是通过这个类来完成的。
在util包下建立公共类JDBCAdapater.java,并在该类中使用各实体对象作为参数,进而执行类中的相应方法。然后,再定义一个私有类方法AdapterObject()用来执行数据表的所有操作,方法参数为生成的SQL语句,并将所有的表操作封装在这个类中。最后,定义一个删除数据表的公共类方法DeleteObject(),用来执行删除数据表的操作。
4.2.3、检索数据公共类
数据的检索功能在整个系统中占有重要的位置,系统中所有的查询功能都是通过该公共类实现的,该公共类通过传递查询语句调用相应的类方法,查询满足条件的数据或则数据集合。
在util包下建立公共类RetrieveObject.java,并在该类中定义一个类公共方法getObjectRow(),用来检索一条满足条件的数据,该方法返回值类型为Vector。再定义一个公共方法getTableCollection(),用来检索满足条件的数据类型,该方法返回值类型为Collection。最后,定义类方法getTableModel()用来生成一个表格数据模型,该方法返回类型为DefaultTableModel,该方法中一个数组参数name用来生成模型中的列名。
4.2.4、产生流水号公共类
在util包下建立公共类ProduceMaxBh,并在该类定义一个公共方法getMaxBh(),该方法用来生成一个最大的流水号码,即首先通过参数来获得数据表中的最大号码,然后根据这个号码产生一个最大编号。
5、系统功能实现
5.1、系统登录模块
系统登录窗体主要用来验证用户登录信息,完成用户登录功能。本系统包括两个用户角色,即系统教师用户和学生用户,当用户在登录本系统时,需要填写用户名、密码和登录类型等信息,系统会自动验证所填的用户是否存在,若存在,系统就登录到主界面中,否则,会给予相关的提示信息。同时,当用户初次登录本系统时,需要设置相应的配置信息,包括数据库主机IP、主机服务端口号等。
系统登录模块主要技术是如何让窗体居中显示,为了让窗体居中显示,需要获得显示器的大小,使用Toolkit类的getScreenSize()方法可以获得屏幕大小。由于Toolkit类是一个抽象类,无法使用new获得该对象,可是,该类中定义的getDefaultToolkit()方法可获得Toolkit类型的对象。
设计系统登录窗体界面,并当用户输入用户名、密码和登录类型后,点击“登录”按钮,在公共方法txtUsername_keyPressed()中,定义一个String类型变量sqlSelect用来生成SQL查询语句,然后再定义一个公共类RetrieveObject类型变量retrieve,调用retrieve的getObjecrRow()方法,其参数为sqlSelect,用来判断该用户是否存在;若用户存在,检查所填的密码是否正确,若密码正确,系统登录后,即可进入系统主界面上。
5.2、主窗体模块
主窗体是指用户登录后的窗体,对于本系统来说,有两个主窗体,学生端主窗体和教师端主窗体,主窗体采用的布局风格为:左边是一个树状列表用于导航,右边采用卡片布局显示各个功能模块。主窗体用到的主要技术是导航栏设计,通过导航栏可以打开本系统所有的子模块。本系统的导航栏是通过树组件来实现的,在这里要显示树的更节点,且该树结构不是展开的。
设计主界面界面,包括教师端和学生端主界面。接着,创建树的根节点对象和子节点对象,再创建树的叶子节点对象并添加到子节点上,以创建一个树结构,然后创建一个树模型对象,及一个树对象,并设置该树对象的相关绘制属性。再定义JMenuBar对象,并定义菜单对象数组用来生成整个系统的业务主菜单,然后定义主菜单中的子菜单项目,用来添加到主菜单中,为子菜单实现响应用户单击的操作方法,最后,通过私有方法BuildToolBar()进行工具栏创建。
5.3、班级信息设置模块
该模块主要完成对班级内容的操作,包括班级信息的添加、更改、删除等操作。本模块涉及到主要技术是使用面板的卡片布局,通过为面板定义卡片布局对象,则该界面就以卡片布局来显示。CardLayout 对象是容器的布局管理器。它将容器中的每个组件看作一张卡片。一次只能看到一张卡片,而容器充当卡片的堆栈。当容器第一次显示时,第一个添加到 CardLayout 对象的组件为可见组件。卡片的顺序由组件对象本身在容器内部的顺序决定。CardLayout 定义了一组方法,这些方法允许应用程序按顺序地浏览这些卡片,或者显示指定的卡片。addLayoutComponent(java.awt.Component, java.lang.Object) 方法可用于将一个字符串标识符与给定卡片相关联,以便进行快速随机访问。
设计班级信息管理模块窗体,并通过调用公共类JDBCAdapter,该模块程序先从数据表中检索出班级的基本信息,若存在数据,用户可以对任意数据进行修改、删除等操作,再定义一个Boolean实例变量insertflag,用来标志操作数据库类型,然后定义一个私有方法buildTable,用来检索班级数据。当用户在选择某条记录后,程序会将该数据填写到面板上相应控件上,也方便用户进行相应的操作,在表格控件的公共方法mouseClicked()中定义一个String类型局部变量sqlStr,用来生成SQL查询语句,然后调用公共类RetrieveObject的getObjectRow()方法,进行数据查询,若找到数据,则将该数据解析显示给用户。接着,在“删除”按钮的公共方法actionPerformed()中定义字符串类型的局部变量sqlDel,用来生成班级的删除语句,然后调用公共类的JDBCAdapter的DeleteObject()方法,以实现删除某条班级数据信息。最后,在“保存”按钮的方法actionPerformed()中定义实体类对象Obj_Class的变量objclass,然后使用set方法为该变量赋值,最后调用公共类JDBCAdapter的InsertOrUpdateObject()方法,即可实现将数据保存到数据表中功能。
5.4、学生基本信息管理模块
该模块用于管理学生基本信息,包括学生信息的基本信息、编辑、删除、查询等,在左侧导航上点击学生信息,右面就可以显示该模块的界面内容。该模块涉及的主要技术是JSplitPane,JSplitPane用于分隔两个Component,这两个Component图形化分隔以外观实现为基础,并且这两个Component可以有用户交互式调整大小。使用JSplitPane的HORIZONTAL_SPLIT或VERTICAL_SPLIT属性,分别可让分隔窗格中两个Component从左到右排列或从上倒下排列,然后调用setDividerLocation方法可以改变Component大小,其中location是新的x或y位置,具体取决于JSplitPane的方向。当用户调整Component大小时,Component的最小大小用于确定Component能够设置的最大或最小位置。
设计学生信息管理模块的界面,并在util公共包上导入相关类文件,并在JF_view_student类上定义三个String类型的数组变量schID mjrID、ClsID,且其初始值为null,用来存储学院、专业和班级编号,然后定义一个私有方法initialize()用来检索学院、班级、专业数据。接着,在学院和专业下拉框的公共方法itemStateChanged()上,定义一个String类型变量sqlStr,哟过来存储SQL查询语句,执行公共类RetrieveObject的方法getTableCollection(),其参数为sqlStr,将返回值放到集合变量collection中,然后将集合中的数据分别存放到学院和专业下拉框中。其次,通过班级下拉框的itemStateChanged()方法上定义来实现自动检索所有班级信息,当用户单击表格中某条数据后,系统会将学生信息读取面板控件上,以供用户进行操作。然后,在“添加”按的actionPerfomed()方法上实现添加学生信息操作;在“删除”按的actionPerfomed()方法上实现删除学生信息操作。
5.5、学生考试成绩信息管理模块
该模块主要是对学生课程成绩信息继续管理,包括添加、编辑、删除等。在教师端程序中,在左侧导航树中的课程成绩信息管理根节点下有成绩录入管理和成绩查询管理两大子模块,教师或管理员用户在成绩录入管理模块中成功添加学生课程成绩后,这些课程成绩数据会显示在成绩查询子模块中,教师或管理员用户可以输入相应的关键字信息,就可查询到想要的课程成绩信息;同时,在其中的课程信息列表中选择任意的课程成绩后,教师或管理员用户可以对该课程成绩数据进行修改或删除。
在学生端程序中,由于学生用户仅有对其课程成绩的查询的权限,左侧导航树中的课程成绩信息管理根节点下仅有成绩查询管理子模块,而其中的课程成绩信息列表仅会列出该学生所修的所有的课程成绩信息,学生用户不能对这些信息进行编辑或删除,但是,可通过输入相关的关键字信息,查询到相应的成绩数据。
在Java中,通常使用Swing来开发桌面应用程序,且Swing中的控件大都有其默认的设置。若要改变这些默认设置,则可能影响这些控件的正常显示。假如表格控件在被创建后,表格内容的行高是固定的,当修改表格文字的字体时,为了保证不影响正常显示,可以考虑使用表格控件所提供的setRowHight()方法重新设置行高,该方法的声明为public void setRowHight(int rowHight),其中,参数rowHight表示新的行高。
设计教师端和学生端的课程成绩信息管理子模块的窗体UI,并调用公共类JDBCAdapter,从课程成绩信息表中检索出课程基本信息,再导入util广告包下相应类文件,并在JF_view_score类中定义一个boolean实例变量insertflag,用来标志操作的数据库类型,然后定义一个私有方法buildTable(),用来检索课程数据。接着,在课程成绩查询子模块界面上的表格控件中的公共方法mouseClicked()上定义一个String类型的局部变量sqlStr,用来存储SQL查询语句,然后调用公共类RetrieveObject的公共方法getTableCollection(),其参数为sqlStr,返回值为集合Collection,然后将集合中的数据参数在表格控件中。其次,在教师端的课程成绩信息录入界面上,在其中“添加”按钮的公共方法actionPerformed()中定义一个表格模型DefaultTableModel变量tablemodel,用来生成数据表格,然后,定义一个String类型的局部变量sqlStr,用来存储SQL查询语句,然后调用公共类RetrieveObject的公共方法getObjectRow(),其参数为sqlStr,用返回值vector生成课程名称,然后为tablemodel填充数据。然后,在“添加”按钮的公共方法actionPerformed()中再定义一个score类型对象的数组变量object,通过循环语句为object变量中的对象赋值,然后调用公共类JDBCAdapater中的InsertOrUpdate_Obj_score()方法,其参数为object。
5.6、基本信息数据查询模块
该模块主要对系统基本信息进行管理,这些基本数据包括学院、专业、课程等。教师登录系统后,在主界面的左侧导航树上的基本信息数据管理根节点上包含了学院信息管理、专业(系)信息管理、课程信息管理等子系统模块。点击子节点“学院信息管理”,右侧界面会显示学院信息管理模块内容,教师用户在该模块主要对学院信息进行管理,包括添加、编辑、修改、查询等。点击子节点“专业(系)信息管理”,右侧界面会显示专业(系)信息管理模块内容,教师用户在该模块主要对专业(系)信息进行管理,包括添加、编辑、修改、查询等。点击子节点“课程信息管理”,右侧界面会显示学院信息管理模块内容,教师用户在该模块主要对课程信息进行管理,包括添加、编辑、修改、查询等。
本模块由于要对基础数据进行增加、修改和删除等操作,其所涉及到开发技术同班级信息管理模块、学生信息管理、课程成绩管理等模块的相似,这里不再重复啰嗦了。此外,本模块还会涉及到数据库模糊查询,他是使用like关键字来实现的。而模糊查询的关键在于%和_两个符号的使用,即%表示任意多个字符,_表示任意一个字符。
设计基本数据管理模块窗体界面,包括学院信息管理、专业信息管理和课程信息管理,然后,参考本手册相关内容,实现对学院、专业和课程等基本信息的添加、修改和删除等操作功能。接着,导入所需的类包,在各窗体类源程序中定义不同的String类型变量,即一个私有方法initsize()用来初始化列表框中的数据,以供用户选择条件参数,并在各关键字下拉框控件的itemStateChanged()方法中实现为这些查询字段下拉框进行字段赋值。最后,在“立即查询”按钮的各个方法actionPerformed()中,定义两个String类型局部变量sqlSelect和whereSql,用来生成查询条件语句,并通过公共类RetrieveObject的getTableModel()方法进行查询操作。
5.7、选课管理模块
该模块主要用于对课程选择进行管理,包括教师端的开课选课设置子模块和学生端的在线选课子模块。在教师端的开课选课设置模块中,教师可以为课程库中设置选课信息,并设置选课的开启和结束时间,也便对学生选课进行有效的控制。在学生端进行选课时,在线选课模块会列出所设置的选课表,学生用户可以根据自己的情况,可以选取多个课程。
在Java中,可以使用Date类和Calendar类来获取时间,这些类库包含在util包中,一般推荐Calendar类来进行对时间的操作。由于Java的Swing类库中没有时间选择框控件,这需要自定义时间选择框控件,这个控件包括两个面板,一个面板包括一个文本框,当将鼠标光标点击在该文本框中,会弹出另一个面板,其中包括3个列表控件、一个日期控件和两个按钮控件,这些列表会列出年、月、日,当选择相应的年、月和日,日期控件会显示相应的日期,当点击其中“确定”按钮,则该日期就会在文本框中被输出。在创建自定义控件时候,需要考虑设计该控件的数据结构、外观属性、事件响应,当在项目要引用该控件时,需要使用paint()方法重写。
由于Java类库未定义时间选择框控件类,因此,需要自定义时间选择框控件,首先,创建自定义控件时间选择框JCalendarChoice类,该类继承自Compoent类,并在该类的方法paintControl()中定义一个监听事件PaintListener,以绘制该控件的外观,然后,在该控件的mouseClicked()方法中实现所选择的时间输出在上面的功能。其次,使用paint()方法重写该自定义控件,并设置本模块的窗体界面,包括教师端的开课选课设置模块和学生端的在线选课模块,并调用公共类JDBCAdapter并定义一个boolean类型的selflag,用来标志操作数据库类型,然后定义一个私有方法buildTab,用来检索课程数据。在表格控件的公共方法mouseClicked()中定义一个String类型局部变量sqlStr,用于存储SQL查询语句,然后调用公共类RetrieveObject的公共方法getTableCollection(),其参数为sqlStr,返回值为集合Collection,然后将集合中数据存放到表格控件中。在表格控件上的“开课”链接的公共方法actionPerformed()中定义一个courseChoice类型的数组变量删除并通过循环语句为该变量中的对象赋值,然后调用公共类JDBCAdaptr中的InsertOrUpdate_obj_sc()方法来变更该课程的开课状态,其参数为sc。在学生端程序中,在表格控件的公共方法mouseClicked()中定义一个String类型局部变量sqlStr,用于存储SQL查询语句,然后调用公共类RetrieveObject的公共方法getTableCollection(),其参数为sqlStr,返回值为集合Collection,然后将集合中数据存放到表格控件中。在表格控件上的“选课”按钮的公共方法actionPerformed()中定义一个courseChoiced类型的数组变量删除并通过循环语句为该变量中的对象赋值,然后调用公共类JDBCAdaptr中的InsertOrUpdate_obj_cc()方法来变更该课程的开课状态,其参数为cc。
5.8、考试成绩班级明细查询模块
本模块用来查询学生课程成绩明细信息,在教师端中,教师或管理员用户可以查询隶属于各学院、专业、班级的所有学生的课程成绩明细,以便于教师了解各学院、专业和班级的所有学生的课程学生情况。在学生端中,学生用户通过该模块不仅可以查询到其所修的所有课程成绩,也可通过了解未通过课程的成绩,以便学生用户可以有效的调整其学习计划。
在Java中,通常使用Swing来开发桌面应用程序,且Swing中的控件大都有其默认的设置。若要改变这些默认设置,则可能影响这些控件的正常显示。假如表格控件在被创建后,表格内容的行高是固定的,当修改表格文字的字体时,为了保证不影响正常显示,可以考虑使用表格控件所提供的setRowHight()方法重新设置行高,该方法的声明为public void setRowHight(int rowHight),其中,参数rowHight表示新的行高。
设计考试成绩明细查询模块的窗体界面,包括教师端的考试成绩明细查询模块和学生端的考试成绩明细查询模块,并定义一个素有方法initsize(),用来初始化列表框中的数据,供用户选择条件参数。其次,在“查询”按钮的公共方法actionPerformed()中,定义一个String类型局部变量tb,用来为表格模型设置列名。接着,定义公共类RetrieveObject的变量retrieve,然后执行retrieve的方法getTableCollection(),其参数为sqlSub。当结果集中存在数据的时候,定义一个String类型变量sqlStr,用来生成查询成绩语句,通过一个循环语句为sqlStr赋值,再定义一个公共类RetrieveObject类型变量bdt,并执行bdt的gettableModel()方法,其参数为sqlStr和tb变量。