发送私信 是在 消息 页面
然后用 异步请求 发给服务器,
服务器根据给 发送 成功or失败的提示。
当然也可以 给某人私信:
要自动带上 当前目标的名字
1.发送私信功能
1.1在数据访问层dao中MessageMapper接口
补充方法
// 新增消息
int insertMessage(Message message);
// 修改消息的状态(设置已读功能 需要用到)
int updateStatus(List<Integer> ids, int status);
然后在MessageMapper.html实现insertMessage
<insert id="insertMessage" parameterType="Message" keyProperty="id">
insert into message(<include refid="insertFields"></include>)<!-- 引用前述insertFields-->
values(#{fromId},#{toId},#{conversationId},#{content},#{status},#{createTime})<!-- 分别赋值-->
</insert>
实现updateStatus
<update id="updateStatus">
update message set status = #{status}
where id in
<foreach collection="ids" item="id" open="(" separator="," close=")"><!-- 遍历ids参数的集合collection,用item获取得到的属性值id--><!--open="(" 表示以 (开头。separator="," 表示以逗号隔开 -->
#{id}<!-- 把id 拼成(,)形式-->
</foreach>
</update>
1.2业务层
在MessageService中增加方法:
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.3MessageController
@RequestMapping(path = "/letter/send", method = RequestMethod.POST)
@ResponseBody//因为是异步请求,所以要有此 注解
public String sendLetter(String toName, String content) {//toName是发送给谁,接受人的用户名。私信的内容content
User target = userService.findUserByName(toName);//通过用户名 查询用户,得到id
if (target == null) {//判断用户是否存在
return CommunityUtil.getJSONString(1, "目标用户不存在!");//1代表错误
}
Message message = new Message();
message.setFromId(hostHolder.getUser().getId());//当前用户id
message.setToId(target.getId());
if (message.getFromId() < message.getToId()) {//会话id,两个对话的人 id 中间 用横线拼起来,id小的在前,大的在后。if判断谁大谁小。
message.setConversationId(message.getFromId() + "_" + message.getToId());
} else {
message.setConversationId(message.getToId() + "_" + message.getFromId());
}
message.setContent(content);//内容
message.setCreateTime(new Date());//当前时间
messageService.addMessage(message);
return CommunityUtil.getJSONString(0);//没有报错,则返回 状态0。报错则将来统一处理异常。
}
1.4接下来写 页面逻辑
letter.js
$(function(){
$("#sendBtn").click(send_letter);<!-- sendBtn 发送按钮,单击时调用send_letter方法 -->
$(".close").click(delete_msg);
});
function send_letter() {
$("#sendModal").modal("hide");
var toName = $("#recipient-name").val();
var content = $("#message-text").val();
$.post(<!-- post请求 -->
CONTEXT_PATH + "/letter/send",<!-- 路径 -->
{"toName":toName,"content":content},<!-- 要传入的参数 -->
function(data) {<!-- 接受一个数据data -->
data = $.parseJSON(data);<!-- 转为js对象-->
if(data.code == 0) {<!-- 表明 发送成功 -->
$("#hintBody").text("发送成功!");<!-- hintBody为提示框 -->
} else {
$("#hintBody").text(data.msg);
}
$("#hintModal").modal("show");<!--2000s后 重载当前页面-->
setTimeout(function(){
$("#hintModal").modal("hide");
location.reload();
}, 2000);
}
);
}
function delete_msg() {
// TODO 删除数据
$(this).parents(".media").remove();
}
处理默认带用户名
在letter detail 弹出框 中
测试:
首页
点击消息
发现多了一条 会话
可以点进去
点击给他私信:
发送成功后,刷新当前页面
那么如何实现
访问私信详情时,将显示的私信设置为已读状态。
在MessageController中
将 私信列表 中 未读的消息提取出来,自动设置为已读。
getLetterIds方法:
private List<Integer> getLetterIds(List<Message> letterList) {
List<Integer> ids = new ArrayList<>();//实例化list
if (letterList != null) {//不为空则遍历
for (Message message : letterList) {
if (hostHolder.getUser().getId() == message.getToId() && message.getStatus() == 0) {//当前用户是接收者时,才能把数据变为已读,如果是发送者,则本身就能读到发的消息。message.getStatus()判断消息是否为未读状态。
ids.add(message.getId());
}
}
}
return ids;//得到集合中 未读消息的id
}
// 设置已读
List<Integer> ids = getLetterIds(letterList);//得到id
if (!ids.isEmpty()) {//如果id非空
messageService.readMessage(ids);//更改设为已读
}
测试
登录cc账号
发现有两条之前发送的未读消息
点进去后
点进去 则代表读了
返回以后,发现没有未读的状态了
说明设置ok了