Hệ thống Đăng Ký Tín Chỉ là một ứng dụng desktop Java toàn diện được xây dựng nhằm quản lý quy trình đăng ký tín chỉ của sinh viên. Dự án này áp dụng các nguyên tắc lập trình hướng đối tượng (OOP), mô hình kiến trúc Model-View-Controller (MVC) hiện đại, và các design patterns chuẩn trong Java.
Giao diện: JavaFX 25 - Ứng dụng desktop modern với UI responsive
Cơ sở dữ liệu: MySQL 8.0 với JDBC connectivity
Kiến trúc: Service Layer + Repository Pattern (3-tier architecture)
Tính năng chính: Quản lý đăng ký tín chỉ, kiểm tra ràng buộc lịch học, ngăn chặn trùng môn
- Tính Năng Chính
- Yêu Cầu Hệ Thống
- Công Nghệ Sử Dụng
- Cấu Trúc Dự Án
- Cài Đặt & Setup
- Cấu Hình Database
- Chạy Ứng Dụng
- Hướng Dẫn Sử Dụng
- API & Tính Năng
- Troubleshooting
- Nguyên Tắc Thiết Kế
- Đóng Góp & Phân Công
- Tài Liệu & Resources
- Giấy Phép
- ✅ Xem danh sách lớp học phần khả dụng trong kỳ hiện tại
- ✅ Đăng ký môn học với giao diện thân thiện
- ✅ Xem thông tin chi tiết: giảng viên, số tín chỉ, lịch học, sĩ số
- ✅ Kiểm tra real-time các ràng buộc:
- Không trùng môn học (mỗi sinh viên chỉ đăng ký một lớp cho cùng một môn)
- Không trùng lịch học (không chọn 2 lớp có cùng thứ/tiết/khoảng thời gian)
- Không đăng ký lớp đã đầy (kiểm tra max_capacity)
- 👤 Thông tin sinh viên: Họ tên, MSSV, lớp, ngành, khoa
- 📅 Lịch học từng tuần
- 📊 Số tín chỉ đã đăng ký
- ❌ Hủy đăng ký môn học
- 📋 Xem danh sách lớp đã đăng ký
- 🔍 Tìm kiếm và lọc
- ➕ Tạo lớp học phần mới
- 📝 Chỉnh sửa thông tin lớp
- 🗑️ Xóa lớp học phần
- 📊 Xem danh sách tất cả lớp
- 📅 Thêm lịch học cố định
- 🚨 Hệ thống tự động phát hiện trùng lịch phòng học
⚠️ Thông báo lỗi nếu trùng
- 👥 Xem danh sách tất cả đăng ký
- 📝 Chỉnh sửa thông tin đăng ký
- 🗑️ Xóa đăng ký
- 📊 Theo dõi sĩ số
- 🔑 Đăng nhập bằng username/password
- 👤 Phân quyền: Student, Admin, Faculty
- 🔒 Mã hóa password
- 🚪 Đăng xuất an toàn
- 💾 RAM: Tối thiểu 2GB (khuyến nghị 4GB+)
- 💿 Ổ cứng: 500MB trống
- 🖥️ CPU: Dual-core, 1.5GHz trở lên
- Java JDK 21: https://www.oracle.com/java/technologies/downloads/
- JavaFX SDK 25: https://gluonhq.com/products/javafx/
- MySQL Server 8.0+: https://dev.mysql.com/downloads/mysql/
- MySQL Connector/J 8.0.33+: https://dev.mysql.com/downloads/connector/j/
- IDE: IntelliJ IDEA / Eclipse / VS Code
- Optional: Scene Builder, MySQL Workbench
java -version
javac -version| Lĩnh Vực | Công Nghệ | Phiên Bản | Mục Đích |
|---|---|---|---|
| Backend | Java | 21 | Ngôn ngữ chính |
| GUI | JavaFX | 25 | Giao diện desktop |
| UI Markup | FXML | 25 | Layout giao diện |
| Styling | CSS | 3 | Thiết kế UI |
| Database | MySQL | 8.0 | Lưu trữ dữ liệu |
| JDBC Driver | MySQL Connector/J | 8.0.33 | Kết nối Java-MySQL |
| Architecture | MVC + Service Layer | - | Tổ chức code |
| Pattern | Repository | - | Data Access |
| Version Control | Git | - | Quản lý source |
java-oop-ptit/
├── 📄 README.md # Hướng dẫn này
├── 📄 LICENSE # Giấy phép MIT
├── .env # Cấu hình database
│
├── 📁 docs/ # Tài liệu
│ ├── PROJECT_STRUCTURE.md # Chi tiết kiến trúc
│ ├── mysql_schema.sql # Database schema
│ ├── insert_data.sql # Dữ liệu mẫu
│ └── dbml.md # Database diagram
│
├── 📁 lib/ # Thư viện
│ └── mysql-connector-j-8.0.33.jar # JDBC Driver
│
├── 📁 src/main/
│ ├── 📁 java/
│ │ ├── config/
│ │ │ └── DatabaseConnection.java
│ │ ├── model/ # Entity classes
│ │ ├── repository/ # Data Access
│ │ ├── service/ # Business Logic Interfaces
│ │ ├── service/impl/ # Implementations
│ │ ├── controller/ # UI Controllers
│ │ ├── view/ # View Managers
│ │ ├── utils/ # Utilities
│ │ ├── test/ # Test cases
│ │ └── Main.java # Entry Point
│ └── 📁 resources/
│ ├── fxml/ # FXML layouts
│ ├── css/ # Stylesheets
│ └── assets/ # Images, fonts
│
└── 📁 target/ # Build output
┌─────────────────────────────────────────────────────┐
│ Presentation Layer (Controllers + FXML + CSS) │
└────────────────────┬────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ Business Logic Layer (Services) │
│ • Validation │
│ • Schedule Conflict Detection │
│ • Duplicate Registration Prevention │
└────────────────────┬────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ Data Access Layer (Repositories) │
│ • JDBC Queries │
│ • CRUD Operations │
└────────────────────┬────────────────────────────────┘
↓
┌───────────────────────┐
│ Model/Entity │
│ (POJO Classes) │
└───────────┬───────────┘
↓
┌───────────────────────┐
│ MySQL Database │
└───────────────────────┘
git clone https://github.com/HungNguyenBa1811/java-oop-ptit.git
cd java-oop-ptitWindows:
- Download từ: https://www.oracle.com/java/technologies/downloads/
- Chạy installer
- Kiểm tra:
java -version
Linux (Ubuntu):
sudo apt update
sudo apt install openjdk-21-jdk
java -versionmacOS:
brew install openjdk@21
java -versionOption A (IntelliJ IDEA - Recommended):
- File → Project Structure → Libraries
- Chọn "+" → Add Java → Chọn JavaFX folder
- Apply
Option B (Manual):
- Download từ: https://gluonhq.com/products/javafx/
- Giải nén vào:
lib/javafx-sdk-25/
Windows:
- Download từ: https://dev.mysql.com/downloads/mysql/
- Chạy installer
- Chọn port: 3306
Linux:
sudo apt install mysql-server
sudo mysql_secure_installation
sudo systemctl start mysqlmacOS:
brew install mysql
mysql.server startTạo file .env trong thư mục root:
DB_HOST=localhost
DB_PORT=3306
DB_NAME=course_registration_db
DB_USER=root
DB_PASSWORD=your_password
DB_DRIVER=com.mysql.cj.jdbc.Drivermysql -u root -pCREATE DATABASE course_registration_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE course_registration_db;mysql -u root -p course_registration_db < docs/mysql_schema.sqlmysql -u root -p course_registration_db < docs/insert_data.sqlSHOW TABLES;
SELECT * FROM users LIMIT 5;
SELECT * FROM students LIMIT 5;Admin:
- Username: admin
- Password: admin123
Student:
- Username: student1
- Password: student123
- ID: SV001
- Mở project: File → Open
- Navigate:
src/main/java/Main.java - Right-click → Run 'Main.main()'
- Hoặc nhấn
Shift + F10
- Cài Extension: "Extension Pack for Java"
- Click "Run" button trên Main.java
- Hoặc nhấn
Ctrl + F5
$JAVAFX_PATH = "lib\javafx-sdk-25\lib"
javac --module-path $JAVAFX_PATH --add-modules javafx.controls,javafx.fxml `
-d bin -cp "lib\*" src\main\java\**\*.java
java --module-path $JAVAFX_PATH --add-modules javafx.controls,javafx.fxml `
-cp "bin;lib\*" MainJAVAFX_PATH="lib/javafx-sdk-25/lib"
javac --module-path $JAVAFX_PATH --add-modules javafx.controls,javafx.fxml \
-d bin -cp "lib/*" src/main/java/**/*.java
java --module-path $JAVAFX_PATH --add-modules javafx.controls,javafx.fxml \
-cp "bin:lib/*" Main- Khởi động ứng dụng
- Chọn role: Student hoặc Admin
- Nhập Username & Password
- Nhấn "Đăng nhập"
- Chọn tab "Đăng Ký Tín Chỉ"
- Xem danh sách lớp học phần
- Nhấn "Đăng Ký" cho lớp mong muốn
- Hệ thống kiểm tra:
- ✅ Không trùng môn?
- ✅ Không trùng lịch?
- ✅ Lớp còn chỗ?
- Nếu hợp lệ → Đăng ký thành công
- Nếu không → Hiển thị lý do từ chối
- Chọn tab "Lịch Học"
- Xem các lớp đã đăng ký
- Thông tin: Ngày, thứ, tiết, phòng, giảng viên
- Chọn tab "Đăng Ký Của Tôi"
- Chọn lớp cần hủy
- Nhấn "Hủy Đăng Ký"
- Xác nhận → Hủy thành công
- Chọn "Quản Lý Lớp Học Phần"
- Nhấn "Tạo Lớp Mới"
- Điền thông tin:
- Chọn Môn Học
- Chọn Giảng Viên
- Nhập Số Tín Chỉ
- Chọn Học Kỳ
- Thêm Lịch Học:
- Chọn Phòng Học
- Chọn Ngày/Thứ
- Nhập Tiết
- Hệ thống kiểm tra trùng lịch phòng
- Nhấn "Lưu"
- Chọn "Quản Lý Đăng Ký"
- Xem danh sách tất cả đăng ký
- Sửa, xóa, hoặc xuất báo cáo
studentService.registerCourse(studentId, courseOfferingId);
studentService.cancelRegistration(registrationId);
studentService.getMyRegistrations(studentId);
studentService.getSchedule(studentId);courseOfferingService.createCourseOffering(offering); // ⭐ Schedule conflict check
courseOfferingService.updateCourseOffering(offering);
courseOfferingService.deleteCourseOffering(offeringId);registrationService.register(registration); // ⭐ Duplicate check
registrationService.cancelRegistration(registrationId);
registrationService.isDuplicateRegistration(studentId, courseId);Location: CourseOfferingRepository.checkScheduleConflict()
Kiểm tra: Same room + Same semester + Same day + Time overlap
Location: RegistrationServiceImpl.register()
Kiểm tra: Sinh viên không đăng ký cùng một môn 2 lần
- Kiểm tra MySQL Server đang chạy
- Kiểm tra
.envconfig - Kiểm tra database tồn tại
- Đảm bảo
mysql-connector-j-8.0.33.jartronglib/ - Add library vào project (IDE)
- Cài JavaFX SDK
- Thêm module-path VM options
- Kiểm tra file nằm trong
resources/fxml/ - Kiểm tra đường dẫn có "/" ở đầu
- Clean & rebuild project
- Kiểm tra classpath
MODEL → REPOSITORY → SERVICE → CONTROLLER
- MVC: Model-View-Controller
- Repository: Data Access abstraction
- Service Layer: Business logic
- Singleton: DatabaseConnection
- S: Mỗi class có 1 trách nhiệm
- O: Mở để mở rộng, đóng để sửa
- L: Liskov Substitution (inheritance)
- I: Interface Segregation
- D: Dependency Inversion
✅ Clean Code - Đặt tên rõ ràng
✅ Error Handling - Try-catch
✅ Validation - Service layer
✅ DRY - Không lặp code
✅ Transactions - Safe operations
| STT | Thành Viên | Vai Trò | Contact |
|---|---|---|---|
| 1️⃣ | Vũ Hoàng Anh | 👑 CO-Leader + Backend Leader + Backend Dev | anhvh189@gmail.com |
| 2️⃣ | Phan Nguyễn Việt Dũng | 🔧 Backend Dev + Frontend Dev | phannguyenvietdung@gmail.com |
| 3️⃣ | Nguyễn Bá Hùng | 👑 CO-Leader + Frontend Leader + Frontend Dev | hungba1811@gmail.com |
| 4️⃣ | Lê Duy Anh | 🎨 Frontend + UI | duyanhle9c1@gmail.com |
| 5️⃣ | Nguyễn Trung Nam | 🔧 Fronted Dev + Backend Dev | Trungnam0708qwert@gmail.com |
Quy Trình Contribute:
- Fork repository
- Tạo branch:
git checkout -b feature/name - Commit:
git commit -m "Add feature" - Push:
git push origin feature/name - Mở Pull Request
Dự án này được cấp phép theo Giấy phép MIT.
Bạn được phép:
- ✅ Sử dụng cho mục đích thương mại & cá nhân
- ✅ Sửa đổi & phân phối lại
- ✅ Sử dụng là phần của project khác
Điều kiện:
⚠️ Phải kèm bản copy của license⚠️ Phải công nhân các thay đổi⚠️ Không có warranty
Chi tiết: Xem file LICENSE
- GitHub Issues: Report bugs
- Discussions: Ask questions
- Email: hungba1811@gmail.com
Dự án được tạo ra nhằm:
- 📖 Học tập OOP
- 🏗️ Kiến trúc phần mềm
- 🗄️ Quản lý Database
- 🎨 UI Development
- 📊 Real-world Features
Khuyến khích:
- 🔍 Khám phá code từng layer
- 🧪 Viết test cases
- 🐛 Debug & trace
- 📝 Thêm comments
- ⭐ Optimize code
Status: ✅ Active Development | 🎯 Production Ready