joda-time
joda-time
2.9.1
@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;
}
PromoDO selectByItemId(Integer itemId);
实现如下:
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;
}
}
//聚合模型
//如果promoModel不为空,则表示其拥有还未结束的秒杀活动
private PromoModel promoModel;
修改后如下:
@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;
}
@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;
}
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;
}
private Integer promoId;
数据库对应的表也要做对应的修改,以及Mapper文件也要做对应修改
还有其他一些文件也改了。就不贴了。改有有点乱。
通过这个入门级的项目,了解到了前后端分离的基本构建。还了解到了秒杀的开发方式。虽然这个秒杀没有用到缓存什么的,不过这个思路还是值得学习的。秒杀写了,不过没进行测试。学到的最多的就是学到了各种实体类以及统一异常处理。
有点不足的就是:前后端分离,后端代码没有很好的用restful风格,可能是入门的原因吧。
github代码:
https://github.com/RunqiangHuang/miaosha
参考别人的github:
https://github.com/WeiLeiming/seckill