Giới thiệu dự án

Chuyển đổi số trong quản lý giáo dục và cơ sở vật chất đại học đang là xu hướng tất yếu. Theo các báo cáo khảo sát về hạ tầng công nghệ thông tin (CNTT) trong các trường đại học tại Việt Nam, hơn 65% các quy trình tác nghiệp thủ công truyền thống đang dần được thay thế bằng các nền tảng web ứng dụng tập trung. Tại Trường Đại học Sư phạm Kỹ thuật – Đại học Đà Nẵng (ĐH SPKT), công tác quản lý ký túc xá (KTX) trước đây chủ yếu thực hiện qua biểu mẫu giấy hoặc biểu mẫu trực tuyến rời rạc (Google Forms) trong giai đoạn dịch Covid-19, dẫn đến tình trạng phân mảnh dữ liệu, thất lạc hồ sơ và tiêu tốn nhiều thời gian xử lý thủ công.

Vấn đề cốt lõi đặt ra là sự thiếu hụt một hệ thống tích hợp thời gian thực (real-time integrated system) có khả năng đồng bộ hóa toàn bộ quy trình: từ đăng ký tạm trú, duyệt phòng, quản lý nhân sự, kiểm soát tài sản, cho đến tính toán hóa đơn điện nước và xuất biên lai thu tiền. Quy trình cũ bộc lộ nhiều điểm nghẽn (bottlenecks) như: sai lệch thông tin sinh viên, thiếu minh bạch trong theo dõi tình trạng phòng trống, và độ trễ báo cáo tài chính kéo dài từ 5 đến 7 ngày làm việc.

Đồ án tốt nghiệp "Xây dựng hệ thống website quản lý ký túc xá trường Đại học Sư phạm Kỹ thuật" (thực hiện bởi sinh viên Đỗ Ngọc Quang Huy, hướng dẫn bởi ThS. Đỗ Phú Huy, năm 2022) được triển khai nhằm giải quyết triệt để các hạn chế trên. Dự án xác định 4 mục tiêu kỹ thuật và nghiệp vụ cụ thể:

  1. Tin học hóa 100% quy trình đăng ký tạm trú và xét duyệt sinh viên nội trú trên giao diện web trực quan.
  2. Thiết kế và tối ưu hóa hệ thống quản lý cơ sở dữ liệu (CSDL) phòng ở, khu nhà, trang thiết bị và trạng thái lưu trú theo thời gian thực.
  3. Tự động hóa công thức tính toán và lập hóa đơn điện nước, biên lai thu phí định kỳ theo từng phòng.
  4. Đảm bảo tính sẵn sàng cao, phân quyền chặt chẽ giữa Ban quản lý (Admin/Nhân viên) và Sinh viên với thời gian phản hồi hệ thống dưới 200ms.

Giải pháp công nghệ được lựa chọn là mô hình kiến trúc phân tách Client-Server hiện đại, bao gồm: Angular (Front-end Framework phát triển bởi Google), Node.js kết hợp Express.js (Back-end Runtime Environment & Framework), cùng hệ quản trị cơ sở dữ liệu NoSQL MongoDB. Phạm vi áp dụng của hệ thống tập trung trực tiếp vào toàn bộ khu nội trú KTX Trường ĐH SPKT – Đại học Đà Nẵng.


Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Trước khi triển khai, đồ án đã tiến hành đánh giá chi tiết các phương án quản lý hiện hành nhằm xác định khoảng cách công nghệ (gap analysis).

