前言
這次開發的博客主要功能或特點:
第一:可以兼容各終端,特別是手機端。
第二:到時會用到大量html5,炫啊。
第三:導入博客園的精華文章,並做分類。(不要封我)
第四:做個插件,任何網站上的技術文章都可以轉發收藏 到本博客。
所以打算寫個系類:《一步步搭建自己的博客》
- 一步步開發自己的博客 .NET版(1、頁面布局、blog遷移、數據加載)
- 一步步開發自己的博客 .NET版(2、評論功能)
- 一步步開發自己的博客 .NET版(3、注冊登錄功能)
- 一步步開發自己的博客 .NET版(4、文章發布功能)
- 一步步開發自己的博客 .NET版(5、搜索功能)
- 一步步開發自己的博客 .NET版(6、手機端的兼容)
演示地址: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存在也不統計。
哪位大蝦知道更好的解決方案能告訴我下,萬分感謝。
