参考牛客网高级项目教程
功能需求及处理策略
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CF6pzZ81-1647333519234)(C:\Users\ls2690069470\AppData\Roaming\Typora\typora-user-images\image-20220315115539913.png)]
- 1.在用户的所有会话列表显示页面,点击发私信,可以给指定用户名发私信
- 2.在一个会话的私信列表显示页面,点击给他私信,可以给指定会话中的目标用户发私信
- 弹出异步弹出框,发给的内容默认填目标用户,点击发送,进行异步请求
1. dao层增加添加和修改方法
接口方法
int insertMessage(Message message);
int updateStatus(List<Integer> ids, int status);
sql编写
foreach
- collection:指定输入对象中的集合属性
- item:代表遍历集合的每个元素,生成的变量名,相当于i
- open:开始遍历时的拼接字符串
- **close:**结束时拼接的字符串
- separator:遍历对象之间需要拼接的字符串
- **id = #{id} 或者 #{id}😗*表示动态拼接部分的每一个变量表示方式
- 即(里面的每一个变量)
<!
<insert id="insertMessage" parameterType="message">
<include refid="insertFields"></include>
</insert>
<!
<update id="updateStatus">
update message set status =
where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
</foreach>
</update>
2. service业务处理数据
public int addMessage(Message message) {
message.setContent(HtmlUtils.htmlEscape(message.getContent()));
message.setContent(sensitiveFilter.filter(message.getContent()));
return messageMapper.insertMessage(message);
}
public int updateStatus(List<Integer> ids) {
return messageMapper.updateStatus(ids, 1);
}
3. Controller处理请求
3.1 发送私信
@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.setContent(content);
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.setCreateTime(new Date());
messageService.addMessage(message);
return CommunityUtil.getJSONString(0, "发送私信成功!");
}
3.2 更改为已读状态
-
直接在之前遍历的私信列表中,先将未读的,且发给当前用户的私信筛选出来
List<Integer> ids = new ArrayList<>();
if(letterList != null) {
for(Message letter : letterList) {
Map<String, Object> map = new HashMap<>();
map.put("letter", letter);
map.put("fromUser", userService.findUserById(letter.getFromId()));
if(letter.getToId() == hostHolder.getUser().getId()
&& letter.getStatus() == 0) {
ids.add(letter.getId());
}
letterVo.add(map);
}
-
处理这些未读消息,全部更改状态,设置为已读
if(!ids.isEmpty()) {
messageService.updateStatus(ids);
}
4. 处理View模板js异步操作
4.1 处理会话列表给指定用户发私信
#sendModal,触发弹出框
- id=“sendModal”, 弹出框id
- id=“hintBody”, 提示框内容id
<button type="button" class="btn btn-primary btn-sm position-absolute rt-0" data-toggle="modal" data-target="#sendModal">发私信</button>
<div class="modal fade" id="sendModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-body" id="hintBody">
发送完毕!
</div>
异步请求提交内容:
- id=“recipient-name”,此id中填写发给的用户名
- id=“message-text”, 此id中填写发送的私信内容
<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>
提交发送事件
- id="sendBtn, 触发js文件中的发送函数,向服务端发送请求
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" id="sendBtn">发送</button>
</div>
定义js发送函数
发布后提示框自动隐藏
$("#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 = $.parseJSON(data);
$("#hintBody").text(data.msg);
$("#hintModal").modal("show");
setTimeout(function(){
$("#hintModal").modal("hide");
if(data.code == 0) {
window.location.reload();
}
}, 2000);
}
)
整体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);
$("#hintBody").text(data.msg);
$("#hintModal").modal("show");
setTimeout(function(){
$("#hintModal").modal("hide");
if(data.code == 0) {
window.location.reload();
}
}, 2000);
}
)
}
function delete_msg() {
$(this).parents(".media").remove();
}
4.2 处理一个会话中,给对方发私信
- 给对方用户发私信,对方用户名缺点,可以在默认值中预先填好
<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>
测试结果展示
|