个人成绩单管理系统.docx
《个人成绩单管理系统.docx》由会员分享,可在线阅读,更多相关《个人成绩单管理系统.docx(35页珍藏版)》请在冰豆网上搜索。
个人成绩单管理系统
个人成绩单管理系统
代码行数
687
项目名称
个人成绩单管理系统
1.实训目的
面向对象程序设计课程设计是计算机科学与技术专业培养计划中的重要实践教学环节,旨在通过一个管理信息系统的开发,加深学生对Java语言的理解和应用,尤其是对面向对象编程思想、Java编码规范、图形用户接口、JDBC访问数据库的理解,巩固软件工程课程的相关知识,了解软件开发的基本流程,进一步提高学生的学习能力、理解能力、表达能力及沟通能力。
2.实训内容
使用MyEclipse为开发工具,使用RationalRose为建模工具,使用MySQL为数据库服务器,基于GUI和JDBC技术,分析、设计并实现一个管理信息系统。
3.需求分析
3.1需求描述
成绩管理一直是学校教学管理中十分重要但又相当复杂的管理工作之一,一味的采用传统的手工处理已经不符合教育和管理的要求,而当今时代的计算机具有运算速度快,处理能力强等特点,很自然地进入到这一应用领域中。
因此,为了保证学校的信息流畅,工作高效,很有必要设计一个学生成绩管理系统。
这不但能使教务人员从繁杂的成绩管理中解脱出来,对于推动教学的发展也起到非常重要的作用。
大部分学校学生成绩管理工作都是采用传统的手工管理,但是这些传统人工管理的方式存在着许多缺点,比如:
效率较低,学生成绩信息是一个庞大的数据,要想查找其中一个学生的数据简直是大海捞针,庞大的数据还导致错误率较高。
所以我选择Eclipse来开发学生成绩管理系统,由于以上的优点,开发该系统用来帮助广大教师提高工作效率,实现学生成绩信息管理工作流程的系统化、规范化和自动化。
1.用户注册和登录
(1)用户需注册新的用户名和密码并将其存储在数据库内,用户注册成功后需输入用户名和密码登录系统,用户必须在登录系统后才能进行相关操作。
(2)当用户名和密码错误时,允许用户重新进行登录操作。
2.增添学生成绩信息
(1)用户在系统的提示下,输入相关信息,完成插入记录的操作。
(2)当输入的数据类型不正确时,系统会显示失败并允许用户重新输入。
3.删除学生成绩信息
(1)用户可以根据人名或者id对相关记录进行删除。
(2)当输入的数据类型不正确时,系统会显示删除失败并允许用户重新输入。
4.查询id学生成绩信息
(1)用户可以查询整条记录或输入指定id查询指定科目成绩,完成查询记录的操作。
(2)当输入的数据类型不正确时,系统会显示修改失败并允许用户重新输入。
5.查询名字学生成绩信息
(1)用户在系统的提示下,输入相关信息,完成查询记录的操作。
(2)当输入的数据类型不正确时,系统会显示查询失败并允许用户重新输入。
3.2用例描述
图3.1系统用例图
4.功能设计
4.1系统层次方框图
4.1系统结构
为保证系统具有较好的可维护性和可扩展性,对系统进行分层设计,共分四层:
●视图层:
接收个人成绩输入信息,显示界面信息和成绩信息
●控制层:
访问流程控制
●业务层:
完成具体功能的实现
●数据库访问层:
完成对数据库访问操作的封装
具体结构如下图所示:
图4.1系统结构图
图4.1系统层次方框图
4.2算法设计(活动图或时序图)
1.登录功能
在主界面(MainView)输入账号和密码,封装成Login对象后发后给业务层(LoginService),在业务层中组合成执行登录操作的SQL语句,再将其传递给数据库访问类(DB),由其完成数据库的查询操作。
依据查询结果,如果成功则创建控制类(Controller)对象,显示欢迎信息和对用户信息进行维护的选项;如果失败,则显示提示信息并允许重新输入账号和密码。
图4.1登录功能时序图
2.注册功能
在主界面输入数字1,表示进行注册操作。
依次输入账户、密码和确认密码,当密码和确认密码不一致时,需要重新输入密码和确认密码。
之后,账户和密码封装至Login对象中,传递给业务层(LoginService),由业务层组合成添加SQL语句,发送至数据库访问类(DB),完成添加操作。
如果添加成功,则返回主界面,输入新注册的账户和密码进行登录;如果添加失败,则重新进行输入。
图4.2注册功能时序图
3.显示所有成绩单的基本信息功能
登录成功及完成对用户信息增、删、改操作后,均需要进行所有成绩单的基本信息的显示,由控制类(Controller)调用视图层(MainView)中的方法,在方法中再利用业务层(UserService)完成对数据库访问类(DB)的访问,获取t_grade表的所有记录。
图4.3显示所有成绩单信息时序图
4.添加成绩单信息功能
在控制类(Controller)输出的选择信息的提示下(1表示执行添加操作),利用简单工厂模式创建视图层(AddView)对象,之后回调接口方法,完成对业务层(UserService)中注册方法的调用,在该方法中向数据库访问类(DB)发送添加SQL语句。
如果添加成功,则显示所有成绩单信息(参考显示所有成绩单信息功能的实现);如果添加失败,则提示重新输入。
图4.4成绩单信息添加时序图
5.查询用户信息功能
在控制类(Controller)输出的选择信息的提示下(4表示执行添加操作),利用简单工厂模式创建视图层(QueryView)对象,之后回调接口方法,在方法中输入要查询的用户名,再对业务层(UserService)中查询方法执行调用,在该方法中向数据库访问类(DB)发送模糊查询SQL语句。
如果查询成功,则显示查询到的成绩单信息(参考显示所有成绩单信息功能的实现);如果查询失败,则提示重新输入。
图4.5查询成绩单信息时序图
删除成绩单信息和修改成绩单信息的功能设计请参考添加成绩单信息操作。
5.数据设计
5.1类图设计
根据分析,系统由13个类构成,分别为:
●数据库访问层:
DB类
●数据封装类:
Login类、Grade类
●业务层:
LoginService类、UserService类
●控制层:
Controller类
●视图层:
AddView类、DeleteView类、ModifyView类、QueryView类、MainView类、
Operation类
●其它:
Test类
系统中各类之间关系如下图所示:
图5.1系统类图
5.2数据表设计
根据概要设计中Login类图和Grade类图可知,系统需要两张表t_login和t_grade,其中,t_login表用于存储登录信息,t_grade表用于存储成绩单的基本信息,两张表之间没有关联关系,具体结构如下所示:
表5-1t_login表
序号
字段名
类型
长度
备注
1
id
int
4
主键
2
account
char
20
唯一性、不为空
3
password
char
20
不为空
表5-2t_grade表
序号
字段名
类型
长度
备注
1
id
int
4
主键
2
name
char
20
不为空
3
math
float
不为空
4
Chinese
float
不为空
5
English
float
不为空
6
time
date
默认
创建时间
6.运行结果
注册:
图6.1
录:
图6.2
添加:
图6.3
删除:
图6.4
ID查找:
图6.5
姓名查找:
图6.6
7.关键代码
(DB.java)
packagecn.edu.ccut.util;
importjava.sql.*;
publicclassDB{
privateConnectioncon;
privatePreparedStatementpre;
privateResultSetrs;
privatestaticDBdb;
static{
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}
}
privateDB(){}
publicstaticDBgetInstance(){
if(db==null){
db=newDB();
}
returndb;
}
privatevoidbuildConnection(){
try{
con=DriverManager.getConnection("jdbc:
mysql:
//localhost:
3306/4711?
useSSL=false","root","kanyuhang");
}catch(SQLExceptione){
e.printStackTrace();
}
}
publicResultSetexecuteQueryByParam(Stringsql,Object...o){
this.buildConnection();
try{
pre=con.prepareStatement(sql);
for(inti=0;ipre.setObject(i+1,o[i]);
}
rs=pre.executeQuery();
}catch(SQLExceptione){
e.printStackTrace();
}
returnrs;
}
publicResultSetexecuteQueryNoParam(Stringsql){
this.buildConnection();;
try{
pre=con.prepareStatement(sql);
rs=pre.executeQuery();
}catch(SQLExceptione){
e.printStackTrace();
}
returnrs;
}
publicintexecuteUpdate(Stringsql,Object...o){
this.buildConnection();
try{
pre=con.prepareStatement(sql);
for(inti=0;ipre.setObject(i+1,o[i]);
}
intcount=pre.executeUpdate();
returncount;
}catch(SQLExceptione){
e.printStackTrace();
return0;
}
}
publicvoidclose(){
try{
if(rs!
=null){
rs.close();
}
pre.close();
con.close();
}catch(SQLExceptione){
e.printStackTrace();
}
}
}
(controller.java)
packagecn.edu.ccut.controller;
importcn.edu.ccut.service.GradeService;
importcn.edu.ccut.view.*;
importjava.util.InputMismatchException;
importjava.util.Scanner;
publicclassController{
publicvoidcontroller()throwsInputMismatchException{
Scannerscan=newScanner(System.in);
while(true){
MainView.showMain();
System.out.println("pleaseselectyouroperation:
");
System.out.println("1.insert2.delete3.modify4.query5.exit");
inti=scan.nextInt();
GradeServiceservice=GradeService.getInstance();
Operationo=null;
booleanflag=true;
switch(i){
case1:
o=newAddView();
break;
case2:
o=newDeleteView();
break;
case3:
o=newModifyView();
break;
case4:
o=newQueryView();
break;
case5:
System.out.println("Bye~~~~~~~~~");
return;
default:
//scan.close();
System.out.println("inputerror,pleaseinput1~5!
");
flag=false;
}
if(flag){
o.operation(service);
}
}
}
}
(grade.java)
packagecn.edu.ccut.po;
importjava.sql.Date;
publicclassGrade{
privateintid;
privateStringname;
privatefloatmath;
privatefloatChinese;
privatefloatEnglish;
privateDatetime;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicfloatgetMath(){
returnmath;
}
publicvoidsetMath(floatmath){
this.math=math;
}
publicfloatgetChinese(){
returnChinese;
}
publicvoidsetChinese(floatChinese){
this.Chinese=Chinese;
}
publicfloatgetEnglish(){
returnEnglish;
}
publicvoidsetEnglish(floatEnglish){
this.English=English;
}
publicDategetTime(){
returntime;
}
publicvoidsetTime(Datetime){
this.time=time;
}
}
(login.java)
packagecn.edu.ccut.po;
publicclassLogin{
privateStringusername;
privateStringpassword;
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
(gradeServers.java)
packagecn.edu.ccut.service;
importcn.edu.ccut.po.Grade;
importcn.edu.ccut.util.DB;
importjavax.xml.transform.Result;
importjava.sql.Date;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.util.ArrayList;
importjava.util.List;
@SuppressWarnings("unused")
publicclassGradeService{
privateDBdb;
privatestaticGradeServiceservice;
privateGradeService(){
db=DB.getInstance();
}
publicstaticGradeServicegetInstance(){
if(service==null){
service=newGradeService();
}
returnservice;
}
publicListgetAllGrades(){
Stringsql="select*fromt_grade";
ResultSetrs=db.executeQueryNoParam(sql);
Listgrades=null;
try{
grades=this.getList(rs);
}catch(SQLExceptione){
e.printStackTrace();
}finally{
db.close();
}
returngrades;
}
publicListqueryGradeByName(Stringname){
Stringsql="select*fromt_gradewherenamelike";
ResultSetrs=db.executeQueryByParam(sql,"%"+name+"%");
Listgrades=null;
try{
grades=this.getList(rs);
}catch(SQLExceptione){
e.printStackTrace();
}finally{
db.close();
}
returngrades;
}
privateListgetList(ResultSetrs)throwsSQLException{
Listgrades=newArrayList();
Gradegrade=null;
while(rs.next()){
grade=newGrade();
grade.setId(rs.getInt
(1));
grade.setName(rs.getString
(2));
grade.setMath(rs.getFloat(3));
grade.setChinese(rs.getFloat(4));
grade.setEnglish(rs.getFloat(5));
grade.setTime(rs.getDate(6));
grades.add(grade);
}
returngrades;
}
publicbooleaninsertOneGrade(Stringname,floatmath,floatChinese,floatEnglish,Datetime){
Stringsql="insertintot_grade(name,math,Chinese,English,time)values(,,,,)";
intcount=db.executeUpdate(sql,name,math,Chinese,English,time);
db.close();
if(count>0){
returntrue;
}else{
returnfalse;
}
}
publicbooleandeleteGradeById(intid){
Stringsql="deletefromt_gradewhereid=";
intcount=db.executeUpdate(sql,id);
db.close();
if(count>0){
returntrue;
}else{
returnfalse;
}
}
publicbooleanupdateGrade(Stringname,floatmath,floatChinese,floatEnglish,Datetime,intid){
Stringsql="updatet_gradesetname=,math=,Chinese=,English=,time=,whereid=";
intcount=db.executeUpdate(sql,name,math,Chinese,English,time,id);
db.close();
if(count>0){
returntrue;
}else{
returnfalse;
}
}
publicGradegetGradeById(intid){
Stringsql="select*fromt_gradewhereid=";
ResultSetrs=db.executeQueryByParam(sql,id);
try{
if(rs.next()){
Gradegrade=newGrade();
grade.setId(id);
grade.setName(rs.getString
(2));
grade.setMath(rs.getFloat(0));
grade.setChinese(rs.getFloat(0));
grade.setEnglish(rs.getFloat(0));
grade.setTime(rs.getDate(4));
returngrade;
}
}catch(SQLExceptione){
e.printStackT