Triển khai Hệ thống Phân loại Đa cấp và Lọc thuộc tính Sản phẩm trên Medusa
Trong các nền tảng thương mại điện tử hiện đại, hệ thống điều hướng sản phẩm và cơ chế lọc thuộc tính đóng vai trò then chốt trong việc nâng cao trải nghiệm người dùng. Medusa, một framework thương mại điện tử nguồn mở hiện đại, cung cấp hệ thống phân loại đa cấp và cơ chế lọc thuộc tính mạnh mẽ, cho phép nhà phát triển dễ dàng xây dựng cấu trúc điều hướng sản phẩm phức tạp. Bài viết này sẽ đi sâu vào cách Medusa thực hiện các chức năng này, giúp bạn xây dựng hệ thống phân loại chuyên nghiệp cho nền tảng thương mại điện tử của mình.
Tầm quan trọng của phân loại và lọc sản phẩm
Một cấu trúc phân loại tốt trực tiếp ảnh hưởng đến trải nghiệm mua sắm và tỷ lệ chuyển đổi của người dùng. Khi người dùng truy cập một trang web với hàng ngàn sản phẩm, không có điều hướng phân loại rõ ràng, họ sẽ rất khó tìm thấy sản phẩm mong muốn. Medusa thông qua hệ thống phân loại đa cấp và cơ chế lọc thuộc tính, cho phép người dùng:
- Nhanh chóng xác định danh mục sản phẩm mục tiêu
- Lọc chính xác sản phẩm thông qua kết hợp thuộc tính
- Duyệt các sản phẩm trong danh mục liên quan
- Nâng cao hiệu suất và sự hài lòng trong mua sắm
Triển khai Hệ thống Phân loại Đa cấp trên Medusa
Thiết kế cấu trúc phân loại dạng cây
Medusa sử dụng cấu trúc phân cấp dạng cây cho sản phẩm, hỗ trợ phân loại lồng ghép vô hạn. Mô hình này được thể hiện rõ trong tệp packages/modules/product/src/models/product-category.ts:
const DanhMucSanPham = model
.define("DanhMucSanPham", {
id: model.id({ prefix: "dmsp" }).primaryKey(),
ten: model.text().searchable().translatable(),
moTa: model.text().searchable().translatable().default(""),
duongDan: model.text(),
trangThai: model.boolean().default(false),
danhMucCha: model
.belongsTo(() => DanhMucSanPham, {
mappedBy: "danhMucCon",
})
.nullable(),
danhMucCon: model.hasMany(() => DanhMucSanPham, {
mappedBy: "danhMucCha",
}),
sanPhams: model.manyToMany(() => SanPham, {
mappedBy: "danhMucs",
}),
})
Phân tích các tính năng chính
- Trường duongDan: Đây là trường theo dõi đường dẫn đặc biệt, ghi lại đường dẫn cấp độ đầy đủ của danh mục. Ví dụ
"dien-thoai.smartphone.iphone"cho biết danh mục "iPhone" nằm trong cấu trúc "Điện thoại → Smartphone → iPhone". - Quan hệ父子: Thông qua các trường
danhMucChavàdanhMucCon, thiết lập quan hệ hai chiều, hỗ trợ truy đệc và thao tác cấu trúc cây. - Quan hệ nhiều-nhiều: Một sản phẩm có thể thuộc nhiều danh mục, một danh mục có thể chứa nhiều sản phẩm, thiết kế mối quan hệ linh hoạt này đáp ứng các kịch bản thương mại điện tử phức tạp.
Nguyên lý hoạt động của chức năng lọc thuộc tính
Hệ thống tùy chọn và biến thể sản phẩm
Trong tệp packages/modules/product/src/models/product.ts, Medusa định nghĩa mối quan hệ giữa tùy chọn sản phẩm (ProductOption) và biến thể (ProductVariant):
const SanPham = model
.define("SanPham", {
// ... Các trường khác
tuyenChon: model.hasMany(() => TuyenChonSanPham, {
mappedBy: "sanPham",
}),
danhMucs: model.manyToMany(() => DanhMucSanPham, {
pivotTable: "san_pham_danh_muc",
mappedBy: "sanPhams",
}),
})
Cơ chế hoạt động của hệ thống lọc
Hệ thống lọc của Medusa dựa trên các khái niệm cốt lõi sau:
- Tùy chọn sản phẩm: Xác định các chiều thuộc tính của sản phẩm, như màu sắc, kích thước, chất liệu
- Giá trị tùy chọn: Mỗi biến thể tương ứng với một tổ hợp giá trị tùy chọn cụ thể
- Liên kết danh mục: Sản phẩm liên kết với danh mục thông qua quan hệ nhiều-nhiều
Kịch bản ứng dụng thực tế
Giả sử chúng ta xây dựng trang thương mại điện tử thời trang:
- Cấu trúc phân loại: Thời trang → Quần áo nam → Áo sơ mi
- Tùy chọn sản phẩm: Màu sắc (đỏ, xanh, trắng), Kích thước (S, M, L, XL)
- Logic lọc: Người dùng có thể lọc các sản phẩm "Áo sơ mi" theo "Màu đỏ" và "Kích thước L"
Cấu hình và sử dụng tính năng lọc phân loại
1. Tạo cấu trúc phân loại đa cấp
Themedusa cung cấp giao diện quản lý hoặc API để tạo phân loại đa cấp một cách dễ dàng:
# Tạo danh mục cấp cao nhất
POST /admin/danh-muc-san-pham
{
"ten": "Điện tử",
"duongDan": "dien-tu"
}
# Tạo danh mục con
POST /admin/danh-muc-san-pham
{
"ten": "Laptop",
"duongDan": "laptop",
"danhMucChaId": "may-tinh"
}
2. Thiết lập thuộc tính sản phẩm
Định nghĩa các tùy chọn thuộc tính có thể lọc cho sản phẩm:
# Thêm tùy chọn sản phẩm
POST /admin/san-pham/{id}/tuyen-chon
{
"ten": "Màu sắc",
"giaTri": ["Đỏ", "Xanh", "Trắng"]
}
3. Triển khai lọc trên giao diện người dùng
Trong ứng dụng frontend, có thể triển khai chức năng lọc như sau:
- Điều hướng phân loại: Hiển thị cấu trúc phân loại dạng cây
- Bộ lọc thuộc tính: Tạo động điều kiện lọc dựa trên tùy chọn sản phẩm
- Điều hướng breadcrumb: Hiển thị đường dẫn lọc hiện tại
Kỹ thuật tối ưu hóa hiệu năng
Tối ưu hóa chỉ mục
Medusa đã thiết lập chỉ mục cho các trường quan trọng trong danh-muc-san-pham.ts:
.indexes([
{
name: "IDX_danh_muc_duong_dan",
on: ["duongDan"], // Tối ưu hiệu năng truy vấn đường dẫn
unique: false,
where: "deleted_at IS NULL",
},
{
name: "IDX_duong_dan_uy_nhat",
on: ["duongDan"], // Đảm bảo duy nhất đường dẫn
unique: true,
where: "deleted_at IS NULL",
},
])
Đề xuất tối ưu hóa truy vấn
- Tải chậm: Chỉ tải các danh mục con khi cần thiết
- Chiến lược bộ nhớ đệm: Lưu trữ dữ liệu phân loại tĩnh vào bộ nhớ đệm
- Phân trang: Xử lý cơ chế phân trang khi có nhiều sản phẩm
Phân tích tình huống thực tế
Tình huống: Hệ thống phân loại cửa hàng điện tử
Một cửa hàng điện tử điển hình có thể có cấu trúc phân loại như sau:
Điện tử
├── Điện thoại
│ ├── Smartphone
│ └── Điện thoại cơ bản
├── Máy tính
│ ├── Laptop
│ │ ├── Laptop gaming
│ │ └── Laptop văn phòng
│ └── Desktop
└── Phụ kiện
├── Tai nghe
└── Sạc dự phòng
Mỗi danh mục có thể thiết lập các thuộc tính lọc cụ thể, như:
- Điện thoại: Thương hiệu, bộ nhớ trong, màu sắc, khoảng giá
- Laptop: CPU, card đồ họa, kích thước màn hình, trọng lượng
Mở rộng chức năng nâng cao
Logic lọc tùy chỉnh
Nhà phát triển có thể mở rộng logic lọc thông qua tầng dịch vụ trong packages/modules/product/src/services/dich-vu-san-pham.ts, thực hiện:
- Lọc kết hợp: Truy vấn kết hợp nhiều điều kiện
- Lọc phạm vi: Khoảng giá, phạm vi đánh giá
- Sắp xếp liên quan: Đề xuất danh mục liên quan dựa trên hành vi người dùng
Hỗ trợ đa ngôn ngữ
Hệ thống phân loại của Medusa hỗ trợ đa ngôn ngữ nguyên bản:
ten: model.text().searchable().translatable(),
moTa: model.text().searchable().translatable().default(""),
Điều này có nghĩa là tên và mô tả danh mục có thể dễ dàng chuyển đổi ngôn ngữ, đáp ứng nhu cầu thương mại điện tử đa quốc gia.
Khuyến nghị thực hành tốt nhất
Nguyên tắc thiết kế phân loại
- Kiểm soát độ sâu: Nên giới hạn phân loại không quá 4 cấp, tránh người dùng bị lạc
- Quy tắc đặt tên: Sử dụng tên phân loại rõ ràng, súc tích
- Trùng lặp: Đảm bảo ranh giới giữa các danh mục rõ ràng
Tối ưu hóa trải nghiệm lọc
- Lọc tiến tiến: Trước tiên hiển thị các danh mục chính, sau đó cung cấp lọc chi tiết
- Xem trước kết quả: Hiển thị số lượng sản phẩm dưới mỗi điều kiện lọc
- Lịch sử lọc: Ghi nhớ sở thích lọc của người dùng
Tổng kết
Hệ thống phân loại sản phẩm đa cấp và cơ chế lọc thuộc tính của Medusa cung cấp cơ sở hạ tầng mạnh mẽ và linh hoạt cho các nền tảng thương mại điện tử. Thông qua cấu trúc phân loại dạng cây, hệ thống thuộc tính linh hoạt và cơ chế truy vấn hiệu quả, nhà phát triển có thể dễ dàng xây dựng hệ thống điều hướng sản phẩm vừa đẹp mắt vừa hữu ích.
Dù là cửa hàng精品 nhỏ hay nền tảng thương mại điện tử tổng thể lớn, hệ thống điều hướng phân loại của Medusa đều đáp ứng được nhu cầu. Thiết kế mô-đun và khả năng mở rộng đảm bảo hệ thống có thể phát triển cùng với sự tăng trưởng của doanh nghiệp, mang lại giá trị liên tục cho người bán.
Muốn tìm hiểu sâu hơn về cách triển khai hệ thống phân loại của Medusa? Bạn có thể xem các test case trong packages/modules/product/integration-tests/__tests__/danh-muc-san-pham.spec.ts, tìm hiểu các kịch bản sử dụng và thực hành tốt nhất.
Hãy nhớ rằng, điều hướng phân loại tốt không chỉ là triển khai kỹ thuật, mà còn là một phần quan trọng của trải nghiệm người dùng. Tận dụng hợp lý các chức năng mà Medusa cung cấp sẽ mang lại sự cải thiện đáng kể về tỷ lệ chuyển đổi và sự hài lòng của người dùng cho nền tảng thương mại điện tử của bạn.