保存商品信息功能(VO)

文章目录

    • 1.分析前端保存商品发布信息的json数据
        • 1.分析commoditylaunch.vue的submitSkus
          • 1.将后面的都注销,只保留查看数据的部分
          • 2.填写基本信息
          • 3.保存信息,得到json
          • 4.使用工具格式化一下
        • 2.使用工具将json转为model
        • 3.根据业务修改vo,放到vo包下
    • 2.保存spu基本信息
        • 1.创建表commodity_spu_info
          • 1.用这个表来存储json的前六条信息
          • 2.sql
        • 2.生成基本的CRUD
          • 1.启动项目,访问localhost:81,点击生成
          • 2.将生成的main目录覆盖sunliving-commodity的main目录
          • 3.注释掉SpuInfoController.java中跟shiro相关的
          • 4.重启测试接口
            • 1.访问 http://localhost:5050/api/sunliving-commodity/commodity/spuinfo/list
            • 2.注意,如果提示VO不识别之类的就先刷新maven然后build一下即可
        • 3.完成基本信息的保存
          • 1.后端 sunliving-commodity模块
            • 1.SpuInfoService.java 接受SpuSaveVO,保存到数据库
            • 2.SpuInfoServiceImpl.java 实现方法
            • 3.SpuInfoController.java 编写保存信息的接口
          • 4.前端 commoditylaunch.vue的submitSkus方法
            • 1.修改url为环境变量+资源路径的方式
            • 2.解掉下面的注释
          • 5.前后端联调
            • 1.前端输入信息
            • 2.后端查看数据库
    • 3.保存spu图片描述url
        • 1.数据库表设计
        • 2.生成基本CRUD
          • 1.将生成的main目录覆盖sunliving-commodity的main目录
          • 2.注释掉SpuInfoDescController.java的与shiro有关的部分
          • 3.重启测试
        • 3.完成保存spu的图片描述url
          • 1.后端 sunliving-commodity模块
            • 1.将SpuInfoDescEntity.java的id修改为不是自增的
            • 2.修改SpuInfoServiceImpl.java的saveSpuInfo方法即可,注意需要添加@Transactional进行事务管理
          • 3.前后端联调
            • 1.前端保存信息
            • 2.后端在保存图片描述url的时候发现是空,原因是在将spuInfoEntity的id保存到db之前的确是空的,更改一下执行顺序即可
            • 3.将spuInfoEntity的保存提前
            • 4.再次测试,成功保存信息
    • 4.保存SPU图片集信息
        • 1.数据库表设计
        • 2.生成基本CRUD(不再赘述)
        • 3.完成保存图片集信息
          • 1.后端 sunliving-commodity 模块
            • 1.修改SpuInfoServiceImpl.java的saveSpuInfo即可
          • 2.前后端联调
            • 1.前端保存信息
            • 2.后端查看数据库
    • 5.保存SPU的基本属性
        • 1.数据库表创建
        • 2.生成基本CRUD(不再赘述)
        • 3.保存SPU的基本属性
          • 1.后端 sunliving-commodity模块
            • 1.ProductAttrValueService.java 新增方法,批量保存
            • 2.ProductAttrValueServiceImpl.java 实现方法
            • 3.修改SpuInfoServiceImpl.java 的saveSpuInfo方法,新增代码
          • 2.前后端联调
            • 1.前端保存基本属性
            • 2.后端查看数据库
    • 6.保存SKU的基本信息
        • 1.数据库表设计
        • 2.生成基本CRUD(不再赘述)
        • 3.保存SKU基本信息 sunliving-commodity模块
          • 1.SkuInfoService.java 新增批量添加的方法
          • 2.SkuInfoServiceImpl.java 实现方法
          • 3.SpuInfoServiceImpl.java 修改saveSpuInfo方法,新增代码
        • 4.前后端联调
          • 1.后端报错,java.lang.StackOverflowError
          • 2.问题分析
          • 3.问题解决
            • 1.修改自定义方法的名字
            • 2.修改SpuInfoServiceImpl.java调用的方法
            • 3.重启测试,保存成功!
    • 7.保存SPU和SKU图片信息
        • 1.数据库表创建
        • 2.生成基本CRUD(不再赘述)
        • 3.完成保存SPU和SKU图片信息 sunliving-commodity模块
          • 1.SkuImagesService.java 新增方法,批量保存sku图片
          • 2.SkuImagesServiceImpl.java 实现方法
          • 3.修改 SpuInfoServiceImpl.java,修改代码
        • 4.前后端联调
          • 1.前端保存信息
          • 2.后端测试,发现commodity_sku_images表插入了两条空的字段
          • 3.debug分析
            • 1.第一个sku有两张图片,第二个sku没有图片,在遍历第二个sku时发现,即使第二个没有图片,前端会传一个url为空的数组,包含两个元素
            • 2.在保存sku图片信息的时候,就会将这个图片的信息保存到数据库中
            • 3.解决方式:在保存sku图片信息时加一个过滤即可,把url为空的过滤掉
            • 4.重启测试,再添加一次,没有空值了
    • 8.保存SKU销售属性
        • 1.数据库表设计
        • 2.生成基本CRUD(不再赘述)
        • 3.完成保存SKU销售属性 sunliving-commodity模块
          • 1.SkuSaleAttrValueService.java 新增方法批量保存sku销售属性
          • 2.SkuSaleAttrValueServiceImpl.java 实现方法
          • 3.SpuInfoServiceImpl.java 新增代码保存sku的销售属性信息
          • 4.重启测试
    • 9.将vo转化为entity的总结
        • 1.整体的 SpuSaveVO预览
        • 2.转换结构
        • 3.转换规则
        • 4.List类型的特殊属性细节说明
        • 5.关于List里面还有多个特殊属性的处理
          • 1.查看这里的 List<Skus>
          • 2.分析

