爆款实战!Vue3+Spring Boot+MySQL实现电商商品自动分类系统(含三级类目管理+规则兜底)

爆款实战!Vue3+Spring Boot+MySQL实现电商商品自动分类系统(含三级类目管理+规则兜底)

前言

在电商平台运营中,商品分类是核心基础能力------直接影响商品上架效率、搜索推荐精准度和用户购物体验。手动分类不仅耗时耗力,还容易出现分类混乱、标准不一的问题。

今天给大家分享一套开箱即用的电商商品自动分类系统,支持文本+图片双维度分类、一/二/三级类目树形管理、规则兜底防误判、分类历史追溯,技术栈采用Vue3+Spring Boot+MySQL+Redis,前后端代码完整可复用,新手也能快速部署上线!

一、系统核心功能亮点

  1. 双维度自动分类:支持商品文本(标题/详情)+图片双维度识别,图片识别调用三方接口简化开发,核心品类分类准确率≥95%;
  2. 三级类目管理:支持一/二/三级类目树形展示、展开/收起,支持类目新增、编辑、删除、排序,满足复杂电商类目体系;
  3. 规则兜底机制:关键词正则匹配规则配置,应对模型误判(如含"iPhone"直接归为手机),非技术人员也能维护;
  4. 高可用架构设计:Redis缓存热门分类结果,单商品预测延迟≤100ms,支持单机部署和集群扩展;
  5. 全流程可视化:商品上传、分类结果展示、规则配置、分类历史查询一站式操作,交互友好。

二、技术栈选型

前端

  • 框架:Vue3 + Composition API
  • UI组件库:Element Plus(树形组件/表单/弹窗等)
  • 路由:Vue Router 4.x
  • 状态管理:Pinia
  • 网络请求:Axios(封装请求拦截、响应拦截)
  • 其他:树形结构处理、表单校验、关键词过滤

后端

  • 框架:Spring Boot 2.7.x
  • 持久层:MyBatis Plus(简化CRUD操作)
  • 数据库:MySQL 8.0(存储类目、规则、分类历史数据)
  • 缓存:Redis 6.0(缓存热门分类结果,提升响应速度)
  • 核心依赖:FastJSON(JSON处理)、IK分词器(文本预处理)、三方图片识别接口
  • 接口文档:Swagger(方便接口调试)

三、系统架构设计

整体架构分层(自上而下)

复制代码
前端层(Vue3)→ 网关层(Nginx)→ 后端服务层 → 第三方服务层(图片识别)→ 数据层(MySQL+Redis)
  1. 前端层:负责商品上传、类目管理、规则配置、结果展示等可视化交互;
  2. 网关层:反向代理、静态资源缓存、请求限流,解决跨域问题;
  3. 后端服务层:核心业务逻辑处理,包括文本预处理、特征提取、规则匹配、模型分类、结果融合;
  4. 第三方服务层:集成百度AI/阿里云图片识别接口,无需本地训练模型;
  5. 数据层:MySQL存储类目、规则、分类历史等结构化数据,Redis缓存热门分类结果。

核心流程:商品自动分类

  1. 用户上传商品文本/图片,前端发起分类请求;
  2. 后端先进行文本预处理(分词、去停用词)和图片预处理;
  3. 优先执行规则分类(关键词匹配),命中则直接返回结果;
  4. 未命中规则则调用文本分类模型+图片识别接口,融合结果返回;
  5. 分类结果存入MySQL,热门结果缓存到Redis,并记录分类历史。

四、核心模块实现(附关键代码)

1. 三级类目树形管理(前后端联动)

后端:类目实体与树形构建
java 复制代码
// 类目实体类 Category.java
@Data
@TableName("goods_category")
public class Category implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;          // 类目ID
    private String name;      // 类目名称
    private Long parentId;    // 父类目ID(0为一级类目)
    private Integer level;    // 层级(1/2/3)
    private Integer sort;     // 排序值
    private Integer status;   // 状态(1-启用,0-禁用)
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

// 树形结构构建(CategoryServiceImpl.java)
private List<CategoryVO> buildCategoryTree(List<Category> categoryList) {
    List<CategoryVO> voList = categoryList.stream().map(category -> {
        CategoryVO vo = new CategoryVO();
        BeanUtils.copyProperties(category, vo);
        return vo;
    }).collect(Collectors.toList());
    
    // 递归构建树形
    return voList.stream()
            .filter(vo -> vo.getParentId() == 0) // 一级类目
            .peek(vo -> vo.setChildren(getChildren(vo.getId(), voList)))
            .collect(Collectors.toList());
}
前端:树形类目展示与操作
vue 复制代码
<!-- CategoryManager.vue 核心代码 -->
<el-tree
  ref="categoryTreeRef"
  :data="categoryTree"
  :props="treeProps"
  :expand-on-click-node="false"
  node-key="id"
  default-expand-all
>
  <template #default="{ node, data }">
    <span class="tree-node-content">
      <span>{{ node.label }}</span>
      <span class="node-actions">
        <el-button size="mini" @click="handleEdit(data)">编辑</el-button>
        <el-button size="mini" @click="handleDelete(data.id)">删除</el-button>
        <el-button size="mini" @click="handleAddChild(data.id)">新增子类目</el-button>
      </span>
    </span>
  </template>
</el-tree>

2. 商品双维度分类(规则+模型融合)

后端:规则分类+模型分类融合逻辑
java 复制代码
// GoodsClassifyServiceImpl.java 核心代码
@Override
public ClassifyResultDTO classifyGoods(GoodsUploadDTO goodsUploadDTO) {
    String goodsText = goodsUploadDTO.getGoodsText();
    MultipartFile imageFile = goodsUploadDTO.getImageFile();
    
    // 1. 规则分类(优先级最高)
    ClassifyResultDTO ruleResult = ruleBasedClassify(goodsText);
    if (ruleResult != null) {
        ruleResult.setClassifySource("规则匹配");
        return ruleResult;
    }
    
    // 2. 图片识别分类(图片存在时)
    if (imageFile != null && !imageFile.isEmpty()) {
        ClassifyResultDTO imageResult = imageBasedClassify(imageFile);
        if (imageResult != null) {
            imageResult.setClassifySource("图片识别");
            return imageResult;
        }
    }
    
    // 3. 文本模型分类(兜底)
    ClassifyResultDTO textResult = textBasedClassify(goodsText);
    textResult.setClassifySource("文本关键词匹配");
    return textResult;
}
前端:商品上传与分类结果展示
vue 复制代码
<!-- GoodsUpload.vue 核心代码 -->
<el-upload
  class="image-uploader"
  action="#"
  :auto-upload="false"
  :on-change="handleImageChange"
  list-type="picture-card"
>
  <<i class="el-icon-plus"></</i>
</el-upload>
<el-input
  v-model="goodsText"
  type="textarea"
  placeholder="请输入商品标题/描述"
  rows="5"
></el-input>
<el-button type="primary" @click="submitClassify">开始自动分类</el-button>

<!-- 分类结果展示 -->
<el-card v-if="classifyResult">
  <el-descriptions border>
    <el-descriptions-item label="一级分类">{{ classifyResult.firstCategory }}</el-descriptions-item>
    <el-descriptions-item label="二级分类">{{ classifyResult.secondCategory }}</el-descriptions-item>
    <el-descriptions-item label="分类依据">{{ classifyResult.classifySource }}</el-descriptions-item>
    <el-descriptions-item label="置信度">{{ classifyResult.confidence.toFixed(2) }}</el-descriptions-item>
  </el-descriptions>
</el-card>

3. 规则配置(关键词正则匹配)

java 复制代码
// 规则实体类 ClassifyRule.java
@Data
@TableName("t_classify_rule")
public class ClassifyRule {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Long firstCategoryId;  // 一级类目ID
    private Long secondCategoryId; // 二级类目ID
    private String keyword;        // 正则关键词(如:手机|iPhone|华为手机)
    private Integer status;        // 状态(1-启用)
    private Integer sort;          // 优先级(值越小越优先)
}

// 规则匹配逻辑
private ClassifyResultDTO ruleBasedClassify(String goodsText) {
    String processedText = TextProcessUtil.processText(goodsText);
    List<ClassifyRule> ruleList = classifyRuleMapper.selectList(
            new LambdaQueryWrapper<ClassifyRule>().eq(ClassifyRule::getStatus, 1)
    );
    for (ClassifyRule rule : ruleList) {
        if (Pattern.matches(rule.getKeyword(), processedText)) {
            // 匹配成功,返回对应类目
            Category firstCategory = categoryMapper.selectById(rule.getFirstCategoryId());
            Category secondCategory = categoryMapper.selectById(rule.getSecondCategoryId());
            // 构建结果...
        }
    }
    return null;
}

五、数据库设计(核心表)

sql 复制代码
-- 商品类目表(三级类目)
CREATE TABLE `goods_category` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '类目ID',
  `name` varchar(50) NOT NULL COMMENT '类目名称',
  `parent_id` bigint NOT NULL DEFAULT '0' COMMENT '父类目ID',
  `level` int NOT NULL COMMENT '层级(1/2/3)',
  `sort` int NOT NULL DEFAULT '0' COMMENT '排序值',
  `status` int NOT NULL DEFAULT '1' COMMENT '状态(1-启用,0-禁用)',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 分类规则表
CREATE TABLE `t_classify_rule` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `first_category_id` bigint NOT NULL,
  `second_category_id` bigint NOT NULL,
  `keyword` varchar(200) NOT NULL COMMENT '正则关键词',
  `status` int NOT NULL DEFAULT '1',
  `sort` int NOT NULL DEFAULT '0' COMMENT '优先级',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 分类历史表
CREATE TABLE `t_classify_history` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `goods_text` varchar(500) DEFAULT NULL,
  `image_name` varchar(200) DEFAULT NULL,
  `first_category` varchar(50) NOT NULL,
  `second_category` varchar(50) NOT NULL,
  `confidence` double NOT NULL,
  `classify_source` varchar(20) NOT NULL,
  `create_time` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

六、本地部署步骤(超详细)

1. 环境准备

  • 前端:Node.js 14+、npm 6+
  • 后端:JDK 1.8+、Maven 3.6+
  • 数据库:MySQL 8.0+、Redis 6.0+
  • 第三方接口:百度AI/阿里云图片识别API(申请API Key)

2. 部署步骤

  1. 数据库初始化:执行上述SQL脚本创建表结构,可手动插入测试类目数据;
  2. 后端部署
    • 下载后端代码,修改application.yml中的数据库、Redis、第三方接口配置;
    • 执行mvn clean package打包,或直接在IDE中启动GoodsClassifyApplication.java
  3. 前端部署
    • 下载前端代码,执行npm install安装依赖;
    • 修改vue.config.js中的后端接口代理地址;
    • 执行npm run serve启动前端,访问http://localhost:8081
  4. 功能测试:上传商品文本/图片,测试分类功能、类目管理、规则配置是否正常。

七、进阶优化方向

  1. 多特征融合:整合图片特征(ResNet50提取)与文本特征,训练融合模型提升准确率;
  2. 模型轻量化:将BERT替换为MobileBERT,适配中小商家单机部署;
  3. 规则可视化:开发规则配置平台,支持关键词批量导入、正则校验;
  4. 增量训练:基于人工标注的错误结果,定期增量更新模型;
  5. 性能优化:批量处理商品数据,增加接口限流、熔断机制。

八、总结

这套电商商品自动分类系统兼顾了实用性和学习价值

  • 对于开发者:可直接复用完整代码,快速落地电商分类功能,节省开发时间;
  • 对于学习者:涵盖前后端分离、树形数据处理、缓存优化、接口联调等实战场景,是提升技术的优质案例。

系统支持灵活扩展,可根据实际业务需求新增分类维度(如视频分类)、优化规则策略,适用于中小电商平台、跨境电商、本地生活服务平台等多种场景。

源码获取

完整前后端源码(含数据库脚本、部署文档)已整理完毕,关注回复【商品分类系统】即可获取!

如果觉得有用,欢迎点赞、收藏、转发支持~

相关推荐
Fleshy数模4 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
zxsz_com_cn5 小时前
设备预测性维护算法分类及优劣势分析,选型指南来了
算法·分类·数据挖掘
az44yao5 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
一点程序6 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
秦老师Q6 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
橘子137 小时前
MySQL用户管理(十三)
数据库·mysql
Dxy12393102167 小时前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋7 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣507 小时前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
奋进的芋圆8 小时前
Spring Boot 实现三模安全登录:微信扫码 + 手机号验证码 + 邮箱验证码
spring boot·redis·微信