Tiêu chí đánh giá Quản lý thủ công (Giấy/Excel) Google Forms rời rạc Hệ thống Website đề xuất (Angular + Node.js + MongoDB)
Tính toàn vẹn dữ liệu Kém (dễ mất mát, trùng lặp) Trung bình (thiếu ràng buộc dữ liệu) Cao (ràng buộc Schema qua Mongoose, kiểm soát Validation)
Tốc độ tra cứu phòng 15 - 30 phút/hồ sơ 5 - 10 phút/bản ghi < 1 giây (Dynamic search, Indexing NoSQL)
Tính tương tác người dùng Không có tương tác trực tuyến Tương tác 1 chiều (chỉ gửi form) Hai chiều (Single Page Application, phản hồi tức thì)
Quản lý tài chính/Thiết bị Tính toán Excel rời rạc Không hỗ trợ Tự động hóa lập hóa đơn, quản lý chi tiết thiết bị/phòng
Khả năng mở rộng (Scale) Rất thấp Thấp Rất cao (Horizontal Scalability với MongoDB Cluster)

Hệ thống phân loại yêu cầu người dùng theo mô hình MoSCoW:

  • Must Have: Đăng nhập/Xác thực tài khoản; Xem danh sách phòng trống; Đăng ký tạm trú online; Duyệt/Từ chối hồ sơ đăng ký; Lập và in hóa đơn điện nước, biên lai thu tiền.
  • Should Have: Quản lý trang thiết bị theo từng phòng; Cập nhật thông báo ký túc xá; Thống kê số lượng sinh viên đang ở theo kỳ/năm học.
  • Could Have: Đổi mật khẩu cá nhân; Lọc danh sách sinh viên nâng cao theo chuyên ngành/khóa học.
  • Won't Have (Giai đoạn 1): Tích hợp cổng thanh toán trực tuyến (VNPay/MoMo); Đọc chỉ số công tơ điện tự động qua IoT.

Thiết kế hệ thống

Kiến trúc hệ thống được xây dựng theo mô hình 3 tầng (3-Tier Architecture):

+-------------------------------------------------------------------+
|               CLIENT LAYER (Angular 9+ SPA)                      |
|  - Components & Directives     - RxJS Observables / HttpClient    |
|  - Bootstrap Responsive UI     - Angular Router & Route Guards   |
+---------------------------------+---------------------------------+
                                  | HTTP/RESTful APIs (JSON)
                                  v
+-------------------------------------------------------------------+
|               APPLICATION LAYER (Node.js & Express.js)           |
|  - Routing Middleware          - JWT Authentication / RBAC        |
|  - Business Logic Controllers  - Data Validation Layer           |
+---------------------------------+---------------------------------+
                                  | Mongoose ODM Driver
                                  v
+-------------------------------------------------------------------+
|               DATABASE LAYER (MongoDB Document Database)          |
|  - Collections: SinhVien, Phong, HoaDonDienNuoc, BienLai, etc.    |
|  - BSON Storage & Memory Caching - High-Performance Indexing     |
+-------------------------------------------------------------------+

Hệ thống công nghệ bao gồm:

  • Front-end: Angular 9.x, TypeScript 3.8, RxJS 6.5, Bootstrap 4.6 (thiết kế Responsive thích ứng mọi kích thước màn hình).
  • Back-end: Node.js v16.x LTS với V8 JavaScript Engine, Express.js 4.17 REST API framework.
  • Database: MongoDB 5.0 Community Server, giao tiếp qua Mongoose ODM.

Cơ sở dữ liệu NoSQL được chuẩn hóa qua các Collection chính:

  1. SinhVien: Lưu trữ SinhVienID, PhongID, HoTen, GioiTinh, NgaySinh, SDT, CMND, MaSV, Lop, Khoa, DiaChi, HoTenNguoiThan, SDTNguoiThan, TrangThai.
  2. Phong: Lưu trữ PhongID, KhuID, TenPhong, SoluongChua (mặc định 8), SoLuongDangO (mặc định 0), TinhTrang.
  3. HoaDonDienNuoc: Lưu trữ HoaDonDienNuocID, NhanVienID, PhongID, ChiSoDienDauKy, ChiSoDienCuoiKy, DonGiaDien, ChiSoNuocDauKy, ChiSoNuocCuoiKy, DonGiaNuoc, TongTien, NgayLap.
  4. BienLaiThuTien: Lưu trữ BienLaiThuTienID, NhanVienID, SinhVienID, Hocky, NamHoc, TongTien, NgayLap.
  5. NhanVien, Khu, ThietBi, TaiKhoan, ThongBao.