1.分析前端保存商品发布信息的json数据

1.分析commoditylaunch.vue的submitSkus
1.将后面的都注销,只保留查看数据的部分

image-20240423095755248

2.填写基本信息

image-20240423095919741

image-20240423095953088

image-20240423100005414

image-20240423100013921

3.保存信息,得到json

image-20240423100045156

4.使用工具格式化一下

image-20240423100406121

2.使用工具将json转为model

image-20240423105118842

3.根据业务修改vo,放到vo包下

image-20240423110715861

2.保存spu基本信息

1.创建表commodity_spu_info
1.用这个表来存储json的前六条信息

image-20240423112229157

2.sql
use sunliving_commodity;CREATE TABLE commodity_spu_info
(id BIGINT NOT NULL AUTO_INCREMENT COMMENT '商品 id',spu_name VARCHAR(200) COMMENT '商品名称',spu_description VARCHAR(1000) COMMENT '商品描述',catalog_id BIGINT COMMENT '所属分类 id',brand_id BIGINT COMMENT '品牌 id',weight DECIMAL(18,4),publish_status TINYINT COMMENT '上架状态[0 - 下架,1 - 上架]',create_time DATETIME,update_time DATETIME,PRIMARY KEY (id)
)CHARSET=utf8mb4 COMMENT='商品 spu 信息';SELECT * FROM commodity_spu_info
2.生成基本的CRUD
1.启动项目,访问localhost:81,点击生成

image-20240423112537477

2.将生成的main目录覆盖sunliving-commodity的main目录

image-20240423112806104

3.注释掉SpuInfoController.java中跟shiro相关的

image-20240423113012171

4.重启测试接口
1.访问 http://localhost:5050/api/sunliving-commodity/commodity/spuinfo/list

image-20240423113337244

