Giới thiệu dự án

Thương mại điện tử (E-Commerce) tại Việt Nam đang ghi nhận tốc độ tăng trưởng kép hàng năm (CAGR) vượt mức 20%, đạt quy mô hơn 16 tỷ USD vào giai đoạn 2022–2025. Đặc biệt, sau những biến động dịch bệnh toàn cầu và sự thay đổi trong hành vi tiêu dùng, nhu cầu số hóa quy trình cung ứng lương thực, thực phẩm tươi sống và hàng tiêu dùng thiết yếu (FMCG - Fast Moving Consumer Goods) đã trở thành bài toán cấp bách. Người tiêu dùng ngày càng ưu tiên việc mua sắm nhu yếu phẩm trực tuyến nhằm tiết kiệm thời gian, hạn chế tiếp xúc trực tiếp và đảm bảo an toàn vệ sinh.

Tuy nhiên, các mô hình bán lẻ truyền thống và cửa hàng thực phẩm quy mô vừa và nhỏ đang gặp phải nhiều rào cản kỹ thuật: quy trình xử lý đơn hàng thủ công, thiếu hụt công cụ theo dõi tồn kho theo thời gian thực và trải nghiệm mua sắm trực tuyến chưa được tối ưu hóa cho các mặt hàng có vòng đời ngắn. Đồ án tốt nghiệp đại học ngành Công nghệ Thông tin tại Học viện Công nghệ Bưu chính Viễn thông (PTIT) với đề tài "Xây dựng website bán thực phẩm và hàng tiêu dùng thiết yếu" (Hệ thống OGANI) do sinh viên Trần Ngọc Huy thực hiện dưới sự hướng dẫn của TS. Nguyễn Tất Thắng đã giải quyết trực diện các bài toán thực tiễn này.

                    MỤC TIÊU DỰ ÁN OGANI
  +-------------------------------------------------------+
  | 1. Kiến trúc MVC module hóa cao trên Laravel & MySQL  |
  | 2. Quy trình mua sắm tối ưu (Tìm kiếm -> Đặt hàng)   |
  | 3. Bảng điều khiển quản trị toàn diện (Admin Panel)   |
  | 4. Cơ chế bảo mật đa lớp (Bcrypt, CSRF, Prepared SQL) |
  +-------------------------------------------------------+

Mục tiêu dự án

  1. Xây dựng nền tảng B2C trực tuyến hoàn chỉnh: Cung cấp kênh bán lẻ thực phẩm và hàng tiêu dùng thiết yếu với giao diện tối ưu trải nghiệm người dùng (UX/UI), tốc độ phản hồi nhanh và khả năng tương thích đa thiết bị (Responsive Web Design).
  2. Chuẩn hóa quy trình đặt hàng và thanh toán: Tối giản hóa chuỗi hành trình từ tìm kiếm danh mục, lọc theo thương hiệu, thêm vào giỏ hàng đến xác nhận đơn hàng chỉ trong dưới 3 bước tương tác.
  3. Phát triển hệ thống quản trị (Admin Dashboard) tập trung: Tự động hóa việc quản lý danh mục (Category), sản phẩm (Product), thương hiệu (Brand), tài khoản người dùng (User/Customer), đơn hàng (Order) và kiểm duyệt bình luận (Comment).
  4. Bảo mật và toàn vẹn dữ liệu: Thiết lập cơ chế kiểm soát truy cập theo vai trò (RBAC), phòng chống các lỗ hổng web phổ biến như SQL Injection, Cross-Site Scripting (XSS) và Cross-Site Request Forgery (CSRF).

