【秒杀项目2】秒杀功能模块

刚入门Java的硕士宝宝,实验室没什么Java项目,看到网上的秒杀项目,跟着学习并且记录一下,可能错误会很多,欢迎大家指正。



前言

本文介绍秒杀功能开发模块,具体详细介绍商品列表、商品详情、秒杀和订单详情。


一、商品列表页

  1. 商品返回对象:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GoodsVo extends Goods {
   private BigDecimal seckillPrice;
   private Integer stockCount;
   private Date startDate;
   private Date endDate;
}
  1. Mapper 接口获取商品列表:
public interface GoodsMapper extends BaseMapper<Goods> {
   List<GoodsVo> findGoodsVo();
}
  1. 服务类和服务实现类获取商品列表:
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();
 }
}
  1. 跳转商品列表页:
 @RequestMapping("/toList")
   public String toLogin(Model model, User user) {
      model.addAttribute("user", user);
      model.addAttribute("goodsList", goodsService.findGoodsVo());
      return "goodsList";
   }
}

二、商品详情页

  1. Mapper 接口根据商品id获取商品详情:
GoodsVo findGoodsVoByGoodsId(Long goodsId);
  1. 服务类和服务实现类根据商品id获取商品详情:
GoodsVo findGoodsVoByGoodsId(Long goodsId);
@Override
public GoodsVo findGoodsVoByGoodsId(Long goodsId) {
   return goodsMapper.findGoodsVoByGoodsId(goodsId);
}
  1. 跳转商品详情页
@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";
}

三、秒杀功能实现

  1. 服务类和服务实现类秒杀:
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;
   }
}
  1. 控制端实现:
@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电商秒杀项目。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值