chương 1, chúng ta có cái nhìn rõ ràng hơn về cách mà một hệ thống quản lý ký túc xá hiện đại có thể góp phần vào việc cải thiện hiệu quả quản lý và mang lại lợi ích thiết thực cho người dùng. Những chương tiếp theo sẽ đi sâu vào các chi tiết kỹ thuật và cụ thể hơn, như thiết kế cơ sở dữ liệu, xây dựng giao diện người dùng và các phương pháp đảm bảo tính bảo mật cho hệ thống. 7 CHƯƠNG 2 MÔ HÌNH HỆ HỆ THỐNG 1 Mô hình chức năng 2. Thiết kế mô hình lớp Lớp Quản lý sinh viên Lớp Quản lý sinh viên chịu trách nhiệm quản lý và xử lý thông tin liên quan đến sinh viên, chẳng hạn như thông tin cá nhân, danh sách sinh viên và cập nhật thông tin sinh viên.
Lớp này cần các phương thức để thêm, xóa, sửa và tìm kiếm sinh viên. - Thuộc tính: - Danh sách sinh viên: Lưu trữ thông tin của tất cả sinh viên trong ký túc xá. 8 - Phương thức: - `themSinhVien()`: Thêm sinh viên mới vào danh sách. - `xoaSinhVien()`: Xóa sinh viên khỏi danh sách.
- `capNhatSinhVien()`: Cập nhật thông tin sinh viên. - `timKiemSinhVien()`: Tìm kiếm sinh viên dựa trên mã số hoặc tên. - Tính đóng gói: Thông tin sinh viên như mã số, tên, ngày sinh, địa chỉ sẽ được đóng gói trong lớp này để bảo mật, và chỉ có thể truy cập thông qua các phương thức. - Kế thừa: Nếu cần, lớp quản lý sinh viên có thể kế thừa từ một lớp cha như "Người" để dùng chung các thuộc tính về thông tin cá nhân.
Lớp Quản lý phòng Lớp Quản lý phòng chịu trách nhiệm quản lý thông tin về các phòng trong ký túc xá, bao gồm số phòng, số lượng sinh viên tối đa và tình trạng phòng (đã đầy, còn trống). - Thuộc tính: - Danh sách phòng: Danh sách chứa thông tin về tất cả các phòng. - Phương thức: - `themPhong()`: Thêm một phòng mới vào danh sách. - `xoaPhong()`: Xóa một phòng khỏi danh sách.
9 - `capNhatPhong()`: Cập nhật thông tin phòng, như số lượng sinh viên hiện tại. - `timKiemPhong()`: Tìm kiếm phòng dựa trên số phòng hoặc tình trạng. - Tính đa hình: Lớp này có thể được mở rộng để quản lý nhiều loại phòng khác nhau như phòng đơn, phòng đôi, với các phương thức được ghi đè. Lớp Quản lý tiền phòng Lớp Quản lý tiền phòng chịu trách nhiệm tính toán và quản lý các khoản thu liên quan đến tiền thuê phòng của sinh viên.
Lớp này cần các phương thức để ghi nhận các khoản đã thu, còn thiếu và nhắc nhở sinh viên đóng tiền. - Thuộc tính: - Danh sách thanh toán: Danh sách chứa thông tin về các khoản tiền mà sinh viên cần trả. - Phương thức: - `tinhTienPhong()`: Tính toán số tiền phòng dựa trên số ngày ở. - `ghiNhanThanhToan()`: Cập nhật trạng thái thanh toán của sinh viên.
- `thongBaoNo()`: Gửi thông báo cho những sinh viên chưa thanh toán. - Tính kế thừa: Có thể kế thừa từ lớp "Quản lý tài chính" nếu hệ thống có thêm các chức năng tài chính khác, giúp chia sẻ các phương thức chung như tính toán và quản lý thu chi. Mô hình kiến trúc hệ thống các lớp trong phát triển phần mềm 10 Mô hình kiến trúc hệ thống các lớp thường được sử dụng trong phát triển phần mềm hướng đối tượng, giúp tổ chức mã nguồn một cách hiệu quả, rõ ràng và dễ bảo trì. Các lớp trong hệ thống có thể được chia thành nhiều tầng (layers) hoặc thành phần (components) tùy theo yêu cầu và kiến trúc của dự án.
Một trong các mô hình phổ biến là mô hình 3 lớp (3-tier architecture) hoặc mô hình nhiều lớp (multi-tier architecture). Các tầng chính trong mô hình kiến trúc lớp Mô hình kiến trúc các lớp thường được tổ chức theo nhiều tầng (layers), với mỗi tầng có trách nhiệm riêng biệt. Dưới đây là một số tầng phổ biến: Tầng trình diễn (Presentation Layer): - Tầng này còn được gọi là tầng giao diện người dùng (UI Layer). - Nó chịu trách nhiệm về việc hiển thị thông tin cho người dùng và xử lý tương tác từ người dùng.
Giao diện có thể là web, desktop, hoặc ứng dụng di động. - Các thành phần trong tầng này có thể bao gồm các View, Form, Controller trong kiến trúc MVC (Model-View-Controller). Tầng nghiệp vụ (Business Logic Layer - BLL): 11 - Tầng này còn được gọi là tầng dịch vụ (Service Layer). - Nó chịu trách nhiệm xử lý các logic nghiệp vụ của ứng dụng, bao gồm các quy tắc, thuật toán, và xử lý luồng công việc.
- Các lớp như `PhongLG`, `SinhVienLG` trong ví dụ của bạn nằm ở tầng này. Các lớp này sẽ tương tác với tầng dữ liệu để lấy thông tin cần thiết, xử lý nghiệp vụ và gửi dữ liệu lại cho tầng trình diễn. Tầng dữ liệu (Data Access Layer - DAL): - Tầng này chịu trách nhiệm tương tác với cơ sở dữ liệu hoặc các nguồn lưu trữ dữ liệu khác (ví dụ: file, API, v. - Nó chứa các lớp và phương thức để thực hiện các thao tác CRUD (Create, Read, Update, Delete) trên cơ sở dữ liệu.
- Các lớp repository như `IPhong`, `ISinhVien` sẽ được sử dụng để truy vấn và thao tác với dữ liệu. Lợi ích của mô hình kiến trúc lớp Tính mô-đun hóa: Hệ thống được chia thành nhiều tầng, mỗi tầng có trách nhiệm riêng biệt. Điều này giúp cho hệ thống dễ bảo trì, nâng cấp và mở rộng. Tái sử dụng: Các lớp có thể được tái sử dụng ở nhiều nơi khác nhau.
Ví dụ, tầng dữ liệu có thể được tái sử dụng bởi nhiều tầng logic nghiệp vụ khác nhau. 12 Tính độc lập: Mỗi tầng có thể hoạt động độc lập với tầng khác. Nếu có thay đổi ở tầng giao diện, nó không ảnh hưởng đến tầng nghiệp vụ hoặc tầng dữ liệu. Dễ bảo trì: Khi hệ thống được chia thành các tầng, việc bảo trì sẽ dễ dàng hơn.
Các thay đổi sẽ được cô lập trong tầng tương ứng mà không ảnh hưởng đến toàn bộ hệ thống. Mô hình Repository và Dependency Injection Mô hình repository (repository pattern) và cơ chế Dependency Injection (DI) thường được sử dụng cùng với mô hình nhiều lớp để đảm bảo tính linh hoạt và dễ bảo trì của hệ thống: Mô hình Repository: - Mỗi đối tượng của hệ thống thường có một lớp repository riêng để thao tác với cơ sở dữ liệu. Ví dụ, `PhongLG` có `IPhong`, `SinhVienLG` có `ISinhVien`. Các lớp này cung cấp một lớp trừu tượng (abstraction) giữa tầng nghiệp vụ và tầng dữ liệu.
- Nó giúp ẩn đi các chi tiết về cách thức truy xuất dữ liệu và cho phép dễ dàng thay đổi cách truy vấn hoặc nguồn dữ liệu mà không ảnh hưởng đến các tầng khác. Dependency Injection (DI): 13 - DI là một kỹ thuật để giảm sự phụ thuộc cứng (hard dependencies) giữa các lớp, bằng cách cung cấp (inject) các đối tượng phụ thuộc từ bên ngoài thông qua constructor hoặc setter. - Ví dụ, trong `PhongLG`, thay vì khởi tạo trực tiếp `IPhong`, nó được truyền vào từ bên ngoài (qua constructor), giúp dễ dàng thay thế khi cần (ví dụ: dùng `Mock` trong kiểm thử). Ví dụ kiến trúc 3 lớp Giả sử ta có hệ thống quản lý sinh viên với các lớp sau: Tầng trình diễn: - `SinhVienController`: Chịu trách nhiệm nhận yêu cầu từ người dùng, gọi đến tầng logic nghiệp vụ và trả kết quả về cho người dùng (thường qua giao diện web).
Tầng nghiệp vụ: `SinhVienLG`: Chứa logic xử lý liên quan đến sinh viên như thêm sinh viên, cập nhật, xóa, và tìm kiếm sinh viên. Tầng dữ liệu: - `SinhVienRepository`: Thực hiện các thao tác với cơ sở dữ liệu như truy xuất, lưu trữ, cập nhật và xóa sinh viên. Cơ sở dữ liệu Tổng quan về cơ sở dữ liệu trong bài 14 Cơ sở dữ liệu này được thiết kế để quản lý thông tin về ký túc xá, sinh viên, phòng ở, dịch vụ và tiền phòng. Dưới đây là các thành phần chính của cơ sở dữ liệu và cách chúng hoạt động với nhau: 1.
Cơ sở dữ liệu: QL_KyTucXa Cơ sở dữ liệu này chứa thông tin về các sinh viên, phòng ký túc xá, các dịch vụ mà sinh viên có thể sử dụng, và các giao dịch tiền phòng. Bảng Sinh viên (sinhvien) - Mục đích: Lưu trữ thông tin cá nhân của các sinh viên đang cư trú trong ký túc xá. - Các cột: - `id`: Mã định danh duy nhất của mỗi sinh viên (khóa chính). - `tenSinhVien`: Tên của sinh viên.
- `diaChi`: Địa chỉ của sinh viên. - `soDienThoai`: Số điện thoại liên hệ của sinh viên. sql CREATE TABLE sinhvien ( id VARCHAR(50) PRIMARY KEY, 15 tenSinhVien VARCHAR(100) NOT NULL, diaChi VARCHAR(255), soDienThoai VARCHAR(20) ); 3. Bảng Phòng (phong) - Mục đích: Lưu trữ thông tin về phòng ở của sinh viên.
- Các cột: - `id`: Mã định danh duy nhất cho mỗi phòng (khóa chính). - `idPhong`: Mã phòng (có thể đại diện cho số phòng hoặc tên phòng). - `idSinhVien`: Mã sinh viên đang ở phòng đó (khóa ngoại tham chiếu đến bảng `sinhvien`). - `ngayVao`: Ngày sinh viên bắt đầu ở trong phòng.
- `ngayRa`: Ngày sinh viên rời phòng (có thể để trống nếu sinh viên vẫn đang ở). sql CREATE TABLE phong ( 16 id VARCHAR(50) PRIMARY KEY, idPhong VARCHAR(50) NOT NULL, idSinhVien VARCHAR(50) NOT NULL, ngayVao DATE NOT NULL, ngayRa DATE, FOREIGN KEY (idSinhVien) REFERENCES sinhvien(id) ); 4. Bảng Dịch vụ (dichvu) - Mục đích: Lưu trữ các dịch vụ mà sinh viên có thể sử dụng trong ký túc xá. - Các cột: - `id`: Mã dịch vụ (khóa chính).
- `tenDichVu`: Tên dịch vụ (ví dụ: dọn phòng, giặt đồ, điện, nước uống, v. - `giaTien`: Giá tiền của dịch vụ. sql 17 CREATE TABLE dichvu ( id VARCHAR(50) PRIMARY KEY, tenDichVu VARCHAR(100) NOT NULL, giaTien INT NOT NULL ); 5. Bảng Tiền phòng (tienphong) - Mục đích: Lưu trữ thông tin về các giao dịch thanh toán tiền phòng và dịch vụ mà sinh viên đã sử dụng.
- Các cột: - `id`: Mã giao dịch thanh toán (khóa chính). - `idPhong`: Mã phòng (khóa ngoại tham chiếu đến bảng `phong`). - `idSinhVien`: Mã sinh viên (khóa ngoại tham chiếu đến bảng `sinhvien`). - `idDichVu`: Mã dịch vụ mà sinh viên sử dụng (khóa ngoại tham chiếu đến bảng `dichvu`).
- `giaTien`: Số tiền phải thanh toán. - `ngayThanhToan`: Ngày sinh viên thanh toán. 18 sql CREATE TABLE tienphong ( id VARCHAR(50) PRIMARY KEY, idPhong VARCHAR(50) NOT NULL, idSinhVien VARCHAR(50) NOT NULL, idDichVu VARCHAR(50) NOT NULL, giaTien INT NOT NULL, ngayThanhToan DATE NOT NULL, FOREIGN KEY (idPhong) REFERENCES phong(id), FOREIGN KEY (idSinhVien) REFERENCES sinhvien(id), FOREIGN KEY (idDichVu) REFERENCES dichvu(id) ); 19 6. Thêm dữ liệu mẫu vào các bảng Các câu lệnh `INSERT INTO` được sử dụng để thêm dữ liệu mẫu vào các bảng `sinhvien`, `phong`, `dichvu` và `tienphong`.
Ví dụ, thêm sinh viên vào bảng `sinhvien`: sql INSERT INTO sinhvien (id, tenSinhVien, diaChi, soDienThoai) VALUES ('SV001', 'Nguyen Van A', '123 Le Loi, TP.