项目简介各位可以参考配套教程自己拉下去部署
Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java Web 技术栈(SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ...),并提供详细的开发文档和配套教程。包含帖子、评论、私信、系统通知、点赞、关注、搜索、用户设置、数据统计等模块。
源码链接:已托管在 Github 和 Gitee:
Gitee:https://gitee.com/veal98/Echo(Gitee 官方推荐项目) Github:https://github.com/Veal98/Echo教程地址:文档通过 Docsify + Github/Gitee Pages 生成
https://itmtx.cn/column/12 核心技术栈后端:
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 渲染):
帖子详情页:
个人主页:
朋友私信页:
私信详情页:
系统通知页:
通知详情页:
账号设置页:
数据统计页:
搜索详情页:
各位如果需要将项目部署在本地进行测试,以下环境请提前备好:
Java 8 MySQL 5.7 Redis Kafka 2.13-2.7.0 Elasticsearch 6.4.3然后修改配置文件中的信息为你自己的本地环境,直接运行是运行不了的,而且相关私密信息我全部用 xxxxxxx 代替了。
本地运行需要修改的配置文件信息如下:
1)application-develop.properties
:
2)logback-spring-develop.xml
:
每次运行需要打开:
MySQL Redis Elasticsearch Kafka另外,还需要事件建好数据库 greatecommunity,然后依次运行项目 sql 文件夹下的这几个 sql 文件建立数据库表:
我每个都只部署了一台,以下是理想的部署架构:
画了一些不是那么严谨的图帮助各位小伙伴理清思绪。
注册 用户注册成功,将用户信息存入 MySQL,但此时该用户状态为未激活 向用户发送激活邮件,用户点击链接则激活账号(Spring Mail)单向绿色箭头:
前端模板 -> Controller:表示这个前端模板中有一个超链接是由这个 Controller 处理的 Controller -> 前端模板:表示这个 Controller 会像该前端模板传递数据或者跳转双向绿色箭头:表示 Controller 和前端模板之间进行参数的相互传递或使用
单向蓝色箭头: A -> B,表示 A 方法调用了 B 方法
单向红色箭头:数据库或缓存操作
登录认证模块跳过了 Spring Secuity 自带的认证机制。主要逻辑如下:
进入登录界面,随机生成一个字符串来标识这个将要登录的用户,将这个字符串短暂的存入 Cookie(60 秒); 动态生成验证码,并将验证码及标识该用户的字符串短暂存入 Redis(60 秒); 为登录成功(验证用户名、密码、验证码)的用户随机生成登录凭证且设置状态为有效,并将登录凭证及其状态等信息永久存入 Redis,再在 Cookie 中存一份登录凭证; 使用拦截器在所有的请求执行之前,从 Cookie 中获取登录凭证,只要 Redis 中该凭证有效并在有效期内,本次请求就会一直持有该用户信息(使用 ThreadLocal 持有用户信息,保证多台服务器上用户的登录状态同步); 勾选记住我,则延长 Cookie 中登录凭证的有效时间; 用户登出,将凭证状态设为无效,并更新 Redis 中该登录凭证的相关信息。下图是登录模块的功能逻辑图,并没有使用 Spring Security 提供的认证逻辑(我觉得这个模块是最复杂的,这张图其实很多细节还没有画全)
此处只画出修改头像:
发布帖子(过滤敏感词),将其存入 MySQL
评论部分前端的名称显示有些缺陷,有兴趣的小伙伴欢迎提 PR 解决 ~
关于评论模块需要注意的就是评论表的设计,把握其中字段的含义,才能透彻了解这个功能的逻辑。
评论 Comment 的目标类型(帖子,评论) entityType 和 entityId 以及对哪个用户进行评论/回复 targetId 是由前端传递给 DiscussPostController 的
一个帖子的详情页需要封装的信息大概如下:
发布对帖子的评论(过滤敏感词),将其存入 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 就是这个用户的获赞数量
将某个用户关注的实体相关信息存储在 Redis 的数据结构 zset 中:key 是 followee:userId:entityType
,对应的 value 是 zset(entityId, now)
,以关注的时间进行排序。比如说 followee:111:3
对应的value (20, 2020-02-03-xxxx)
,表明用户 111 关注了一个类型为 3 的实体即人(用户),关注的这个实体 id 是 20,关注该实体的时间是 2020-02-03-xxxx
同样的,将某个实体拥有的粉丝相关信息也存储在 Redis 的数据结构 zset 中:key 是 follower:entityType:entityId
,对应的 value 是 zset(userId, now)
,以关注的时间进行排序
类似的,置顶、加精也会触发发帖事件,就不再图里面画出来了。
置顶加精删除(异步请求)每次发生点赞(给帖子点赞)、评论(给帖子评论)、加精的时候,就将这些帖子信息存入缓存 Redis 中,然后通过分布式的定时任务 Spring Quartz,每隔一段时间就从缓存中取出这些帖子进行计算分数。
帖子分数/热度计算公式:分数(热度) = 权重 + 发帖距离天数
// 计算权重 double w = (wonderful ? 75 : 0) + commentCount * 10 + likeCount * 2; // 分数 = 权重 + 发帖距离天数 double score = Math.log10(Math.max(w, 1)) + (post.getCreateTime().getTime() - epoch.getTime()) / (1000 * 3600 * 24);
版权声明:
1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。2、网站不提供资料下载,如需下载请到原作者页面进行下载。