一、SPU 与 SKU

1.1. SPU

SPU:Standard Product Unit(标准化产品单元)

是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。

iphoneX 是 SPU、MI 8 是 SPU

iphoneX 64G 黑曜石 是 SKU

MI8 8+64G+黑色 是 SKU

1.2. SKU

SKU:Stock Keeping Unit(库存量单位)

即库存进出计量的基本单元,可以是以件,盒,托盘等为单位。SKU 这是对于大型连锁超市DC(配送中心)物流管理的一个必要的方法。现在已经被引申为产品统一编号的简称,每种产品均对应有唯一的 SKU 号。

1.3. 基本属性【规格参数】与销售属性

每个分类下的商品共享规格参数,与销售属性。只是有些商品不一定要用这个分类下全部的 属性;

  • 属性是以三级分类组织起来的
  • 规格参数中有些是可以提供检索的
  • 规格参数也是基本属性,他们具有自己的分组
  • 属性的分组也是以三级分类组织起来的
  • 属性名确定的,但是值是每一个商品不同来决定的

1.4. 总结

  • 商品介绍,规格与包装都是SPU的属性,代表一类商品。
  • 购买哪个,销售属性是SKU。
  • SPK决定规则参数,SKU决定销售属性。

1.5. 属性分组—规则参数—销售属性—三级分类 关联关系

二、属性与属性分组的维护

目标:选中三级分类,为分类新增属性分组,每个分组下可以关联规则参数。

2.1. 在gulimall_admin数据库下,运行一下SQL

sys_menus.sql。菜单相关SQL。

/*
SQLyog Ultimate v11.25 (64 bit)
MySQL - 5.7.27 : Database - gulimall_admin
*********************************************************************
*//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`gulimall_admin` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;USE `gulimall_admin`;/*Table structure for table `sys_menu` */DROP TABLE IF EXISTS `sys_menu`;CREATE TABLE `sys_menu` (`menu_id` bigint(20) NOT NULL AUTO_INCREMENT,`parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID,一级菜单为0',`name` varchar(50) DEFAULT NULL COMMENT '菜单名称',`url` varchar(200) DEFAULT NULL COMMENT '菜单URL',`perms` varchar(500) DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:user:list,user:create)',`type` int(11) DEFAULT NULL COMMENT '类型   0:目录   1:菜单   2:按钮',`icon` varchar(50) DEFAULT NULL COMMENT '菜单图标',`order_num` int(11) DEFAULT NULL COMMENT '排序',PRIMARY KEY (`menu_id`)
) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8mb4 COMMENT='菜单管理';/*Data for the table `sys_menu` */insert  into `sys_menu`(`menu_id`,`parent_id`,`name`,`url`,`perms`,`type`,`icon`,`order_num`) values (1,0,'系统管理',NULL,NULL,0,'system',0),(2,1,'管理员列表','sys/user',NULL,1,'admin',1),(3,1,'角色管理','sys/role',NULL,1,'role',2),(4,1,'菜单管理','sys/menu',NULL,1,'menu',3),(5,1,'SQL监控','http://localhost:8080/renren-fast/druid/sql.html',NULL,1,'sql',4),(6,1,'定时任务','job/schedule',NULL,1,'job',5),(7,6,'查看',NULL,'sys:schedule:list,sys:schedule:info',2,NULL,0),(8,6,'新增',NULL,'sys:schedule:save',2,NULL,0),(9,6,'修改',NULL,'sys:schedule:update',2,NULL,0),(10,6,'删除',NULL,'sys:schedule:delete',2,NULL,0),(11,6,'暂停',NULL,'sys:schedule:pause',2,NULL,0),(12,6,'恢复',NULL,'sys:schedule:resume',2,NULL,0),(13,6,'立即执行',NULL,'sys:schedule:run',2,NULL,0),(14,6,'日志列表',NULL,'sys:schedule:log',2,NULL,0),(15,2,'查看',NULL,'sys:user:list,sys:user:info',2,NULL,0),(16,2,'新增',NULL,'sys:user:save,sys:role:select',2,NULL,0),(17,2,'修改',NULL,'sys:user:update,sys:role:select',2,NULL,0),(18,2,'删除',NULL,'sys:user:delete',2,NULL,0),(19,3,'查看',NULL,'sys:role:list,sys:role:info',2,NULL,0),(20,3,'新增',NULL,'sys:role:save,sys:menu:list',2,NULL,0),(21,3,'修改',NULL,'sys:role:update,sys:menu:list',2,NULL,0),(22,3,'删除',NULL,'sys:role:delete',2,NULL,0),(23,4,'查看',NULL,'sys:menu:list,sys:menu:info',2,NULL,0),(24,4,'新增',NULL,'sys:menu:save,sys:menu:select',2,NULL,0),(25,4,'修改',NULL,'sys:menu:update,sys:menu:select',2,NULL,0),(26,4,'删除',NULL,'sys:menu:delete',2,NULL,0),(27,1,'参数管理','sys/config','sys:config:list,sys:config:info,sys:config:save,sys:config:update,sys:config:delete',1,'config',6),(29,1,'系统日志','sys/log','sys:log:list',1,'log',7),(30,1,'文件上传','oss/oss','sys:oss:all',1,'oss',6),(31,0,'商品系统','','',0,'editor',0),(32,31,'分类维护','product/category','',1,'menu',0),(34,31,'品牌管理','product/brand','',1,'editor',0),(37,31,'平台属性','','',0,'system',0),(38,37,'属性分组','product/attrgroup','',1,'tubiao',0),(39,37,'规格参数','product/baseattr','',1,'log',0),(40,37,'销售属性','product/saleattr','',1,'zonghe',0),(41,31,'商品维护','product/spu','',0,'zonghe',0),(42,0,'优惠营销','','',0,'mudedi',0),(43,0,'库存系统','','',0,'shouye',0),(44,0,'订单系统','','',0,'config',0),(45,0,'用户系统','','',0,'admin',0),(46,0,'内容管理','','',0,'sousuo',0),(47,42,'优惠券管理','coupon/coupon','',1,'zhedie',0),(48,42,'发放记录','coupon/history','',1,'sql',0),(49,42,'专题活动','coupon/subject','',1,'tixing',0),(50,42,'秒杀活动','coupon/seckill','',1,'daohang',0),(51,42,'积分维护','coupon/bounds','',1,'geren',0),(52,42,'满减折扣','coupon/full','',1,'shoucang',0),(53,43,'仓库维护','ware/wareinfo','',1,'shouye',0),(54,43,'库存工作单','ware/task','',1,'log',0),(55,43,'商品库存','ware/sku','',1,'jiesuo',0),(56,44,'订单查询','order/order','',1,'zhedie',0),(57,44,'退货单处理','order/return','',1,'shanchu',0),(58,44,'等级规则','order/settings','',1,'system',0),(59,44,'支付流水查询','order/payment','',1,'job',0),(60,44,'退款流水查询','order/refund','',1,'mudedi',0),(61,45,'会员列表','member/member','',1,'geren',0),(62,45,'会员等级','member/level','',1,'tubiao',0),(63,45,'积分变化','member/growth','',1,'bianji',0),(64,45,'统计信息','member/statistics','',1,'sql',0),(65,46,'首页推荐','content/index','',1,'shouye',0),(66,46,'分类热门','content/category','',1,'zhedie',0),(67,46,'评论管理','content/comments','',1,'pinglun',0),(68,41,'spu管理','product/spu','',1,'config',0),(69,41,'发布商品','product/spuadd','',1,'bianji',0),(70,43,'采购单维护','','',0,'tubiao',0),(71,70,'采购需求','ware/purchaseitem','',1,'editor',0),(72,70,'采购单','ware/purchase','',1,'menu',0),(73,41,'商品管理','product/manager','',1,'zonghe',0),(74,42,'会员价格','coupon/memberprice','',1,'admin',0),(75,42,'每日秒杀','coupon/seckillsession','',1,'job',0);/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

查看后台管理系统界面,相关菜单创建完成。

2.2. 抽取公共分类

三级分类树很多地方都要使用,因此新建common文件夹,存放公共组件

2.3. 子组件向父组件传递数据

子组件:category.vue

this.$emit("事件名称",传递的数据,传递的数据...)

nodeclick(data, node, component) {//向父组件发送事件;this.$emit("tree-node-click", data, node, component);
}

父组件:attrgroup.vue

<category @tree-node-click="treenodeclick"></category>
···
<script>
methods:{// 感知树节点被点击treenodeclick(data, node, component) {if (node.level === 3) {this.catId = data.catId;this.getDataList(); //重新查询}},
}
</script>

2.4. 获取分类属性分组接口

  1. new QueryWrapper<E>():E 查询表格对应实体类
  2. .eq(columu,value);:查询columu一列等于value值的结果
  3. wrapper.and(()->{}):拼接查询条件
  4. or():或者
  5. like:双%的like

2.5. 新增分类

使用elementUI中的Cascader级联选择器做所属分类选择。

<el-form-item label="所属分类" prop="catelogId"><!-- <el-input v-model="dataForm.catelogId" placeholder="所属分类id"></el-input> @change="handleChange" --><!-- <el-cascader filterable placeholder="试试搜索:手机" v-model="catelogPath" :options="categorys"  :props="props"></el-cascader> --><!-- :catelogPath="catelogPath"自定义绑定的属性,可以给子组件传值 --><category-cascader :catelogPath.sync="catelogPath"></category-cascader>
</el-form-item>

2.6. 设置数据不为空返回

使用注解@JsonInclude(JsonInclude.Include.NON_EMPTY)设置字段不为空的时候返回

2.7. 引入MyBatis引入分页插件

默认逆向生成代码分页有bug

需要引入MyBatis分页插件

新建配置文件夹,创建MyBatisConfigmybatis配置文件

package com.atguigu.gulimall.product.config;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;@Configuration
@EnableTransactionManagement //开启事务
@MapperScan("com.zsy.product.dao")
public class MyBatisConfig {//引入分页插件@Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认falsepaginationInterceptor.setOverflow(true);// 设置最大单页限制数量,默认 500 条,-1 不受限制paginationInterceptor.setLimit(1000);return paginationInterceptor;}
}

配置好后前端分页功能即可正常显示

2.8. 设置品牌管理模糊查询

@override
public PageUtils queryPage(Map<String, Object> params) {//1、获取keyString key = (String) params.get("key");QueryWrapper<BrandEntity> queryWrapper = new QueryWrapper<>();if (!StringUtils.isEmpty(key)) {queryWrapper.eq("brand_id", key).or().like("name", key);}IPage<BrandEntity> page = this.page(new Query<BrandEntity>().getPage(params),queryWrapper);return new PageUtils(page);
}

2.9. 关联分类

一个品牌可以对应多个分类,一个分类也可以对应多个品牌。

  1. 获取品牌关联的分类

    /*** 获取当前品牌关联的所有分类列表*/
    @GetMapping("/catelog/list")
    //@RequiresPermissions("product:categorybrandrelation:list")
    public R cateloglist(@RequestParam("brandId") Long brandId) {List<CategoryBrandRelationEntity> data = categoryBrandRelationService.list(new QueryWrapper<CategoryBrandRelationEntity>().eq("brand_id", brandId));return R.ok().put("data", data);
    }
    
  2. 新增品牌与分类关联关系

三、品牌分类关联与级联更新

3.1. 同步更新数据保证数据一直

由于使用很多第三张中间表,在数据更新的时候要保证数据同步更新

rride
public void updateDetail(BrandEntity brand) {//保证冗余字段的数据一致this.updateById(brand);if (!StringUtils.isEmpty(brand.getName())) {//同步更新其他关联表中的数据categoryBrandRelationService.updateBrand(brand.getBrandId(), brand.getName());//TODO 更新其他关联}
}

3.2. 自定义SQL语句

实现类中,通过this.baseMapper.xxx可以调用自定义SQL语句并传递参数

实体类中声明方法并使用@Param给参数重命名

对应mapper中书写SQL语句

四、平台属性

4.1. 属性分组模糊查询

修改接口,根据是否有key进行模糊查询

@Override
public PageUtils queryPage(Map<String, Object> params, Long cateLogId) {String key = (String) params.get("key");//select * from pms_attr_group where catelog_id=? and (attr_group_id=key or attr_group_name like %key%)QueryWrapper<AttrGroupEntity> wrapper = new QueryWrapper<>();if (!StringUtils.isEmpty(key)) {// 根据 key 模糊查询wrapper.and(obj -> obj.eq("attr_group_id", key).or().like("attr_group_name", key));}if (cateLogId == 0) {IPage<AttrGroupEntity> page = this.page(new Query<AttrGroupEntity>().getPage(params), wrapper);return new PageUtils(page);} else {wrapper.eq("catelog_id", cateLogId);IPage<AttrGroupEntity> page = this.page(new Query<AttrGroupEntity>().getPage(params), wrapper);return new PageUtils(page);}
}

4.2. Object划分

4.2.1. PO(persistant object)

PO(persistant object) 持久对象

PO 就是对应数据库中某个表中的一条记录,多个记录可以用 PO 的集合。 PO 中应该不包含任何对数据库的操作。

4.2.2. DO(Domain Object)

DO(Domain Object)领域对象

就是从现实世界中抽象出来的有形或无形的业务实体。

4.2.3. TO(Transfer Object)

TO(Transfer Object) ,数据传输对象

不同的应用程序之间传输的对象

4.2.4. DTO(Data Transfer Object)

DTO(Data Transfer Object)数据传输对象

这个概念来源于 J2EE 的设计模式,原来的目的是为了 EJB 的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,泛指用于展示层与服务层之间的数据传输对象。

4.2.5. VO(value object)

VO(value object) 值对象

通常用于业务层之间的数据传递,和 PO 一样也是仅仅包含数据而已。但应是抽象出的业务对象 , 可以和表对应 , 也可以不 , 这根据业务的需要 。用 new 关键字创建,由GC 回收的。

View object:视图对象;

接受页面传递来的数据,封装对象

将业务处理完成的对象,封装成页面要用的数据

4.2.6. BO(business object)

BO(business object) 业务对象

从业务模型的角度看 , 见 UML 元件领域模型中的领域对象。封装业务逻辑的 java 对象 , 通过调用 DAO 方法 , 结合 PO,VO 进行业务操作。business object: 业务对象 主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。 比如一个简历,有教育经历、工作经历、社会关系等等。 我们可以把教育经历对应一个 PO ,工作经历对应一个 PO ,社会关系对应一个 PO 。 建立一个对应简历的 BO 对象处理简历,每个 BO 包含这些 PO 。 这样处理业务逻辑时,我们就可以针对 BO 去处理。

4.2.7. POJO(plain ordinary java object)

POJO(plain ordinary java object) 简单无规则 java 对象

传统意义的 java 对象。就是说在一些 Object/Relation Mapping 工具中,能够做到维护数据库表记录的 persisent object 完全是一个符合 Java Bean 规范的纯 Java 对象,没有增加别的属性和方法。我的理解就是最基本的 java Bean ,只有属性字段及 setter 和 getter 方法!。

POJO 是 DO/DTO/BO/VO 的统称。

4.2.8. DAO(data access object)

DAO(data access object) :数据访问对象

是一个 sun 的一个标准 j2ee 设计模式, 这个模式中有个接口就是 DAO ,它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和 PO 结合使用, DAO 中包含了各种数据库的操作方法。通过它的方法 , 结合 PO 对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。配合 VO, 提供数据库的 CRUD 操作.

4.3. 功能完善

新建vo文件夹

其中存放内容为返回给客户端的数据封装,为entity中对应内容的扩展

通过BeanUtils.copyProperties(attrEntity, respVo);方法可以将attrEntity内容复制到respVo中

4.4. 建立常量

gulimall-common中新建constant文件夹,存储系统中使用的常量

使用

五、分组与属性关联

5.1. get请求获取路径变量

通过@PathVariable()注解获取路径中变量

例如:获取路径中attrgroupId参数

@GetMapping("/{attrgroupId}/attr/relation")
public R attrRelation(@PathVariable("attrgroupId") Long attrgroupId) {List<AttrEntity> entities = attrService.getRelationAttr(attrgroupId);return R.ok().put("data", entities);
}

谷粒商城:10.商品服务 — 属性分组相关推荐

  1. 谷粒商城九商品服务之商品属性及仓储服务todo

    之前的文章我都是把整篇的代码直接复制到文章中,这样容易抓不住重点, 但是一段代码都贴出来,又显得繁琐, 从这篇开始,我会把重点步骤写出来,代码还是贴完整的 从这篇开始的mybatis-plus分页插件 ...

  2. 谷粒商城之商品服务-平台属性-属性组管理

    目录 什么是SPU? 什么是SKU? 规格参数 ​ 销售属性 三级分类-属性组-属性的关联关系 SPU-属性&SKU-属性的关联关系 预期效果: 属性分组之前端组件抽取&父子组件交互 ...

  3. 谷粒商城六商品服务三级分类

    递归-树形结构数据获取 sql文件 sql文件太大了,这个博主写的非常厉害,看他的就ok了 CategoryController package com.atguigu.gulistore.produ ...

  4. 谷粒商城七商品服务品牌管理之oss文件存储

    使用renren-generator生成crud页面 todo谷粒商城二本地虚拟机环境搭建及项目初始化在逆向工程的时候,resources下有一个view文件夹,下面都是可以直接使用的vue文件,我们 ...

  5. 微盟电子商城网络交易系统——Day04【商品服务-品牌管理、商品服务-属性分组】

    ❤ 作者主页:欢迎来到我的技术博客

  6. 谷粒商城之商品服务-三级分类(展示与删除)

    目录 三级类目查询后台代码实现 后台管理系统的菜单创建 配置网关和路径重写 网关统一配置跨域 三级类目后台管理系统的页面显示 三级分类删除页面效果的编写 ​ 三级分类逻辑删除后台实现 三级类目删除功能 ...

  7. 谷粒商城笔记+踩坑(6)——商品服务-属性及其关联分组

      导航: 谷粒商城笔记+踩坑汇总篇_谷粒商城笔记踩坑6_vincewm的博客-CSDN博客 目录 10.商品服务-属性(规格参数和销售属性) 10.1.新增属性时,新增属性和属性分组的关联关系 10 ...

  8. 尚硅谷2020微服务分布式电商项目《谷粒商城》-商品搜索

    关注公众号:java星星 获取全套课件资料 1. 导入商品数据 1.1. 搭建搜索工程 pom.xml内容如下: <?xml version="1.0" encoding=& ...

  9. 夺命雷公狗ThinkPHP项目之----商城10商品属性管理

    我们一般做项目前就要分析业务逻辑先,这次也不例外. attr_type:是指属性的类型,有唯一,单选和多选之分 唯一属性,是指用户在购买商品时,可以看到的扩展属性如下图所示: 单选属性,是指用户在购买 ...

  10. 谷粒商城(新增商品、商品管理、仓库管理)思路详解

    谷粒商城基础分布式总结 1.新增商品 1.调试member服务 2.查询分类下的所有品牌 2.获取分类下面带属性的属性分组. 3.保存设定好的spu和sku信息 2.商品管理 1.spu展示查询(sp ...

最新文章

  1. centos重启网络失败Job for network.service failed,ping不通网络
  2. BZOJ4893: 项链分赃 BZOJ4895: 项链分赃(增强版)
  3. 洛谷——P3811 【模板】乘法逆元
  4. Java DataInputStream readBoolean()方法(带示例)
  5. 三维视觉前沿进展年度报告
  6. CSS3 控制Tab宽度 tab-size属性
  7. NIOS II 常见问题总结FAQ - xiangyuqxq的专栏 - CSDN博客
  8. Delphi 与 DirectX 之 DelphiX(91): TDIB.DrawMono();
  9. bzoj 4134 ljw和lzr的hack比赛
  10. 车厢调度(信息学奥赛一本通 - T1357)
  11. 初学Python三周总结感想
  12. Debian设置合上笔记本盖子不休眠
  13. Appium测试混血App
  14. 网络管理之企业如果如何防范、排除ARP攻击
  15. python 高斯白噪声-python高斯白噪声
  16. 如何防御DDoS攻击和CC攻击
  17. scrapy某家租房信息爬取
  18. 施一公演讲太精彩!让科研迷茫的人少走很多弯路
  19. 手把手带你轻松走进思维导图
  20. java一个byte字节可以存2个16进制字符

热门文章

  1. 5.Linux 高性能服务器编程 --- Linux 网络编程基础 API
  2. 134. PHP 工具
  3. Magento url 问题
  4. PHP Windows系统下调用OpenOffice
  5. 书柜的尺寸(bzoj 1933)
  6. linux 修改ip地址 和关闭防火墙设置
  7. Form窗体点击关闭按钮并未关闭进程的解决方法
  8. PHP中的正则表达式函数
  9. php 写入.csv文件注意点
  10. vue 跨域请求js添加代码