项目基于前后端分离的架构进行开发,前后端分离架构总体上包括前端和服务端,通常是多人协作开发
前后端分离开发基于HTTP+JSON交互
通过接口文档(API文档)定义规范
前后端按照文档定义请求及响应数据

YAPI已经在linux虚拟机中准备好了
请求地址:http://192.168.136.160:3000/
用户名/密码:tanhua@itcast.cn/123456
对于接口的定义我们采用YApi进行管理,YApi是一个开源的接口定义、管理、提供mock数据的管理平台。

接口定义:

mock数据,YApi提供了mock功能,就是模拟服务端返回测试数据:

还可以运行http请求(需要在Chrome中安装支持跨域扩展 chrome 安装 yapi 扩展教程 - 掘金):

探花交友项目的开发统一使用提供的Centos7环境,该环境中部署安装了项目所需要的各种服务,如:RabbitMQ,MongoDB、Redis等。
虚拟机的root用户密码为:root123
默认参数:CPU:2核,内存:4G,硬盘:60G
IP地址建议设置为192.168.136.160,否则有些服务将不可用,比如:Redis、RocketMQ等。
由于课程中使用了较多的软件,且之间会有联系,推荐同学IP地址设置为192.168.136.160

仅仅需要修改虚拟机中的子网IP即可。
客户端由前端团队进行开发,前端提供apk进行对接,所以,需要我们安装安卓的模拟器进行测试。
目前对开发者有很多专业的模拟器如genymotion,但是这些模拟器功能强大,空间占用率高并不适用于教学,甚至在某些环境下不能正常的启动。所以可以选择国内的安卓模拟器产品,比如:网易、夜神等,在这里我们推荐使用网易模拟器,其兼容性好、功能完善而且还简洁,但是它不支持虚拟机中安装。

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。postman被500万开发者和超100,000家公司用于每月访问1.3亿个API。
官方网址:Postman
解压资料文件夹中的软件,安装即可

数据库设计规范:详见资料文件夹下《探花交友-mysq表.md》文件
| 数据库表 | 说明 |
|---|---|
| tb_user | 用户表 |
| tb_user_info | 用户详情表 |
| tb_settings | 用户设置表 |
| tb_question | 好友问题表 |
| tb_black_list | 黑名单 |
| tb_announcement | 公告表 |
将资料中数据库表导入到MYSQL中
4.1.1、导入数据库
(1) 打开Navicat ,点击右键选择新建数据库,名字跟我们要导入的数据库的名字一样,字符集一般选utf-8

(2) 在新建的数据库上右击,选择“运行SQL文件”,在提示框中选择文件所在的路径,编码保持一致选择utf-8

(3) 提示Successfully 导入成功后,可能在左侧看不到导入的数据库,关闭Navicat,重新打开即可看到
探花交友学习中,除MySQL数据库部署到本地电脑中。其他涉及到的所有组件都已经以docker形式安装到虚拟机中。我们只需要进入虚拟机,使用简单的命令即可。为了方便学习与减少基础服务占用的学习时间,全部使用docker-compose的方式集中式部署。这些文件在linux虚拟机中的/root/docker-file文件夹下

每个文件夹中都包含一个docker-compose.yml配置文件,一键启动并部署应用。
- #进入组件目录
- cd /root/docker-file/base/
- #执行docker-compose命令
- docker-compose up -d
base
其中包含redis,nacos,yapi,mongo
fastdfs
包含fastdfs操作需要的组件
rmq
包含RabbitMQ需要所有组件
recommend
包含推荐系统需要所有组件
项目依赖环境(需提前安装好)
JDK1.8
Intellij Idea
maven-3.x以上
Git
UTF-8编码格式
设置项目编码格式

设置Maven仓库
设置本地仓库,建议使用资料中提供好的仓库

整体项目使用Maven架构搭建,采用聚合工程形式管理模块,为了便于调用,dubbo需要拆分为接口模块和服务模块

工程主体结构
| 父工程 | 工程名称 | 说明 |
|---|---|---|
| tanhua | tanhua-autoconfig | 自动装配的工具类 |
| tanhua | tanhua-domain | 实体类模块 |
| tanhua | tanhua-dubbo | Dubbo子模块(可以理解为文件夹,管理dubbo模块) |
| tanhua | tanhua-app | 与手机端交互的入口模块 |
| tanhua-dubbo | tanhua-dubbo-interface | Dubbo接口模块 |
| tanhua-dubbo | tanhua-dubbo-db | Dubbo服务模块(数据库部分) |
| tanhua-dubbo | tanhua-dubbo-mongo | Dubbo服务模块(MongoDB部分) |
模块依赖分析

tanhua
- <properties>
- <maven.compiler.source>8maven.compiler.source>
- <maven.compiler.target>8maven.compiler.target>
- <mysql.version>5.1.47mysql.version>
- <jackson.version>2.11.0jackson.version>
- <druid.version>1.0.9druid.version>
- <servlet-api.version>2.5servlet-api.version>
- <jsp-api.version>2.0jsp-api.version>
- <joda-time.version>2.5joda-time.version>
- <commons-lang3.version>3.3.2commons-lang3.version>
- <commons-io.version>1.3.2commons-io.version>
- <mybatis.version>3.5.6mybatis.version>
- <mybatis.mybatis-plus>3.4.1mybatis.mybatis-plus>
- <lombok.version>1.18.8lombok.version>
- <mongo.version>4.0.5mongo.version>
- <spring-cloud.version>Hoxton.SR10spring-cloud.version>
- <spring-cloud-alibaba.version>2.2.5.RELEASEspring-cloud-alibaba.version>
- properties>
-
- <dependencies>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>4.12version>
- <scope>testscope>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- dependency>
- <dependency>
- <groupId>cn.hutoolgroupId>
- <artifactId>hutool-allartifactId>
- <version>5.4.3version>
- dependency>
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>fastjsonartifactId>
- <version>1.2.8version>
- dependency>
- dependencies>
-
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>io.nettygroupId>
- <artifactId>netty-bomartifactId>
- <version>4.1.59.Finalversion>
- <type>pomtype>
- <scope>importscope>
- dependency>
-
- <dependency>
- <groupId>io.projectreactorgroupId>
- <artifactId>reactor-bomartifactId>
- <version>2020.0.4version>
- <type>pomtype>
- <scope>importscope>
- dependency>
-
- <dependency>
- <groupId>io.projectreactor.nettygroupId>
- <artifactId>reactor-nettyartifactId>
- <version>0.9.8.RELEASEversion>
- dependency>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-dependenciesartifactId>
- <version>${spring-cloud.version}version>
- <type>pomtype>
- <scope>importscope>
- dependency>
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-alibaba-dependenciesartifactId>
- <version>${spring-cloud-alibaba.version}version>
- <type>pomtype>
- <scope>importscope>
- dependency>
-
- <dependency>
- <groupId>joda-timegroupId>
- <artifactId>joda-timeartifactId>
- <version>${joda-time.version}version>
- dependency>
-
-
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plusartifactId>
- <version>${mybatis.mybatis-plus}version>
- dependency>
-
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>${mysql.version}version>
- dependency>
-
- <dependency>
- <groupId>org.mongodbgroupId>
- <artifactId>mongodb-driver-syncartifactId>
- <version>${mongodb.version}version>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <optional>trueoptional>
- <version>${lombok.version}version>
- dependency>
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-lang3artifactId>
- <version>${commons-lang3.version}version>
- dependency>
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-lang3artifactId>
- <version>3.7version>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- <version>${jackson.version}version>
- dependency>
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druidartifactId>
- <version>${druid.version}version>
- dependency>
- <dependency>
- <groupId>commons-codecgroupId>
- <artifactId>commons-codecartifactId>
- <version>1.11version>
- dependency>
- dependencies>
- dependencyManagement>
-
- <build>
- <plugins>
-
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-compiler-pluginartifactId>
- <version>3.2version>
- <configuration>
- <source>1.8source>
- <target>1.8target>
- <encoding>UTF-8encoding>
- configuration>
- plugin>
- plugins>
- build>
tanhua-app-server
- <dependencies>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
-
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-data-redisartifactId>
- dependency>
-
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- dependency>
-
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-lang3artifactId>
- dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- dependency>
- <dependency>
- <groupId>commons-codecgroupId>
- <artifactId>commons-codecartifactId>
- dependency>
- <dependency>
- <groupId>joda-timegroupId>
- <artifactId>joda-timeartifactId>
- dependency>
-
-
- <dependency>
- <groupId>io.jsonwebtokengroupId>
- <artifactId>jjwtartifactId>
- <version>0.9.1version>
- dependency>
-
-
- <dependency>
- <groupId>com.github.tobatogroupId>
- <artifactId>fastdfs-clientartifactId>
- <version>1.26.7version>
- <exclusions>
- <exclusion>
- <groupId>ch.qos.logbackgroupId>
- <artifactId>logback-classicartifactId>
- exclusion>
- exclusions>
- dependency>
-
-
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-dubboartifactId>
- dependency>
-
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
-
-
-
- <dependency>
- <groupId>com.itheimagroupId>
- <artifactId>tanhua-dubbo-interfaceartifactId>
- <version>1.0-SNAPSHOTversion>
- dependency>
- <dependency>
- <groupId>com.itheimagroupId>
- <artifactId>tanhua-commonsartifactId>
- <version>1.0-SNAPSHOTversion>
- dependency>
- <dependency>
- <groupId>com.itheimagroupId>
- <artifactId>tanhua-autoconfigartifactId>
- <version>1.0-SNAPSHOTversion>
- dependency>
- dependencies>
-
- <build>
- <finalName>tanhua-app-serverfinalName>
- <plugins>
- <plugin>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-maven-pluginartifactId>
- <version>2.3.9.RELEASEversion>
- plugin>
- plugins>
- build>
tanhua-autoconfig
- <dependencies>
-
- <dependency>
- <groupId>com.aliyungroupId>
- <artifactId>aliyun-java-sdk-coreartifactId>
- <version>4.5.3version>
- dependency>
- <dependency>
- <groupId>com.aliyungroupId>
- <artifactId>dysmsapi20170525artifactId>
- <version>2.0.1version>
- dependency>
-
- <dependency>
- <groupId>com.aliyun.ossgroupId>
- <artifactId>aliyun-sdk-ossartifactId>
- <version>3.10.2version>
- dependency>
-
- <dependency>
- <groupId>com.aliyungroupId>
- <artifactId>facebody20191230artifactId>
- <version>1.0.10version>
- dependency>
-
- <dependency>
- <groupId>com.baidu.aipgroupId>
- <artifactId>java-sdkartifactId>
- <version>4.8.0version>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
- <dependency>
- <groupId>com.easemob.imgroupId>
- <artifactId>im-sdk-coreartifactId>
- <version>0.2.5version>
- dependency>
- <dependency>
- <groupId>com.aliyungroupId>
- <artifactId>aliyun-java-sdk-greenartifactId>
- <version>3.6.1version>
- dependency>
- dependencies>
tanhua-commons
- <dependencies>
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-lang3artifactId>
- dependency>
- <dependency>
- <groupId>commons-codecgroupId>
- <artifactId>commons-codecartifactId>
- dependency>
- <dependency>
- <groupId>joda-timegroupId>
- <artifactId>joda-timeartifactId>
- dependency>
-
- <dependency>
- <groupId>io.jsonwebtokengroupId>
- <artifactId>jjwtartifactId>
- <version>0.9.1version>
- dependency>
- dependencies>
tanhua-dubbo-db
- <dependencies>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
-
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plusartifactId>
- dependency>
-
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plus-boot-starterartifactId>
- <version>${mybatis.mybatis-plus}version>
- dependency>
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- dependency>
-
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druidartifactId>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- dependency>
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-lang3artifactId>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- dependency>
-
- <dependency>
- <groupId>commons-codecgroupId>
- <artifactId>commons-codecartifactId>
- dependency>
-
- <dependency>
- <groupId>joda-timegroupId>
- <artifactId>joda-timeartifactId>
- dependency>
-
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-dubboartifactId>
- dependency>
-
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
-
-
- <dependency>
- <groupId>com.itheimagroupId>
- <artifactId>tanhua-dubbo-interfaceartifactId>
- <version>1.0-SNAPSHOTversion>
- dependency>
- dependencies>
-
- <build>
- <finalName>tanhua-dubbo-dbfinalName>
- <plugins>
- <plugin>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-maven-pluginartifactId>
- <version>2.3.9.RELEASEversion>
- plugin>
- plugins>
- build>
tanhua-dubbo-interface
- <dependencies>
- <dependency>
- <groupId>com.itheimagroupId>
- <artifactId>tanhua-modelartifactId>
- <version>1.0-SNAPSHOTversion>
- dependency>
- dependencies>
tanhua-dubbo-mongo
- <dependencies>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- dependency>
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-lang3artifactId>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- dependency>
-
- <dependency>
- <groupId>commons-codecgroupId>
- <artifactId>commons-codecartifactId>
- dependency>
-
- <dependency>
- <groupId>joda-timegroupId>
- <artifactId>joda-timeartifactId>
- dependency>
-
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-dubboartifactId>
- dependency>
-
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
-
-
- <dependency>
- <groupId>com.itheimagroupId>
- <artifactId>tanhua-commonsartifactId>
- <version>1.0-SNAPSHOTversion>
- dependency>
-
- <dependency>
- <groupId>com.itheimagroupId>
- <artifactId>tanhua-dubbo-interfaceartifactId>
- <version>1.0-SNAPSHOTversion>
- dependency>
- dependencies>
-
- <build>
- <finalName>tanhua-dubbo-dbfinalName>
- <plugins>
- <plugin>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-maven-pluginartifactId>
- <version>2.3.9.RELEASEversion>
- plugin>
- plugins>
- build>
tanhua-model
- <dependencies>
-
-
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plusartifactId>
- dependency>
- dependencies>
tanhua-app-server端添加引导类和配置文件application.yml
- //启动类
- @SpringBootApplication
- public class AppServerApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(AppServerApplication.class,args);
- }
- }
lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码,尤其是针对pojo。
配置安装
导入依赖:
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <optional>trueoptional>
- dependency>
安装IDEA插件: 
如果不安装插件,程序可以正常执行,但是看不到生成的一些代码,如:get、set方法。
常用注解
@Data:注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter:注解在属性上;为属性提供 setting 方法
@Getter:注解在属性上;为属性提供 getting 方法
@Slf4j:注解在类上;为类提供一个 属性名为log 的 slf4j日志对象
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
@Builder:使用Builder模式构建对象
测试一:使用@Data注解

是不是很神奇?!
测试二:使用@Slf4j注解

测试:

测试三:@AllArgsConstructor、@NoArgsConstructor注解的使用

测试四:@Builder

测试结果:
