目录
一、er图
二、主页面
/**
* 主入口
*/
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Main.stage = stage;
stage.setResizable(false);
begin();
stage.show();
}
/**
* 首页面
*/
public static void begin() {
GridPane gridPane = new GridPane();
stage.setTitle("学生管理系统首页");
//设置gridPane 的一些属性
ViewUtils.setGridPane(gridPane);
Button manageLog = new Button("管理员登录");
Button teacherLog = new Button("教师登录");
Button studentLog = new Button("学生登录");
Button studentSign = new Button("学生注册");
//点击管理员登录按钮
manageLog.setOnAction(actionEvent -> {
Manager_operate.managerLog();
});
//点击老师登录按钮
teacherLog.setOnAction(actionEvent -> {
teacher_log();
});
//点击学生登录按钮
studentLog.setOnAction(actionEvent -> {
student_log();
});
//点击学生注册按钮
studentSign.setOnAction(actionEvent -> {
student_sign();
});
VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 20, Pos.CENTER, manageLog, teacherLog, studentLog, studentSign);
Scene scene = new Scene(vBox, 500, 400);
stage.setScene(scene);
}
三、学生注册
/**
* 学生的一些操作
* ------------------------------------------------------------------------------------------------------------------------
* 学生注册
*/
public static void student_sign() {
stage.setTitle("学生注册");
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);//设置GridPane的一些属性
Label id = new Label("学生学号");
TextField idTxt = new TextField();
Label pwd = new Label("学生密码");
PasswordField pwdFld = new PasswordField();
Label name = new Label("学生姓名");
TextField nameTxt = new TextField();
Label sex = new Label("性别");
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
Label grade = new Label("学生年级");
TextField gradeTxt = new TextField();
Label teacher_id = new Label("教师姓名");
TextField teacher_idTxt = new TextField();
Button sign = new Button("注册");
Button back = new Button("返回");
//点击注册按钮
sign.setOnAction(actionEvent -> {
//数据要符合规范,grade,classSchool成绩必须是数字的形式,并且1<=grade<=4,0<=成绩<=100,ID必须没有重复
//数据是否为空
boolean isEmpty = !idTxt.getText().trim().equals("") && !pwdFld.getText().trim().equals("") && !nameTxt.getText().trim().equals("")
&& (man.isSelected() || woman.isSelected()) && !teacher_idTxt.getText().trim().equals("");
//部分数据的范围是否合适
boolean isSuitable = !gradeTxt.getText().trim().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText().trim()), 1, 4);
boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText().trim()) && !studentDao.judge_StudentIDIsExist(idTxt.getText().trim());
//要注册的学生ID不能存在,学生的教师姓名必须是存在的
if (isEmpty && isSuitable && isSuitable2) {
String sexDemo = man.isSelected() ? "男" : "女";
studentDao.insert_student(idTxt.getText().trim(), pwdFld.getText().trim(), nameTxt.getText().trim(), sexDemo, Integer.parseInt(gradeTxt.getText().trim()), teacher_idTxt.getText().trim());
ViewUtils.tips("注册成功");
begin();//注册成功后返回到主页面
} else if (!isSuitable2) {
ViewUtils.tips("请检查教师姓名或学生ID是否正确");
} else {
ViewUtils.tips("请检查数据");
}
});
//点击取消按钮,返回首页面
back.setOnAction(actionEvent -> {
begin();
});
//将男,女单选添加到单行面板中
HBox hBox = new HBox(man, woman);
gridPane.add(id, 0, 0);
gridPane.add(idTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdFld, 1, 1);
gridPane.add(name, 0, 2);
gridPane.add(nameTxt, 1, 2);
gridPane.add(sex, 0, 3);
gridPane.add(hBox, 1, 3);
gridPane.add(grade, 0, 4);
gridPane.add(gradeTxt, 1, 4);
gridPane.add(teacher_id, 0, 5);
gridPane.add(teacher_idTxt, 1, 5);
gridPane.add(sign, 0, 7);
gridPane.add(back, 1, 7);
//设置性别只能选择一个
//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
ToggleGroup toggleGroup = new ToggleGroup();
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 500, 400);
stage.setScene(scene);
}
四、学生登录
1)登录界面
/**
* 学生登录页面
*/
public static void student_log() {
stage.setTitle("学生登录");
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label idLabel = new Label("学生学号");
TextField idTxt = new TextField();
Label pwdLabel = new Label("学生密码");
PasswordField pwdFld = new PasswordField();
Button log = new Button("登录");
Button back = new Button("返回");
//点击登录
log.setOnAction(actionEvent -> {
try {
if (studentDao.student_log(idTxt.getText().trim(), pwdFld.getText().trim())) {
//进入学生选项(trim()去掉字符串两端的空格)
student_select(idTxt.getText().trim(), pwdFld.getText().trim());
}else {
ViewUtils.tips("请检查数据");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
//点击取消
back.setOnAction(actionEvent -> {
begin();
});
//安排每个组件的位置
gridPane.add(idLabel, 0, 0);
gridPane.add(idTxt, 1, 0);
gridPane.add(pwdLabel, 0, 1);
gridPane.add(pwdFld, 1, 1);
gridPane.add(log, 0, 3);
gridPane.add(back, 1, 3);
Scene scene = new Scene(gridPane, 500, 400);
stage.setScene(scene);
}
/**
* 学生登录后选择选项
* @param id : 传入ID用来查看学生分数 或 修改学生信息
* @param pwd : 传入ID用来查看学生分数 或 修改学生信息
*/
public static void student_select(String id, String pwd) {
stage.setTitle("学生选择");
Button checkScore = new Button("查看分数");
Button update = new Button("修改信息");
Button back = new Button("返回");
//点击查看分数
checkScore.setOnAction(actionEvent -> {
student_checkScore(id, pwd);
});
//点击修改信息
update.setOnAction(actionEvent -> {
student_modify(id, pwd);
});
//点击取消
back.setOnAction(actionEvent -> {
begin();
});
VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 20, Pos.CENTER, checkScore, update, back);
Scene scene = new Scene(vBox, 500, 400);
stage.setScene(scene);
}
2)查看分数
学生只能查看,不能更改分数
/**
* 学生查看分数页面
* @param id : 传入学生ID
* @param pwd : 点击取消时,将ID和p 传入到student_select方法中
*/
public static void student_checkScore(String id, String pwd) {
stage.setTitle("学生查询成绩");
String encryption_pwd = MD5Utils.md5Encryption(pwd);
Student student = studentDao.select_studentByOneself(id, encryption_pwd);
Label id2 = new Label("学号 : " + student.getId());
Label p2 = new Label("密码 : " + pwd);
Label name = new Label("姓名 : " + student.getName());
Label sex = new Label("性别 : " + student.getSex());
Label grade = new Label("年级 : " + student.getGrade());
Label chinese = new Label("语文 : " + student.getChinese());
Label math = new Label("数学 : " + student.getMath());
Label english = new Label("英语 : " + student.getEnglish());
Label chemistry = new Label("化学 : " + student.getChemistry());
Label political = new Label("政治 : " + student.getPolitical());
Label history = new Label("历史 : " + student.getHistory());
Label total_score = new Label("总分 : " + student.getTotal_score());
Label teacher_id = new Label("教师姓名 : " + student.getTeacher_id());
Button back = new Button("返回");
//点击返回按钮,返回首页面
back.setOnAction(actionEvent -> {
student_select(id, pwd);
});
//单列面板
VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 10, Pos.CENTER,id2, p2, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id, back);
Scene scene = new Scene(vBox, 300, 530);
stage.setScene(scene);
}
3)修改信息
学生不能修改自己的学号和成绩
/**
* 学生修改自己的信息
* @param id : 通过ID来搜索到我们要修改的学生
* @param p : 点击取消时,将ID和p 传入到student_select方法中
*/
public static void student_modify(String id, String p) {
stage.setTitle("学生修改信息");
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
//修改自己数据的时候把数据填充一下
String encryption_pwd = MD5Utils.md5Encryption(p);
Student student = studentDao.select_studentByOneself(id, encryption_pwd);
Label pwd = new Label("学生密码");
TextField pwdTxt = new TextField(p);
Label name = new Label("学生姓名");
TextField nameTxt = new TextField(student.getName());
Label sex = new Label("性别");
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
if (student.getSex().equals("男")) {
man.setSelected(true);
} else if (student.getSex().equals("女")) {
woman.setSelected(true);
}
Label grade = new Label("学生年级");
TextField gradeTxt = new TextField(String.valueOf(student.getGrade()));
Label teacher_id = new Label("教师姓名");
TextField teacher_idTxt = new TextField(student.getTeacher_id());
Button modify = new Button("修改");
Button back = new Button("返回");
//点击修改
modify.setOnAction(actionEvent -> {
//数据要符合规范,grade,classSchool,成绩必须是数字的形式,并且1<=grade<=4,0<=成绩<=100,ID必须没有重复;教师必须存在
boolean isEmpty = !pwdTxt.getText().equals("") && !nameTxt.getText().equals("") && (man.isSelected() ||
woman.isSelected()) && !teacher_idTxt.getText().equals("");
boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText());
boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4);
boolean isExists = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText());
if (isEmpty && isNum && isSuitable && isExists) {
String sexDemo = man.isSelected() ? "男" : "女";
//教师姓名转化为教师ID:studentDao.replaceName_withId(teacher_idTxt.getText())
studentDao.update_studentByOneself(id, pwdTxt.getText(), nameTxt.getText(), sexDemo, Integer.parseInt(gradeTxt.getText()), studentDao.replaceName_withId(teacher_idTxt.getText()));
ViewUtils.tips("修改成功");
student_select(id, pwdTxt.getText());
}else if (!isExists) {
ViewUtils.tips("请检查该教师是否存在");
}else {
ViewUtils.tips("请检查数据");
}
});
//点击取消按钮,返回首页面
back.setOnAction(actionEvent -> {
student_select(id, p);
});
//将男,女单选添加到单行面板中
HBox hBox = new HBox(man, woman);
gridPane.add(pwd, 0, 0);
gridPane.add(pwdTxt, 1, 0);
gridPane.add(name, 0, 1);
gridPane.add(nameTxt, 1, 1);
gridPane.add(sex, 0, 2);
gridPane.add(hBox, 1, 2);
gridPane.add(grade, 0, 3);
gridPane.add(gradeTxt, 1, 3);
gridPane.add(teacher_id, 0, 4);
gridPane.add(teacher_idTxt, 1, 4);
gridPane.add(modify, 0, 6);
gridPane.add(back, 1, 6);
//设置性别只能选择一个
ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 500, 400);
stage.setScene(scene);
}
五、教师功能
1)教师登录
教师只能增删改查属于自己的学生
/**
* 教师的相关操作
* ------------------------------------------------------------------------------------------------------------------------
* 教师登录
*/
public static void teacher_log() {
stage.setTitle("教师登录");
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label teacherID = new Label("教师工号");
TextField teacherIDTxt = new TextField();
Label pwd = new Label("教师密码");
PasswordField pwdFld = new PasswordField();
Button log = new Button("登录");
Button cancel = new Button("取消");
//点击登录按钮
log.setOnAction(actionEvent -> {
if (teacherDao.teacher_log(teacherIDTxt.getText().trim(), pwdFld.getText().trim())) {
manageStudent(true, teacherIDTxt.getText().trim());
}else {
ViewUtils.tips("请检查数据");
}
});
//点击取消按钮,返回首页面
cancel.setOnAction(actionEvent -> {
begin();
});
gridPane.add(teacherID, 0, 0);
gridPane.add(teacherIDTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdFld, 1, 1);
gridPane.add(log, 0, 2);
gridPane.add(cancel, 1, 2);
Scene scene = new Scene(gridPane, 500, 400);
stage.setScene(scene);
}
/**
* 教师,管理员管理学生
* @param select : true.老师管理学生;false.管理员管理学生(因为老师和管理员的返回界面不同,所以要分两种情况)
*/
public static void manageStudent(boolean select, String id_t) {
//学生集合
ArrayList<Student> students = new ArrayList<>();
stage.setTitle("管理学生");
BorderPane borderPane = new BorderPane();
Button add = new Button("增加");
Button delete = new Button("删除");
Button update = new Button("修改");
Button query = new Button("查询");
Button refresh = new Button("刷新");
Button back = new Button("返回");
//点击增加学生
add.setOnAction(actionEvent -> {
if (select) {
Teacher_operate.addStudent(borderPane, students, id_t);
}else {
Manager_operate.addStudent_forManager(borderPane, students);
}
});
//点击删除学生
delete.setOnAction(actionEvent -> {
//删除学生和管理员删除老师的界面相同
//删除学生,true:删除学生,false:删除老师
if (select) {
Teacher_operate.deletePerson(borderPane, students, id_t);
}else {
Manager_operate.deletePerson(borderPane, students, null, true);
}
});
//点击修改学生
update.setOnAction(actionEvent -> {
//先输入ID号码判断是否存在该学生,如果存在就修改学生
//true.老师或管理员修改学生;false.管理员修改老师
if (select) {
Teacher_operate.inputID(borderPane, students, id_t);
}else {
Manager_operate. inputID(borderPane, students, null, true);
}
});
//点击查询学生
query.setOnAction(actionEvent -> {
if (select) {
Teacher_operate.queryStudent_byTeacher(borderPane, students, id_t);
}else {
Manager_operate.queryStudent_forManager(borderPane, students);
}
});
//点击刷新
refresh.setOnAction(actionEvent -> {
if (select) {
Teacher_operate.refresh_studentTable_forTeacher(borderPane, students, id_t);
}else {
Manager_operate.refresh_studentTable_forManager(borderPane, students);
}
});
//点击返回
back.setOnAction(actionEvent -> {
//教师退出该页面
if (select) {
begin();
}else {
//管理员退出该页面
Manager_operate.managerSelect();
}
});
//单行面板
HBox hBox = ViewUtils.getHBox("-fx-font-size: 18;", 40, Pos.CENTER, true, add, delete, update, query, refresh, back);
//设置borderPane的背景颜色
borderPane.setBackground(new Background(new BackgroundFill(Color.rgb(200, 200, 200),null,null)));//设置hBox的背景颜色
//设置返回按钮的外边距
hBox.setMargin(back, new Insets(20, 20, 20, 60));
//将hBox 单行面板 添加到边界布局的顶部
borderPane.setTop(hBox);
//从数据库中把学生数据全部填写到students集合中
if (select) {//教师查询学生
studentDao.selectAll_studentTable_forTeacher(students, id_t);
}else {
studentDao.selectAll_studentTable_forManager(students);
}
//展示学生表格
studentTable(borderPane, students);
stage.setScene(new Scene(borderPane,1042, 500));
}
/**
* 学生表格(通用:适合教师和管理员对学生的管理)
* @param borderPane : 边界布局
* @param students : 学生集合
*/
public static void studentTable(BorderPane borderPane, ArrayList<Student> students) {
//学生的信息表格
TableView<Student> tableView = new TableView<>();
//TableColumn类 创建列。然后使用TableView 类的 getColumns()方法将创建的列添加到表中。
TableColumn id = new TableColumn<>("学号");
TableColumn pwd = new TableColumn<>("密码");
TableColumn name = new TableColumn<>("姓名");
TableColumn sex = new TableColumn<>("性别");
TableColumn grade = new TableColumn<>("年级");
TableColumn chinese = new TableColumn<>("语文");
TableColumn math = new TableColumn<>("数学");
TableColumn english = new TableColumn<>("英语");
TableColumn chemistry = new TableColumn<>("化学");
TableColumn political = new TableColumn<>("政治");
TableColumn history = new TableColumn<>("历史");
TableColumn total_score = new TableColumn<>("总分");
TableColumn teacher_id = new TableColumn<>("教师");
//表格列宽宽度设置
id.setMinWidth(70);
pwd.setMinWidth(70);
name.setMinWidth(60);
sex.setMinWidth(60);
grade.setMinWidth(60);
chinese.setMinWidth(60);
math.setMinWidth(60);
english.setMinWidth(60);
chemistry.setMinWidth(60);
political.setMinWidth(60);
history.setMinWidth(60);
total_score.setMinWidth(60);
teacher_id.setMinWidth(70);
//确定数据导入的列
id.setCellValueFactory(new PropertyValueFactory<>("id"));
pwd.setCellValueFactory(new PropertyValueFactory<>("pwd"));
name.setCellValueFactory(new PropertyValueFactory<>("name"));
sex.setCellValueFactory(new PropertyValueFactory<>("sex"));
grade.setCellValueFactory(new PropertyValueFactory<>("grade"));
chinese.setCellValueFactory(new PropertyValueFactory<>("chinese"));
math.setCellValueFactory(new PropertyValueFactory<>("math"));
english.setCellValueFactory(new PropertyValueFactory<>("english"));
chemistry.setCellValueFactory(new PropertyValueFactory<>("chemistry"));
political.setCellValueFactory(new PropertyValueFactory<>("political"));
history.setCellValueFactory(new PropertyValueFactory<>("history"));
total_score.setCellValueFactory(new PropertyValueFactory<>("total_score"));
teacher_id.setCellValueFactory(new PropertyValueFactory<>("teacher_id"));
//将列添加到表格中
tableView.getColumns().addAll(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
//将学生数组集合添加到表格中
tableView.getItems().addAll(students);
//将表格添加到边界布局的正中心
borderPane.setCenter(tableView);
}
2)管理部分学生
1.增加学生
教师增加学生和学生自己注册基本一致
/**
* 教师增加学生
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_t : 教师ID
*/
public static void addStudent(BorderPane borderPane, ArrayList<Student> students, String id_t) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("增加学生",tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label studentID = new Label("学生学号");
TextField studentIDTxt = new TextField();
Label pwd = new Label("学生密码");
TextField pwdTxt = new TextField();
Label name = new Label("学生姓名");
TextField nameTxt = new TextField();
Label sex = new Label("性别");
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
Label grade = new Label("学生年级");
TextField gradeTxt = new TextField();
Label teacher_id = new Label("教师姓名");
TextField teacher_idTxt = new TextField();
Button add = new Button("增加");
Button back = new Button("返回");
//单行面板
HBox hBox = new HBox(man, woman);
gridPane.add(studentID, 0, 0);
gridPane.add(studentIDTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdTxt, 1, 1);
gridPane.add(name, 0, 2);
gridPane.add(nameTxt, 1, 2);
gridPane.add(sex, 0, 3);
gridPane.add(hBox, 1, 3);
gridPane.add(grade, 0, 4);
gridPane.add(gradeTxt, 1, 4);
gridPane.add(teacher_id, 0, 6);
gridPane.add(teacher_idTxt, 1, 6);
gridPane.add(add, 0, 8);
gridPane.add(back, 1, 8);
//点击增加学生
add.setOnAction(actionEvent -> {
//数据要符合规范
boolean isEmpty = !studentIDTxt.getText().equals("") && !pwdTxt.getText().equals("") && !nameTxt.getText().equals("")
&& (man.isSelected() || woman.isSelected()) && !teacher_idTxt.getText().equals("");
boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText());
boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4);
//要判断教师的姓名是否存在,而不是教师ID,教师姓名要存在;学生学号不能存在
boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && !studentDao.judge_StudentIDIsExist(studentIDTxt.getText());
Student student = new Student();
student.setTeacher_id(teacher_idTxt.getText());
student.setId(studentID.getText());
studentDao.select_teacherByTeacher_id(student);
boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);
try {
//学生ID不能重复;学生修改的教师必须存在
if (isEmpty && isNum && isSuitable && isSuitable2 && isSuitable3) {
String sexDemo = man.isSelected() ? "男" : "女";
studentDao.insert_student(studentIDTxt.getText(), pwdTxt.getText(), nameTxt.getText(), sexDemo,
Integer.parseInt(gradeTxt.getText()), teacher_idTxt.getText());
ViewUtils.tips("增加成功");
tipStage.close();
//刷新表格中的数据
refresh_studentTable_forTeacher(borderPane, students, id_t);
}else if (!isSuitable2) {
ViewUtils.tips("请检查教师姓名或学生ID");
}else {
ViewUtils.tips("请检查数据");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
//设置性别只能选择一个
ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 340, 400);
tipStage.setScene(scene);
tipStage.show();
}
2.删除学生
/**
* 删除学生,老师
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_t : 教师ID
*/
public static void deletePerson(BorderPane borderPane, ArrayList<Student> students, String id_t) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("删除人员", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label ID = new Label("ID号码 : ");
TextField IDTxt = new TextField();
Button delete = new Button("删除");
Button back = new Button("返回");
gridPane.add(ID, 0, 0);
gridPane.add(IDTxt, 1, 0);
gridPane.add(delete, 0, 2);
gridPane.add(back, 1, 2);
//点击删除按钮
delete.setOnAction(actionEvent -> {
Student student = new Student();
student.setTeacher_id(id_t);
student.setId(IDTxt.getText());
studentDao.select_teacherByTeacher_id(student);
boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);
//删除学生,先判断是否存在该学生
if (studentDao.judge_StudentIDIsExist(IDTxt.getText()) && isSuitable3) {
studentDao.delete_student(IDTxt.getText());
ViewUtils.tips("成功删除该学生");
tipStage.close();
//刷新表格中的数据
refresh_studentTable_forTeacher(borderPane, students, id_t);
}else {
ViewUtils.tips("请检查数据");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
Scene scene = new Scene(gridPane, 360, 200);
tipStage.setScene(scene);
tipStage.show();
}
3.修改学生
先输入ID号码
输入ID后会自动显示原先的数据,教师无法更改学生的密码
/**
* 教师修改学生:必须先输入正确的ID号码后,才能修改
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_t : 教师ID,用于判断某个老师是否可以操作某个学生(教师只能操作自己的学生)
*/
public static void inputID(BorderPane borderPane, ArrayList<Student> students, String id_t) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("搜索ID号码", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label ID = new Label("ID号码 : ");
TextField IDTxt = new TextField();
Button search = new Button("搜索");
Button back = new Button("返回");
gridPane.add(ID, 0, 0);
gridPane.add(IDTxt, 1, 0);
gridPane.add(search, 0, 2);
gridPane.add(back, 1, 2);
//点击搜索按钮
search.setOnAction(actionEvent -> {
Student student = new Student();
student.setTeacher_id(id_t);
student.setId(IDTxt.getText());
studentDao.select_teacherByTeacher_id(student);
boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);
//修改学生,先查询该学生是否存在,而且要修改的学生属于该教师
if (studentDao.judge_StudentIDIsExist(IDTxt.getText()) && isSuitable3) {
updateStudent(borderPane, students, IDTxt.getText(), id_t);
tipStage.close();
}else {
ViewUtils.tips("请检查数据");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
Scene scene = new Scene(gridPane, 360, 200);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 输入正确的ID号码后,教师修改学生(学生的密码无法修改)
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_sOld : 需要修改的学生的 原来的ID号码,我们要根据原来的ID来查找这个学生
* @param id_t : 教师ID
*/
public static void updateStudent(BorderPane borderPane, ArrayList<Student> students, String id_sOld, String id_t) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("修改学生", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
//先查询这个学生
studentDao.select_studentTableByID_forTeacher(students, id_sOld, id_t);
Student student = students.get(0);
Label studentID = new Label("学号 : ");
TextField studentIDTxt = new TextField(student.getId());
Label name = new Label("姓名 : " );
TextField nameTxt = new TextField(student.getName());
Label sex = new Label("性别 : " );
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
if (student.getSex().equals("男")) {
man.setSelected(true);
} else if (student.getSex().equals("女")) {
woman.setSelected(true);
}
Label grade = new Label("年级 : ");
TextField gradeTxt = new TextField(String.valueOf(student.getGrade()));
Label chinese = new Label("语文 : " );
TextField chineseTxt = new TextField(String.valueOf(student.getChinese()));
Label math = new Label("数学 : " );
TextField mathTxt = new TextField(String.valueOf(student.getMath()));
Label english = new Label("英语 : " );
TextField englishTxt = new TextField(String.valueOf(student.getEnglish()));
Label chemistry = new Label("化学 : " );
TextField chemistryTxt = new TextField(String.valueOf(student.getChemistry()));
Label political = new Label("政治 : " );
TextField politicalTxt = new TextField(String.valueOf(student.getPolitical()));
Label history = new Label("历史 : " );
TextField historyTxt = new TextField(String.valueOf(student.getHistory()));
Label teacher_id = new Label("教师姓名 : " );
TextField teacher_idTxt = new TextField(student.getTeacher_id());
Button update = new Button("修改");
Button back = new Button("返回");
//单行面板
HBox hBox = new HBox(man, woman);
gridPane.add(studentID, 0, 0);
gridPane.add(studentIDTxt, 1, 0);
gridPane.add(name, 0, 1);
gridPane.add(nameTxt, 1, 1);
gridPane.add(sex, 0, 2);
gridPane.add(hBox, 1, 2);
gridPane.add(grade, 0, 3);
gridPane.add(gradeTxt, 1, 3);
gridPane.add(chinese, 0, 4);
gridPane.add(chineseTxt, 1, 4);
gridPane.add(math, 0, 5);
gridPane.add(mathTxt, 1, 5);
gridPane.add(english, 0, 6);
gridPane.add(englishTxt, 1, 6);
gridPane.add(chemistry, 0, 7);
gridPane.add(chemistryTxt, 1, 7);
gridPane.add(political, 0, 8);
gridPane.add(politicalTxt, 1, 8);
gridPane.add(history, 0, 9);
gridPane.add(historyTxt, 1, 9);
gridPane.add(teacher_id, 0, 10);
gridPane.add(teacher_idTxt, 1, 10);
gridPane.add(update, 0, 12);
gridPane.add(back, 1, 12);
//点击修改按钮
update.setOnAction(actionEvent -> {
//是否为空
boolean isData = !studentIDTxt.getText().equals("") && !nameTxt.getText().equals("") && (man.isSelected() || woman.isSelected());
//其中的班级和分数是否可以转换为数字
boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText()) && CommonUtils.isStrToNum(chineseTxt.getText()) && CommonUtils.isStrToNum(mathTxt.getText()) &&
CommonUtils.isStrToNum(englishTxt.getText()) && CommonUtils.isStrToNum(chemistryTxt.getText()) && CommonUtils.isStrToNum(politicalTxt.getText()) &&
CommonUtils.isStrToNum(historyTxt.getText());
//数据是否合适
boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4) &&
!chineseTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chineseTxt.getText()), 0, 100) &&
!mathTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(mathTxt.getText()), 0, 100) &&
!englishTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(englishTxt.getText()), 0, 100) &&
!chemistryTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chemistryTxt.getText()), 0, 100) &&
!politicalTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(politicalTxt.getText()), 0, 100) &&
!historyTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(historyTxt.getText()), 0, 100);
//判断该教师是否存在;判断新修改的学生ID是否已经被占有了
boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && (!studentDao.judge_StudentIDIsExist(studentIDTxt.getText()) || studentIDTxt.getText().equals(id_sOld));
boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(teacher_idTxt.getText(), id_t);
//数据正常
if (isData && isNum && isSuitable && isSuitable2 && isSuitable3){
String sexDemo = man.isSelected() ? "男" : "女";
int totalScore = Integer.parseInt(chineseTxt.getText()) + Integer.parseInt(mathTxt.getText()) + Integer.parseInt(englishTxt.getText()) +
Integer.parseInt(chemistryTxt.getText()) + Integer.parseInt(politicalTxt.getText()) + Integer.parseInt(historyTxt.getText());
//教师姓名转化为教师ID:studentDao.replaceName_withId(teacher_idTxt.getText())
//修改学生信息
//把数据封装到Student对象中,传入到函数
Student student1 = new Student(studentIDTxt.getText(),"", nameTxt.getText(), sexDemo, Integer.parseInt(gradeTxt.getText()),
Integer.parseInt(chineseTxt.getText()), Integer.parseInt(mathTxt.getText()), Integer.parseInt(englishTxt.getText()), Integer.parseInt(chemistryTxt.getText()),
Integer.parseInt(politicalTxt.getText()), Integer.parseInt(historyTxt.getText()), totalScore, studentDao.replaceName_withId(teacher_idTxt.getText()));
studentDao.update_studentByTeacherAndManager(id_sOld, student1);
ViewUtils.tips("修改成功");
tipStage.close();
//刷新表格中的数据
refresh_studentTable_forTeacher(borderPane, students, id_t);
}else {
ViewUtils.tips("请检查数据");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
//设置性别只能选择一个
ToggleGroup toggleGroup = new ToggleGroup();
//将单选按钮添加到到ToggleGroup对象,ToggleGroup对象将管理它们,使得一次只能选择一个单选按钮。
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 440, 680);
tipStage.setScene(scene);
tipStage.show();
}
4.查询学生
两种查询方式:ID查询、姓名模糊查询
/**
* 教师查询学生
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_t : 教师ID
*/
public static void queryStudent_byTeacher(BorderPane borderPane, ArrayList<Student> students, String id_t) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("可以进行ID查询、姓名模糊查询", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label studentID = new Label("学号 : ");
TextField studentIDTxt = new TextField();
Label name = new Label("姓名 : ");
TextField nameTxt = new TextField();
Button query = new Button("查询");
Button back = new Button("返回");
gridPane.add(studentID, 0, 0);
gridPane.add(studentIDTxt, 1, 0);
gridPane.add(name, 0, 1);
gridPane.add(nameTxt, 1, 1);
gridPane.add(query, 0, 3);
gridPane.add(back, 1, 3);
//点击查询按钮
query.setOnAction(actionEvent -> {
//只通过ID查询学生
if (!studentIDTxt.getText().equals("") && nameTxt.getText().equals("")){
//将ID符合的学生添加到students集合中
studentDao.select_studentTableByID_forTeacher(students, studentIDTxt.getText(), id_t);
Main.studentTable(borderPane, students);
tipStage.close();
} else if (studentIDTxt.getText().equals("") && !nameTxt.getText().equals("")) {//只通过姓名模糊查询
//只通过姓名模糊查询
studentDao.select_studentTableByName_forTeacher(students, nameTxt.getText(), id_t);
Main.studentTable(borderPane, students);
tipStage.close();
} else { //没有输入数据
ViewUtils.tips("请检查数据,二选一");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
Scene scene = new Scene(gridPane, 480, 400);
tipStage.setScene(scene);
tipStage.show();
}
使用姓名模糊查询:输入‘刘’,结果:
5.刷新
查询学生之后,我们点击刷新可恢复表格中的学生数据
/**
* 教师刷新学生表格(增加,删除,修改后调用)
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_t : 教师ID
*/
public static void refresh_studentTable_forTeacher(BorderPane borderPane, ArrayList<Student> students, String id_t) {
//填写学生数据
studentDao.selectAll_studentTable_forTeacher(students, id_t);
//展示学生表格
Main.studentTable(borderPane, students);
}
六、管理员功能
1)管理员登录
/**
* 关于管理员自身的操作
* ------------------------------------------------------------------------------------------------------------------------
* 管理员登录
*/
public static void managerLog() {
Main.stage.setTitle("管理员登录");
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label id = new Label("管理员ID");
TextField idTxt = new TextField();
Label pwd = new Label("管理员密码");
PasswordField pwdFld = new PasswordField();
Button log = new Button("登录");
Button cancel = new Button("取消");
//点击登录按钮
log.setOnAction(actionEvent -> {
if (managerDao.manager_log(idTxt.getText().trim(), pwdFld.getText().trim())) {
managerSelect();
}else {
ViewUtils.tips("请检查数据");
}
});
//点击取消按钮,返回首页面
cancel.setOnAction(actionEvent -> {
Main.begin();
});
gridPane.add(id, 0, 0);
gridPane.add(idTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdFld, 1, 1);
gridPane.add(log, 0, 2);
gridPane.add(cancel, 1, 2);
Scene scene = new Scene(gridPane, 500, 400);
Main.stage.setScene(scene);
}
/**
* 管理员登录后的 选择
*/
public static void managerSelect() {
Main.stage.setTitle("管理员选项");
Button manageStudent = new Button("管理学生");
Button manageTeacher = new Button("管理教师");
Button dataStatistical = new Button("成绩统计");
Button back = new Button("退出系统");
//点击管理学生按钮
manageStudent.setOnAction(actionEvent -> {
Main.manageStudent(false, null);
});
//点击管理教师按钮
manageTeacher.setOnAction(actionEvent -> {
manageTeacher();
});
//点击成绩统计
dataStatistical.setOnAction(actionEvent -> {
dataStatistical();
});
//点击退出按钮
back.setOnAction(actionEvent -> {
Main.begin();
});
//单行面板
VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 40, Pos.CENTER, manageStudent, manageTeacher, dataStatistical, back);
Main.stage.setScene(new Scene(vBox, 500, 400));
}
2)管理全部学生
代码和教师管理学生基本一致,只是教师管理的是教师自己的学生,管理员管理的是全部学生,后面有完整全部代码
3)管理教师
管理员管理教师和管理学生思路基本一致
4)学生成绩统计(柱状图)
/**
* 成绩柱状图
*/
public static void dataStatistical() {
Main.stage.setTitle("成绩统计");
Button back = new Button("返回");
//点击返回
back.setOnAction(actionEvent -> {
managerSelect();
});
CategoryAxis xAxis = new CategoryAxis();
xAxis.setLabel("成绩分布");
NumberAxis yAxis = new NumberAxis();
yAxis.setLabel("人数");
BarChart barChart = new BarChart<>(xAxis, yAxis);
XYChart.Series dataSeries1 = new XYChart.Series();
dataSeries1.setName("年级1");
XYChart.Series dataSeries2 = null;
XYChart.Series dataSeries3 = null;
XYChart.Series dataSeries4 = null;
try {
dataSeries1.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(1, 0, 200)));
dataSeries1.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(1, 200, 350)));
dataSeries1.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(1, 350, 500)));
dataSeries1.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(1, 500, 601)));
dataSeries2 = new XYChart.Series();
dataSeries2.setName("年级2");
dataSeries2.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(2, 0, 200)));
dataSeries2.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(2, 200, 350)));
dataSeries2.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(2, 350, 500)));
dataSeries2.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(2, 500, 601)));
dataSeries3 = new XYChart.Series();
dataSeries3.setName("年级3");
dataSeries3.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(3, 0, 200)));
dataSeries3.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(3, 200, 350)));
dataSeries3.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(3, 350, 500)));
dataSeries3.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(3, 500, 601)));
dataSeries4 = new XYChart.Series();
dataSeries4.setName("年级4");
dataSeries4.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(4, 0, 200)));
dataSeries4.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(4, 200, 350)));
dataSeries4.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(4, 350, 500)));
dataSeries4.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(4, 500, 601)));
} catch (Exception e) {
throw new RuntimeException(e);
}
barChart.getData().add(dataSeries1);
barChart.getData().add(dataSeries2);
barChart.getData().add(dataSeries3);
barChart.getData().add(dataSeries4);
//单列面板
VBox vBox = new VBox(barChart, back);
vBox.setAlignment(Pos.CENTER);
vBox.setMargin(back, new Insets(20, 0, 0, 0));
Scene scene = new Scene(vBox, 500, 540);
Main.stage.setScene(scene);
}
七、提示窗口
此时会出现提示窗口
提示窗口使用的十分频繁,所以我把它封装了一下放到utils中,以后使用可以直接调用函数
/**
* 设置顶层窗口的一些属性
* @param str : 标题的内容
* @param tipStage : 需要添加属性的窗口
*/
public static void setTopTip(String str, Stage tipStage) {
tipStage.setResizable(false);//不能调整大小
tipStage.setTitle(str);//设置标题
//只能操作当前的提示框
tipStage.initOwner(Main.stage);
tipStage.initModality(Modality.WINDOW_MODAL);
//设置该提示框永远在最上层
tipStage.setAlwaysOnTop(true);
}
/**
* 提示框
* @param content : 提示的信息
*/
public static void tips(String content) {
//创建提示框窗口对象
Stage tipStage = new Stage();
//调用顶层窗口函数设置一些必要的属性
setTopTip(content, tipStage);
Label label = new Label(content);
Button back = new Button("返回");
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
//单列面板
VBox vBox = new VBox(label, back);
vBox.setSpacing(10);
vBox.setAlignment(Pos.CENTER);
Scene scene = new Scene(vBox, 180, 130);
tipStage.setScene(scene);
tipStage.show();
}
八、特色
1)学生密码加密
我将学生密码进行加密存放到数据库中,该加密是不可逆加密,无法逆推
同样我将加密代码封装了一下放到了utils中
/**
* 使用JDK自带MessageDigest
* @param pwd
* @return
*/
public static String md5Encryption(String pwd) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("md5");
byte[] bytes = messageDigest.digest(pwd.getBytes("UTF-8"));
//16是表示转换为16进制数
String result = new BigInteger(1, bytes).toString(16);
return result;
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
2)管理员成绩统计柱状图
上面已经展示过代码了
这个柱状图是实时变化的,更改了数据库中的数据,柱状图也会变化
九、全部代码
1)目录结构
2)dao文件夹
ManagerImpl
package com.student_manageSystem.dao.impl;
import com.student_manageSystem.dao.ManageDao;
import com.student_manageSystem.utils.SQLUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ManagerImpl implements ManageDao {
/**
* 管理员登录
* @param id
* @param pwd
* @return
*/
@Override
public boolean manager_log(String id, String pwd) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = SQLUtils.getConnection();
String sql = "select * from t_manager_table where id = ? && pwd = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
rs = pstmt.executeQuery();
return rs.next();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 计算各个年级,各个分数段的人数
* @param grade : 年级
* @param from : 起始位置(包含)
* @param to : 终止位置(不包含)
* @return
*/
public int histogram(int grade, int from, int to) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = SQLUtils.getConnection();
String sql = "select count(id) as peopleNum from t_student_table where grade = ? && total_score >= ? && total_score < ?;";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, grade);
pstmt.setInt(2, from);
pstmt.setInt(3, to);
rs = pstmt.executeQuery();
int count = 0;
if (rs.next()){
count = rs.getInt("peopleNum");
}
return count;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(rs, pstmt, conn);
}
}
}
StudentImpl
package com.student_manageSystem.dao.impl;
import com.student_manageSystem.dao.StudentDao;
import com.student_manageSystem.utils.MD5Utils;
import com.student_manageSystem.utils.SQLUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
/**
* StudentDao负责学生的增删改查
*/
public class StudentImpl implements StudentDao {
/**
* 判断学生的ID是否存在
* @param id : id
* @return : true:存在该数据,false:不存在
*/
@Override
public boolean judge_StudentIDIsExist(String id) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from t_student_table where id = ?";
try {
conn = SQLUtils.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
return rs.next();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
//释放资源
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 学生登录
* @param id : id
* @param pwd : 密码
* @return : true.正确;false.错误
* @throws Exception
*/
@Override
public boolean student_log(String id, String pwd) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from t_student_table where id = ? && pwd = ?";
//不可逆加密,将学生输入的密码加密后与数据库中的加密密码比较,如果相等,就说明输入的密码正确
String encryption_pwd = MD5Utils.md5Encryption(pwd);
try {
conn = SQLUtils.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, encryption_pwd);
rs = pstmt.executeQuery();
return rs.next();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 增加学生(包含:学生注册;老师或管理员增加学生)
* @param grade
* @param name
* @param sex
* @param pwd
*/
@Override
public void insert_student(String id, String pwd, String name, String sex, int grade, String teacher_id) {
//我们传过来的teacher_id 其实是教师名字,这里我要把传过来的teacher_id(教师名字)改为真正的教师ID
teacher_id = replaceName_withId(teacher_id);
//将密码加密的结果添加到数据库中
String encryption_pwd = MD5Utils.md5Encryption(pwd);
try {
Connection conn = SQLUtils.getConnection();
String sql = "insert into t_student_table values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, encryption_pwd);
pstmt.setString(3, name);
pstmt.setString(4, sex);
pstmt.setInt(5, grade);
pstmt.setInt(6, 0);
pstmt.setInt(7, 0);
pstmt.setInt(8, 0);
pstmt.setInt(9, 0);
pstmt.setInt(10, 0);
pstmt.setInt(11, 0);
pstmt.setInt(12, 0);
pstmt.setString(13, teacher_id);
int count = pstmt.executeUpdate();
if (count > 0) System.out.println("成功注册或增加了一个学生");
SQLUtils.closeResource(null, pstmt, conn);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 通过学生的teacher_id(我们输入的其实是教师姓名) 来找到真实的教师ID(最后我们会把真实的教师ID存到学生数据库表中)
* @param name
*/
@Override
public String replaceName_withId(String name) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select id from t_teacher_table where name = ? ";
try {
conn = SQLUtils.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
rs = pstmt.executeQuery();
String id = null;
if (rs.next()) {
id = rs.getString("id");
}
return id;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
//释放资源
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 教师、管理员删除学生
* @param id
* @throws Exception
*/
@Override
public void delete_student(String id) {
try {
Connection conn = SQLUtils.getConnection();
String sql = "delete from t_student_table where id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,id);
int count = pstmt.executeUpdate();
if (count > 0) System.out.println("成功删除了一个学生");
SQLUtils.closeResource(null, pstmt, conn);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 学生自己修改自己的信息(无法修改学号和成绩)
* @param oldID
* @param pwd
* @param name
* @param sex
* @param grade
* @throws Exception
*/
@Override
public void update_studentByOneself(String oldID, String pwd, String name, String sex, int grade, String teacher_id) {
Connection conn = null;
PreparedStatement pstmt = null;
//把密码加密
String encryption_pwd = MD5Utils.md5Encryption(pwd);
try {
conn = SQLUtils.getConnection();
String sql = "update t_student_table set pwd=?, name=?, sex=?, grade=?, teacher_id=? where id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, encryption_pwd);
pstmt.setString(2, name);
pstmt.setString(3, sex);
pstmt.setInt(4, grade);
pstmt.setString(5, teacher_id);
pstmt.setString(6, oldID);
int count = pstmt.executeUpdate();
if (count > 0) System.out.println("学生更改了自己的数据");
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(null, pstmt, conn);
}
}
/**
* 老师,管理员修改学生信息(可以修改学号,成绩)
* @param oldID : 之前的学号,根据这个学号来查找到学生
* @param student : 学生对象,里面封装了学生的属性
*/
@Override
public void update_studentByTeacherAndManager(String oldID, com.student_manageSystem.pojo.Student student) {
try {
Connection conn = SQLUtils.getConnection();
String sql = "update t_student_table set id=?, name=?, sex=?, grade=?, chinese=?, math=?, english=?, chemistry=?, political=?, history=?, total_score=?, teacher_id=? where id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, student.getId());
pstmt.setString(2, student.getName());
pstmt.setString(3, student.getSex());
pstmt.setInt(4, student.getGrade());
pstmt.setInt(5, student.getChinese());
pstmt.setInt(6, student.getMath());
pstmt.setInt(7, student.getEnglish());
pstmt.setInt(8, student.getChemistry());
pstmt.setInt(9, student.getPolitical());
pstmt.setInt(10, student.getHistory());
pstmt.setInt(11, student.getTotal_score());
pstmt.setString(12, student.getTeacher_id());
pstmt.setString(13, oldID);
int count = pstmt.executeUpdate();
if (count > 0) System.out.println("成功更新了学生数据");
SQLUtils.closeResource(null, pstmt, conn);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 学生自己查看自己
* @param id
* @param pwd
* @return
*/
@Override
public com.student_manageSystem.pojo.Student select_studentByOneself(String id, String pwd) {
com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = SQLUtils.getConnection();
String sql = "select * from t_student_table where id = ? && pwd = ?";
pstmt =conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
rs = pstmt.executeQuery();
if (rs.next()) {
student.setId(rs.getString("id"));
student.setPwd(rs.getString("pwd"));
student.setName(rs.getString("name"));
student.setSex(rs.getString("sex"));
student.setGrade(rs.getInt("grade"));
student.setChinese(rs.getInt("chinese"));
student.setMath(rs.getInt("math"));
student.setEnglish(rs.getInt("english"));
student.setChemistry(rs.getInt("chemistry"));
student.setPolitical(rs.getInt("political"));
student.setHistory(rs.getInt("history"));
student.setTotal_score(rs.getInt("total_score"));
student.setTeacher_id(rs.getString("teacher_id"));
//把teacher_id 改为 教师姓名
select_teacherByTeacher_id(student);
}
//返回学生对象
return student;
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 将学生的teacher_id 换成对应的真实教师姓名
* @param student
*/
@Override
public void select_teacherByTeacher_id(com.student_manageSystem.pojo.Student student) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = SQLUtils.getConnection();
//多表查询:显式内连接
String sql = "select t.name from t_teacher_table t inner join t_student_table s on s.id = ? && t.id = s.teacher_id";
pstmt =conn.prepareStatement(sql);
pstmt.setString(1, student.getId());
rs = pstmt.executeQuery();
if (rs.next()) {
String name = rs.getString("t.name");
//把teacher_id 改为 teacher 的name
student.setTeacher_id(name);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 把学生数据库中的 属于相应教师的 数据传递给学生表格(教师使用)
* @param students
* @param teacher_id : 教师的ID号码
*/
@Override
public void selectAll_studentTable_forTeacher(ArrayList<com.student_manageSystem.pojo.Student> students, String teacher_id) {
try {
Connection conn = SQLUtils.getConnection();
//先清空所有的数据
students.clear();
//多表查询,隐式内连接
String sql = "select s.* from t_student_table s, t_teacher_table t where t.id = s.teacher_id && s.teacher_id = ?;";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, teacher_id);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String sex = rs.getString("sex");
int grade = rs.getInt("grade");
int chinese = rs.getInt("chinese");
int math = rs.getInt("math");
int english = rs.getInt("english");
int chemistry = rs.getInt("chemistry");
int political = rs.getInt("political");
int history = rs.getInt("history");
int total_score = rs.getInt("total_score");
//创建student对象,并添加到ArrayList
com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
//把teacher_id 改为 teacher 的name
select_teacherByTeacher_id(student);
students.add(student);
}
//关闭资源
SQLUtils.closeResource(rs, pstmt, conn);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 通过 ID查询 把学生数据库中的数据传递给学生表格(教师使用)
* @param students
* @param id_s : 学生的ID号码
* @param id_t : 教师的ID号码
*/
@Override
public void select_studentTableByID_forTeacher(ArrayList<com.student_manageSystem.pojo.Student> students, String id_s, String id_t) {
try {
Connection conn = SQLUtils.getConnection();
//先清空所有的数据
students.clear();
//多表查询,显式内连接
String sql = "select s.* from t_student_table s inner join t_teacher_table t on s.teacher_id = t.id && t.id = ? && s.id = ?;";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id_t);
pstmt.setString(2, id_s);
ResultSet rs = pstmt.executeQuery();
//因为ID是唯一的,只有一个,所以不用使用while()
if (rs.next()) {
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String sex = rs.getString("sex");
int grade = rs.getInt("grade");
int chinese = rs.getInt("chinese");
int math = rs.getInt("math");
int english = rs.getInt("english");
int chemistry = rs.getInt("chemistry");
int political = rs.getInt("political");
int history = rs.getInt("history");
int total_score = rs.getInt("total_score");
String teacher_id = rs.getString("teacher_id");
//创建student对象,并添加到ArrayList
com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id_s, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
//把teacher_id 改为 teacher 的name
select_teacherByTeacher_id(student);
students.add(student);
}
//关闭资源
SQLUtils.closeResource(rs, pstmt, null);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 通过姓名模糊查询 把学生数据库中的数据传递给学生表格(教师使用)
* @param students
* @param name_s
* @param id_t
*/
@Override
public void select_studentTableByName_forTeacher(ArrayList<com.student_manageSystem.pojo.Student> students, String name_s, String id_t) {
try {
Connection conn = SQLUtils.getConnection();
//先清空所有的数据
students.clear();
//模糊查询,多表查询,隐式内连接
String sql = "select * from t_student_table s where s.name like '%' " + '?' + " '%' and s.teacher_id = ?; ";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name_s);
pstmt.setString(2, id_t);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String id = rs.getString("id");
String name2 = rs.getString("name");
String pwd = rs.getString("pwd");
String sex = rs.getString("sex");
int grade = rs.getInt("grade");
int chinese = rs.getInt("chinese");
int math = rs.getInt("math");
int english = rs.getInt("english");
int chemistry = rs.getInt("chemistry");
int political = rs.getInt("political");
int history = rs.getInt("history");
int total_score = rs.getInt("total_score");
String teacher_id = rs.getString("teacher_id");
//创建student对象,并添加到ArrayList
com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name2, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
//把teacher_id 改为 teacher 的name
select_teacherByTeacher_id(student);
students.add(student);
}
//关闭资源
SQLUtils.closeResource(rs, pstmt, null);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* ----------------------------------------------------------------------------------------------------------
*/
/**
* 把学生数据库中的 所有 数据传递给学生表格(管理员使用)
* @param students
*/
@Override
public void selectAll_studentTable_forManager(ArrayList<com.student_manageSystem.pojo.Student> students) {
try {
Connection conn = SQLUtils.getConnection();
//先清空所有的数据
students.clear();
String sql = "select * from t_student_table";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String sex = rs.getString("sex");
int grade = rs.getInt("grade");
int chinese = rs.getInt("chinese");
int math = rs.getInt("math");
int english = rs.getInt("english");
int chemistry = rs.getInt("chemistry");
int political = rs.getInt("political");
int history = rs.getInt("history");
int total_score = rs.getInt("total_score");
String teacher_id = rs.getString("teacher_id");
//创建student对象,并添加到ArrayList
com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
//把teacher_id 改为 teacher 的name
select_teacherByTeacher_id(student);
students.add(student);
}
//关闭资源
SQLUtils.closeResource(rs, pstmt, conn);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 通过 ID查询 把学生数据库中的数据传递给学生表格(管理员使用)
* @param students
* @param id
*/
@Override
public void select_studentTableByID_forManager(ArrayList<com.student_manageSystem.pojo.Student> students, String id) {
try {
Connection conn = SQLUtils.getConnection();
//先清空所有的数据
students.clear();
String sql = "select * from t_student_table where id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
ResultSet rs = pstmt.executeQuery();
//因为ID是唯一的,只有一个,所以不用使用while()
if (rs.next()) {
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String sex = rs.getString("sex");
int grade = rs.getInt("grade");
int chinese = rs.getInt("chinese");
int math = rs.getInt("math");
int english = rs.getInt("english");
int chemistry = rs.getInt("chemistry");
int political = rs.getInt("political");
int history = rs.getInt("history");
int total_score = rs.getInt("total_score");
String teacher_id = rs.getString("teacher_id");
//创建student对象,并添加到ArrayList
com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
//把teacher_id 改为 teacher 的name
select_teacherByTeacher_id(student);
students.add(student);
}
//关闭资源
SQLUtils.closeResource(rs, pstmt, null);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 通过 年级查询 把学生数据库中的数据传递给学生表格(管理员使用)
* @param students
* @param grade
*/
@Override
public void select_studentTableByGrade_forManager(ArrayList<com.student_manageSystem.pojo.Student> students, int grade) {
try {
Connection conn = SQLUtils.getConnection();
//先清空所有的数据
students.clear();
String sql = "select * from t_student_table where grade = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, grade);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String sex = rs.getString("sex");
int chinese = rs.getInt("chinese");
int math = rs.getInt("math");
int english = rs.getInt("english");
int chemistry = rs.getInt("chemistry");
int political = rs.getInt("political");
int history = rs.getInt("history");
int total_score = rs.getInt("total_score");
String teacher_id = rs.getString("teacher_id");
//创建student对象,并添加到ArrayList
com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score,teacher_id);
//把teacher_id 改为 teacher 的name
select_teacherByTeacher_id(student);
students.add(student);
}
//关闭资源
SQLUtils.closeResource(rs, pstmt, null);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 同时通过 ID和年级查询 把学生数据库中的数据传递给学生表格(管理员使用)
* @param students
* @param id
* @param grade
*/
@Override
public void select_studentTableByIDAndGrade_forManager(ArrayList<com.student_manageSystem.pojo.Student> students, String id, int grade) {
try {
Connection conn = SQLUtils.getConnection();
//先清空所有的数据
students.clear();
String sql = "select * from t_student_table where id = ? and grade = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setInt(2, grade);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String sex = rs.getString("sex");
int chinese = rs.getInt("chinese");
int math = rs.getInt("math");
int english = rs.getInt("english");
int chemistry = rs.getInt("chemistry");
int political = rs.getInt("political");
int history = rs.getInt("history");
int total_score = rs.getInt("total_score");
String teacher_id = rs.getString("teacher_id");
//创建student对象,并添加到ArrayList
com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
//把teacher_id 改为 teacher 的name
select_teacherByTeacher_id(student);
students.add(student);
}
//关闭资源
SQLUtils.closeResource(rs, pstmt, null);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 通过姓名模糊查询 把学生数据库中的数据传递给学生表格(管理员使用)
* @param students
* @param name
*/
@Override
public void select_studentTableByName_forManager(ArrayList<com.student_manageSystem.pojo.Student> students, String name) {
try {
Connection conn = SQLUtils.getConnection();
//先清空所有的数据
students.clear();
//模糊查询
String sql = "select * from t_student_table where name like '%' " + "?" + " '%'; ";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String id = rs.getString("id");
String name2 = rs.getString("name");
String pwd = rs.getString("pwd");
String sex = rs.getString("sex");
int grade = rs.getInt("grade");
int chinese = rs.getInt("chinese");
int math = rs.getInt("math");
int english = rs.getInt("english");
int chemistry = rs.getInt("chemistry");
int political = rs.getInt("political");
int history = rs.getInt("history");
int total_score = rs.getInt("total_score");
String teacher_id = rs.getString("teacher_id");
//创建student对象,并添加到ArrayList
com.student_manageSystem.pojo.Student student = new com.student_manageSystem.pojo.Student(id, pwd, name2, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
//把teacher_id 改为 teacher 的name
select_teacherByTeacher_id(student);
students.add(student);
}
//关闭资源
SQLUtils.closeResource(rs, pstmt, null);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
TeacherImpl
package com.student_manageSystem.dao.impl;
import com.student_manageSystem.dao.TeacherDao;
import com.student_manageSystem.pojo.Teacher;
import com.student_manageSystem.utils.SQLUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
/**
* 教师的增删改查
*/
public class TeacherImpl implements TeacherDao {
/**
* 查询教师姓名,判断老师是否存在
* @param name
* @return
*/
@Override
public boolean judge_teacherNameIsExist(String name) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from t_teacher_table where name = ?";
try {
conn = SQLUtils.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
rs = pstmt.executeQuery();
return rs.next();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
//释放资源
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 查询教师ID,判断老师是否存在
* @param id
* @return
*/
@Override
public boolean judge_teacherIDIsExist(String id) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from t_teacher_table where id = ?";
try {
conn = SQLUtils.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
return rs.next();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
//释放资源
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 判断教师的姓名和ID是否相对应
* @param name
* @param id_t
* @return
*/
@Override
public boolean judgeTeacher_nameAndId(String name, String id_t) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select id from t_teacher_table where name = ?";
try {
conn = SQLUtils.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
rs = pstmt.executeQuery();
String id = null;
if (rs.next()) {
id = rs.getString("id");
}
return id != null && id.equals(id_t);
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
//释放资源
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 教师登录,查询ID和密码是否正确
* @param id : id
* @param pwd : 密码
* @return
*/
@Override
public boolean teacher_log(String id, String pwd) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from t_teacher_table where id = ? && pwd = ?";
try {
conn = SQLUtils.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
rs = pstmt.executeQuery();
return rs.next();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 增加教师
* @param teacher
*/
@Override
public void insert_teacher(Teacher teacher) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = SQLUtils.getConnection();
String sql = "insert into t_teacher_table values (?, ?, ?, ?, ?, ?, ?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, teacher.getId());
pstmt.setString(2, teacher.getPwd());
pstmt.setString(3, teacher.getName());
pstmt.setString(4, teacher.getSex());
pstmt.setInt(5, teacher.getAge());
pstmt.setString(6, teacher.getGraduate_school());
pstmt.setInt(7, teacher.getSalary());
pstmt.setString(8, teacher.getTelephone());
int count = pstmt.executeUpdate();
if (count > 0) System.out.println("成功注册或增加了一个教师");
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(null, pstmt, conn);
}
}
/**
* 删除教师
* @param id
*/
@Override
public void delete_teacher(String id) {
try {
Connection conn = SQLUtils.getConnection();
String sql = "delete from t_teacher_table where id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,id);
int count = pstmt.executeUpdate();
if (count > 0) System.out.println("成功删除了一位教师");
SQLUtils.closeResource(null, pstmt, conn);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 更新教师
* @param oldID
* @param teacher
*/
@Override
public void update_teacher(String oldID, Teacher teacher){
PreparedStatement pstmt = null;
try {
Connection conn = SQLUtils.getConnection();
String sql = "update t_teacher_table set id=?, pwd=?, name=?, sex=?, age=?, graduate_school=?, salary=?, telephone=? where id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, teacher.getId());
pstmt.setString(2, teacher.getPwd());
pstmt.setString(3, teacher.getName());
pstmt.setString(4, teacher.getSex());
pstmt.setInt(5, teacher.getAge());
pstmt.setString(6, teacher.getGraduate_school());
pstmt.setInt(7, teacher.getSalary());
pstmt.setString(8, teacher.getTelephone());
pstmt.setString(9,oldID);
int count = pstmt.executeUpdate();
if (count > 0) System.out.println("成功更新了教师数据");
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(null, pstmt, null);
}
}
/**
* 把教师数据库中的 所有 数据传递给教师表格(和管理员登录后首先看到的教师表格有关,也和刷新按钮有关)
* @param teachers
*/
@Override
public void selectAll_teacherTable(ArrayList<Teacher> teachers) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = SQLUtils.getConnection();
//先清空所有的数据
teachers.clear();
String sql = "select * from t_teacher_table";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String sex = rs.getString("sex");
int age = rs.getInt("age");
String graduate_school = rs.getString("graduate_school");
int salary = rs.getInt("salary");
String telephone = rs.getString("telephone");
//创建teacher对象,并添加到ArrayList
Teacher teacher = new Teacher(id, pwd, name, sex, age, graduate_school, salary, telephone);
teachers.add(teacher);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
//关闭资源
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 通过 ID查询 把老师数据库中的数据传递给老师表格
* @param teachers
* @param id
*/
@Override
public void select_teacherTableByID(ArrayList<Teacher> teachers, String id) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = SQLUtils.getConnection();
//先清空所有的数据
teachers.clear();
String sql = "select * from t_teacher_table where id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
rs = pstmt.executeQuery();
//因为ID是唯一的,只有一个,所以不用使用while()
if (rs.next()) {
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String sex = rs.getString("sex");
int age = rs.getInt("age");
String graduate_school = rs.getString("graduate_school");
int salary = rs.getInt("salary");
String telephone = rs.getString("telephone");
//创建teacher对象,并添加到ArrayList
Teacher teacher = new Teacher(id, pwd, name, sex, age, graduate_school, salary, telephone);
teachers.add(teacher);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
//关闭资源
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 通过姓名模糊查询 把教师数据库中的数据传递给教师表格
* @param teachers
* @param name
*/
@Override
public void select_teacherTableByName(ArrayList<Teacher> teachers, String name) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = SQLUtils.getConnection();
//先清空所有的数据
teachers.clear();
//模糊查询
String sql = "select * from t_teacher_table where name like '%' " + "?" + " '%'; ";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
rs = pstmt.executeQuery();
while (rs.next()) {
String id = rs.getString("id");
String pwd = rs.getString("pwd");
//这里应该要获取一下name的值,因为我们是进行模糊查询,所以要获取一下完整的name值
String name2 = rs.getString("name");
String sex = rs.getString("sex");
int age = rs.getInt("age");
String graduate_school = rs.getString("graduate_school");
int salary = rs.getInt("salary");
String telephone = rs.getString("telephone");
//创建teacher对象,并添加到ArrayList
Teacher teacher = new Teacher(id, pwd, name2, sex, age, graduate_school, salary, telephone);
teachers.add(teacher);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(rs, pstmt, conn);
}
}
/**
* 判断教师是否教的有学生(用于管理员删除教师,因为学生表和教师表添加了外键,不能随便删除教师)
* @param id_t
* @return
*/
@Override
public boolean judgeTeacher_havaStudents(String id_t) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "select * from t_student_table where teacher_id = ?";
try {
conn = SQLUtils.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id_t);
rs = pstmt.executeQuery();
return rs.next();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
SQLUtils.closeResource(rs, pstmt, conn);
}
}
}
3)pojo文件夹
Student类
package com.student_manageSystem.pojo;
public class Student {
String id;
String pwd;
String name;
String sex;
int grade;
int chinese;
int math;
int english;
int chemistry;
int political;
int history;
int total_score;
String teacher_id;
public Student() {}
public Student(String id, String pwd, String name, String sex, int grade, int chinese, int math, int english, int chemistry, int political, int history, int total_score, String teacher_id) {
this.id = id;
this.pwd = pwd;
this.name = name;
this.sex = sex;
this.grade = grade;
this.chinese = chinese;
this.math = math;
this.english = english;
this.chemistry = chemistry;
this.political = political;
this.history = history;
this.total_score = total_score;
this.teacher_id = teacher_id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getChinese() {
return chinese;
}
public void setChinese(int chinese) {
this.chinese = chinese;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getEnglish() {
return english;
}
public void setEnglish(int english) {
this.english = english;
}
public int getChemistry() {
return chemistry;
}
public void setChemistry(int chemistry) {
this.chemistry = chemistry;
}
public int getPolitical() {
return political;
}
public void setPolitical(int political) {
this.political = political;
}
public int getHistory() {
return history;
}
public void setHistory(int history) {
this.history = history;
}
public int getTotal_score() {
return total_score;
}
public void setTotal_score(int total_score) {
this.total_score = total_score;
}
public String getTeacher_id() {
return teacher_id;
}
public void setTeacher_id(String teacher_id) {
this.teacher_id = teacher_id;
}
@Override
public String toString() {
String result = "Student{id:" + this.id + "," +
"pwd:" + this.pwd + "," +
"name:" + this.name + "," +
"sex:" + this.sex + "," +
"grade:" + this.grade + "," +
"chinese:" + this.chinese + "," +
"math:" + this.math + "," +
"english:" + this.english + "," +
"chemistry:" + this.chemistry + "," +
"political:" + this.political + "," +
"history:" + this.history + "," +
"total_score:" + this.total_score + "," +
"teacher_id:" + this.teacher_id + "}";
return result;
}
}
Teacher类
package com.student_manageSystem.pojo;
public class Teacher {
String id;
String pwd;
String name;
String sex;
int age;
String graduate_school;
int salary;
String telephone;
public Teacher() {}
public Teacher(String id, String pwd, String name, String sex, int age, String graduate_school, int salary, String telephone) {
this.id = id;
this.pwd = pwd;
this.name = name;
this.sex = sex;
this.age = age;
this.graduate_school = graduate_school;
this.salary = salary;
this.telephone = telephone;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGraduate_school() {
return graduate_school;
}
public void setGraduate_school(String graduate_school) {
this.graduate_school = graduate_school;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
@Override
public String toString() {
String result = "Teacher{id:" + this.id + "," +
"pwd:" + this.pwd + "," +
"name:" + this.name + "," +
"sex:" + this.sex + "," +
"age:" + this.age + "," +
"graduate_school:" + this.graduate_school + "," +
"salary:" + this.salary + "," +
"telephone:" + this.telephone + "}";
return result;
}
}
4)utils文件夹
依照文件的顺序
package com.student_manageSystem.utils;
/**
* 普通工具类
*/
public class CommonUtils {
/**
* 判断字符串是否可以转换为数字(用来查询使用)
* @param str : 输入字符串;str为空时,返回false
* @return : true.可以转换为数字;false.不可以
*/
public static boolean isStrToNum(String str) {
try {
Integer.parseInt(str);//如果可以执行这行代码,就代表可以转换为数字,否则return false
return true;
} catch (NumberFormatException e) {
return false;
}
}
/**
* 判断数据是否在正确的区间(0<=每科成绩<=100;1<=年级<=4;班级>=0)
* @param data : 数据的大小
* @param min : 允许的最小值(包含最小值)
* @param max: 允许的最大值(包含最大值)
*/
public static boolean isDataSuitable(int data, int min, int max) {
return data >= min && data <= max;
}
}
package com.student_manageSystem.utils;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* md5数据单向加密(不可逆加密,备注:数据库中的模版数据,如刘备,张飞等密码都是:111)
*/
public class MD5Utils {
/**
* 使用JDK自带MessageDigest
* @param pwd
* @return
*/
public static String md5Encryption(String pwd) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("md5");
byte[] bytes = messageDigest.digest(pwd.getBytes("UTF-8"));
//16是表示转换为16进制数
String result = new BigInteger(1, bytes).toString(16);
return result;
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
package com.student_manageSystem.utils;
import java.sql.*;
public class SQLUtils {
//封装字符串常量
public final static String URL = "_________";
public final static String USER = "____";
public final static String PASSWORD = "___";
/**
* 获取数据库连接对象
* @return 返回数据库连接对象
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
throw new RuntimeException(e);
}
return conn;
}
/**
* 关闭资源
* @param rs
* @param stmt
* @param conn
*/
public static void closeResource(ResultSet rs, Statement stmt, Connection conn) {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
package com.student_manageSystem.utils;
import com.student_manageSystem.Main;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Modality;
import javafx.stage.Stage;
/**
* 视图工具类
*/
public class ViewUtils {
/**
* 设置GridPane布局的一些属性
* @param gridPane : 网格布局
*/
public static void setGridPane(GridPane gridPane) {
//设置每个组件之间的间距
gridPane.setHgap(10);//设置节点间的水平间距,也就是列与列的间距(节点就是组件)
gridPane.setVgap(10);//节点间的垂直间距,也就是行与行的间距
//设置组件在中间分布
gridPane.setAlignment(Pos.CENTER);
gridPane.setStyle("-fx-font-size: 18;");
}
/**
* 设置VBox单列面板布局的一些属性
* @param style : 字体类型
* @param spacing : 间距
* @param value : 设置组件的位置
* @param children : 组件
* @return : VBox
*/
public static VBox getVBox(String style, int spacing, Pos value, Node... children) {
VBox vBox = new VBox(children);
//字体类型
vBox.setStyle(style);
//间距
vBox.setSpacing(spacing);
//设置组件的位置
vBox.setAlignment(value);
return vBox;
}
/**
* 设置HBox单行面板布局的一些属性
* @param style : 字体类型
* @param spacing : 间距
* @param value : 设置组件的位置
* @param isSetBackground : true:说明需要设置背景颜色,是表格;false:不需要设置背景颜色
* @param children : 组件
* @return : HBox
*/
public static HBox getHBox(String style, int spacing, Pos value, boolean isSetBackground, Node... children) {
HBox hBox = new HBox(children);
//字体类型
hBox.setStyle(style);
//间距
hBox.setSpacing(spacing);
//设置组件的位置
hBox.setAlignment(value);
//设置hBox的背景颜色
if (isSetBackground) {
hBox.setBackground(new Background(new BackgroundFill(Color.rgb(119, 168, 157), null, null)));
}
return hBox;
}
/**
* 设置顶层窗口的一些属性
* @param str : 标题的内容
* @param tipStage : 需要添加属性的窗口
*/
public static void setTopTip(String str, Stage tipStage) {
tipStage.setResizable(false);//不能调整大小
tipStage.setTitle(str);//设置标题
//只能操作当前的提示框
tipStage.initOwner(Main.stage);
tipStage.initModality(Modality.WINDOW_MODAL);
//设置该提示框永远在最上层
tipStage.setAlwaysOnTop(true);
}
/**
* 提示框
* @param content : 提示的信息
*/
public static void tips(String content) {
//创建提示框窗口对象
Stage tipStage = new Stage();
//调用顶层窗口函数设置一些必要的属性
setTopTip(content, tipStage);
Label label = new Label(content);
Button back = new Button("返回");
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
//单列面板
VBox vBox = new VBox(label, back);
vBox.setSpacing(10);
vBox.setAlignment(Pos.CENTER);
Scene scene = new Scene(vBox, 180, 130);
tipStage.setScene(scene);
tipStage.show();
}
}
Main
package com.student_manageSystem;
import com.student_manageSystem.dao.impl.StudentImpl;
import com.student_manageSystem.dao.impl.TeacherImpl;
import com.student_manageSystem.dao.StudentDao;
import com.student_manageSystem.dao.TeacherDao;
import com.student_manageSystem.pojo.Student;
import com.student_manageSystem.utils.CommonUtils;
import com.student_manageSystem.utils.MD5Utils;
import com.student_manageSystem.utils.ViewUtils;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import java.util.ArrayList;
/**
* @projectName : student_manage_system
* @className : Main
* @description : 系统与用户交互界面
* @author : lizhuang
* @createDate : 10.19
*/
public class Main extends Application {
//新添加:
//1.限制每个教师只能查到自己的学生
//2.传入学生,教师的参数时,由于参数较多,要封装到一个学生,教师对象中
//3.输入学号,姓名时,在首尾输入空格无影响
//4.对学生的密码进行MD5加密(不可逆加密)
//更新:
//密码框
public static Stage stage;
//多态调用
static StudentDao studentDao = new StudentImpl();
static TeacherDao teacherDao = new TeacherImpl();
/**
* 主入口
*/
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Main.stage = stage;
stage.setResizable(false);
begin();
stage.show();
}
/**
* 首页面
*/
public static void begin() {
GridPane gridPane = new GridPane();
stage.setTitle("学生管理系统首页");
//设置gridPane 的一些属性
ViewUtils.setGridPane(gridPane);
Button manageLog = new Button("管理员登录");
Button teacherLog = new Button("教师登录");
Button studentLog = new Button("学生登录");
Button studentSign = new Button("学生注册");
//点击管理员登录按钮
manageLog.setOnAction(actionEvent -> {
Manager_operate.managerLog();
});
//点击老师登录按钮
teacherLog.setOnAction(actionEvent -> {
teacher_log();
});
//点击学生登录按钮
studentLog.setOnAction(actionEvent -> {
student_log();
});
//点击学生注册按钮
studentSign.setOnAction(actionEvent -> {
student_sign();
});
VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 20, Pos.CENTER, manageLog, teacherLog, studentLog, studentSign);
Scene scene = new Scene(vBox, 500, 400);
stage.setScene(scene);
}
/**
* 学生的一些操作
* ------------------------------------------------------------------------------------------------------------------------
* 学生注册
*/
public static void student_sign() {
stage.setTitle("学生注册");
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);//设置GridPane的一些属性
Label id = new Label("学生学号");
TextField idTxt = new TextField();
Label pwd = new Label("学生密码");
PasswordField pwdFld = new PasswordField();
Label name = new Label("学生姓名");
TextField nameTxt = new TextField();
Label sex = new Label("性别");
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
Label grade = new Label("学生年级");
TextField gradeTxt = new TextField();
Label teacher_id = new Label("教师姓名");
TextField teacher_idTxt = new TextField();
Button sign = new Button("注册");
Button back = new Button("返回");
//点击注册按钮
sign.setOnAction(actionEvent -> {
//数据要符合规范,grade,classSchool成绩必须是数字的形式,并且1<=grade<=4,0<=成绩<=100,ID必须没有重复
//数据是否为空
boolean isEmpty = !idTxt.getText().trim().equals("") && !pwdFld.getText().trim().equals("") && !nameTxt.getText().trim().equals("")
&& (man.isSelected() || woman.isSelected()) && !teacher_idTxt.getText().trim().equals("");
//部分数据的范围是否合适
boolean isSuitable = !gradeTxt.getText().trim().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText().trim()), 1, 4);
boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText().trim()) && !studentDao.judge_StudentIDIsExist(idTxt.getText().trim());
//要注册的学生ID不能存在,学生的教师姓名必须是存在的
if (isEmpty && isSuitable && isSuitable2) {
String sexDemo = man.isSelected() ? "男" : "女";
studentDao.insert_student(idTxt.getText().trim(), pwdFld.getText().trim(), nameTxt.getText().trim(), sexDemo, Integer.parseInt(gradeTxt.getText().trim()), teacher_idTxt.getText().trim());
ViewUtils.tips("注册成功");
begin();//注册成功后返回到主页面
} else if (!isSuitable2) {
ViewUtils.tips("请检查教师姓名或学生ID");
} else {
ViewUtils.tips("请检查数据");
}
});
//点击取消按钮,返回首页面
back.setOnAction(actionEvent -> {
begin();
});
//将男,女单选添加到单行面板中
HBox hBox = new HBox(man, woman);
gridPane.add(id, 0, 0);
gridPane.add(idTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdFld, 1, 1);
gridPane.add(name, 0, 2);
gridPane.add(nameTxt, 1, 2);
gridPane.add(sex, 0, 3);
gridPane.add(hBox, 1, 3);
gridPane.add(grade, 0, 4);
gridPane.add(gradeTxt, 1, 4);
gridPane.add(teacher_id, 0, 5);
gridPane.add(teacher_idTxt, 1, 5);
gridPane.add(sign, 0, 7);
gridPane.add(back, 1, 7);
//设置性别只能选择一个
//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
ToggleGroup toggleGroup = new ToggleGroup();
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 500, 400);
stage.setScene(scene);
}
/**
* 学生登录页面
*/
public static void student_log() {
stage.setTitle("学生登录");
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label idLabel = new Label("学生学号");
TextField idTxt = new TextField();
Label pwdLabel = new Label("学生密码");
PasswordField pwdFld = new PasswordField();
Button log = new Button("登录");
Button back = new Button("返回");
//点击登录
log.setOnAction(actionEvent -> {
try {
if (studentDao.student_log(idTxt.getText().trim(), pwdFld.getText().trim())) {
//进入学生选项(trim()去掉字符串两端的空格)
student_select(idTxt.getText().trim(), pwdFld.getText().trim());
}else {
ViewUtils.tips("请检查数据");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
//点击取消
back.setOnAction(actionEvent -> {
begin();
});
//安排每个组件的位置
gridPane.add(idLabel, 0, 0);
gridPane.add(idTxt, 1, 0);
gridPane.add(pwdLabel, 0, 1);
gridPane.add(pwdFld, 1, 1);
gridPane.add(log, 0, 3);
gridPane.add(back, 1, 3);
Scene scene = new Scene(gridPane, 500, 400);
stage.setScene(scene);
}
/**
* 学生登录后选择选项
* @param id : 传入ID用来查看学生分数 或 修改学生信息
* @param pwd : 传入ID用来查看学生分数 或 修改学生信息
*/
public static void student_select(String id, String pwd) {
stage.setTitle("学生选择");
Button checkScore = new Button("查看分数");
Button update = new Button("修改信息");
Button back = new Button("返回");
//点击查看分数
checkScore.setOnAction(actionEvent -> {
student_checkScore(id, pwd);
});
//点击修改信息
update.setOnAction(actionEvent -> {
student_modify(id, pwd);
});
//点击取消
back.setOnAction(actionEvent -> {
begin();
});
VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 20, Pos.CENTER, checkScore, update, back);
Scene scene = new Scene(vBox, 500, 400);
stage.setScene(scene);
}
/**
* 学生查看分数页面
* @param id : 传入学生ID
* @param pwd : 点击取消时,将ID和p 传入到student_select方法中
*/
public static void student_checkScore(String id, String pwd) {
stage.setTitle("学生查询成绩");
String encryption_pwd = MD5Utils.md5Encryption(pwd);
Student student = studentDao.select_studentByOneself(id, encryption_pwd);
Label id2 = new Label("学号 : " + student.getId());
Label p2 = new Label("密码 : " + pwd);
Label name = new Label("姓名 : " + student.getName());
Label sex = new Label("性别 : " + student.getSex());
Label grade = new Label("年级 : " + student.getGrade());
Label chinese = new Label("语文 : " + student.getChinese());
Label math = new Label("数学 : " + student.getMath());
Label english = new Label("英语 : " + student.getEnglish());
Label chemistry = new Label("化学 : " + student.getChemistry());
Label political = new Label("政治 : " + student.getPolitical());
Label history = new Label("历史 : " + student.getHistory());
Label total_score = new Label("总分 : " + student.getTotal_score());
Label teacher_id = new Label("教师姓名 : " + student.getTeacher_id());
Button back = new Button("返回");
//点击返回按钮,返回首页面
back.setOnAction(actionEvent -> {
student_select(id, pwd);
});
//单列面板
VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 10, Pos.CENTER,id2, p2, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id, back);
Scene scene = new Scene(vBox, 300, 530);
stage.setScene(scene);
}
/**
* 学生修改自己的信息
* @param id : 通过ID来搜索到我们要修改的学生
* @param p : 点击取消时,将ID和p 传入到student_select方法中
*/
public static void student_modify(String id, String p) {
stage.setTitle("学生修改信息");
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
//修改自己数据的时候把数据填充一下
String encryption_pwd = MD5Utils.md5Encryption(p);
Student student = studentDao.select_studentByOneself(id, encryption_pwd);
Label pwd = new Label("学生密码");
TextField pwdTxt = new TextField(p);
Label name = new Label("学生姓名");
TextField nameTxt = new TextField(student.getName());
Label sex = new Label("性别");
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
if (student.getSex().equals("男")) {
man.setSelected(true);
} else if (student.getSex().equals("女")) {
woman.setSelected(true);
}
Label grade = new Label("学生年级");
TextField gradeTxt = new TextField(String.valueOf(student.getGrade()));
Label teacher_id = new Label("教师姓名");
TextField teacher_idTxt = new TextField(student.getTeacher_id());
Button modify = new Button("修改");
Button back = new Button("返回");
//点击修改
modify.setOnAction(actionEvent -> {
//数据要符合规范,grade,classSchool,成绩必须是数字的形式,并且1<=grade<=4,0<=成绩<=100,ID必须没有重复;教师必须存在
boolean isEmpty = !pwdTxt.getText().equals("") && !nameTxt.getText().equals("") && (man.isSelected() ||
woman.isSelected()) && !teacher_idTxt.getText().equals("");
boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText());
boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4);
boolean isExists = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText());
if (isEmpty && isNum && isSuitable && isExists) {
String sexDemo = man.isSelected() ? "男" : "女";
//教师姓名转化为教师ID:studentDao.replaceName_withId(teacher_idTxt.getText())
studentDao.update_studentByOneself(id, pwdTxt.getText(), nameTxt.getText(), sexDemo, Integer.parseInt(gradeTxt.getText()), studentDao.replaceName_withId(teacher_idTxt.getText()));
ViewUtils.tips("修改成功");
student_select(id, pwdTxt.getText());
}else if (!isExists) {
ViewUtils.tips("请检查该教师是否存在");
}else {
ViewUtils.tips("请检查数据");
}
});
//点击取消按钮,返回首页面
back.setOnAction(actionEvent -> {
student_select(id, p);
});
//将男,女单选添加到单行面板中
HBox hBox = new HBox(man, woman);
gridPane.add(pwd, 0, 0);
gridPane.add(pwdTxt, 1, 0);
gridPane.add(name, 0, 1);
gridPane.add(nameTxt, 1, 1);
gridPane.add(sex, 0, 2);
gridPane.add(hBox, 1, 2);
gridPane.add(grade, 0, 3);
gridPane.add(gradeTxt, 1, 3);
gridPane.add(teacher_id, 0, 4);
gridPane.add(teacher_idTxt, 1, 4);
gridPane.add(modify, 0, 6);
gridPane.add(back, 1, 6);
//设置性别只能选择一个
ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 500, 400);
stage.setScene(scene);
}
/**
* 教师的相关操作
* ------------------------------------------------------------------------------------------------------------------------
* 教师登录
*/
public static void teacher_log() {
stage.setTitle("教师登录");
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label teacherID = new Label("教师工号");
TextField teacherIDTxt = new TextField();
Label pwd = new Label("教师密码");
PasswordField pwdFld = new PasswordField();
Button log = new Button("登录");
Button cancel = new Button("取消");
//点击登录按钮
log.setOnAction(actionEvent -> {
if (teacherDao.teacher_log(teacherIDTxt.getText().trim(), pwdFld.getText().trim())) {
manageStudent(true, teacherIDTxt.getText().trim());
}else {
ViewUtils.tips("请检查数据");
}
});
//点击取消按钮,返回首页面
cancel.setOnAction(actionEvent -> {
begin();
});
gridPane.add(teacherID, 0, 0);
gridPane.add(teacherIDTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdFld, 1, 1);
gridPane.add(log, 0, 2);
gridPane.add(cancel, 1, 2);
Scene scene = new Scene(gridPane, 500, 400);
stage.setScene(scene);
}
/**
* 教师,管理员管理学生
* @param select : true.老师管理学生;false.管理员管理学生(因为老师和管理员的返回界面不同,所以要分两种情况)
*/
public static void manageStudent(boolean select, String id_t) {
//学生集合
ArrayList<Student> students = new ArrayList<>();
stage.setTitle("管理学生");
BorderPane borderPane = new BorderPane();
Button add = new Button("增加");
Button delete = new Button("删除");
Button update = new Button("修改");
Button query = new Button("查询");
Button refresh = new Button("刷新");
Button back = new Button("返回");
//点击增加学生
add.setOnAction(actionEvent -> {
if (select) {
Teacher_operate.addStudent(borderPane, students, id_t);
}else {
Manager_operate.addStudent_forManager(borderPane, students);
}
});
//点击删除学生
delete.setOnAction(actionEvent -> {
//删除学生和管理员删除老师的界面相同
//删除学生,true:删除学生,false:删除老师
if (select) {
Teacher_operate.deletePerson(borderPane, students, id_t);
}else {
Manager_operate.deletePerson(borderPane, students, null, true);
}
});
//点击修改学生
update.setOnAction(actionEvent -> {
//先输入ID号码判断是否存在该学生,如果存在就修改学生
//true.老师或管理员修改学生;false.管理员修改老师
if (select) {
Teacher_operate.inputID(borderPane, students, id_t);
}else {
Manager_operate. inputID(borderPane, students, null, true);
}
});
//点击查询学生
query.setOnAction(actionEvent -> {
if (select) {
Teacher_operate.queryStudent_byTeacher(borderPane, students, id_t);
}else {
Manager_operate.queryStudent_forManager(borderPane, students);
}
});
//点击刷新
refresh.setOnAction(actionEvent -> {
if (select) {
Teacher_operate.refresh_studentTable_forTeacher(borderPane, students, id_t);
}else {
Manager_operate.refresh_studentTable_forManager(borderPane, students);
}
});
//点击返回
back.setOnAction(actionEvent -> {
//教师退出该页面
if (select) {
begin();
}else {
//管理员退出该页面
Manager_operate.managerSelect();
}
});
//单行面板
HBox hBox = ViewUtils.getHBox("-fx-font-size: 18;", 40, Pos.CENTER, true, add, delete, update, query, refresh, back);
//设置borderPane的背景颜色
borderPane.setBackground(new Background(new BackgroundFill(Color.rgb(200, 200, 200),null,null)));//设置hBox的背景颜色
//设置返回按钮的外边距
hBox.setMargin(back, new Insets(20, 20, 20, 60));
//将hBox 单行面板 添加到边界布局的顶部
borderPane.setTop(hBox);
//从数据库中把学生数据全部填写到students集合中
if (select) {//教师查询学生
studentDao.selectAll_studentTable_forTeacher(students, id_t);
}else {
studentDao.selectAll_studentTable_forManager(students);
}
//展示学生表格
studentTable(borderPane, students);
stage.setScene(new Scene(borderPane,1042, 500));
}
/**
* 学生表格(通用:适合教师和管理员对学生的管理)
* @param borderPane : 边界布局
* @param students : 学生集合
*/
public static void studentTable(BorderPane borderPane, ArrayList<Student> students) {
//学生的信息表格
TableView<Student> tableView = new TableView<>();
//TableColumn类 创建列。然后使用TableView 类的 getColumns()方法将创建的列添加到表中。
TableColumn id = new TableColumn<>("学号");
TableColumn pwd = new TableColumn<>("密码");
TableColumn name = new TableColumn<>("姓名");
TableColumn sex = new TableColumn<>("性别");
TableColumn grade = new TableColumn<>("年级");
TableColumn chinese = new TableColumn<>("语文");
TableColumn math = new TableColumn<>("数学");
TableColumn english = new TableColumn<>("英语");
TableColumn chemistry = new TableColumn<>("化学");
TableColumn political = new TableColumn<>("政治");
TableColumn history = new TableColumn<>("历史");
TableColumn total_score = new TableColumn<>("总分");
TableColumn teacher_id = new TableColumn<>("教师");
//表格列宽宽度设置
id.setMinWidth(70);
pwd.setMinWidth(70);
name.setMinWidth(60);
sex.setMinWidth(60);
grade.setMinWidth(60);
chinese.setMinWidth(60);
math.setMinWidth(60);
english.setMinWidth(60);
chemistry.setMinWidth(60);
political.setMinWidth(60);
history.setMinWidth(60);
total_score.setMinWidth(60);
teacher_id.setMinWidth(70);
//确定数据导入的列
id.setCellValueFactory(new PropertyValueFactory<>("id"));
pwd.setCellValueFactory(new PropertyValueFactory<>("pwd"));
name.setCellValueFactory(new PropertyValueFactory<>("name"));
sex.setCellValueFactory(new PropertyValueFactory<>("sex"));
grade.setCellValueFactory(new PropertyValueFactory<>("grade"));
chinese.setCellValueFactory(new PropertyValueFactory<>("chinese"));
math.setCellValueFactory(new PropertyValueFactory<>("math"));
english.setCellValueFactory(new PropertyValueFactory<>("english"));
chemistry.setCellValueFactory(new PropertyValueFactory<>("chemistry"));
political.setCellValueFactory(new PropertyValueFactory<>("political"));
history.setCellValueFactory(new PropertyValueFactory<>("history"));
total_score.setCellValueFactory(new PropertyValueFactory<>("total_score"));
teacher_id.setCellValueFactory(new PropertyValueFactory<>("teacher_id"));
//将列添加到表格中
tableView.getColumns().addAll(id, pwd, name, sex, grade, chinese, math, english, chemistry, political, history, total_score, teacher_id);
//将学生数组集合添加到表格中
tableView.getItems().addAll(students);
//将表格添加到边界布局的正中心
borderPane.setCenter(tableView);
}
}
Manager_operate
package com.student_manageSystem;
import com.student_manageSystem.dao.impl.ManagerImpl;
import com.student_manageSystem.dao.impl.StudentImpl;
import com.student_manageSystem.dao.impl.TeacherImpl;
import com.student_manageSystem.pojo.Student;
import com.student_manageSystem.pojo.Teacher;
import com.student_manageSystem.utils.CommonUtils;
import com.student_manageSystem.utils.ViewUtils;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import java.util.ArrayList;
/**
* 管理员操作学生、教师;管理员自身的一些操作
*/
public class Manager_operate {
private static final StudentImpl studentDao = new StudentImpl();
private static final TeacherImpl teacherDao = new TeacherImpl();
private static final ManagerImpl managerDao = new ManagerImpl();
/**
* 关于管理员的操作
* ------------------------------------------------------------------------------------------------------------------------
* 管理员登录
*/
public static void managerLog() {
Main.stage.setTitle("管理员登录");
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label id = new Label("管理员ID");
TextField idTxt = new TextField();
Label pwd = new Label("管理员密码");
PasswordField pwdFld = new PasswordField();
Button log = new Button("登录");
Button cancel = new Button("取消");
//点击登录按钮
log.setOnAction(actionEvent -> {
if (managerDao.manager_log(idTxt.getText().trim(), pwdFld.getText().trim())) {
managerSelect();
}else {
ViewUtils.tips("请检查数据");
}
});
//点击取消按钮,返回首页面
cancel.setOnAction(actionEvent -> {
Main.begin();
});
gridPane.add(id, 0, 0);
gridPane.add(idTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdFld, 1, 1);
gridPane.add(log, 0, 2);
gridPane.add(cancel, 1, 2);
Scene scene = new Scene(gridPane, 500, 400);
Main.stage.setScene(scene);
}
/**
* 管理员登录后的 选择
*/
public static void managerSelect() {
Main.stage.setTitle("管理员选项");
Button manageStudent = new Button("管理学生");
Button manageTeacher = new Button("管理教师");
Button dataStatistical = new Button("成绩统计");
Button back = new Button("退出系统");
//点击管理学生按钮
manageStudent.setOnAction(actionEvent -> {
Main.manageStudent(false, null);
});
//点击管理教师按钮
manageTeacher.setOnAction(actionEvent -> {
manageTeacher();
});
//点击成绩统计
dataStatistical.setOnAction(actionEvent -> {
dataStatistical();
});
//点击退出按钮
back.setOnAction(actionEvent -> {
Main.begin();
});
//单行面板
VBox vBox = ViewUtils.getVBox("-fx-font-size: 18;", 40, Pos.CENTER, manageStudent, manageTeacher, dataStatistical, back);
Main.stage.setScene(new Scene(vBox, 500, 400));
}
/**
* 管理员增加学生
* @param borderPane : 边界布局
* @param students : 学生集合
*/
public static void addStudent_forManager(BorderPane borderPane, ArrayList<Student> students) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("增加学生",tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label studentID = new Label("学生学号");
TextField studentIDTxt = new TextField();
Label pwd = new Label("学生密码");
TextField pwdTxt = new TextField();
Label name = new Label("学生姓名");
TextField nameTxt = new TextField();
Label sex = new Label("性别");
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
Label grade = new Label("学生年级");
TextField gradeTxt = new TextField();
Label teacher_id = new Label("教师姓名");
TextField teacher_idTxt = new TextField();
Button add = new Button("增加");
Button back = new Button("返回");
//单行面板
HBox hBox = new HBox(man, woman);
gridPane.add(studentID, 0, 0);
gridPane.add(studentIDTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdTxt, 1, 1);
gridPane.add(name, 0, 2);
gridPane.add(nameTxt, 1, 2);
gridPane.add(sex, 0, 3);
gridPane.add(hBox, 1, 3);
gridPane.add(grade, 0, 4);
gridPane.add(gradeTxt, 1, 4);
gridPane.add(teacher_id, 0, 6);
gridPane.add(teacher_idTxt, 1, 6);
gridPane.add(add, 0, 8);
gridPane.add(back, 1, 8);
//点击增加学生
add.setOnAction(actionEvent -> {
//数据要符合规范
boolean isEmpty = !studentIDTxt.getText().equals("") && !pwdTxt.getText().equals("") && !nameTxt.getText().equals("")
&& (man.isSelected() || woman.isSelected()) && !teacher_idTxt.getText().equals("");
boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText());
boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4);
//要判断教师的姓名是否存在,而不是教师ID,教师姓名要存在;学生学号不能存在
boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && !studentDao.judge_StudentIDIsExist(studentIDTxt.getText());
try {
//学生ID不能重复;学生修改的教师必须存在
if (isEmpty && isNum && isSuitable && isSuitable2) {
String sexDemo = man.isSelected() ? "男" : "女";
studentDao.insert_student(studentIDTxt.getText(), pwdTxt.getText(), nameTxt.getText(), sexDemo,
Integer.parseInt(gradeTxt.getText()), teacher_idTxt.getText());
ViewUtils.tips("增加成功");
tipStage.close();
//刷新表格中的数据
refresh_studentTable_forManager(borderPane, students);
}else if (!isSuitable2) {
ViewUtils.tips("请检查教师姓名或学生ID");
}else {
ViewUtils.tips("请检查数据");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
//设置性别只能选择一个
ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 340, 400);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 删除学生或者老师
* @param borderPane : 边界布局
* @param students : 学生集合
* @param teachers : 教师集合
* @param b : true删除学生,false删除老师
*/
public static void deletePerson(BorderPane borderPane, ArrayList<Student> students, ArrayList<Teacher> teachers, boolean b) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("删除人员", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label ID = new Label("ID号码 : ");
TextField IDTxt = new TextField();
Button delete = new Button("删除");
Button back = new Button("返回");
gridPane.add(ID, 0, 0);
gridPane.add(IDTxt, 1, 0);
gridPane.add(delete, 0, 2);
gridPane.add(back, 1, 2);
//点击删除按钮
delete.setOnAction(actionEvent -> {
try {
//删除学生,先判断是否存在该学生
if (b && studentDao.judge_StudentIDIsExist(IDTxt.getText())) {
studentDao.delete_student(IDTxt.getText());
ViewUtils.tips("成功删除该学生");
tipStage.close();
//刷新表格中的数据
refresh_studentTable_forManager(borderPane, students);
}else if (!b && teacherDao.judge_teacherIDIsExist(IDTxt.getText()) && !teacherDao.judgeTeacher_havaStudents(IDTxt.getText())) { //删除老师,先判断是否存在该老师,而且该教师没有教学生
teacherDao.delete_teacher(IDTxt.getText());
ViewUtils.tips("成功删除该老师");
tipStage.close();
//刷新表格中的数据
refresh_teacherTable(borderPane, teachers);
} else if (!b && teacherDao.judgeTeacher_havaStudents(IDTxt.getText())) {
ViewUtils.tips("请确保该教师没有教授学生");
} else {
ViewUtils.tips("请检查数据");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
Scene scene = new Scene(gridPane, 360, 200);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 教师或管理员修改学生,管理员修改教师:必须先输入正确的ID号码后,才能修改
* @param borderPane : 边界布局
* @param students : 学生集合
* @param teachers : 教师集合
* @param select : true.管理员修改学生;false.管理员修改老师
*/
public static void inputID(BorderPane borderPane, ArrayList<Student> students, ArrayList<Teacher> teachers, boolean select) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("搜索ID号码", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label ID = new Label("ID号码 : ");
TextField IDTxt = new TextField();
Button search = new Button("搜索");
Button back = new Button("返回");
gridPane.add(ID, 0, 0);
gridPane.add(IDTxt, 1, 0);
gridPane.add(search, 0, 2);
gridPane.add(back, 1, 2);
//点击搜索按钮
search.setOnAction(actionEvent -> {
try {
//修改学生,先查询该学生是否存在
if (select && studentDao.judge_StudentIDIsExist(IDTxt.getText())) {
updateStudent(borderPane, students, IDTxt.getText());
tipStage.close();
}else if(!select && teacherDao.judge_teacherIDIsExist(IDTxt.getText())) { //修改老师,先查询该老师是否存在
updateTeacher(borderPane, teachers, IDTxt.getText());
tipStage.close();
}else {
ViewUtils.tips("请检查数据");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
Scene scene = new Scene(gridPane, 360, 200);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 输入正确的ID号码后,可以修改学生了(学生的密码无法修改)
* @param borderPane : 边界布局
* @param students : 学生集合
* @param ID : 需要修改的学生的 原来的ID号码,我们要根据原来的ID来查找这个学生
*/
public static void updateStudent(BorderPane borderPane, ArrayList<Student> students, String ID) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("修改学生", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
//先查询这个学生
studentDao.select_studentTableByID_forManager(students, ID);
Student student = students.get(0);
Label studentID = new Label("学号 : ");
TextField studentIDTxt = new TextField(student.getId());
Label name = new Label("姓名 : " );
TextField nameTxt = new TextField(student.getName());
Label sex = new Label("性别 : " );
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
if (student.getSex().equals("男")) {
man.setSelected(true);
} else if (student.getSex().equals("女")) {
woman.setSelected(true);
}
Label grade = new Label("年级 : ");
TextField gradeTxt = new TextField(String.valueOf(student.getGrade()));
Label chinese = new Label("语文 : " );
TextField chineseTxt = new TextField(String.valueOf(student.getChinese()));
Label math = new Label("数学 : " );
TextField mathTxt = new TextField(String.valueOf(student.getMath()));
Label english = new Label("英语 : " );
TextField englishTxt = new TextField(String.valueOf(student.getEnglish()));
Label chemistry = new Label("化学 : " );
TextField chemistryTxt = new TextField(String.valueOf(student.getChemistry()));
Label political = new Label("政治 : " );
TextField politicalTxt = new TextField(String.valueOf(student.getPolitical()));
Label history = new Label("历史 : " );
TextField historyTxt = new TextField(String.valueOf(student.getHistory()));
Label teacher_id = new Label("教师 : " );
TextField teacher_idTxt = new TextField(student.getTeacher_id());
Button update = new Button("修改");
Button back = new Button("返回");
//单行面板
HBox hBox = new HBox(man, woman);
gridPane.add(studentID, 0, 0);
gridPane.add(studentIDTxt, 1, 0);
gridPane.add(name, 0, 1);
gridPane.add(nameTxt, 1, 1);
gridPane.add(sex, 0, 2);
gridPane.add(hBox, 1, 2);
gridPane.add(grade, 0, 3);
gridPane.add(gradeTxt, 1, 3);
gridPane.add(chinese, 0, 4);
gridPane.add(chineseTxt, 1, 4);
gridPane.add(math, 0, 5);
gridPane.add(mathTxt, 1, 5);
gridPane.add(english, 0, 6);
gridPane.add(englishTxt, 1, 6);
gridPane.add(chemistry, 0, 7);
gridPane.add(chemistryTxt, 1, 7);
gridPane.add(political, 0, 8);
gridPane.add(politicalTxt, 1, 8);
gridPane.add(history, 0, 9);
gridPane.add(historyTxt, 1, 9);
gridPane.add(teacher_id, 0, 10);
gridPane.add(teacher_idTxt, 1, 10);
gridPane.add(update, 0, 12);
gridPane.add(back, 1, 12);
//点击修改按钮
update.setOnAction(actionEvent -> {
//是否为空
boolean isData = !studentIDTxt.getText().equals("") && !nameTxt.getText().equals("") && (man.isSelected() || woman.isSelected());
//其中的班级和分数是否可以转换为数字
boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText()) && CommonUtils.isStrToNum(chineseTxt.getText()) && CommonUtils.isStrToNum(mathTxt.getText()) &&
CommonUtils.isStrToNum(englishTxt.getText()) && CommonUtils.isStrToNum(chemistryTxt.getText()) && CommonUtils.isStrToNum(politicalTxt.getText()) &&
CommonUtils.isStrToNum(historyTxt.getText());
//数据是否合适
boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4) &&
!chineseTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chineseTxt.getText()), 0, 100) &&
!mathTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(mathTxt.getText()), 0, 100) &&
!englishTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(englishTxt.getText()), 0, 100) &&
!chemistryTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chemistryTxt.getText()), 0, 100) &&
!politicalTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(politicalTxt.getText()), 0, 100) &&
!historyTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(historyTxt.getText()), 0, 100);
//判断该教师是否存在;判断新修改的学生ID是否已经被占有了
boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && (!studentDao.judge_StudentIDIsExist(studentIDTxt.getText()) || studentIDTxt.getText().equals(ID));
try {
//数据正常
if (isData && isNum && isSuitable && isSuitable2){
String sexDemo = man.isSelected() ? "男" : "女";
int totalScore = Integer.parseInt(chineseTxt.getText()) + Integer.parseInt(mathTxt.getText()) + Integer.parseInt(englishTxt.getText()) +
Integer.parseInt(chemistryTxt.getText()) + Integer.parseInt(politicalTxt.getText()) + Integer.parseInt(historyTxt.getText());
//把数据封装到Student对象中,传入到函数
Student student1 = new Student(studentIDTxt.getText(), "", nameTxt.getText(), sexDemo, Integer.parseInt(gradeTxt.getText()),
Integer.parseInt(chineseTxt.getText()), Integer.parseInt(mathTxt.getText()), Integer.parseInt(englishTxt.getText()), Integer.parseInt(chemistryTxt.getText()),
Integer.parseInt(politicalTxt.getText()), Integer.parseInt(historyTxt.getText()), totalScore, studentDao.replaceName_withId(teacher_idTxt.getText()));
//教师姓名转化为教师ID:studentDao.replaceName_withId(teacher_idTxt.getText())
//修改学生信息
studentDao.update_studentByTeacherAndManager(ID, student1);
ViewUtils.tips("修改成功");
tipStage.close();
//刷新表格中的数据
refresh_studentTable_forManager(borderPane, students);
}else {
ViewUtils.tips("请检查数据");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
//设置性别只能选择一个
ToggleGroup toggleGroup = new ToggleGroup();
//将单选按钮添加到到ToggleGroup对象,ToggleGroup对象将管理它们,使得一次只能选择一个单选按钮。
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 440, 680);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 管理员查询学生
* @param borderPane : 边界布局
* @param students : 学生集合
*/
public static void queryStudent_forManager(BorderPane borderPane, ArrayList<Student> students) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("可以进行ID查询、班级查询、ID和班级共同查询、姓名模糊查询", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label studentID = new Label("学号 : ");
TextField studentIDTxt = new TextField();
Label grade = new Label("年级 : ");
TextField gradeTxt = new TextField();
Label name = new Label("姓名 : ");
TextField nameTxt = new TextField();
Button query = new Button("查询");
Button back = new Button("返回");
gridPane.add(studentID, 0, 0);
gridPane.add(studentIDTxt, 1, 0);
gridPane.add(grade, 0, 1);
gridPane.add(gradeTxt, 1, 1);
gridPane.add(name, 0, 2);
gridPane.add(nameTxt, 1, 2);
gridPane.add(query, 0, 4);
gridPane.add(back, 1, 4);
//点击查询按钮
query.setOnAction(actionEvent -> {
//只通过ID查询学生
if (!studentIDTxt.getText().equals("") && gradeTxt.getText().equals("") && nameTxt.getText().equals("")){
//将ID符合的学生添加到students集合中
studentDao.select_studentTableByID_forManager(students, studentIDTxt.getText());//students 集合里面的数据以及改变了
Main.studentTable(borderPane, students);
tipStage.close();
} else if (studentIDTxt.getText().equals("") && !gradeTxt.getText().equals("") && CommonUtils.isStrToNum(gradeTxt.getText()) && nameTxt.getText().equals("")) {//只通过班级查询学生,grade必须可以转换为数字,不然从数据库中查找的时候会报错
//将grade符合的学生添加到students集合中
studentDao.select_studentTableByGrade_forManager(students, Integer.parseInt(gradeTxt.getText()) );
Main.studentTable(borderPane, students);
tipStage.close();
}else if (!studentIDTxt.getText().equals("") && !gradeTxt.getText().equals("") && CommonUtils.isStrToNum(gradeTxt.getText()) && nameTxt.getText().equals("")){//同时通过ID和班级查询,grade必须可以转换为数字
//将ID和grade同时符合的学生添加到students集合中
studentDao.select_studentTableByIDAndGrade_forManager(students, studentIDTxt.getText(), Integer.parseInt(gradeTxt.getText()));
Main.studentTable(borderPane, students);
tipStage.close();
} else if (studentIDTxt.getText().equals("") && gradeTxt.getText().equals("") && !nameTxt.getText().equals("")) {//只通过姓名模糊查询
//只通过姓名模糊查询
studentDao.select_studentTableByName_forManager(students, nameTxt.getText());
Main.studentTable(borderPane, students);
tipStage.close();
} else { //没有输入数据
ViewUtils.tips("请检查数据");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
Scene scene = new Scene(gridPane, 480, 400);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 管理员刷新学生表格(增加,删除,修改后调用)
* @param borderPane : 边界布局
* @param students : 学生集合
*/
public static void refresh_studentTable_forManager(BorderPane borderPane, ArrayList<Student> students) {
//填写学生数据
studentDao.selectAll_studentTable_forManager(students);
//展示学生表格
Main.studentTable(borderPane, students);
}
/**
* 管理员管理老师
*/
public static void manageTeacher() {
//教师集合
ArrayList<Teacher> teachers = new ArrayList<>();
Main.stage.setTitle("管理员管理老师");
BorderPane borderPane = new BorderPane();
Button add = new Button("增加");
Button delete = new Button("删除");
Button update = new Button("修改");
Button query = new Button("查询");
Button refresh = new Button("刷新");
Button back = new Button("返回");
//点击增加教师按钮
add.setOnAction(actionEvent -> {
addTeacher(borderPane, teachers);
});
//点击删除教师按钮
delete.setOnAction(actionEvent -> {
//删除学生和老师的界面相同
//删除老师
deletePerson(borderPane, null, teachers, false);
});
//点击修改教师按钮
update.setOnAction(actionEvent -> {
inputID(borderPane, null, teachers, false);
});
//点击查询教师按钮
query.setOnAction(actionEvent -> {
queryTeacher(borderPane);
});
//点击刷新
refresh.setOnAction(actionEvent -> {
refresh_teacherTable(borderPane, teachers);
});
//点击返回按钮
back.setOnAction(actionEvent -> {
managerSelect();
});
//单行面板
HBox hBox = ViewUtils.getHBox("-fx-font-size: 18;", 40, Pos.CENTER, true, add, delete, update, query, refresh, back);
//设置borderPane的背景颜色
borderPane.setBackground(new Background(new BackgroundFill(Color.rgb(200, 200, 200),null,null)));//设置hBox的背景颜色
//返回按钮的外边距
hBox.setMargin(back, new Insets(20, 20, 20, 60));
//将hBox 单行面板 添加到边界布局的顶部
borderPane.setTop(hBox);
//从数据库中把老师数据全部填写到teachers
teacherDao.selectAll_teacherTable(teachers);
//展示教师表格
teacherTable(borderPane, teachers);
Main.stage.setScene(new Scene(borderPane,738, 500));
}
/**
* 教师表格
* @param borderPane : 边界布局
* @param teachers : 教师集合
*/
public static void teacherTable(BorderPane borderPane, ArrayList<Teacher> teachers) {
//教师的信息表格
TableView<Teacher> tableView = new TableView<>();
//TableColumn类 创建列。然后使用TableView 类的 getColumns()方法将创建的列添加到表中。
TableColumn id = new TableColumn<>("工号");
TableColumn pwd = new TableColumn<>("密码");
TableColumn name = new TableColumn<>("姓名");
TableColumn sex = new TableColumn<>("性别");
TableColumn age = new TableColumn<>("年龄");
TableColumn graduate_school = new TableColumn<>("毕业学校");
TableColumn salary = new TableColumn<>("工资");
TableColumn telephone = new TableColumn<>("电话号码");
//表格列宽宽度设置
id.setMinWidth(90);
name.setMinWidth(70);
sex.setMinWidth(60);
pwd.setMinWidth(85);
age.setMinWidth(70);
graduate_school.setMinWidth(120);
salary.setMinWidth(70);
telephone.setMinWidth(100);
//确定数据导入的列
//引号里面的内容一定要和teacher对象的变量名称对应,Teacher还要有相关变量的set,get方法
id.setCellValueFactory(new PropertyValueFactory<>("id"));
pwd.setCellValueFactory(new PropertyValueFactory<>("pwd"));
name.setCellValueFactory(new PropertyValueFactory<>("name"));
sex.setCellValueFactory(new PropertyValueFactory<>("sex"));
age.setCellValueFactory(new PropertyValueFactory<>("age"));
graduate_school.setCellValueFactory(new PropertyValueFactory<>("graduate_school"));
salary.setCellValueFactory(new PropertyValueFactory<>("salary"));
telephone.setCellValueFactory(new PropertyValueFactory<>("telephone"));
tableView.getColumns().addAll(id, pwd, name, sex, age, graduate_school, salary, telephone);
//将教师数组集合添加到表格中
tableView.getItems().addAll(teachers);
//将表格添加到边界布局的正中心
borderPane.setCenter(tableView);
}
/**
* 管理员增加教师
* @param borderPane :边界布局
* @param teachers :教师集合
*/
public static void addTeacher(BorderPane borderPane, ArrayList<Teacher> teachers) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("增加教师", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label teacherID = new Label("工号 : ");
TextField teacherIDTxt = new TextField();
Label pwd = new Label("密码 : " );
TextField pwdTxt = new TextField();
Label name = new Label("姓名 : " );
TextField nameTxt = new TextField();
Label sex = new Label("性别 : " );
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
Label age = new Label("年龄 : " );
TextField ageTxt = new TextField();
Label graduate_school = new Label("毕业学校 : " );
TextField graduate_schoolTxt = new TextField();
Label salary = new Label("工资 : " );
TextField salaryTxt = new TextField();
Label telephone = new Label("电话 : " );
TextField telephoneTxt = new TextField();
Button add = new Button("增加");
Button back = new Button("返回");
//单行面板
HBox hBox = new HBox(man, woman);
gridPane.add(teacherID, 0, 0);
gridPane.add(teacherIDTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdTxt, 1, 1);
gridPane.add(name, 0, 2);
gridPane.add(nameTxt, 1, 2);
gridPane.add(sex, 0, 3);
gridPane.add(hBox, 1, 3);
gridPane.add(age, 0, 4);
gridPane.add(ageTxt, 1, 4);
gridPane.add(graduate_school, 0, 5);
gridPane.add(graduate_schoolTxt, 1, 5);
gridPane.add(salary, 0, 6);
gridPane.add(salaryTxt, 1, 6);
gridPane.add(telephone, 0, 7);
gridPane.add(telephoneTxt, 1, 7);
gridPane.add(add, 0, 9);
gridPane.add(back, 1, 9);
//点击增加按钮
add.setOnAction(actionEvent -> {
//检查是否为空
boolean isData = !teacherIDTxt.getText().equals("") && !pwdTxt.getText().equals("") && !nameTxt.getText().equals("") &&
(man.isSelected() || woman.isSelected()) && !graduate_schoolTxt.getText().equals("") && !salaryTxt.getText().equals("") &&
!telephoneTxt.getText().equals("");
//部分数据是否可以转换为数字
boolean isNum = CommonUtils.isStrToNum(ageTxt.getText()) && CommonUtils.isStrToNum(salaryTxt.getText());
//数据是否在合适的范围内
boolean isSuitable = !ageTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(ageTxt.getText()), 22, 100);
boolean isSuitable2 = !teacherDao.judge_teacherIDIsExist(teacherIDTxt.getText());
if (isData && isNum && isSuitable && isSuitable2){
String sexDemo = man.isSelected() ? "男" : "女";
//将教师的数据封装到Teacher对象中,传入函数
Teacher teacher = new Teacher(teacherIDTxt.getText(), pwdTxt.getText(), nameTxt.getText(), sexDemo, Integer.parseInt(ageTxt.getText()),
graduate_schoolTxt.getText(), Integer.parseInt(salaryTxt.getText()), telephoneTxt.getText());
//增加
teacherDao.insert_teacher(teacher);
//刷新教师表格
refresh_teacherTable(borderPane, teachers);
ViewUtils.tips("增加成功");
tipStage.close();
} else if (!isSuitable2) {
ViewUtils.tips("请检查该教师的ID");
} else {
ViewUtils.tips("请检查数据");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
//设置性别只能选择一个
ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 380, 580);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 输入正确的ID号码后,管理员可以修改老师了
* @param borderPane :边界布局
* @param teachers :教师集合
* @param ID : 需要修改的教师的 ID号码,我们将根据原先的ID来找到该教师
*/
public static void updateTeacher(BorderPane borderPane, ArrayList<Teacher> teachers, String ID) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("修改学生", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
//先通过ID查询教师,给 TextField赋值
teacherDao.select_teacherTableByID(teachers, ID);
Teacher teacher = teachers.get(0);
Label teacherID = new Label("教师ID : ");
TextField teacherIDTxt = new TextField(teacher.getId());
Label pwd = new Label("密码 : ");
TextField pwdTxt = new TextField(teacher.getPwd());
Label name = new Label("姓名 : " );
TextField nameTxt = new TextField(teacher.getName());
Label sex = new Label("性别 : " );
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
if (teacher.getSex().equals("男")) {
man.setSelected(true);
} else if (teacher.getSex().equals("女")) {
woman.setSelected(true);
}
Label age = new Label("年龄 : " );
TextField ageTxt = new TextField(String.valueOf(teacher.getAge()));
Label graduate_school = new Label("毕业学校 : " );
TextField graduate_schoolTxt = new TextField(teacher.getGraduate_school());
Label salary = new Label("工资 : " );
TextField salaryTxt = new TextField(String.valueOf(teacher.getSalary()));
Label telephone = new Label("电话 : " );
TextField telephoneTxt = new TextField(String.valueOf(teacher.getTelephone()));
Button update = new Button("修改");
Button back = new Button("返回");
//单行面板
HBox hBox = new HBox(man, woman);
gridPane.add(teacherID, 0, 0);
gridPane.add(teacherIDTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdTxt, 1, 1);
gridPane.add(name, 0, 2);
gridPane.add(nameTxt, 1, 2);
gridPane.add(sex, 0, 3);
gridPane.add(hBox, 1, 3);
gridPane.add(age, 0, 4);
gridPane.add(ageTxt, 1, 4);
gridPane.add(graduate_school, 0, 5);
gridPane.add(graduate_schoolTxt, 1, 5);
gridPane.add(salary, 0, 6);
gridPane.add(salaryTxt, 1, 6);
gridPane.add(telephone, 0, 7);
gridPane.add(telephoneTxt, 1, 7);
gridPane.add(update, 0, 9);
gridPane.add(back, 1, 9);
//点击修改按钮
update.setOnAction(actionEvent -> {
//检查数据是否为空
boolean isData = !teacherIDTxt.getText().equals("") && !pwdTxt.getText().equals("") && !nameTxt.getText().equals("") &&
(man.isSelected() || woman.isSelected()) && !graduate_schoolTxt.getText().equals("") &&
!salaryTxt.getText().equals("") && !telephoneTxt.getText().equals("");
//部分数据是否可以转换为数字
boolean isNum = CommonUtils.isStrToNum(ageTxt.getText()) && CommonUtils.isStrToNum(salaryTxt.getText());
boolean isSuitable = !ageTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(ageTxt.getText()), 22, 100);
//教师ID不能有重复的
boolean isSuitable2 = !teacherDao.judge_teacherIDIsExist(teacherIDTxt.getText()) || teacherIDTxt.getText().equals(ID);
if (isData && isNum && isSuitable && isSuitable2){
String sexDemo = man.isSelected() ? "男" : "女";
//将教师属性封装到Teacher对象中,传入参数
Teacher teacher1 = new Teacher(teacherIDTxt.getText(), pwdTxt.getText(), nameTxt.getText(), sexDemo, Integer.parseInt(ageTxt.getText()),
graduate_schoolTxt.getText(), Integer.parseInt(salaryTxt.getText()), telephoneTxt.getText());
//修改教师信息
teacherDao.update_teacher(ID, teacher1);
ViewUtils.tips("修改成功");
tipStage.close();
//刷新教师表格
refresh_teacherTable(borderPane, teachers);
} else if (!isSuitable2) {
ViewUtils.tips("请检查教师ID是否正确");
} else {
ViewUtils.tips("请检查数据");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
//设置性别只能选择一个
ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 440, 680);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 管理员查询教师
* @param borderPane : 边界布局
*/
public static void queryTeacher(BorderPane borderPane) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("可以进行ID查询、姓名模糊查询", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label teacherID = new Label("工号 : ");
TextField teacherIDTxt = new TextField();
Label name = new Label("姓名");
TextField nameTxt = new TextField();
Button query = new Button("查询");
Button back = new Button("返回");
gridPane.add(teacherID, 0, 0);
gridPane.add(teacherIDTxt, 1, 0);
gridPane.add(name, 0, 1);
gridPane.add(nameTxt, 1, 1);
gridPane.add(query, 0, 3);
gridPane.add(back, 1, 3);
//点击查询按钮
query.setOnAction(actionEvent -> {
ArrayList<Teacher> teachers = new ArrayList<>();
//只查询ID
if (!teacherIDTxt.getText().equals("") && nameTxt.getText().equals("")){
//将ID符合的教师添加到teachers集合中
teacherDao.select_teacherTableByID(teachers, teacherIDTxt.getText());
teacherTable(borderPane,teachers);
tipStage.close();
} else if (teacherIDTxt.getText().equals("") && !nameTxt.getText().equals("")) {
//只通过姓名模糊查询
teacherDao.select_teacherTableByName(teachers, nameTxt.getText());
teacherTable(borderPane,teachers);
tipStage.close();
} else { //没有输入数据
ViewUtils.tips("请检查数据");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
Scene scene = new Scene(gridPane, 340, 400);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 刷新教师表格
* @param borderPane : 边界布局
* @param teachers : 教师集合
*/
public static void refresh_teacherTable(BorderPane borderPane, ArrayList<Teacher> teachers) {
//填写全部的教师数据
teacherDao.selectAll_teacherTable(teachers);
//展示教师表格
teacherTable(borderPane, teachers);
}
/**
* 成绩柱状图
*/
public static void dataStatistical() {
Main.stage.setTitle("成绩统计");
Button back = new Button("返回");
//点击返回
back.setOnAction(actionEvent -> {
managerSelect();
});
CategoryAxis xAxis = new CategoryAxis();
xAxis.setLabel("成绩分布");
NumberAxis yAxis = new NumberAxis();
yAxis.setLabel("人数");
BarChart barChart = new BarChart<>(xAxis, yAxis);
XYChart.Series dataSeries1 = new XYChart.Series();
dataSeries1.setName("年级1");
XYChart.Series dataSeries2 = null;
XYChart.Series dataSeries3 = null;
XYChart.Series dataSeries4 = null;
try {
dataSeries1.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(1, 0, 200)));
dataSeries1.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(1, 200, 350)));
dataSeries1.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(1, 350, 500)));
dataSeries1.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(1, 500, 601)));
dataSeries2 = new XYChart.Series();
dataSeries2.setName("年级2");
dataSeries2.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(2, 0, 200)));
dataSeries2.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(2, 200, 350)));
dataSeries2.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(2, 350, 500)));
dataSeries2.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(2, 500, 601)));
dataSeries3 = new XYChart.Series();
dataSeries3.setName("年级3");
dataSeries3.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(3, 0, 200)));
dataSeries3.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(3, 200, 350)));
dataSeries3.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(3, 350, 500)));
dataSeries3.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(3, 500, 601)));
dataSeries4 = new XYChart.Series();
dataSeries4.setName("年级4");
dataSeries4.getData().add(new XYChart.Data("0<=x<200", managerDao.histogram(4, 0, 200)));
dataSeries4.getData().add(new XYChart.Data("200<=x<350" , managerDao.histogram(4, 200, 350)));
dataSeries4.getData().add(new XYChart.Data("350<=x<500" , managerDao.histogram(4, 350, 500)));
dataSeries4.getData().add(new XYChart.Data("500<=x<=600" , managerDao.histogram(4, 500, 601)));
} catch (Exception e) {
throw new RuntimeException(e);
}
barChart.getData().add(dataSeries1);
barChart.getData().add(dataSeries2);
barChart.getData().add(dataSeries3);
barChart.getData().add(dataSeries4);
//单列面板
VBox vBox = new VBox(barChart, back);
vBox.setAlignment(Pos.CENTER);
vBox.setMargin(back, new Insets(20, 0, 0, 0));
Scene scene = new Scene(vBox, 500, 540);
Main.stage.setScene(scene);
}
}
Teacher_operate
package com.student_manageSystem;
import com.student_manageSystem.dao.impl.StudentImpl;
import com.student_manageSystem.dao.impl.TeacherImpl;
import com.student_manageSystem.pojo.Student;
import com.student_manageSystem.utils.CommonUtils;
import com.student_manageSystem.utils.ViewUtils;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import java.util.ArrayList;
/**
* 教师只能增删改查 自己的学生
*/
public class Teacher_operate {
private static final StudentImpl studentDao = new StudentImpl();
private static final TeacherImpl teacherDao = new TeacherImpl();
/**
* 教师增加学生
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_t : 教师ID
*/
public static void addStudent(BorderPane borderPane, ArrayList<Student> students, String id_t) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("增加学生",tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label studentID = new Label("学生学号");
TextField studentIDTxt = new TextField();
Label pwd = new Label("学生密码");
TextField pwdTxt = new TextField();
Label name = new Label("学生姓名");
TextField nameTxt = new TextField();
Label sex = new Label("性别");
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
Label grade = new Label("学生年级");
TextField gradeTxt = new TextField();
Label teacher_id = new Label("教师姓名");
TextField teacher_idTxt = new TextField();
Button add = new Button("增加");
Button back = new Button("返回");
//单行面板
HBox hBox = new HBox(man, woman);
gridPane.add(studentID, 0, 0);
gridPane.add(studentIDTxt, 1, 0);
gridPane.add(pwd, 0, 1);
gridPane.add(pwdTxt, 1, 1);
gridPane.add(name, 0, 2);
gridPane.add(nameTxt, 1, 2);
gridPane.add(sex, 0, 3);
gridPane.add(hBox, 1, 3);
gridPane.add(grade, 0, 4);
gridPane.add(gradeTxt, 1, 4);
gridPane.add(teacher_id, 0, 6);
gridPane.add(teacher_idTxt, 1, 6);
gridPane.add(add, 0, 8);
gridPane.add(back, 1, 8);
//点击增加学生
add.setOnAction(actionEvent -> {
//数据要符合规范
boolean isEmpty = !studentIDTxt.getText().equals("") && !pwdTxt.getText().equals("") && !nameTxt.getText().equals("")
&& (man.isSelected() || woman.isSelected()) && !teacher_idTxt.getText().equals("");
boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText());
boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4);
//要判断教师的姓名是否存在,而不是教师ID,教师姓名要存在;学生学号不能存在
boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && !studentDao.judge_StudentIDIsExist(studentIDTxt.getText());
Student student = new Student();
student.setTeacher_id(teacher_idTxt.getText());
student.setId(studentID.getText());
studentDao.select_teacherByTeacher_id(student);
boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);
try {
//学生ID不能重复;学生修改的教师必须存在
if (isEmpty && isNum && isSuitable && isSuitable2 && isSuitable3) {
String sexDemo = man.isSelected() ? "男" : "女";
studentDao.insert_student(studentIDTxt.getText(), pwdTxt.getText(), nameTxt.getText(), sexDemo,
Integer.parseInt(gradeTxt.getText()), teacher_idTxt.getText());
ViewUtils.tips("增加成功");
tipStage.close();
//刷新表格中的数据
refresh_studentTable_forTeacher(borderPane, students, id_t);
}else if (!isSuitable2) {
ViewUtils.tips("请检查教师姓名或学生ID");
}else {
ViewUtils.tips("请检查数据");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
//设置性别只能选择一个
ToggleGroup toggleGroup = new ToggleGroup();//将单选按钮添加到到ToggleGroup对象,它将管理它们,使得一次只能选择一个单选按钮。
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 340, 400);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 删除学生,老师
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_t : 教师ID
*/
public static void deletePerson(BorderPane borderPane, ArrayList<Student> students, String id_t) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("删除人员", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label ID = new Label("ID号码 : ");
TextField IDTxt = new TextField();
Button delete = new Button("删除");
Button back = new Button("返回");
gridPane.add(ID, 0, 0);
gridPane.add(IDTxt, 1, 0);
gridPane.add(delete, 0, 2);
gridPane.add(back, 1, 2);
//点击删除按钮
delete.setOnAction(actionEvent -> {
Student student = new Student();
student.setTeacher_id(id_t);
student.setId(IDTxt.getText());
studentDao.select_teacherByTeacher_id(student);
boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);
//删除学生,先判断是否存在该学生
if (studentDao.judge_StudentIDIsExist(IDTxt.getText()) && isSuitable3) {
studentDao.delete_student(IDTxt.getText());
ViewUtils.tips("成功删除该学生");
tipStage.close();
//刷新表格中的数据
refresh_studentTable_forTeacher(borderPane, students, id_t);
}else {
ViewUtils.tips("请检查数据");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
Scene scene = new Scene(gridPane, 360, 200);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 教师修改学生:必须先输入正确的ID号码后,才能修改
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_t : 教师ID,用于判断某个老师是否可以操作某个学生(教师只能操作自己的学生)
*/
public static void inputID(BorderPane borderPane, ArrayList<Student> students, String id_t) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("搜索ID号码", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label ID = new Label("ID号码 : ");
TextField IDTxt = new TextField();
Button search = new Button("搜索");
Button back = new Button("返回");
gridPane.add(ID, 0, 0);
gridPane.add(IDTxt, 1, 0);
gridPane.add(search, 0, 2);
gridPane.add(back, 1, 2);
//点击搜索按钮
search.setOnAction(actionEvent -> {
Student student = new Student();
student.setTeacher_id(id_t);
student.setId(IDTxt.getText());
studentDao.select_teacherByTeacher_id(student);
boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(student.getTeacher_id(),id_t);
//修改学生,先查询该学生是否存在,而且要修改的学生属于该教师
if (studentDao.judge_StudentIDIsExist(IDTxt.getText()) && isSuitable3) {
updateStudent(borderPane, students, IDTxt.getText(), id_t);
tipStage.close();
}else {
ViewUtils.tips("请检查数据");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
Scene scene = new Scene(gridPane, 360, 200);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 输入正确的ID号码后,教师修改学生(学生的密码无法修改)
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_sOld : 需要修改的学生的 原来的ID号码,我们要根据原来的ID来查找这个学生
* @param id_t : 教师ID
*/
public static void updateStudent(BorderPane borderPane, ArrayList<Student> students, String id_sOld, String id_t) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("修改学生", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
//先查询这个学生
studentDao.select_studentTableByID_forTeacher(students, id_sOld, id_t);
Student student = students.get(0);
Label studentID = new Label("学号 : ");
TextField studentIDTxt = new TextField(student.getId());
Label name = new Label("姓名 : " );
TextField nameTxt = new TextField(student.getName());
Label sex = new Label("性别 : " );
RadioButton man = new RadioButton("男");
RadioButton woman = new RadioButton("女");
if (student.getSex().equals("男")) {
man.setSelected(true);
} else if (student.getSex().equals("女")) {
woman.setSelected(true);
}
Label grade = new Label("年级 : ");
TextField gradeTxt = new TextField(String.valueOf(student.getGrade()));
Label chinese = new Label("语文 : " );
TextField chineseTxt = new TextField(String.valueOf(student.getChinese()));
Label math = new Label("数学 : " );
TextField mathTxt = new TextField(String.valueOf(student.getMath()));
Label english = new Label("英语 : " );
TextField englishTxt = new TextField(String.valueOf(student.getEnglish()));
Label chemistry = new Label("化学 : " );
TextField chemistryTxt = new TextField(String.valueOf(student.getChemistry()));
Label political = new Label("政治 : " );
TextField politicalTxt = new TextField(String.valueOf(student.getPolitical()));
Label history = new Label("历史 : " );
TextField historyTxt = new TextField(String.valueOf(student.getHistory()));
Label teacher_id = new Label("教师姓名 : " );
TextField teacher_idTxt = new TextField(student.getTeacher_id());
Button update = new Button("修改");
Button back = new Button("返回");
//单行面板
HBox hBox = new HBox(man, woman);
gridPane.add(studentID, 0, 0);
gridPane.add(studentIDTxt, 1, 0);
gridPane.add(name, 0, 1);
gridPane.add(nameTxt, 1, 1);
gridPane.add(sex, 0, 2);
gridPane.add(hBox, 1, 2);
gridPane.add(grade, 0, 3);
gridPane.add(gradeTxt, 1, 3);
gridPane.add(chinese, 0, 4);
gridPane.add(chineseTxt, 1, 4);
gridPane.add(math, 0, 5);
gridPane.add(mathTxt, 1, 5);
gridPane.add(english, 0, 6);
gridPane.add(englishTxt, 1, 6);
gridPane.add(chemistry, 0, 7);
gridPane.add(chemistryTxt, 1, 7);
gridPane.add(political, 0, 8);
gridPane.add(politicalTxt, 1, 8);
gridPane.add(history, 0, 9);
gridPane.add(historyTxt, 1, 9);
gridPane.add(teacher_id, 0, 10);
gridPane.add(teacher_idTxt, 1, 10);
gridPane.add(update, 0, 12);
gridPane.add(back, 1, 12);
//点击修改按钮
update.setOnAction(actionEvent -> {
//是否为空
boolean isData = !studentIDTxt.getText().equals("") && !nameTxt.getText().equals("") && (man.isSelected() || woman.isSelected());
//其中的班级和分数是否可以转换为数字
boolean isNum = CommonUtils.isStrToNum(gradeTxt.getText()) && CommonUtils.isStrToNum(chineseTxt.getText()) && CommonUtils.isStrToNum(mathTxt.getText()) &&
CommonUtils.isStrToNum(englishTxt.getText()) && CommonUtils.isStrToNum(chemistryTxt.getText()) && CommonUtils.isStrToNum(politicalTxt.getText()) &&
CommonUtils.isStrToNum(historyTxt.getText());
//数据是否合适
boolean isSuitable = !gradeTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(gradeTxt.getText()), 1, 4) &&
!chineseTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chineseTxt.getText()), 0, 100) &&
!mathTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(mathTxt.getText()), 0, 100) &&
!englishTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(englishTxt.getText()), 0, 100) &&
!chemistryTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(chemistryTxt.getText()), 0, 100) &&
!politicalTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(politicalTxt.getText()), 0, 100) &&
!historyTxt.getText().equals("") && CommonUtils.isDataSuitable(Integer.parseInt(historyTxt.getText()), 0, 100);
//判断该教师是否存在;判断新修改的学生ID是否已经被占有了
boolean isSuitable2 = teacherDao.judge_teacherNameIsExist(teacher_idTxt.getText()) && (!studentDao.judge_StudentIDIsExist(studentIDTxt.getText()) || studentIDTxt.getText().equals(id_sOld));
boolean isSuitable3 = teacherDao.judgeTeacher_nameAndId(teacher_idTxt.getText(), id_t);
//数据正常
if (isData && isNum && isSuitable && isSuitable2 && isSuitable3){
String sexDemo = man.isSelected() ? "男" : "女";
int totalScore = Integer.parseInt(chineseTxt.getText()) + Integer.parseInt(mathTxt.getText()) + Integer.parseInt(englishTxt.getText()) +
Integer.parseInt(chemistryTxt.getText()) + Integer.parseInt(politicalTxt.getText()) + Integer.parseInt(historyTxt.getText());
//教师姓名转化为教师ID:studentDao.replaceName_withId(teacher_idTxt.getText())
//修改学生信息
//把数据封装到Student对象中,传入到函数
Student student1 = new Student(studentIDTxt.getText(),"", nameTxt.getText(), sexDemo, Integer.parseInt(gradeTxt.getText()),
Integer.parseInt(chineseTxt.getText()), Integer.parseInt(mathTxt.getText()), Integer.parseInt(englishTxt.getText()), Integer.parseInt(chemistryTxt.getText()),
Integer.parseInt(politicalTxt.getText()), Integer.parseInt(historyTxt.getText()), totalScore, studentDao.replaceName_withId(teacher_idTxt.getText()));
studentDao.update_studentByTeacherAndManager(id_sOld, student1);
ViewUtils.tips("修改成功");
tipStage.close();
//刷新表格中的数据
refresh_studentTable_forTeacher(borderPane, students, id_t);
}else {
ViewUtils.tips("请检查数据");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
//设置性别只能选择一个
ToggleGroup toggleGroup = new ToggleGroup();
//将单选按钮添加到到ToggleGroup对象,ToggleGroup对象将管理它们,使得一次只能选择一个单选按钮。
man.setToggleGroup(toggleGroup);
woman.setToggleGroup(toggleGroup);
Scene scene = new Scene(gridPane, 440, 680);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 教师查询学生
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_t : 教师ID
*/
public static void queryStudent_byTeacher(BorderPane borderPane, ArrayList<Student> students, String id_t) {
//创建提示框窗口对象
Stage tipStage = new Stage();
ViewUtils.setTopTip("可以进行ID查询、姓名模糊查询", tipStage);
GridPane gridPane = new GridPane();
ViewUtils.setGridPane(gridPane);
Label studentID = new Label("学号 : ");
TextField studentIDTxt = new TextField();
Label name = new Label("姓名 : ");
TextField nameTxt = new TextField();
Button query = new Button("查询");
Button back = new Button("返回");
gridPane.add(studentID, 0, 0);
gridPane.add(studentIDTxt, 1, 0);
gridPane.add(name, 0, 1);
gridPane.add(nameTxt, 1, 1);
gridPane.add(query, 0, 3);
gridPane.add(back, 1, 3);
//点击查询按钮
query.setOnAction(actionEvent -> {
//只通过ID查询学生
if (!studentIDTxt.getText().equals("") && nameTxt.getText().equals("")){
//将ID符合的学生添加到students集合中
studentDao.select_studentTableByID_forTeacher(students, studentIDTxt.getText(), id_t);
Main.studentTable(borderPane, students);
tipStage.close();
} else if (studentIDTxt.getText().equals("") && !nameTxt.getText().equals("")) {//只通过姓名模糊查询
//只通过姓名模糊查询
studentDao.select_studentTableByName_forTeacher(students, nameTxt.getText(), id_t);
Main.studentTable(borderPane, students);
tipStage.close();
} else { //没有输入数据
ViewUtils.tips("请检查数据,二选一");
}
});
//点击返回按钮,关闭提示框
back.setOnAction(actionEvent -> {
tipStage.close();
});
Scene scene = new Scene(gridPane, 480, 400);
tipStage.setScene(scene);
tipStage.show();
}
/**
* 教师刷新学生表格(增加,删除,修改后调用)
* @param borderPane : 边界布局
* @param students : 学生集合
* @param id_t : 教师ID
*/
public static void refresh_studentTable_forTeacher(BorderPane borderPane, ArrayList<Student> students, String id_t) {
//填写学生数据
studentDao.selectAll_studentTable_forTeacher(students, id_t);
//展示学生表格
Main.studentTable(borderPane, students);
}
}