Bối cảnh và vấn đề nghiên cứu

Trong quy trình phát triển phần mềm, một trong những nguyên nhân cơ bản dẫn đến sự thất bại của các dự án là sự phụ thuộc và chồng chéo lẫn nhau giữa các thành phần. Việc phân tách các thành phần độc lập trong một dự án phần mềm nhằm tối ưu hóa chi phí và thời gian gia công luôn là bài toán đòi hỏi việc lập kế hoạch và phân chia công việc chặt chẽ. Mặt khác, dưới tác động của quá trình công nghiệp hóa và hiện đại hóa, nhu cầu chuyển đổi các công việc quản lý thủ công sang các công cụ tự động hóa, dễ thống kê và theo dõi ngày càng tăng cao. Trong lĩnh vực y tế, việc xếp hàng hoặc đăng ký khám chữa bệnh truyền thống bộc lộ nhiều điểm bất tiện, đòi hỏi phải có một giải pháp hỗ trợ người bệnh thực hiện đăng ký nhanh chóng, đồng thời giúp các cơ sở y tế theo dõi và cập nhật thông tin kịp thời.

Trước bối cảnh đó, đề tài đặt ra sáu câu hỏi nghiên cứu và thiết kế hệ thống cần giải quyết:

  1. Vấn đề cần giải quyết là gì?
  2. Những đặc điểm của ứng dụng được sử dụng để giải quyết vấn đề?
  3. Giải pháp sẽ được thực hiện như thế nào?
  4. Giải pháp sẽ được xây dựng như thế nào?
  5. Cách tiếp cận nào sẽ được sử dụng để phát hiện ra các lỗi trong thiết kế và xây dựng hệ thống?
  6. Hệ thống sẽ được hỗ trợ như thế nào trong thời gian dài khi có yêu cầu chỉnh sửa, cải tiến từ phía người dùng?

Mục tiêu nghiên cứu của đề tài được xác định cụ thể như sau:

  1. Xây dựng một ứng dụng, công cụ phục vụ đăng ký khám chữa bệnh;
  2. Áp dụng các công nghệ lập trình hiện đại gồm ReactJS, Redux, NodeJS, MongoDB và DnD;
  3. Sử dụng công nghệ ExpressJS và NodeJS để xây dựng tầng API theo kiến trúc RESTful;
  4. Sử dụng ReactJS và Redux xử lý logic ứng dụng và hiển thị giao diện dựa trên kết quả nhận được từ tầng API;
  5. Sử dụng hệ quản trị cơ sở dữ liệu MongoDB để quản lý dữ liệu;
  6. Phân tích, thiết kế và xây dựng các chức năng cơ bản gồm: Xác thực người dùng (Authentication), Quản lý đăng ký khám chữa bệnh của người dùng, Quản lý các bệnh viện và phòng khám;
  7. Vận dụng các kiến thức chuyên ngành đã học để hoàn thành sản phẩm phần mềm.

Nhiệm vụ nghiên cứu cụ thể bao gồm:

  1. Tìm hiểu về thư viện ReactJS, Redux và cơ chế hoạt động;
  2. Tìm hiểu về môi trường NodeJS, framework ExpressJS và cách thức hoạt động;
  3. Khảo sát các website và hệ thống quản lý khám chữa bệnh đang vận hành thực tế;
  4. Phát triển ứng dụng hoàn chỉnh đáp ứng các yêu cầu đặt ra;
  5. Nghiên cứu các công nghệ mới nhằm phục vụ việc mở rộng hệ thống trong tương lai.

Đối tượng nghiên cứu của đồ án là quy trình quản lý lịch khám và hệ thống ứng dụng web đăng ký khám chữa bệnh.

Phạm vi nghiên cứu:

  • Về mặt thời gian: Đề tài được thực hiện từ ngày 14/09/2020 đến ngày 06/01/2021 (thời điểm nghiệm thu và báo cáo là tháng 12 năm 2020).
  • Về mặt không gian: Nghiên cứu được triển khai tại Khoa Đào tạo Chất lượng cao, Trường Đại học Sư phạm Kỹ thuật Thành phố Hồ Chí Minh; dữ liệu khảo sát hiện trạng nghiệp vụ được thu thập từ hệ thống đặt lịch khám thực tế của website https://molepatrol.com.

Cơ sở lý thuyết và phương pháp

