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.
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.mdMỗ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ẫn | Quyền | Mô tả |
|---|---|---|
| POST /api/auth/dang-nhap | Mọi người | Nhận JWT |
| GET /api/lop | Đã đăng nhập | Danh sách lớp |
| GET /api/sinhvien?q=&lop=&page= | Đã đăng nhập | Tìm kiếm, lọc, phân trang |
| POST /api/sinhvien | admin, giangvien | Thêm sinh viên |
| PATCH /api/sinhvien/:id | admin, giangvien | Sửa |
| DELETE /api/sinhvien/:id | admin | Xóa |
| POST /api/sinhvien/:id/anh | admin, giangvien | Tải ảnh (multer) |
| GET /api/sinhvien/:id/diem | Đã đăng nhập | Bảng điểm, điểm TB |
| POST /api/diem | giangvien | Nhậ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
- Dựng cấu trúc thư mục và module auth.
- Hoàn thiện module sinh viên, lớp, điểm.
- Thêm tải ảnh đại diện bằng multer (kiểm tra loại, kích thước).
- 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).