基于SpringBoot + MyBatis + Caffeine + Redis + MySql + Kafka实现一个论坛网站 附完整代码

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 基于SpringBoot + MyBatis + Caffeine + Redis + MySql + Kafka实现一个论坛网站 附完整代码

功能梳理

普通用户权限:


  • 支持站内账号登录,QQ 登录和 GitHub 账号登录(一键登录,方便快捷)
  • 支持发布帖子,可以添加自定义标签,支持 Markdown 格式,同时编辑页面提供目录索引
  • 支持用户编辑自己发布帖子
  • 支持点赞帖子,评论帖子,对评论进行评论,对评论进行点赞,当用户的帖子或者评论被点赞或评论时,会通过站内信通知用户
  • 查看帖子详情页面时,可以同时看到论坛的热门帖,以及相关的帖子(通过标签匹配获得)
  • 支持查看个人主页,查看该用户发布的所有帖子,以及最新的动态
  • 支持站内发送私信
  • 支持站内搜索,提供多种搜索条件
  • "user:Gepeng18" 搜索 Gepeng18 发布的帖子
  • "关键词 in:title" 搜索题目中有"关键词"的帖子
  • "关键词 in:content" 搜索帖子内容中有"关键词"的帖子
  • "关键词 in:tag" 搜索标签中有"关键词"的帖子
  • 支持以上条件组合使用



管理员权限:
  • 可以删除或者编辑用户的帖子
版主权限:
  • 可以将帖子加精或者置顶

云盘模块

普通用户权限:
  • 下载所有的文件
  • 在线播放低于 N 兆的音乐,视频
  • 在线查看代码文件
  • 在线浏览图片
  • 支持获取下载链接,提供给他人下载
  • 在线阅读电子书
  • 在线阅读工程
管理员专有权限:
  • 上传文件
  • 删除文件或文件夹
  • 可以查看"私人文件夹",该文件夹在普通用户模块不显示
  • 创建文件夹
  • 分享文件或者文件夹
  • 转存其他管理员分享的文件或文件夹


模块梳理

注册、登录模块

注册


  1. 检查是否允许注册。当用户点击页面顶部“登录”按钮,打开注册页面,允许注册时,输入账户、密码和邮箱,通过表单提交注册数据。
  2. 服务端对用户输入的信息进行检测。填入的信息不能为空,验证输入的账户是否已经存在,填写的邮箱是否已经注册过。
  3. 注册用户。用户传入的密码通过 MD5+salt 的方式加密,设置用户的类型为普通用户,用户的状态为未激活状态,设置用户的激活码,给用户随机分配系统自带的头像, 生成用户注册的时间
  4. 激活注册账号。服务端利用模板引擎发送激活邮件至用户注册时填写的邮箱中。 用户点击邮件中的激活码,访问服务端的激活服务。通过验证激活码来验证激活是否成功。
  5. 利用 kaptcha 生成验证码,将验证码放入 cookie 中,并存到 Redis 里。


登录


  1. 登录方式分为论坛注册账户登录和第三方账号登录(GitHub 和 QQ)。
  2. 论坛内注册的账户登录:提交账户信息后,服务端会先验证用户填入的信息,其中验证码在表现层就要判断,验证码不对密码和账号就不要判断了; 登录信息无误后,生成登录凭证(loginTicket),将登录凭证放入 cookie 中,并存到 Redis 里。浏览器每次访问时从 Redis 中取出 cookie,并判断登录状态。此处 Redis 存储 cookie 实现了分布式的部署。
  3. 第三方登录:选择第三方登录后,会去相应的第三方服务器中获取用户信息并返回给服务端。服务端会通过返回的用户信息中的 openId 来判断该用户是否已经注册。 若注册过即取出并登录,否则注册并登录。同时生成登录凭证,放入 cookie 里,存到 Redis 中,用户下次访问时判断是否登录。


缓存

个性化推荐模块


  1. 整体上本模块采用"推"和"拉"的方式并存。
  2. 当用户点赞,评论,发布博客时,会将这些"动态"封装成 feed 对象存入数据库,同时将这个动态发给所有的粉丝(从数据库中找到所有的粉丝,筛选最近 n 天登陆过的人,然后将此 feed 存入他们对应的 Redis 的 timelineKey 中,即 每个用户的 Redis 的 timelineKey 中存放着自己关注的对象的动态)
  3. 当用户登录后,Redis 中有值则从 Redis 中对应的 key 中取,否则先从 Redis 中获取所有的关注的人,然后从数据库中遍历搜索。 至此,获得了用户关注的人的最近动态
  4. 当用户每查看一个帖子时,就会将这个帖子的标签存到 Redis 对应的 tagKey 中。
  5. 最终,用户的个性化页面展示顺序即为:

           用户关注的人发送的帖子

          用户关注的人点赞的帖子

          用户关注的人评论的帖子

          用户最近查看的标签对应的帖子且发布时间是近期(否则用户看了两个"多线程"的帖子,然后向此用户推荐了网站所有的多线程,显然不合适,所以只推荐最近发布的"多线程"的帖子)

          再按照分数递减的顺序 注意点

  1. 我们为 timelineKey 设置了生存时间,如小葛关注了小芳,则小芳发布的帖子,进入了小葛的 timelineKey,此时,如果小葛 5 天没登录了,则从此小芳的点赞评论都不会在告诉小葛, 此时我们就可以把小葛的 timelineKey 删除了,当小葛再次登录时,小芳发布的帖子,评论点赞才会进入小葛的 timelineKey,以此解决 Redis 内存。
  2. 如果我们最近查看了"多线程",那么分页查询第一页一定是 0-10,这时候我们看的帖子的标签就会被 Redis 记录,此时如果我们点击第二页,则从 Redis 中的 tagKey 取值时,第二页的查询条件就会改变, 这时候可能第一页查看过的数据,第二页又会出现,或者是有些数据,永远看不到,即我们需要保证分页查询时,每次查询条件不变,所以我们设置了两个 key,持久化 key(persistence)和最近的 key(latest), 这时候我们每次查询都从持久化 key 中取,而每次查询第一页时,将最新的 key 置换为持久化 key,这样即可以保证每次查询条件相同,且是伪最新的标签。


