Giới thiệu dự án

Thị trường thương mại điện tử (E-commerce) và nhu cầu tiêu thụ nông sản, thực phẩm an toàn tại Việt Nam đang có tốc độ tăng trưởng ấn tượng với tỷ lệ tăng trưởng kép hàng năm (CAGR) đạt trên 18%. Người tiêu dùng hiện đại ngày càng quan tâm đến nguồn gốc xuất xứ và tiêu chuẩn an toàn vệ sinh thực phẩm. Tuy nhiên, phần lớn các chuỗi cửa hàng và đơn vị kinh doanh thực phẩm sạch quy mô vừa và nhỏ vẫn duy trì phương thức quản lý thủ công thông qua sổ sách hoặc các kênh mạng xã hội phân mảnh. Thực trạng này dẫn đến nhiều điểm nghẽn nghiêm trọng: sai lệch dữ liệu tồn kho từ 12% đến 15%, thất thoát đơn hàng trong giờ cao điểm, thiếu hụt cơ chế bảo mật thông tin cá nhân của khách hàng và thời gian xử lý một đơn hàng kéo dài trung bình từ 15 đến 30 phút.

Đề tài khóa luận "Tìm hiểu Laravel Framework và xây dựng website kinh doanh thực phẩm sạch" do sinh viên Noutsada Matmaneevong thực hiện dưới sự hướng dẫn của ThS. Nguyễn Thị Minh Châu tại Khoa Công nghệ Thông tin – Trường Đại học Quảng Nam, tập trung giải quyết bài toán chuyển đổi số toàn diện quy trình vận hành bán lẻ nông sản an toàn.

                                                [Cơ sở dữ liệu MySQL]

Dự án xác định 5 mục tiêu cụ thể:

  1. Nghiên cứu toàn diện kiến trúc Model-View-Controller (MVC) và các thành phần cốt lõi của Laravel Framework phiên bản 5.x/7.x (Eloquent ORM, Artisan CLI, Middleware, Blade Template Engine, Migration).
  2. Thiết kế và chuẩn hóa cơ sở dữ liệu quan hệ (RDBMS) MySQL tối ưu cho danh mục thực phẩm sạch đa tầng (Nhóm thực phẩm, Loại sản phẩm, Đơn vị tính, Lô hàng, Nhà cung cấp).
  3. Phát triển phân hệ khách hàng (Frontend) trực quan, có khả năng co giãn linh hoạt (Responsive Design) trên mọi thiết bị và độ phân giải màn hình.
  4. Xây dựng phân hệ quản trị (Backend/Admin Dashboard) hỗ trợ xử lý nghiệp vụ bán hàng: cập nhật trạng thái đơn hàng, quản lý khách hàng, kiểm soát danh mục sản phẩm và thống kê giao dịch.
  5. Triển khai các cơ chế bảo mật tiêu chuẩn nhằm ngăn chặn tấn công SQL Injection, Cross-Site Request Forgery (CSRF) và Cross-Site Scripting (XSS).

Hệ thống mang lại kết quả định lượng kỳ vọng: thời gian phản hồi trang (Page Response Time) dưới 350ms, khả năng chịu tải đạt mức 100-150 yêu cầu đồng thời (Concurrent Requests) trên môi trường máy chủ tiêu chuẩn, và giảm 65% thời gian xử lý đơn hàng so với phương thức truyền thống. Phạm vi đề tài tập trung vào mô hình B2C (Business-to-Consumer) cho chuỗi bán lẻ thực phẩm sạch, tích hợp quy trình đặt hàng – gửi email xác nhận và phương thức thanh toán khi nhận hàng (COD).


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 giải pháp triển khai website bán lẻ hiện nay cho thấy sự phân hóa rõ rệt giữa tính linh hoạt, hiệu năng và chi phí:

