乐优商城(填坑)——秒杀商品添加

一、需求

后台商品管理中,将商品添加到可秒杀商品列表

乐优商城(填坑)——秒杀商品添加_第1张图片

选中商品将其设置为可秒杀。

乐优商城(填坑)——秒杀商品添加_第2张图片

选择具体的参与秒杀的商品规格,然后设置相关参数,点击保存即可。

二、后端接口修改

原来的添加秒杀商品接口在leyou-secskill微服务中,现在将其移动到leyou-item中,代码如下:

2.1 Controller

/**
     * 添加秒杀商品
     * @param seckillParameters
     * @return
     * @throws ParseException
     */
    @PostMapping("/seckill/add")
    public ResponseEntity addSeckillGoods(@RequestBody List seckillParameters) throws ParseException {
        if (seckillParameters != null && seckillParameters.size() > 0){
            for (SeckillParameter seckillParameter : seckillParameters){
                this.goodsService.addSeckillGoods(seckillParameter);
            }
        }else {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
        return ResponseEntity.ok().build();
    }

2.2 Service

/**
     * 添加秒杀商品
     * @param seckillParameter
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addSeckillGoods(SeckillParameter seckillParameter) throws ParseException {

        SimpleDateFormat sdf =  new SimpleDateFormat( "yyyy-MM-dd HH:mm" );
        //1.根据spu_id查询商品
        Long id = seckillParameter.getId();
        Sku sku = this.querySkuById(id);
        //2.插入到秒杀商品表中
        SeckillGoods seckillGoods = new SeckillGoods();
        seckillGoods.setEnable(true);
        seckillGoods.setStartTime(sdf.parse(seckillParameter.getStartTime().trim()));
        seckillGoods.setEndTime(sdf.parse(seckillParameter.getEndTime().trim()));
        seckillGoods.setImage(sku.getImages());
        seckillGoods.setSkuId(sku.getId());
        seckillGoods.setStock(seckillParameter.getCount());
        seckillGoods.setTitle(sku.getTitle());
        seckillGoods.setSeckillPrice(sku.getPrice()*seckillParameter.getDiscount());
        this.seckillMapper.insert(seckillGoods);
        //3.更新对应的库存信息,tb_stock
        Stock stock = stockMapper.selectByPrimaryKey(sku.getId());
        System.out.println(stock);
        if (stock != null) {
            stock.setSeckillStock(stock.getSeckillStock() != null ? stock.getSeckillStock() + seckillParameter.getCount() : seckillParameter.getCount());
            stock.setSeckillTotal(stock.getSeckillTotal() != null ? stock.getSeckillTotal() + seckillParameter.getCount() : seckillParameter.getCount());
            stock.setStock(stock.getStock() - seckillParameter.getCount());
            this.stockMapper.updateByPrimaryKeySelective(stock);
        }else {
            LOGGER.info("更新库存失败!");
        }

        //4.更新redis中的秒杀库存
        updateSeckillStock();
    }



    /**
     * 更新秒杀商品数量
     * @throws Exception
     */
    public void updateSeckillStock(){
        //1.查询可以秒杀的商品
        List seckillGoods = this.querySeckillGoods();
        if (seckillGoods == null || seckillGoods.size() == 0){
            return;
        }
        BoundHashOperations hashOperations = this.stringRedisTemplate.boundHashOps(KEY_PREFIX);
        if (hashOperations.hasKey(KEY_PREFIX)){
            hashOperations.delete(KEY_PREFIX);
        }
        seckillGoods.forEach(goods -> hashOperations.put(goods.getSkuId().toString(),goods.getStock().toString()));
    }

service的具体实现和前边没有什么大的改变,就是多了一步更新redis中秒杀库存的操作,原来是放在leyou-secskill中Controller初始化时进行的。上面代码中所包含的辅助类直接copy到leyou-item中就可以了。

三、前端页面

新增一个对话框,用来显示可秒杀的商品:

乐优商城(填坑)——秒杀商品添加_第3张图片

点击保存的时候将数据进行封装,然后发到后台即可。

dataTable中新增秒杀按钮:

乐优商城(填坑)——秒杀商品添加_第4张图片

乐优商城(填坑)——秒杀商品添加_第5张图片

点击事件:(主要作用就是数据传递)

乐优商城(填坑)——秒杀商品添加_第6张图片

对话框代码:






主页面中调用:

乐优商城(填坑)——秒杀商品添加_第7张图片

 

 

 

完整代码:https://github.com/lyj8330328

你可能感兴趣的:(乐优商城)