一、系统概述
美菜生鲜系统的商品分类管理模块是电商平台的核心功能之一,用于实现生鲜商品的分类展示、搜索和管理。该模块需要支持多级分类、分类属性管理、分类关联商品等功能。
二、核心功能设计
1. 分类体系结构设计
- 多级分类:支持3-5级分类结构(如:生鲜→肉类→猪肉→部位肉)
- 分类类型:
- 一级分类(大类):如蔬菜、水果、肉类等
- 二级分类(中类):如叶菜类、根茎类
- 三级分类(小类):如菠菜、土豆
- 可选四级/五级分类:如有机菠菜、进口土豆
2. 分类属性管理
- 基础属性:分类名称、编码、父级分类、排序权重
- 业务属性:
- 是否显示在导航栏
- 是否支持搜索
- 分类图标/图片
- SEO相关信息(标题、关键词、描述)
- 扩展属性:
- 保质期默认值
- 存储条件建议
- 常见规格模板
3. 分类与商品关联
- 商品分类绑定:支持一个商品属于多个分类(多对多关系)
- 分类筛选条件:为每个分类配置可筛选的属性(如水果分类可筛选产地、甜度等)
- 分类推荐规则:设置分类下的热销商品、新品推荐等
三、技术实现方案
1. 数据库设计
```sql
-- 分类表
CREATE TABLE `category` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT 分类名称,
`code` varchar(20) DEFAULT NULL COMMENT 分类编码,
`parent_id` bigint(20) DEFAULT NULL COMMENT 父级分类ID,
`level` tinyint(4) NOT NULL COMMENT 分类层级,
`sort_order` int(11) DEFAULT 0 COMMENT 排序权重,
`icon` varchar(255) DEFAULT NULL COMMENT 分类图标,
`is_show` tinyint(1) DEFAULT 1 COMMENT 是否显示,
`is_nav` tinyint(1) DEFAULT 0 COMMENT 是否导航栏显示,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 分类属性表
CREATE TABLE `category_attribute` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`category_id` bigint(20) NOT NULL COMMENT 分类ID,
`attr_name` varchar(50) NOT NULL COMMENT 属性名称,
`attr_key` varchar(50) NOT NULL COMMENT 属性键,
`attr_type` tinyint(4) NOT NULL COMMENT 属性类型(1:文本 2:数字 3:枚举),
`is_required` tinyint(1) DEFAULT 0 COMMENT 是否必填,
`is_filter` tinyint(1) DEFAULT 0 COMMENT 是否用于筛选,
`sort_order` int(11) DEFAULT 0 COMMENT 排序,
PRIMARY KEY (`id`),
KEY `idx_category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 商品分类关联表
CREATE TABLE `product_category` (
`product_id` bigint(20) NOT NULL COMMENT 商品ID,
`category_id` bigint(20) NOT NULL COMMENT 分类ID,
`is_main` tinyint(1) DEFAULT 0 COMMENT 是否主分类,
PRIMARY KEY (`product_id`,`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
2. 后端API设计
```java
// 分类管理接口
public interface CategoryService {
// 添加分类
Result addCategory(CategoryDTO categoryDTO);
// 更新分类
Result updateCategory(CategoryDTO categoryDTO);
// 删除分类(逻辑删除)
Result deleteCategory(Long categoryId);
// 获取分类树
Result
> getCategoryTree();
// 获取分类详情
Result getCategoryDetail(Long categoryId);
// 获取分类下的商品列表
Result> getProductsByCategory(
Long categoryId, Integer pageNum, Integer pageSize);
}
// 分类属性接口
public interface CategoryAttributeService {
// 添加分类属性
Result addAttribute(AttributeDTO attributeDTO);
// 更新分类属性
Result updateAttribute(AttributeDTO attributeDTO);
// 删除分类属性
Result deleteAttribute(Long attributeId);
// 获取分类属性列表
Result> getAttributesByCategory(Long categoryId);
}
```
3. 前端实现要点
- 分类树形展示:使用递归组件实现多级分类展示
- 拖拽排序:支持分类的拖拽调整顺序
- 属性管理:动态表单生成分类属性配置界面
- 分类导航:实现前端路由与分类的关联
```javascript
// Vue.js 分类树组件示例
:data="categoryTree"
node-key="id"
:props="defaultProps"
:expand-on-click-node="false"
@node-click="handleNodeClick"
>
{{ node.label }}
append(data)">
添加子类
remove(node, data)">
删除
<script>
export default {
data() {
return {
categoryTree: [], // 从API获取的分类树数据
defaultProps: {
children: children,
label: name
}
}
},
methods: {
// 获取分类树
async fetchCategoryTree() {
const res = await this.$api.getCategoryTree();
this.categoryTree = res.data;
},
// 其他方法...
}
}
```
四、关键业务逻辑实现
1. 分类移动处理
```java
public Result moveCategory(Long categoryId, Long targetParentId, Integer position) {
// 1. 验证分类是否存在
Category category = categoryRepository.findById(categoryId)
.orElseThrow(() -> new BusinessException("分类不存在"));
// 2. 验证目标父分类是否存在
if (targetParentId != null) {
Category parent = categoryRepository.findById(targetParentId)
.orElseThrow(() -> new BusinessException("目标父分类不存在"));
}
// 3. 不能将分类移动到自己的子分类下
if (isDescendant(categoryId, targetParentId)) {
throw new BusinessException("不能将分类移动到自己的子分类下");
}
// 4. 更新分类的父ID和排序
category.setParentId(targetParentId);
// 计算新的排序位置...
categoryRepository.save(category);
// 5. 重建分类缓存(如使用Redis)
rebuildCategoryCache();
return Result.success();
}
```
2. 分类商品统计
```java
public CategoryStatsVO getCategoryStats(Long categoryId) {
// 1. 获取分类下商品总数
long productCount = productRepository.countByCategoryId(categoryId);
// 2. 获取分类下销量TOP10商品
List topProducts = productRepository
.findTop10ByCategoryIdOrderBySalesDesc(categoryId);
// 3. 获取分类访问量(需要埋点数据)
long viewCount = categoryViewRepository.countByCategoryId(categoryId);
return new CategoryStatsVO(productCount, topProducts, viewCount);
}
```
五、性能优化方案
1. 分类缓存:
- 使用Redis缓存分类树结构
- 分类变更时通过消息队列通知更新缓存
2. 数据库优化:
- 为分类表添加适当的索引
- 使用闭包表(Closure Table)模式存储分类层级关系(适用于超多级分类)
3. 前端优化:
- 分类数据懒加载
- 虚拟滚动处理超长分类列表
六、扩展功能考虑
1. 智能分类建议:基于商品名称、描述自动推荐分类
2. 分类季节性标记:标记应季分类,用于前端展示优化
3. 分类运营数据看板:展示各分类的GMV、转化率等运营指标
4. AB测试支持:不同分类展示不同的UI样式进行测试
七、实施路线图
1. 第一阶段:基础分类管理(增删改查、树形展示)
2. 第二阶段:分类属性管理、商品关联
3. 第三阶段:分类运营数据分析、智能推荐
4. 第四阶段:个性化分类展示、AB测试
以上方案可根据美菜生鲜系统的具体业务需求和技术栈进行调整和扩展。