Giới thiệu dự án

Thương mại điện tử (E-Commerce) tại Việt Nam đang trải qua giai đoạn tăng trưởng bứt phá với tốc độ tăng trưởng kép hàng năm (CAGR) đạt trên 20%, quy mô thị trường dự kiến vượt mốc 25 tỷ USD. Cùng với sự thay đổi thói quen tiêu dùng từ mua sắm truyền thống sang trực tuyến, nhu cầu về các nền tảng thương mại điện tử đa người bán (Multi-vendor Marketplace) có hiệu năng cao, linh hoạt và bảo mật ngày càng trở nên cấp thiết đối với các doanh nghiệp vừa và nhỏ (SMB).

Đề tài "Xây dựng website E-Commerce YD" do sinh viên Phạm Huy Phong (Khoa Công nghệ Thông tin – Trường Đại học Điện Lực, dưới sự hướng dẫn của TS. Nguyễn Văn Đoàn) nghiên cứu và phát triển nhằm giải quyết triệt để bài toán phân mảnh của các website bán lẻ đơn lẻ. Các giải pháp truyền thống thường giới hạn ở mô hình một người bán (Single-vendor), chi phí vận hành cao, khó mở rộng danh mục hàng hóa và thiếu cơ chế tự động hóa trong quản trị phân quyền đa cấp.

graph TD
    A[Người Mua - Customer] -->|Duyệt, Đặt hàng, Thanh toán VNPay| B(Website E-Commerce YD)
    C[Người Bán - Seller] -->|Quản lý sản phẩm, Đơn hàng, Doanh thu| B
    D[Quản Trị Viên - Admin] -->|Phê duyệt Shop, Quản lý danh mục/User| B
    B --> E[(MySQL RDBMS)]
    B --> F[VNPay Payment Gateway]

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

  1. Xây dựng kiến trúc phân tầng chuyên biệt: Tách biệt hoàn toàn Frontend và Backend thông qua mô hình Single-Page Application (SPA) kết hợp kiến trúc RESTful API.
  2. Thiết lập quy trình nghiệp vụ đa tác nhân: Hỗ trợ 3 nhóm người dùng độc lập: Khách hàng (Customer), Người bán hàng (Seller), và Quản trị viên hệ thống (Administrator) với phân quyền Role-Based Access Control (RBAC).
  3. Tự động hóa chu trình bán hàng: Tích hợp cổng thanh toán trực tuyến qua VNPAY, module xử lý đơn hàng thời gian thực, quản lý Flash Sale và thống kê doanh thu đa chiều.
  4. Tối ưu hóa quy trình kiểm thử và triển khai: Áp dụng công nghệ đóng gói Docker container, thiết lập luồng CI/CD tự động hóa kiểm thử trên GitLab và triển khai lên hạ tầng đám mây AWS.

Chỉ số kỳ vọng và phạm vi

  • Thời gian phản hồi API: Dưới 200ms đối với 95% các tác vụ truy vấn dữ liệu tiêu chuẩn.
  • Tính sẵn sàng (High Availability): Đạt 99.9% uptime trong môi trường kiểm thử tải.
  • Phạm vi hệ thống: Tập trung vào chuỗi giá trị cốt lõi từ duyệt sản phẩm, quản lý giỏ hàng, đặt hàng, thanh toán VNPAY, quản lý kho/doanh thu của Seller, đến phê duyệt người bán của Admin.
  • Giới hạn: Hệ thống chưa tích hợp thuật toán gợi ý AI theo hành vi cá nhân hóa sâu và chưa triển khai phân tán đa cụm cơ sở dữ liệu.

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

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

Nghiên cứu thị trường và phân tích so sánh kỹ thuật giữa các giải pháp thương mại điện tử hiện nay:

Tiêu chí WooCommerce (WordPress / PHP) Nền tảng SaaS (Shopify / Haravan) Hệ thống E-Commerce YD (Customized)
Kiến trúc Monolithic (Đơn khối) Đóng kín (Proprietary Cloud) Decoupled (Spring Boot + Vue.js SPA)
Tùy biến nghiệp vụ Trung bình (phụ thuộc Plugins) Thấp (giới hạn bởi API/Theme) Tuyệt đối (toàn quyền can thiệp mã nguồn)
Hiệu năng & Tải Kém khi dữ liệu lớn (>50k SKUs) Rất tốt nhưng chi phí tăng theo tải Cao (nhờ connection pool HikariCP & Vue SPA)
Chi phí vận hành Thấp ban đầu, tăng khi scale Rất cao (phí thuê bao + % giao dịch) Tối ưu (chỉ trả phí hạ tầng server/cloud)
Quy trình Multi-vendor Cần cài thêm plugin bên thứ 3 Cần gói Enterprise cao cấp Tích hợp sẵn quy trình phê duyệt & quản lý

Ưu tiên hóa yêu cầu người dùng theo phương pháp MoSCoW:

  • Must-Have: Xác thực người dùng (JWT, Spring Security), Giỏ hàng & Đặt hàng, Thanh toán trực tuyến VNPay, Quản lý sản phẩm & đơn hàng cho Seller, Phê duyệt người bán cho Admin.
  • Should-Have: Kênh trao đổi trực tuyến (Chat real-time), Quản lý Flash Sale, Thống kê biểu đồ doanh thu theo chu kỳ, Quản lý thông báo và hỏi đáp hệ thống.
  • Could-Have: Đánh giá/bình luận sản phẩm kèm hình ảnh, Quản lý banner động trên Landing Page.
  • Won't-Have (Giai đoạn này): Tích hợp ví điện tử quốc tế (PayPal/Stripe), Đa ngôn ngữ và đa tiền tệ.

Thiết kế hệ thống

Kiến trúc hệ thống được xây dựng theo mô hình Client-Server hiện đại, phân tách hoàn toàn giữa giao diện người dùng và lớp dịch vụ backend.

graph TB
    subgraph Client_Layer ["Client Layer (Vue.js SPA)"]
        UI_Customer["Giao diện Khách hàng"]
        UI_Seller["Giao diện Kênh Người bán"]
        UI_Admin["Giao diện Quản trị viên"]
    end

    subgraph Gateway_Security ["Security & Routing"]
        Nginx["Nginx Reverse Proxy / SSL"]
        Security["Spring Security + JWT Filter"]
    end

    subgraph Service_Layer ["Backend Service Layer (Spring Boot)"]
        AuthService["Auth & User Service"]
        ProductService["Product & Catalog Service"]
        OrderService["Order & Cart Service"]
        PaymentService["VNPay Integration Service"]
        RevenueService["Revenue & Analytics Service"]
        ChatService["Chat & Notification Service"]
    end

    subgraph Data_Layer ["Data Persistence & Storage"]
        MySQL[("MySQL 8.0 Database")]
        S3["AWS S3 / File Storage"]
    end

    UI_Customer -->|HTTPS / REST API| Nginx
    UI_Seller -->|HTTPS / REST API| Nginx
    UI_Admin -->|HTTPS / REST API| Nginx

    Nginx --> Security
    Security --> AuthService
    Security --> ProductService
    Security --> OrderService
    Security --> PaymentService
    Security --> RevenueService
    Security --> ChatService

    AuthService --> MySQL
    ProductService --> MySQL
    OrderService --> MySQL
    PaymentService --> MySQL
    RevenueService --> MySQL
    ChatService --> MySQL
    ProductService --> S3

Technology Stack và phiên bản chi tiết

  • Backend Framework: Spring Boot 2.7.x / 3.0 trên nền tảng Java SE 17 (LTS).
  • Frontend Framework: Vue.js 3.2.x (Single File Components - SFC, Vue Router, Pinia/Vuex).
  • Database Management System: MySQL 8.0.x hỗ trợ engine InnoDB bảo đảm tính toàn vẹn dữ liệu ACID.
  • Security Stack: Spring Security 5.7+, JSON Web Token (JWT 0.11.5), thuật toán mã hóa mật khẩu BCrypt (Strength = 12).
  • DevOps & Deployment: Docker 20.10+, Docker Compose, GitLab CI/CD Pipeline, Nginx Reverse Proxy, AWS EC2 & RDS.

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

