# Anchor
**Repository Path**: Reanon/Anchor
## Basic Information
- **Project Name**: Anchor
- **Description**: Anchor 是一套前后端不分离的开源社区系统,基于目前主流 Java Web 技术栈,完成了基本的注册、登录、发帖、评论、点赞、回复功能。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-07-02
- **Last Updated**: 2022-06-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Anchor — 开源社区系统
## 📚 项目简介
Anchor 是一套前后端不分离的开源社区系统,基于目前主流 Java Web 技术栈,完成了基本的注册、登录、发帖、评论、点赞、回复功能,使用前缀树实现敏感词过滤,实现了对 UV 和 DAU 统计,并将用户头像等信息存于阿里云 OSS 服务器。
### 🎨 技术选型

1、引入 Spring Security 做权限控制,替代拦截器的拦截控制,并使用自己的认证方案替代 Security 认证流程,使权限认证和控制更加方便灵活。
2、利用 Redis 的 set 实现点赞,zset 实现关注,并使用 Redis 存储登录 ticket 和验证码,解决分布式 session 问题。
3、采用 Redis 高级数据类型 HyperLogLog 统计 UV(Unique Visitor),使用 Bitmap 统计 DAU(Daily Active User)。
4、选取 Kafka 处理发送评论、点赞和关注等系统通知,并使用事件进行封装,构建了强大的异步消息系统。
5、使用 Elasticsearch 做全文搜索,并通过事件封装,增加关键词高亮显示等功能。
6、对热帖排行模块,使用分布式缓存 Redis 和本地缓存 Caffeine 作为多级缓存,避免了缓存雪崩,将 QPS(Queries Per Second) 提升了20倍(10 -> 200),大大提升了网站访问速度。同时使用 Quartz 定时更新热帖排行。
### 🌌 部署架构
每个都只部署了一台,以下是理想的部署架构:
### 🎯 核心技术栈
| 后端 | 前端 |
| :----------------------------------------------------------: | :---------------------------: |
| Spring Boot 2.4.8
Spring MVC
ORM:MyBatis
数据库:MySQL 5.7
分布式缓存:Redis
本地缓存:Caffeine
消息队列:Kafka 2.13
搜索引擎:Elasticsearch 6.4.3
安全:Spring Security
邮件任务:Spring Mail
分布式定时任务:Spring Quartz
日志:SLF4J(日志接口) + Logback(日志实现) | Thymeleaf
Jquery
Ajax |
## 🔨 项目部署
### 💻 开发环境
- 操作系统:Windows 10
- 构建工具:Apache Maven
- 集成开发工具:Intellij IDEA
- 应用服务器:Apache Tomcat
- 接口测试工具:Postman
- 压力测试工具:Apache JMeter
- 版本控制工具:Git
- Java 版本:8
### 🎄 功能列表
**注册**
**登录 | 登出**
- 动态生成验证码
- 记住我
**账号设置**
- 修改头像
- 修改密码
**过滤敏感词**
- 前缀树
**帖子模块**
- 发布帖子(过滤敏感词)
- 分页显示所有的帖子
- 支持按照 「发帖时间」 显示
- 支持按照 「热度排行」 显示(Spring Quartz)
- 查看帖子详情
- 权限管理(Spring Security + Thymeleaf Security)
- 未登录用户无法发帖
- 「版主」 可以看到帖子的置顶和加精按钮并执行相应操作
- 「管理员」 可以看到帖子的删除按钮并执行相应操作
- 「普通用户」 无法看到帖子的置顶、加精、删除按钮,也无法执行相应操作
**评论模块**
- 发布对帖子的评论(过滤敏感词)
- 分页显示评论
- 发布对评论的回复(过滤敏感词)
- 权限管理(Spring Security)
- 未登录用户无法使用评论功能
**私信模块**
- 发送私信(过滤敏感词)
- 私信列表
- 查询当前用户的会话列表
- 每个会话只显示一条最新的私信
- 支持分页显示
- 私信详情
- 查询某个会话所包含的所有私信
- 访问私信详情时,将显示的私信设为已读状态
- 支持分页显示
- 权限管理(Spring Security)
- 未登录用户无法使用私信功能
**统一处理 404 / 500 异常**
- 普通请求异常
- 异步请求异常
**统一记录日志**
**点赞模块**
- 支持对帖子、评论 / 回复点赞
- 第 1 次点赞,第 2 次取消点赞
- 首页统计帖子的点赞数量
- 详情页统计帖子和评论/回复的点赞数量
- 详情页显示当前登录用户的点赞状态(赞过了则显示已赞)
- 统计我的获赞数量
- 权限管理(Spring Security)
- 未登录用户无法使用点赞相关功能
**关注模块**
- 关注功能
- 取消关注功能
- 统计用户的关注数和粉丝数
- 我的关注列表(查询某个用户关注的人),支持分页
- 我的粉丝列表(查询某个用户的粉丝),支持分页
- 权限管理(Spring Security)
- 未登录用户无法使用关注相关功能
**系统通知模块**
- 通知列表
- 显示评论、点赞、关注三种类型的通知
- 通知详情
- 分页显示某一类主题所包含的通知
- 进入某种类型的系统通知详情,则将该页的所有未读的系统通知状态设置为已读
- 未读数量
- 分别显示每种类型的系统通知的未读数量
- 显示所有系统通知的未读数量
- 导航栏显示所有消息的未读数量(未读私信 + 未读系统通知)
- 权限管理(Spring Security)
- 未登录用户无法使用系统通知功能
**搜索模块**
**网站数据统计**(管理员专属)
- 独立访客 UV
- 支持单日查询和区间日期查询
- 日活跃用户 DAU
- 支持单日查询和区间日期查询
- 权限管理(Spring Security)
- 只有管理员可以查看网站数据统计
**优化网站性能**
- 处理每次请求时,都要通过拦截器根据登录凭证查询用户信息,访问的频率非常高。因此将已成功登录的用户信息在缓存 Redis 中保存一段时间,查询用户信息的时候优先从缓存中取值;
- 若缓存中没有该用户信息,则将其存入缓存;
- 用户信息变更时清除对应的缓存数据;
- 引入本地缓存 Caffeine,缓存热帖列表和帖子的总数,避免缓存雪崩(这里面还能再加一层二级缓存 Redis)。
### 🎊 界面展示