Thiết kế RESTful API endpoints tiêu biểu:

  • POST /api/auth/login: Xác thực quản trị viên và sinh viên.
  • GET /api/phong/danh-sach-trong: Truy vấn các phòng có SoLuongDangO < SoluongChua.
  • POST /api/dang-ky-tam-tru: Tiếp nhận form đăng ký tạm trú từ sinh viên.
  • PUT /api/sinh-vien/duyet/:id: Duyệt sinh viên vào phòng, tự động tăng SoLuongDangO của phòng tương ứng.
  • POST /api/hoa-don/dien-nuoc: Tính toán và khởi tạo hóa đơn chi phí phòng.

Methodology

Dự án áp dụng mô hình phát triển phần mềm lặp Agile/Scrum rút gọn với 5 giai đoạn triển khai:

  • Sprint 1 (Tuần 1-3): Khảo sát thực tế tại KTX ĐH SPKT, thu thập biểu mẫu giấy, phân tích Usecase và thiết kế Schema MongoDB.
  • Sprint 2 (Tuần 4-7): Xây dựng RESTful API với Express.js, thiết lập CRUD cho các thực thể Phòng, Khu, Nhân viên, Sinh viên.
  • Sprint 3 (Tuần 8-11): Phát triển giao diện Angular SPA, tích hợp Reactive Forms, HttpClient và cơ chế bảo vệ Route.
  • Sprint 4 (Tuần 12-14): Ghép nối API, hiện thực hóa nghiệp vụ duyệt tạm trú và thuật toán tính tiền điện nước.
  • Sprint 5 (Tuần 15-16): Kiểm thử hộp đen (Black-box testing), tối ưu hóa hiệu năng và đóng gói tài liệu nghiệm thu.

Implementation và kết quả

Development process

Cấu trúc mã nguồn được phân chia theo kiến trúc module hóa: Front-end quản lý theo Component-Directive-Service của Angular, Back-end tổ chức theo mô hình Controller-Service-Model của Express.js.

Thuật toán tính tổng tiền hóa đơn điện nước: $$\text{TongTien} = (\text{ChiSoDienCuoi} - \text{ChiSoDienDau}) \times \text{DonGiaDien} + (\text{ChiSoNuocCuoi} - \text{ChiSoNuocDau}) \times \text{DonGiaNuoc}$$

Dưới đây là đoạn mã nguồn Express.js xử lý nghiệp vụ duyệt đăng ký tạm trú của sinh viên và cập nhật sĩ số phòng:

// Controller xử lý duyệt sinh viên tạm trú (Node.js/Express + Mongoose)
const SinhVien = require('../models/SinhVien');
const Phong = require('../models/Phong');

exports.duyetSinhVienTamTru = async (req, res) => {
    const { sinhVienId } = req.params;
    try {
        const sinhVien = await SinhVien.findById(sinhVienId);
        if (!sinhVien) {
            return res.status(404).json({ success: false, message: 'Không tìm thấy hồ sơ sinh viên!' });
        }

        const targetPhong = await Phong.findById(sinhVien.PhongID);
        if (targetPhong.SoLuongDangO >= targetPhong.SoluongChua) {
            return res.status(400).json({ success: false, message: 'Phòng đã đủ số lượng người ở!' });
        }

        // Cập nhật trạng thái sinh viên và tăng số lượng người trong phòng
        sinhVien.TrangThai = 'Đang ở';
        await sinhVien.save();

        targetPhong.SoLuongDangO += 1;
        if (targetPhong.SoLuongDangO === targetPhong.SoluongChua) {
            targetPhong.TinhTrang = 'Đầy';
        } else {
            targetPhong.TinhTrang = 'Còn chỗ';
        }
        await targetPhong.save();

        return res.status(200).json({
            success: true,
            message: 'Duyệt sinh viên thành công và cập nhật sĩ số phòng!',
            data: { sinhVien, targetPhong }
        });
    } catch (error) {
        return res.status(500).json({ success: false, error: error.message });
    }
};

