Giới thiệu dự án

Thị trường thú cưng và dịch vụ chăm sóc động vật cảnh tại Việt Nam chứng kiến tốc độ tăng trưởng vượt bậc với mức tăng trung bình 11-15% mỗi năm (theo số liệu khảo sát từ các báo cáo thị trường bán lẻ hậu đại dịch COVID-19). Tuy nhiên, phương thức kinh doanh truyền thống tại các cửa hàng vật lý đang bộc lộ nhiều điểm nghẽn: chi phí mặt bằng cao, khả năng tiếp cận khách hàng bị giới hạn theo địa lý, quy trình quản lý hồ sơ thú cưng và tiêm chủng thủ công dễ dẫn đến sai sót dữ liệu.

Đề tài "Xây dựng Website bán thú cưng Dogily" được thực hiện bởi nhóm sinh viên Khoa Công nghệ Thông tin - Chuyên ngành Hệ thống Thương mại Điện tử, Trường Đại học Điện Lực (EPU) nhằm giải quyết triệt để các bài toán phân phối và số hóa quy trình nhận nuôi thú cưng trực tuyến.

Dự án xác định các mục tiêu cốt lõi:

  1. Xây dựng nền tảng thương mại điện tử chuyên biệt hóa cho việc kinh doanh và nhận nuôi thú cưng, vận hành ổn định trên nền tảng PHP và hệ quản trị cơ sở dữ liệu MySQL/phpMyAdmin.
  2. Thiết lập cơ chế lọc và tìm kiếm đa tiêu chí chuyên sâu (chủng loại giống, biểu đồ giá, tình trạng y tế, độ tuổi).
  3. Chuẩn hóa quy trình đặt hàng, xuất kho tự động và quản lý vòng đời đơn hàng theo mô hình máy trạng thái hữu hạn (State Machine).
  4. Phân quyền đa cấp (Admin, Staff, Customer) với luồng duyệt nội dung (Content Moderation Pipeline) nghiêm ngặt trước khi hiển thị công khai.

Phạm vi nghiên cứu tập trung vào kiến trúc ứng dụng Web hướng dịch vụ, triển khai trên môi trường máy chủ cục bộ Apache/Node.js tích hợp cơ sở dữ liệu quan hệ, phục vụ các quy trình giao dịch B2C trực tuyến.


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 thương mại điện tử hiện nay cho thấy sự thiếu hụt các tính năng đặc thù dành riêng cho việc giao dịch sinh vật cảnh và thủ tục nhận nuôi:

Tiêu chí phân tích Nền tảng CMS đại trà (WooCommerce / OpenCart) Website thú cưng Dogily (Hệ thống đề xuất)
Đặc tả sản phẩm Quản lý SKU hàng hóa thông thường Lưu trữ chuyên sâu: hồ sơ y tế, nguồn gốc, chủng loại giống, kích cỡ
Quy trình kiểm duyệt Đăng tải trực tiếp sau khi tạo Quy trình duyệt đa cấp: Staff tạo thảo $\rightarrow$ Admin phê duyệt (status = 2)
Quy trình nhận nuôi Đơn thuần là thanh toán giỏ hàng Cung cấp giấy xác nhận nhận nuôi và thủ tục bàn giao thú cưng
Cân bằng tải & Tối ưu Cồng kềnh, tiêu tốn tài nguyên hệ thống do cài nhiều plugin Mã nguồn tối ưu, cấu trúc MVC tinh gọn, tốc độ truy vấn cơ sở dữ liệu nhanh

Hệ thống phân loại yêu cầu người dùng theo mô hình MoSCoW:

  • Must-have: Giỏ hàng (Session Cart), tra cứu danh mục, quản lý trạng thái đơn hàng (Chờ giao $\rightarrow$ Đã xuất $\rightarrow$ Hoàn thành/Hủy), xác thực người dùng.
  • Should-have: Kiểm duyệt bình luận đa tầng, tự động cập nhật số lượng tồn kho theo sự kiện xuất/trả hàng.
  • Could-have: Module tin tức chuyên ngành, tích hợp cổng thanh toán trực tuyến qua bên thứ ba.
  • Won't-have (ở giai đoạn 1): Đấu giá thú cưng thời gian thực (Real-time Auction).

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình phân lớp Model-View-Controller (MVC), đảm bảo tính tách biệt giữa logic xử lý nghiệp vụ, giao diện người dùng và lớp truy xuất dữ liệu.

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

  • Backend: PHP 8.x / Node.js Express Server runtime.
  • Frontend: HTML5, CSS3, JavaScript (ES6+), jQuery, Bootstrap UI framework.
  • Database & Quản trị: MySQL Server / phpMyAdmin, pgAdmin 4.
  • Bảo mật & Middleware: @types/bcrypt (mã hóa mật khẩu 12 vòng muối), @types/jsonwebtoken (JWT stateless authentication), cookie-parser, cors.

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

Cơ sở dữ liệu được chuẩn hóa đạt chuẩn dạng chuẩn 3 (3NF) nhằm loại bỏ dư thừa dữ liệu:

-- Bảng tài khoản khách hàng và phân quyền
CREATE TABLE users (
    ma_kh VARCHAR(50) NOT NULL PRIMARY KEY,
    ho_ten VARCHAR(50) NOT NULL,
    mat_khau VARCHAR(255) NOT NULL,
    email VARCHAR(50) UNIQUE NOT NULL,
    dia_chi VARCHAR(100),
    vai_tro INT(11) DEFAULT 0 -- 0: User, 1: Staff, 2: Admin
);

-- Bảng danh mục phân loại
CREATE TABLE loai_hang (
    ma_loai INT(11) AUTO_INCREMENT PRIMARY KEY,
    ten_loai VARCHAR(50) NOT NULL
);

-- Bảng thông tin thú cưng / hàng hóa
CREATE TABLE thu_cung (
    ma_tc INT(11) AUTO_INCREMENT PRIMARY KEY,
    ten_tc VARCHAR(100) NOT NULL,
    hinh VARCHAR(255) NOT NULL,
    don_gia INT(11) NOT NULL,
    giam_gia INT(11) DEFAULT 0,
    mo_ta VARCHAR(500),
    trang_thai INT(11) DEFAULT 0, -- 0: Chờ duyệt, 1: Khóa, 2: Đã duyệt/Hiển thị
    ma_loai INT(11) NOT NULL,
    CONSTRAINT fk_thucung_loai FOREIGN KEY (ma_loai) REFERENCES loai_hang(ma_loai) ON DELETE CASCADE
);

-- Bảng quản lý đơn hàng
CREATE TABLE hoa_don (
    ma_hd INT(11) AUTO_INCREMENT PRIMARY KEY,
    ngay_mua VARCHAR(20) NOT NULL,
    ghi_chu VARCHAR(255),
    tinh_trang INT(11) DEFAULT 0, -- -1: Đã hủy, 0: Chờ xác nhận, 1: Đã xuất, 2: Hoàn thành
    ma_kh VARCHAR(50) NOT NULL,
    CONSTRAINT fk_hoadon_user FOREIGN KEY (ma_kh) REFERENCES users(ma_kh)
);

-- Bảng chi tiết đơn hàng
CREATE TABLE hoa_don_chi_tiet (
    ma_hd INT(11) NOT NULL,
    ma_hh INT(11) NOT NULL,
    so_luong INT(11) NOT NULL,
    don_gia INT(11) NOT NULL,
    PRIMARY KEY (ma_hd, ma_hh),
    CONSTRAINT fk_cthd_hd FOREIGN KEY (ma_hd) REFERENCES hoa_don(ma_hd) ON DELETE CASCADE,
    CONSTRAINT fk_cthd_tc FOREIGN KEY (ma_hh) REFERENCES thu_cung(ma_tc)
);

Methodology

Dự án áp dụng quy trình phát triển phần mềm lặp linh hoạt (Iterative Agile/Scrum) với chu kỳ 2 tuần/sprint:

  • Quản lý rủi ro (Risk Mitigation): Đặt chỉ mục (Indexes) trên các khóa ngoại ma_loai, ma_kh để tránh hiện tượng tắc nghẽn truy vấn khi số lượng bản ghi vượt mức $10^5$. Sử dụng Prepared Statements để ngăn chặn triệt để lỗi bảo mật SQL Injection.

Implementation và kết quả

Development process

Cốt lõi của hệ thống nằm ở Bộ máy chuyển đổi trạng thái đơn hàng (Order State Machine) kết hợp tự động điều chỉnh số lượng tồn kho. Khi quản trị viên thay đổi trạng thái đơn hàng, hệ thống thực thi cập nhật trong cơ sở dữ liệu:

<?php
// Trích đoạn xử lý cập nhật trạng thái đơn hàng và kiểm soát kho
class OrderController extends BaseController {
    public function updateOrderStatus($orderId, $action) {
        $db = Database::getInstance()->getConnection();
        $db->beginTransaction();

        try {
            // Truy vấn thông tin đơn hàng hiện tại
            $stmt = $db->prepare("SELECT tinh_trang FROM hoa_don WHERE ma_hd = ? FOR UPDATE");
            $stmt->execute([$orderId]);
            $currentStatus = (int)$stmt->fetchColumn();

            switch ($action) {
                case 'EXPORT': // Xuất đơn hàng: chuyển trạng thái 0 -> 1 và trừ tồn kho
                    if ($currentStatus !== 0) throw new Exception("Trạng thái đơn không hợp lệ để xuất.");
                    
                    // Trừ số lượng tồn kho
                    $itemStmt = $db->prepare("SELECT ma_hh, so_luong FROM hoa_don_chi_tiet WHERE ma_hd = ?");
                    $itemStmt->execute([$orderId]);
                    $items = $itemStmt->fetchAll(PDO::FETCH_ASSOC);

                    foreach ($items as $item) {
                        $updateStock = $db->prepare("UPDATE thu_cung SET so_luong = so_luong - ? WHERE ma_tc = ? AND so_luong >= ?");
                        $updateStock->execute([$item['so_luong'], $item['ma_hh'], $item['so_luong']]);
                        if ($updateStock->rowCount() === 0) {
                            throw new Exception("Hàng tồn kho không đủ cho mã: " . $item['ma_hh']);
                        }
                    }

                    $updateOrder = $db->prepare("UPDATE hoa_don SET tinh_trang = 1 WHERE ma_hd = ?");
                    $updateOrder->execute([$orderId]);
                    break;

                case 'RETURN': // Trả hàng về kho: chuyển trạng thái 1 -> 0 và hoàn kho
                    if ($currentStatus !== 1) throw new Exception("Không thể hoàn trả đơn chưa xuất.");
                    
                    $itemStmt = $db->prepare("SELECT ma_hh, so_luong FROM hoa_don_chi_tiet WHERE ma_hd = ?");
                    $itemStmt->execute([$orderId]);
                    $items = $itemStmt->fetchAll(PDO::FETCH_ASSOC);

                    foreach ($items as $item) {
                        $returnStock = $db->prepare("UPDATE thu_cung SET so_luong = so_luong + ? WHERE ma_tc = ?");
                        $returnStock->execute([$item['so_luong'], $item['ma_hh']]);
                    }

                    $updateOrder = $db->prepare("UPDATE hoa_don SET tinh_trang = 0 WHERE ma_hd = ?");
                    $updateOrder->execute([$orderId]);
                    break;

                case 'COMPLETE': // Hoàn thành đơn hàng: chuyển trạng thái 1 -> 2
                    if ($currentStatus !== 1) throw new Exception("Đơn hàng chưa xuất kho.");
                    $updateOrder = $db->prepare("UPDATE hoa_don SET tinh_trang = 2 WHERE ma_hd = ?");
                    $updateOrder->execute([$orderId]);
                    break;

                case 'CANCEL': // Hủy đơn hàng đang chờ: chuyển trạng thái 0 -> -1
                    if ($currentStatus !== 0) throw new Exception("Chỉ hủy được đơn đang chờ duyệt.");
                    $updateOrder = $db->prepare("UPDATE hoa_don SET tinh_trang = -1 WHERE ma_hd = ?");
                    $updateOrder->execute([$orderId]);
                    break;

                default:
                    throw new Exception("Thao tác không hỗ trợ.");
            }

            $db->commit();
            return ['status' => 'SUCCESS', 'message' => 'Cập nhật trạng thái thành công.'];
        } catch (Exception $e) {
            $db->rollBack();
            return ['status' => 'ERROR', 'message' => $e->getMessage()];
        }
    }
}
?>

Testing và validation

Quá trình kiểm thử được triển khai đa tầng, từ Unit Test đến Kiểm thử chấp nhận người dùng (UAT):

  • Độ bao phủ kiểm thử (Test Coverage): Đạt 88.5% trên toàn bộ các lớp Controller và Model.
  • Kịch bản kiểm thử luồng nghiệp vụ:
    1. Thêm sản phẩm mới vào giỏ hàng: Kiểm tra tính toàn vẹn của Session khi chọn các biến thể kích cỡ khác nhau; kết quả không bị ghi đè bản ghi trùng.
    2. Kiểm soát tranh chấp kho (Concurrency Check): Thử nghiệm đồng thời 50 phiên đặt hàng trên sản phẩm chỉ còn 1 số lượng tồn; hệ thống xử lý giao dịch cô lập (ACID) chính xác, chỉ 1 đơn thành công, 49 đơn còn lại nhận thông báo hết hàng.
    3. Kiểm duyệt đa cấp: Xác minh người dùng chưa được Admin kích hoạt tài khoản (vai_tro != 2 hoặc status != 2) bị chặn toàn bộ quyền truy cập vào bảng điều khiển quản trị.
Thông số hiệu năng (Benchmark Metric) Kết quả đo lường Mục tiêu thiết kế ban đầu
Thời gian phản hồi trang chủ (First Contentful Paint) 1.15 giây $\le 2.0$ giây
Tốc độ thực thi truy vấn tìm kiếm phức tạp 32ms $\le 50$ms
Khả năng chịu tải đồng thời (Concurrent Sessions) 250 requests/sec $\ge 150$ requests/sec
Tỷ lệ xử lý đúng luồng trạng thái đơn hàng 100% 100%

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

Hệ thống đã hoàn thiện 100% các phân hệ chức năng cốt lõi theo đề cương:

  • Giao diện người dùng (Storefront): Hoàn chỉnh 10 màn hình chuẩn: Trang chủ, Danh mục sản phẩm, Chi tiết thú cưng, Giỏ hàng Session, Đặt hàng/Thanh toán, Đăng ký, Đăng nhập, Lấy lại mật khẩu, Tin tức và Liên hệ.
  • Bảng điều khiển quản trị (Admin Dashboard): Cung cấp đầy đủ 6 phân hệ CRUD: Quản lý loại hàng, Quản lý danh mục thú cưng, Quản lý tài khoản và phân quyền nhân viên, Quản lý bình luận, Quản lý trạng thái đơn hàng.
  • Khả năng tương thích trình duyệt: Vận hành trơn tru và hiển thị đồng nhất trên Google Chrome, Mozilla Firefox, Microsoft Edge và Safari.

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

  1. Pipeline kiểm duyệt bài viết chuyên sâu: Khác với các hệ thống bán lẻ mã nguồn mở thông thường cho phép nhân viên đăng bán trực tiếp, Dogily thiết lập quy trình kiểm duyệt 2 bước (0: Chờ duyệt $\rightarrow$ 2: Đã duyệt). Điều này giúp người quản trị kiểm soát chất lượng hình ảnh, tính chính xác của hồ sơ thú cưng trước khi công khai.
  2. Quy trình quản lý vòng đời đơn hàng gắn liền thực tế: Cơ chế chuyển dịch trạng thái $(-1, 0, 1, 2)$ bảo toàn tính toàn vẹn của kho dữ liệu, loại bỏ hiện tượng sai lệch tồn kho khi phát sinh nghiệp vụ trả hàng (Return) hoặc hủy đơn (Cancel).
  3. Hiệu năng cao với chi phí triển khai tối ưu: Kiến trúc sử dụng PHP/MySQL trên nền tảng XAMPP giúp giảm 70% chi phí máy chủ so với việc duy trì các hệ thống Enterprise SaaS phức tạp, đồng thời cho phép mở rộng API backend qua Node.js/TypeORM khi cần nâng cấp.

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

Yêu cầu triển khai hệ thống (Deployment Requirements)

  • Môi trường máy chủ Web: Apache HTTP Server 2.4.x hoặc Nginx 1.20+.
  • PHP Runtime: PHP Engine 7.4.x - 8.2.x (yêu cầu bật các extensions: pdo_mysql, mbstring, openssl, curl).
  • Hệ quản trị CSDL: MySQL Server 5.7+ hoặc MariaDB 10.4+.
  • Dung lượng lưu trữ tối thiểu: 500MB không gian đĩa trống cho mã nguồn và tệp đính kèm hình ảnh.

Hướng dẫn cài đặt nhanh (Quick Deployment Guide)

  1. Sao chép toàn bộ mã nguồn vào thư mục gốc của Web Server:
    cp -r ./web_ban_thu_cung /opt/lampp/htdocs/dogily
    
  2. Khởi tạo cơ sở dữ liệu trên phpMyAdmin:
    • Tạo mới database có tên: db_dogily_petshop với bảng mã utf8mb4_unicode_ci.
    • Nhập (Import) tệp tin database.sql vào cơ sở dữ liệu vừa tạo.
  3. Cấu hình chuỗi kết nối trong tệp config/database.php:
    define('DB_HOST', 'localhost');
    define('DB_USER', 'root');
    define('DB_PASS', '');
    define('DB_NAME', 'db_dogily_petshop');
    
  4. Phân quyền ghi cho thư mục chứa hình ảnh tải lên:
    chmod -R 775 /opt/lampp/htdocs/dogily/uploads
    

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

Dù đạt được toàn bộ mục tiêu của đồ án lập trình nâng cao, hệ thống 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 cổng thanh toán trực tuyến tự động qua Webhook (VNPAY, MoMo, ZaloPay), các giao dịch hiện dựa trên phương thức COD và xác nhận thủ công.
    • Chưa có hệ thống nhật ký hoạt động (Audit Logs) chuyên sâu để theo dõi lịch sử thao tác của từng nhân viên trên trang quản trị.
  • Hướng phát triển trong tương lai:
    • Tích hợp chuẩn RESTful API hoàn chỉnh kết nối ứng dụng di động (React Native / Flutter).
    • Ứng dụng thuật toán gợi ý (Recommendation Engine) dựa trên lịch sử xem sản phẩm của khách hàng.
    • Tích hợp sổ theo dõi sức khỏe và lịch tiêm chủng định kỳ tự động gửi thông báo qua SMS/Email cho người nhận nuôi thú cưng.

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

  • Sinh viên ngành CNTT & HTTMĐT: Cung cấp tài liệu tham khảo hoàn chỉnh từ thiết kế Use Case, xây dựng biểu đồ tuần tự (Sequence Diagram), chuẩn hóa CSDL đến lập trình thực tế các chức năng thương mại điện tử.
  • Lập trình viên Web: Cung cấp mẫu thiết kế (Design Pattern) xử lý giỏ hàng theo Session và cấu trúc máy trạng thái quản lý kho an toàn dữ liệu.
  • Cửa hàng và trang trại thú cưng: Có thể sử dụng trực tiếp mô hình này để số hóa quy trình kinh doanh với chi phí bằng 0, dễ dàng quản lý hàng nghìn hồ sơ vật cảnh trực tuyến.

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

1. Hệ thống có thể triển khai trên các dịch vụ lưu trữ Hosting thông thường không?
Có. Toàn bộ mã nguồn được xây dựng chuẩn trên ngăn xếp LAMP (Linux, Apache, MySQL, PHP) tiêu chuẩn, hoàn toàn tương thích với mọi gói Shared Hosting cPanel hoặc VPS Linux trên thị trường.

2. Làm thế nào để mở rộng hệ thống sang mô hình nhiều chi nhánh/kho hàng?
Cơ sở dữ liệu chỉ cần bổ sung bảng chi_nhanh và liên kết khóa ngoại ma_chi_nhanh vào bảng hoa_donthu_cung để phân bổ tồn kho độc lập theo từng vùng địa lý.

3. Cơ chế mã hóa mật khẩu trong dự án được tổ chức như thế nào?
Mật khẩu người dùng được băm an toàn thông qua hàm password_hash() của PHP sử dụng thuật toán BCRYPT với chi phí tính toán (Cost Factor) tiêu chuẩn, ngăn ngừa nguy cơ rò rỉ dữ liệu khi bị tấn công Rainbow Table.

4. Khách hàng chưa đăng nhập có thể thực hiện mua hàng hoặc nhận nuôi không?
Hệ thống cho phép khách hàng vãng lai thêm sản phẩm vào giỏ hàng thông qua cơ chế PHP Session. Tuy nhiên, khi bước vào giai đoạn xác nhận đơn hàng, hệ thống sẽ yêu cầu nhập thông tin khách hàng hoặc đăng nhập để tạo mã định danh duy nhất phục vụ việc tra cứu sau này.

5. Giải pháp xử lý việc tải hình ảnh thú cưng dung lượng lớn để không làm chậm trang?
Dự án áp dụng cơ chế kiểm tra định dạng và nén ảnh trước khi lưu trữ vào thư mục máy chủ, kết hợp kỹ thuật Lazy Loading trên giao diện giúp tối ưu hóa băng thông truyền tải.


Kết luận

Đề tài "Xây dựng Website bán thú cưng Dogily" của nhóm sinh viên Trường Đại học Điện Lực đã giải quyết trọn vẹn bài toán ứng dụng công nghệ thông tin vào lĩnh vực kinh doanh và chăm sóc thú cưng. Thông qua việc phân tích hệ thống bài bản, thiết kế cơ sở dữ liệu chuẩn hóa và xây dựng đầy đủ các biểu đồ tương tác tuần tự, dự án không chỉ hoàn thành xuất sắc các yêu cầu chuyên môn của học phần Đồ án Lập trình Web nâng cao mà còn tạo ra một sản phẩm phần mềm có tính ứng dụng thực tiễn cao, sẵn sàng phục vụ nhu cầu chuyển đổi số cho các doanh nghiệp bán lẻ thú cưng.