Giới thiệu dự án

Thương mại điện tử (TMĐT) tại Việt Nam đang duy trì tốc độ tăng trưởng trên 20% mỗi năm (theo Hiệp hội Thương mại Điện tử Việt Nam - VECOM). Tuy nhiên, phân khúc bán lẻ nông sản và trái cây tươi vẫn đối mặt với nhiều rào cản do đặc thù vòng đời sản phẩm ngắn (thời hạn bảo quản trung bình 3-7 ngày) và sự phụ thuộc vào mô hình bán buôn truyền thống.

Cửa hàng "Hoa quả Thủy Bùi" trước đây vận hành việc ghi chép, quản lý xuất nhập tồn và thống kê doanh thu thông qua sổ sách và bảng tính Microsoft Excel. Phương thức này bộc lộ các điểm nghẽn nghiêm trọng:

  • Thời gian xử lý đơn hàng thủ công kéo dài từ 15 đến 20 phút mỗi giao dịch.
  • Tỷ lệ sai lệch số lượng hàng tồn thực tế so với sổ sách lên tới 12%.
  • Phạm vi tiếp cận khách hàng bị giới hạn trong khu vực địa lý cục bộ.
  • Nguy cơ thất thoát dữ liệu và khó khăn trong việc mở rộng quy mô kinh doanh.

Đề tài "Phát triển website bán hoa quả Thủy Bùi" do sinh viên Bùi Thị Thu Thủy (Khoa Công nghệ Thông tin, Trường Đại học Công nghệ Đông Á) thực hiện dưới sự hướng dẫn của ThS. Lê Văn Phong nhằm giải quyết triệt để các hạn chế trên. Dự án tập trung xây dựng nền tảng web thương mại điện tử chuyên biệt cho nông sản tươi, tối ưu hóa toàn bộ luồng nghiệp vụ từ hiển thị danh mục, quản lý tồn kho đến tiếp nhận và xử lý đơn đặt hàng trực tuyến.

[Khách Hàng] ---> (Duyệt Sản Phẩm/Vùng Miền) ---> [Thêm Giỏ Hàng] ---> [Đặt Hàng Online]
                                                                              │
                                                                              ▼
[Quản Trị Viên] <--- [Duyệt & Quản Lý Đơn] <--- [Kiểm Tra Tồn Kho] <--- [Lưu CSDL MySQL]

Mục tiêu cụ thể của dự án:

  1. Chuẩn hóa quy trình nghiệp vụ bán lẻ trái cây trực tuyến theo mô hình B2C (Business-to-Consumer).
  2. Xây dựng phân hệ giao diện người dùng (Client Portal) trực quan, cho phép tra cứu hoa quả theo vùng miền (Bắc, Trung, Nam) và đặt hàng nhanh chóng.
  3. Phát triển phân hệ quản trị (Admin Portal) tích hợp đầy đủ các chức năng quản lý danh mục, sản phẩm, đơn hàng, người dùng, banner slider và kiểm duyệt bình luận.
  4. Đảm bảo hiệu năng tải trang trung bình dưới 1.5 giây và khả năng tương thích hiển thị trên nhiều kích thước màn hình (Responsive Web Design).

Phạm vi và giới hạn: Hệ thống phục vụ việc đặt hàng trực tuyến với hình thức thanh toán khi nhận hàng (COD) và chuyển khoản ngân hàng; quản lý danh mục sản phẩm tươi sống nội địa và nhập khẩu; chưa tích hợp gateway thanh toán quốc tế tự động (PayPal/Stripe) hay hệ thống định vị GPS theo dõi lộ trình giao hàng theo thời gian thực.


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 công nghệ trên thị trường cho thấy sự phân hóa rõ rệt giữa các mô hình triển khai:

Tiêu chí Quản lý thủ công (Sổ sách/Excel) Nền tảng CMS có sẵn (WordPress/WooCommerce) Website tùy biến (PHP Laravel MVC)
Chi phí ban đầu Rất thấp (gần như 0 VNĐ) Thấp - Trung bình (mua theme/plugin) Tối ưu theo năng lực phát triển
Khả năng mở rộng Không thể mở rộng Hạn chế bởi kiến trúc plugin có sẵn Rất cao, linh hoạt can thiệp mã nguồn
Tốc độ xử lý CSDL Chậm, dễ xung đột ghi file Dễ nghẽn khi database mở rộng Tối ưu truy vấn qua Eloquent ORM/Index
Bảo mật dữ liệu Kém, nguy cơ mất dữ liệu Dễ bị quét lỗ hổng plugin bên thứ ba Cao (CSRF protection, SQL Injection guard)
Độ phức tạp tùy biến Thủ công toàn bộ Phụ thuộc hook/filter của CMS Tự do cấu hình kiến trúc module

Áp dụng phương pháp phân loại yêu cầu nghiệp vụ theo ma trận MoSCoW:

  • Must have (Bắt buộc): Đăng ký/đăng nhập tài khoản, quản lý danh mục hoa quả, xem chi tiết sản phẩm, giỏ hàng, đặt hàng thanh toán, quản trị đơn hàng (CRUD), quản lý tài khoản.
  • Should have (Nên có): Lọc sản phẩm theo vùng miền (Bắc - Trung - Nam), tìm kiếm theo tên, quản lý banner slider động, quản lý bình luận và đánh giá sản phẩm.
  • Could have (Có thể có): Danh sách sản phẩm yêu thích (Wishlist), sản phẩm nổi bật trên trang chủ, thông tin liên hệ và phản hồi trực tuyến.
  • Won't have (Chưa thực hiện): Tích hợp ví điện tử MoMo/ZaloPay qua Webhook, tự động tính phí vận chuyển theo API của đơn vị giao vận.

Thiết kế hệ thống

Hệ thống được xây dựng trên mô hình kiến trúc chuẩn 3 lớp Model - View - Controller (MVC), phân tách độc lập tầng xử lý dữ liệu, tầng logic nghiệp vụ và tầng giao diện hiển thị.

       +-------------------------------------------------------+
       |                  Client Browser                       |
       +-------------------------------------------------------+
                                  │ HTTP/HTTPS Request
                                  ▼
+─────────────────────────────────────────────────────────────────────+
|                         Web Server                                  |
|  +───────────────────────────────────────────────────────────────+  |
|  |                 Routing & Middleware Layer                    |  |
|  +───────────────────────────────────────────────────────────────+  |
|                                 │                                    |
|                                 ▼                                    |
|  +───────────────────────────────────────────────────────────────+  |
|  |                      Controller Layer                         |  |
|  |  - AuthController          - ProductController                |  |
|  |  - CartController          - OrderController                  |  |
|  +───────────────────────┬───────────────────────────────────────+  |
|                          │                       ▲                  |
|     Pass Data to View    │                       │ Query Data       |
|                          ▼                       │                  |
|  +───────────────────────────────+   +───────────────────────────+  |
|  |          View Layer           |   |        Model Layer        |  |
|  |  (Blade Template Engine)      |   |  (Eloquent ORM Entities)  |  |
|  +───────────────────────────────+   +─────────────┬─────────────+  |
+────────────────────────────────────────────────────┼────────────────+
                                                     │ SQL Query
                                                     ▼
                                       +───────────────────────────+
                                       |      MySQL Database       |
                                       +───────────────────────────+

Technology Stack và phiên bản sử dụng:

  • Backend Framework: PHP 8.0+ / Laravel Framework 8.x
  • Cơ sở dữ liệu: MySQL 8.0 (Hỗ trợ InnoDB engine, foreign key constraints)
  • Frontend Template: Blade Engine, HTML5, CSS3, JavaScript (ES6), Bootstrap 5 Framework
  • Dependency & Package Manager: Composer 2.x, NPM
  • IDE & Công cụ: Visual Studio Code, Git, Postman

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

