Giới thiệu dự án

Thị trường vận tải hành khách đường bộ tại Việt Nam chiếm hơn 80% tổng lưu lượng vận chuyển liên tỉnh, đóng vai trò huyết mạch trong mạng lưới giao thông quốc gia. Tuy nhiên, theo các khảo sát ngành giao thông vận tải, phần lớn các doanh nghiệp vận tải quy mô vừa và nhỏ vẫn duy trì quy trình bán vé thủ công hoặc phụ thuộc hoàn toàn vào các sàn trung gian với mức chiết khấu từ 10% đến 18% trên mỗi vé bán ra. Điều này dẫn đến tình trạng quá tải cục bộ vào các dịp cao điểm, sai sót trong khâu điều phối ghế, thất thoát doanh thu và giảm sút trải nghiệm khách hàng.

Đề tài "Xây dựng hệ thống website đặt vé xe khách sử dụng ReactJS và ASP.NET" do nhóm nghiên cứu tại Trường Đại học Sư phạm Kỹ thuật TP.HCM thực hiện nhằm giải quyết trực tiếp bài toán số hóa toàn diện quy trình quản lý và phân phối vé xe tuyến cố định.

+-----------------------------------------------------------------------------------+
|                               HỆ THỐNG ĐẶT VÉ XE KHÁCH                             |
+-----------------------------------------------------------------------------------+
|   Khách hàng (Web SPA)    |   Nhà xe (Quản trị chuyến)   |    Admin (Quản trị sàn)   |
| - Tra cứu tuyến & giá vé  | - Sơ đồ xe, phân tầng ghế    | - Quản lý tài khoản/nhà xe|
| - Giữ chỗ Real-time       | - Lộ trình, trạm đón/trả     | - Quản lý bảng giá chuẩn  |
| - Thanh toán trực tuyến   | - Thống kê doanh thu định kỳ | - Kiểm duyệt & bảo mật    |
+-----------------------------------------------------------------------------------+

Mục tiêu dự án

  1. Xây dựng Single Page Application (SPA) đa nền tảng: Ứng dụng ReactJS kết hợp thư viện Ant Design và TailwindCSS nhằm mang lại giao diện trực quan, tối ưu tốc độ tải trang dưới 1.2 giây và tương thích hoàn toàn trên thiết bị di động.
  2. Thiết kế Backend hiệu năng cao: Triển khai kiến trúc RESTful API trên nền tảng ASP.NET Core, kết hợp mô hình Hybrid ORM (Entity Framework Core và Dapper) nhằm xử lý song song các tác vụ ghi dữ liệu phức tạp và truy vấn dữ liệu lớn.
  3. Giải quyết triệt để tranh chấp đặt vé (Concurrency Collision): Cơ chế khóa ghế tạm thời (Locking Mechanism) và dịch vụ xử lý ngầm (Background Service) giúp kiểm soát 100% nguy cơ trùng lặp vé khi nhiều người dùng thao tác cùng lúc.
  4. Bảo mật và phân quyền đa tầng: Thiết lập phân quyền theo vai trò (Role-Based Access Control - RBAC) sử dụng JSON Web Token (JWT) và mã hóa xác thực OTP.

Phạm vi và giới hạn

  • Phạm vi triển khai: Hệ thống phục vụ 3 nhóm đối tượng độc lập: Khách hàng (User), Đơn vị vận tải (Company/Nhà xe) và Ban quản trị hệ thống (System Administrator).
  • Giới hạn kỹ thuật: Hệ thống tập trung tối ưu hóa nghiệp vụ đặt vé xe khách liên tỉnh đường bộ nội địa; chưa tích hợp định giá động tự động (Dynamic Pricing) theo thuật toán học máy (Machine Learning) dựa trên lưu lượng truy cập thực tế.

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

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

Khảo sát các giải pháp công nghệ hiện hành trên thị trường cung cấp cơ sở đối chiếu rõ nét:

Tiêu chí VeXeRe MegaBus EasyBook Hệ thống đề xuất (ReactJS + ASP.NET)
Kiến trúc FE Server-Side Rendering / SPA Monolithic / Web Forms Multi-page App Single Page Application (ReactJS 18)
Trải nghiệm lọc vé Gián đoạn khi cuộn trang Tích hợp phân trang tốt Hạn chế tuyến chi tiết Dynamic Filter kết hợp Virtual DOM
Cơ chế thanh toán Đa kênh (Cổng VNPAY/Momo) Xác nhận thủ công qua Email Thanh toán quốc tế Thanh toán trực tuyến + Giữ chỗ tự động
Xử lý thời gian thực WebSockets / Polling Không hỗ trợ Giới hạn SignalR + Background Service Engine
Chi phí triển khai Rất cao (SaaS doanh nghiệp) Trung bình Trung bình Tối ưu, mã nguồn mở, dễ dàng đóng gói

Áp dụng phương pháp phân tích yêu cầu MoSCoW:

  • Must have: Đăng nhập/xác thực JWT, tra cứu chuyến theo điểm đi - đến - ngày khởi hành, sơ đồ ghế động trực quan, thanh toán an toàn, bảng quản trị cho nhà xe/admin.
  • Should have: Thông báo Real-time (SignalR), đánh giá xếp hạng 5 sao, biểu đồ thống kê doanh thu theo năm.
  • Could have: Tích hợp đăng nhập nhanh qua Google OAuth 2.0, xác minh số điện thoại qua OTP.
  • Won't have (trong pha này): Hệ thống định vị GPS trực tiếp phương tiện theo thời gian thực.

Thiết kế hệ thống

+-------------------------------------------------------------------------+
|                    PRESENTATION LAYER (Client Tier)                     |
|        ReactJS 18.2 | TailwindCSS 3.4 | Ant Design | Axios Interceptors |
+-------------------------------------------------------------------------+
                                    | HTTPS / WSS (REST APIs & SignalR)
                                    v
