问答平台(3),发送私信

发送私信

1
2
- 采用异步的方式发送私信。
- 发送成功后刷新私信列表。

数据访问层

1
2
3
4
5
6
// MessageMapper.java
// 新增消息
int insertMessage(Message message);

// 修改消息的状态
int updateStatus(List<Integer> ids, int status);
  • message-mapper.xml 里写sql
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <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
// MessageService.java
@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
2
3
4
// UserService.java
public User findUserByName(String username) {
return userMapper.selectByName(username);
}

表现层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// MessageController.java
@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.setStatus(0);
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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    // MessageController.java
    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;
    }

    @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";
    }

页面

  • letter.html:处理弹出框(发私信)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <!-- 内容 -->
    <!-- 弹出框 -->
    <div class="modal-body">
    <form>
    <div class="form-group">
    <label for="recipient-name" class="col-form-label">发给:</label>
    <input type="text" class="form-control" id="recipient-name">
    </div>
    <div class="form-group">
    <label for="message-text" class="col-form-label">内容:</label>
    <textarea class="form-control" id="message-text" rows="10"></textarea>
    </div>
    </form>
    </div>
    <!-- 提示框 -->
    <div class="modal-content">
    <div class="modal-header">
    <h5 class="modal-title" id="hintModalLabel">提示</h5>
    </div>
    <div class="modal-body" id="hintBody">
    发送完毕!
    </div>
    </div>
  • letter.js
    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
    // send_letter()
    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");
    window.location.reload();
    }, 2000);
    }
    );
    }
  • letter-detail.html:处理弹出框(发送私信给谁)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- 内容 -->
    <!-- 弹出框 -->
    <div class="modal-body">
    <form>
    <div class="form-group">
    <label for="recipient-name" class="col-form-label">发给:</label>
    <input type="text" class="form-control" id="recipient-name"
    th:value="${target.username}">
    </div>
    <div class="form-group">
    <label for="message-text" class="col-form-label">内容:</label>
    <textarea class="form-control" id="message-text" rows="10"></textarea>
    </div>
    </form>
    </div>

问答平台(3),发送私信
https://lcf163.github.io/2020/05/17/问答平台(3),发送私信/
作者
乘风的小站
发布于
2020年5月17日
许可协议