谷粒商城-基础篇-Day08-调试会员等级相关接口

news2024/11/20 7:27:23

在P83级中,点击发布商品时没有出现请求

则需要解决 PubSub is not definded这个问题

PubSub是用来检测选择分类的值变动的。

选择分类值变动,会请求后台接口,动态更新选择品牌的选项。

  1. 安装依赖
    npm install --save pubsub-js(要到项目目录下安装)

如果安装失败则:

重新这个:

npm install --save pubsub-js --legacy-peer-deps

  1. 导包

src\views\modules\common\category-cascader.vue

这个vue模块下,增加:

在这里插入图片描述

即可解决该问题
在这里插入图片描述

将访问路径中有/api/member/的转发到gulimall-member-appication这个模块下

在gateway这个模块下的bootstrp.yml文件中添加负载均衡路径

        - id: member
          uri: lb://gulimall-member
          predicates:
            - Path=/api/member/**
          filters:
            - RewritePath=/api/(?<segment>/?.*), /$\{segment}

将member-application这个模块启动起来

将资料中的

modules下的文件都放到项目中的modules下

在这里插入图片描述

添加会员
在这里插入图片描述

获取分类关联的品牌

到商品系统的商品维护中添加商品

当点击选择分类后会发送一个请求

在这里插入图片描述

如果没有发送请求,查看Console

出现报错 TypeError: Cannot read properties of undefined

解决办法:

则需要到src\views\modules\common\category-cascader.vue下将PubSub函数前面的this去掉

如下:
在这里插入图片描述

解决后,编写查询分类关联的品牌的接口

在这里插入图片描述

由于返回的data中只含有brandId和brandName

我们写一个BrandVo

@Data
public class BrandVo {
    private Long brandId;
    private String brandName;
}

在CategoryBrandRelationController中

///product/categorybrandrelation/brands/list
    @GetMapping("/brands/list")
    public R selectBrandRelation(@RequestParam(value = "catId",required = true)Long catId){
        List<BrandEntity> brandEntities = categoryBrandRelationService.getBrandByCatId(catId);

        List<BrandVo> collect = brandEntities.stream().map((item) -> {
            BrandVo brandVo = new BrandVo();
            //由于BrandVo中的品牌名和BrandEntity中的品牌名不是一个变量名
            //所以不能直接拷贝
            brandVo.setBrandId(item.getBrandId());
            brandVo.setBrandName(item.getName());
            return brandVo;
        }).collect(Collectors.toList());

        return R.ok().put("data",collect);
    }

编写getBrandByCatId(catId)方法

    @Override
    public List<BrandEntity> getBrandByCatId(Long catId) {
        List<CategoryBrandRelationEntity> categoryBrandRelationEntities = categoryBrandRelationDao.selectList(new QueryWrapper<CategoryBrandRelationEntity>().eq("catelog_id", catId));
       //可能别的方法也需要调这个方法,我们返回品牌的详细信息
        List<BrandEntity> collect = categoryBrandRelationEntities.stream().map((item) -> {
            Long brandId = item.getBrandId();
            BrandEntity brandEntity = brandDao.selectById(brandId);
            return brandEntity;
        }).collect(Collectors.toList());
return collect;
    }

实现效果:

在这里插入图片描述

先将spuadd.vue中的
在这里插入图片描述

设置为false

出现了循环依赖的问题

在配置文件中添加:

spring:
  main:
    allow-circular-references:true

效果展示:

在这里插入图片描述

展示销售属性

点击下一步设置销售属性没有出现数据

1、数据库中没有存销售属性

2、在spuadd.vue中,自己传一个key

在这里插入图片描述

效果展示:

在这里插入图片描述

商品保存功能

根据前端返回的字符串逆向生成JAVA实体类

注意:将pms_spu_info表中的catalog_id改为catelog_id

并且将对应的实体类中的catalogId修改为catelogId

在这里插入图片描述

并且将前端中的cpuinfor.vue中的catalogId修改成catelogId

在SpuInfoController中

    /**
     * 保存
     */
    @Transactional
    @RequestMapping("/save")
    public R save(@RequestBody SpuSaveVo spuInfo){
//		spuInfoService.save(spuInfo);
        //1、保存Spu的基本信息
        SpuInfoEntity spuInfoEntity = new SpuInfoEntity();
        //SpuInfoEntity中的属性名和SpuSaveVo中的一样
        //直接对拷
        BeanUtils.copyProperties(spuInfo,spuInfoEntity);
        spuInfoEntity.setCreateTime(new Date());
        spuInfoEntity.setUpdateTime(new Date());

        spuInfoService.saveBaseSpuInfo(spuInfoEntity);

        //2、保存spu的描述图片pms_spu_info_desc
        SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity();
        List<String> decript = spuInfo.getDecript();
        spuInfoDescEntity.setSpuId(spuInfoEntity.getId());
        spuInfoDescEntity.setDecript(String.join(",",decript));
        spuInfoDescService.saveSpuInfoDesc(spuInfoDescEntity);


        //3、保存spu的图片集 pms_spu_images
        List<String> images = spuInfo.getImages();
        spuImagesService.saveImages(spuInfoEntity.getId(),images);
        //4、保存spu的规格参数 pms_product_attr_value
        List<BaseAttrs> baseAttrs = spuInfo.getBaseAttrs();
        List<ProductAttrValueEntity> collect = baseAttrs.stream().map((attr) -> {
            ProductAttrValueEntity productAttrValueEntity = new ProductAttrValueEntity();
            productAttrValueEntity.setAttrId(attr.getAttrId());
            productAttrValueEntity.setAttrName(attrService.getById(attr.getAttrId()).getAttrName());
            productAttrValueEntity.setAttrValue(attr.getAttrValues());
            productAttrValueEntity.setQuickShow(attr.getShowDesc());
            productAttrValueEntity.setSpuId(spuInfoEntity.getId());
            return productAttrValueEntity;
        }).collect(Collectors.toList());
        
         productAttrValueService.saveProductAttr(collect);
        //5、保存spu的积分信息 gulimall_sms->sms_spu_bounds

        //5.1、sku的基本信息:pms_sku_info
        //5.2、sku的图片信息:pms_sku_images
        //5.3、sku的销售图片信息:pms_keu_sale_attr_value
        //5.4、sku的优惠、满减等信息:gulimall_sms_sku_ladder\sms_sku_full_reduction\
        

一、saveBaseSpuInfo(spuInfoEntity)

    @Override
    public void saveBaseSpuInfo(SpuInfoEntity spuInfoEntity) {
        this.baseMapper.insert(spuInfoEntity);
    }

二、saveSpuInfoDesc(spuInfoDescEntity);

  @Override
    public void saveSpuInfoDesc(SpuInfoDescEntity spuInfoDescEntity) {
        this.baseMapper.insert(spuInfoDescEntity);
    }

三、saveImages(spuInfoEntity.getId(),images);

    @Override
    public void saveImages(Long id, List<String> images) {
        if (images==null||images.size()==0){

        }
        else{
            List<SpuImagesEntity> collect = images.stream().map((img) -> {
                SpuImagesEntity spuImagesEntity = new SpuImagesEntity();
                spuImagesEntity.setSpuId(id);
                spuImagesEntity.setImgUrl(img);
                return spuImagesEntity;
            }).collect(Collectors.toList());
          this.saveBatch(collect);

        }
    }

四、saveProductAttr(collect);

  @Override
    public void saveProductAttr(List<ProductAttrValueEntity> collect) {
        this.saveBatch(collect);
    }

5.1、5.2、5.3

        //5.1、sku的基本信息:pms_sku_info
        List<Skus> skus = spuInfo.getSkus();
        if (skus!=null&skus.size()!=0){
            skus.forEach((item)->{
                String defaultImg="";

                for (Images image : item.getImages()) {
                    if (image.getDefaultImg()==1){
                        //是默认图片
                        defaultImg=image.getImgUrl();
                    }
                }
                
                
                
                
                
                
                SkuInfoEntity skuInfoEntity = new SkuInfoEntity();
                BeanUtils.copyProperties(item,skuInfoEntity);
                // catalogId brandId saleCount spuId  skuDefaultImg
                skuInfoEntity.setBrandId(spuInfoEntity.getBrandId());
                skuInfoEntity.setCatalogId(spuInfoEntity.getCatalogId());
                skuInfoEntity.setSaleCount(0L);
                skuInfoEntity.setSpuId(spuInfoEntity.getId());

                skuInfoEntity.setSkuDefaultImg(defaultImg);
                skuInfoServicel.saveSkuInfo(skuInfoEntity);



                //5.2、sku的图片信息:pms_sku_images
                Long skuId = skuInfoEntity.getSkuId();
      
                List<Images> images1 = item.getImages();
                List<SkuImagesEntity> collect1 = images1.stream().map((img) -> {
                    SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
                    skuImagesEntity.setSkuId(skuId);
                    skuImagesEntity.setImgUrl(img.getImgUrl());
                    skuImagesEntity.setDefaultImg(img.getDefaultImg());
                    return skuImagesEntity;
                }).collect(Collectors.toList());
                
                skuImagesService.saveBatch(collect1);

                //5.3、sku的销售图片信息:pms_keu_sale_attr_value
                List<Attr> attr = item.getAttr();
                List<SkuSaleAttrValueEntity> collect2 = attr.stream().map(a -> {
                    SkuSaleAttrValueEntity skuSaleAttrValue = new SkuSaleAttrValueEntity();
                    BeanUtils.copyProperties(a, skuSaleAttrValue);
                    skuSaleAttrValue.setSkuId(skuId);
                    return skuSaleAttrValue;
                }).collect(Collectors.toList());

                skuSaleAttrValueService.saveBatch(collect2);


            });
        }

5.保存积分信息保存商品积分

在common模块下创建一个to包,用来存放远程调用传输的对象

@Data
public class SpuBoundTo {

    private Long spuId;
    private BigDecimal buyBounds;
    private BigDecimal growBounds;
}

创建一个包feign用来存放远程调用的接口

@FeignClient("gulimall-coupon")
public interface CouponFenginService {

    @PostMapping("coupon/spubounds/save")
      R saveSpuBounds(@RequestBody SpuBoundTo spuBounds);
}

在SpuInforController中

        //5、保存spu的积分信息 gulimall_sms->sms_spu_bounds
        SpuBoundTo spuBoundTo = new SpuBoundTo();
        Bounds bounds = spuInfo.getBounds();
        BeanUtils.copyProperties(bounds,spuBoundTo);
        spuBoundTo.setSpuId(spuInfoEntity.getId());
        couponFenginService.saveSpuBounds(spuBoundTo);
         if (r1.getCode()!=0){
            System.err.println("远程保存spu积分信息失败");
        }

5.4

同样需要远程调用

在CouponFenginService中

    @PostMapping("/coupon/skufullreduction/saveinfo")
    R saveSkuReduction(@RequestBody SkuReductionTo skuReductionTo);
    @PostMapping("/saveinfo")
    public R saveinfo(@RequestBody SkuReductionTo skuReductionTo){

        skuFullReductionService.saveSkuReduction(skuReductionTo);
        return R.ok();
    }

//5.4、sku的优惠、满减等信息:gulimall_sms_sku_ladder\sms_sku_full_reduction\
SkuReductionTo skuReductionTo = new SkuReductionTo();
BeanUtils.copyProperties(item,skuReductionTo);
skuReductionTo.setSkuId(skuId);

R r = couponFenginService.saveSkuReduction(skuReductionTo);
if (r.getCode()!=0){
    //有异常
    System.err.println("远程保存spu优惠信息失败");
}

减小内存开销

在这里插入图片描述

设置最大占用内存100m
在这里插入图片描述

注意:

这里要将这个设置为input因为在数据库设计时,这个不是自增的

在这里插入图片描述

优化细节:

在这里插入图片描述
在这里插入图片描述

添加filter判断
在这里插入图片描述

在SpuinfoController

在这里插入图片描述

在SkuFullReductionServiceImpl中

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

SPU检索

实现效果:
在这里插入图片描述

在SpuInfoController中

    /**
     * 列表
     */
    @GetMapping("/list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = spuInfoService.queryPageByKey(params);

        return R.ok().put("page", page);
    }

生成queryPageByKey(params)方法

    @Override
    public PageUtils queryPageByKey(Map<String, Object> params) {
        QueryWrapper<SpuInfoEntity> spuInfoEntityQueryWrapper = new QueryWrapper<>();
        String key = (String) params.get("key");
        if (!StringUtils.isEmpty(key)){
            spuInfoEntityQueryWrapper.and((queryWrapper)->{
                queryWrapper.eq("id",key).or().like("spu_name",key);
            });
        }
        String catelogId = (String) params.get("catelogId");
        
        if (!StringUtils.isEmpty(catelogId)&&!"0".equalsIgnoreCase(catelogId)){
            spuInfoEntityQueryWrapper.eq("catelog_id",catelogId);
        }
        String brandId = (String) params.get("brandId");
        if (!StringUtils.isEmpty(brandId)&&!"0".equalsIgnoreCase(brandId)){
            spuInfoEntityQueryWrapper.eq("brand_id",brandId);
        }

        String status = (String) params.get("status");
        if (!StringUtils.isEmpty(status)){
            spuInfoEntityQueryWrapper.eq("publish_status",status);
        }

        IPage<SpuInfoEntity> page = this.page(
                new Query<SpuInfoEntity>().getPage(params),
                spuInfoEntityQueryWrapper
        );

        return new PageUtils(page);

    }

日期格式化

在yml配置文件中设置

jackson:
  date-format: yyyy-MM-dd HH:mm:ss

SKU检索

将pms_sku_info中的catalog_id修改为catelog_id

并将skuInfoEntity的catalogId修改为catelogId

在skuInfoController中

    @RequestMapping("/list")
   // @RequiresPermissions("product:skuinfo:list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = skuInfoService.queryPageByConditions(params);

        return R.ok().put("page", page);
    }

