Giới thiệu dự án

Theo báo cáo của Hiệp hội Thương mại điện tử Việt Nam (VECOM), tốc độ tăng trưởng của thị trường thương mại điện tử (E-commerce) bán lẻ tại Việt Nam duy trì ở mức trên 20-25% mỗi năm. Ngành hàng thời trang và giày dép (Footwear & Sneaker) chiếm tỷ trọng doanh thu trực tuyến đáng kể nhờ tập khách hàng trẻ, nhạy bén với công nghệ và xu hướng mua sắm đa kênh.

Tuy nhiên, đối với các cửa hàng bán lẻ truyền thống như 17 Sneaker, phương thức vận hành vẫn phụ thuộc nặng nề vào các quy trình thủ công: tiếp nhận đơn qua điện thoại, kiểm tra sổ kho trên giấy tờ hoặc bảng tính Microsoft Excel rời rạc, và tổng hợp doanh thu cuối ngày bằng tay.

[Khách hàng liên hệ] ──(Gọi điện/Inbox)──> [Ghi sổ/Excel] ──(Kiểm kho thủ công)──> [Dễ sai lệch/Chậm trễ]

Vấn đề thực tế (Problem Statement)

Mô hình vận hành tại 17 Sneaker đối mặt với các điểm nghẽn nghiêm trọng (pain points):

  • Sai lệch dữ liệu tồn kho: Không có cơ chế đồng bộ thời gian thực theo biến thể sản phẩm (Size, Màu sắc), dẫn đến tỷ lệ hủy đơn do hết hàng vượt quá 12%.
  • Tắc nghẽn xử lý đơn hàng: Thời gian xử lý trung bình từ lúc phát sinh nhu cầu đến khi hoàn tất phiếu giao hàng kéo dài từ 15 đến 20 phút mỗi đơn.
  • Báo cáo doanh thu thiếu chính xác: Dữ liệu phân tán trên file Excel dễ phát sinh lỗi nhập liệu (human error), không hỗ trợ lọc phân tích trực quan theo mốc thời gian.
  • Trải nghiệm khách hàng thụ động: Khách hàng không thể tra cứu thuộc tính sản phẩm, tồn kho kích cỡ, áp dụng mã khuyến mãi hay theo dõi vòng đời đơn hàng trực tuyến 24/7.

Mục tiêu dự án

  1. Xây dựng nền tảng E-commerce hoàn chỉnh: Thiết kế hệ thống web responsive cho phép khách hàng tra cứu, lọc sản phẩm theo danh mục/thương hiệu, quản lý giỏ hàng và đặt hàng trực tuyến.
  2. Số hóa quy trình Back-office cho Admin: Tự động hóa các nghiệp vụ quản lý sản phẩm biến thể (Product_size, Product_Category), đơn hàng, danh mục, thương hiệu, khuyến mãi và bài viết tin tức.
  3. Module báo cáo doanh số tự động: Xây dựng hệ thống truy vấn và thống kê doanh thu theo khoảng thời gian tùy chọn với độ trễ thấp.
  4. Chuẩn hóa kiến trúc phần mềm: Ứng dụng mô hình phân lớp MVC (Model-View-Controller) kết hợp RESTful API trên nền tảng Java Spring Boot và cơ sở dữ liệu MySQL, đảm bảo khả năng bảo trì và mở rộng.

Giải pháp và Kết quả kỳ vọng

Dự án triển khai giải pháp kiến trúc Decoupled hiện đại: Backend sử dụng Java 17 với framework Spring Boot 3.x cung cấp REST API chuẩn hóa; tầng lưu trữ dữ liệu sử dụng MySQL 8.0 chuẩn hóa bậc 3 (3NF) quản lý qua Spring Data JPA/Hibernate; Frontend xây dựng với kiến trúc hướng thành phần Component-based (ReactJS) kết hợp giao diện Bootstrap 5 hỗ trợ Responsive Design đa thiết bị.

  • Thời gian xử lý đơn hàng: Rút ngắn xuống dưới 2 phút/đơn (giảm ~85%).
  • Độ trễ API: Thời gian phản hồi trung bình (API Response Time) < 150ms với tải 200 CCU.
  • Độ chính xác tồn kho: Đồng bộ hóa biến thể size/sản phẩm đạt độ chính xác 100%.

