
Vodka
Thông tin chung
Ứng dụng nhắn tin thời gian thực
Môn học: Công nghệ mới trong phát triển ứng dụng
Thành viên
- Lê Hoàng Khang · developer@iamhoangkhang.id.vn
- Nguyễn Thanh Cảnh · thanhcanh.dev@gmail.comNhóm trưởng
- Trần Đình Kiên
- Hồ Thị Như Tâm
Mã nguồn
Giới thiệu
Vodka là ứng dụng nhắn tin thời gian thực tương tự Zalo, cho phép người dùng kết nối, trò chuyện và chia sẻ khoảnh khắc với bạn bè, gia đình trên cả web và di động.
Kiến trúc hệ thống
Controllers · REST
Gateways · Socket.io namespace
Feature modules
Prisma module
Event module
Cache module
Vodka theo mô hình client-server kết hợp hướng sự kiện (event-driven). Web và mobile chỉ hiển thị và thu thập tương tác; toàn bộ nghiệp vụ nằm ở backend NestJS, chia thành các module tính năng (người dùng, xác thực, tin nhắn, nhóm, bạn bè, danh bạ, lưu trữ, mã QR, AI) dựa trên ba module lõi: Prisma, Event và Cache.
Ba kênh giao tiếp
- REST (
/api/v1, JWT): thao tác CRUD, đăng nhập, đăng ký, tải dữ liệu ban đầu. Tài liệu API sinh tự động bằng Swagger. - WebSocket (Socket.io, xác thực JWT khi bắt tay): tin nhắn, thông báo, trạng thái đang gõ và online. Mỗi loại kết nối một namespace riêng (
/message,/groups,/friends,/auth,/qr-code). Mỗi người dùng ở phònguser:{userId}, mỗi nhóm chat một phònggroup:{groupId}; thêm hay xóa thành viên nhóm thì vào hoặc ra phòng tương ứng. - Sự kiện nội bộ (EventEmitter2): các module báo cho nhau qua sự kiện thay vì gọi trực tiếp, nên ít phụ thuộc và dễ thêm tính năng mới.
Luồng gửi một tin nhắn
- 1Người dùng AClient AGửi tin nhắn
- 2Client AControllerGọi
POST /messageskèm JWT - 3ControllerMessageServiceKiểm tra quyền, xử lý nghiệp vụ
- 4MessageServicePostgreSQLLưu tin nhắn qua Prisma
- 5MessageServiceMessageGatewayPhát sự kiện qua EventEmitter
- 6MessageGatewayClient BĐẩy
newMessagetới phònguser:{id}hoặcgroup:{id} - 7Client BNgười dùng BHiển thị tin nhắn mới
Dữ liệu
- PostgreSQL: dữ liệu chính (người dùng, tin nhắn, nhóm, bạn bè, danh bạ), nhất quán theo ACID; nội dung tin nhắn lưu dạng JSON để chứa cả văn bản lẫn media.
- Redis: mã OTP, dữ liệu đăng ký tạm, phiên làm việc và cache dữ liệu hay truy cập như danh sách cuộc trò chuyện.
- Supabase Storage: ảnh đại diện người dùng và nhóm, file, ảnh, video trong tin nhắn.
Xác thực và phân quyền
Access token sống 30 phút, refresh token 30 ngày. Guard của NestJS kiểm tra quyền theo vai trò trong nhóm: trưởng nhóm, phó nhóm, thành viên. Mã OTP gửi qua email (Resend) hoặc SMS (AWS SNS).
Triển khai
Docker Compose trên Coolify gồm ba container: API, PostgreSQL và Redis. API chờ PostgreSQL và Redis qua health check, tự chạy migration rồi mới khởi động. Có thay đổi trên nhánh chính thì hệ thống tự triển khai lại.
Tính năng
Nhắn tin thời gian thực
Gửi và nhận tin nhắn tức thì qua WebSocket.
Xác thực và hồ sơ người dùng
- Đăng nhập bằng mã QR
- Đăng nhập bằng email và mật khẩu
Tìm kiếm
- Tìm bạn bè
- Tìm tin nhắn
Trợ lý AI
- Soạn email
- Trả lời thông minh
- Gợi ý nội dung
Giao diện hiện đại
Xây dựng bằng shadcn/ui và Tailwind CSS.
Bảo mật
Xác thực bằng JWT cho mọi kết nối.
Server-side rendering
Render phía server để trang tải nhanh.
Cài đặt tài khoản
- Cập nhật email
- Đổi số điện thoại
- Quản lý mật khẩu
Công nghệ sử dụng
Framework
Next.js 14 (App Router)
Ngôn ngữ
TypeScript
UI components
shadcn/ui, Radix UI
Styling
Tailwind CSS
Quản lý trạng thái
Zustand
Thời gian thực
Socket.io (WebSocket)
Xác thực
JWT
Xử lý form
React Hook Form
Gọi API
Server Actions
Cơ sở dữ liệu
PostgreSQL
Giao diện ứng dụng
Trang chủ
Trang chào mừng giới thiệu tính năng và lợi ích của Vodka.

Giao diện chat
Nhắn tin thời gian thực, xem lịch sử tin nhắn và gợi ý từ AI.

Bạn bè và tìm kiếm
Quản lý kết nối và tìm bạn mới.

Trợ lý AI
Soạn email và trả lời thông minh bằng AI.

Cài đặt
Quản lý tài khoản: email, số điện thoại, mật khẩu.

Hồ sơ
Xem và chỉnh sửa hồ sơ người dùng.


