PRO
Echo 论坛项目教程
Echo 是一套前后端不分离的社区系统,基于目前主流 Java Web 技术栈(SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + …),并提供详细的开发文档和配套教程。包含帖子、评论、私信、系统通知、点赞、关注、搜索、用户设置、数据统计等模块。
<img width="" src="https://cs-wiki.oss-cn-shanghai.aliyuncs.com/33.png" >
@[toc]
---
# Echo — 基于 SpringBoot 的论坛系统
## 项目简介
Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java Web 技术栈(SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ...),并提供详细的开发文档和配套教程。包含帖子、评论、私信、系统通知、点赞、关注、搜索、用户设置、数据统计等模块。
**源码链接**:已托管在 Github 和 Gitee:
- Gitee:[https://gitee.com/veal98/Echo](https://gitee.com/veal98/Echo)(Gitee 官方推荐项目)
- Github:[https://github.com/Veal98/Echo](https://github.com/Veal98/Echo)
## 核心技术栈
后端:
- Spring
- Spring Boot 2.1.5 RELEASE
- Spring MVC
- ORM:MyBatis
- 数据库:MySQL 5.7
- 分布式缓存:Redis
- 本地缓存:Caffeine
- 消息队列:Kafka 2.13-2.7.0
- 搜索引擎:Elasticsearch 6.4.3
- 安全:Spring Security
- 邮件任务:Spring Mail
- 分布式定时任务:Spring Quartz
- 日志:SLF4J(日志接口) + Logback(日志实现)
前端:
- Thymeleaf
- Bootstrap 4.x
- Jquery
- Ajax
## 开发环境
- 操作系统:Windows 10
- 构建工具:Apache Maven
- 集成开发工具:Intellij IDEA
- 应用服务器:Apache Tomcat
- 接口测试工具:Postman
- 压力测试工具:Apache JMeter
- 版本控制工具:Git
- Java 版本:8
## 界面展示
首页:

登录页:

密码重置页:

帖子发布页(支持 MarkDown):

帖子详情页(MarkDown 渲染):

帖子详情页:

个人主页:

朋友私信页:

私信详情页:

系统通知页:

通知详情页:

账号设置页:

数据统计页:

搜索详情页:

## 功能列表

- [x] **注册**
- [x] **登录 | 登出**
- 动态生成验证码
- 记住我
- 忘记密码
- [x] **账号设置**
- 修改头像
- 修改密码
- [x] **过滤敏感词**
- 前缀树
- [x] **帖子模块**
- 发布帖子(过滤敏感词),支持 Markdown 格式
- 分页显示所有的帖子
- 支持按照 “发帖时间” 显示
- 支持按照 “热度排行” 显示(Spring Quartz)
- 查看帖子详情
- 权限管理(Spring Security + Thymeleaf Security)
- 未登录用户无法发帖
- “版主” 可以看到帖子的置顶和加精按钮并执行相应操作
- “管理员” 可以看到帖子的删除按钮并执行相应操作
- “普通用户” 无法看到帖子的置顶、加精、删除按钮,也无法执行相应操作
- [x] **评论模块**
- 发布对帖子的评论(过滤敏感词)
- 分页显示评论
- 发布对评论的回复(过滤敏感词)
- 权限管理(Spring Security)
- 未登录用户无法使用评论功能
- [x] **私信模块**
- 发送私信(过滤敏感词)
- 私信列表
- 查询当前用户的会话列表
- 每个会话只显示一条最新的私信
- 支持分页显示
- 私信详情
- 查询某个会话所包含的所有私信
- 访问私信详情时,将显示的私信设为已读状态
- 支持分页显示
- 权限管理(Spring Security)
- 未登录用户无法使用私信功能
- [x] **统一处理 404 / 500 异常**
- 普通请求异常
- 异步请求异常
- [x] **统一记录日志**
- [x] **点赞模块**
- 支持对帖子、评论/回复点赞
- 第 1 次点赞,第 2 次取消点赞
- 首页统计帖子的点赞数量
- 详情页统计帖子和评论/回复的点赞数量
- 详情页显示当前登录用户的点赞状态(赞过了则显示已赞)
- 统计我的获赞数量
- 权限管理(Spring Security)
- 未登录用户无法使用点赞相关功能
- [x] **关注模块**
- 关注功能
- 取消关注功能
- 统计用户的关注数和粉丝数
- 我的关注列表(查询某个用户关注的人),支持分页
- 我的粉丝列表(查询某个用户的粉丝),支持分页
- 权限管理(Spring Security)
- 未登录用户无法使用关注相关功能
- [x] **系统通知模块**
- 通知列表
- 显示评论、点赞、关注三种类型的通知
- 通知详情
- 分页显示某一类主题所包含的通知
- 进入某种类型的系统通知详情,则将该页的所有未读的系统通知状态设置为已读
- 未读数量
- 分别显示每种类型的系统通知的未读数量
- 显示所有系统通知的未读数量
- 导航栏显示所有消息的未读数量(未读私信 + 未读系统通知)
- 权限管理(Spring Security)
- 未登录用户无法使用系统通知功能
- [x] **搜索模块**
- [x] **网站数据统计**(管理员专属)
- 独立访客 UV
- 支持单日查询和区间日期查询
- 日活跃用户 DAU
- 支持单日查询和区间日期查询
- 权限管理(Spring Security)
- 只有管理员可以查看网站数据统计
- [x] **优化网站性能**
- 处理每次请求时,都要通过拦截器根据登录凭证查询用户信息,访问的频率非常高。因此将已成功登录的用户信息在缓存 Redis 中保存一段时间,查询用户信息的时候优先从缓存中取值;若缓存中没有该用户信息,则将其存入缓存;用户信息变更时清除对应的缓存数据
- 引入本地缓存 Caffeine,缓存热帖列表和帖子的总数,提升响应速度(可以进一步采用二级缓存架构)
## 本地运行
各位如果需要将项目部署在本地进行测试,以下环境请提前备好:
- Java 8
- MySQL 5.7
- Redis
- Kafka 2.13-2.7.0
- Elasticsearch 6.4.3
然后**修改配置文件中的信息为你自己的本地环境,直接运行是运行不了的**,而且相关私密信息我全部用 xxxxxxx 代替了。
本地运行需要修改的配置文件信息如下:
1)`application-develop.properties`:
- MySQL
- Spring Mail(邮箱需要开启 SMTP 服务)
- Kafka:consumer.group-id(该字段见 Kafka 安装包中的 consumer.proerties,可自行修改, 修改完毕后需要重启 Kafka)
- Elasticsearch:cluster-name(该字段见 Elasticsearch 安装包中的 elasticsearch.yml,可自行修改)
- 七牛云(需要新建一个七牛云的对象存储空间,用来存放上传的头像图片)
2)`logback-spring-develop.xml`:
- LOG_PATH:日志存放的位置
每次运行需要打开:
- MySQL
- Redis
- Elasticsearch
- Kafka
另外,还需要事件建好数据库 greatecommunity,然后依次运行项目 sql 文件夹下的这几个 sql 文件建立数据库表:
<img src="https://cs-wiki.oss-cn-shanghai.aliyuncs.com/20210217134928.png" style="width:386px" />
## 部署架构
可以部署在同一台服务器上,以下是理想的部署架构:
<img src="https://cs-wiki.oss-cn-shanghai.aliyuncs.com/20210211204207.png" />
