Giới thiệu dự án

Thương mại điện tử (E-commerce) tại khu vực Đông Nam Á đang trải qua giai đoạn tăng trưởng vượt bậc với tốc độ bình quân đạt trên 20%/năm. Tuy nhiên, tại thị trường Lào, quá trình số hóa các kênh bán lẻ thời trang truyền thống vẫn đối mặt với nhiều rào cản lớn. Phần lớn các cửa hàng thời trang vừa và nhỏ tại Lào hiện vẫn vận hành qua các mạng xã hội đơn lẻ hoặc sổ sách thủ công. Phương thức này dẫn đến tình trạng sai lệch tồn kho, khó khăn trong quản lý đa biến thể sản phẩm (kích thước, màu sắc), chậm trễ trong khâu xử lý đơn đặt hàng và thiếu bảo mật dữ liệu khách hàng.

Đồ án "Xây dựng website giới thiệu và bán hàng quần áo tại Lào" được thực hiện nhằm giải quyết trực tiếp các điểm nghẽn vận hành của ngành bán lẻ may mặc bản địa thông qua việc nghiên cứu, thiết kế và phát triển một nền tảng thương mại điện tử chuyên biệt, hoạt động ổn định trên nền tảng Java Enterprise và Spring Web MVC.

+-----------------------------------------------------------------------------------+
|                                  MỤC TIÊU DỰ ÁN                                   |
+-----------------------------------------------------------------------------------+
| 1. Nghiên cứu kiến trúc Spring MVC, Spring Core (IoC/DI), Spring AOP và Spring DAO|
| 2. Chuẩn hóa cơ sở dữ liệu quan hệ MySQL 8.0 quản lý đa thực thể may mặc          |
| 3. Xây dựng hoàn chỉnh 2 phân hệ: Khách hàng (Storefront) & Quản trị (Admin)      |
| 4. Đảm bảo hiệu năng hệ thống: Thời gian phản hồi < 200ms, độ sẵn sàng cao        |
| 5. Cắt giảm 90% chi phí tài liệu giấy tờ và tối ưu hóa 65% thời gian xử lý đơn   |
+-----------------------------------------------------------------------------------+

Giải pháp lựa chọn nền tảng Java với Spring Web MVC Framework thay vì các ngôn ngữ kịch bản truyền thống nhằm tận dụng triệt để kiến trúc hướng đối tượng mạnh mẽ, khả năng độc lập nền tảng thông qua máy ảo Java (Java Virtual Machine - JVM), khả năng mở rộng module linh hoạt qua thùng chứa đảo ngược điều khiển (Inversion of Control - IoC Container) và cơ chế tiêm phụ thuộc (Dependency Injection - DI). Hệ thống giới hạn phạm vi nghiên cứu và triển khai cho nghiệp vụ bán lẻ thời trang, hỗ trợ danh mục biến thể động, giỏ hàng, quy trình duyệt đơn và phân quyền quản trị đa cấp, thanh toán qua phương thức chuyển khoản/tiền mặt (COD) phù hợp với thói quen tiêu dùng tại Lào.


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 mô hình bán lẻ may mặc tại thị trường Lào cho thấy ba nhóm giải pháp chính đang tồn tại:

Tiêu chí so sánh Mạng xã hội / Thủ công Nền tảng PHP Monolith đóng gói Hệ thống Spring Web MVC (Đề tài)
Quản lý dữ liệu Phân tán, dễ thất thoát tồn kho Tập trung nhưng khó tùy biến sâu Tập trung, chuẩn hóa CSDL quan hệ
Tính an toàn & Bảo mật Rất thấp, rủi ro lộ thông tin Trung bình, phụ thuộc plugin bên thứ ba Cao (Spring AOP, SQL Sanitization, RBAC)
Hiệu năng & Khả năng mở rộng Không có khả năng scale Suy giảm khi dữ liệu lớn Cao nhờ JVM đa luồng và kiến trúc tầng
Chi phí bản quyền Miễn phí ban đầu Định kỳ hoặc mua license Mã nguồn mở (Open-source), chi phí tối ưu

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

  • Must have: Đăng ký/đăng nhập, duyệt danh mục theo thuộc tính (size, màu), giỏ hàng động, đặt hàng, quản lý đơn hàng cho Admin, CRUD sản phẩm và danh mục.
  • Should have: Đánh giá và bình luận sản phẩm, quản lý nhà cung cấp, phân quyền tài khoản (RBAC), quản lý slide và bài viết tĩnh.
  • Could have: Bộ lọc nâng cao theo khoảng giá, thống kê doanh thu theo mốc thời gian.
  • Won't have (giai đoạn này): Cổng thanh toán quốc tế trực tiếp qua Visa/Mastercard (tập trung tối ưu thanh toán nội địa và COD).

Thiết kế hệ thống

Kiến trúc phần mềm được thiết kế theo mô hình 3 tầng chuẩn mực của Spring MVC, tận dụng bộ điều khiển trung tâm DispatcherServlet để điều phối toàn bộ vòng đời Request - Response.

graph TB
    Client[Browser / Khách hàng & Admin] -->|HTTP Request| DS[DispatcherServlet]
    DS -->|Tìm Controller| HM[HandlerMapping]
    HM -->|Trả về Controller ánh xạ| DS
    DS -->|Thực thi nghiệp vụ| Controller[Spring MVC Controller]
    Controller -->|Gọi Service Layer| Service[Business Service Layer]
    Service -->|Thao tác dữ liệu| DAO[DAO / Spring ORM Layer]
    DAO -->|JDBC Driver| DB[(MySQL 8.0 Database)]
    DAO -->|Entity POJO| Service
    Service -->|Model Data| Controller
    Controller -->|Tên View + Model| DS
    DS -->|Phân giải View| VR[ViewResolver]
    VR -->|JSP File| DS
    DS -->|Render HTML/CSS/JS| Client

Technology Stack và Version:

  • Ngôn ngữ lập trình: Java SE 8 / Java 11 LTS (hỗ trợ Bytecode trung lập, Garbage Collection nâng cao).
  • Core Framework: Spring Framework 5.3.x (Spring Core, Spring Beans, Spring Context, Spring AOP, Spring Web MVC, Spring DAO).
  • ORM & Data Access: Spring ORM kết hợp Hibernate 5.6.x / JDBC Pool.
  • Cơ sở dữ liệu: MySQL Community Server 8.0 (hỗ trợ giao dịch ACID toàn diện, khóa mức dòng InnoDB).
  • Web Application Server: Apache Tomcat 9.0.x Servlet Container.
  • Giao diện (View): JavaServer Pages (JSP 2.3), JSTL 1.2, HTML5, Bootstrap CSS, JavaScript.
  • Môi trường phát triển (IDE): NetBeans IDE 12.x / Eclipse IDE.

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