编写queryPageByConditions(params);

    @Override
    public PageUtils queryPageByConditions(Map<String, Object> params) {

        /*
        key: '华为',//检索关键字
        catelogId: 0,
        brandId: 0,
        min: 0,
        max: 0
         */
        QueryWrapper<SkuInfoEntity> skuInfoEntityQueryWrapper = new QueryWrapper<>();
        String key = (String) params.get("key");
        if (!StringUtils.isEmpty(key)){
            skuInfoEntityQueryWrapper.and((queryWrapper)->{
                queryWrapper.eq("sku_id",key).or().like("sku_name",key);
            });
        }
        String catelogId = (String) params.get("catelogId");

        if (!StringUtils.isEmpty(catelogId)&&!"0".equalsIgnoreCase(catelogId)){
            skuInfoEntityQueryWrapper.eq("catelog_id",catelogId);
        }


        String brandId = (String) params.get("brandId");

        if (!StringUtils.isEmpty(brandId)&&!"0".equalsIgnoreCase(brandId)){
            skuInfoEntityQueryWrapper.eq("brand_id",brandId);
        }


        String min = (String) params.get("min");
        if (!StringUtils.isEmpty(min)){
          skuInfoEntityQueryWrapper.ge("price",min);
        }

        String max = (String) params.get("max");

        try {
            //这里转换可能会有异常
            BigDecimal maxBg=new BigDecimal(max);
            if (!StringUtils.isEmpty(max)&&maxBg.compareTo(new BigDecimal("0"))==1){
                skuInfoEntityQueryWrapper.le("price",max);
            }
        } catch (Exception e) {

        }

        IPage<SkuInfoEntity> page = this.page(
                new Query<SkuInfoEntity>().getPage(params),
                skuInfoEntityQueryWrapper
        );

        return new PageUtils(page);

    }

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

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