Phạm vi và giới hạn hệ thống

  • Phạm vi triển khai: Hệ thống tập trung xử lý nghiệp vụ bán lẻ thực phẩm B2C, quản lý danh mục hàng hóa, quản lý giỏ hàng (Session Cart), điều phối trạng thái đơn hàng (Pending, Processing, Completed, Cancelled) và thống kê doanh thu theo mốc thời gian.
  • Giới hạn kỹ thuật: Hệ thống chưa tích hợp cổng thanh toán trực tuyến của bên thứ ba (VNPay, MoMo, ZaloPay) qua API trực tiếp mà mô phỏng cổng thanh toán/thanh toán khi nhận hàng (COD); chưa bao gồm hệ sinh thái phân bổ tự động cho đơn vị vận chuyển bên ngoài (3PL Logistics).

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 bán lẻ trực tuyến hiện nay cho thấy sự phân hóa rõ rệt giữa các sàn thương mại điện tử lớn và các nền tảng tự lưu trữ (self-hosted):

Tiêu chí Sàn TMĐT (Shopee, Lazada) Nền tảng CMS (WordPress + WooCommerce) Hệ thống tùy biến Laravel (OGANI)
Tính độc lập dữ liệu Thấp (phụ thuộc chính sách sàn) Trung bình (cần quản trị plugin) Tuyệt đối (toàn quyền quản trị DB)
Hiệu năng & Tối ưu tải Cao nhưng cạnh tranh lưu lượng Suy giảm khi dữ liệu lớn/nhiều plugin Tối ưu hóa sâu qua ORM & Caching
Chi phí duy trì Phí hoa hồng cao trên từng đơn Chi phí hosting, bảo trì plugin Chi phí vận hành thấp, mở rộng linh hoạt
Khả năng mở rộng code Giới hạn qua API bên ngoài Hạn chế bởi cấu trúc hook/filter Không giới hạn (Clean MVC Architecture)

Áp dụng phương pháp phân tích yêu cầu MoSCoW, hệ thống xác định các yêu cầu chức năng cốt lõi:

  • Must-have: Xác thực tài khoản (Auth), duyệt và tìm kiếm sản phẩm, quản lý giỏ hàng (Cart), đặt hàng & lưu trữ đơn hàng (Checkout/Order), CRUD danh mục/sản phẩm/đơn hàng cho Admin.
  • Should-have: Bộ lọc sản phẩm theo hãng/thương hiệu (Brand), chức năng đánh giá & bình luận sản phẩm (Comment Module), cập nhật trạng thái đơn hàng.
  • Could-have: Module thống kê doanh số theo ngày/tháng/năm, gợi ý sản phẩm liên quan.
  • Won't-have (giai đoạn 1): Định vị tài xế giao hàng thời gian thực, gợi ý sản phẩm dựa trên AI Machine Learning.

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình 3 lớp chuẩn hóa Model - View - Controller (MVC), phân tách rành mạch giữa giao diện hiển thị, tầng điều hướng xử lý nghiệp vụ và tầng thao tác cơ sở dữ liệu quan hệ (RDBMS).

graph TD
    Client[Client Browser / User Interface] -->|HTTP Request / Route| Router[Laravel Routing System]
    Router -->|Dispatch| Controller[Controllers: Product, Order, Auth, Category]
    Controller -->|Business Logic & Data Access| Model[Eloquent ORM / Models]
    Model -->|SQL Queries| DB[(MySQL Database)]
    DB -->|Result Set| Model
    Model -->|Data Objects| Controller
    Controller -->|Render Data| View[Blade Template Engine / Views]
    View -->|HTML / CSS / JS Response| Client

Ngăn xếp công nghệ (Technology Stack)

  • Tầng Backend: PHP 8.x kết hợp nền tảng Laravel Framework, tận dụng Eloquent ORM cho việc ánh xạ dữ liệu quan hệ, Blade Template Engine cho render giao diện phía server, và Middleware cho việc lọc request xác thực.
  • Tầng Cơ sở dữ liệu: MySQL 8.0 với Storage Engine InnoDB, hỗ trợ giao dịch ACID (Atomicity, Consistency, Isolation, Durability) và quan hệ khóa ngoại (Foreign Key Constraints).
  • Tầng Frontend: HTML5, CSS3, JavaScript (ES6), Bootstrap Framework, jQuery, hỗ trợ hiển thị phản hồi nhanh và tương thích đa trình duyệt.

Thiết kế Cơ sở dữ liệu (Database Schema)

Cơ sở dữ liệu được chuẩn hóa về dạng 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 quan hệ:

  • users (id, name, email, password, phone, gender, role, created_at, updated_at)
  • categories (id, name, image, created_at, updated_at)
  • brands (id, name, created_at, updated_at)
  • products (id, name, price, quantity, sold_quantity, description, image, category_id, brand_id, created_at, updated_at)
  • orders (id, user_id, total_price, status, shipping_address, phone, note, created_at, updated_at)
  • order_details (id, order_id, product_id, quantity, unit_price, created_at, updated_at)
  • comments (id, user_id, product_id, content, rating, created_at, updated_at)
   +-------------+       +---------------+       +---------------+
   |    users    | 1   n |    orders     | 1   n | order_details |
   +-------------+-------+---------------+-------+---------------+
   | id (PK)     |       | id (PK)       |       | id (PK)       |
   | name        |       | user_id (FK)  |       | order_id (FK) |
   | email       |       | total_price   |       | product_id(FK)|
   | password    |       | status        |       | quantity      |
   +-------------+       +---------------+       +---------------+
          | 1                                            | n
          |                                              |
          | n                                            | 1
   +-------------+       +---------------+       +---------------+
   |  comments   | n   1 |   products    | n   1 |  categories   |
   +-------------+-------+---------------+-------+---------------+
   | id (PK)     |       | id (PK)       |       | id (PK)       |
   | user_id(FK) |       | name, price   |       | name, image   |
   | prod_id(FK) |       | cat_id (FK)   |       +---------------+
   | content     |       | brand_id (FK) |
   +-------------+       +---------------+

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 lặp Agile/Scrum rút gọn, phân bổ trong 12 tuần làm việc với 4 giai đoạn chính:

Tuần 1-2: Khảo sát, thu thập yêu cầu & Thiết kế Usecase/ERD
Tuần 3-5: Thiết lập Backend Architecture, Database Migrations & Module Auth
Tuần 6-8: Phát triển chức năng Khách hàng (Catalog, Giỏ hàng, Đặt hàng)
Tuần 9-10: Xây dựng Admin Dashboard (CRUD Sản phẩm, Đơn hàng, Thống kê)
Tuần 11-12: Kiểm thử (Testing), Tối ưu hiệu năng & Triển khai thực nghiệm

Implementation và kết quả

Quy trình phát triển và Code Snippets

Trong quá trình hiện thực hóa hệ thống, các Controller được xây dựng dựa trên nguyên tắc RESTful Resource Controller, bảo đảm tính nhất quán trong định tuyến và xử lý nghiệp vụ.

Dưới đây là đoạn mã nguồn xử lý luồng thêm mới sản phẩm (ProductController@store) với xác thực dữ liệu đầu vào và lưu trữ tệp hình ảnh vào hệ thống file:

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class ProductController extends Controller
{
    /**
     * Store a newly created product in storage.
     */
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'name'        => 'required|string|max:255',
            'price'       => 'required|numeric|min:0',
            'quantity'    => 'required|integer|min:1',
            'category_id' => 'required|exists:categories,id',
            'brand_id'    => 'required|exists:brands,id',
            'image'       => 'required|image|mimes:jpeg,png,jpg,webp|max:2048',
            'description' => 'nullable|string',
        ]);

        if ($request->hasFile('image')) {
            $imagePath = $request->file('image')->store('products', 'public');
            $validatedData['image'] = $imagePath;
        }

        $validatedData['sold_quantity'] = 0;
        Product::create($validatedData);

        return redirect()->route('admin.products.index')
                         ->with('success', 'Sản phẩm mới đã được khởi tạo thành công!');
    }
}

Quy trình thanh toán và khởi tạo đơn hàng (OrderController@checkout) được bao đóng trong Database Transaction nhằm đảm bảo tính toàn vẹn dữ liệu khi tạo bảng ghi đồng thời trên cả hai bảng ordersorder_details:

namespace App\Http\Controllers;

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

class OrderController extends Controller
{
    public function pay(Request $request)
    {
        $cart = Session::get('cart', []);
        if (empty($cart)) {
            return redirect()->back()->with('error', 'Giỏ hàng đang trống!');
        }

        DB::beginTransaction();
        try {
            $order = Order::create([
                'user_id'          => auth()->id(),
                'total_price'      => $request->input('total_price'),
                'shipping_address' => $request->input('address'),
                'phone'            => $request->input('phone'),
                'status'           => 'Pending',
            ]);

            foreach ($cart as $productId => $item) {
                OrderDetail::create([
                    'order_id'   => $order->id,
                    'product_id' => $productId,
                    'quantity'   => $item['quantity'],
                    'unit_price' => $item['price'],
                ]);

                // Cập nhật số lượng tồn kho và đã bán
                Product::where('id', $productId)->decrement('quantity', $item['quantity']);
                Product::where('id', $productId)->increment('sold_quantity', $item['quantity']);
            }

            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());
        }
    }
}

Kiểm thử và Đánh giá hiệu năng

Hệ thống đã trải qua quá trình kiểm thử tự động (Unit Testing/Integration Testing với PHPUnit) và kiểm thử hiệu năng chịu tải mô phỏng thông qua Apache JMeter:

Tham số kiểm thử Giá trị mục tiêu ban đầu Kết quả thực nghiệm đạt được
Thời gian phản hồi trang chủ (TTFB) < 1.2s 0.42s (đáp ứng xuất sắc)
Số lượng truy vấn đồng thời (Concurrency) 50 người dùng 100 người dùng đồng thời
Tỷ lệ lỗi khi chịu tải cao (Error Rate) < 1.0% 0.00% (tại 100 CCU)
Thời gian thực thi truy vấn Database < 100ms 18ms - 35ms (đã đánh chỉ mục Index)
Điểm trải nghiệm người dùng (UAT - 25 testers) > 4.0/5.0 4.65 / 5.0
                 KẾT QUẢ KIỂM THỬ UAT (N = 25)
  +-----------------------------------------------------------+
  | Tiêu chí UI/UX thân thiện:        [94%] (4.7/5.0)         |
  | Tốc độ tìm kiếm & tải trang:      [92%] (4.6/5.0)         |
  | Tính ổn định giỏ hàng & Order:    [98%] (4.9/5.0)         |
  | Mức độ hài lòng chung:            [93%] (4.65/5.0)        |
  +-----------------------------------------------------------+

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

  1. Chuẩn hóa kiến trúc mã nguồn theo chuẩn công nghiệp: Đồ án không chỉ xây dựng các trang CRUD đơn lẻ mà thiết lập một cấu trúc phân tầng rõ ràng (Routing -> Controller -> Model/ORM -> View), dễ dàng bảo trì và tích hợp thêm các dịch vụ bổ trợ (microservices).
  2. Cải tiến hiệu quả quản trị chuỗi cung ứng hàng thiết yếu: Rút ngắn thời gian xử lý đơn hàng của quản trị viên từ 15 phút (theo sổ sách/chat thủ công) xuống còn dưới 30 giây trên giao diện quản trị tập trung.
  3. Tối ưu hóa tài nguyên phần cứng: So với các giải pháp dựng sẵn trên nền tảng WordPress/WooCommerce có mức tiêu tốn RAM trung bình từ 150MB–250MB cho mỗi tiến trình PHP, kiến trúc Laravel tối giản của đồ án chỉ tiêu thụ khoảng 45MB–65MB RAM, giúp tiết kiệm hơn 60% chi phí hạ tầng máy chủ.
              TIÊU THỤ BỘ NHỚ RAM TRÊN SERVER (MB)
  WordPress + WooCommerce : [████████████████████] ~200MB
  Laravel System (OGANI)  : [██████] ~55MB  (-72.5% Overhead)

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

Kịch bản triển khai thực tế

Hệ thống sẵn sàng được áp dụng ngay cho các chuỗi cửa hàng rau sạch, siêu thị mini, hoặc các hợp tác xã nông nghiệp địa phương có nhu cầu triển khai kênh bán lẻ trực tiếp tới tay người tiêu dùng cuối (D2C - Direct to Consumer).

Yêu cầu phần cứng và phần mềm triển khai

  • Hệ điều hành: Ubuntu Server 20.04 / 22.04 LTS hoặc CentOS 8.
  • Web Server: Nginx 1.20+ hoặc Apache 2.4+ (cấu hình VirtualHost và URL Rewriting).
  • Môi trường chạy: PHP >= 8.0 (kích hoạt các extension: pdo_mysql, mbstring, openssl, tokenizer, xml, ctype, json, fileinfo).
  • Cơ sở dữ liệu: MySQL Server >= 8.0 hoặc MariaDB 10.5+.
  • Phần cứng tối thiểu: 1 Core vCPU, 2GB RAM, 20GB SSD Storage.

Ước tính chi phí và hiệu quả đầu tư (ROI)

  • Chi phí triển khai ban đầu: Khoảng 2.000.000 - 3.500.000 VNĐ (Bao gồm tên miền .vn/.com và Cloud VPS gói cơ bản trong 1 năm).
  • Hiệu quả kinh tế: Giảm thiểu 40% chi phí nhân sự tiếp nhận đơn hàng qua điện thoại/sổ sách; tăng trưởng 25–35% doanh thu thông qua kênh bán hàng 24/7. Thời gian hoàn vốn đầu tư kỹ thuật (Payback Period) ước tính từ 2–3 tháng vận hành.

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

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

  • Hệ thống cơ sở dữ liệu chưa thiết lập mô hình phân mảnh (Sharding) hoặc nhân bản Read/Write Replication để xử lý lượng giao dịch hàng chục nghìn đơn cùng lúc.
  • Hệ thống thanh toán trực tuyến và tự động tính phí vận chuyển dựa trên tọa độ GPS chưa được tích hợp qua cổng API chính thức.
  • Cơ chế quản lý tồn kho chưa áp dụng khóa dòng cấp cơ sở dữ liệu (Pessimistic Locking / SELECT ... FOR UPDATE) khi có xung đột đặt hàng đồng thời trên sản phẩm cuối cùng.

Hướng nâng cấp và mở rộng

  1. Tích hợp cổng thanh toán quốc gia: Tích hợp trực tiếp SDK cổng thanh toán VNPay, ZaloPay và MoMo thông qua chuẩn bảo mật chữ ký số HMAC-SHA256.
  2. Triển khai tầng Cache chuyên dụng: Sử dụng Redis hoặc Memcached để lưu trữ danh mục sản phẩm và dữ liệu phiên làm việc (Session Storage), giảm tải truy vấn lặp lại đến MySQL.
  3. Phát triển ứng dụng di động (Mobile App): Xây dựng RESTful API chuẩn OpenAPI/Swagger và phát triển ứng dụng di động đa nền tảng bằng Flutter hoặc React Native.
  4. Hệ thống gợi ý thông minh (Recommendation Engine): Phân tích giỏ hàng và lịch sử mua sắm bằng giải thuật lọc cộng tác (Collaborative Filtering) để tăng giá trị trung bình trên mỗi đơn hàng (AOV).

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

  • Sinh viên & Người học CNTT: Cung cấp tài liệu tham khảo hoàn chỉnh, chuẩn mực về quy trình thiết kế phần mềm từ Usecase, Sequence Diagram, Class Diagram đến hiện thực hóa mã nguồn MVC trên Laravel.
  • Lập trình viên Web: Tham khảo kiến trúc thiết kế database chuẩn 3NF, kỹ thuật bọc Transaction trong xử lý đơn hàng, và các giải pháp phòng chống tấn công web.
  • Chủ cửa hàng & Doanh nghiệp vừa và nhỏ: Sở hữu giải pháp chuyển đổi số bán lẻ độc lập, chi phí vận hành thấp, không bị phụ thuộc vào mức phí chiết khấu của các sàn TMĐT.
  • Nhà nghiên cứu ứng dụng: Đánh giá hiệu năng thực tế của kiến trúc Monolith MVC trong các bài toán thương mại điện tử chuyên biệt tại thị trường đang phát triển.

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

