SpringBoot构建电商基础秒杀项目-----学习笔记6

秒杀模块

引入jar包。在pom.xml增添下列依赖


            joda-time
            joda-time
            2.9.1

模型建立   PromoModel

@Data
public class PromoModel {

    private Integer id;

    //   秒杀活动状态
    //   1:未开始 2:进行中 3:已结束
    private Integer status;

    //  秒杀活动名称
    private String promoName;

    //  秒杀活动开始时间
    private DateTime startDate;

    //秒杀活动结束时间
    private DateTime endDate;

    //   秒杀活动的适用商品
    private Integer itemId;

    //  秒杀活动的商品价格
    private BigDecimal promoItemPrice;
}

mybatis-generator.xml 添加下列代码。生成数据库模型

 

PromoDOMapper 增添方法

PromoDO selectByItemId(Integer itemId);

实现如下:

新增接口 PromoService

public interface PromoService {
    /**
     * 根据商品id获取秒杀活动
     * @param itemId 商品id
     * @return
     */
    PromoModel getPromoByItemId(Integer itemId);
}

实现类如下

@Service
public class PromoServiceImpl implements PromoService {

    @Autowired
    private PromoDOMapper promoDOMapper;

    @Override
    public PromoModel getPromoByItemId(Integer itemId) {
        // 获取对应的商品对应的秒杀多动信息
        PromoDO promoDO = promoDOMapper.selectByItemId(itemId);
        // dataObject -> model
        PromoModel promoModel = convertFromDataObejct(promoDO);
        // 判断当前时间是否秒杀活动即将开始或正在进行
        DateTime now = new DateTime();
        if(promoModel.getStartDate().isAfterNow()){
            //未开始
            promoModel.setStatus(1);
        }else if(promoModel.getStartDate().isBeforeNow()){
            //已结束
            promoModel.setStatus(3);
        }else{
            //进行中
            promoModel.setStatus(2);
        }
        return promoModel;
    }

    private PromoModel convertFromDataObejct(PromoDO promoDO){
        if(promoDO == null)
            return null;
        PromoModel promoModel = new PromoModel();
        BeanUtils.copyProperties(promoDO,promoModel);
        promoModel.setStartDate(new DateTime(promoDO.getStartDate()));
        promoModel.setEndDate(new DateTime(promoDO.getEndDate()));
        return promoModel;
    }
}

ItemModel 添加 下列属性

//聚合模型
//如果promoModel不为空,则表示其拥有还未结束的秒杀活动
 private PromoModel promoModel;

ItemServiceImpl 的 getItemById 增加句子

修改后如下:

 @Override
    public ItemModel getItemById(Integer id) {
        ItemDO itemDO = itemDOMapper.selectByPrimaryKey(id);
        if (itemDO == null)
            return null;
        //获取库存
        ItemStockDO itemStockDO = itemStockDOMapper.selectByItemId(itemDO.getId());
        ItemModel itemModel = convertModelFromDataObject(itemDO, itemStockDO);
        

        //
        //获取商品信息,观察是否在秒杀
        PromoModel promoModel = promoService.getPromoByItemId(itemModel.getId());
        if(promoModel != null && promoModel.getStatus().intValue() != 3){
            //秒杀。
            itemModel.setPromoModel(promoModel);
        }

        return itemModel;
    }

ItemVO增加秒杀的属性

@Data
public class ItemVO {
    private Integer id;

    private String title;

    private BigDecimal price;

    //库存
    private Integer stock;

    private String description;

    //销量
    private Integer sales;

    private String imgUrl;
    /**
     * 记录商品是否在秒杀活动中,以及对应的状态
     * 0:表示没有秒杀活动
     * 1:表示秒杀活动待开始
     * 2:表示秒杀活动进行中
     */
    private Integer promoStatus;

    /**
     * 秒杀活动价格
     */
    private BigDecimal promoPrice;

    /**
     * 秒杀Id
     */
    private Integer promoId;

    /**
     * 秒杀活动开始时间
     */
    private String promoStartDate;
}

ItemController的 convertFromModel方法进行修改

private ItemVO convertFromModel(ItemModel itemModel){
        if(itemModel == null){
            return null;
        }
        ItemVO itemVO = new ItemVO();
        BeanUtils.copyProperties(itemModel, itemVO);

        
        新增秒杀信息
        if (itemModel.getPromoModel() != null) {
            // 有正在进行或即将进行的秒杀活动
            itemVO.setPromoStatus(itemModel.getPromoModel().getStatus());
            itemVO.setPromoId(itemModel.getPromoModel().getId());
            itemVO.setPromoStartDate(itemModel.getPromoModel().getStartDate().toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")));
            itemVO.setPromoPrice(itemModel.getPromoModel().getPromoItemPrice());
        } else {
            itemVO.setPromoStatus(0);
        }
        return itemVO;
    }

OrderDO 增加字段

private Integer promoId;

数据库对应的表也要做对应的修改,以及Mapper文件也要做对应修改

还有其他一些文件也改了。就不贴了。改有有点乱。

总结

通过这个入门级的项目,了解到了前后端分离的基本构建。还了解到了秒杀的开发方式。虽然这个秒杀没有用到缓存什么的,不过这个思路还是值得学习的。秒杀写了,不过没进行测试。学到的最多的就是学到了各种实体类以及统一异常处理。

有点不足的就是:前后端分离,后端代码没有很好的用restful风格,可能是入门的原因吧。

github代码:

https://github.com/RunqiangHuang/miaosha

参考别人的github:

https://github.com/WeiLeiming/seckill

你可能感兴趣的:(spring,boot)