山东大学软件学院项目实训:基于AI大模型的智能考研助手(五)

山东大学软件学院项目实训:基于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 Result<Void> 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 Result<List<MessageVO>> getMessages( @RequestParam Long otherUserId, @RequestParam(required = false, defaultValue = "1") Integer pageNum) { Long currentUserId = BaseContext.getCurrentId(); log.info("获取聊天记录:userId: {}, otherUserId: {}, pageNum: {}", currentUserId, otherUserId, pageNum); List<MessageVO> messages = messageService.getMessages(currentUserId, otherUserId, pageNum); return Result.success(messages); } @PostMapping("/retract/{messageId}") @Operation(summary = "撤回消息") public Result<Void> retractMessage(@RequestBody BaseRequest request) { Long currentUserId = BaseContext.getCurrentId(); messageService.retractMessage(request, currentUserId); return Result.success(); } /** * * 在消息页面,依据前端传来的搜索数据,获得的消息列表,如果某一项为null那就全查 * * **/ @PostMapping("/listMessageList") @Operation(summary = "获取消息列表") public Result<List<MessageListVO>> listMessageList(@RequestBody MessageListQueryDTO messageListQueryDTO){ log.info("获取消息列表,{}", messageListQueryDTO); List<MessageListVO> messageLists = messageService.getMessageLists(messageListQueryDTO); return Result.success(messageLists); }

然后是关于好友模块的相关接口代码,包含搜索默认用户,此接口用于加好友使用

然后是搜索好友,此接口用于管理好友信息

对于加好友的功能,主要涉及发送好友请求,反馈好友请求,查看好友请求列表和解除好友关系的相关接口

/** * * 搜索默认用户,查询时要自动屏蔽掉管理员角色,如果某一项为null那就全查 * * **/ @PostMapping("/searchDefaultUser") @Operation(summary = "搜索默认用户") public Result<List<UserVO>> searchDefaultUser(@RequestBody UserQueryDTO defaultUserDTO) { log.info("搜索默认用户,{}", defaultUserDTO); List<UserVO> userVOS = userService.searchDefaultUser(defaultUserDTO); return Result.success(userVOS); } /** * * 搜索好友,查询是亦要屏蔽掉管理员角色,如果某一项为null那就全查 * * **/ @PostMapping("/searchFriend") @Operation(summary = "搜索好友") public Result<List<UserVO>> searchFriend(@RequestBody UserQueryDTO defaultUserDTO) { log.info("搜索好友,{}", defaultUserDTO); List<UserVO> 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 Result<List<FriendRequestVO>> getFriendRequestList(@RequestBody FriendQueryDTO friendDTO) { return Result.success(); } /** * * 解除好友关系 * * * **/ @PostMapping("/deleteFriend") @Operation(summary = "解除好友关系") public Result blackFriend(@RequestBody FriendMakeDTO friendDTO) { return Result.success(); }

2.2 DTO设计

聊天模块主要包含这几种DTO

MessageDTO:用于传递聊天的消息,需要指定以下内容

@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:用于展现聊天列表中的信息的VO

public 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:作为好友请求列表所显示的VO

@Data 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 流程图绘制,并将设计代码推送至远程仓库,将具体功能开发交由队友协作推进,整体实现了聊天模块从数据层、接口层到前端逻辑的完整设计闭环,为项目即时通信与社交通知能力的正式开发奠定了坚实、规范、可快速落地的基础。