+-------------------------------------------------------------------------+
|                    APPLICATION LAYER (ASP.NET Core Web API)             |
|  +--------------------+  +----------------------+  +------------------+ |
|  | Controllers & Auth |  | Business Logic Core  |  | Background Worker| |
|  | (JWT, RBAC, OAuth) |  | (Booking, Pricing)   |  | (Seat Auto-Unlock| |
|  +--------------------+  +----------------------+  +------------------+ |
+-------------------------------------------------------------------------+
                                    | ADO.NET / LINQ
                                    v
+-------------------------------------------------------------------------+
|                  DATA ACCESS LAYER (Hybrid ORM Pattern)                 |
|         Entity Framework Core 8.0 (Writes) | Dapper 2.1 (Fast Reads)    |
+-------------------------------------------------------------------------+
                                    | TDS Protocol
                                    v
+-------------------------------------------------------------------------+
|                    PERSISTENCE LAYER (Database)                         |
|               Microsoft SQL Server 2022 Relational Database             |
+-------------------------------------------------------------------------+

Technology Stack và phiên bản

  • Frontend: ReactJS v18.2.0, Redux Toolkit v2.0, React Router v6.22, Ant Design v5.14, TailwindCSS v3.4.1.
  • Backend: ASP.NET Core Web API (.NET 8.0), C# 12, Entity Framework Core v8.0.2, Dapper v2.1.28.
  • Database & Cache: Microsoft SQL Server 2022 Standard Edition.
  • Security & Auth: JSON Web Tokens (JWT), BCrypt.Net-Next v4.0.3, Google.Apis.Auth v1.67.

Database Design (Lược đồ bảng dữ liệu quan hệ)

Cơ sở dữ liệu được chuẩn hóa ở dạng chuẩn 3NF nhằm đảm bảo tính toàn vẹn và tối ưu hóa hiệu năng truy vấn:

-- Cấu trúc bảng Ghế (Seats) và Lịch sử Đặt chỗ (Bookings/Tickets)
CREATE TABLE Buses (
    BusId INT IDENTITY(1,1) PRIMARY KEY,
    CompanyId INT NOT NULL,
    PlateNumber NVARCHAR(20) UNIQUE NOT NULL,
    BusType NVARCHAR(50) NOT NULL,
    TotalSeats INT NOT NULL,
    Status NVARCHAR(20) DEFAULT 'Active'
);

CREATE TABLE Trips (
    TripId INT IDENTITY(1,1) PRIMARY KEY,
    RouteId INT NOT NULL,
    BusId INT NOT NULL,
    DepartureTime DATETIME2 NOT NULL,
    ArrivalTime DATETIME2 NOT NULL,
    PriceTableId INT NOT NULL,
    Status NVARCHAR(30) DEFAULT 'Scheduled' -- Scheduled, Running, Completed, Cancelled
);

CREATE TABLE Tickets (
    TicketId INT IDENTITY(1,1) PRIMARY KEY,
    TripId INT NOT NULL FOREIGN KEY REFERENCES Trips(TripId),
    SeatCode NVARCHAR(10) NOT NULL,
    UserId INT NOT NULL,
    Status NVARCHAR(30) NOT NULL, -- PendingPayment, Reserved, Cancelled
    CreatedAt DATETIME2 DEFAULT SYSUTCDATETIME(),
    ExpiresAt DATETIME2 NULL,
    CONSTRAINT UQ_Trip_Seat UNIQUE (TripId, SeatCode)
);

API Endpoint Specifications

Endpoint Method Phân quyền Mô tả chức năng
/api/v1/auth/login POST Public Xác thực thông tin tài khoản, cấp phát Access Token (JWT)
/api/v1/trips/search GET Public Tra cứu chuyến xe theo tuyến, ngày xuất bến và bộ lọc giá
/api/v1/bookings/hold-seat POST Customer Khóa giữ ghế tạm thời trong 10 phút để thanh toán
/api/v1/company/trips POST Company Tạo lịch trình chuyến đi mới gắn liền với biểu đồ giá
/api/v1/admin/companies PATCH Admin Duyệt, tạm khóa hoặc kích hoạt tài khoản nhà xe

Methodology

Quy trình phát triển phần mềm tuân thủ chặt chẽ mô hình Agile/Scrum với chu kỳ 2 tuần/Sprint:

[Khảo sát & Usecase] -> [Thiết kế DB & Sequence] -> [Xây dựng Core API & UI] -> [Tích hợp & QA] -> [Triển khai]
      (Sprint 1)               (Sprint 2)                    (Sprint 3-4)              (Sprint 5)          (Sprint 6)
  • Đánh giá rủi ro (Risk Assessment):
    • Rủi ro tranh chấp tài nguyên ghế: Nguy cơ hai người cùng thanh toán một vị trí ghế. Giải pháp: Sử dụng UPDLOCK, ROWLOCK ở tầng SQL Server kết hợp Cache trạng thái.
    • Rủi ro rò rỉ dữ liệu cá nhân: Giải pháp: Mã hóa mật khẩu với thuật toán băm Salted BCrypt, truyền tải dữ liệu qua giao thức TLS 1.3 và lưu trữ Access Token trong HTTP-Only Secure Cookie.

Implementation và kết quả

Development Process

Thuật toán khóa giữ chỗ tạm thời (Seat Lock Engine)

Tại tầng Backend, hệ thống xử lý giao dịch đặt vé thông qua Transaction Scope nghiêm ngặt nhằm tránh hoàn toàn hiện tượng Double Booking:

[HttpPost("hold-seat")]
[Authorize(Roles = "Customer")]
public async Task<IActionResult> HoldSeat([FromBody] SeatReservationRequest request)
{
    using var connection = new SqlConnection(_connectionString);
    await connection.OpenAsync();
    using var transaction = connection.BeginTransaction(IsolationLevel.Serializable);

    try
    {
        // 1. Kiểm tra trạng thái ghế với cơ chế Khóa hàng (Row-level Lock)
        string checkSql = @"SELECT Status FROM Tickets WITH (UPDLOCK, ROWLOCK) 
                            WHERE TripId = @TripId AND SeatCode = @SeatCode";
        
        var currentStatus = await connection.QueryFirstOrDefaultAsync<string>(
            checkSql, new { request.TripId, request.SeatCode }, transaction);

        if (!string.IsNullOrEmpty(currentStatus) && currentStatus != "Cancelled")
        {
            transaction.Rollback();
            return BadRequest(new { Message = "Ghế đã được chọn hoặc đang giữ bởi người khác." });
        }

        // 2. Tạo bản ghi giữ chỗ với thời gian hết hạn sau 10 phút
        string insertSql = @"INSERT INTO Tickets (TripId, SeatCode, UserId, Status, ExpiresAt) 
                             VALUES (@TripId, @SeatCode, @UserId, 'PendingPayment', DATEADD(minute, 10, SYSUTCDATETIME()))";
        
        await connection.ExecuteAsync(insertSql, new {
            request.TripId, request.SeatCode, UserId = GetCurrentUserId()
        }, transaction);

        transaction.Commit();
        
        // 3. Bắn tín hiệu SignalR cập nhật sơ đồ ghế thời gian thực tới tất cả Client
        await _hubContext.Clients.Group($"Trip_{request.TripId}")
                         .SendAsync("SeatStatusChanged", request.SeatCode, "Locked");

        return Ok(new { Success = true, Message = "Giữ chỗ thành công trong 10 phút." });
    }
    catch (Exception ex)
    {
        transaction.Rollback();
        _logger.LogError(ex, "Lỗi khi thực thi giao dịch giữ ghế.");
        return StatusCode(500, "Lỗi nội bộ hệ thống.");
    }
}

Xử lý giao diện sơ đồ ghế động trên ReactJS

Frontend tính toán và cập nhật giao diện thông qua Virtual DOM, giảm thiểu số lần re-render không cần thiết:

import React, { useEffect, useState } from 'react';
import * as signalR from '@microsoft/signalr';
import { Button, message } from 'antd';

export const SeatSelector = ({ tripId, onSeatSelected }) => {
  const [seats, setSeats] = useState([]);
  const [selectedSeat, setSelectedSeat] = useState(null);

  useEffect(() => {
    // Khởi tạo kết nối Real-time với ASP.NET Core SignalR Hub
    const connection = new signalR.HubConnectionBuilder()
      .withUrl(`/hubs/ticket?tripId=${tripId}`)
      .withAutomaticReconnect()
      .build();

    connection.start().then(() => {
      connection.invoke("JoinTripGroup", tripId.toString());
    });

    connection.on("SeatStatusChanged", (seatCode, status) => {
      setSeats(prev => prev.map(s => s.code === seatCode ? { ...s, status } : s));
    });

    return () => {
      connection.stop();
    };
  }, [tripId]);

  const handleSelect = (seat) => {
    if (seat.status !== 'Available') {
      message.warning('Vị trí ghế này không thể lựa chọn!');
      return;
    }
    setSelectedSeat(seat.code);
    onSeatSelected(seat);
  };

  return (
    <div className="grid grid-cols-4 gap-3 p-4 bg-gray-50 rounded-lg shadow">
      {seats.map((seat) => (
        <button
          key={seat.code}
          onClick={() => handleSelect(seat)}
          className={`h-12 rounded border font-semibold transition-all ${
            seat.status === 'Locked' ? 'bg-gray-400 text-white cursor-not-allowed' :
            seat.status === 'Reserved' ? 'bg-red-500 text-white cursor-not-allowed' :
            selectedSeat === seat.code ? 'bg-blue-600 text-white ring-2 ring-blue-300' :
            'bg-white text-gray-800 hover:border-blue-500'
          }`}
          disabled={seat.status !== 'Available'}
        >
          {seat.code}
        </button>
      ))}
    </div>
  );
};

Dịch vụ quét và giải phóng ghế tự động (Background Service)

Triển khai một Hosted Service ngầm trong ASP.NET Core kế thừa từ BackgroundService chạy chu kỳ 30 giây/lần nhằm tự động hủy các giao dịch PendingPayment quá hạn:

public class ExpiredTicketCleanupService : BackgroundService
{
    private readonly IServiceProvider _services;
    private readonly ILogger<ExpiredTicketCleanupService> _logger;

    public ExpiredTicketCleanupService(IServiceProvider services, ILogger<ExpiredTicketCleanupService> logger)
    {
        _services = services;
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            using (var scope = _services.CreateScope())
            {
                var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
                var expiredTickets = await dbContext.Tickets
                    .Where(t => t.Status == "PendingPayment" && t.ExpiresAt < DateTime.UtcNow)
                    .ToListAsync(stoppingToken);

                if (expiredTickets.Any())
                {
                    foreach (var ticket in expiredTickets)
                    {
                        ticket.Status = "Cancelled";
                    }
                    await dbContext.SaveChangesAsync(stoppingToken);
                    _logger.LogInformation($"Đã tự động hoàn trả {expiredTickets.Count} ghế hết hạn.");
                }
            }
            await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
        }
    }
}

