🛠️ Tech Stack Chi tiết — ChienLe Labs¶
Tài liệu này cung cấp cái nhìn sâu sắc về mọi công nghệ, thư viện và hạ tầng đang vận hành hệ thống ChienLe Labs.
🎨 Frontend Stack¶
Hệ thống Frontend được xây dựng trên nền tảng Next.js 15+ với kiến trúc App Router, tập trung vào hiệu năng và trải nghiệm người dùng cao cấp.
| Công nghệ | Phiên bản | Vai trò | Ghi chú |
|---|---|---|---|
| Next.js | Latest | Framework chính | App Router, SSR/ISR, Image Optimization |
| React | Latest | Library | Phiên bản ổn định mới nhất |
| Tailwind CSS | ^3.4 | Styling | Utility-first CSS, Custom design system |
| TanStack Query | ^5.95 | Data Fetching | Quản lý cache, sync dữ liệu backend |
| Tiptap | ^3.20 | Rich Text Editor | Trình soạn thảo Headless, tích hợp AI Tool |
| Framer Motion | ^12.3 | Animation | Các hiệu ứng chuyển cảnh, micro-animations |
| Lucide React | ^0.57 | Icons | Hệ thống icon SVG hiện đại |
| Sonner | ^2.0 | Toast Notifications | Thông báo trạng thái nhẹ nhàng |
⚡ Backend Stack¶
Backend sử dụng FastAPI — một framework Python hiệu năng cao, dựa trên Starlette và Pydantic với khả năng kiểm lỗi kiểu dữ liệu nghiêm ngặt.
| Công nghệ | Phiên bản | Vai trò | Ghi chú |
|---|---|---|---|
| FastAPI | 0.135 | API Framework | High performance, Async, OpenAPI docs |
| SQLAlchemy | 2.0 | ORM | Database mapping, Query builder |
| Alembic | 1.18 | Migrations | Quản lý phiên bản Database Schema |
| Pydantic v2 | 2.12 | Validation | Kiểm soát chặt chẽ request/response body |
| BeautifulSoup4 | 4.14 | HTML Processing | Trái tim của AI HTML Draw & Sanitization |
| Boto3 | 1.42 | AWS/S3 Client | Giao tiếp với Cloudflare R2 qua S3 API |
| Uvicorn | 0.42 | ASGI Server | Chạy ứng dụng FastAPI |
🤖 AI Assistant & HTML Processing¶
Đây là phần quan trọng nhất trong việc tạo ra nội dung học tập thông minh. Hệ thống không chỉ gọi API mà còn thực hiện quy trình "vẽ" lại mã HTML (HTML Draw).
Cơ chế Fallback AI¶
Hệ thống sử dụng chiến lược Tháp phòng thủ: 1. Google Gemini 1.5 Flash: Lựa chọn ưu tiên nhờ tốc độ cực nhanh và hỗ trợ tiếng Việt tốt. 2. OpenAI GPT-4o-mini: Tự động kích hoạt khi Gemini gặp lỗi (quota, timeout) để đảm bảo trải nghiệm không bị gián đoạn.
Pipeline Xử lý HTML (AI Sanitization)¶
Được triển khai trong backend/services/ai_service.py, quy trình này đảm bảo mã HTML từ AI luôn an toàn và đẹp:
- Giai đoạn 1: Bóc tách (Stripping)
- Loại bỏ các khối code block thừa (
```html) mà AI hay tự bọc. - Xóa các câu dắt dẫn giải từ LLM (ví dụ: "Dưới đây là nội dung...").
- Loại bỏ các khối code block thừa (
- Giai đoạn 2: Chuẩn hóa Cấu trúc (BeautifulSoup4)
- Sử dụng
BeautifulSoupđể duyệt cây DOM đệ quy. - Tự động xóa các thẻ rỗng (
<p></p>), các node thừa và chuẩn hóa khoảng trắng.
- Sử dụng
- Giai đoạn 3: Thực thi Whitelist & Style
- Tag Whitelist: Chỉ cho phép các thẻ an toàn (
<b>,<ul>,<table>,details...). - Class Whitelist: Chỉ giữ lại các class Tailwind hợp lệ (
text-center,font-bold...). - Clear Attributes: Xóa sạch thuộc tính
style,id,onclickđể ngăn ngừa XSS và xung đột giao diện.
- Tag Whitelist: Chỉ cho phép các thẻ an toàn (
📦 Quy trình Upload Media (Video/Image)¶
Hệ thống sử dụng cơ chế Direct Upload to S3 để giảm tải cho server backend, kết hợp với bước Finalize để đảm bảo tính toàn vẹn của dữ liệu.
Sơ đồ Tuần tự (Sequence Diagram)¶
sequenceDiagram
participant FE as Frontend (User/Admin)
participant BE as Backend (FastAPI)
participant R2 as Cloudflare R2 (Storage)
participant DB as Database (PostgreSQL)
Note over FE, BE: 1. Yêu cầu quyền Upload
FE->>BE: POST /admin/media/upload-url (filename, type)
BE-->>FE: 200 OK (Presigned PUT URL, file_key)
Note over FE, R2: 2. Upload trực tiếp (Direct Upload)
FE->>R2: HTTP PUT (File Binary) via Presigned URL
R2-->>FE: 200 OK (Upload Success)
Note over FE, BE: 3. Hoàn tất (Finalize)
FE->>BE: POST /admin/media/finalize-upload (file_key)
Note over BE, R2: 4. Xác thực (Verification)
BE->>R2: S3 HEAD Request (Verify Exist & Size)
R2-->>BE: 200 OK (Metadata: size_bytes)
Note over BE, DB: 5. Lưu trữ Metadata
BE->>DB: Upsert MediaFile (key, name, size)
DB-->>BE: Success
BE-->>FE: 200 OK (Permanent CDN URL) Tại sao cần bước Finalize?¶
- Xác thực tồn tại: Backend chỉ lưu thông tin vào DB khi chắc chắn file đã nằm trên R2 thành công.
- Lấy Metadata chính xác: Thay vì tin vào số liệu từ Frontend, Backend trực tiếp hỏi R2 để lấy
size_bytesthực tế. - Idempotency: Bước Finalize có thể chạy lại nhiều lần cho cùng một
file_keymà không tạo ra bản ghi thừa.
🌟 Trải nghiệm Học thử (Trial Lesson Experience)¶
Tính năng "Học thử" (Sneak Peek) được thiết kế để tăng độ tin tưởng của học viên bằng cách cho phép truy cập một phần nội dung chất lượng cao trước khi mua khóa học.
Cơ chế kỹ thuật¶
- Flag bài học: Mỗi
Lessontrong Database có một thuộc tínhis_preview(Boolean). - Quyền truy cập: Endpoint Public lấy khóa học sẽ trả về đầy đủ nội dung (HTML/Video) cho các bài giảng có
is_preview=True, bất kể học viên đã mua hay chưa. - Giao diện:
- Trang Lộ trình học tập (Roadmap) sẽ hiển thị các bài giảng này với badge "Học thử" hoặc biểu tượng mở khóa.
- Học viên có thể click vào và xem nội dung video/biểu đồ ngay lập tức.
Lợi ích thiết thực¶
- Học viên: Đánh giá được phong cách giảng dạy và chất lượng hình ảnh/âm thanh mà không tốn chi phí.
- Giảng viên: Marketing gián tiếp khóa học thông qua những bài giảng tâm đắc nhất.
📦 Hạ tầng & Dịch vụ Cloud¶
|---|---|---| | Frontend Hosting | Cloudflare Pages | Tốc độ CDN cực nhanh, tích hợp CI/CD | | Backend Hosting | Northflank | Docker container scaling, quản lý biến môi trường | | Database | Supabase (PostgreSQL) | Managed DB, sao lưu tự động | | Object Storage | Cloudflare R2 | Lưu trữ video/ảnh bài giảng (S3-compatible) | | CDN | Cloudflare R2 Public | Tăng tốc tải tài nguyên tĩnh |