



















Preview text:
lOMoAR cPSD| 60755984
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC GIA ĐỊNH
TIỂU LUẬN CUỐI KỲ
MÔN: LẬP TRÌNH ỨNG DỤNG JAVA ĐỀ TÀI:
UNIVERSITY MANAGEMENT SYSTEM (ỨNG DỤNG QUẢN LÝ TRƯỜNG HỌC)
Sinh viên thực hiện: [HỌ VÀ TÊN] MSSV: [MÃ SỐ SV]
Lớp / Ngành: [LỚP] / [NGÀNH]
TP. HỒ CHÍ MINH, 08/2025 MỤC LỤC
Vào **References → Table of Contents → Update** để sinh mục lục tự động sau khi hoàn tất. lOMoAR cPSD| 60755984
DANH MỤC BẢNG / BIỂU / HÌNH ẢNH
Sẽ tự cập nhật sau khi chèn đủ bảng/hình. Hệ thống đã chuẩn bị các hình UML và
placeholders ảnh chạy thực tế. lOMoAR cPSD| 60755984
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI
Trình bày bối cảnh, lý do chọn đề tài, mục tiêu, phạm vi và phương pháp.
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
Java/JDK, JavaFX & FXML, JDBC & MySQL, các thư viện phụ trợ (FontAwesomeFX/Ikonli...).
CHƯƠNG 3: PHÂN TÍCH & THIẾT KẾ HỆ THỐNG
3.1. Use Case tổng quát lOMoAR cPSD| 60755984
3.2. Biểu đồ lớp (rút trích từ mã nguồn) lOMoAR cPSD| 60755984
3.3. Sơ đồ hoạt động – Đăng nhập lOMoAR cPSD| 60755984
3.4. Sơ đồ tuần tự – CRUD Sinh viên lOMoAR cPSD| 60755984
3.5. Mô hình dữ liệu (ERD) lOMoAR cPSD| 60755984
3.6. Sơ đồ trạng thái – Payment
CHƯƠNG 4: CÀI ĐẶT (MÃ NGUỒN & MÔ-ĐUN)
Phân tích chi tiết từng class/module, cấu trúc thư mục, kết nối CSDL, FXML & Controller, bảo mật…
CHƯƠNG 5: KẾT QUẢ VÀ KIỂM THỬ
Ảnh chụp kết quả chạy, test case Positive & Negative, kiểm thử dữ liệu & ràng buộc.
[Chèn ảnh sau khi chạy thực tế.]
CHƯƠNG 6: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Tổng kết và định hướng mở rộng hệ thống. lOMoAR cPSD| 60755984
PHẦN MỞ RỘNG – CHƯƠNG 4: PHÂN TÍCH CHI TIẾT TỪNG
CLASS/MODULE & GIAO DIỆN
Tổng quan mã nguồn: 16 file .java, 10 file .fxml, 4 file .css, tổng LOC ~ 4814.
Package: universitiymanagementsystem - File:
UniversitiyManagementSystem/src/universitiymanagementsystem/AddStuden tController.java
• Lớp: AddStudentController
• Số dòng: 506 | Số phương thức: 16 | Số trường: 21
• Các phương thức tiêu biểu: addBtn, updateBtn, clearFields, countAge,
importBtn, displayStudentNumber, yearList, courseList, priceList, setFields,
sectionList, statusPaymentList...
• Thuộc tính nổi bật: main_form, student_number, student_name,
student_birthDate, student_year, student_course, student_section, student_pay,
student_payment, student_imageView, student_importBtn, student_addBtn... • Đoạn mã minh họa: } public void genderList() {
List listG = new ArrayList<>();
for (String data : ListData.gender) { listG.add(data); }
ObservableList listData = FXCollections.observableArrayList(listG);
student_gender.setItems(listData); } @Override
public void initialize(URL location, ResourceBundle resources) {
yearList(); courseList(); sectionList();
statusPaymentList(); statusList(); semesterList(); genderList(); displayStudentNumber(); setFields(); }
if (student_number.getText().isEmpty()
|| student_name.getText().isEmpty()
|| student_year.getSelectionModel().getSelectedItem() == null lOMoAR cPSD| 60755984
|| student_year.getSelectionModel().getSelectedItem().isEmpty()
|| student_course.getSelectionModel().getSelectedItem() == null
|| student_course.getSelectionModel().getSelectedItem().isEmpty()
|| student_section.getSelectionModel().getSelectedItem() ==
null || student_section.getSelectionModel().getSelectedItem().isEmpty()
|| student_pay.getText().isEmpty()
|| student_payment.getSelectionModel().getSelectedItem() ==
null || student_payment.getSelectionModel().getSelectedItem().isEmpty()
|| student_status.getSelectionModel().getSelectedItem() == null
|| student_status.getSelectionModel().getSelectedItem().isEmpty()
|| ListData.path == null || "".equals(ListData.path)
|| student_birthDate.getValue() == null
|| student_semester.getSelectionModel().getSelectedItem() ==
null || student_semester.getSelectionModel().getSelectedItem().isEmpty()
|| student_gender.getSelectionModel().getSelectedItem() == null
|| student_gender.getSelectionModel().getSelectedItem().isEmpty()) {
alert.errorMessage("Please fill all blank fields."); } else { connect = Database.connectDB();
String checkStudentNum = "SELECT * FROM student WHERE student_id = '"
+ student_number.getText() + "'"; try {
prepare = connect.prepareStatement(checkStudentNum);
result = prepare.executeQuery(); if (result.next()) {
alert.errorMessage("Student Number: " +
student_number.getText() + " is already taken"); } else {
String insertData = "INSERT INTO student "
+ "(student_id, full_name, gender, birth_date,
year, course, section, semester, payment" - File:
UniversitiyManagementSystem/src/universitiymanagementsystem/AdminMain FormController.java
• Lớp: AdminMainFormController
• Số dòng: 2035 | Số phương thức: 65 | Số trường: 95
• Các phương thức tiêu biểu: dashboardDisplayTS, dashboardDisplayTT,
dashboardDisplaySRT, dashboardDisplayTI, dashboardDSChart,
dashboardDTChart, dashboardDIChart, addStudentGetData,
addStudentDisplayData, addStudentAddBtn, addStudentUpdateBtn, addStudentDeleteBtn... lOMoAR cPSD| 60755984
• Thuộc tính nổi bật: greet_username, dashboard_btn, addStudent_btn,
addTeacher_btn, addCourse_btn, addSubject_btn, payment_btn, salary_btn,
addStudent_form, addTeacher_form, addStudent_tableView, addStudent_deleteBtn... • Đoạn mã minh họa: salarySalaryStatusList(); salaryDisplaydata(); } } public void displayGreet() {
String username = ListData.admin_username;
username = username.substring(0, 1).toUpperCase() + username.substring(1);
greet_username.setText("Welcome, " + username); } @Override
public void initialize(URL location, ResourceBundle resources) { displayGreet(); dashboardDisplayTS(); dashboardDisplayTT(); dashboardDisplaySRT(); dashboardDisplayTI(); dashboardDSChart(); dashboardDTChart(); dashboardDIChart();
} } private LineChart<?, ?> dashboard_chart_DI; // DATABASE TOOLS private Connection connect; private
PreparedStatement prepare; private ResultSet result;
private Statement statement; private
AlertMessage alert = new AlertMessage(); private Image image;
public void dashboardDisplayTS() {
String sql = "SELECT COUNT(id) FROM student WHERE date_delete IS NULL";
connect = Database.connectDB(); int tempTS = 0; try {
prepare = connect.prepareStatement(sql);
result = prepare.executeQuery(); if (result.next()) {
tempTS = result.getInt("COUNT(id)"); } lOMoAR cPSD| 60755984
dashboard_TS.setText("" + tempTS); } catch (Exception e) { e.printStackTrace(); } } - File:
UniversitiyManagementSystem/src/universitiymanagementsystem/AlertMessa ge.java • Lớp: AlertMessage
• Số dòng: 50 | Số phương thức: 3 | Số trường: 1
• Các phương thức tiêu biểu: successMessage, errorMessage, confirmMessage
• Thuộc tính nổi bật: alert • Đoạn mã minh họa: /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor. */
package universitiymanagementsystem;
import java.util.Optional; import
javafx.scene.control.Alert; import
javafx.scene.control.Alert.AlertType; import
javafx.scene.control.ButtonType; /** * * @author WINDOWS 10 */ public class AlertMessage { private Alert alert;
public void successMessage(String message) {
alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Information Message"); alert.setHeaderText(null);
alert.setContentText(message); alert.show(); }
public void errorMessage(String message) {
alert = new Alert(AlertType.ERROR); - File: lOMoAR cPSD| 60755984
UniversitiyManagementSystem/src/universitiymanagementsystem/CourseData .java • Lớp: CourseData
• Số dòng: 69 | Số phương thức: 8 | Số trường: 8
• Các phương thức tiêu biểu: getPrice, getId, getCourse, getDepartment,
getDateInsert, getDateUpdate, getDateDelete, getStatus
• Thuộc tính nổi bật: id, course, department, price, dateInsert, dateUpdate, dateDelete, status • Đoạn mã minh họa: /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor. */
package universitiymanagementsystem; import java.sql.Date; /** * * @author WINDOWS 10 */ public class CourseData { private Integer id; private String course; private String department; private Double price; private Date dateInsert; private Date dateUpdate; private Date dateDelete; private String status;
public CourseData(Integer id, String course, String department, Double price,
Date dateInsert, Date dateUpdate, Date dateDelete, String status) { this.id = id; this.course = course; this.department = department; this.price = price; - File: lOMoAR cPSD| 60755984
UniversitiyManagementSystem/src/universitiymanagementsystem/DataStuden tHandle.java
• Lớp: DataStudentHandle
• Số dòng: 90 | Số phương thức: 10 | Số trường: 10
• Các phương thức tiêu biểu: getTeacherID, getStudentID, getName, getGender,
getCourse, getYear, getSemester, getDateInsert, getDateDelete, getStatus
• Thuộc tính nổi bật: teacherID, studentID, name, gender, course, year, semester,
dateInsert, dateDelete, status • Đoạn mã minh họa: /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor. */
package universitiymanagementsystem; import java.sql.Date; /** * * @author WINDOWS 10 */
public class DataStudentHandle { private String teacherID; private String studentID; private String name; private String gender; private String course; private String year; private String semester; private Date dateInsert; private Date dateDelete; private String status;
public DataStudentHandle(String studentID, String name, String gender,
String course, String year, String semester, Date dateInsert,
Date dateDelete, String status) { this.studentID = studentID; - File:
UniversitiyManagementSystem/src/universitiymanagementsystem/DataSubjec tHandle.java
• Lớp: DataSubjectHandle lOMoAR cPSD| 60755984
• Số dòng: 51 | Số phương thức: 5 | Số trường: 5
• Các phương thức tiêu biểu: getId, getSubjectCode, getSubject, getInsertDate, getStatus
• Thuộc tính nổi bật: id, subjectCode, subject, insertData, status • Đoạn mã minh họa: /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor. */
package universitiymanagementsystem; import java.sql.Date; /** * * @author WINDOWS 10 */
public class DataSubjectHandle { private Integer id; private String subjectCode; private String subject; private Date insertData; private String status;
public DataSubjectHandle(Integer id, String subjectCode,
String subject, Date insertData, String status) { this.id = id;
this.subjectCode = subjectCode;
this.subject = subject; this.insertData =
insertData; this.status = status; } - File:
UniversitiyManagementSystem/src/universitiymanagementsystem/Database.ja va • Lớp: Database
• Số dòng: 30 | Số phương thức: 0 | Số trường: 0 • Đoạn mã minh họa:
* To change this template file, choose Tools | Templates
* and open the template in the editor. */ lOMoAR cPSD| 60755984
package universitiymanagementsystem; import java.sql.Connection;
import java.sql.DriverManager; /** * * @author WINDOWS 10 */
public class Database { public static Connection connectDB() { try {
Class.forName("com.mysql.jdbc.Driver"); Connection connect =
DriverManager.getConnection("jdbc:mysql://localhost/university", "root", "ntt11102005"); return connect; } catch (Exception e) { e.printStackTrace(); } return null; } } - File:
UniversitiyManagementSystem/src/universitiymanagementsystem/FXMLDocu mentController.java
• Lớp: FXMLDocumentController
• Số dòng: 549 | Số phương thức: 11 | Số trường: 30
• Các phương thức tiêu biểu: hashPassword, loginAccount, registerAdmin,
registerStudent, studentIDGenerator, registerTeacher, teacherIDGenerator,
roleList, signInForm, switchForm, initialize
• Thuộc tính nổi bật: login_form, login_username, login_password, login_btn,
login_role, admin_form, admin_username, admin_password, admin_signupBtn,
admin_signIn, admin_cPassword, student_form... • Đoạn mã minh họa: break; case "Teacher": login_form.setVisible(false); admin_form.setVisible(false);
student_form.setVisible(false); lOMoAR cPSD| 60755984
teacher_form.setVisible(true); break; default: break; } } @Override
public void initialize(URL url, ResourceBundle rb) { roleList(); } } e.printStackTrace(); return null; } } public void loginAccount() {
if (login_username.getText().isEmpty()
|| login_password.getText().isEmpty()) {
alert.errorMessage("Please fill all blank fields"); } else {
String selectData = "SELECT * FROM users WHERE username = ? AND
password = ?"; connect = Database.connectDB(); String role = ""; try {
prepare = connect.prepareStatement(selectData);
prepare.setString(1, login_username.getText());
prepare.setString(2, hashPassword(login_password.getText()));
result = prepare.executeQuery(); if (result.next()) {
role = result.getString("role"); System.out.println(role); - File:
UniversitiyManagementSystem/src/universitiymanagementsystem/ListData.jav a • Lớp: ListData
• Số dòng: 59 | Số phương thức: 0 | Số trường: 0 • Đoạn mã minh họa: /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor. lOMoAR cPSD| 60755984 */
package universitiymanagementsystem; import java.sql.Date; /** * * @author WINDOWS 10 */ public class ListData {
public static String admin_username;
public static String teacher_username;
public static String student_username;
public static String[] role = {"Admin", "Teacher", "Student"};
public static String[] year = {"1st year", "2nd Year", "3rd Year", "4th
Year"}; public static String[] course = {"BSCS", "BSIT", "BS"};
public static String[] section = {"A", "B", "C", "D", "E"}; public
static String[] paymentStatus = {"Paid", "Pending"}; lOMoAR cPSD| 60755984 - File:
UniversitiyManagementSystem/src/universitiymanagementsystem/SalaryData. java • Lớp: SalaryData
• Số dòng: 63 | Số phương thức: 7 | Số trường: 7
• Các phương thức tiêu biểu: getId, getTeacherID, getName, getSalaryPerDay,
getTotalDays, getSalaryPaid, getDatePaid
• Thuộc tính nổi bật: id, teacherID, name, salaryPerDay, totalDays, salaryPaid, datePaid • Đoạn mã minh họa: /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor. */
package universitiymanagementsystem; import java.sql.Date; /** * * @author WINDOWS 10 */ public class SalaryData { private Integer id; private String teacherID; private String name; private Double salaryPerDay; private Integer totalDays; private Double salaryPaid; private Date datePaid;
public SalaryData(Integer id, String teacherID, String name, Double salaryPerDay,
Integer totalDays, Double salaryPaid, Date datePaid) {
this.id = id; this.teacherID = teacherID; this.name = name;
this.salaryPerDay = salaryPerDay; this.totalDays = totalDays;
UniversitiyManagementSystem/src/universitiymanagementsystem/StudentDat a.java • Lớp: StudentData lOMoAR cPSD| 60755984 - File:
• Số dòng: 149 | Số phương thức: 16 | Số trường: 16
• Các phương thức tiêu biểu: getId, getStudentID, getFullName, getGender,
getBirthDate, getYear, getCourse, getSemester, getSection, getPayment, getStatusPayment, getImage...
• Thuộc tính nổi bật: id, studentID, fullName, gender, birthDate, year, course,
section, payment, statusPayment, image, dateInsert... • Đoạn mã minh họa: /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor. */
package universitiymanagementsystem; import java.sql.Date; /** * * @author WINDOWS 10 */ public class StudentData { private Integer id; private String studentID; private String fullName; private String gender; private Date birthDate; private String year; private String course; private String section; private Double payment; private String statusPayment; private String image; private Date dateInsert; private Date dateUpdate; private Date dateDelete; private String status;
UniversitiyManagementSystem/src/universitiymanagementsystem/StudentMai nFormController.java
• Lớp: StudentMainFormController
• Số dòng: 217 | Số phương thức: 6 | Số trường: 15