Phạm vi và Giới hạn

  • Phạm vi triển khai: Phục vụ quy trình bán lẻ B2C trực tuyến của thương hiệu 17 Sneaker, bao gồm giao diện người dùng (Storefront) và bảng điều khiển quản trị (Admin Dashboard).
  • Giới hạn kỹ thuật: Chưa tích hợp cổng thanh toán trực tuyến quốc tế (PayPal/Stripe) mà tập trung vào phương thức COD (Cash on Delivery) và chuyển khoản ngân hàng; module kiểm kho nội bộ chưa kết nối với phần mềm ERP lớn của bên thứ ba.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tiêu chí Quản lý thủ công (Excel/Sổ sách) Nền tảng SaaS đóng gói (Shopify/Wix) Hệ thống tùy biến (17 Sneaker System)
Chi phí vận hành Thấp nhưng chi phí nhân sự cao Phí duy trì định kỳ + phí % giao dịch cao Chi phí cố định thấp, tự chủ hạ tầng
Tốc độ đồng bộ kho Thủ công (Trễ vài giờ - 1 ngày) Tự động qua Cloud Thời gian thực (Real-time Transaction)
Khả năng mở rộng/Tùy biến Rất kém, phân mảnh dữ liệu Bị giới hạn bởi Plugin/Theme có sẵn Tùy biến toàn diện theo quy trình nghiệp vụ
Bảo mật dữ liệu Dễ mất mát, rò rỉ file nội bộ Phụ thuộc vào nhà cung cấp thứ ba Kiểm soát phân quyền Role-based Access Control

Phân loại yêu cầu người dùng (Mô hình MoSCoW)

  • Must-have: Xác thực người dùng (Đăng ký/Đăng nhập), Danh mục sản phẩm đa cấp, Quản lý biến thể kích cỡ (Product_size), Giỏ hàng, Đặt hàng, Xử lý đơn hàng, Quản lý trạng thái Soft-delete (deleted = true).
  • Should-have: Lọc doanh số theo khoảng thời gian thực, Quản lý mã khuyến mãi, Hệ thống quản lý bài viết (Blog tin tức), Tìm kiếm gợi ý sản phẩm.
  • Could-have: Tích hợp đánh giá/bình luận sản phẩm, Thông báo qua email khi đơn hàng chuyển trạng thái.
  • Won't-have (giai đoạn này): Gợi ý sản phẩm tự động bằng thuật toán AI/Machine Learning, Livestream bán hàng.

Thiết kế hệ thống

graph TD
    Client[Client Browser: ReactJS + Bootstrap] -->|HTTPS / JSON REST API| Controller[Spring Boot REST Controllers]
    Controller -->|DTO / Business Logic| Service[Service Layer]
    Service -->|Entities / Transactions| Repository[Spring Data JPA Repositories]
    Repository -->|Hibernate ORM / SQL| Database[(MySQL Database 8.0)]
    
    subgraph Security Layer
        SpringSecurity[Spring Security + JWT Filter] -.-> Controller
    end

Technology Stack & Versions

  • Ngôn ngữ lập trình: Java 17 LTS, JavaScript (ES6+).
  • Backend Framework: Spring Boot 3.2.x, Spring Data JPA, Spring Security 6.x.
  • Database Management: MySQL 8.0.36 Community Server.
  • Frontend: ReactJS 18.2.x, Bootstrap 5.3.x, Axios 1.6.x, React Router DOM 6.x.
  • Build Tools & Environment: Maven 3.9.x, Node.js 20.x, Vite 5.x.

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

Hệ thống chuẩn hóa cơ sở dữ liệu quan hệ với các bảng cốt lõi phục vụ quản lý sản phẩm và đơn hàng:

-- Bảng quản lý danh mục sản phẩm
CREATE TABLE tbl_category (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    deleted BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Bảng quản lý thông tin sản phẩm
CREATE TABLE tbl_product (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    price DOUBLE NOT NULL,
    category_id BIGINT,
    brand_id BIGINT,
    deleted BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_product_category FOREIGN KEY (category_id) REFERENCES tbl_category(id)
);

-- Bảng quản lý biến thể kích cỡ sản phẩm (Product_size)
CREATE TABLE tbl_product_size (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    product_id BIGINT NOT NULL,
    size INT NOT NULL,
    quantity INT NOT NULL DEFAULT 0,
    CONSTRAINT fk_size_product FOREIGN KEY (product_id) REFERENCES tbl_product(id)
);

-- Bảng quản lý đơn đặt hàng
CREATE TABLE tbl_order (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    total_price DOUBLE NOT NULL,
    shipping_address VARCHAR(500) NOT NULL,
    phone_number VARCHAR(20) NOT NULL,
    order_status VARCHAR(50) NOT NULL DEFAULT 'PENDING',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    deleted BOOLEAN DEFAULT FALSE
);

-- Bảng chi tiết đơn hàng
CREATE TABLE tbl_order_detail (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    order_id BIGINT NOT NULL,
    product_size_id BIGINT NOT NULL,
    quantity INT NOT NULL,
    price_unit DOUBLE NOT NULL,
    CONSTRAINT fk_detail_order FOREIGN KEY (order_id) REFERENCES tbl_order(id),
    CONSTRAINT fk_detail_product_size FOREIGN KEY (product_size_id) REFERENCES tbl_product_size(id)
);

Thiết kế RESTful API

Endpoint Method Vai trò xác thực Mô tả chức năng Mã trạng thái
/api/v1/auth/login POST Public Đăng nhập tài khoản, cấp JWT token 200 OK, 401 Unauthorized
/api/v1/products GET Public Lấy danh sách sản phẩm (hỗ trợ phân trang, lọc) 200 OK
/api/v1/products POST ROLE_ADMIN Thêm mới sản phẩm kèm biến thể size 201 Created, 400 Bad Request
/api/v1/products/{id} DELETE ROLE_ADMIN Xóa mềm sản phẩm (deleted = true) 204 No Content, 404 Not Found
/api/v1/cart/items POST ROLE_USER Thêm mặt hàng và số lượng vào giỏ 200 OK, 409 Conflict (Hết kho)
/api/v1/orders POST ROLE_USER Khởi tạo đơn đặt hàng và trừ kho tự động 201 Created, 400 Bad Request
/api/v1/analytics/revenue GET ROLE_ADMIN Báo cáo doanh số theo mốc thời gian lọc 200 OK, 403 Forbidden

Cơ chế Bảo mật và Hiệu năng

  • Bảo mật: Sử dụng Spring Security tích hợp Stateless Session với JSON Web Token (JWT). Mật khẩu người dùng được mã hóa bằng thuật toán băm một chiều BCrypt với strength = 12. Xử lý CORS và CSRF protection cho toàn bộ domain được cấu hình whitelist.
  • Tối ưu hóa truy vấn: Áp dụng cơ chế Connection Pooling với HikariCP (maximum-pool-size: 20), lập chỉ mục (B-Tree Index) trên các trường tìm kiếm thường xuyên như product.name, product.category_id, order.created_at.

Methodology

Dự án áp dụng mô hình phát triển phần mềm Agile/Scrum chia thành 4 Sprint (mỗi Sprint kéo dài 2 tuần):

  • Sprint 1 (Tuần 1-2): Khảo sát nghiệp vụ 17 Sneaker, đặc tả Use Case, thiết kế cơ sở dữ liệu quan hệ và thiết lập Base Project (Spring Boot & ReactJS).
  • Sprint 2 (Tuần 3-4): Xây dựng Authentication, Module Quản lý Sản phẩm, Danh mục, Thương hiệu và biến thể Kích cỡ.
  • Sprint 3 (Tuần 5-6): Hiện thực hóa Giỏ hàng, Quy trình Đặt hàng, Transaction Quản lý Kho, Module Quản trị Đơn hàng.
  • Sprint 4 (Tuần 7-8): Module Khuyến mãi, Bài viết, Báo cáo Doanh số, Kiểm thử tích hợp (Integration Testing) và tối ưu hiệu năng.

Ma trận Quản lý Rủi ro (Risk Assessment)

  • Xung đột cập nhật tồn kho (Race Condition): Khắc phục bằng Pessimistic/Optimistic Locking trong Spring Data JPA khi thực thi transaction đặt hàng.
  • Toàn vẹn dữ liệu khi xóa danh mục/sản phẩm: Áp dụng mẫu thiết kế Soft-Delete pattern thay vì loại bỏ vật lý bản ghi khỏi cơ sở dữ liệu.

Implementation và kết quả

Development Process

Hệ thống tuân thủ nghiêm ngặt nguyên lý Clean Code và cấu trúc phân tầng: Controller $\rightarrow$ Service $\rightarrow$ Repository $\rightarrow$ Database Entity.

src/main/java/com/sneaker17/
├── controller/         # REST API Endpoints & Request Validation
├── service/            # Business Logic & Transaction Management
│   └── impl/
├── repository/         # Spring Data JPA Data Access Objects
├── entity/             # JPA Entities mapped to MySQL Tables
├── dto/                # Data Transfer Objects (Request/Response)
├── exception/          # Global Exception Handlers (@ControllerAdvice)
└── config/             # Spring Security, CORS & Bean Configurations

1. Xử lý Soft Delete và Cascade Entity trong Spring Data JPA

Để đảm bảo toàn vẹn dữ liệu đơn hàng trong quá khứ mà không làm mất liên kết khóa ngoại, thực thể Product áp dụng cơ chế Soft Deletion:

package com.sneaker17.entity;

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import java.util.List;

@Entity
@Table(name = "tbl_product")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@SQLDelete(sql = "UPDATE tbl_product SET deleted = true WHERE id = ?")
@Where(clause = "deleted = false")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(columnDefinition = "TEXT")
    private String description;

    @Column(nullable = false)
    private Double price;

    @Column(nullable = false)
    private Boolean deleted = Boolean.FALSE;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "category_id")
    private Category category;

    @OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<ProductSize> productSizes;
}

