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用户,不需要加sudosudo 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"]}EOFsudo systemctl daemon-reloadsudo 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=utf8collation-server=utf8_unicode_ciskip-character-set-client-handshake# 解决mysql连接慢的问题,跳过域名解析skip-name-resolve
2.2.2 mysql8
1. 拉取mysql8的镜像
docker pull mysql:8.0.222. 启动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=utf8collation-server=utf8_unicode_ciskip-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/conftouch /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# 重启redisdocker 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"# 使用rsassh-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。
建库语句:
# mysql8CREATE 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;# mysql5CREATE 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数据库# mysql5CREATE DATABASE IF NOT EXISTS gulimall_admin CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;# mysql8CREATE 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映射文件位置```javapackage 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 {@AutowiredBrandService brandService;@Testvoid 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: rootpassword: 10086url: jdbc:mysql://192.168.190.135:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driver# 配置mybatis-plusmybatis-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: rootpassword: 10086url: jdbc:mysql://192.168.190.135:3306/gulimall_ums?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driver# 配置mybatis-plusmybatis-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")@SpringBootApplicationpublic 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: rootpassword: 10086url: jdbc:mysql://192.168.190.135:3306/gulimall_oms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driver# 配置mybatis-plusmybatis-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")@SpringBootApplicationpublic 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: rootpassword: 10086url: jdbc:mysql://192.168.190.135:3306/gulimall_wms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driver# 配置mybatis-plusmybatis-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")@SpringBootApplicationpublic class GulimallWareApplication {public static void main(String[] args) {SpringApplication.run(GulimallWareApplication.class, args);}}





