Bỏ qua

Project Structure — Cấu trúc dự án

Monorepo chứa cả Backend, Frontend, và Documentation trong cùng một repository.

Tổng quan thư mục gốc

chienle-labs/
├── backend/              # FastAPI Backend (Python)
├── frontend/             # Next.js Frontend (TypeScript)
├── docs/                 # MkDocs documentation (bạn đang đọc)
├── mkdocs.yml            # MkDocs config
├── requirements-docs.txt # Dependencies cho docs
├── .gitignore
└── README.md

Backend (backend/)

Kiến trúc Layered Architecture — mỗi layer có trách nhiệm riêng biệt:

backend/
├── main.py               # 🚀 Entry point — FastAPI app, CORS, router
├── core/
│   ├── config.py          # ⚙️ Pydantic Settings (đọc .env)
│   └── database.py        # 🗄️ SQLAlchemy engine, session, Base
├── api/
│   └── courses.py         # 🌐 Route handlers (endpoints)
├── services/
│   ├── course_service.py  # 💼 Business logic (CRUD courses)
│   └── storage_service.py # 📦 R2/S3 presigned URL logic
├── models/
│   └── course.py          # 📋 SQLAlchemy ORM models
├── schemas/
│   └── course.py          # ✅ Pydantic request/response schemas
├── utils/
│   └── slugify.py         # 🔧 Utility functions
├── alembic/               # Alembic config
├── migrations/            # Migration files (auto-generated)
├── requirements.txt       # Python dependencies
├── Dockerfile             # Docker build config
├── .env                   # Local env vars (không commit)
└── .env.example           # Template env vars

Data Flow

graph TD
    A["Client Request"] --> B["api/courses.py<br/>(Route Handler)"]
    B --> C["services/course_service.py<br/>(Business Logic)"]
    C --> D["models/course.py<br/>(SQLAlchemy Model)"]
    D --> E["core/database.py<br/>(DB Session)"]
    E --> F["PostgreSQL"]
    B --> G["schemas/course.py<br/>(Validation)"]
    B --> H["services/storage_service.py<br/>(R2 Upload)"]
    H --> I["Cloudflare R2"]

Frontend (frontend/)

Sử dụng Next.js App Router:

frontend/
├── app/
│   ├── layout.tsx         # 🏗️ Root layout (HTML, fonts, providers)
│   ├── page.tsx           # 🏠 Home page component
│   └── globals.css        # 🎨 Global styles (Tailwind)
├── lib/
│   └── api.ts             # 📡 API client (fetch wrapper)
├── next.config.js         # Next.js configuration
├── tailwind.config.ts     # Tailwind CSS config
├── tsconfig.json          # TypeScript config
├── package.json           # Node dependencies
├── .env.local             # Local env vars
└── .env.example           # Template

Docs (docs/)

Tài liệu bạn đang đọc — build bằng MkDocs Material:

docs/
├── index.md                        # Home page
├── getting-started/                # Onboarding
├── backend/                        # Backend docs
├── frontend/                       # Frontend docs
├── git-flow/                       # Branching & environments
├── deployment/                     # Deploy guides
└── references/                     # BA & Delivery docs

Quy tắc đặt tên

Layer Convention Ví dụ
Files snake_case.py / kebab-case.ts course_service.py, api.ts
Classes PascalCase CourseCreate, StorageService
Functions snake_case create_course(), get_db()
Database snake_case (plural table) courses table
API Routes kebab-case /courses/{id}/upload-url