Hệ thống bán vé sự kiện hỗ trợ quản lý và kiểm soát vé cho các sự kiện như concert, hội thảo, workshop. Hệ thống cho phép khách hàng tìm kiếm sự kiện, đặt vé, thanh toán và check-in, đồng thời hỗ trợ ban tổ chức quản lý sự kiện, số lượng vé, doanh thu. Hệ thống giúp tự động hóa quy trình bán vé, hạn chế sai sót, tối ưu quản lý và nâng cao trải nghiệm người dùng.
| MSSV | Họ tên | Vai trò |
|---|---|---|
| 2351050165 | Bùi Thiên Hương Thảo | Nhóm trưởng |
| 2351050189 | Hồ Thị Ngọc Trinh | Thành viên |
| 2351050049 | Lê Thị Mai Hồng | Thành viên |
- Backend: Python Django + Django REST Framework
- Authentication: JWT Authentication
- Background Tasks: Celery
- Frontend: React + Vite + Ant Design + TailwindCSS
- Database: PostgreSQL
- Message Queue: RabbitMQ
- Cache: Redis
- Containerization: Docker + Docker Compose
- Tunnels: Cloudflare Tunnel + Ngrok
- CI/CD & Deployment: GitHub Actions + Render
Hệ thống được thiết kế dựa trên các mô hình kiến trúc sau:
- Client: Frontend (ReactJS)
- Server: Backend (Django REST API)
- Presentation Layer: Frontend (ReactJS)
- Business Logic Layer: Backend (Django)
- Data Access Layer: Database (PostgreSQL)
Hệ thống sử dụng RabbitMQ làm message broker kết hợp Celery để xử lý bất đồng bộ.
Frontend React được tổ chức theo hướng component-based giúp tăng khả năng tái sử dụng và dễ mở rộng UI
- Model: quản lý dữ liệu và ORM
- View: xử lý request/response
- Template: chủ yếu dùng cho admin hoặc trang hỗ trợ
Software-Architecture-A3-Event-Ticketing-Team5/
│
├── .github/
│ └── workflows/
│ └── docker.yml
│
├── backend/
│ ├── src/
│ │ ├── apps/
│ │ │ ├── evt_event/
│ │ │ ├── evt_oauth/
│ │ │ ├── evt_ticket/
│ │ │ └── evt_transaction/
│ │ │
│ │ ├── config/
│ │ │ ├── settings.py
│ │ │ ├── urls.py
│ │ │ ├── wsgi.py
│ │ │ ├── asgi.py
│ │ │ └── celery.py
│ │ │
│ │ ├── fixtures/
│ │ ├── fonts/
│ │ ├── media/
│ │ ├── staticfiles/
│ │ ├── templates/
│ │ └── manage.py
│ │ └── requirements.txt
│ │
│ ├── .dockerignore
│ ├── Dockerfile
│ ├── Dockerfile.dev
│ ├── setup.sh
│ └── setup.dev.sh
│
├── docs/
│ ├── adrs/
│ ├── api/
│ └── architecture/
│
├── frontend/
│ ├── public/
│ ├── src/
│ │ ├── assets/
│ │ ├── components/
│ │ ├── configs/
│ │ ├── hooks/
│ │ ├── libs/
│ │ ├── pages/
│ │ ├── routers/
│ │ ├── services/
│ │ ├── utils/
│ │ ├── App.css
│ │ ├── App.jsx
│ │ ├── index.css
│ │ └── main.jsx
│ │
│ ├── .dockerignore
│ ├── Dockerfile
│ ├── Dockerfile.dev
│ ├── eslint.config.js
│ ├── index.html
│ ├── nginx.conf
│ ├── package-lock.json
│ ├── package.json
│ ├── postcss.config.js
│ ├── tailwind.config.js
│ └── vite.config.js
│
├── weekly-reports/
│
├── docker-compose.yml
├── docker-compose.dev.yml
├── .env.example
├── .env
├── .gitignore
├── LICENSE
└── README.md- Docker Desktop
- Git
- Cloudflare Tunnel
- Ngrok
git clone https://github.com/Thao225/Software-Architecture-A3-Event-Ticketing-Team5.git
cd Software-Architecture-A3-Event-Ticketing-Team5cp .env.example .envSau đó chỉnh sửa .env theo cấu hình hệ thống.
Database (PostgreSQL)
DATABASE_NAME="your_name"
DATABASE_USERNAME="your_username"
DATABASE_PASSWORD="your_password"
DATABASE_HOST="db"
DATABASE_PORT="5432"Django Secret Key Tạo secret key cho Django:
python3 -c "import secrets; import string; chars = string.ascii_lowercase + string.digits + '!@#$%^&*(-_=+)'; print(''.join(secrets.choice(chars) for _ in range(50)))"Copy kết quả vào:
DJANGO_SECRET_KEY="your_secret_key"RabbitMQ + Redis
CELERY_BROKER_URL="amqp://your_user:your_pass@rabbitmq:5672//"
CELERY_RESULT_BACKEND="redis://redis:6379/1"
RABBITMQ_USER="your_user"
RABBITMQ_PASS="your_pass"
REDIS_URL="redis://redis:6379/1"Super Admin
DJANGO_SUPERUSER_USERNAME="admin"
DJANGO_SUPERUSER_EMAIL="admin@gmail.com"
DJANGO_SUPERUSER_PASSWORD="admin123"Public URL cho Backend Chạy ngrok cho backend:
ngrok http 8000Sau đó bạn sẽ nhận được link dạng:
https://xxxxx.ngrok-free.apphoặc
https://xxxxx.ngrok-free.devCopy link này và cập nhật vào .env:
ZALOPAY_CALLBACK_URL="https://xxxxx.ngrok-free.app/api/payment/zalopay/callback/"Ngoài ra cần thêm domain ngrok vào DJANGO_ALLOWED_HOSTS:
DJANGO_ALLOWED_HOSTS="localhost,127.0.0.1,.ngrok-free.dev,.ngrok-free.app,.trycloudflare.com"Nếu frontend gọi API backend bằng public URL, chỉnh:
VITE_BASE_URL="https://xxxxx.ngrok-free.app"Và chỉnh websocket:
VITE_WS_URL="wss://xxxxx.ngrok-free.app/ws"Public URL cho Frontend Chạy Cloudflare Tunnel cho frontend:
cloudflared tunnel --url http://localhost:5173Sau đó bạn sẽ nhận được link dạng:
https://xxxxx.trycloudflare.comCopy link này và cập nhật vào .env:
CORS_ALLOWED_ORIGINS="http://localhost:5173,http://127.0.0.1:5173,https://xxxxx.trycloudflare.com"Cấu hình Redirect URL sau thanh toán:
PAYMENT_RETURN_URL="https://xxxxx.trycloudflare.com/payment-return"Cấu hình VNPay
VNP_TMNCODE=""
VNP_HASH_SECRET=""
VNP_URL="https://sandbox.vnpayment.vn/paymentv2/vpcpay.html"
VNP_QUERY_URL=""
VNP_REFUND_URL=""Cấu hình ZaloPay
ZALOPAY_APP_ID=""
ZALOPAY_KEY1=""
ZALOPAY_KEY2=""
ZALOPAY_CALLBACK_URL="https://xxxxx.ngrok-free.app/api/payment/zalopay/callback/"
ZALOPAY_REFUND_URL="https://sb-openapi.zalopay.vn/v2/refund"docker compose -f docker-compose.dev.yml up --build -d- Frontend: http://localhost:5173
- Backend API: http://localhost:8000
- RabbitMQ Management: http://localhost:15672
- Screenshots: (update later)
- Video demo: (update later)