Đề tài áp dụng các lý thuyết kiến trúc phần mềm và công nghệ web hiện đại:

  • Kiến trúc phần mềm: Đề tài áp dụng mô hình kiến trúc ứng dụng trang đơn (Single Page Application - SPA) ở phía máy khách (Client-Side) và kiến trúc dịch vụ mạng RESTful (RESTful WebService) ở phía máy chủ (Server-Side). Mô hình kiến trúc MVC (Model - View - Controller) được triển khai trên nền tảng ExpressJS, phân định rõ ràng giữa tầng dữ liệu (Model), tầng xử lý logic yêu cầu (Controller) và tầng giao diện hiển thị (View).
  • So sánh và lựa chọn công nghệ: Tác giả đã tiến hành đánh giá ba nền tảng lập trình chính: C# (.NET), Java và JavaScript:
    • C# (.NET): Là ngôn ngữ hướng đối tượng, tích hợp đầy đủ với thư viện .NET, biên dịch nhanh, phù hợp cho môi trường Windows nhưng kém linh hoạt hơn C++ và đòi hỏi thời gian đào tạo.
    • Java: Nền tảng hướng đối tượng ổn định, thư viện phong phú, tự động thu gom rác, hỗ trợ đa luồng tốt nhưng tiêu tốn tài nguyên và tốc độ thực thi chậm hơn các ngôn ngữ biên dịch trực tiếp sang mã máy.
    • JavaScript kết hợp NodeJS: Cho phép đồng nhất một ngôn ngữ lập trình duy nhất cho cả phía máy khách và máy chủ, dễ tiếp cận và có khả năng phục vụ nhiều kết nối đồng thời với hiệu năng cao. Do đó, nhóm nghiên cứu đã lựa chọn giải pháp ngăn xếp công nghệ ReactJS và NodeJS.
  • Công nghệ phía máy khách (Front-end):
    • Thư viện ReactJS: Hoạt động dựa trên khái niệm DOM ảo (Virtual DOM) để so sánh các thay đổi và cập nhật giao diện một cách tối ưu, áp dụng luồng dữ liệu một chiều (one-way data binding), chia nhỏ giao diện thành các thành phần (Component) độc lập có khả năng tái sử dụng thông qua Props (thuộc tính bất biến) và State (trạng thái nội bộ có thể thay đổi).
    • Cú pháp JSX: Mở rộng từ JavaScript theo định dạng XML giúp mã nguồn an toàn hơn qua cơ chế kiểm tra lỗi tĩnh trước khi thực thi.
    • Thư viện quản lý trạng thái: Redux, Redux Thunk và Redux Saga.
    • Giao diện: Sử dụng SCSS và thư viện thiết kế Material Design.
  • Công nghệ phía máy chủ (Back-end) và Cơ sở dữ liệu:
    • Nền tảng NodeJS: Môi trường chạy JavaScript phía máy chủ hoạt động theo cơ chế đơn luồng (Single-Threaded), kiến trúc hướng sự kiện (Event-driven) và vào/ra không chặn (Non-blocking I/O), quản lý thư viện thông qua công cụ dòng lệnh NPM.
    • Framework ExpressJS: Cung cấp các công cụ định tuyến (Route), tầng trung gian (Middle-ware) và xử lý các phương thức HTTP.
    • Hệ quản trị cơ sở dữ liệu MongoDB: Cơ sở dữ liệu phi quan hệ (NoSQL) giúp việc lưu trữ và truy vấn cấu trúc dữ liệu JSON/BSON diễn ra nhanh chóng, giảm thiểu ràng buộc phức tạp so với mô hình quan hệ truyền thống.
    • Công cụ quản lý và triển khai: Visual Studio Code, cơ sở dữ liệu đám mây MongoDB Atlas và nền tảng đám mây Heroku.

Phương pháp nghiên cứu thực tế được tác giả áp dụng bao gồm:

  • Phương pháp nghiên cứu tài liệu: Thu thập, tổng hợp và phân tích tài liệu kỹ thuật chuyên ngành liên quan đến ReactJS, NodeJS, ExpressJS, MongoDB và các kiến trúc ứng dụng web.
  • Phương pháp chuyên gia: Tham khảo ý kiến hướng dẫn khoa học của TS. Nguyễn Thiên Bảo cùng các lập trình viên có kinh nghiệm chuyên môn để định hình giải pháp kỹ thuật.
  • Phương pháp mô hình hóa: Xây dựng các sơ đồ thiết kế hệ thống bao gồm sơ đồ ca sử dụng (Use case diagram), lược đồ lớp (Class diagram) và lược đồ tuần tự (Sequence diagram) để mô phỏng luồng nghiệp vụ từ bản vẽ thiết kế đến mã nguồn thực tế.

