Giới thiệu dự án

Thị trường thương mại điện tử (E-commerce) tại Việt Nam và khu vực Đông Nam Á đang chứng kiến tốc độ tăng trưởng kép hàng năm (CAGR) đạt trên 18.5%, trong đó phân khúc bán lẻ thiết bị điện tử, laptop và điện thoại thông minh chiếm tỷ trọng giao dịch trực tuyến cao hàng đầu. Tuy nhiên, các hệ thống bán lẻ công nghệ đặc thù đòi hỏi khả năng xử lý dữ liệu phức tạp: một dòng laptop hay smartphone thường phân tách thành hàng chục biến thể (SKU) khác nhau dựa trên RAM, ổ cứng SSD, card đồ họa, màu sắc và cấu hình vi xử lý.

                  +-----------------------------------+
                  |   Client Layer: ReactJS 18.x      |
                  |  (Redux Toolkit, Material UI v5)  |
                  +-----------------+-----------------+
                                    | HTTPS / REST / WSS
                                    v
+-------------------------------------------------------------------+
|               API Gateway / ASP.NET Core 8.0 Web API              |
+-----------------------------------+-------------------------------+
| Application Layer (MediatR, CQRS) | Domain Entities & Logic       |
+-----------------------------------+-------------------------------+
| Infrastructure: EF Core 8.0, JWT, Stripe SDK, SignalR, Algolia    |
+-----------------+-----------------+---------------+---------------+
                  |                                 |
                  v                                 v
        +-------------------+             +-------------------+
        | PostgreSQL 16 DB  |             | Algolia Cloud     |
        +-------------------+             +-------------------+

Hầu hết các hệ thống phân phối vừa và nhỏ hiện nay vẫn gặp phải các "điểm nghẽn" (pain points) lớn:

  • Khớp nối chặt (Tight Coupling): Kiến trúc phân lớp truyền thống gây khó khăn trong việc mở rộng, bảo trì và kiểm thử tự động.
  • Tìm kiếm và lọc đa thuộc tính chậm: Tốc độ truy vấn cơ sở dữ liệu quan hệ truyền thống bị suy giảm nghiêm trọng khi thực hiện lọc đồng thời nhiều tiêu chí cấu hình trên tập dữ liệu lớn.
  • Thiếu tính năng tương tác thời gian thực: Trạng thái đơn hàng và cập nhật tồn kho không được đồng bộ hóa tức thì đến quản trị viên và khách hàng.

Đề tài "Xây dựng website bán laptop và điện thoại" do sinh viên Trần Mạnh Cường và Vy Minh Khánh Hoa thực hiện dưới sự hướng dẫn của PGS. Hoàng Văn Dũng tại Khoa Công nghệ Thông tin – Trường Đại học Sư phạm Kỹ thuật TP.HCM (07/2024) được phát triển nhằm giải quyết triệt để các bài toán kỹ thuật trên.

Mục tiêu dự án

  1. Kiến trúc hệ thống chuẩn mực: Ứng dụng triệt để mô hình Clean Architecture phân tách 4 tầng độc lập, bảo đảm nguyên lý Dependency Inversion và hỗ trợ Unit Test toàn diện.
  2. Xây dựng Back-end hiệu năng cao: Triển khai hệ thống Web API RESTful trên nền tảng ASP.NET Core 8.0, kết hợp Entity Framework Core 8.0 và cơ sở dữ liệu quan hệ PostgreSQL 16.
  3. Tối ưu hóa trải nghiệm tìm kiếm: Tích hợp công cụ tìm kiếm điện toán đám mây Algolia Search, mang lại khả năng tìm kiếm thời gian thực (Instant Search) và lọc đa chiều với độ trễ phản hồi dưới 50ms.
  4. Xây dựng Front-end hiện đại: Phát triển Single Page Application (SPA) bằng ReactJS 18, quản lý trạng thái tập trung với Redux Toolkit và giao diện chuẩn Google Material Design thông qua Material UI (MUI v5).
  5. Tích hợp thanh toán và thời gian thực: Nhúng cổng thanh toán quốc tế Stripe bảo mật cao, kết hợp SignalR Core truyền nhận thông báo trạng thái đơn hàng thời gian thực (Real-time Notification) và tự động gửi hóa đơn qua email.

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

  • Phạm vi: Nghiệp vụ e-commerce chuyên sâu cho ngành hàng điện thoại và laptop, bao gồm: xác thực đa tầng (JWT Auth), quản lý danh mục phân cấp, ma trận thuộc tính và biến thể sản phẩm động, giỏ hàng session/database, quy trình checkout đa phương thức (COD và Credit Card qua Stripe), đánh giá sản phẩm có điều kiện mua hàng, dashboard quản trị và thống kê doanh thu.
  • Giới hạn: Tích hợp thanh toán sandbox Stripe phục vụ mô phỏng môi trường thực tế; chưa liên kết API với các đơn vị vận chuyển bên thứ ba (3PL) nội địa.

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 nền tảng thương mại điện tử chuyên ngành công nghệ hàng đầu tại Việt Nam như FPT Shop và Phong Vũ chỉ ra những ưu thế và lỗ hổng cần tối ưu:

Tiêu chí so sánh FPT Shop Phong Vũ Hệ thống đề tài đề xuất
Kiến trúc xây dựng Monolith / Microservices hỗn hợp Nền tảng thương mại điện tử phân tán Clean Architecture (Onion Pattern)
Công nghệ Core .NET / ReactJS Node.js / ReactJS ASP.NET Core 8 + ReactJS + PostgreSQL
Cơ chế tìm kiếm SQL Query / Elasticsearch nội bộ Elasticsearch / Lucene engine Algolia Cloud Instant Search Engine
Cấu trúc biến thể Bảng biến thể cố định Biến thể kết hợp bán động EAV-Hybrid Schema (Linh hoạt 100%)
Cập nhật đơn hàng Polling / Refresh trang Polling / Email notification SignalR WebSockets thời gian thực
Giao diện & Tiện ích Khá nhiều banner, không Dark Mode Đầy đủ bộ lọc, thiếu Dark Mode Material UI tối giản, chuẩn Responsive

Bảng phân loại yêu cầu người dùng theo mô hình MoSCoW

Phân loại Danh sách tính năng kỹ thuật
Must have (Bắt buộc) Đăng ký/đăng nhập xác thực email, quản lý sản phẩm đa biến thể, giỏ hàng, đặt hàng thanh toán COD/Stripe, phân quyền RBAC (Admin/Customer), bảo mật JWT.
Should have (Nên có) Tìm kiếm tức thì với Algolia, lọc đa tiêu chí (giá, thương hiệu, màu sắc, RAM, ROM), thông báo đẩy thời gian thực qua SignalR Hub, gửi hóa đơn email tự động.
Could have (Có thể có) Lịch sử trạng thái đơn hàng chi tiết (OrderStatusHistoryTracking), đánh giá sao và bình luận sản phẩm, quản lý banner khuyến mãi.
Won't have (Chưa làm đợt này) Tích hợp cổng thanh toán nội địa (VNPAY/MoMo), tính phí vận chuyển theo tọa độ GIS thời gian thực.

Thiết kế hệ thống

Hệ thống được thiết kế hoàn toàn theo mô hình Clean Architecture, phân tách trách nhiệm (Separation of Concerns) rõ ràng thành 4 tầng:

  1. Domain Layer: Chứa các thực thể cốt lõi (Product, Variant, Order, Customer), Enums, Domain Exceptions và Value Objects. Không phụ thuộc vào bất kỳ thư viện hay framework bên ngoài nào.
  2. Application Layer: Chứa Business Logic, DTOs, CQRS Command/Query Handlers, Service Interfaces, Validation (FluentValidation) và AutoMapper Profiles.
  3. Infrastructure Layer: Chứa cấu hình Data Access (ApplicationDbContext, EF Core Migrations), thực thi Repository Pattern, cấu hình tích hợp Algolia Search Client, Stripe Payment Service, MailKit SMTP và SignalR Hubs.
  4. Presentation/Web API Layer: ASP.NET Core Web API Controllers, Middlewares (Global Exception Handling, JWT Authentication Middleware, CORS Configuration), Swagger/OpenAPI Documentation.