相关文章

算法队伍的搭建

&#x1f31e;欢迎来到数据结构的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff…

网络安全必备1000道面试题集锦(附答案)

前言 以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&a…

使用ResNet18实现CIFAR10数据集的训练

如果对你有用的话&#xff0c;希望能够点赞支持一下&#xff0c;这样我就能有更多的动力更新更多的学习笔记了。&#x1f604;&#x1f604; 使用ResNet进行CIFAR-10数据集进行测试&#xff0c;这里使用的是将CIFAR-10数据集的分辨率扩大到32X32&#xff0c;因为算力相关的…

Git使用详解(图文+代码):基础内容

基础内容前言版本控制本地版本控制系统集中化版本控制系统分布式控制系统Git使用详解Git基础理解Git基础指令取得项目的Git仓库记录每次更新的仓库检查当前文件状态跟踪文件暂存已修改文件忽略某些文件查看已暂存和未暂存的更新提交更新跳过使用暂存区域移除文件远程操作的使用…

熊市里再看GameFi,为什么说链游潜力巨大?

大方向上来看&#xff0c;区块链项目本质上分为两类&#xff0c;一类是金融资产属性的项目&#xff0c;比如我们常说的DeFi、DAO、公链等&#xff0c;另一类则具有娱乐艺术属性的&#xff0c;比如NFT、GameFi、元宇宙等&#xff0c;熊市环境下如何看待这两类项目&#xff0c;以…