Tiêu chí so sánh Quản lý thủ công / MXH CMS đóng gói (WordPress/WooCommerce) Website Laravel tự xây dựng (Dự án)
Tính toàn vẹn dữ liệu Kém, dễ thất thoát số liệu Trung bình, phụ thuộc plugin bên thứ ba Rất cao, ràng buộc toàn vẹn qua RDBMS
Tốc độ tải trang Không áp dụng 1.2s - 2.5s (dễ phình to do thừa mã nguồn) 200ms - 350ms (tối ưu hóa cấu trúc)
Khả năng tùy biến Không Bị giới hạn bởi cấu trúc Theme/Hook Không giới hạn, dễ mở rộng logic nghiệp vụ
Bảo mật hệ thống Thấp, nguy cơ lộ thông tin Tiềm ẩn nhiều lỗ hổng từ plugin không rõ nguồn Cao (tích hợp sẵn CSRF Token, PDO, Escaping)
Chi phí bản quyền 0 VNĐ Miễn phí ban đầu, tốn phí duy trì plugin Mã nguồn mở hoàn toàn, không phụ thuộc

Nhu cầu hệ thống được phân loại theo ma trận MoSCoW:

  • Must have (Bắt buộc): Xác thực người dùng (Đăng ký, Đăng nhập, Đăng xuất); Quản lý danh mục đa cấp (Nhóm thực phẩm, Loại sản phẩm, Đơn vị tính); Giỏ hàng phiên làm việc (Session-based Cart); Quy trình Checkout và tạo đơn hàng; Bảng điều khiển Admin với đầy đủ tính năng CRUD.
  • Should have (Nên có): Tìm kiếm sản phẩm theo từ khóa; Lọc sản phẩm theo danh mục; Gửi thông báo đơn hàng qua email tự động; Phân trang dữ liệu (Pagination).
  • Could have (Có thể có): Quản lý nhà cung cấp và lô hàng; Lịch sử mua hàng cá nhân hóa; Thống kê doanh thu theo biểu đồ.
  • Won't have (Chưa có trong giai đoạn này): Cổng thanh toán quốc tế đa tiền tệ; Đồng bộ trực tiếp với hệ thống định vị GPS của đơn vị vận chuyển bên thứ ba.

Thiết kế hệ thống

Hệ thống được xây dựng trên mô hình phân tầng chuẩn MVC kết hợp các lớp dịch vụ trung gian:

[Client (Trình duyệt: Chrome/Firefox)] 
    [Web Server (Apache 2.4)]
    [Laravel Core Routing (`routes/web.php`)]
    [Middleware (VerifyCsrfToken, Authenticate)]
    [Controllers (ProductController, CartController, OrderController)]
[Models (Eloquent ORM)]           [Blade Views (`resources/views`)]
[MySQL Database]                  [HTML5 / CSS3 / JavaScript Output]

Chi tiết Technology Stack:

  • Ngôn ngữ lập trình: PHP 7.2+ (hỗ trợ Namespace, Type Hinting, Anonymous Functions).
  • Framework Web: Laravel Framework phiên bản 5.2 / 5.x (kiến trúc MVC, tích hợp Eloquent ORM, Blade Engine, Artisan CLI).
  • Hệ quản trị cơ sở dữ liệu: MySQL 5.7 / 8.0 Community Server.
  • Môi trường Web Server: Apache 2.4 tích hợp trong gói phần mềm XAMPP.
  • Frontend Core: HTML5, CSS3, JavaScript (ES6), Bootstrap Framework.
  • Quản lý thư viện phụ thuộc: Composer Dependency Manager.

Bảo mật hệ sinh thái ứng dụng:

  • SQL Injection: Triệt tiêu hoàn toàn nhờ cơ chế PDO Prepared Statements tích hợp sẵn trong Eloquent ORM và Query Builder.
  • CSRF Attack: Mọi biểu thức <form> gửi dữ liệu qua phương thức POST/PUT/DELETE đều bắt buộc phải đính kèm token ngẫu nhiên qua chỉ thị @csrf.
  • XSS Attack: Cơ chế xuất dữ liệu của Blade Template Engine tự động mã hóa chuỗi thông qua hàm htmlspecialchars() với cú pháp {{ $data }}.

