Spring Boot电商项目(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring Boot电商项目

前言:这是我学SpringBoot以来第一个实际应用性的项目,还是有必要写个笔记记录一下,以便之后复习和部分知识重复利用。


一.概述


我上一篇博客写了关于SpringBoot的基本使用和入门,但是那篇博客的知识点还是过于基础,只能算入个门。SpringBoot有很多其他的高级知识点我还没有学习和使用。今天就借此机会来学习一下SpringBoot的那些高级的用法和与springboot配套的一些高级知识。开发一个电商应用,在这个电商项目的开发过程中来学习那些高级知识。


1.电商项目整体介绍


项目亮点:电商项目是互联网的主流技术,并且本项目的代码规范简洁,充分优化,流程完整,电商功能丰富,前后端分离。


2a8c3e23196144e6b0ab0e7fab70aa51.png


首先,整个项目是分为前台和后台,这也是我们通常的一个系统架构。前台指的是用户所看到的页面,包括首页和商品详情等等的。那我们就从用户的视角出发,看看前台包含哪些内容。前台有五个模块,第一个是用户模块,第二个是商品分类模块,第三个模块是商品信息模块,第四个是购物车模块,最后一个是订单模块。而在后台呢?后台的模块分类和前台比较类似,分为用户模块、商品分类模块、商品信息模块、订单模块。相比于前台而言,后台少了购物车模块,因为购物车通常在前台处理就可以了,前台的购物车把信息直接汇总到一个订单发送到后台,所以在后台中不需要购物车模块。


(1)前台模块具体分析


这一个一个的模块的内容又包含哪些呢?就让我们先从前台的用户模块进行看起。在用户模块中,会有注册功能、登录功能、更新签名、身份认证功能、登出功能。更新签名指用户更新个人信息,而身份认证指的是我们在登录之后才能对一些功能进行操作。然后就是商品分类模块,因为商品通常是会分为各种各样的类别的,如果不分类,找起来或者是归类起来都非常地不友好。比如最大的类别是食品,食品下面有水果,而水果类别之内可能会有进口水果类别,会这样一层一层的,在我们的项目中同样会采用多级目录的形式进行开发。在在涉及多级目录的时候,我们也会学到一个非常有用的知识点,就是递归查询。学习如何在查完了这级目录之后去查他的子目录。同样一个非常重要的知识点就是缓存,因为我们的商品分类通常而言它变化的几率比较小,或者说它变化的频率也比较低,比如说我们几天才会进行变动,甚至对于品类相对固定的电商而言,可能一个礼拜都不会对商品分类做出很大的调整。这种情况就适合来使用缓存了。所以我们在这里,我们将会使用Redis把当前商品分类的内容作为缓存给保存下来。这样一来,我们就不需要再每次用户访问的时候都去查询数据库,大大提升了效率。


59b2aa709bdd4e8c854eebb6387368c5.png


接下来就是商品模块,这是一个非常重点的模块。因为在这个模块中我们将学到许多新的功能,比如说搜索功能,搜索功能是电商中一个比较有用的能力,比如我输入一个关键字,他就能给出包含关键字的商品,同时还要对商品进行排序,比如说最常见的是按价格排序。而商品在展示的时候最常见的就是以列表的形式展示。所以在这个功能中,将会介绍一个列表应该如何开发,有哪些注意点,展示给用户的时候应该屏蔽哪些信息,保留哪些信息。然后就是按目录展示,比如用户只想看进口水果,那相当于它显示的是水果目录下的某个商品,则相当与是应该筛选条件。以及就是商品详情功能。在购物车模块中,我们将会做以下的这些功能,首先我们可以把商品加入到购物车,会显示购物车列表,以及我们可能想买一个商品买多份,就要对他的数量进行更改,有可能不想要了就把他移除购物车。还有购物车商品的勾选和反选。全选中和全部不选择的功能。


625094a4fe10430cb0c62b43b3241a2b.png


在前台中,还有最后一个模块,就是订单模块,他也是我们非常重要的模块之一,里面有下单的功能,还会有详细的订单流程和订单详情和取消订单、生成支付二维码的功能,生成二维码后,我们通过扫码的形式进行支付。同时每个用户都可以看到自己所拥有的订单,以及可以确认收货。


6a3e5d84590e404790a04838971fd7c6.png


(2)后台模块具体分析


在后台中,我们需要添加一个管理员模块,因为后台页面并不是每一个人都能登录的,只有符合管理员身份的用户才能登录,所以这里的身份认证和之前用户的身份认证是有所不同的。而后台的第二个模块就是商品分类模块。我们记得前面讲前台商品分类的时候,更多的是一种展示,是一种缓存,而在后台呢就不一样了。首先会对商品分类进行一个列表的开发,除此之外,我们对于管理员而言,还要有对这些列表进行增加、修改和删除的能力。这些会在之后进行更详细的介绍。


09c6b60154b3417bb4d95c18bb9b3bb3.png


然后,就是后台的商品模块,后台的商品模块比前台要复杂,后台的商品除了商品列表之外,在后台我们需要有新增商品的功能,而新增商品的时候就肯定会涉及到图片的上传,图片的上传,图片的命名等。商品是可以更新和删除的、商品也有批量上下架的功能。后台还有一个模块就是订单模块,在后台的订单模块中,会有订单列表、地址信息、发货和订单完结。


d180d8db645740a5906d99fbf15718f9.png


(3) 项目演示


这里的演示是包含前台页面的,但是我后面的代码编写是不包含前端。这是因为工作中大多数都是前后端分离的,前端是通过我们的后端的接口文档来渲染加载页面的。


下面我们先来介绍一下后台管理的部分。


768a2b09dc9142509db4cafe45169106.png


我们可以看到,在后台管理系统中输入默认的管理员密码就能登陆。登录后,会有几个页面,分别是商品管理、分类管理、订单管理和个人信息。


f3abee8416794169a8e2937fcbec0bad.png


首先,在商品管理里面,有商品的相关信息,,我们可以修改商品是否上下架。这个页面也会有分页。还可以对商品信息进行修改。还可以点击右上角新增商品。


d354f1ce0c334e2ca3754120d7fb80b0.png


然后就是分类管理的页面。


f4a2dfaf399e4fad9beefb406d7f9f58.png


之后是订单管理和个人信息的页面。


d39974e75ad8469e830d4ccca4308d23.png

c73dabf5418f4ae8b98ed5d370dc5a45.png


接下来,再稍微介绍一下前台的页面


image.png


2 . 项目开发所需工具准备


这一小节,把这个项目开发所需要的工具全部介绍一遍,有了这个工具之后,我们后续开发起来效率会得到很大的提高。


下面先要介绍IDEA常用的优质插件的准备:maven helper、Free MyBatis Tool(可以快速生成mapper xml文件、识别一些mapper中的语法错误)。


然后就是安装一下postman。如果实在不想安装,可以注册一个账号,网页版一样用。毕竟也不是每个人的电脑C盘都很大。


postman用来测试接口的。我们新建请求之前,可以新建一个Collection,这相当于一个文件夹。然后就可以在里面创建请求。之后就可以使用了。


二. 数据库设计于项目初始化


这一部分主要包含数据库表的设计,和技术选型、思路,技术选型的内容具体而言就是我们会选择哪一些工具和框架架构。最后我们会新建一个项目,对项目进行基本地初始化,整合一些框架,然后跑一个接口试试。


紧接着,我们会引入log4j2日志组件,用它来帮助我们记录日志。接下来还会做最后一个工作,使用AOP统一处理请求日志,会把一些请求信息记录下来。


1.表设计


这个项目的数据库和表也会提供好,下面对表稍微了解一下就好了。

这个数据名叫shop,共有6张表。

mall_user用户表:


6c8e49ac0f304fb7a0c6208e4f8a1403.png


mall_category商品分类目录表:


e5531a6cda8942d69aee677951522fbf.png


mall_product商品表:


e51968ba8409482f9c09f600fb75c8a9.png


mall_cart 购物车表:


8c5f579c390c480d85b5c3f6973f24d1.png


mall_order订单表:


a37aaf17c15442329e292e95b790968c.png


里面要注意,订单编号并没有用id来表示,因为这样做不安全,很容易让别人猜到订单量。order_status是订单的状态,0表示用户取消、10表示未付款(初始状态)、20表示已付款、30表示已发货、40表示交易完成。


mall_order_item订单项表:


253b736663554dbbbfb33fb68a52b16e.png


为什么要创建应该item表呢?因为我们应该订单下面会有多个商品,所以要记录订单内的项。


2. 项目的初始化


项目的初始化主要分为以下的几个步骤,新建项目、mybatis-generator进行配置自动生成Dao层文件,跑通接口。

先打开idea,然后创建应该springboot项目,项目的名称为mall:


9a99c2983fa248e58307a1348170f338.png


之后选择版本和依赖,依赖先spring web就可以了:


ef6312843cff478388e3e01b764bde31.png


项目创建好之后,我们需要导入两个额外的依赖:

        <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>


添加完这两个依赖之后,我们还要再添加一个插件,这个插件就是自动生成文件的,叫mybatis-generator-maven-plugin


            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>


接下来,我们还要在resource下面创建一个这个插件的配置文件generatorConfig.xml,这个文件不用去记,用的时候复制改一下参数就行了:

但是要注意几点,就是先要把对应版本的mysql-connector-java复制到resource目录下面,然后配置classPathEntry的location为当前电脑的maven目录。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
  <!-- 配置文件,放在resource目录下即可 -->
  <!--数据库驱动个人配置-->
  <classPathEntry
    location="D:\apache-maven-3.8.2\MavenRepository\mysql\mysql-connector-java\8.0.25\mysql-connector-java-8.0.25.jar"/>
  <context id="MysqlTables" targetRuntime="MyBatis3">
    <property name="autoDelimitKeywords" value="true"/>
    <!--可以使用``包括字段名,避免字段名与sql保留字冲突报错-->
    <property name="beginningDelimiter" value="`"/>
    <property name="endingDelimiter" value="`"/>
    <!-- optional,旨在创建class时,对注释进行控制 -->
    <commentGenerator>
      <property name="suppressDate" value="true"/>
      <property name="suppressAllComments" value="true"/>
    </commentGenerator>
    <!--数据库链接地址账号密码-->
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
      connectionURL="jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"
      userId="root"
      password="zc20020106">
      <property name="nullCatalogMeansCurrent" value="true"/>
    </jdbcConnection>
    <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制-->
    <javaTypeResolver>
      <property name="forceBigDecimals" value="false"/>
    </javaTypeResolver>
    <!--生成Model类存放位置-->
    <javaModelGenerator targetPackage="com.haiexijun.mall.model.pojo"
      targetProject="src/main/java">
      <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
      <property name="enableSubPackages" value="true"/>
      <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
      <property name="trimStrings" value="true"/>
      <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
      <property name="immutable" value="false"/>
    </javaModelGenerator>
    <!--生成mapper映射文件存放位置-->
    <sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
      <property name="enableSubPackages" value="true"/>
    </sqlMapGenerator>
    <!--生成Dao类存放位置-->
    <javaClientGenerator type="XMLMAPPER" targetPackage="com.haiexijun.mall.model.dao"
      targetProject="src/main/java">
      <property name="enableSubPackages" value="true"/>
    </javaClientGenerator>
    <!--生成对应表及类名-->
    <table schema="root" tableName="mall_cart" domainObjectName="Cart"
      enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    </table>
    <table tableName="mall_category" domainObjectName="Category" enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    </table>
    <table tableName="mall_order" domainObjectName="Order" enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    </table>
    <table tableName="mall_order_item" domainObjectName="OrderItem"
      enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    </table>
    <table tableName="mall_product" domainObjectName="Product" enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    </table>
    <table tableName="mall_user" domainObjectName="User" enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    </table>
  </context>
</generatorConfiguration>


之后就可以双击右边的maven里面的mybatis-generator生成代码了。这一步之前,必须要确保数据库和表都创建好了,并且配置文件也配置好了。


6e1a791ca7674fe185fff89d73347093.png


我们运行好后,会发现这个插件真的帮我们生成好了,点击绿色的箭头就可以切换到dao相对应的xml映射中:


47abe537462a4bfbb61d52eb53afff9d.png


相关文章
|
15天前
|
Java 应用服务中间件 Maven
Spring Boot项目打war包(idea:多种方式)
Spring Boot项目打war包(idea:多种方式)
40 1
|
13天前
|
消息中间件 Java 数据安全/隐私保护
Spring Cloud 项目中实现推送消息到 RabbitMQ 消息中间件
Spring Cloud 项目中实现推送消息到 RabbitMQ 消息中间件
|
15天前
|
Java 应用服务中间件 Spring
【JavaEE】Spring Boot - 项目的创建和使用(下)
【JavaEE】Spring Boot - 项目的创建和使用
18 0
|
15天前
|
数据可视化 Java 应用服务中间件
【JavaEE】Spring Boot - 项目的创建和使用(上)
【JavaEE】Spring Boot - 项目的创建和使用
22 0
|
15天前
|
存储 Java 对象存储
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
10 0
|
15天前
|
Java 关系型数据库 MySQL
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
【Java Spring开源项目】新蜂(NeeBee)商城项目运行、分析、总结
167 4
|
15天前
|
XML Java 数据格式
Spring 项目如何使用AOP
Spring 项目如何使用AOP
28 2
|
15天前
|
Java Spring
Spring boot项目如何发送邮件
Spring boot项目如何发送邮件
21 2
|
15天前
|
Java API 数据安全/隐私保护
【亮剑】如何在Java项目中结合Spring框架实现邮件发送功能
【4月更文挑战第30天】本文介绍了如何在Java项目中结合Spring框架实现邮件发送功能。首先,需在`pom.xml`添加Spring和JavaMail依赖。然后,在`applicationContext.xml`配置邮件发送器,包括SMTP服务器信息。接着,创建一个使用依赖注入的`EmailService`类,通过`JavaMailSender`发送邮件。最后,调用`EmailService`的`sendSimpleEmail`方法即可发送邮件。最佳实践包括:使用配置管理敏感信息,利用`MimeMessage`构造复杂邮件,异常处理和日志记录,以及在大量发送时考虑使用邮件队列。
|
15天前
|
Java Maven Docker
0.07 秒启动一个 SpringBoot 项目!Spring Native 很强!!
0.07 秒启动一个 SpringBoot 项目!Spring Native 很强!!
34 2