Nguồn dữ liệu:

  • Dữ liệu khảo sát hiện trạng: Thu thập từ cấu trúc giao diện và quy trình đặt lịch của website molepatrol.com.
  • Dữ liệu thử nghiệm hệ thống: Bao gồm dữ liệu mô phỏng về tài khoản, danh sách bác sĩ, chuyên khoa, phòng khám, ca khám và lịch sử khám bệnh được khởi tạo trên cơ sở dữ liệu MongoDB.

Thiết kế và triển khai

Hệ thống được thiết kế theo kiến trúc tách rời hoàn toàn giữa Client-side và Server-side. Phía máy chủ tổ chức thành các tầng chức năng độc lập: Middle-ware (tiếp nhận sàng lọc dữ liệu và xử lý lỗi trung gian), Repository (tương tác trực tiếp với cơ sở dữ liệu), Service (chứa logic nghiệp vụ hệ thống), Controller (tiếp nhận yêu cầu từ người dùng và điều hướng phản hồi) và Route (định nghĩa các điểm cuối API).

Hệ thống quản lý dữ liệu thông qua các mô hình (Model) trong thư mục .models/ trên MongoDB:

Tên Model Tên tệp lưu trữ Thuộc tính chính và mô tả chức năng
accounts Account model (.js) Id_account, firstname, lastname, avatar, email, password, status (trạng thái kích hoạt/khóa), role (vai trò), isDeleted, versionKey, timestamps
shifts shifts model (.js) Id_shift, Shift (thứ tự ca khám trong ngày, ví dụ: ca 1, ca 2,...)
clinic_historys clinic_historys.js Id_cli_his, Note (ghi chú bệnh án và lịch sử khám bệnh)
specializeds Specializeds model (.js) Id_spec, Name (tên chuyên khoa), Regional (khu vực chuyên ngành tại cơ sở y tế)
rooms Rooms model (.js) Id_room, Name (tên phòng khám)
shift_types Shift_types.js Id_s_type, Name (loại ca khám và định mức thời gian, ví dụ loại 1 tương ứng 15 phút)
doctor_shifts Doctor_shifts.js Id_doc_shift, Date (ngày khám bệnh do bác sĩ đăng ký)
doctors Doctors model (.js) Id_doc, Name, Regency (chức vụ), Emai (email), Phone (số điện thoại)

Tầng Controller tiếp nhận các yêu cầu truy vấn thông qua các phương thức HTTP (GET, POST, PUT, DELETE) với các đường dẫn cụ thể:

Tên Controller Đường dẫn truy xuất Phương thức Chức năng nghiệp vụ
accounts Login POST Xác thực đăng nhập hệ thống
accounts / GET Hiển thị danh sách tất cả tài khoản trong cơ sở dữ liệu
accounts :id GET Lấy thông tin chi tiết của tài khoản theo mã định danh id
accounts / POST Tạo mới một tài khoản người dùng
accounts :id PUT Cập nhật thông tin tài khoản theo mã định danh id
accounts :id DELETE Xóa một tài khoản theo mã định danh id
specializeds / GET Lấy danh sách toàn bộ chuyên khoa hiện có
specializeds :id GET Lấy thông tin chi tiết một chuyên khoa theo id
specializeds / POST Thêm mới một chuyên ngành/chuyên khoa vào cơ sở dữ liệu
specializeds :id PUT Cập nhật thông tin chuyên ngành theo id
specializeds :id DELETE Xóa chuyên ngành ra khỏi hệ thống
shifts / GET Lấy danh sách toàn bộ các ca khám bệnh
shifts :id GET Lấy thông tin chi tiết ca khám theo mã định danh id
shifts / POST Thêm mới một ca khám bệnh vào hệ thống
shifts :id PUT Điều chỉnh thông tin ca khám bệnh theo id
shifts :id DELETE Xóa bỏ ca khám bệnh theo id

Về cơ chế xác thực và bảo mật (Authentication), hệ thống sử dụng kỹ thuật băm mã hóa kết hợp thêm muối (Hashing và Salting) thông qua thư viện crypto được tích hợp trong tệp helper.js thuộc thư mục utils:

const createHash = (text) => { return crypto.digest('base64'); };

Chuỗi băm tạo ra được chuyển đổi sang chuẩn base64 và lưu trữ trực tiếp vào trường password trong cơ sở dữ liệu, đảm bảo mật khẩu của người dùng không bị giải mã ngược.

Về môi trường triển khai, hệ thống được cấu hình và vận hành trên nền tảng máy chủ Heroku, liên kết với cơ sở dữ liệu MongoDB Atlas trên đám mây.

Nội dung chính theo từng chương

CHƯƠNG 1: MỞ ĐẦU

Chương 1 trình bày lý do chọn đề tài, xuất phát từ thực trạng phụ thuộc giữa các thành phần phần mềm và nhu cầu số hóa quy trình quản lý đăng ký khám chữa bệnh. Tác giả đặt ra 6 câu hỏi nghiên cứu định hướng thiết kế hệ thống, xác định mục tiêu áp dụng các công nghệ ReactJS, Redux, NodeJS, MongoDB và DnD để xây dựng hệ thống API RESTful và ứng dụng web quản lý. Chương này cũng phân tích ưu điểm, nhược điểm của các ngôn ngữ C#, Java và JavaScript, qua đó khẳng định lý do lựa chọn NodeJS và ReactJS để phát triển sản phẩm với 3 nhóm tác nhân chính: bác sĩ, bệnh nhân và người quản lý (Admin). Ngoài ra, chương 1 còn công bố phương pháp nghiên cứu và bố cục tổng thể của báo cáo tốt nghiệp.

CHƯƠNG 2: KHẢO SÁT HIỆN TRẠNG VÀ XÁC ĐỊNH YÊU CẦU

Chương 2 mô tả chi tiết kết quả khảo sát thực tế hệ thống đặt lịch khám trực tuyến molepatrol.com với các chức năng tra cứu lịch trống, lựa chọn phòng khám, vị trí địa lý, đặt ngày hẹn, xem thông tin hữu ích về bệnh tật và tiểu sử bác sĩ. Từ khảo sát thực tế, tác giả phân tích và xây dựng cấu trúc ứng dụng với 4 nhóm người dùng thông qua Bảng 2.1:

  • Người dùng chưa đăng nhập: Xem lịch trống, chọn nơi khám, xem thông tin bác sĩ và triệu chứng bệnh;
  • Người dùng đã đăng nhập: Kế thừa toàn bộ quyền của người dùng chưa đăng nhập, bổ sung chức năng xem/quản lý thông tin cá nhân và đặt lịch hẹn khám bệnh;
  • Bác sĩ: Đăng ký hoặc hủy lịch khám, cập nhật thông tin cá nhân;
  • Quản trị viên (Admin): Quản lý toàn diện tài khoản, lịch khám, danh sách bác sĩ, bệnh nhân, bệnh viện và phòng khám liên kết.

Chương này cũng thiết lập các quy định dữ liệu, yêu cầu thiết kế phân quyền hai đầu (front-end và back-end), thiết kế bộ lọc tìm kiếm (rating, cost, topic) và xây dựng lược đồ use case tổng hợp (Hình 1.8) kèm đặc tả use case cho từng vai trò người dùng.

CHƯƠNG 3: CÔNG NGHỆ SỬ DỤNG

Chương 3 tập trung phân tích sâu về lý thuyết và kiến trúc kỹ thuật của hai nền tảng công nghệ cốt lõi:

  • ReactJS: Giới thiệu khái niệm Single Page Application (SPA), cơ chế hoạt động của Virtual DOM giúp tối ưu hóa render giao diện, luồng dữ liệu 1 chiều (one-way data binding), cú pháp JSX hỗ trợ phát hiện lỗi tại thời điểm biên dịch, vòng đời component (lifecycle), sự khác biệt giữa Props (dữ liệu bất biến truyền từ component cha) và State (trạng thái nội bộ thay đổi được). Tác giả cũng nêu rõ nhược điểm của React là không có sẵn tầng Model, Controller và cơ chế 2-way binding nên phải kết hợp với các thư viện khác.
  • NodeJS: Phân tích kiến trúc tổng thể dựa trên cơ chế đơn luồng (Single-Threaded) kết hợp Non-blocking I/O và hướng sự kiện (Event-driven), quản lý các gói phần mềm thông qua NPM CLI, ứng dụng framework ExpressJS để tạo RESTful API. Chương này cũng phân tích mô hình kiến trúc MVC (Model - View - Controller) trên nền tảng ExpressJS cùng các thành phần cơ bản gồm Middle-ware, Repository, Service, Controller và Route. Tác giả cũng chỉ ra nhược điểm của NodeJS khi xử lý các tác vụ tiêu tốn tài nguyên CPU như mã hóa video hoặc giải mã dữ liệu phức tạp.

