基于javaweb的电商书城平台系统设计和实现(java+springboot+mysql+spring+jsp)

运行环境

Java≥8、MySQL≥5.7

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

电商平台java架构设计方案 基于javaweb的电商设计与实现_User

电商平台java架构设计方案 基于javaweb的电商设计与实现_spring boot_02

电商平台java架构设计方案 基于javaweb的电商设计与实现_spring_03

电商平台java架构设计方案 基于javaweb的电商设计与实现_电商平台java架构设计方案_04

电商平台java架构设计方案 基于javaweb的电商设计与实现_spring_05

电商平台java架构设计方案 基于javaweb的电商设计与实现_java_06

电商平台java架构设计方案 基于javaweb的电商设计与实现_java_07

电商平台java架构设计方案 基于javaweb的电商设计与实现_spring boot_08

电商平台java架构设计方案 基于javaweb的电商设计与实现_java_09

电商平台java架构设计方案 基于javaweb的电商设计与实现_spring_10

电商平台java架构设计方案 基于javaweb的电商设计与实现_spring boot_11

电商平台java架构设计方案 基于javaweb的电商设计与实现_电商平台java架构设计方案_12

电商平台java架构设计方案 基于javaweb的电商设计与实现_电商平台java架构设计方案_13

电商平台java架构设计方案 基于javaweb的电商设计与实现_spring_14

电商平台java架构设计方案 基于javaweb的电商设计与实现_User_15

电商平台java架构设计方案 基于javaweb的电商设计与实现_java_16

基于javaweb+springboot的电商书城平台系统(java+springboot+mysql+spring+jsp)

JAVA springboot 电商书城平台系统(已调试) 主要实现了书城网站的浏览、加入购物车操作、订单操作、支付操作、分类查看、搜索、以及后台上传图书信息以及订单管理和一些基本操作功能

主要功能截图如下:

模拟支付宝支付:

主要技术:java springboot springbmvc  shiro  mybatis  mysql  jquery  css  js  jsp  bootstarp.js

用户信息控制层:
@Controller
@RequestMapping(“/user”)
public class UserController {
@Autowired
private IUserService userService;
@Autowired
private IMailService mailService;
@Autowired
private IStoreService storeService;
@Value(“${mail.fromMail.addr}”)
private String from;
@Value(“${my.ip}”)
private String ip;
private final String USERNAME_PASSWORD_NOT_MATCH = “用户名或密码错误”;
private final String USERNAME_CANNOT_NULL = “用户名不能为空”;
@RequestMapping(“/login”)
public String login(@RequestParam(value = “username”, required = false) String username,
@RequestParam(value = “password”, required = false) String password,
HttpServletRequest request, Model model) {
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
return “login”;
//未认证的用户
Subject userSubject = SecurityUtils.getSubject();
if (!userSubject.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(false);//禁止记住我功能
try {
//登录成功
userSubject.login(token);
User loginUser = (User) userSubject.getPrincipal();
request.getSession().setAttribute(“loginUser”, loginUser);
Store store = storeService.findStoreByUserId(loginUser.getUserId());
request.getSession().setAttribute(“loginStore”, store);
SavedRequest savedRequest = WebUtils.getSavedRequest(request);
String url = “/”;
if (savedRequest != null) {
url = savedRequest.getRequestUrl();
if(url.contains(request.getContextPath())){
url = url.replace(request.getContextPath(),“”);
if(StringUtils.isEmpty(url) || url.equals(“/favicon.ico”)){
url = “/”;
return “redirect:” + url;
} catch (UnknownAccountException | IncorrectCredentialsException uae) {
model.addAttribute(“loginMsg”, USERNAME_PASSWORD_NOT_MATCH);
return “login”;
} catch (LockedAccountException lae) {
model.addAttribute(“loginMsg”, “账户已被冻结!”);
return “login”;
} catch (AuthenticationException ae) {
model.addAttribute(“loginMsg”, “登录失败!”);
return “login”;
} else {
//用户已经登录
return “redirect:/index”;
@RequestMapping(“/info”)
public String personInfo(){
return “user_info”;
/* @RequestMapping(“/login1”)
public String login1(@RequestParam(value = “username”, required = false) String username,
@RequestParam(value = “password”, required = false) String password,
Model model, HttpServletRequest request) {
if (StringUtils.isEmpty(username)) {
model.addAttribute(“loginMsg”, USERNAME_CANNOT_NULL);
return “login”;
if (StringUtils.isEmpty(password)) {
model.addAttribute(“loginMsg”, “密码不能为空”);
return “login”;
BSResult bsResult = userService.login(username, password);
//登录校验失败
if (bsResult.getData() == null) {
model.addAttribute(“loginMsg”, bsResult.getMessage());
return “login”;
//登录校验成功,重定向到首页
User user = bsResult.getData();
//置密码为空
user.setPassword(“”);
request.getSession().setAttribute(“user”, user);
return “redirect:/”;
*/
//shiro框架帮我们注销
@RequestMapping(“/logout”)
@CacheEvict(cacheNames=“authorizationCache”,allEntries = true)
public String logout() {
SecurityUtils.getSubject().logout();
return “redirect:/page/login”;
/**
• 注册 检验用户名是否存在
• @param username
• @return
*/
@RequestMapping(“/checkUserExist”)
@ResponseBody
public BSResult checkUserExist(String username) {
if (StringUtils.isEmpty(username)) {
return BSResultUtil.build(200, USERNAME_CANNOT_NULL, false);
return userService.checkUserExistByUsername(username);
/**
• 注册,发激活邮箱
• @param user
• @return
*/
@RequestMapping(“/register”)
public String register(User user, Model model) {
BSResult isExist = checkUserExist(user.getUsername());
//尽管前台页面已经用ajax判断用户名是否存在,
// 为了防止用户不是点击前台按钮提交表单造成的错误,后台也需要判断
if ((Boolean) isExist.getData()) {
user.setActive(“1”);
BSResult bsResult = userService.saveUser(user);
//获得未激活的用户
User userNotActive = (User) bsResult.getData();
/* try {
mailService.sendHtmlMail(user.getEmail(), “<dd书城>—用户激活—”,
“亲爱的” + user.getUsername() +
“,请您点击此链接前往激活”);
} catch (Exception e) {
e.printStackTrace();
model.addAttribute(“registerError”, “发送邮件异常!请检查您输入的邮箱地址是否正确。”);
return “fail”;
}*/
model.addAttribute(“username”, user.getUsername());
return “register_success”;
} else {
//用户名已经存在,不能注册
model.addAttribute(“registerError”, isExist.getMessage());
return “register”;
@RequestMapping(“/active”)
public String activeUser(String activeCode, Model model) {
BSResult bsResult = userService.activeUser(activeCode);
if (!StringUtils.isEmpty(bsResult.getData())) {
model.addAttribute(“username”, bsResult.getData());
return “active_success”;
} else {
model.addAttribute(“failMessage”, bsResult.getMessage());
return “fail”;
@RequestMapping(“/update”)
@ResponseBody
public BSResult updateUser(User user, HttpSession session){
User loginUser = (User) session.getAttribute(“loginUser”);
loginUser.setNickname(user.getNickname());
loginUser.setLocation(user.getLocation());
loginUser.setDetailAddress(user.getDetailAddress());
loginUser.setGender(user.getGender());
loginUser.setUpdated(new Date());
loginUser.setPhone(user.getPhone());
loginUser.setIdentity(user.getIdentity());
loginUser.setPhone(user.getPhone());
BSResult bsResult = userService.updateUser(loginUser);
session.setAttribute(“loginUser”, loginUser);
return bsResult;
@RequestMapping(“/password/{userId}”)
@ResponseBody
public BSResult changePassword(@PathVariable(“userId”) int userId,String oldPassword,String newPassword){
if(StringUtils.isEmpty(oldPassword) || StringUtils.isEmpty(newPassword)){
return BSResultUtil.build(400, “密码不能为空”);
return userService.compareAndChange(userId,oldPassword,newPassword);
订单信息控制层:
@Controller
@RequestMapping(“/order”)
public class OrderController {
@Autowired
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的立即购买域中以区分购物车中的书籍
BookInfo bookInfo = bookInfoService.findById(bookId);
if (bookInfo != null) {
BSResult bsResult = cartService.addToCart(bookInfo, null, buyNum);
request.getSession().setAttribute(“buyNowCart”, bsResult.getData());
request.setAttribute(“cart”, bsResult.getData());
return “order_info”;
} else {
request.setAttribute(“exception”, “不好意思,书籍库存不足或不存在了!”);
return “exception”;
//没有点立即购买,购物车中的总金额大于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) {
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”;
/**
• 订单列表
• @return
*/
@GetMapping(“/list”)
public String orderList(HttpServletRequest request) {
User loginUser = (User) request.getSession().getAttribute(“loginUser”);
List orderCustoms = orderService.findOrdersByUserId(loginUser.getUserId());
request.setAttribute(“orderCustoms”, orderCustoms);
return “order_list”;
/**
• 创建订单
• @return
*/
@PostMapping(“/creation”)
public String createOrder(User userDTO, String express, int payMethod, HttpServletRequest request) {
//立即购买,优先创建订单
Cart buyNowCart = (Cart) request.getSession().getAttribute(“buyNowCart”);
User loginUser = (User) request.getSession().getAttribute(“loginUser”);
userDTO.setUserId(loginUser.getUserId());
userDTO.setZipCode(loginUser.getZipCode());
if (buyNowCart != null) {
BSResult bsResult = orderService.createOrder(buyNowCart, userDTO, express, payMethod);
if (bsResult.getCode() == 200) {
request.setAttribute(“order”, bsResult.getData());
cartService.clearCart(request, “buyNowCart”);
return “payment”;
} else {
request.setAttribute(“exception”, bsResult.getMessage());
return “exception”;
//普通购物车
Cart cart = (Cart) request.getSession().getAttribute(“cart”);
if (cart != null) {
BSResult bsResult = orderService.createOrder(cart, userDTO, express, payMethod);
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);
if (bsResult.getCode() == 200) {
return “redirect:/order/list”;
} else {
model.addAttribute(“exception”, bsResult.getMessage());
return “exception”;
书籍详情控制层:
@Controller
@RequestMapping(“/book”)
public class BookInfoController {
@Autowired
private IBookInfoService bookInfoService;
@Autowired
private BookDescMapper bookDescMapper;
/**
• 查询某一本书籍详情
• @param bookId
• @param model
• @return
*/
@RequestMapping(“/info/{bookId}”)
public String bookInfo(@PathVariable(“bookId”) Integer bookId, Model model) throws BSException {
//查询书籍
BookInfo bookInfo = bookInfoService.findById(bookId);
//查询书籍推荐列表
List recommendBookList = bookInfoService.findBookListByCateId(bookInfo.getBookCategoryId(), 1, 5);
//查询书籍详情
BookDesc bookDesc = bookDescMapper.selectByPrimaryKey(bookId);
//增加访问量
bookInfoService.addLookMount(bookInfo);
Collections.shuffle(recommendBookList);
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,
@RequestParam(defaultValue = “0”, required = false) int cateId,//分类Id,默认为0,即不按照分类Id查
@RequestParam(defaultValue = “1”, required = false) int page,
@RequestParam(defaultValue = “6”, required = false) int pageSize,
Model model) {
keywords = keywords.trim();
PageInfo 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”;



电商平台java架构设计方案 基于javaweb的电商设计与实现_spring boot_17

电商平台java架构设计方案 基于javaweb的电商设计与实现_spring boot_18