【第七篇】商城系统-商品发布-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;
}

  然后创建对应的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.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);
    }

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

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);
    }

image.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
购物商城Spu-Sku数据库设计主要是为了管理商品的库存和销售信息。Spu(Standard Product Unit)是商品的标准产品单位,通常指的是一组具有相同特征但可能有不同规格的商品,例如同一款衣服的不同颜色或尺码。Sku(Stock Keeping Unit)是商品的库存管理单位,是对Spu的具体细分,用于区分不同规格或属性的商品。 在数据库设计中,可以建立两个主要的表:Spu表和Sku表。Spu表用于存储商品的基本信息,包括商品的名称、描述、品牌、分类等。此外,可以为Spu表添加一些扩展字段,例如商品的图片、销售状态等。 Sku表用于存储商品的具体规格和库存信息,其中包括Spu的外键关联、商品的属性、规格、价格和库存数量等。通过外键关联,可以将Sku与其对应的Spu关联起来,实现SpuSku的多对一关系。同时,可以在Sku表中添加一些扩展字段,例如商品的条形码、上架时间等。 为了提高查询效率,可以在Sku表中添加索引,例如根据商品的价格、库存数量、销售状态等字段进行索引,以快速获取满足条件的商品信息。 此外,为了提高系统的可维护性和可扩展性,可以添加一些辅助表,例如属性表和属性值表,用于管理商品的属性信息。属性表用于存储商品的属性名称,属性值表用于存储属性的具体取值范围。 总之,购物商城Spu-Sku数据库设计需要考虑SpuSku之间的关联关系,以及商品的基本信息和规格信息的存储和管理。通过合理的设计和优化索引,可以提高系统的查询性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波波烤鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值