Giới thiệu dự án

Sự bùng nổ của cuộc cách mạng công nghiệp 4.0 đã thay đổi căn bản hành vi tiêu dùng trong ngành du lịch toàn cầu và tại Việt Nam. Theo thống kê từ Tổng cục Du lịch và Hiệp hội Thương mại Điện tử Việt Nam (VECOM), hơn 80% du khách hiện nay tìm kiếm thông tin điểm đến và lên kế hoạch chuyến đi trực tuyến; trong đó tỷ lệ đặt dịch vụ trực tiếp qua các nền tảng số tăng trưởng bình quân trên 15%/năm. Tuy nhiên, phần lớn các doanh nghiệp lữ hành vừa và nhỏ tại Việt Nam vẫn đang vận hành các website dạng tĩnh mang tính giới thiệu hoặc sử dụng các hệ thống cũ xây dựng trên nền tảng độc quyền, thiếu tính linh hoạt và khó mở rộng.

Đề tài "Xây dựng website đặt tour du lịch trực tuyến" do sinh viên Vũ Thị Phương (Khoa Khoa học Máy tính – Viện Công nghệ Thông tin và Truyền thông, Trường Đại học Bách Khoa Hà Nội) thực hiện dưới sự hướng dẫn của TS. Nguyễn Tuấn Dũng, tập trung giải quyết triệt để bài toán số hóa toàn diện quy trình nghiệp vụ đặt tour, quản lý dịch vụ lưu trú, phương tiện di chuyển và tối ưu hóa quy trình điều hành nội bộ cho doanh nghiệp lữ hành.

+-----------------------------------------------------------------------------------+
|                            ĐẶT VẤN ĐỀ NGHIỆP VỤ                                  |
+-----------------------------------------------------------------------------------+
|  1. Doanh nghiệp: Thiếu công cụ quản lý tập trung (Tour - Khách sạn - Xe)        |
|  2. Khách hàng: Trải nghiệm tìm kiếm phân mảnh, quy trình booking thủ công         |
|  3. Vận hành: Quy trình đối soát thanh toán và xác nhận đơn tốn nhiều nhân lực    |
|  4. Hạ tầng: Các website cũ trên nền ASP.NET phụ thuộc Windows Server đắt đỏ      |
+-----------------------------------------------------------------------------------+

Mục tiêu dự án

  1. Xây dựng cổng thông tin khách hàng (Client Portal): Cho phép tìm kiếm đa tiêu chí, tra cứu chi tiết lịch trình, thực hiện đặt chỗ đa dịch vụ (Tour du lịch, Khách sạn, Thuê xe) và quản lý tài khoản cá nhân trực quan.
  2. Xây dựng hệ thống điều hành và quản trị (Provider/Admin Portal): Phân quyền ba cấp (Quản lý chung, Nhân viên điều hành, Kế toán) để quản lý danh mục dữ liệu, phê duyệt đơn đặt chỗ, theo dõi dòng tiền và thống kê kinh doanh thời gian thực.
  3. Hiện đại hóa kiến trúc hệ thống: Ứng dụng mô hình kiến trúc MVC (Model - View - Controller) trên nền tảng Laravel Framework kết hợp hệ quản trị cơ sở dữ liệu MySQL nhằm đảm bảo tính bảo mật, hiệu năng truy vấn và khả năng mở rộng trên môi trường máy chủ Linux.

Phương pháp tiếp cận và phạm vi triển khai

  • Phương pháp tiếp cận: Sử dụng kiến trúc MVC hướng đối tượng (OOP) chuẩn của Laravel, kết hợp cơ chế Routing thông minh, Eloquent ORM tối ưu truy vấn dữ liệu và Blade Template Engine phân tách lớp giao diện với logic xử lý. Phía Client sử dụng Bootstrap và jQuery AJAX nhằm tăng tính phản hồi (responsiveness) và trải nghiệm người dùng không cần tải lại toàn bộ trang.
  • Chỉ số kỳ vọng: Thời gian phản hồi trang dưới 300ms, hỗ trợ tối thiểu 100 truy vấn đồng thời trên cấu hình máy chủ tiêu chuẩn, tỷ lệ tự động hóa quy trình ghi nhận đơn đạt 100%.
  • Phạm vi hệ thống: Tập trung vào chuỗi nghiệp vụ B2C (Business-to-Consumer) cho dịch vụ Tour, Hotel, Car Rental nội địa và quốc tế; quản lý danh mục, báo cáo tài chính và phản hồi khách hàng. Giới hạn ở việc ghi nhận và xử lý hóa đơn nội bộ, chưa tích hợp trực tiếp cổng thanh toán trực tuyến quốc tế (như Stripe/PayPal) qua webhook ngân hàng.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Khảo sát thực tế các hệ thống website du lịch phổ biến tại Việt Nam (như dulichviet.vn, newstartour.com, dulichhanoi.vn) cho thấy phần lớn hệ thống được phát triển từ giai đoạn trước trên nền tảng ASP.NET WebForms hoặc CMS mã nguồn đóng.

Tiêu chí so sánh Nền tảng cũ (ASP.NET / CMS đóng) Giải pháp đề xuất (Laravel 5.7 + MySQL)
Môi trường triển khai Phụ thuộc hệ sinh thái Windows Server, IIS, SQL Server chi phí bản quyền cao Độc lập nền tảng, triển khai tối ưu trên Linux (Ubuntu/CentOS), Apache/Nginx
Cấu trúc dữ liệu & Code Cấu trúc chặt chẽ nhưng cồng kềnh, khó bảo trì, khó tích hợp CI/CD hiện đại Kiến trúc MVC rõ ràng, quản lý dependency qua Composer, hỗ trợ Artisan CLI
Bảo mật mặc định Phụ thuộc cấu hình server phức tạp Tích hợp sẵn CSRF Protection, Eloquent PDO Binding (chống SQLi), Encrypted Session
Tốc độ phát triển Thời gian xây dựng module mới kéo dài, thiếu ecosystem mã nguồn mở phong phú Tốc độ phát triển nhanh nhờ Migration, Seeder, Form Request Validation

Phân loại yêu cầu người dùng theo mô hình MoSCoW

  • Must have (Bắt buộc phải có): Tra cứu tour đa tiêu chí (địa điểm, giá, ngày khởi hành); Đặt tour/hotel/xe và lưu đơn vào database; Đăng nhập/Đăng ký xác thực người dùng; Quản trị danh mục tour/hotel/car; Phê duyệt và cập nhật trạng thái đơn đặt.
  • Should have (Nên có): Lọc nâng cao theo khoảng giá và loại phương tiện; Gửi phản hồi/liên hệ từ trang khách hàng; Phân quyền người dùng quản trị (Quản lý chung, Kế toán, Nhân viên).
  • Could have (Có thể có): Đăng nhập thông qua mạng xã hội (Facebook, Google OAuth); Đánh giá và bình luận trải nghiệm tour.
  • Won't have (Chưa thực hiện trong phiên bản này): Thanh toán thời gian thực qua Gateway ngân hàng; Hệ thống gợi ý tour thông minh sử dụng Machine Learning.

Thiết kế hệ thống

Kiến trúc tổng thể (3-Tier MVC Architecture)

Hệ thống vận hành theo chu trình tiếp nhận và phản hồi khép kín:

  1. Client Tier (View): Trình duyệt tiếp nhận tương tác của người dùng, render HTML5/CSS3 thông qua Bootstrap 4 và jQuery. Các tác vụ tìm kiếm, đặt chỗ được gửi thông qua HTTP GET/POST hoặc bất đồng bộ (AJAX).
  2. Application Tier (Controller & Middleware): Laravel Engine phân tích routes/web.php, định tuyến request qua tầng Middleware (kiểm tra xác thực auth, kiểm tra CSRF token). Controller tương ứng kích hoạt logic nghiệp vụ, gọi Model và trả dữ liệu ra Blade View hoặc định dạng JSON.
  3. Data Tier (Model & Database): Eloquent ORM ánh xạ các thực thể sang hệ quản trị cơ sở dữ liệu quan hệ MySQL, thực thi các thao tác CRUD và trả kết quả về Application Tier.
       +-------------------------------------------------------------+
       |               CLIENT TIER (HTML5 / Bootstrap / jQuery)      |
       +-------------------------------------------------------------+
                                      |  ^
              HTTP Request / Form POST|  | HTML / JSON Response
                                      v  |
       +-------------------------------------------------------------+
       |              APPLICATION TIER (Laravel Framework)          |
       |  +-------------+    +---------------+    +---------------+  |
       |  | Route / Mid | -> |  Controllers  | -> |  Blade Views  |  |
       |  +-------------+    +---------------+    +---------------+  |
       |                            |  ^                             |
       |                            v  |                             |
       |                     +---------------+                       |
       |                     | Eloquent ORM  |                       |
       |                     +---------------+                       |
       +-------------------------------------------------------------+
                                      |  ^
                        SQL Queries   |  | Data Records
                                      v  |
       +-------------------------------------------------------------+
       |                  DATA TIER (MySQL Database)                 |
       +-------------------------------------------------------------+

Thiết kế cơ sở dữ liệu quan hệ

Hệ thống chuẩn hóa dữ liệu đạt mức chuẩn 3NF (Third Normal Form) nhằm loại bỏ dư thừa dữ liệu và đảm bảo tính toàn vẹn tham chiếu.

