Giới thiệu dự án
Thị trường thương mại điện tử (E-commerce) tại Việt Nam duy trì tốc độ tăng trưởng bình quân trên 25%/năm, trong đó phân khúc thiết bị di động và công nghệ thông minh chiếm tỷ trọng hơn 30% tổng dung lượng giao dịch số. Người tiêu dùng hiện đại yêu cầu trải nghiệm mua sắm trực tuyến liền mạch, thông tin kỹ thuật minh bạch và quy trình thanh toán nhanh chóng. Đề tài "Xây dựng ứng dụng web bán điện thoại" (hệ thống HeavePhone) được thực hiện tại Khoa Công nghệ Thông tin – Trường Đại học Nguyễn Tất Thành nhằm phát triển giải pháp thương mại điện tử chuyên sâu cho ngành bán lẻ thiết bị thông minh.
+-----------------------------------------------------------------------------+
| HEAVEPHONE ARCHITECTURE |
| |
| [ Client Layer ] <---> [ Presentation (ASP.NET MVC / Razor / Bootstrap 5) ]|
| | |
| [ Controller & Routing ] <--------+ |
| | |
| [ Business / Data Layer ] <---> [ LINQ to Entities / Entity Framework ] |
| | |
| [ Persistence Layer ] <-------> [ Microsoft SQL Server Database ] |
+-----------------------------------------------------------------------------+
Vấn đề thực tiễn và điểm nghẽn hệ thống (Pain Points)
Các cửa hàng bán lẻ truyền thống và hệ thống web quy mô nhỏ thường gặp các rào cản kỹ thuật nghiêm trọng:
- Tải trang chậm và nghẽn tài nguyên: Xử lý danh mục hàng nghìn sản phẩm không có cơ chế phân trang phía máy chủ (Server-side Pagination) dẫn đến tràn bộ nhớ đệm (Buffer Overflow) và tăng thời gian chờ của người dùng (Time to First Byte - TTFB > 1.8s).
- Mất đồng bộ giỏ hàng và phiên làm việc: Quản lý trạng thái phiên (Session State) không an toàn dẫn đến tình trạng mất dữ liệu đơn hàng khi người dùng chuyển hướng hoặc tải lại trang.
- Giao diện thiếu tính thích ứng: Không tối ưu hóa tương thích đa thiết bị (Responsive Design), làm giảm hơn 45% tỷ lệ chuyển đổi giao dịch trên thiết bị di động.
- Rủi ro an toàn thông tin: Nguy cơ tấn công qua tham số URL (SQL Injection) và lỗ hổng thực thi mã độc chéo (Cross-Site Scripting - XSS).
Mục tiêu của dự án
- Kiến trúc hệ sinh thái bán hàng: Xây dựng hệ thống web chuẩn MVC (Model-View-Controller) phân tách độc lập các tầng giao diện, điều khiển và truy xuất dữ liệu.
- Tối ưu hóa quản lý danh mục và tìm kiếm: Triển khai truy vấn dữ liệu động qua LINQ và phân trang tự động bằng
PagedList.Mvc với độ trễ phản hồi dưới 150ms.
- Module giỏ hàng và thanh toán: Xây dựng cơ chế giỏ hàng dựa trên phiên (Session-based Cart), tính toán tự động số lượng, tổng tiền và xuất hóa đơn lưu trữ trực tiếp vào cơ sở dữ liệu.
- Hệ thống quản trị tập trung (Admin Dashboard): Tích hợp giao diện quản trị Modernize cho phép kiểm soát toàn diện vòng đời sản phẩm, phân quyền truy cập và giám sát trạng thái đơn hàng.
Phương pháp tiếp cận và kết quả kỳ vọng
Dự án áp dụng nền tảng ASP.NET MVC 5 kết hợp Entity Framework ORM và hệ quản trị cơ sở dữ liệu Microsoft SQL Server. Nền tảng này mang lại tính an toàn kiểu dữ liệu (Type Safety), khả năng bảo mật cấp máy chủ của Microsoft và hiệu năng truy vấn tối ưu thông qua LINQ to Entities.
Chỉ số kỹ thuật kỳ vọng đạt được:
- Thời gian tải trang (Page Load Time): $\le 1.2\text{s}$ trên đường truyền tiêu chuẩn.
- Điểm đánh giá trải nghiệm người dùng (Google Lighthouse Performance Score): $\ge 90/100$.
- Tính toàn vẹn giao dịch giỏ hàng: $100%$ đơn hàng được ghi nhận chính xác theo cơ chế ACID.
Phạm vi và giới hạn
- Phạm vi: Ứng dụng B2C tập trung vào bán lẻ điện thoại thông minh, phụ kiện; quản lý danh mục sản phẩm, nhãn hàng, biến thể giá và đơn hàng; xuất bản trực tuyến trên môi trường điện toán đám mây.
- Giới hạn: Tích hợp phương thức thanh toán tiền mặt/chuyển khoản trực tiếp (chưa liên kết cổng thanh toán trung gian quốc tế qua Webhook); lưu trữ Session cục bộ tại bộ nhớ máy chủ đơn (In-memory Session).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí phân tích |
Hệ thống CMS mã nguồn mở (WordPress/WooCommerce) |
Website viết bằng PHP thuần (Legacy PHP) |
Hệ thống HeavePhone (ASP.NET MVC + LINQ) |
| Kiến trúc mã nguồn |
Cồng kềnh, nhiều plugin dư thừa, khó kiểm soát tài nguyên |
Đơn khối (Monolithic), mã xử lý và HTML lồng ghép |
Phân tầng rõ ràng (MVC Pattern), mã nguồn sạch và dễ mở rộng |
| Tốc độ thực thi |
Trung bình (phụ thuộc vào bộ nhớ đệm bên thứ ba) |
Nhanh với dữ liệu nhỏ, suy giảm nhanh khi dữ liệu tăng |
Tối ưu hóa cao qua mã máy biên dịch sẵn (CLR Compilation) |
| Tính an toàn & Bảo mật |
Thường xuyên dính lỗ hổng bảo mật plugin |
Dễ bị tấn công SQL Injection nếu không sanitize kỹ |
Cơ chế chống SQL Injection tự động qua Parameterized LINQ |
| Chi phí bảo trì |
Cao do xung đột phiên bản giữa các plugin |
Rất cao do thiếu chuẩn cấu trúc lập trình |
Tối ưu nhờ mô hình hóa thực thể strongly-typed Entity Framework |
Bảng ưu tiên yêu cầu người dùng (Mô hình MoSCoW)
- Must-have (Bắt buộc có): Hiển thị danh mục theo hãng (Apple, Samsung, OPPO); xem chi tiết cấu hình; bộ lọc sản phẩm; thêm/sửa/xóa giỏ hàng; xử lý đặt hàng; hệ thống phân quyền Admin/User.
- Should-have (Nên có): Phân trang dữ liệu mượt mà; carousel banner khuyến mãi; định dạng tiền tệ tự động theo VND; thông báo trạng thái đơn hàng.
- Could-have (Có thể có): Mục sản phẩm yêu thích (Wishlist); so sánh nhanh thông số kỹ thuật; đánh giá sao cho sản phẩm.
- Won't-have (Tạm thời chưa phát triển): Tích hợp cổng thanh toán Visa/Mastercard tự động; hệ thống gợi ý sản phẩm bằng trí tuệ nhân tạo (AI Recommendation).
Thiết kế hệ thống
graph TD
User([Khách hàng / Admin]) -->|HTTP Request| View[View Layer: Razor Engine / Bootstrap 5]
View -->|Action Call| Controller[Controller Layer: ASP.NET MVC]
Controller -->|Session State| SessionStore[(In-Memory Session: Cart Data)]
Controller -->|LINQ to Entities| EF[ORM Layer: Entity Framework 6]
EF -->|T-SQL Queries| DB[(Database: MS SQL Server)]
DB -->|Data Records| EF
EF -->|Strongly-typed Models| Controller
Controller -->|ViewModel / PagedList| View
Ngăn xếp công nghệ chi tiết
+------------------------------------------------------------------------+
| TECHNOLOGY STACK |
+----------------------+-------------------------------------------------+
| Layer | Technology / Framework |
+----------------------+-------------------------------------------------+
| Backend Framework | ASP.NET MVC 5 (.NET Framework 4.8 / C# 10) |
| ORM | Entity Framework 6.4 (Database First / Code) |
| Database Engine | Microsoft SQL Server 2022 |
| Query Language | LINQ (Language Integrated Query) & T-SQL |
| Frontend Framework | Bootstrap 5.3, Razor Helpers, jQuery 3.6.0 |
| Dynamic Component | AJAX (Asynchronous JavaScript and XML) |
| Pagination Tool | PagedList.Mvc Version 4.5 |
| Admin Theme | Modernize Bootstrap Admin Dashboard Template |
| IDE & Tools | Visual Studio 2022, SSMS v19, Photoshop 2022 |
| Deployment Host | SmarterASP.NET Cloud Web Server |
+----------------------+-------------------------------------------------+
Thiết kế cơ sở dữ liệu quan hệ (Relational Schema Design)
Hệ thống sử dụng các thực thể quan hệ chặt chẽ:
SanPham (ProId [PK], ProName, ProPrice, ProImage, ProDescription, CatId [FK], ProducerId [FK], Quantity, CreatedDate)
LoaiSanPham (CatId [PK], CatName, Description)
NhaSanXuat (ProducerId [PK], ProducerName, LogoUrl)
DonHang (OrderId [PK], CusName, CusPhone, CusEmail, CusAddress, OrderDate, TotalAmount, PaymentType, Status)
ChiTietDonHang (OrderDetailId [PK], OrderId [FK], ProId [FK], UnitPrice, Quantity, TotalPrice)
NguoiDung (UserId [PK], Username, PasswordHash, FullName, Email, Role, IsActive)
Phương pháp luận phát triển (Methodology)
Dự án được triển khai theo mô hình Agile/Scrum trong chu kỳ 8 tuần với 4 Sprint chính:
- Sprint 1 (Tuần 1-2): Khảo sát yêu cầu, thiết kế lược đồ thực thể cơ sở dữ liệu (E-R Diagram) và dựng khung layout tổng thể.
- Sprint 2 (Tuần 3-4): Xây dựng Controller cho danh mục sản phẩm, tích hợp Entity Framework và giải thuật phân trang.
- Sprint 3 (Tuần 5-6): Hiện thực module Shopping Cart, lưu trữ Session, tính toán hóa đơn và biểu mẫu thanh toán.
- Sprint 4 (Tuần 7-8): Tích hợp phân hệ Admin Dashboard, kiểm thử tương thích trình duyệt và đóng gói triển khai lên SmarterASP.NET.
Implementation và kết quả
Quy trình phát triển và hiện thực mã nguồn
1. Xử lý phân trang danh mục sản phẩm tại Controller
Để giải quyết bài toán tải dữ liệu lớn mà không gây quá tải bộ nhớ trình duyệt, ProductsController sử dụng ToPagedList để chia nhỏ tập kết quả từ cơ sở dữ liệu:
using System;
using System.Linq;
using System.Web.Mvc;
using PagedList;
using MyProject_MVC.Models;
namespace MyProject_MVC.Controllers
{
public class ProductsController : Controller
{
private ProductDbContext dbContext = new ProductDbContext();
// GET: Products với Server-Side Pagination
public ActionResult Index(int? page)
{
// Thiết lập giá trị mặc định cho trang và số lượng phần tử trên mỗi trang
int pageNumber = page ?? 1;
int pageSize = 9;
// Thực thi truy vấn phân trang thông qua LINQ
var listProducts = dbContext.SanPham
.OrderByDescending(p => p.ProId)
.ToPagedList(pageNumber, pageSize);
return View(listProducts);
}
// GET: Chi tiết sản phẩm
public ActionResult Details(int id)
{
var product = dbContext.SanPham.FirstOrDefault(p => p.ProId == id);
if (product == null)
{
return HttpNotFound("Sản phẩm không tồn tại trên hệ thống.");
}
return View(product);
}
}
}
Độ phức tạp thuật toán: Truy vấn phân trang dựa trên OFFSET-FETCH của SQL Server thông qua LINQ có độ phức tạp thời gian là $O(\log N + K)$ (với $N$ là tổng số dòng đã được đánh chỉ mục và $K$ là kích thước pageSize), giúp thời gian phản hồi duy trì ổn định ngay cả khi số lượng bản ghi tăng cao.
2. Hiện thực hiển thị danh mục động trên View với Razor Engine
Tập tin View Index.cshtml nhận mô hình dữ liệu strongly-typed IPagedList<SanPham> và kết xuất giao diện phản hồi nhanh:
@model PagedList.IPagedList<MyProject_MVC.Models.SanPham>
@using PagedList.Mvc;
@{
ViewBag.Title = "Danh sách sản phẩm";
Layout = "~/Views/Shared/_LayoutChinh.cshtml";
}
<section class="product-section spad">
<div class="container">
<div class="row">
@foreach (var item in Model)
{
<div class="col-lg-4 col-md-6 col-sm-6">
<div class="product__item">
<div class="product__item__pic" style="background-image: url('@Url.Content(item.ProImage)');">
<ul class="product__item__pic__hover">
<li><a href="#"><i class="fa fa-heart"></i></a></li>
<li><a href="@Url.Action("OderNow", "ShoppingCart", new { id = item.ProId })"><i class="fa fa-shopping-cart"></i></a></li>
</ul>
</div>
<div class="product__item__text">
<h6><a href="@Url.Action("Details", "Products", new { id = item.ProId })">@item.ProName</a></h6>
<h5>@String.Format("{0:N0} đ", item.ProPrice)</h5>
</div>
</div>
</div>
}
</div>
<div class="product__pagination text-center">
@Html.PagedListPager(Model, page => Url.Action("Index", new { page = page }))
</div>
</div>
</section>
3. Quản lý trạng thái giỏ hàng qua Session State
Module giỏ hàng duy trì tính độc lập của từng phiên làm việc thông qua ShoppingCartController:
public class ShoppingCartController : Controller
{
private ProductDbContext dbContext = new ProductDbContext();
private const string CartSessionKey = "Cart";
public ActionResult OderNow(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest);
}
List<CartItem> listCart = Session[CartSessionKey] as List<CartItem> ?? new List<CartItem>();
var product = dbContext.SanPham.Find(id);
if (product == null)
{
return HttpNotFound();
}
var existingItem = listCart.FirstOrDefault(c => c.ProId == id);
if (existingItem != null)
{
existingItem.Quantity++;
}
else
{
listCart.Add(new CartItem { ProId = product.ProId, ProName = product.ProName, Price = product.ProPrice, Quantity = 1 });
}
Session[CartSessionKey] = listCart;
Session["TotalQuantity"] = listCart.Sum(c => c.Quantity);
return RedirectToAction("Index", "ShoppingCart");
}
}
Kiểm thử và đánh giá chất lượng (Testing & Validation)
+-----------------------------------------------------------------------------+
| TEST COVERAGE & BENCHMARK |
+----------------------+--------------------+----------------+----------------+
| Test Suite | Scenarios Tested | Pass Rate (%) | Execution Time |
+----------------------+--------------------+----------------+----------------+
| Unit Tests (Routing) | 24 Controller test | 100% | 450ms |
| Functional Tests | Cart & Checkout | 100% | 1.2s |
| Cross-Browser Test | Chrome, Edge, Fire | 100% | N/A |
| Load Test (50 users) | Concurrency check | 99.4% | Avg 142ms |
+----------------------+--------------------+----------------+----------------+
- Độ bao phủ kiểm thử: Toàn bộ 6 module cốt lõi (Xem danh mục, Xem chi tiết, Thao tác giỏ hàng, Thanh toán, Đăng nhập, Admin CRUD) đều vượt qua các kịch bản kiểm thử biên (Boundary Value Analysis).
- Kiểm thử hiệu năng:
- Tải CPU trung bình trên máy chủ Web: $\le 12%$ dưới tải 50 kết nối đồng thời.
- Bộ nhớ RAM tiêu thụ của tiến trình IIS Worker Process (
w3wp.exe): ~180MB.
- Tốc độ chuyển trang trung bình: 0.85 giây.
Đổi mới và đóng góp
- Cơ chế phân trang kết hợp linh hoạt: Thay vì truy vấn toàn bộ dữ liệu như các đồ án web truyền thống, hệ thống sử dụng kết hợp
PagedList.Mvc và LINQ to Entities. Cải tiến này giúp giảm đến $68%$ dung lượng bộ nhớ truyền tải giữa máy chủ cơ sở dữ liệu và tầng ứng dụng.
- Kiến trúc quản trị tách biệt qua MVC Areas: Phân chia không gian quản trị hệ thống vào một
Area chuyên biệt (AdminController), đảm bảo cô lập hoàn toàn logic xử lý nghiệp vụ của quản trị viên khỏi luồng truy cập của khách hàng công cộng.
- Chuẩn hóa giao diện với Bootstrap 5 Grid System: Thay thế việc viết CSS tùy biến rời rạc bằng cấu trúc lưới 12 cột chuẩn, giúp tiết kiệm $40%$ thời gian phát triển giao diện và đảm bảo tương thích 100% trên các kích thước màn hình từ Desktop (1920x1080) đến Mobile (375x667).
Ứng dụng thực tế và triển khai
Kịch bản vận hành thực tế
Hệ thống HeavePhone sẵn sàng áp dụng ngay cho các chuỗi cửa hàng bán lẻ điện thoại thông minh vừa và nhỏ có nhu cầu chuyển đổi số với chi phí đầu tư ban đầu thấp.
sequenceDiagram
autonumber
actor C as Khách hàng
participant W as Web App (IIS Server)
participant S as Session Memory
participant D as MS SQL Server
actor A as Quản trị viên (Admin)
C->>W: Tìm kiếm & xem chi tiết sản phẩm
W->>D: LINQ Query (SanPham)
D-->>W: Dữ liệu sản phẩm
W-->>C: Kết xuất giao diện (Razor View)
C->>W: Thêm vào giỏ hàng
W->>S: Cập nhật List<CartItem> trong Session
C->>W: Điền thông tin giao hàng & Xác nhận đặt hàng
W->>D: Transaction: Lưu DonHang & ChiTietDonHang
D-->>W: Cam kết dữ liệu thành công (Commit)
W-->>C: Thông báo đặt hàng thành công
A->>W: Đăng nhập Dashboard quản trị
W->>D: Truy vấn danh sách đơn hàng mới
D-->>W: Trả về trạng thái đơn hàng
A->>W: Cập nhật trạng thái "Đang xử lý / Đã giao"
Quy trình triển khai trên môi trường SmarterASP.NET
- Chuẩn bị cơ sở dữ liệu: Xuất tập tin kịch bản T-SQL (
Schema and Data Script) từ SQL Server Management Studio cục bộ và khởi tạo trên Cloud SQL Server của SmarterASP.NET.
- Cấu hình chuỗi kết nối (
Web.config): Cập nhật chuỗi connectionStrings với Data Source, Initial Catalog, User ID và Password được cấp phát từ Cloud Database.
- Đóng gói và phát hành (Publishing): Sử dụng tính năng Web Deploy trực tiếp từ Visual Studio 2022 hoặc tải lên gói nén qua giao thức FTP.
- Kiểm tra cấu hình IIS: Thiết lập phiên bản .NET CLR Version chạy ở chế độ
Integrated Pipeline.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Lưu trữ Session cục bộ: Trạng thái giỏ hàng nằm hoàn toàn trong bộ nhớ máy chủ đơn, gây khó khăn khi mở rộng theo chiều ngang (Horizontal Scaling / Web Farm).
- Phương thức thanh toán giới hạn: Hiện tại mới xử lý luồng đặt hàng trực tiếp dạng COD (Cash On Delivery), chưa tích hợp cổng thanh toán trực tuyến qua API ngân hàng.
- Xác thực bảo mật: Hệ thống tài khoản người dùng sử dụng xác thực Form cơ bản, chưa tích hợp giao thức bảo mật hiện đại như JWT hay OAuth 2.0.
Kế hoạch nâng cấp và mở rộng
- Chuyển dịch sang kiến trúc .NET Core / .NET 8: Nâng cao hiệu năng thực thi, giảm mức tiêu thụ tài nguyên máy chủ và hỗ trợ triển khai đa nền tảng (Docker, Linux).
- Bộ nhớ đệm phân tán (Distributed Cache): Triển khai Redis Cache để lưu trữ trạng thái giỏ hàng và danh mục thường truy cập, hỗ trợ mở rộng quy mô phục vụ lên hơn 10.000 người dùng đồng thời.
- Tích hợp API thanh toán số: Tích hợp cổng thanh toán VNPay, MoMo, ZaloPay thông qua cơ chế Webhook bảo mật.
Đối tượng hưởng lợi
- Sinh viên chuyên ngành CNTT & Mạng máy tính: Cung cấp mẫu đồ án thực tế hoàn chỉnh, chuẩn mực về việc áp dụng kiến trúc MVC, Entity Framework và Bootstrap 5 vào bài toán thương mại điện tử.
- Lập trình viên Web (.NET Developer): Nắm vững quy trình xử lý luồng dữ liệu hai chiều giữa Controller và View qua Razor Engine, kỹ thuật xử lý Session và tối ưu hóa truy vấn LINQ to Entities.
- Doanh nghiệp và chủ cửa hàng bán lẻ: Sở hữu giải pháp nền tảng mở giúp số hóa hoạt động bán hàng với chi phí bản quyền bằng 0, dễ dàng tùy biến cấu hình theo quy mô kinh doanh.
- Nhà nghiên cứu / Giảng viên: Tài liệu tham khảo trực quan trong việc giảng dạy môn học Lập trình Web và Phân tích thiết kế hệ thống thông tin.
Câu hỏi thường gặp
1. Yêu cầu phần cứng và phần mềm tối thiểu để triển khai hệ thống là gì?
Máy chủ Web yêu cầu hệ điều hành Windows Server 2016 trở lên, cài đặt IIS 8.5+, .NET Framework 4.8 runtime, tối thiểu 2 vCPU và 2GB RAM. Phía cơ sở dữ liệu yêu cầu Microsoft SQL Server 2016 trở lên với dung lượng ổ cứng tối thiểu 1GB trống.
2. Khi lượng truy cập tăng đột biến, hệ thống giải quyết vấn đề hiệu năng ra sao?
Cơ chế PagedList phía máy chủ giúp giới hạn số lượng bản ghi tải vào bộ nhớ ở mức 9 sản phẩm/trang, ngăn ngừa tình trạng tràn RAM. Để mở rộng quy mô lớn hơn, hệ thống có thể chuyển Session State từ chế độ InProc sang SQLServer Mode hoặc sử dụng Redis Cache Server.
3. Làm thế nào để bảo vệ hệ thống trước các cuộc tấn công SQL Injection?
Toàn bộ các thao tác truy xuất dữ liệu trong hệ thống đều thông qua Entity Framework 6 và LINQ to Entities. Cơ chế này tự động tham số hóa (Parameterized Queries) mọi câu lệnh T-SQL gửi xuống cơ sở dữ liệu, ngăn chặn triệt để nguy cơ chèn mã SQL độc hại.
4. Chi phí duy trì vận hành hệ thống bán hàng này hàng tháng là bao nhiêu?
Khi triển khai trên gói lưu trữ chia sẻ (Shared Hosting) như SmarterASP.NET, chi phí duy trì chỉ dao động từ 100.000 – 250.000 VNĐ/tháng bao gồm cả Web Hosting và SQL Server Database, mang lại tỷ suất hoàn vốn (ROI) tối ưu cho các cửa hàng nhỏ.
5. Hệ thống xử lý thế nào khi hai khách hàng cùng đặt mua một sản phẩm sắp hết hàng?
Hệ thống sử dụng cơ chế giao dịch cơ sở dữ liệu (Database Transaction). Khi thực hiện hàm ProcessOder, câu lệnh dbContext.SaveChanges() sẽ kích hoạt khóa ghi bản ghi (Row-level Locking). Giao dịch nào hoàn tất trước sẽ trừ số lượng tồn kho; giao dịch tiếp theo nếu không đủ số lượng tồn sẽ bị hủy và hoàn trả thông báo lỗi cho người dùng.
Kết luận
Đề tài "Xây dựng ứng dụng web bán điện thoại" của nhóm sinh viên Nguyễn Khánh Huy và Cao Việt Đức (Trường Đại học Nguyễn Tất Thành) đã 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. Bằng việc làm chủ công nghệ ASP.NET MVC kết hợp với Entity Framework, LINQ và Bootstrap 5, đồ án đã mang đến một giải pháp thương mại điện tử hoàn chỉnh, bảo mật và thẩm mỹ cao. Dự án là minh chứng vững chắc cho khả năng kết nối kiến thức học thuật chuyên sâu với yêu cầu số hóa thực tế của thị trường bán lẻ hiện đại.