Ở phía client, Angular Service sử dụng RxJS Observable để gọi API bất đồng bộ:

// Angular Service truy vấn danh sách phòng còn trống
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { environment } from 'src/environments/environment';

export interface Phong {
  _id: string;
  PhongID: string;
  TenPhong: string;
  SoluongChua: number;
  SoLuongDangO: number;
  TinhTrang: string;
}

@Injectable({
  providedIn: 'root'
})
export class PhongService {
  private apiUrl = `${environment.apiBaseUrl}/phong`;

  constructor(private http: HttpClient) {}

  getDanhSachPhongTrong(): Observable<Phong[]> {
    return this.http.get<Phong[]>(`${this.apiUrl}/danh-sach-trong`);
  }
}

Testing và validation

Hệ thống trải qua các kịch bản kiểm thử chức năng (Functional Testing) và kiểm thử hiệu năng (Performance Testing):

  • Kiểm thử đơn vị & tích hợp: 100% các ca kiểm thử chính (Đăng ký phòng, Duyệt sinh viên, Lập hóa đơn, Đổi mật khẩu) đều vượt qua các tiêu chí chấp nhận (Pass rate: 38/38 Test Cases).
  • Độ trễ phản hồi (Response Latency): Tốc độ phản hồi trung bình của API đạt 45ms - 110ms trên môi trường máy chủ cục bộ.
  • Thời gian xử lý dữ liệu: Nhờ cơ chế Non-blocking I/O của Node.js kết hợp chỉ mục _id tự động của MongoDB, hệ thống chịu tải tốt với hơn 100 phiên truy cập đồng thời mà không xảy ra nghẽn tiến trình (CPU Utilization < 35%, RAM Usage < 180MB).

Kết quả đạt được

Chức năng mục tiêu Trạng thái hoàn thành Hiệu quả thực tế
Đăng ký tạm trú trực tuyến 100% Sinh viên hoàn tất đăng ký trong 3 phút thay vì xếp hàng 1-2 ngày
Quản lý phòng & thiết bị 100% Ban quản lý theo dõi chính xác số chỗ trống và tình trạng hỏng hóc tài sản
Tính tiền điện nước tự động 100% Giảm sai sót tính toán thủ công về 0%; xuất hóa đơn tức thì
Thống kê báo cáo nội trú 100% Lọc danh sách sinh viên theo học kỳ với 1 cú nhấp chuột

Đổi mới và đóng góp

Hệ thống website quản lý ký túc xá mang lại những cải tiến kỹ thuật rõ rệt so với các giải pháp truyền thống:

  1. Kiến trúc Single Page Application (SPA): Việc sử dụng Angular với trình biên dịch Ivy Compiler và cơ chế tải lười (Lazy Loading Routing) giúp tải trang lần đầu dưới 1.5 giây và điều hướng giữa các trang nghiệp vụ không cần tải lại toàn trang (Zero page reload), tiết kiệm 60% băng thông so với kiến trúc Multi-Page Application (MPA) truyền thống.
  2. Xử lý bất đồng bộ Non-blocking I/O: Tận dụng Event Loop đơn luồng của Node.js giúp hệ thống phục vụ hàng trăm sinh viên đăng ký đồng thời trong các đợt cao điểm đầu năm học mà không bị treo server do cạn kiệt Thread Pool.
  3. Cấu trúc dữ liệu JSON/BSON linh hoạt: Sử dụng MongoDB cho phép mở rộng các trường thông tin sinh viên và trang thiết bị phòng ở linh hoạt mà không cần chạy các câu lệnh migration CSDL phức tạp như trên RDBMS (MySQL/PostgreSQL).
  4. Tối ưu hóa năng suất vận hành: Giảm 85% thời gian xử lý thủ tục giấy tờ cho Ban quản lý KTX ĐH SPKT, loại bỏ hoàn toàn nguy cơ thất lạc hồ sơ đăng ký tạm trú.

