当前位置: 首页 > 工具软件 > QQZone > 使用案例 >

基于Javaweb的小项目(类似于qqzone) 7 —— 日志相关操作

百里默
2023-12-01

功能描述

  1. 展示日志详情:点击日志列表中的某个日志标题,可展示该日志的详情信息
    -在展示日志详情信息的下面,还要展示其他人对此日志的回复
    -若该回复存在主人回复,则也需要显示主人回复
  2. 添加日志:点击发表日志链接,可跳转添加日志页面,实现添加日志功能
    -只需要输入日志标题、日志内容
  3. 删除日志:在日志列表中,点击删除图标,可删除该日志
  • 删除日志时,需要先查看该日志是否有回复
  • 若有回复,则还需要查看是否有主人回复
  • 若有主人回复,需要先删除主人回复,再删除日志回复,最后删除日志
  • 另外,不是自己的空间,则不能删除日志

1.展示日志详情信息

【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中的authorid查询到作者信息,再将这个作者信息封装到topicauthor属性;
同时通过topicid查询到相关回复信息,将其放至list中,再将其封装到topicReplyList中。

    @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中主要是对回复及其相关联的主人回复进行相关业务操作,在获取回复列表的过程中:
首先,需要根据回复的authorid查询到回复者打的详细信息,并将其封装到replyauthor属性中;
其次,需要对其中的每一条回复进行查询是否有主人回复,若是存在主人回复,需要根据replyid查询到相关的hostReply的详细信息,并将其设置到replyhostReply中。

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

2.添加日志

添加日志操作完成后,返回日志列表,会在日志列表中展示新增的日志。
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);
    }

3.删除日志

前提条件:只有在自己的空间,才能够删除日志
在日志列表中,点击其中某一个日志后面的删除按钮,即可对该条日志进行删除:
首先,需要考虑该条日志是否存在回复;
其次,若是该日志存在回复,需要再次考虑该回复是否有主人回复;
再次,若是有主人回复,则需要先删除主人回复;
最后,再删除回复,最后删除日志。
删除成功后,会跳转到日志列表,展示删除后的日志列表。

<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层先根据topicid获取Topic信息,当前日志存在时,则先调用ReplyService删除回复及其主人回复

	@Override
    public void deleteTopic(Integer topicId) {
        Topic topic = getTopicById(topicId);
        if (topic != null) {
            replyService.deleteReplyList(topic);
            topicDAO.deleteTopic(topic);
        }
    }

ReplyServiceImpl.java
ReplyService层先根据topicid查询到对应的回复列表,再分别对每一个回复进行删除:
首先,需要根据replyid查询到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);
    }
 类似资料: