天天看點

一步步搭建自己的部落格 .NET版(2、評論功能)

一步步搭建自己的部落格 .NET版(2、評論功能)

這篇主要是講開發評論功能的思路。在這裡,不得不吐槽下 部落格園的評論功能。

第一、對于閱讀者。大家有沒有在看評論的時候,看着看着有往上翻?特别是有些對罵的評論,都不知道是誰在罵誰。不得不往上翻那個@的人發的是什麼。不知道 這句話 是 對誰的哪句話做的回複。雖然有“引用”功能,但也有很多人沒有使用。

第二、對于部落客。在回複各位園友時,點選回複 ,然後 跳到 最下方,然後評論框 自動出現@*** 回複之後。想回複下一位,又要把滾動條拖上去。然後 又忘記 這個人是不是已經回複過了。又往下拖 看自己有沒有回複過,或者有沒有漏掉誰。如果評論夠多的話 我相信 各位應該都這樣的感覺,我的那個頭 我的那個暈。

前言 

    這次開發的部落客要功能或特點:

    第一:可以相容各終端,特别是手機端。

    第二:到時會用到大量html5,炫啊。

    第三:導入部落格園的精華文章,并做分類。(不要封我)

    第四:做個插件,任何網站上的技術文章都可以轉發收藏 到本部落格。

是以打算寫個系類:《一步步搭建自己的部落格》

  • 一步步開發自己的部落格  .NET版(1、頁面布局、blog遷移、資料加載)
  • 一步步開發自己的部落格  .NET版(2、評論功能)
  • 一步步開發自己的部落格  .NET版(3、注冊登入功能)
  • 一步步開發自己的部落格  .NET版(4、文章釋出功能)
  • 一步步開發自己的部落格  .NET版(5、搜尋功能)
  • 一步步開發自己的部落格  .NET版(6、手機端的相容)

    示範位址:http://blog.haojima.net/      群内共享源碼:469075305 

    上一篇《一步步開發自己的部落格(一)》發表之後得到的效應還不錯,得到了二十幾個贊。然後建的QQ群 兩天不到 就有了進三十來個人。大家在群裡關于建站經驗讨論也是十分熱烈。由此可見,大家對擁有自己的獨立空間 是多麼的渴望。

    這篇主要是分析 評論功能。在這裡,不得不吐槽下 部落格園的評論功能。

    第一、對于閱讀者。大家有沒有在看評論的時候,看着看着有往上翻?特别是有些對罵的評論,都不知道是誰在罵誰。不得不往上翻那個@的人發的是什麼。不知道 這句話 是 對誰的哪句話做的回複。雖然有“引用”功能,但也有很多人沒有使用。

    第二、對于部落客。在回複各位園友時,點選回複 ,然後 跳到 最下方,然後評論框 自動出現@***  回複之後。想回複下一位,又要把滾動條拖上去。然後 又忘記 這個人是不是已經回複過了。又往下拖 看自己有沒有回複過,或者有沒有漏掉誰。如果評論夠多的話 我相信 各位應該都這樣的感覺,我的那個頭 我的那個暈。

    在這裡 我就打算規避這類問題,像QQ空間的評論 就很爽,誰在和誰對話 一目了然。

表結構

      對于這樣的一個需求,沒有做過的也許一時沒有了頭緒。這裡最主要的關系就是,“引用”- 誰對誰說。是對哪條評論 展開的讨論。

      其實我把表結構拿出來,相信大家就明白了。

一步步搭建自己的部落格 .NET版(2、評論功能)

      這裡  我再詳細分析下每個字段。

      ID:表主鍵

      Content:評論的内容     

      CommentID:引用的評論内容的ID。

      BlogUsersId:使用者ID

      BlogsId:部落格ID

      ReplyUserID:引用的評論的使用者ID。

      ReplyUserName:引用的評論的使用者名。

      CommentSort:沒用(本來以為會用到)

      ContentLevy:沒用(本來以為會用到)

       這裡要說明下    CommentID:引用的評論内容的ID。其實并非真的是評論内容ID 而是"父評論ID"。我們為了簡單起見,把評論分成兩種。

父評論,子評論。什麼是父評論,子評論?父:初始評論,子:在父評論的基礎上進行評論,或者子評論的基礎上進行評論。(這裡就不分 子子評論  子子子評論了。我想遞歸應該也可以做到,但不想那麼複雜了)

      那麼上面還有一個字段沒有解釋:

      IsInitial  是否是"父評論"

如圖:      

一步步搭建自己的部落格 .NET版(2、評論功能)

實作

     通過對表結構的簡單分析,我相信 大家應該已經非常明白 我會怎麼去實作了。

   第一、評論送出

var BlogId = int.Parse(Request.Form["BlogId"]);
var UserId = MySession.UserInfoSessioin.Id; //int.Parse(Request.Form["UserId"]);
var CommentID = int.Parse(Request.Form["CommentID"]);
var Content = Request.Form["Content"];
var ReplyUserID = int.Parse(Request.Form["ReplyUser"]);
var ReplyUserName = string.Empty;
var User = BLL.Common.CacheData.GetUserInfo().Where(t => t.Id == ReplyUserID).FirstOrDefault();
if (null != User)
{
    ReplyUserName = string.IsNullOrEmpty(User.UserNickname) ? User.UserName : User.UserNickname;
}

