这个项目涉及到Shiro整合JWT、秒杀功能所具备的基本要求(限流、乐观锁、接口隐藏、JMeter高并发测试等等)、消息中间件RabbitMQ的异步邮件通知和死信队列、沙箱支付宝模拟支付等等技术亮点。
项目功能:该项目分为买家、卖家、管理员三个角色。买家角色的功能:登录、注册、浏览图书、管理购物车、结算订单、支付订单、查看订单、修改个人信息等等功能。
卖家角色的功能:登录、注册、浏览商品、管理自己发布的图书、管理收到的订单、查看自己的收益详情等等。管理员角色的功能:登录、管理所有用户信息、管理权限信息、管理所有卖家发布的图书、管理所有订单信息、管理所有支付信息、查看总共收益详情等等。
应用技术:SSM + Jsp + MySQL + Redis + JWT + Shiro + RabbitMQ + EasyUI + 沙箱支付宝 + 令牌桶限流 + 乐观锁等等
运行环境:Eclipse/IntelliJ IDEA + MySQL5.7 + Maven3.6.3+ JDK1.8 + Redis5.0.5+ Tomcat8.5 + RabbitMQ3.7.7
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
//数据库里没有这本书,或库存不足
request.setAttribute("bookInfo", null);
}
return "addcart";
}
@GetMapping("/clear")
public String clearCart(HttpServletRequest request) {
cartService.clearCart(request,"cart");
return "cart";
}
@GetMapping("/deletion/{bookId}")
public String deleteCartItem(@PathVariable("bookId") int bookId,HttpServletRequest request){
cartService.deleteCartItem(bookId, request);
return "redirect:/cart/items";
}
/**
* 更新某个购物车项的购买数量
* @param bookId
* @param newNum
* @param request
* @return
*/
* @param bookId
* @param request
* @return
*/
@RequestMapping("/addition")
public String addToCart(@RequestParam(value = "bookId",defaultValue = "0") int bookId,
@RequestParam(required = false,defaultValue = "0") int buyNum,
HttpServletRequest request) {
Cart cart = (Cart) request.getSession().getAttribute("cart");
//根据要加入购物车的bookId查询bookInfo
BookInfo bookInfo = bookInfoService.queryBookAvailable(bookId);
if (bookInfo != null) {
//这本书在数据库里
BSResult bsResult = cartService.addToCart(bookInfo, cart, buyNum);
request.getSession().setAttribute("cart", bsResult.getData());
request.setAttribute("bookInfo", bookInfo);
} else {
//数据库里没有这本书,或库存不足
request.setAttribute("bookInfo", null);
}
return "addcart";
}
@GetMapping("/clear")
public String clearCart(HttpServletRequest request) {
cartService.clearCart(request,"cart");
return "cart";
}
@GetMapping("/payPage/{orderId}")
public String toPay(@PathVariable("orderId") String orderId, Model model) {
BSResult bsResult = orderService.findOrderById(orderId);
if (bsResult.getCode() == 200) {
model.addAttribute("order", bsResult.getData());
return "payment";
}
return "exception";
}
@RequestMapping("/deletion/{orderId}")
public String deletion(@PathVariable("orderId") String orderId) {
BSResult bsResult = orderService.deleteOrder(orderId);
if (bsResult.getCode() == 200) {
return "redirect:/order/list";
}
return "exception";
}
/**
}
} else {
request.setAttribute("exception", "购物车为空!");
return "exception";
}
}
/**
* 确认收货
*
* @param orderId
* @return
*/
@RequestMapping("/confirm/{orderId}")
public String confirmReceiving(@PathVariable("orderId") String orderId, Model model) {
BSResult bsResult = orderService.confirmReceiving(orderId);
}
//没有点立即购买,购物车中的总金额大于0才让填写订单信息
Cart cart = (Cart) request.getSession().getAttribute("cart");
if (cart != null && cart.getTotal() > 0) {
return "order_info";
} else {
return "cart";
}
}
@GetMapping("/payPage/{orderId}")
public String toPay(@PathVariable("orderId") String orderId, Model model) {
BSResult bsResult = orderService.findOrderById(orderId);
if (bsResult.getCode() == 200) {
keywords = keywords.trim();
PageInfo<BookInfo> bookPageInfo = bookInfoService.findBookListByCondition(keywords, cateId, page, pageSize,0);//storeId为0,不按照商店Id查询
model.addAttribute("bookPageInfo", bookPageInfo);
model.addAttribute("keywords", keywords);
model.addAttribute("cateId", cateId);
return "book_list";
}
}
订单管理控制层:
@Controller
@RequestMapping("/order")
public class OrderController {
@Autowired
model.addAttribute("bookInfo", bookInfo);
model.addAttribute("bookDesc", bookDesc);
model.addAttribute("recommendBookList", recommendBookList);
return "book_info";
}
/**
* 通过关键字和书籍分类搜索书籍列表
*
* @param keywords
* @return
*/
@RequestMapping("/list")
public String bookSearchList(@RequestParam(defaultValue = "", required = false) String keywords,
* @param bookId
* @param newNum
* @param request
* @return
*/
@PostMapping("/buy/num/update")
@ResponseBody
public BSResult updateBuyNum(int bookId, int newNum, HttpServletRequest request){
return cartService.updateBuyNum(bookId, newNum, request);
}
@PostMapping("/checkOne")
@ResponseBody
public BSResult checkACartItem(int bookId,HttpServletRequest request){
Cart cart = (Cart)request.getSession().getAttribute("cart");
return cartService.checkedOrNot(cart, bookId);
}
}
书信息管理控制层:
@Controller
@RequestMapping("/book")
public class BookInfoController {
@Autowired
private IBookInfoService bookInfoService;
@Autowired
cartService.clearCart(request,"cart");
return "cart";
}
@GetMapping("/deletion/{bookId}")
public String deleteCartItem(@PathVariable("bookId") int bookId,HttpServletRequest request){
cartService.deleteCartItem(bookId, request);
return "redirect:/cart/items";
}
/**
* 更新某个购物车项的购买数量
* @param bookId
* @param newNum
* @param request
* @return
*/
@PostMapping("/buy/num/update")
@ResponseBody
public BSResult updateBuyNum(int bookId, int newNum, HttpServletRequest request){
return cartService.updateBuyNum(bookId, newNum, request);
}
@PostMapping("/checkOne")
@ResponseBody
public BSResult checkACartItem(int bookId,HttpServletRequest request){
Cart cart = (Cart)request.getSession().getAttribute("cart");
if (bsResult.getCode() == 200) {
request.setAttribute("order", bsResult.getData());
cartService.clearCart(request, "cart");
return "payment";
} else {
request.setAttribute("exception", bsResult.getMessage());
return "exception";
}
} else {
request.setAttribute("exception", "购物车为空!");
return "exception";
}
}
/**
* 确认收货
*
* @param orderId
* @return
*/
@RequestMapping("/confirm/{orderId}")
public String confirmReceiving(@PathVariable("orderId") String orderId, Model model) {
BSResult bsResult = orderService.confirmReceiving(orderId);
private IOrderService orderService;
@Autowired
private ICartService cartService;
@Autowired
private IBookInfoService bookInfoService;
/**
* 填写订单信息页面
*
* @param bookId
* @param buyNum
* @param request
* @return
*/
@GetMapping("/info")
public String orderInfo(@RequestParam(required = false, defaultValue = "0") int bookId,
@RequestParam(required = false, defaultValue = "0") int buyNum,
HttpServletRequest request) throws BSException {
if (bookId != 0) {
//点了立即购买,放到request域中,也session的立即购买域中以区分购物车中的书籍