2.注意,如果提示VO不识别之类的就先刷新maven然后build一下即可
3.完成基本信息的保存
1.后端 sunliving-commodity模块
1.SpuInfoService.java 接受SpuSaveVO,保存到数据库
public interface SpuInfoService extends IService<SpuInfoEntity> {PageUtils queryPage(Map<String, Object> params);/*** 保存 spu 信息* @param spuSaveVO*/public void saveSpuInfo(SpuSaveVO spuSaveVO);
}
2.SpuInfoServiceImpl.java 实现方法
    @Overridepublic void saveSpuInfo(SpuSaveVO spuSaveVO) {// 1.保存spu基本信息到entity,注意vo和entity的属性名必须一致SpuInfoEntity spuInfoEntity = new SpuInfoEntity();BeanUtils.copyProperties(spuSaveVO, spuInfoEntity);// 2.手动设置spu的其他属性spuInfoEntity.setCreateTime(new Date());spuInfoEntity.setUpdateTime(new Date());// 3.保存到数据库this.save(spuInfoEntity);}
3.SpuInfoController.java 编写保存信息的接口
    /*** 保存*/@RequestMapping("/save")// @RequiresPermissions("commodity:spuinfo:save")public R save(@RequestBody SpuSaveVO spuSaveVO) {spuInfoService.saveSpuInfo(spuSaveVO);return R.ok();}
4.前端 commoditylaunch.vue的submitSkus方法
1.修改url为环境变量+资源路径的方式

image-20240423134925019

2.解掉下面的注释

image-20240423134945642

5.前后端联调
1.前端输入信息

image-20240423135116668

2.后端查看数据库

image-20240423135140107

3.保存spu图片描述url

1.数据库表设计
use sunliving_commodity;CREATE TABLE commodity_spu_info_desc
(spu_id  BIGINT NOT NULL COMMENT '商品 id',decript LONGTEXT COMMENT '商品介绍图片',PRIMARY KEY (spu_id)
) CHARSET = utf8mb4 COMMENT ='商品 spu 信息介绍';select * from commodity_spu_info_desc;
2.生成基本CRUD
1.将生成的main目录覆盖sunliving-commodity的main目录

image-20240423141530797

2.注释掉SpuInfoDescController.java的与shiro有关的部分
3.重启测试

image-20240423141844270

3.完成保存spu的图片描述url
1.后端 sunliving-commodity模块
1.将SpuInfoDescEntity.java的id修改为不是自增的

image-20240423152006569

2.修改SpuInfoServiceImpl.java的saveSpuInfo方法即可,注意需要添加@Transactional进行事务管理
    @Transactional // 事务管理@Overridepublic void saveSpuInfo(SpuSaveVO spuSaveVO) {// 1.保存spu基本信息到entity,注意vo和entity的属性名必须一致SpuInfoEntity spuInfoEntity = new SpuInfoEntity();BeanUtils.copyProperties(spuSaveVO, spuInfoEntity);// 2.手动设置spu的其他属性spuInfoEntity.setCreateTime(new Date());spuInfoEntity.setUpdateTime(new Date());// 获取decript信息List<String> decript = spuSaveVO.getDecript();SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity();// 如果decript为空,则保存默认值,否则保存decript,以逗号分隔if (decript != null && !decript.isEmpty()) {spuInfoDescEntity.setDecript(String.join(",", decript));} else {spuInfoDescEntity.setDecript("暂无描述");}// 设置spuId为刚刚保存的spu的idspuInfoDescEntity.setSpuId(spuInfoEntity.getId());// 保存spu描述信息spuInfoDescService.save(spuInfoDescEntity);// 3.将spu的信息保存到数据库this.save(spuInfoEntity);}
3.前后端联调
1.前端保存信息
2.后端在保存图片描述url的时候发现是空,原因是在将spuInfoEntity的id保存到db之前的确是空的,更改一下执行顺序即可

image-20240423153604583

3.将spuInfoEntity的保存提前

image-20240423153819500

4.再次测试,成功保存信息

image-20240423154059819

4.保存SPU图片集信息

1.数据库表设计
use sunliving_commodity;CREATE TABLE commodity_spu_images
(id          BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id',spu_id      BIGINT COMMENT 'spu_id',img_name    VARCHAR(200) COMMENT '图片名',img_url     VARCHAR(255) COMMENT '图片地址',img_sort    INT COMMENT '顺序',default_img TINYINT COMMENT '是否默认图',PRIMARY KEY (id)
) CHARSET = utf8mb4 COMMENT ='spu 图片集';SELECT *
FROM commodity_spu_images;
2.生成基本CRUD(不再赘述)

image-20240423155424779

3.完成保存图片集信息
1.后端 sunliving-commodity 模块
1.修改SpuInfoServiceImpl.java的saveSpuInfo即可
    @Transactional // 事务管理@Overridepublic void saveSpuInfo(SpuSaveVO spuSaveVO) {// 1.保存spu基本信息到entity,注意vo和entity的属性名必须一致SpuInfoEntity spuInfoEntity = new SpuInfoEntity();BeanUtils.copyProperties(spuSaveVO, spuInfoEntity);// 2.手动设置spu的其他属性spuInfoEntity.setCreateTime(new Date());spuInfoEntity.setUpdateTime(new Date());// 获取decript信息List<String> decript = spuSaveVO.getDecript();SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity();// 如果decript为空,则保存默认值,否则保存decript,以逗号分隔if (decript != null && !decript.isEmpty()) {spuInfoDescEntity.setDecript(String.join(",", decript));} else {spuInfoDescEntity.setDecript("暂无描述");}// 将spu的信息保存到数据库this.save(spuInfoEntity);// 设置spuId为刚刚保存的spu的idspuInfoDescEntity.setSpuId(spuInfoEntity.getId());// 保存spu描述信息spuInfoDescService.save(spuInfoDescEntity);// 获取spu的图片信息List<String> images = spuSaveVO.getImages();// 如果images为空,则保存默认值if (images == null || images.isEmpty()) {SpuImagesEntity spuImagesEntity = new SpuImagesEntity();spuImagesEntity.setSpuId(spuInfoEntity.getId());spuImagesEntity.setDefaultImg(0);spuImagesEntity.setImgUrl("暂无图片");spuImagesEntity.setImgSort(0);spuImagesService.save(spuImagesEntity);} else {// 否则,使用stream api 将图片保存到一个集合,批量保存List<SpuImagesEntity> collect = images.stream().map(img -> {SpuImagesEntity spuImagesEntity = new SpuImagesEntity();spuImagesEntity.setSpuId(spuInfoEntity.getId());spuImagesEntity.setDefaultImg(0);spuImagesEntity.setImgUrl(img);spuImagesEntity.setImgSort(0);return spuImagesEntity;}).collect(Collectors.toList());// 批量保存图片spuImagesService.saveBatch(collect);}}
2.前后端联调
1.前端保存信息
2.后端查看数据库

image-20240423163624417

5.保存SPU的基本属性

1.数据库表创建
use sunliving_commodity;CREATE TABLE commodity_product_attr_value
(id         BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id',spu_id     BIGINT COMMENT '商品 id',attr_id    BIGINT COMMENT '属性 id',attr_name  VARCHAR(200) COMMENT '属性名',attr_value VARCHAR(200) COMMENT '属性值',attr_sort  INT COMMENT '顺序',quick_show TINYINT COMMENT '快速展示【是否展示在介绍上;0-否 1-是】',PRIMARY KEY (id)
) CHARSET = utf8mb4 COMMENT ='spu 基本属性值';select * from commodity_product_attr_value;
2.生成基本CRUD(不再赘述)

image-20240423171620380

3.保存SPU的基本属性
1.后端 sunliving-commodity模块
1.ProductAttrValueService.java 新增方法,批量保存
    /*** 批量保存商品属性* @param productAttrValueEntities*/void saveProductAttrValue(List<ProductAttrValueEntity> productAttrValueEntities);
2.ProductAttrValueServiceImpl.java 实现方法
    @Overridepublic void saveProductAttrValue(List<ProductAttrValueEntity> productAttrValueEntities) {this.saveBatch(productAttrValueEntities);}
3.修改SpuInfoServiceImpl.java 的saveSpuInfo方法,新增代码
        // 得到spu的基本属性List<BaseAttrs> baseAttrs = spuSaveVO.getBaseAttrs();// 使用stream api将基本属性保存到数据库List<ProductAttrValueEntity> collect = baseAttrs.stream().map(baseAttr -> {ProductAttrValueEntity productAttrValueEntity = new ProductAttrValueEntity();productAttrValueEntity.setSpuId(spuInfoEntity.getId());productAttrValueEntity.setAttrId(baseAttr.getAttrId());productAttrValueEntity.setQuickShow(baseAttr.getShowDesc());productAttrValueEntity.setAttrSort(0);productAttrValueEntity.setAttrValue(baseAttr.getAttrValues());// 根据attrId查询attrName并设置productAttrValueEntity.setAttrName(attrService.getById(baseAttr.getAttrId()).getAttrName());return productAttrValueEntity;}).collect(Collectors.toList());// 批量保存ProductAttrValueEntityproductAttrValueService.saveProductAttrValue(collect);
2.前后端联调
1.前端保存基本属性
2.后端查看数据库

image-20240423192720404

6.保存SKU的基本信息

1.数据库表设计
use sunliving_commodity;CREATE TABLE commodity_sku_info
(sku_id          BIGINT NOT NULL AUTO_INCREMENT COMMENT 'skuId',spu_id          BIGINT COMMENT 'spuId',sku_name        VARCHAR(255) COMMENT 'sku 名称',sku_desc        VARCHAR(2000) COMMENT 'sku 介绍描述',catalog_id      BIGINT COMMENT '所属分类 id',brand_id        BIGINT COMMENT '品牌 id',sku_default_img VARCHAR(255) COMMENT '默认图片',sku_title       VARCHAR(255) COMMENT '标题',sku_subtitle    VARCHAR(2000) COMMENT '副标题',price           DECIMAL(18, 4) COMMENT '价格',sale_count      BIGINT COMMENT '销量',PRIMARY KEY (sku_id)
) CHARSET = utf8mb4 COMMENT ='sku 信息';SELECT *
FROM commodity_sku_info;
2.生成基本CRUD(不再赘述)
3.保存SKU基本信息 sunliving-commodity模块
1.SkuInfoService.java 新增批量添加的方法
    /*** 批量添加*/void saveBatch(List<SkuInfoEntity> skuInfoEntities);
2.SkuInfoServiceImpl.java 实现方法
    @Overridepublic void saveBatch(List<SkuInfoEntity> skuInfoEntities) {this.saveBatch(skuInfoEntities);}
3.SpuInfoServiceImpl.java 修改saveSpuInfo方法,新增代码
        // 得到spu的skus信息List<Skus> skus = spuSaveVO.getSkus();// 使用stream api将skus信息保存到数据库List<SkuInfoEntity> skusCollect = skus.stream().map(sku -> {SkuInfoEntity skuInfoEntity = new SkuInfoEntity();skuInfoEntity.setBrandId(spuInfoEntity.getBrandId());skuInfoEntity.setSkuDesc("");skuInfoEntity.setSkuName(sku.getSkuName());skuInfoEntity.setPrice(sku.getPrice());skuInfoEntity.setSpuId(spuInfoEntity.getId());// 从images中获取默认图片List<Images> skuImages = sku.getImages();for (Images image : skuImages) {if (image.getDefaultImg() == 1) {skuInfoEntity.setSkuDefaultImg(image.getImgUrl());}else {skuInfoEntity.setSkuDefaultImg("暂无默认图片");}}skuInfoEntity.setSkuSubtitle(sku.getSkuSubtitle());skuInfoEntity.setSkuTitle(sku.getSkuTitle());skuInfoEntity.setCatalogId(spuInfoEntity.getCatalogId());skuInfoEntity.setSaleCount(0L);return skuInfoEntity;}).collect(Collectors.toList());// 批量保存SkuInfoEntityskuInfoService.saveSkuInfoEntitys(skusCollect);
4.前后端联调
1.后端报错,java.lang.StackOverflowError

image-20240424152315435

2.问题分析
  • 这里只报了这一个StackOverflowError,没有任何其他的提示信息
  • 栈溢出,只可能是无限递归,debug查看数据没问题,在调用saveBatch报错
  • 检查一下saveBatch发现,我自定义的名字跟IService接口的saveBatch相同,这样就相当于重写了IService接口中的方法,然后不断递归,所以出现了栈溢出
  • 解决方式:修改一下自定义方法的名字即可

image-20240424153407345

3.问题解决
1.修改自定义方法的名字

image-20240424153745459

2.修改SpuInfoServiceImpl.java调用的方法

image-20240424153844730

3.重启测试,保存成功!

image-20240424154050572

image-20240424154217814

7.保存SPU和SKU图片信息

1.数据库表创建
use sunliving_commodity;CREATE TABLE commodity_sku_images
(id          BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id',sku_id      BIGINT COMMENT 'sku_id',img_url     VARCHAR(255) COMMENT '图片地址',img_sort    INT COMMENT '排序',default_img INT COMMENT '默认图[0 - 不是默认图,1 - 是默认图]',PRIMARY KEY (id)
) CHARSET = utf8mb4 COMMENT ='sku 图片';SELECT *
FROM commodity_sku_images
2.生成基本CRUD(不再赘述)

image-20240424165537977

3.完成保存SPU和SKU图片信息 sunliving-commodity模块
1.SkuImagesService.java 新增方法,批量保存sku图片
    /*** 批量保存 sku 图片* @param skuImagesEntity*/void saveSkuImages(List<SkuImagesEntity> skuImagesEntity);
2.SkuImagesServiceImpl.java 实现方法
    @Overridepublic void saveSkuImages(List<SkuImagesEntity> skuImagesEntity) {this.saveBatch(skuImagesEntity);}
3.修改 SpuInfoServiceImpl.java,修改代码
        // 得到spu的skus信息List<Skus> skus = spuSaveVO.getSkus();// 遍历skus,将sku信息保存到数据库skus.forEach(sku -> {SkuInfoEntity skuInfoEntity = new SkuInfoEntity();skuInfoEntity.setBrandId(spuInfoEntity.getBrandId());skuInfoEntity.setSkuDesc("");skuInfoEntity.setSkuName(sku.getSkuName());skuInfoEntity.setPrice(sku.getPrice());skuInfoEntity.setSpuId(spuInfoEntity.getId());// 从images中获取默认图片List<Images> skuImages = sku.getImages();for (Images image : skuImages) {if (image.getDefaultImg() == 1) {skuInfoEntity.setSkuDefaultImg(image.getImgUrl());}else {skuInfoEntity.setSkuDefaultImg("暂无默认图片");}}skuInfoEntity.setSkuSubtitle(sku.getSkuSubtitle());skuInfoEntity.setSkuTitle(sku.getSkuTitle());skuInfoEntity.setCatalogId(spuInfoEntity.getCatalogId());skuInfoEntity.setSaleCount(0L);// 将sku信息保存到数据库skuInfoService.save(skuInfoEntity);// 保存sku的图片信息List<SkuImagesEntity> skuImagesEntities = skuImages.stream().map(image -> {SkuImagesEntity skuImagesEntity = new SkuImagesEntity();skuImagesEntity.setSkuId(skuInfoEntity.getSkuId());skuImagesEntity.setDefaultImg(image.getDefaultImg());skuImagesEntity.setImgUrl(image.getImgUrl());skuImagesEntity.setImgSort(0);return skuImagesEntity;}).collect(Collectors.toList());// 批量保存sku的图片信息skuImagesService.saveSkuImages(skuImagesEntities);});
4.前后端联调
1.前端保存信息
2.后端测试,发现commodity_sku_images表插入了两条空的字段

image-20240424200701966

3.debug分析
1.第一个sku有两张图片,第二个sku没有图片,在遍历第二个sku时发现,即使第二个没有图片,前端会传一个url为空的数组,包含两个元素

image-20240424195959111

2.在保存sku图片信息的时候,就会将这个图片的信息保存到数据库中

image-20240424200456325

3.解决方式:在保存sku图片信息时加一个过滤即可,把url为空的过滤掉

image-20240424200616141

4.重启测试,再添加一次,没有空值了

image-20240424201542051

8.保存SKU销售属性

1.数据库表设计
use sunliving_commodity;CREATE TABLE commodity_sku_sale_attr_value
(id         BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id',sku_id     BIGINT COMMENT 'sku_id',attr_id    BIGINT COMMENT 'attr_id',attr_name  VARCHAR(200) COMMENT '销售属性名',attr_value VARCHAR(200) COMMENT '销售属性值',attr_sort  INT COMMENT '顺序',PRIMARY KEY (id)
) CHARSET = utf8mb4 COMMENT ='sku 的销售属性/值表';SELECT *
FROM commodity_sku_sale_attr_value;
2.生成基本CRUD(不再赘述)

image-20240425092806248

3.完成保存SKU销售属性 sunliving-commodity模块
1.SkuSaleAttrValueService.java 新增方法批量保存sku销售属性
    /*** 批量保存sku销售属性* @param skuSaleAttrValueEntities*/void saveSkuSaleAttrValues(List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities);
2.SkuSaleAttrValueServiceImpl.java 实现方法
    @Overridepublic void saveSkuSaleAttrValues(List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities) {this.saveBatch(skuSaleAttrValueEntities);}
3.SpuInfoServiceImpl.java 新增代码保存sku的销售属性信息
            // 保存sku的销售属性信息List<Attr> attr = sku.getAttr();List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = attr.stream().map(a -> {SkuSaleAttrValueEntity skuSaleAttrValueEntity = new SkuSaleAttrValueEntity();// 将attr的信息拷贝到skuSaleAttrValueEntityBeanUtils.copyProperties(a, skuSaleAttrValueEntity);skuSaleAttrValueEntity.setSkuId(skuInfoEntity.getSkuId());skuSaleAttrValueEntity.setAttrSort(0);return skuSaleAttrValueEntity;}).collect(Collectors.toList());// 批量保存sku的销售属性信息skuSaleAttrValueService.saveSkuSaleAttrValues(skuSaleAttrValueEntities);
4.重启测试

image-20240425094745439

9.将vo转化为entity的总结

1.整体的 SpuSaveVO预览

image-20240425095813804

2.转换结构
  • 这里由六个基本属性和五个特殊属性来组成一个VO
3.转换规则
  • 首先,一定是在Controller层,接收到一个完整的VO
  • 将这个VO的基本属性,转换为一个主entity
  • 将每个特殊属性再单独转为一个entity,需要与主entity的id关联,当然也可以关联其他属性
4.List类型的特殊属性细节说明
  • 关于List类型的特殊属性,有两种选择,一种是将里面的内容,比如是String类型的图片url放到一个entity中使用逗号间隔,第二种是将每一个String都放到一个entity中,都是可以的
5.关于List里面还有多个特殊属性的处理
1.查看这里的 List

image-20240425100758080

2.分析
  • 可以看到一个SpuSaveVO中不仅有List类型的Skus,而且每个Skus中还有List类型的Attr
  • 虽然看上去复杂,不过确实也复杂。
  • 但是,关于List类型的属性,只需要记住一点,遍历出每一个元素,将其转化为entity,这个entity至少需要与上一层的entity的id关联

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「网络流浅谈」最大流的应用

更好的阅读体验 二分图匹配 考虑如何将二分图匹配问题&#xff0c;转化为流网络。设置 1 1 1 个汇点和源点&#xff0c;从源点向二分图一侧的每一个点连边&#xff0c;从另一侧向汇点连边&#xff0c;边权均为 1 1 1&#xff0c;二分图中的边也全部加入&#xff0c;权值设为…

【第1章】SpringBoot入门

文章目录 前言一、版本要求1. SpringBoot版本2. 其他2.1 System Requirements2.2 Servlet Containers2.3 GraalVM Native Images 3. 版本定型 二、新建工程1.IDEA创建 ( 推荐 ) \color{#00FF00}{(推荐)} (推荐)2. 官方创建 三、第一个SpringBoot程序1. 引入web2. 启动类3. 启动…

Edge浏览器:重新定义现代网页浏览

引言 - Edge的起源与重生 Edge浏览器&#xff0c;作为Microsoft Windows标志性的互联网窗口&#xff0c;源起于1995年的Internet Explorer。在网络发展的浪潮中&#xff0c;IE曾是无可争议的霸主&#xff0c;但随着技术革新与用户需求的演变&#xff0c;它面临的竞争日益激烈。…

用这8种方法在海外媒体推广发稿平台上获得突破-华媒舍

在今天的数字时代&#xff0c;海外媒体推广发稿平台已经成为了许多机构和个人宣传和推广的有效途径。如何在这些平台上获得突破并吸引更多的关注是一个关键问题。本文将介绍8种方法&#xff0c;帮助您在海外媒体推广发稿平台上实现突破。 1. 确定目标受众 在开始使用海外媒体推…

篮球论坛|基于SprinBoot+vue的篮球论坛系统(源码+数据库+文档)

篮球论坛系统 目录 基于SprinBootvue的篮球论坛系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff…

AI大模型探索之路-实战篇5: Open Interpreter开放代码解释器调研实践

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;DB-GPT数据应用开发框架调研实践 目录 系列篇章&#x1f4a5;前言一、何为Open Interpreter&#xff1f;二、与 ChatGPT 的代码解释器比较三、 Open Interpreter的特性1、强大的本地计算能力2、丰富的功能3、高度的…

Spark在YARN上运行图解(资源调度+任务调度)及案例

前提&#xff1a;已经安装了spark集群&#xff0c;可参考上篇文章搭建&#xff1a;http://t.csdnimg.cn/UXBOp 一、Spark集群配置YARN 1、增加hadoop 配置文件地址 vim spark-env.sh 增加export HADOOP_CONF_DIR/usr/local/soft/hadoop-3.1.1/etc/hadoop 2、关闭虚拟内存 cd …

结构安全预警?事前发现?人工观测VS自动化监测,谁更胜一筹?

人工检测是依靠目测检查或借助于便携式仪器测量得到的信息&#xff0c;但是随着整个行业的发展&#xff0c;传统的人工检测方法已经不能满足检测需求&#xff0c;从人工检测到自动化监测已是必然趋势。 a. 从检测方式看 人工检测需要耗费大量的精力&#xff0c;从摆放检测工具到…

Golang | Leetcode Golang题解之第110题平衡二叉树

题目&#xff1a; 题解&#xff1a; func isBalanced(root *TreeNode) bool {return height(root) > 0 }func height(root *TreeNode) int {if root nil {return 0}leftHeight : height(root.Left)rightHeight : height(root.Right)if leftHeight -1 || rightHeight -1 …

最热门好用骨传导耳机推荐!!分享六大实用选购技巧助你挑选!

耳机基本是每人人手一台&#xff0c;不管是在地铁上还是在公交上&#xff0c;都可以看到很多人戴着耳机度过空余的时光&#xff0c;甚至现在人们在耳机的选择方面更加偏向于骨传导耳机&#xff0c;开放耳道的奇特设计在户外佩戴的时候可以更好的感知到周围的环境音&#xff0c;…

基于多模态MRI中深层语义和边缘信息融合的脑肿瘤分割 | 文献速递-深度学习肿瘤自动分割

Title 题目 Brain tumor segmentation based on the fusion of deep semantics and edge information in multimodal MRI 基于多模态MRI中深层语义和边缘信息融合的脑肿瘤分割 01 文献速递介绍 医学图像分割是医学图像处理领域的重要课题。其中&#xff0c;脑肿瘤分割旨在…

基础5 探索JAVA图形编程桌面:字符操作组件详解

在繁华都市的一个角落&#xff0c;卧龙和凤雏相聚在他们常去的台球厅。灯光洒在绿色的台球桌上&#xff0c;彩色的台球整齐地排列着&#xff0c;仿佛在等待着一场激烈的角逐。 卧龙轻轻地拿起球杆&#xff0c;微微瞄准&#xff0c;然后用力一击&#xff0c;白球带着一股强大的力…

C#_库的引用

类库的引用 还可以自己引用类库&#xff1a;解决方案-添加-新建项目 主程序 using System; using System.Windows.Forms; using Tools;namespace ConsoleApp2 {class Program{static void Main(string[] args){//Console.WriteLine("helloword");// Form form ne…

[力扣]——70.爬楼梯

题目描述&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 本题较为简单&#xff0c;主要用到递归思想 int fun(int n,int memo[]) {if(memo[n]!-1) //如果备忘录中已经有记录了…

MVCC相关

文章目录 前情要点基于什么引擎并发事务产生的问题不可重复读和幻读区别Next-Key Lock的示例解决并发事务采用的隔离级别当前读(Current Read)快照读(Snapshot Read)参考 MVCC定义表里面的隐藏字段由db_roll_ptr串成的版本链ReadView可见性算法mvcc的可见性算法为什么要以提交的…

Linux之单机项目部署

1、虚拟机&#xff08;VMware&#xff09;创建Linux系统 1.1、创建虚拟机 1.2、配置虚拟机IOS映射文件 1.3、虚拟机内部相关配置 等待加载即可&#xff0c;加载完后会弹出图形化界面&#xff0c;如图&#xff1a; 注意&#xff1a;一般我们做为管理员使用ROOT账号来操作&#x…

数据结构和算法基础(二)

树和二叉树——树的基本概念 树和二叉树——树转二叉树 树和二叉树——查找二叉树&#xff08;二叉排序树&#xff09; 树和二叉树——构造霍夫曼树&#xff08;最优&#xff09; 树和二叉树——线索二叉树 树和二叉树——平衡二叉树 图——基本概念 1、有向图 2、无向图 3、完…

BGP路由优化

一&#xff0c;拓扑 二&#xff0c;要求 用preva1策略确保R4通过R2到达192.168.10.0/24 &#xff0c;用AS Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 .用Local Preference策略&#xff0c;确保R1通过R2到达1…

FTP介绍

FTP 1、FTP—文件传输协议 文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;是用于在网络上进行文件传输的一套标准协议&#xff0c;它工作在 OSI 模型的第七层&#xff0c; TCP 模型的第四层&#xff0c; 即应用层&#xff0c; 使用 TCP 传输&…