• 【第七篇】商城系统-商品发布-SKU和SPU管理


    在这里插入图片描述

    商品服务

    1.新增商品

    1.1 品牌的关联

    1.1.1 PubSub依赖缺失

    打开新增商品页面的时候会出现的错误提示:

    image.png

    原因是缺少:PubSub相关依赖

    解决办法

    • 使用npm添加依赖:npm install --save pubsub-js(失败的话使用此命令:cnpm install --save pubsub-js)
    • 在src下的main.js中引用:
      import PubSub from ‘pubsub-js’
      Vue.prototype.PubSub = PubSubimage.png
    • 在.eslintrc.js中添加一下配置

    image.png

    1.1.2 品牌关联

    拷贝对应的前端页面文件

    image.png

    添加后端对应的服务

    image.png

    然后service中查询处理

    image.png

    最后的显示效果

    image.png

    1.1.3 会员等级

      首先我们需要启动会员模块,并且配置对应的网关路由信息

    image.png

    image.png

    1.1.4 规格参数

      在新增商品的第二步我们就需要设置对应的规格参数,而这些规格参数是根据前面一步选择的三级分类来查询出来的。

    image.png

      响应对应的数据,我们需要先创建对应的VO对象。

    package com.msb.mall.product.vo;
    
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.msb.mall.product.entity.AttrEntity;
    import lombok.Data;
    
    import java.util.List;
    
    @Data
    public class AttrGroupWithAttrsVo {
        /**
         * 分组id
         */
        @TableId
        private Long attrGroupId;
        /**
         * 组名
         */
        private String attrGroupName;
        /**
         * 排序
         */
        private Integer sort;
        /**
         * 描述
         */
        private String descript;
        /**
         * 组图标
         */
        private String icon;
        /**
         * 所属分类id
         */
        private Long catelogId;
    
        // 关联对应的属性信息
        private List<AttrEntity> attrs;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

      然后创建对应的controller

    image.png

      然后创建对应的service

    image.png

    1.2 发布商品

    1.2.1 VO 接收数据

      前端页面提交的JSON数据非常复杂,我们需要在后端服务通过对应的VO对象来接收这些相关的数据。

    image.png

    然后通过在线的json格式处理工具生成对应的VO工具类

    image.png

    1.2.2 保存对应的数据

      需要保存的数据拆解为一下六个部分。

    image.png

    1.2.3 保存商品基本信息

    image.png

    1.2.4 保存商品描述

    image.png

    需要注意的地方:

    image.png

    1.2.4 保存图集信息

    image.png

    1.2.5 保存规格参数

    image.png

    1.2.6 SKU基本信息存储

    image.png

    1.2.7 SKU的图集

    image.png

    1.2.8 SKU的销售属性

    image.png

    1.3 远程服务调用

    image.png

    image.png

    image.png

    image.png

    1.3.1 满减,折扣,会员价保存

    在coupon服务中定义相关的接口及处理的service

    image.png

    image.png

    然后我们在Product服务中来处理接口的调用

    image.png

    然后在商品的service中完成服务的调用

    image.png

    完成满减折扣和会员价的service存储

        public void saveSkuReduction(SkuReductionDTO dto) {
            // 5.3 保存满减信息,折扣,会员价
            // mall_sms: sms_sku_ladder sms_full_reduction sms_member_price
            // 1.折扣
            SkuLadderEntity ladderEntity = new SkuLadderEntity();
            ladderEntity.setSkuId(dto.getSkuId());
            ladderEntity.setFullCount(dto.getFullCount());
            ladderEntity.setDiscount(dto.getDiscount());
            ladderEntity.setAddOther(dto.getCountStatus());
            if(ladderEntity.getFullCount() > 0){
                ladderService.save(ladderEntity);
            }
            // 2.满减
            SkuFullReductionEntity fullReductionEntity = new SkuFullReductionEntity();
            BeanUtils.copyProperties(dto,fullReductionEntity);
            if(fullReductionEntity.getFullPrice().compareTo(new BigDecimal(0)) == 1){
                this.save(fullReductionEntity);
            }
            // 3.会员价
            List<MemberPriceEntity> memberPriceEntities = dto.getMemberPrice().stream().map(item -> {
                MemberPriceEntity priceEntity = new MemberPriceEntity();
                priceEntity.setSkuId(dto.getSkuId());
                priceEntity.setMemberLevelId(item.getId());
                priceEntity.setMemberPrice(item.getPrice());
                priceEntity.setAddOther(1); // 是否可叠加
                return priceEntity;
            }).collect(Collectors.toList());
            memberPriceService.saveBatch(memberPriceEntities);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    1.3.2 会员积分存储

    会员积分信息也是存储在Coupon服务中,我们同样需要通过Fegin来调用。

    image.png

    2.SPU管理

      提供不同条件的检索,分类,品牌,状态,关键字检索。

    image.png

      后台我们需要在Service中完成对应的操作。

        /**
         * SPU信息检索
         * 分页查询
         * 分类 品牌 状态 关键字查询
         * @param params
         * @return
         */
        @Override
        public PageUtils queryPageByCondition(Map<String, Object> params) {
            QueryWrapper<SpuInfoEntity> wrapper = new QueryWrapper<>();
            // 设置对应的检索条件
            // 1. 关键字查询
            String key = (String) params.get("key");
            if(!StringUtils.isEmpty(key)){
                // 需要添加关键字查询
                wrapper.and((w)->{
                    w.eq("id",key)
                            .or().like("spu_name",key)
                            .or().like("spu_description",key);
                });
            }
            // status
            String status = (String) params.get("status");
            if(!StringUtils.isEmpty(status)){
                wrapper.eq("publish_status",status);
            }
            // catalogId
            String catalogId = (String) params.get("catalogId");
            if(!StringUtils.isEmpty(catalogId) && !"0".equalsIgnoreCase(catalogId)){
                wrapper.eq("catalog_id",catalogId);
            }
            // brandId
            String brandId = (String) params.get("brandId");
            if(!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)){
                wrapper.eq("brand_id",brandId);
            }
    
            IPage<SpuInfoEntity> page = this.page(
                    new Query<SpuInfoEntity>().getPage(params),
                    wrapper
            );
            return new PageUtils(page);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

      然后解决页面显示数据的问题,比如类别和品牌显示的编号,创建时间和更新时间显示格式问题。

    image.png

    重启服务

    image.png

    上面的是设置全局的格式化方式,如果我也特殊设置,这时我们可以在对应的entity对象的属性上通过@JsonFormat 来指定,此处指定的会覆盖掉全局的设置。

    image.png

    image.png

    针对显示的分类和品牌显示id的问题,我们需要通过对应的vo对象来传输,同时我们需要在service中完成对应的逻辑

    image.png

    显示的效果

    image.png

    3.商品管理

      商品管理也就是我们讲的SKU管理。实现多条件的检索,比如 类别,品牌,价格区间。关键字等查询。

        /**
         * SKU 信息检索的方法
         * 类别
         * 品牌
         * 价格区间
         * 检索的关键字
         * 分页查询
         *
         * @param params
         * @return
         */
        @Override
        public PageUtils queryPageByCondition(Map<String, Object> params) {
            QueryWrapper<SkuInfoEntity> wrapper = new QueryWrapper<>();
            // 检索关键字
            String key = (String) params.get("key");
            if(!StringUtils.isEmpty(key)){
                wrapper.and(w->{
                   w.eq("sku_id",key).or().like("sku_name",key);
                });
            }
    
            // 分类
            String catalogId = (String)params.get("catalogId");
            if(!StringUtils.isEmpty(catalogId) && !"0".equalsIgnoreCase(catalogId)){
                wrapper.eq("catalog_id",catalogId);
            }
            // 品牌
            String brandId = (String)params.get("brandId");
            if(!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)){
                wrapper.eq("brand_id",brandId);
            }
            // 价格区间
            String min = (String) params.get("min");
            if(!StringUtils.isEmpty(min)){
                wrapper.ge("price",min);
            }
            String max = (String) params.get("max");
            if(!StringUtils.isEmpty(max)){
                try {
                    // 如果max=0那么我们也不需要加这个条件
                    BigDecimal bigDecimal = new BigDecimal(max);
                    if(bigDecimal.compareTo(new BigDecimal(0)) == 1){
                        // 说明 max > 0
                        wrapper.le("price",max);
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            IPage<SkuInfoEntity> page = this.page(
                    new Query<SkuInfoEntity>().getPage(params),
                    wrapper
            );
    
            return new PageUtils(page);
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    image.png

  • 相关阅读:
    flink系列(二) flink简介及API,DataFlows
    编译运行Linux内核
    随笔 | 写在十一月的第一天
    node.js-连接准备
    Angular 指令介绍及使用(三)
    基于偏二叉树SVM多分类算法的应用层DDoS检测方法
    插入排序/折半插入排序
    GMM算法
    一站式智慧校园解决方案 SaaS云平台智慧校园管理系统源码
    【机器学习技巧】之特征工程:数字编码以及One-hot独热编码的几种方式(sklearn与pandas处理方式)
  • 原文地址:https://blog.csdn.net/qq_38526573/article/details/126157161