Web app cho sự kiện GM Vietnam với hệ thống QR code scoring và leaderboard real-time.
- Đăng nhập với Telegram username - Lưu trữ persistent với localStorage
- Bảng xếp hạng real-time - Cập nhật tự động khi có điểm mới
- Hệ thống QR code - Quét QR để nhận điểm từ các booth
- Admin panel - Tạo QR code cho từng booth với điểm số tùy chỉnh
- 5 Booth khác nhau - Coding, Gaming, Quiz, Design, Startup Pitch
- Responsive design - Hoạt động tốt trên mobile và desktop
- Frontend: React + TypeScript + Vite
- Styling: Tailwind CSS
- Database: Firebase Firestore
- QR Code: qrcode library
- Routing: React Router
- Deployment: Vercel
git clone <repository-url>
cd gm-vietnam-event
npm install- Tạo project mới trên Firebase Console
- Enable Firestore Database
- Tạo web app và copy config
- Copy
.env.examplethành.envvà điền thông tin Firebase:
VITE_FIREBASE_API_KEY=your_api_key
VITE_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com
VITE_FIREBASE_PROJECT_ID=your_project_id
VITE_FIREBASE_STORAGE_BUCKET=your_project.appspot.com
VITE_FIREBASE_MESSAGING_SENDER_ID=your_sender_id
VITE_FIREBASE_APP_ID=your_app_id
VITE_USE_FIREBASE_PROD=true
VITE_APP_URL=http://localhost:5173rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Users collection
match /users/{userId} {
allow read: if true;
allow write: if true;
}
// QR tokens collection
match /qr-tokens/{tokenId} {
allow read: if true;
allow write: if true;
}
}
}npm run devnpm install -g vercel
vercel loginvercel --prodThêm các environment variables sau trong Vercel dashboard:
VITE_FIREBASE_API_KEYVITE_FIREBASE_AUTH_DOMAINVITE_FIREBASE_PROJECT_IDVITE_FIREBASE_STORAGE_BUCKETVITE_FIREBASE_MESSAGING_SENDER_IDVITE_FIREBASE_APP_IDVITE_USE_FIREBASE_PROD=trueVITE_APP_URL=https://gm-three-lac.vercel.app
- Vào website và nhập username Telegram
- Xem bảng xếp hạng và tiến trình cá nhân
- Quét QR code tại các booth để nhận điểm
- Theo dõi thứ hạng real-time
- Vào
/admin/booth1(thay booth1 bằng booth2, booth3, booth4, booth5) - Nhập điểm số muốn trao (trong khoảng cho phép)
- Tạo QR code
- Cho người chơi quét QR code
- Tạo QR code mới cho người chơi tiếp theo
{
telegram: string; // @username
totalScore: number; // Tổng điểm
playedBooths: { // Booth đã chơi
booth1: boolean;
booth2: boolean;
// ...
};
createdAt: Timestamp;
}{
id: string; // Token ID
boothId: string; // booth1, booth2, etc.
points: number; // Điểm số
used: boolean; // Đã sử dụng chưa
createdAt: Timestamp; // Thời gian tạo
usedAt?: Timestamp; // Thời gian sử dụng
usedBy?: string; // Người sử dụng
}- booth1: Coding Challenge (10-50 điểm)
- booth2: Gaming Arena (10-40 điểm)
- booth3: Tech Quiz (5-30 điểm)
- booth4: Design Battle (10-45 điểm)
- booth5: Startup Pitch (10-35 điểm)
npm run dev- Chạy development servernpm run build- Build productionnpm run preview- Preview production buildnpm run lint- Chạy ESLint
- QR code có hiệu lực 24 giờ
- Mỗi QR code chỉ sử dụng được 1 lần
- Mỗi booth chỉ chơi được 1 lần per user
- Real-time updates với Firestore listeners
- Fallback to localStorage nếu Firebase lỗi