【iOS】—— 初识GCD

GCD&#xff08;Grand Central Dispatch&#xff09; 文章目录GCD&#xff08;Grand Central Dispatch&#xff09;什么是GCDperformSelector方法&#xff1a;GCD的优点&#xff1a;任务和队列队列的创建方式任务的创建方法六种情况的例子1.并发队列 同步执行2. 并发队列 异步…

Vector - VT System - Ethernet板卡_VT6306

前面介绍了支持CAN&CANFD&LIN板卡&#xff0c;但是对于当前日益火爆的车载以太网来说&#xff0c;Vector也是提供了类似于VN5000系列一样的板卡&#xff0c;那就是VT6306。它给提供6路的百兆或者6路千兆的车载以太网&#xff08;2022年之前选择后是固定的&#xff0c;有…

央视点赞百度智能云激活民营经济”数字“活力

2023年&#xff0c;对民营企业究竟意味着什么。 2022年12月&#xff0c;新华社发表重磅长文解读中国经济发展大势&#xff1a;“迎接更加壮阔的光明前程”。 随后央视新闻联播连续4天发声&#xff0c;关注民营经济发展。4条新闻中&#xff0c;“创新”一词共出现了29次&#…

小程序的运行机制以及安全机制

接触小程序有一段时间了&#xff0c;总得来说小程序开发门槛比较低&#xff0c;但其中基本的运行机制和原理还是要懂的. 了解小程序的由来 在小程序没有出来之前&#xff0c;最初微信WebView逐渐成为移动web重要入口&#xff0c;微信发布了一整套网页开发工具包&#xff0c;称…

