Java学生管理系统
实训报告
学 号:
姓 名:
班 级:
指导老师:
一、项目计划
(1)项目名称:学生信息管理系统
(2)实训地点:
(3)小组成员:
二、系统总体设计
(1)需求分析
学生信息管理系统,是对学生的个人信息,课程信息,成绩信息以信息化的方式进行管理,最大限度地减少各个环节可能出现的错误,有效减少因人力资源局限性导致的存储信息量大,信息存储错误,混淆等问题,合理进行信息存储,使学校能够合理录入学生的个人资料,学期成绩情况,以及课程安排,为学校师生的工作提供后方面。
通过实际调查,要求学生信息管理系统具有以下功能:
1. 界面设计美观大方,方便,快捷,操作灵活。
2. 实现强大的学生个人信息,课程信息,成绩信息的查询,修改,录入,删除管理。
3. 实现强大的联系人信息及其类别的查询,录入,删除管理。
4. 能够在不同的的操作系统下运行,不局限于特定的平台。
5. 提供数据库备份与恢复功能。
6. 提供友情平台,例如:计算机,方便对成绩的操作;
(2)项目计划安排
一项任务的成功完成,必须依靠合理的计划安排以及各种资源的有效利用。有计划、有步骤地进行软件开发,除了可以提高开发进度外,更能明确项目组各成员之间的职责及任务。项目进度表要安排每个成员的任务,并要求成员每天修改自己的进度,保证项目管理人员可以随时查看整个项目的进度,以及时发现问题,调整工作策略。
(3)概要设计
概要设计是根据系统分析的需求和工作环境的情况对整个软件的总体结构进行大致的设计。概要设计要坚持以下几个原则:1:细分原则2:提高代码重用性:3:从上而下层层分析4:一致性原则5:提高独立性6:模块的大小要尽量适中。由于概要设计是整个设计的重中之重,牵一发而动全身,所以要努力做一个好的概要设计,才能在今后软件开发过程中不再反复。现在软件行业流行模式化驱动设计,将一些市场上比较成功的模式拿来用在自己的设计中。
(4)详细设计
概要设计是为了明确开发人员的工作步骤和工作目标。详细设计使开发人员可以轻松地完成代码的编写,并熟悉所编写的业务流程。
(5)数据表设计
根据系统所需,可以得出需要以下数据表信息:
需要管理学生信息:学生表。
需要管理教师信息:教师表。
需要管理课程信息:课程表。
需要管理选课信息:选课表。
需要管理院系信息:院系表。
需要管理管理员信息:管理员表。
(6)系统功能结构
(7)系统功能设计
系统功能框架:作为一个学生管理系统,本系统的设计主要包含:系统登录、学生信息管理、班级管理、课程管理和用户管理。学生管理系统主框架的主要结构。
(8)数据库设计
(9)生成数据库
设计好软件所需要的全部数据表后,如何将设计好的这些图形元素转化成SQL Server中的数据库呢?PowerDesigner的一个优点就是对数据库可逆。下面是连接数据库的具体步骤:
① 打开PowerDesigner,出现工作界面。
② 单击“数据库|生成数据库”菜单命令,弹出对话框。这里可以看到所有与生成数据库有关的选择,比如生成文件目的地、是否生成视图、是否生成主键索引等。
③ 修改SQl脚本的保存地址,单击“确定”按钮,如果不提示错误,在所选的目的地就能发现一个crebas.sql脚本文件。所生成的脚本文件中并没有关于数据库的信息,因为所创建的仅仅是数据库中表的所有信息。下面就要创建一个数据库。
④ 打开SQL Server,出现其控制台窗口。这里主要包含对象资源管理器和摘要2个区域。
⑤ 在对象资源管理器中,右键单击“数据库”项目,在弹出的菜单中选择“新建数据库”,就出现了新建数据库的窗口。
⑥ 在“数据库名称”文本框内,填写本项目数据库的名称:StudentManager。单击“确定”按钮,就生成了程序所需的数据库,并返回到数据库界面。
⑦ 单击“常规工具栏|新建查询”按钮,系统自动创建一个名为“SQLQuery1.sql”的文本窗口,并显示在摘要区内。
⑧ 打开第3步生成的脚本文件,按Ctrl+A组合键,选择文件里的所有内容,复制到打开的查询文件中。
⑨ 检查一下复制过来的代码是否完整,然后在“常规工具栏|数据库选择”下拉框中选择“StudentManager”。
⑩ 单击“常规工具栏|执行”按钮,执行脚本。如果提示“命令成功执行”,则生成了完整的数据库文件。
在完成对数据库中自动生成的表的检查后,如果没有问题,整个数据库设计就完成了。为了避免日后的重复操作,在设计数据库时,一定要全面掌握每个表的信息内容,因为后期再添加字段将会带来极高的维护成本。
(10)项目的测试
测试是为了更好地完成项目的功能,虽然测试并不能完全模拟实际发生的流程,但可以降低错误的发生概率,提高软件项目的稳定性。按照极限编程的理论,写测试就是对软件进行设计的过程,它的重要性甚至超过了完成实际功能的代码。先将测试写完,然后再来实现代码,这样所有的测试通过之日也就是程序完成之时。虽然这些理论并不能完全实践,但测试的重要性是毋庸置疑的。
四、实训总结
1.第一次完成项目,深刻的体会到软件整体架构的重要性,编程不能想到哪编到哪,这样在项目的后期会出现很多无法解决的致命错误,所以软件的整体架构的成败将会决定软件的成败,软件分析架构的时间应该占整个项目的大部分时间。
2.Java不仅仅是一个实训更是检验一个人综合能力的测试题。它在考察知识的同时,也考验了一个人的心理素质,沟通交流,表达能力,所以,在做好java任务的同时必须能够协调好这些。
3.软件测试的过程应该贯穿整个软件设计的过程,而不是等做好了再测试,需求分析的时候就应该测试了,而且要反复循环的测试。
4.虽然现在对需求分析还很模糊,但应该强化自己的需求分析的能力,一个好的需求分析才是软件的灵魂。
5.团队精神非常重要,需要不断的沟通。
6.总体上由于自己本身能力有限,还需要进一步学习。
五、实训心得
在几天的实训中我真正体会到这几点。首先兴趣是关键,我的学习完全是兴趣导向的,所以压力并不大。因为有兴趣,所以我会很想充分理解一切细节。又因为理解,所以许多原本片片断断的知识都可以渐渐互相融会贯通,累积技术能量、理论和实务之间的玻璃被打破了,学习效率才能倍增。
其次态度要端正,摆正自己的心态,不要以为什么东西上网搜搜就可以了,一定要有自己的东西。只有自己付出过,当程序运行成功时的那种喜悦才会令自己有一种莫名的自豪感。态度决定一切!然后还要有敢于挑战不安于现成的程序,要敢于用多种方法实现一个目的。
这次的实训也让我明白了要做好一个系统,团队合作永远是最重要的,一个人的力量永远是渺小的,团队分工、合作会使得问题更加的简单、解决的迅速。
第二篇:学生管理系统实训报告(java语言)
《Java实训》设计报告
学生管理系统
一、项目需求
通过与科信学院教务人员的详细交流,目标系统具备以下功能。
1. 教师客户端功能
* 可以更改密码;
* 可以添加学生,并要求填写学生基本信息;
* 可以根据学号查询学生基本信息及其成绩;
* 有权限控制,每个管理员只能管理其所在学院的信息;
* 可以添加新课程、新班级;
* 可以控制选课的课程范围,并可以控制选课的时间,即:可以控制选课开始和结束时间;
* 可以录入成绩,缓存成绩,检查无误后公布成绩。
2. 学生客户端功能
* 学生可以查看自己的基本信息;
* 学生可以查看自己的成绩,已修学分和不及格成绩信息;
* 学生端可以进行远程选课,并且可以查看课表。
根据以上相关功能,现规划数据流图和数据字典如下:
二、项目设计
在设计学生管理系统时,编写20个Java源文件:ChangePwd.java、ChangePwdTeacher.java、ChoseCourse.java、CourseTable.java、CourseManage.java、GetScore.java、GetStuInfo.java、GradeInDB.java、Login.java、NewClass.java、NewCourse.java、NewStu.java、StuClient.java、StuFailGrade.java、StuGrade.java 、StuInfo.java、StuScore.java、TeacherClient.java、TeachSearchInfo.java、Welcome.java学生管理系统除了上述20个Java源文件所给出的类外,还需要Java系统提供的一些重要类,如JButton,JTextField,JTextArea,LinkedList等。
下面是20个Java源文件的功能:
(1)Login.java(主类)
Login类负责创建学生管理系统登陆界面的主窗口,该类含有main方法,学生管理系统从该类开始执行。Login类是继承Jframe类,有一个ActionListener接口,并且加载了Mysql数据库连接。该类中有两种身份类型:学生、管理员,在登录窗口中选择相应的身份类型,输入信息正确后就会进入相应的客户端。
(2)ChangePwd.java类
该类是学生客户端修改密码的类,在该类中,用户提供原始密码(登陆成功的密码)后并且输入新密码和确认新密码后点击“确认”按钮就可以修改密码。
(3)ChangePwdTeacher.java类
该类是教师客户端修改密码的类,在该类中,用户提供原始密码(登陆成功的密码)后并且输入新密码和确认新密码后点击“确认”按钮就可以修改密码。
(4)ChoseCourse.java类
该类主要是控制学生选课,学生根据教师安排的课程信息,由学生输入已经安排好的“课程号”就可以选课。
(5)CourseTable.java类
该类主要控制学生的课程安排,就是以课表显示学生的选课信息。
(6)NewClass.java类
该类主要是有教师操作,教师通过输入正确的班级号、班级名、专业信息后就可以添加新的班级。
(7)NewStu.java类
该类作为教师客户端的一个主要模块,该模块是教师添加新学生。教师通过输入学生的基本信息,包括:姓名、出生年月、学号、籍贯、入学年份、专业等等。这样就可以添加新学生。
(8)StuClient.java类
该类是基于Login类的,这是学生客户端的界面类,该类控制了学生客户端要显示什么内容,由什么功能等等。包括:修改密码、查看自己基本信息和成绩、选课等功能界面的显示。
(9)TeacherClient.java类
该类是教师客户端界面的类,该类和StuClient类的功能基本相似,主要包括修改密码、添加新学生、查看学生基本信息和成绩信息、进行课程安排、添加新课程和班级等功能的显示。
(10)StuInfo.java类
StuInfo.java类是学生查询学生自己的基本信息。
(11)TeachSearchInfo.java类
TeachSearchInfo.java类是教师根据学生提供的基本信息建立学生基本信息电子档案。即新生报到功能的实现。
(12)Welcome.java类
该类最为简单,仅仅通过一张xs.jpg图片显示在学生和教师客户端中。
(13)CourseManage.java类
该类是教师管理课程,教师可以对课程安排,包括:周次、任课教师、学分等信息,为学生选课做准备。
(14)GetScore.java类
该类是提供学生的成绩各科成绩,包括及格成绩和不及格成绩,以及学分。
(15)GetStuInfo.java类
根据学号获得学生相应基本信息的方法。教师在输入学生学号后点击“查询”按钮查看相应学生的基本信息。
(16)GradeInDB.java类
该类的功能是公布学生某一科的成绩,教师通过点击“公布该科成绩单”就会公布该科的成绩,学生就会在学生自己客户端查看自己的成绩信息。
(17)NewCourse.java类
该类主要是有教师操作,教师通过输入正确的课程号、课程名、学分信息后就可以添加新的课程,这个类与NewClass.Java的功能相似。
(18)StuFailGrade.java类
该类功能是显示学生的不及格成绩。学生在查看成绩时候,点击“不及格成绩”时显示的界面。
(19)StuGrade.java类
该类功能是显示学生的已修课程成绩。学生在查看成绩时候,点击“已修课程成绩”时显示的界面。
(20)StuScore.java类
该类是教师通过输入学生的“学号”进行查询学生的成绩信息。
1、Login类(主类)
(1)数据和方法
Login类是javax.swing包中JFrame的一个字类,并实现了ActionListener接口。类中有关数据和方法的详细说明。
1)成员变量
该类中的变量大部分都是私有的,这样有利于信息的封装。其中包括:
private Connection conn;//连接数据库用到
private Statement stmt; //执行数据库语句
private ResultSet rs; //结果集
private JPanel jp=new JPanel();//创建用来存放空间的容器
private JLabel jl1=new JLabel("用户名");
private JLabel jl2=new JLabel("密码");
//创建用户名和密码输入框
private JTextField jtf=new JTextField();
private JPasswordField jpwf=new JPasswordField();
private JRadioButton[] jrbArray={new JRadioButton("普通学生",true),
new JRadioButton("管理人员")};//创建单选按钮数组
private ButtonGroup bg=new ButtonGroup(); //创建组
//创建操作按钮
private JButton jb1=new JButton("登陆");
private JButton jb2=new JButton("重置");
2)方法
main(String args[]);方法是学生管理系统程序运行的入口方法。
Login();是构造方法,负责完成窗口的初始化。
addListener();添加事件监听器方法。
initialFrame();初始化窗体
actionPerformed(ActionEvent e);实现接口方法
initialConnection();自定义的初始化数据库连接的方法
closeConn();关闭数据库
2、代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import java.net.*;
import java.io.*;
import java.sql.*;
import javax.sql.*;
public class Login extends JFrame implements ActionListener
{ private String host;
//声明Connection引用、Statement对象引用与结果集引用
private Connection conn;
private Statement stmt;
private ResultSet rs;
private JPanel jp=new JPanel();//创建用来存放空间的容器
private JLabel jl1=new JLabel("用户名");
private JLabel jl2=new JLabel("密码");
private JLabel jl3=new JLabel("");//正在登陆提示标签
//创建用户名和密码输入框
private JTextField jtf=new JTextField();
private JPasswordField jpwf=new JPasswordField();
private JRadioButton[] jrbArray={new JRadioButton("普通学生",true),new JRadioButton("管理人员")};//创建单选按钮数组
private ButtonGroup bg=new ButtonGroup();//创建组
//创建操作按钮
private JButton jb1=new JButton("登陆");
private JButton jb2=new JButton("重置");
public Login()
{ this.addListener(); initialFrame();//初始化界面 }
public void addListener()
{ this.jb1.addActionListener(this);//为登陆按钮注册监听器
this.jb2.addActionListener(this);//为重置按钮注册监听器
this.jtf.addActionListener(this);//为用户名文本框注册监听器
this.jpwf.addActionListener(this);//为用户名密码框注册监听器
}
public void initialFrame()
{ jp.setLayout(null); //设为空布局
//将控件添加到容器相应位置
jl1.setBounds(30,100,110,25); jp.add(jl1);
jtf.setBounds(120,100,130,25); jp.add(jtf);
jl2.setBounds(30,140,110,25); jp.add(jl2);
jpwf.setBounds(120,140,130,25); jp.add(jpwf);
jpwf.setEchoChar('*');
bg.add(jrbArray[0]);
bg.add(jrbArray[1]);
jrbArray[0].setBounds(40,180,100,25); jp.add(jrbArray[0]);
jrbArray[1].setBounds(145,180,100,25); jp.add(jrbArray[1]);
jb1.setBounds(35,210,100,30); jp.add(jb1);
jb2.setBounds(150,210,100,30); jp.add(jb2);
jl3.setBounds(40,250,150,25); jp.add(jl3);
this.add(jp);
//设置窗口的标题、大小、位置以及可见性
this.setTitle("登陆");
this.setResizable(false);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int centerX=screenSize.width/2;
int centerY=screenSize.height/2;
int w=300;//本窗体宽度
int h=320;//本窗体高度
this.setBounds(centerX-w/2,centerY-h/2-100,w,h);//设置窗体出现在屏幕中
this.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{ if(e.getSource()==jb1)
{//按下登陆按钮
String name=this.jtf.getText().trim();
if(name.equals(""))
{
JOptionPane.showMessageDialog(this,"请输入用户名","错误",JOptionPane.ERROR_MESSAGE);
jl3.setText(""); return;
}
String pwd=new String(jpwf.getPassword()).trim();
if(pwd.equals(""))
{
JOptionPane.showMessageDialog(this,"请输入密码","错误",JOptionPane.ERROR_MESSAGE);
jl3.setText(""); return;
}
int type=this.jrbArray[0].isSelected()?0:1;//获取登陆类型
try
{//初始化连接
this.initialConnection();
if(type==0)
{//普通学生登陆
String sql="select * from user_stu where stu_id='"+name+"' and pwd='"+pwd+"'";
rs=stmt.executeQuery(sql);
if(rs.next())
{ new StuClient(name);//创建学生客户短窗口
this.dispose();//关闭登陆窗口并释放资源
}
else
{//弹出错误提示窗口
JOptionPane.showMessageDialog(this,"用户名或密码错误","错误",JOptionPane.ERROR_MESSAGE);
jl3.setText("");
}
this.closeConn();//关闭连接,语句及结果集
}
else{//教师登陆
String sql="select coll_id from user_teacher where uid='"+name+"' and pwd='"+pwd+"'";
rs=stmt.executeQuery(sql);
if(rs.next())
{ String coll_id=rs.getString(1);
new TeacherClient(coll_id);//创建教师客户端窗口
this.dispose();//关闭登陆窗口并释放资源
}
else
{//弹出错误提示窗口
JOptionPane.showMessageDialog(this,"用户名或密码错误","错误",JOptionPane.ERROR_MESSAGE);
jl3.setText("");
}
this.closeConn(); //关闭连接,语句及结果集
}
}
catch(SQLException ea)
{
ea.printStackTrace();
}
}
else if(e.getSource()==this.jb2)//按下重置按钮,清空输入信息
{ this.jtf.setText(""); this.jpwf.setText(""); }
else if(e.getSource()==jtf)//当输入用户名并回车时
{this.jpwf.requestFocus(true);}
else if(e.getSource()==jpwf)//当输入密码并回车时
{this.jb1.requestFocus(true);}
}
//自定义的初始化数据库连接的方法
public void initialConnection()
{ try
{//加载驱动,创建Connection及Statement
Class.forName("org.gjt.mm.mysql.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
stmt=conn.createStatement();
}
catch(SQLException e)
{
JOptionPane.showMessageDialog(this,"连接失败,请检查主机地址是否正确","错误",JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
}
//初始化的关闭数据库连接的方法
public void closeConn()
{ try
{ if(rs!=null){rs.close();}
if(stmt!=null){stmt.close();}
if(conn!=null){conn.close();}
}
catch(SQLException e)
{
e.printStackTrace();
}
}
public static void main(String args[])
{
Login login=new Login();//创建登陆窗体对象}
}
3、效果图
Login创建的窗口效果如图1所示。
学生管理系统共有三个窗体:登录窗体、教师客户端窗体、学生客户端窗体。主要操作如下:
(1)如果用户名或密码错误,则会弹窗错误提示对话框,如图2所示。
(2)当用户为教师时,登录成功后的窗体会自动全屏显示,展开左边的树状列表,如图3所示,然后通过单击不同节点进行相应的业务操作。
(3)通过单击“退出”节点时,系统会弹出对话框确认,如图4所示,根据用户选择进行相应操作。
(4)当有新生报到时,用户可以单击“新生报到”节点,进入如图5所示的添加学生窗体界面。
(5)当教师需要查询某个学生的基本信息时,可以单击“基本信息查询”节点输入学号进行查询,界面如图6所示。
(6)每学期开始,各学院都应该为学生安排可选课程,这时可以通过“开课选项设置”进入选课设置界面进行操作,如图7所示。教师进行课程设置后效果如图8所示
(7)在每个学期期末,需要对学生的成绩进行录入,用户通过“课程成绩录入”模块进行录入操作,如图9所示。
(8)教师还可以通过点击“添加课程”、“添加班级”节点,进行添加课程和班级操作,如图10和图11所示。
(9)教师可以点击“修改密码”来修改自己的登录密码,如图12所示。
(10)如果用户是学生,登录后的窗体也会自动全屏显示,展开树状列表后的界面如图13所示。
(11)当学生需要选课时,可以通过单击“选课”节点进入如图14所示的选课界面进行选课。
(12)在学生选课过程中,随时可以点击“课表显示”节点查看课表,如图15所示。
(13)学生点击“已修课程成绩”节点时,便可进入已修课程查看界面,查看成绩和学分,如图16所示。
三、项目总结
学生管理系统的完成,对学校的管理带来了方便,也对教师是一个很好的帮助,方便管理,提高了工作的效率。在本系统开发过程中,由于本人是初次开发软件,在知识、经验方面存在不足。另外在整个开发过程中,时间也比较仓促,因此,该系统必然存在一些缺陷和不足。因为对学生的管理整个流程不够熟悉,在需求分析时未能做到完全满足用户的需求。另外,由于自身对网络的不熟悉,本应做到C/S客户端/服务器的软件,结果不能达到预期效果,实为遗憾。
虽然该系统存在诸多的不足,但其功能均已经实现,易于日后程序的更新、数据库管理容易、界面友好、操作方便、安全性好。相信本学生管理系统是一套学校在日常管理中必不可少的管理软件。
四、心得体会
通过开发这个软件,我掌握了项目的开发过程,了解了基本知识,巩固了我对Java编程语言和软件工程思想的学习,掌握了简单的数据库操作。尤其掌握了树状列表作为导航的重要性,并且能够运用。同时编写这个程序让我更好的理解了数组、类的运用及事件的监听和获取等功能。我相信我会再在java方面下苦工的,相信自己一定能更好的运用java编程语言的。