刚入门Java的硕士宝宝,实验室没什么Java项目,看到网上的秒杀项目,跟着学习并且记录一下,可能错误会很多,欢迎大家指正。
前言
本文介绍秒杀功能开发模块,具体详细介绍商品列表、商品详情、秒杀和订单详情。
一、商品列表页
- 商品返回对象:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GoodsVo extends Goods {
private BigDecimal seckillPrice;
private Integer stockCount;
private Date startDate;
private Date endDate;
}
- Mapper 接口获取商品列表:
public interface GoodsMapper extends BaseMapper<Goods> {
List<GoodsVo> findGoodsVo();
}
- 服务类和服务实现类获取商品列表:
public interface IGoodsService extends IService<Goods> {
List<GoodsVo> findGoodsVo();
}
@Service
public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements
IGoodsService {
@Autowired
private GoodsMapper goodsMapper;
@Override
public List<GoodsVo> findGoodsVo() {
return goodsMapper.findGoodsVo();
}
}
- 跳转商品列表页:
@RequestMapping("/toList")
public String toLogin(Model model, User user) {
model.addAttribute("user", user);
model.addAttribute("goodsList", goodsService.findGoodsVo());
return "goodsList";
}
}
二、商品详情页
- Mapper 接口根据商品id获取商品详情:
GoodsVo findGoodsVoByGoodsId(Long goodsId);
- 服务类和服务实现类根据商品id获取商品详情:
GoodsVo findGoodsVoByGoodsId(Long goodsId);
@Override
public GoodsVo findGoodsVoByGoodsId(Long goodsId) {
return goodsMapper.findGoodsVoByGoodsId(goodsId);
}
- 跳转商品详情页
@RequestMapping("/toDetail/{goodsId}")
public String toDetail(Model model, User user, @PathVariable Long goodsId) {
model.addAttribute("user", user);
GoodsVo goods = goodsService.findGoodsVoByGoodsId(goodsId);
model.addAttribute("goods", goods);
Date startDate = goods.getStartDate();
Date endDate = goods.getEndDate();
Date nowDate = new Date();
//秒杀状态
int secKillStatus = 0;
//剩余开始时间
int remainSeconds = 0;
//秒杀还未开始
if (nowDate.before(startDate)) {
remainSeconds = (int) ((startDate.getTime()-nowDate.getTime())/1000);
// 秒杀已结束
} else if (nowDate.after(endDate)) {
secKillStatus = 2;
remainSeconds = -1;
// 秒杀中
} else {
secKillStatus = 1;
remainSeconds = 0;
}
model.addAttribute("secKillStatus",secKillStatus);
model.addAttribute("remainSeconds",remainSeconds);
return "goodsDetail";
}
三、秒杀功能实现
- 服务类和服务实现类秒杀:
public interface IOrderService extends IService<Order> {
Order seckill(User user, GoodsVo goods);
}
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
IOrderService {
@Autowired
private ISeckillGoodsService seckillGoodsService;
@Autowired
private IGoodsService goodsService;
@Autowired
private OrderMapper orderMapper;
@Autowired
private ISeckillOrderService seckillOrderService;
@Override
@Transactional
public Order seckill(User user, GoodsVo goods) {
//秒杀商品表减库存
SeckillGoods seckillGoods = seckillGoodsService.getOne(new
QueryWrapper<SeckillGoods>().eq("goods_id",
goods.getId()));
seckillGoods.setStockCount(seckillGoods.getStockCount()-1);
seckillGoodsService.updateById(seckillGoods);
//生成订单
Order order = new Order();
order.setUserId(user.getId());
order.setGoodsId(goods.getId());
order.setDeliveryAddrId(0L);
order.setGoodsName(goods.getGoodsName());
order.setGoodsCount(1);
order.setGoodsPrice(seckillGoods.getSeckillPrice());
order.setOrderChannel(1);
order.setStatus(0);
order.setCreateDate(new Date());
orderMapper.insert(order);
//生成秒杀订单
SeckillOrder seckillOrder = new SeckillOrder();
seckillOrder.setOrderId(order.getId());
seckillOrder.setUserId(user.getId());
seckillOrder.setGoodsId(goods.getId());
seckillOrderService.save(seckillOrder);
return order;
}
}
- 控制端实现:
@Controller
@RequestMapping("/seckill")
public class SeckillController {
@Autowired
private IGoodsService goodsService;
@Autowired
private ISeckillOrderService seckillOrderService;
@Autowired
private IOrderService orderService;
@RequestMapping("/doSeckill")
public String doSeckill(Model model, User user, Long goodsId) {
if (user == null) {
return "login";
}
model.addAttribute("user", user);
GoodsVo goods = goodsService.findGoodsVoByGoodsId(goodsId);
//判断库存
if (goods.getStockCount() < 1) {
model.addAttribute("errmsg", RespBeanEnum.EMPTY_STOCK.getMessage());
return "seckillFail";
}
//判断是否重复抢购
SeckillOrder seckillOrder = seckillOrderService.getOne(new
QueryWrapper<SeckillOrder>().eq("user_id", user.getId()).eq(
"goods_id",
goodsId));
if (seckillOrder != null) {
model.addAttribute("errmsg", RespBeanEnum.REPEATE_ERROR.getMessage());
return "seckillFail";
}
Order order = orderService.seckill(user, goods);
model.addAttribute("order",order);
model.addAttribute("goods",goods);
return "orderDetail";
}
}
四、订单详情页
后端学习不重点掌握。
总结
以上就是今天要讲的内容,本文简单介绍了秒杀功能模块,具体参考 乐字节 Java电商秒杀项目。