package com.lh.seckill.controller;
import com.lh.seckill.access.AccessLimit;
import com.lh.seckill.domain.SeckillOrder;
import com.lh.seckill.domain.SeckillUser;
import com.lh.seckill.rabbitmq.MQSender;
import com.lh.seckill.rabbitmq.SeckillMessage;
import com.lh.seckill.redis.RedisService;
import com.lh.seckill.redis.key.GoodsKey;
import com.lh.seckill.redis.key.OrderKey;
import com.lh.seckill.result.CodeMsg;
import com.lh.seckill.result.Result;
import com.lh.seckill.service.GoodsService;
import com.lh.seckill.service.OrderService;
import com.lh.seckill.service.SeckillKey;
import com.lh.seckill.service.SeckillService;
import com.lh.seckill.vo.GoodsVo;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by lh on 2018/4/20.
*/
@Controller
@EnableAutoConfiguration
@RequestMapping("/seckill")
public class SeckillController implements InitializingBean {
@Autowired
GoodsService goodsService;
@Autowired
SeckillService seckillService;
@Autowired
OrderService orderService;
@Autowired
RedisService redisService;
@Autowired
MQSender sender;
private HashMap<Long, Boolean> localOverMap = new HashMap<Long, Boolean>();
@AccessLimit(seconds=5, maxCount=5, needLogin=true)
@RequestMapping(value="/path", method=RequestMethod.GET)
@ResponseBody
public Result<String> getMiaoshaPath(HttpServletRequest request, SeckillUser user,
@RequestParam("goodsId")long goodsId,
@RequestParam(value="verifyCode", defaultValue="0")int verifyCode) {
if(user == null) {
return Result.error(CodeMsg.SESSION_ERROR);
}
boolean check = seckillService.checkVerifyCode(user, goodsId, verifyCode);
if(!check) {
return Result.error(CodeMsg.REQUEST_ILLEGAL);
}
String path =seckillService.createSeckillPath(user, goodsId);
return Result.success(path);
}
@RequestMapping(value="/{path}/do_seckill", method= RequestMethod.POST)
@ResponseBody
public Result<Integer> seckill(Model model, SeckillUser user,@RequestParam("goodsId")long goodsId,
@PathVariable("path") String path) {
model.addAttribute("user", user);
if(user == null) {
return Result.error(CodeMsg.SESSION_ERROR);
}
//验证path
boolean check = seckillService.checkPath(user, goodsId, path);
if(!check){
return Result.error(CodeMsg.REQUEST_ILLEGAL);
}
//内存标记,减少redis访问
boolean over = localOverMap.get(goodsId);
if(over) {
return Result.error(CodeMsg.SECKILL_OVER);
}
//预减库存
long stock = redisService.decr(GoodsKey.getSeckillGoodsStock, ""+goodsId);//10
if(stock < 0) {
localOverMap.put(goodsId, true);
return Result.error(CodeMsg.SECKILL_OVER);
}
//判断是否已经秒杀到了
SeckillOrder order = orderService.getSeckillOrderByUserIdGoodsId(user.getId(), goodsId);
if(order != null) {
return Result.error(CodeMsg.REPEATE_SECKILL);
}
//入队
SeckillMessage mm = new SeckillMessage();
mm.setUser(user);
mm.setGoodsId(goodsId);
sender.sendSeckillMessage(mm);
return Result.success(0);//排队中
/*
//判断库存
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
int stock = goods.getStockCount();
if(stock <= 0) {
return Result.error(CodeMsg.SECKILL_OVER);
}
//判断是否已经秒杀到了
SeckillOrder order = orderService.getSeckillOrderByUserIdGoodsId(user.getId(), goodsId);
if(order != null) {
model.addAttribute("errmsg", CodeMsg.REPEATE_SECKILL.getMsg());
return Result.error(CodeMsg.REPEATE_SECKILL);
}
//减库存 下订单 写入秒杀订单
OrderInfo orderInfo = seckillService.seckill(user, goods);
return Result.success(orderInfo);
*/
}
/**
* orderId:成功
* -1:秒杀失败
* 0: 排队中
* */
@RequestMapping(value="/result", method=RequestMethod.GET)
@ResponseBody
public Result<Long> miaoshaResult(Model model,SeckillUser user,
@RequestParam("goodsId")long goodsId) {
model.addAttribute("user", user);
if(user == null) {
return Result.error(CodeMsg.SESSION_ERROR);
}
long result = seckillService.getSeckillResult(user.getId(), goodsId);
return Result.success(result);
}
@Override
public void afterPropertiesSet() throws Exception {
List<GoodsVo> goodsList = goodsService.listGoodsVo();
if(goodsList == null) {
return;
}
for(GoodsVo goods : goodsList) {
redisService.set(GoodsKey.getSeckillGoodsStock, ""+goods.getId(), goods.getStockCount());
localOverMap.put(goods.getId(), false);
}
}
@RequestMapping(value="/reset", method=RequestMethod.GET)
@ResponseBody
public Result<Boolean> reset(Model model) {
List<GoodsVo> goodsList = goodsService.listGoodsVo();
for(GoodsVo goods : goodsList) {
goods.setStockCount(10);
redisService.set(GoodsKey.getSeckillGoodsStock, ""+goods.getId(), 10);
localOverMap.put(goods.getId(), false);
}
redisService.delete(OrderKey.getSeckillOrderByUidGid);
redisService.delete(SeckillKey.isGoodsOver);
seckillService.reset(goodsList);
return Result.success(true);
}
@RequestMapping(value="/verifyCode", method=RequestMethod.GET)
@ResponseBody
public Result<String> getMiaoshaVerifyCod(HttpServletResponse response, SeckillUser user,
@RequestParam("goodsId")long goodsId) {
if(user == null) {
return Result.error(CodeMsg.SESSION_ERROR);
}
try {
BufferedImage image = seckillService.createVerifyCode(user, goodsId);
OutputStream out = response.getOutputStream();
ImageIO.write(image, "JPEG", out);
out.flush();
out.close();
return null;
}catch(Exception e) {
e.printStackTrace();
return Result.error(CodeMsg.SECKILL_FAIL);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
java毕业设计 基于SpringBoot+Mybatis的秒杀系统的设计与实现+详细文档+全部资料(优秀项目).zip
共301个文件
xml:90个
java:59个
class:57个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 67 浏览量
2024-04-17
10:47:38
上传
评论
收藏 24.53MB ZIP 举报
温馨提示
【资源说明】 java毕业设计 基于SpringBoot+Mybatis的秒杀系统的设计与实现+详细文档+全部资料(优秀项目).zipjava毕业设计 基于SpringBoot+Mybatis的秒杀系统的设计与实现+详细文档+全部资料(优秀项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕设项目、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 3、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
java毕业设计 基于SpringBoot+Mybatis的秒杀系统的设计与实现+详细文档+全部资料(优秀项目).zip (301个子文件)
SeckillController.class 9KB
RedisService.class 7KB
SeckillService.class 7KB
GoodsController.class 6KB
AccessInterceptor.class 5KB
SeckillUserService.class 4KB
UserUtil.class 4KB
SampleController.class 4KB
MQConfig.class 4KB
MQReceiver.class 3KB
OrderService.class 3KB
MQSender.class 3KB
OrderInfo.class 3KB
CodeMsg.class 3KB
OrderController.class 3KB
LoginController.class 2KB
GlobalExceptionHandler.class 2KB
SeckillUser.class 2KB
GoodsService.class 2KB
UserArgumentResolver.class 2KB
RedisConfig.class 2KB
Goods.class 2KB
Result.class 2KB
MD5Util.class 2KB
SeckillGoods.class 2KB
WebConfig.class 2KB
OrderDao.class 2KB
DBUtil.class 2KB
IsMobileValidator.class 2KB
RedisPoolFactory.class 1KB
UserController.class 1KB
ValidatorUtil.class 1KB
GoodsDetailVo.class 1KB
GoodsVo.class 1KB
GoodsDao.class 1KB
LoginVo.class 1KB
SeckillOrder.class 1KB
BasePrefix.class 1KB
IsMobile.class 929B
UserService.class 914B
UserContext.class 914B
OrderDetailVo.class 878B
SeckillMessage.class 824B
MainApplication.class 748B
User.class 724B
GlobalException.class 717B
SeckillUserDao.class 668B
SeckillKey.class 654B
GoodsKey.class 652B
UserDao.class 643B
SeckillUserKey.class 641B
UUIDUtil.class 582B
AccessKey.class 551B
UserKey.class 539B
OrderKey.class 504B
AccessLimit.class 500B
KeyPrefix.class 193B
bootstrap.css 143KB
bootstrap.css 143KB
bootstrap.min.css 118KB
bootstrap.min.css 118KB
bootstrap-theme.css 26KB
bootstrap-theme.css 26KB
bootstrap-theme.min.css 23KB
bootstrap-theme.min.css 23KB
layer.css 14KB
layer.css 14KB
layer.css 5KB
layer.css 5KB
glyphicons-halflings-regular.eot 20KB
glyphicons-halflings-regular.eot 20KB
loading-0.gif 6KB
loading-0.gif 6KB
loading-2.gif 2KB
loading-2.gif 2KB
loading-1.gif 701B
loading-1.gif 701B
.gitignore 70B
goods_detail.htm 6KB
goods_detail.htm 6KB
order_detail.htm 3KB
order_detail.htm 3KB
goods_detail.html 3KB
goods_detail.html 3KB
login.html 3KB
login.html 3KB
order_detail.html 2KB
order_detail.html 2KB
goods_list.html 2KB
goods_list.html 2KB
seckill_fail.html 250B
seckill_fail.html 250B
hello.html 235B
hello.html 235B
seckill.iml 9KB
seckill.jar 25.25MB
SeckillController.java 7KB
RedisService.java 6KB
GoodsController.java 5KB
SeckillService.java 5KB
共 301 条
- 1
- 2
- 3
- 4
资源评论
不走小道
- 粉丝: 3217
- 资源: 5113
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功