Môn học: Tư duy tính toán
Học kỳ: 1 - Năm học 2025
| MSSV | Họ và Tên | |
|---|---|---|
| 24127137 | Nguyễn Thanh Trúc | 24127137@student.hcmus.edu.vn |
| 24127422 | Đào Minh Khoa | 24127422@student.hcmus.edu.vn |
| 24127018 | Trần Lưu Gia Bảo | 24127018@student.hcmus.edu.vn |
| 24127337 | Nguyễn Tiến Cường | 24127337@student.hcmus.edu.vn |
| 24127252 | Nguyễn Khánh Toàn | 24127252@student.hcmus.edu.vn |
| 24127226 | Phạm Trần Anh Quân | 24127226@student.hcmus.edu.vn |
- PhD. Nguyễn Tiến Huy
- PhD. Lê Thanh Tùng
- Mr. Trần Hoàng Quân
Travel Together là ứng dụng di động thông minh giúp kết nối những người đam mê du lịch, hỗ trợ lập kế hoạch hành trình nhóm và chia sẻ trải nghiệm. Với sự kết hợp giữa công nghệ AI tiên tiến và giao diện thân thiện, Travel Together mang đến trải nghiệm du lịch hoàn hảo cho mọi người.
- Kết nối cộng đồng: Tìm kiếm và kết nối với những người có cùng sở thích du lịch
- Lập kế hoạch thông minh: Công cụ lập lịch trình, tối ưu hoá lộ trình và định vị GPS
- Giao tiếp realtime: Chat nhóm, thông báo đẩy và chia sẻ hình ảnh ngay lập tức
- Trợ lý AI: Chatbot thông minh hỗ trợ gợi ý địa điểm, lên kế hoạch
- An toàn bảo mật: Tăng cường bảo vệ người dùng và tài khoản với cơ chế mã PIN kép (Dual PIN)
- Đăng ký/Đăng nhập với Email + Password
- JWT Token Authentication với Firebase Admin SDK
- Quản lý phiên đăng nhập an toàn
- Cơ chế mã PIN kép: Nếu không nhập mã PIN sau 36 giờ, hệ thống tự động gửi định vị khẩn cấp đến email của người thân
- Tạo và tham gia nhóm du lịch
- Khám phá nhóm theo địa điểm, thời gian
- Phân quyền Host/Member với các chức năng riêng biệt
- Lịch trình nhóm với Table Calendar
- Quản lý chi phí chung
- Deep Semantic Matching AI: Sử dụng AI để so sánh lịch trình cá nhân của người dùng với các nhóm hiện có dựa trên "ngữ nghĩa" (ví dụ: hiểu rằng "Bờ Hồ" và "Hồ Hoàn Kiếm" là một) để đưa ra gợi ý gia nhập nhóm chính xác nhất
- Cơ chế Phê duyệt Thành viên: Quản lý danh sách yêu cầu gia nhập, cho phép Host duyệt hoặc từ chối thành viên mới
- Reputation & Review System: Hệ thống đánh giá thành viên sau mỗi chuyến đi, tính toán điểm uy tín (Average Rating) dựa trên phản hồi của các thành viên khác trong nhóm
- WebSocket chat realtime trong nhóm
- Gửi/nhận hình ảnh với Supabase Storage
- Trạng thái đã xem tin nhắn (Read receipts)
- Thông báo đẩy với Firebase Cloud Messaging
- Lưu trữ lịch sử chat không giới hạn
- Tích hợp Google Gemini AI
- Gợi ý địa điểm, nhà hàng, khách sạn
- Lập kế hoạch hành trình tự động
- Phân tích hình ảnh và đề xuất địa điểm tương tự
- Lưu session chat cho mỗi người dùng
- AI Destination Ranking: AI chấm điểm (0-100) các địa điểm dựa trên sự phù hợp trực tiếp về sở thích, độ tuổi, giới tính của người dùng
- Tích hợp Flutter Map với OpenStreetMap
- Vẽ tuyến đường với Polyline Points
- Đánh dấu địa điểm quan trọng
- Geocoding & Reverse Geocoding
- Tích hợp lớp Layer tùy chỉnh hiển thị đầy đủ quần đảo Hoàng Sa và Trường Sa của Việt Nam
- Material Design 3
- Animations với Flutter Animate
- Chuyển đổi ngôn ngữ tiếng việt <-> tiếng anh với Easy Localization
| Công nghệ | Phiên bản | Mục đích |
|---|---|---|
| Flutter SDK | 3.0+ | Framework chính |
| Dart | 3.0+ | Ngôn ngữ lập trình |
| Supabase Flutter | 2.10.3 | Realtime database & Storage |
| Firebase Core | 3.6.0 | Firebase services |
| Firebase Messaging | 15.1.3 | Push notifications |
| HTTP | 1.2.0 | REST API calls |
| WebSocket Channel | 3.0.3 | Realtime chat |
| Flutter Map | 7.0.2 | Map rendering |
| Geolocator | 10.1.0 | GPS location |
| Image Picker | 1.0.7 | Camera/Gallery access |
| Shared Preferences | 2.3.3 | Local storage |
| Hive Flutter | 1.1.0 | NoSQL database |
| Easy Localization | 3.0.8 | Internationalization |
| Flutter Animate | 4.5.2 | UI animations |
| Confetti | 0.7.0 | Celebration effects |
| Công nghệ | Mục đích |
|---|---|
| FastAPI | REST API framework |
| Uvicorn | ASGI server |
| SQLModel | ORM (SQL databases) |
| Supabase Python | Database client |
| Google Generative AI | AI Chatbot (Gemini) |
| Firebase Admin SDK | Authentication & FCM |
| Pydantic | Data validation |
| FastAPI Mail | Email service |
| APScheduler | Background tasks |
| Psycopg2 | PostgreSQL adapter |
- 🗄️ Supabase (PostgreSQL): Database chính, Authentication, Storage
- 🔥 Firebase: Push notifications, Analytics
- 🤖 Google Gemini AI: AI Chatbot service
- Git & GitHub: Version control
- Android Studio / VS Code: Development IDE
- Postman: API testing
- PowerShell Scripts: Automation
- Python 3.8 trở lên
- pip (Python package manager)
- Virtual environment (khuyến nghị)
- PostgreSQL database (hoặc Supabase account)
- Flutter SDK 3.0+
- Dart SDK 3.0+
- Android Studio hoặc VS Code
- Android Emulator hoặc thiết bị Android thật
- Xcode (cho iOS - optional)
- Máy tính và điện thoại phải cùng WiFi (khi chạy local)
- Port 8000 không bị firewall chặn
git clone https://github.com/yourusername/TravelTogether.git
cd TravelTogethercd backend
python -m venv venv
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activatepip install -r requirements.txtTạo file .env trong thư mục backend/:
# Database
SUPABASE_URL=your_supabase_url
SUPABASE_KEY=your_supabase_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key
# JWT
JWT_SECRET_KEY=your_jwt_secret_key_here
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
# Email Service
MAIL_USERNAME=your_email@gmail.com
MAIL_PASSWORD=your_app_password
MAIL_FROM=your_email@gmail.com
MAIL_SERVER=smtp.gmail.com
MAIL_PORT=587
# Firebase
FIREBASE_CREDENTIALS_PATH=./firebase-admin-sdk.json
⚠️ Lưu ý: File.envliên lạc với cn20378@gmail.com để lấy!
Tải file firebase-admin-sdk.json từ Firebase Console và đặt vào thư mục backend/
Cách 1: Sử dụng script (Windows)
.\run_server.batCách 2: Chạy thủ công
uvicorn main:app --reload --host 0.0.0.0 --port 8000Kiểm tra server đang chạy:
Mở browser và truy cập: http://localhost:8000/docs để xem API documentation (Swagger UI)
cd frontend
flutter pub getMở file lib/config/api_config.dart và cập nhật IP của máy chạy backend:
class ApiConfig {
// Thay <YOUR_IP> bằng IP máy tính của bạn
static const String baseUrl = 'http://<YOUR_IP>:8000';
static const String chatWebSocket = 'ws://<YOUR_IP>:8000/ws/chat';
// Hoặc dùng localhost nếu chạy trên emulator
// static const String baseUrl = 'http://10.0.2.2:8000'; // Android Emulator
}Tìm IP máy tính:
# Windows
ipconfig
# macOS/Linux
ifconfigThêm file google-services.json (Android) và GoogleService-Info.plist (iOS) vào thư mục tương ứng:
- Android:
android/app/google-services.json - iOS:
ios/Runner/GoogleService-Info.plist
Tạo file .env trong thư mục frontend/:
SUPABASE_URL=your_supabase_url
SUPABASE_ANON_KEY=your_supabase_anon_keyKiểm tra thiết bị:
flutter devicesChạy app:
# Chạy trên thiết bị đầu tiên
flutter run
# Chạy trên thiết bị cụ thể
flutter run -d <device-id>
# Chạy ở chế độ release
flutter run --releaseHot reload trong khi chạy:
- Nhấn
rđể reload - Nhấn
Rđể restart hoàn toàn - Nhấn
qđể thoát
Mở PowerShell với quyền Administrator và chạy:
New-NetFirewallRule -DisplayName "Travel Backend API" -Direction Inbound -LocalPort 8000 -Protocol TCP -Action AllowKiểm tra rule đã tạo:
Get-NetFirewallRule -DisplayName "Travel Backend API"curl http://localhost:8000/docsMở browser trên điện thoại, truy cập:
http://<IP_MÁY_TÍNH>:8000/docs
Nếu thấy giao diện Swagger UI → Thành công! 🎉
- Mở app Travel Together
- Chọn "Đăng ký" → Nhập email, mật khẩu
- Hoàn thiện hồ sơ (tên, avatar, sở thích)
- Chọn thời gian đi
- Chọn thành phố du lịch
- Chọn địa điểm du lịch trong thành phố đó
- Tạo nhóm:
- Điền thông tin: Tên nhóm, avatar nhóm (optional)
- Tham gia nhóm:
- Chọn nhóm mình muốn dựa trên % tương thích
- Gửi lời mời, đợi xét duyệt
- Vào tab "Cá Nhân" -> "Tình Trạng" để xem tình trạng xét duyệt
- Vào nhóm → Tab "Chat"
- Gửi tin nhắn, ảnh
- Hỏi: "Gợi ý 3 địa điểm du lịch ở Đà Nẵng"
- Upload ảnh để AI phân tích và gợi ý
- Vào tab "Tin Nhắn" -> bấm vào nhóm muốn xem lịch trình
- Bấm vào icon Lộ Trình góc trên phải
- Xem lộ trình tối ưu gồm thời gian, tổng quảng đường, thứ tự chuyến đi tối ưu
- Chỉnh sửa Profile: Vào tab Cá nhân -> Chỉnh sửa hồ sơ để thay đổi thông tin cá nhân, Avatar, cập nhật lại sở thích, mô tả bản thân.
- Đa ngôn ngữ: Vào phần Cài đặt -> Chọn Ngôn ngữ để chuyển đổi giao diện giữa Tiếng Anh và Tiếng Việt.
- Bảo mật: - Đổi mật khẩu: Chọn Cài đặt mật khẩu để cập nhật mật khẩu mới.
- Mã PIN kép: Thiết lập hoặc thay đổi mã PIN bảo vệ để đảm bảo an toàn cho tài khoản.
- Phản hồi nhóm (Member Rating): Sau mỗi chuyến đi, bạn có thể vào tab Phản hồi nhóm để thực hiện đánh giá các thành viên khác. Điều này giúp cộng đồng lọc ra những người bạn đồng hành tích cực.
- Hệ thống Uy tín (Reputation): Truy cập tab Uy tín để xem điểm số tín nhiệm cá nhân của bạn. Điểm này được tổng hợp từ các đánh giá thực tế của những người đã từng đi du lịch cùng bạn.
Dự án này được phát hành dưới giấy phép MIT License.
Xem file LICENSE để biết thêm chi tiết.
- Email: cn20378@gmail.com
- Facebook: https://www.facebook.com/nguyenntc352
- Github: https://github.com/24127337tuduytinhtoan
⚠️ Lưu ý: Nếu gặp sự cố hãy liên lạc với cn20378@gmail.com để hỏi đáp!
- Flutter Documentation
- FastAPI Documentation
- Supabase Documentation
- Firebase Documentation
- Google AI Documentation
Nếu dự án này hữu ích với bạn, hãy cho chúng tôi một ⭐ trên GitHub!
🌟 Star | 🐛 Report Bug | 💡 Request Feature