山东大学软件学院项目实训:基于AI大模型的智能考研助手(五) 本周我完成了关于聊天功能模块的架构设计包含相关的数据库表的设计和创建设计和定义相关的接口以及定义前端相关逻辑。聊天模块包括以下部分好友模块和通信模块好友模块需要完成申请好友同意好友等基本操作通信模块用于两个用户之间进行聊天并且还要提供一些功能给帖子管理让和帖子相关的一些操作也能够通知到用户。一.数据库表的设计设计friend表用于存储好友关系用status的枚举值表示好友状态如请求和已同意其枚举值分别表示待处理已接受已拒绝。public static final Integer FRIEND_WAIT 0;//待处理 public static final Integer FRIEND_ACCEPT 1; public static final Integer FRIEND_REJECT 2;设计message表用于存储具体的消息项包含内容时间发送者和接受者id是否撤回等信息。is_retract表示已撤回is_deleted_sender表示是否由发出者删除type为一个枚举值表示其发送的到底是文字消息还是错题消息还是系统消息。设计message_list表用于存储消息界面消息列表的信息包括未读数量最近一次的消息等相关信息用于在列表界面显现二.相关接口的设计2.1 接口设计设计相关接口用于实现聊天功能主要包括发送消息接受消息阅读消息处理好友关系等功能。这写接口全部涉及到WebSocket技术需要进行即时通信。首先是与通讯相关的接口包含发送消息获取聊天记录撤回消息获取消息列表几个模块。PostMapping(/send) Operation(summary 发送消息) public ResultVoid send(RequestBody MessageDTO messageDTO) { // 从上下文中获取当前登录用户 ID 作为发送者 Long currentUserId BaseContext.getCurrentId(); messageDTO.setSenderId(currentUserId); log.info(发送消息from {} to {}, currentUserId, messageDTO.getReceiverId()); messageService.send(messageDTO); return Result.success(); } /** * * 同时包含打开具体的聊天列表的部分 * 根据页码来给出部分聊天记录 * * **/ GetMapping(/listMessage) Operation(summary 获取聊天记录) public ResultListMessageVO getMessages( RequestParam Long otherUserId, RequestParam(required false, defaultValue 1) Integer pageNum) { Long currentUserId BaseContext.getCurrentId(); log.info(获取聊天记录userId: {}, otherUserId: {}, pageNum: {}, currentUserId, otherUserId, pageNum); ListMessageVO messages messageService.getMessages(currentUserId, otherUserId, pageNum); return Result.success(messages); } PostMapping(/retract/{messageId}) Operation(summary 撤回消息) public ResultVoid retractMessage(RequestBody BaseRequest request) { Long currentUserId BaseContext.getCurrentId(); messageService.retractMessage(request, currentUserId); return Result.success(); } /** * * 在消息页面依据前端传来的搜索数据获得的消息列表如果某一项为null那就全查 * * **/ PostMapping(/listMessageList) Operation(summary 获取消息列表) public ResultListMessageListVO listMessageList(RequestBody MessageListQueryDTO messageListQueryDTO){ log.info(获取消息列表,{}, messageListQueryDTO); ListMessageListVO messageLists messageService.getMessageLists(messageListQueryDTO); return Result.success(messageLists); }然后是关于好友模块的相关接口代码包含搜索默认用户此接口用于加好友使用然后是搜索好友此接口用于管理好友信息对于加好友的功能主要涉及发送好友请求反馈好友请求查看好友请求列表和解除好友关系的相关接口/** * * 搜索默认用户查询时要自动屏蔽掉管理员角色如果某一项为null那就全查 * * **/ PostMapping(/searchDefaultUser) Operation(summary 搜索默认用户) public ResultListUserVO searchDefaultUser(RequestBody UserQueryDTO defaultUserDTO) { log.info(搜索默认用户,{}, defaultUserDTO); ListUserVO userVOS userService.searchDefaultUser(defaultUserDTO); return Result.success(userVOS); } /** * * 搜索好友查询是亦要屏蔽掉管理员角色如果某一项为null那就全查 * * **/ PostMapping(/searchFriend) Operation(summary 搜索好友) public ResultListUserVO searchFriend(RequestBody UserQueryDTO defaultUserDTO) { log.info(搜索好友,{}, defaultUserDTO); ListUserVO userVOS userService.searchFriend(defaultUserDTO); return Result.success(userVOS); } /** * * 发送好友请求 * * **/ PostMapping(/sendFriendRequest) Operation(summary 发送好友请求) public Result sendFriendRequest(RequestBody FriendMakeDTO friendMakeDTO) { log.info(发送好友请求,{}, friendMakeDTO); messageService.sendFriendRequest(friendMakeDTO); return Result.success(); } /** * * 反馈好友请求包括接受和拒绝 * * **/ PostMapping(/feedbackFriendRequest) Operation(summary 反馈好友请求) public Result feedbackFriendRequest(RequestBody FriendMakeDTO friendMakeDTO) { return Result.success(); } /** * * 查看好友请求列表 * * * **/ PostMapping(/getFriendRequestList) Operation(summary 查看好友请求列表) public ResultListFriendRequestVO getFriendRequestList(RequestBody FriendQueryDTO friendDTO) { return Result.success(); } /** * * 解除好友关系 * * * **/ PostMapping(/deleteFriend) Operation(summary 解除好友关系) public Result blackFriend(RequestBody FriendMakeDTO friendDTO) { return Result.success(); }2.2 DTO设计聊天模块主要包含这几种DTOMessageDTO用于传递聊天的消息需要指定以下内容Schema(description 消息接口) Data public class MessageDTO { // 如果是错题消息content即为错题的id Schema(description 消息内容, 错题消息时填题目ID) private String content; Schema(description 接收者ID) private Long receiverId; Schema(description 发送者ID, 无需传, 自动从token获取) private Long senderId; Schema(description 消息类型, 0为文字, 1为错题,2为系统消息) private Integer type; }MessageQueryDTO用于存储消息列表相关的查询参数Data Schema(description 消息列表查询参数) public class MessageListQueryDTO { Schema(description 用户名) private String name; Schema(description 最近时间) private LocalDateTime recentTime; }UserQueryDTO用户查询参数使用onlyFriendFlag作为标记可以让此DTO复用查询用户和查询好友接口Data Schema(description 用户查询参数) Builder public class UserQueryDTO { Schema(description 用户名) private String name; Schema(description 类型0为任意人1为好友) private Integer onlyFriendFlag; }FriendMakeDTO:用于交朋友的传递参数Data Schema(description 交朋友的DTO) public class FriendMakeDTO { Schema(description 接收方用户id) private Long receiverId; Schema(description 附带消息如“我是xxx请加我好友) private String incidentalMessage; Schema(description Flag标记0为发送好友请求1为接受好友请求,3为解除好友关系) private Integer opFlag; Schema(description 是否接受如果是发送或者解除好友关系那么就设为null) private Integer acceptFlag; }2.3 VO的设计MessageVO用于展示聊天记录里显示的气泡消息包含以下这些内容public class MessageVO { Schema(description 消息 ID) private Long id; Schema(description 消息内容) private String content; Schema(description 发送者 ID) private Long senderId; Schema(description 接收者 ID) private Long receiverId; Schema(description 发送时间) private LocalDateTime senderTime; Schema(description 消息类型) private Integer type; Schema(description 是否已读) private Integer isRead; Schema(description 发送者昵称) private String senderName; Schema(description 发送者头像) private String senderAvatar; Schema(description 错题ID仅错题消息时有值) private Long topicId; Schema(description 错题标题仅错题消息时有值) private String topicTitle; }MessageListVO:用于展现聊天列表中的信息的VOpublic class MessageListVO { Schema(description 会话id) private Long id; Schema(description 对方用户id) private Long userId; Schema(description 对方用户名) private String userName; Schema(description 对方头像) private String userAvatar; Schema(description 未读消息数) private Integer unreadCount; Schema(description 最近一条消息内容) private String recentContent; Schema(description 最近一条消息时间) private LocalDateTime recentTime; }UserVO用于查看用户详情加好友的时候能够用上public class UserVO { Schema(description 用户id) private Long id; Schema(description 用户名) private String name; Schema(description 用户头像) private String avatar; Schema(description 创建时间) private String createTime; Schema(description 当前用户状态即是否已经被封禁) private Integer status; Schema(description 是否为当前用户好友) private Integer isFriend; }FriendRequestVO作为好友请求列表所显示的VOData public class FriendRequestVO { Schema(description 用户id) private Long id; Schema(description 用户名) private String name; Schema(description 用户头像) private String avatar; Schema(description 状态0为待处理1为已经同意2为已经拒绝) private Integer status; Schema(description 附带消息) private String incidentalMessage; Schema(description 发送时间) private LocalDateTime sendTime; }三.相关文档的编写3.1 接口文档的编写使用markdown撰写接口文档将部分具体功能部分交给队友王浩进行开发3.2 UI流程图的绘制绘制前端UI基本流程图将开发后的代码push到远程仓库中四.总结本周我完成了聊天功能模块的整体架构设计与全流程技术方案落地包括friend、message、message_list三张核心数据库表的设计与创建明确了好友状态、消息类型、消息撤回与删除、未读计数等关键字段与枚举规则基于 WebSocket 完成了通信模块与好友模块的全部接口定义涵盖消息发送、撤回、查询、好友申请、处理、关系管理等核心能力并统一设计了 MessageDTO、UserQueryDTO、MessageVO、FriendRequestVO 等前后端交互的数据传输对象与视图对象同时完成了接口文档编写、前端 UI 流程图绘制并将设计代码推送至远程仓库将具体功能开发交由队友协作推进整体实现了聊天模块从数据层、接口层到前端逻辑的完整设计闭环为项目即时通信与社交通知能力的正式开发奠定了坚实、规范、可快速落地的基础。