zoukankan      html  css  js  c++  java
  • 网易盖楼回复的简易实现

    前些日子写了篇博客,网友给予了很多的评论,在查看及回复评论的过程中,也是发现博客园现有回复的不太好,举例如下,现有的回复如下图所示:

    ,这里根本看不出来tony_ontheway说了什么,还要我一个一个找,哦,原来他是在第N页第N行说了这个,所以非常的不方便。

    所以今天我把网易盖楼回复的实现原理以及实例Demo贴出,望博友们顶起来,让博客园整改一下,必竟,博客园是我们的大本营,是我们学习知识的地方。这里高手如云,精英荟萃,我们的大本营也不能太差,是吧。我们让博客园改进,也是为自己创建良好的环境,所以,博友们,顶起来,吼起来,一起唤起博客园的注意。

    实现盖楼回复大致分三部。

    第一步:建数据库表,这个表需要有ID及父ID.

    第二步:添加回复,添加回复的关键代码如下:

    var comment = StringExtension.ChangeStr(collection["comment"]);
                        var bbsId = collection["comment_post_ID"].ToString();
                        var comment_parent = collection["comment_parent"].ToString();
                        //$引用3楼 测试盖楼回复。。。
                        if (comment.IndexOf("$引用") >= 0)
                        {
                            comment = comment.Substring(comment.IndexOf("") + 1, comment.Length - comment.IndexOf("") - 1);
                        }
                        else
                        {
                            comment_parent = "0";
                        }
    
                        NetFavCommentModel bbsComment = new NetFavCommentModel
                        {
                            commentContent = comment,
                            NetFavId = Convert.ToInt32(bbsId),
                            commentParentId = Convert.ToInt32(comment_parent),
                            commentAddTime = DateTime.Now                        
                        };
    netFavCommentRepository.AddNetFavComment(bbsComment);

    第三步:查询回复,并以盖楼方式显示。关键代码如下。

                KeyValuePair<Pagination, IList<NetFavCommentModel>> bbsComment = netFavCommentRepository.NetFavCommentPagination(pagin, condition);
                int i = 1;
                foreach (var item in bbsComment.Value)
                {
                    item.louId = i++;
                    item.commentContent = GetContent(item, bbsComment.Value.ToList());
                }
                ViewBag.bbsComment = bbsComment.Value;
                ViewBag.bbsCommentCount = bbsComment.Value.Count();

    其中GetContent很重要,循环查询,将盖楼内容全部显示出来。

    相关代码如下:

           #region 盖楼回复
            // 根据当前的Comment得到HTML输出
            protected string GetContent(object objComment, List<NetFavCommentModel> list)
            {
                string output = "";
    
                NetFavCommentModel cmt = (NetFavCommentModel)objComment;                    // 获取当前评论
                List<NetFavCommentModel> quoteList = new List<NetFavCommentModel>();    // 创建当前评论所引用的评论列表
    
                AddComment(list, quoteList, cmt);        // 为当前评论的引用列表添加项目
    
                //quoteList.Sort(NetFavCommentModel.GetComparer());    // 对列表排序,顺序排列
    
                foreach (NetFavCommentModel quote in quoteList)    // 生成引用的评论列表
                {
                    output = String.Format(
                            "<div>{0}<span>网友 {1}的原贴:</span><br />{2}</div>",
                            output, quote.commentAddMan, quote.commentContent);
                }
    
    
                // 添加当前引用
                output = String.Format(
                        "<div class='comment'><p class='title'><span>{0}楼{1} 发表</span>网友:{2}</p>{3}<p>{4}</p>" +
                        "<p style='text-align:right;'><a class='comment-reply-link' href='#comment' " +
                        "onclick='addQuote({0},{5});'>回复</a></p></div>",
                       cmt.louId, cmt.commentAddTime, cmt.commentAddMan, output, cmt.commentContent, cmt.commentId);
    
                return output;
            }
    
            // 向quoteList中添加 符合条件的Comment
            protected void AddComment(List<NetFavCommentModel> list, List<NetFavCommentModel> quoteList, NetFavCommentModel cmt)
            {
                if (cmt.commentParentId != 0)
                {
                    NetFavCommentModel find = list.Where(n => n.commentId == cmt.commentParentId).FirstOrDefault();
                    quoteList.Add(find);
    
                    // 递归调用,只要CommentId不为零,就加入到引用评论列表
                    AddComment(list, quoteList, find);
                }
                else
                    return;
            }
    
            #endregion

     完成后截图如下:

     

    最后给出Demo示例网址 。本项目的源码就不提供了,提供一套原生版Demo,有需要请下载

  • 相关阅读:
    V8 下的垃圾回收机制
    数据库索引原理
    多线程的实现方法
    网元的概念
    Oracle 数据库实现数据合并:merge
    Linux账号管理
    Linux 进程管理 ps、top、pstree命令
    linux OS与SQL修改时区,系统时间
    数据库的几种模式
    linux上限值网速、限值带宽
  • 原文地址:https://www.cnblogs.com/ushou/p/2948402.html
Copyright © 2011-2022 走看看