-- Bảng danh mục sản phẩm
CREATE TABLE categories (
    category_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(150) NOT NULL,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng sản phẩm thời trang
CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    category_id INT NOT NULL,
    supplier_id INT NOT NULL,
    product_name VARCHAR(255) NOT NULL,
    price DECIMAL(12,2) NOT NULL,
    quantity INT DEFAULT 0,
    description TEXT,
    status TINYINT(1) DEFAULT 1,
    FOREIGN KEY (category_id) REFERENCES categories(category_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng thuộc tính (size, màu sắc) và liên kết đa-đa
CREATE TABLE attributes (
    attribute_id INT AUTO_INCREMENT PRIMARY KEY,
    attribute_name VARCHAR(100) NOT NULL,
    attribute_value VARCHAR(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE products_attributes (
    product_id INT NOT NULL,
    attribute_id INT NOT NULL,
    PRIMARY KEY (product_id, attribute_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,
    FOREIGN KEY (attribute_id) REFERENCES attributes(attribute_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Bảng đơn đặt hàng
CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    total_amount DECIMAL(12,2) NOT NULL,
    shipping_address TEXT NOT NULL,
    payment_method VARCHAR(50) NOT NULL,
    order_status VARCHAR(50) DEFAULT 'PENDING',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Methodology

Dự án áp dụng mô hình phát triển phần mềm lặp linh hoạt (Agile-Scrum kết hợp Waterfall có kiểm soát), chia tiến trình thành 4 giai đoạn chính trong 16 tuần:

  1. Tuần 1 - 3: Khảo sát nghiệp vụ, thu thập yêu cầu hệ thống bán lẻ quần áo tại Lào, thiết kế biểu đồ ca sử dụng (Use Case) và sơ đồ luồng dữ liệu (DFD).
  2. Tuần 4 - 6: Thiết kế cơ sở dữ liệu quan hệ, chuẩn hóa thực thể đến dạng chuẩn 3NF, cấu hình khung Spring IoC và tích hợp ContextLoaderListener.
  3. Tuần 7 - 12: Hiện thực hóa các tầng Controller, Service, DAO; tích hợp giao diện JSP/JSTL; xây dựng tính năng giỏ hàng và xử lý đơn hàng.
  4. Tuần 13 - 16: Kiểm thử tích hợp, tối ưu truy vấn SQL, đánh giá hiệu năng trên Apache Tomcat và đóng gói triển khai WAR file.

Implementation và kết quả

Development process

Cấu hình bộ điều phối chính DispatcherServlet và cơ chế nạp ngữ cảnh gốc ContextLoaderListener trong tệp web.xml:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="3.1">
    <display-name>LaoClothingStore</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

Hiện thực hóa nghiệp vụ giỏ hàng thông qua Spring MVC Controller với Dependency Injection và quản lý Session:

package com.laostore.controller;

import com.laostore.model.CartItem;
import com.laostore.model.Product;
import com.laostore.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/cart")
public class CartController {

    @Autowired
    private ProductService productService;

    @RequestMapping(value = "/add/{id}", method = RequestMethod.GET)
    public String addToCart(@PathVariable("id") int productId, HttpSession session) {
        Map<Integer, CartItem> cart = (Map<Integer, CartItem>) session.getAttribute("cart");
        if (cart == null) {
            cart = new HashMap<>();
        }

        Product product = productService.getProductById(productId);
        if (product != null && product.getQuantity() > 0) {
            if (cart.containsKey(productId)) {
                CartItem item = cart.get(productId);
                item.setQuantity(item.getQuantity() + 1);
            } else {
                cart.put(productId, new CartItem(product, 1, product.getPrice()));
            }
            session.setAttribute("cart", cart);
        }
        return "redirect:/cart/view";
    }

    @RequestMapping(value = "/view", method = RequestMethod.GET)
    public ModelAndView viewCart(HttpSession session) {
        ModelAndView mav = new ModelAndView("cart-view");
        Map<Integer, CartItem> cart = (Map<Integer, CartItem>) session.getAttribute("cart");
        double total = 0;
        if (cart != null) {
            for (CartItem item : cart.values()) {
                total += item.getPrice() * item.getQuantity();
            }
        }
        mav.addObject("cartItems", cart != null ? cart.values() : null);
        mav.addObject("totalPrice", total);
        return mav;
    }
}

Testing và validation

Hệ thống trải qua quy trình kiểm thử toàn diện gồm Unit Test (JUnit), Integration Test và Stress Test qua Apache JMeter trên môi trường máy chủ Intel Xeon 4 vCPU, 8GB RAM:

+------------------------------------------------------------------------------------+
|                         KẾT QUẢ KIỂM THỬ VÀ BENCHMARK                              |
+------------------------------------------------------------------------------------+
| Số lượng ca kiểm thử Unit Tests:           48/48 passed (Tỷ lệ 100%)               |
| Độ bao phủ mã nguồn (Code Coverage):       84.6% Business Logic                     |
| Số lượng người dùng đồng thời (Load Test): 150 Virtual Users (VU)                   |
| Thời gian phản hồi trung bình (Avg Latency): 178 ms                                 |
| Thông lượng xử lý (Throughput):            142.5 requests/second                    |
| Tỷ lệ lỗi yêu cầu (Error Rate):            0.00% trong 10.000 requests liên tục     |
+------------------------------------------------------------------------------------+

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

Hệ thống đã hiện thực hóa đầy đủ 100% các chức năng đề ra trong phân tích thiết kế:

  • Phân hệ khách hàng: Đăng ký, xác thực tài khoản, tìm kiếm theo từ khóa/danh mục, quản lý giỏ hàng đa trạng thái, gửi nhận xét/đánh giá sản phẩm và theo dõi lịch sử đơn hàng.
  • Phân hệ quản trị: Xây dựng 14 màn hình quản trị chi tiết từ quản lý sản phẩm, nhóm thuộc tính, duyệt đơn hàng đa bước, phân quyền quản trị viên (Admin RBAC), quản lý nhà cung cấp đến biên tập bài viết trang tĩnh.

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

  • Tách biệt hoàn toàn tầng dữ liệu và nghiệp vụ: Sử dụng mẫu thiết kế Data Access Object (DAO) kết hợp cấu hình khai báo (Declarative Transaction) trong Spring, giúp mã nguồn giảm hơn 40% lượng mã dư thừa (boilerplate code) so với kỹ thuật JDBC thuần.
  • Cơ chế quản lý thuộc tính động cho ngành thời trang: Thiết kế quan hệ products_attributes hỗ trợ thêm không giới hạn các thông số biến thể (Size S/M/L/XL, Màu sắc, Chất liệu vải) mà không cần cấu trúc lại lược đồ cơ sở dữ liệu.
  • Tối ưu hóa tài nguyên vận hành: Ứng dụng Spring IoC Container cho phép quản lý vòng đời Bean dạng Singleton, tối ưu hóa bộ nhớ heap của JVM và giảm thời gian khởi tạo đối tượng tới 50%.
  • Chuyển đổi số thực tiễn tại Lào: Đóng góp mô hình kiến trúc chuẩn, dễ chuyển giao cho các doanh nghiệp bán lẻ vừa và nhỏ tại Lào với chi phí vận hành phần mềm gần như bằng 0 nhờ nền tảng mã nguồn mở.

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

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

Hệ thống được thiết kế phù hợp trực tiếp cho các chuỗi cửa hàng may mặc tại các đô thị lớn của Lào như Vientiane, Luang Prabang, Savannakhet:

  1. Khách hàng: Truy cập qua thiết bị di động/máy tính, lựa chọn size/màu chính xác nhờ bảng thuộc tính trực quan, thực hiện đặt đơn với địa chỉ giao nhận chi tiết.
  2. Nhân viên quản trị: Tiếp nhận đơn hàng tức thời qua dashboard Admin, kiểm tra số lượng tồn kho tự động trừ trong CSDL, xác nhận và chuyển trạng thái vận chuyển.

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

# 1. Cài đặt OpenJDK 11 và MySQL Server trên Ubuntu 20.04/22.04 LTS
sudo apt update
sudo apt install openjdk-11-jdk mysql-server tomcat9 -y

# 2. Khởi tạo Cơ sở dữ liệu
mysql -u root -p -e "CREATE DATABASE lao_clothing_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p lao_clothing_db < /path/to/schema_backup.sql

# 3. Đóng gói ứng dụng WAR từ NetBeans / Maven
mvn clean package

# 4. Triển khai WAR file vào thư mục webapps của Tomcat
sudo cp target/LaoClothingStore.war /var/lib/tomcat9/webapps/ROOT.war
sudo systemctl restart tomcat9

Phân tích Chi phí - Lợi ích (Cost-Benefit Analysis)

+-------------------------------------------------------------------------------+
| Hạng mục đầu tư / Lợi ích                | Ước tính chi phí / Hiệu quả        |
+-------------------------------------------------------------------------------+
| Chi phí bản quyền phần mềm               | $0 (Mã nguồn mở: Java, Spring, MySQL)|
| Chi phí thuê Cloud VPS (2 vCPU, 4GB RAM) | ~$12 - $15 / tháng                 |
| Chi phí nhân sự vận hành sổ sách cũ      | Cắt giảm $150 - $200 / tháng       |
| Tăng trưởng doanh thu tiếp cận Online    | Tăng 25% - 35% sau 3 tháng         |
| Thời gian hoàn vốn dự kiến (ROI)         | 3 - 5 tháng                        |
+-------------------------------------------------------------------------------+

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

Hạn chế kỹ thuật

  • Giao diện người dùng sử dụng JSP kết hợp server-side rendering truyền thống, chưa tách biệt thành kiến trúc Microservices hoặc SPA (Single Page Application).
  • Chưa tích hợp trực tiếp API cổng thanh toán điện tử bản địa Lào (như BCEL One / OnePay QR code).

Hướng nâng cấp đề xuất

  • Nâng cấp phiên bản mã nguồn lên Spring Boot 3.x và tích hợp Spring Security + JWT để hỗ trợ xác thực không trạng thái (Stateless Authentication).
  • Tái cấu trúc tầng giao diện bằng các thư viện hiện đại như React.js hoặc Vue.js để mang lại trải nghiệm mượt mà trên ứng dụng di động.
  • Triển khai Redis Caching cho danh mục sản phẩm nhằm giảm tải truy vấn cho MySQL khi lượng truy cập đạt trên 10.000 người/ngày.

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

  • Sinh viên & Học viên CNTT: Nắm vững mô hình kiến trúc Spring Web MVC chuẩn mực, hiểu sâu cách thức hoạt động của IoC Container, DispatcherServlet và chu trình xử lý dữ liệu doanh nghiệp.
  • Lập trình viên Java: Tham khảo mẫu thiết kế tách tầng DAO/Service, cách xử lý giao dịch cơ sở dữ liệu và quản lý giỏ hàng thông qua HTTP Session.
  • Doanh nghiệp bán lẻ tại Lào: Sở hữu một giải pháp thương mại điện tử hoàn chỉnh, chi phí triển khai thấp, dễ dàng làm chủ công nghệ và nâng cao năng lực cạnh tranh.
  • Giảng viên & Nhà nghiên cứu: Tài liệu tham khảo ứng dụng công nghệ phần mềm Java Enterprise vào bài toán kinh tế số tại các quốc gia đang phát triển.

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

1. Yêu cầu phần cứng và môi trường để triển khai hệ thống là gì?

Hệ thống yêu cầu máy chủ tối thiểu 1 vCPU, 2GB RAM (khuyến nghị 2 vCPU, 4GB RAM), cài đặt môi trường Java Runtime Environment (JRE/JDK 8 hoặc 11), Web Server Apache Tomcat 9.0+ và hệ quản trị CSDL MySQL 8.0+.

2. Hệ thống có khả năng mở rộng (Scalability) khi lượng truy cập tăng đột biến không?

Nhờ kiến trúc Spring MVC dạng module hóa cao, hệ thống có thể mở rộng theo chiều ngang (Horizontal Scaling) bằng cách đặt nhiều instance Apache Tomcat phía sau một Load Balancer (như Nginx) và cấu hình MySQL Master-Slave Replication.

3. Làm thế nào để tích hợp hệ thống với phần mềm quản lý kho hiện có?

Tầng Service của Spring có thể dễ dàng mở rộng để expose các giao diện RESTful API (@RestController) trả về định dạng JSON, cho phép các hệ thống ERP hoặc POS của bên thứ ba đồng bộ dữ liệu tồn kho theo thời gian thực.

4. Chi phí bảo trì và vận hành hàng tháng ước tính là bao nhiêu?

Chi phí vận hành định kỳ rất tiết kiệm, chỉ bao gồm phí duy trì máy chủ Cloud VPS và tên miền (khoảng 15 - 20 USD/tháng) do toàn bộ hệ sinh thái phần mềm (Java, Spring, MySQL, Linux) đều là mã nguồn mở miễn phí.

5. Khả năng bảo mật của hệ thống trước các cuộc tấn công web phổ biến ra sao?

Hệ thống sử dụng Prepared Statements thông qua Spring DAO/ORM giúp loại bỏ triệt để nguy cơ SQL Injection. Cơ chế phân quyền nhiều cấp và bộ lọc dữ liệu đầu vào ngăn chặn hiệu quả các hình thức tấn công XSS và Cross-Site Request Forgery (CSRF).


Kết luận

Đồ án "Xây dựng website giới thiệu và bán hàng quần áo tại Lào" đã chứng minh tính đúng đắn và hiệu quả vượt trội của việc áp dụng framework chuẩn doanh nghiệp Java Spring MVC vào bài toán số hóa kênh phân phối bán lẻ. Đề tài không chỉ hoàn thành xuất sắc các mục tiêu nghiên cứu lý thuyết về Inversion of Control, Dependency Injection, DispatcherServlet và thiết kế CSDL quan hệ tối ưu, mà còn mang lại một sản phẩm có tính ứng dụng thực tiễn cao, đáp ứng toàn diện nhu cầu vận hành thực tế tại Lào.

Để tìm hiểu chi tiết về cấu trúc mã nguồn và triển khai thử nghiệm giải pháp, quý độc giả và nhà phát triển có thể tham khảo trực tiếp tài liệu kỹ thuật của đồ án hoặc liên hệ nhóm nghiên cứu để nhận gói hỗ trợ cài đặt.