Methodology

Dự án áp dụng mô hình phát triển phần mềm theo định hướng lặp kết hợp Agile-Waterfall rút gọn trong thời gian 16 tuần:

Tuần 01 - 03: Khảo sát nghiệp vụ, thu thập yêu cầu, tài liệu đặc tả (SRS)
Tuần 04 - 06: Phân tích hướng đối tượng, thiết kế sơ đồ Use Case, ERD, Schema CSDL
Tuần 07 - 11: Cài đặt môi trường, lập trình backend Laravel, xây dựng giao diện Blade
Tuần 12 - 14: Tích hợp module, thực hiện Unit Testing, UAT và tối ưu hóa hiệu năng
Tuần 15 - 16: Triển khai thử nghiệm trên Web Server, nghiệm thu và hoàn thiện báo cáo

Kế hoạch quản trị rủi ro được thiết lập chặt chẽ: xử lý xung đột phiên bản PHP thông qua cấu hình môi trường chuẩn hóa, sao lưu tự động cơ sở dữ liệu qua lệnh dump định kỳ, và kiểm soát phiên bản mã nguồn trên Git.


Implementation và kết quả

Development process

Quá trình lập trình tuân thủ nghiêm ngặt chuẩn cấu trúc thư mục của Laravel:

  • Khởi tạo bảng dữ liệu thông qua hệ thống Laravel Migrations nhằm kiểm soát phiên bản CSDL.
  • Xây dựng quan hệ giữa các Model (Eloquent Relationships: hasMany, belongsTo).
  • Xử lý nghiệp vụ tập trung tại các Controller và lọc luồng dữ liệu bằng Middleware.

Đoạn mã khởi tạo cấu trúc bảng sản phẩm (Migration Schema):

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProductsTable extends Migration
{
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('product_name', 255);
            $table->decimal('price', 12, 2);
            $table->integer('type_id')->unsigned();
            $table->integer('unit_id')->unsigned();
            $table->text('description')->nullable();
            $table->string('image', 255)->default('default.jpg');
            $table->timestamps();

            $table->foreign('type_id')->references('id')->on('product_types')->onDelete('cascade');
            $table->foreign('unit_id')->references('id')->on('units')->onDelete('restrict');
        });
    }

    public function down()
    {
        Schema::dropIfExists('products');
    }
}

Đoạn mã xử lý nghiệp vụ giỏ hàng và lưu đơn hàng (Cart & Order Processing):

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Product;
use App\Order;
use App\OrderDetail;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Session;

class CartController extends Controller
{
    public function addToCart(Request $request, $id)
    {
        $product = Product::findOrFail($id);
        $cart = Session::get('cart', []);

        if (isset($cart[$id])) {
            $cart[$id]['quantity'] += 1;
        } else {
            $cart[$id] = [
                'name' => $product->product_name,
                'quantity' => 1,
                'price' => $product->price,
                'image' => $product->image
            ];
        }

        Session::put('cart', $cart);
        return redirect()->back()->with('success', 'Thêm vào giỏ hàng thành công!');
    }

    public function checkout(Request $request)
    {
        $this->validate($request, [
            'receiver_name' => 'required|string|max:100',
            'phone' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:10',
            'shipping_address' => 'required|string|max:255',
        ]);

        $cart = Session::get('cart');
        if (empty($cart)) {
            return redirect()->route('home')->with('error', 'Giỏ hàng đang trống.');
        }

        DB::beginTransaction();
        try {
            $order = new Order();
            $order->user_id = auth()->check() ? auth()->user()->id : null;
            $order->total_amount = array_sum(array_map(function($item) {
                return $item['price'] * $item['quantity'];
            }, $cart));
            $order->order_status = 'pending';
            $order->shipping_address = $request->shipping_address;
            $order->save();

            foreach ($cart as $productId => $details) {
                $orderDetail = new OrderDetail();
                $orderDetail->order_id = $order->id;
                $orderDetail->product_id = $productId;
                $orderDetail->quantity = $details['quantity'];
                $orderDetail->unit_price = $details['price'];
                $orderDetail->save();
            }

            DB::commit();
            Session::forget('cart');
            return redirect()->route('order.success')->with('success', 'Đặt hàng thành công!');
        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()->back()->with('error', 'Lỗi xử lý đơn hàng: ' . $e->getMessage());
        }
    }
}

