天天看点

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

目录

数据库建表准备:

程序展示:

1.登陆界面 

注册界面:

学生端展示:

1.查看成绩功能 

2.查找成绩

教师端展示:

1.添加成绩

2.修改成绩:

3.删除成绩

3.查找成绩

​编辑 

源代码展示:

登陆界面

注册界面 

登录后系统主界面

数据库建表准备:

这里我建了两张表,一张是系统登陆信息的,另一张是存储了所有学生成绩的表,可以根据自己需要修改表的内容和属性格式,后续会不断完善

如下所示:

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:
JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

另外需要java连接mysql的jar包,以及javafx的jar包导入,这里就不详细多说。

程序展示:

1.登陆界面 

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

这里可以换成自己的图片

注册界面:

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

学生端展示:

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

这里的图片也可以更换成预设的头像,可以实现根据用户切换不同的图片

学生端只做了查看和查找成绩的功能,修改,添加,删除等功能在教师端实现。同时增加了修改个人信息 的功能  通过验证密码来判断修改权限。

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

1.查看成绩功能 

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

 学生端只能查看自己一个人的成绩 因为这里使用的是Tableview组件,所以省去了实现排序功能。

2.查找成绩

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:
JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

 这里实现了根据日期和备注查找,后续也可以实现根据科目,总分进行分别查找,这些功能都比较好实现,主要是数据库的条件查找加上控件的重新展示排列,操作比较麻烦,但是实现起来比较简单。

教师端展示:

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

 教师端的功能就比较丰富,增删改查,可以查考所有学生的成绩

1.添加成绩

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

 给每个学生添加成绩,这个功能就很鸡肋,不如直接去数据库导入Excel文件添加。

2.修改成绩:

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

这里直接在tableview表格上单击成绩修改 简单很多 我这里设置了只有三科成绩和备注可以修改,总分和平均分会随着成绩的修改而自动修改。因此我在这里隐藏了修改成绩按钮。

3.删除成绩

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

 也是直接在tableview中直接操作,选中后点击删除成绩按钮,会弹出确认对话框,确认后即删除成功,表格也会自动更新。这里的删除和修改权限只有教师端才有,学生端的功能被隐藏。

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

3.查找成绩

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

目前支持根据姓名精确查找,日期,备注模糊查找,然后也是和显示成绩一样,可以在表格上修改,删除。

源代码展示:

因为代码过多分了多个类,所以就先展示一部分,具体源代码可以私信我获取

JavaFx+Mysql简单实现学生成绩管理系统(学生端和教师端)实现增删改查,利用SceneBuilder省去自己布局系统界面数据库建表准备:程序展示:源代码展示:

登陆界面

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的地方可以指出,共同探讨学习。