系列文章目录
1.项目介绍及环境配置
2. 短信验证码登录
3. 用户信息
4. MongoDB
5. 推荐好友列表/MongoDB集群/动态发布与查看
6. 圈子动态/圈子互动
7. 即时通讯(基于第三方API)
8. 附近的人(百度地图APi)
9. 小视频
10.网关配置
11.后台管理
文章目录
- 系列文章目录
- 一、项目介绍
- 1. 功能
- 2. 技术选型
- 3. 页面预览
- ⑴. 登录
- ⑵. 交友(主页)
- ⑶. 探花
- ⑷. 搜附件
- ⑸. 桃花传音
- ⑹. 测灵魂
- ⑺. 圈子
- ⑻. 消息
- ⑼. 小视频
- ⑽. 我的
- 二、开发工具
- 1. YAPI
- 2. Android模拟器
- 3. 调试工具PostMan
- 4. 项目镜像
- ⑴. 资源下载
- ⑵. 虚拟机配置
- ⑶. FinalShell
- 5. IDEA配置
- ⑴. JDK1.8
- ⑵. 设置项目编码格式
- ⑶. 设置Maven仓库
- 6. MYSQL数据库
- 三、项目搭建
- 1. 创建项目
- 2. 主题结构
- 3. 模块依赖
- ⑴. tanhua
- ⑵. tanhua-app-server
- ⑶. tanhua-autoconfig
- ⑷. tanhua-commons
- ⑸. tanhua-dubbo-db
- ⑹. tanhua-dubbo-interface
- ⑺. tanhua-dubbo-mongo
- ⑻. tanhua-model
- 4. Lombok
- 5. 常用注解
- ⑴. @Data注解
- ⑵. @Slf4j注解
- ⑶. @AllArgsConstructor、@NoArgsConstructor注解
- ⑷. @Builder
一、项目介绍
探花交友是一个移动端陌生人社交App
1. 功能
功能 | 说明 | 备注 |
---|---|---|
注册、登录 | 用户无需单独注册,直接通过手机号登录即可 | 首次登录成功后需要完善个人信息 |
交友 | 主要功能有:测灵魂、桃花传音、搜附近、探花等 | |
圈子 | 类似微信朋友圈,用户可以发动态、查看好友动态等 | |
消息 | 通知类消息 + 即时通讯消息 | |
小视频 | 类似抖音,用户可以发小视频,评论等 | 显示小视频列表需要进行推荐算法计算后进行展现。 |
我的 | 我的动态、关注数、粉丝数、通用设置等 |
2. 技术选型
前端:
- flutter + android + 环信SDK + redux + shared_preferences + connectivity + iconfont + webview + sqflite
后端:
- Spring Boot + SpringMVC + Mybatis + MybatisPlus + Dubbo
- Elasticsearch geo 实现地理位置查询
- MongoDB 实现海量数据的存储
- Redis 数据的缓存
- Spark + MLlib 实现智能推荐
- 第三方服务 环信即时通讯
- 第三方服务 阿里云 OSS 、 短信服务
- 第三方服务 虹软开放平台 / 阿里云
技术解决方案
- 使用Elasticsearch geo实现附近的人的解决方案
- 使用Spark + Mllib实现智能推荐的解决方案
- 使用MongoDB进行海量数据的存储的解决方案
- 使用采用分布式文件系统存储小视频数据的解决方案
- 使用百度人脸识别的解决方案
- 使用阿里云进行短信验证码发送的解决方案
3. 页面预览
⑴. 登录
用户通过手机验证码进行登录,如果是第一次登录则需要完善个人信息,在上传图片时,需要对上传的图片做人像的校验,防止用户上传非人像的图片作为头像。流程完成后,则登录成功。
⑵. 交友(主页)
交友是探花项目的核心功能之一,用户可以查看好友,添加好友,搜索好友等操作;还有引导功能:今日佳人、推荐、最近访客…
⑶. 探花
左划喜欢,右划不喜欢,每天限量不超过100个,开通会员可增加限额。双方互相喜欢则配对成功
⑷. 搜附件
根据用户当前所在的位置进行查询,并且在10km的范围内进行查询,可以通过筛选按钮进行条件筛选
⑸. 桃花传音
功能类似QQ中的漂流瓶,用户可以发送和接收语音消息,陌生人就会接收到消息
⑹. 测灵魂
测试题用于对用户进行分类,每次提交答案后更新用户属性
⑺. 圈子
推荐频道为根据问卷及喜好推荐相似用户动态
⑻. 消息
消息包含通知类的消息和好友消息
⑼. 小视频
用户可以上传小视频,也可以查看小视频列表,并且可以进行点赞操作
⑽. 我的
显示关注数、喜欢数、粉丝数、我的动态等信息
二、开发工具
1. YAPI
本项目采用 YApi 作为API接口管理,开源的接口定义、管理、提供mock数据的管理平台
请求地址: http://192.168.136.160:3000
用户名/密码: tanhua@itcast.cn / 123456
2. Android模拟器
网易MUMU安卓模拟器下载地址: https://mumu.163.com/
操作: 点击 更多 -> 安装 -> 选择app-1104-真机
网盘资源地址(不需要密码):
3. 调试工具PostMan
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。postman被500万开发者和超100,000家公司用于每月访问1.3亿个API。
官方网址: https://www.postman.com/
4. 项目镜像
⑴. 资源下载
项目使用的是Centos7环境,该环境中部署安装了项目所需要的各种服务,如:RabbitMQ,MongoDB、Redis等。
网盘资源地址(不需要密码):
- 虚拟机的用户名和密码:root / root123
- 默认参数:CPU:2核,内存(内存不足可以调整):
4G
,硬盘:60G - 网关IP为(需要修改):
192.168.136.160
⑵. 虚拟机配置
– 通过 VMware 打开 centos7.vmx
文件
– 编辑 虚拟网络编辑器
子网IP地址: 改为 192.160.136.0
⑶. FinalShell
除MySQL数据库部署到本地电脑中。其他涉及到的所有组件都已经以docker形式安装到虚拟机中。全部使用docker-compose的方式集中式部署
每个文件夹中都包含一个docker-compose.yml配置文件,一键启动并部署应用
通过 FinalShell 链接虚拟机,开启项目所需的环境依赖
# 开始 项目所需环境cd /root/docker-file/base/docker-compose up -d
5. IDEA配置
- JDK1.8
- Intellij Idea
- maven-3.x以上
- Git
- UTF-8编码格式
⑴. JDK1.8
网盘资源地址(不需要密码):
⑵. 设置项目编码格式
⑶. 设置Maven仓库
6. MYSQL数据库
– 打开 Navicat
,点击右键选择新建数据库,字符集选utf-8
– 如果连接不上localhost,检查本地 mysql 服务是否启动
– 在新建的数据库上右击,选择“运行SQL文件”,在提示框中选择文件所在的路径,编码保持一致选择utf-8
网盘资源地址(不需要密码):
– 数据库表
数据库表 | 说明 |
---|---|
tb_user | 用户表 |
tb_user_info | 用户详情表 |
tb_settings | 用户设置表 |
tb_question | 好友问题表 |
tb_black_list | 黑名单 |
tb_announcement | 公告表 |
三、项目搭建
GItee仓库地址: https://gitee.com/yuan0_0/tanhua_20220918.git
1. 创建项目
Spring Initializr 官网: https://start.spring.io/
创建一个Spring初始项目:
2. 主题结构
整体项目使用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部分) |
3. 模块依赖
⑴. tanhua
编辑 pom.xml
文件:
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <mysql.version>5.1.47</mysql.version> <jackson.version>2.11.0</jackson.version> <druid.version>1.0.9</druid.version> <servlet-api.version>2.5</servlet-api.version> <jsp-api.version>2.0</jsp-api.version> <joda-time.version>2.5</joda-time.version> <commons-lang3.version>3.3.2</commons-lang3.version> <commons-io.version>1.3.2</commons-io.version> <mybatis.version>3.5.6</mybatis.version> <mybatis.mybatis-plus>3.4.1</mybatis.mybatis-plus> <lombok.version>1.18.8</lombok.version> <mongo.version>4.0.5</mongo.version> <spring-cloud.version>Hoxton.SR10</spring-cloud.version> <spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version></properties><dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.8</version> </dependency></dependencies><dependencyManagement> <dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-bom</artifactId> <version>4.1.59.Final</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-bom</artifactId> <version>2020.0.4</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>io.projectreactor.netty</groupId> <artifactId>reactor-netty</artifactId> <version>0.9.8.RELEASE</version> </dependency> <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>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>${joda-time.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>${mybatis.mybatis-plus}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-sync</artifactId> <version>${mongodb.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> <version>${lombok.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency> </dependencies></dependencyManagement><build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins></build>
⑵. tanhua-app-server
编辑 tanhua-app-server/pom.xml
文件:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.7</version> <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- nacos配置中心依赖支持 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config --> <!--RabbitMQ org.springframework.boot spring-boot-starter-amqp --> <dependency> <groupId>com.itheima</groupId> <artifactId>tanhua-dubbo-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.itheima</groupId> <artifactId>tanhua-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.itheima</groupId> <artifactId>tanhua-autoconfig</artifactId> <version>1.0-SNAPSHOT</version> </dependency></dependencies><build> <finalName>tanhua-app-server</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.9.RELEASE</version> </plugin> </plugins></build>
⑶. tanhua-autoconfig
编辑 tanhua-autoconfig/pom.xml
文件:
<dependencies> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>dysmsapi20170525</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>facebody20191230</artifactId> <version>1.0.10</version> </dependency> <dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.8.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.easemob.im</groupId> <artifactId>im-sdk-core</artifactId> <version>0.2.5</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-green</artifactId> <version>3.6.1</version> </dependency></dependencies>
⑷. tanhua-commons
编辑 tanhua-commons/pom.xml
文件:
<dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency></dependencies>
⑸. tanhua-dubbo-db
编辑 tanhua-dubbo-db/pom.xml
文件:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis.mybatis-plus}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- nacos配置中心依赖支持 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config --> <dependency> <groupId>com.itheima</groupId> <artifactId>tanhua-dubbo-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency></dependencies><build> <finalName>tanhua-dubbo-db</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.9.RELEASE</version> </plugin> </plugins></build>
⑹. tanhua-dubbo-interface
编辑 tanhua-dubbo-interface/pom.xml
文件:
<dependencies> <dependency> <groupId>com.itheima</groupId> <artifactId>tanhua-model</artifactId> <version>1.0-SNAPSHOT</version> </dependency></dependencies>
⑺. tanhua-dubbo-mongo
编辑 tanhua-dubbo-mongo/pom.xml
文件:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- nacos配置中心依赖支持 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config --> <dependency> <groupId>com.itheima</groupId> <artifactId>tanhua-commons</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.itheima</groupId> <artifactId>tanhua-dubbo-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency></dependencies><build> <finalName>tanhua-dubbo-db</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.9.RELEASE</version> </plugin> </plugins></build>
⑻. tanhua-model
编辑 tanhua-model/pom.xml
文件:
<dependencies> <!--SpringDataMongo起步依赖 org.springframework.boot spring-boot-starter-data-mongodb org.mongodb mongodb-driver-sync ${mongodb.version} --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> </dependency></dependencies>
4. Lombok
lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码,尤其是针对pojo。
Lombok官网: https://projectlombok.org/
导入依赖:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional></dependency>
安装IDEA插件:
5. 常用注解
- @Data: 注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
- @Setter: 注解在属性上;为属性提供 setting 方法
- @Getter: 注解在属性上;为属性提供 getting 方法
- @Slf4j: 注解在类上;为类提供一个 属性名为log 的 slf4j日志对象
- @NoArgsConstructor: 注解在类上;为类提供一个无参的构造方法
- @AllArgsConstructor: 注解在类上;为类提供一个全参的构造方法
- @Builder: 使用Builder模式构建对象
⑴. @Data注解
⑵. @Slf4j注解
⑶. @AllArgsConstructor、@NoArgsConstructor注解
⑷. @Builder