Testing và validation

Quá trình kiểm thử được thực hiện đa tầng (Unit Test, Integration Test, Load Test):

Loại kiểm thử Công cụ / Kịch bản Phạm vi thực hiện Kết quả thực tế
Unit Test xUnit, Moq 48 Test cases cho nghiệp vụ tính giá vé, logic phân quyền, JWT Token Độ phủ code (Coverage) đạt 88.5%
Integration Postman, REST Client Kiểm thử toàn diện 32 API Endpoints với các luồng hợp lệ và biên 100% Endpoints trả đúng mã HTTP Status
Load Testing Apache JMeter Mô phỏng 1,000 người dùng đồng thời thực hiện tra cứu và đặt vé trong 60s Throughput: 650 RPS, Tỷ lệ lỗi: 0.01%
UAT 50 Người dùng thực tế Trải nghiệm luồng đặt vé, đăng ký nhà xe, quản trị chuyến và hủy vé Tỷ lệ đánh giá hài lòng đạt 94.2%

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

  1. Ứng dụng mô hình Hybrid Data Access (EF Core + Dapper): Tận dụng tính năng ánh xạ quan hệ của EF Core cho các giao dịch phức tạp (tạo chuyến, sửa giá) và tốc độ vượt trội của Dapper cho các thao tác đọc (tìm kiếm tuyến xe, tải danh sách ghế), giúp giảm 45% thời gian phản hồi máy chủ so với việc dùng thuần EF Core.
  2. Cơ chế khóa ghế phân tán dựa trên Transaction Isolation: Đảm bảo độ chính xác dữ liệu tuyệt đối (Zero Double-Booking) mà không làm tắc nghẽn hàng đợi cơ sở dữ liệu nhờ kỹ thuật ROWLOCK.
  3. Tối ưu hóa dung lượng truyền tải Client-Side: Việc chuyển đổi từ kiến trúc MVC truyền thống sang ReactJS SPA giúp giảm 60% lượng dữ liệu tải qua mạng trong mỗi phiên người dùng (từ ~2.5MB xuống dưới 900KB cho các lượt điều hướng kế tiếp).

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