Cơ sở dữ liệu bao gồm các thực thể cốt lõi với khóa ngoại và quan hệ chặt chẽ:

  • users (id, username, password_hash, email, phone, role, status, created_at)
  • shops (id, user_id [FK], shop_name, description, rating, status_approved, created_at)
  • categories (id, parent_id [FK], name, slug, image_url, is_active)
  • products (id, shop_id [FK], category_id [FK], name, sku, price, stock_quantity, is_flash_sale, discount_rate, status)
  • orders (id, user_id [FK], shop_id [FK], total_amount, shipping_address, payment_method, order_status, created_at)
  • order_items (id, order_id [FK], product_id [FK], quantity, unit_price, subtotal)
  • payments (id, order_id [FK], vnp_txn_ref, amount, bank_code, response_code, status, paid_at)

Thiết kế RESTful API tiêu biểu

Endpoint Method Phân quyền Chức năng nghiệp vụ
/api/v1/auth/login POST Public Xác thực thông tin đăng nhập, trả về Access Token JWT
/api/v1/users/register-seller POST ROLE_USER Gửi yêu cầu đăng ký mở gian hàng (Shop) lên hệ thống
/api/v1/admin/sellers/{id}/approve PUT ROLE_ADMIN Phê duyệt hoặc từ chối đơn đăng ký thành người bán
/api/v1/seller/products POST ROLE_SELLER Tạo sản phẩm mới kèm thông số tồn kho và Flash Sale
/api/v1/orders/checkout POST ROLE_USER Khởi tạo đơn hàng và sinh URL điều hướng cổng thanh toán VNPay
/api/v1/payment/vnpay-callback GET Public / Webhook Nhận IPN từ VNPay, kiểm tra mã băm và cập nhật trạng thái đơn

Methodology

Dự án áp dụng mô hình phát triển phần mềm linh hoạt (Agile/Scrum) với chu kỳ 4 Sprint (mỗi Sprint kéo dài 2 tuần):

  • Sprint 1: Khảo sát yêu cầu, thiết kế UML (Use Case, Class, Sequence, Activity Diagram) và khởi tạo Database Schema.
  • Sprint 2: Xây dựng Core API Backend (Auth, User, Product, Category), thiết lập Base UI Vue.js.
  • Sprint 3: Triển khai nghiệp vụ nâng cao: Giỏ hàng, Tích hợp cổng VNPay, Kênh Người bán (Seller Dashboard), Thống kê doanh thu.
  • Sprint 4: Xây dựng Admin Panel, quản lý phê duyệt Seller, Chat module, tối ưu hóa hiệu năng, viết Unit Test và đóng gói Docker/CI-CD.

Implementation và kết quả

Development process & Key algorithms

Hệ thống tuân thủ nghiêm ngặt mô hình kiến trúc phân lớp chuẩn của Spring Boot: Controller Layer $\rightarrow$ Service Layer $\rightarrow$ Repository Layer (Spring Data JPA) $\rightarrow$ Database Entity.

Một trong những module kỹ thuật quan trọng nhất của hệ sinh thái E-Commerce YD là module tích hợp thanh toán VNPAY, đòi hỏi xử lý thuật toán tạo chữ ký bảo mật (HMAC-SHA512 checksum) để chống giả mạo dữ liệu giao dịch.

package vn.edu.epu.ecommerce.service.impl;

