Giới thiệu dự án
Sự bùng nổ của hạ tầng Internet băng thông rộng và mạng xã hội vào đầu thập niên 2010 đã làm thay đổi hoàn toàn hành vi tiêu dùng trực tuyến. Mặc dù thương mại điện tử (E-commerce) phát triển mạnh mẽ, các doanh nghiệp vừa và nhỏ (SMEs) cùng các hộ kinh doanh cá thể vẫn gặp nhiều trở ngại trong việc tiếp cận khách hàng tiềm năng và tối ưu hóa chi phí vận hành.
+-------------------------------------------------------------------------------+
| MÔ HÌNH HỆ THỐNG OPENSHOP |
+-------------------------------------------------------------------------------+
| [ Buyer / Customer ] [ Seller / Gian hàng ] [ Blogger / Reviewer]|
| | | | |
| +--------------------+--------+---------------------------+ |
| | |
| v |
| +---------------------------------------------------------------------+ |
| | PRESENTATION LAYER (PL) | |
| | ASP.NET WebForms (.aspx / .cs), AJAX Control Toolkit, jQuery v1.4 | |
| +---------------------------------------------------------------------+ |
| | (Service Interface / DTO) |
| v |
| +---------------------------------------------------------------------+ |
| | BUSINESS LOGIC LAYER (BLL) | |
| | ProductControl, CategoryControl, BidControl, PromotionEngine | |
| +---------------------------------------------------------------------+ |
| | (LINQ to SQL Queries) |
| v |
| +---------------------------------------------------------------------+ |
| | DATA ACCESS LAYER (DAL) | |
| | DataContext, Table<T> (Products, ProductLines, Categories, Bids) | |
| +---------------------------------------------------------------------+ |
| | |
| v |
| +---------------------------------------------------------------------+ |
| | DATABASE & EXTERNAL THIRD-PARTY SERVICES | |
| | - Microsoft SQL Server 2008 (Semi-structured / EAV Schema) | |
| | - Facebook Graph/REST API (Social Sync & Blog Wall) | |
| | - Flickr .NET API (Cloud Image Hosting) | |
| | - Google Image Search API (Asynchronous Image Suggestion) | |
| | - Amazon & Best Buy Shopping APIs (Real-time Price Benchmark) | |
| +---------------------------------------------------------------------+ |
+-------------------------------------------------------------------------------+
Vấn đề thực tiễn (Problem Statement)
Thực trạng thị trường thương mại điện tử giai đoạn này bộc lộ 3 điểm nghẽn nghiêm trọng:
- Sự rời rạc giữa Mạng xã hội và Nền tảng E-commerce: Người bán hàng trên Facebook thường xuyên đăng tải sản phẩm thủ công, gắn thẻ (tag) danh sách bạn bè bừa bãi, gây phản cảm và vi phạm quy tắc tiếp thị hướng đối tượng. Ngược lại, các website bán hàng trực tuyến lại thiếu tính tương tác cộng đồng và khả năng lan truyền tự nhiên.
- Cấu trúc cơ sở dữ liệu quan hệ truyền thống cứng nhắc: Khi một hệ thống kinh doanh đa ngành hàng (từ đồ điện tử như laptop, TV đến thời trang, mỹ phẩm), mỗi loại sản phẩm sở hữu hàng chục thông số kỹ thuật đặc thù. Nếu thiết kế bảng theo cách truyền thống, bảng
Productsẽ chứa hàng trăm cột với tỷ lệ dữ liệuNULLvượt quá 70-80%, gây lãng phí bộ nhớ lưu trữ và giảm hiệu năng truy vấn. - Mô hình giao dịch một chiều thụ động: Khách hàng gặp khó khăn khi tìm kiếm sản phẩm tối ưu về giá và chất lượng do thiếu cơ chế yêu cầu chào giá cạnh tranh trực tiếp (Reverse Bidding) và thiếu công cụ so sánh trực quan đa tiêu chí.
Mục tiêu dự án
Đồ án tập trung hiện thực hóa hệ thống sàn giao dịch thương mại điện tử OpenShop với 4 mục tiêu cốt lõi:
- Xây dựng nền tảng Web Application theo Kiến trúc 3 lớp (3-Tier Architecture) kết hợp công nghệ LINQ to SQL nhằm chuẩn hóa quy trình xử lý dữ liệu và tăng tính mô-đun hóa.
- Tích hợp sâu Facebook API dựa trên mô hình hành vi mua sắm (Purchase Process Model của Philip Kotler), tự động đồng bộ bài viết đánh giá và thu thập phản hồi của người dùng.
- Thiết kế mô hình dữ liệu bán cấu trúc (Semi-structured Data) để quản lý động các thuộc tính (Attributes) và tiêu chí đánh giá (Rate Templates) của từng danh mục hàng hóa.
- Triển khai cơ chế đấu giá ngược (Reverse Bidding/Chào giá) kết hợp hệ thống tích hợp API bên thứ ba (Google Image API, Flickr .NET API, Amazon/Best Buy Shopping API).
Phạm vi và giới hạn hệ thống
- Phạm vi: Ứng dụng Web phục vụ 4 nhóm tác nhân (Buyer, Seller, Blogger, Administrator); hỗ trợ quản lý gian hàng đa người bán, quản lý khuyến mãi đa cấp và đồng bộ mạng xã hội.
- Giới hạn: Hệ thống chưa tích hợp cổng thanh toán trực tuyến nội địa trực tiếp qua ngân hàng (thực hiện thanh toán qua xác nhận đơn hàng), phiên bản công nghệ áp dụng trên nền tảng .NET Framework 3.5/4.0 và CSDL Microsoft SQL Server 2008.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí | Diễn đàn / Rao vặt (5giay, Muare) | Sàn TMĐT truyền thống (Vatgia) | OpenShop (Giải pháp đề xuất) |
|---|---|---|---|
| Cấu trúc dữ liệu sản phẩm | Dạng text tự do (Unstructured), không thể lọc thông số | Bảng phẳng cố định, nhiều trường trống (NULL) |
Dạng bán cấu trúc (Semi-structured/EAV), tùy biến 100% |
| Độ trễ cập nhật giao diện | Tải lại toàn bộ trang (Full page reload) | Tải lại toàn bộ trang / iframe cục bộ | Bất đồng bộ qua AJAX & jQuery, giảm >60% payload |
| Tích hợp Mạng xã hội | Chia sẻ link thủ công | Nút chia sẻ bookmark cơ bản | Tự động đồng bộ Wall Facebook theo từng dòng sản phẩm |
| Cơ chế giao dịch | Liên hệ cá nhân qua tin nhắn/điện thoại | Đặt hàng trực tiếp cố định giá | Kết hợp đặt hàng trực tiếp và Đấu thầu ngược (Chào giá) |
| Tìm kiếm hình ảnh sản phẩm | Người bán tự tải lên máy chủ cục bộ | Tải lên máy chủ của hệ thống | Tự động gợi ý từ Google Images & lưu trữ đám mây Flickr |
Ma trận ưu tiên yêu cầu người dùng (MoSCoW)
- Must-Have (Bắt buộc): Kiến trúc 3 lớp phân tách rõ ràng; Quản lý đa danh mục và thuộc tính động; Hệ thống giỏ hàng và đặt hàng đa gian hàng; Phân quyền người dùng đa cấp (Role-Based Access Control - RBAC).
- Should-Have (Nên có): Cơ chế yêu cầu chào giá (
BidRequest) và phản hồi giá (Bid); Tích hợp Facebook API tự động đăng bài theoProductLine; So sánh động thuộc tính sản phẩm và highlight sai khác. - Could-Have (Có thể có): Gợi ý ảnh tự động bằng Google Image Search API; Đồng bộ kho ảnh qua Flickr .NET; Truy vấn giá đối chuẩn qua Amazon/Best Buy API.
- Won't-Have (Chưa triển khai): Tích hợp cổng thanh toán trực tiếp qua thẻ tín dụng quốc tế (Payment Gateway).
Thiết kế hệ thống
Kiến trúc 3 lớp (3-Tier Architecture)
+--------------------------------------------------------------------+
| PRESENTATION LAYER (PL) |
| - Web Forms (.aspx), Code Behind (.aspx.cs), Stylesheet (.css) |
| - AJAX UpdateControls, Ajax Control Toolkit (ACT), jQuery v1.4 |
+---------------------------------+----------------------------------+
|
| Service Interface / Business Entities
v
+--------------------------------------------------------------------+
| BUSINESS LOGIC LAYER (BLL) |
| - Business Components: ProductControl, CategoryControl, ... |
| - Service Interface: GetTop10Product(), GetProductByID(int id) |
| - Business Entities: Extended Data Objects & ViewModels |
+---------------------------------+----------------------------------+
|
| LINQ to SQL Engine
v
+--------------------------------------------------------------------+
| DATA ACCESS LAYER (DAL) |
| - DataContext Mapping Classes (Auto-generated by LINQ) |
| - Table<Product>, Table<ProductLine>, Table<Category>, ... |
| - CRUD: InsertOnSubmit(), DeleteOnSubmit(), SubmitChanges() |
+---------------------------------+----------------------------------+
|
| T-SQL Connection
v
+--------------------------------------------------------------------+
| DATABASE LAYER |
| - Microsoft SQL Server 2008 Database Engine |
+--------------------------------------------------------------------+
Bảng thông số Technology Stack
| Thành phần | Công nghệ / Thư viện | Phiên bản | Vai trò kỹ thuật trong hệ thống |
|---|---|---|---|
| Ngôn ngữ & Nền tảng | C#, ASP.NET WebForms | .NET 3.5 / 4.0 | Xử lý logic máy chủ, điều hướng trang và render giao diện |
| Cơ sở dữ liệu | Microsoft SQL Server | 2008 R2 | Lưu trữ dữ liệu quan hệ và dữ liệu thuộc tính bán cấu trúc |
| ORM / Data Access | LINQ to SQL | Tích hợp .NET | Ánh xạ CSDL quan hệ sang mô hình hướng đối tượng (ORM) |
| Xử lý bất đồng bộ | Ajax Control Toolkit / jQuery | v3.5 / v1.4.2 | Giảm tải băng thông, cập nhật giao diện không cần reload |
| Social API Engine | Facebook C# SDK / REST API | v4.2.1 | Đồng bộ hóa bài viết đánh giá và comment qua Graph/REST API |
| Image Cloud Engine | Flickr .NET API Library | v3.0 | Quản lý và lưu trữ hình ảnh bài viết giới thiệu trên đám mây |
| External Search API | Google Image Search API | v1.0 (REST) | Tự động tìm kiếm và gợi ý ảnh minh họa sản phẩm qua AJAX |
Thiết kế Cơ sở dữ liệu (Semi-structured EAV Schema)
Hệ thống giải quyết triệt để bài toán phân mảnh thuộc tính bằng cách áp dụng mô hình Entity-Attribute-Value (EAV).
+-------------------+ +--------------------+ +-------------------+
| Category | 1 * | CategoryAttribute | * 1 | Attribute |
|-------------------|--------|--------------------|--------|-------------------|
| PK CategoryID | | PK,FK CategoryID | | PK AttributeID |
| CategoryName | | PK,FK AttributeID | | AttributeName |
+-------------------+ +--------------------+ +-------------------+
| 1 | 1
| |
| * | *
+-------------------+ +--------------------+ |
| ProductStore | 1 * | ProductAttribute | |
|-------------------|--------|--------------------|------------------+
| PK ProductID | | PK,FK ProductID |
| FK StoreID | | PK,FK AttributeID |
| FK ProductLineID | | AttributeValue|
| Price | +--------------------+
+-------------------+
- Nhóm bảng Sản phẩm & Gian hàng:
ProductStore(ProductID[PK],ProductName,StoreID[FK],ProductLineID[FK],Price,Description,TotalView,Discontinued).ProductImage(ImgID[PK],ImgUrl,ProductID[FK]).RelatedProduct(ProductID[PK, FK],RelateProductID[PK, FK]).Manufactory(ManufactoryID[PK],ManufactoryName).
- Nhóm bảng Thuộc tính động (EAV Pattern):
Category(CategoryID[PK],CategoryName,Parent,TotalProduct,Enabled).Attribute(AttributeID[PK],AttributeName).CategoryAttribute(CategoryID[PK, FK],AttributeID[PK, FK]) – Quy định loại sản phẩm có những thuộc tính nào.ProductAttribute(ProductID[PK, FK],AttributeID[PK, FK],AttributeValue[nvarchar(200)]) – Lưu giá trị thực tế của từng sản phẩm.
- Nhóm bảng Tiêu chí Đánh giá (Rate Dynamic Template):
RateTemplate(RateTemplateID[PK],RateName).RateCategory(CategoryID[PK, FK],RateTemplateID[PK, FK]).RateProduct(ProductID[PK, FK],RateTemplateID[PK, FK],Value[tinyint: 1-10]).
- Nhóm bảng Đấu giá ngược (Reverse Bidding System):
BidRequest(BidRequestID[PK],UserName[FK],CreatedDate,Status,Description).BidRequestDetail(BidRequestDetailID[PK],BidRequestID[FK],ProductName,Quantity,Description).Bid(BidID[PK],StoreID[FK],BidRequestID[FK],CreatedDate,Status).BidDetail(BidID[PK, FK],ProductID[PK, FK],Price,Description).
- Nhóm bảng Mạng xã hội & Khuyến mãi:
ProductLine(ProductLineID[PK],CategoryID[FK],ManufactoryID[FK],FacebookUserName,FacebookID,UserName[FK]).Blog(BlogID[PK],ProductLineID[FK],FacebookBlogID,Title,Content,CreatedDate).PromotionProgram,PromotionDetail,PromotionType– Hỗ trợ giảm giá số tiền cố định, giảm theo %, hoặc tặng quà đính kèm.
-- DDL Trích xuất: Bảng lưu giá trị thuộc tính động bán cấu trúc
CREATE TABLE [dbo].[ProductAttribute](
[ProductID] [int] NOT NULL,
[AttributeID] [int] NOT NULL,
[AttributeValue] [nvarchar](200) NOT NULL,
CONSTRAINT [PK_ProductAttribute] PRIMARY KEY CLUSTERED
(
[ProductID] ASC,
[AttributeID] ASC
),
CONSTRAINT [FK_ProductAttribute_ProductStore] FOREIGN KEY([ProductID])
REFERENCES [dbo].[ProductStore] ([ProductID]) ON DELETE CASCADE,
CONSTRAINT [FK_ProductAttribute_Attribute] FOREIGN KEY([AttributeID])
REFERENCES [dbo].[Attribute] ([AttributeID])
);
Thiết kế An toàn & Phân quyền (RBAC)
Hệ thống thiết lập ma trận phân quyền 3 cấp (Roles Zone):
- Level 1 (Administrator): Toàn quyền kiểm soát danh mục (
Category), nhà sản xuất (Manufactory), cấu hình thuộc tính hệ thống, quản lý tài khoản và duyệt gian hàng. - Level 2 (Blogger & Seller):
- Seller: Quản lý kho hàng của gian hàng riêng, thiết lập chương trình khuyến mãi (
PromotionProgram), gửi báo giá cho đơn chào giá (Bid). - Blogger: Quản lý nội dung bài viết và đồng bộ dữ liệu với tài khoản Facebook của từng dòng sản phẩm (
ProductLine).
- Seller: Quản lý kho hàng của gian hàng riêng, thiết lập chương trình khuyến mãi (
- Level 3 (Customer / Buyer): Đăng ký tài khoản, quản lý giỏ hàng, tạo yêu cầu chào giá (
BidRequest), đánh giá sản phẩm theo template điểm sao.
Phương pháp luận phát triển (Methodology)
Dự án áp dụng quy trình phát triển lặp kết hợp giữa phân tích hình thức và kiểm thử liên tục (Iterative Waterfall with Continuous Testing):
- Giai đoạn 1 (Tuần 1 - 3): Phân tích yêu cầu & Thiết kế Mockup giao diện: Phác thảo toàn bộ layout người dùng (.aspx) để trực quan hóa cấu trúc dữ liệu trước khi chuẩn hóa schema.
- Giai đoạn 2 (Tuần 4 - 7): Thiết kế CSDL & Xây dựng lớp DAL/BLL với LINQ: Tạo bảng trên SQL Server 2008, ánh xạ qua LINQ to SQL DataContext, hiện thực các phương thức nghiệp vụ đóng gói.
- Giai đoạn 3 (Tuần 8 - 12): Hiện thực giao diện & Tích hợp Third-party APIs: Lập trình Code-Behind, tích hợp AJAX Toolkit, jQuery, Google Image API và Facebook .NET.
- Giai đoạn 4 (Tuần 13 - 15): Kiểm thử chức năng, tối ưu hóa truy vấn và hoàn thiện tài liệu: Kiểm thử tải, đánh giá hiệu năng lưu bộ nhớ đệm (caching) và hoàn thiện báo cáo khóa luận.
Implementation và kết quả
Quá trình phát triển và Thuật toán cốt lõi
1. Hiện thực Lớp Truy xuất Dữ liệu (DAL) và Nghiệp vụ (BLL) với LINQ to SQL
Công nghệ LINQ to SQL tự động ánh xạ quan hệ khóa ngoại giữa các bảng thành các thuộc tính đối tượng (Navigation Properties), giúp loại bỏ các câu truy vấn SQL thuần phức tạp và tăng cường tính an toàn kiểu dữ liệu (Type-Safety).
// Business Logic Layer: ProductControl.cs
public class ProductControl
{
private OpenShopDataContext db = new OpenShopDataContext();
// Lấy thông tin sản phẩm kết hợp thuộc tính động theo ID
public ProductDetailViewModel GetProductDetail(int productId)
{
var product = db.ProductStores
.Where(p => p.ProductID == productId && p.Discontinued == false)
.Select(p => new ProductDetailViewModel
{
ProductID = p.ProductID,
ProductName = p.ProductName,
Price = p.Price,
StoreName = p.Store.StoreName,
ManufactoryName = p.ProductLine.Manufactory.ManufactoryName,
CategoryName = p.ProductLine.Category.CategoryName,
Attributes = db.ProductAttributes
.Where(pa => pa.ProductID == p.ProductID)
.Select(pa => new AttributeItemDTO
{
AttributeName = pa.Attribute.AttributeName,
Value = pa.AttributeValue
}).ToList()
}).FirstOrDefault();
return product;
}
}
2. Thuật toán So sánh Động Sản phẩm (Dynamic Product Comparator)
Hệ thống cho phép người dùng chọn $N$ sản phẩm cùng loại để so sánh. Thuật toán duyệt qua danh sách thuộc tính hợp nhất (Union of Attributes) và áp dụng đánh dấu màu sắc (Highlighting) đối với các giá trị khác nhau:
$$\Delta(Attr_k) = \begin{cases} \text{Highlight (Khác biệt)}, & \exists i, j: Value(P_i, Attr_k) \neq Value(P_j, Attr_k) \ \text{Normal (Đồng nhất)}, & \forall i, j: Value(P_i, Attr_k) = Value(P_j, Attr_k) \end{cases}$$
// BLL xử lý so sánh thuộc tính giữa 2 sản phẩm
public DataTable CompareProducts(int productAId, int productBId, int categoryId)
{
DataTable dt = new DataTable();
dt.Columns.Add("AttributeName");
dt.Columns.Add("ProductA_Value");
dt.Columns.Add("ProductB_Value");
dt.Columns.Add("IsDifferent", typeof(bool));
var categoryAttributes = db.CategoryAttributes
.Where(ca => ca.CategoryID == categoryId)
.Select(ca => ca.Attribute).ToList();
foreach (var attr in categoryAttributes)
{
string valA = db.ProductAttributes
.Where(pa => pa.ProductID == productAId && pa.AttributeID == attr.AttributeID)
.Select(pa => pa.AttributeValue).FirstOrDefault() ?? "N/A";
string valB = db.ProductAttributes
.Where(pa => pa.ProductID == productBId && pa.AttributeID == attr.AttributeID)
.Select(pa => pa.AttributeValue).FirstOrDefault() ?? "N/A";
bool isDiff = !valA.Trim().Equals(valB.Trim(), StringComparison.OrdinalIgnoreCase);
dt.Rows.Add(attr.AttributeName, valA, valB, isDiff);
}
return dt;
}
3. Tìm kiếm và Tự động Thay thế Ảnh với Google Image API & jQuery
Khi người bán nhập tên sản phẩm, bộ lắng nghe sự kiện keyup trên client sẽ gửi yêu cầu JSONP bất đồng bộ đến Google Image API để hiển thị ngay ảnh gợi ý mà không cần rời trang:
// Client-side Asynchronous Image Search
$('#txtProductName').keyup(function () {
var query = $(this).val();
if (query.length > 3) {
var apiUrl = "https://ajax.googleapis.com/ajax/services/search/images?v=1.0&q="
+ encodeURIComponent(query) + "&rsz=4&callback=?";
$.getJSON(apiUrl, function (data) {
$('#imageSuggestions').empty();
$.each(data.responseData.results, function (i, item) {
var imgThumb = $('<img />')
.attr('src', item.tbUrl)
.attr('title', 'Kéo thả vào bài viết')
.addClass('draggable-thumb')
.click(function() {
$('#txtSelectedImageUrl').val(item.unescapedUrl);
$('#imgPreview').attr('src', item.unescapedUrl);
});
$('#imageSuggestions').append(imgThumb);
});
});
}
});
Kiểm thử và Đánh giá hiệu năng
Biểu đồ so sánh kích thước Payload (KB) giữa các kỹ thuật cập nhật giao diện
-----------------------------------------------------------------------------
Full Page PostBack (ASP.NET thuần) : [========================================] 54.6 KB
ASP.NET UpdatePanel (ACT) : [=============] 18.2 KB
jQuery AJAX + JSON Endpoint : [==] 2.4 KB (Giảm 95.6% payload)
-----------------------------------------------------------------------------
Kết quả đo lường tải và kích thước gói tin
| Kỹ thuật truyền tải | Kích thước gói tin truyền đi (Request) | Kích thước dữ liệu nhận về (Response) | Thời gian phản hồi trung bình ($T_{avg}$) |
|---|---|---|---|
| Full Page PostBack | 1.8 KB (bao gồm ViewState) | 52.8 KB (toàn bộ HTML/CSS DOM) | 840 ms |
| ASP.NET UpdatePanel | 2.4 KB (bao gồm Async ViewState) | 15.8 KB (Delta markup HTML) | 320 ms |
| jQuery AJAX + WebService | 0.3 KB (chỉ chuỗi JSON tham số) | 2.1 KB (JSON Payload dữ liệu thô) | 115 ms |
- Độ bao phủ kiểm thử (Test Coverage): Hệ thống đạt 100% kịch bản kiểm thử luồng người dùng chính (Đăng ký $\rightarrow$ Đăng sản phẩm $\rightarrow$ Tìm kiếm $\rightarrow$ Yêu cầu chào giá $\rightarrow$ Đặt hàng).
- Tối ưu hóa CSDL: Cấu trúc bảng
ProductAttributevới chỉ mục kép(ProductID, AttributeID)trên Clustered Index giúp tốc độ truy vấn danh sách 20 thuộc tính của một sản phẩm đạt dưới 4 ms trên tập dữ liệu $10.000$ bản ghi.
Đổi mới và đóng góp
- Khắc phục triệt để bài toán lãng phí dữ liệu thuộc tính rỗng (Sparse Columns):
- Trước cải tiến: Bảng sản phẩm dùng chung chứa 40 cột thuộc tính cố định. Khi lưu một sản phẩm điện thoại (chỉ cần 5 thuộc tính: Băng tần, Camera, Màu sắc, Pin, Bộ nhớ), có tới 35 cột mang giá trị
NULL. - Sau cải tiến: Cơ chế Semi-structured EAV tách biệt bảng định nghĩa (
Attribute) và bảng giá trị (ProductAttribute), giúp loại bỏ 100% dung lượng lưu trữ dư thừa cho các trường không sử dụng.
- Trước cải tiến: Bảng sản phẩm dùng chung chứa 40 cột thuộc tính cố định. Khi lưu một sản phẩm điện thoại (chỉ cần 5 thuộc tính: Băng tần, Camera, Màu sắc, Pin, Bộ nhớ), có tới 35 cột mang giá trị
- Ứng dụng quy trình tiếp thị mạng xã hội khép kín theo mô hình Philip Kotler:
- Tích hợp tài khoản Facebook chuyên biệt cho từng dòng sản phẩm (
ProductLine). Mỗi khi có mặt hàng mới, hệ thống tự động thông báo lên tường (Wall) Facebook để cộng đồng thảo luận, tạo tín hiệu niềm tin (Social Proof) trước khi người mua quyết định giao dịch.
- Tích hợp tài khoản Facebook chuyên biệt cho từng dòng sản phẩm (
- Mô hình Đấu thầu ngược (Reverse Bidding) linh hoạt:
- Thay vì chỉ có người bán định giá, người mua có thể tạo yêu cầu chào giá (
BidRequest) kèm mô tả nhu cầu. Nhiều cửa hàng tham gia cạnh tranh (BidDetail), mang lại mức giá tối ưu nhất cho người tiêu dùng.
- Thay vì chỉ có người bán định giá, người mua có thể tạo yêu cầu chào giá (
Ứng dụng thực tế và triển khai
Kịch bản triển khai thực tế (Real-World Use Cases)
- Kịch bản Sàn thương mại điện tử chuyên ngành thiết bị số: Các cửa hàng máy tính, điện máy đăng ký gian hàng trên OpenShop. Quản trị viên chỉ cần tạo danh mục "Laptop" và gán bộ thuộc tính (CPU, RAM, VGA, Ổ cứng, Kích thước màn hình). Khi thêm sản phẩm mới, giao diện nhập liệu tự động sinh các trường tương ứng mà không cần viết lại mã nguồn.
- Kịch bản Mua hàng số lượng lớn cho doanh nghiệp: Một công ty cần trang bị 50 bộ máy tính văn phòng. Trưởng phòng IT đăng một đơn
BidRequest. Hệ thống gửi thông báo đến tất cả các gian hàng thuộc danh mục "Thiết bị văn phòng". Các chủ cửa hàng gửi bảng chào giá chi tiết (Bid) trực tiếp vào hệ thống. Người mua so sánh và chọn đơn chào giá có chi phí và thời gian giao hàng tốt nhất.
Yêu cầu cấu hình triển khai hạ tầng
+-------------------------------------------------------------------------------+
| YÊU CẦU HẠ TẦNG TRIỂN KHAI HỆ THỐNG |
+-----------------------------------+-------------------------------------------+
| THÀNH PHẦN PHẦN CỨNG / MÔI TRƯỜNG | THÔNG SỐ TỐI THIỂU KHUYẾN NGHỊ |
+-----------------------------------+-------------------------------------------+
| Máy chủ Web (Web Server) | Windows Server 2008 / IIS 7.0 trở lên |
| Runtime Môi trường | Microsoft .NET Framework 3.5 SP1 hoặc 4.0 |
| Máy chủ CSDL (Database Server) | Microsoft SQL Server 2008 Standard Edition|
| Cấu hình phần cứng tối thiểu | CPU Dual Core 2.4 GHz, 4 GB RAM, 80 GB HDD|
| Kết nối mạng máy chủ | Băng thông tối thiểu 100 Mbps đối xứng |
+-----------------------------------+-------------------------------------------+
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Công nghệ truy xuất dữ liệu: LINQ to SQL được tối ưu tốt cho Microsoft SQL Server nhưng khó chuyển đổi linh hoạt sang các hệ quản trị CSDL khác như MySQL hay PostgreSQL.
- Xử lý bất đồng bộ hỗn hợp: Việc sử dụng song song cả
UpdatePanel(của ASP.NET AJAX) vàjQuery AJAXđôi khi dẫn đến hiện tượng xung đột nạp lại DOM hoặc phân tán mã nguồn điều khiển giao diện. - Tích hợp API phụ thuộc bên ngoài: Tính năng tìm kiếm ảnh phụ thuộc hoàn toàn vào hạn ngạch (Rate Limit) và định dạng phản hồi từ Google Image API và Facebook Graph API.
Hướng phát triển trong tương lai
- Chuyển đổi tầng truy xuất dữ liệu từ LINQ to SQL sang Entity Framework Core, hỗ trợ mô hình Code-First và tương thích đa nền tảng CSDL.
- Xây dựng kiến trúc RESTful Web API hoàn chỉnh kết hợp kiến trúc Single Page Application (sử dụng React hoặc Vue.js) để thay thế hoàn toàn ASP.NET WebForms.
- Tích hợp cổng thanh toán trực tuyến qua OnePAY/VNPay và phát triển ứng dụng di động (Mobile App) đồng bộ hóa qua API.
Đối tượng hưởng lợi
- Sinh viên & Học viên: Tiếp cận mã nguồn mẫu thực tế về cách tổ chức Kiến trúc 3 lớp, ứng dụng mô hình ánh xạ đối tượng LINQ to SQL và kỹ thuật xử lý dữ liệu động Semi-structured EAV.
- Lập trình viên Web .NET: Nắm bắt kỹ thuật tối ưu hóa gói tin AJAX, tích hợp đồng bộ các API mạng xã hội lớn (Facebook, Flickr, Google) vào một hệ thống thương mại điện tử hợp nhất.
- Chủ doanh nghiệp & Hộ kinh doanh: Sở hữu giải pháp thương mại điện tử đa gian hàng chi phí thấp, tối ưu hóa quy trình quảng bá sản phẩm thông qua mạng xã hội và kênh đấu thầu ngược.
- Nhà nghiên cứu Marketing: Cung cấp mô hình thực nghiệm chứng minh sự tương tác giữa chu trình mua hàng của Philip Kotler với các tính năng kỹ thuật trên môi trường trực tuyến.
Câu hỏi thường gặp
1. Hệ thống cần môi trường gì để triển khai vận hành ổn định?
Để triển khai OpenShop, máy chủ cần cài đặt hệ điều hành Windows Server 2008 trở lên, kích hoạt dịch vụ IIS 7.0, cài đặt .NET Framework 3.5 SP1/4.0 và hệ quản trị cơ sở dữ liệu Microsoft SQL Server 2008.
2. Mô hình thuộc tính động Semi-structured (EAV) có làm chậm tốc độ truy vấn khi dữ liệu tăng lớn không?
Khi dữ liệu bảng ProductAttribute lên đến hàng triệu dòng, tốc độ truy vấn có thể bị ảnh hưởng nếu thực hiện phép JOIN phức tạp. Tuy nhiên, bằng cách thiết lập Clustered Index trên cặp khóa (ProductID, AttributeID) và kết hợp cơ chế lưu bộ đệm (Caching) tầng BLL, hệ thống vẫn duy trì thời gian phản hồi dưới 50 ms.
3. Làm thế nào để hệ thống tự động đồng bộ bài viết lên Facebook?
Hệ thống sử dụng thư viện Facebook .NET kết hợp API Key và Secret Key được cấp phát từ Facebook Developer App. Khi Blogger hoàn tất nội dung trên OpenShop, hệ thống sẽ thực hiện lời gọi API bảo mật để đẩy nội dung trực tiếp lên trang cá nhân hoặc Fanpage tương ứng của dòng sản phẩm (ProductLine).
4. Tại sao cần kết hợp cả AJAX Control Toolkit và jQuery?
AJAX Control Toolkit cung cấp các Server Control tiện lợi (như UpdatePanel, ModalPopupExtender) giúp phát triển nhanh giao diện. Trong khi đó, jQuery được sử dụng cho các tác vụ đòi hỏi sự linh hoạt cao, can thiệp sâu vào DOM và thực hiện các lời gọi AJAX nhẹ với định dạng JSON để đạt hiệu năng tối đa.
5. Cơ chế Chào giá (Bid) khác gì so với quy trình đặt hàng truyền thống?
Trong đặt hàng truyền thống, người mua chấp nhận mức giá niêm yết cố định từ một gian hàng. Trong cơ chế Chào giá, người mua phát lệnh yêu cầu (BidRequest) kèm số lượng mong muốn; tất cả các gian hàng có sản phẩm phù hợp sẽ tham gia chào giá cạnh tranh (Bid), giúp người mua lựa chọn được báo giá tối ưu nhất.
Kết luận
Đồ án tốt nghiệp "Website thương mại điện tử theo mô hình C2C / B2C (OpenShop)" đã giải quyết thành công các thách thức lớn trong thương mại điện tử giai đoạn 2010. Bằng việc kết hợp sáng tạo giữa Kiến trúc 3 lớp, công nghệ LINQ to SQL, mô hình dữ liệu bán cấu trúc linh hoạt (Semi-structured Data) và cơ chế tích hợp mạng xã hội Facebook API, hệ thống mang lại một giải pháp toàn diện, tối ưu hóa cả về mặt kỹ thuật lẫn trải nghiệm người dùng. Đây là tài liệu tham khảo có giá trị ứng dụng cao cho việc xây dựng và phát triển các hệ thống thương mại điện tử hiện đại.