CHƯƠNG 4: THIẾT KẾ PHẦN MỀM

Chương 4 cung cấp chi tiết thiết kế kỹ thuật của hệ thống, bao gồm thiết kế hệ thống, tầng Model, tầng Controller, cơ chế bảo mật và thiết kế giao diện:

  • Tầng Model: Định nghĩa chi tiết thuộc tính cho 8 thực thể dữ liệu trong cơ sở dữ liệu MongoDB thông qua các bảng từ Bảng 3.1 đến Bảng 3.8: Account, Shifts, Clinic_historys, Specializeds, Rooms, Shift_types, Doctor_shifts và Doctors.
  • Tầng Controller: Quy định chi tiết các đường dẫn truy xuất API và phương thức HTTP (GET, POST, PUT, DELETE) cho từng mô hình dữ liệu qua Bảng 3.9 (Account controller), Bảng 3.10 (Specializeds controller) và Bảng 3.11 (Shifts controller).
  • Cơ chế xác thực (Authentication): Xây dựng giải pháp mã hóa băm kết hợp muối (Hashing & Salting) thông qua thư viện crypto, cấu hình hàm băm createHash trả về chuỗi base64 để lưu mật khẩu an toàn.
  • Thiết kế hệ thống và giao diện: Trình bày các lược đồ tuần tự (Sequence Diagram) cho các nghiệp vụ: Xem thông tin cá nhân, Cập nhật tài khoản, Đăng nhập, Đăng ký thành viên, Xem thông tin bác sĩ, Đăng ký lịch khám bệnh, Xóa lịch khám bệnh và Sửa thông tin đăng ký khám chữa bệnh. Chương này cũng trình bày các màn hình giao diện hệ thống từ Hình 3.10 đến Hình 3.29, bao gồm: giao diện trang chủ, chọn chuyên khoa, chọn phòng khám, xem địa chỉ phòng khám, nhập thông tin bệnh nhân, trang tìm kiếm, đăng nhập/đăng ký, trang quản trị admin, phân bảng bác sĩ, thêm bệnh nhân/nhân viên, xem booking/đơn thuốc và đăng nhập bằng số khám của bệnh nhân.

CHƯƠNG 5: CÀI ĐẶT VÀ KIỂM THỬ

Chương 5 trình bày việc triển khai hệ thống thực tế trên nền tảng đám mây Heroku (Hình 4.2 cấu hình máy chủ Heroku) kết hợp cùng cơ sở dữ liệu MongoDB Atlas. Nội dung kiểm thử hệ thống được tổng hợp tại Bảng 4.1: Kiểm thử một số chức năng của trang web, tập trung kiểm tra các kịch bản thực thi chính như xác thực tài khoản người dùng, chức năng tìm kiếm cơ sở khám bệnh, chức năng đặt lịch hẹn và quyền thao tác dữ liệu của quản trị viên.

CHƯƠNG 6: KẾT LUẬN

Chương 6 tổng kết các kết quả đạt được của đề tài sau quá trình nghiên cứu, khảo sát và xây dựng ứng dụng. Tác giả đánh giá mức độ hoàn thiện của các chức năng phần mềm so với mục tiêu đề ra ban đầu, đồng thời đề xuất hướng phát triển tiếp theo cho hệ thống trong tương lai.

Kết quả và đóng góp