import org.springframework.stereotype.Service;
import vn.edu.epu.ecommerce.config.VNPayConfig;
import vn.edu.epu.ecommerce.dto.PaymentRequestDTO;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class VNPayServiceImpl {

    public String createPaymentUrl(PaymentRequestDTO request, String clientIp) throws Exception {
        Map<String, String> vnp_Params = new HashMap<>();
        vnp_Params.put("vnp_Version", VNPayConfig.VNP_VERSION);
        vnp_Params.put("vnp_Command", "pay");
        vnp_Params.put("vnp_TmnCode", VNPayConfig.VNP_TMN_CODE);
        vnp_Params.put("vnp_Amount", String.valueOf(request.getAmount() * 100)); // VNPay quy định nhân 100
        vnp_Params.put("vnp_CurrCode", "VND");
        vnp_Params.put("vnp_TxnRef", request.getOrderCode());
        vnp_Params.put("vnp_OrderInfo", "Thanh toan don hang: " + request.getOrderCode());
        vnp_Params.put("vnp_OrderType", "other");
        vnp_Params.put("vnp_Locale", "vn");
        vnp_Params.put("vnp_ReturnUrl", VNPayConfig.VNP_RETURN_URL);
        vnp_Params.put("vnp_IpAddr", clientIp);

        Calendar cld = Calendar.getInstance(TimeZone.getTimeZone("Etc/GMT+7"));
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
        String vnp_CreateDate = formatter.format(cld.getTime());
        vnp_Params.put("vnp_CreateDate", vnp_CreateDate);

        // Sắp xếp các tham số theo thứ tự alphabet
        List<String> fieldNames = new ArrayList<>(vnp_Params.keySet());
        Collections.sort(fieldNames);
        StringBuilder hashData = new StringBuilder();
        StringBuilder query = new StringBuilder();

        for (Iterator<String> itr = fieldNames.iterator(); itr.hasNext();) {
            String fieldName = itr.next();
            String fieldValue = vnp_Params.get(fieldName);
            if ((fieldValue != null) && (fieldValue.length() > 0)) {
                hashData.append(fieldName).append('=').append(URLEncoder.encode(fieldValue, StandardCharsets.US_ASCII.toString()));
                query.append(URLEncoder.encode(fieldName, StandardCharsets.US_ASCII.toString())).append('=').append(URLEncoder.encode(fieldValue, StandardCharsets.US_ASCII.toString()));
                if (itr.hasNext()) {
                    query.append('&');
                    hashData.append('&');
                }
            }
        }

        String queryUrl = query.toString();
        String vnp_SecureHash = VNPayConfig.hmacSHA512(VNPayConfig.VNP_HASH_SECRET, hashData.toString());
        queryUrl += "&vnp_SecureHash=" + vnp_SecureHash;

        return VNPayConfig.VNP_PAYURL + "?" + queryUrl;
    }
}

Tại tầng Frontend (Vue.js), trạng thái giỏ hàng và dữ liệu phân quyền người dùng được đóng gói trong Vue Store với cơ chế Reactive State:

// store/modules/cart.js - Vue 3 Pinia Store Pattern
import { defineStore } from 'pinia';
import apiClient from '@/api/axiosInstance';

export const useCartStore = defineStore('cart', {
  state: () => ({
    cartItems: [],
    loading: false
  }),
  getters: {
    totalItems: (state) => state.cartItems.reduce((acc, item) => acc + item.quantity, 0),
    totalPrice: (state) => state.cartItems.reduce((acc, item) => acc + (item.quantity * item.product.price), 0)
  },
  actions: {
    async addItemToCart(productId, quantity = 1) {
      this.loading = true;
      try {
        const response = await apiClient.post('/api/v1/cart/items', { productId, quantity });
        this.cartItems = response.data.items;
      } finally {
        this.loading = false;
      }
    }
  }
});

Testing và validation

Hệ thống trải qua quy trình kiểm thử toàn diện từ Unit Test, Integration Test đến Load Testing:

  1. Unit Testing: Viết hơn 120 test cases sử dụng JUnit 5Mockito trên Backend, đạt tỷ lệ Line Coverage là 84.5%.
  2. Performance Benchmarking: Kiểm thử tải bằng Apache JMeter giả lập 500 người dùng đồng thời (Concurrent Users):
    • Throughput: Đạt 420 Requests/Second (RPS) trên cấu hình máy chủ thử nghiệm tiêu chuẩn (4 vCPU, 8GB RAM).
    • Average Latency: 142ms đối với các API đọc danh mục và chi tiết sản phẩm.
    • Error Rate: 0.00% trong bài kiểm tra kiểm tra luồng đặt hàng và tính toán số lượng tồn kho (Concurreny Inventory Check).