Ứng dụng thực tế và triển khai

Kịch bản sử dụng thực tế

+-----------------------------------------------------------------------------------+
| KỊCH BẢN ĐĂNG KÝ VÀ DUYỆT TẠM TRÚ ĐẦU HỌC KỲ                                     |
|                                                                                   |
| [Sinh viên]                                      [Ban Quản Lý KTX]                |
|      |                                                    |                       |
|      |--- 1. Tra cứu phòng còn chỗ trên Website --------->|                       |
|      |--- 2. Điền form thông tin cá nhân & phòng chọn --->|                       |
|      |                                                    |--- 3. Nhận thông báo  |
|      |                                                    |       & kiểm tra hồ sơ|
|      |                                                    |--- 4. Nhấn "Duyệt"    |
|      |<-- 5. Nhận kết quả duyệt & thông báo nhận phòng ---|    (Sĩ số phòng +1)   |
|      |--- 6. Đến nhận phòng & nhận biên lai thu tiền ---->|                       |
+-----------------------------------------------------------------------------------+

Chiến lược triển khai và đánh giá chi phí

  • Yêu cầu hạ tầng máy chủ tối thiểu:
    • CPU: 2 Cores (2.0 GHz trở lên).
    • RAM: 2 GB (khuyến nghị 4 GB).
    • Ổ cứng: 20 GB SSD.
    • Môi trường: Ubuntu Linux 20.04 LTS, Node.js runtime, MongoDB Service, Reverse Proxy Nginx.
  • Phân tích hiệu quả kinh tế (Cost-Benefit Analysis):
    • Chi phí phần mềm: 0 VNĐ chi phí bản quyền (sử dụng hoàn toàn công nghệ mã nguồn mở: Angular, Node.js, Express, MongoDB Community).
    • Tiết kiệm chi phí vận hành: Tiết kiệm ước tính ~30 triệu VNĐ/năm chi phí in ấn văn phòng phẩm, biểu mẫu giấy tờ và hơn 400 giờ công lao động của cán bộ quản lý.
    • Thời gian hoàn vốn đầu tư (ROI): Đạt được ngay trong học kỳ đầu tiên đưa vào sử dụng thực tế.

Hạn chế và hướng phát triển

Mặc dù đã hoàn thành toàn diện các mục tiêu đề ra, đề tài vẫn tồn tại một số điểm hạn chế kỹ thuật:

  • Hạn chế:
    • Chưa tích hợp cổng thanh toán trực tuyến (VNPAY, MoMo, ZaloPay), việc đóng tiền phòng vẫn yêu cầu đối soát tiền mặt hoặc chuyển khoản thủ công tại văn phòng KTX.
    • Chưa hỗ trợ cơ chế ghi nhận chỉ số công tơ điện nước tự động (IoT telemetry).
    • Chưa tích hợp công nghệ xác thực hai yếu tố (2FA) hoặc đăng nhập qua cổng xác thực tập trung SSO (Single Sign-On) của nhà trường.
  • Hướng phát triển tương lai:
    • Nâng cấp hệ thống Backend lên kiến trúc Microservices khi số lượng ký túc xá mở rộng sang nhiều cơ sở đào tạo.
    • Xây dựng ứng dụng di động (Mobile App) trên nền tảng Flutter hoặc React Native cho sinh viên nhận thông báo đẩy (Push Notifications) về hóa đơn điện nước.
    • Tích hợp cổng thanh toán trực tuyến qua Webhook tự động gạch nợ hóa đơn.

Đối tượng hưởng lợi

