当前位置:   article > 正文

【项目】仿牛客网社区开发 第3章 Spring Boot 实践 开发社区核心功能 8 发送私信_springboot实现私信功能

springboot实现私信功能

【项目】仿牛客网社区开发

在这里插入图片描述

第3章 Spring Boot 实践 开发社区核心功能

8 发送私信
  • 发送私信
    • 采用异步的方式发送私信。
    • 发送成功后刷新私信列表。
  • 设置已读
    • 访问私信详情时, 将显示的私信设置为已读状态。

在这里插入图片描述

首先是数据层

在这里插入图片描述

在映射文件中实现这两个方法

    <sql id="insertFields">
        from_id
        , to_id, conversation_id, content, status, create_time
    </sql>

    <insert id="insertMessage" parameterType="Message" keyProperty="id">
        insert into message(<include refid="insertFields"></include>)
        values(#{fromId},#{toId},#{conversationId},#{content},#{status},#{createTime})
    </insert>

    <update id="updateStatus">
        update message set status = #{status}
        where id in
        <foreach collection="ids" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </update>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

接下来是业务层

    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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里注入了我们自己那个过滤敏感词bean

最后就是表现层了,先把接口搞出来

    @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, "目标用户不存在!");
        }

        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);

        return CommunityUtil.getJSONString(0);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

更改前端模板

在这里插入图片描述

就是发给那个人名要写活一下

在这里插入图片描述

这个东西是通过JavaScript 实现的

修改letter.js

$(function(){
	$("#sendBtn").click(send_letter);
	$(".close").click(delete_msg);
});

function send_letter() {
	$("#sendModal").modal("hide");

	var toName = $("#recipient-name").val();
	var content = $("#message-text").val();
	$.post(
		CONTEXT_PATH + "/letter/send",
		{"toName":toName,"content":content},
		function(data) {
			data = $.parseJSON(data);
			if(data.code == 0) {
				$("#hintBody").text("发送成功!");
			} else {
				$("#hintBody").text(data.msg);
			}

			$("#hintModal").modal("show");
			setTimeout(function(){
				$("#hintModal").modal("hide");
				location.reload();
			}, 2000);
		}
	);
}

function delete_msg() {
	// TODO 删除数据
	$(this).parents(".media").remove();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

在这里插入图片描述

启动服务器测试一下

在这里插入图片描述

当前登录用户是aaa,用它发私信给 dingjiaxiong

在这里插入图片描述

在这里插入图片描述

如果名字写错了,应该提示信息

在这里插入图片描述

然后就啥也没发生,正常发一个

在这里插入图片描述

直接发送

在这里插入图片描述

在这里插入图片描述

这是在外面发,点进到会话详细再发一个

在这里插入图片描述

在这里插入图片描述

这里还有点问题,没显示出来,是detail 的名字

在这里插入图片描述

这个,重启下服务器,再来一次

在这里插入图片描述

这下对了,它应该自动填充进去,

在这里插入图片描述

在这里插入图片描述

OK, 发送成功。

我们先把未读已读功能实现,再切到dingjiaxiong 用户看看

修改一下控制器

    // 详情页面
    @RequestMapping(path = "/letter/detail/{conversationId}", method = RequestMethod.GET)
    public String getLetterDetail(@PathVariable("conversationId") String conversationId, Page page, Model model) {
        // 分页信息
        page.setLimit(5);
        page.setPath("/letter/detail/" + conversationId);
        page.setRows(messageService.findLetterCount(conversationId));

        // 私信列表
        List<Message> letterList = messageService.findLetters(conversationId, page.getOffset(), page.getLimit());
        List<Map<String, Object>> letters = new ArrayList<>();
        if (letterList != null) {
            for (Message message : letterList) {
                Map<String, Object> map = new HashMap<>();
                map.put("letter", message);
                map.put("fromUser", userService.findUserById(message.getFromId()));
                letters.add(map);
            }
        }
        model.addAttribute("letters", letters);

        // 私信目标
        model.addAttribute("target", getLetterTarget(conversationId));

        // 设置已读
        List<Integer> ids = getLetterIds(letterList);
        if (!ids.isEmpty()) {
            messageService.readMessage(ids);
        }

        return "/site/letter-detail";
    }

    private List<Integer> getLetterIds(List<Message> letterList) {
        List<Integer> ids = new ArrayList<>();

        if (letterList != null) {
            for (Message message : letterList) {
                if (hostHolder.getUser().getId() == message.getToId() && message.getStatus() == 0) {
                    ids.add(message.getId());
                }
            }
        }

        return ids;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

OK,重启服务器看看效果

在这里插入图片描述

这两条消息dingjiaxiong 肯定是未读的,现在登录一下dingjiaxiong 的账号

在这里插入图片描述

点开消息

在这里插入图片描述

OK, 两条来自aaa 的消息,点进去

在这里插入图片描述

这样就算已读了,返回

在这里插入图片描述

红星就没了。这样就是已读私信的状态了。

【课后作业,是开发删除私信的功能,即点击某条私信的删除按钮时,将其状态设置为删除态】

实现一下

首先是业务:

    public int deleteMessage(int id) {
        return messageMapper.updateStatus(Arrays.asList(new Integer[]{id}), 2);
    }
  • 1
  • 2
  • 3

在这里插入图片描述

然后是表现层:

    // 删除私信
    @RequestMapping(path = "/letter/delete", method = RequestMethod.POST)
    @ResponseBody
    public String deleteLetter(int id) {
        messageService.deleteMessage(id);
        return CommunityUtil.getJSONString(0);
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

接着就是修改前端模板了

在这里插入图片描述

这里主要是在JavaScript 中进行实现

在这里插入图片描述

就这个,其实之前已经写好了,但是没有去实现

function delete_msg() {
    var btn = this;
    var id = $(btn).prev().val();
    $.post(
        CONTEXT_PATH + "/letter/delete",
        {"id": id},
        function (data) {
            data = $.parseJSON(data);
            if (data.code == 0) {
                $(btn).parents(".media").remove();
            } else {
                alert(data.msg);
            }
        }
    );
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

OK, 运行重启看看

在这里插入图片描述

点击这个删除按钮

在这里插入图片描述

在这里插入图片描述

可以的,没有任何提示,直接删了,回到aaa 用户

在这里插入图片描述

在这里插入图片描述

确实已经删了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/572986
推荐阅读
相关标签
  

闽ICP备14008679号