一步步搭建自己的博客 .NET版(2、評論功能)


前言 

    這次開發的博客主要功能或特點:
    第一:可以兼容各終端,特別是手機端。
    第二:到時會用到大量html5,炫啊。
    第三:導入博客園的精華文章,並做分類。(不要封我)
    第四:做個插件,任何網站上的技術文章都可以轉發收藏 到本博客。

所以打算寫個系類:《一步步搭建自己的博客

 

    演示地址:http://blog.haojima.net/      群內共享源碼:469075305 

 

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

    這篇主要是分析 評論功能。在這里,不得不吐槽下 博客園的評論功能。

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

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

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

表結構

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

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

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

      ID:表主鍵

      Content:評論的內容     

 

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

      BlogUsersId:用戶ID

      BlogsId:博客ID

      ReplyUserID:引用的評論的用戶ID。

      ReplyUserName:引用的評論的用戶名。

 

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

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

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

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

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

      IsInitial  是否是"父評論"

 

 

如圖:      

實現

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

   第一、評論提交

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

效果圖和演示地址

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

        效果圖:

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

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

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

        一步步開發自己的博客 .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存在也不統計。

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM