项目介绍
基于SpringBoot与Mybatis结合实现的一个网上书城实践项目。
项目实现
一、环境配置
-
使用idea
-
创建maven项目
-
导入关键依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
全部依赖文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.fs</groupId>
<artifactId>springBoot-bookShop</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
</dependencies>
</project>
二、关键代码实现
用户登录
- 业务层
@Override
public void login(String username, String password) throws Exception {
User user = userMapper.queryUserByName(username);
if(user != null){
if(password.equals(user.getLoginPass())){
UserContext.setUser(user);
return;
}
}
throw new UsernameOrPasswordErrorException("用户名或者密码错误");
}
注意:
UserContext.setUser(user);
这部分代码是一个工具类的方法,用于保存当前用户,具体代码实现如下
package com.fs.util;
import com.fs.entity.User;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpSession;
public class UserContext {
private static final String LOGIN_USER = "current_user";
//Spring提供了获取javaWeb核心对象的工具类: RequestContextHolder
public static HttpSession getSession(){
return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest().getSession();
}
public static void setUser(User user){
getSession().setAttribute(LOGIN_USER,user);
}
public static User getUser(){
return (User)getSession().getAttribute(LOGIN_USER);
}
}
-
前端登录
//获取按钮 $("#loginBtn").click(function(){ $("#login-error").text(""); //获取用户名表单的value let username = $("#username").val(); //获取密码表单的value let password = $("#password").val(); if(username=='' || password ==''){ $("#login-error").text("用户名或密码不能为空"); return; } //发ajax请求 $.post("/user/login",{"username":username,"password":password},function(res){ if(res.status == 200){ //跳转到首页 location.href="/index.html"; }else{ $("#login-error").text(res.msg); $("#username").val(""); $("#password").val(""); } },"json"); });
用户注册
-
业务层
@Override public void register(User user) throws Exception { if(userMapper.queryUserByName(user.getLoginName()) != null){ throw new UserIsExistsException("用户名已经存在"); } userMapper.insert(user); }
注意:当注册用户名在数据库已经存在时,抛出自定义异常。这个自定义异常由SpringBoot进行处理。具体实现如下:
package com.fs.exception; public class UserIsExistsException extends BaseException { public UserIsExistsException() { } public UserIsExistsException(String message) { super(message); } public UserIsExistsException(String message, Throwable cause) { super(message, cause); } public UserIsExistsException(Throwable cause) { super(cause); } public UserIsExistsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }
其中基础的父类BaseException由SpringBoot全局异常处理器进行处理:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(BaseException.class) @ResponseBody public ResponseData handlerBaseException(Exception e){ return ResponseData.error(e.getMessage()); } @ExceptionHandler(Exception.class) @ResponseBody public ResponseData handlerException(Exception e){ return ResponseData.error(e.getMessage()); } }
-
前端注册
$("#registerBtn").click(function () { $("#register-error").text(""); let username = $("#username").val(); let email = $("#email").val(); let password = $("#password").val(); let nickname = $("#nickname").val(); let tel = $("#tel").val(); let sex = $("#sex").val(); if (sex == 0) { sex = "男" } else { sex = "女" } let user = { "loginName": username, "loginPass": password, "email": email, "nickname": nickname, "tellPhone": tel, "gender": sex }; $.post("/user/register", user, function (res) { if (res.status == 200) { //跳转到登录界面 location.href = "/login.html"; } else { $("#register-error").text(res.msg); console.log("注册失败") } }, "json"); });#### 点击跳转书籍详情界面
添加到购物车
-
业务层
@Override public boolean saveCartItem(Integer bid, Integer quantity) { CartItem cartitem = new CartItem(); cartitem.setBid(bid); cartitem.setQuantity(quantity); cartitem.setUid(UserContext.getUser().getUid()); cartitem.setPrice(quantity * bookMapper.queryById(bid).getCurrPrice()); cartitem.setImage_b(bookMapper.queryById(bid).getImageB()); List<CartItem> list = cartMapper.queryAllItemByUid(cartitem.getUid()); for (CartItem c : list) { if (c.getBid() == cartitem.getBid()) { int sum = quantity + c.getQuantity(); c.setQuantity(sum); c.setPrice(sum * bookMapper.queryById(bid).getCurrPrice()); return cartMapper.updateById(c)>0; } } return cartMapper.insertBookToCart(cartitem); }
-
前端添加
function addToCart(bid) { let quantity = $("#number").val() $.post("/cart/addToCart", { bid: bid, quantity: quantity }, function (res) { if (res.status == 200) { //alert("成功加入购物车"); ToCart(); } else { alert(res.msg); console.log(res.msg); } console.log(res); }, "json") }; function ToCart() { location.href = "/cart.html"; }
###项目总结
这是一个使用到许多框架的简单项目,在这个基础上可以对它进行诸多扩展。把它作为一个实际项目的不够的,但是把它作为一个用于学习的实践项目,会对你学习这些框架有很多的帮助。在一步步搭建这个项目的过程中,你可以认识到学习的知识有哪些不足,有哪些方面可以做得更好。
-
-
-