学生成绩管理系统(六):项目总结
一、项目实现情况
初期项目计划:
-
简单的图形界面登录功能。
-
对数据库的的信息的查询功能。
-
对数据库的的信息的修改功能。
-
对数据库的的信息的删除功能。
-
对数据库的的信息的添加功能。
-
当以学生身份登录时只有查询的功能。
-
当教师登陆时既可以查询也可以进行修改、删除、添加的操作。
最终项目实现的功能:
软件功能架构图:
软件功能介绍:
- 输入用户名和密码进入系统主界面
- 记录学生的基本信息,如姓名、学号、性别、专业、班级等
- 记录各科成绩
- 根据用户需求添加、修改、删除学生信息
- 学生查找功能分为按年级查找、按班级查找、按专业查找、和显示总体信息
- 实现常用的统计功能,如:单科成绩排名、总分排名、统计成绩高于/低于某一临界值的学生、统计单科/总分平均值
理想与现实的差距
我们初期对学生成绩管理系统的规划是:有一个学生登录界面和一个老师登录界面。先进入首界面选择时学生登录还是老师登录,根据用户选择,进入相应的登录界面。在学生登录界面内,输入学生的学号和密码,进入主操作界面。当以学生身份登录时只能进行查询,当输入教师账号登录时可以查询,修改,删除,添加操作。整个程序系统是和Access数据库相连接,建立三张表:STUDENT(学生信息表)、Teacher(教师账号管理表)、zhanghao(学生账号管理表)。
最终版学生成绩管理系统PS:详情请点击这里我们最终的学生成绩管理系统设置了一个登陆入口,用户直接输入自己的用户名和密码之后进入系统主操作界面。在主操作界面中,分了三大块:学生管理、学生查找、成绩管理。在学生管理这一块中,又分为增加学生、修改学生、删除学生、单个查询(按照学号查询)这四个功能;在学生查找中分为:查看全体、按年级查找、按班级查找、按专业查找四个功能;在成绩管理中分为:单科排名、总分排名、挂科学生、合格学生四个功能。而且我们整个系统的数据库是使用MySQL来链接制作的。
二、项目测试分析
1.数据库名studentmanagement
2.典型测试数据的构建,并且给出测试数据的预计结果
原数据:
测试数据:
2.1 添加学生
20122222 张晓华 女 2012 2 计算机科学与技术 19941215 95 96 85
2.2 删除学生
20145223
2.3 修改学生
20145236 冯佳 女 2014 3 管理 19960125 56 84 97
2.4 单个查找
2.5 查询全体
2.6 按年级查找 2012级
2.7 按班别查找 1班
2.8 按专业查找
2.9 单科排名并显示平均分
2.10 总分排名并显示平均分
2.11 单科及格学生
2.12 单科不及格学生
三、项目实现中的问题与解决
问题1:如何实现一个管理员登录界面
解决方法:
由于这一部分书上并没有具体指导的方法,所以我们选择百度”java界面编程”,在百度知道中我们找到了答案:Java界面编程
其中给出了整个具体的代码,这就很大程度上帮助了我们在后续界面的设计和编码。因此我们基本上后续所有界面的代码都是在这个代码的基础上所进行修改而得出的。牛顿说过要站在巨人的肩膀上,我们也是再利用了别人的代码的基础上再进行完善和修改,最终一步步做出了属于我们自己的操作界面。
代码如下:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Login {
private JFrame frame = new JFrame("登录");
private Container c = frame.getContentPane();
private JTextField username = new JTextField();
private JPasswordField password = new JPasswordField();
private JButton ok = new JButton("确定");
private JButton cancel = new JButton("取消");
public Login(){
frame.setSize(300,200);
c.setLayout(new BorderLayout());
initFrame();
frame.setVisible(true);
}
private void initFrame() {
//顶部
JPanel titlePanel = new JPanel();
titlePanel.setLayout(new FlowLayout());
titlePanel.add(new JLabel("系统管理员登录"));
c.add(titlePanel,"North");
//中部表单
JPanel fieldPanel = new JPanel();
fieldPanel.setLayout(null);
JLabel l1 = new JLabel("用户名:");
l1.setBounds(50, 20, 50, 20);
JLabel l2 = new JLabel("密 码:");
l2.setBounds(50, 60, 50, 20);
fieldPanel.add(l1);
fieldPanel.add(l2);
username.setBounds(110,20,120,20);
password.setBounds(110,60,120,20);
fieldPanel.add(username);
fieldPanel.add(password);
c.add(fieldPanel,"Center");
//底部按钮
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(ok);
buttonPanel.add(cancel);
c.add(buttonPanel,"South");
}
public static void main(String[] args){
new Login();
}
}
程序运行结果如下:
问题2:Botton和Jbotton的区别
在程序界面的设计过程中,我们遇到了汉字无法显示的问题:
解决过程:
经过百度,我们知道了,因为Button是awt包中的控件,而JButton是swing包中的控件,AWT是依靠本地方法来实现其功能的,Swing是在AWT的基础上构建的一套新的 图形界面系统。于是我们将Button换成Jbotton,便可以显示中文了。
问题3:数据库的链接
我们的成绩管理系统一开始使用的是access数据库,但是百度了之后并没有发现与netbeans和access链接相关的代码,在qq上向老师寻求帮助之后,我们决定换为mysql这个数据库。
使用mysql的好处:
1.MySQL是一个关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
2.MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
3.MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
解决过程:
我们查阅了相关资料以及参考了卢肖明的博客 最终我们成功将我们的程序与数据库成功连接上。
1.我们项目选择的是mysql的数据库,之前老师发在群里有一个集成各种软件的功能强大的XAMPP:
2.选择xampp的这两个功能:
3.我们现在可以进入到弹出的网页中,这里就是我们建立数据库的地方,选择选项中的new,我们就可以在此创建自己需要的数据库:
4.我们建立一个名为studentmanagement的数据库,在这个数据库中创建一个名为student的表:
5.由于我们选择的是Netbeans程序进行项目,所以我们需要这Netbeans中进行如下的操作:
·导入库文件:
·导入jar包:
·程序连接代码:
package 最终版学生成绩管理系统;
import java.sql.*;
//连接数据库类
public class DataBaseCreate {
//连接数据库静态方法,若产生错误,则抛出相应错误信息
public static Connection getConnection()throws SQLException,java.lang.ClassNotFoundException{
//建立本地数据库连接,编码规则转换为utf-8(正常录入中文)
String url="jdbc:mysql://localhost:3306/studentmanagement?useUnicode=true&characterEncoding=utf8";
Class.forName("com.mysql.jdbc.Driver");
String userName="root";
Connection con=DriverManager.getConnection(url, userName, "");
return con;
}
}
如果有其他的小伙伴对于这方面的知识有兴趣的话,可以参考卢肖明关于书上数据库联机的帖子:数据库联机 以及我们团队小组第五次的项目总结:学生成绩管理系统(五):系统的完善与数据库的联机
问题4:如何点击按钮弹出窗口
解决过程:
在监听器下
if(o=你的按钮){
new 你需要的新对话框
}
(该方法可以在实现actionPerformed方法中,也可以直接写匿名内部类)
或者不实现ActionListener而直接在代码中加入该监听
伪代码:
ActionListener listener=new ActionListener(){
public void actionPerformed(ActionEvent e){
if(o=你的按钮){
new 你需要的新对话框
}
}
};
参考代码
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class popupWindows{
JFrame mainWindow;
public popupWindows(){
mainWindow = new JFrame("pop up window");
//mainWindow.setBounds(10,10,10,10);
JButton JB = new JButton("PopUp");
JB.addActionListener(new creatNewWindow());
mainWindow.setVisible(true);
mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWindow.add(JB);
mainWindow.pack();
}
class creatNewWindow implements ActionListener{
public void actionPerformed(ActionEvent e){
new popupWindows().mainWindow.setBounds(100,100,100,100);
}
}
public static void main(String[] args){
new popupWindows();
}
}
问题5:程序功能多导致的主程序代码过长
解决方法:
我们的项目里涉及到很多功能,考虑到分工合作问题以及程序代码编写容易发生混乱,我们将主程序里运用到的多个子程序单独作为一个class类,主程序main直接调用就可以。
类的设计过程:
本程序包括19个类文件,每个类文件只含有一个类,分别是包含main方法的主类 Main,实现登录功能的类 Login, 实现各种功能选择功能的类 Function, 实现数据库连接的类 DataBaseCreate, 实现学生信息编辑功能类 StudentEdit, 执行增加学生功能的类 AddStudent, 执行删除学生功能的类 DeleteStudent, 执行修改学生功能的类 UpdateStudent, 执行单个查询功能的类 IndexOfSingle, 实现条件查找和成绩管理功能的类 IndexOrManage, 执行查询全体功能的类 LookAllStudents, 执行按年级查询功能的类 IndexOfGrade, 执行按班别查询功能的类 IndexOfClass, 执行按专业查询的类 IndexOfMajor, 执行单科排名功能的类 SubjectScoreRanking, 执行总分排名功能的类 TotalScoreRanking, 执行查找单科及格学生功能的类 PassStudents, 执行查找单科不及格学生功能的类 NotPassStudents, 执行将文本域内容保存到TXT文件的类 TxtSave。以上19个类,除了Main类以外,均包含一个构造方法,有些还包含actionPerformed(e)方法。
问题6:关于下拉列表的实现,录入学生信息的时候,刚开始我们设计的是所有学生信息必须通过手动输入,后来我们想要设置为能有一个下拉列表,类似于性别、班级、年级、专业这类的输入使管理员能够不用再重新输入,而是通过下拉列表进行选择。包括在查询管理和学生查找中的单科排名和合格学生、挂科学生、按班级查找、按年级查找、按专业查找我们用同样的方法设置了下拉列表。
解决方法:
我们通过在需要下拉列表的类 IndexOrManage、类 IndexOfGrade、类 IndexOfClass、类 PassStudents、类 NotPassStudents中添加类import javax.swing.JComboBox;显示一个项列表,扩展的是ListModel接口的模型,它的显示绘制器通过实现ListCellBenderer接口来绘制列表下拉列表。JComboBox类是一个组件,它结合了一个按钮或可编辑字段与下拉列表。
代码如下:
String[] classes={"","1","2","3"};
JComboBox clas=new JComboBox(classes);//班级下拉列表
JLabel la=new JLabel("选择查询班别");
String[] grades={"","2012","2013","2014","2015"};
JComboBox grade=new JComboBox(grades);
JLabel la=new JLabel("选择查询年级");
String[] majors={"","电子信息工程","计算机科学与技术","通信工程","管理","信息安全"};
JComboBox major=new JComboBox(majors);
JLabel la=new JLabel("选择查询专业");
String[] subjects={"","语文","英语","数学"};
JComboBox subject=new JComboBox(subjects);
JLabel la=new JLabel("选择查询科目");
效果如下图:
问题7:在进行数据库连接之后查询的数据无法显示出来
解决方法:
在程序中加上类
import java.sql.Connection;//与数据库连接的类
import java.sql.ResultSet;//ResultSet 对象具有指向其当前数据行的指针,默认的 ResultSet 对象不可更新,仅有一个向前移动的指针;
//ResultSet 对象的列的编号、类型和属性由 ResultSet.getMetaData 方法返回的 ResulSetMetaData 对象提供。
import java.sql.SQLException;//无效的列索引
import java.sql.Statement;//是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。
//Statement对象,用于执行不带参数的简单SQL语句。
并将程序中的主键和数据库相连接,这样当管理员点击主键的时候就能够直接对数据进行操作。相关代码如下:
try{
Connection con=DataBaseCreate.getConnection();
Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
//按班别查找数据库数据
ResultSet rs=sql.executeQuery("select * from student where Class like '%"+clas.getSelectedItem()+"%'");
text.append("全校"+clas.getSelectedItem()+"班学生信息:\r\n");
text.append("学号 姓名 性别 生日 专业 年级 班别 语文 英语 数学 总分\r\n");
while(rs.next()){
text.append(rs.getString("Num")+" "+rs.getString("Name")+" "+rs.getString("Sex")+" "+rs.getString("Birth")+" "+rs.getString("Major")
+" "+rs.getString("Grade")+" "+rs.getString("Class")+
" "+rs.getFloat("Chinese")+" "+rs.getFloat("English")
+" "+rs.getFloat("Maths")+" "+rs.getFloat("Total")+"\r\n");
}
}catch(java.lang.ClassNotFoundException err){
JOptionPane.showMessageDialog(null, err.getMessage(), "ClassNotFoundException:",
JOptionPane.INFORMATION_MESSAGE);
}catch (SQLException ex){
JOptionPane.showMessageDialog(null, ex.getMessage(), "SQLException: ", JOptionPane.INFORMATION_MESSAGE);
}
}
问题8:当管理员输入的信息不符合系统设置的操作要求时,应该怎么办???也许你会说这很简单啊,设置个if语句不就OK了吗。然而操作起来并没有那么简单,我们刚开始设想了一下如果管理员输入错误的话应该如何弹出消息提示框提示管理员进行正确操作呢?后来终于找到了正确的解决办法参考资料
解决方法:
在程序中加入类import javax.swing.JOptionPane;构建使用消息提示框
相关代码如下:
if(number.equals("")){
JOptionPane.showMessageDialog(null, "不存在此学生", "Messages",
JOptionPane.INFORMATION_MESSAGE);
}
if(clas.getSelectedItem().equals("")){
JOptionPane.showMessageDialog(null, "找不到该班别", "Message",
JOptionPane.INFORMATION_MESSAGE);
}
if(grade.getSelectedItem().equals("")){
JOptionPane.showMessageDialog(null, "找不到该年级", "Message",
JOptionPane.INFORMATION_MESSAGE);
}
if(major.getSelectedItem().equals("")){
JOptionPane.showMessageDialog(null, "找不到该专业", "Message",
JOptionPane.INFORMATION_MESSAGE);
}
else{
JOptionPane.showMessageDialog(null, "用户名或密码错误", "Error", JOptionPane.INFORMATION_MESSAGE);
}
效果如下图:(PS:由于消息提示框类型都一样在此就不一一列举了)
问题9:程序中有很多操作功能的界面和操作功能基本相同,所以我们干脆让它们继承同一个类,这里就用到了我们Java课本上的子类继承父类的的知识。
解决办法:
AddStudent, DeleteStudent, UpdateStudent, IndexOfSingle 界面和操作基本相同,所以上4类均继承StudentEdit。LookAllStudents, IndexOfGrade, IndexOfClass, IndexOfMajor, SubjectScoreRanking, TotalScoreRanking, PassStudents, NotPassStudents, 界面和操作基本相同,所以上8类均继承IndexOrManage。所以这几个功能操作运行出来之后界面显示和相关的功能操作都是一样的。我们用super()来继承父类。
super();//this通常指代当前对象,super通常指代父类
p1.add(la);
p1.add(clas);
//注册监听
b1.addActionListener(this);//给b1实例加一个监听器,当鼠标点击了这个b1时就触发了这个监听器
b2.addActionListener(this);
b3.addActionListener(this);
pack();
setVisible(true);//数据模型已经构造好了,允许JVM可以根据数据模型执行paint方法开始画图并显示到屏幕上了
}
使用super关键字
子类可以继承父类的非私有成员变量和成员方法(不是以private关键字修饰的)作为自己的成员变量和成员方法。但是,如果子类中声明的成员变量与父类的成员变量同名,则子类不能继承父类的成员变量,此时称子类的成员变量隐藏了父类的成员变量。如果子类中声明的成员方法与父类的成员方法同名,并且方法的返回值及参数个数和类型也相同,则子类不能继承父类的成员方法,此时称子类的成员方法重写了父类的成员方法。这时,如果想在子类中访问父类中被子类隐藏的成员方法或变量,就可以使用super关键字。
调用父类的构造方法:
子类可以调用由父类声明的构造方法。但是必须在子类的构造方法中使用super关键字来调用。语法格式如下:
super([参数列表]);
如果父类的构造方法中包含参数,则参数列表为必选项,用于指定父类构造方法的入口参数。
super调用和this调用很像,区别在于super调用的是其父类的构造方法,而this调用的是同一个类中重载的构造方法。因此,使用super调用父类构造也必须出现在子类构造执行体的第一行,所以this调用和super调用不会同时出现。
问题10:当运行程序后发现对信息进行录入的时候,录入汉字之后程序就会出现错误提示。如下图:
解决方法:
通过不懈努力之后发现是在建立数据库的时候在需要录入汉字的功能的字符集编码设置错误。参考资料
在数据库中对已经建好的表里需要录入汉字的主键进行编辑。如果在建表的时候没有注意这一细节,数据表将会将字符集编码默认设置成latin1,而你只需要将latin1改为utf8_general_ci。具体操作见下图:
点击你需要修改字符集编码的主键。比如我们程序中的Name、Sex、Major需要录入中文,所以我们就依次修改这三个主键,点击修改。
然后点击排序规则中的下拉键,选择utf8_general_ci,最后点击保存。
四、项目展望与改进
我们的项目还有很大的发展空间,但是由于我们的时间精力和能力有限,所以更新学生成绩管理系统的的重任只能落在学弟学妹们身上啦!你们应该也已经看到了我们项目的最初计划了,所以你们完全可以按照我们刚开始计划的那样,完后我们未了的心愿。在我们的第二篇博客学生成绩管理系统(二):项目介绍中有详细的介绍和说明,这个程序可以加上多人操作功能,可以设置管理员操作窗口、教师操作窗口、学生操作窗口。
●管理员端
管理员可以进行的操作如下:
1、对学生信息进行增、删、改、查
2、对教师信息进行增、删、改、查
3、对课程信息进行增、删、改、查
4、查看个人信息并进行性修改
5、查看学生的成绩以及排名情况,其中在查看学生排名时,可以根据学生的所学课程和所在专业进行排名查询
●教师端
教师可以进行的操作如下:
1、查看个人信息并修改登录密码
2、查看学生信息,其中包括对学生成绩进行查询与修改,在本系统中,将教师的成绩录入功能与成绩修改功能合并
3、查看学生的排名情况,包括学生的课程排名与专业排名
●学生端
学生可以进行的操作如下:
1、修改个人登录系统的密码
2、查询自己成绩以及成绩排名情况,同时拥有通过学号查询其他人成绩的权利
另外,你们也可以将界面设计的温馨一点儿,而不是像我们现在这么官方,将相关的操作再完善一下,加油吧!骚年!我们相信你们可以长江后浪推前浪,将我们拍在沙滩上!哈哈哈哈!祝你们好运!!!
代码托管
代码托管连接
五、团队成员贡献与成绩分配
学号 | 姓名 | 贡献 | 成绩分配 |
---|---|---|---|
20145223 | 杨梦云 | 编辑程序(学生管理这一部分),查找相关资源,进行数据库的连接和建数据表,程序的改进和完善,博客的更新,1-5题的解决 | 31 |
20145236 | 冯佳 | 编辑程序(学生查找这一部分),在数据库中建数据表,及其数据表的完善,程序界面和功能的改进和完善,博客的更新,6-10题的解决 | 29 |
20145104 | 张家明 | 编辑程序(成绩管理这一部分),在数据库中建数据表 | 15 |