Hệ thống điều hành tour du lịch nội bộ — backend Django cho toàn bộ quy trình từ tiếp nhận báo giá, quản lý nhà cung cấp, đến điều phối lịch trình và theo dõi tài chính.
Tích hợp trực tiếp với TourQuote Pro — hệ thống báo giá frontend (React/Vite). Khi nhân viên chốt báo giá, dữ liệu được đẩy tự động sang TravelMaster-Core qua REST API để bắt đầu quy trình điều hành.
TourQuote Pro ──── POST /api/import-quote/ ────► TravelMaster-Core
(React/Vite) X-API-Key header (Django 5.x + SQLite)
│
┌───────────┴───────────┐
│ tours / suppliers │
│ finance / scheduling │
└───────────────────────┘
Luồng hoạt động:
- Nhân viên lập báo giá trên TourQuote Pro (tính chi phí, markup, VAT)
- Nhấn 🚀 Chốt & Điều hành → payload JSON chuẩn được gửi sang backend
- TravelMaster-Core tiếp nhận, lưu vào DB và tạo tour trong hệ thống điều hành
- Quản lý theo dõi tiến độ qua giao diện Django Admin hoặc các view nội bộ
TravelMaster-Core/
├── config/
│ ├── settings.py # Cấu hình Django (đọc từ .env)
│ ├── urls.py # URL routing gốc
│ ├── wsgi.py / asgi.py
│ └── __init__.py
│
├── tours/ # App cốt lõi — quản lý tour & import báo giá
│ ├── models.py # Tour, TourService, Pax
│ ├── views.py
│ ├── api_import.py # Endpoint nhận JSON từ TourQuote Pro
│ ├── auth.py # Decorator xác thực X-API-Key
│ └── urls.py
│
├── suppliers/ # Quản lý nhà cung cấp (khách sạn, xe, HDV...)
├── finance/ # Theo dõi chi phí thực tế, công nợ
├── scheduling/ # Lịch trình, phân công nhân sự
├── templates/ # Django HTML templates
│
├── manage.py
├── requirements.txt
├── .env.example # Mẫu file môi trường (KHÔNG chứa key thật)
└── README.md
| Thành phần | Phiên bản |
|---|---|
| Python | 3.11+ |
| Django | 5.x |
| Database | SQLite (dev) / PostgreSQL (production) |
| OS | macOS / Linux / Windows (WSL) |
git clone https://github.com/jasondam2680/TravelMaster-Core.git
cd TravelMaster-Corepython -m venv venv
# macOS / Linux
source venv/bin/activate
# Windows
venv\Scripts\activatepip install -r requirements.txtSao chép file mẫu và điền thông tin thật:
cp .env.example .envMở .env và cập nhật:
# .env — KHÔNG commit file này lên Git
SECRET_KEY=your-secret-key-here
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1
# API Key để xác thực request từ TourQuote Pro
TOURQUOTE_API_KEY=your-api-key-here
# CORS — domain được phép gọi API
CORS_ALLOWED_ORIGINS=http://localhost:5173Để tạo
SECRET_KEYmạnh:python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"Để tạo
TOURQUOTE_API_KEYngẫu nhiên:python -c "import secrets; print(secrets.token_urlsafe(32))"
python manage.py migrate
python manage.py createsuperuserpython manage.py runserverServer khởi động tại http://localhost:8000
Django Admin tại http://localhost:8000/admin/
Tiếp nhận báo giá đã chốt từ TourQuote Pro và tạo tour trong hệ thống điều hành.
Headers bắt buộc:
| Header | Giá trị |
|---|---|
Content-Type |
application/json |
X-API-Key |
Key khớp với TOURQUOTE_API_KEY trong .env |
Request body (JSON chuẩn):
{
"quote_id": "DN-HA-001",
"confirmed_at": "2026-04-29T14:00:00.000Z",
"customer": {
"name": "Công ty TNHH ABC",
"pax": 20,
"pax_detail": { "adult": 18, "child": 2 }
},
"tour": {
"name": "Đà Nẵng – Hội An 4N3Đ",
"start_date": "2026-05-10",
"end_date": "2026-05-13",
"prepared_by": "Jason"
},
"services": [
{
"category": "accommodation",
"name": "Khách sạn 3 sao (3 đêm)",
"qty": 20,
"unit_price": 600000,
"currency": "VND",
"unit_price_vnd": 600000,
"times": 3,
"total_vnd": 36000000,
"note": ""
}
],
"pricing": {
"base_cost_vnd": 85000000,
"markup_pct": 18,
"discount_pct": 0,
"vat_pct": 0,
"selling_price_vnd": 100300000,
"display_currency": "VND"
}
}Response thành công (200 OK):
{
"status": "ok",
"tour_id": 42,
"message": "Tour đã được tạo thành công trong hệ thống điều hành."
}Response lỗi:
| HTTP Status | Nguyên nhân |
|---|---|
401 Unauthorized |
Thiếu hoặc sai X-API-Key |
400 Bad Request |
JSON thiếu trường bắt buộc |
405 Method Not Allowed |
Không phải POST request |
- Không bao giờ hardcode
SECRET_KEY, API Key, hoặc password vào source code - File
.envđược liệt kê trong.gitignore— không commit lên GitHub DEBUG=Falsebắt buộc ở môi trường production- Mọi request từ TourQuote Pro phải mang header
X-API-Keyhợp lệ
Backend sử dụng django-cors-headers. Chỉ các origin được khai báo trong CORS_ALLOWED_ORIGINS (.env) mới được phép gọi API. Mặc định chỉ cho phép method POST và OPTIONS.
Mọi endpoint nhận dữ liệu từ TourQuote Pro đều được bảo vệ bằng decorator @require_api_key trong tours/auth.py. Key được đọc từ header X-API-Key và so sánh với TOURQUOTE_API_KEY trong settings.
| App | Chức năng chính |
|---|---|
tours |
Quản lý tour, dịch vụ, số pax; endpoint import báo giá |
suppliers |
Danh mục nhà cung cấp: khách sạn, hãng xe, HDV, nhà hàng |
finance |
Chi phí thực tế, đối chiếu báo giá vs thực chi, công nợ |
scheduling |
Lịch trình từng ngày, phân công HDV và tài xế |
Trước khi deploy, kiểm tra lại toàn bộ danh sách sau:
-
DEBUG=Falsetrong.env -
SECRET_KEYlà chuỗi ngẫu nhiên dài, không phải giá trị mặc định -
ALLOWED_HOSTSchứa đúng domain production -
CORS_ALLOWED_ORIGINSchứa đúng domain TourQuote Pro -
TOURQUOTE_API_KEYlà chuỗi ngẫu nhiên 32+ ký tự - Chuyển database từ SQLite sang PostgreSQL
- Cấu hình Nginx + Gunicorn hoặc dùng Railway / Render
- File
.envkhông có trong Git history
| Repo | Mô tả |
|---|---|
| TourQuote Pro | Frontend báo giá tour — React/Vite, hỗ trợ 3 ngôn ngữ (VI/EN/ZH) |
Jason — Tour operator & developer
Ho Chi Minh City, Vietnam