保存商品信息功能(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 实现方法
    @Override
    public 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 // 事务管理
    @Override
    public 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的id
        spuInfoDescEntity.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 // 事务管理
    @Override
    public 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的id
        spuInfoDescEntity.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 实现方法
    @Override
    public 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());

        // 批量保存ProductAttrValueEntity
        productAttrValueService.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 实现方法
    @Override
    public 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());
        // 批量保存SkuInfoEntity
        skuInfoService.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 实现方法
    @Override
    public 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 实现方法
    @Override
    public 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的信息拷贝到skuSaleAttrValueEntity
                BeanUtils.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关联

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣hot100学习记录(七)

240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 题意 在二维矩阵中搜索是否存在一个目标值&#xff0c;该矩阵每一行每一列都是升序…

❤ Vscode和Idea都可以使用的-AI插件(官方-百度出的)

❤ Vscode和Idea都可以使用的-AI插件&#xff08;官方-百度出的&#xff09; 最新AI特别火&#xff0c;给大家推荐一下最新出的VScode插件&#xff0c;辅助我们写代码&#xff01; 1、下载地址&#xff1a; > https://comate.baidu.com/zh/shopping?inviteCodefkzlak8f …

内存函数详解与模拟实现

目录 1.memcpy函数 1.1memmcpy函数的模拟使用 2.memmove函数 2.1memmove 函数的模拟使用 3.memcmp 3.1memcmp函数的模拟实现 4.memset (内存设置) 4.1memset函数的模拟实现 1.memcpy函数 void* memcpy(void* destination, const void* source, size_t num);//之所以是v…

网络统一监控运维管理解决方案(ppt原件方案)

网络统一监控运维管理解决方案 1. 构建完善的网络运维体系&#xff1a;通过组织、流程、制度的完善、支撑手段的建设&#xff0c;构建低成本高效率的IT运营体系&#xff0c;推动IT运营工作自动化、智能化、一体化化发展。 2. 构建网络一体化监控能力&#xff1a;构建从设备、…

YOLOv10 | 无NMS的YOLO | 实时端到端目标检测的新突破

过去几年里&#xff0c;YOLOs因在计算成本和检测性能之间实现有效平衡而成为实时目标检测领域的主流范式。研究人员针对YOLOs的结构设计、优化目标、数据增强策略等进行了深入探索&#xff0c;并取得了显著进展。然而&#xff0c;对非极大值抑制&#xff08;NMS&#xff09;的后…

人工智能的阴暗面:犯罪分子如何利用 AI 进行欺诈

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;正迅速成为推动各行各业生产力和创新的关键力量&#xff0c;而一些不法分子也开始探索如何将这些先进的工具用于他们自己的非法目的。从网络钓鱼到深度伪造&#xff0c;再到人肉搜索、越狱服务和身份验证系统的…

【无标题】亚马逊5月24日宣布推出2024出口跨境物流加速器计划

亚马逊中国5月24日郑重宣布启动“2024亚马逊出口跨境物流加速器计划”&#xff0c;旨在依托其世界领先的物流网络和前沿技术&#xff0c;结合本土资源&#xff0c;不断优化跨境物流服务&#xff0c;以强化中国卖家在跨境物流供应链管理方面的能力&#xff0c;进而提升整体效率&…

云平台的安全能力提升解决方案

提升云平台的安全能力是确保数据和服务安全的关键步骤。针对大型云平台所面临的云上安全建设问题&#xff0c;安全狗提供完整的一站式云安全解决方案&#xff0c;充分匹配云平台安全管理方的需求和云租户的安全需求。协助大型云平台建设全网安全态势感知、统一风险管理、统一资…

如何从恢复出厂设置的Android手机恢复联系人?

