Bài 10. Dự án: API quản lý học tập với Express và MySQL

Dự án tổng kết loạt Node.js: xây backend hoàn chỉnh cho hệ thống quản lý học tập gồm người dùng, lớp, sinh viên, điểm; có xác thực JWT, phân quyền, kiểm tra dữ liệu, phân trang, tải tệp, thông báo thời gian thực, kiểm thử và tài liệu API; giao diện dùng Next.js hoặc Bootstrap.

150 phútNâng cao
Bạn sẽ học được
  • Thiết kế kiến trúc thư mục theo lớp
  • Hoàn thiện các module: auth, lớp, sinh viên, điểm
  • Viết tài liệu API và kiểm thử
  • Kết nối giao diện và triển khai

Một số khái niệm

qlht-api/
├── src/
│   ├── app.js, server.js
│   ├── db.js
│   ├── middlewares/  auth.js, validate.js, error.js
│   ├── modules/
│   │   ├── auth/      auth.routes.js, auth.service.js
│   │   ├── lop/       lop.routes.js, lop.service.js, lop.schema.js
│   │   ├── sinhvien/  sinhvien.routes.js, sinhvien.service.js, sinhvien.schema.js
│   │   └── diem/      ...
│   └── utils/        logger.js, paginate.js
├── test/
├── database/qlsv.sql
├── api.http          # bộ yêu cầu thử API
├── .env.example
└── README.md

Mỗi module có routes (nhận yêu cầu), service (nghiệp vụ, truy vấn CSDL), schema (Zod). Route mỏng, service chứa logic: dễ test và dễ thay CSDL sau này.

Danh sách API

Phương thức + đường dẫnQuyềnMô tả
POST /api/auth/dang-nhapMọi ngườiNhận JWT
GET /api/lopĐã đăng nhậpDanh sách lớp
GET /api/sinhvien?q=&lop=&page=Đã đăng nhậpTìm kiếm, lọc, phân trang
POST /api/sinhvienadmin, giangvienThêm sinh viên
PATCH /api/sinhvien/:idadmin, giangvienSửa
DELETE /api/sinhvien/:idadminXóa
POST /api/sinhvien/:id/anhadmin, giangvienTải ảnh (multer)
GET /api/sinhvien/:id/diemĐã đăng nhậpBảng điểm, điểm TB
POST /api/diemgiangvienNhập điểm; phát sự kiện Socket.IO

Middleware kiểm tra dữ liệu dùng chung

// src/middlewares/validate.js
import { z } from 'zod';
export const validate = schema => (req, res, next) => {
  const kq = schema.safeParse(req.body);
  if (!kq.success) return res.status(422).json({ loi: 'Dữ liệu không hợp lệ', chi_tiet: z.flattenError(kq.error).fieldErrors });
  req.body = kq.data; next();
};
// routes: r.post('/', canDangNhap, canVaiTro('admin','giangvien'), validate(SinhVienSchema), themSinhVien);

Tiêu chí hoàn thành

  • Mọi truy vấn dùng placeholder; mật khẩu bcrypt; JWT có hạn dùng.
  • Lỗi trả JSON thống nhất { loi, chi_tiet? } và mã trạng thái đúng.
  • Có ít nhất 15 test cho các tuyến chính, chạy bằng npm test.
  • README hướng dẫn cài, biến môi trường, tài khoản mẫu; tệp api.http.
  • Giao diện (Next.js, Bootstrap hoặc Flutter) gọi được API.
  • Triển khai thử lên Render/Railway và ghi lại đường dẫn.
Mẹo hay

Viết tài liệu API tự động bằng OpenAPI (thư viện swagger-ui-express) để người làm giao diện tra cứu và thử API ngay trên trình duyệt.

Lưu ý

Đừng để toàn bộ logic trong tệp route dài hàng trăm dòng; tách service sớm để dự án còn bảo trì được khi lớn lên.

Thực hành
  1. Dựng cấu trúc thư mục và module auth.
  2. Hoàn thiện module sinh viên, lớp, điểm.
  3. Thêm tải ảnh đại diện bằng multer (kiểm tra loại, kích thước).
  4. Viết test, tài liệu API, triển khai và kết nối giao diện.
Tóm tắt bài học
  • Kiến trúc module: routes, service, schema.
  • Xác thực, phân quyền, kiểm tra dữ liệu, phân trang.
  • Kiểm thử, tài liệu API, triển khai.
  • Backend dùng chung cho web (Next.js) và di động (Flutter).