Giới thiệu dự án

Sự bùng nổ của cuộc Cách mạng Công nghiệp 4.0 đã thúc đẩy mạnh mẽ quá trình chuyển đổi số trong lĩnh vực bán lẻ. Theo các báo cáo thống kê thương mại điện tử (TMĐT) toàn cầu, tỷ lệ bỏ rơi giỏ hàng (cart abandonment rate) trung bình chạm ngưỡng 69.8%, nguyên nhân chủ yếu xuất phát từ trải nghiệm người dùng (UX) kém tối ưu, quy trình thanh toán phức tạp và tốc độ tải trang chậm. Đối với các chuỗi cửa hàng thời trang như Pandora Store—nơi danh mục sản phẩm thay đổi liên tục theo mùa và xu hướng thị trường—việc sở hữu một nền tảng bán hàng số hóa linh hoạt, chịu tải tốt và bảo mật cao là yếu tố sống còn.

Đồ án tốt nghiệp "Xây Dựng Website Thương Mại Điện Tử Cho Cửa Hàng Thời Trang Pandora Store" được thực hiện bởi sinh viên Nguyễn Xuân Tường dưới sự hướng dẫn của PGS.TS Trần Thị Ngân tại Khoa Các Khoa học Liên ngành / Trường Quốc tế – Đại học Quốc gia Hà Nội (VNU-IS), chuyên ngành Kỹ thuật Tin học và Máy tính (Informatics Computer and Engineering). Đồ án tập trung giải quyết triệt để các bài toán thực tế trong quản lý và vận hành thương mại điện tử thời trang.

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

Các hệ thống TMĐT truyền thống của các cửa hàng bán lẻ quy mô vừa và nhỏ thường gặp phải những bất cập kỹ thuật nghiêm trọng:

  • Hiệu năng và bảo mật truy vấn kém: Sử dụng ORM sinh mã SQL tự động không tối ưu dẫn đến hiện tượng nghẽn cổ chai I/O khi dữ liệu tăng cao, đồng thời dễ phát sinh lỗ hổng SQL Injection.
  • Kiến trúc mã nguồn phân tầng lỏng lẻo: Khó mở rộng, bảo trì do sự phụ thuộc trực tiếp giữa tầng Business Logic và Data Access (vi phạm nguyên lý Dependency Inversion).
  • Tính toàn vẹn dữ liệu đơn hàng: Khi thông tin sản phẩm (giá, tên, thuộc tính) được cập nhật hoặc xóa, các đơn hàng đã đặt trong quá khứ bị biến dạng thông tin nếu không có cơ chế snapshot độc lập.
  • Quy trình xuất hóa đơn và thông báo đơn hàng thủ công: Thiếu tự động hóa trong việc gửi email trạng thái đơn hàng và xuất tài liệu hóa đơn định dạng Word/PDF.
+-------------------------------------------------------------------------+
|                        MỤC TIÊU CỐT LÕI CỦA HỆ THỐNG                    |
+-------------------------------------------------------------------------+
| 1. Xây dựng RESTful API Backend trên nền tảng .NET Core Clean           |
|    Architecture, tách biệt hoàn toàn tầng Domain và Infrastructure.     |
| 2. Thiết kế Cơ sở dữ liệu MySQL tối ưu hóa bằng Stored Procedures,      |
|    triển khai cơ chế Snapshot dữ liệu lịch sử đơn hàng.                 |
| 3. Phát triển 2 giao diện Frontend chuyên biệt: Kênh Khách hàng        |
|    (Customer Portal) và Kênh Quản trị (Salesman Dashboard).             |
| 4. Tích hợp tự động hóa: Lưu trữ đa phương tiện Firebase Storage, xuất  |
|    hóa đơn định dạng Word qua GemBox, gửi email thông báo qua MailKit.  |
| 5. Đảm bảo chuẩn bảo mật Stateless Authentication qua JWT Bearer Token. |
+-------------------------------------------------------------------------+

Phạm vi và Giới hạn (Scope & Limitations)

  • Phạm vi triển khai: Hệ thống phục vụ toàn diện quy trình B2C (Business-to-Customer) cho ngành hàng thời trang, bao gồm quản lý danh mục đa cấp, giỏ hàng, áp dụng voucher khuyến mãi, sinh mã QR đơn hàng và xử lý quy trình đơn hàng 12 bước.
  • Giới hạn kỹ thuật: Phiên bản hiện tại tập trung vào phương thức thanh toán nhận hàng (COD) và chuyển khoản qua mã QR/email xác nhận; chưa tích hợp trực tiếp webhook IPN từ các cổng thanh toán trung gian như VNPay hay MoMo.

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

Phân tích hiện trạng và Yêu cầu hệ thống

Hệ thống được thiết kế dựa trên bảng đối chiếu kỹ thuật giữa các mô hình triển khai thương mại điện tử phổ biến hiện nay:

Tiêu chí kỹ thuật Mã nguồn mở (WooCommerce/PHP) Nền tảng SaaS (Shopify) Giải pháp Đồ án (.NET Core Clean Architecture)
Kiến trúc phần mềm Monolithic, Tight Coupling Closed-source SaaS Clean Architecture, Loose Coupling (DIP)
Tùy biến nghiệp vụ Trung bình, phụ thuộc Plugin Thấp, giới hạn bởi API nền tảng Hoàn toàn làm chủ mã nguồn 100%
Bảo mật truy vấn DB Dễ tổn thương bởi Plugin lỗi Nhà cung cấp quản lý Tuyệt đối an toàn với MySQL Stored Procedure
Xử lý tài liệu & Mail Sử dụng thư viện PHP chậm Có phí bổ sung định kỳ GemBox + MailKit SMTP chuyên dụng tối ưu
Chi phí hạ tầng Trung bình Rất cao theo doanh thu/tháng Tối ưu, có thể đóng gói Docker triển khai tự do

Phân loại yêu cầu theo phương pháp MoSCoW:

  • Must have: Đăng nhập/xác thực bảo mật JWT, danh mục sản phẩm động, giỏ hàng, đặt hàng không cần tài khoản bắt buộc, Stored Procedure cho mọi tác vụ nghiệp vụ, phân quyền Admin/Salesman.
  • Should have: Áp dụng mã giảm giá (Voucher), xuất hóa đơn đơn hàng tự động (.docx) qua GemBox, gửi email cập nhật trạng thái đơn qua MailKit.
  • Could have: Tích hợp bộ tìm kiếm tự động hoàn thành địa chỉ, lưu trữ hình ảnh sản phẩm phân tán trên Firebase Cloud Storage.
  • Won't have (v1): Khuyến nghị sản phẩm dựa trên AI/Machine Learning, thanh toán quốc tế đa tiền tệ.

Thiết kế hệ thống

Hệ thống tuân thủ nghiêm ngặt mô hình Clean Architecture (Onion Architecture) kết hợp nguyên lý Dependency Injection (DI) trong .NET Core, đảm bảo các tầng bên trong không phụ thuộc vào các tầng bên ngoài:

Công nghệ và Thư viện sử dụng

  • Backend Framework: Microsoft .NET Core Web API (C#).
  • Database Management System: MySQL Server 8.0 với 100% nghiệp vụ đóng gói qua Stored Procedure.
  • Authentication: JSON Web Token (JWT) Bearer Token với mã hóa khóa bí mật (Symmetric Security Key).
  • Document Processing: GemBox.Document (xử lý template và fill dữ liệu đơn hàng ra file Word).
  • Email Service: MailKit & MimeKit gửi mail bất đồng bộ qua SMTP.
  • Media Cloud Storage: Google Firebase Storage SDK.
  • Frontend: HTML5, CSS3, JavaScript (ES6+), jQuery, Responsive Web Design (RWD).
  • Công cụ phát triển: Visual Studio 2022, Visual Studio Code, dbForge Studio for MySQL, Docker.

Thiết kế Cơ sở dữ liệu và Cơ chế Snapshot

Cơ sở dữ liệu được chuẩn hóa gồm các bảng trọng tâm: Account, Item, Category, Order, OrderDetail, Voucher. Điểm sáng tạo trong thiết kế cơ sở dữ liệu của đồ án là việc giải quyết xung đột dữ liệu lịch sử đơn hàng bằng kỹ thuật Data Snapshot:

  • Bảng OrderDetail sao chép trực tiếp toàn bộ dữ liệu thuộc tính của Item (tên sản phẩm, giá bán tại thời điểm đặt, quy cách) vào bản ghi chi tiết đơn hàng mà không tham chiếu khóa ngoại cứng (Foreign Key Cascade) đến bảng Item.
  • Khi người quản trị chỉnh sửa giá hoặc xóa sản phẩm khỏi danh mục, thông tin trong các đơn hàng đã tạo trước đó vẫn giữ nguyên vẹn 100%, bảo toàn tính minh bạch kế toán.

Implementation và kết quả

Development Process & Code Structure

Dự án được tổ chức thành 3 project riêng biệt trong một Solution của .NET Core:

  1. PandoraStore.Api: Chứa Controllers, cấu hình Dependency Injection container, Middleware xác thực JWT.
  2. PandoraStore.Core: Tầng trung tâm chứa Domain Entities, DTOs, Enums, Interfaces và Business Logic Services.
  3. PandoraStore.Infrastructure: Hiện thực hóa (implement) các Interfaces từ Core, kết nối cơ sở dữ liệu MySQL, thực thi Stored Procedure, tích hợp Firebase Storage, GemBox và MailKit.

1. Hiện thực hóa Dependency Inversion tại tầng Core và Infrastructure

Giao diện Repository tại Core (IOrderRepository.cs):

namespace PandoraStore.Core.Interfaces
{
    public interface IOrderRepository
    {
        Task<string> CreateOrderAsync(OrderDto orderDto);
        Task<OrderEntity> GetOrderByIdAsync(string orderId);
        Task<bool> UpdateOrderStatusAsync(string orderId, int status);
    }
}

Hiện thực hóa tại Infrastructure sử dụng kết nối Stored Procedure (OrderRepository.cs):

using MySql.Data.MySqlClient;
using PandoraStore.Core.Interfaces;

namespace PandoraStore.Infrastructure.Repositories
{
    public class OrderRepository : IOrderRepository
    {
        private readonly string _connectionString;
        public OrderRepository(IConfiguration configuration)
        {
            _connectionString = configuration.GetConnectionString("DefaultConnection");
        }

        public async Task<string> CreateOrderAsync(OrderDto orderDto)
        {
            using var conn = new MySqlConnection(_connectionString);
            using var cmd = new MySqlCommand("Proc_CreateOrderTransaction", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            
            cmd.Parameters.AddWithValue("@p_CustomerName", orderDto.CustomerName);
            cmd.Parameters.AddWithValue("@p_Phone", orderDto.PhoneNumber);
            cmd.Parameters.AddWithValue("@p_Address", orderDto.ShippingAddress);
            cmd.Parameters.AddWithValue("@p_TotalAmount", orderDto.TotalAmount);
            cmd.Parameters.AddWithValue("@p_VoucherCode", orderDto.VoucherCode);
            
            var outputIdParam = new MySqlParameter("@p_OrderId", MySqlDbType.VarChar, 36)
            {
                Direction = ParameterDirection.Output
            };
            cmd.Parameters.Add(outputIdParam);

            await conn.OpenAsync();
            await cmd.ExecuteNonQueryAsync();
            return outputIdParam.Value.ToString();
        }
    }
}

2. Stored Procedure MySQL đảm bảo tính toàn vẹn và chống SQL Injection

DELIMITER //
CREATE PROCEDURE Proc_CreateOrderTransaction(
    IN p_CustomerName VARCHAR(255),
    IN p_Phone VARCHAR(20),
    IN p_Address VARCHAR(500),
    IN p_TotalAmount DECIMAL(18,2),
    IN p_VoucherCode VARCHAR(50),
    OUT p_OrderId VARCHAR(36)
)
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        RESIGNAL;
    END;

    START TRANSACTION;
        SET p_OrderId = UUID();
        
        INSERT INTO `Order` (Id, OrderCode, CustomerName, PhoneNumber, ShippingAddress, TotalAmount, VoucherCode, Status, CreatedDate)
        VALUES (p_OrderId, CONCAT('ORD-', SUBSTRING(p_OrderId, 1, 8)), p_CustomerName, p_Phone, p_Address, p_TotalAmount, p_VoucherCode, 1, NOW());
        
        -- Cập nhật lượt sử dụng voucher nếu tồn tại
        IF p_VoucherCode IS NOT NULL AND p_VoucherCode != '' THEN
            UPDATE `Voucher` SET UsedCount = UsedCount + 1 WHERE Code = p_VoucherCode AND RemainCount > 0;
        END IF;
    COMMIT;
END //
DELIMITER ;

3. Cấu trúc Lập trình Hướng đối tượng (OOP) phía Frontend

Phía giao diện web sử dụng mô hình kế thừa JavaScript Class để tối ưu khả năng tái sử dụng:

// Base class quản lý gọi API và xử lý bất đồng bộ
class BaseApi {
    constructor(endpoint) {
        this.baseUrl = `https://api.pandorastore.com/api/v1/${endpoint}`;
    }

    async getAll() {
        return await $.ajax({
            url: this.baseUrl,
            method: 'GET',
            contentType: 'application/json'
        });
    }

    async create(data) {
        return await $.ajax({
            url: this.baseUrl,
            method: 'POST',
            data: JSON.stringify(data),
            contentType: 'application/json'
        });
    }
}

// Lớp chuyên biệt quản lý sản phẩm
class ItemApi extends BaseApi {
    constructor() {
        super('items');
    }

    async getByCategory(categoryId) {
        return await $.ajax({
            url: `${this.baseUrl}/category/${categoryId}`,
            method: 'GET'
        });
    }
}

Testing và Kết quả Đạt được

Hệ thống đã trải qua các đợt kiểm thử hiệu năng (Stress Testing) và kiểm thử chức năng (UAT):

+--------------------------------------------------------------------------+
|                     KẾT QUẢ ĐO LƯỜNG HIỆU NĂNG HỆ THỐNG                  |
+--------------------------------------------------------------------------+
| * Thời gian phản hồi API trung bình (Avg Response Time) : 115 ms         |
| * Độ trễ thực thi Stored Procedure MySQL               : 8.2 ms         |
| * Tải chịu đựng đồng thời (Concurrency Test)            : 500 CCU        |
| * Tỷ lệ lỗi dưới tải nặng (Error Rate at Peak Load)     : 0.00 %         |
| * Tốc độ kết xuất đơn hàng file Word (GemBox)          : 180 ms/tài liệu|
| * Thời gian điều phối email SMTP qua MailKit            : 1.2 s/email    |
+--------------------------------------------------------------------------+
  • Chức năng phía Người mua (Customer):
    • Tìm kiếm, phân loại sản phẩm linh hoạt theo danh mục, mức giá và từ khóa.
    • Quản lý giỏ hàng trực quan: Tự động cập nhật tổng tiền, số lượng sản phẩm realtime.
    • Quy trình thanh toán tinh gọn: Nhập thông tin giao hàng, áp dụng voucher giảm giá tức thì, hiển thị mã QR thông tin đơn hàng và nhận email xác nhận tự động.
  • Chức năng phía Quản trị (Salesman):
    • Dashboard quản lý danh mục (Category) và sản phẩm (Item) với khả năng upload ảnh trực tiếp lên Firebase Storage.
    • Quản lý trạng thái đơn hàng (Tiếp nhận -> Đang đóng gói -> Đang giao -> Hoàn tất).
    • Xuất file hóa đơn đơn hàng dạng Word (.docx) chuyên nghiệp qua thư viện GemBox.

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

  1. Ứng dụng triệt để Clean Architecture trong .NET Core: Tách biệt hoàn toàn phần nghiệp vụ (Core Business) khỏi hệ cơ sở dữ liệu và các thư viện bên thứ ba. Điều này giúp hệ thống có khả năng chuyển đổi hệ quản trị CSDL (từ MySQL sang PostgreSQL hoặc SQL Server) mà không cần chỉnh sửa một dòng code nghiệp vụ nào trong Domain Service.
  2. Triển khai kiến trúc Snapshot Isolation cho giao dịch bán hàng: Khắc phục nhược điểm mất toàn vẹn dữ liệu đơn hàng của các hệ thống TMĐT sinh viên thông thường bằng việc lưu trữ bản sao dữ liệu sản phẩm tại thời điểm chốt đơn.
  3. Tối ưu hóa hiệu năng bằng 100% Stored Procedures: Loại bỏ hoàn toàn câu lệnh SQL động (Dynamic SQL) từ phía Client/Server, giảm thiểu overhead biên dịch câu truy vấn tại Database Engine, tăng tốc độ xử lý lên 38% so với các ORM tự sinh mã và miễn nhiễm hoàn toàn với các cuộc tấn công SQL Injection.
  4. Tự động hóa toàn diện quy trình sau bán hàng (Post-order Automation): Tích hợp sâu GemBox và MailKit xử lý song song bất đồng bộ, giúp quy trình đóng gói đơn hàng của chủ shop giảm từ 5 phút thao tác thủ công xuống chỉ còn dưới 2 giây cho một click chuột.

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

Hệ thống có tính ứng dụng thực tiễn cao, đặc biệt phù hợp cho các chuỗi cửa hàng thời trang bán lẻ, phụ kiện và may mặc có quy mô vừa và nhỏ.

Kế hoạch Triển khai (Deployment Roadmap)

  • Tầng Giao diện: Đóng gói tĩnh và triển khai trên hạ tầng toàn cầu của Netlify, tận dụng mạng phân phối nội dung (CDN) để tối ưu tốc độ tải trang dưới 1.5 giây.
  • Tầng Dịch vụ API: Đóng gói ứng dụng .NET Core thành Docker Container và triển khai thông qua Heroku CLI, thiết lập biến môi trường an toàn.
  • Tầng Dữ liệu & Media: Cơ sở dữ liệu MySQL đặt tại máy chủ từ xa; toàn bộ tài nguyên hình ảnh sản phẩm được lưu trữ tập trung tại Google Firebase Storage.

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

Hạn chế kỹ thuật

  • Frontend hiện tại sử dụng jQuery và JavaScript thuần; mặc dù nhẹ và dễ bảo trì ở quy mô hiện tại nhưng sẽ gặp khó khăn trong việc quản lý State phức tạp khi mở rộng tính năng Real-time tương tác nhiều.
  • Chưa tích hợp cổng thanh toán trực tuyến chính thức qua cổng thanh toán trung gian có chứng chỉ PCI-DSS.

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

  • Chuyển đổi Frontend sang Single Page Application (SPA): Sử dụng ReactJS 18+ kết hợp Redux Toolkit để tăng tính mượt mà cho trải nghiệm người dùng, tái sử dụng component tối đa.
  • Tích hợp Cổng thanh toán Điện tử: Kết nối trực tiếp API Webhook của VNPay, ZaloPay và Momo với cơ chế chữ ký số HMAC-SHA512.
  • Tích hợp Hệ thống Khuyến nghị (Recommendation System): Ứng dụng thuật toán lọc cộng tác (Collaborative Filtering) để tự động gợi ý sản phẩm phối đồ (mix-and-match) dựa trên hành vi duyệt web của khách hàng.

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

+--------------------------------------------------------------------------+
|                       GIÁ TRỊ MANG LẠI CHO CÁC ĐỐI TƯỢNG                 |
+--------------------------------------------------------------------------+
| SINH VIÊN & HỌC VIÊN:                                                    |
| * Nguồn tài liệu tham khảo chuẩn mực về triển khai Clean Architecture    |
|   trong môi trường .NET Core và thiết kế CSDL bằng Stored Procedure.     |
|                                                                          |
| LẬP TRÌNH VIÊN (DEVELOPERS):                                             |
| * Bản mẫu thiết kế (Design Pattern) hoàn chỉnh về cách tách lớp          |
|   Infrastructure, tích hợp các dịch vụ bên thứ ba (GemBox, MailKit,      |
|   Firebase) một cách độc lập không gây ảnh hưởng đến Domain Core.        |
|                                                                          |
| DOANH NGHIỆP BÁN LẺ (BUSINESSES):                                        |
| * Sở hữu một giải pháp phần mềm TMĐT chi phí thấp, hiệu năng cao,        |
|   không phụ thuộc phí bản quyền hàng tháng, sẵn sàng mở rộng quy mô.     |
+--------------------------------------------------------------------------+

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

1. Yêu cầu hệ thống phần cứng và phần mềm để triển khai dự án này là gì?

Máy chủ backend yêu cầu cài đặt môi trường .NET Runtime (phiên bản 6.0 hoặc 7.0/8.0 trở lên), hệ quản trị cơ sở dữ liệu MySQL Server 8.0+. Phía frontend chỉ cần bất kỳ web server nào hỗ trợ phân phối file tĩnh như Nginx, Apache hoặc các dịch vụ đám mây (Netlify, Vercel).

2. Tại sao đồ án lại chọn Stored Procedure thay vì sử dụng ORM như Entity Framework Core?

Stored Procedure giúp tối ưu hóa hiệu năng truy vấn tối đa bằng cách lưu trữ kế hoạch thực thi (Execution Plan) đã được biên dịch sẵn trên MySQL Server, giảm thiểu lưu lượng mạng truyền tải giữa API Server và Database, đồng thời ngăn chặn triệt để nguy cơ tấn công SQL Injection.

3. Làm thế nào để hệ thống đảm bảo tính toàn vẹn thông tin đơn hàng khi sản phẩm bị thay đổi giá hoặc bị xóa?

Hệ thống áp dụng cơ chế Data Snapshot trong bảng OrderDetail. Khi đơn hàng được xác nhận, toàn bộ thông tin sản phẩm (tên, giá niêm yết, thuộc tính tại thời điểm đó) được ghi nhận độc lập vào bản ghi chi tiết đơn hàng thay vì chỉ liên kết khóa ngoại tới bảng Item. Do đó, mọi thay đổi sau này trên danh mục sản phẩm gốc đều không làm ảnh hưởng đến dữ liệu kế toán của đơn hàng cũ.

4. Chi phí vận hành hệ thống thương mại điện tử này như thế nào?

Nhờ kiến trúc tối ưu và mã nguồn độc lập, hệ thống có thể vận hành trên các gói lưu trữ đám mây cơ bản (hoặc gói miễn phí của Netlify, Heroku, Firebase Spark Tier trong giai đoạn khởi chạy), giúp chủ cửa hàng tiết kiệm hơn 80% chi phí vận hành so với các giải pháp thuê bao SaaS như Shopify hay Magento Enterprise.

5. Khả năng mở rộng (Scalability) của hệ thống khi lượng người truy cập tăng đột biến ra sao?

Do ứng dụng được thiết kế theo dạng Stateless API (xác thực qua JWT, không lưu session trên server memory) và cấu trúc phân tầng Clean Architecture, hệ thống có thể dễ dàng scale ngang (Horizontal Scaling) bằng cách nhân bản các API Container phía sau một Load Balancer (như Nginx hay AWS ALB) mà không gặp bất kỳ xung đột trạng thái nào.


Kết luận

Đồ án tốt nghiệp "Xây Dựng Website Thương Mại Điện Tử Cho Cửa Hàng Thời Trang Pandora Store" của sinh viên Nguyễn Xuân Tường đã hoàn thành xuất sắc các mục tiêu nghiên cứu và ứng dụng thực tiễn đề ra. Dự án không chỉ giải quyết triệt để bài toán kinh doanh thực tế của một cửa hàng thời trang hiện đại mà còn là một minh chứng tiêu biểu cho việc ứng dụng chuẩn mực kỹ nghệ phần mềm: từ kiến trúc Clean Architecture, nguyên lý Dependency Inversion trong .NET Core, đến việc tối ưu hóa cơ sở dữ liệu với MySQL Stored Procedure và tự động hóa quy trình với GemBox, MailKit và Firebase Storage. Đây là tài liệu tham khảo có giá trị học thuật và ứng dụng cao cho sinh viên, kỹ sư phần mềm cũng như các doanh nghiệp đang tìm kiếm giải pháp chuyển đổi số bán lẻ hiệu quả, bền vững.