Hướng dẫn triển khai hạ tầng (Deployment Guide)

[Client Browser] -> [Nginx Reverse Proxy / SSL Termination]
                           |
            +--------------+--------------+
            | (Port 80/443)               | (Port 5000)
            v                             v
   [Static Build: ReactJS]       [Kestrel Web API: .NET 8]
   (/var/www/react-app)                   |
                                          v
                                [MS SQL Server 2022]
                                (Docker Container / Managed DB)
  • Yêu cầu hệ thống máy chủ tối thiểu:
    • CPU: 2 Core (2.4 GHz trở lên).
    • RAM: 4 GB (Khuyến nghị 8 GB khi chạy kèm SQL Server).
    • Hệ điều hành: Ubuntu 22.04 LTS hoặc Windows Server 2022.
    • Runtime: .NET Runtime 8.0, Node.js 18.x LTS, Nginx 1.24.

Phân tích hiệu quả kinh tế (ROI)

Đối với một doanh nghiệp vận tải quy mô trung bình (sở hữu 15 phương tiện, trung bình 45 chuyến/ngày):

  • Chi phí tiết kiệm: Giảm 85% phí hoa hồng phải nộp cho các sàn giao dịch bên thứ ba.
  • Thời gian hòa vốn (Payback Period): Ước tính từ 4 đến 6 tháng sau khi đưa hệ thống vào vận hành độc lập.

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

Hạn chế kỹ thuật

  • Hệ thống hiện chỉ xử lý thanh toán thông qua mô phỏng giả lập và cổng nội địa, chưa tích hợp đầy đủ cơ chế hoàn tiền tự động (Automated Refund Webhooks) phức tạp.
  • Cơ chế lưu trữ đệm (Caching) chủ yếu chạy trên In-Memory của ứng dụng, chưa phân tán bằng Redis Cluster độc lập.

