SpringBoot实战项目-基于SpringBoot实现的网上书城项目

项目介绍

​ 基于SpringBoot与Mybatis结合实现的一个网上书城实践项目。

项目实现

一、环境配置

  1. 使用idea

  2. 创建maven项目

  3. 导入关键依赖

 	<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>

二、关键代码实现

用户登录
  1. 业务层
	@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);
    }

}

  1. 前端登录

     				//获取按钮
                    $("#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");
    
                    });
    
用户注册
  1. 业务层

    	@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());
        }
    
    }
    
    1. 前端注册

      	$("#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");
                  });#### 点击跳转书籍详情界面
      
      添加到购物车
      1. 业务层

        	@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);
            }
        
        1. 前端添加

          		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";
                  }
          

          ###项目总结

          ​ 这是一个使用到许多框架的简单项目,在这个基础上可以对它进行诸多扩展。把它作为一个实际项目的不够的,但是把它作为一个用于学习的实践项目,会对你学习这些框架有很多的帮助。在一步步搭建这个项目的过程中,你可以认识到学习的知识有哪些不足,有哪些方面可以做得更好。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值