一步步搭建本身的博客 .NET版(二、評論功能)

前言 

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

因此打算寫個系類:《一步步搭建本身的博客html5

 

    演示地址:http://blog.haojima.net/      羣內共享源碼:469075305 數據庫

 

    上一篇《一步步開發本身的博客(一)》發表以後獲得的效應還不錯,獲得了二十幾個贊。而後建的QQ羣 兩天不到 就有了進三十來我的。你們在羣裏關於建站經驗討論也是十分熱烈。因而可知,你們對擁有本身的獨立空間 是多麼的渴望。瀏覽器

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

    第1、對於閱讀者。你們有沒有在看評論的時候,看着看着有往上翻?特別是有些對罵的評論,都不知道是誰在罵誰。不得不往上翻那個@的人發的是什麼。不知道 這句話 是 對誰的哪句話作的回覆。雖然有「引用」功能,但也有不少人沒有使用。佈局

    第2、對於博主。在回覆各位園友時,點擊回覆 ,而後 跳到 最下方,而後評論框 自動出現@***  回覆以後。想回復下一位,又要把滾動條拖上去。而後 又忘記 這我的是否是已經回覆過了。又往下拖 看本身有沒有回覆過,或者有沒有漏掉誰。若是評論夠多的話 我相信 各位應該都這樣的感受,個人那個頭 個人那個暈。測試

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

表結構

      對於這樣的一個需求,沒有作過的也許一時沒有了頭緒。這裏最主要的關係就是,「引用」- 誰對誰說。是對哪條評論 展開的討論。spa

      其實我把表結構拿出來,相信你們就明白了。.net

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

      ID:表主鍵

      Content:評論的內容     

 

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

      BlogUsersId:用戶ID

      BlogsId:博客ID

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

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

 

      CommentSort:沒用(原本覺得會用到)

      ContentLevy:沒用(原本覺得會用到)

       這裏要說明下    CommentID:引用的評論內容的ID。其實並不是真的是評論內容ID 而是"父評論ID"。咱們爲了簡單起見,把評論分紅兩種。

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

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

      IsInitial  是不是"父評論"

 

 

如圖:      

實現

     經過對錶結構的簡單分析,我相信 你們應該已經很是明白 我會怎麼去實現了。

   第1、評論提交

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();

 

       一目瞭然,其實就是一個對象存入數據庫了。至於每一個字段的取值,你想怎麼取看你本身的。

   第2、加載評論

      評論的加載 可能會比提交複雜那麼一點。提交有先後 怎麼去歸類佈局呢?

      首先要對 父評論 的篩選,而後加載父評論 和 父評論下的子評論。感受要進行屢次數據庫的查詢,那麼咱們只能嘗試儘量少的查詢。

      下面來具體看實現代碼。      

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 

 


 

疑問

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

     我知道的方式:

     第1、經過Cookie。(缺點:若是要進行訪問量排行的話,能夠人爲清理cookie,惡意刷新訪問量)

     第2、經過客戶端取得IP(缺點:1.若是訪問量大的話,每次插入數據庫以前都要先查詢是否存在。2.如今咱們大可能是公用外網IP,沒法統計獨立訪客)

     疑問:1.cnzz的獨立訪客(UV)是怎麼統計的。2.博客園的文章閱讀量是怎麼統計的。(進過測試,文章刷新第二遍的時候能夠看到 閱讀量 加一 ,而後清理cookie 後刷新 閱讀量 加一,而後無論怎麼刷 都沒反應了)

     若是實在是找不到好的解決方案,我打算用 IP+系統版本+瀏覽器版本號 做爲「聯合主鍵」,若是「主鍵」24小時內重複兩次以上,則不統計,若是cookie存在也不統計。

 

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

相關文章
相關標籤/搜索