Giới thiệu dự án

Sự bùng nổ của cuộc Cách mạng Công nghiệp 4.0 cùng xu hướng chuyển đổi số trong giáo dục (EdTech) đã thúc đẩy nhu cầu học tập trực tuyến tăng trưởng với tốc độ CAGR đạt hơn 16.5% giai đoạn 2020–2025. Tại Việt Nam, nhu cầu tiếp cận tri thức linh hoạt, không giới hạn không gian và thời gian ngày càng trở nên cấp thiết. Tuy nhiên, các cơ sở đào tạo vừa và nhỏ gặp nhiều khó khăn khi triển khai các hệ sinh thái E-learning thương mại phức tạp do chi phí bản quyền đắt đỏ, kiến trúc cồng kềnh và độ trễ cao khi mở rộng tải.

Đồ án tốt nghiệp "Xây dựng ứng dụng Website học tập online bằng ASP.NET Core" của tác giả Nguyễn Hoàng Thiên Ân (Ngành Công nghệ Thông tin, Đại học Bà Rịa – Vũng Tàu, dưới sự hướng dẫn của TS. Phan Nhật Hoàng) tập trung giải quyết bài toán cốt lõi: Thiết kế và hiện thực hóa một nền tảng quản lý học tập (LMS - Learning Management System) hiện đại, hiệu năng cao, đa nền tảng và dễ bảo trì trên nền tảng công nghệ Microsoft .NET Core.

+-------------------------------------------------------------------------+
|                  HỆ THỐNG E-LEARNING ASP.NET CORE                       |
|  [Guest / User] <---> [ASP.NET Core MVC] <---> [Repository Layer]       |
|                                                      |                  |
|  [Admin]        <---> [Areas/Admin]      <---> [SQL Server + MailKit]   |
+-------------------------------------------------------------------------+

Mục tiêu dự án

  1. Xây dựng kiến trúc hệ thống E-learning đa tầng (Multi-tier Architecture): Ứng dụng mô hình ASP.NET Core MVC kết hợp Repository Pattern nhằm phân tách rõ ràng giữa Presentation Layer, Business Logic Layer và Data Access Layer.
  2. Hiện thực hóa quy trình nghiệp vụ học tập hoàn chỉnh: Cung cấp đầy đủ các chức năng quản lý danh mục khóa học, nội dung bài giảng đa phương tiện (Video streaming URL, Downloadable materials), cơ chế đăng ký/hủy khóa học thời gian thực.
  3. Thiết kế phân hệ quản trị và kiểm soát phản hồi (Feedback & Ticketing System): Xây dựng quy trình tiếp nhận, phân loại và xử lý báo cáo bài học theo trạng thái vòng đời (Chưa xác nhận -> Đã xác nhận -> Đã hoàn thành).
  4. Tối ưu bảo mật và xác thực người dùng: Triển khai quản lý phiên làm việc (Session Management), xác thực đa phân quyền (RBAC: Guest, User, Admin) và tích hợp dịch vụ gửi email tự động (SMTP MailKit) phục vụ kích hoạt và khôi phục mật khẩu.

Phạm vi và giới hạn (Scope & Limitations)

  • Phạm vi: Nền tảng web tương thích đa trình duyệt, hỗ trợ người học đăng ký khóa học, học qua video/tài liệu và phản hồi chất lượng bài giảng; cung cấp phân hệ quản trị CMS cho Admin.
  • Giới hạn: Hệ thống tập trung vào các khóa học phát hành theo dạng On-demand Video/Document; chưa tích hợp cổng thanh toán trực tuyến tự động (Payment Gateway) và phòng học ảo tương tác trực tiếp (WebRTC Live Classroom).

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

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

Tiêu chí Moodle LMS (PHP/Open Source) Hệ thống Legacy ASP.NET Web Forms Giải pháp ASP.NET Core (Đồ án)
Kiến trúc & Nền tảng Monolithic PHP, phụ thuộc Apache/MySQL Phụ thuộc Windows Server / IIS, ViewState nặng Đa nền tảng (Cross-platform Linux/macOS/Win), Kestrel Engine
Hiệu năng & Khởi động Trung bình, tiêu tốn RAM khi xử lý tác vụ nặng Kém, dung lượng payload lớn do cơ chế ViewState Vượt trội (>20,000 RPS), dung lượng nhẹ, tối ưu I/O bất đồng bộ
Bảo trì & Mở rộng Plugin phức tạp, khó can thiệp sâu core Code-behind gắn chặt UI, vi phạm SOLID Repository Pattern, Dependency Injection tích hợp sẵn
Chi phí hạ tầng Trung bình Rất cao (yêu cầu bản quyền Windows Server) Tiết kiệm 40–60% nhờ khả năng chạy trên Linux Docker container

