本周我完成了关于聊天功能模块的架构设计,包含相关的数据库表的设计和创建,设计和定义相关的接口以及定义前端相关逻辑。聊天模块包括以下部分:好友模块和通信模块,好友模块需要完成申请好友,同意好友等基本操作;通信模块用于两个用户之间进行聊天,并且还要提供一些功能给帖子管理,让和帖子相关的一些操作也能够通知到用户。

一.数据库表的设计

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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