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

所有评论(0)