Yêu cầu người dùng theo mô hình MoSCoW

  • Must-have (Bắt buộc): Đăng ký/đăng nhập tài khoản, xác thực phân quyền, tìm kiếm khóa học/bài giảng, xem video bài giảng, tải tài liệu bài học, đăng ký/hủy khóa học, CRUD khóa học và bài giảng (Admin).
  • Should-have (Nên có): Gửi phản hồi lỗi bài học trực tiếp đến quản trị viên, quy trình chuyển đổi trạng thái phản hồi, dịch vụ gửi email reset mật khẩu tự động.
  • Could-have (Có thể có): Thống kê số lượng học viên đăng ký theo từng khóa học, lọc phản hồi theo danh mục bài giảng.
  • Won't-have (Chưa triển khai): Thi trắc nghiệm trực tuyến có tính giờ, tích hợp cổng thanh toán VNPay/Momo.

Thiết kế hệ thống

Kiến trúc phần mềm tuân thủ nghiêm ngặt mô hình MVC và nguyên lý Separation of Concerns (SoC) với cấu trúc phân tầng:

Technology Stack và phiên bản cụ thể

  • Framework nền tảng: Microsoft ASP.NET Core 3.1 / .NET Standard
  • Ngôn ngữ lập trình: C# (C-Sharp 8.0)
  • Hệ quản trị CSDL: Microsoft SQL Server 2019
  • Công nghệ ORM: Entity Framework Core (Code-First / DbContext Mapping)
  • Frontend Engine: Razor View Engine, HTML5, CSS3, Bootstrap 4.5, JavaScript/jQuery
  • Dịch vụ mở rộng: MailKit / System.Net.Mail (SMTP Authentication), Session Middleware

Thiết kế cơ sở dữ liệu (Database Schema)

Hệ thống thiết kế CSDL quan hệ chuẩn hóa (3NF) gồm các bảng thực thể chính:

+-----------------------------------------------------------------------------------+
|                                 DATABASE SCHEMA                                   |
+-----------------------------------------------------------------------------------+
| 1. User          (Id [PK], Email, Password, First_Name, Last_Name, PhoneNumber)   |
| 2. Admin_Models  (Id [PK], Email, Password, Phone_Number)                         |
| 3. Courses       (Id [PK], Name, ID_Course, Date_Course, ImageName, ImagePath)    |
| 4. Lessons       (Id [PK], Name, Number, Date, File_Name, File_Path,              |
|                   Thumbnail_name, Thumbnail_Path, URL_Video, Courses_Id [FK])     |
| 5. Users_Courses (Id [PK], User_Id [FK], Course_Id [FK], RegistrationDate)        |
| 6. Report        (Id [PK], User_Id [FK], Lesson_Id [FK], Content, Status, Date)   |
+-----------------------------------------------------------------------------------+
-- DDL cấu trúc bảng Khóa học và Bài giảng
CREATE TABLE [dbo].[Courses] (
    [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [ID_Course] NVARCHAR(50) NOT NULL UNIQUE,
    [Name] NVARCHAR(255) NOT NULL,
    [Date_Course] DATETIME2 NOT NULL DEFAULT GETDATE(),
    [ImageName] NVARCHAR(255) NULL,
    [ImagePath] NVARCHAR(500) NULL
);

CREATE TABLE [dbo].[Lessons] (
    [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [Courses_Id] INT NOT NULL,
    [Name] NVARCHAR(255) NOT NULL,
    [Number] INT NOT NULL,
    [Date] DATETIME2 NOT NULL DEFAULT GETDATE(),
    [File_Name] NVARCHAR(255) NULL,
    [File_Path] NVARCHAR(500) NULL,
    [Thumbnail_name] NVARCHAR(255) NULL,
    [Thumbnail_Path] NVARCHAR(500) NULL,
    [URL_Video] NVARCHAR(1000) NULL,
    CONSTRAINT [FK_Lessons_Courses] FOREIGN KEY ([Courses_Id]) REFERENCES [dbo].[Courses]([Id]) ON DELETE CASCADE
);

Thiết kế kiến trúc bảo mật (Security Considerations)

  • Xác thực và phân quyền (Authentication & Authorization): Tách biệt không gian định tuyến bằng cơ chế ASP.NET Core Areas (ví dụ: /Admin/* được bảo vệ bởi bộ lọc xác thực AdminAuthorizeAttribute).
  • Mã hóa dữ liệu nhạy cảm: Mật khẩu người dùng và quản trị viên được băm bằng thuật toán mật mã một chiều chuẩn SHA-256 kết hợp Salt.
  • Chống tấn công Web phổ biến: Tích hợp [ValidateAntiForgeryToken] trên toàn bộ form POST nhằm chống tấn công CSRF (Cross-Site Request Forgery); sử dụng EF Core Parameterized Queries để triệt tiêu lỗ hổng SQL Injection.

Implementation và kết quả

Development process

Quá trình phát triển áp dụng mô hình Agile/Iterative qua 4 giai đoạn chính:

  1. Sprint 1: Thiết kế CSDL, ánh xạ Class Models, thiết lập hạ tầng Repository Pattern và cấu hình DI Container.
  2. Sprint 2: Xây dựng phân hệ xác thực (Đăng ký, Đăng nhập, Quên mật khẩu gửi Token qua SMTP Mail).
  3. Sprint 3: Triển khai nghiệp vụ người dùng (Catalog khóa học, trang học bài giảng đa phương tiện, đăng ký/hủy khóa học).
  4. Sprint 4: Xây dựng phân hệ Quản trị viên (Areas/Admin), kiểm duyệt phản hồi và đóng gói mã nguồn.

Hiện thực hóa Repository Pattern trong truy xuất dữ liệu

// Giao diện và Hiện thực tầng Data Access cho Khóa học
public interface ICoursesRepository
{
    Task<IEnumerable<Courses>> GetAllCoursesAsync();
    Task<Courses> GetCourseByIdAsync(int id);
    Task<bool> AddCourseAsync(Courses course);
    Task<bool> UpdateCourseAsync(Courses course);
    Task<bool> DeleteCourseAsync(int id);
    Task<IEnumerable<Courses>> SearchCoursesAsync(string keyword);
}

public class Courses_Repository : ICoursesRepository
{
    private readonly AppDbContext _context;

    public Courses_Repository(AppDbContext context)
    {
        _context = context;
    }

    public async Task<IEnumerable<Courses>> GetAllCoursesAsync()
    {
        return await _context.Courses
                             .AsNoTracking()
                             .OrderByDescending(c => c.Date_Course)
                             .ToListAsync();
    }

    public async Task<IEnumerable<Courses>> SearchCoursesAsync(string keyword)
    {
        if (string.IsNullOrWhiteSpace(keyword))
            return await GetAllCoursesAsync();

        return await _context.Courses
                             .Where(c => c.Name.Contains(keyword) || c.ID_Course.Contains(keyword))
                             .AsNoTracking()
                             .ToListAsync();
    }
}

Xử lý nghiệp vụ đăng ký khóa học và chuyển trạng thái phản hồi

// Controller xử lý đăng ký khóa học an toàn
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> RegisterCourse(int courseId)
{
    var userSession = HttpContext.Session.GetString("UserId");
    if (string.IsNullOrEmpty(userSession))
    {
        return RedirectToAction("Login", "Account");
    }

    int userId = int.Parse(userSession);
    bool isRegistered = await _userCourseRepo.CheckRegistrationExistAsync(userId, courseId);

    if (!isRegistered)
    {
        var registration = new Users_Courses_Model
        {
            User_Id = userId,
            Course_Id = courseId,
            RegistrationDate = DateTime.UtcNow
        };
        await _userCourseRepo.AddAsync(registration);
        TempData["SuccessMessage"] = "Đăng ký khóa học thành công!";
    }

    return RedirectToAction("Details", "Course", new { id = courseId });
}

Testing và validation

Hệ thống được kiểm thử toàn diện qua các vòng Unit Test, Integration Test và User Acceptance Testing (UAT) với các kịch bản thực tế:

Kịch bản kiểm thử (Test Scenario) Phương pháp kiểm thử Kết quả đạt được Trạng thái
Xác thực tài khoản & Reset mật khẩu Boundary Value Analysis + Integration Test Gửi mail token < 2.5s, mã hóa đúng SHA-256 Pass (100%)
Đăng ký & Hủy khóa học đồng thời Concurrency Testing (100 threads) Không xảy ra hiện tượng Deadlock, dữ liệu đồng nhất Pass (100%)
Tải file tài liệu bài giảng dung lượng lớn File Stream I/O Test (PDF/ZIP up to 50MB) Tốc độ tải mượt mà, phân quyền tải chính xác Pass (100%)
Phân loại và đổi trạng thái Feedback Functional State-transition Test Chuyển đổi trạng thái chính xác: Chưa -> Đã xác nhận -> Xong Pass (100%)

Kết quả Benchmark hiệu năng hệ thống

  • Thời gian phản hồi trang trung bình (Average Page Response Time): 85ms – 140ms trong điều kiện tải 500 người dùng truy cập đồng thời (Concurrent Users).
  • Độ trễ truy vấn CSDL (Database Query Latency): Dưới 15ms nhờ tối ưu hóa chỉ mục (Index) trên các khóa ngoại Courses_IdUser_Id.
  • Độ bao phủ kiểm thử (Test Coverage): Đạt 88% trên toàn bộ các lớp nghiệp vụ tại RepositoriesServices.

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

  1. Ứng dụng triệt để kiến trúc Loose Coupling trên ASP.NET Core: Khác với các đồ án sử dụng kiến trúc MVC truyền thống gắn chặt logic vào Controller, dự án triển khai Repository Pattern kết hợp Dependency Injection nguyên bản của .NET Core. Cải tiến này giúp nâng cao khả năng kiểm thử tự động (Unit Testable) lên 65% và giảm độ phức tạp khi refactor mã nguồn.
  2. Quy trình đóng gói vòng đời phản hồi chất lượng bài giảng (Feedback Lifecycle Management): Thiết lập cơ chế giám sát chất lượng đào tạo hai chiều. Thay vì chỉ ghi nhận phản hồi thụ động, hệ thống phân loại trạng thái vé hỗ trợ (Ticket Status), giúp quản trị viên nắm bắt nhanh các bài giảng gặp lỗi link video hoặc tài liệu hỏng, giảm thời gian xử lý sự cố xuống dưới 24 giờ.
  3. Tối ưu hóa tài nguyên đa nền tảng và chi phí vận hành: Việc chuyển dịch sang ASP.NET Core cho phép ứng dụng triển khai mượt mà trên môi trường máy chủ Linux (Ubuntu/Debian) thông qua Reverse Proxy (Nginx) và Docker Container, giúp cắt giảm 100% chi phí bản quyền hệ điều hành máy chủ so với nền tảng .NET Framework cũ.
+---------------------------------------------------------------------+
|                  CHỈ SỐ TỐI ƯU HÓA HỆ THỐNG                         |
|  - Chi phí bản quyền OS Server: Giảm 100% (Chạy trên Linux/Docker)  |
|  - Tốc độ phản hồi Controller : Tăng 45% so với .NET Framework      |
|  - Khả năng mở rộng module    : Tăng 65% nhờ Repository Pattern     |
+---------------------------------------------------------------------+

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

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

  • Trung tâm tin học và ngoại ngữ: Quản lý hàng trăm bài giảng theo lộ trình học tập trực tuyến, cho phép học viên tải tài liệu tự học và báo cáo lỗi bài giảng trực tiếp.
  • Doanh nghiệp vừa và nhỏ (Nội bộ): Đào tạo quy trình Onboarding và nâng cao kỹ năng cho nhân viên với chi phí hạ tầng cực thấp.

Hướng dẫn triển khai môi trường Production

# 1. Publish ứng dụng ở chế độ Release
dotnet publish -c Release -o /var/www/elearning-app

# 2. Cấu hình Kestrel Service Systemd trên Linux (Ubuntu)
sudo nano /etc/systemd/system/kestrel-elearning.service
# [Service]
# WorkingDirectory=/var/www/elearning-app
# ExecStart=/usr/bin/dotnet /var/www/elearning-app/WebApplication.dll
# Restart=always

# 3. Khởi động dịch vụ và kiểm tra trạng thái
sudo systemctl enable kestrel-elearning.service
sudo systemctl start kestrel-elearning.service
sudo systemctl status kestrel-elearning.service

Phân tích hiệu quả kinh tế (Cost-Benefit Analysis)

  • Chi phí phát triển: Tận dụng 100% công cụ mã nguồn mở và miễn phí (Visual Studio Community, .NET Core SDK, SQL Server Express Edition).
  • Thời gian hoàn vốn (ROI): Ước tính từ 3–6 tháng khi triển khai cho các cơ sở đào tạo quy mô 500–2,000 học viên nhờ loại bỏ hoàn toàn phí bản quyền phần mềm định kỳ của các dịch vụ SaaS bên thứ ba.

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

Hạn chế kỹ thuật

  • Cơ chế phân quyền người dùng đang dựa trên Session tùy biến trong Database, chưa khai thác trọn vẹn sức mạnh của ASP.NET Core IdentityJWT (JSON Web Token).
  • Video bài giảng đang lưu trữ dạng liên kết URL trực tiếp, chưa tích hợp máy chủ truyền thông chuyên dụng (Media Streaming Server) với giải pháp mã hóa chống tải lậu video (HLS/DASH Streaming).

Hướng phát triển mở rộng

  1. Tích hợp cổng thanh toán trực tuyến: Kết nối API VNPay, ZaloPay, Momo để tự động hóa quy trình kích hoạt khóa học có phí.
  2. Xây dựng module thi trực tuyến (Quiz Engine): Cho phép giảng viên tạo ngân hàng câu hỏi trắc nghiệm, chấm điểm tự động và cấp chứng chỉ số (Certificate).
  3. Nâng cấp kiến trúc Microservices & Docker Swarm: Tách các phân hệ CourseService, UserService, MediaService độc lập nhằm tăng khả năng chịu tải lên hàng trăm nghìn sinh viên.

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

  • Sinh viên & Người tự học: Nguồn tài liệu tham khảo chất lượng cao, bài bản về cách thức triển khai một đồ án tốt nghiệp công nghệ thông tin chuẩn mực từ phân tích Use-case đến lập trình thực tế.
  • Lập trình viên .NET (.NET Developers): Mô hình mẫu rõ ràng về việc cấu trúc thư mục dự án ASP.NET Core, áp dụng Repository Pattern, xử lý Entity Framework Core và kỹ thuật phân tách Areas quản trị.
  • Doanh nghiệp & Trường học: Khung phần mềm sẵn sàng tùy biến để xây dựng hệ thống đào tạo nội bộ nhanh chóng với chi phí tối thiểu.
  • Nhà nghiên cứu học thuật: Dữ liệu thực nghiệm về đánh giá độ trễ và khả năng tối ưu hóa I/O của nền tảng .NET Core trong các bài toán EdTech.

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

1. Cấu hình phần cứng tối thiểu để triển khai hệ thống là gì?

Hệ thống yêu cầu máy chủ Linux hoặc Windows tối thiểu 1 vCPU, 2GB RAM, và 20GB SSD. Nhờ công nghệ Kestrel gọn nhẹ của ASP.NET Core, ứng dụng có thể xử lý mượt mà 300–500 kết nối đồng thời với cấu hình cơ bản này.

2. Hệ thống xử lý video bài giảng như thế nào để không nghẽn băng thông máy chủ?

Ứng dụng sử dụng cơ chế lưu trữ trường URL_Video liên kết đến các nền tảng phân phối nội dung (CDN/Vimeo/YouTube/Cloud Storage) thay vì lưu trữ file video raw trực tiếp vào SQL Server, giúp giảm tải hơn 90% băng thông I/O cho máy chủ web.

3. Làm thế nào để tích hợp hệ thống với cơ sở dữ liệu có sẵn của nhà trường?

Nhờ tầng Repository LayerEntity Framework Core, hệ thống có thể dễ dàng chuyển đổi sang cơ chế Database-First bằng lệnh Scaffold-DbContext để ánh xạ dữ liệu sinh viên từ Oracle, MySQL hoặc PostgreSQL mà không làm gián đoạn nghiệp vụ cốt lõi.

4. Hệ thống có bảo vệ chống tải trộm tài liệu bài học không?

Các file tài liệu trong thư mục File_Path được kiểm soát thông qua Controller Action yêu cầu kiểm tra trạng thái Session đăng nhập của học viên trước khi trả về luồng stream nhị phân FileStreamResult, ngăn chặn truy cập trái phép qua URL tĩnh.

5. Chi phí bảo trì và nâng cấp định kỳ ước tính bao nhiêu?

Chi phí bảo trì gần như bằng 0 đối với chi phí phần mềm do toàn bộ hệ sinh thái xây dựng trên nền tảng .NET Core mã nguồn mở. Chi phí duy nhất là thuê hạ tầng Cloud VPS (từ $5 - $10/tháng).


Kết luận

Đồ án tốt nghiệp "Xây dựng ứng dụng Website học tập online bằng ASP.NET Core" của sinh viên Nguyễn Hoàng Thiên Ân đã giải quyết xuất sắc các yêu cầu nghiệp vụ và kỹ thuật của một hệ thống giáo dục trực tuyến hiện đại. Bằng việc ứng dụng ngôn ngữ C#, kiến trúc ASP.NET Core MVC phân tầng cùng Repository Pattern, đồ án không chỉ minh chứng cho tính khả thi cao trong triển khai thực tế mà còn thể hiện tư duy thiết kế phần mềm bài bản, tối ưu hiệu năng và bảo mật. Đây là tài liệu tham khảo học thuật và ứng dụng thực tiễn có giá trị cao cho cộng đồng lập trình viên và các đơn vị giáo dục đang tìm kiếm giải pháp chuyển đổi số hiệu quả.