Loại bài test Công cụ thực hiện Số lượng kịch bản Tỷ lệ thành công
API Functional Test Postman / Newman 85 endpoints 100% Passed
Backend Unit Test JUnit 5 + Mockito 124 test methods 100% Passed (84.5% Coverage)
Stress & Load Test Apache JMeter 5 kịch bản tải cao 0% Failed requests ở 500 CCU
UAT (User Acceptance) 35 người dùng thử nghiệm 15 luồng chức năng 94.2% hài lòng

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

  • Hoàn thiện 100% các chức năng cốt lõi theo đề cương phân tích thiết kế: 3 giao diện tác nhân riêng biệt, quy trình xét duyệt Seller minh bạch, hệ thống giỏ hàng và thanh toán VNPay hoàn chỉnh.
  • Cải thiện tốc độ tải trang ban đầu (First Contentful Paint) xuống còn 0.9 giây nhờ kỹ thuật Lazy Loading component trong Vue Router.
  • Dữ liệu tài chính và số lượng hàng hóa được bảo vệ toàn vẹn thông qua cơ chế Transaction Management (@Transactional isolation levels) của Spring Data JPA.

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

Các điểm cải tiến kỹ thuật nổi bật

  1. Cơ chế Phê duyệt Người bán (Seller Lifecycle Management): Không cho phép tự do mở bán tràn lan. Người dùng phải gửi hồ sơ xác thực và chờ Quản trị viên duyệt qua hệ sinh thái dashboard riêng biệt. Điều này giảm thiểu tối đa tình trạng gian lận và hàng giả so với các nền tảng mở không kiểm soát.
  2. Kiến trúc Decoupled tối ưu hóa băng thông: Thay vì sử dụng cơ chế Server-Side Rendering truyền thống (JSP/Thymeleaf) gây tốn tài nguyên máy chủ, hệ thống ứng dụng kiến trúc REST API chuẩn Stateless kết hợp JWT. Điều này giúp giảm 62% lưu lượng mạng truyền tải giữa máy khách và máy chủ.
  3. Cơ chế quản lý Flash Sale động: Cho phép người bán thiết lập khung giờ và tỷ lệ giảm giá trực tiếp. Hệ thống tự động chuyển đổi trạng thái hiển thị của sản phẩm khi số lượng tồn kho đạt mức 0 mà không cần can thiệp thủ công.
So sánh hiệu quả tải trang và tiêu thụ tài nguyên:
├── Monolith JSP/Thymeleaf : [████████████████████] 3.2s Load Time (100% CPU overhead)
└── E-Commerce YD (Vue+Spring): [█████               ] 0.9s Load Time (-71.8% latency)

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

Kịch bản ứng dụng

Nền tảng E-Commerce YD có khả năng ứng dụng thực tế ngay lập tức cho các mô hình:

  • Sàn thương mại điện tử chuyên ngành: Nông sản sạch, thời trang thiết kế, thiết bị điện tử gia dụng.
  • Hệ thống phân phối B2B/B2C nội bộ: Ứng dụng cho các chuỗi phân phối cần quản lý nhiều đại lý (mỗi đại lý là một Seller) với sự giám sát chặt chẽ từ Tổng công ty (Admin).

Chiến lược triển khai (Deployment Pipeline)

Quy trình tự động hóa triển khai (CI/CD) được thiết lập thông qua tệp cấu hình GitLab Pipeline và Dockerfile:

# Multi-stage build cho Spring Boot Backend
FROM maven:3.8.5-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=build /app/target/ecommerce-yd-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "app.jar"]
sequenceDiagram
    autonumber
    actor Dev as Developer
    participant Git as GitLab Repository
    participant Runner as GitLab CI Runner
    participant Docker as Docker Registry
    participant AWS as AWS EC2 Server

    Dev->>Git: Git Push (main branch)
    Git->>Runner: Trigger Pipeline
    Runner->>Runner: Run Unit Tests (Maven)
    Runner->>Docker: Build & Push Docker Images
    Runner->>AWS: SSH & Deploy (docker-compose pull & up)
    AWS-->>Dev: Deployment Success Notification

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

  • Chi phí bản quyền phần mềm: 0 VNĐ (Sử dụng 100% công nghệ mã nguồn mở: Java, Spring Boot, MySQL, Vue.js, Linux).
  • Chi phí hạ tầng: Dự toán ~45 USD/tháng cho cụm máy chủ AWS EC2 (t3.medium) và RDS MySQL (db.t3.small), đáp ứng tốt lưu lượng 30.000 lượt truy cập/tháng.
  • Thời gian thu hồi vốn (ROI): Dự kiến sau 6-8 tháng vận hành dựa trên mức thu phí hoa hồng giao dịch 2.5% trên mỗi đơn hàng thành công của các gian hàng.

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

Hạn chế kỹ thuật hiện tại

  • Cơ sở dữ liệu đang vận hành trên một cụm MySQL đơn lẻ, chưa thiết lập kiến trúc Read/Write Replicas (Master-Slave) để phân tải triệt để cho các truy vấn báo cáo nặng.
  • Chức năng tìm kiếm sản phẩm đang sử dụng truy vấn LIKE %...% cơ bản của SQL, chưa tối ưu hiệu năng đối với kho dữ liệu hàng triệu bản ghi.
  • Module Chat đang lưu trữ trực tiếp vào RDBMS thay vì sử dụng kiến trúc Message Broker chuyên dụng.

Hướng nâng cấp tương lai

  1. Tích hợp Elasticsearch: Thay thế công cụ tìm kiếm SQL bằng cụm Elasticsearch cluster để hỗ trợ Full-Text Search, gợi ý từ khóa (Autocomplete) và lọc đa tiêu chí với độ trễ dưới 20ms.
  2. Áp dụng Redis Caching: Lưu trữ tạm thời giỏ hàng, thông tin session người dùng và danh mục sản phẩm hot trên bộ nhớ đệm In-Memory Redis để giảm tải 70% truy vấn trực tiếp vào MySQL.
  3. Chuyển dịch sang kiến trúc Microservices: Tách rời Product Service, Order Service, Notification Service thành các dịch vụ độc lập kết nối qua Apache Kafka hoặc RabbitMQ khi lưu lượng người dùng vượt ngưỡng 100.000 CCU.

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

mindmap
  root((Hệ Sinh Thái E-Commerce YD))
    Sinh viên & Giảng viên
      Tham khảo đồ án chuẩn UML
      Học cấu trúc Spring Boot + Vue 3
      Tài liệu thực hành CI/CD & Docker
    Lập trình viên
      Mẫu tích hợp cổng VNPay chuẩn
      Thiết kế RESTful API an toàn với JWT
      Xử lý State Management với Pinia
    Doanh nghiệp & Hộ kinh doanh
      Nền tảng Multi-vendor không mất phí bản quyền
      Bảng điều khiển trực quan theo dõi doanh thu
      Bảo mật dữ liệu giao dịch tài chính
  • Sinh viên ngành Công nghệ Thông tin: Tiếp cận đồ án mẫu chuẩn mực từ phân tích yêu cầu (UML Use Case, Sequence, Activity), thiết kế cơ sở dữ liệu quan hệ đến triển khai thực tế.
  • Lập trình viên Fullstack: Nắm bắt kiến trúc tích hợp giữa Spring Boot và Vue.js, quy trình bảo mật với JWT, mã nguồn chuẩn cho thuật toán ký số VNPay HMAC-SHA512.
  • Doanh nghiệp bán lẻ: Sở hữu giải pháp nền tảng độc lập, giảm 100% chi phí bản quyền phần mềm định kỳ, toàn quyền làm chủ dữ liệu khách hàng.

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

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