主页热门标签显示模块


  • 用户发布帖子时,都会附带一个 tag 标签
  • 使用 quartz,每隔 3 个小时统计一次。遍历所有帖子,统计所有出现的标签。
  • 根据每个标签匹配所有帖子,统计帖子个总数,计算帖子总分,组成一个 tag。这里需要注意,我们在查询某标签(如算法)对应的帖子时, 查询数据库的算法使用了“%XX%”(如 % 算法 %)的匹配条件,这会得到其他相关联的标签(如“算法总结”等)。
  • 使用 treeSet 对这些标签按照总分排序,然后选出 N 个帖子存储在 tagCache 中,每当用户访问主页面时,就从 TagCache 中去取
  • 当帖子数量增多时,统计时间也可以设置为每天晚上 3 点,夜深人静偷偷统计。(统计帖子的个数,有点误差可以接受,所以一天统计一次似乎也可行)


环境搭建

  • 环境搭建,见 docker.md,本项目所有服务都在 docker 环境下搭建。
  • 数据库初始化:所有的 SQL script 见 SQL_Script
  • 运行顺序为 init_schema.sql(建表) -> init_quartz.sql(quartz 相关表)

更新日志


项目截图

首页

c275c4521f0d897591f4759f4637f0df.png


个性化推荐


c4c879e220a2ece2ccbb22cd8cb10125.png


帖子详情页

支持目录查看即目录跳转


image.png

站内搜索

0bf04ef9317a7b06aea50249558af862.png


标签检索


image.png



个人主页


最新动态

22357b94ef8f38c24ae76b4be6bffe14.png

站内私信功能

完整代码:https://download.csdn.net/download/weixin_55771290/87406820




相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
2月前
|
人工智能 运维 Java
SpringBoot+MySQL实现动态定时任务
这是一个基于Spring Boot的动态定时任务Demo,利用spring-context模块实现任务调度功能。服务启动时会扫描数据库中的任务表,将任务添加到调度器中,并通过固定频率运行的ScheduleUpdater任务动态更新任务状态和Cron表达式。核心功能包括任务的新增、删除与Cron调整,支持通过ScheduledFuture对象控制任务执行。项目依赖Spring Boot 2.2.10.RELEASE,使用MySQL存储任务信息,包含任务基类ITask及具体实现(如FooTask),便于用户扩展运维界面以增强灵活性。
81 10
|
29天前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
Spring boot 使用mybatis generator 自动生成代码插件
|
4月前
|
消息中间件 关系型数据库 MySQL
基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成
基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成
441 0
|
28天前
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
113 0
|
1月前
|
机器学习/深度学习 数据采集 人机交互
springboot+redis互联网医院智能导诊系统源码,基于医疗大模型、知识图谱、人机交互方式实现
智能导诊系统基于医疗大模型、知识图谱与人机交互技术,解决患者“知症不知病”“挂错号”等问题。通过多模态交互(语音、文字、图片等)收集病情信息,结合医学知识图谱和深度推理,实现精准的科室推荐和分级诊疗引导。系统支持基于规则模板和数据模型两种开发原理:前者依赖人工设定症状-科室规则,后者通过机器学习或深度学习分析问诊数据。其特点包括快速病情收集、智能病症关联推理、最佳就医推荐、分级导流以及与院内平台联动,提升患者就诊效率和服务体验。技术架构采用 SpringBoot+Redis+MyBatis Plus+MySQL+RocketMQ,确保高效稳定运行。
119 0
|
3月前
|
监控 Java 关系型数据库
Spring Boot整合MySQL主从集群同步延迟解决方案
本文针对电商系统在Spring Boot+MyBatis架构下的典型问题(如大促时订单状态延迟、库存超卖误判及用户信息更新延迟)提出解决方案。核心内容包括动态数据源路由(强制读主库)、大事务拆分优化以及延迟感知补偿机制,配合MySQL参数调优和监控集成,有效将主从延迟控制在1秒内。实际测试表明,在10万QPS场景下,订单查询延迟显著降低,超卖误判率下降98%。
117 5
|
5月前
|
消息中间件 关系型数据库 MySQL
基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成
本教程展示如何使用Flink CDC YAML快速构建从MySQL到Kafka的流式数据集成作业,涵盖整库同步和表结构变更同步。无需编写Java/Scala代码或安装IDE,所有操作在Flink CDC CLI中完成。首先准备Flink Standalone集群和Docker环境(包括MySQL、Kafka和Zookeeper),然后通过配置YAML文件提交任务,实现数据同步。教程还介绍了路由变更、写入多个分区、输出格式设置及上游表名到下游Topic的映射等功能,并提供详细的命令和示例。最后,包含环境清理步骤以确保资源释放。
495 2
基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成
|
4月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
|
5月前
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
1145 43

推荐镜像

更多