All Projects → Veal98 → Echo

Veal98 / Echo

Licence: mit
🦄 开源社区系统:基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供详细的开发文档和配套教程。包含帖子、评论、私信、系统通知、点赞、关注、搜索、用户设置、数据统计等模块。

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to Echo

Supermarket
设计精良的网上商城系统,包括前端、后端、数据库、负载均衡、数据库缓存、分库分表、读写分离、全文检索、消息队列等,使用SpringCloud框架,基于Java开发。该项目可部署到服务器上,不断完善中……
Stars: ✭ 1,278 (+890.7%)
Mutual labels:  mybatis, mysql, redis, elasticsearch, spring, springboot, springmvc
Mall
mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。
Stars: ✭ 54,797 (+42378.29%)
Mutual labels:  mybatis, mysql, redis, elasticsearch, spring, springboot
Javaall
这是一个Java开发宝典,所有的Java技术都在这里,用心学习,努力提升!
Stars: ✭ 67 (-48.06%)
Mutual labels:  mybatis, mysql, redis, spring, springboot, springmvc
Learningsummary
涵盖大部分Java进阶需要掌握的知识,包括【微服务】【中间件】【缓存】【数据库优化】【搜索引擎】【分布式】等等,欢迎Star~
Stars: ✭ 201 (+55.81%)
Mutual labels:  mybatis, mysql, elasticsearch, spring, springboot, springmvc
Spring Boot Vue Bank
我,请始皇[打钱]是一个前后端分离的工具人系统,项目采用 SpringBoot+Go+Vue 开发,项目加入常见的企业级应用所涉及到的技术点,例如 Redis、RabbitMQ 等(主要是多用用工具多踩踩坑)。
Stars: ✭ 157 (+21.71%)
Mutual labels:  kafka, mybatis, mysql, redis, spring, springboot
Perfect Ssm
🍇更完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统(RESTful API+redis)
Stars: ✭ 606 (+369.77%)
Mutual labels:  mybatis, mysql, redis, spring, springboot, springmvc
Pdf
编程电子书,电子书,编程书籍,包括C,C#,Docker,Elasticsearch,Git,Hadoop,HeadFirst,Java,Javascript,jvm,Kafka,Linux,Maven,MongoDB,MyBatis,MySQL,Netty,Nginx,Python,RabbitMQ,Redis,Scala,Solr,Spark,Spring,SpringBoot,SpringCloud,TCPIP,Tomcat,Zookeeper,人工智能,大数据类,并发编程,数据库类,数据挖掘,新面试题,架构设计,算法系列,计算机类,设计模式,软件测试,重构优化,等更多分类
Stars: ✭ 12,009 (+9209.3%)
Mutual labels:  mybatis, mysql, redis, elasticsearch, spring, springboot
Seconds Kill
基于 Springboot + Redis + Kafka 的秒杀系统,乐观锁 + 缓存 + 限流 + 异步,TPS 从 500 优化到 3000
Stars: ✭ 180 (+39.53%)
Mutual labels:  kafka, mybatis, mysql, redis, springboot
Seckill Demo
一个简单的SSM框架的商品秒杀系统🦄
Stars: ✭ 315 (+144.19%)
Mutual labels:  mybatis, mysql, redis, spring, springmvc
Springboot mybatisplus
SpringBoot集成MyBatisPlus
Stars: ✭ 199 (+54.26%)
Mutual labels:  mybatis, mysql, redis, spring, springboot
Cookbook
🎉🎉🎉JAVA高级架构师技术栈==任何技能通过 “刻意练习” 都可以达到融会贯通的境界,就像烹饪一样,这里有一份JAVA开发技术手册,只需要增加自己练习的次数。🏃🏃🏃
Stars: ✭ 428 (+231.78%)
Mutual labels:  kafka, mybatis, mysql, redis, elasticsearch
Mall Swarm
mall-swarm是一套微服务商城系统,采用了 Spring Cloud Hoxton & Alibaba、Spring Boot 2.3、Oauth2、MyBatis、Docker、Elasticsearch、Kubernetes等核心技术,同时提供了基于Vue的管理后台方便快速搭建系统。mall-swarm在电商业务的基础集成了注册中心、配置中心、监控中心、网关等系统功能。文档齐全,附带全套Spring Cloud教程。
Stars: ✭ 7,874 (+6003.88%)
Mutual labels:  mybatis, mysql, redis, elasticsearch, springboot
Mall Learning
mall学习教程,架构、业务、技术要点全方位解析。mall项目(40k+star)是一套电商系统,使用现阶段主流技术实现。涵盖了SpringBoot 2.3.0、MyBatis 3.4.6、Elasticsearch 7.6.2、RabbitMQ 3.7.15、Redis 5.0、MongoDB 4.2.5、Mysql5.7等技术,采用Docker容器化部署。
Stars: ✭ 10,236 (+7834.88%)
Mutual labels:  mybatis, mysql, redis, elasticsearch, springboot
Szt Bigdata
深圳地铁大数据客流分析系统🚇🚄🌟
Stars: ✭ 826 (+540.31%)
Mutual labels:  kafka, mysql, redis, elasticsearch, springboot
Ibase4j
Spring,SpringBoot 2.0,SpringMVC,Mybatis,mybatis-plus,motan/dubbo分布式,Redis缓存,Shiro权限管理,Spring-Session单点登录,Quartz分布式集群调度,Restful服务,QQ/微信登录,App token登录,微信/支付宝支付;日期转换、数据类型转换、序列化、汉字转拼音、身份证号码验证、数字转人民币、发送短信、发送邮件、加密解密、图片处理、excel导入导出、FTP/SFTP/fastDFS上传下载、二维码、XML读写、高精度计算、系统配置工具类等等。
Stars: ✭ 1,548 (+1100%)
Mutual labels:  mybatis, redis, spring, springboot, springmvc
Superman
Superman是什么:构建Java 高级开发技术的知识体系,从基础不断打怪升级成为超人之路(更新中.......)
Stars: ✭ 106 (-17.83%)
Mutual labels:  kafka, mybatis, redis, spring, springboot
Sns Forum Website
牛客网高级项目(SNS+社区问答类网站)
Stars: ✭ 143 (+10.85%)
Mutual labels:  mybatis, mysql, redis, elasticsearch, springboot
Lyonblog
基于Java8的SSM+Elasticsearch全文检索的个人博客系统
Stars: ✭ 169 (+31.01%)
Mutual labels:  mybatis, mysql, redis, elasticsearch, springmvc
Goodskill
🐂基于springcloud +dubbo构建的模拟秒杀项目,模块化设计,集成了分库分表、elasticsearch🔍、gateway、mybatis-plus、spring-session等常用开源组件
Stars: ✭ 786 (+509.3%)
Mutual labels:  kafka, mybatis, redis, elasticsearch, springboot
Springboot Templates
springboot和dubbo、netty的集成,redis mongodb的nosql模板, kafka rocketmq rabbit的MQ模板, solr solrcloud elasticsearch查询引擎
Stars: ✭ 100 (-22.48%)
Mutual labels:  kafka, mybatis, redis, elasticsearch, springboot

Echo — 开源社区系统



star fork GitHub stars GitHub forks version

交流群 配套教程

项目上线到服务器之后可能会出现各种各样的 BUG,比如 Elasticsearch 服务启动失败导致搜索模块不可用,但是在本地运行是完全没问题的,所以各位小伙伴可以放心下载部署。

📚 项目简介

Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java Web 技术栈(SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ...),并提供详细的开发文档和配套教程。包含帖子、评论、私信、系统通知、点赞、关注、搜索、用户设置、数据统计等模块。

源码链接:已托管在 Github 和 Gitee:

在线体验:项目已经部署到腾讯云服务器,各位小伙伴们可直接线上体验:http://1.15.127.74/。已内置三种不同身份的用户:

各位请不要修改这三种内置角色的密码,默认注册的用户是普通用户,您修改了密码后其他小伙伴就没法体验管理员和版主角色了。若想要测试修改密码功能,可以自己重新注册个用户,注意填写真实邮箱,否则无法接收激活邮件并激活角色。感谢各位的配合 ~

另外,为防止恶意修改密码行为,若遇上管理员和版主角色登录失败的情况,可以下方扫码关注公众号【飞天小牛肉】回复 备用角色 获取备用登录用户名和密码

username password 特殊权限
管理员 admin admin 数据统计、删除帖子
版主 master master 置顶帖子、加精帖子
普通用户 user user

文档地址:文档通过 Docsify + Github/Gitee Pages 生成

💻 核心技术栈

后端:

  • 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

🎀 界面展示

首页:

登录页:

帖子详情页:

个人主页:

朋友私信页:

私信详情页:

系统通知页:

通知详情页:

账号设置页:

数据统计页:

搜索详情页:

🎨 功能列表

  • [x] 注册
  • [x] 登录 | 登出
    • 动态生成验证码
    • 记住我
  • [x] 账号设置
    • 修改头像
    • 修改密码
  • [x] 过滤敏感词
    • 前缀树
  • [x] 帖子模块
    • 发布帖子(过滤敏感词)
    • 分页显示所有的帖子
      • 支持按照 “发帖时间” 显示
      • 支持按照 “热度排行” 显示(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,缓存热帖列表和帖子的总数,避免缓存雪崩(这里面还能再加一层二级缓存 Redis)。

🔐 待实现及优化

以下是我觉得本项目还可以添加的功能,同样欢迎各位小伙伴提 issue 指出还可以增加哪些功能,或者直接提 PR 实现该功能:

  • [ ] 发帖支持 Markdown 格式
  • [ ] 忘记密码(发送邮件找回密码)
  • [ ] 查询我的点赞
  • [ ] 管理员对帖子的二次点击取消置顶功能
  • [ ] 管理员对已删除帖子的恢复功能(本项目中的删除帖子并未将其从数据库中删除,只是将其状态设置为了拉黑)

🌱 本地运行

各位如果需要将项目部署在本地进行测试,以下环境请提前备好:

  • 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 文件建立数据库表:

🌌 部署架构

我每个都只部署了一台,以下是理想的部署架构:

🎯 功能逻辑图

画了一些不是那么严谨的图帮助各位小伙伴理清思绪。

单向绿色箭头:

  • 前端模板 -> Controller:表示这个前端模板中有一个超链接是由这个 Controller 处理的
  • Controller -> 前端模板:表示这个 Controller 会像该前端模板传递数据或者跳转

双向绿色箭头:表示 Controller 和前端模板之间进行参数的相互传递或使用

单向蓝色箭头: A -> B,表示 A 方法调用了 B 方法

单向红色箭头:数据库或缓存操作

注册

  • 用户注册成功,将用户信息存入 MySQL,但此时该用户状态为未激活
  • 向用户发送激活邮件,用户点击链接则激活账号(Spring Mail)

登录 | 登出

登录认证模块跳过了 Spring Secuity 自带的认证机制。主要逻辑如下:

  • 进入登录界面,随机生成一个字符串来标识这个将要登录的用户,将这个字符串短暂的存入 Cookie(60 秒);
  • 动态生成验证码,并将验证码及标识该用户的字符串短暂存入 Redis(60 秒);
  • 为登录成功(验证用户名、密码、验证码)的用户随机生成登录凭证且设置状态为有效,并将登录凭证及其状态等信息永久存入 Redis,再在 Cookie 中存一份登录凭证;
  • 使用拦截器在所有的请求执行之前,从 Cookie 中获取登录凭证,只要 Redis 中该凭证有效并在有效期内,本次请求就会一直持有该用户信息(使用 ThreadLocal 持有用户信息,保证多台服务器上用户的登录状态同步);
  • 勾选记住我,则延长 Cookie 中登录凭证的有效时间;
  • 用户登出,将凭证状态设为无效,并更新 Redis 中该登录凭证的相关信息。

下图是登录模块的功能逻辑图,并没有使用 Spring Security 提供的认证逻辑(我觉得这个模块是最复杂的,这张图其实很多细节还没有画全)

分页显示所有的帖子

  • 支持按照 “发帖时间” 显示
  • 支持按照 “热度排行” 显示(Spring Quartz)
  • 将热帖列表和所有帖子的总数存入本地缓存 Caffeine(利用分布式定时任务 Spring Quartz 每隔一段时间就刷新计算帖子的热度/分数 — 见下文,而 Caffeine 里的数据更新不用我们操心,它天生就会自动的更新它拥有的数据,给它一个初始化方法就完事儿)

账号设置

  • 修改头像(异步请求)
    • 将用户选择的头像图片文件上传至七牛云服务器
  • 修改密码

此处只画出修改头像:

发布帖子(异步请求)

发布帖子(过滤敏感词),将其存入 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 就是这个用户的获赞数量

我的获赞数量

关注(异步请求)

  • 若 A 关注了 B,则 A 是 B 的粉丝 Follower,B 是 A 的目标 Followee
  • 关注的目标可以是用户、帖子、题目等,在实现时将这些目标抽象为实体(目前只做了关注用户)

将某个用户关注的实体相关信息存储在 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),以关注的时间进行排序

