目录
数据库建表准备:
程序展示:
1.登陆界面
注册界面:
学生端展示:
1.查看成绩功能
2.查找成绩
教师端展示:
1.添加成绩
2.修改成绩:
3.删除成绩
3.查找成绩
编辑
源代码展示:
登陆界面
注册界面
登录后系统主界面
数据库建表准备:
这里我建了两张表,一张是系统登陆信息的,另一张是存储了所有学生成绩的表,可以根据自己需要修改表的内容和属性格式,后续会不断完善
如下所示:
另外需要java连接mysql的jar包,以及javafx的jar包导入,这里就不详细多说。
程序展示:
1.登陆界面
这里可以换成自己的图片
注册界面:
学生端展示:
这里的图片也可以更换成预设的头像,可以实现根据用户切换不同的图片
学生端只做了查看和查找成绩的功能,修改,添加,删除等功能在教师端实现。同时增加了修改个人信息 的功能 通过验证密码来判断修改权限。
1.查看成绩功能
学生端只能查看自己一个人的成绩 因为这里使用的是Tableview组件,所以省去了实现排序功能。
2.查找成绩
这里实现了根据日期和备注查找,后续也可以实现根据科目,总分进行分别查找,这些功能都比较好实现,主要是数据库的条件查找加上控件的重新展示排列,操作比较麻烦,但是实现起来比较简单。
教师端展示:
教师端的功能就比较丰富,增删改查,可以查考所有学生的成绩
1.添加成绩
给每个学生添加成绩,这个功能就很鸡肋,不如直接去数据库导入Excel文件添加。
2.修改成绩:
这里直接在tableview表格上单击成绩修改 简单很多 我这里设置了只有三科成绩和备注可以修改,总分和平均分会随着成绩的修改而自动修改。因此我在这里隐藏了修改成绩按钮。
3.删除成绩
也是直接在tableview中直接操作,选中后点击删除成绩按钮,会弹出确认对话框,确认后即删除成功,表格也会自动更新。这里的删除和修改权限只有教师端才有,学生端的功能被隐藏。
3.查找成绩
目前支持根据姓名精确查找,日期,备注模糊查找,然后也是和显示成绩一样,可以在表格上修改,删除。
源代码展示:
因为代码过多分了多个类,所以就先展示一部分,具体源代码可以私信我获取
登陆界面
package com.example.studentgrade;
import Dao.BaseDao;
import Dao.StringUtil;
import Pojo.User;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class LoginController {
@FXML //学号输入文本框
protected TextField id;
@FXML //密码输入文本框
protected PasswordField password;
@FXML //密码输入错误提示
protected Label errorlabel;
private BaseDao baseDao=new BaseDao();
@FXML
//登陆按钮事件
protected void onloginclick() throws Exception {
//将错误信息清除
errorlabel.setText("");
boolean loginstaus=false;
//先判断输入是否为空
if (StringUtil.isEmpty(id.getText())||StringUtil.isEmpty(password.getText()))
{
//如果有一个输入为空 就返回false
return;
}
//查询数据库
ResultSet rs = baseDao.searchalluser();
while (rs.next())
{
if (rs.getString("id").equals(id.getText())&&rs.getString("password").equals(password.getText()))
{
//如果输入均正确
System.out.println("登陆成功");
loginstaus=true;
login=true;
User user=User.getUser();
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
user.setAge((Integer) rs.getObject("age"));
user.setJob(rs.getString("job"));
user.setPassword(rs.getString("password"));
Main main=new Main();
main.start(new Stage());
}
}
if (loginstaus==false)
{
errorlabel.setText("账号或密码输入错误,请重新输入");
System.out.println("登陆失败");
}
}
@FXML
void onregisterclick() throws Exception {
Register register=new Register();
register.start(new Stage());
}
public static boolean login=false;
}
注册界面
package com.example.studentgrade;
import Dao.BaseDao;
import Dao.StringUtil;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import java.sql.ResultSet;
import java.sql.SQLException;
public class RegisterController {
private BaseDao baseDao=new BaseDao();
@FXML
private ComboBox job=new ComboBox<>();
@FXML
private TextField id;
@FXML
private TextField name;
@FXML
private PasswordField password;
@FXML
private TextField age;
@FXML
void onregisterclick() throws SQLException, ClassNotFoundException {
//获取身份列表
// ObservableList items = job.getItems(); //返回一个列表
String jobstr= (String) job.getSelectionModel().selectedItemProperty().getValue();
// System.out.println(job.getSelectionModel().selectedItemProperty().getValue());
//获取各个信息
//先判断是否有空
if (StringUtil.isEmpty(id.getText())||StringUtil.isEmpty(name.getText())||StringUtil.isEmpty(password.getText())||StringUtil.isEmpty(age.getText())||StringUtil.isEmpty(jobstr))
{
// System.out.println("有空值");
Dialog<ButtonType> warning = new Dialog<>();
warning.getDialogPane().getButtonTypes().add(new ButtonType("确认", ButtonBar.ButtonData.OK_DONE));
warning.setTitle("注册失败");
warning.setContentText("请完整填写信息");
warning.show();
return;
}
String idstr=id.getText();
String namestr=name.getText();
String passwordstr=password.getText();
String agestr=age.getText();
//先判断学号是否被注册
ResultSet rs = baseDao.searchalluser();
while (rs.next())
{
if (idstr.equals(rs.getString("id")))
{
//如果有重复的学号
Dialog<ButtonType> warning = new Dialog<>();
warning.getDialogPane().getButtonTypes().add(new ButtonType("确认", ButtonBar.ButtonData.OK_DONE));
warning.setTitle("注册失败");
warning.setContentText("该学号已被注册");
warning.show();
return;
}
}
//调用dao中方法创建新用户
boolean status=baseDao.addnewuser(idstr,namestr,passwordstr,Integer.parseInt(agestr),jobstr);
if (status==true)
{
Dialog<ButtonType> warning = new Dialog<>();
warning.getDialogPane().getButtonTypes().add(new ButtonType("确认", ButtonBar.ButtonData.OK_DONE));
warning.setTitle("注册成功");
warning.setContentText("注册成功");
warning.show();
//清空所有文本框 防止重复注册
id.clear();
name.clear();
password.clear();
age.clear();
}
}
}
登录后系统主界面
package com.example.studentgrade;
import Pojo.User;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import java.io.IOException;
public class Main extends Application {
@Override
public void start(Stage stage) throws Exception {
// FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("Main.fxml"));
Parent root=FXMLLoader.load(Register.class.getResource("Main.fxml"));
Scene scene = new Scene(root, 898, 621);
//获取用户信息
User user=User.getUser();
//获取Text标签
Text name= (Text) root.lookup("#name");
Text id=(Text)root.lookup("#id");
Text age=(Text)root.lookup("#age");
//设置标签值
name.setText(user.getName());
id.setText(user.getId());
age.setText(String.valueOf(user.getAge()));
//设置学生端 添加成绩和删除成绩按钮不可见 不可修改成绩
//获得这3个按钮
Button addbutton= (Button) root.lookup("#add");
Button delbutton= (Button) root.lookup("#del");
Button modifybutton=(Button)root.lookup("#modify");
Button findbutton=(Button)root.lookup("#find");
//通过判断job属性来区分客户端显示类型
if (user.getJob().equals("学生"))
{
stage.setTitle("学生成绩管理系统(学生端)");
addbutton.setVisible(false);
delbutton.setVisible(false);
modifybutton.setVisible(false);
//将查找成绩按钮移至中间
findbutton.setLayoutX(799); findbutton.setLayoutY(296);
}else if (user.getJob().equals("教师"))
{
stage.setTitle("学生成绩管理系统(教师端)");
}else {
stage.setTitle("学生成绩管理系统(管理员端)");
}
//为退出按钮绑定事件
Button tuichu=(Button)root.lookup("#exit");
tuichu.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
stage.close();
LoginApplication loginApplication=new LoginApplication();
try {
loginApplication.start(new Stage());
System.out.println("退出成功");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
stage.setScene(scene);
//设置不可改变大小
stage.setResizable(false);
stage.show();
}
}
其中的User类利用了单例模式,只保存了当前登陆用户的所有信息,方便各个类面板调用判断。
这个也是刚学不久后做的第二个实例,花了大概一天时间,还不是很完美,经过自己测试基本功能都能正常使用。
这次创建了Basedao类专门用来连接数据库,因此改动部分较少,只需要改成自己的数据库名,表名就行,也可以先根据我的来用,后续根据自己的需要修改。
需要完整源代码的可以私信我,麻烦大家点个赞就好了。目前还没有整理好,且功能在不断地完善。有bug的地方可以指出,共同探讨学习。