更新 README
This commit is contained in:
parent
4cb8352320
commit
30d762d416
81
README.md
81
README.md
@ -9,7 +9,6 @@
|
||||
</p>
|
||||
|
||||
<div align="center">
|
||||
|
||||
[![star](https://gitee.com/veal98/Echo/badge/star.svg?theme=dark)](https://gitee.com/veal98/Echo/stargazers)
|
||||
[![fork](https://gitee.com/veal98/Echo/badge/fork.svg?theme=dark)](https://gitee.com/veal98/Echo/members)
|
||||
[![GitHub stars](https://img.shields.io/github/stars/Veal98/Echo?logo=github)](https://github.com/Veal98/Echo/stargazers)
|
||||
@ -137,24 +136,16 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
![](https://gitee.com/veal98/images/raw/master/img/20210208222403.png)
|
||||
|
||||
- [x] **注册**
|
||||
- 用户注册成功,将用户信息存入 MySQL,但此时该用户状态为未激活
|
||||
- 向用户发送激活邮件,用户点击链接则激活账号(Spring Mail)
|
||||
|
||||
- [x] **登录 | 登出**
|
||||
- 进入登录界面,动态生成验证码,并将验证码短暂存入 Redis(60 秒)
|
||||
- 用户登录成功(验证用户名、密码、验证码),生成登录凭证且设置状态为有效,并将登录凭证存入 Redis
|
||||
注意:登录凭证存在有效期,在所有的请求执行之前,都会检查凭证是否有效和是否过期,只要该用户的凭证有效并在有效期时间内,本次请求就会一直持有该用户信息(使用 ThreadLocal 持有用户信息)
|
||||
- 勾选记住我,则延长登录凭证有效时间
|
||||
- 用户登录成功,将用户信息短暂存入 Redis(1 小时)
|
||||
- 用户登出,将凭证状态设为无效,并更新 Redis 中该用户的登录凭证信息
|
||||
|
||||
- 动态生成验证码
|
||||
- 记住我
|
||||
- [x] **账号设置**
|
||||
- 修改头像
|
||||
- 将用户选择的头像图片文件上传至七牛云服务器
|
||||
- 修改密码
|
||||
|
||||
- [x] **过滤敏感词**
|
||||
- 前缀树
|
||||
- [x] **帖子模块**
|
||||
- 发布帖子(过滤敏感词),将其存入 MySQL
|
||||
- 发布帖子(过滤敏感词)
|
||||
- 分页显示所有的帖子
|
||||
- 支持按照 “发帖时间” 显示
|
||||
- 支持按照 “热度排行” 显示(Spring Quartz)
|
||||
@ -164,14 +155,12 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- “版主” 可以看到帖子的置顶和加精按钮并执行相应操作
|
||||
- “管理员” 可以看到帖子的删除按钮并执行相应操作
|
||||
- “普通用户” 无法看到帖子的置顶、加精、删除按钮,也无法执行相应操作
|
||||
|
||||
- [x] **评论模块**
|
||||
- 发布对帖子的评论(过滤敏感词),将其存入 MySQL
|
||||
- 发布对帖子的评论(过滤敏感词)
|
||||
- 分页显示评论
|
||||
- 发布对评论的回复(过滤敏感词)
|
||||
- 权限管理(Spring Security)
|
||||
- 未登录用户无法使用评论功能
|
||||
|
||||
- [x] **私信模块**
|
||||
- 发送私信(过滤敏感词)
|
||||
- 私信列表
|
||||
@ -184,13 +173,10 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- 支持分页显示
|
||||
- 权限管理(Spring Security)
|
||||
- 未登录用户无法使用私信功能
|
||||
|
||||
- [x] **统一处理 404 / 500 异常**
|
||||
- 普通请求异常
|
||||
- 异步请求异常
|
||||
|
||||
- [x] **统一记录日志**
|
||||
|
||||
- [x] **点赞模块**
|
||||
- 支持对帖子、评论/回复点赞
|
||||
- 第 1 次点赞,第 2 次取消点赞
|
||||
@ -200,7 +186,6 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- 统计我的获赞数量
|
||||
- 权限管理(Spring Security)
|
||||
- 未登录用户无法使用点赞相关功能
|
||||
|
||||
- [x] **关注模块**
|
||||
- 关注功能
|
||||
- 取消关注功能
|
||||
@ -209,7 +194,6 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- 我的粉丝列表(查询某个用户的粉丝),支持分页
|
||||
- 权限管理(Spring Security)
|
||||
- 未登录用户无法使用关注相关功能
|
||||
|
||||
- [x] **系统通知模块**
|
||||
- 通知列表
|
||||
- 显示评论、点赞、关注三种类型的通知
|
||||
@ -222,28 +206,17 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- 导航栏显示所有消息的未读数量(未读私信 + 未读系统通知)
|
||||
- 权限管理(Spring Security)
|
||||
- 未登录用户无法使用系统通知功能
|
||||
|
||||
- [x] **搜索模块**
|
||||
- 发布事件
|
||||
- 发布帖子时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
|
||||
- 为帖子增加评论时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
|
||||
- 搜索服务
|
||||
- 从 Elasticsearch 服务器搜索帖子
|
||||
- 从 Elasticsearch 服务器删除帖子(当帖子从数据库中被删除时)
|
||||
- 显示搜索结果
|
||||
|
||||
- [x] **网站数据统计**(管理员专属)
|
||||
- 独立访客 UV
|
||||
- 存入 Redis 的 HyperLogLog
|
||||
- 支持单日查询和区间日期查询
|
||||
- 日活跃用户 DAU
|
||||
- 存入 Redis 的 Bitmap
|
||||
- 支持单日查询和区间日期查询
|
||||
- 权限管理(Spring Security)
|
||||
- 只有管理员可以查看网站数据统计
|
||||
|
||||
- [x] **优化网站性能**
|
||||
- 使用本地缓存 Caffeine 缓存热帖列表以及所有用户帖子的总数
|
||||
- 处理每次请求时,都要通过拦截器根据登录凭证查询用户信息,访问的频率非常高。因此将已成功登录的用户信息在缓存 Redis 中保存一段时间,查询用户信息的时候优先从缓存中取值;若缓存中没有该用户信息,则将其存入缓存;用户信息变更时清除对应的缓存数据;
|
||||
- 引入本地缓存 Caffeine,缓存热帖列表和帖子的总数,避免缓存雪崩(这里面还能再加一层二级缓存 Redis)。
|
||||
|
||||
## 🔐 待实现及优化
|
||||
|
||||
@ -322,17 +295,14 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
|
||||
### 登录 | 登出
|
||||
|
||||
- 进入登录界面,动态生成验证码,并将验证码短暂存入 Redis(60 秒)
|
||||
登录认证模块跳过了 Spring Secuity 自带的认证机制。主要逻辑如下:
|
||||
|
||||
- 用户登录成功(验证用户名、密码、验证码),生成登录凭证且设置状态为有效,并将登录凭证存入 Redis
|
||||
|
||||
注意:登录凭证存在有效期,在所有的请求执行之前,都会检查凭证是否有效和是否过期,只要该用户的凭证有效并在有效期时间内,本次请求就会一直持有该用户信息(使用 ThreadLocal 持有用户信息)
|
||||
|
||||
- 勾选记住我,则延长登录凭证有效时间
|
||||
|
||||
- 用户登录成功,将用户信息短暂存入 Redis(1 小时)
|
||||
|
||||
- 用户登出,将凭证状态设为无效,并更新 Redis 中该用户的登录凭证信息
|
||||
- 进入登录界面,随机生成一个字符串来标识这个将要登录的用户,将这个字符串短暂的存入 Cookie(60 秒);
|
||||
- 动态生成验证码,并将验证码及标识该用户的字符串短暂存入 Redis(60 秒);
|
||||
- 为登录成功(验证用户名、密码、验证码)的用户随机生成登录凭证且设置状态为有效,并将登录凭证及其状态等信息永久存入 Redis,再在 Cookie 中存一份登录凭证;
|
||||
- 使用拦截器在所有的请求执行之前,从 Cookie 中获取登录凭证,只要 Redis 中该凭证有效并在有效期内,本次请求就会一直持有该用户信息(使用 ThreadLocal 持有用户信息,保证多台服务器上用户的登录状态同步);
|
||||
- 勾选记住我,则延长 Cookie 中登录凭证的有效时间;
|
||||
- 用户登出,将凭证状态设为无效,并更新 Redis 中该登录凭证的相关信息。
|
||||
|
||||
下图是登录模块的功能逻辑图,并没有使用 Spring Security 提供的认证逻辑(我觉得这个模块是最复杂的,这张图其实很多细节还没有画全)
|
||||
|
||||
@ -360,6 +330,8 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
|
||||
### 发布帖子(异步请求)
|
||||
|
||||
发布帖子(过滤敏感词),将其存入 MySQL
|
||||
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210206122521.png" />
|
||||
|
||||
### 显示评论及相关信息
|
||||
@ -378,6 +350,8 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
|
||||
### 添加评论(事务管理)
|
||||
|
||||
发布对帖子的评论(过滤敏感词),将其存入 MySQL
|
||||
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210207122908.png" />
|
||||
|
||||
### 私信列表和详情页
|
||||
@ -425,6 +399,14 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
|
||||
### 搜索
|
||||
|
||||
- 发布事件
|
||||
- 发布帖子时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
|
||||
- 为帖子增加评论时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
|
||||
- 搜索服务
|
||||
- 从 Elasticsearch 服务器搜索帖子
|
||||
- 从 Elasticsearch 服务器删除帖子(当帖子从数据库中被删除时)
|
||||
- 显示搜索结果
|
||||
|
||||
![](https://gitee.com/veal98/images/raw/master/img/20210208161936.png)
|
||||
|
||||
类似的,置顶、加精也会触发发帖事件,就不再图里面画出来了。
|
||||
@ -435,6 +417,15 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
|
||||
### 网站数据统计
|
||||
|
||||
- 独立访客 UV
|
||||
- 存入 Redis 的 HyperLogLog
|
||||
- 支持单日查询和区间日期查询
|
||||
- 日活跃用户 DAU
|
||||
- 存入 Redis 的 Bitmap
|
||||
- 支持单日查询和区间日期查询
|
||||
- 权限管理(Spring Security)
|
||||
- 只有管理员可以查看网站数据统计
|
||||
|
||||
![](https://gitee.com/veal98/images/raw/master/img/20210208170801.png)
|
||||
|
||||
### 帖子热度计算
|
||||
|
119
docs/README.md
119
docs/README.md
@ -1,7 +1,3 @@
|
||||
# Echo — 开源社区系统
|
||||
|
||||
---
|
||||
|
||||
## 📚 项目简介
|
||||
|
||||
Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java Web 技术栈(SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ...),并提供详细的开发文档和配套教程。包含帖子、评论、私信、系统通知、点赞、关注、搜索、用户设置、数据统计等模块。
|
||||
@ -115,24 +111,16 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
![](https://gitee.com/veal98/images/raw/master/img/20210208222403.png)
|
||||
|
||||
- [x] **注册**
|
||||
- 用户注册成功,将用户信息存入 MySQL,但此时该用户状态为未激活
|
||||
- 向用户发送激活邮件,用户点击链接则激活账号(Spring Mail)
|
||||
|
||||
- [x] **登录 | 登出**
|
||||
- 进入登录界面,动态生成验证码,并将验证码短暂存入 Redis(60 秒)
|
||||
- 用户登录成功(验证用户名、密码、验证码),生成登录凭证且设置状态为有效,并将登录凭证存入 Redis
|
||||
注意:登录凭证存在有效期,在所有的请求执行之前,都会检查凭证是否有效和是否过期,只要该用户的凭证有效并在有效期时间内,本次请求就会一直持有该用户信息(使用 ThreadLocal 持有用户信息)
|
||||
- 勾选记住我,则延长登录凭证有效时间
|
||||
- 用户登录成功,将用户信息短暂存入 Redis(1 小时)
|
||||
- 用户登出,将凭证状态设为无效,并更新 Redis 中该用户的登录凭证信息
|
||||
|
||||
- 动态生成验证码
|
||||
- 记住我
|
||||
- [x] **账号设置**
|
||||
- 修改头像
|
||||
- 将用户选择的头像图片文件上传至七牛云服务器
|
||||
- 修改密码
|
||||
|
||||
- [x] **过滤敏感词**
|
||||
- 前缀树
|
||||
- [x] **帖子模块**
|
||||
- 发布帖子(过滤敏感词),将其存入 MySQL
|
||||
- 发布帖子(过滤敏感词)
|
||||
- 分页显示所有的帖子
|
||||
- 支持按照 “发帖时间” 显示
|
||||
- 支持按照 “热度排行” 显示(Spring Quartz)
|
||||
@ -142,14 +130,12 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- “版主” 可以看到帖子的置顶和加精按钮并执行相应操作
|
||||
- “管理员” 可以看到帖子的删除按钮并执行相应操作
|
||||
- “普通用户” 无法看到帖子的置顶、加精、删除按钮,也无法执行相应操作
|
||||
|
||||
- [x] **评论模块**
|
||||
- 发布对帖子的评论(过滤敏感词),将其存入 MySQL
|
||||
- 发布对帖子的评论(过滤敏感词)
|
||||
- 分页显示评论
|
||||
- 发布对评论的回复(过滤敏感词)
|
||||
- 权限管理(Spring Security)
|
||||
- 未登录用户无法使用评论功能
|
||||
|
||||
- [x] **私信模块**
|
||||
- 发送私信(过滤敏感词)
|
||||
- 私信列表
|
||||
@ -162,13 +148,10 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- 支持分页显示
|
||||
- 权限管理(Spring Security)
|
||||
- 未登录用户无法使用私信功能
|
||||
|
||||
- [x] **统一处理 404 / 500 异常**
|
||||
- 普通请求异常
|
||||
- 异步请求异常
|
||||
|
||||
- [x] **统一记录日志**
|
||||
|
||||
- [x] **点赞模块**
|
||||
- 支持对帖子、评论/回复点赞
|
||||
- 第 1 次点赞,第 2 次取消点赞
|
||||
@ -178,7 +161,6 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- 统计我的获赞数量
|
||||
- 权限管理(Spring Security)
|
||||
- 未登录用户无法使用点赞相关功能
|
||||
|
||||
- [x] **关注模块**
|
||||
- 关注功能
|
||||
- 取消关注功能
|
||||
@ -187,7 +169,6 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- 我的粉丝列表(查询某个用户的粉丝),支持分页
|
||||
- 权限管理(Spring Security)
|
||||
- 未登录用户无法使用关注相关功能
|
||||
|
||||
- [x] **系统通知模块**
|
||||
- 通知列表
|
||||
- 显示评论、点赞、关注三种类型的通知
|
||||
@ -200,28 +181,17 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- 导航栏显示所有消息的未读数量(未读私信 + 未读系统通知)
|
||||
- 权限管理(Spring Security)
|
||||
- 未登录用户无法使用系统通知功能
|
||||
|
||||
- [x] **搜索模块**
|
||||
- 发布事件
|
||||
- 发布帖子时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
|
||||
- 为帖子增加评论时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
|
||||
- 搜索服务
|
||||
- 从 Elasticsearch 服务器搜索帖子
|
||||
- 从 Elasticsearch 服务器删除帖子(当帖子从数据库中被删除时)
|
||||
- 显示搜索结果
|
||||
|
||||
- [x] **网站数据统计**(管理员专属)
|
||||
- 独立访客 UV
|
||||
- 存入 Redis 的 HyperLogLog
|
||||
- 支持单日查询和区间日期查询
|
||||
- 日活跃用户 DAU
|
||||
- 存入 Redis 的 Bitmap
|
||||
- 支持单日查询和区间日期查询
|
||||
- 权限管理(Spring Security)
|
||||
- 只有管理员可以查看网站数据统计
|
||||
|
||||
- [x] **优化网站性能**
|
||||
- 使用本地缓存 Caffeine 缓存热帖列表以及所有用户帖子的总数
|
||||
- 处理每次请求时,都要通过拦截器根据登录凭证查询用户信息,访问的频率非常高。因此将已成功登录的用户信息在缓存 Redis 中保存一段时间,查询用户信息的时候优先从缓存中取值;若缓存中没有该用户信息,则将其存入缓存;用户信息变更时清除对应的缓存数据;
|
||||
- 引入本地缓存 Caffeine,缓存热帖列表和帖子的总数,避免缓存雪崩(这里面还能再加一层二级缓存 Redis)。
|
||||
|
||||
## 🔐 待实现及优化
|
||||
|
||||
@ -296,21 +266,18 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- 用户注册成功,将用户信息存入 MySQL,但此时该用户状态为未激活
|
||||
- 向用户发送激活邮件,用户点击链接则激活账号(Spring Mail)
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210204222249.png" style="width:660px" />
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210204222249.png" />
|
||||
|
||||
### 登录 | 登出
|
||||
|
||||
- 进入登录界面,动态生成验证码,并将验证码短暂存入 Redis(60 秒)
|
||||
登录认证模块跳过了 Spring Secuity 自带的认证机制。主要逻辑如下:
|
||||
|
||||
- 用户登录成功(验证用户名、密码、验证码),生成登录凭证且设置状态为有效,并将登录凭证存入 Redis
|
||||
|
||||
注意:登录凭证存在有效期,在所有的请求执行之前,都会检查凭证是否有效和是否过期,只要该用户的凭证有效并在有效期时间内,本次请求就会一直持有该用户信息(使用 ThreadLocal 持有用户信息)
|
||||
|
||||
- 勾选记住我,则延长登录凭证有效时间
|
||||
|
||||
- 用户登录成功,将用户信息短暂存入 Redis(1 小时)
|
||||
|
||||
- 用户登出,将凭证状态设为无效,并更新 Redis 中该用户的登录凭证信息
|
||||
- 进入登录界面,随机生成一个字符串来标识这个将要登录的用户,将这个字符串短暂的存入 Cookie(60 秒);
|
||||
- 动态生成验证码,并将验证码及标识该用户的字符串短暂存入 Redis(60 秒);
|
||||
- 为登录成功(验证用户名、密码、验证码)的用户随机生成登录凭证且设置状态为有效,并将登录凭证及其状态等信息永久存入 Redis,再在 Cookie 中存一份登录凭证;
|
||||
- 使用拦截器在所有的请求执行之前,从 Cookie 中获取登录凭证,只要 Redis 中该凭证有效并在有效期内,本次请求就会一直持有该用户信息(使用 ThreadLocal 持有用户信息,保证多台服务器上用户的登录状态同步);
|
||||
- 勾选记住我,则延长 Cookie 中登录凭证的有效时间;
|
||||
- 用户登出,将凭证状态设为无效,并更新 Redis 中该登录凭证的相关信息。
|
||||
|
||||
下图是登录模块的功能逻辑图,并没有使用 Spring Security 提供的认证逻辑(我觉得这个模块是最复杂的,这张图其实很多细节还没有画全)
|
||||
|
||||
@ -322,7 +289,7 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
- 支持按照 “热度排行” 显示(Spring Quartz)
|
||||
- 将热帖列表和所有帖子的总数存入本地缓存 Caffeine(利用分布式定时任务 Spring Quartz 每隔一段时间就刷新计算帖子的热度/分数 — 见下文,而 Caffeine 里的数据更新不用我们操心,它天生就会自动的更新它拥有的数据,给它一个初始化方法就完事儿)
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210204222822.png" style="width:660px" />
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210204222822.png" />
|
||||
|
||||
|
||||
|
||||
@ -334,11 +301,13 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
|
||||
此处只画出修改头像:
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210206121201.png" style="width:700px" />
|
||||
<img width="700px" src="https://gitee.com/veal98/images/raw/master/img/20210206121201.png" />
|
||||
|
||||
### 发布帖子(异步请求)
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210206122521.png" style="width:660px" />
|
||||
发布帖子(过滤敏感词),将其存入 MySQL
|
||||
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210206122521.png" />
|
||||
|
||||
### 显示评论及相关信息
|
||||
|
||||
@ -348,23 +317,25 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
|
||||
评论 Comment 的目标类型(帖子,评论) entityType 和 entityId 以及对哪个用户进行评论/回复 targetId 是由前端传递给 DiscussPostController 的
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210207150925.png" style="width:660px" />
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210207150925.png" />
|
||||
|
||||
一个帖子的详情页需要封装的信息大概如下:
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210207151328.png" style="width:660px" />
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210207151328.png" />
|
||||
|
||||
### 添加评论(事务管理)
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210207122908.png" style="width:660px" />
|
||||
发布对帖子的评论(过滤敏感词),将其存入 MySQL
|
||||
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210207122908.png" />
|
||||
|
||||
### 私信列表和详情页
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210207161130.png" style="width:700px" />
|
||||
<img width="700px" src="https://gitee.com/veal98/images/raw/master/img/20210207161130.png" />
|
||||
|
||||
### 发送私信(异步请求)
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210207161500.png" style="width:660px" />
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210207161500.png" />
|
||||
|
||||
### 点赞(异步请求)
|
||||
|
||||
@ -372,11 +343,11 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
|
||||
某个用户的获赞数量对应的存储在 Redis 中的 key 是 `like:user:userId`,value 就是这个用户的获赞数量
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210207165837.png" style="width:700px" />
|
||||
<img width="700px" src="https://gitee.com/veal98/images/raw/master/img/20210207165837.png" />
|
||||
|
||||
### 我的获赞数量
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210207170003.png" style="width:660px" />
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210207170003.png" />
|
||||
|
||||
### 关注(异步请求)
|
||||
|
||||
@ -387,11 +358,11 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
|
||||
同样的,将某个实体拥有的粉丝相关信息也存储在 Redis 的数据结构 zset 中:key 是 `follower:entityType:entityId`,对应的 value 是 `zset(userId, now)`,以关注的时间进行排序
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210207174046.png" style="width:660px" />
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210207174046.png" />
|
||||
|
||||
### 关注列表
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210207175621.png" style="width:660px" />
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210207175621.png" />
|
||||
|
||||
### 发送系统通知
|
||||
|
||||
@ -403,16 +374,33 @@ Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java
|
||||
|
||||
### 搜索
|
||||
|
||||
- 发布事件
|
||||
- 发布帖子时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
|
||||
- 为帖子增加评论时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
|
||||
- 搜索服务
|
||||
- 从 Elasticsearch 服务器搜索帖子
|
||||
- 从 Elasticsearch 服务器删除帖子(当帖子从数据库中被删除时)
|
||||
- 显示搜索结果
|
||||
|
||||
![](https://gitee.com/veal98/images/raw/master/img/20210208161936.png)
|
||||
|
||||
类似的,置顶、加精也会触发发帖事件,就不再图里面画出来了。
|
||||
|
||||
### 置顶加精删除(异步请求)
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210208171729.png" style="width:660px" />
|
||||
<img width="660px" src="https://gitee.com/veal98/images/raw/master/img/20210208171729.png" />
|
||||
|
||||
### 网站数据统计
|
||||
|
||||
- 独立访客 UV
|
||||
- 存入 Redis 的 HyperLogLog
|
||||
- 支持单日查询和区间日期查询
|
||||
- 日活跃用户 DAU
|
||||
- 存入 Redis 的 Bitmap
|
||||
- 支持单日查询和区间日期查询
|
||||
- 权限管理(Spring Security)
|
||||
- 只有管理员可以查看网站数据统计
|
||||
|
||||
![](https://gitee.com/veal98/images/raw/master/img/20210208170801.png)
|
||||
|
||||
### 帖子热度计算
|
||||
@ -435,9 +423,9 @@ double score = Math.log10(Math.max(w, 1))
|
||||
|
||||
想要自己从零开始实现这个项目或者深入理解的小伙伴,可以扫描下方二维码关注公众号『**飞天小牛肉**』回复 `Echo` 获取配套教程,订阅话题 [Echo 学习教程](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI0NDc3ODE5OQ==&action=getalbum&album_id=1744497649518493697&scene=173&from_msgid=2247485209&from_itemidx=3&count=3&uin=&key=&devicetype=Windows+10+x64&version=63010043&lang=zh_CN&ascene=1&session_us=gh_089c9f6e334b&fontgear=2) 第一时间获取更新。本套教程不仅会详细解释本项目涉及的各大技术点,还会汇总相关的常见面试题,目前尚在更新中。
|
||||
|
||||
<img src="https://gitee.com/veal98/images/raw/master/img/20210204145531.png" style="width:260px" />
|
||||
<img width="220px" src="https://gitee.com/veal98/images/raw/master/img/20210204145531.png" />
|
||||
|
||||
并推荐我的开源教程类项目 [『 CS-Wiki 』](https://gitee.com/veal98/CS-Wiki),Gitee 推荐项目,目前已 0.9k star: 致力打造完善的 Java 后端知识体系,不仅仅帮助各位小伙伴快速且系统的准备面试(秋招/社招),更指引学习的方向
|
||||
并推荐我的开源教程类项目 [『 CS-Wiki 』](https://gitee.com/veal98/CS-Wiki),Gitee 推荐项目,目前已 0.9k star: 致力打造完善的 Java 后端知识体系,不仅仅帮助各位小伙伴快速且系统的准备面试(秋招/社招),更指引学习的方向。
|
||||
|
||||
### 序章
|
||||
|
||||
@ -461,7 +449,7 @@ double score = Math.log10(Math.max(w, 1))
|
||||
|
||||
有什么问题也可以添加我的微信,记得备注来意:格式 <u>(学校或公司 - 姓名或昵称 - 来意)</u>
|
||||
|
||||
<img width="260px" src="https://gitee.com/veal98/images/raw/master/img/微信图片_20210105121328.jpg" >
|
||||
<img width="220px" src="https://gitee.com/veal98/images/raw/master/img/微信图片_20210105121328.jpg" >
|
||||
|
||||
## 🙋 微信交流群
|
||||
|
||||
@ -481,4 +469,3 @@ double score = Math.log10(Math.max(w, 1))
|
||||
>
|
||||
> - [CS-Wiki](https://gitee.com/veal98/CS-Wiki):致力打造完善的 Java 后端知识体系,不仅仅帮助各位小伙伴快速且系统的准备面试,更指引学习的方向
|
||||
> - [Furion](https://gitee.com/dotnetchina/Furion):让 .NET 开发更简单,更通用,更流行
|
||||
|
||||
|
@ -45,7 +45,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter implements Comm
|
||||
"/user/setting",
|
||||
"/user/upload",
|
||||
"/discuss/add",
|
||||
"/comment/add",
|
||||
"/comment/add/**",
|
||||
"/letter/**",
|
||||
"/notice/**",
|
||||
"/like",
|
||||
|
@ -27,8 +27,8 @@ public class CaffeineTest {
|
||||
for (int i = 0; i < 300000; i++) {
|
||||
DiscussPost post = new DiscussPost();
|
||||
post.setUserId(111);
|
||||
post.setTitle("互联网求职暖春计划");
|
||||
post.setContent("今年的就业形势,确实不容乐观。过了个年,仿佛跳水一般,整个讨论区哀鸿遍野!19届真的没人要了吗?!18届被优化真的没有出路了吗?!大家的“哀嚎”与“悲惨遭遇”牵动了每日潜伏于讨论区的牛客小哥哥小姐姐们的心,于是牛客决定:是时候为大家做点什么了!为了帮助大家度过“寒冬”,牛客网特别联合60+家企业,开启互联网求职暖春计划,面向18届&19届,拯救0 offer!");
|
||||
post.setTitle("测试数据");
|
||||
post.setContent("兄弟们,冲");
|
||||
post.setCreateTime(new Date());
|
||||
post.setScore(Math.random() * 2000);
|
||||
postService.addDiscussPost(post);
|
||||
|
Loading…
Reference in New Issue
Block a user