项目名称基于AI大模型 的智能考研社区撰写日期2026年6月11日本周的任务是完成帖子管理/post模块的开发按照API文档的规划实现帖子的增删查、点赞收藏、评论回复、历史记录与推荐等功能。Post模块开发过程1.模块说明点赞表分片:post_like表按userId % 4分片对应物理表post_like_0~post_like_3历史记录分片:post_history表按userId % 4分片对应物理表post_history_0~post_history_3系统消息通知: 点赞、评论、回复等互动操作需通过聊天系统以系统消息身份通知帖主MessageConstant.TYPE_SYSTEM发送方 ID 为-1AI 自动审核: 若开启 AI 自动审批帖子/评论创建后会通过消息队列触发 AI 审核功能全景 - 内容发布 创建帖子绑定标签可选 AI 自动审核- 互动系统 点赞/取消点赞、收藏/取消收藏、评论/删除评论、回复评论/删除回复- 查询检索 搜索公开帖子、查看我的帖子、查看我的收藏、查看浏览历史- 帖子详情 分页展示评论含子回复嵌套自动记录浏览历史- 推荐流 基于 post_recommend 权重表 Redis 去重智能刷新首页帖子- 系统通知 点赞、评论、回复时通过 WebSocket 数据库双通道推送系统消息2.技术架构1分层架构Post 模块采用经典的三层架构Controller 仅负责参数接收与结果封装Service 承载全部业务逻辑PostController接口层17 个 POST 端点│▼ 依赖注入RequiredArgsConstructorIPostService接口层19 个方法签名│▼PostServiceImpl服务层~928 行完整实现│├── PostMapper标准帖子 CRUD├── PostLikeMapper点赞分表 _0~3├── PostHistoryMapper历史记录分表 _0~3├── PostCollectMapper收藏├── PostCommentMapper评论├── PostCommentReplyMapper评论回复├── PostLabelMapper帖子-标签关联├── PostRecommendMapper推荐权重├── LabelMapper标签├── UserMapper用户├── AIAuditMapperAI 审核配置└── MessageMapper系统消息2分表策略背景 点赞和历史记录在高并发场景下数据量巨大单表性能瓶颈显著。实现方案 使用 MyBatis-Plus 的 DynamicTableNameInnerInterceptor 实现动态表名替换。用户请求│▼PostServiceImpl.like()│ ① userId % 4 → suffix 0|1|2|3│ ② DynamicTableHolder.setSuffix(suffix)│ ③ postLikeMapper.insert(postLike)│ ↓│ MybatisPlusInterceptor 拦截 SQL│ ↓│ tableName post_like → post_like_0动态拼装│ ↓│ INSERT INTO post_like_0 (...) VALUES (...)│▼DynamicTableHolder.remove()finally 块确保清理涉及文件- config/DynamicTableHolder.java ThreadLocal 持有当前分表后缀- config/MybatisPlusConfig.java 注册 DynamicTableNameInnerInterceptor 拦截 post_like 和 post_history 两张表⚠️ 关键注意每次分表操作必须在 finally 块中调用 DynamicTableHolder.remove() 清理 ThreadLocal防止线程复用导致的分表串扰。3系统通知机制Post 模块首次在业务代码中实现了完整的 messageMapper.insert() 数据库写入修复了前两个模块Dialog 和 Admin中系统消息只构造未入库的历史遗留问题。PostServiceImpl.sendSystemMessage(receiverId, content)│├── ① messageMapper.insert(message) ← 数据库持久化│ Message.senderId -1 (SYSTEM_USER_ID)│ Message.type 2 (TYPE_SYSTEM)│└── ② messageServer.sendToUser(receiverId, wsPackage)WebSocketMessagePackage { type: 2, data: content,timestamp }→ 在线用户实时收到通知→ 离线用户下次登录通过 Message 接口拉取通知触发时机操作通知内容模板接收方点赞帖子用户{userId} 点赞了你的帖子《{title}》帖主评论帖子用户{userId} 评论了你的帖子《{title}》{前50字}...帖主回复评论用户{userId} 回复了你的评论{前50字}...原评论作者子回复用户{userId} 回复了你的评论{前50字}...被回复人4AI 自动审批集成参考 Admin 模块的 AI 审核设计Post 模块遵循相同的检查配置 → 异步发送 → AI 消费模式。在 add() 、 comment() 、 replyComment() 三个写操作中统一调用 getAIAuditConfig() 判断是否需要自动审核AIAudit aiAudit getAIAuditConfig(); if (aiAudit ! null aiAudit.getIsAiAudit() ! null aiAudit. getIsAiAudit() 1) { MapString, Object auditMsg new HashMap(); auditMsg.put(contentId, post.getId()); auditMsg.put(contentType, 1); // 1帖子, 2评论, 3回复 rabbitMQUtils.sendAsync(RabbitMQConfig.AI_AUDIT_QUEUE, JSON. toJSONString(auditMsg)); }3.开发任务清单任务 1新建 5 个 Mapper 接口由于 PostCommentMapper 和 PostCommentReplyMapper 已在 Admin 模块开发中创建本次只需新建剩余 5 个Mapper对应表PostLikeMapper.javapost_likePostCollectMapper.javapost_collectPostLabelMapper.javapost_labelPostRecommendMapper.javapost_recommendPostHistoryMapper.javapost_history任务 2新建分表基础设施1DynamicTableHolder.javaThreadLocal 持有当前线程的分表后缀 0 / 1 / 2 / 3 提供 setSuffix() 、 getSuffix() 、 remove() 三个静态方法。2MybatisPlusConfig.java注册 MybatisPlusInterceptor Bean内嵌 DynamicTableNameInnerInterceptor 。表名处理逻辑(sql, tableName) - { String suffix DynamicTableHolder.getSuffix(); if (suffix ! null (post_like.equals(tableName) || post_history.equals(tableName))) { return tableName _ suffix; } return tableName; }任务 3扩展 IPostService 接口在原有的 12 个方法基础上新增 7 个方法签名新增方法对应接口说明ListPostListVO listMyPostList(PostQueryDTO)/listMyPost我的帖子标题→内容→标签三级匹配void comment(CommentDTO)/comment评论帖子 AI 审核 系统通知void undoComment(BaseRequest)/undoComment删除评论级联删除子回复void replyComment(CommentDTO)/replyComment回复评论 / 子回复void undoReplyComment(BaseRequest)/undoReplyComment删除回复评论ListPostListVO freshPost()/freshPost推荐流刷新最终 IPostService 共 19 个方法签名 。任务 4实现 PostServiceImpl这是本次开发最核心的文件完整实现 19 个业务方法。以下按功能分组介绍1内容创建与删除① add(PostDTO) — 创建帖子Transactional流程1. 从 BaseContext.getCurrentId() 获取当前用户2. 构建 Post 对象 status0 待审核计数器全为 03. PojoUtil.initCreate() 填充 createTime / updateTime / deleted4. save(post) 插入数据库5. 处理标签新标签自动创建 type1 表示帖子标签建立 post_label 关联6. 检查 AI 自动审核配置 → 可选发送 AI 审核请求到 ai-audit-routing-key② delete(BaseRequest) — 逻辑删除Transactional流程1. 校验帖子存在且属于当前用户2. 设置 deleted1 更新 updateTime2点赞系统分表③ like(BaseRequest) — 点赞Transactional1. 校验帖子存在2. DynamicTableHolder.setSuffix(userId % 4)3. 查询 post_like_X 表是否已点赞 → 幂等返回4. 插入点赞记录到分表5. UPDATE post SET like_count like_count 16. 向帖主发送系统消息自己给自己点赞不通知7. finally: DynamicTableHolder.remove()④ undoLike(BaseRequest) — 取消点赞Transactional1. 查分表获取点赞记录 → 不存在则幂等返回2. 删除分表记录3. UPDATE post SET like_count GREATEST(like_count - 1, 0) ← 防负数3收藏系统⑤ collect(BaseRequest) — 收藏Transactional直接操作 post_collect 表无分表先查重再插入使用 setSql(collect_count collect_count 1) 更新计数。⑥ undoCollect(BaseRequest) — 取消收藏Transactional逻辑与取消点赞一致使用 GREATEST(collect_count - 1, 0) 防负数。4帖子详情⑦ detail(PostDetailDTO) — 查看帖子详情Transactional1. 查询帖子 帖主信息2. 构造 PostVO 填充基本字段3. 分表查询当前用户是否已点赞 → isLike4. 查询当前用户是否已收藏 → isCollect5. 查询帖子标签列表 → labels6. 分页查询评论PagePostComment7. 每条评论嵌套查询子回复 → CommentVO.children8. 记录浏览历史addToHistory- 已存在 → 更新 recentTime- 不存在 → INSERT 到 post_history_X评论嵌套结构 CommentVO├── id, userId, userName, userAvatar, text├── sendTime, status└── children: ListCommentReplyVO├── id, userId, userName, userAvatar, text├── commentId所属评论 ID├── isSubReply是否子回复├── subUserId, subUserName被回复用户└── sendTime, status5搜索与列表⑧ listPostList(PostQueryDTO) — 搜索帖子公共帖子搜索 deleted0 AND status1 只展示通过的支持 title/text keyword 模糊匹配按 createTime 降序。⑨ listMyPostList(PostQueryDTO) — 我的帖子先按标题内容 keyword 匹配返回结果后再补充标签匹配的结果去重后追加到列表末尾。⑩ listMyCollectList(PostQueryDTO) — 我的收藏查询 post_collect 表获取收藏列表过滤已删除帖子支持 keyword 在标题/内容/标签三级匹配。⑪ listMyHistoryList(PostQueryDTO) — 我的历史从 post_history_X 分表查询按 recentTime 降序同样支持三级 keyword 匹配过滤。⑫ deleteMyHistory(BaseRequest) — 删除历史物理删除分表中的指定记录。6评论系统⑬ comment(CommentDTO) — 发表评论Transactional1. 校验帖子存在2. INSERT post_commentstatus0 待审核3. UPDATE post SET comment_count comment_count 14. 可选 AI 自动审核contentType25. 向帖主发送系统消息截断正文至 50 字⑭ undoComment(BaseRequest) — 删除评论Transactional1. 校验评论存在且属于当前用户2. 设置评论 deleted13. 物理删除该评论下的所有子回复4. UPDATE post SET comment_count GREATEST(comment_count - (1 子回复数), 0)⑮ replyComment(CommentDTO) — 回复评论Transactional分支处理若isSubReply1 回复的是回复1. 查询父回复 postCommentReplyId2. 新建子回复 subUserId 父回复.userId3. 向父回复作者发系统消息若isSubReply0 回复的是评论1. 查询父评论 postCommentId2. 新建一级回复 subUserId 父评论.userId3. 查询所属帖子标题4. 向父评论作者发系统消息⑯ undoReplyComment(BaseRequest) — 删除回复Transactional物理删除回复记录更新 comment_count - 1 。任务 5修复 PostController将 6 个之前返回 null 或为空的接口连接到 Service 层接口修改前修改后/listMyPostreturn Result.success()postService.listMyPostList(postQueryDTO)/freshPostreturn nullpostService.freshPost()/commentreturn Result.success()postService.comment(commentDTO)/undoCommentreturn Result.success()postService.undoComment(request)/replyCommentreturn Result.success()postService.replyComment(commentDTO)/undoReplyCommentreturn Result.success()postService.undoReplyComment(request)任务 6修复 PostRecommend 实体PostRecommend.java 原有代码缺少 Data 注解导致 Lombok 未生成 getter/setterLambda 方法引用如 PostRecommend::getUserId 全部编译失败。修复内容- 添加 Data 注解- 添加 TableId(type IdType.AUTO) 主键策略- 添加 Schema(description) 统一 Swagger 规范- 补充 IdType 、 TableId 、 Schema 导入4.遗留与展望1. listPost() 方法 IPostService.listPost() 返回 PostVO 详情对象但接收 PostQueryDTO 搜索参数语义不匹配。当前保留空实现公共搜索已通过 listPostList() 覆盖。建议后续统一为 ListPostListVO 返回类型。2. CommentDTO 字段复用 postCommentId 在 comment() 中作为帖子 ID在 replyComment() 中作为评论 ID字段命名有歧义。建议后续拆分为 postId 和 commentId 两个字段。3. 推荐算法 当前 freshPost() 依赖 post_recommend 权重表作为外部数据源推荐数据的生成如基于内容相似度、协同过滤需要 AI 端或其他离线任务配合。4. 评论分页 当前 detail() 中评论使用 MyBatis-Plus 分页但子回复是每条评论独立查询。评论量大时建议子回复也做分页或限制条数。