Bỏ qua tới nội dung
← Tất cả dự án
FrontendBackendFull-Stack

Tháng 9, 2026 - Hiện tại • Hệ thống Quản lý Vận hành Trường THCS (Next.js 16 + Express)

Ảnh dự án SchoolOps — Nền tảng Quản lý Vận hành Trường học (Next.js 16 + Express)

Tổng quan

SchoolOps là nền tảng quản lý vận hành trường học cấp doanh nghiệp dành cho trường THCS (mô hình chuẩn THCS Nguyễn Tất Thành 2026-2027) với kiến trúc Monorepo Next.js 16 (Frontend) + Express/TypeScript (Backend). Quản lý 16 lớp học, 480 học sinh, 24 giáo viên với phân quyền RBAC động theo lớp, sơ đồ 20 bàn/40 chỗ ngồi tương tác dual-perspective, điểm danh thời gian thực và tự động phát hiện xung đột lịch dạy.

Kiến trúc Hệ thống

Monorepo chuẩn hóa với kiến trúc phân tầng: Controller → Service → Repository (Backend Express Serverless) và Page/Component → Context/Service Layer → API Client (Frontend Next.js 16). Pipeline 7 SQL migrations tuần tự (001→007). API Proxy Rewrite loại bỏ CORS friction.

Dữ liệu & Cơ sở dữ liệu

PostgreSQL 16 (Neon Serverless với PgBouncer connection pooling) chuẩn hóa 12 bảng quan hệ với native pg connection pool (không ORM). Composite indexes tối ưu truy vấn thời khóa biểu và điểm danh, stored procedures kiểm tra xung đột lịch dạy, triggers tự động cập nhật timestamp và deterministic seed data cho 480 học sinh.

Thách thức Kỹ thuật & Giải pháp cốt lõi

  1. 01

    1. Ma trận Dynamic Per-Class RBAC — Phân quyền động theo ngữ cảnh từng lớp:

    Thiết kế ClassContext ở Frontend làm dynamic role resolver tra cứu teacher_assignments mỗi khi chuyển lớp; Backend rbac.middleware.ts (requireClassAccess) độc lập xác minh lại quyền tại mỗi endpoint, hoàn toàn không phụ thuộc client-side state.

  2. 02

    2. Thời khóa biểu 2 ca & Phát hiện xung đột giáo viên school-wide:

    Migration 007_timetable_rules.sql tạo partial index xung đột (teacher_id, period, day_of_week) trên PostgreSQL; stored procedure kiểm tra xung đột trước khi INSERT; TimetableService wrap logic trong database transaction đảm bảo tính nguyên tử tuyệt đối.

  3. 03

    3. Sơ đồ chỗ ngồi 20 bàn/40 chỗ — Dual-perspective & Live Attendance Overlay:

    Encode tọa độ theo chỉ số tuyệt đối desk index 0-19; component SeatingGrid đảo ngược thứ tự render bằng CSS transform + reverse mapping khi đổi góc nhìn giữa cuối lớp và bục giảng; attendance overlay render độc lập bằng badge layer không làm re-render toàn bộ grid.

  4. 04

    4. Chuyển đổi mô hình Serverless trên Vercel & Neon Cloud:

    Đóng gói backend Express chạy dạng Serverless Function qua backend/vercel.json và entrypoint api/index.js; kết nối Neon Postgres qua PgBouncer connection pooler; cấu hình frontend build dependencies đảm bảo tương thích 100% trên Vercel.