实现功能
发送私信
- 采用异步的方式发送私信。
- 发送成功后刷新私信列表。
设置已读
- 访问私信详情时, 将显示的私信设置为已读状态。
controller
//发送私信
@RequestMapping(value = "/letter/send",method = RequestMethod.POST)
@ResponseBody
public String sendLetter(String toName,String content){
//获取发送目标
User target = userService.selectUserByName(toName);
if(target==null){
return CommunityUtil.getJsonString(1,"目标用户不存在!");
}
//获取发送的私信内容
Message message=new Message();
message.setContent(content); //发送的内容
message.setToId(target.getId()); //收私信的id
message.setFromId(hostHolder.getUser().getId()); //发私信的id
message.setStatus(0); //私信状态
message.setCreateTime(new Date()); //设置发送时间
//设置会话id
if(message.getFromId()< message.getToId()){
message.setConversationId(message.getFromId()+"_"+ message.getToId());
}else{
message.setConversationId(message.getToId()+"_"+ message.getFromId());
}
messageService.addMessage(message);//将私信内容保存至数据库中
return CommunityUtil.getJsonString(0);
}
//查看私信详情
@RequestMapping(value = "/letter/detail/{conversationId}",method = RequestMethod.GET)
public String showLetterDetail(@PathVariable("conversationId") String conversationId,Model model,Page page){
//显示分页信息
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);
//获取私信目标
User target = getTarget(conversationId);
model.addAttribute("target",target);
//更改私信状态
List<Integer> ids = getLetterIds(letterList);
if(!ids.isEmpty()){
messageService.readMessage(ids);
}
return "/site/letter-detail";
}
//获取私信目标
private User getTarget(String conversationId){
String[] ids = conversationId.split("_");
int id0=Integer.parseInt(ids[0]);
int id1=Integer.parseInt(ids[1]);
if(hostHolder.getUser().getId()==id0){
return userService.findUserById(id1);
}else{
return userService.findUserById(id0);
}
}
//获取未读私信id列表
private List<Integer> getLetterIds(List<Message> letterList){
List<Integer> ids=new ArrayList<>();
if(!letterList.isEmpty()){
for(Message message:letterList){
if(hostHolder.getUser().getId()==message.getToId()&&message.getStatus()==0){
ids.add(message.getId());
}
}
}
return ids;
}
service
//发送私信
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);
}
dao
//新增消息(发送私信
int insertMessage(Message message);
//更改消息状态 未读--->已读--->status:0
int updateStatus(List<Integer> ids,int status);
mapper.xml
<!-- int insertMessage(Message message); -->
<insert id="insertMessage" parameterType="Message">
insert into message(<include refid="insertFields"></include>)
values(#{fromId},#{toId},#{conversationId},#{content},#{status},#{createTime})
</insert>
<!-- int updateStatus(List<Integer> ids,int status); -->
<update id="updateStatus" >
update message set status=#{status}
where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
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();
}