BLL.BlogCommentBLL comment = new BLL.BlogCommentBLL();
comment.Add(new BlogComment()
{
    BlogUsersId = UserId,
    BlogsId = BlogId,
    Content = Content,
    CommentID = CommentID,
    ReplyUserID = ReplyUserID,
    ReplyUserName = ReplyUserName,
    IsInitial = CommentID == -1
});
comment.save();      

       一目了然,其實就是一個對象存入資料庫了。至于每個字段的取值,你想怎麼取看你自己的。

   第二、加載評論

      評論的加載 可能會比送出複雜那麼一點。送出有前後 怎麼去歸類布局呢?

      首先要對 父評論 的篩選,然後加載父評論 和 父評論下的子評論。感覺要進行多次資料庫的查詢,那麼我們隻能嘗試盡可能少的查詢。

      下面來具體看實作代碼。      

int blogId = int.Parse(Request.Form["blogID"]);
int pageIndex = int.Parse(Request.Form["pageIndex"]);
BLL.CommentHandle com = new BLL.CommentHandle();
Dictionary<string, object> dic = new Dictionary<string, object>();
var comObj = com.GetComment(blogId, pageIndex);
if (null == comObj)
    return PartialView("Null");
dic.Add("commentList", comObj);//對應的評論
dic.Add("SessionUser", BLL.Common.MySession.UserInfoSessioin);
return PartialView(dic);            
com.GetComment(blogId, pageIndex) 方法 根據 部落格ID  和  第幾頁評論 做為參數,取評論資料,下面給出方法的詳細實作:
      
public List<List<BlogComment>> GetComment(int blogId, int pageIndex)
{
    int total;
    BLL.BlogCommentBLL com = new BlogCommentBLL();
    //IsInitial == true 父評論 (第一次資料庫查詢:查詢30條父評論)
    List<int> disCom = com.GetList<int>(pageIndex, 30, out total, t => t.IsInitial == true && t.BlogsId == blogId,
                        false, t => t.Id).Select(t => t.Id).ToList();
    if (pageIndex > total)//已經沒有評論資訊了
    {
        return null;
    }
    //第二次資料庫查詢:查詢30條父評論 和30條父評論下的子評論
    var listCom = com.GetList(t => disCom.Contains(t.CommentID) || disCom.Contains(t.Id)).ToList();
    List<List<BlogComment>> ComObj = new List<List<BlogComment>>();
    var ini = listCom.Where(t => t.IsInitial == true).ToList();//這裡就不查資料庫了直接進行集合篩選
    //對評論進行分組(以父評論 分組)
    foreach (BlogComment item in ini)
    {
        item.BlogUsers = CacheData.GetUserInfo().Where(t => t.Id == item.BlogUsersId).FirstOrDefault();              
        var userobj = CacheData.GetUserInfo().Where(t => t.Id == item.ReplyUserID).FirstOrDefault();
        if (null != userobj)
            item.ReplyUserName = userobj.UserNickname;
        //添加 以父評論 為一分組 的評論
        ComObj.Add(GetCom(item, listCom));
    }
    return ComObj;
}      

    上面進行了二次資料庫查詢,其餘的時候 都是進行 資料集合的篩選。在上面的代碼中 我們看到了 方法 GetCom(item, listCom)// 取 頂級評論 下的子評論

private List<BlogComment> GetCom(BlogComment com, List<BlogComment> list)
{
    var li = list.Where(t => t.CommentID == com.Id).ToList();
    li.Insert(0, com);
    return li;
}      

效果圖和示範位址

        在此實作的全部過程都已經分析完了。我們來看看效果圖和示範位址。

        效果圖:

一步步搭建自己的部落格 .NET版(2、評論功能)

        示範位址:http://blog.haojima.net/admin/268.html (界面醜是醜了點,後期再美化。如果有美工願意免費合作,非常歡迎~~)

        如果您對本篇文章感興趣,那就麻煩您點個贊,您的鼓勵将是我的動力。 當然您還可以加入QQ群:

一步步搭建自己的部落格 .NET版(2、評論功能)

讨論。

        如果您有更好的處理方式,希望不要吝啬賜教。

        一步步開發自己的部落格 .NET版系列:http://www.cnblogs.com/zhaopei/tag/Hi-Blogs/

        本文連結:http://www.cnblogs.com/zhaopei/p/4744846.html 

疑問

     我在構思開發部落格的時候,有個疑問。那就是怎樣更好的統計文章閱讀量。

     我知道的方式:

     第一、通過Cookie。(缺點:如果要進行通路量排行的話,可以人為清理cookie,惡意重新整理通路量)

     第二、通過用戶端取得IP(缺點:1.如果通路量大的話,每次插入資料庫之前都要先查詢是否存在。2.現在我們大多是公用外網IP,無法統計獨立訪客)

     疑問:1.cnzz的獨立訪客(UV)是怎麼統計的。2.部落格園的文章閱讀量是怎麼統計的。(進過測試,文章重新整理第二遍的時候可以看到 閱讀量 加一 ,然後清理cookie 後重新整理 閱讀量 加一,然後不管怎麼刷 都沒反應了)

     如果實在是找不到好的解決方案,我打算用 IP+系統版本+浏覽器版本号 作為“聯合主鍵”,如果“主鍵”24小時内重複兩次以上,則不統計,如果cookie存在也不統計。

哪位大蝦知道更好的解決方案能告訴我下,萬分感謝。

  • 學習本是一個不斷抄襲、模仿、練習、創新的過程。
  • 雖然,園中已有本人無法超越的同主題博文,為什麼還是要寫。
  • 對于自己,博文隻是總結。在總結的過程發現問題,解決問題。
  • 對于他人,在此過程如果還能附帶幫助他人,那就再好不過了。
  • 由于部落客能力有限,文中可能存在描述不正确,歡迎指正、補充!
  • 感謝您的閱讀。如果文章對您有用,那麼請輕輕點個贊,以資鼓勵。
  • 工控物聯Q群:995475200

繼續閱讀