• 023 商品管理功能03-----商品修改


    1.编辑按钮点击事件

    在商品详情页,每一个商品后面,都会有一个编辑按钮:

    点击这个按钮,就会打开一个商品编辑窗口,我们看下它所绑定的点击事件:(在item/Goods.vue)

    对应的方法:

    可以看到这里发起了两个请求,在查询商品详情和sku信息。

    因为在商品列表页面,只有spu的基本信息:id、标题、品牌、商品分类等。比较复杂的商品详情(spuDetail)和sku信息都没有,编辑页面要回显数据,就需要查询这些内容。

    因此,接下来我们就编写后台接口,提供查询服务接口。

    2.查询SpuDetail接口

    (1)在GoodsController中添加方法

     

    需要分析的内容:

     

    • 请求方式:GET

    • 请求路径:/spu/detail/{id}

    • 请求参数:id,应该是spu的id

    • 返回结果:SpuDetail对象

    **
         * 根据spuid查询SpuDetail信息
         * @param spuId
         * @return
         */
        @GetMapping("spu/detail/{spuId}")
        public ResponseEntity<SpuDetail> querySpuDetailBySpuId(@PathVariable("spuId")Long spuId){
            SpuDetail spuDetail = this.goodsService.querySpuDetailBySpuId(spuId);
            if (spuDetail == null) {
                return ResponseEntity.notFound().build();
            }
            return ResponseEntity.ok(spuDetail);
        }

    (2)GoodsServiceImpl中添加方法

    /**
         * 根据spuId查询spuDetail
         * @param spuId
         * @return
         */
        @Override
        public SpuDetail querySpuDetailBySpuId(Long spuId) {
            return this.spuDetailMapper.selectByPrimaryKey(spuId);
        }

    3.查询Sku

    分析:

    • 请求方式:Get

    • 请求路径:/sku/list

    • 请求参数:id,应该是spu的id

    • 返回结果:sku的集合

    (1)在GoodsController中添加方法

    /**
         * 根据spuid查询sku相关信息
         * @param spuId
         * @return
         */
        @GetMapping("sku/list")
        public ResponseEntity<List<Sku>> querySkusBySpuId(@RequestParam("id")Long spuId){
            List<Sku> skus = this.goodsService.querySkusBySpuId(spuId);
            if (CollectionUtils.isEmpty(skus)) {
                return ResponseEntity.notFound().build();
            }
            return ResponseEntity.ok(skus);
        }

    (2)GoodsServiceImpl中添加方法

    /**
         * 根据spuId查询sku的集合
         * @param spuId
         * @return
         */
    public List<Sku> querySkusBySpuId(Long spuId) {
        Sku sku = new Sku();
        sku.setSpuId(spuId);
        List<Sku> skus = this.skuMapper.select(sku);
        skus.forEach(s -> {
            Stock stock = this.stockMapper.selectByPrimaryKey(s.getId());
            s.setStock(stock.getStock());
        });
        return skus;
    }

    4.页面回显效果

    重启微服务

    5.商品修改后台代码实现

    随便修改点数据,然后点击保存。接下来,我们编写后台,实现修改商品接口。

    (1)GoodsController

    • 请求方式:PUT

    • 请求路径:/

    • 请求参数:Spu对象

    • 返回结果:无

    /**
         * 修改商品
         * @param spuBo
         * @return
         */
        @PutMapping("goods")
        public ResponseEntity<Void> updateGoods(@RequestBody SpuBo spuBo){
            this.goodsService.updateGoods(spuBo);
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }

    (2)GoodsServiceImpl中添加方法

    spu数据可以修改,但是SKU数据无法修改,因为有可能之前存在的SKU现在已经不存在了,或者以前的sku属性都不存在了。比如以前内存有4G,现在没了。

    因此这里直接删除以前的SKU,然后新增即可。

       @Override
        @Transactional
        public void updateGoods(SpuBo spu) {
            // 查询以前sku
            Sku sku=new Sku();
            sku.setSpuId(spu.getId());
            List<Sku> skus = this.skuMapper.select(sku);
    
            // 如果以前存在,则删除
            if(!CollectionUtils.isEmpty(skus)) {
                List<Long> ids = skus.stream().map(s -> s.getId()).collect(Collectors.toList());
                // 删除以前库存
                Example example = new Example(Stock.class);
                example.createCriteria().andIn("skuId", ids);
                this.stockMapper.deleteByExample(example);
    
                // 删除以前的sku
                Sku record = new Sku();
                record.setSpuId(spu.getId());
                this.skuMapper.delete(record);
    
            }
            // 新增sku和库存
            saveSkuAndStock(spu);
    
            // 更新spu
            spu.setLastUpdateTime(new Date());
            spu.setCreateTime(null);   //不能更新的内容,设置为null
            spu.setValid(null);
            spu.setSaleable(null);
            this.spuMapper.updateByPrimaryKeySelective(spu);
    
            // 更新spu详情
            this.spuDetailMapper.updateByPrimaryKeySelective(spu.getSpuDetail());
        }

    6.最终效果图

    查看数据库:

     

  • 相关阅读:
    关于C#中timer类 (转)
    AutoResetEvent (转)
    给韬哥的回复
    sql中的case when 的用法涉及到大于小于号
    vba中获取当前日期
    vba中的小技巧
    sql server2000中的两个整数相除保留十位小数
    vba中新建文件,关闭文件,锁屏,覆盖同名文件
    无法切换到google.com的解决办法
    mysql 常用命令
  • 原文地址:https://www.cnblogs.com/luckyplj/p/11540539.html
Copyright © 2020-2023  润新知