【detail.html】
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" th:href="@{/css/common.css}">
<link rel="stylesheet" th:href="@{/css/detail.css}">
<script language="JavaScript">
function showDelImg(imgId){
var obj = document.getElementById(imgId);
if (obj) {
obj.style.display='inline';
}
}
function hiddenDelImg(imgId){
var obj = document.getElementById(imgId);
if (obj) {
obj.style.display='none';
}
}
function deleteReply(replyId,topicId) {
if (window.confirm("是否确认删除?")) {
window.location.href='reply.do?operation=deleteReply&replyId='+replyId+'&topicId='+topicId;
}
}
</script>
</head>
<body>
<div id="div_back_to_topic_list">
<a th:href="@{|/user.do?operation=friend&id=${session.friend.id}|}" target="_top">返回日志列表</a>
</div>
<div id="div_topic_detail">
<div id="div_topic_info">
<!--topic自身信息-->
<table id="tbl_topic_info">
<tr>
<td rowspan="2" class="w14 h96">
<div class="h64 center " style="width:100%;">
<img class="img56 " th:src="@{|/imgs/${session.topic.author.headImg}|}"/>
</div>
<div class="h32 center" style="width:100%;" th:text="${session.topic.author.nickName}">乔峰</div>
</td>
<td class="topic_title" onmousemove="showDelImg('img01')" onmouseout="hiddenDelImg('img01')">
<img id="img01" style="float: right;margin-top:2px;margin-right:2px;display: none;width:24px;height: 24px;" th:src="@{/imgs/del.jpg}"/>
<span th:text="${session.topic.title}">《萧某今天就和天下群雄决一死战,你们一起上吧!》</span>
<span class="title_date_right" th:text="${#dates.format(session.topic.topicDate,'yyyy-MM-dd HH:mm:ss')}">2021-09-01 12:30:55</span>
</td>
</tr>
<tr>
<td th:text="${session.topic.content}">杀母大仇, 岂可当作买卖交易?此仇能报便报, 如不能报, 则我父子毕命于此便了。这等肮脏之事, 岂是我萧氏父子所屑为?</td>
</tr>
</table>
</div>
<div id="div_reply_list">
<table class="tbl_reply_info" th:each="reply : ${session.topic.replyList}">
<tr>
<!--回复者信息-->
<td rowspan="2" class="w14 h88">
<div class="h56 center" style="width:100%;">
<img class="img48" th:src="@{|/imgs/${reply.author.headImg}|}"/>
</div>
<div class="h32 center" style="width:100%;" th:text="${reply.author.nickName}">段誉</div>
</td>
<!--回复内容及被回复帖子的标题-->
<td class="reply_title" th:onmouseover="|showDelImg('img${reply.id}')|" th:onmouseout="|hiddenDelImg('img${reply.id}')|">
<span th:text="|回复:${session.topic.title}|">回复:萧某今天就和天下群雄决一死战,你们一起上吧!</span>
<!--
出现删除这个小图标的条件:
1.在自己的空间(当然对自己的空间有所有的操作权限)
2.当前回复作者就是我,那我可以删除自己的回复
-->
<img th:if="${session.userBasic.id==session.friend.id || session.userBasic.id==reply.author.id}" th:id="|img${reply.id}|" class="deleteReplyImg" th:src="@{imgs/del.jpg}" th:onclick="|deleteReply(${reply.id},${session.topic.id})|"/>
<span class="title_date_right" th:text="${#dates.format(reply.replyDate,'yyyy-MM-dd HH:mm:ss')}"> 2021-09-01 14:35:15</span>
</td>
</tr>
<tr>
<!--主人回复-->
<td th:onmouseover="|showDelImg('a${reply.id}')|" th:onmouseout="|hiddenDelImg('a${reply.id}')|">
<span th:text="${reply.content}">你可曾见过边关之上、宋辽相互仇杀的惨状?可曾见过宋人辽人妻离子散、家破人亡的情景?宋辽之间好容易罢兵数十年, 倘若刀兵再起, 契丹铁骑侵入南朝, 你可知将有多少宋人惨遭横死?多少辽人死于非命?!</span><br/>
<ul style="width: 96%;border:1px dotted lightgray;list-style-type: none;padding-left:8px;padding-right:8px;" th:if="${reply.hostReply!=null}">
<li style="color:#6e0000;font-size:12px;width: 100%;border:0px solid red;" th:text="${reply.hostReply.content}">你以为我是慕容复的人,所以和我比试?段兄弟年纪轻轻,就有如此武学修为,实属罕见!武林早已盛传大理段氏有一门绝学,叫六脉神剑,能以无形剑气杀人,果然真有此门神功!</li>
<li style="color:#6e0000;font-size:12px;width:100%;border:0px solid blue;text-align: right;margin-right: 8px;" th:text="|主人回复于${#dates.format(reply.hostReply.hostReplyDate,'yyyy-MM-dd HH:mm:ss')}|">主人回复于2021/10/01 11:50:30</li>
</ul>
<a th:id="|a${reply.id}|" th:if="${reply.hostReply==null && session.userBasic.id==session.topic.author.id}" href="#" style="float: right;display:none;">主人回复</a>
</td>
</tr>
</table>
</div>
</div>
<div id="div_add_reply">
<p class="add_reply_title">添加回复</p>
<form action="reply.do" method="post">
<input type="hidden" name="operation" value="addReply"/>
<input type="hidden" name="topicId" th:value="${session.topic.id}"/>
<table>
<tr>
<th style="width: 25%">回复日志:</th>
<td><input type="text" th:value="${session.topic.title}" readonly /></td>
</tr>
<tr>
<th>回复内容:</th>
<td><textarea rows="3" name="content"></textarea></td>
</tr>
<tr>
<th colspan="2">
<input type="submit" value=" 回 复 "/>
<input type="reset" value=" 重 置 "/>
</th>
</tr>
</table>
</form>
</div>
</body>
</html>
【TopicController.java】
对日志的详情页面的请求进行处理,主要是获取topic
,并将其放到session
中。
public String topicDetail(Integer id, HttpSession session) {
Topic topic = topicService.getTopicById(id);
session.setAttribute("topic",topic);
return "frames/detail";
}
【TopicServiceImpl.java】
在service
中需要先根据topicId
获取Topic
,然后再通过topic
中的author
的id
查询到作者信息,再将这个作者信息封装到topic
的author
属性;
同时通过topic
的id
查询到相关回复信息,将其放至list
中,再将其封装到topic
的ReplyList
中。
@Override
public Topic getTopic(Integer id){
Topic topic = topicDAO.getTopic(id);
UserBasic author = userBasicService.getUserBasicById(topic.getAuthor().getId());
topic.setAuthor(author);
return topic;
}
@Override
public Topic getTopicById(Integer id) {
Topic topic = getTopic(id);
List<Reply> replyList = replyService.getReplyList(topic.getId());
topic.setReplyList(replyList);
return topic;
}
【ReplyServiceImpl.java】
在ReplyService
中主要是对回复及其相关联的主人回复进行相关业务操作,在获取回复列表的过程中:
首先,需要根据回复的author
的id
查询到回复者打的详细信息,并将其封装到reply
的author
属性中;
其次,需要对其中的每一条回复进行查询是否有主人回复,若是存在主人回复,需要根据reply
的id
查询到相关的hostReply
的详细信息,并将其设置到reply
的hostReply
中。
@Override
public List<Reply> getReplyList(Integer topicId) {
List<Reply> replyList = replyDAO.getReplyList(new Topic(topicId));
for (int i = 0; i < replyList.size(); i++) {
Reply reply = replyList.get(i);
//1.将关联的作者信息设置进去
UserBasic author = userBasicService.getUserBasicById(reply.getAuthor().getId());
reply.setAuthor(author);
//2.将关联的hostReply设置进去
HostReply hostReply = hostReplyService.getHostReplyByReplyId(reply.getId());
reply.setHostReply(hostReply);
}
return replyList;
}
添加日志操作完成后,返回日志列表,会在日志列表中展示新增的日志。
【addTopic.html】
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" th:href="@{/css/common.css}">
<link rel="stylesheet" th:href="@{/css/addTopic.css}">
</head>
<body>
<div id="div_back_to_topic_list">
<a th:href="@{|/user.do?operation=friend&id=${session.friend.id}|}" target="_top">返回日志列表3</a>
</div>
<div id="div_add_topic">
<p class="add_topic_title">添加日志</p>
<form action="topic.do" method="post">
<input type="hidden" name="operation" value="addTopic"/>
<input type="hidden" name="author" th:value="${session.userBasic.id}"/>
<table>
<tr>
<th style="width: 25%">日志名称:</th>
<td><input type="text" name="title"/></td>
</tr>
<tr>
<th style="width: 25%">日志内容:</th>
<td><textarea rows="3" name="content"></textarea></td>
</tr>
<tr>
<th colspan="2">
<input type="submit" value=" 添 加 "/>
<input type="reset" value=" 重 置 "/>
</th>
</tr>
</table>
</form>
</div>
</body>
</html>
【TopicController.java】
在控制层,对页面输入的日志标题和内容进行判空操作,如果不为空,则通过session
获取到发表日志的作者信息,再将这些信息封装到一个Topic类中进行添加操作。
public String addTopic(String title, String content, HttpSession session) {
if (title != null && content != null) {
UserBasic author = (UserBasic) session.getAttribute("userBasic");
Topic topic = new Topic(title, content, new Date(), author);
topicService.addTopic(topic);
}
return "redirect:topic.do?operation=getTopicList";
}
【TopicServiceImpl.java】
在service
层只需要执行添加日志的操作即可
@Override
public void addTopic(Topic topic) {
topicDAO.addTopic(topic);
}
前提条件:只有在自己的空间,才能够删除日志
在日志列表中,点击其中某一个日志后面的删除按钮,即可对该条日志进行删除:
首先,需要考虑该条日志是否存在回复;
其次,若是该日志存在回复,需要再次考虑该回复是否有主人回复;
再次,若是有主人回复,则需要先删除主人回复;
最后,再删除回复,最后删除日志。
删除成功后,会跳转到日志列表,展示删除后的日志列表。
<td>
<input type="button" value="删除" th:if="${session.userBasic.id==session.friend.id}" th:onclick="|deleteTopic(${topic.id})|"/>
</td>
<script language="JavaScript">
function deleteTopic(topicId) {
if (window.confirm("是否确认删除?")) {
window.location.href='topic.do?operation=deleteTopic&topicId='+topicId;
}
}
</script>
【TopicController.java】
控制层对日志获取删除请求,对其执行该请求。
public String deleteTopic(Integer topicId) {
topicService.deleteTopic(topicId);
return "redirect:topic.do?operation=getTopicList";
}
【TopicServiceImpl.java】
service
层先根据topic
的id
获取Topic
信息,当前日志存在时,则先调用ReplyService
删除回复及其主人回复
@Override
public void deleteTopic(Integer topicId) {
Topic topic = getTopicById(topicId);
if (topic != null) {
replyService.deleteReplyList(topic);
topicDAO.deleteTopic(topic);
}
}
【ReplyServiceImpl.java】
ReplyService
层先根据topic
的id
查询到对应的回复列表,再分别对每一个回复进行删除:
首先,需要根据reply
的id
查询到reply
的详细信息;
其次,对reply
进行查询相关的主人回复;
再次,如果主人回复存在,需要先删除主人回复信息;
最后,删除对应的回复信息。
public void deleteReply(Integer replyId) {
//1.根据id获取到reply
Reply reply = replyDAO.getReplyById(replyId);
if (reply != null) {
//2.如果reply有关联的hostReply,泽贤删除hostReply
HostReply hostReply = hostReplyService.getHostReplyByReplyId(reply.getId());
if (hostReply != null) {
hostReplyService.deleteHostReply(hostReply.getId());
}
//3.删除reply
replyDAO.deleteReply(replyId);
}
}
@Override
public void deleteReplyList(Topic topic) {
List<Reply> list = replyDAO.getReplyList(topic);
if (list != null) {
for (Reply reply : list) {
deleteReply(reply.getId());
}
}
}
【HostReplyServiceImpl.java】
删除主人回复
@Override
public void deleteHostReply(Integer id) {
hostReplyDAO.deleteHostReply(id);
}