Hướng phát triển

  1. Nâng cấp hệ thống phân tán với Redis CacheRabbitMQ để xử lý hàng đợi đặt vé siêu cao điểm (lên tới 10,000+ RPS).
  2. Phát triển ứng dụng di động dành cho tài xế và nhân viên soát vé bằng React Native, tích hợp quét mã QR Code trực tiếp tại cửa xe.
  3. Tích hợp mô hình dự báo nhu cầu di chuyển sử dụng AI/Machine Learning để đề xuất biểu đồ giá linh hoạt theo mùa vụ.

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

  • Sinh viên & Học viên CNTT: Nguồn tài liệu thực tế về việc kết nối giữa ReactJS hiện đại với nền tảng ASP.NET Core Web API chuẩn mực công nghiệp.
  • Lập trình viên (Developers): Mẫu kiến trúc tham khảo hoàn chỉnh về xử lý giao dịch đồng thời (Concurrency), tối ưu hóa ORM kép và triển khai SignalR Real-time.
  • Doanh nghiệp vận tải: Nền tảng công nghệ sẵn sàng tùy biến để xây dựng hệ thống quản lý chuyến xe và thương hiệu số độc lập với chi phí tối ưu.
  • Khách hàng sử dụng: Tiết kiệm thời gian tra cứu, bảo đảm vị trí ghế ngồi chính xác và minh bạch thông tin giá cước.

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

1. Yêu cầu kỹ thuật tối thiểu để triển khai hệ thống là gì?

Hệ thống yêu cầu máy chủ chạy hệ điều hành Linux (Ubuntu/Debian) hoặc Windows Server, cài đặt sẵn .NET 8 Runtime, SQL Server 2019/2022 và web server Nginx/IIS. Phía người dùng chỉ cần trình duyệt web hiện đại hỗ trợ ECMAScript 6 (Chrome, Edge, Safari, Firefox).

2. Hệ thống xử lý thế nào khi có nhiều người cùng chọn một ghế?

Hệ thống sử dụng cơ chế Transaction ở mức cô lập Serializable kết hợp gợi ý UPDLOCK, ROWLOCK tại cơ sở dữ liệu. Người gửi yêu cầu trước sẽ giữ ghế thành công trong 10 phút, đồng thời SignalR lập tức phát tín hiệu khóa ghế đến toàn bộ người dùng khác trên cùng chuyến xe.

3. Khả năng tích hợp với các hệ sinh thái và phần mềm sẵn có ra sao?

Kiến trúc RESTful API chuẩn hóa theo định dạng JSON cho phép hệ thống dễ dàng kết nối với các phần mềm kế toán, hệ thống định vị GPS của xe, cổng thanh toán (VNPAY, MoMo, ZaloPay) và các dịch vụ SMS/Email Brandname bên thứ ba.

4. Chi phí duy trì và bảo trì hệ thống hàng tháng là bao nhiêu?

Với quy mô doanh nghiệp vừa, chi phí thuê Cloud VPS (như Azure, DigitalOcean hoặc máy chủ nội địa) dao động từ $20 đến $50/tháng. Nhờ việc tối ưu mã nguồn và cơ sở dữ liệu, hệ thống không đòi hỏi cấu hình phần cứng quá cao.

5. Dữ liệu tài khoản và thông tin thẻ có được bảo vệ an toàn không?

Mật khẩu người dùng được băm bằng thuật toán BCrypt với Salt ngẫu nhiên. Mọi thông tin truyền tải đều đi qua kênh mã hóa SSL/TLS. Hệ thống không lưu trữ trực tiếp thông tin thẻ ngân hàng của khách hàng mà giao quyền xử lý bảo mật cho cổng thanh toán chuyên dụng.


Kết luận

Đồ án tốt nghiệp "Xây dựng hệ thống website đặt vé xe khách sử dụng ReactJS và ASP.NET" đã hoàn thành toàn diện các mục tiêu đặt ra: từ việc nghiên cứu cơ sở lý thuyết, phân tích nghiệp vụ thực tiễn cho đến thiết kế và cài đặt hoàn chỉnh một hệ thống phần mềm thương mại điện tử chuyên ngành vận tải.

Bằng việc kết hợp sức mạnh giao diện linh hoạt của ReactJS cùng hiệu năng xử lý backend vượt trội của ASP.NET CoreSQL Server, hệ thống chứng minh tính khả thi, độ tin cậy và khả năng ứng dụng thực tiễn cao, mở ra hướng đi bền vững cho quá trình chuyển đổi số của các doanh nghiệp vận tải hành khách tại Việt Nam.