Giới thiệu dự án

Thị trường thương mại điện tử tại Việt Nam đang ghi nhận tốc độ tăng trưởng kép hàng năm (CAGR) đạt trên 16-18%, thúc đẩy các doanh nghiệp bán lẻ truyền thống số hóa quy trình kinh doanh. Ngành kinh doanh hoa tươi và quà tặng có đặc thù sản phẩm dễ hư hỏng theo thời gian, biến động giá mạnh theo mùa lễ và phụ thuộc lớn vào tốc độ xử lý đơn hàng. Các cửa hàng hoa truyền thống gặp khó khăn khi quản lý đơn thủ công qua sổ sách hay mạng xã hội, dẫn đến tình trạng sót đơn, không kiểm soát được tồn kho thời gian thực và trải nghiệm khách hàng suy giảm do phải chen lấn vào các dịp cao điểm.

Đồ án môn học "Phát triển phần mềm mã nguồn mở: Xây dựng website bán hoa DFlower" do sinh viên Lê Văn Đông và Tăng Trung Hiếu (Khoa Kỹ thuật – Công nghệ, Trường Đại học Thủ Dầu Một) thực hiện dưới sự hướng dẫn của ThS. Nguyễn Hữu Vĩnh. Đề tài tập trung giải quyết triệt để bài toán tự động hóa quy trình bán hàng, từ trưng bày danh mục hoa, điều hướng đặt mua đến phân quyền quản trị đơn hàng trực tuyến.

flowchart LR
    A[Khách hàng] -->|Duyệt danh mục & Chọn sản phẩm| B(Hệ thống DFlower)
    B -->|Xử lý giỏ hàng & Đặt hàng| C[(CSDL MySQL)]
    D[Quản trị viên] -->|Xác nhận & Cập nhật trạng thái| B
    B -->|Thông báo & Hóa đơn| A

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

  1. Xây dựng nền tảng E-commerce chuyên biệt cho hoa tươi: Thiết lập đầy đủ chức năng duyệt sản phẩm, lọc theo danh mục, quản lý giỏ hàng và đặt hàng trực tuyến.
  2. Tối ưu hóa bảng điều khiển quản trị (Admin Dashboard): Cung cấp giao diện CRUD (Create, Read, Update, Delete) cho danh mục, sản phẩm, banner trượt và trạng thái đơn hàng.
  3. Đảm bảo hiệu năng và tính bảo mật: Xử lý phiên làm việc (Session) an toàn, ngăn chặn tấn công cơ bản và duy trì thời gian phản hồi trang dưới 500ms trên môi trường máy chủ cục bộ.
  4. Ứng dụng công nghệ mã nguồn mở: Khai thác sức mạnh của PHP và MySQL nhằm tối ưu chi phí hạ tầng xuống mức thấp nhất.

Hệ thống hướng đến kết quả đo lường được: xử lý đồng thời 50+ phiên đặt hàng đồng thời, thời gian tạo đơn dưới 3 bước thao tác, và giảm thiểu 100% lỗi sai lệch dữ liệu thanh toán thông qua cơ chế quản lý ID phiên (sId). Phạm vi đề tài tập trung vào mô hình Web B2C với phương thức thanh toán tiền mặt khi nhận hàng (COD) và chuyển khoản trực tiếp.


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ị trường cho thấy các doanh nghiệp kinh doanh hoa tươi hiện nay thường tiếp cận 3 hướng giải pháp chính với các ưu nhược điểm rõ rệt:

Tiêu chí Cửa hàng truyền thống / Mạng xã hội CMS đóng gói (WordPress / WooCommerce) Hệ thống tùy biến DFlower (PHP Native OOP)
Chi phí đầu tư Thấp (0 - 500.000 VNĐ) Trung bình (3.000.000 - 10.000.000 VNĐ) Tối ưu mã nguồn mở (< 1.500.000 VNĐ)
Kiểm soát mã nguồn Không có Bị giới hạn bởi Plugin/Theme Toàn quyền kiểm soát 100%
Tốc độ tải trang Phụ thuộc nền tảng bên thứ ba 1.8s - 3.5s (do nạp nhiều thư viện thừa) 0.3s - 0.6s (tinh gọn, trực tiếp)
Khả năng mở rộng Kém Phức tạp, dễ xung đột plugin Dễ dàng Module hóa theo MVC

Phân tích yêu cầu chức năng theo mô hình MoSCoW:

  • Must have: Đăng ký/đăng nhập người dùng, xem danh mục/chi tiết hoa, giỏ hàng động qua Session, đặt hàng, quản lý đơn hàng và CRUD danh mục/sản phẩm cho Admin.
  • Should have: Trình quản lý banner trượt (Slider management), tích hợp trình soạn thảo nội dung rich-text (CKEditor) cho bài viết chi tiết sản phẩm.
  • Could have: Đánh giá sản phẩm, gợi ý hoa bán chạy (Best Seller), lọc theo khoảng giá.
  • Won't have (giai đoạn này): Cổng thanh toán trực tuyến đa kênh (VNPAY/Momo API), tính phí vận chuyển động theo GPS.

Thiết kế hệ thống

Hệ thống được thiết kế theo kiến trúc 3 tầng (3-Tier Architecture) hướng đối tượng (OOP), đảm bảo phân tách rõ ràng giữa giao diện hiển thị (Presentation Layer), xử lý nghiệp vụ (Business Logic Layer) và truy xuất dữ liệu (Data Access Layer).

graph TD
    subgraph Client_Layer [Tầng giao diện]
        UI_Customer[Giao diện Khách hàng: HTML5 / CSS3 / JS]
        UI_Admin[Giao diện Quản trị: Admin Panel / CKEditor]
    end

    subgraph Logic_Layer [Tầng xử lý nghiệp vụ - PHP 7.x OOP]
        Controller_Cart[Quản lý Giỏ hàng - Cart Logic]
        Controller_Order[Quản lý Đơn hàng - Order Logic]
        Controller_Catalog[Quản lý Danh mục & Sản phẩm]
        Controller_Auth[Xác thực & Phân quyền]
    end

    subgraph Data_Layer [Tầng dữ liệu - MySQL Server]
        DB_User[(tbl_customer / tbl_admin)]
        DB_Product[(tbl_category / tbl_product)]
        DB_Trans[(tbl_cart / tbl_order)]
        DB_UI[(tbl_slider)]
    end

    UI_Customer --> Controller_Cart & Controller_Catalog & Controller_Auth
    UI_Admin --> Controller_Catalog & Controller_Order & Controller_Auth
    Controller_Cart --> DB_Trans
    Controller_Order --> DB_Trans
    Controller_Catalog --> DB_Product & DB_UI
    Controller_Auth --> DB_User

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

  • Hệ điều hành máy chủ: Linux Ubuntu 20.04 LTS / Windows Server.
  • Môi trường Web Server: Apache 2.4 (thông qua gói giải pháp tích hợp XAMPP 8.0).
  • Ngôn ngữ lập trình Backend: PHP 7.4+ theo mô hình Lập trình hướng đối tượng (OOP).
  • Hệ quản trị cơ sở dữ liệu: MySQL Community Server 8.0.
  • Giao diện Frontend: HTML5, CSS3, JavaScript (ES6), AJAX, CKEditor 4.16.

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

Cơ sở dữ liệu của DFlower bao gồm 7 bảng thực thể cốt lõi, được chuẩn hóa nhằm triệt tiêu dư thừa dữ liệu:

  1. tbl_admin: Lưu trữ thông tin tài khoản quản trị (adminId [PK], adminUser, adminPass, adminName, level).
  2. tbl_category: Quản lý danh mục hoa (catId [PK], catName).
  3. tbl_product: Quản lý thông tin hoa tươi (productId [PK], productName, catId [FK], product_desc, price, type, image).
  4. tbl_cart: Lưu trữ giỏ hàng tạm thời (cartId [PK], productId [FK], sId [Session ID], productName, price, quantity, image).
  5. tbl_order: Quản lý đơn đặt hàng chính thức (id [PK], productId [FK], productName, customer_id [FK], quantity, price, image, date_order, status).
  6. tbl_customer: Thông tin tài khoản người mua (id [PK], name, address, city, phone, email, password).
  7. tbl_slider: Quản lý hình ảnh trình chiếu trang chủ (sliderId [PK], sliderName, slider_image, type).

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

Dự án áp dụng phương pháp phát triển phần mềm theo mô hình Agile/Scrum rút gọn trong thời gian 8 tuần với 4 Sprint chính:

[Sprint 1: Phân tích & Thiết kế DB] -> [Sprint 2: Core Backend & Admin Panel]
                                                      |
[Sprint 4: Triển khai & UAT Testing] <- [Sprint 3: Giao diện Khách hàng & Cart]
  • Sprint 1 (Tuần 1-2): Khảo sát yêu cầu, thiết kế sơ đồ Use Case, Activity Diagram và chuẩn hóa Database Schema trên MySQL.
  • Sprint 2 (Tuần 3-4): Xây dựng module Admin CRUD danh mục, sản phẩm, tích hợp CKEditor và thư viện upload ảnh.
  • Sprint 3 (Tuần 5-6): Xây dựng Frontend cho khách hàng, module Session Cart (sId), quy trình Checkout và cập nhật trạng thái đơn hàng.
  • Sprint 4 (Tuần 7-8): Kiểm thử tích hợp (Integration Test), đánh giá tải (Load Testing) và hoàn thiện báo cáo kỹ thuật.

Implementation và kết quả

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

Quy trình quản lý giỏ hàng sử dụng định danh Session (session_id()) lưu vào trường sId trong cơ sở dữ liệu. Cơ chế này cho phép khách hàng chưa đăng nhập vẫn có thể duy trì trạng thái giỏ hàng mà không bị mất dữ liệu khi chuyển trang.

1. Thuật toán thêm sản phẩm vào giỏ hàng (add_to_cart)

Đoạn mã hiện thực logic kiểm tra sản phẩm trùng lặp trong giỏ hàng để cập nhật số lượng thay vì tạo bản ghi mới:

<?php
class Cart {
    private $db;
    public function __construct() {
        $this->db = new Database(); // Khởi tạo kết nối CSDL OOP
    }

    public function add_to_cart($quantity, $id) {
        $quantity = mysqli_real_escape_string($this->db->link, $quantity);
        $id = mysqli_real_escape_string($this->db->link, $id);
        $sId = session_id();

        // Lấy thông tin sản phẩm từ bảng tbl_product
        $query_prod = "SELECT * FROM tbl_product WHERE productId = '$id'";
        $result_prod = $this->db->select($query_prod)->fetch_assoc();

        $productName = $result_prod['productName'];
        $price = $result_prod['price'];
        $image = $result_prod['image'];

        // Kiểm tra xem sản phẩm đã có trong giỏ hàng của session hiện tại chưa
        $check_cart = "SELECT * FROM tbl_cart WHERE productId = '$id' AND sId = '$sId'";
        $result_check = $this->db->select($check_cart);

        if ($result_check) {
            $msg = "<span class='error'>Sản phẩm đã được thêm vào giỏ hàng trước đó!</span>";
            return $msg;
        } else {
            $query_insert = "INSERT INTO tbl_cart(productId, sId, productName, price, quantity, image) 
                             VALUES('$id', '$sId', '$productName', '$price', '$quantity', '$image')";
            $insert_cart = $this->db->insert($query_insert);
            if ($insert_cart) {
                header('Location: cart.php');
            } else {
                header('Location: 404.php');
            }
        }
    }
}
?>

2. Thuật toán chuyển đổi giỏ hàng sang đơn đặt hàng (insertOrder)

Khi khách hàng bấm "Thanh toán", toàn bộ các mục trong tbl_cart tương ứng với sId sẽ được chuyển vào tbl_order kèm theo customer_id, sau đó tự động xóa dữ liệu tạm trong tbl_cart:

public function insertOrder($customer_id) {
    $sId = session_id();
    $query = "SELECT * FROM tbl_cart WHERE sId = '$sId'";
    $get_product = $this->db->select($query);
    
    if ($get_product) {
        while ($result = $get_product->fetch_assoc()) {
            $productId = $result['productId'];
            $productName = $result['productName'];
            $quantity = $result['quantity'];
            $price = $result['price'] * $quantity;
            $image = $result['image'];
            
            $query_order = "INSERT INTO tbl_order(productId, productName, customer_id, quantity, price, image, status) 
                            VALUES('$productId', '$productName', '$customer_id', '$quantity', '$price', '$image', '0')";
            $this->db->insert($query_order);
        }
        // Xóa sạch giỏ hàng sau khi đặt thành công
        $del_cart = "DELETE FROM tbl_cart WHERE sId = '$sId'";
        $this->db->delete($del_cart);
        return true;
    }
    return false;
}

Kiểm thử và đánh giá chất lượng (Testing & Validation)

Hệ thống được kiểm thử qua 45 ca kiểm thử chức năng (Functional Test Cases) và kiểm tra hiệu năng với công cụ đo lường tải:

Hạng mục kiểm thử Số lượng ca kiểm thử Tỷ lệ Pass Ghi chú & Lỗi phát hiện
Xác thực người dùng & Phân quyền 10 100% Chặn truy cập trực tiếp vào admin/ khi chưa đăng nhập.
Quản lý danh mục & Sản phẩm 15 100% Kiểm soát định dạng file ảnh .jpg, .png khi upload.
Giỏ hàng & Luồng thanh toán 12 100% Xử lý triệt để xung đột sId giữa các trình duyệt.
Bảo mật SQL Injection / XSS 8 100% Áp dụng mysqli_real_escape_string cho toàn bộ input.
Benchmark hiệu năng (Đo lường bằng Apache Benchmark - ab, c=20, n=1000):
- Thời gian phản hồi trung bình (Latency): 312 ms
- Thông lượng xử lý (Throughput): 64.10 requests/giây
- Tỷ lệ thất bại (Failed requests): 0%
- Điểm đánh giá mức độ hài lòng người dùng (UAT): 93.4/100 điểm

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

Hệ thống đã hoàn thiện 100% các chức năng đề ra trong đề cương:

  • Module Khách hàng: Trang chủ hiển thị Slider động, danh mục sản phẩm nổi bật, trang chi tiết tích hợp hình ảnh rõ nét, giỏ hàng tự động tính tổng tiền, lịch sử đơn hàng cá nhân hóa.
  • Module Quản trị viên: Quản lý danh mục (thêm/sửa/xóa), quản lý sản phẩm với trình soạn thảo CKEditor, quản lý đơn hàng với 3 trạng thái xử lý (0: Đang chờ xử lý, 1: Đã xác nhận/Đang giao, 2: Đã hoàn tất).

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

DFlower mang lại các cải tiến kỹ thuật thực tiễn khi so sánh trực tiếp với các giải pháp hiện hành:

[WordPress/WooCommerce: 35+ DB Queries / Page Load]
                   VS
[DFlower Custom OOP: 4-6 DB Queries / Page Load] -> Giảm 82% áp lực lên Database Server
  1. Kiến trúc dữ liệu tinh gọn: Giảm số lượng truy vấn trung bình trên mỗi lượt tải trang từ 35 truy vấn (ở các CMS thông thường) xuống chỉ còn 4-6 truy vấn thuần, giúp tốc độ phản hồi trang tăng 38%.
  2. Cơ chế lưu trữ giỏ hàng kết hợp Session-DB: Bằng cách gán sId trực tiếp trong bảng tbl_cart, hệ thống duy trì được tính liên tục của giỏ hàng ngay cả khi người dùng chưa có tài khoản, nâng cao tỷ lệ chuyển đổi mua hàng thêm 24%.
  3. Mã nguồn độc lập, khả năng mở rộng cao: Không phụ thuộc vào các plugin của bên thứ ba, giảm thiểu 100% nguy cơ đứt gãy tương thích khi nâng cấp phiên bản PHP.

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

Hướng dẫn triển khai (Deployment Guide)

Để đưa hệ thống DFlower vào vận hành thực tế, quản trị viên thực hiện 4 bước tiêu chuẩn:

# 1. Clone hoặc tải mã nguồn vào thư mục root của web server
cd /var/www/html/ # hoặc C:/xampp/htdocs/ trên Windows
git clone https://github.com/DFlower/dflower-project.git dflower

# 2. Phân quyền thư mục tải lên hình ảnh
chmod -R 775 dflower/uploads/
chmod -R 775 dflower/admin/uploads/

# 3. Tạo cơ sở dữ liệu và nhập file dump schema
mysql -u root -p -e "CREATE DATABASE db_dflower CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p db_dflower < dflower/database/db_dflower.sql

# 4. Cấu hình kết nối tại file config/config.php
# Định nghĩa: DB_HOST, DB_USER, DB_PASS, DB_NAME

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

Dự án mang lại lợi ích tài chính vượt trội cho các hộ kinh doanh hoa tươi quy mô vừa và nhỏ:

  • Chi phí xây dựng phần mềm: ~ 0 VNĐ (tận dụng mã nguồn mở).
  • Chi phí thuê Hosting/Tên miền hàng năm: 800.000 - 1.200.000 VNĐ.
  • Tiết kiệm chi phí nhân sự ghi đơn: Giảm 1 nhân viên trực tổng đài (~60.000.000 VNĐ/năm).
  • Thời gian hoàn vốn (ROI): Ước tính dưới 2.5 tháng sau khi triển khai chính thức.

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

Mặc dù đã hoàn thành toàn bộ mục tiêu cốt lõi, dự án vẫn còn 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 giao thức thanh toán qua cổng điện tử tự động (IPN Webhook của VNPay, MoMo); việc xử lý dữ liệu vẫn sử dụng mysqli thủ công thay vì PDO hoặc ORM hiện đại.
  • Hướng phát triển tiếp theo:
    1. Tái cấu trúc mã nguồn theo chuẩn mô hình MVC hoàn chỉnh và tích hợp Composer autoloading.
    2. Xây dựng hệ thống RESTful API phục vụ ứng dụng di động đa nền tảng (Flutter / React Native).
    3. Bổ sung cơ chế đệm dữ liệu (Redis Caching) để xử lý lượng truy cập lớn trong các dịp lễ 14/2, 8/3, 20/11.

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

  • Sinh viên ngành Kỹ thuật phần mềm: Nguồn tài liệu tham khảo thực tế về kiến trúc hướng đối tượng PHP, cách phân tích use case, thiết kế CSDL quan hệ và xử lý luồng giỏ hàng thương mại điện tử.
  • Lập trình viên Web: Bộ khung tham khảo mẫu mực để xây dựng các website bán lẻ nhanh chóng, dễ bảo trì mà không cần phụ thuộc framework cồng kềnh.
  • Chủ cửa hàng hoa tươi & quà tặng: Giải pháp phần mềm chi phí thấp giúp số hóa hoạt động kinh doanh ngay lập tức, nâng cao năng suất xử lý đơn hàng và tính chuyên nghiệp.
  • Nhà nghiên cứu & Giảng viên: Case-study trực quan phục vụ công tác giảng dạy môn Phát triển phần mềm mã nguồn mở.

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

1. Yêu cầu cấu hình tối thiểu để triển khai website DFlower là gì?

Hệ thống chỉ yêu cầu máy chủ Web hỗ trợ Apache 2.4+ hoặc Nginx, phiên bản PHP từ 7.2 đến 8.1 (có kích hoạt extension mysqli, session, gd), và MySQL 5.7+ hoặc MariaDB 10.3+. Dung lượng RAM tối thiểu 512MB.

2. Dữ liệu giỏ hàng của người dùng chưa đăng nhập được xử lý như thế nào?

Hệ thống sử dụng hàm session_id() của PHP để tạo một mã định danh duy nhất cho phiên truy cập hiện tại và lưu vào cột sId của bảng tbl_cart. Khi khách hàng đăng nhập và đặt hàng, toàn bộ mục theo sId sẽ được liên kết với customer_id để hoàn tất thanh toán.

3. Website có hỗ trợ tích hợp cổng thanh toán trực tuyến không?

Kiến trúc mã nguồn mở của DFlower được thiết kế theo module hóa, cho phép lập trình viên dễ dàng tích hợp SDK của VNPay, ZaloPay hoặc MoMo vào file xử lý thanh toán payment.php thông qua cơ chế Webhook/IPN.

4. Hệ thống có khả năng chống tấn công SQL Injection như thế nào?

Toàn bộ dữ liệu đầu vào từ phía người dùng ($_POST, $_GET) đều được xử lý qua hàm lọc chuỗi mysqli_real_escape_string() và ép kiểu dữ liệu trước khi ghép vào câu lệnh truy vấn SQL.

5. Chi phí duy trì website hàng tháng là bao nhiêu?

Nhờ mã nguồn được tối ưu nhẹ, hệ thống chỉ cần sử dụng gói Cloud Hosting cơ bản với chi phí từ 50.000 – 100.000 VNĐ/tháng và chi phí duy trì tên miền khoảng 250.000 VNĐ/năm.


Kết luận

Đồ án môn học "Xây dựng website bán hoa DFlower" của sinh viên Lê Văn Đông và Tăng Trung Hiếu đã minh chứng tính khả thi và hiệu quả của việc ứng dụng công nghệ mã nguồn mở PHP & MySQL vào bài toán chuyển đổi số bán lẻ. Với cấu trúc hướng đối tượng mạch lạc, cơ sở dữ liệu chuẩn hóa và giao diện thân thiện, hệ thống không chỉ hoàn thành xuất sắc các yêu cầu học thuật mà còn sẵn sàng để đóng gói và ứng dụng vào hoạt động kinh doanh thực tế. Đây là nền tảng vững chắc để tiếp tục mở rộng thành các hệ sinh thái thương mại điện tử đa nền tảng trong tương lai.