1. Hệ thống cần cấu hình máy chủ như thế nào để vận hành mượt mà?

Chỉ cần một máy chủ ảo (Cloud VPS) cấu hình tối thiểu 1 vCPU, 2GB RAM chạy hệ điều hành Ubuntu Linux, cài đặt Nginx, PHP 8.1-FPM và MySQL 8.0 là có thể phục vụ ổn định từ 1.000 đến 3.000 lượt truy cập mỗi ngày.

2. Khả năng chịu tải và giới hạn dữ liệu của hệ thống là bao nhiêu?

Với kiến trúc cơ sở dữ liệu InnoDB đã được đánh chỉ mục và tối ưu hóa câu truy vấn, hệ thống có thể quản lý hơn 50.000 sản phẩm và 200.000 bản ghi đơn hàng mà không làm suy giảm thời gian phản hồi (vẫn duy trì dưới 500ms).

3. Việc tích hợp các cổng thanh toán online như VNPay hay MoMo có phức tạp không?

Nhờ cấu trúc mã nguồn module hóa chuẩn MVC trên Laravel, việc tích hợp thanh toán chỉ yêu cầu khai báo thêm Service Class xử lý IPN/Return URL và cấu hình khóa bí mật trong tệp .env, không làm thay đổi cấu trúc bảng ghi của đơn hàng hiện tại.

4. Hệ thống đảm bảo an toàn thông tin người dùng như thế nào?

Mật khẩu người dùng được băm một chiều bằng thuật toán Bcrypt trước khi lưu vào database. Toàn bộ form nhập liệu đều được nhúng mã bảo vệ @csrf chống tấn công giả mạo, và các truy vấn cơ sở dữ liệu đều thông qua Eloquent ORM/PDO Prepared Statements để loại trừ hoàn toàn nguy cơ SQL Injection.

5. Chi phí duy trì hệ thống hàng năm ước tính khoảng bao nhiêu?

Chi phí duy trì bao gồm tên miền (khoảng 250.000 – 450.000 VNĐ/năm) và phí thuê Cloud VPS (khoảng 1.200.000 – 2.400.000 VNĐ/năm). Tổng chi phí vận hành chỉ rơi vào khoảng 1.500.000 – 3.000.000 VNĐ/năm, tối ưu hơn rất nhiều so với chi phí thuê gian hàng và phí giao dịch trên sàn TMĐT.


Kết luận

Đồ án tốt nghiệp "Xây dựng website bán thực phẩm và hàng tiêu dùng thiết yếu" của sinh viên Trần Ngọc Huy (Khoa CNTT - Học viện Công nghệ Bưu chính Viễn thông) là một công trình nghiên cứu và phát triển ứng dụng có tính thực tiễn cao, đáp ứng đúng nhu cầu cấp thiết của thị trường phân phối hàng tiêu dùng thời kỳ số hóa.

Bằng việc kết hợp chặt chẽ giữa lý thuyết phân tích thiết kế hướng đối tượng (UML, Use Case, Sequence Diagram) với nền tảng công nghệ mạnh mẽ (PHP, Laravel, MySQL), đồ án đã xây dựng thành công một hệ sinh thái thương mại điện tử hoàn chỉnh, vận hành ổn định, bảo mật và sẵn sàng triển khai thực tế. Đây không chỉ là tài liệu tham khảo học thuật xuất sắc cho sinh viên ngành Hệ thống Thông tin / Công nghệ Thông tin mà còn là nền móng vững chắc để mở rộng thành các giải pháp bán lẻ đa kênh (Omnichannel) quy mô lớn trong tương lai.