199:vue+openlayers 添加删除修改feature信息,双向不同颜色指示互动

第199个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayers项目中绘制多边形,每绘制一个,左侧输出一个feature指示标志,双向颜色互动指示。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 …

前缀和讲解

目录 一、前言 二、前缀和 1、基本概念 2、前缀和与差分的关系 3、差分数组能提升修改的效率 三、例题 1、统计子矩阵&#xff08;lanqiao2109&#xff0c;2022年省赛&#xff09; &#xff08;1&#xff09;处理输入 &#xff08;2&#xff09;方法一&#xff1a;纯暴…

设计模式面试题

工厂模式是我们最常用的实例化对象模式了&#xff0c;是用工厂方法代替new操作的一种模式,工厂模式在Java程序中可以说是随处可见。本文来给大家详细介绍下工厂模式 面向对象设计的基本原则&#xff1a; OCP&#xff08;开闭原则&#xff0c;Open-Closed Principle&#xff0…

字符串函数介绍——C语言

文章目录 一、引言 二、函数的介绍与模拟实现 2、1 求字符串长度strlen&#xff08;&#xff09;函数 2、1、1 strlen&#xff08;&#xff09;函数介绍 2、1、2 strlen&#xff08;&#xff09;函数的模拟实现 2、2 字符串拷贝strcpy&#xff08;&#xff09;函数 2、2、1 s…