Để triển khai hệ thống trong môi trường sản xuất (Production), cấu hình tối thiểu khuyến nghị gồm: Máy chủ chạy hệ điều hành Ubuntu Server 20.04/22.04 LTS, CPU 2 Core, RAM 4GB, Ổ cứng SSD 40GB. Cần cài đặt sẵn Docker Engine 20.10+ và Docker Compose v2+.

2. Hệ thống xử lý thế nào khi có xung đột tồn kho trong sự kiện Flash Sale?

Tại tầng Backend, Service xử lý đặt hàng áp dụng cơ chế khóa bi quan (Pessimistic Locking) hoặc khóa lạc quan (Optimistic Locking qua trường @Version trong JPA Entity) kết hợp mức cô lập giao dịch @Transactional(isolation = Isolation.READ_COMMITTED). Điều này ngăn chặn triệt để hiện tượng Race Condition khi nhiều khách hàng cùng thanh toán sản phẩm cuối cùng.

3. Làm thế nào để đảm bảo tính an toàn cho giao dịch khi nhận Callback từ VNPay?

Hệ thống không chỉ dựa vào phản hồi chuyển hướng trên trình duyệt của người dùng (Return URL), mà còn triển khai Endpoint nhận tín hiệu ngầm (IPN - Instant Payment Notification) từ server VNPay. Khi nhận dữ liệu, hệ thống tự động tái tạo chuỗi băm từ các tham số nhận được và so khớp với vnp_SecureHash. Chỉ khi mã băm khớp và số tiền giao dịch chính xác với đơn hàng thì trạng thái đơn mới được chuyển sang PAID.

4. Hệ thống phân quyền hoạt động như thế nào giữa các vai trò khác nhau?

Hệ thống sử dụng cơ chế Phân quyền dựa trên vai trò (RBAC) thông qua Spring Security. Mỗi request đến backend bắt buộc mang theo token JWT tại header Authorization: Bearer <token>. Lớp JwtAuthenticationFilter giải mã token, trích xuất danh sách Claims/Roles (ROLE_CUSTOMER, ROLE_SELLER, ROLE_ADMIN) và nạp vào SecurityContextHolder. Các API được bảo vệ nghiêm ngặt bằng annotation @PreAuthorize("hasRole('ADMIN')").

5. Chi phí duy trì và khả năng mở rộng hệ thống trong dài hạn ra sao?

Nhờ kiến trúc module hóa đóng gói trong Docker, việc mở rộng có thể thực hiện theo chiều dọc (Vertical Scaling bằng cách tăng tài nguyên phần cứng server) hoặc theo chiều ngang (Horizontal Scaling bằng cách thêm các instance backend chạy song song phía sau bộ cân bằng tải Nginx Load Balancer). Chi phí bảo trì hàng tháng duy trì ở mức tối thiểu từ 30 - 50 USD cho máy chủ đám mây.


Kết luận

Đồ án tốt nghiệp "Xây dựng website E-Commerce YD" của sinh viên Phạm Huy Phong (Trường Đại học Điện Lực) là một công trình nghiên cứu ứng dụng toàn diện, kết hợp thành công các công nghệ phát triển phần mềm hiện đại: Java Spring Boot, Vue.js, MySQL, Docker và cổng thanh toán VNPAY.

Dự án không chỉ giải quyết trọn vẹn bài toán thương mại điện tử đa người bán với quy trình xét duyệt và quản trị chuyên nghiệp, mà còn cung cấp tài liệu kỹ thuật, sơ đồ UML và mã nguồn mẫu có giá trị ứng dụng cao cho cộng đồng học thuật và doanh nghiệp. Nền tảng sở hữu nền móng kiến trúc vững chắc, sẵn sàng tích hợp các công nghệ dữ liệu lớn và trí tuệ nhân tạo trong các giai đoạn phát triển tiếp theo.