Kết quả thực nghiệm của đồ án được thể hiện qua các điểm chính sau:

  • Hoàn thiện hệ thống ứng dụng web phục vụ đăng ký khám chữa bệnh với đầy đủ 4 nhóm quyền người dùng theo đúng khảo sát và thiết kế nghiệp vụ (Bảng 2.1):
    • Người dùng chưa đăng nhập có thể tra cứu lịch trống, tìm kiếm phòng khám, bệnh viện và xem thông tin chuyên môn của bác sĩ;
    • Người dùng có tài khoản (Bệnh nhân) có thể đặt lịch hẹn khám bệnh, theo dõi và chỉnh sửa thông tin lịch hẹn, quản lý danh sách đơn thuốc và hồ sơ cá nhân;
    • Bác sĩ có thể tự chủ động đăng ký ca trực, hủy lịch khám, tra cứu đơn thuốc và tạo đơn bệnh nhân;
    • Quản trị viên (Admin) quản lý tập trung toàn bộ dữ liệu hệ thống thông qua giao diện bảng điều khiển (Dashboard), phân bổ lịch trực cho bác sĩ, thêm sửa xóa dữ liệu phòng khám, chuyên khoa và tài khoản.
  • Xây dựng thành công hệ thống cơ sở dữ liệu trên MongoDB với 8 mô hình thực thể dữ liệu độc lập (accounts, shifts, clinic_historys, specializeds, rooms, shift_types, doctor_shifts, doctors), được quản lý qua các tầng Controller tương ứng bằng các phương thức chuẩn RESTful.
  • Thiết lập giải pháp xác thực mật khẩu an toàn bằng thư viện crypto với kỹ thuật băm dữ liệu kết hợp muối và định dạng base64.
  • Hoàn thành kiểm thử chức năng trang web theo kịch bản tại Bảng 4.1 và triển khai thành công ứng dụng trên môi trường đám mây Heroku cùng MongoDB Atlas.

Đóng góp của tác giả được thể hiện qua các khía cạnh:

  • Tách biệt rõ ràng kiến trúc giữa Client-Side (ReactJS) và Server-Side (NodeJS/ExpressJS), giải quyết vấn đề chồng chéo và phụ thuộc giữa các thành phần phần mềm như đã đặt ra ở phần mở đầu;
  • Chuẩn hóa quy trình kiến trúc phân tầng trên NodeJS gồm Middle-ware, Repository, Service, Controller và Route, tạo điều kiện thuận lợi cho việc bảo trì mã nguồn mà không bị ảnh hưởng bởi mã nguồn cũ (legacy code).

Hạn chế và hướng nghiên cứu tiếp

Theo nội dung trình bày trong văn bản báo cáo, đồ án ghi nhận một số hạn chế và hướng mở rộng:

  • Hạn chế:
    • Bản thân nền tảng NodeJS vận hành theo cơ chế đơn luồng, do đó hệ thống chưa được tối ưu cho các tác vụ xử lý tính toán nặng tiêu tốn tài nguyên CPU (như mã hóa tệp lớn, chuyển đổi định dạng tệp tin); tác giả lưu ý trong trường hợp này cần phải viết thêm phần bổ trợ (Addon) bằng C++ để tối ưu hóa hiệu năng;
    • Các chức năng kiểm thử của hệ thống mới chỉ dừng lại ở việc kiểm thử một số chức năng cơ bản được liệt kê tại Bảng 4.1, chưa đề cập chi tiết đến các kịch bản kiểm thử tải hoặc kiểm thử bảo mật chuyên sâu.
  • Hướng nghiên cứu tiếp:
    • Tiếp tục hoàn thiện và phát triển ứng dụng;
    • Bổ sung và hoàn thiện các chức năng giám sát, theo dõi ứng dụng;
    • Tích hợp thêm các khối chức năng mở rộng phục vụ quản lý chuyên sâu cho các bệnh viện và cơ sở y tế trong thực tế.

Giá trị tham khảo

Đồ án tốt nghiệp là tài liệu tham khảo hữu ích cho:

  • Sinh viên chuyên ngành Công nghệ phần mềm và Công nghệ thông tin đang thực hiện đồ án môn học hoặc khóa luận tốt nghiệp theo định hướng phát triển ứng dụng web Full-stack sử dụng hệ sinh thái JavaScript (ReactJS, NodeJS, ExpressJS, MongoDB);
  • Người học và lập trình viên cần tài liệu tham khảo thực tế về:
    • Thiết kế lược đồ dữ liệu NoSQL (Tầng Model) trên MongoDB cho bài toán quản lý y tế và đặt lịch hẹn;
    • Xây dựng tầng API chuẩn RESTful với các thao tác CRUD ánh xạ trực tiếp từ Controller;
    • Cách thức phân chia kiến trúc ứng dụng thành các tầng Middle-ware, Repository, Service, Controller và Route trên nền tảng ExpressJS;
    • Cơ chế băm mật khẩu bảo mật bằng thư viện crypto kết hợp định dạng base64.

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

