- Giới thiệu dự án
- Yêu cầu hệ thống
- Cấu trúc dự án
- Cài đặt Database
- Cài đặt Backend
- Cài đặt Frontend
- Cài đặt Python App (Optional)
- Cài đặt Electron App (Optional)
- Chạy dự án với Docker
- Troubleshooting
DriveHub là ứng dụng trợ lý trường dạy lái xe đa nền tảng với các tính năng:
- ✅ Ôn tập lý thuyết với 600 câu hỏi
- ✅ Thi thử trực tuyến
- ✅ Quản lý hồ sơ học viên
- ✅ Hỗ trợ đa môn học (A1, A2, B1, B2, C, D, E, F)
- ✅ Hệ thống xếp hạng và theo dõi tiến độ
- ✅ Quét QR code và nhận diện hình ảnh
- Node.js: v18.20.3 hoặc v20.17.0
- npm: 10.x trở lên
- MySQL: 5.5.30 hoặc 8.0 trở lên
- Python: 3.8+ (nếu chạy Python App)
- Docker & Docker Compose: (nếu chạy bằng Docker)
- Windows 10/11
- macOS 10.15+
- Linux (Ubuntu 20.04+)
DriveHub/
├── backend/ # Backend services
│ ├── node-app/ # Node.js API server
│ │ ├── src/
│ │ │ ├── server.js # Entry point
│ │ │ ├── config/ # Cấu hình database
│ │ │ ├── models/ # Sequelize models
│ │ │ ├── routes/ # API routes
│ │ │ ├── controller/ # Business logic
│ │ │ ├── middleware/ # Authentication, validation
│ │ │ ├── service/ # Services
│ │ │ ├── websocket/ # WebSocket server
│ │ │ └── bot/ # Telegram bot
│ │ ├── .env # Environment variables
│ │ └── package.json
│ ├── python-app/ # Python service (OCR, QR)
│ └── docker-compose.yml # Docker configuration
├── frontend/ # React TypeScript app
│ ├── src/
│ │ ├── App.tsx # Main app component
│ │ ├── components/ # React components
│ │ ├── pages/ # Page components
│ │ ├── api/ # API calls
│ │ └── services/ # Business services
│ ├── .env # Environment variables
│ └── package.json
├── csv/ # SQL dump files
├── TN_KT5MON_LAST.sql # Database schema & data
├── main.js # Electron main process
├── preload.js # Electron preload script
└── package.json # Electron configuration
Windows:
- Download MySQL từ: https://dev.mysql.com/downloads/installer/
- Chạy installer và chọn "Developer Default"
- Thiết lập root password:
12345
macOS:
brew install mysql
brew services start mysql
mysql_secure_installationLinux (Ubuntu):
sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
sudo mysql_secure_installation# Đăng nhập MySQL
mysql -u root -p
# Nhập password: 12345
# Tạo database
CREATE DATABASE userstatus CHARACTER SET utf16 COLLATE utf16_unicode_ci;
# Kiểm tra
SHOW DATABASES;
# Thoát
EXIT;# Import file SQL chính
mysql -u root -p12345 userstatus < TN_KT5MON_LAST.sql
# Hoặc từ MySQL prompt
mysql -u root -p
USE userstatus;
SOURCE /path/to/TN_KT5MON_LAST.sql;USE userstatus;
-- Kiểm tra các bảng
SHOW TABLES;
-- Kiểm tra dữ liệu
SELECT COUNT(*) FROM question;
SELECT COUNT(*) FROM test;
SELECT COUNT(*) FROM subject;Các bảng chính:
user- Người dùng (học viên, giáo viên, admin)thisinh- Thông tin thí sinhquestion- Câu hỏi thitest- Đề thiexam- Bài thi đã làmsubject- Môn học (A1, A2, B1, B2, C, D, E, F)khoahoc- Khóa họcrank- Xếp hạngqr- QR codesdetect- Dữ liệu nhận diện
cd backend/node-appnpm installDependencies chính:
express- Web frameworksequelize- ORM cho MySQLmysql2- MySQL driverjsonwebtoken- JWT authenticationbcrypt- Password hashingcors- CORS middlewaredotenv- Environment variablesws- WebSocket servermulter- File uploadaxios- HTTP clienttelegraf- Telegram bot
Tạo/chỉnh sửa file .env:
# Backend .env
JWT_SECRET=Khavy
BOT_TOKEN=6287309426:AAE82kG-sMV8fd54oFIMsk87ZeogOy40Ur8
PORT=8080
IPNLTB=117.2.131.102
NODE_ENV=developmentChỉnh sửa src/config/config.json:
{
"development": {
"username": "root",
"password": "12345",
"database": "userstatus",
"host": "127.0.0.1",
"dialect": "mysql",
"timezone": "+07:00",
"logging": false,
"define": {
"freezeTableName": true
}
},
"test": {
"username": "root",
"password": "12345",
"database": "userstatus",
"host": "127.0.0.1",
"dialect": "mysql",
"timezone": "+07:00",
"logging": false,
"define": {
"freezeTableName": true
}
}
}Lưu ý: Thay đổi username, password, database theo cấu hình MySQL của bạn.
# Chạy migrations
npm run rmigration
# Hoặc với environment cụ thể
npx sequelize-cli db:migrate --env development# Chạy tất cả seeders
npm run rseederall
# Hoặc chạy seeder cụ thể
npm run rseeder -- --seed seeder-file-name.jsDevelopment mode (với nodemon):
npm run devProduction mode:
npm startKiểm tra:
- Backend sẽ chạy tại:
http://127.0.0.1:8080 - WebSocket server:
ws://127.0.0.1:8080/ws/student-status
# Test health check
curl http://localhost:8080/
# Test API endpoint (ví dụ)
curl http://localhost:8080/api/subjectscd frontendnpm installDependencies chính:
reactv18.2.0 - UI libraryreact-router-dom- Routingaxios- HTTP clienttypescript- Type safetytailwindcss- CSS frameworkdaisyui- UI componentsformik- Form handlingreact-toastify- Notificationsmoment- Date handlingxlsx- Excel exporthtml2canvas&jspdf- PDF export
Tạo/chỉnh sửa file .env:
# Frontend .env
REACT_APP_BUILD=development
# REACT_APP_BUILD=buildlocal
# REACT_APP_BUILD=production
# Nếu cần HTTPS (optional)
HTTPS=true
SSL_CRT_FILE=certs/cert.pem
SSL_KEY_FILE=certs/key.pemKiểm tra file src/axios.tsx hoặc src/api/ để đảm bảo API endpoint đúng:
// Ví dụ trong axios.tsx
const API_BASE_URL = process.env.REACT_APP_BUILD === 'development'
? 'http://localhost:8080'
: 'https://be-showstatusapp.onrender.com';# Tạo thư mục certs
mkdir -p certs
# Tạo self-signed certificate
openssl req -x509 -newkey rsa:4096 -keyout certs/key.pem -out certs/cert.pem -days 365 -nodesDevelopment mode:
npm startBuild production:
npm run buildKiểm tra:
- Frontend sẽ chạy tại:
http://localhost:3000(hoặchttps://localhost:3000nếu dùng HTTPS) - Tự động mở browser
- Mở browser tại
http://localhost:3000 - Kiểm tra trang đăng nhập
- Kiểm tra kết nối với Backend API
- Test các chức năng chính:
- Đăng nhập/Đăng ký
- Xem danh sách câu hỏi
- Làm bài thi thử
- Xem kết quả
Python App cung cấp các tính năng:
- OCR (Optical Character Recognition)
- QR Code scanning
- Image processing
cd backend/python-app# Tạo venv
python3 -m venv venv
# Kích hoạt venv
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activatepip install -r requirements.txtDependencies:
flask- Web frameworkfastapi- Modern API frameworkuvicorn- ASGI serveropencv-python- Computer visionpyzbar- QR code decodingnumpy- Numerical computingPillow- Image processingsqlalchemy- Database ORMpydantic- Data validation
# Với Flask
python app/main.py
# Với FastAPI
uvicorn app.main:app --host 0.0.0.0 --port 8081 --reloadKiểm tra:
- Python App sẽ chạy tại:
http://localhost:8081
Electron App cho phép chạy ứng dụng như desktop app trên Windows/macOS/Linux.
cd frontend
npm run buildcd ..npm installDependencies:
electron- Desktop frameworkelectron-builder- Build & packageelectron-updater- Auto-update
npm startBuild cho Windows:
npm run distOutput:
- File
.exesẽ được tạo trong thư mụcv1.0.14_buildTestStudent/ - Tên file:
KiemTraMonHoc-Setup-v1.0.14-x64.exehoặcia32.exe
Cấu hình build:
- Xem file
package.jsonphầnbuild - Có thể tùy chỉnh icon, tên app, target platform
Docker giúp chạy toàn bộ stack (MySQL + Backend + Python App) một cách dễ dàng.
Windows/macOS:
- Download Docker Desktop: https://www.docker.com/products/docker-desktop
Linux:
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl start docker
sudo usermod -aG docker $USERcd backendnpm run docker:build
# Hoặc trực tiếp
docker-compose buildnpm run docker:up
# Hoặc chạy detached mode
docker-compose up -dServices sẽ chạy:
mysql_db- MySQL 8.0 (port 3307 → 3306)node-app- Backend API (port 8080)python-app- Python service (port 8081)
npm run docker:migrate
# Hoặc
docker exec -it node_app_container npx sequelize-cli db:migrate --env docker_testnpm run docker:seed
# Hoặc
docker exec -it node_app_container npx sequelize-cli db:seed:all --env docker_test# Xem containers đang chạy
docker ps
# Xem logs
docker logs node_app_container
docker logs mysql_container
docker logs python_app_container
# Vào container
docker exec -it node_app_container bash
docker exec -it mysql_container mysql -u root -p12345npm run docker:down
# Hoặc giữ lại volumes
docker-compose down
# Xóa tất cả (bao gồm volumes và images)
docker-compose down --rmi all --volumesLỗi: ER_ACCESS_DENIED_ERROR hoặc ECONNREFUSED
Giải pháp:
# Kiểm tra MySQL đang chạy
# Windows
net start MySQL80
# macOS
brew services list
# Linux
sudo systemctl status mysql
# Kiểm tra user và password
mysql -u root -p12345
# Reset password nếu cần
ALTER USER 'root'@'localhost' IDENTIFIED BY '12345';
FLUSH PRIVILEGES;Lỗi: EADDRINUSE: address already in use :::8080
Giải pháp:
# Windows
netstat -ano | findstr :8080
taskkill /PID <PID> /F
# macOS/Linux
lsof -i :8080
kill -9 <PID>
# Hoặc đổi port trong .env
PORT=8081Lỗi: EACCES hoặc permission denied
Giải pháp:
# Xóa node_modules và package-lock.json
rm -rf node_modules package-lock.json
# Clear npm cache
npm cache clean --force
# Cài lại
npm install
# Nếu vẫn lỗi, dùng sudo (Linux/macOS)
sudo npm install --unsafe-perm=true --allow-rootLỗi: Access-Control-Allow-Origin
Giải pháp:
- Kiểm tra file
backend/node-app/src/config/cors.js - Đảm bảo frontend URL được thêm vào whitelist
- Restart backend sau khi thay đổi
Lỗi: ERROR: Table already exists
Giải pháp:
# Undo migrations
npx sequelize-cli db:migrate:undo:all
# Chạy lại
npx sequelize-cli db:migrate
# Hoặc import trực tiếp SQL file
mysql -u root -p12345 userstatus < TN_KT5MON_LAST.sqlGiải pháp:
- Kiểm tra Backend đang chạy:
curl http://localhost:8080 - Kiểm tra API endpoint trong frontend code
- Kiểm tra CORS configuration
- Xem console log trong browser (F12)
- Kiểm tra Network tab để xem request/response
Lỗi: Cannot connect to Docker daemon
Giải pháp:
# Khởi động Docker service
# Windows/macOS: Mở Docker Desktop
# Linux
sudo systemctl start docker
sudo systemctl enable docker
# Thêm user vào docker group
sudo usermod -aG docker $USER
newgrp dockerLỗi: NET::ERR_CERT_AUTHORITY_INVALID
Giải pháp:
- Đây là cảnh báo bình thường với self-signed certificate
- Click "Advanced" → "Proceed to localhost"
- Hoặc tắt HTTPS trong
.env:HTTPS=false
Lỗi: WebSocket connection failed
Giải pháp:
- Kiểm tra Backend WebSocket server đang chạy
- Kiểm tra URL:
ws://localhost:8080/ws/student-status - Kiểm tra firewall không block port
- Xem backend logs để debug
Lỗi: ModuleNotFoundError hoặc build errors
Giải pháp:
# Cài đặt system dependencies (Ubuntu)
sudo apt-get install python3-dev libzbar0
# macOS
brew install zbar
# Windows: Download pre-built wheels
pip install opencv-python-headless
# Upgrade pip
pip install --upgrade pip setuptools wheel- Database name:
userstatus(hoặcTN_KT5theo yêu cầu) - Username:
root - Password:
12345 - Host:
127.0.0.1(localhost) - Port:
3306(mặc định MySQL) - Charset:
utf16_unicode_ci
- Backend API: 8080
- Frontend: 3000
- Python App: 8081
- MySQL: 3306 (hoặc 3307 trong Docker)
- WebSocket: 8080 (cùng port với Backend)
- Development: Chạy local với
npm run devvànpm start - Production: Build với
npm run buildvà deploy - Docker: Chạy toàn bộ stack với
docker-compose up
- Kiểm tra bảng
userđể xem tài khoản có sẵn - Hoặc tạo tài khoản mới qua API/Frontend
# 1. Setup Database
mysql -u root -p
CREATE DATABASE userstatus CHARACTER SET utf16 COLLATE utf16_unicode_ci;
EXIT;
mysql -u root -p12345 userstatus < TN_KT5MON_LAST.sql
# 2. Backend
cd backend/node-app
npm install
npm run dev
# 3. Frontend (terminal mới)
cd frontend
npm install
npm start
# 4. Truy cập
# Frontend: http://localhost:3000
# Backend: http://localhost:8080- Author: Khả Vy (fb: nhoke.bola)
- GitHub: https://github.com/khavy1203/DriveHub
- Version: v1.0.14
ISC License
Chúc bạn cài đặt thành công! 🎉