关注列表

发送系统通知

显示系统通知

搜索

  • 发布事件
    • 发布帖子时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
    • 为帖子增加评论时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器
  • 搜索服务
    • 从 Elasticsearch 服务器搜索帖子
    • 从 Elasticsearch 服务器删除帖子(当帖子从数据库中被删除时)
  • 显示搜索结果

类似的,置顶、加精也会触发发帖事件,就不再图里面画出来了。

置顶加精删除(异步请求)

网站数据统计

  • 独立访客 UV
    • 存入 Redis 的 HyperLogLog
    • 支持单日查询和区间日期查询
  • 日活跃用户 DAU
    • 存入 Redis 的 Bitmap
    • 支持单日查询和区间日期查询
  • 权限管理(Spring Security)
    • 只有管理员可以查看网站数据统计

帖子热度计算

每次发生点赞(给帖子点赞)、评论(给帖子评论)、加精的时候,就将这些帖子信息存入缓存 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);

📖 配套教程

想要自己从零开始实现这个项目或者深入理解的小伙伴,可以扫描下方二维码关注公众号『飞天小牛肉』回复 Echo 获取配套教程,订阅话题 Echo 学习教程 第一时间获取更新。本套教程不仅会详细解释本项目涉及的各大技术点,还会汇总相关的常见面试题,目前尚在更新中。

并推荐我的开源教程类项目 『 CS-Wiki 』,Gitee 推荐项目,目前已 0.9k star: 致力打造完善的 Java 后端知识体系,不仅仅帮助各位小伙伴快速且系统的准备面试(秋招/社招),更指引学习的方向。

序章

部署篇

架构篇

技术要点篇

常见面试题

📞 联系我

有什么问题也可以添加我的微信,记得备注来意:格式 (学校或公司 - 姓名或昵称 - 来意)

🙋 微信交流群

下方扫码加入 Echo 微信交流群,实时跟进项目进度、分享您的想法、讨论您遇到的问题:

👏 鸣谢

博主水平有限,本项目参考牛客网 — Java 高级工程师课程,感谢老师和平台。

另外,若发现 Bug 或好的想法可以积极与我联系或提 PR / issue,采纳后您将出现在下方列表中。感谢以下小伙伴对本项目做出的贡献,排名按照时间先后:

🔗 友情链接(若您想要出现在这里,可以上方扫描微信二维码联系我):

  • CS-Wiki:致力打造完善的 Java 后端知识体系,不仅仅帮助各位小伙伴快速且系统的准备面试,更指引学习的方向
  • Furion:让 .NET 开发更简单,更通用,更流行
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].