这是一个基于 Spring Boot 3.0.12 开发的校园博客论坛后端项目,采用前后端分离架构,提供 RESTful API 接口。
| 技术 |
版本 |
说明 |
| Spring Boot |
3.0.12 |
核心框架 |
| MyBatis Plus |
3.5.5 |
ORM 持久层框架(MyBatis 增强) |
| MySQL |
8.0+ |
关系型数据库(云端部署) |
| Knife4j |
4.5.0 |
API 文档(基于 Swagger) |
| Lombok |
1.18.40 |
简化 Java 代码 |
| Hutool |
5.8.38 |
Java 工具类库 |
| JWT (JJWT) |
0.12.3 |
JSON Web Token 认证 |
| Spring Security |
由父工程管理 |
安全认证框架 |
| Caffeine |
3.1.8 |
本地缓存(替代 Redis) |
| Spring Boot Actuator |
3.0.12 |
运维监控 |
edu_project/
├── src/main/java/com/example/edu_project/
│ ├── EduProjectApplication.java # 启动类
│ ├── config/ # 配置类
│ │ ├── MybatisPlusConfig.java # MyBatis Plus 配置
│ │ ├── MyMetaObjectHandler.java # 自动填充处理器
│ │ ├── SecurityConfig.java # Spring Security 配置
│ │ ├── CaffeineCacheConfig.java # Caffeine 本地缓存配置
│ │ ├── AsyncConfig.java # 异步任务线程池配置
│ │ ├── JwtSchedulerConfig.java # JWT 黑名单定时清理
│ │ ├── JwtAuthenticationFilter.java # JWT 认证过滤器
│ │ ├── WebMvcConfig.java # Web MVC 配置
│ │ ├── DotenvConfig.java # .env 环境变量加载
│ │ ├── EnvValidationConfig.java # 环境变量校验配置
│ │ └── RateLimitInterceptor.java # 接口频率限制拦截器
│ ├── controller/ # Controller 层(20个)
│ │ ├── SysUserController.java # 用户控制器
│ │ ├── BlogPostController.java # 文章控制器
│ │ ├── BlogCommentController.java # 评论控制器
│ │ ├── BlogLikeController.java # 点赞控制器
│ │ ├── BlogCollectController.java # 收藏控制器
│ │ ├── BlogTagController.java # 标签控制器
│ │ ├── FollowController.java # 关注控制器
│ │ ├── NotificationController.java # 通知控制器
│ │ ├── TrendingController.java # 热门控制器
│ │ ├── ReportController.java # 举报控制器
│ │ ├── AdminReportController.java # 管理员举报控制器
│ │ ├── CircleController.java # 校友圈控制器
│ │ ├── MediaController.java # 媒体控制器
│ │ ├── TopicController.java # 话题控制器
│ │ ├── AdminStatisticsController.java # 管理员统计控制器
│ │ ├── AdminPostController.java # 管理员内容控制器
│ │ ├── AdminCommentController.java # 管理员评论控制器
│ │ ├── AdminUserController.java # 管理员用户控制器
│ │ ├── MessageController.java # 私信控制器
│ │ └── PasswordController.java # 密码找回控制器
│ ├── service/ # Service 层(17个)
│ │ ├── SysUserService.java
│ │ ├── BlogPostService.java
│ │ ├── BlogCommentService.java
│ │ ├── BlogTagService.java
│ │ ├── BlogPostTagService.java
│ │ ├── BlogLikeService.java
│ │ ├── BlogCollectService.java
│ │ ├── FollowService.java
│ │ ├── NotificationService.java
│ │ ├── TrendingService.java
│ │ ├── ReportService.java
│ │ ├── CircleService.java
│ │ ├── MediaService.java
│ │ ├── TopicService.java
│ │ ├── MessageService.java
│ │ ├── EmailService.java
│ │ └── StatisticsService.java
│ │ ├── SysUserServiceImpl.java
│ │ ├── BlogPostServiceImpl.java
│ │ ├── BlogCommentServiceImpl.java
│ │ ├── BlogTagServiceImpl.java
│ │ ├── BlogPostTagServiceImpl.java
│ │ ├── BlogLikeServiceImpl.java
│ │ ├── BlogCollectServiceImpl.java
│ │ ├── FollowServiceImpl.java
│ │ ├── NotificationServiceImpl.java
│ │ ├── TrendingServiceImpl.java
│ │ ├── ReportServiceImpl.java
│ │ ├── CircleServiceImpl.java
│ │ ├── MediaServiceImpl.java
│ │ ├── TopicServiceImpl.java
│ │ ├── MessageServiceImpl.java
│ │ ├── EmailServiceImpl.java
│ │ └── StatisticsServiceImpl.java
│ ├── mapper/ # Mapper 层(21个)
│ │ ├── SysUserMapper.java
│ │ ├── BlogPostMapper.java
│ │ ├── BlogCommentMapper.java
│ │ ├── BlogTagMapper.java
│ │ ├── BlogPostTagMapper.java
│ │ ├── BlogLikeMapper.java
│ │ ├── BlogCollectMapper.java
│ │ ├── BlogFollowMapper.java
│ │ ├── BlogNotificationMapper.java
│ │ ├── BlogTrendingMapper.java
│ │ ├── BlogDraftMapper.java
│ │ ├── BlogReportMapper.java
│ │ ├── CirclePostMapper.java
│ │ ├── CircleLikeMapper.java
│ │ ├── CircleCommentMapper.java
│ │ ├── CircleRepostMapper.java
│ │ ├── MediaMapper.java
│ │ ├── BlogPostMediaMapper.java
│ │ ├── TopicMapper.java
│ │ ├── MessageMapper.java
│ │ └── BlogDraftTagMapper.java
│ ├── dto/ # 数据传输对象
│ │ ├── UserRegisterRequest.java
│ │ ├── UserLoginRequest.java
│ │ ├── PostCreateRequest.java
│ │ └── PostQueryRequest.java
│ ├── vo/ # 视图对象
│ │ ├── UserLoginResponse.java
│ │ ├── PostDetailResponse.java
│ │ └── PostListResponse.java
│ ├── utils/ # 工具类
│ │ ├── JwtUtils.java # JWT 工具类
│ │ ├── SecurityUtils.java # 安全工具类
│ │ ├── UserContext.java # 用户上下文对象
│ │ ├── TimeUtils.java # 相对时间描述工具
│ │ ├── StringMaskUtils.java # 邮箱脱敏工具
│ │ └── UserConverter.java # SysUser→UserVO 转换
│ └── entity/ # Entity 实体类(21个)
│ ├── SysUser.java
│ ├── BlogPost.java
│ ├── BlogComment.java
│ ├── BlogTag.java
│ ├── BlogPostTag.java
│ ├── BlogLike.java
│ ├── BlogCollect.java
│ ├── BlogFollow.java
│ ├── BlogNotification.java
│ ├── BlogTrending.java
│ ├── BlogDraft.java
│ ├── BlogReport.java
│ ├── CirclePost.java
│ ├── CircleLike.java
│ ├── CircleComment.java
│ ├── CircleRepost.java
│ ├── Media.java
│ ├── BlogPostMedia.java
│ ├── Topic.java
│ ├── Message.java
│ └── BlogDraftTag.java
│ └── common/ # 公共类
│ ├── result/
│ │ └── Result.java # 统一响应结果类
│ └── exception/
│ ├── BusinessException.java # 业务异常类
│ └── GlobalExceptionHandler.java # 全局异常处理器
├── src/main/resources/
│ └── application.yml # 应用配置文件
└── pom.xml # Maven 依赖配置
项目包含 21 张数据表:
- sys_user - 用户表(含 follower_count、following_count)
- blog_post - 文章/帖子表(含 view_count、like_count、comment_count、collect_count)
- blog_comment - 评论表(支持嵌套回复)
- blog_tag - 标签表(含 post_count)
- blog_post_tag - 文章-标签关联表(自增主键)
- blog_like - 点赞记录表(自增主键)
- blog_collect - 收藏记录表(自增主键)
- blog_follow - 关注关系表
- blog_notification - 通知表
- blog_trending - 热度统计表
- blog_draft - 文章草稿表
- blog_draft_tag - 草稿-标签关联表(复合主键,1NF规范化)
- blog_report - 内容举报表
- blog_circle_post - 校友圈动态表
- blog_circle_like - 校友圈点赞表
- blog_circle_comment - 校友圈评论表
- blog_circle_repost - 校友圈转发表
- blog_media - 媒体资源表
- blog_post_media - 文章媒体关联表
- blog_topic - 话题标签表
- blog_message - 私信表
合计:7 + 14 = 21 张
- JDK 21+ (必须,项目使用 Spring Boot 3.0.12 需要 JDK 21)
- Maven 3.8+ (构建工具)
- MySQL 8.0+ (数据库)
- IDEA 2024+ / Eclipse 2024+ (推荐 IntelliJ IDEA)
① 安装 Lombok 插件
Settings → Plugins → 搜索 "Lombok" → Install → 重启 IDEA
② 启用注解处理器
Settings → Build, Execution, Deployment → Compiler → Annotation Processors
→ 勾选 "Enable annotation processing" → Apply
③ 配置 JDK
Settings → Build, Execution, Deployment → Build Tools → Maven → Runner
→ JRE 选择 JDK 21
Settings → Project → SDK → 添加 JDK 21 → 设置为 Project SDK
④ 导入项目
File → Open → 选择项目根目录 → 打开为 Maven 项目
IDEA 会自动识别 pom.xml 并下载依赖
⑤ 配置运行环境
Run → Edit Configurations → 添加新配置
→ Spring Boot → 选择 EduProjectApplication.java
→ 配置 VM options: -Dspring.profiles.active=local
⑥ 配置数据库连接(可选)
右侧 Database 面板 → 添加 MySQL 连接
填写 DB_HOST, DB_PORT, DB_NAME, DB_USERNAME, DB_PASSWORD
① 安装 Lombok
下载 lombok.jar → 右键 "Open With" → Eclipse JDT Compiler
或命令行: java -jar lombok.jar install
② 配置 JDK
Window → Preferences → Java → Installed JREs → 添加 JDK 21
Window → Preferences → Java → Compiler → 选择 JDK 21
③ 导入 Maven 项目
File → Import → Maven → Existing Maven Projects
→ 选择项目根目录 → Finish
④ 启用注解处理
Project → Properties → Java Compiler → Annotation Processing
→ 勾选 "Enable project specific settings"
① 创建数据库
CREATE DATABASE IF NOT EXISTS campus_blog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
② 执行 SQL 脚本
# 方式1: 命令行
mysql -u root -p campus_blog < 数据库表.sql
# 方式2: IDE 导入
在 MySQL Workbench 或 IDE Database 面板中打开并执行 数据库表.sql
项目使用 .env 文件管理所有敏感配置:
# 1. 复制环境变量模板
cp .env.example .env
# 2. 编辑 .env 文件,填入实际配置
# Windows PowerShell:
# copy .env.example .env
# 3. .env 文件内容示例:
DB_HOST=localhost
DB_PORT=3306
DB_NAME=campus_blog
DB_USERNAME=root
DB_PASSWORD=your_password
JWT_SECRET=your-secret-key-at-least-32-characters-long
JWT_EXPIRATION=86400000
JWT_REFRESH_EXPIRATION=604800000
SERVER_PORT=8825
⚠️ 注意:
.env 文件已添加到 .gitignore,不会提交到 Git
JWT_SECRET 至少需要 32 个字符
- 生产环境务必使用强密码
方式1: IDE 启动
运行 EduProjectApplication.java 的 main 方法
方式2: Maven 命令行
# 开发模式(热编译)
mvn spring-boot:run
# 或打包后运行
mvn clean package
java -jar target/edu_project-0.0.1-SNAPSHOT.jar
访问 API 文档:
http://localhost:8825/api/doc.html
默认管理员账号:
| 问题 |
解决方案 |
| "Java version mismatch" |
确保使用 JDK 21+,IDEA Project SDK 设置正确 |
| "Lombok not working" |
检查是否安装并启用了 Lombok 插件,注解处理器是否开启 |
| "Cannot connect to DB" |
检查 .env 配置,确认 MySQL 服务运行中 |
| "Port 8825 already in use" |
修改 SERVER_PORT 环境变量或停止占用端口的应用 |
| "Module not found" |
右键 pom.xml → Add as Maven Project |
| "Dependencies red" |
Maven 面板 → Reload All Maven Projects |
| 方法 |
路径 |
说明 |
| POST |
/api/user/register |
用户注册(密码复杂度校验 + 用户名/邮箱唯一性校验) |
| POST |
/api/user/login |
用户登录(返回JWT Token + 刷新Token) |
| POST |
/api/user/refresh |
刷新Token(使用刷新Token获取新Token) |
| GET |
/api/user/{id} |
根据ID查询用户(公开访问,任何人可查看) |
| 方法 |
路径 |
说明 |
| POST |
/api/post |
发布文章(需登录) |
| PUT |
/api/post/{id} |
更新文章(仅作者或管理员可操作) |
| DELETE |
/api/post/{id} |
删除文章(仅作者或管理员可操作) |
| GET |
/api/post/{id} |
获取文章详情(公开访问) |
| GET |
/api/post/list |
获取文章列表(支持关键词/分类/标签筛选) |
| PUT |
/api/post/{id}/view |
增加阅读量(按用户/IP防刷) |
| 方法 |
路径 |
说明 |
| POST |
/api/like/{postId} |
点赞/取消点赞(需登录) |
| GET |
/api/like/check/{postId} |
检查是否已点赞(公开访问) |
| 方法 |
路径 |
说明 |
| POST |
/api/collect/{postId} |
收藏/取消收藏(需登录) |
| GET |
/api/collect/check/{postId} |
检查是否已收藏(公开访问) |
| GET |
/api/collect/my |
获取我的收藏列表(需登录) |
| 方法 |
路径 |
说明 |
| POST |
/api/comment |
发表评论/回复(需登录) |
| GET |
/api/comment/post/{postId} |
获取文章评论列表(公开访问,树形结构) |
| DELETE |
/api/comment/{commentId} |
删除评论(仅作者或管理员可操作) |
| 方法 |
路径 |
说明 |
| GET |
/api/tag/list |
获取标签列表(公开访问) |
| POST |
/api/tag |
创建标签(需登录,body: {"name": "标签名"},使用 TagCreateRequest DTO) |
| DELETE |
/api/tag/{tagId} |
删除标签(需管理员) |
| 方法 |
路径 |
说明 |
| POST |
/api/follow |
关注用户(需登录,body: {"targetUserId": Long}) |
| DELETE |
/api/follow/{targetUserId} |
取消关注(需登录) |
| GET |
/api/follow/check/{targetUserId} |
检查是否关注(需登录) |
| GET |
/api/follow/followers/{userId} |
获取用户粉丝列表(公开访问) |
| GET |
/api/follow/following/{userId} |
获取用户关注列表(公开访问) |
| GET |
/api/follow/counts/{userId} |
获取粉丝/关注数量(公开访问) |
| 方法 |
路径 |
说明 |
| GET |
/api/notification/list |
获取通知列表(需登录) |
| GET |
/api/notification/unread-count |
获取未读通知数量(需登录) |
| PUT |
/api/notification/{id}/read |
标记单条通知已读(需登录) |
| PUT |
/api/notification/read-all |
标记全部已读(需登录) |
| DELETE |
/api/notification/{id} |
删除通知(需登录,管理员可删除任意通知) |
| 方法 |
路径 |
说明 |
| GET |
/api/trending/posts |
获取热门文章列表(公开访问) |
| GET |
/api/trending/hot-tags |
获取热门标签(公开访问) |
| POST |
/api/trending/update/{postId} |
更新文章热度(需登录) |
| 方法 |
路径 |
说明 |
| POST |
/api/post/draft |
保存草稿(需登录) |
| GET |
/api/post/draft/latest |
获取最新草稿(需登录) |
| DELETE |
/api/post/draft/{draftId} |
删除草稿(需登录) |
| GET |
/api/post/draft/{draftId} |
获取指定草稿(需登录) |
| 方法 |
路径 |
说明 |
| POST |
/api/report |
举报内容(需登录) |
| GET |
/api/report/my |
获取我的举报记录(需登录) |
| 方法 |
路径 |
说明 |
| GET |
/api/admin/reports/pending |
获取待处理举报列表(需管理员) |
| GET |
/api/admin/reports/{reportId} |
获取举报详情(需管理员) |
| PUT |
/api/admin/reports/{reportId} |
处理举报(需管理员) |
| 方法 |
路径 |
说明 |
| POST |
/api/circle/post |
发布动态(需登录) |
| GET |
/api/circle/feed/recommend |
获取推荐流(公开访问) |
| GET |
/api/circle/feed/following |
获取关注流(需登录) |
| GET |
/api/circle/post/{postId} |
获取动态详情(公开访问) |
| DELETE |
/api/circle/post/{postId} |
删除动态(需登录,仅作者) |
| POST |
/api/circle/like/{postId} |
点赞/取消点赞(需登录) |
| GET |
/api/circle/like/check/{postId} |
检查是否已点赞(需登录) |
| GET |
/api/circle/comment/{postId} |
获取动态评论(公开访问) |
| POST |
/api/circle/comment |
发表评论(需登录) |
| DELETE |
/api/circle/comment/{commentId} |
删除评论(需登录,仅作者) |
| POST |
/api/circle/repost/{postId} |
转发动态(需登录) |
| GET |
/api/circle/search |
搜索动态(公开访问,keyword, page, pageSize) |
| 方法 |
路径 |
说明 |
| PUT |
/api/user/password |
修改密码(需登录,body: {"oldPassword": "", "newPassword": ""}) |
| PUT |
/api/user/profile |
修改用户资料(需登录,body: {"nickname": "", "email": ""}) |
| PUT |
/api/user/avatar |
修改头像(需登录,body: {"avatar": "url"}) |
| GET |
/api/user/search |
搜索用户(需登录,参数: keyword, page, pageSize) |
| GET |
/api/post/my |
获取我的文章列表(需登录) |
| GET |
/api/comment/my |
获取我的评论列表(需登录) |
| GET |
/api/like/my |
获取我的点赞列表(需登录) |
| 方法 |
路径 |
说明 |
| GET |
/api/admin/user/list |
用户列表(需管理员,分页、状态筛选) |
| PUT |
/api/admin/user/{id}/status |
封禁/解封用户(需管理员) |
| PUT |
/api/admin/user/{id}/reset-password |
重置用户密码(需管理员) |
| 方法 |
路径 |
说明 |
| GET |
/api/admin/post/list |
文章列表(需管理员,分页、状态/用户/分类筛选) |
| DELETE |
/api/admin/post/{id} |
删除文章(需管理员,级联删除) |
| DELETE |
/api/admin/comment/{id} |
删除评论(需管理员,级联删除) |
| 方法 |
路径 |
说明 |
| POST |
/api/topic |
创建话题(需管理员) |
| GET |
/api/topic/list |
话题列表(公开访问) |
| GET |
/api/topic/hot |
热门话题(公开访问) |
| GET |
/api/topic/{topicId}/posts |
话题下的动态列表(公开访问) |
| 方法 |
路径 |
说明 |
| GET |
/api/post/search/advanced |
文章高级搜索(需登录) |
| GET |
/api/post/search/suggest |
获取搜索建议(需登录) |
| 方法 |
路径 |
说明 |
| POST |
/api/media/upload |
上传图片/视频(需登录,支持批量) |
| GET |
/api/media/{id} |
获取媒体详情(需登录) |
| GET |
/api/media/list |
获取我的媒体列表(需登录) |
| DELETE |
/api/media/{id} |
删除媒体(需登录,仅作者) |
| POST |
/api/media/upload/multiple |
批量上传图片/视频(需登录) |
| POST |
/api/media/bind/{postId} |
绑定媒体到文章(需登录) |
| GET |
/api/media/post/{postId} |
获取文章的媒体列表(需登录) |
| 方法 |
路径 |
说明 |
| GET |
/api/admin/post/list |
文章列表(需管理员,分页筛选) |
| GET |
/api/admin/post/review-list |
待审核文章列表(需管理员) |
| PUT |
/api/admin/post/{id}/approve |
审核通过文章(需管理员) |
| PUT |
/api/admin/post/{id}/reject |
驳回文章(需管理员) |
| DELETE |
/api/admin/post/{id} |
删除文章(需管理员) |
| 方法 |
路径 |
说明 |
| POST |
/api/message/send |
发送私信 |
| GET |
/api/message/received |
获取收到的私信 |
| GET |
/api/message/sent |
获取发送的私信 |
| PUT |
/api/message/{id}/read |
标记已读 |
| DELETE |
/api/message/{id} |
删除私信 |
| GET |
/api/message/unread-count |
获取未读数 |
| 方法 |
路径 |
说明 |
| POST |
/api/user/send-code |
发送验证码邮件(需登录) |
| POST |
/api/user/reset-password |
重置密码(需登录,body: code, email, newPassword) |
所有 API 接口统一返回 Result<T> 格式:
{
"code": 200,
"message": "操作成功",
"data": { ... },
"timestamp": 1234567890123
}
- Controller 层:接收请求、参数校验、返回响应
- Service 层:处理核心业务逻辑
- Mapper 层:数据库操作(使用 MyBatis Plus)
- Entity 层:数据实体(使用 Lombok 简化)
- 逻辑删除:所有表都有
isDeleted 字段
- 自动填充:
createTime 和 updateTime 自动填充
- 分页插件:已配置
实现用户注册、登录功能 ✅ 已完成
实现文章的增删改查接口 ✅ 已完成
启用 Spring Security + JWT 认证 ✅ 已完成
代码安全加固与Bug修复 ✅ 已完成
实现评论、点赞、收藏功能 ✅ 已完成
实现登录限流与账号锁定机制 ✅ 已完成
实现XSS防护过滤器 ✅ 已完成(HtmlSanitizer + Jsoup)
- 对接前端页面
- 🔧 SecurityConfig 白名单修复: 新增 11 条 permitAll 规则(circle/follow/topic/user 公开端点)
- 🔧 JwtAuthenticationFilter Critical 修复: Refresh Token 用于非刷新端点时返回 401(而非匿名通过)
- 🔧 JwtUtils 黑名单容量保护: 新增 BLACKLIST_MAX_SIZE=100_000,防止内存无限增长
- 🔧 BlogTagServiceImpl 管理员权限: deleteTag 添加管理员校验,listAllTags 添加只读事务
- 🔧 TrendingServiceImpl 状态校验: updatePostTrending 仅统计已发布文章(status=1)
- 🔧 EmailServiceImpl 异常处理: verifyCode/sendHtmlEmail 统一使用 BusinessException
- 🔧 CircleController 参数校验: searchPosts 的 keyword 参数添加 @NotBlank 验证
- ✨ 新增内容审核流程:待审核/通过/驳回状态管理
- ✨ 新增私信功能:发送/接收/标记已读/未读消息
- ✨ 新增密码找回功能:邮件验证码重置密码
- 🔧 修复 entrypoint.sh 语法错误
- 🔧 修复 Entity 与数据库表不一致问题
- 🔧 修复测试配置问题
- 📝 更新文档:组件数量和接口列表
- 🔒 安全修复:XSS过滤、文件上传校验、toString密码泄露、multipart配置
- ✨ 管理员接口:AdminUserController 用户列表/封禁接口
- ✨ 话题标签:TopicController 话题列表/详情/热门接口
- ✨ 数据统计:AdminStatisticsController 平台统计数据接口
- ✨ 新增功能:内容审核流程(待审核/通过/驳回状态管理)
- 🔧 优化:普通用户发布文章 status=0(待审核),管理员发布 status=1(直接发布)
- 📝 单元测试:SysUserServiceImplTest、JwtUtilsTest、GlobalExceptionHandlerTest
- ⚙️ 配置完善:Actuator健康检查、多环境配置、logback日志配置
- ⚙️ 异步优化:AsyncConfig自定义线程池配置
- ⚙️ 权限集中:@PreAuthorize注解替代手动权限检查
- 📦 部署文档:DEPLOY.md、Dockerfile、docker-compose.yml
- 🔒 Critical 修复:CircleServiceImpl 添加 XSS 防护(htmlSanitizer.sanitizePlainText)
- 🔒 Critical 修复:MediaServiceImpl 添加文件头 Magic Number 校验
- 🔒 Critical 修复:修复 application.yml multipart 配置缩进错误
- 🔒 Critical 修复:SysUser.toString() 添加 @ToString.Exclude 防止密码泄露
- 🔒 Critical 修复:CORS 配置限制为必要的 Header 和 Method
- 🔧 Bug 修复:@提及通知修复(targetId 从 null 改为正确的动态 ID)
- ✨ 新增功能:个人中心接口(我的文章/评论/点赞列表)
- ✨ 新增功能:用户资料修改(昵称、邮箱、头像)
- ✨ 新增功能:管理员后台(用户管理、内容管理接口)
- ✨ 新增功能:@提及解析功能(发布动态时自动通知被提及用户)
- ✨ 新增功能:话题标签功能(#话题名 解析、话题聚合)
- ⚡ 性能优化:NotificationServiceImpl N+1 查询修复(批量查询用户)
- ⚡ 性能优化:CircleServiceImpl N+1 查询修复(批量查询用户和原动态)
- ⚡ 性能优化:BlogTrendingMapper.xml 慢查询优化(相关子查询改为 JOIN)
- ⚡ 性能优化:TrendingServiceImpl.getHotTags 添加 LIMIT 限制
- 🔧 增强配置:启用 @EnableMethodSecurity 和 @PreAuthorize 注解
- 🔧 增强配置:添加 Caffeine 本地缓存配置(@Cacheable)
- 🔧 增强配置:添加 Spring Boot Actuator 健康检查
- 🔧 增强配置:创建 application-dev.yml / application-prod.yml 多环境配置
- 🔧 增强配置:创建 logback-spring.xml 日志配置(滚动、保留30天)
- 📝 代码架构:DTO 归位(CircleCommentRequest 移至 dto 包)
- 📝 代码架构:分层修复(MediaServiceImpl 通过 Service 访问数据)
- 📝 代码架构:Entity 添加 @Schema 注解完善 API 文档
- 📝 代码架构:Result.java 添加 @Schema 注解
- 📝 代码架构:创建 HotPostVO/HotTagVO 替代 Object 返回类型
- 📝 新增文档:DEPLOY.md 部署文档
- 📝 新增文档:Dockerfile、docker-compose.yml、.dockerignore、entrypoint.sh
- 🧪 测试增强:新增单元测试类(SysUserServiceImplTest、JwtUtilsTest、BlogLikeServiceImplTest、GlobalExceptionHandlerTest)
- 🔧 High 修复:添加登录失败日志(密码错误、用户不存在、账号锁定)
- 🔧 High 修复:添加密码修改日志
- 🔧 High 修复:添加评论创建日志
- 🔧 High 修复:NotificationServiceImpl markAsRead 增加管理员权限校验
- 🔧 Medium 修复:修复分页参数在DTO层校验(@Max(100)限制)
- 🔧 Critical 修复:安全漏洞 - 移除登录响应中的邮箱/角色字段
- 🔧 Critical 修复:安全漏洞 - 用户详情接口仅用户本人或管理员可见邮箱/角色
- 🔧 High 修复:高级搜索接口改为公开接口(无需登录)
- 🔧 High 修复:所有分页接口添加 @Min/@Max 边界校验
- 🔧 High 修复:添加用户注册、登录、关注、文章操作等关键日志
- 🔧 High 修复:BlogPostServiceImpl 空指针防护加强
- 🔧 High 修复:pom.xml Lombok 升级至 1.18.40(兼容 Java 25)
- 🔧 High 修复:pom.xml 添加 maven-compiler-plugin 配置 Lombok 注解处理器
- 🔧 High 修复:举报下架文章 status 从 0 改为 2(1=已发布,0=草稿,2=已下架)
- 🔧 High 修复:refreshToken 增加用户状态校验(验证用户存在/未禁用/未锁定)
- 🔧 High 修复:MediaController getMediaInfo/getPostMedia 增加权限校验
- 🔧 Medium 修复:BlogCommentServiceImpl getCommentsByPostId 增加文章 status==1 校验
- 🔧 Medium 修复:BlogCollectServiceImpl getMyCollections 过滤 status!=1 的文章
- 🔧 Medium 修复:ReportServiceImpl.convertToUserVO 增加空值保护
- 🔧 Low 优化:FollowController 粉丝/关注列表增加分页支持(page/pageSize 参数)
- 🔧 Critical 修复:6个Mapper物理删除改为逻辑删除(is_deleted=1)
- 🔧 Critical 修复:通知发送改为事件机制(@TransactionalEventListener)
- 🔧 High 修复:Map转换添加merge function防止重复key
- 🔧 High 修复:getPostDetail添加@Transactional(readOnly=true)
- 🔧 High 修复:parentComment.getPostId() NPE修复
- 🔧 High 修复:CORS配置默认端口从通配符改为具体端口8080
- 🔧 API 调整:创建标签接口改为仅需登录
- ✨ 新增功能:删除标签接口 DELETE /api/tag/{tagId}(仅管理员)
- ✨ 新增事件机制:CommentCreatedEvent、LikeCreatedEvent、FollowCreatedEvent
- ✨ 新增 NotificationEventListener:事务提交后异步发送通知
- 🔧 API 调整:GET /api/user/{id} 改为公开访问,任何人可查看用户信息
- 🔧 通知系统增强:管理员可删除任意用户的通知
- 🔧 DTO 规范化:BlogTagController 使用 TagCreateRequest DTO 替代 Map
- 🔧 API 调整:粉丝/关注列表接口(followers/following/counts)改为公开访问
- 📝 新增 TagCreateRequest.java DTO 类
- 🔧 通知系统修复:集成 sendNotification 到点赞/评论/关注服务,通知系统正式启用
- 🔧 校友圈 Bug 修复:推荐流对未登录用户返回空问题修复
- 🔧 校友圈 Bug 修复:内容类型定义修正(1=纯文本,2=图文,3=转发)
- 🔧 校友圈 Bug 修复:发布动态参数校验修正,允许图文动态和纯转发动态
- 🔧 趋势系统 Bug 修复:SQL 分页使用 LIMIT/OFFSET,修复今日数据被排除问题
- 🔧 趋势系统 Bug 修复:添加 isDeleted 检查,修复大事务问题
- 🔧 草稿系统 Bug 修复:saveDraft 正确处理 draftId 参数
- 🔧 草稿系统 Bug 修复:删除草稿添加管理员权限豁免
- 🔧 草稿系统 Bug 修复:搜索建议改为公开功能,convertToSaveDraftRequest 增加异常处理
- 🔧 举报系统 Bug 修复:状态值定义统一,添加处理联动操作(封禁用户/下架文章)
- 🔧 举报系统 Bug 修复:添加重复举报检查,ReportVO 添加 handlerId 字段
- 🔧 高级搜索 Bug 修复:移除 .last("LIMIT 10") 改用 Page 对象,添加关键词长度限制
- 🔧 媒体系统修复:添加 Spring 文件上传配置(500MB 限制)
- 📝 文档:删除 CAMPUS_BLOG_ENHANCEMENT_PLAN.md 增强计划文档
- 🔧 安全审计修复:CircleLikeMapper 表名错误 (circle_like → blog_circle_like)
- 🔧 安全审计修复:deletePost 删除时缺少级联删除关联数据
- 🔧 安全审计修复:toggleLike 缺少可见性权限检查
- 🔧 安全审计修复:getRecommendFeed 和 searchPosts 可见性过滤漏洞
- 🔧 安全审计修复:canViewPost 添加 NPE 防护
- 🔧 API 修复:Token 刷新响应格式文档修正
- 🔧 API 修复:登录响应新增 avatar 字段
- 🔧 API 修复:前端 refreshToken 示例代码缺少 Authorization header
- 🔧 数据库增强:为 BlogLike/BlogCollect/BlogFollow/CircleLike/BlogTrending 添加 @TableUnique 注解
- 📝 文档:CORS 配置添加生产环境安全警告
- 📝 文档:所有文档版本号更新至 v1.25
- 🌐 校友圈权限升级:新增 visibility/allowComment/allowRepost 字段
- 🌐 可见性控制:0=公开,1=仅关注者,2=仅自己
- 🌐 评论/转发权限:可以关闭评论或禁止转发
- 🌐 Feed 权限过滤:推荐流/关注流/搜索/详情页都做了权限校验
- 🌐 转发权限检查:转发时验证用户是否有权查看原动态
- 🌐 评论列表检查:获取评论前验证用户是否有权查看动态
- 🌐 转发原动态隐藏:当转发的原动态无权查看时返回 originalPostHidden 标记
- 🔧 端口变更:默认端口从 80 改为 8825,可通过环境变量 SERVER_PORT 覆盖
- 📝 前端开发文档同步更新:校友圈 API 新增字段说明
- 📝 端口变更:所有文档中的 localhost:8080 改为 localhost:8825
- ✨ 新增:标签创建功能 POST /api/tag,支持创建新标签
- 📝 文档:API 接口文档添加标签创建接口
- 📝 前端开发文档:完善至完整版 v1.23,覆盖全部 13 个 Controller 接口
- 📝 补充缺失接口:关注、通知、草稿、举报、校友圈、媒体、热门/趋势、标签
- 📝 新增状态管理方案:发布-订阅模式的全局状态管理
- 📝 新增错误处理:Toast 提示组件、表单前端校验
- 📝 完善 Token 刷新:集成到 Axios 拦截器自动处理
- 📝 新增页面清单:个人中心、校友圈、通知中心、管理员后台等完整页面列表
- 📝 新增开发指南:环境配置、移动端适配、安全注意事项、调试技巧
- 📝 更新技术栈:Marked.js 9.x、Highlight.js 11.x、DOMPurify 3.x
- 📝 前端开发文档:完善至完整版 v1.23,覆盖全部 13 个 Controller 接口
- 📝 补充缺失接口:关注、通知、草稿、举报、校友圈、媒体、热门/趋势、标签
- 📝 新增状态管理方案:发布-订阅模式的全局状态管理
- 📝 新增错误处理:Toast 提示组件、表单前端校验
- 📝 完善 Token 刷新:集成到 Axios 拦截器自动处理
- 📝 新增页面清单:个人中心、校友圈、通知中心、管理员后台等完整页面列表
- 📝 新增开发指南:环境配置、移动端适配、安全注意事项、调试技巧
- 📝 更新技术栈:Marked.js 9.x、Highlight.js 11.x、DOMPurify 3.x
- ✨ 新增校友圈搜索功能:GET /api/circle/search(关键词搜索动态)
- 🐛 修复 FollowServiceImpl 潜在 NPE:follow/unfollow 方法添加 targetUserId 和 currentUserId null 检查
- 🐛 修复搜索关键词无长度限制问题:限制最大 200 字符
- 📝 文档更新:README.md 更新至 v1.21
- 🔒 安全修复:ReportServiceImpl 添加管理员权限校验
- 🔒 安全修复:SysUserServiceImpl.login 密码验证顺序修正(先检查账户状态)
- 🐛 修复 toggleLike/toggleCollect/follow/unfollow 逻辑删除+唯一约束冲突 bug
- 🐛 修复 TrendingServiceImpl.getHotTags 分页-排序错误
- 🐛 修复 MediaServiceImpl 软删除机制统一(移除手动 status 检查)
- 📝 文档更新:README.md、campus_blog.md、前端开发文档.md 等更新至 v1.20
- 📝 修复 CLAUDE.md 数据库表数量(7→18)
- 📝 移除对不存在文档 MEDIA_UPLOAD_PLAN.md 的引用
- ✨ 新增社交/关注系统:BlogFollow、FollowService、FollowController
- ✨ 新增通知系统:BlogNotification、NotificationService、NotificationController
- ✨ 新增热门/趋势系统:BlogTrending、TrendingService、TrendingController
- ✨ 新增草稿自动保存:BlogDraft、SaveDraftRequest
- ✨ 新增举报管理:BlogReport、ReportService、AdminReportController
- ✨ 新增校友圈动态:CirclePost、Media、CircleService、CircleController
- ✨ 新增校友圈点赞/评论/转发:CircleLike、CircleComment、CircleRepost
- ✨ 新增修改密码和用户搜索功能
- ✨ 新增文章高级搜索和搜索建议自动补全
- ✨ 新增媒体上传功能:图片/视频上传、批量上传、自动压缩
- 🔒 修复 CircleServiceImpl.deleteComment 越权逻辑漏洞
- 🔧 实体层:BlogPostMedia 添加 @TableLogic 和 isDeleted 字段支持软删除
- 🔧 Mapper层:BlogPostMediaMapper.xml foreach 语法修复
- 🔧 媒体:MediaController 单文件上传路径修正为 /media/upload
- 🔧 软删除:CircleServiceImpl 和 BlogPostServiceImpl 多处添加 isDeleted 过滤
- 🔧 数据库表结构更新:新增11张增强功能表
- 🔧 sys_user 新增 follower_count、following_count 字段
- 🔧 blog_post 新增 collectCount、cover_url 字段
- 🎨 新增标签查询功能:添加 BlogTagService 接口和 BlogTagController GET /tag/list
- 🔧 BlogPost 新增 collectCount 字段,BlogCollectServiceImpl.toggleCollect() 正确更新收藏数
- 🔧 getPostDetail 未发布文章返回"文章未发布"(区分不存在)
- 🔧 BlogPost 新增 collectCount 字段,BlogCollectServiceImpl.toggleCollect() 正确更新收藏数
- 🔧 getPostDetail 未发布文章返回"文章未发布"(区分不存在)
- 🔧 移除 JwtUtils.getUserIdFromRequest() 和 SecurityUtils.getCurrentUserRole() 死代码
- 🔧 移除 BlogCollectServiceImpl 未使用的 ConcurrentHashMap import
- 🔒 修复 JWT 黑名单验证绕过漏洞:revokeToken() 先验证签名再加入黑名单
- 🔒 修复 isTokenExpired() 异常处理:只有 ExpiredJwtException 算过期
- 🔒 修复 JwtAuthenticationFilter:先验证签名再检查黑名单,role 为 null 时使用默认 ROLE_USER
- 🔧 修复 refresh token rotation:刷新时返回新的 refresh token
- 🔧 JwtAuthenticationFilter logger.warn 格式修复
- 🔒 修复点赞/收藏锁内存泄漏:getLock/getCollectLock 添加主动清理过期锁
- 🔒 修复阅读量增加 TOCTOU 竞态条件:使用 CAS 操作替代直接 set
- 🔧 统一密码最小长度:UserRegisterRequest DTO 密码最小长度从 6 改为 8
- 🔧 移除 DotenvConfig 硬编码路径 "D:/MyCode/edu_project"
- 🔧 添加 category 字段 XSS 防护:在 BlogPostServiceImpl 中对 category 进行 HTML 过滤
- 🔧 移除所有 Controller 的 @CrossOrigin 注解(使用全局 CORS 配置)
- 🔧 JwtUtils: 移除未使用的 generateToken(Long, String) 重载方法
- 🔧 HtmlSanitizer: 移除未使用的 containsDangerousTags 方法
- 🔒 移除 JWT/Database 密码硬编码默认值(安全加固)
- 🔒 BlogLikeServiceImpl: 添加 updatedPost 空指针检查
- 🔧 BlogCommentServiceImpl: 添加评论递归深度限制(MAX_RECURSION_DEPTH=100)
- 🔧 BlogPostServiceImpl: 移除未使用的 convertToDetailResponse 死代码
- 📝 README.md: XSS防护过滤器标记为已完成
- 📝 前端开发文档.md: 版本号更新至 v1.11
- 🔒 JwtAuthenticationFilter: 添加 Token 撤销检查 + 修复权限列表
- 🔒 HtmlSanitizer: 移除 img 标签 data: 协议防止 XSS bypass
- 🔒 SysUserServiceImpl: 登录锁定信息通用化防用户枚举
- 🔧 CommentCreateRequest: postId 添加 @NotNull 校验
- 🔧 BlogCommentServiceImpl: 修复 O(n²) 父评论查找为 O(n)
- 🔧 EduProjectApplication: System.out.println 改为 SLF4J 日志
- 🔒 修复用户枚举漏洞:注册时使用通用错误信息防止用户名/邮箱枚举攻击
- 🔒 修复点赞/收藏竞态条件:使用细粒度锁 + DuplicateKeyException 处理保证并发安全
- 🔒 新增 XSS 防护:使用 Jsoup 过滤文章和评论内容
- 🔧 完善@Transactional注解:所有只读方法添加readOnly=true
- 🔧 修复batchInsertPostTags缺少@Transactional注解问题
- 📝 更新数据库表结构文档(blog_post_tag、blog_like、blog_collect)
- 📝 修复访问端口(改为80而非8080)
- 📝 所有md文档同步更新至v1.10
- 🔒 修复IP伪造漏洞:未登录用户指纹改为IP+User-Agent哈希组合
- 🔒 修复点赞竞态条件:使用try-catch处理DuplicateKeyException
- 🔒 修复评论删除级联问题:递归删除子评论,正确更新评论计数
- 🔒 新增登录失败锁定机制:连续5次失败锁定15分钟(原子更新,并发安全)
- 🔒 提升BCrypt强度:10轮提升至12轮
- 🔒 新增JWT Token黑名单机制:支持主动撤销Token
- 🔒 新增JWT刷新Token机制:支持生成7天有效期的refreshToken
- 🔒 实现Refresh Token Rotation:使用后自动撤销旧Token
- 🔒 新增JWT黑名单定时清理:每小时清理过期Token
- 🔧 新增SysUser字段:loginFailCount、lockUntil
- 🔧 新增BlogPostMapper重载方法:decrementCommentCount支持批量减数
- 🔧 新增用户登录返回refreshToken字段
- 🔧 新增刷新Token接口:POST /api/user/refresh
- 🔧 新增JwtSchedulerConfig定时任务配置类
- 🔧 新增SysUserMapper.incrementLoginFailCount原子更新方法
- 📝 更新文档:所有md文档同步更新
- ✨ 新增点赞模块:支持点赞/取消点赞,自动更新文章点赞数
- ✨ 新增收藏模块:支持收藏/取消收藏,分页查看我的收藏列表
- ✨ 新增评论模块:支持发表评论/回复,树形结构展示评论列表
- 🔧 优化BlogLike和BlogCollect实体:新增自增id字段
- 🔧 更新SecurityConfig:添加新接口的权限控制
- 🔧 新增多个DTO/VO类:LikeStatusVO、LikeResultVO、CollectStatusVO、CollectResultVO、CollectItemVO、CommentCreateRequest、CommentVO
- 📝 完善项目文档:更新README.md和CLAUDE.md
- 🔒 新增管理员权限支持:管理员可删除任意评论
- 🔧 修复SecurityConfig路径匹配错误(添加/api前缀)
- 🔧 修复阅读量防刷逻辑(按用户/IP区分,不再按文章ID全局限制)
- 🔧 修复BlogPostTag联合主键配置(新增自增id字段)
- 🔧 修复阅读量重复增加问题(移除getPostDetail中的自动增加)
- 🔧 完善用户注册体验(提前检查用户名/邮箱存在性)
- ✨ 新增管理员权限支持(admin可修改/删除所有文章)
- ✨ JWT Token新增角色信息,SecurityUtils支持权限检查
- ✨ 新增UserContext用户上下文对象
- ⚡ 优化SecurityUtils性能(避免不必要的异常开销)
- 📝 完善配置文件说明(明确生产环境环境变量要求)
- 🔒 SQL日志支持环境变量配置控制
- 全面安全加固与代码质量修复
- SysUser添加@JsonIgnore防密码泄露
- getById返回UserVO替代SysUser实体
- 敏感信息(DB密码、JWT密钥)改为环境变量
- 添加防刷机制和权限校验
- Entity联合主键和逻辑删除修复
- 实现文章管理模块完整功能
- 新增 BlogPostController(文章 CRUD 接口)
- 新增 PostCreateRequest、PostQueryRequest DTO
- 新增 PostDetailResponse、PostListResponse VO
- 实现文章标签关联管理(BlogPostTag)
- 实现文章分页查询
- 实现阅读量统计
- 实现用户注册功能(用户名/邮箱唯一性校验、BCrypt 密码加密)
- 实现用户登录功能(密码校验、JWT Token 生成)
- 启用 Spring Security + JWT 依赖
- 新增 JwtUtils 工具类
- 新增 DTO/VO 层(UserRegisterRequest、UserLoginRequest、UserLoginResponse)
- SecurityConfig 配置 JWT 认证过滤器
- 解决 Spring Boot 与 MyBatis Plus 兼容性问题
- 确定稳定版本组合:Spring Boot 3.0.12 + MyBatis Plus 3.5.5
- 暂时注释 Spring Security 和 JWT 依赖(开发阶段)
- 注释分页插件配置(依赖问题)
- 项目成功启动并正常运行
- 完善所有实体类配置(逻辑删除、自动填充)
- 修复联合主键实体类配置
- 添加逻辑删除字段
- 创建 MetaObjectHandler 自动填充处理器
- 创建完整的 Service 层
- 创建全局异常处理器
- 添加 Spring Security 和 JWT 依赖
- 初始化项目骨架
- 数据库设计完成
- 实现基础 CRUD 接口
刘畅