山东大学软件学院2026项目实训个人博客(八)
项目名称基于AI大模型的智能考研社区撰写日期2026年6月6日本周的任务是完成AI对话/dialog和管理员后台模块/admin的开发按照API文档的规划实现AI 对话、内容审核、用户封禁等功能。一、Dialog 模块开发过程1.模块概述模块名称 AI 对话管理Dialog基础路径 /dialog功能说明 为考研学习平台用户提供 AI 智能答疑能力。用户输入问题文本后后端通过 RabbitMQ 消息队列将请求转发至 AI 端Python AI 服务AI 处理完成后通过消息队列回传结果最终返回给前端。AI 可提供纯文本回答也可附带跳转链接。当前接口 POST /dialog/text — AI 文本对话2.技术架构Dialog 模块采用异步消息驱动的架构模式。前端通过 HTTP POST 请求将用户输入的文本发送到 Spring Boot 后端的 /dialog/text 接口。接口层 DialogController 接收请求后委托给 DialogServiceImpl 服务层处理Controller 不包含任何业务逻辑仅负责参数接收和结果封装返回。服务层 DialogServiceImpl 是核心业务逻辑的承载者将用户输入的 prompt、userId 和时间戳封装为 JSON 格式的消息体通过 RabbitMQUtils 工具类的 sendAsync 方法异步发送到 RabbitMQ 的 ai-dialog-request-routing-key 队列。Python AI 服务端监听 ai-dialog-request-routing-key 队列接收到对话请求后调用大语言模型进行处理生成回答后将结果包含相同的 requestId 和 answer 字段投递到 ai-dialog-routing-key 队列。RabbitMQ 基础配置在原本声明了 AI_DIALOG_REQUEST_QUEUE 常量的基础上补充了对应的 Queue Bean 和 Binding以及到 studynote-exchange 交换机的绑定关系。同时为后续 Admin 和 Post 模块的开发预置了四个审核相关队列的 Bean 与 Binding。关键中间件 RabbitMQ 异步解耦两个队列负责请求与响应- ai-dialog-request-routing-key AI 对话请求队列后端 → AI- ai-dialog-routing-key AI 对话结果队列AI → 后端数据流POST /dialog/text { id: 今天星期几 }▼DialogController.text()▼DialogServiceImpl.text()│ ① 生成 UUID requestId│ ② 创建 CompletableFuture30s 超时│ ③ rabbitMQUtils.sendAsync(ai-dialog-request-routing-key, {requestId, prompt, userId})│ ④ future.get(30s) 同步等待│▼ (AI 处理中...)RabbitMQConsumerService.consumeAIDialogResult()│ 解析 JSON 提取 requestId answer│ dialogResponseManager.completeRequest(requestId, AIChatVO)│▼DialogServiceImpl.text() 收到 CompletableFuture 结果封装 ResultAIChatVO 返回前端3.开发任务任务 1补充 RabbitMQ 基础设施目标 确保 AI 对话的两个队列均可正常收发消息。涉及文件 config/RabbitMQConfig.java新增 aiDialogRequestQueue Bean 为 AI_DIALOG_REQUEST_QUEUE 创建 Queue 声明新增 aiDialogRequestBinding Bean 将请求队列绑定到 studynote-exchange 交换机任务 2创建 DialogService 服务层目标 封装 AI 对话的业务逻辑遵循项目分层架构Controller → Service → Mapper。新建service/IDialogService.java 服务接口定义 AIChatVO text(String prompt) 方法新建service/impl/DialogServiceImpl.java 服务实现核心逻辑所在方法签名 // IDialogService.java public interface IDialogService { AIChatVO text(String prompt); }任务 3实现核心对话业务逻辑目标 在 DialogServiceImpl.text() 中实现完整的请求-响应流程。业务流程 1. 从 BaseContext 获取当前用户 ID用于日志追踪2. 构造 AI 请求消息体含 prompt userId 时间戳3. 通过 RabbitMQUtils 将消息发送到 ai-dialog-request-routing-key4. 同步等待 AI 端处理结果参考 TopicServiceImpl 中的 AIResultManager 模式- 等待超时时间建议30 秒5. 收到 AI 响应后封装为 AIChatVO 返回- AIChatVO.answer AI 返回的文本内容6. 异常处理- 超时 → 抛出 AI 服务响应超时- 空结果 → 抛出 AI 未返回有效结果- 中断 → 恢复中断状态并抛出异常技术要点 - 使用 CompletableFuture AIResultManager 实现同步等待与错题 AI 分析一致的模式- 使用 RabbitMQUtils.sendAsync() 发送请求消息- 接入现有的 RabbitMQConsumerService 消费 AI 响应任务 4完善 RabbitMQ 消费者目标 在 RabbitMQConsumerService 中新增 AI 对话结果的消费逻辑。涉及文件 rabbitmq/RabbitMQConsumerService.java新增 RabbitListener(queues ai-dialog-routing-key) 监听方法 接收 AI 返回的对话结果解析 AI 响应 JSON提取 answer 字段 消息格式由 AI 端约定将结果存入 AIResultManager 供 DialogServiceImpl 同步获取任务 5完善 DialogController目标 修复 POST /dialog/text 接口替换返回 null 为正确的业务调用。涉及文件 controller/DialogController.java// 修改前 PostMapping(/text) public ResultAIChatVO text(RequestBody BaseRequest request) { return null; // ← 空壳 }// 修改后 PostMapping(/text) public ResultAIChatVO text(RequestBody BaseRequest request) { log.info(AI对话请求用户输入{}, request.getId()); AIChatVO result dialogService.text(request.getId()); return Result.success(result); }补充内容 - 注入 IDialogService- 添加 Operation(summary AI 文本对话) Swagger 注解- 补充 Swagger Tag 描述4.异常处理策略AI 响应超时30sTimeoutException → 返回 AI 服务繁忙请稍后重试AI 返回空结果返回 AI 暂时无法回答该问题RabbitMQ 发送失败RuntimeException → 返回 消息发送失败线程中断恢复 Thread.interrupted() 状态抛出异常5.参考依赖AI 同步等待模式 TopicServiceImpl.java 使用 CompletableFuture AIResultManagerRabbitMQ 发送 RabbitMQUtils.java sendAsync() 方法AI 结果消费 RabbitMQConsumerService.consumeAIResult() 消费者监听模式异常处理 TopicServiceImpl 的 catch 块 TimeoutException InterruptedException二、管理员后台模块开发过程1.模块概述模块名称 管理员后台管理Admin基础路径 /admin功能说明 为平台管理员提供用户封禁/解封、帖子审核、评论审核、AI 辅助审核、数据搜索和仪表盘统计等后台管理能力。管理员可手动审核内容合规性也可借助 AI 自动获取审核建议。2.技术架构Admin 模块采用标准的三层架构Controller 接口层 → Service 服务层 → Mapper 数据访问层所有管理功能集中封装在 AdminServiceImpl 中遵循单一职责和接口隔离原则。Controller 层 AdminController 共暴露 11 个 POST 接口全部通过 RequiredArgsConstructor 构造器注入的方式获取依赖。Service 层 AdminServiceImpl 注入了 6 个 Mapper以及 2 个工具类其中 PostCommentMapper、PostCommentReplyMapper 和 AIAuditMapper 是在本次开发中新建的分别操作 post_comment、post_comment_reply 和 AI_audit 三张数据库表。审核功能的设计遵循人工 AI 协同的原则。审核通过时帖子/评论的 status 字段设为 1审核不通过则设为 2。审核完成后Service 根据 Message 实体类的 Builder 模式构造一条系统消息发送方 ID 固定为 MessageConstant.SYSTEM_USER_ID即 -1消息类型为 TYPE_SYSTEM即 2接收方为被审核内容的发布者。帖子的系统消息格式为你的帖子《{标题}》通过审核/未通过审核评论的系统消息格式为你的评论「{前 20 字}...」通过审核/未通过审核对过长内容做截断保护。关键中间件 - RabbitMQ — ai-aid-audit-routing-key 队列AI 辅助审核- MyBatis-Plus — LambdaQueryWrapper 动态条件查询- JWT 认证 — 接口调用需携带 Token- 系统消息 — 审核结果通过 MessageConstant.TYPE_SYSTEM 发送方 ID -1通知用户3.开发任务清单任务 1新建 3 个 Mapper 接口PostCommentMapper.java对应post_comment帖子评论 CRUDPostCommentReplyMapper.java对应post_comment_reply 评论回复 CRUDAIAuditMapper.java对应AI_audit AI 自动审核配置 CRUD均继承 BaseMapper 无需额外 SQL 编写。任务 2新建 IAdminService 接口定义 9 个管理后台功能方法方法返回类型说明aiAidAudit(contentId, contentType)AIAuditVOAI 辅助审核startAIAutoAudit(isEnable)void开启/关闭 AI 自动审批auditPost(auditDTO)void人工审核帖子auditComment(auditDTO)void人工审核评论/回复searchUser(request)ListUserVO管理员搜索用户searchPost(request)ListPostListVO管理员搜索帖子searchComment(request)ListCommentListVO管理员搜索评论detailPost(postId)PostVO管理员查看帖子详情dashboard()MapString, Object仪表盘数据聚合任务 3实现 AdminServiceImpl 核心① aiAidAudit — AI 辅助审核流程1. 生成 UUID 作为 requestId2. 构造请求体 {requestId, contentId, contentType, timestamp}3. 通过 DialogResponseManager 创建 CompletableFuture30s 超时4. rabbitMQUtils.sendAsync → ai-aid-audit-routing-key5. future.get(30s) 同步等待 AI 响应6. 解析 AI 返回的 JSON → AIAuditVO含 banWords、opinion、isEnact7. 异常处理超时/中断/执行异常均返回降级建议② startAIAutoAudit — 开启/关闭 AI 自动审批流程1. 查询 AI_audit 表第一条记录2. 如果不存在 → INSERT 新记录isAiAudit isEnable3. 如果存在 → UPDATE isAiAudit 字段③ auditPost — 人工审核帖子流程Transactional1. 根据 postId 查询帖子2. 更新 post.statusisEnact1 → 1(通过) / 其它 → 2(封禁)3. 更新 updateTime4. 构造系统消息senderId-1, typeTYPE_SYSTEM内容格式你的帖子《{title}》通过审核/未通过审核④ auditComment — 人工审核评论流程Transactional1. 根据 type 判断审核对象- type0 → 查询 post_comment 表- type!0 → 查询 post_comment_reply 表2. 更新 status逻辑与帖子一致3. 构造系统消息通知评论发布者内容格式你的评论「{前20字}...」通过审核/未通过审核⑤ searchUser — 管理员搜索用户查询条件deleted0 username LIKE createTime GE updateTime LE返回ListUserVOid/name/avatar/createTime/status/isFriend⑥ searchPost — 管理员搜索帖子查询条件deleted0 (title LIKE keyword OR text LIKE keyword) createTime GE排序createTime DESC输出ListPostListVO含 user 信息填充、封面图取第一张、正文截断 100 字⑦ searchComment — 管理员搜索评论查询条件sendTime GE userId EQ限制LIMIT 100返回ListCommentListVO含 user 信息填充⑧ detailPost — 管理员查看帖子详情1. 查询 post 表2. 填充发帖用户信息name/avatar3. 返回 PostVO不含评论列表、不含 isLike/isCollect 交互状态⑨ dashboard — 仪表盘数据统计统计项- totalUsersuser 表总记录数- totalPostspost.deleted0 的总数- pendingPostspost.status0 (待审核) 的总数- totalCommentspost_comment post_comment_reply 总数任务 4修改 AdminController.java新增注入 IAdminService - adminService新增 import Map 、IAdminService清理注释移除所有 TODO 标记保留功能描述注释修改 aiAidAudit 解析 BaseRequest.id → 调用 adminService.aiAidAudit()修改 startAIAutoAudit 解析 BaseRequest.id → 调用 adminService.startAIAutoAudit()修改 auditPost 转发 AuditDTO → adminService.auditPost()修改 auditComment 转发 AuditDTO → adminService.auditComment()修改 searchUser 调用 adminService.searchUser() 并包装返回修改 searchPost 调用 adminService.searchPost() 并包装返回修改 searchComment 调用 adminService.searchComment() 并包装返回修改 detailPost 解析 BaseRequest.id → adminService.detailPost()修改 dashboard 调用 adminService.dashboard() 返回类型改为 ResultMapString, Object.