-- Bảng Danh mục hoa quả
CREATE TABLE `categories` (
  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `category_name` VARCHAR(255) NOT NULL,
  `slug` VARCHAR(255) UNIQUE NOT NULL,
  `status` TINYINT DEFAULT 1,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng Sản phẩm hoa quả
CREATE TABLE `products` (
  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `category_id` INT UNSIGNED NOT NULL,
  `product_name` VARCHAR(255) NOT NULL,
  `origin_region` ENUM('MienBac', 'MienTrung', 'MienNam', 'NhapKhau') NOT NULL,
  `price` DECIMAL(12,2) NOT NULL,
  `quantity` INT NOT NULL DEFAULT 0,
  `image` VARCHAR(255) NOT NULL,
  `description` TEXT,
  `is_featured` TINYINT DEFAULT 0,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng Đơn đặt hàng
CREATE TABLE `orders` (
  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `user_id` INT UNSIGNED NOT NULL,
  `customer_name` VARCHAR(255) NOT NULL,
  `customer_phone` VARCHAR(20) NOT NULL,
  `customer_address` TEXT NOT NULL,
  `total_amount` DECIMAL(12,2) NOT NULL,
  `order_status` ENUM('Pending', 'Processing', 'Delivered', 'Cancelled') DEFAULT 'Pending',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng Chi tiết đơn hàng
CREATE TABLE `order_details` (
  `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  `order_id` INT UNSIGNED NOT NULL,
  `product_id` INT UNSIGNED NOT NULL,
  `price` DECIMAL(12,2) NOT NULL,
  `quantity` INT NOT NULL,
  `subtotal` DECIMAL(12,2) NOT NULL,
  FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE CASCADE,
  FOREIGN KEY (`product_id`) REFERENCES `products`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Bảng thiết kế API / Routing chính:

Phương thức Endpoint URI Phân quyền Chức năng nghiệp vụ
GET / Public Tải trang chủ (Banner, Sản phẩm nổi bật)
GET /products/{id} Public Xem thông tin chi tiết mặt hàng hoa quả
POST /cart/add User Thêm sản phẩm vào giỏ hàng (Lưu Session)
POST /checkout User (Auth) Gửi thông tin đặt hàng và tạo bản ghi Order
GET /admin/dashboard Admin Tải trang tổng quan điều hành
POST /admin/products/store Admin Thêm mới mặt hàng hoa quả vào cơ sở dữ liệu
PUT /admin/orders/{id} Admin Cập nhật trạng thái duyệt/hủy đơn hàng

Methodology

Dự án áp dụng quy trình phát triển phần mềm theo mô hình Thác nước cải tiến (Modified Waterfall) kết hợp kiểm thử hồi quy theo từng phân hệ:

  1. Khảo sát & Đặc tả (Tuần 1 - 2): Thu thập nghiệp vụ nhập hàng, lưu kho, định giá và giao vận thực tế tại cửa hàng Thủy Bùi.
  2. Thiết kế hệ thống (Tuần 3 - 5): Xây dựng sơ đồ Use Case, Sequence Diagram, Activity Diagram và thiết kế CSDL mức quan niệm/vật lý.
  3. Lập trình chức năng (Tuần 6 - 11): Triển khai cấu trúc MVC, xây dựng Module Admin và Module Client.
  4. Kiểm thử & Đánh giá (Tuần 12 - 14): Thực hiện Black-box testing, tải dữ liệu mẫu, tối ưu truy vấn SQL và bảo mật.

Implementation và kết quả

Development process

Quá trình xây dựng hệ thống tuân thủ cấu trúc thư mục tiêu chuẩn của Laravel Framework, áp dụng nguyên lý Clean Code và tách biệt logic qua Controller và Eloquent Model.

app/
├── Http/
│   ├── Controllers/
│   │   ├── Admin/
│   │   │   ├── CategoryController.php
│   │   │   ├── ProductController.php
│   │   │   └── OrderController.php
│   │   ├── AuthController.php
│   │   ├── CartController.php
│   │   └── HomeController.php
│   └── Middleware/
│       └── AdminAuthenticate.php
├── Models/
│   ├── Category.php
│   ├── Product.php
│   ├── Order.php
│   └── OrderDetail.php
resources/
└── views/
    ├── admin/
    │   ├── products/
    │   └── orders/
    └── client/
        ├── home.blade.php
        ├── cart.blade.php
        └── checkout.blade.php

Thuật toán xử lý giỏ hàng và đặt hàng trong CartController.php:

namespace App\Http\Controllers;

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

class CartController extends Controller
{
    // Thêm sản phẩm vào giỏ hàng lưu tại Session
    public function addToCart(Request $request, $id)
    {
        $product = Product::findOrFail($id);
        $cart = Session::get('cart', []);

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

        Session::put('cart', $cart);
        return redirect()->back()->with('success', 'Sản phẩm đã được thêm vào giỏ hàng!');
    }

    // Xử lý lưu đơn hàng áp dụng Database Transaction
    public function processCheckout(Request $request)
    {
        $cart = Session::get('cart');
        if (empty($cart)) {
            return redirect()->route('home')->with('error', 'Giỏ hàng của bạn đang trống!');
        }

        $validatedData = $request->validate([
            'customer_name' => 'required|string|max:255',
            'customer_phone' => 'required|string|max:20',
            'customer_address' => 'required|string',
        ]);

        DB::beginTransaction();
        try {
            $totalAmount = 0;
            foreach ($cart as $item) {
                $totalAmount += $item['price'] * $item['quantity'];
            }

            $order = Order::create([
                'user_id' => auth()->id(),
                'customer_name' => $validatedData['customer_name'],
                'customer_phone' => $validatedData['customer_phone'],
                'customer_address' => $validatedData['customer_address'],
                'total_amount' => $totalAmount,
                'order_status' => 'Pending'
            ]);

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

                // Trừ số lượng tồn kho
                $product = Product::find($productId);
                $product->decrement('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', 'Đã xảy ra lỗi khi tạo đơn hàng: ' . $e->getMessage());
        }
    }
}

Testing và validation

Hệ thống đã trải qua các đợt kiểm thử chức năng (Functional Testing) và kiểm thử hiệu năng (Performance Testing) với kết quả định lượng:

Hạng mục kiểm thử Phương pháp thực hiện Số ca kiểm thử (Test Cases) Tỷ lệ đạt (Pass Rate) Kết quả ghi nhận
Xác thực người dùng Black-box Testing 18 100% Bắt lỗi đúng định dạng email, mật khẩu mã hóa Bcrypt
Thao tác Giỏ hàng Session State Testing 24 100% Cập nhật chính xác số lượng, tự tính tổng tiền
Đặt hàng & Transaction Data Integrity Test 15 100% Rollback thành công nếu thiếu thông tin chi tiết đơn
Quản trị CRUD Form & File Upload Test 32 96.8% Upload ảnh sản phẩm an toàn, chống file thực thi

Đo lường hiệu năng kỹ thuật:

  • Time to First Byte (TTFB): Trung bình đạt 135ms trên môi trường máy chủ cục bộ Apache/Nginx.
  • Tốc độ tải trang hoàn tất: 1.18s với trang chủ chứa 24 sản phẩm và 3 banner slider.
  • Điểm đánh giá Google Lighthouse: Performance: 91/100, Accessibility: 94/100, Best Practices: 92/100, SEO: 96/100.
Lighthouse Score Summary:
[█████████████████████████████████████████████░░░░░] 91% Performance
[███████████████████████████████████████████████░░░] 94% Accessibility
[██████████████████████████████████████████████░░░░] 92% Best Practices
[████████████████████████████████████████████████░░] 96% SEO

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

Hệ thống đã hoàn thiện 100% các yêu cầu nghiệp vụ đặt ra trong đề cương đồ án:

  1. Phân hệ Client: Giao diện trang chủ hiển thị sinh động các nhóm sản phẩm nổi bật, sản phẩm theo vùng miền (Hoa quả Miền Bắc, Miền Trung, Miền Nam, Giỏ quà biếu), trang chi tiết với cơ chế xem ảnh phóng to, đánh giá bình luận, trang tìm kiếm tức thời theo từ khóa và giỏ hàng tương tác thời gian thực.
  2. Phân hệ Admin: Bảng điều khiển quản trị cho phép thực hiện đầy đủ thao tác thêm, sửa, xóa, lọc trạng thái đối với: Danh mục sản phẩm, Kho mặt hàng hoa quả, Quản lý đơn hàng (chuyển trạng thái: Chờ xử lý -> Đã duyệt -> Đang giao -> Đã hủy), Quản lý slide quảng cáo và kiểm duyệt bình luận của khách hàng.

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

  • Tối ưu hóa phân loại chuyên biệt cho nông sản: Khác với các website thương mại điện tử tổng hợp, hệ thống thiết kế cấu trúc dữ liệu chia theo vùng miền địa lý xuất xứ nông sản Việt Nam, giúp tăng 35% độ tin cậy của người mua đối với nguồn gốc hoa quả.
  • Cơ chế Transaction bảo toàn tính toàn vẹn dữ liệu đơn hàng: Việc áp dụng DB::beginTransaction()DB::commit() trong Laravel đảm bảo không bao giờ xảy ra tình trạng "trừ tồn kho nhưng không tạo được đơn hàng" hoặc "tạo đơn hàng nhưng lỗi chi tiết đơn", giảm thiểu 100% sai số logic so với phương thức viết mã PHP thủ công truyền thống.
  • Kiến trúc module hóa dễ nâng cấp: Việc xây dựng trên nền tảng Laravel 8.x với hệ thống Routing và Controller tách bạch cho phép mở rộng chuyển đổi thành RESTful API phục vụ Mobile App (Flutter/React Native) trong tương lai mà không cần cấu trúc lại CSDL.

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

Kịch bản vận hành thực tế

  1. Khách hàng cá nhân: Truy cập website trên thiết bị di động, tìm kiếm "Cam sành Hàm Yên", xem thông tin xuất xứ và giá bán, thêm 5kg vào giỏ hàng, điền thông tin giao hàng tại Hà Nội và chọn thanh toán COD.
  2. Chủ cửa hàng (Admin): Nhận thông báo đơn hàng mới trên dashboard, kiểm tra tồn kho, chuyển trạng thái đơn hàng sang "Đang giao hàng" và in thông tin phiếu xuất.

Hướng dẫn cài đặt và cấu hình hệ sinh thái

Yêu cầu môi trường tối thiểu:

  • Web Server: Apache 2.4+ hoặc Nginx 1.18+
  • PHP: Phiên bản >= 8.0 với các extensions: OpenSSL, PDO, Mbstring, Tokenizer, XML, Ctype, JSON, BCMath.
  • Database: MySQL >= 8.0 hoặc MariaDB >= 10.4
  • Công cụ: Composer >= 2.0, Node.js >= 16.x & NPM

Quy trình triển khai:

# 1. Clone mã nguồn từ kho lưu trữ
git clone https://github.com/thuybui/fruit-ecommerce-laravel.git
cd fruit-ecommerce-laravel

# 2. Cài đặt các gói phụ thuộc PHP và JavaScript
composer install --optimize-autoloader --no-dev
npm install && npm run prod

# 3. Cấu hình biến môi trường
cp .env.example .env
php artisan key:generate

# 4. Cấu hình thông số Database trong file .env
# DB_DATABASE=thuybui_fruit_db
# DB_USERNAME=root
# DB_PASSWORD=your_secure_password

# 5. Khởi tạo cấu trúc bảng CSDL và nạp dữ liệu mẫu
php artisan migrate --seed

# 6. Tạo Symbolic Link cho thư mục lưu trữ ảnh tải lên
php artisan storage:link

# 7. Khởi chạy máy chủ dịch vụ
php artisan serve --port=8000

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

Hạn chế kỹ thuật

  • Quá trình thanh toán trực tuyến chưa tích hợp tự động với cổng thanh toán điện tử (VNPay, ZaloPay, MoMo) qua Webhook IPN, vẫn phụ thuộc vào xác nhận thủ công từ phía Admin khi khách chuyển khoản.
  • Phí vận chuyển đang áp dụng đồng giá hoặc miễn phí, chưa tích hợp API tính khoảng cách tự động từ các đơn vị vận chuyển (Giao Hàng Tiết Kiệm, Ahamove).

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

  • Xây dựng hệ thống RESTful API chuẩn OpenAPI/Swagger để kết nối ứng dụng di động đa nền tảng.
  • Ứng dụng giải pháp Redis Cache để lưu trữ Session và Cache danh mục sản phẩm, nâng cao khả năng chịu tải lên 2,000+ CCU.
  • Tích hợp hệ thống gợi ý sản phẩm thông minh dựa trên lịch sử mua sắm của khách hàng.

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

  • Sinh viên ngành CNTT/Kỹ thuật phần mềm: Đồ án cung cấp tài liệu tham khảo hoàn chỉnh về cách áp dụng mô hình MVC, quy trình phân tích thiết kế hệ thống với sơ đồ UML (Use Case, Sequence, Activity) và mã nguồn mẫu Laravel chuẩn mực.
  • Lập trình viên Web PHP: Nắm bắt được cách xử lý Database Transaction trong bài toán thương mại điện tử, quản lý State giỏ hàng qua Session và cấu trúc phân quyền Middleware trong Laravel.
  • Chủ doanh nghiệp/Cửa hàng nông sản vừa và nhỏ: Sở hữu giải pháp mẫu để chuyển đổi số mô hình kinh doanh trái cây, tối ưu hóa chi phí vận hành và mở rộng kênh tiếp cận khách hàng trực tuyến.

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

1. Hệ thống yêu cầu cấu hình phần cứng máy chủ (VPS/Hosting) như thế nào để vận hành ổn định?
Để phục vụ khoảng 500 - 1,000 lượt truy cập mỗi ngày, hệ thống chỉ cần máy chủ ảo (Cloud VPS) cấu hình cơ bản: 1 vCPU, 2GB RAM, 20GB SSD lưu trữ, chạy hệ điều hành Ubuntu 20.04/22.04 LTS kết hợp Nginx và PHP-FPM.

2. Laravel bảo vệ website trước các cuộc tấn công bảo mật phổ biến như thế nào?
Laravel tích hợp sẵn cơ chế chống CSRF (Cross-Site Request Forgery) thông qua thẻ @csrf token trong mọi form HTML; Eloquent ORM sử dụng cơ chế PDO Parameter Binding giúp triệt tiêu hoàn toàn nguy cơ SQL Injection; mật khẩu tài khoản được băm một chiều bằng thuật toán Bcrypt.

3. Làm thế nào để mở rộng CSDL khi lượng sản phẩm và đơn hàng tăng lên hàng chục nghìn bản ghi?
Cần đánh chỉ mục (Index) trên các trường thường xuyên tìm kiếm và liên kết khóa ngoại (category_id, product_name, order_status, created_at), kết hợp áp dụng Eloquent Eager Loading (Product::with('category')->get()) để giải quyết triệt để vấn đề N+1 Query.

4. Dữ liệu hình ảnh sản phẩm được lưu trữ và tối ưu như thế nào?
Hình ảnh tải lên từ trang Admin được đổi tên duy nhất bằng chuỗi hash thời gian thực, lưu trữ tại thư mục storage/app/public/products và được liên kết tới web root thông qua lệnh php artisan storage:link.

5. Chi phí ước tính để duy trì và vận hành website bán hoa quả này trong 1 năm là bao nhiêu?
Chi phí duy trì hàng năm bao gồm: Tên miền quốc tế .com hoặc .vn (~300,000 - 750,000 VNĐ/năm), gói Cloud VPS cơ bản (~1,200,000 - 1,800,000 VNĐ/năm), chứng chỉ bảo mật SSL (miễn phí qua Let's Encrypt). Tổng chi phí vận hành chỉ dao động từ 1.5 - 2.5 triệu VNĐ/năm.


Kết luận

Đồ án tốt nghiệp "Phát triển website bán hoa quả Thủy Bùi" của sinh viên Bùi Thị Thu Thủy đã giải quyết thành công bài toán chuyển đổi số từ mô hình kinh doanh truyền thống sang nền tảng thương mại điện tử hiện đại. Bằng việc ứng dụng khung kiến trúc Laravel MVC mạnh mẽ kết hợp hệ quản trị cơ sở dữ liệu MySQL, dự án đã xây dựng nên một hệ thống hoàn chỉnh, ổn định, bảo mật và đáp ứng đầy đủ các yêu cầu nghiệp vụ khắt khe của ngành bán lẻ nông sản tươi sống. Đây là giải pháp công nghệ có tính ứng dụng thực tiễn cao, đóng góp thiết thực cho việc nâng cao năng lực cạnh tranh và hiệu quả kinh tế của các cửa hàng kinh doanh hoa quả trong kỷ nguyên số.