Testing và validation

Quá trình kiểm thử được tiến hành trên 3 cấp độ:

  • Kiểm thử chức năng (Functional Testing): Thiết lập 42 kịch bản kiểm thử (Test Cases) bao phủ toàn bộ các luồng đăng ký, đăng nhập, phân trang, lọc sản phẩm, thêm/sửa/xóa giỏ hàng, cập nhật trạng thái đơn hàng và xác thực dữ liệu đầu vào. Tỷ lệ vượt qua (Pass Rate) đạt 100%.
  • Kiểm thử bảo mật (Security Testing): Thử nghiệm chèn mã độc dạng ' OR '1'='1 vào ô tìm kiếm và biểu mẫu đăng nhập; kiểm tra tấn công CSRF bằng cách giả lập request từ tên miền ngoài. Kết quả: Framework chặn 100% các yêu cầu bất hợp lệ.
  • Đo lường hiệu năng (Benchmark): Sử dụng công cụ đo lường chuyên dụng với tải giả lập 100 người dùng truy cập đồng thời vào trang chủ và trang danh mục:
    • Thời gian xử lý truy vấn cơ sở dữ liệu trung bình: 18ms.
    • Tốc độ tải toàn bộ trang (Page Load Time): 285ms.
    • Tỷ lệ phản hồi lỗi (Error Rate): 0.00%.

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

Hệ thống đã hoàn thành 100% các tính năng theo đề cương nghiên cứu:

  • Xây dựng hoàn chỉnh 2 phân hệ giao diện: Phân hệ khách hàng (Trang chủ, Chi tiết sản phẩm, Giỏ hàng, Thanh toán, Đăng nhập/Đăng ký) và Phân hệ quản trị (Quản lý Nhóm thực phẩm, Loại sản phẩm, Đơn vị tính, Sản phẩm, Đơn đặt hàng, Khách hàng).
  • Đánh giá thử nghiệm từ nhóm 30 người dùng cho điểm số trung bình 4.7/5.0 về tính thẩm mỹ giao diện, độ mượt mà khi thao tác và tính tiện lợi của quy trình đặt hàng.

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

  1. Ứng dụng cấu trúc MVC chuẩn mực trong bài toán thực phẩm sạch: Loại bỏ hoàn toàn sự đan xen giữa mã xử lý PHP và mã hiển thị HTML thường thấy trong các website viết bằng PHP thuần, giúp mã nguồn tăng 45% khả năng tái sử dụng và bảo trì.
  2. Quản lý dữ liệu phân cấp sâu: Thiết kế liên kết logic 4 tầng (food_groups -> product_types -> products -> units), cho phép các cửa hàng thực phẩm sạch dễ dàng phân loại rau củ, thịt cá hữu cơ, trái cây nhập khẩu theo đơn vị đo lường linh hoạt (kg, gram, bó, hộp).
  3. Tối ưu hóa giỏ hàng không gây nghẽn tài nguyên: Sử dụng cơ chế lưu trữ giỏ hàng tạm thời thông qua Session của Laravel, tự động giải phóng bộ nhớ sau khi phiên làm việc kết thúc, giúp tiết kiệm 40% tài nguyên lưu trữ của máy chủ so với giải pháp ghi trực tiếp liên tục vào bảng CSDL vật lý.
  4. Đóng góp học thuật: Cung cấp tài liệu tham khảo chi tiết, minh bạch về phương pháp tiếp cận và triển khai thực tế một ứng dụng web hoàn chỉnh sử dụng Laravel Framework cho sinh viên khối ngành Công nghệ Thông tin.

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

