先看一下页面新增商品是什么样的:

后台页面,商品列表页面,单击新增商品,弹出个新增商品的窗口。

我们选择商品分类之后,会发送一个请求,查询对应商品分类下的所有品牌,并返回到 所属品牌 中供选择。

从页面请求信息中可以看出:

请求方式:GET

请求路径:/brand/cid/{cid}

请求参数:cid

响应数据:品牌集合

下面来是实现一下 新增商品 时的 商品品牌查询:

1.编写Controller

2.在service中实现 queryBrandsByCid方法

3.编写sql语句
(因为根据分类查询品牌 有中间表,所有需要中间编写Sql)

重启 leyou-item 服务,去页面查看:

品牌信息就可以查询出来并选择了。

然后继续往后看:

填写商品基本信息,并下一步:

填写商品描述,并下一步:
(这里已经帮我们实现好了富文本编辑器。 介绍以及项目中的实现点这里:富文本编辑器使用 )

再下一步,填写规格参数:

填写规格参数这个需要我们去实现。

我们之前已经写过一个 根据 gid(规格组id) 查询规格参数的接口。

所以这里我们只需改造一下这个 查询规格参数的接口,添加一个参数 商品分类 cid。

不过,我们也会可能还会根据 是否搜素、是否为通用属性 等条件来过滤,不如我们这次多添加几个过滤条件。

这样后面需要使用的时候,就不用再又回来修改添加属性了。

我们看下页面请求,其实一开始点击新增商品的时候,就开始请求规格参数了:

下面来实现新增商品时 查询规格参数:

1.修改controller中的查询规格参数的方法

2.修改service中的queryParams方法:

重启 leyou-item 服务,然后去页面测试看看:

规格参数查询成功了,填写之后 下一步。

然后填写SKU属性 并保存:

我们要去实现这个 保存商品信息功能 
(页面表单提交)

先看一下请求的信息:

可以看到 请求方式是POST,请求路径是item/goods

提交的数据整个是一个 json格式数据,包含Spu表所有数据:

  • brandId:品牌id

  • cid1、cid2、cid3:商品分类id

  • subTitle:副标题

  • title:标题

  • spuDetail:是一个json对象,代表商品详情表数据

    • afterService:售后服务

    • description:商品描述

    • packingList:包装列表

    • specialSpec:sku规格属性模板

    • genericSpec:通用规格参数

  • skus:spu下的所有sku数组,元素是每个sku对象:

    • title:标题

    • images:图片

    • price:价格

    • stock:库存

    • ownSpec:特有规格参数

    • indexes:特有规格参数的下标

下面我们去编写一下保存商品信息功能的代码

1.添加实体类
SPU和SpuDetail实体类已经添加过了,我们只需再添加 Sku 和 Stock 类即可:

Sku类:

@Table(name = "tb_sku")
public class Sku {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private Long spuId;private String title;private String images;private Long price;private String ownSpec;// 商品特殊规格的键值对private String indexes;// 商品特殊规格的下标private Boolean enable;// 是否有效,逻辑删除用private Date createTime;// 创建时间private Date lastUpdateTime;// 最后修改时间@Transientprivate Integer stock;// 库存//记得生成getter、setter 方法    }

Stock类

@Table(name = "tb_stock")
public class Stock {@Idprivate Long skuId;private Integer seckillStock;// 秒杀可用库存private Integer seckillTotal;// 已秒杀数量private Integer stock;// 正常库存//记得生成 getter、setter方法
}

修改 SpuBo 类:

(记得生成getter、setter方法)

2.添加通用mapper方法

import tk.mybatis.mapper.common.Mapper;public interface StockMapper extends Mapper<Stock> {
}
import tk.mybatis.mapper.common.Mapper;public interface SpuDetailMapper extends Mapper<SpuDetail> {
}
import tk.mybatis.mapper.common.Mapper;public interface SkuMapper extends Mapper<Sku> {
}

3.在GoodsController中添加新增商品的方法:

3. 在GoodsService中实现savaGoods方法

为了方便看,这里直接贴出GoodsService全部代码

@Service
public class GoodsService {@Autowiredprivate SpuMapper spuMapper;@Autowiredprivate CategoryService categoryService;@Autowiredprivate BrandMapper brandMapper;@Autowiredprivate SpuDetailMapper spuDetailMapper;@Autowiredprivate StockMapper stockMapper;@Autowiredprivate SkuMapper skuMapper;public PageResult<SpuBo> querySpuBoByPage(String key, Boolean saleable, Integer page, Integer rows) {Example example = new Example(Spu.class);Example.Criteria criteria = example.createCriteria();// 搜索条件if (StringUtils.isNotBlank(key)) {criteria.andLike("title", "%" + key + "%");}if (saleable != null) {criteria.andEqualTo("saleable", saleable);}// 分页条件PageHelper.startPage(page, rows);// 执行查询List<Spu> spus = this.spuMapper.selectByExample(example);PageInfo<Spu> pageInfo = new PageInfo<>(spus);List<SpuBo> spuBos = new ArrayList<>();spus.forEach(spu->{SpuBo spuBo = new SpuBo();// copy共同属性的值到新的对象BeanUtils.copyProperties(spu, spuBo);// 查询分类名称List<String> names = this.categoryService.queryNamesByIds(Arrays.asList(spu.getCid1(), spu.getCid2(), spu.getCid3()));spuBo.setCname(StringUtils.join(names, "/"));// 查询品牌的名称spuBo.setBname(this.brandMapper.selectByPrimaryKey(spu.getBrandId()).getName());spuBos.add(spuBo);});return new PageResult<>(pageInfo.getTotal(), spuBos);}/*** 新增商品* @param spuBo*/@Transactionalpublic void saveGoods(SpuBo spuBo) {// 新增spu// 设置默认字段spuBo.setId(null);spuBo.setSaleable(true);spuBo.setValid(true);spuBo.setCreateTime(new Date());spuBo.setLastUpdateTime(spuBo.getCreateTime());this.spuMapper.insertSelective(spuBo);// 新增spuDetailSpuDetail spuDetail = spuBo.getSpuDetail();spuDetail.setSpuId(spuBo.getId());this.spuDetailMapper.insertSelective(spuDetail);saveSkuAndStock(spuBo);}private void saveSkuAndStock(SpuBo spuBo) {spuBo.getSkus().forEach(sku -> {// 新增skusku.setSpuId(spuBo.getId());sku.setCreateTime(new Date());sku.setLastUpdateTime(sku.getCreateTime());this.skuMapper.insertSelective(sku);// 新增库存Stock stock = new Stock();stock.setSkuId(sku.getId());stock.setStock(sku.getStock());this.stockMapper.insertSelective(stock);});}}

重启 leyou-item 服务,去页测试看看:

保存成功了。

商品的 修改,删除,上架,下架,这里就不实现了。有兴趣的可以去实现一下。

乐优商场项目day10—新增商品相关推荐

