赞
踩
首先是数据层
在映射文件中实现这两个方法
<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>
接下来是业务层
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);
}
这里注入了我们自己那个过滤敏感词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);
}
更改前端模板,
就是发给那个人名要写活一下
这个东西是通过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();
}
启动服务器测试一下
当前登录用户是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;
}
OK,重启服务器看看效果
这两条消息dingjiaxiong 肯定是未读的,现在登录一下dingjiaxiong 的账号
点开消息
OK, 两条来自aaa 的消息,点进去
这样就算已读了,返回
红星就没了。这样就是已读私信的状态了。
【课后作业,是开发删除私信的功能,即点击某条私信的删除按钮时,将其状态设置为删除态】
实现一下
首先是业务:
public int deleteMessage(int id) {
return messageMapper.updateStatus(Arrays.asList(new Integer[]{id}), 2);
}
然后是表现层:
// 删除私信
@RequestMapping(path = "/letter/delete", method = RequestMethod.POST)
@ResponseBody
public String deleteLetter(int id) {
messageService.deleteMessage(id);
return CommunityUtil.getJSONString(0);
}
接着就是修改前端模板了
这里主要是在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);
}
}
);
}
OK, 运行重启看看
点击这个删除按钮
可以的,没有任何提示,直接删了,回到aaa 用户
确实已经删了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。