https://gitee.com/mrlinxi/gulimall 源码地址
一、项目介绍
1.1 项目背景
市面上有 5 种常见的电商模式 B2B、B2B、C2B、C2C、O2O
- B2B(Business to Business),是指商家和商家建立的商业关系,如 阿里巴巴,
- B2C(Business to Consumer) 就是我们经常看到的供应商直接把商品买个用户,即 “商对客” 模式,也就是我们呢说的商业零售,直接面向消费销售产品和服务,如苏宁易购,京东,天猫,小米商城
- C2B (Customer to Business),即消费者对企业,先有消费者需求产生而后有企业生产,即先有消费者提出需求,后又生产企业按需求组织生产
- C2C (Customer to Consumer) 客户之间吧自己的东西放到网上去卖 如 淘宝 咸鱼
- O2O (Online To Offline),也即将线下商务的机会与互联网结合在一起,让互联网成为线下交易前台,线上快速支付,线下优质服务,如:饿了吗,美团,淘票票,京东到家
1.2 项目架构图
1.2.1 微服务架构
1.2.2 微服务划分
二、环境搭建
该项目许多软件都安装在Linux服务器上,这里我们使用虚拟机模拟服务器软件安装,这里使用的是 VMware + CentOS7 + Xshell。 这里就不详细说明虚拟机以及centos的安装过程了,讲道理学到这里的应该或多或少的玩过不少次了。
2.1 安装docker
虚拟化容器技术。Docker基于镜像,可以秒级启动各种容器。每一种容器都是一个完整的运行
环境,容器之间互相隔离。
docker安装文档
2.1.1 删除老版本的docker
# 如果直接是root用户,不需要加sudo
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.1.2 安装依赖包并设置存储库
# 安装依赖包
sudo yum install -y yum-utils
# 设置存储库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
2.1.3 安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
2.1.4 docker的使用以及配置
启动docker: sudo systemctl start docker
root用户不用sudo
检查docker版本:docker -v
查看docker已有镜像:sudo docker images
设置docker开机启动(根据自己需求来):sudo systemctl enable docker
取消docker开机启动: sudo systemctl disable docker
设置国内镜像仓库
docker默认是从docker hub中下载镜像的,但是速度很慢,所以我们需要将镜像仓库切换到国内。这里我们使用阿里云的镜像加速
登陆阿里云,进入控制台-产品与服务-容器镜像服务,复制对应系统的镜像加速语句即可。阿里云镜像加速器
# 在etc下创建docker文件夹
sudo mkdir -p /etc/docker
# 修改配置,设置镜像
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hbxyofct.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.2 通过Docker安装MySql
2.2.1 mysql5
1. 拉取mysql5的镜像
安装对应版本的mysql:sudo docker pull mysql:5.7
如果不加":版本号"
默认下载最新版本。通过docker images
命令可以查看当前所有的镜像。
2. 启动mysql5
sudo docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=10086 \
-d mysql:5.7
# 设置mysql随docker启动,看自己需求
docker update mysql --restart=always
参数说明:
- -p 3306:3306:将容器的3306端口映射到主机的3306端口
- —name:给容器命名
- -v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机
- -v /mydata/mysql/data:/var/lib/mysql:将
- -v /mydata/mysql/conf:/etc/mysql:将配置文件挂载到主机
- -e MYSQL_ROOT_PASSWORD=10086:初始化root用户的密码为root
- -d mysql:5.7:后台运行mysql5.7镜像
3. 修改mysql配置文件
vim /mydata/mysql/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
# 解决mysql连接慢的问题,跳过域名解析
skip-name-resolve
2.2.2 mysql8
1. 拉取mysql8的镜像
docker pull mysql:8.0.22
2. 启动mysql8
```shell sudo docker run -p 3333:3306 —name mysql8 \ -v /mydata/mysql8/log:/var/log/mysql \ -v /mydata/mysql8/data:/var/lib/mysql \ -v /mydata/mysql8/conf:/etc/mysql \ -v /mydata/mysql8/mysql-files:/var/lib/mysql-files \ -e MYSQL_ROOT_PASSWORD=10086 \ -d mysql:8.0.22
设置mysql随docker启动,看自己需求
docker update mysql8 —restart=always
<a name="rcY5Q"></a>
#### 3. 修改mysql配置
`vim /mydata/mysql8/conf/my.cnf`
```shell
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
# 解决mysql连接慢的问题,跳过域名解析
skip-name-resolve
# 修改时区
default-time_zone='+8:00'
注:远程连接mysql8之前需要修改mysql8的密码加密模式,见docker笔记:mysql8远程访问
2.3 通过Docker安装redis
2.3.1. 拉取镜像
2.3.2. 创建配置文件并运行容器
创建redis配置文件目录以及redis.conf配置文件
mkdir -p /mydata/redis-gulimall/conf
touch /mydata/redis-gulimall/conf/redis.conf
新建并运行redis容器
docker run -p 6379:6379 --name redis-gulimall \
-v /mydata/redis-gulimall/data:/data \
-v /mydata/redis-gulimall/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
# 设置redis随docker启动,看自己需求
docker update redis --restart=always
注:这里指定redis-server通过/etc/redis/redis.conf的配置文件启动,但docker挂载容器数据卷的时候如果没有先新建redis.conf文件的话,他会认为redis.conf是一个目录,所以需要提前在宿主机数据卷下建好redis.conf配置文件。
现在配置文件是空的,但是不影响redis 的使用。
测试一下redis:docker exec -it redis-gulimall redis-cli
配置redis持久化——aof(默认是rdb)
修改/mydata/redis-gulimall/conf/redis.conf,在里面添加以下内容:
vim /mydata/redis-gulimall/conf/redis.conf
# 启动aof持久化
appendonly yes
# 直接用这个命令也可以
echo "appendonly yes" >> /mydata/redis-gulimall/conf/redis.conf
# 重启redis
docker restart redis-gulimall
更多配置信息:redis6.2 配置
2.4 Windows开发环境
2.4.1. Maven & jdk
jdk最好是8以上。
maven不管你是什么版本,换源,设置jdk,配置文件在maven的安装目录的conf/settings.xml
# 配置阿里云镜像
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
# 配置jdk,不配也行,在项目的pom文件里指定也可以,我用的jdk1.8
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
<profiles>
2.4.2. IDEA & VsCode(前端要用)
① IDEA 插件
② 下载安装VsCode
安装插件:Auto Close Tag、Auto Rename Tag、Chinese、ESLint、HTML CSS Support、HTML Snippets、JavaScript(ES6) code snippets、Live Server、open in browser、Vetur
2.4.3. 安装配置Git
① 配置git,进入git bash
# 配置用户名
git config --global user.name "username" //(名字)
# 配置邮箱
git config --global user.email "username@email.com" //(注册账号时用的邮箱)
② 配置SSH免密登陆
生成/添加SSH公钥 现在官网上例子是使用ed25519类型的ssh key,我这里用的rsa,在git bash中输入以下命令
# ssh-keygen -t ed25519 -C "xxxxx@xxxxx.com"
# 使用rsa
ssh-keygen -t rsa -C "mrlinxi@vip.qq.com"
# 使用ed25519也可以
ssh-keygen -t ed25519 -C "mrlinxi@vip.qq.com"
注意:这里的 xxxxx@xxxxx.com 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。
现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱
依照提示完成三次回车,即可生成ssh key。通过查看C:\Users\admin\.ssh
目录下会有两个文件,分别对应公钥和私钥
或者直接在git bash中输入cat ~/.ssh/id_rsa.pub
查看公钥(如果不是rsa加密方式,文件名就是id_加密方式.pub
)
然后进入gitee,在设置里面找到SSH公钥,将.pub文件里面的内容复制进去:
添加后,在终端输入ssh -T git@gitee.com
,首次使用需要确认并添加主机到本机SSH可信列表。若返回 Hi XXX! You’ve successfully authenticated, but Gitee.com does not provide shell access. 内容,则证明添加成功。
2.5 环境——从Gitee初始化一个项目
2.5.0. Gitee新建仓库,克隆到本地
2.5.1. 创建微服务
商品服务、仓储服务、订单服务、优惠券服务、用户服务
共同点:
- 依赖 spring web、openfeign
- 服务包名:com.atguigu.gulimall.xxxx(product/order/ware/coupon/member)
- 模块名:
- 优惠券服务:gulimall-coupon
- 用户服务:gulimall-member
- 订单服务:gulimall-order
- 商品服务:gulimall-product
- 仓储服务:gulimall-ware
方式一:单独创建每个微服务,父工程pom聚合
创建各个微服务:
这里每个微服务均通过Spring Initializr创建:
这里我选的SpringBoot是2.5.7,自动关联SpringCloud2020.0.4。
注意:使用Spring Initializr无法选自较低版本的SpringBoot,如要需要使用可以手动更改版本号。
这里还没有使用到SpringCloud Alibaba,(SpringCloud Alibaba 版本对应说明),因为后面要使用到SpringCloud Alibaba的组件,所以在版本选择时最好一步到位。
这里建好后,pom文件里spring-boot-maven-plugin会爆红,加上spring-boot版本 即可。
使用父工程的pom聚合各个微服务:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>gulimall</name>
<description>gulimall</description>
<modules>
<module>gulimall-coupon</module>
<module>gulimall-member</module>
<module>gulimall-order</module>
<module>gulimall-product</module>
<module>gulimall-ware</module>
</modules>
</project>
方式二:多模块开发,通过父pom管理子模块依赖
注:这里我采用通过父工程的pom文件管理子模块的依赖,跟视频中不一样,在SpringCloud中使用的是这种方法,比较简洁
多模块开发中,使用父模块对子模块的管理非常方便(前面Spring Cloud使用的就是这种方式)。
- 父模块pom中的
属性会被子模块继承 - 父模块pom中,在
中可以进行子模块依赖的版本管理,子模块继承父模块之后,提供作用:锁定版本 + 子模块不用再写 version。 - 此外,父模块中可以添加依赖作为全局依赖,子模块自动继承。
外的 中定义全局依赖。
这里参考SpringCloud Alibaba 版本对应说明中的版本,我选择的SpringBoot版本为2.3.12.RELEASE,SpringCloud版本为Hoxton.SR12。
父pom文件:
这里用的版本跟前面一致
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>gulimall-coupon</module>
<module>gulimall-member</module>
<module>gulimall-order</module>
<module>gulimall-product</module>
<module>gulimall-ware</module>
</modules>
<name>gulimall</name>
<description>gulimall</description>
<!-- 这里的属性会被子模块继承 -->
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
<spring.boot.version>2.3.12.RELEASE</spring.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 这里的依赖会被子模块继承 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.7</version>
</plugin>
</plugins>
</build>
</project>
子模块pom文件——以coupon为例
因为子模块继承了父工程的依赖以及版本,因此子模块的pom很简单。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-coupon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-coupon</name>
<description>优惠券模块</description>
</project>
2.5.2. 将各模块纳入版本控制(VCS)
修改父工程的.gitignore文件,设置不需要提交的文件
然后将剩下的文件纳入版本控制
想要提交到Gitee,IDEA还需要安装Gitee的插件,安装好之后便可提交:
commit是提交到本地仓库,commit and push是提交并推送到远程仓库(Gitee/Github)
2.6 数据库初始化
先下PowerDesigner16.5(下不下无所谓,资料提供了所有的sql语句) 下载地址。软件打开gmall_数据库设计.pdm文件
这里面有很多表,那么怎么在数据库中创建这些表呢?
Preview就是全部建表语句。
2.6.1. 建库&建表
共有5个数据库,分别对应5个不同模块
- gulimall_pms:product manage system 商品管理系统对应商品服务gulimall-product;
- gulimall_oms:order manage system 订单管理系统对应订单服务gulimall-order;
- gulimall_wms:ware manage system 库存管理系统对应订单服务gulimall-ware;
- gulimall_sms:sale manage system 营销管理系统对应订单服务gulimall-coupon;
- gulimall_ums:user manage system 用户管理系统对应订单服务gulimall-member;
注意:mysql8跟mysql5的字符集为utf8mb4时,默认的数据库排序规则不同,mysql8是utf8mb4_0900_ai_ci,mysql5是utf8mb4_general_ci。
建库语句:
# mysql8
CREATE DATABASE IF NOT EXISTS gulimall_wms CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE DATABASE IF NOT EXISTS gulimall_oms CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE DATABASE IF NOT EXISTS gulimall_pms CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE DATABASE IF NOT EXISTS gulimall_ums CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE DATABASE IF NOT EXISTS gulimall_sms CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
# mysql5
CREATE DATABASE IF NOT EXISTS gulimall_wms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE IF NOT EXISTS gulimall_oms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE IF NOT EXISTS gulimall_pms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE IF NOT EXISTS gulimall_ums CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE DATABASE IF NOT EXISTS gulimall_sms CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
建表sql:
gulimall_oms.sql gulimall_pms.sql gulimall_sms.sql gulimall_ums.sqlgulimall_wms.sql
三、快速开发——代码生成
通过人人开源生成代码https://gitee.com/renrenio
renren-fast后台管理系统:https://gitee.com/renrenio/renren-fast
renren-fast-vue后台管理系统的前端:https://gitee.com/renrenio/renren-fast-vue
renren-generator逆向工程代码生成器:https://gitee.com/renrenio/renren-generator
使用git clone 将renren-fast和renren-fast-vue克隆到本地,然后将其中的.git目录删除,renren-fast放到我们的项目下。renren-fast-vue之后会使用VSCode打开。
3.1 gulimall中加入renren-fast
在父工程pom中加入<module>renren-fast</module>
然后在renren-fast模块下,有个db文件夹,里面有很多sql文件,复制mysql.sql里面的内容(因为我们用的mysql)。随后在我们的数据库中新建gulimall_admin数据库,执行mysql.sql里面的数据库语句在gulimall_admin库中创建表
# 创建gulimall_admin数据库
# mysql5
CREATE DATABASE IF NOT EXISTS gulimall_admin CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
# mysql8
CREATE DATABASE IF NOT EXISTS gulimall_admin CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
然后可以看到renren-fast的配置文件,里面使用的dev配置文件。
修改dev配置文件中的数据库配置,我们要连的是虚拟机docker容器中的数据库:
注意这里我加上了&useSSL=false,不然启动报错communication link failure。
注:这里启动可能会报错 You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled. 解决方式:https://blog.csdn.net/wanniwa/article/details/109155143
等启动完成,访问http://localhost:8080/renren-fast/,出现以下json字符串表示访问成功。因为这里只是个后台,我们需要通过renren-fast-vue前台访问。
注意:renren-fast的pom文件会报很多红色的错误,这个并不影响启动;同时如果renrne-fast的java代码中爆红,原因是项目有没加入jdk。在Project Structure的SDKs中加入jdk即可。
3.2 通过VSCode运行renren-fast-vue
3.2.1 安装前端框架需要环境
安装node.js
我们关注与 node.js 的 npm 功能就行;NPM 是随同 NodeJS 一起安装的包管理工具,JavaScript-NPM,Java-Maven;
安装参考博客
直接百度下载安装即可(视频里面用的是10.16.3 最好下一样的版本 https://nodejs.org/dist/v10.16.3/,下msi文件)。nodejs安装好后(自动添加了环境变量),下载的插件文件和混存文件默认保存在C:\Users\admin\AppData\Roaming路径下,我不想让他放在C盘,所以这里设置了这些文件保存的默认路径,在CMD下执行如下语句(自己把文件夹建好,建议放在nodejs的安装目录下):
npm config set prefix "H:\DevelopmentTools\nodejs\node_global"
npm config set cache "H:\DevelopmentTools\nodejs\node_cache"
- 随后,编辑用户变量里的Path,将响应的npm路径修改为上面设置的node_global路径;
- 在系统变量中新建一个变量名NODE_PATH,值为node_modules的路径(位于nodejs的安装目录下)
安装后在cmd中输入node -v npm -v检查是否安装成功。
配置npm使用淘宝镜像:npm config set registry https://registry.npm.taobao.org
配置之后验证是否成功(返回刚刚设置的地址即成功):npm config get registry
安装完node.js后,打开VSCode,使用VSCode打开renren-fast-vue,进入控制台,在终端中输入:npm install (让npm去下载我们前端项目依赖的组件)
踩坑:npm install
报错:无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查。
通过管理员权限启动VSCode,然后删除当前终端,重开一个。
报错:
这里缺少了python,需要安装python3.0以上,并配置全局变量。我之前有装过anaconda,所以直接配置anaconda带的python,没有的下一个python配置全局变量。(但是我在另一台电脑上没有装python也ok了很迷,可能是我直接把装好的文件拷到另一台电脑上了)
运行前端服务
在终端中输入npm run dev
即可运行前端项目。
可以看到前端刷验证码,后端有日志输出:
我们来登陆一下,默认账号密码都是admin
3.3 renren-generator代码生成器
renren-generator可以为我们每个微服务生成基本的CRUD代码。将https://gitee.com/renrenio/renren-generator.git克隆到本地。然后删除.git文件夹,随后将其放到我们自己的项目中来。父工程pom <module>renren-generator</module>
3.3.0 通过generator生成product模块的代码
为了给每个模块生成基本的CRUD代码,我们需要修改renren-generator中的配置文件application.yml:
generator.properties:
随后启动,默认通过80端口访问,生成全部代码:
我们会得到一个压缩包,里面有一个main文件夹和很多sql文件。
在main\resources\mapper文件夹下有一个与模块同名的文件夹里面是所有的SQL映射文件。
在main\java\com\atguigu\gulimall\gulimallproduct,文件夹下生成了controller、dao、entity、service等代码。
然后我们将生成的整个main文件夹粘贴到对应微服务的src目录下。可以看到MVC层的代码都生成好了,但是报错,目前都不能使用(因为缺少对应的依赖)。
这里缺少公共工具类,以及一些依赖。
3.4 创建common模块存放公共类
3.4.0 创建common模块
创建一个gulimall-common的maven模块。我们想将每一个微服务模块中,公共的类以及依赖放到common中。
在common模块下新建com.atguigu.commom.utils包,从renren-fast的io.renren.common.utils包下复制PageUtils、Query、R、Constant这几个类过来。
直接将renren-fast下的xss文件夹复制到com.atguigu.commom.utils包下(删除XssFilter
和XssHttpServletRequestWrapper
),然后在Query中改一下SQLFilter的包,改成我们自己的。同样的将renren-fast下的exception包下的RRException复制到com.atguigu.commom.utils.exception包下,然后重新在SQLFilter中导一下RRException的包。
3.4.1 父工程pom
mysql5.7没有对应的mysql-java-connector驱动,官方解释可以直接用mysql8。
后面考虑到要使用spring gateway需要将spring-boot-starter-web剔除,这里把父工程中的spring-boot-starter-web
和spring-cloud-starter-openfeign
依赖都放到common模块中去(其实把openfeign放到common中就可以了,因为只有web不需要引入到gateway中)。这样在后面创建gateway模块时,引入common直接exclusion掉web即可。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>gulimall</name>
<description>gulimall</description>
<modules>
<module>gulimall-coupon</module>
<module>gulimall-member</module>
<module>gulimall-order</module>
<module>gulimall-product</module>
<module>gulimall-ware</module>
<module>renren-fast</module>
<module>renren-generator</module>
<module>gulimall-common</module>
</modules>
<!-- 这里的属性会被子模块继承 -->
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.4</spring-cloud.version>
<spring.boot.version>2.5.7</spring.boot.version>
<mybatis-plus.version>3.4.2</mybatis-plus.version>
<lombok.version>1.18.20</lombok.version>
<http.components.version>4.4.13</http.components.version>
<commons.lang.version>2.6</commons.lang.version>
<mysql.version>8.0.22</mysql.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--mybatis plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>${http.components.version}</version>
</dependency>
<!--commons-lang-->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons.lang.version}</version>
</dependency>
<!--mysql-java-connector-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--这里的依赖会被子模块继承,为了后面使用gateway,把web和openfeign放到common模块中-->
<dependencies>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-web</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-openfeign</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.4.2 common模块pom
<?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">
<parent>
<artifactId>gulimall</artifactId>
<groupId>com.atguigu.gulimall</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gulimall-common</artifactId>
<description>每一个微服务公共的依赖,bean,工具类等</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!--公共依赖,版本仍然通过父工程pom控制-->
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--mybatis plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--httpcore -> HttpStatus-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.13</version>
</dependency>
<!--commons-lang-->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
</dependency>
<!--导入mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
3.4.3 product模块引入common依赖
gulimall-product模块的pom文件中引入common的依赖。
注:我这里跟视频里面不一样,我是通过父工程的pom来管理各个子模块的依赖版本,然后在common模块中引入公共依赖,通过依赖的传递性其他模块直接依赖common模块即可。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.atguigu.gilumall</groupId>
<artifactId>gulimall-product</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-product</name>
<description>gulimall-product</description>
<dependencies>
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
3.4.3 调整代码生成规则
现在gulimall-product模块中只有controller报错,原因是代码生成的时候使用了shiro。
现在我们来看renren-generator下resource/template目录下的Controller.java.vm文件(这个文件就是用来生成controller类的,同文件夹下其他文件类似)
我们将@RequiresPermission注解都注释掉,别忘了最上面导入的包也要注释。(这个文件里面用快捷键注释是’##’,生成的代码会略过注释内容,如果想要生成的代码有注释内容用’//‘注释)
注释掉以后,生成的代码就不会有shiro的注解了。
随后我们重启逆向工程,重新生成一下代码。然后用新生成的controller替换掉product模块中的controller。这样我们的gulimall-product模块的逆向代码生成就完成了。
3.6 测试gulimall-product模块
3.6.0 整合MybatisPlus
整合mybatisplus:
- 导入依赖:common中已经导入了mybatis-plus-boot-starter,mysql驱动在common中引入过了
application.yml
```yaml配置数据源
spring: datasource: username: root password: 10086 url: jdbc:mysql://192.168.190.135:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver
配置mybatis-plus
mybatis-plus: mapper-locations: classpath:/mapper/*/.xml # 配置sql映射目录 global-config: db-config: id-type: auto # 配置主键自增
server: port: 10000
<a name="EL2xw"></a>
#### 主启动
使用@MapperScanner告诉MyBatis-Plus,Sql映射文件位置
```java
package com.atguigu.gulimall.gulimallproduct;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan(value = "com.atguigu.gulimall.gulimallproduct.dao")
public class GulimallProductApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallProductApplication.class, args);
}
}
3.6.1 测试
增加华为品牌
package com.atguigu.gilumall.gulimallproduct;
import com.atguigu.gulimall.gulimallproduct.GulimallProductApplication;
import com.atguigu.gulimall.gulimallproduct.entity.BrandEntity;
import com.atguigu.gulimall.gulimallproduct.service.BrandService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
// 这里必须要指明class,不然autowired报错
// 我尝试用了Resource,编译不报错,运行报错
@SpringBootTest(classes = GulimallProductApplication.class)
class GulimallProductApplicationTests {
@Autowired
BrandService brandService;
@Test
void contextLoads() {
//测试插入
// BrandEntity brandEntity = new BrandEntity();
// brandEntity.setName("华为");
// brandService.save(brandEntity);
// System.out.println("保存成功!");
//测试更新
// BrandEntity brandEntity = new BrandEntity();
// brandEntity.setBrandId(1L);
// brandEntity.setDescript("华为1");
// brandService.updateById(brandEntity);
//测试查询
List<BrandEntity> brand_id = brandService.list(new QueryWrapper<BrandEntity>().eq("brand_id", 1L));
brand_id.forEach(System.out::println);
}
}
@SpringBootTest注解不指明class报错:
指明后测试:插入成功,修改成功,查询成功
3.7 生成其他模块的代码
3.7.1 gulimall-coupon模块
使用generator生成代码
生成其他模块的代码只需要在renren-generator中修改application.yml文件中数据库url的数据库,和generator.properties文件中的模块信息即可,参考生成product模块代码
将生成代码的main直接复制到gulimall-coupon模块中。
pom
修改pom文件,引入common模块依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-coupon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-coupon</name>
<description>优惠券模块</description>
<dependencies>
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
yml
# 配置数据源
spring:
datasource:
username: root
password: 10086
url: jdbc:mysql://192.168.190.135:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
# 配置mybatis-plus
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml # 配置sql映射目录
global-config:
db-config:
id-type: auto # 配置主键自增
server:
port: 7000
主启动
package com.atguigu.gulimall.gulimallcoupon;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.atguigu.gulimall.gulimallcoupon.dao")
public class GulimallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallCouponApplication.class, args);
}
}
测试
启动coupon微服务,访问http://localhost:8080/gulimallcoupon/coupon/list
这里我有个疑问,dao接口上都是有mapper注解的,讲道理不需要在主启动类上加mapperscan注解。但是如果不在主启动类上加mapperscan注解,便无法对数据库进行操作。
3.7.2 gulimall-member模块
使用generator生成代码
生成代码,将main文件夹直接复制到gulimall-member模块中。
pom
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-member</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-member</name>
<description>gulimall-member</description>
<dependencies>
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
yml
# 配置数据源
spring:
datasource:
username: root
password: 10086
url: jdbc:mysql://192.168.190.135:3306/gulimall_ums?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
# 配置mybatis-plus
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml # 配置sql映射目录
global-config:
db-config:
id-type: auto # 配置主键自增
server:
port: 8000
主启动
package com.atguigu.gulimall.gulimallmember;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.atguigu.gulimall.gulimallmember.dao")
@SpringBootApplication
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
测试
访问:http://localhost:8000/gulimallmember/growthchangehistory/list
3.7.3 gulimall-order模块
使用generator生成代码
生成代码,将main文件夹直接复制到gulimall-order模块中。
pom
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-order</name>
<description>gulimall-order</description>
<dependencies>
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
yml
server:
port: 9000
# 配置数据源
spring:
datasource:
username: root
password: 10086
url: jdbc:mysql://192.168.190.135:3306/gulimall_oms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
# 配置mybatis-plus
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml # 配置sql映射目录
global-config:
db-config:
id-type: auto # 配置主键自增
主启动
package com.atguigu.gulimall.gulimallorder;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.atguigu.gulimall.gulimallorder.dao")
@SpringBootApplication
public class GulimallOrderApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallOrderApplication.class, args);
}
}
测试
访问:http://localhost:9000/gulimallorder/order/list
3.7.4 gulimall-ware模块
使用generator生成代码
pom
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-ware</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-ware</name>
<description>gulimall-ware</description>
<dependencies>
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
yml
server:
port: 11000
# 配置数据源
spring:
datasource:
username: root
password: 10086
url: jdbc:mysql://192.168.190.135:3306/gulimall_wms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
# 配置mybatis-plus
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml # 配置sql映射目录
global-config:
db-config:
id-type: auto # 配置主键自增
主启动
package com.atguigu.gulimall.gulimallware;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.atguigu.gulimall.gulimallware.dao")
@SpringBootApplication
public class GulimallWareApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallWareApplication.class, args);
}
}