🛒 电商系统核心:从商品分类到 SKU 上架的全链路设计与实现

摘要:商品管理是电商系统的核心心脏。一个灵活、可扩展的商品系统不仅要支持基本的商品展示,还要能够处理多规格(SKU)、多级分类以及复杂的库存逻辑。本文将基于 RuoYi-Vue 后端框架,深入剖析商品上架的全流程,包括数据库设计、后端接口实现以及 SKU 的管理策略,助你构建强大的电商后台。


🏗️ 数据库设计:构建稳固的基石

电商系统的商品模型通常包含三个核心概念:分类 (Category)商品 (Product)库存单元 (SKU)

1. 商品分类表 (ec_category)

支持无限层级分类,通过 parent_id 实现树形结构。

CREATE TABLE `ec_category` (
  `category_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
  `parent_id` bigint(20) DEFAULT '0' COMMENT '父分类ID',
  `category_name` varchar(100) NOT NULL COMMENT '分类名称',
  `category_icon` varchar(500) DEFAULT '' COMMENT '图标URL',
  `sort_order` int(4) DEFAULT '0' COMMENT '排序',
  `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
  PRIMARY KEY (`category_id`)
) ENGINE=InnoDB COMMENT='商品分类表';

2. 商品主表 (ec_product)

存储商品的通用属性,如名称、主图、详情、发布状态等。

CREATE TABLE `ec_product` (
  `product_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
  `category_id` bigint(20) NOT NULL COMMENT '分类ID',
  `product_name` varchar(200) NOT NULL COMMENT '商品名称',
  `product_code` varchar(100) COMMENT '商品编码',
  `main_image` varchar(500) COMMENT '主图片',
  `price` decimal(10, 2) NOT NULL COMMENT '展示价格',
  `publish_status` char(1) DEFAULT '0' COMMENT '上架状态(0下架 1上架)',
  `is_hot` char(1) DEFAULT '0' COMMENT '是否热销',
  `is_new` char(1) DEFAULT '0' COMMENT '是否新品',
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB COMMENT='商品表';

3. 商品 SKU 表 (ec_product_sku)

这是最关键的部分。SKU (Stock Keeping Unit) 定义了具体的规格组合(如:iPhone 15 Pro + 黑色 + 256GB),价格和库存都挂载在 SKU 上。

CREATE TABLE `ec_product_sku` (
  `sku_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'SKU ID',
  `product_id` bigint(20) NOT NULL COMMENT '关联商品ID',
  `sku_name` varchar(200) COMMENT 'SKU名称',
  `spec_info` varchar(500) COMMENT '规格信息JSON,例如 {"颜色":"黑色","内存":"256GB"}',
  `price` decimal(10, 2) NOT NULL COMMENT '销售价格',
  `stock` int(11) DEFAULT '0' COMMENT '库存数量',
  `image` varchar(500) COMMENT 'SKU特定图片',
  PRIMARY KEY (`sku_id`),
  INDEX `idx_product_id`(`product_id`)
) ENGINE=InnoDB COMMENT='商品SKU表';

💻 后端实现:逻辑与流程

RuoYi-Vue 中,我们通过 Controller 层暴露 RESTful 接口来管理这些资源。

1. 分类管理 (EcCategoryController.java)

首先,商家需要建立分类体系。

@RestController
@RequestMapping("/fun/category")
public class EcCategoryController extends BaseController
{
    @Autowired
    private IEcCategoryService ecCategoryService;

    /**
     * 获取分类列表
     */
    @PreAuthorize("@ss.hasPermi('fun:category:list')")
    @GetMapping("/list")
    public TableDataInfo list(EcCategory ecCategory)
    {
        startPage();
        // 处理多商户/组织权限逻辑
        Long orgId = getOrgId();
        if (orgId != null && orgId == 103L) { orgId = null; } // 超级管理员查看所有
        ecCategory.setOrgId(orgId);
        
        List<EcCategory> list = ecCategoryService.selectEcCategoryList(ecCategory);
        return getDataTable(list);
    }

    /**
     * 新增分类
     */
    @PreAuthorize("@ss.hasPermi('fun:category:add')")
    @PostMapping
    public AjaxResult add(@RequestBody EcCategory ecCategory)
    {
        ecCategory.setOrgId(getOrgId());
        return toAjax(ecCategoryService.insertEcCategory(ecCategory));
    }
}

2. 商品上架 (EcProductController.java)

选择分类后,创建商品主体。

@RestController
@RequestMapping("/fun/product")
public class EcProductController extends BaseController
{
    @Autowired
    private IEcProductService ecProductService;

    /**
     * 新增商品
     */
    @PreAuthorize("@ss.hasPermi('fun:product:add')")
    @Log(title = "商品", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody EcProduct ecProduct)
    {
        // 自动绑定当前商户/组织
        ecProduct.setOrgId(getOrgId());
        return toAjax(ecProductService.insertEcProduct(ecProduct));
    }
    
    /**
     * 更新商品状态(上架/下架)
     */
    @PreAuthorize("@ss.hasPermi('fun:product:edit')")
    @PutMapping
    public AjaxResult edit(@RequestBody EcProduct ecProduct)
    {
        return toAjax(ecProductService.updateEcProduct(ecProduct));
    }
}

3. SKU 规格管理 (EcProductSkuController.java)

最后,为商品添加具体的规格和库存。在前端,这通常是一个动态表格,后端负责接收并保存。

@RestController
@RequestMapping("/fun/sku")
public class EcProductSkuController extends BaseController
{
    @Autowired
    private IEcProductSkuService ecProductSkuService;

    /**
     * 查询某商品的SKU列表
     */
    @GetMapping("/list")
    public TableDataInfo list(EcProductSku ecProductSku)
    {
        startPage();
        List<EcProductSku> list = ecProductSkuService.selectEcProductSkuList(ecProductSku);
        return getDataTable(list);
    }

    /**
     * 批量更新或添加SKU
     * 实际业务中,通常是在保存商品时级联保存SKU,或者单独的SKU管理接口
     */
    @PostMapping("/batchSave")
    public AjaxResult batchSave(@RequestBody List<EcProductSku> skuList) {
        return toAjax(ecProductSkuService.saveBatch(skuList));
    }
}

🔄 完整业务流程

  1. 后台 - 创建分类:管理员在后台添加“手机通讯”、“服装鞋帽”等一级分类。
  2. 后台 - 发布商品
    • 填写商品名称(如“iPhone 15 Pro”)。
    • 上传主图和轮播图。
    • 设置基础价格。
  3. 后台 - 设置规格 (SKU)
    • 定义规格项:颜色(黑/白)、内存(256G/512G)。
    • 系统生成 SKU 列表。
    • 分别为每个 SKU 设置价格(如 256G 版 7999元,512G 版 9999元)和库存。
  4. 小程序端 - 用户购买
    • 用户进入详情页,点击“立即购买”。
    • 弹出 SKU 选择器(颜色、内存)。
    • 根据选择的 SKU ID,从 ec_product_sku 表读取对应的价格和实时库存。

📦 总结

通过 Product + SKU 的双层设计,我们既保证了商品管理的整洁性,又满足了电商多样化的销售需求。结合 RuoYi-Vue 的权限管理和代码生成能力,我们可以快速搭建起一套功能完备的电商后台管理系统。

项目开源地址

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