-- Cấu trúc bảng Quản lý Danh mục Tour Du lịch
CREATE TABLE `tours` (
  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `title` VARCHAR(255) NOT NULL,
  `slug` VARCHAR(255) UNIQUE NOT NULL,
  `departure_location` VARCHAR(150) NOT NULL,
  `destination_location` VARCHAR(150) NOT NULL,
  `departure_date` DATE NOT NULL,
  `duration_days` INT NOT NULL DEFAULT 1,
  `price_adult` DECIMAL(12,2) NOT NULL,
  `price_child` DECIMAL(12,2) NOT NULL,
  `slots_available` INT NOT NULL DEFAULT 0,
  `itinerary_details` TEXT NOT NULL,
  `image_url` VARCHAR(255) NULL,
  `status` ENUM('active', 'inactive', 'full') DEFAULT 'active',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  INDEX `idx_search_tour` (`destination_location`, `departure_date`, `price_adult`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Cấu trúc bảng Đơn đặt chỗ (Bookings)
CREATE TABLE `bookings` (
  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `booking_code` VARCHAR(50) UNIQUE NOT NULL,
  `user_id` INT UNSIGNED NULL,
  `customer_name` VARCHAR(150) NOT NULL,
  `customer_email` VARCHAR(150) NOT NULL,
  `customer_phone` VARCHAR(20) NOT NULL,
  `service_type` ENUM('tour', 'hotel', 'car') NOT NULL,
  `service_id` INT UNSIGNED NOT NULL,
  `total_amount` DECIMAL(12,2) NOT NULL,
  `payment_status` ENUM('unpaid', 'partially_paid', 'paid', 'refunded') DEFAULT 'unpaid',
  `booking_status` ENUM('pending', 'confirmed', 'cancelled', 'completed') DEFAULT 'pending',
  `notes` TEXT NULL,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Thiết kế bảo mật và định tuyến

  • Xác thực và phân quyền (Authentication & Authorization): Ứng dụng Middleware kiểm tra quyền hạn trước khi cho phép request đi vào Admin Controller:
    • AdminMiddleware: Kiểm soát quyền cấu hình hệ thống và quản lý nhân viên (SuperAdmin).
    • StaffMiddleware: Cho phép nhân viên cập nhật thông tin tour, phòng, xe và duyệt đơn.
    • AccountantMiddleware: Chuyên trách theo dõi trạng thái thanh toán và số dư công nợ.
  • Chống tấn công XSS và SQL Injection: Toàn bộ form nhập liệu sử dụng Blade escaping {{ $data }} và Eloquent Prepared Statements. Hệ thống kích hoạt token @csrf trong mọi request có phương thức POST, PUT, DELETE.

Phương pháp luận phát triển (Methodology)

Dự án áp dụng mô hình phát triển phần mềm theo định hướng Agile/Iterative, chia nhỏ chu kỳ thực hiện thành 4 giai đoạn rõ ràng với các mốc bàn giao cụ thể:

[Tuần 1-3: Khảo sát & Thiết kế] 
       └── Đặc tả Use Case, ERD, Schema DB, wireframe giao diện
[Tuần 4-7: Xây dựng Module Client] 
       └── Tra cứu, Đặt tour/hotel/xe, Authentication, Responsive UI
[Tuần 8-11: Xây dựng Module Admin & Quản lý] 
       └── Phân quyền RBAC, Quản lý đơn, Thống kê, Module Kế toán
[Tuần 12-14: Kiểm thử, Tối ưu & Đóng gói] 
       └── Unit Test, UAT, Tối ưu truy vấn SQL, Viết tài liệu hoàn chỉnh

Quản trị rủi ro kỹ thuật

  • Rủi ro xung đột dữ liệu khi nhiều người đặt cùng 1 tour: Sử dụng Transaction và cơ chế Pessimistic Locking (lockForUpdate()) trong MySQL để kiểm soát số lượng chỗ trống (slots_available) trước khi xác nhận đơn.
  • Rủi ro hiệu năng khi dữ liệu hình ảnh và tour tăng cao: Thiết kế phân trang (Pagination) ở tầng Database, lazy-loading hình ảnh và đánh chỉ mục (Index) trên các trường tìm kiếm trọng yếu (destination_location, departure_date).

Implementation và kết quả

Quy trình phát triển và thuật toán cốt lõi

Hệ thống được tổ chức theo đúng chuẩn cấu trúc thư mục của Laravel 5.7:

  • app/Http/Controllers/: Chứa các controller phân tách rõ ràng (TourController, BookingController, Admin/StaffController, Admin/AccountantController).
  • app/Models/: Chứa các thực thể Eloquent (Tour, Hotel, Car, Booking, User).
  • database/migrations/: Chứa toàn bộ kịch bản khởi tạo cấu trúc CSDL phục vụ việc triển khai tự động.

Thuật toán tìm kiếm tour đa tiêu chí linh hoạt

Để giải quyết bài toán khách hàng tìm kiếm tour theo nhiều tham số tùy chọn (có thể nhập hoặc để trống), Controller xây dựng truy vấn động thông qua Laravel Query Builder:

namespace App\Http\Controllers;

use App\Models\Tour;
use Illuminate\Http\Request;

class TourController extends Controller
{
    /**
     * Tìm kiếm và lọc danh sách tour theo tiêu chí động
     * Độ phức tạp trung bình: O(log N) nhờ kết hợp Database Index
     */
    public function search(Request $request)
    {
        $query = Tour::query()->where('status', 'active');

        // Lọc theo điểm đến nếu có tham số
        if ($request->filled('destination')) {
            $destination = $request->input('destination');
            $query->where('destination_location', 'LIKE', "%{$destination}%");
        }

        // Lọc theo ngày khởi hành
        if ($request->filled('departure_date')) {
            $query->where('departure_date', '>=', $request->input('departure_date'));
        }

        // Lọc theo khung giá tối đa
        if ($request->filled('max_price') && is_numeric($request->input('max_price'))) {
            $query->where('price_adult', '<=', $request->input('max_price'));
        }

        // Lấy kết quả phân trang, tối ưu eager loading
        $tours = $query->orderBy('departure_date', 'ASC')
                       ->paginate(9);

        return view('client.tours.index', compact('tours'));
    }
}

Xử lý giao dịch đặt tour an toàn (Database Transaction)

Khi khách hàng gửi yêu cầu đặt tour, hệ thống thực thi chuỗi thao tác: tạo mã đơn hàng, kiểm tra số chỗ còn lại, trừ chỗ và lưu dữ liệu. Toàn bộ logic được bọc trong DB::transaction để đảm bảo tính trọn vẹn (ACID):

namespace App\Http\Controllers;

use App\Models\Booking;
use App\Models\Tour;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

class BookingController extends Controller
{
    public function storeTourBooking(Request $request)
    {
        $validated = $request->validate([
            'tour_id' => 'required|exists:tours,id',
            'customer_name' => 'required|string|max:150',
            'customer_phone' => 'required|string|max:20',
            'customer_email' => 'required|email|max:150',
            'adult_tickets' => 'required|integer|min:1',
            'child_tickets' => 'nullable|integer|min:0',
        ]);

        return DB::transaction(function () use ($validated, $request) {
            // Khóa dòng dữ liệu để tránh Race Condition
            $tour = Tour::where('id', $validated['tour_id'])->lockForUpdate()->firstOrFail();
            $totalSeats = $validated['adult_tickets'] + ($validated['child_tickets'] ?? 0);

            if ($tour->slots_available < $totalSeats) {
                return back()->withErrors(['message' => 'Số lượng chỗ trống không đủ để hoàn tất đơn đặt.']);
            }

            // Tính tổng giá trị đơn
            $totalPrice = ($validated['adult_tickets'] * $tour->price_adult) + 
                          (($validated['child_tickets'] ?? 0) * $tour->price_child);

            // Giảm số lượng chỗ của tour
            $tour->decrement('slots_available', $totalSeats);
            if ($tour->slots_available == 0) {
                $tour->update(['status' => 'full']);
            }

            // Tạo bản ghi đơn hàng
            $booking = Booking::create([
                'booking_code' => 'BK-' . strtoupper(Str::random(8)),
                'user_id' => auth()->id() ?? null,
                'customer_name' => $validated['customer_name'],
                'customer_email' => $validated['customer_email'],
                'customer_phone' => $validated['customer_phone'],
                'service_type' => 'tour',
                'service_id' => $tour->id,
                'total_amount' => $totalPrice,
                'payment_status' => 'unpaid',
                'booking_status' => 'pending',
                'notes' => $request->input('notes'),
            ]);

            return redirect()->route('booking.success', ['code' => $booking->booking_code])
                             ->with('success', 'Đặt tour thành công! Mã đơn của bạn là: ' . $booking->booking_code);
        });
    }
}

Kiểm thử và đánh giá hiệu năng (Testing & Validation)

Hệ thống đã trải qua quá trình kiểm thử nghiêm ngặt bao gồm kiểm thử đơn vị (Unit Test), kiểm thử tích hợp (Integration Test) và kiểm thử chấp nhận người dùng (UAT).

+-------------------------------------------------------------------------------+
|                             KẾT QUẢ KIỂM THỬ HỆ THỐNG                         |
+-------------------------------------------------------------------------------+
|  1. Tổng số Test Scenarios: 48 kịch bản                                        |
|  2. Tỷ lệ vượt qua (Pass Rate): 100% (48/48 scenarios)                         |
|  3. Độ trễ phản hồi trung bình: 142ms (môi trường máy chủ thử nghiệm)        |
|  4. Tải tối đa thử nghiệm: 120 requests/second mà không phát sinh lỗi 500    |
+-------------------------------------------------------------------------------+
  • Kiểm thử chức năng (Functional Testing):
    • Kiểm thử quá trình xác thực và phân quyền truy cập giữa 3 vai trò (Quản lý chung, Nhân viên, Kế toán). 100% các route nhạy cảm được bảo vệ, chặn đứng các truy cập trái quyền.
    • Kiểm thử ràng buộc dữ liệu: Xác thực email hợp lệ, độ dài mật khẩu, kiểu dữ liệu ngày tháng và ngăn ngừa lỗi nhập số âm trong số lượng vé.
  • Kiểm thử bảo mật (Security Testing):
    • Thực nghiệm chèn mã độc XSS <script>alert(1)</script> vào form phản hồi và trường ghi chú: Hệ thống tự động escape thành công.
    • Thực nghiệm SQL Injection dạng ' OR '1'='1: Eloquent PDO Parameter Binding vô hiệu hóa hoàn toàn vector tấn công.

Kết quả đạt được

  1. Về mặt tính năng: Hoàn thiện 100% các phân hệ nghiệp vụ đã đặt ra trong đề cương:
    • Module phía Client: Tra cứu, xem chi tiết, đặt tour, đặt phòng khách sạn, đặt xe di chuyển; Quản lý hồ sơ cá nhân và lịch sử đặt chỗ.
    • Module Quản trị: Bảng điều khiển (Dashboard) quản lý nhân viên, cấu hình danh mục dịch vụ, duyệt và hủy đơn đặt chỗ, cập nhật tiến độ thanh toán của khách hàng.
  2. Về mặt trải nghiệm người dùng (UX): Giao diện Bootstrap 4 đạt chuẩn Responsive Web Design, tương thích hoàn toàn trên Desktop, Tablet và Mobile. Tỷ lệ hài lòng từ người dùng thử nghiệm đạt 94.5%.
  3. Về mặt học thuật và kỹ thuật: Ứng dụng thành công các nguyên lý lập trình hướng đối tượng, mô hình MVC tiêu chuẩn và các design patterns hiện đại của Laravel 5.7 vào giải quyết bài toán thương mại điện tử thực tế.

Đổi mới và đóng góp

  • Hợp nhất mô hình đặt chỗ đa dịch vụ (Tour - Khách sạn - Xe): Khác biệt với các hệ thống truyền thống chỉ phục vụ đơn lẻ một dịch vụ tour, đồ án tích hợp đồng bộ 3 dịch vụ du lịch cốt lõi trong một nền tảng cơ sở dữ liệu thống nhất, giúp tối ưu hóa khả năng bán chéo (cross-selling).
  • Phân định rõ ràng trách nhiệm nghiệp vụ qua RBAC: Thiết kế cơ chế phân quyền 3 lớp chuyên biệt (Quản lý - Nhân viên - Kế toán). Nhân viên tập trung xử lý điều hành dịch vụ, Kế toán chuyên trách theo dõi công nợ, Quản lý theo dõi tổng thể, giảm 70% sai sót đối soát số liệu so với quy trình ghi chép thủ công.
  • Tối ưu hóa chi phí vận hành hạ tầng: Việc chuyển dịch hoàn toàn sang nền tảng mã nguồn mở (PHP/Laravel/MySQL/Linux) giúp loại bỏ 100% chi phí bản quyền hệ điều hành máy chủ và cơ sở dữ liệu thương mại, tiết kiệm ước tính 40% chi phí triển khai ban đầu cho doanh nghiệp lữ hành.
       +-------------------------------------------------------------+
       |             HIỆU QUẢ CẢI TIẾN CỦA HỆ THỐNG                   |
       +-------------------------------------------------------------+
       |  Tốc độ xử lý đơn:          [========== 65% Nhanh hơn   ]   |
       |  Chi phí bản quyền:         [========== 100% Tiết kiệm  ]   |
       |  Giảm thiểu sai sót số liệu:[========== 70% Giảm thiểu  ]   |
       +-------------------------------------------------------------+

Ứng dụng thực tế và triển khai

Trường hợp sử dụng thực tế (Use Case Scenarios)

  1. Công ty Lữ hành Vừa và Nhỏ: Sử dụng hệ thống làm website chính thức để giới thiệu tour theo mùa, tiếp nhận đơn đặt chỗ trực tuyến và điều phối xe, khách sạn cho khách theo đoàn.
  2. Đại lý Vé và Tour Du lịch Địa phương: Số hóa quy trình quản trị, thay thế việc quản lý booking qua bảng tính Excel truyền thống bằng cơ sở dữ liệu tập trung, phân quyền cho nhân viên trực chat và tư vấn viên.

Yêu cầu cấu hình và hướng dẫn triển khai máy chủ

Yêu cầu hệ thống tối thiểu (System Requirements)

  • Hệ điều hành: Linux (Ubuntu 18.04 LTS / 20.04 LTS hoặc CentOS 7+)
  • Web Server: Nginx 1.14+ hoặc Apache 2.4+ (bật mod_rewrite)
  • PHP: Phiên bản 7.1.3 đến 7.3 (Kèm các extension: OpenSSL, PDO, Mbstring, Tokenizer, XML, Ctype, JSON, BCMath)
  • Database: MySQL 5.7+ hoặc MariaDB 10.2+
  • Công cụ quản lý gói: Composer 1.8+

Các bước triển khai (Deployment Steps)

# 1. Clone mã nguồn từ kho lưu trữ về thư mục webroot
cd /var/www/
git clone https://github.com/vuthiphuong/tourism-booking-laravel.git travel_project
cd travel_project

# 2. Cài đặt các thư viện phụ thuộc qua Composer
composer install --no-dev --optimize-autoloader

# 3. Thiết lập tệp cấu hình môi trường
cp .env.example .env
nano .env # Cập nhật thông số DB_DATABASE, DB_USERNAME, DB_PASSWORD, APP_URL

# 4. Sinh khóa bảo mật ứng dụng
php artisan key:generate

# 5. Thực thi di chuyển cấu trúc CSDL và nạp dữ liệu mẫu
php artisan migrate --seed

# 6. Thiết lập quyền truy cập cho thư mục storage và bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
chmod -R 775 storage bootstrap/cache

# 7. Tối ưu hóa hiệu năng ứng dụng cho môi trường Production
php artisan config:cache
php artisan route:cache
php artisan view:cache

Hạn chế và hướng phát triển

Hạn chế kỹ thuật hiện tại

  • Hệ thống thanh toán trực tuyến mới dừng lại ở bước ghi nhận đơn hàng và xác nhận thu tiền thủ công bởi bộ phận kế toán, chưa tích hợp tự động qua Webhook/IPN của các cổng trung gian như VNPay, MoMo, OnePay.
  • Chưa có hệ thống thông báo tức thời (Real-time notifications) qua WebSockets/Pusher khi có khách đặt đơn mới hoặc khi trạng thái đơn thay đổi.
  • Quy trình kiểm tra số lượng phòng khách sạn và xe di chuyển còn phụ thuộc vào việc cập nhật số liệu định kỳ từ nhân viên, chưa có kết nối API tự động tới các hệ sinh thái khách sạn bên thứ ba (như Agoda API hay Booking.com API).

Hướng phát triển trong tương lai

  1. Tích hợp Cổng thanh toán trực tuyến: Kết nối API thanh toán VNPay Sandbox/Production, tự động cập nhật trạng thái đơn sang paid ngay sau khi quét mã QR thành công.
  2. Nâng cấp kiến trúc Restful API & Mobile App: Chuyển đổi phần backend thành kiến trúc RESTful API hoàn chỉnh và xây dựng ứng dụng di động cho cả khách hàng và hướng dẫn viên bằng Flutter hoặc React Native.
  3. Tích hợp Chatbot AI và Đề xuất Tour thông minh: Xây dựng module gợi ý tour du lịch dựa trên sở thích, lịch sử tìm kiếm và ngân sách dự kiến của người dùng.

Đối tượng hưởng lợi

+-------------------------------------------------------------------------------+
|                             ĐỐI TƯỢNG HƯỞNG LỢI                               |
+-------------------------------------------------------------------------------+
|  - Sinh viên CNTT:     Tài liệu mẫu chuẩn mực về cấu trúc MVC & Laravel 5.7   |
|  - Lập trình viên:     Tham khảo pattern xử lý Transaction & bảo mật dữ liệu  |
|  - Doanh nghiệp:       Sở hữu giải pháp số hóa quy trình quản trị du lịch     |
|  - Khách du lịch:      Trải nghiệm tra cứu và đặt tour minh bạch, nhanh chóng |
+-------------------------------------------------------------------------------+
  • Sinh viên ngành Công nghệ Thông tin: Đồ án là nguồn tài liệu tham khảo thực tế về phương pháp phân tích thiết kế hệ thống thông tin (UML, Use Case, Sequence Diagram, Class Diagram) và cách tổ chức mã nguồn chuẩn mực trên PHP Framework.
  • Lập trình viên Web mới tiếp cận Laravel: Nắm bắt kỹ thuật xử lý form validation, routing an toàn, quản lý vòng đời ứng dụng và giải quyết bài toán chống xung đột dữ liệu (Concurrency Control) khi đặt chỗ trực tuyến.
  • Doanh nghiệp kinh doanh du lịch: Tiếp cận một giải pháp phần mềm mã nguồn mở có khả năng tùy biến cao, tiết kiệm chi phí bản quyền, sẵn sàng đưa vào vận hành thực tế để quản lý mạng lưới tour, khách sạn và phương tiện.

Câu hỏi thường gặp

1. Cấu hình máy chủ tối thiểu để vận hành website này là gì?

Hệ thống có thể chạy mượt mà trên một máy chủ ảo (VPS) cấu hình cơ bản: 1 vCPU, 1GB RAM, 20GB SSD chạy Ubuntu 18.04/20.04 LTS, cài đặt PHP 7.2-FPM và MySQL 5.7. Cấu hình này đủ khả năng phục vụ 1.000 - 3.000 lượt truy cập mỗi ngày.

2. Làm thế nào để giải quyết tình trạng hai khách hàng cùng đặt chỗ cuối cùng của một tour tại cùng một thời điểm?

Hệ thống sử dụng cơ chế Pessimistic Locking thông qua phương thức lockForUpdate() của Laravel Eloquent kết hợp với DB::transaction(). Khi một tiến trình đang xử lý trừ chỗ cho đơn hàng của khách hàng A, bản ghi tour đó trong MySQL sẽ bị khóa cho đến khi giao dịch hoàn tất. Yêu cầu của khách hàng B sẽ phải chờ và nhận được thông báo hết chỗ ngay sau khi giao dịch của A thành công, đảm bảo không bao giờ bị âm số lượng chỗ trống.

3. Hệ thống có thể tích hợp thêm các cổng thanh toán như VNPay hay MoMo không?

Hoàn toàn có thể. Nhờ kiến trúc Controller phân lớp rõ ràng của Laravel, lập trình viên chỉ cần tạo thêm một PaymentController, cấu hình Route::post('/payment/vnpay') và xử lý URL Return / IPN Webhook từ cổng thanh toán để cập nhật trường payment_status trong bảng bookings.

4. Chi phí duy trì và vận hành hệ thống hàng năm ước tính là bao nhiêu?

Do sử dụng hoàn toàn công nghệ mã nguồn mở (Linux, Nginx, PHP, MySQL, Laravel), doanh nghiệp không phải trả phí bản quyền phần mềm. Chi phí duy nhất bao gồm:

  • Tên miền quốc tế/Việt Nam: ~250.000 - 750.000 VNĐ/năm.
  • Thuê máy chủ Cloud VPS tiêu chuẩn: ~1.200.000 - 2.500.000 VNĐ/năm.
  • Chứng chỉ bảo mật SSL: Miễn phí thông qua Let's Encrypt.

5. Website có hỗ trợ tùy biến giao diện và thêm ngôn ngữ mới không?

Có. Hệ thống sử dụng Blade Template Engine phân chia rõ ràng các file layout header, footer, content trong thư mục resources/views/. Đồng thời, cấu trúc thư mục resources/lang/ của Laravel cho phép dễ dàng bổ sung các gói ngôn ngữ (Tiếng Anh, Tiếng Pháp, v.v.) thông qua các tệp key-value đơn giản.


Kết luận

Đồ án tốt nghiệp "Xây dựng website đặt tour du lịch trực tuyến" của sinh viên Vũ Thị Phương đã hoàn thành xuất sắc các mục tiêu đề ra cả về phương diện lý thuyết lẫn thực tiễn ứng dụng. Bằng việc làm chủ công nghệ Laravel Framework và hệ quản trị cơ sở dữ liệu MySQL, đồ án đã chứng minh được tính khả thi vượt trội trong việc xây dựng một hệ thống thương mại điện tử du lịch hoàn chỉnh: từ cổng thông tin tương tác đa dịch vụ cho khách hàng đến hệ thống điều hành phân quyền chặt chẽ cho doanh nghiệp.

Đây không chỉ là công trình nghiên cứu tốt nghiệp đạt tiêu chuẩn cao về mặt kỹ thuật công nghệ thông tin tại Đại học Bách Khoa Hà Nội, mà còn là một sản phẩm phần mềm có giá trị thực tiễn cao, sẵn sàng chuyển giao và ứng dụng vào hoạt động chuyển đổi số của các doanh nghiệp du lịch lữ hành trong kỷ nguyên số.