1. Đề tài đã khảo sát hệ thống thực tế nào để xây dựng các yêu cầu chức năng cho ứng dụng?

Nhóm tác giả đã tiến hành khảo sát giao diện và luồng nghiệp vụ thực tế của trang web https://molepatrol.com. Từ trang web này, nhóm đã nghiên cứu cách thức bố trí lịch khám còn trống của bác sĩ, tính năng lựa chọn cơ sở y tế theo khu vực, đặt ngày hẹn khám, cũng như các trang thông tin cung cấp triệu chứng bệnh và thành tích, kinh nghiệm công tác của đội ngũ bác sĩ.

2. Mô hình tài khoản (Account model) trong cơ sở dữ liệu của hệ thống gồm những thuộc tính nào?

Theo Bảng 3.1 của đồ án, mô hình accounts được lưu trữ tại Account model (.js) bao gồm 11 thuộc tính: Id_account (khóa chính), firstname (tên), lastname (họ), avatar (ảnh đại diện), email (địa chỉ thư điện tử), password (mật khẩu đã băm), status (trạng thái hoạt động hoặc bị khóa), role (vai trò người dùng), isDeleted (cờ đánh dấu trạng thái xóa), versionKey và timestamps (lưu trữ dấu thời gian tạo và cập nhật bản ghi).

3. Cơ chế mã hóa và xác thực mật khẩu của hệ thống được thực hiện như thế nào?

Hệ thống sử dụng kỹ thuật băm mã hóa kết hợp với muối (Hashing và Salting) thông qua thư viện crypto. Tác giả thiết lập hàm mã hóa createHash trong tệp helper.js thuộc thư mục utils:

const createHash = (text) => { return crypto.digest('base64'); };

Mật khẩu sau khi băm được chuyển đổi sang dạng chuỗi base64 và lưu vào cơ sở dữ liệu MongoDB, ngăn chặn việc dịch ngược mật khẩu gốc.

4. Tại sao nhóm tác giả lại lựa chọn NodeJS và ReactJS thay vì các nền tảng như C# hay Java?

Văn bản phân tích rằng C# (.NET) biên dịch nhanh nhưng phụ thuộc nhiều vào môi trường Windows và kém linh hoạt hơn C++, còn Java ổn định cho doanh nghiệp nhưng chạy chậm hơn các ngôn ngữ biên dịch trực tiếp và quản lý tệp dữ liệu phức tạp. Trong khi đó, việc kết hợp NodeJS và ReactJS cho phép lập trình viên sử dụng một ngôn ngữ lập trình JavaScript duy nhất cho cả phía máy khách và máy chủ. NodeJS hỗ trợ xử lý hàng ngàn kết nối đồng thời với cơ chế non-blocking I/O, còn ReactJS tối ưu tốc độ kết xuất giao diện nhờ Virtual DOM.

5. Hệ thống phân chia người dùng thành những nhóm nào và bác sĩ có quyền hạn gì?

Hệ thống phân chia thành 4 nhóm người dùng chính (Bảng 2.1): Người dùng chưa đăng nhập, Người dùng đã đăng nhập (Bệnh nhân), Bác sĩ và Quản trị viên (Admin). Trong đó, bác sĩ có quyền quản trị trực tiếp trên tài khoản của mình, có thể tạo hoặc hủy các ca trực/lịch khám theo chuyên khoa trực thuộc, chỉnh sửa thông tin cá nhân, tra cứu danh sách bệnh nhân và thêm đơn thuốc cho bệnh nhân.

Kết luận

Đồ án tốt nghiệp "Phát triển ứng dụng đăng kí khám chữa bệnh" của sinh viên Nguyễn Khánh Đức và Nguyễn Quốc Khánh đã giải quyết thành công bài toán số hóa quy trình đăng ký khám bệnh truyền thống thông qua việc xây dựng một ứng dụng web hoàn chỉnh. Đề tài vận dụng hiệu quả ngăn xếp công nghệ JavaScript hiện đại gồm ReactJS ở phía máy khách, NodeJS và ExpressJS ở phía máy chủ, kết hợp cùng hệ quản trị cơ sở dữ liệu MongoDB. Các kết quả nghiên cứu từ thiết kế mô hình dữ liệu, xây dựng API RESTful, phân quyền người dùng đến cài đặt và kiểm thử chức năng đã đáp ứng đầy đủ các mục tiêu đề ra ban đầu của khóa luận.