Mạng xã hội dành riêng cho lập trình viên — nơi chia sẻ code, tìm mentor, và cộng tác dự án cùng nhau. Xây dựng bằng Flutter (ứng dụng di động) + NestJS (máy chủ API) + Trí tuệ nhân tạo.
Nhấn vào bất kỳ màn hình nào để xem chi tiết kỹ thuật và các tính năng liên quan
Toàn bộ hệ thống được chia thành 4 phần chính, hoạt động phối hợp với nhau
Flutter 3.x + Dart
NestJS + TypeScript
PostgreSQL + MongoDB + Redis
Gemini 2.0 Flash + SVD (scipy)
Ứng dụng Flutter → Máy chủ NestJS API → PostgreSQL (dữ liệu chính)
↕ ↕ MongoDB (dữ liệu chat)
Socket.io Tác vụ nền BullMQ Redis (bộ nhớ đệm)
↕ ↕ VPS Storage (ảnh/video, chia thư mục)
Thời gian thực Firebase FCM Gemini AI (AI đánh giá code)
Áp dụng cho toàn bộ hệ thống, không riêng tính năng nào
Không tải hết dữ liệu — chỉ lấy 20 mục mỗi lần. Cuộn xuống → tự tải thêm. Dùng "con trỏ" thay vì số trang để tránh lặp dữ liệu.
Lấy 21 dòng, hiện 20, dòng 21 = biết còn tiếp hay không
Chống spam và tấn công — mỗi IP chỉ được gửi tối đa 100 yêu cầu/phút. Đăng nhập sai: tối đa 5 lần/phút. Đăng bài: 10 lần/phút.
Vượt giới hạn → trả lỗi 429 "Quá nhiều yêu cầu"
Dữ liệu hay truy cập được lưu tạm trong Redis (bộ nhớ siêu nhanh). Lần sau truy cập → trả ngay từ Redis, không cần hỏi database.
Có trong cache → trả ngay | Không có → hỏi DB → lưu cache
Khi bấm "Thích" hay "Theo dõi" → giao diện thay đổi NGAY LẬP TỨC, không đợi máy chủ. Nếu máy chủ báo lỗi → tự hoàn tác.
Bấm Like → trái tim đỏ ngay → API chạy nền → lỗi? → hoàn tác
WebSocket giữ kênh mở liên tục — tin nhắn mới, thông báo, trạng thái online đều cập nhật tức thì, không cần tải lại trang.
Mất kết nối → tự kết nối lại: 1s → 2s → 4s → tối đa 30s
Ảnh upload → tự nén và tạo 2 phiên bản: ảnh nhỏ (xem nhanh trong danh sách) + ảnh gốc (xem chi tiết). Lưu trên VPS theo thư mục.
Upload → nén 1200px → tạo thumb 300px + gốc → lưu /uploads/
14 công nghệ production-grade cho nền tảng mạng xã hội lập trình viên
| Công nghệ | Phân loại | Vai trò | Chi tiết sử dụng |
|---|---|---|---|
| Flutter 3.x | Giao diện | Ứng dụng di động | Viết 1 lần chạy cả Android + iOS. Quản lý trạng thái Riverpod, gọi API qua Dio, ảnh tự cache |
| Dart | Giao diện | Ngôn ngữ lập trình | Ngôn ngữ của Flutter, hỗ trợ null safety, xử lý bất đồng bộ tốt |
| NestJS | Máy chủ | API + WebSocket | Framework phía máy chủ, kiến trúc module. Guards (bảo vệ), Pipes (kiểm tra dữ liệu), WebSocket Gateway |
| TypeScript | Máy chủ | Ngôn ngữ lập trình | JavaScript nâng cao, kiểm tra kiểu dữ liệu tại lúc viết code, giảm lỗi runtime |
| PostgreSQL | CSDL | Cơ sở dữ liệu chính | Lưu người dùng, bài viết, theo dõi, tương tác, thông báo. Tìm kiếm full-text (tsvector + GIN). ORM Prisma |
| MongoDB | CSDL | Cơ sở dữ liệu chat | Lưu hội thoại + tin nhắn. Schema linh hoạt (text/ảnh/code/reactions). Tối ưu ghi nhanh liên tục |
| Redis | CSDL | Bộ nhớ đệm + thời gian thực | Cache feed (5 phút), profile (10 phút). Đếm giới hạn truy cập. Lưu trạng thái online |
| VPS Storage | Lưu trữ | Lưu trữ file trên VPS | Avatar, ảnh bài viết. Chia thư mục: /uploads/avatars/, /uploads/posts/, /uploads/chat/. Tạo 2 phiên bản: thumb + gốc. Nginx phục vụ file tĩnh |
| Gemini 2.0 Flash | AI | Trí tuệ nhân tạo | Đánh giá code (chấm điểm 1-10, tìm lỗi), giải thích code (3 cấp độ), ghép mentor. Miễn phí: 15 yêu cầu/phút |
| Firebase FCM | Dịch vụ | Thông báo đẩy | Gửi thông báo khi người dùng offline. Hỗ trợ Android + iOS. Badge đếm số, nhấn vào → mở đúng bài viết |
| Docker | Vận hành | Đóng gói ứng dụng | Gói toàn bộ hệ thống vào container, chạy ở đâu cũng được. Compose: API, PostgreSQL, MongoDB, Redis |
| BullMQ | Máy chủ | Hàng đợi tác vụ | Xử lý nền: tái tính feed (15 phút), SVD (6 giờ), gửi email, gộp thông báo, dọn dẹp ảnh lẻ |
| scipy (SVD) | AI | Thuật toán gợi ý | Phân tích hành vi người dùng (xem/thích/lưu) → tìm bài viết phù hợp. Kết hợp: SVD 50% + nội dung 30% + mới 10% + bạn bè 10% |
| Judge0 API | Dịch vụ | Chạy code trực tuyến | Sân chơi code an toàn — chạy Python, JS, Dart, C++. Cách ly hoàn toàn (không mạng, giới hạn RAM). Miễn phí 50 lần/ngày |
Mỗi tính năng ghi rõ: cách hoạt động, luồng xử lý, API, cơ sở dữ liệu, tình huống đặc biệt