「旷野俱乐部」在 The Sandbox 开业,SMCU 宫殿等你来体验!

简要概括 KWANGYAThe Sandbox 是「旷野俱乐部」在 The Sandbox 元宇宙中的虚拟空间&#xff1b; SMCU 宫殿体验呈现了 2022 年冬季 SM 小镇的视觉效果&#xff0c;SMCU 宫殿专辑封面将于 1 月 10 日發佈&#xff1b; 将向全球粉丝展示更多基于韩国文化内容的元宇宙体验。 The…

Appium+Pytest+pytest-testreport框架轻松实现app自动化

有任何环境问题&#xff0c;可以参考我的文章 Appium自动化测试&#xff1c;一&#xff1e;&#xff0c; Appium自动化测试&#xff1c;二&#xff1e;有任何定位问题、触屏操作、等待问题、Toast 信息操作问题、手机操作问题及H5页面的操作请参考我的文章&#xff1a;Appium自…

【论文速递】TNNLS2022 - 一种用于小样本分割的互监督图注意网络_充分利用有限样本的视角

【论文速递】TNNLS2022 - 一种用于小样本分割的互监督图注意网络_充分利用有限样本的视角 【论文原文】&#xff1a;A Mutually Supervised Graph Attention Network for Few-Shot Segmentation: The Perspective of Fully Utilizing Limited Samples 获取地址&#xff1a;ht…

Java设计模式-组合模式Composite

介绍 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;它创建了对象组的树形结构&#xff0c;将对象组合成树状结构以表示“整体-部分”的层次关系。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类…

【Nginx】Nginx的常用命令和配置文件

1. 常用命令 1. 查看版本2. 查看 Nginx 配置语法的正确性3. 为Nginx指定一个配置文件4. 启动 Nginx 服务5. 开机自启动6. 重启 Nginx 服务7. 查看 Nginx 服务状态8. 重载 Nginx 服务9. 停止 Nginx 服务10. 查看命令帮助 2. 配置文件 第一部分&#xff1a;全局块第二部分&#x…

RT-Thread系列--内存池MEMPOOL源码分析

一、目的嵌入式RTOS中最重要也是最容易被忽略的一个组件就是内存管理&#xff0c;像FreeRTOS单单内存管理组件就提供了heap_1/2/3/4/5这五种方案&#xff0c;每种方案都有其特点和应用场景。一般情况下小系统所运行的芯片平台本身内存就很少&#xff0c;有些时候内存空间还不连…

libdrm-2.4.112

编译 这个版本使用了meson进行构建、ninja进行编译 &#xff1b; 安装meson 编译 报错如上&#xff0c;查看meson.build文件&#xff0c; 我们的meson版本不正确&#xff0c; 查阅发现apt安装的版本过低&#xff1b; 安装meson sudo apt-get install python3 python3-pip …