Dự án mang lại giá trị thực tiễn cho nhiều nhóm đối tượng:

  • Sinh viên nội trú: Chủ động tra cứu phòng trống 24/7, đăng ký phòng chỉ với 3 phút thao tác, theo dõi minh bạch chỉ số và đơn giá điện nước hàng tháng.
  • Ban quản lý KTX & Nhà trường: Quản trị dữ liệu tập trung, loại bỏ hoàn toàn việc lưu trữ giấy tờ cồng kềnh, giảm 85% thời gian xử lý thủ tục hành chính, quản lý thất thoát tài sản thiết bị chặt chẽ.
  • Lập trình viên & Sinh viên ngành CNTT: Cung cấp tài liệu tham khảo chi tiết về việc xây dựng ứng dụng Full-stack hoàn chỉnh dựa trên MEAN stack (Angular + Node.js/Express.js + MongoDB), áp dụng kiến trúc SPA và thiết kế cơ sở dữ liệu NoSQL chuẩn mực.

Câu hỏi thường gặp

1. Yêu cầu cấu hình phần cứng để triển khai hệ thống là gì?
Hệ thống được tối ưu hóa cao nên chỉ yêu cầu máy chủ cơ bản: CPU 2 Cores, RAM 2GB, dung lượng lưu trữ 20GB SSD, chạy trên hệ điều hành Linux (Ubuntu/Debian) hoặc Windows Server có cài đặt Node.js và MongoDB.

2. Làm thế nào để đảm bảo hệ thống không bị nghẽn khi hàng nghìn sinh viên đăng ký cùng lúc?
Node.js sử dụng kiến trúc Non-blocking I/O giúp xử lý hàng ngàn kết nối đồng thời với mức tiêu tốn tài nguyên tối thiểu. Đồng thời, CSDL MongoDB hỗ trợ đánh chỉ mục (Index) trên các trường tra cứu chính (PhongID, MaSV, TrangThai) giúp các câu truy vấn thực thi trong vài mili-giây.

3. Dữ liệu NoSQL MongoDB có đảm bảo tính toàn vẹn khi quản lý phòng và sinh viên không?
Có. Thông qua lớp Mongoose ODM trên Node.js, toàn bộ dữ liệu đầu vào đều được kiểm soát kiểu dữ liệu nghiêm ngặt (Strict Schema Validation) và áp dụng các ràng buộc nghiệp vụ ở tầng Controller trước khi lưu xuống Database.

4. Sinh viên có thể tự tra cứu tiền điện nước của phòng mình trên điện thoại được không?
Được. Giao diện website được xây dựng bằng Bootstrap với kỹ thuật Responsive Web Design, tự động tương thích hoàn hảo trên mọi kích thước màn hình từ điện thoại thông minh, máy tính bảng đến máy tính để bàn.

5. Chi phí bảo trì và vận hành hệ thống hàng năm ước tính là bao nhiêu?
Hệ thống sử dụng 100% công nghệ mã nguồn mở miễn phí, do đó chi phí vận hành chỉ bao gồm tiền thuê máy chủ (Server Hosting/Cloud VPS) ước tính khoảng 1.500.000 - 3.000.000 VNĐ/năm, thấp hơn rất nhiều so với chi phí quản lý giấy tờ truyền thống.


Kết luận

Đồ án tốt nghiệp "Xây dựng hệ thống website quản lý ký túc xá trường Đại học Sư phạm Kỹ thuật" của tác giả Đỗ Ngọc Quang Huy đã giải quyết xuất sắc bài toán tin học hóa quản lý nội trú tại Trường ĐH SPKT – Đại học Đà Nẵng. Bằng việc kết hợp sức mạnh của Angular, Node.js, Express.js và MongoDB, hệ thống đã chuẩn hóa toàn bộ quy trình nghiệp vụ từ đăng ký tạm trú, duyệt phòng, quản lý tài sản đến tính toán hóa đơn tài chính với độ chính xác tuyệt đối và thời gian phản hồi nhanh chóng.

Đề tài không chỉ khẳng định năng lực ứng dụng công nghệ phần mềm hiện đại vào việc giải quyết các bài toán thực tiễn trong nhà trường mà còn mở ra hướng phát triển số hóa toàn diện cho các đơn vị quản lý cơ sở vật chất giáo dục đại học.