



















Preview text:
  ĐẠI HỌC HUẾ 
TRƯỜNG ĐẠI HỌC KHOA HỌC 
KHOA CÔNG NGHỆ THÔNG TIN (in đậm)      KHOÁ LUẬN 
TỐT NGHIỆP ĐẠI HỌC                Đề tài: 
XÂY DỰNG WEBSITE HỌC TẬP 
VÀ THI TRẮC NGHIỆM SQUIZ  VỚI STACK MERN             
Sinh viên thực hiện: LÊ XUÂN TOÀN  PHAN ÁNH NHẬT  Khóa:  K-45               
Huế 21, tháng 05 – năm 2025        ĐẠI HỌC HUẾ 
TRƯỜNG ĐẠI HỌC KHOA HỌC 
KHOA CÔNG NGHỆ THÔNG TIN (in đậm)      KHOÁ LUẬN 
TỐT NGHIỆP ĐẠI HỌC                Đề tài: 
XÂY DỰNG WEBSITE HỌC TẬP 
VÀ THI TRẮC NGHIỆM SQUIZ  VỚI STACK MERN             
Sinh viên thực hiện: LÊ XUÂN TOÀN  PHAN ÁNH NHẬT  Khóa:  K-45 
Giáo viên hướng dẫn: NGUYỄN HOÀNG HÀ           
Huế 21, tháng 05 – năm 2025            2      LỜI CẢM ƠN   
Lời đầu tiên, em xin gửi lời cảm ơn chân thành đến toàn thể quý thầy cô 
trong khoa Công nghệ thông tin, trường Đại học Khoa Học, những người đã 
truyền đạt cho em những kiến thức quý báu và hỗ trợ em trong suốt quá trình 
học tập và thực hiện khóa luận. 
Đặc biệt, em xin bày tỏ lòng biết ơn sâu sắc đến giảng viên hướng dẫn 
Nguyễn Hoàng Hà, người đã luôn đồng hành, định hướng và góp ý tận tình 
để em có thể hoàn thành đề tài một cách tốt nhất. 
Khóa luận với đề tài “Xây dựng website học tập và thi trắc nghiệm Squiz 
với stack MERN” là kết quả của quá trình tìm hiểu, nghiên cứu và ứng 
dụng công nghệ mà em đã tích lũy trong suốt thời gian học. Mặc dù đã cố 
gắng hết sức, nhưng chắc chắn không thể tránh khỏi những thiếu sót. Em rất 
mong nhận được những ý kiến đóng góp quý báu từ quý thầy cô để hoàn 
thiện hơn trong tương lai. 
Em xin chân thành cảm ơn!     
CHƯƠNG 1: MỞ ĐẦU 
1. Phát biểu bài toán 
Hiện nay, nhu cầu học tập và kiểm tra trực tuyến ngày càng tăng cao, đặc 
biệt trong bối cảnh giáo dục trực tuyến phát triển mạnh mẽ. Các nền tảng 
như Quizizz, Kahoot! đã chứng minh hiệu quả trong việc tạo ra môi 
trường học tập tương tác, sinh động. Tuy nhiên, việc xây dựng một hệ 
thống tương tự với đầy đủ tính năng như tạo đề thi, làm bài trắc nghiệm, 
chấm điểm tự động, và quản lý người dùng vẫn còn là thách thức về mặt  kỹ thuật. 
Do đó, bài toán đặt ra là: Xây dựng một trang web học tập và thi trắc 
nghiệm trực tuyến sử dụng stack MERN (MongoDB, Express.js, 
React.js, Node.js) để cung cấp một giải pháp tối ưu, dễ sử dụng, có khả 
năng mở rộng và đáp ứng nhu cầu của cả người dạy và người học.   
2. Lý do chọn đề tài 
Việc phát triển một hệ thống như Quizizz không chỉ đáp ứng nhu cầu thực 
tiễn về học và thi trực tuyến mà còn mang lại nhiều lợi ích tiềm năng. Cụ  thể: 
- Tính cấp thiết của chuyển đổi số trong giáo dục: Đại dịch 
COVID-19 đã thúc đẩy mạnh mẽ quá trình chuyển đổi số trong 
giáo dục, tạo ra nhu cầu bức thiết về các công cụ học tập và đánh  giá từ xa. 
- Nâng cao chất lượng giảng dạy và học tập: Hệ thống giúp sinh 
viên tự ôn luyện, kiểm tra kiến thức mọi lúc mọi nơi; hỗ trợ giảng 
viên dễ dàng tạo bài kiểm tra, chấm điểm tự động và phân tích kết 
quả, từ đó đưa ra đánh giá chính xác hơn. 
- Tính ứng dụng cao của MERN Stack: Việc lựa chọn MERN 
Stack (MongoDB, Express.js, React, Node.js) mang lại nhiều ưu 
điểm vượt trội như khả năng xây dựng ứng dụng nhanh chóng, hiệu      4     
suất cao, dễ dàng mở rộng và cộng đồng hỗ trợ lớn. Đây là một bộ 
công nghệ hiện đại, phù hợp để xây dựng các ứng dụng web động  và tương tác. 
- Cơ hội học hỏi và phát triển kỹ năng: Đề tài này cung cấp cơ hội 
tuyệt vời để em áp dụng kiến thức đã học vào thực tế, củng cố kỹ 
năng lập trình full-stack với MERN,   
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT 
1. Tổng quan về MERN Stack 
MERN Stack là một tập hợp các công nghệ JavaScript mã nguồn mở 
được sử dụng để xây dựng các ứng dụng web động và mạnh mẽ. MERN 
là từ viết tắt của MongoDB, Express.js, React và Node.js. Sự kết hợp của 
chúng cho phép phát triển các ứng dụng toàn diện từ frontend đến 
backend chỉ với JavaScript, tạo ra một luồng phát triển liền mạch và hiệu  quả.  1.1. MongoDB 
MongoDB là một hệ quản trị cơ sở dữ liệu NoSQL (Not Only SQL) 
mã nguồn mở, được thiết kế để lưu trữ dữ liệu dạng tài liệu 
(document-oriented database) với cấu trúc linh hoạt. Khác với cơ 
sở dữ liệu quan hệ truyền thống, MongoDB lưu trữ dữ liệu dưới 
dạng các tài liệu BSON (Binary JSON), cho phép các tài liệu trong 
cùng một tập hợp (collection) có thể có cấu trúc khác nhau.    - Ưu điểm: 
o Tính linh hoạt: Cấu trúc schema dynamic cho phép dễ dàng 
thay đổi cấu trúc dữ liệu mà không cần migration phức tạp. 
o Khả năng mở rộng: Hỗ trợ sharding (phân mảnh dữ liệu) và 
replication (nhân bản dữ liệu) để xử lý lượng lớn dữ liệu và 
đảm bảo tính sẵn sàng cao.     
Hiệu suất cao: Tối ưu cho việc đọc/ghi dữ liệu lớn, đặc biệt khi dữ 
liệu có cấu trúc phân cấp. 
Dễ tích hợp: Dễ dàng làm việc với JavaScript/JSON, phù hợp với  MERN Stack.   
- Cấu trúc dữ liệu: 
Document (Tài liệu): Đơn vị dữ liệu cơ bản trong MongoDB, tương 
tự một hàng trong cơ sở dữ liệu quan hệ, nhưng lưu trữ dưới dạng  JSON. 
Collection (Tập hợp): Nhóm các document có cấu trúc tương tự, 
tương tự một bảng trong cơ sở dữ liệu quan hệ.   
Tương tác với MongoDB: Trong Node.js, thư viện Mongoose được 
sử dụng làm ODM (Object Data Modeling) để tương tác với 
MongoDB. Mongoose cung cấp một cách tiếp cận dựa trên schema 
để mô hình hóa dữ liệu ứng dụng, giúp việc thao tác dữ liệu trở nên 
trực quan và mạnh mẽ hơn.    1.2. Express 
Express.js là một framework ứng dụng web tối giản và linh hoạt 
cho Node.js. Nó cung cấp một tập hợp các tính năng mạnh mẽ để 
xây dựng các ứng dụng web và API RESTful một cách nhanh 
chóng. Express.js không ép buộc một cấu trúc kiến trúc cụ thể nào, 
mang lại sự tự do trong việc thiết kế ứng dụng.   
- Khái niệm cốt lõi: 
o Router: Hệ thống định tuyến cho phép định nghĩa các 
endpoint API và các hàm xử lý tương ứng với từng yêu cầu 
HTTP (GET, POST, PUT, DELETE).        6     
o Middleware: Các hàm được thực thi giữa lúc nhận yêu cầu 
và gửi phản hồi. Middleware có thể thực hiện nhiều tác vụ 
như xác thực người dùng, ghi log, xử lý lỗi, phân tích cú  pháp dữ liệu yêu cầu. 
o Xử lý Request và Response: Express.js cung cấp các đối 
tượng req (request) và res (response) để dễ dàng truy cập dữ 
liệu từ yêu cầu gửi đến (query parameters, body data, 
headers) và gửi phản hồi lại client (JSON, HTML, status  codes). 
o Vai trò: Trong MERN Stack, Express.js đóng vai trò là 
xương sống của backend, xử lý các yêu cầu HTTP từ 
frontend, tương tác với cơ sở dữ liệu MongoDB và gửi dữ 
liệu phản hồi về client.    1.3. ReactJS 
ReactJS là một thư viện JavaScript mã nguồn mở do Facebook phát 
triển, được sử dụng để xây dựng giao diện người dùng (User 
Interface - UI) tương tác và hiệu quả. React tập trung vào việc tạo 
ra các thành phần UI có thể tái sử dụng, giúp đơn giản hóa quá 
trình phát triển các ứng dụng web phức tạp. 
• Khái niệm chính: 
o Component (Thành phần): Đơn vị cơ bản của React. Một ứng dụng 
React được xây dựng từ nhiều component nhỏ, độc lập và có thể tái 
sử dụng. Mỗi component có thể có logic và giao diện riêng. 
o JSX (JavaScript XML): Một cú pháp mở rộng của JavaScript, cho 
phép viết cấu trúc UI theo kiểu XML/HTML trực tiếp trong mã 
JavaScript. JSX giúp việc mô tả giao diện trở nên trực quan hơn. 
o State (Trạng thái): Dữ liệu nội bộ của một component, có thể thay 
đổi theo thời gian và gây ra việc re-render component khi thay đổi.     
o Props (Thuộc tính): Dữ liệu được truyền từ component cha 
xuống component con, chỉ đọc (read-only) và giúp các 
component giao tiếp với nhau. 
o Virtual DOM: React sử dụng một bản sao ảo của DOM 
(Document Object Model) để tối ưu hóa việc cập nhật giao 
diện. Khi trạng thái thay đổi, React sẽ so sánh Virtual DOM 
cũ và mới để tìm ra điểm khác biệt và chỉ cập nhật những 
phần cần thiết trên DOM thật, giúp tăng hiệu suất.   
o Quản lý trạng thái: Đối với các ứng dụng lớn, việc quản lý 
trạng thái có thể trở nên phức tạp. Có nhiều giải pháp như 
Context API (tích hợp sẵn trong React) hoặc các thư viện bên 
thứ ba như Redux (được sử dụng phổ biến cho các ứng dụng 
quy mô lớn) để quản lý trạng thái toàn cục của ứng dụng.   
o Routing trong React: Thư viện React Router DOM được sử 
dụng để quản lý việc điều hướng (routing) trong ứng dụng 
React, cho phép tạo các URL thân thiện và chuyển đổi giữa 
các trang mà không cần tải lại toàn bộ trang.    1.4. NodeJS 
Node.js là một môi trường runtime JavaScript mã nguồn mở, đa 
nền tảng, cho phép thực thi mã JavaScript ở phía máy chủ (server- 
side). Node.js sử dụng engine JavaScript V8 của Google Chrome, 
nổi tiếng với hiệu suất cao và khả năng xử lý bất đồng bộ.   
- Kiến trúc bất đồng bộ, non-blocking I/O: Node.js hoạt động dựa 
trên mô hình sự kiện (event-driven) và kiến trúc non-blocking I/O 
(vào/ra không chặn). Điều này cho phép Node.js xử lý nhiều yêu 
cầu đồng thời mà không cần tạo ra nhiều luồng (thread) mới, giúp    8     
tiết kiệm tài nguyên và tăng hiệu suất, đặc biệt phù hợp cho các ứng 
dụng có nhiều tác vụ I/O (như đọc/ghi file, truy vấn database, gọi  API). 
- Vai trò: Trong MERN Stack, Node.js là môi trường mà Express.js 
chạy trên đó. Nó đóng vai trò là cầu nối giữa frontend (React) và cơ 
sở dữ liệu (MongoDB), xử lý các yêu cầu từ client, thực hiện logic 
nghiệp vụ, và trả về dữ liệu.   
1.5. Các công nghệ và kĩ thuật bổ trợ 
Để xây dựng một ứng dụng web toàn diện và an toàn, ngoài các 
thành phần cốt lõi của MERN Stack, còn cần áp dụng các công 
nghệ và kỹ thuật bổ trợ khác. 
1.5.1. Authentication và Authorization 
- Authentication (Xác thực): Quá trình kiểm tra danh tính của người  dùng. 
- Authorization (Phân quyền): Quá trình xác định quyền truy cập của 
người dùng đối với các tài nguyên cụ thể sau khi đã được xác thực.   
Trong khóa luận này, Clerk được lựa chọn để xử lý xác thực người  dùng.   
1.5.2. Web Sockets (nếu có ứng dụng cho tính năng phòng thi  trực tuyến) 
Web Sockets là một giao thức truyền thông cung cấp kênh giao tiếp 
hai chiều, full-duplex (song công) qua một kết nối TCP duy nhất. 
Khác với HTTP (giao thức request-response), Web Sockets cho 
phép server đẩy dữ liệu đến client và ngược lại mà không cần client  phải gửi yêu cầu. 
- Ứng dụng: Web Sockets lý tưởng cho các tính năng tương tác thời  gian thực như:     
o Thi trắc nghiệm trực tiếp giữa nhiều người chơi.  Thông báo tức thì. 
Cập nhật điểm số trực tiếp. 
- Thư viện: Socket.IO là một thư viện phổ biến để triển khai Web 
Sockets trong Node.js (phía server) và trình duyệt (phía client), 
cung cấp khả năng tự động reconnect, fallback về polling, và đơn  giản hóa API.   
1.5.3. Các công nghệ khác 
- Thư viện hỗ trợ UI/UX: 
Tailwind CSS: Một framework CSS utility-first, cho phép 
xây dựng giao diện tùy chỉnh bằng cách kết hợp các class tiện ích 
nhỏ gọn trực tiếp trong HTML/JSX, thay vì viết CSS truyền thống. 
- Thư viện HTTP Client: 
Axios: Một thư viện JavaScript dựa trên Promise được sử 
dụng để thực hiện các yêu cầu HTTP (GET, POST, PUT, 
DELETE) từ trình duyệt hoặc Node.js. Axios cung cấp các tính 
năng mạnh mẽ như interceptors (chặn request/response), tự động 
chuyển đổi JSON, xử lý lỗi.   
2. Kiến trúc và thiết kế hệ thống 
2.1. Bố cục kiến trúc tổng thể 
Hệ thống học tập và thi trắc nghiệm trực tuyến được xây dựng theo kiến 
trúc Client-Server với mô hình API RESTful. 
- Mô hình Client-Server: 
o Client (Frontend): Được phát triển bằng React, chịu trách 
nhiệm hiển thị giao diện người dùng, xử lý tương tác từ phía 
người dùng và gửi các yêu cầu (requests) đến Server  (Backend).        10     
o Server (Backend): Được xây dựng bằng Node.js và 
Express.js, đóng vai trò xử lý các yêu cầu từ Client, thực hiện 
logic nghiệp vụ, tương tác với cơ sở dữ liệu MongoDB, và 
trả về phản hồi (responses) cho Client. 
- Kiến trúc API RESTful: 
o Tất cả các giao tiếp giữa Client và Server đều thông qua các 
API RESTful. Các tài nguyên (ví dụ: người dùng, bài thi, câu 
hỏi, kết quả) được truy cập thông qua các URL duy nhất và 
các phương thức HTTP tiêu chuẩn (GET, POST, PUT,  DELETE). 
o Mỗi endpoint API được thiết kế để thực hiện một hành động 
cụ thể trên một tài nguyên, đảm bảo tính rõ ràng, dễ hiểu và  dễ mở rộng. Ví dụ: 
o GET /api/quizzes: Lấy danh sách tất cả các bài thi. 
o POST /api/quizzes: Tạo một bài thi mới. 
o GET /api/quizzes/:id: Lấy thông tin chi tiết của một bài thi cụ  thể. 
2.2. Các thành phần chính của ứng dụng 
2.2.1. Thành phần Frontend (React) 
Cấu trúc thư mục của dự án React được tổ chức một cách logic 
để dễ quản lý và mở rộng: 
• src/: Thư mục chính chứa mã nguồn của ứng dụng React. 
o assets/: Chứa các tài nguyên tĩnh như hình ảnh, biểu tượng. 
o components/: Chứa các thành phần UI có thể tái sử dụng và 
độc lập (ví dụ: Button.jsx, Input.jsx, Modal.jsx, Navbar.jsx,  LoadingSpinner.jsx). 
o pages/: Chứa các component cấp cao nhất đại diện cho các 
trang riêng biệt trong ứng dụng (ví dụ: HomePage.jsx, 
LoginPage.jsx, QuizDetailPage.jsx, AdminDashboard.jsx).     
o contexts/ hoặc redux/ (nếu dùng Redux): Chứa logic quản lý 
trạng thái toàn cục của ứng dụng (ví dụ: AuthContext.jsx để 
quản lý thông tin người dùng đăng nhập). 
o services: Chứa các hàm để gọi API đến backend (ví dụ: 
authService.js, quizService.js). Sử dụng thư viện Axios để 
thực hiện các HTTP request. 
o utils: Chứa các hàm tiện ích chung (ví dụ: helpers.js,  constants.js, validator.js). 
o routes: Định nghĩa các route cho ứng dụng sử dụng React  Router DOM. 
o App.js: Component gốc của ứng dụng, nơi tập hợp các route  và cấu hình chung. 
o index.js: Điểm khởi đầu của ứng dụng React.     
- Cách thức quản lý trạng thái và luồng dữ liệu: 
o Stateful Components (Container Components): Các 
component cấp cao (thường là trong thư mục pages) sẽ quản 
lý trạng thái phức tạp, gọi API, và truyền dữ liệu xuống các 
component con thông qua props. 
o Stateless Components (Presentational Components): Các 
component nhỏ hơn, chỉ nhận props từ cha và hiển thị UI, 
không quản lý trạng thái nội bộ. 
o Context API: Được sử dụng để quản lý các trạng thái toàn 
cục (ví dụ: thông tin người dùng đang đăng nhập, trạng thái 
thông báo) mà không cần truyền props thủ công qua nhiều  cấp. 
2.2.2. Thành phần Backend (Node.js/Express) 
Cấu trúc thư mục của dự án Node.js/Express cũng được tổ chức 
chặt chẽ theo nguyên tắc phân tách trách nhiệm (Separation of  Concerns):  12     
- server.js hoặc app.js: File khởi tạo server Express và cấu hình các  middleware cơ bản. 
- config/: Chứa các file cấu hình ứng dụng (ví dụ: db.js để kết nối 
MongoDB, config.js cho các biến môi trường). 
- models/: Chứa các Schema và Model Mongoose để định nghĩa cấu 
trúc dữ liệu và tương tác với MongoDB (ví dụ: User.js, Quiz.js,  Question.js, Result.js). 
- routes/: Chứa các Router Express định nghĩa các endpoint API và 
ánh xạ chúng tới các Controller (ví dụ: authRoutes.js, 
userRoutes.js, quizRoutes.js). 
- controllers/: Chứa các hàm xử lý logic nghiệp vụ cho từng route. 
Các hàm này nhận yêu cầu từ client, thực hiện các thao tác với cơ 
sở dữ liệu thông qua Model, và trả về phản hồi (ví dụ: 
userController.js, quizController.js). 
- middlewares/: Chứa các hàm middleware Express để xử lý các tác  vụ chung như: 
o authMiddleware.js: Kiểm tra và xác thực JWT. 
- utils/: Chứa các hàm tiện ích, helpers (ví dụ: generateToken.js,  validation.js).  - 
- Thiết kế API Routes: 
o Sử dụng cú pháp RESTful, ví dụ:  ▪ GET /api/users  ▪ GET /api/users/:id  ▪ POST /api/users  ▪ PUT /api/users/:id  ▪ DELETE /api/users/:id 
o Các route được bảo vệ bằng middleware xác thực và phân 
quyền (ví dụ: chỉ Admin mới có thể truy cập các route quản  lý người dùng).         
2.3. Các chức năng chính của ứng dụng 
Hệ thống được thiết kế để hỗ trợ ba vai trò người dùng chính: 
Khách (Guest), Sinh viên (User) và Giảng viên/Quản trị viên 
(Admin), với các chức năng tương ứng. 
2.3.1. Chức năng chung (Dành cho Khách và Người dùng đã đăng  nhập) 
- Đăng ký tài khoản: Cho phép người dùng mới tạo tài khoản để trở  thành "Sinh viên". 
- Đăng nhập/Đăng xuất: Xác thực người dùng bằng email/tên đăng 
nhập và mật khẩu, cấp/hủy bỏ phiên làm việc (JWT). 
- Quên mật khẩu: Cung cấp cơ chế khôi phục mật khẩu thông qua  email. 
- Đổi mật khẩu: Cho phép người dùng đã đăng nhập thay đổi mật  khẩu của mình. 
- Xem/Cập nhật thông tin cá nhân: Người dùng có thể xem và chỉnh 
sửa các thông tin cơ bản về hồ sơ của mình.   
2.3.2. Chức năng dành cho Sinh viên (User) 
- Tìm kiếm và tham gia bài thi: 
o Tìm kiếm bài thi: Sinh viên có thể tìm kiếm bài thi theo tên, 
chủ đề, hoặc mã bài thi. 
o Tham gia phòng thi trắc nghiệm: Nhập mã phòng thi để tham 
gia trực tiếp một bài kiểm tra được tạo bởi giảng viên.   
- Làm bài thi trắc nghiệm: 
o Hiển thị câu hỏi: Trình bày các câu hỏi theo thứ tự hoặc ngẫu 
nhiên (nếu được cài đặt).    14     
o Đa dạng loại câu hỏi: Hỗ trợ các loại câu hỏi phổ biến: 
▪ Chọn một đáp án: Câu hỏi trắc nghiệm có một lựa  chọn đúng duy nhất. 
▪ Chọn nhiều đáp án: Câu hỏi trắc nghiệm có thể có  nhiều lựa chọn đúng. 
▪ Điền vào chỗ trống (nếu có thể triển khai): Yêu cầu 
người dùng nhập văn bản vào chỗ trống. 
o Đồng hồ đếm ngược: Hiển thị thời gian còn lại của bài thi. 
o Lưu đáp án tạm thời: Cho phép sinh viên chuyển đổi giữa các 
câu hỏi mà không làm mất đáp án đã chọn. 
o Nộp bài: Hoàn tất bài thi và gửi đáp án lên server.     
- Xem kết quả bài thi: 
o Kết quả tức thì: Hiển thị điểm số ngay sau khi nộp bài. 
o Phân tích chi tiết: Cho phép sinh viên xem lại bài làm, bao 
gồm câu hỏi, đáp án đã chọn, đáp án đúng và giải thích (nếu  có). 
- Xem lịch sử làm bài: Danh sách các bài thi đã làm, bao gồm điểm 
số, thời gian làm bài, và trạng thái. 
- Lưu bài thi yêu thích: Đánh dấu các bài thi để dễ dàng truy cập lại  sau này.   
2.3.3. Chức năng dành cho Quản trị viên (Admin) 
- Quản lý người dùng: 
o Xem danh sách người dùng: Hiển thị tất cả người dùng trong 
hệ thống (sinh viên, giảng viên khác). 
o Thêm, sửa, xóa người dùng: Cấp quyền tạo, chỉnh sửa thông 
tin, và xóa tài khoản người dùng.     
o Phân quyền người dùng: Thay đổi vai trò của người dùng (ví 
dụ: nâng cấp sinh viên lên giảng viên).   
- Quản lý bài thi (Quiz Management): 
o Tạo bài thi mới: Giảng viên có thể thiết lập các thông tin cơ 
bản của bài thi (tên, mô tả, chủ đề, thời gian làm bài, số 
lượng câu hỏi, chế độ xáo trộn câu hỏi/đáp án). 
o Sửa/Xóa bài thi: Chỉnh sửa thông tin hoặc xóa bài thi đã tạo. 
o Xem danh sách bài thi: Hiển thị tất cả các bài thi đã tạo. 
- Quản lý câu hỏi (Question Management): 
o Tạo câu hỏi: Thêm câu hỏi mới vào một bài thi cụ thể. Hỗ trợ 
nhập nội dung câu hỏi, các lựa chọn đáp án, đánh dấu đáp án 
đúng, và thêm giải thích cho đáp án. 
o Sửa/Xóa câu hỏi: Chỉnh sửa nội dung hoặc xóa câu hỏi đã có. 
- Quản lý kết quả và báo cáo: 
o Xem thống kê kết quả bài thi: Tổng hợp điểm số, số lượng 
người làm bài, tỷ lệ đỗ/trượt cho từng bài thi. 
o Xem chi tiết kết quả từng sinh viên: Xem bài làm cụ thể của  từng sinh viên. 
o Xuất báo cáo: Xuất dữ liệu kết quả bài thi ra các định dạng 
phổ biến (ví dụ: CSV, Excel) để phân tích ngoại tuyến. 
- Quản lý danh mục/chủ đề: Tạo, sửa, xóa các danh mục hoặc 
chủ đề để phân loại bài thi và câu hỏi.   
2.4. Tổ chức lưu trữ dữ liệu 
Cơ sở dữ liệu MongoDB sẽ được thiết kế để lưu trữ tất cả thông tin 
của hệ thống một cách có tổ chức và hiệu quả. Việc thiết kế schema 
linh hoạt của MongoDB rất phù hợp với cấu trúc dữ liệu dạng cây 
(tree-like structure) của các bài thi và câu hỏi.      16           
2.4.1. Thiết kế cơ sở dữ liệu MongoDB 
Dưới đây là các Collections chính và cấu trúc schema của chúng: 
- users Collection: Lưu trữ thông tin người dùng. 
- quizzes Collection: Lưu trữ thông tin về các bài thi. 
- questions Collection: Lưu trữ các câu hỏi. 
- results Collection: Lưu trữ kết quả làm bài của sinh viên. 
(Cho phép em bổ sung sau ạ)   
3. Triển khai và kết quả 
3.1. Môi trường phát triển và công cụ 
Để đảm bảo tính nhất quán và hiệu quả trong quá trình phát triển, các 
công cụ và môi trường sau đã được sử dụng: 
- Hệ điều hành: Windows 10/11 hoặc macOS. 
- IDE (Integrated Development Environment): Visual Studio Code 
(VS Code), với các extension hỗ trợ phát triển Node.js, React, 
MongoDB (như Prettier, ESLint, MongoDB for VS Code). 
- Hệ thống quản lý phiên bản: Git và GitHub để quản lý mã nguồn, 
theo dõi thay đổi và cộng tác (nếu có). 
- Môi trường runtime Node.js: Phiên bản Node.js 18.x hoặc cao hơn. 
- Trình quản lý gói: npm (Node Package Manager) hoặc Yarn để 
quản lý các thư viện và dependency của dự án. 
- Cơ sở dữ liệu: MongoDB Community Server (phiên bản cục bộ) 
hoặc MongoDB Atlas (dịch vụ cloud MongoDB). 
- Thư viện và Framework chính: 
o Frontend: React 18.x, React Router DOM v6, Axios,  TailwindCSS.     
o Backend: Node.js, Express.js, Mongoose, Clerk, dotenv (để 
quản lý biến môi trường), cors. 
- Công cụ kiểm thử (tùy chọn): Postman hoặc Insomnia để kiểm thử  API backend.   
3.2. Triển khai các chức năng tiêu biểu 
Phần này sẽ trình bày chi tiết về luồng hoạt động của một số chức năng 
cốt lõi trong ứng dụng, minh họa cách thức frontend và backend tương tác  với nhau. 
Cho phép em bổ sung sau ạ vì hiện tại em vẫn đang trong quá trình fix 
bug và các tệp sẽ còn sự thay đổi.   
3.3. Mô tả các giao diện người dùng (Screenshots) 
- Trang chủ (Homepage):   
- Trang Đăng nhập/Đăng ký:                                  18               
- Giao diện Tạo bài thi (Admin/Lecturer):   
- Giao diện Làm bài thi (Student): 
- Giao diện Xem kết quả bài thi: 
- Giao diện Xem lại bài làm chi tiết: 
- Giao diện Quản lý người dùng/bài thi (Admin Dashboard): 
Em xin phép được bổ sung sau ạ.   
4. Những kết quả đạt được 
Thông qua quá trình nghiên cứu và triển khai, khóa luận đã đạt được 
những kết quả quan trọng sau: 
- Xây dựng thành công hệ thống học tập và thi trắc nghiệm trực 
tuyến toàn diện: Đề tài đã hoàn thành việc xây dựng một ứng dụng     
web đầy đủ các chức năng cốt lõi cho cả người học và người quản 
lý. Các chức năng từ đăng ký/đăng nhập, làm bài thi đa dạng loại 
câu hỏi, xem kết quả tức thì cho đến quản lý người dùng, bài thi, 
câu hỏi và báo cáo đã được triển khai và hoạt động ổn định. Hệ 
thống cung cấp một nền tảng linh hoạt, giúp tự động hóa quy trình 
kiểm tra, đánh giá, và nâng cao trải nghiệm học tập của người dùng. 
- Ứng dụng thành công MERN Stack trong dự án thực tế: Khóa 
luận đã chứng minh được tính hiệu quả và ưu việt của MERN Stack 
(MongoDB, Express.js, React, Node.js) trong việc phát triển một 
ứng dụng web tương tác cao. Việc sử dụng cùng một ngôn ngữ 
JavaScript xuyên suốt từ frontend đến backend đã tối ưu hóa quá 
trình phát triển, tăng tốc độ xử lý và đơn giản hóa việc bảo trì hệ 
thống. Kiến trúc RESTful API và việc quản lý dữ liệu với 
MongoDB đã thể hiện khả năng mở rộng tốt cho các tính năng  trong tương lai. 
- Nâng cao kiến thức và kỹ năng chuyên môn: Quá trình thực hiện 
khóa luận đã giúp em củng cố và mở rộng sâu sắc các kiến thức về 
lập trình full-stack, kiến trúc ứng dụng web hiện đại. Em đã có cơ 
hội thực hành và làm chủ các công nghệ quan trọng như React 
(quản lý trạng thái, component lifecycle), Node.js/Express.js (xây 
dựng API, middleware), MongoDB (thiết kế schema, thao tác dữ 
liệu), Clerk (xác thực/phân quyền), và các thư viện hỗ trợ UI/UX 
(TailwindCss). Đây là những kỹ năng thực tế rất cần thiết cho sự 
nghiệp phát triển sau này. 
- Đảm bảo tính bảo mật cơ bản: Hệ thống đã tích hợp tính năng 
xác thực, phân quyền người dùng, giúp bảo vệ dữ liệu nhạy cảm và 
ngăn chặn truy cập trái phép.   
5. Những hạn chế và điều chưa đạt được          20