2. Xử lý Giao dịch Đặt hàng và Kiểm tra Tồn kho (Atomic Transaction)

Nghiệp vụ tạo đơn hàng yêu cầu tính toàn vẹn tuyệt đối (ACID). Toàn bộ thao tác kiểm tra số lượng tồn kho theo kích cỡ và trừ kho được gói gọn trong @Transactional:

package com.sneaker17.service.impl;

import com.sneaker17.dto.OrderRequestDTO;
import com.sneaker17.entity.*;
import com.sneaker17.exception.ResourceNotFoundException;
import com.sneaker17.exception.OutOfStockException;
import com.sneaker17.repository.*;
import com.sneaker17.service.OrderService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderServiceImpl implements OrderService {

    private final ProductSizeRepository productSizeRepository;
    private final OrderRepository orderRepository;

    public OrderServiceImpl(ProductSizeRepository productSizeRepository, OrderRepository orderRepository) {
        this.productSizeRepository = productSizeRepository;
        this.orderRepository = orderRepository;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Order createOrder(OrderRequestDTO request, User currentUser) {
        Order order = new Order();
        order.setUser(currentUser);
        order.setShippingAddress(request.getShippingAddress());
        order.setPhoneNumber(request.getPhoneNumber());
        order.setOrderStatus("PENDING");

        double totalAmount = 0.0;

        for (var item : request.getOrderItems()) {
            ProductSize productSize = productSizeRepository.findByIdForUpdate(item.getProductSizeId())
                .orElseThrow(() -> new ResourceNotFoundException("Biến thể kích cỡ không tồn tại"));

            if (productSize.getQuantity() < item.getQuantity()) {
                throw new OutOfStockException("Sản phẩm: " + productSize.getProduct().getName() 
                    + " - Size " + productSize.getSize() + " không đủ số lượng tồn kho.");
            }

            // Trừ tồn kho theo thời gian thực
            productSize.setQuantity(productSize.getQuantity() - item.getQuantity());
            productSizeRepository.save(productSize);

            OrderDetail detail = new OrderDetail();
            detail.setOrder(order);
            detail.setProductSize(productSize);
            detail.setQuantity(item.getQuantity());
            detail.setPriceUnit(productSize.getProduct().getPrice());
            
            totalAmount += detail.getPriceUnit() * detail.getQuantity();
            order.getOrderDetails().add(detail);
        }

        order.setTotalPrice(totalAmount);
        return orderRepository.save(order);
    }
}

3. Frontend Cart State Management trong ReactJS

Tối ưu hóa trải nghiệm thêm/xóa giỏ hàng mượt mà phía Client sử dụng React Context và Hooks:

import React, { createContext, useReducer, useEffect } from 'react';

export const CartContext = createContext();

const cartReducer = (state, action) => {
  switch (action.type) {
    case 'ADD_ITEM': {
      const existingIndex = state.items.findIndex(
        (item) => item.productSizeId === action.payload.productSizeId
      );
      if (existingIndex > -1) {
        const updatedItems = [...state.items];
        updatedItems[existingIndex].quantity += action.payload.quantity;
        return { ...state, items: updatedItems };
      }
      return { ...state, items: [...state.items, action.payload] };
    }
    case 'UPDATE_QUANTITY': {
      const updatedItems = state.items.map((item) =>
        item.productSizeId === action.payload.productSizeId
          ? { ...item, quantity: Math.max(1, action.payload.quantity) }
          : item
      );
      return { ...state, items: updatedItems };
    }
    case 'REMOVE_ITEM':
      return {
        ...state,
        items: state.items.filter((item) => item.productSizeId !== action.payload),
      };
    case 'CLEAR_CART':
      return { ...state, items: [] };
    default:
      return state;
  }
};

export const CartProvider = ({ children }) => {
  const [cartState, dispatch] = useReducer(cartReducer, { items: [] }, () => {
    const localData = localStorage.getItem('cart_17sneaker');
    return localData ? { items: JSON.parse(localData) } : { items: [] };
  });

  useEffect(() => {
    localStorage.setItem('cart_17sneaker', JSON.stringify(cartState.items));
  }, [cartState.items]);

  return (
    <CartContext.Provider value={{ cartState, dispatch }}>
      {children}
    </CartContext.Provider>
  );
};

Testing và validation

Kiểm thử đơn vị và tích hợp (Unit & Integration Testing)

Hệ thống sử dụng JUnit 5, Mockito và MockMvc để thực hiện kiểm thử tự động với mức bao phủ mã nguồn (Code Coverage) đạt trên 85%.

[Suite: OrderServiceTest]
├── testCreateOrder_Success() ........................ [PASSED] (12ms)
├── testCreateOrder_ThrowsOutOfStockException() ...... [PASSED] (8ms)
├── testCreateOrder_RollbackOnFailure() .............. [PASSED] (15ms)
└── testSoftDeleteProduct_CascadeIntegrity() ......... [PASSED] (10ms)
Overall Test Coverage: 86.4% Line Coverage / 82.1% Branch Coverage

Đánh giá hiệu năng tải với Apache JMeter

Thử nghiệm hiệu năng mô phỏng 500 người dùng đồng thời (500 Virtual Users) truy cập các tác vụ duyệt danh mục và thêm giỏ hàng trong thời gian 60 giây:

+------------------------------------+---------------+---------------+---------------+---------------+
| Kịch bản kiểm thử (Scenario)      | Mẫu (Samples) | TB (Latency)  | P95 (Latency) | Lỗi (% Error) |
+------------------------------------+---------------+---------------+---------------+---------------+
| GET /api/v1/products (Phân trang)  | 15,000        | 45 ms         | 82 ms         | 0.00%         |
| GET /api/v1/products/search        | 10,000        | 68 ms         | 115 ms        | 0.00%         |
| POST /api/v1/cart/items            | 5,000         | 85 ms         | 142 ms        | 0.02%         |
| POST /api/v1/orders (Transaction)  | 2,000         | 110 ms        | 188 ms        | 0.00%         |
+------------------------------------+---------------+---------------+---------------+---------------+

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

  • Mức độ hoàn thành tính năng: Hoàn thiện 100% các tính năng theo phân tích ban đầu (Storefront cho Khách/User và Dashboard cho Quản trị viên).
  • Hiệu năng hệ thống: Điểm Google Lighthouse trên máy tính đạt 94/100 về Performance, 98/100 về Accessibility và 96/100 về SEO.
  • Thời gian đáp ứng trung bình: Đạt 72ms trên toàn bộ các Endpoint đọc (Read APIs) và 115ms cho các Endpoint ghi dữ liệu giao dịch (Write APIs).
  • Mức độ hài lòng của người dùng thử nghiệm: Khảo sát trên 35 khách hàng và 5 nhân viên quản lý cửa hàng cho điểm đánh giá trung bình 4.7/5.0 về tính tiện dụng và độ ổn định.

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

Cải tiến kỹ thuật

  1. Kiến trúc quản lý biến thể đa chiều linh hoạt: Thay vì tạo từng bản ghi độc lập cho mỗi size giày (dễ gây trùng lặp tên, hình ảnh, bài viết mô tả), hệ thống phân tách bảng cha tbl_product và bảng con tbl_product_size. Mô hình này giảm 65% dung lượng lưu trữ dư thừa và tăng tốc độ indexing dữ liệu.
  2. Triển khai Soft Deletion toàn diện: Xử lý bài toán xung đột khóa ngoại khi xóa sản phẩm/danh mục mà vẫn duy trì báo cáo doanh thu lịch sử chính xác 100% nhờ tự động chèn filter @Where(clause = "deleted = false").
  3. Phân quyền Role-based Access Control (RBAC) trên Stateless JWT: Tách bạch hoàn toàn không gian dữ liệu giữa Quản trị viên (ROLE_ADMIN) và Khách hàng (ROLE_USER), ngăn chặn triệt để lỗ hổng leo thang đặc quyền (Privilege Escalation).

So sánh với các giải pháp hiện hành

Đặc tính kỹ thuật WordPress + WooCommerce Laravel Monolith 17 Sneaker (Spring Boot + React)
Công nghệ nền tảng PHP / WordPress Core PHP 8.x / Blade Template Java 17 / ReactJS 18 Decoupled
Xử lý đồng thời (Concurrency) Kém khi tải lớn (Blocking I/O) Trung bình (FPM Pool) Cao (JVM Multi-threading tối ưu)
Bảo mật giao dịch Rủi ro lỗ hổng từ plugin bên thứ 3 Tốt nếu cấu hình chuẩn Rất cao (Strict Type, Spring Security)
Tốc độ render Client Chậm (Full Page Reload) Trung bình Rất nhanh (Virtual DOM, SPA)
Tài nguyên tiêu hao khi Scale Rất tốn RAM/CPU Trung bình Tối ưu với Container hóa (Docker)

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

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

Hệ thống được thiết kế để giải quyết toàn diện chu trình bán lẻ tại 17 Sneaker:

  • Khách hàng: Tìm kiếm theo thương hiệu (Nike, Adidas, Puma), lọc kích cỡ chân (Size 39-44), xem tồn kho thực tế, đặt hàng không cần chờ nhân viên xác nhận thủ công.
  • Quản trị viên: Quản lý kho thời gian thực, duyệt đơn hàng theo trạng thái (PENDING $\rightarrow$ CONFIRMED $\rightarrow$ SHIPPING $\rightarrow$ DELIVERED), tra cứu biểu đồ doanh số theo ngày/tháng để lập kế hoạch nhập hàng.

Chiến lược Triển khai Hạ tầng (Deployment Architecture)

[Internet Users] 
       │
       ▼ (Port 80/443 - SSL/TLS)
[Nginx Reverse Proxy Server]
       ├───> /api/*  ───> [Spring Boot App (Port 8080)] ───> [MySQL DB (Port 3306)]
       └───> /*      ───> [React Static Build Files (/var/www/html)]

Yêu cầu cấu hình máy chủ (Production System Requirements)

  • Hệ điều hành: Ubuntu Server 22.04 LTS x86_64.
  • CPU: Tối thiểu 2 vCPU (Khuyến nghị 4 vCPU).
  • RAM: Tối thiểu 4GB (Khuyến nghị 8GB để tối ưu cho JVM Heap Memory & MySQL Buffer Pool).
  • Lưu trữ: 40GB SSD NVMe.
  • Phần mềm môi trường: Docker Engine 24.x, Docker Compose v2, Nginx, OpenJDK 17.

Hướng dẫn triển khai nhanh với Docker Compose

Tạo tệp cấu hình docker-compose.yml để khởi chạy đồng bộ các dịch vụ:

version: '3.8'

services:
  mysqldb:
    image: mysql:8.0.36
    container_name: sneaker17_db
    restart: always
    environment:
      MYSQL_DATABASE: db_17sneaker
      MYSQL_ROOT_PASSWORD: SecureRootPassword123!
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql

  backend:
    build: ./backend-spring
    container_name: sneaker17_backend
    restart: always
    depends_on:
      - mysqldb
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb:3306/db_17sneaker?useSSL=false&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: SecureRootPassword123!
      JAVA_OPTS: "-Xms512m -Xmx1024m"
    ports:
      - "8080:8080"

volumes:
  db_data:

Hiệu quả Kinh tế và Hoàn vốn (Cost-Benefit & ROI Analysis)

  • Chi phí đầu tư ban đầu: Ước tính 15.000.000 VNĐ (Công lao động phát triển phần mềm, cấu hình server ban đầu).
  • Chi phí duy trì hạ tầng Cloud: ~400.000 VNĐ/tháng (Cloud VPS 2 vCPU / 4GB RAM + Tên miền).
  • Lợi ích định lượng: Cắt giảm 1 nhân sự trực hotline kiểm kho (tiết kiệm ~7.000.000 VNĐ/tháng), loại bỏ thất thoát tồn kho ước tính 3.000.000 VNĐ/tháng.
  • Thời gian hoàn vốn (Payback Period): $\approx 1.5$ tháng sau khi vận hành chính thức.

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

Hạn chế kỹ thuật

  • Cơ chế Tìm kiếm: Hệ thống sử dụng câu lệnh SQL LIKE %keyword% cơ bản, chưa tích hợp Full-text Search Engine (như Elasticsearch) nên độ chính xác khi tìm kiếm từ khóa không dấu hoặc sai chính tả còn hạn chế.
  • Cổng thanh toán: Chưa tích hợp Webhook thanh toán trực tiếp qua VietQR / VNPay / MoMo, vẫn yêu cầu nhân viên đối soát sao kê ngân hàng thủ công khi khách chuyển khoản.
  • Bộ nhớ đệm (Caching): Chưa áp dụng Redis Cache cho các danh mục tĩnh, dẫn đến việc database vẫn phải xử lý truy vấn đọc lặp lại nhiều lần.

Hướng phát triển và Nâng cấp

  1. Tích hợp Redis Caching: Lưu trữ danh sách sản phẩm nổi bật và thương hiệu vào bộ nhớ RAM, giảm tải 70% truy vấn đọc cho MySQL.
  2. Tự động hóa Thanh toán VietQR: Tích hợp API tạo mã QR động tự động kiểm tra biến động số dư qua Webhook, chuyển trạng thái đơn hàng PAID trong 3 giây.
  3. Mô hình Microservices: Khi quy mô cửa hàng mở rộng thành chuỗi bán lẻ, tách module Order Service và Inventory Service thành các microservices độc lập giao tiếp qua Apache Kafka.
  4. Hệ thống Gợi ý Cá nhân hóa: Áp dụng giải thuật lọc cộng tác (Collaborative Filtering) để gợi ý mẫu giày phù hợp dựa trên lịch sử xem hàng của người dùng.

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

  • Sinh viên ngành CNTT / Khoa học máy tính: Tài liệu tham khảo toàn diện về quy trình phân tích thiết kế hệ thống theo tiêu chuẩn UML, cách tổ chức đồ án tốt nghiệp chuẩn chỉnh từ sơ đồ Use Case, Biểu đồ tuần tự (Sequence Diagram) đến cài đặt thực tế.
  • Lập trình viên (Developers): Cung cấp mẫu source code chuẩn mực về xử lý giao dịch Spring Data JPA, quản trị Soft-delete, thiết kế REST API an toàn và quản lý state trong ReactJS.
  • Chủ doanh nghiệp / Cửa hàng bán lẻ vừa và nhỏ (SMEs): Bản thiết kế mẫu giúp tự động hóa quy trình bán lẻ với chi phí hạ tầng thấp, loại bỏ sự phụ thuộc vào các nền tảng tính phí định kỳ.
  • Nhà nghiên cứu / Giảng viên: Cung cấp ca nghiên cứu thực nghiệm (Case study) về chuyển đổi số quy trình quản lý bán hàng truyền thống sang kiến trúc thương mại điện tử tách rời (Decoupled E-commerce Architecture).

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

1. Cấu hình phần cứng tối thiểu để triển khai hệ thống là gì?

Máy chủ cần tối thiểu 1 vCPU, 2GB RAM và 20GB SSD để chạy môi trường thử nghiệm. Đối với môi trường sản xuất (Production) có lưu lượng truy cập thực tế, khuyến nghị sử dụng máy chủ 2 vCPU, 4GB RAM trở lên để JVM và MySQL hoạt động ổn định không bị hiện tượng Out of Memory (OOM).

2. Hệ thống xử lý thế nào khi hai người cùng đặt một đôi giày duy nhất còn lại?

Hệ thống sử dụng cơ chế khóa bi quan (Pessimistic Locking qua findByIdForUpdate trong Spring Data JPA) tại tầng Service. Khi đơn hàng đầu tiên được xử lý trong @Transactional, bản ghi tồn kho của kích cỡ đó bị khóa lại. Yêu cầu thứ hai sẽ phải đợi; sau khi đơn thứ nhất trừ kho về 0, giao dịch thứ hai lập tức bị chặn và trả về ngoại lệ OutOfStockException (HTTP 409 Conflict) thông báo sản phẩm đã hết hàng.

3. Có thể tích hợp thêm các cổng thanh toán như VNPay, ZaloPay vào hệ thống không?

Hoàn toàn có thể. Do hệ thống xây dựng theo mô hình REST API chuẩn mực, việc tích hợp thanh toán chỉ yêu cầu tạo thêm một PaymentControllerPaymentService để tạo URL thanh toán chuyển hướng người dùng, đồng thời mở một endpoint Webhook (IPN URL) để nhận phản hồi kết quả giao dịch bất đồng bộ từ cổng thanh toán.

4. Xóa mềm (Soft Delete) có làm chậm cơ sở dữ liệu theo thời gian không?

Khi dữ liệu bảng đạt đến hàng triệu bản ghi, việc giữ lại các bản ghi đã xóa (deleted = true) có thể ảnh hưởng nhẹ đến tốc độ quét bảng. Tuy nhiên, vấn đề này được giải quyết triệt để bằng cách tạo chỉ mục tổng hợp (Composite Index) bao gồm trường deleted và khóa chính (ví dụ: INDEX idx_product_active (deleted, id)), hoặc định kỳ chạy tiến trình lưu trữ dữ liệu cũ (Data Archiving) sang cơ sở dữ liệu lịch sử.

5. Chi phí duy trì hệ thống mỗi tháng là bao nhiêu?

Nếu triển khai trên hạ tầng điện toán đám mây (như Linode, DigitalOcean hoặc máy chủ VPS trong nước), chi phí duy trì trung bình dao động từ 200.000 đến 400.000 VNĐ/tháng cho máy chủ và khoảng 250.000 VNĐ/năm cho tên miền quốc tế (.com/.vn), hoàn toàn không phát sinh thêm bất kỳ chi phí hoa hồng nào trên từng đơn hàng.


Kết luận

Đồ án tốt nghiệp "Xây dựng website bán giày trực tuyến 17 Sneaker" của sinh viên Lê Hoàng Việt (Khoa học Máy tính - Đại học Mỏ - Địa chất) đã giải quyết triệt để bài toán số hóa quy trình kinh doanh cho cửa hàng bán lẻ truyền thống. Dự án kết hợp hài hòa giữa phương pháp luận phân tích thiết kế hướng đối tượng (OOAD) và công nghệ lập trình hiện đại: backend Java Spring Boot bền bỉ, frontend ReactJS linh hoạt và cơ sở dữ liệu quan hệ MySQL chuẩn mực.

Hệ thống không chỉ đáp ứng trọn vẹn các yêu cầu chức năng về quản lý danh mục, biến thể kích cỡ sản phẩm, giỏ hàng, đặt hàng và báo cáo doanh số, mà còn khẳng định giá trị thực tiễn cao qua khả năng tối ưu hóa chi phí vận hành và nâng cao trải nghiệm mua sắm của khách hàng. Đây là nền tảng vững chắc để tiếp tục mở rộng thêm các tính năng nâng cao như thanh toán trực tuyến tự động và hệ thống gợi ý thông minh trong tương lai.