Danh mục công nghệ và phiên bản chuẩn hóa

- Backend Framework: ASP.NET Core Web API (.NET 8.0 LTS)
- ORM: Entity Framework Core 8.0.x (Npgsql.EntityFrameworkCore.PostgreSQL)
- Database: PostgreSQL 16.2
- Frontend SPA: ReactJS 18.2.0
- State Management: Redux Toolkit 2.2.x (@reduxjs/toolkit & react-redux)
- UI Component Framework: Material UI (MUI) v5.15.x & Emotion CSS
- Real-time Engine: Microsoft ASP.NET Core SignalR Client
- Search Engine: Algolia Search API Client v6.x
- Payment Gateway: Stripe.net SDK v43.x & Stripe React Elements
- Authentication: System.IdentityModel.Tokens.Jwt (JWT Bearer Auth)
- Containerization: Docker Engine 25.x & Docker Compose

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

Hệ thống triển khai 17 bảng quan hệ được chuẩn hóa ở mức 3NF, đáp ứng trọn vẹn các ràng buộc toàn vẹn dữ liệu (ACID) trên PostgreSQL:

-- Schema trích xuất: Bảng Product, Attribute, AttributeValue và Variant
CREATE TABLE "Product" (
    "Id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    "Name" VARCHAR(255) NOT NULL,
    "ShortDescription" TEXT,
    "Description" TEXT,
    "Price" DECIMAL(18, 2) NOT NULL,
    "StockQuantity" INT NOT NULL DEFAULT 0,
    "IsPublished" BOOLEAN NOT NULL DEFAULT true,
    "AverageRating_Value" DOUBLE PRECISION DEFAULT 0.0,
    "AverageRating_NumRatings" INT DEFAULT 0,
    "HasVariant" BOOLEAN NOT NULL DEFAULT false,
    "Deleted" BOOLEAN NOT NULL DEFAULT false,
    "BrandId" UUID REFERENCES "Brand"("Id") ON DELETE RESTRICT,
    "CategoryId" UUID REFERENCES "Category"("Id") ON DELETE RESTRICT,
    "DiscountId" UUID REFERENCES "Discount"("Id") ON DELETE SET NULL,
    "CreateDateTime" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    "UpdateDateTime" TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE "Attribute" (
    "Id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    "Name" VARCHAR(100) NOT NULL,
    "Alias" VARCHAR(50),
    "CanCombine" BOOLEAN NOT NULL DEFAULT true,
    "ProductId" UUID NOT NULL REFERENCES "Product"("Id") ON DELETE CASCADE
);

CREATE TABLE "AttributeValue" (
    "Id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    "Name" VARCHAR(100) NOT NULL,
    "Color" VARCHAR(30),
    "PriceAdjustment" DECIMAL(18, 2) DEFAULT 0.0,
    "AttributeId" UUID NOT NULL REFERENCES "Attribute"("Id") ON DELETE CASCADE
);

CREATE TABLE "Variant" (
    "Id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    "Price" DECIMAL(18, 2) NOT NULL,
    "IsActive" BOOLEAN NOT NULL DEFAULT true,
    "AssignedImages" TEXT,
    "AttributeSelection" TEXT NOT NULL, -- Serialized JSON: [{"AttributeId":"...","ValueId":"..."}]
    "AverageRating_Value" DECIMAL(3, 2) DEFAULT 0.0,
    "AverageRating_NumRatings" INT DEFAULT 0,
    "ProductId" UUID NOT NULL REFERENCES "Product"("Id") ON DELETE CASCADE
);

Thiết kế Restful API và bảo mật

  • Xác thực và phân quyền: Sử dụng JSON Web Token (JWT). Khi người dùng đăng nhập thành công qua /api/auth/login, API trả về Bearer Token chứa các Claims (CustomerId, Email, Role). Các route quản trị được bảo vệ nghiêm ngặt bằng policy [Authorize(Roles = "Admin")].
  • Mã hóa dữ liệu: Mật khẩu người dùng được băm an toàn qua thuật toán BCrypt trước khi lưu trữ vào bảng Account.
  • API Endpoints tiêu biểu:
POST   /api/v1/auth/register               - Đăng ký tài khoản 2 bước
POST   /api/v1/auth/login                  - Xác thực và cấp phát JWT
GET    /api/v1/products                    - Danh sách sản phẩm phân trang
GET    /api/v1/products/{id}               - Chi tiết sản phẩm & biến thể
POST   /api/v1/products                    - Tạo mới sản phẩm & cấu hình thuộc tính [Admin]
POST   /api/v1/cart/items                  - Thêm item vào giỏ hàng
POST   /api/v1/orders                      - Khởi tạo đơn hàng (Checkout)
POST   /api/v1/orders/checkout-stripe      - Tạo PaymentIntent với Stripe API
PUT    /api/v1/orders/{id}/confirm         - Quản trị viên duyệt đơn [Admin]
POST   /api/v1/reviews                     - Đánh giá sản phẩm đã mua

Methodology

Dự án áp dụng phương pháp phát triển phần mềm theo mô hình lặp Agile/Scrum rút gọn, kéo dài từ ngày 04/03/2024 đến 15/06/2024.

04/03 - 24/03/2024      25/03 - 21/04/2024      22/04 - 19/05/2024      20/05 - 15/06/2024
+-------------------+   +-------------------+   +-------------------+   +-------------------+
|  Sprint 1 & 2:    |   |  Sprint 3 & 4:    |   |  Sprint 5 & 6:    |   |  Sprint 7 & 8:    |
| - Nghiên cứu      |-->| - Clean Arch API  |-->| - Front-end UI    |-->| - Kiểm thử E2E    |
| - Khảo sát        |   | - EF Core & DB    |   | - Algolia Search  |   | - Fix bug & Perf  |
| - Thiết kế Schema |   | - JWT Auth & CRUD |   | - Stripe & SignalR|   | - Đóng gói Docker |
+-------------------+   +-------------------+   +-------------------+   +-------------------+

Ma trận rủi ro và chiến lược giảm thiểu rủi ro (Risk Mitigation)

  1. Rủi ro sai lệch dữ liệu đồng thời (Concurrency Conflicts) khi đặt hàng:
    • Giải pháp: Sử dụng Transaction Isolation Level kết hợp Database Locks trên PostgreSQL trong quá trình trừ tồn kho (StockQuantity).
  2. Rủi ro suy giảm hiệu năng khi đồng bộ dữ liệu lên Algolia Cloud:
    • Giải pháp: Áp dụng cơ chế đồng bộ nền bất đồng bộ (Asynchronous Background Service) thông qua Entity Framework Interceptors / Domain Event Handlers.
  3. Rủi ro lộ Token hoặc dữ liệu nhạy cảm:
    • Giải pháp: Lưu trữ API Keys trong appsettings.json bảo vệ qua User Secrets / Environment Variables; truyền tải toàn bộ qua giao thức HTTPS.

Implementation và kết quả

Development Process

Quá trình hiện thực hóa giải pháp được tổ chức theo các khối chức năng chuyên biệt, tuân thủ nguyên tắc Clean Code và SOLID.

1. Xử lý Logic tạo Biến thể Sản phẩm Động (Backend - C#)

Logic quản lý sản phẩm điện thoại/laptop cho phép Admin tạo các thuộc tính động (như Màu sắc, Bộ nhớ RAM, Ổ cứng SSD) và kết hợp chúng thành các bản ghi Variant có giá tiền độc lập:

public class CreateProductVariantCommandHandler : IRequestHandler<CreateProductVariantCommand, Result<Guid>>
{
    private readonly IApplicationDbContext _context;

    public CreateProductVariantCommandHandler(IApplicationDbContext context)
    {
        _context = context;
    }

    public async Task<Result<Guid>> Handle(CreateProductVariantCommand request, CancellationToken cancellationToken)
    {
        var product = await _context.Products
            .Include(p => p.Variants)
            .FirstOrDefaultAsync(p => p.Id == request.ProductId, cancellationToken);

        if (product == null)
            return Result.Failure<Guid>(DomainErrors.Product.NotFound);

        // Serialize lựa chọn thuộc tính thành định dạng JSON chuẩn
        string attributeJson = JsonSerializer.Serialize(request.SelectedAttributes);

        // Kiểm tra biến thể đã tồn tại hay chưa
        bool variantExists = product.Variants.Any(v => v.AttributeSelection == attributeJson && !v.IsActive == false);
        if (variantExists)
            return Result.Failure<Guid>(DomainErrors.Variant.AlreadyExists);

        var variant = new Variant
        {
            Id = Guid.NewGuid(),
            ProductId = product.Id,
            Price = request.Price,
            IsActive = true,
            AssignedImages = request.AssignedImages,
            AttributeSelection = attributeJson,
            AverageRating_Value = 0,
            AverageRating_NumRatings = 0
        };

        product.HasVariant = true;
        _context.Variants.Add(variant);
        await _context.SaveChangesAsync(cancellationToken);

        return Result.Success(variant.Id);
    }
}

2. Tích hợp Tìm kiếm Nâng cao qua Algolia Search Service

public class AlgoliaSearchService : ISearchService
{
    private readonly SearchIndex _productIndex;

    public AlgoliaSearchService(SearchClient client, IConfiguration config)
    {
        _productIndex = client.InitIndex(config["Algolia:ProductIndexName"]);
    }

    public async Task SyncProductToIndexAsync(Product product)
    {
        var record = new ProductSearchRecord
        {
            ObjectID = product.Id.ToString(),
            Name = product.Name,
            ShortDescription = product.ShortDescription,
            Price = (double)product.Price,
            BrandName = product.Brand?.Name,
            CategoryName = product.Category?.Name,
            AverageRating = product.AverageRating_Value,
            StockQuantity = product.StockQuantity
        };

        await _productIndex.SaveObjectAsync(record);
    }
}

3. Quản lý Trạng thái Giỏ hàng & Đồng bộ Biến thể (Frontend - Redux Toolkit)

import { createSlice, PayloadAction } from '@reduxjs/toolkit';

interface CartItemState {
  productId: string;
  variantId?: string;
  name: string;
  unitPrice: number;
  quantity: number;
  attributes?: string;
  imageUrl: string;
}

interface CartState {
  items: CartItemState[];
  totalAmount: number;
}

const initialState: CartState = {
  items: [],
  totalAmount: 0,
};

export const cartSlice = createSlice({
  name: 'cart',
  initialState,
  reducers: {
    addToCart: (state, action: PayloadAction<CartItemState>) => {
      const existingIndex = state.items.findIndex(
        (i) => i.productId === action.payload.productId && i.variantId === action.payload.variantId
      );
      if (existingIndex > -1) {
        state.items[existingIndex].quantity += action.payload.quantity;
      } else {
        state.items.push(action.payload);
      }
      state.totalAmount = state.items.reduce((acc, item) => acc + item.unitPrice * item.quantity, 0);
    },
    removeFromCart: (state, action: PayloadAction<{ productId: string; variantId?: string }>) => {
      state.items = state.items.filter(
        (i) => !(i.productId === action.payload.productId && i.variantId === action.payload.variantId)
      );
      state.totalAmount = state.items.reduce((acc, item) => acc + item.unitPrice * item.quantity, 0);
    }
  },
});

export const { addToCart, removeFromCart } = cartSlice.actions;
export default cartSlice.reducer;

Testing và validation

Quá trình kiểm thử được triển khai toàn diện bao gồm: Kiểm thử đơn vị (Unit Testing) với xUnit và Moq, Kiểm thử tích hợp API (Integration Testing) với WebApplicationFactory, và Kiểm thử chấp nhận người dùng (User Acceptance Testing - UAT).

Bảng tổng hợp kết quả kiểm thử chức năng (UAT & Black-box Test)

Nhóm chức năng kiểm thử Số kịch bản (Test Cases) Tỷ lệ đạt (Pass Rate) Độ trễ phản hồi TB Đánh giá
Xác thực (Đăng ký, Đăng nhập, JWT) 12 100% (12/12) 85ms Đạt chuẩn an toàn
Tìm kiếm & Bộ lọc Algolia 16 100% (16/16) 32ms Tốc độ tức thì (Instant)
Quản lý Giỏ hàng & Biến thể 18 100% (18/18) 45ms Chính xác 100% đơn giá
Checkout & Thanh toán Stripe API 15 100% (15/15) 310ms (qua cổng Stripe) Giao dịch chính xác
Quản trị CRUD Sản phẩm & Đơn hàng 24 100% (24/24) 90ms Cập nhật Real-time qua SignalR
Đánh giá & Review sản phẩm 10 100% (10/10) 65ms Chặn spam người chưa mua

Benchmark hiệu năng hệ thống

  • Search Query Latency: Giảm từ 385ms (Truy vấn ILIKE SQL thông thường trên PostgreSQL) xuống còn 28ms - 35ms khi chuyển giao qua Algolia Engine (Tăng tốc độ tìm kiếm ~91.6%).
  • API Throughput: Đạt mức chịu tải 1,250 requests/second với tỷ lệ lỗi < 0.01% trong bài kiểm thử tải mô phỏng với công cụ k6/JMeter.
  • Code Coverage: Bộ kiểm thử đơn vị tầng Application & Domain đạt mức độ bao phủ (Coverage) 86.4%.

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

Đối chiếu với các mục tiêu đề ra ban đầu tại đề cương khóa luận:

Mục tiêu ban đầu Kết quả hiện thực Tỷ lệ hoàn thành
Triển khai Clean Architecture trên ASP.NET Core 8 Phân tách 4 lớp chuẩn mực, áp dụng Repository & CQRS pattern 100%
Cơ sở dữ liệu PostgreSQL chuẩn hóa 17 bảng liên kết chặt chẽ, tối ưu Index các trường khóa chính/ngoại 100%
Giao diện ReactJS + Redux Toolkit + MUI Single Page App mượt mà, thân thiện thiết bị di động (Responsive) 100%
Tích hợp Algolia Search đa chiều Tìm kiếm Instant Search theo keyword, brand, price, rating 100%
Thanh toán trực tuyến Stripe & Real-time SignalR Tích hợp Stripe Elements an toàn, thông báo tức thì đến Client/Admin 100%

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

  1. Mô hình Dữ liệu Biến thể Lai (Hybrid-EAV Variant Model): Khắc phục nhược điểm của mô hình Entity-Attribute-Value thuần túy (vốn gây chậm truy vấn do JOIN nhiều bảng). Đề tài kết hợp quan hệ Product - Attribute - AttributeValue và tuần tự hóa trạng thái biến thể AttributeSelection dưới dạng chuỗi JSON có lập chỉ mục, giúp tốc độ đọc thông tin biến thể nhanh gấp 3 lần.
  2. Kiến trúc Tìm kiếm Bất đồng bộ Đám mây (Decoupled Cloud Search): Tách tải tìm kiếm văn bản phức tạp khỏi cơ sở dữ liệu quan hệ chính thông qua việc tự động đồng bộ sang Algolia Cloud, giữ cho cơ sở dữ liệu giao dịch PostgreSQL luôn hoạt động ở trạng thái tối ưu nhất.
  3. Luồng Tương tác Trạng thái Đơn hàng Kép (Dual Real-time Notification Pipeline): Kết hợp WebSockets qua SignalR cho người dùng đang mở ứng dụng, đồng thời kích hoạt tác vụ gửi email hóa đơn chi tiết nền (Background SMTP Worker), mang lại trải nghiệm chuẩn doanh nghiệp.

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

Kịch bản ứng dụng thực tế

Hệ thống hoàn toàn sẵn sàng ứng dụng cho các chuỗi cửa hàng bán lẻ thiết bị công nghệ, đại lý phân phối laptop - điện thoại thông minh quy mô vừa và lớn với lượng sản phẩm lên đến hàng chục nghìn mã hàng.

                  +-----------------------------------+
                  |         Docker Container          |
                  |     (ASP.NET Core Web API 8)      |
                  +-----------------+-----------------+
                                    |
            +-----------------------+-----------------------+
            |                                               |
            v                                               v
+-----------------------+                       +-----------------------+
|  Managed PostgreSQL   |                       |   Algolia & Stripe    |
|   Database Instance   |                       |     Cloud Engines     |
+-----------------------+                       +-----------------------+

Chiến lược triển khai hạ tầng (Deployment Strategy)

  • Đóng gói toàn bộ ứng dụng Backend và Database bằng Docker Container (Multi-stage build tối ưu kích thước image < 150MB).
  • Triển khai máy chủ Linux (Ubuntu Server) đứng sau Reverse Proxy Nginx, hỗ trợ SSL/TLS Let's Encrypt và cấu hình HTTP/2.
  • Frontend ReactJS được build tối ưu tĩnh (Static Bundle) phân phối qua CDN hoặc Nginx Web Server.

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

  • Tiết kiệm chi phí bản quyền: Sử dụng 100% công nghệ mã nguồn mở (Linux, .NET Core, PostgreSQL, ReactJS) giúp doanh nghiệp giảm 100% chi phí bản quyền hệ điều hành máy chủ và CSDL thương mại.
  • Tối ưu chi phí vận hành: Việc triển khai trên Docker giúp tận dụng tối đa tài nguyên phần cứng (Resource Utilization), giảm 40% chi phí thuê máy chủ đám mây hàng tháng.

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

Hạn chế kỹ thuật

  • Cổng thanh toán quốc tế Stripe chưa tối ưu cho các phương thức quét mã QR nội địa phổ biến tại Việt Nam (như VietQR, MoMo, ZaloPay).
  • Chưa tích hợp cơ chế quản lý đa kho hàng (Multi-warehouse Inventory) theo vị trí địa lý của từng chi nhánh.

Hướng phát triển tương lai

  1. Tích hợp Hệ thống Đề xuất AI (Recommendation System): Ứng dụng thuật toán Collaborative Filtering và Deep Learning gợi ý phụ kiện (chuột, bàn phím, ốp lưng, tai nghe) tương thích với dòng laptop/điện thoại khách đang xem.
  2. Cơ chế Caching Phân tán với Redis: Bổ sung tầng Redis Cache cho các truy vấn sản phẩm trang chủ và cấu hình danh mục tĩnh để giảm thiểu tối đa I/O đọc trên PostgreSQL.
  3. Kiến trúc Microservices: Tách nhỏ module Quản lý kho (Inventory Service) và Xử lý Đơn hàng (Order Processing Service) khi quy mô giao dịch vượt mốc 50,000 đơn hàng/ngày.

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

+-----------------------------------------------------------------------------+
|                            ĐỐI TƯỢNG HƯỞNG LỢI                              |
+----------------------+----------------------+-------------------------------+
|   Sinh viên / GV     |   Lập trình viên     |    Doanh nghiệp bán lẻ        |
| - Tài liệu tham khảo | - Source code mẫu    | - Sở hữu nền tảng e-commerce  |
|   chuẩn Clean Arch   | - Kiến trúc React +  |   hoàn chỉnh, tối ưu chi phí  |
| - Mẫu khóa luận đạt  |   ASP.NET Core chuẩn |   vận hành, mở rộng linh hoạt |
|   điểm xuất sắc      | - Tích hợp Algolia   | - Tăng tỷ lệ chuyển đổi đơn   |
+----------------------+----------------------+-------------------------------+
  • Sinh viên & Giảng viên Công nghệ Thông tin: Nguồn tài liệu tham khảo thực tế về việc áp dụng Clean Architecture, CQRS và các công nghệ web hiện đại vào đồ án tốt nghiệp chuẩn mực.
  • Lập trình viên (Developers): Cung cấp giải pháp mẫu chi tiết về cách thiết kế cơ sở dữ liệu cho sản phẩm đa biến thể và phương pháp tích hợp cổng thanh toán quốc tế Stripe + Instant Search Algolia.
  • Doanh nghiệp & Cửa hàng kinh doanh: Một giải pháp phần mềm hoàn chỉnh, sẵn sàng triển khai thực tế giúp tự động hóa quy trình bán hàng và quản lý đơn hàng chuyên nghiệp.

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ì?

Để triển khai hệ thống trong môi trường Production, máy chủ cần đáp ứng cấu hình tối thiểu: CPU 2 Cores, 4GB RAM, 40GB SSD lưu trữ, hệ điều hành Linux (Ubuntu 22.04 LTS/Debian 12) hoặc Windows Server, cài đặt sẵn Docker 24.x+ và Docker Compose.

2. Hệ thống xử lý khả năng mở rộng (Scalability) như thế nào khi lượng truy cập tăng cao?

Nhờ kiến trúc Stateless của ASP.NET Core Web API kết hợp xác thực qua JWT, hệ thống có thể mở rộng theo chiều ngang (Horizontal Scaling) bằng cách nhân bản nhiều Container Web API phía sau Load Balancer (Nginx/HAProxy). Cơ sở dữ liệu PostgreSQL có thể thiết lập cấu hình Master-Slave (Read Replicas) để chia tải đọc.

3. Làm thế nào để tích hợp thêm các cổng thanh toán nội địa như MoMo hay VNPAY?

Hệ thống sử dụng mẫu thiết kế Factory Pattern và Interface IPaymentService trong tầng Application. Lập trình viên chỉ cần tạo thêm lớp thực thi VnPayPaymentService hoặc MomoPaymentService kế thừa interface trên mà không cần can thiệp hay sửa đổi logic xử lý đơn hàng cốt lõi.

4. Chi phí duy trì dịch vụ tìm kiếm Algolia là bao nhiêu?

Algolia cung cấp gói miễn phí (Free Tier) với 10,000 lượt tìm kiếm/tháng và 10,000 bản ghi dữ liệu, rất phù hợp cho giai đoạn thử nghiệm và cửa hàng nhỏ. Khi mở rộng quy mô, doanh nghiệp có thể nâng cấp gói Pay-as-you-go hoặc chuyển đổi linh hoạt sang cụm Elasticsearch tự lưu trữ (Self-hosted).

5. Khả năng bảo mật thông tin thẻ ngân hàng của khách hàng được đảm bảo ra sao?

Hệ thống sử dụng giải pháp Stripe Elements kết hợp Tokenization: toàn bộ thông tin nhạy cảm của thẻ tín dụng được gửi trực tiếp từ trình duyệt của khách hàng đến máy chủ đạt chuẩn PCI-DSS của Stripe. Máy chủ backend của website hoàn toàn không lưu trữ số thẻ tín dụng, bảo đảm an toàn tuyệt đối trước các nguy cơ tấn công dữ liệu.


Kết luận

Khóa luận tốt nghiệp "Xây dựng website bán laptop và điện thoại" của nhóm tác giả Trần Mạnh Cường và Vy Minh Khánh Hoa (Khoa CNTT - HCMUTE) đã giải quyết trọn vẹn bài toán xây dựng nền tảng thương mại điện tử hiện đại cho ngành hàng công nghệ. Bằng việc kết hợp sức mạnh kiến trúc của Clean Architecture, nền tảng ASP.NET Core 8.0, PostgreSQL 16 cùng trải nghiệm mượt mà từ ReactJS, Redux Toolkit, Algolia SearchStripe, đề tài không chỉ đạt được tính đúng đắn về mặt lý thuyết khoa học máy tính mà còn có tính ứng dụng thương mại rất cao. Đây là một tài liệu kỹ thuật và giải pháp phần mềm mẫu mực, đóng góp giá trị thiết thực cho cộng đồng lập trình viên và các doanh nghiệp bán lẻ trong kỷ nguyên số.