npm install
cp .env.example .env # rồi sửa MONGODB_URI nếu cần
npm run seed # tạo dữ liệu mẫu (tours, destinations, reviews, services)
npm run dev # chạy ở chế độ dev (nodemon)
# hoặc
npm start
Truy cập:
admin / 123456)GET /dat-tour/:id — form đặt tour (họ tên, SĐT, email, số khách, ngày khởi hành, ghi chú), có tóm tắt đơn hàng tự cập nhật tổng tiền theo số khách.POST /dat-tour/:id — xử lý, validate, lưu Booking vào MongoDB, tự sinh mã đặt tour (VBT-YYMMDD-XXXX).GET /dat-tour-thanh-cong/:code — trang xác nhận đặt tour thành công.alert()).Visit mới: mỗi lượt xem trang chi tiết tour được ghi lại kèm visitorId (cookie ẩn danh, tồn tại 1 năm).converted = true./admin/reports)views/admin/partials/sidebar.ejs), thêm mục “📈 Báo Cáo” cho toàn bộ trang quản trị.Tour model thiếu field type (trong/ngoài nước) khiến việc lọc tour và tạo tour mới từ admin bị sai — đã bổ sung.Booking.totalPrice chuyển từ String sang Number để tính doanh thu chính xác; departureDate chuyển sang kiểu Date.seed.js thiếu tour quốc tế và field type — đã bổ sung để trang “Tour nước ngoài” có dữ liệu thật.Lead) — đã sửa lại đúng field thật (tên, SĐT, trạng thái).utils/price.js dùng chung để chuyển đổi giữa chuỗi giá hiển thị (“3.990.000₫”) và số nguyên VNĐ.compression) cho toàn bộ response./css, /js: 7 ngày; /media: 30 ngày).loading="lazy" cho ảnh phụ (thumbnail, ảnh danh sách tour) để giảm tải trang ban đầu..gitignore (loại node_modules, .env khỏi repo).routes/index.js -> trang public + luồng đặt tour
routes/admin.js -> toàn bộ trang quản trị, bao gồm /admin/reports
models/Visit.js -> theo dõi lượt truy cập tour
models/Booking.js -> đơn đặt tour
utils/price.js -> tiện ích xử lý giá tiền
views/booking.ejs -> form đặt tour
views/booking-success.ejs -> trang xác nhận đặt tour
views/admin/reports.ejs -> trang báo cáo
views/admin/partials/sidebar.ejs -> sidebar dùng chung cho admin