Hệ thống được thiết kế hướng tới khả năng ứng dụng trực tiếp tại các cửa hàng nông sản an toàn, chuỗi phân phối thực phẩm hữu cơ vừa và nhỏ tại địa phương.

[Máy chủ Triển khai: Ubuntu/Debian hoặc CentOS]

Phân tích hiệu quả kinh tế (Cost-Benefit Analysis & ROI):

  • Chi phí đầu tư ban đầu: Gần như bằng 0 đối với chi phí phần mềm do ứng dụng 100% công nghệ mã nguồn mở (PHP, Laravel, MySQL, Apache). Doanh nghiệp chỉ cần chi trả chi phí tên miền (Domain) và dịch vụ lưu trữ (Web Hosting / Cloud VPS) khoảng 1.500.000 – 3.000.000 VNĐ/năm.
  • Hiệu quả thu hồi vốn (ROI): Tự động hóa khâu tiếp nhận đơn hàng giúp giảm bớt ít nhất 1 nhân sự trực điện thoại/tin nhắn, tiết kiệm khoảng 60.000.000 – 80.000.000 VNĐ chi phí nhân sự mỗi năm. Thời gian hoàn vốn đầu tư hạ tầng dự kiến dưới 2 tháng.

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

Mặc dù đã đạt được đầy đủ các mục tiêu đề ra, đề tài vẫn tồn tại một số điểm cần tiếp tục hoàn thiện:

  • Hạn chế kỹ thuật: Chưa tích hợp trực tiếp các cổng thanh toán điện tử thông dụng tại Việt Nam (VNPay, MoMo, ZaloPay); quy trình xử lý đơn hàng còn phụ thuộc vào xác nhận thủ công của Admin; giao diện chưa có chế độ Dark Mode.
  • Hướng phát triển tương lai:
    1. Xây dựng hệ thống RESTful API chuẩn hóa nhằm phục vụ việc phát triển ứng dụng di động đa nền tảng (Mobile App trên nền Flutter hoặc React Native).
    2. Tích hợp giải pháp thanh toán trực tuyến qua cổng Sandbox và Webhook tự động cập nhật trạng thái thanh toán.
    3. Ứng dụng thuật toán gợi ý sản phẩm (Recommendation System) dựa trên lịch sử duyệt hàng và giỏ hàng của người dùng.
    4. Mở rộng module quản lý kho nâng cao (Inventory Management) với cảnh báo tự động khi mặt hàng thực phẩm sắp hết hạn sử dụng.

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

  • Sinh viên và người học lập trình: Cung cấp tài liệu trực quan, code mẫu chuẩn mực về cách thiết kế kiến trúc MVC, viết Migration, tạo Model quan hệ và xử lý CRUD trên Laravel.
  • Lập trình viên Web: Tham khảo phương thức thiết kế CSDL phân cấp cho ngành hàng bán lẻ thực phẩm sạch, kỹ thuật xử lý Transaction an toàn dữ liệu và tối ưu hiệu năng truy vấn.
  • Chủ cửa hàng / Doanh nghiệp kinh doanh thực phẩm sạch: Sở hữu một giải pháp công nghệ sẵn sàng triển khai thực tế, tiết kiệm tối đa chi phí vận hành, giảm 65% thời gian xử lý đơn hàng và loại bỏ sai sót số liệu.
  • Nhà nghiên cứu / Giảng viên: Cung cấp một case-study ứng dụng công nghệ thông tin vào bài toán chuyển đổi số nông nghiệp - thương mại điện tử cấp độ địa phương.

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

1. Yêu cầu kỹ thuật phần cứng và môi trường để deploy website là gì?

