实战:功能强大齐全BBS论坛项目Echo简介

项目简介

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 就是这个用户的获赞数量

图片

搜索

  • 发布事件

  1. 发布帖子时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器

  2. 为帖子增加评论时,通过消息队列将帖子异步地提交到 Elasticsearch 服务器

  • 搜索服务

  1. Elasticsearch 服务器搜索帖子

  2. 从 Elasticsearch 服务器删除帖子(当帖子从数据库中被删除时)

图片

网站数据统计

图片

预览

图片

图片

图片

开源地址:https://gitee.com/veal98/Echo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查找json中指定节点的值,替换为指定的值

有时我们封装好的实体转化成的json字段的值和第三方要求的不一样,比如我们字段的值是字符串,我们需要使用int类型的值,就需要将这个键的值转化成int类型。 比如将以下 convulsionNumber字段中字符串的值“一次”替换为0 {"convulsionT…

InstaPrism能否平替BayesPrism(贝叶斯棱镜)?

上一期内容提到了BayesPrism算法用于单细胞数据的反卷积,BayesPrism算法在实际应用中非常占用计算资源以及消耗使用者的时间。那么是否有较好的替代包呢? 曾老师告诉了我一个R包—InstaPrism,他希望我将其和BayesPrism算法做个对比。 开发者…

使用Python Turtle绘制圣诞树和装饰

简介(❤ ω ❤) 在这篇文章中,我们将探索如何使用Python的Turtle模块来绘制一个充满节日气氛的圣诞树,以及一些可爱的装饰品。Turtle是一个受Logo语言启发的图形库,非常适合初学者学习编程和创建图形。 码农不是吗喽(大学生版&…

【常见开源库的二次开发】基于openssl的加密与解密——单向散列函数(四)

目录: 目录: 一、什么是单项散列函数? 1.1 如何验证文件是否被修改过 1.2 单项散列函数: 二、单向hash抗碰撞 2.1 弱抗碰撞(Weak Collision Resistance) 2.2 强抗碰撞(Strong Collision Resista…

图像边缘检测中Sobel算子的原理,并附OpenCV和Matlab的示例代码

Sobel算子是一种用于图像边缘检测的离散微分算子。它结合了图像的平滑处理和微分计算,旨在强调图像中强度变化显著的区域,即边缘。Sobel算子在图像处理中被广泛使用,特别是在计算机视觉和图像分析领域。 Sobel算子的原理 Sobel算子主要用于计…

IMemoryCache 使用

IMemoryCache 提供了一个内存中的缓存存储&#xff0c;允许你存储和检索对象&#xff0c;这些对象可以在应用程序的不同部分之间共享&#xff0c;以提高性能并减少重复计算或数据库访问的次数。 public interface ICacheService : IDisposable{/// <summary>/// 验证缓存…

大模型入门(一)—— LLaMa/Alpaca/Vicuna

LLaMa模型是Meta开源的大模型&#xff0c;模型参数从7B到65B不等&#xff0c;LLaMa-7B在大多数基准测试上超过了GPT3-173B&#xff0c;而LLaMa-65B和Chinchilla-70B、PaLM-540B相比也极具竞争力。相比于ChatGPT或者GPT4来说&#xff0c;LLaMa可能效果上还有差距&#xff0c;但相…

oracle显示列名,列注释

项目场景&#xff1a; 数据库文档中&#xff0c;需要&#xff08;列名&#xff0c;列注释&#xff09;两列 问题描述 数据库文档中&#xff0c;需要&#xff08;列名&#xff0c;列注释&#xff09;两列&#xff0c;而且不止一张表&#xff0c;是很多张&#xff0c;这个时候…

HyperBDR云容灾,让低碳未来有“迹”可循

全球气候变化时刻牵动着我们的心。生活在同一个地球下&#xff0c;万博智云始终坚持环境友好&#xff0c;携手企业和合作伙伴在保持市场竞争力、促进企业可持续发展的同时&#xff0c;共同肩负起守护地球环境的责任。 HyperBDR云容灾以“碳足迹”践行低碳容灾 云产品及数据中心…

Qt界面假死原因

创建一个播放器类&#xff0c;继承QLabel&#xff0c;在播放器类中起一个线程用ffmpeg取流解码&#xff0c;将解码后的图像保存到队列&#xff0c;在gui线程中调用update()刷新显示。 当ffmpeg打开视频流失败后调用update()将qlabel刷新为黑色&#xff0c;有一定概率会使得qla…

随机采样一致性算法RANSAC

点云分割 图自&#xff1a;https://openaccess.thecvf.com/content_cvpr_2017/papers/Qi_PointNet_Deep_Learning_CVPR_2017_paper.pdf《PointNet:用于3D分类和分割的点集深度学习》 点云分割(Point Cloud Segmentation)是计算机视觉和3D图像处理中的一个重要步骤&#xff0c;…

数据结构——位图布隆过滤器

一、位图 1.1 概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用来判断某个数据存不存在的。 数据是否在给定的整形数据中&#xff0c;结果是在或者不在&#xff0c;刚好是两种状态&#xff0c;那么可以…

Android获取当前屏幕显示的是哪个activity

在 Android 中&#xff0c;要获取当前屏幕显示的 Activity&#xff0c;可以使用以下几种方法&#xff1a; 方法一&#xff1a;使用 ActivityManager 获取当前运行的任务信息 这是一个常见的方法&#xff0c;尽管从 Android 5.0 (API 21) 开始&#xff0c;有些方法变得不太可靠…

【多线程】线程安全的单例模式

文章目录 什么是单例模式饿汉实现方式饿汉实现模式的特点 懒汉实现方式懒汉实现方式的特点 什么是单例模式 单例模式是一个设计模式&#xff0c;其目的是确保一个类只有一个实例&#xff0c;并提供一个全局的访问点来访问该实例。单例模式常用于需要控制资源数量的场景&#x…

C++:类的定义和实例化

目录 一、类的定义 1、类的定义格式 2、访问限定符 3、类域 二、实例化 1、实例化的概念 2、对象大小 一、类的定义 1、类的定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中内容…

@TableName(value=““)

Spring中Service对应的实体Entity类上不写TableName(value"")的注解&#xff0c;怎样对应到数据表&#xff1f; 在使用 MyBatis-Plus 时&#xff0c;如果实体类没有使用 TableName(value"") 注解来指定数据库表名&#xff0c;MyBatis-Plus 会根据默认的命…

log4js node日志插件

最近不是特别忙在用express搭建后台项目&#xff0c;在开发过程中遇到了需要输入日志的问 本来想直接用node自带的console来实现&#xff0c;后来发现console输出的日志达不到自己希望的 日志格式&#xff0c;后来各种百度发现了log4js插件&#xff0c;本文来记录log4js插件使用…

STM32智能工业自动化监控系统教程

目录 引言环境准备智能工业自动化监控系统基础代码实现&#xff1a;实现智能工业自动化监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业自动化与管理问题解决方案与优化收尾与总结 1. 引言 智能…

基于zynq的视频采集与hdmi显示(未完)

文章目录 一、项目整体框架一、传感器配置与驱动二、IMX222 1080P 模式图像解析(bayer 2 rgb 模块)2.1 解析有效像素(gen_sync)2.1.1同步字详细介绍&#xff1a; 2.2 bayer 2 rgb 一、项目整体框架 一、传感器配置与驱动 camera信息&#xff1a;索尼IMX222摄像头 SPI&#xf…

脚本练习-每5分钟执行一次获取当前服务器的基本情况

设计一个shell程序&#xff0c;每5分钟执行一次获取当前服务器的基本情况&#xff08;内存使用率&#xff0c;CPU负载&#xff0c;I/O&#xff0c;磁盘使用率&#xff09;&#xff0c;保存到120.20.20.20数据库上数据库帐号aaa密码bbb库名test表名host 创建一个名为server_stat…