3.27发送私信以及设置已读功能

在这里插入图片描述
发送私信 是在 消息 页面
在这里插入图片描述
在这里插入图片描述
然后用 异步请求 发给服务器,
服务器根据给 发送 成功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了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值