  1. 乐优商场项目day13—页面渲染

    一.处理null值 查询结果中有null值,如下: 这样的空值既不好看,还占用带宽. 我们可以将空值过滤掉, 在搜索微服务的配置中配置一下: 然后重启搜索微服务之后再看看: null值字段就被过滤掉了 ...

  2. 乐优商场项目day07——解决跨域问题

    1.跨域相关问题及解决办法. 2.实现 虽然cors原理复杂,但实现简单. SpringMVC已经帮我们写好了CORS的跨域过滤器:CorsFilter ,内部已经实现了复杂的判定逻辑,我们直接用就好 ...

  3. 乐优商场项目day02——总结

    一.架构的演变 传统架构 → 水平拆分 → 垂直拆分(最早的分布式) → soa(dubbo) → 微服务(SpringCloud) 二.远程调用技术 rpc协议:自定义数据格式,限定技术,传输速度快 ...

  4. 乐优商场项目day13—页面分页效果

    一.添加需要的数据 分页的话,我们需要知道总页数(totalPage).总条数(total).当前页(page), 所以我们先在data中记录这几个变量: 因为page是搜索条件之一,所以记录在sea ...

  5. 乐优商城(05)--商品管理

    乐优商城(05)–商品管理 一.导入图片资源 现在商品表中虽然有数据,但是所有的图片信息都是无法访问的,因此需要把图片导入到服务器中: 将images.zip文件上传至/leyou/static目录: ...

  6. 乐优商城(四)商品规格管理

    文章目录 1. 商品规格 1.1 SPU 和 SKU 1.2 分析商品规格的关系 1.3 数据库设计 1.3.1 商品规格组表 1.3.2 商品规格参数表 2. 商品规格组 2.1 商品规格组前端 2 ...

  7. 乐优商城笔记六:商品详情页

    使用模板引擎 Thymeleaf + nginx 完成商品详情页静态化 完成乐优商城商品详情页 搭建商品详情页微服务 创建子工程 GroupId:com.leyou.service ArtifactI ...

  8. 乐优商城学习笔记五-商品规格管理

    0.学习目标 了解商品规格数据结构设计思路 实现商品规格查询 了解SPU和SKU数据结构设计思路 实现商品查询 了解商品新增的页面实现 独立编写商品新增后台功能 1.商品规格数据结构 乐优商城是一个全 ...

  9. 乐优商城--服务(三) : 商品微服务(LyItemApplication)--前半部分

    商品微服务--前半部分: 1. 微服务结构(ly-item) 1.0 顶级父工程(le-you) 1.1 ly-item 1.1.1 ly-item-interface 1.1.1.1 添加依赖 1. ...

最新文章

  1. [spring-boot] 多环境配置
  2. 面经:为了拿到字节跳动offer,鬼知道我经历了啥...
  3. ASP.NET C# 货币转换函数 中文大写金额 英文金额
  4. ms查约束具体代码_ECCV 2020附代码论文合集(CNN,图像分割)
  5. Android QA
  6. HAOI 2006 受欢迎的牛 (洛谷2341)
  7. Linux在出现/java: cannot execute binary file
  8. 微服务面试题及详细答案
  9. Ribbon原理及使用详解
  10. mame android版本,重整街机模拟器MAME(Android版)
  11. 【ChinaDRM】符合ChinaDRM GY/T 277-2019标准的码流分析系统
  12. 金彩教育:如何提升自然流量
  13. 赖美云的认证照_赖美云的“瓜子牙”辣眼睛?原来牙齿美容这么重要
  14. python写圆柱的体积_继承实现圆柱体面积体积的计算
  15. LLC谐振变换器的寄生参数对谐振过程影响分析
  16. oracle数据库硬恢复,oracle数据库恢复
  17. DEVC++的几个实用小技巧
  18. c51语言 延时程序值怎么算,C51的延时计算
  19. 字符串(varchar)和二进制(varbinary)互转
  20. 解决\xEF\xBB\xBF问题

热门文章

  1. 产品经理跨部门沟通的3点经验
  2. 东南亚国家的商标注册小知识
  3. Python实现输入三个整数x,y,z,请把这三个数由小到大输出
  4. 我给航母做3D还原:这三处细节,太震撼了…
  5. Martian分析:轻量级微服务网络框架试用(Mars)
  6. android studio 自带模拟器进行 Root 及 Xposed安装
  7. 分享如何做好Instagram营销
  8. Python 豌豆荚 APP版本检测脚本
  9. TiDB 在爱奇艺实时分析场景的应用实践
  10. 视频直播,手机直播,视频秀的app简介