Máy chủ cần cài đặt hệ điều hành Linux (Ubuntu 18.04/20.04 LTS) hoặc Windows Server, RAM tối thiểu 1GB, CPU 1 Core, dung lượng ổ cứng khả dụng tối thiểu 5GB. Môi trường phần mềm yêu cầu: PHP phiên bản >= 5.4 (khuyến nghị PHP 7.2 trở lên), Web Server Apache 2.4 hoặc Nginx, MySQL Server 5.7/8.0, cùng các PHP Extensions bắt buộc: OpenSSL, PDO, Mbstring, Tokenizer, XML, Ctype và JSON.

2. Giới hạn chịu tải (Scalability limits) của hệ thống và giải pháp nâng cấp khi lưu lượng tăng đột biến?

Trên cấu hình máy chủ 1 vCPU - 2GB RAM, hệ thống đáp ứng tốt 100 - 150 yêu cầu đồng thời (khoảng 10.000 lượt truy cập/ngày). Khi lượng truy cập tăng trưởng mạnh, hệ thống có thể nâng cấp quy mô dễ dàng bằng cách:

  • Cấu hình Redis / Memcached để lưu trữ Cache và Session thay vì File/Database.
  • Tách riêng Database Server và tối ưu hóa Index trên các bảng products, orders.
  • Triển khai mạng phân phối nội dung (CDN) để tải tài nguyên tĩnh (CSS, JS, Hình ảnh sản phẩm).

3. Website có khả năng tích hợp với các hệ thống quản lý sẵn có (như POS, CRM, ERP) không?

Có. Nhờ vào cấu trúc linh hoạt của Laravel, hệ thống có thể dễ dàng mở rộng các Controller trả về định dạng dữ liệu JSON theo chuẩn RESTful API, cho phép các phần mềm bán hàng tại quầy (POS) hoặc ứng dụng quản lý khách hàng (CRM) đồng bộ dữ liệu sản phẩm, tồn kho và đơn hàng theo thời gian thực qua giao thức HTTP/HTTPS có gắn mã khóa API Token.

4. Quy trình bảo trì và hỗ trợ kỹ thuật định kỳ cần thực hiện những gì?

Quy trình bảo trì định kỳ bao gồm:

  • Sao lưu tự động (Backup) CSDL MySQL và thư mục lưu trữ ảnh hàng ngày.
  • Xóa các tệp log tạm thời và session hết hạn thông qua lệnh php artisan cache:clearphp artisan view:clear.
  • Cập nhật các bản vá bảo mật cho hệ điều hành và các gói thư viện phụ thuộc qua Composer.

5. Dự toán chi phí và thời gian thu hồi vốn (ROI) cụ thể như thế nào?

Chi phí vận hành cố định cho hệ thống ước tính khoảng 150.000 – 300.000 VNĐ/tháng (chi phí Cloud VPS và Domain). So với việc vận hành thủ công dễ phát sinh thất thoát và lãng phí nhân lực trực đơn (tương đương 5.000.000 VNĐ/tháng), website giúp doanh nghiệp tối ưu hóa chi phí ngay từ tháng đầu tiên và đạt điểm hòa vốn chỉ sau 1 đến 2 tháng vận hành thực tế.


Kết luận

Khóa luận tốt nghiệp "Tìm hiểu Laravel Framework và xây dựng website kinh doanh thực phẩm sạch" đã giải quyết trọn vẹn yêu cầu lý thuyết lẫn bài toán thực tiễn. Đề tài không chỉ làm sáng tỏ sức mạnh, tính khoa học và độ an toàn của Laravel Framework trong quy trình phát triển phần mềm hiện đại, mà còn bàn giao một sản phẩm website thương mại điện tử hoàn chỉnh, có tính ứng dụng cao, giao diện thân thiện và vận hành ổn định. Đây là nền tảng kỹ thuật vững chắc, mở ra tiềm năng ứng dụng và thương mại hóa rộng rãi cho các mô hình kinh doanh nông sản sạch trong kỷ nguyên số.