评论回复功能_评论回复功能前端 - CSDN
精华内容
参与话题
  • 评论回复功能的设计与实现

    千次阅读 2020-03-16 10:18:07
    评论回复功能的数据库设计可以设计两张表,评论表和回复表,也可以将其设计为一张表,我采用的是一张表 评论回复表的相关字段(我做的是商品goods下的评论回复) 字段解释: gc_id:评论回复表id gc_uid:评论用户...

    评论回复功能的数据库设计可以分开设计成两张表,评论表和回复表,也可以将其设计为一张表,我采用的是一张表
    评论回复表的相关字段(我做的是商品goods下的评论回复)
    在这里插入图片描述
    字段解释:

    gc_id:评论回复表id
    gc_uid:评论用户id(外键)
    gc_content:评论内容
    gc_time:评论时间
    gc_gid:评论的商品id(外键)
    gc_status:评论状态(1未删除0已删除)
    gc_parentid:父级评论的id,如果不是对评论的回复,那么该值为null
    

    我在评论回复表中添加了几条数据
    在这里插入图片描述
    接下来是代码部分了
    采用的是 springboot+mybatis
    1.GoodsComment 的pojo类

    public class GoodsComment {
        private Integer gcId;
        private Integer gcGid;
        private Integer gcUid;
        private Date gcTime;
        private String gcContent;
        private Integer gcStatus;
        private Integer gcParentid;
        private Goods goods;
        private Users users;
        private List<GoodsComment> child;
    
    	// 略去了getter和setter方法
    }
    

    2.GoodsCommentMapper.java

    public interface GoodsCommentMapper {
        // 根据商品id查询该商品下的所有评论
        List<GoodsComment> findByGoodId(@Param("gId") Integer gId);
    }
    

    3.GoodsCommentService.java

    public interface GoodsCommentService {
        // 根据商品id查询该商品下的所有评论
        List<GoodsComment> findByGoodId(Integer gId);
    }
    

    4.GoodsCommentServiceImpl.java

    @Service
    public class GoodsCommentServiceImpl implements GoodsCommentService {
        @Resource
        private GoodsCommentMapper goodsCommentMapper;
    
        @Override
        public List<GoodsComment> findByGoodId(Integer gId) {
            return goodsCommentMapper.findByGoodId(gId);
        }
    }
    
    

    5.GoodsCommentMapper.xml

    <select id="findByGoodId" resultMap="BaseResultMap">
        SELECT a.*,b.*
        FROM goods_comment AS a,users AS b
        WHERE a.gc_gId=#{gId}
        AND a.gc_status=b.u_status=1
        AND a.gc_uid=b.u_id
    </select>
    

    6.CoodsCommentController.java

    @RestController
    @RequestMapping("/goodsComment")
    public class GoodsCommentController {
    
        @Autowired
        private GoodsCommentService commentService;
    
        /**
         * 根据商品id查询该商品下的所有评论
         * @param gId
         * @return
         */
        @GetMapping("/findByGoodId/{gId}")
        public List<GoodsComment> findByGoodId(@PathVariable("gId") Integer gId) {
            List<GoodsComment> allComments = commentService.findByGoodId(gId);
            if (allComments == null || allComments.size() == 0) {
                return new ArrayList<>();
            }
            List<GoodsComment> comments = new ArrayList<>();
            List<GoodsComment> parents = new ArrayList<>();
            for (GoodsComment comment : allComments) {
                if (comment.getGcParentid()==null) {
                    comments.add(comment);
                    parents.add(comment);
                } else {
                    boolean foundParent=false;
                    for (GoodsComment parent : parents) {
                        if (comment.getGcParentid() == parent.getGcId()) {
                            if (parent.getChild() == null) {
                                parent.setChild(new ArrayList<>());
                            }
                            parent.getChild().add(comment);
                            parents.add(comment);
                            foundParent=true;
                            //如果对list迭代过程中同时修改list,会报java.util.ConcurrentModificationException
                            // 的异常,所以我们需要break,当然break也可以提高算法效率
                            break;
                        }
                    }
                    if (!foundParent) {
                        throw new RuntimeException("can not find the parent comment");
                    }
                }
            }
            return comments;
        }
    }
    

    7.获取到的数据部分

    [
        {
            "gcId": 1,
            "gcGid": 1,
            "gcUid": 11,
            "gcTime": "2020-03-13T14:29:52.000+0000",
            "gcContent": "我是评论商品的",
            "gcStatus": 1,
            "gcParentid": null,
            "goods": null,
            "users": {
                "uId": 11,
                "uName": "小陈",
                "uAvatar": "http://imgs/FjrnXL4DP6Ib8xmZmXQU5vy5GWvq"
            },
            "child": [
                {
                    "gcId": 3,
                    "gcGid": 1,
                    "gcUid": 6,
                    "gcTime": "2020-03-15T16:31:49.000+0000",
                    "gcContent": "我是回复",
                    "gcStatus": 1,
                    "gcParentid": 1,
                    "goods": null,
                    "users": {
                        "uId": 6,
                        "uName": "小贰",
                        "uAvatar": "http://imgs/Fi-WU4zsZ-1OTVfPg5OXyIao13SP"
                    },
                    "child": [
                        {
                            "gcId": 4,
                            "gcGid": 1,
                            "gcUid": 10,
                            "gcTime": "2020-03-15T16:48:15.000+0000",
                            "gcContent": "我是回复的回复",
                            "gcStatus": 1,
                            "gcParentid": 3,
                            "goods": null,
                            "users": {
                                "uId": 10,
                                "uName": "小贰",
                                "uAvatar": "http://imgs/Fi-WU4zsZ-1OTVfPg5OXyIao13SP"
                            },
                            "child": [
                                {
                                    "gcId": 5,
                                    "gcGid": 1,
                                    "gcUid": 9,
                                    "gcTime": "2020-03-15T20:26:09.000+0000",
                                    "gcContent": "我看一下新增评论",
                                    "gcStatus": 1,
                                    "gcParentid": 4,
                                    "goods": null,
                                    "users": {
                                        "uId": 9,
                                        "uName": "小贰",
                                        "uAvatar": "http://imgs/Fi-WU4zsZ-1OTVfPg5OXyIao13SP"
                                    },
                                    "child": null
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "gcId": 2,
            "gcGid": 1,
            "gcUid": 8,
            "gcTime": "2020-03-14T14:30:12.000+0000",
            "gcContent": "我也是评论这个商品的",
            "gcStatus": 1,
            "gcParentid": null,
            "goods": null,
            "users": {
                "uId": 8,
                "uName": "小贰",
                "uAvatar": "http://imgs/Fi-WU4zsZ-1OTVfPg5OXyIao13SP"
            },
            "child": null
        }
     ]
    

    评论的样式
    在这里插入图片描述

    展开全文
  • 评论回复功能的实现

    万次阅读 多人点赞 2020-05-13 01:44:07
    最后的效果图如上,大家不难发现这个回复的想法和知乎的回复模式差不多(因为我就是照着那个思路实现的 :) ),只是这里少实现了查看对话的功能。下面说说我实现这个过程中遇到的一些困难。 首先讲讲我的数据库的...

     

    最后的效果图如上,大家不难发现这个回复的想法和知乎的回复模式差不多(因为我就是照着那个思路实现的 :) ),只是这里少实现了查看对话的功能。下面说说我实现这个过程中遇到的一些困难。

     

    首先讲讲我的数据库的实现:

    RId指的是每个评论的唯一id,这个R取得是review(评论)的意思

    RTId指的是每条帖子的id

    RRId指的是被回复的评论的id,如果有就是其id,无为0

    ROwnerName指的是此条评论的人的名字

    RTargetName指的是被回复的人的名字,可空

    RComments指的是评论的内容

    RTime指的是评论的时间

     

    (1)如何实现点击图中的“回复”按钮,在评论下方就弹出一个输入框。

    这个很好实现,主要涉及到的就是一些js的知识。

     

    那么,到底该怎么实现点击“回复”,就在这个评论下方弹出一个输入框而不是在其他的输入框下弹出呢?

    我们首先得给这个输入框所在的div分配一个唯一的id,这里我们可以使用评论的RId。

    然后再给回复按钮添加监听函数,也就是设置其onclick属性,传入的参数就是输入框的id。每当点击按钮的时候,都改变输入框所在div的display属性

     

    <button type="button" class="btn btn-secondary" onclick="hide('#{specificReview.RId}')">回复</button>  <br />
    <p class="cContent">#{specificReview.RComments}</p>   <!--每个人回复的评论 -->  <br />
    
    <div class="comment-edit" id="#{specificReview.RId}" style=" display: none;">
        <h:inputTextarea id="doubleComments"
                         class="form-control edit"
                         value="#{comment.RDComments}"                                
                         />
        <!--<h:message for="doubleComments" style="color:red"/>-->
        <div class="preview">
            <div class="buttons">
                <h:commandButton immediate="true" class="btn btn-secondary" rendered="#{!login.isLogin()}" value="评论前请先登录" action="#{navBean.login}" />
                <h:commandButton id="submitButton" rendered="#{login.isLogin()}" actionListener="#{discuss.setTopic(discuss.topic)}"  action="#{comment.storeIntoDB(discuss.topic.TId, specificReview.RId, login.userName, specificReview.ROwnerName)}" class="btn btn-primary post broadcast" value="回复"/>                
            </div>
        </div>
    </div>

    下面是javascript的代码

        <script>
            function hide(a) {
                if (document.getElementById(a).style.display !== 'none')
                {
                    document.getElementById(a).style.display = 'none';
                }
                else
                {
                    document.getElementById(a).style.display = '';
                }
            }
        </script>

     

    可能有的猿友会疑惑那些 h: 和 #{} 是什么东西。

     

    这个h:是JSF框架下的组件(应该不影响阅读吧,感觉和 HTML 的元素差不多),#{}是EL表达式。

     

     

    (2)我们可以看到,有那么多输入框(只是很多的display都是none,并没有显示)。那么如何确保获取到的输入框的值恰巧是我们评论的输入框的值呢?

    我们都不难想到使用EL表达式来取值,也就是上面代码中的<h:inputTextArea value="#{comment.RDComments}">

     

    但是大家可能会遇到下面这个问题:在点击“评论”按钮时,相当于提交表单,而这里就会默认将你回复的评论下面的所有的<h:inputTextArea>(也就是我们的输入框)中的value=#{comment.RDComments}执行一遍,这就导致了我们获取的评论值总是为空的情况。

    那么该怎么解决这个情况呢?

    其实很简单,就是在set函数中判断一下,如果获取的值为空,就不赋值。

        public void setRDComments(String RDComments) {
            if (RDComments.length() > 0) {
                this.RDComments = RDComments;
            }
        }

     

    (3)如何实现评论判空,我有两个想法

     

    1. 点击“评论”按钮会在其下面弹出唯一一个提示框,提示内容是“评论不能为空”。

    2.评论为空时,将评论按钮disabled掉,这个给输入框添加onchange函数就行,在函数里使用getElementById获取到输入框的value,为空则disabled。

     

    无论哪个想法,都绕不开给这个输入框分配一个唯一的id,因为我好像并没有找到获取到一个div的element,然后再获取其间的其他元素的js方法。说的有点绕

    <div id="onlyOne">
      <input name="inputText" type="text" />
      <button name="submitButton" type="button">回复</button>
    </div>

    就是我知道这个div的id是"onlyOne",我能不能通过document.getElementById("onlyOne"),然后通过某种方法得到这个div中name为inputText或者为submitButton的组件的value呢?希望有路过的猿友能提示一下到底有没有这样一种方法

    <2020-05-13> 这个是可以的,我随手搜了一下,感觉 https://stackoverflow.com/a/5753895/10315163 这个就很不错。

     

    先说一下,其实我并没有实现这个功能,只有几点关于给输入框分配唯一id的想法。

    没实现的原因是在JSF框架下,其组件的id是变的(这个我就十分不理解)。

    就像上面这个图中的id,前面的那个j_idt157怎么搞都搞不掉,后面那个10指的是这个页面第几个输入框(这个是自动生成的,0是第1个,10就是第11个),最后面的doubleComments才是设置的id。

     

    为了让这个输入框的id唯一,我尝试了一个组合id的方法:

    <div class="comment-edit" id="#{specificReview.RId}Div" style=" display: none;">
        <h:inputTextarea id="#{specificReview.RId}doubleComments"
                         class="form-control edit"
                         value="#{comment.RDComments}"                                
                         />
        <!--<h:message for="doubleComments" style="color:red"/>-->
        <div class="preview">
            <div class="buttons">
                <h:commandButton immediate="true" class="btn btn-secondary" rendered="#{!login.isLogin()}" value="评论前请先登录" action="#{navBean.login}" />
                <h:commandButton id="submitButton" rendered="#{login.isLogin()}" actionListener="#{discuss.setTopic(discuss.topic)}"  action="#{comment.storeIntoDB(discuss.topic.TId, specificReview.RId, login.userName, specificReview.ROwnerName)}" class="btn btn-primary post broadcast" value="回复"/>                
            </div>
        </div>
    </div>

    就是将id扩展一下,将原来的div的id改为"#{specificReview.RId}Div"(这样亲测有效),然后把输入框的id扩展为"#{specificReview.RId}doubleComments",然而这样并没有啥用,这个输入框的id依然是系统自己给分配的。

     

    然而,我依旧不信邪,既然div能实现组合id,那你这个输入框为啥不行,然后我就把这个输入框的id设置为"#{specificReview.RId}",然后它却报错了,报错原因是id不能为空。

     

    不过我还有一个想法,就是不使用div布局了,改用table布局。给这个table分配唯一id为"#{specificReview.RId}",然后我们就有一个document.getElementById("tableId").rows[id].cells[1].innerText;来获取到其下的<td>的值。不过我没有具体了解这个js方法,能不能实现我也不能保证。

     

    如果有猿友按照这个想法实现了,能不能劳烦通知我一声,毕竟我也想知道这玩意能不能成。

     

    (4)如何获取到被回复的人的评论的id

    这个可以通过添加函数action或者actionListener实现,然后将这个id作为调用函数的参数传进去,在调用的函数里保存这个id。

     

    当然实现类似的回复功能的方法有很多,我的这个只能算是其中的比较基础的一个。我在查看知乎评论的页面源码的时候,好像还没有发现知乎的评论输入框都有一个id之类的,这也是让我很困惑的地方。

     

    <2020-05-13> 这个东西是我好久以前做的,当时我们小组连版本管理都没有(我也不知道这个概念 XD),改完东西都是通过 U 盘拷贝来拷贝去的。依稀记得每次交换完最新代码我都是用类似 project1 等名称来命名那个文件夹,当时是清楚啥是啥,现在回去看都无法确定哪个是最新的。现在回头看来真的是感慨万千。

     

     <2020-05-13> 我对这个项目依稀的记忆是基于 JSF 的,然后还有 Java Bean,企业 Bean 什么的,服务器是 Glassfish(至于为什么不是 tomcat,我姑且不知道),IDE 是 Netbeans。这些都是个什么东西我早就忘的一干二净了,就连怎么运行这个项目也不记得了。剩下的只是项目文件夹下 12 的无意义的文件,和这篇记录当时自己颠簸的文章。还有最上面那个演示的 GIF 里回复后自动回到顶部的奇怪 bug。所以源码是不会提供了...,而且只要思路清晰,写出代码是没有问题的。(这个观念是我最近看完《如何阅读一本书》后和自己经历对比后坚信的,书中说“一个人如果说他知道他在想些什么,却说不来,通常是他其实并不知道他自己在想些什么。”)

     

    <2020-05-13> 刚刚看到了有人分享 MIT 的 [The Missing Semester of Your CS Education](https://missing.csail.mit.edu/) 这个课程,想到了自己一直不愿意直面的这篇文章,也想到了前几个月无意中逛到的几个人 ice1000ibug...,想起了龙应台的目送:“你和他的缘分就是今生今世不断地在目送他的背影渐行渐远。你站在小路的这一端,看着他逐渐消失在小路转弯的地方,而且,他用背影默默地告诉你,追不上。”(有改)。

     

    展开全文
  • 评论回复功能的数据库设计(JAVA+MYSQl)

    万次阅读 多人点赞 2019-04-01 23:40:59
    评论回复功能是社交网站最基本的功能,本文主要讲解评论留言的设计及实现。 需求: 用户评论日记,回复评论 显示所有评论 2.数据库设计 日记表:diary 用户表:user 回复表:reply 字段设计 private int ...

     1.概述

    评论回复功能是社交网站最基本的功能,本文主要讲解评论留言的设计及实现。

    需求:

    1. 用户评论日记,回复评论
    2. 显示所有评论

    2.数据库设计

    日记表:diary

    用户表:user

    回复表:reply

    字段设计

    private int id ; //回复id (主键id)
    private Integer diaryId; //日记id (关联日记表)
    private String text; //回复内容 
    private Integer userId;  //用户id (关联用户表)
    private Integer lastId;  //上一条回复id (用于关联回复表,维护好每条评论的关系)
    

    外键关系

    讲解:

    通过last_id我们就能找到这条回复是回复的哪条评论或日记。

    3.java实现思路

    1. 存储我们使用链表,这样可以一步一步找到最后一条回复,应为一条评论下可能有多人回复,所以存储下一个对象我们使用List来存储(对象数组也行)
    2. 先查询last_id为null的数据,last_id为null则说明这是日记的第一层评论。
    3. 查询list_id不为null的数据,last_id不为null则说明这是回复。
    4. 通过last_id找到对应的评论,回复。添加到链表中。
    5. 打印

    4.实现

    示例数据库数据

    示例显示(在web中显示)

    dao层使用的jpa.

    实体类

    1.Reply(评论实体类)

    package com.ss.entity;
    
    import lombok.Data;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Data
    @Table(name = "reply")
    public class Reply {
        @Id
        @GeneratedValue
        private int id ; //回复id
        private Integer diaryId; //日记id
        private String text; //回复内容
        private Integer userId;  //用户id
        private Integer lastId;  //上一条回复id
    }

    2.Node(链表结构)

    package com.ss.entity;
    
    import lombok.Data;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Data
    public class Node {
    
        public Node(){
    
        }
    
        /**
         * 构造函数
         * @param reply
         */
        public Node(Reply reply){
            this.id = reply.getId();
            this.diaryId = reply.getDiaryId();
            this.lastId = reply.getLastId();
            this.text = reply.getText();
            this.userId = reply.getUserId();
        }
    
    
        private int id ;
        private Integer diaryId;
        private String text;
        private Integer userId;
        private Integer lastId;
        //下一条回复
        private List<Node> nextNodes = new ArrayList<Node>();
    
    
        /**
         * 将单个node添加到链表中
         * @param list
         * @param node
         * @return
         */
        public static boolean addNode(List<Node> list,Node node){
            for (Node node1 : list) {   //循环添加
                if (node1.getId()==node.getLastId()){   //判断留言的上一段是都是这条留言
                   node1.getNextNodes().add(node);   //是,添加,返回true;
                   System.out.println("添加了一个");
                   return true;
                }else{     //否则递归继续判断
                    if (node1.getNextNodes().size()!=0)
                        if (Node.addNode(node1.getNextNodes(),node)){
                            return true;
                        }
                }
            }
            return false;
        }
    
        /**
         * 将查出来的lastId不为null的回复都添加到第一层Node集合中
         * @param firstList
         * @param thenList
         * @return
         */
        public static List addAllNode(List<Node> firstList,List<Reply> thenList){
            while (thenList.size()!=0){
                int size = thenList.size();
                for (int i = 0;i<size;i++){
                    if (Node.addNode(firstList,new Node(thenList.get(i)))){
                        thenList.remove(i);
                        i--;
                        size--;
                    }
                }
            }
            return firstList;
        }
    
        //打印
        public static void show(List<Node> list){
            for (Node node : list) {
                System.out.println(node.getUserId()+" 用户回复了你:"+node.getText());
                if (node.getNextNodes().size()!=0){
                    Node.show(node.getNextNodes());
                }
            }
        }
    
    
    }
    

    3.Test方法

    package com.ss.reply;
    
    import com.ss.dao.ReplyRepository;
    import com.ss.entity.Node;
    import com.ss.entity.Reply;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ReplyApplicationTests {
    
        @Autowired
        private ReplyRepository replyRepository;
    
        @Test
        public void contextLoads() {
            //查询id为6且lastId为null的评论
            List firstList = replyRepository.findAllByDiaryIdAndLastIdNull(6);
            //查询id为6且LastId不为null的评论
            List thenList = replyRepository.findAllByDiaryIdAndLastIdNotNull(6);
            //新建一个Node集合。
            ArrayList<Node> nodes = new ArrayList<>();
            //将第一层评论都添加都Node集合中
            for (Object o : firstList) {
                nodes.add(new Node((Reply) o));
            }
            //将回复添加到对应的位置
            List list = Node.addAllNode(nodes, thenList);
            System.out.println();
            //打印回复链表
            Node.show(list);
        }
    
    }
    

    输出结果

    应为没有用关联查询,所以没能显示谁回复的谁,但如果你已经能做到这里,相信对你来说也不是难事了、

    (没有添加缩进符,所以显示的一排,但和示例显示的输出顺序是一样的)

    4.总结

    在这个demo中,使用了递归插入链表,递归查询链表。可能单看代码理解有些困难,但主要的是数据库设计,理解了数据库设计,你自己也能写出代码来。

    在web程序中你可以将最终得到的list<Node>链表返回给前端,前端通过自己写一个js工具类,将list<Node>链表拆开显示。

    可能还有一个更简单的方法,采用多对一的映射关系,让数据库通过外键关联关系自动帮我们添加链表,但是你拆开链表的时候还是要用到递归。因为现在对表的映射关系不是太懂,所以在这先不说。以后有机会在来分享。

    展开全文
  • 各位,帮忙看看,该怎么使用来java实现评论回复功能? 如果有视频的话,可否发给视频链接?
  • 搭建博客之评论回复功能的实现

    千次阅读 2018-06-26 21:21:37
    一直觉得普通的评论功能过于单调,对于我这种看什么都喜欢翻评论区的人来说有点功能不足,既然要添加评论回复功能,具体要做到什么呢。1.对指定的评论回复2.对指定的回复回复3.属于某一评论下的回复树状排列在评论下...

    一直觉得普通的评论功能过于单调,对于我这种看什么都喜欢翻评论区的人来说有点功能不足,

    既然要添加评论回复功能,具体要做到什么呢。

    1.对指定的评论回复

    2.对指定的回复回复

    3.属于某一评论下的回复树状排列在评论下【类似微博

    4.点击回复后在当前评论下弹出回复框

    基于这些需求重新设计了一下Comment数据表,在现有的author_id、content、date、article_id之外增加了三个字段

    1.reply_to:当前回复的对象,用于在显示评论时显示前面的 回复@用户:

    2.root:当前回复所属的根评论id

    3.parent:当前回复所回复的评论id

    前端是看了别人的前端代码,因为个人对JS不是很熟练,简单的解释就是点击回复按钮的时候选取当前评论的位置然后append一个回复框,回复框的回复按钮给定一个class,再为这个按钮写一个js,判断回复不为空后用ajax传递给后端,(不过我这里写的有点繁琐,每个评论都写了多个hidden标签用于标识它的属性,只是为了ajax提交而服务,希望以后有更好的解决方案)后端获得data后对root的设定做判断(有root就直接用root,没有就证明当前回复的是在文章下的评论,用parent作为root即可)写入数据库。之后如果成功就刷新当前页面(原本的前端代码是把添加的回复写入当前页面,就不用刷新了。)

    我这里数据库没有用到外键,所以每次渲染前端页面的时候用了一个dict用来存储每条评论下的子评论id,又用了一个dict用来记录当前页的子评论……麻烦啊

    后面肯定要对评论的获取进行优化,以及先显示特定条数(最赞)的子评论,想要查看更多再用ajax来请求,是个大工程来着,慢慢做吧。

    展开全文
  • 评论回复功能数据表设计

    万次阅读 2017-08-02 11:55:41
    CREATE TABLE `comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `topic_id` int(10) unsigned DEFAULT NULL COMMENT '主题id', `topic_type` tinyint(2) unsigned NOT NULL DEFAULT '1' COMMENT '1为
  • Android实现社交应用中的评论回复功能

    万次阅读 多人点赞 2020-04-08 14:44:12
    在Android的日常开发中,评论回复功能是我们经常遇到的需求之一,其中评论与回复列表的展示一般在功能模块中占比较大。对于需求改动和迭代较频繁的公司来说,如何快速开发一个二级界面来适应我们的功能需求无疑...
  • ... 有了我的已成型的项目和代码,可以更容易理解这篇文章。 ...本篇文章记录下自己博客项目评论功能实现的全过程,重点其实是评论回复功能。   【一,写评论】 写评论部分我没有使用富文本编辑
  • vue 实现评论回复功能

    万次阅读 热门讨论 2018-06-12 13:23:39
    参考文档https://blog.csdn.net/weixin_35987513/article/details/53748707项目中分别有三个组件1.dynamic (父组件)2.reply (子组件 评论的内容区块)3.commenttext (子组件 评论的输入框)首先在父组件,先通过异步...
  • 数据库设计——评论回复功能

    万次阅读 多人点赞 2017-05-03 02:45:35
    我的归宿就是健康与才干,一个人终究可以信赖...评论功能最主要的是发表评论回复评论(删除功能在后台)。评论功能的拓展功能体现有以下几方面: (1)单篇文章的评论数量和信息展示; (2)从时间维度,按照时间倒
  • thinkphp5实现评论回复功能

    千次阅读 2018-09-07 17:06:45
    由于之前写评论回复都是使用第三方插件:畅言 所以也就没什么动手,现在证号在开发一个小的项目,所以就自己动手写评论回复,没写过还真不知道评论回复功能听着简单,但仔细研究起来却无法自拔,由于用户量少,所以...
  • springboot+mysql 实现评论回复功能

    千次阅读 2019-12-22 01:02:23
    1. 数据库结构 字段名 类型 注释 comment_id bigint 主键id user_Id bigint ...被回复用户id pid bigint 父id comment_msg varchar 回复内容 creat_time varchar 创建时间 其...
  • 基于vue+iview UI的多级评论回复功能

    热门讨论 2020-05-12 17:49:26
    我在做项目时遇到了需要评论回复功能。由于iview UI没有该组件,所以自定义设计 效果图如下 支持评论和多级回复 废话不多说,vue代码如下: 评论组件 <template> <div> <List item-layout=...
  • 参考文档https://blog.csdn.net/weixin_35987513/article/details/53748707项目中分别有三个组件1.dynamic (父组件)2.reply (子组件 评论的内容区块)3.commenttext (子组件 评论的输入框)实现效果图引入部分&...
  • php 无线级别分类 实现评论回复功能

    千次阅读 2013-10-22 11:16:06
    header('Content-type:text/html; charset=utf-8'); echo $_SERVER["REMOTE_ADDR"].""; $sip=substr($_SERVER["REMOTE_ADDR"],10,12); $eip=200;... echo "您的IP值为:".$_SERVER["REMOTE_ADDR"].
  • ![图片说明](https://img-ask.csdn.net/upload/201508/26/1440563818_704791.jpg) 例如图中的的回复,我在数据库里应该建立哪些字段呢? 求大神科普~
  • jquery:简略的wordpress评论回复功能

    千次阅读 2017-02-28 16:42:07
    这个是自己在做评论功能时候借鉴点别人的心得,大家也可以看下.
  • Android 评论回复功能,测试demo

    热门讨论 2020-07-30 23:33:25
    2.回复回复显示在评论的下方) 3.删除评论功能 4.点击屏幕下方评论区域,弹出输入区域和输入法 5.点击屏幕输入区域以外的地方隐藏输入方和输入区域 (隐藏功能,点击返回键隐藏输入区域和输入法,方法在重写的...
  • php无限级分类技术实现评论回复功能

    千次下载 热门讨论 2020-07-30 23:32:18
    运用递归获取评论层级结构数据,运用ajax实现评论页面交互,这里用thinkphp框架做个简单的demo练练手,为了简化流程这里第三级评论不再提供回复功能,当然只要在这个基础上稍作修改就可以实现无限回复功能,主要是...
  • 评论回复功能设计

    2019-03-01 20:05:44
    评论功能最主要的是发表评论回复评论(删除功能在后台)。评论功能的拓展功能体现有以下几方面: (1)单篇文章的评论数量和信息展示; (2)从时间维度,按照时间倒叙的方式展示动态的用户评论...
1 2 3 4 5 ... 20
收藏数 32,125
精华内容 12,850
关键字:

评论回复功能