项目简介
Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java Web 技术栈(SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ...),并提供详细的开发文档和配套教程。包含帖子、评论、私信、系统通知、点赞、关注、搜索、用户设置、数据统计等模块。
功能
技术栈
后端:
-
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
功能逻辑图
注册
-
用户注册成功,将用户信息存入 MySQL,但此时该用户状态为未激活
-
向用户发送激活邮件,用户点击链接则激活账号(Spring Mail)
登录 | 登出
登录认证模块跳过了 Spring Secuity 自带的认证机制。主要逻辑如下:
-
进入登录界面,随机生成一个字符串来标识这个将要登录的用户,将这个字符串短暂的存入 Cookie(60 秒);
-
动态生成验证码,并将验证码及标识该用户的字符串短暂存入 Redis(60 秒);
-
为登录成功(验证用户名、密码、验证码)的用户随机生成登录凭证且设置状态为有效,并将登录凭证及其状态等信息永久存入 Redis,再在 Cookie 中存一份登录凭证;
-
使用拦截器在所有的请求执行之前,从 Cookie 中获取登录凭证,只要 Redis 中该凭证有效并在有效期内,本次请求就会一直持有该用户信息(使用 ThreadLocal 持有用户信息,保证多台服务器上用户的登录状态同步);
-
勾选记住我,则延长 Cookie 中登录凭证的有效时间;
-
用户登出,将凭证状态设为无效,并更新 Redis 中该登录凭证的相关信息。下图是登录模块的功能逻辑图,并没有使用 Spring Security 提供的认证逻辑(我觉得这个模块是最复杂的,这张图其实很多细节还没有画全)
发布帖子(异步请求)
发布帖子(过滤敏感词),将其存入 MySQL
添加评论(事务管理)
发布对帖子的评论(过滤敏感词),将其存入 MySQL
发送私信(异步请求)
点赞(异步请求)
将点赞相关信息存入 Redis 的数据结构 set 中。其中,key 命名为 like:entity:entityType:entityId,value 即点赞用户的 id。比如 key = like:entity:2:246 value = 11 表示用户 11 对实体类型 2 即评论进行了点赞,该评论的 id 是 246
某个用户的获赞数量对应的存储在 Redis 中的 key 是 like:user:userId,value 就是这个用户的获赞数量
搜索
-
发布事件
-
发布帖子时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
-
为帖子增加评论时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
-
搜索服务
-
Elasticsearch 服务器搜索帖子
-
从 Elasticsearch 服务器删除帖子(当帖子从数据库中被删除时)
网站数据统计
预览
开源地址:https://gitee.com/veal98/Echo