第五章 秒杀模块开发
5.1 秒杀模型管理——活动模型创建
1. 安装joda-time依赖
1 2 3 4 5
| <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.1</version> </dependency>
|
可以创建DateTime类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class PromoModel { private Integer id;
private Integer status;
private String promoName;
private DateTime startDate;
private DateTime endDate;
private Integer itemId;
private BigDecimal promoItemPrice;
|
名 |
类型 |
说明 |
id |
int |
秒杀活动id |
promo_name |
varchar |
秒杀活动名称 |
start_date |
datetime |
秒杀活动开始时间 |
end_date |
datetime |
秒杀活动结束时间 |
item_id |
int |
秒杀活动适用商品 |
promo_item_price |
double |
秒杀活动商品价格 |
注意:数据库datetime默认值要设置为’0000-00-00 00:00:00‘格式
运行 mvn mybatis-generator:generate
1 2 3
| <table tableName="promo" domainObjectName="PromoDO" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
|
5.2 秒杀模型管理——活动模型与商品模型结合
秒杀活动service层主要的操作是:
- 根据itemId来获取即将进行的或正在进行的秒杀活动信息(返回PromoDO的dataObject)
- 将PromoDO转化为PromoModel
- 根据status来判断当前时间是否即将开始或正在进行秒杀活动
- 返回promoModel对象
PromoService接口
1 2
| PromoModel getPromoByItemId(Integer itemId);
|
PromoService实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| @Service public class PromoServiceImpl implements PromoService {
@Resource private PromoDOMapper promoDOMapper;
@Override public PromoModel getPromoByItemId(Integer itemId) { PromoDO promoDO = promoDOMapper.selectByItemId(itemId);
PromoModel promoModel = convertFromDataObject(promoDO); if(promoModel == null) { return null; } DateTime now = new DateTime(); if(promoModel.getStartDate().isAfterNow()) { promoModel.setStatus(1); }else if(promoModel.getEndDate().isBeforeNow()) { promoModel.setStatus(3); }else { promoModel.setStatus(2); } return promoModel ; } private PromoModel convertFromDataObject(PromoDO promoDO) { if(promoDO == null) { return null; } PromoModel promoModel = new PromoModel(); BeanUtils.copyProperties(promoDO,promoModel); promoModel.setPromoItemPrice(new BigDecimal(promoDO.getPromoItemPrice())); promoModel.setStartDate(new DateTime(promoDO.getStartDate())); promoModel.setEndDate(new DateTime(promoDO.getEndDate())); return promoModel; } }
|
2. 使用聚合模型,在ItemModel嵌套秒杀活动属性
ItemModel中加入:
1 2
| private PromoModel promoModel;
|
ItemServiceImpl加入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @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中扩展秒杀活动的字段:
1 2 3 4 5 6 7 8 9 10 11
| private Integer promoStatus;
private BigDecimal promoPrice;
private Integer promoId;
private String startDate;
|
在ItemController中向itemVO增加秒杀活动信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| private ItemVO convertVOFromModel(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.setStartDate(itemModel.getPromoModel().getStartDate().toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"))); itemVO.setPromoPrice(itemModel.getPromoModel().getPromoItemPrice()); }else { itemVO.setPromoStatus(3); } return itemVO; }
|
3.修改商品详情getItem前端页面
增加秒杀活动状态、时间、秒杀价格以及倒计时的显示
4.修改秒杀下单OrderModel部分
在OrderModel中增加秒杀价格字段:
1 2 3 4 5
| private Integer promoId;
private BigDecimal itemPrice;
|
同步的在数据库order_info表加入promo_id字段,OrderDO与OrderDOMapper中加入PromoId字段
5.修改秒杀下单OrderService部分
在OrderService接口中:
1 2 3 4
|
OrderModel createOrder(Integer userId, Integer itemId, Integer promoId, Integer amount) throws BusinessException;
|
在OrderServiceImpl中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| if(promoId!=null) { if(promoId.intValue()!=itemModel.getPromoModel().getId()) { throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"活动信息不正常"); }else if(itemModel.getPromoModel().getStatus().intValue()!=2) { throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"活动信息还未开始"); } }
boolean result = itemService.decreaseStock(itemId,amount); if(!result) { throw new BusinessException(EmBusinessError.STOCK_NOT_ENOUGH); } OrderModel orderModel = new OrderModel(); orderModel.setUserId(userId); orderModel.setItemId(itemId); orderModel.setAmount(amount); orderModel.setPromoId(promoId); if(promoId != null) { orderModel.setItemPrice(itemModel.getPromoModel().getPromoItemPrice()); }else { orderModel.setItemPrice(itemModel.getPrice()); } orderModel.setOrderPrice(orderModel.getItemPrice().multiply(new BigDecimal(amount)));
|
6.修改秒杀下单OrderController部分
在controller层增加参数:
1
| @RequestParam(name = "promoId",required = false) Integer promoId,
|
修改前端页面:
测试——-》成功
5.3 项目总结
到这里我们全部完成了整个项目功能的开发,这个是入门课还存在很多问题比如:
