谷粒商城:11.商品服务 — 新增商品
一、前置工作
1.1. 将gulimall-member
注册到nacos
spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848application:name: gulimall-member
1.2. @EnableDiscoveryClient
开启服务注册功能
1.3. 网关配置路由关系
二、完善接口
2.1. 获取分类关联的品牌
2.2. 开发顺序
- Controller:处理请求,接受和校验数据
- Service接受controller传来的数据,进行业务处理
- Controller接受Service处理完的数据,封装页面指定的vo
2.3. 获取分类下所有分组&关联属性
2.4. 商品新增
2.4.1. 逆向生成vo
将添加的数据在https://www.json.cn/json/json2java.html
可以生成对应JavaBean,放到vo文件夹中,最为数据传递承载。
注意:生成的数据中,涉及小数的数据double
类型改为BigDecimal
2.4.2. 保存spu基本信息
对应数据表:pms_spu_info
SpuInfoEntity infoEntity = new SpuInfoEntity();
BeanUtils.copyProperties(vo, infoEntity);
infoEntity.setCreateTime(new Date());
infoEntity.setUpdateTime(new Date());
this.saveBaseSpuInfo(infoEntity);
2.4.3. 保存Spu的描述图片
对应数据表:pms_spu_info_desc
List<String> decript = vo.getDecript();
SpuInfoDescEntity descEntity = new SpuInfoDescEntity();
descEntity.setSpuId(infoEntity.getId());
descEntity.setDecript(String.join(",", decript));
spuInfoDescService.saveSpuInfoDesc(descEntity);
2.4.4. 保存spu的图片集
对应数据表:pms_spu_images
List<String> images = vo.getImages();
imagesService.saveImages(infoEntity.getId(), images);
2.4.5. 保存spu的规格参数
对应数据表:pms_product_attr_value
List<BaseAttrs> baseAttrs = vo.getBaseAttrs();
List<ProductAttrValueEntity> collect = baseAttrs.stream().map(attr -> {ProductAttrValueEntity valueEntity = new ProductAttrValueEntity();valueEntity.setAttrId(attr.getAttrId());AttrEntity id = attrService.getById(attr.getAttrId());valueEntity.setAttrName(id.getAttrName());valueEntity.setAttrValue(attr.getAttrValues());valueEntity.setQuickShow(attr.getShowDesc());valueEntity.setSpuId(infoEntity.getId());return valueEntity;
}).collect(Collectors.toList());
attrValueService.saveProductAttr(collect);
2.4.6. 保存spu的积分信息
对应数据表:gulimall_sms->sms_spu_bounds
Bounds bounds = vo.getBounds();
SpuBoundTo spuBoundTo = new SpuBoundTo();
BeanUtils.copyProperties(bounds, spuBoundTo);
spuBoundTo.setSpuId(infoEntity.getId());
R r = couponFeignService.saveSpuBounds(spuBoundTo);
if (r.getCode() != 0) {log.error("远程保存spu积分信息失败");
}
2.4.7. 保存当前spu对应的所有sku信息
2.4.7.1. sku的基本信息
对应数据表:pms_sku_info
2.4.7.2. sku的图片信息
对应数据表:pms_sku_image
2.4.7.3. sku的销售属性信息
对应数据表:pms_sku_sale_attr_value
2.4.7.4. sku的优惠、满减等信息
对应数据表:gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price
List<Skus> skus = vo.getSkus();
if (skus != null && skus.size() > 0) {skus.forEach(item -> {String defaultImg = "";for (Images image : item.getImages()) {if (image.getDefaultImg() == 1) {defaultImg = image.getImgUrl();}}SkuInfoEntity skuInfoEntity = new SkuInfoEntity();BeanUtils.copyProperties(item, skuInfoEntity);skuInfoEntity.setBrandId(infoEntity.getBrandId());skuInfoEntity.setCatalogId(infoEntity.getCatalogId());skuInfoEntity.setSaleCount(0L);skuInfoEntity.setSpuId(infoEntity.getId());skuInfoEntity.setSkuDefaultImg(defaultImg);//7.1)、sku的基本信息;pms_sku_infoskuInfoService.saveSkuInfo(skuInfoEntity);Long skuId = skuInfoEntity.getSkuId();List<SkuImagesEntity> imagesEntities = item.getImages().stream().map(img -> {SkuImagesEntity skuImagesEntity = new SkuImagesEntity();skuImagesEntity.setSkuId(skuId);skuImagesEntity.setImgUrl(img.getImgUrl());skuImagesEntity.setDefaultImg(img.getDefaultImg());return skuImagesEntity;}).filter(entity -> {//返回true就是需要,false就是剔除return !StringUtils.isEmpty(entity.getImgUrl());}).collect(Collectors.toList());//7.2)、sku的图片信息;pms_sku_imageskuImagesService.saveBatch(imagesEntities);//TODO 没有图片路径的无需保存List<Attr> attr = item.getAttr();List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = attr.stream().map(a -> {SkuSaleAttrValueEntity attrValueEntity = new SkuSaleAttrValueEntity();BeanUtils.copyProperties(a, attrValueEntity);attrValueEntity.setSkuId(skuId);return attrValueEntity;}).collect(Collectors.toList());//7.3)、sku的销售属性信息:pms_sku_sale_attr_valueskuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities);//7.4)、sku的优惠、满减等信息;gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_priceSkuReductionTo skuReductionTo = new SkuReductionTo();BeanUtils.copyProperties(item, skuReductionTo);skuReductionTo.setSkuId(skuId);if (skuReductionTo.getFullCount() > 0 || skuReductionTo.getFullPrice().compareTo(new BigDecimal("0")) == 1) {R r1 = couponFeignService.saveSkuReduction(skuReductionTo);if (r1.getCode() != 0) {log.error("远程保存sku优惠信息失败");}}});
}
2.4.8. 调用远程服务
注意:
- 远程服务必须上线,放到注册中心在
- 远程服务必须要开启服务发现和服务注册功能
- 调用者只要在注册中心中,调用正确接口即可
2.4.8.1. 将所有需要远程调用的接口放在feign
包中
2.4.8.2. 使用@FeignClient
声明调用远程服务名称
@FeignClient("gulimall-coupon")
2.4.8.3. 调用者使用@EnableFeignClients
确定远程调用包位置
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
2.4.8.4. 注入远程调用Service
@Autowired
CouponFeignService couponFeignService;
2.4.8.5. 使用PostMapping
指定远程调用地址
/*** 1、CouponFeignService.saveSpuBounds(spuBoundTo);* 1)、@RequestBody将这个对象转为json。* 2)、找到gulimall-coupon服务,给/coupon/spubounds/save发送请求。* 将上一步转的json放在请求体位置,发送请求;* 3)、对方服务收到请求。请求体里有json数据。* (@RequestBody SpuBoundsEntity spuBounds);将请求体的json转为SpuBoundsEntity;* 只要json数据模型是兼容的。双方服务无需使用同一个to** @param spuBoundTo* @return*/
@PostMapping("/coupon/spubounds/save")
R saveSpuBounds(@RequestBody SpuBoundTo spuBoundTo);
2.4.8.6. 使用@RequestBody
注解将参数作为请求体传递
@PostMapping("/coupon/skufullreduction/saveinfo")
R saveSkuReduction(@RequestBody SkuReductionTo skuReductionTo);
2.4.9. 注意
@TableId
如果数据库字段设成user_id
在初始生成后,在代码中会变成userId,不会设置成主键
使用**@TableId(value=“user_id”,type = IdType.AUTO)**注解“value”:设置数据库字段值
“type”:设置主键类型、如果数据库主键设置了自增建议使用“AUTO”type有六种类型类型,最下面三个只有插入主键为空时,才会自动填充
类型 解释 AUTO 数据库自增ID NONE 数据库未设置主键类型(将会跟随全局) INPUT 用户输入ID(该类型可以通过自己注册自动填充插件进行填充) ID_WORKER 全局唯一ID (idWorker) UUID 全局唯一ID(UUID) ID_WORKER_STR 字符串全局唯一ID(idWorker 的字符串表示)
2.4.10. SPU检索
2.4.11. SKU检索
2.5. 项目时间格式化
在application.yml
中配置jackson
的date-format
spring:jackson:date-format: yyyy-MM-dd HH:mm:ss
谷粒商城:11.商品服务 — 新增商品相关推荐
- 谷粒商城P85问题记录—发布商品时规格参数不显示-2022/4/8
谷粒商城P85问题记录-发布商品时规格参数不显示 这一p有2个问题,折腾了很久 问题1 :数据库表中不存在 valueType这个键 但是接口文档里是需要提供这个键(而且是不能为null) 所以需要: ...
- 谷粒商城九商品服务之商品属性及仓储服务todo
之前的文章我都是把整篇的代码直接复制到文章中,这样容易抓不住重点, 但是一段代码都贴出来,又显得繁琐, 从这篇开始,我会把重点步骤写出来,代码还是贴完整的 从这篇开始的mybatis-plus分页插件 ...
- 【谷粒商城之订单服务-支付】
本笔记内容为尚硅谷谷粒商城订单服务支付部分 目录 一.支付宝沙箱 沙箱环境 二.公钥.私钥.加密.加签.验签 1.公钥私钥 2.加密和数字签名 3.对称加密和非对称加密 三.内网穿透 四.整合支付 1 ...
- 谷粒商城 高级篇 (十四) ---------- 商品详情
目录 一.详情数据 二.查询详情 三.sku 组合切换 四.关键 SQL 一.详情数据 封装成 vo 如下: SkuItemVo: @Data public class SkuItemVo {//1. ...
- 谷粒商城11——认证服务、短信验证、Gitee-OAuth 社交登录、分布式session
文章目录 九.认证服务 1.短信验证码功能 2.短信验证模仿 3.验证码生成远程调用发送短信 4.验证码防刷检验 4.1 验证码的校验 4.2.4.3 验证码防刷 5.注册功能 5.1 封装表单vo ...
- 实战 - 谷粒商城项目:基础篇First
文章目录 SpringCloud商城- 基础篇 1. 环境搭建 1.1 centos7安装docker 1.2 docker安装MySQL5.7 1.3 docker安装Redis 1.4 环境安装配 ...
- 【谷粒商城高级篇】商品服务 商品上架
谷粒商城笔记合集 分布式基础篇 分布式高级篇 高可用集群篇 ===简介&环境搭建=== ===Elasticsearch=== 项目简介与分布式概念(第一.二章) Elasticsearch: ...
- 【谷粒商城高级篇】商城业务:商品检索
谷粒商城笔记合集 分布式基础篇 分布式高级篇 高可用集群篇 ===简介&环境搭建=== ===Elasticsearch=== 项目简介与分布式概念(第一.二章) Elasticsearch: ...
- 谷粒商城分布式基础篇1-个人版
基础篇 1 项目简介 1.1 项目背景 1.2 电商模式 市面上有5种常见的电商模式 B2B.B2C.C2B.C2C.O2O 1.2.1 B2B 模式 B2B(Business to Business ...
- 分布式项目-谷粒商城。
分布式项目 一,分布图 二,环境搭建 1.安装linux 2.安装docker 1 卸载系统之前的docker sudo yum remove docker \docker-client \docke ...
最新文章
- 聊聊Tomcat的架构设计
- php 图片路径混淆,爬虫遇到了字符图片混淆。pytesseract识别图片字符
- 2016年光伏电站交易和融资的十大猜想
- Nicholas谈UE4对手游平台的优化和支持
- Spring AOP介绍
- JavaScript jQuery bootstrap css ajax
- mysqli.class.php,PHP MySQLi类
- python 网页转pdf
- html标签的英文全拼,HTML标签全称对照
- 阿里巴巴矢量图标库在线链接使用图标
- html5制作当当图书榜页面,当当图书.html
- linux simg2img,simg2img工具
- ROS专题----导航功能包navigation基础汇总
- NTP服务器的相关配置
- 你为什么那么努力还是不开心!
- 金山毒霸推新产品金山卫士 正面狙击奇虎360
- 个人关于PAT的认识心得和体会
- android——databinding中字符串的拼接处理、TextView显示的值随activity的属性值改变同时改变--LiveData、双向绑定过滤器、监听某个值的改变
- 如何去除word中的空行
- 第二证券|钠电池三种技术路线谁更将率先取代锂电池?
热门文章
- 13.docker exec
- 1.Chrome开发者工具不完全指南(一、基础功能篇)
- 6. Magento2 --- 创建主题
- 测试人员该学习哪些Linux知识
- 自动化测试selenium(四)check,选中复选框,操作一组元素
- @Autowired与@Resource
- javascript循环事件只响应最后一次的问题处理
- C++构造函数异常(二)
- Eclipse(PHP、JAVA)的快捷键大全
- [原]gimp的python控制台以及python的PIL图像处理库