3.8 发送私信

168 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

3.8 发送私信

image-20220718145742909

这次开发发送私信设置已读功能

首先开发发送私信的功能

  1. 数据访问层(dao)

在之前创建好的dao组件MessageMapper中增加 发送私信设置已读 方法

// 新增消息(私信)
int insertMessage(Message message);

// 修改私信的状态(未读-->已读或添加私信后首先直接设置为未读货值设置为删除)
int updateStatus(List<Integer> ids, int status);

image-20220718153914495

然后是对应的mapper配置文件

image-20220718154113387

  1. 业务层(Service)

在之前创建的MessageService中添加 发送私信设置已读 方法

@Autowired
private SensitiveFilter sensitiveFilter;
// 新增私信
public int addMessage(Message message){
  // 过滤一下消息(过滤标签和敏感词)
  message.setContent(HtmlUtils.htmlEscape(message.getContent()));
  message.setContent(sensitiveFilter.filter(message.getContent()));
  return messageMapper.insertMessage(message);
}
// 更新私信的状态
public int readMessage(List<Integer> ids) {
  return messageMapper.updateStatus(ids, 1);  // 1 表示已读
}

image-20220718154743154

  1. 表现层

UserService中增加一个根据用户名查询用户的方法(dao接口之前已经写过这个方法),方便MessageController使用这个方法

public User findUserByName(String username) {
    return userMapper.selectByName(username);
}

image-20220718160351905

然后在MessageController中增加添加私信方法

// 发送私信
@RequestMapping(path = "/letter/send", method = RequestMethod.POST)
@ResponseBody      // 因为是异步方式,所以要加上这个注解
public String sendLetter(String toName, String content) {
    User target = userService.findUserByName(toName);
    if (target == null) {
        return CommunityUtil.getJSONString(1, "目标用户不存在!"); // 返回1代表错误
    }

    Message message = new Message();
    message.setFromId(hostHolder.getUser().getId());
    message.setToId(target.getId());
    if (message.getFromId() < message.getToId()) {
        message.setConversationId(message.getFromId() + "_" + message.getToId());
    } else {
        message.setConversationId(message.getToId() + "_" + message.getFromId());
    }
    message.setContent(content);
    message.setCreateTime(new Date());
    messageService.addMessage(message);
    // 异步方式返回JSON字符串
    return CommunityUtil.getJSONString(0);  // 新增私信默认状态为0,表示未读
}

然后我们需要修改 私信列表 letter.html 处的发私信按钮,这个功能是在 letter.js 中实现的,所以我们需要修改一下letter.js

image-20220718163015040

image-20220718163032329

image-20220718163148096

然后我们需要处理一下私信详情页面 letter-detail.html的私信时会默认带上对方的用户名,我们要处理一下

image-20220718163538245

到这里发送私信的功能就开发完了。

然后我们接下来需要开发当用户读私信时设置已读功能

我们只需要在 MessageController 的 getLetterDetail 访问私信详情方法里,把私信列表里面的未读的消息提取出来,然后自动的设置为已读就可以了

image-20220718165013138

这样,设置已读功能就开发完成了,开发完成之后可以测试一下。