“嗨&#xff0c;先生/女士&#xff0c;我不小心将手机恢复出厂设置&#xff0c;因此所有数据都从我的小米手机中删除。我真的压力很大&#xff01;我什么都试过了&#xff0c;但没有任何效果&#xff01;求求你&#xff0c;帮帮我!!” 由于各种原因&#xff0c;许多人可能已经…

2024年山东省安全员C证证模拟考试题库及山东省安全员C证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年山东省安全员C证证模拟考试题库及山东省安全员C证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;山东省安全员C证证模拟考试题库是根据山东省安全员C证最新版教材&#xff0c;山东省安全员C证大纲整理…

试用百川智能的百小应-说的太多,做的太少

“百小应”的品牌标识&#xff08;logo&#xff09;上有一缕黄色&#xff0c;这是王小川特意设计的。他说&#xff0c;其他AI应用都在强调科技感&#xff0c;更愿意用蓝色或者冷色调。但他觉得这一代科技与上个时代不一样&#xff0c;现代科技应该像人&#xff0c;所以选择使用…

设计模式9——适配器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 适配器模式&#xff08;Adapte…

Transformers实战02-BERT预训练模型微调

文章目录 简介BERT的基本原理分词模型输出 BERT预训练的方法BERT模型微调加载数据集DatasetDataLoader 训练模型构建模型tqdm使用训练模型模型预测 简介 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种基于 Transformer 模型的预…

Python爬取B站视频:封装一下

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

深度学习500问——Chapter09:图像分割(5)

文章目录 9.12 DenseNet 9.13 图像分割的数据集 9.13.1 PASCAL VOC 9.13.2 MS COCO 9.13.3 Cityscapes 9.14 全景分割 9.12 DenseNet 这篇论文是CVPR2017年的最佳论文。 卷积神经网络结构的设计主要朝着两个方向发展&#xff0c;一个是更宽的网络&#xff08;代表&#xff1a…

3D 生成重建011-LucidDreamer 优化SDS过平滑结果的一种探索

3D 生成重建011-LucidDreamer 优化SDS过平滑结果的一种探索 文章目录 0论文工作1论文方法2 效果 0论文工作 文本到3D生成的最新进展标志着生成模型的一个重要里程碑&#xff0c;为在各种现实场景中创建富有想象力的3D资产打开了新的可能性。虽然最近在文本到3D生成方面的进展…

2024 一键批量下载微博内容/图片/视频/评论/转发数据,导出excel和pdf

以李健的微博为例&#xff0c;抓取2010-2024年所有的微博数据excel&#xff0c;包含微博链接&#xff0c;微博内容&#xff0c;发布时间&#xff0c;点赞数&#xff0c;转发数&#xff0c;评论数&#xff0c;话题等。 每个月的微博转评赞总数曲线&#xff0c;2015年是高峰。 微…

Pod进阶——资源限制以及探针检查

目录 一、资源限制 1、资源限制定义&#xff1a; 2、资源限制request和limit资源约束 3、Pod和容器的资源请求和限制 4、官方文档示例 5、CPU资源单位 6、内存资源单位 7、资源限制实例 ①编写yaml资源配置清单 ②释放内存&#xff08;node节点&#xff0c;以node01为…

APP广告变现怎么实现的,背后逻辑是什么?

广告变现的实现主要基于以下几个关键步骤和逻辑&#xff1a; 用户获取与留存&#xff1a;首先&#xff0c;APP需要吸引足够的用户并确保他们的留存率。只有拥有庞大且活跃的用户基础&#xff0c;APP才能吸引广告商投放广告。因此&#xff0c;开发者需要通过优化APP质量、提升用…

阅读笔记——《未知协议状态机推断技术研究综述》

【参考文献】盛嘉杰, 牛胜杰, 陈阳, 等. 未知协议状态机推断技术研究综述[J]. 计算机与现代化, 2023 (05): 58.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&#xff0c;请联系作者删除。 摘要 协议逆向工程&#xff08;PRE&#xff09;描述了协议的行为逻辑&#xff…