![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CO2IDO5QDMwITMtEjN0QDMyEDMxQTM5ATNxAjMtYjNygDMy8CX5ATNxAjMvwlN2IDOwIzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
這篇主要是講開發評論功能的思路。在這裡,不得不吐槽下 部落格園的評論功能。
第一、對于閱讀者。大家有沒有在看評論的時候,看着看着有往上翻?特别是有些對罵的評論,都不知道是誰在罵誰。不得不往上翻那個@的人發的是什麼。不知道 這句話 是 對誰的哪句話做的回複。雖然有“引用”功能,但也有很多人沒有使用。
第二、對于部落客。在回複各位園友時,點選回複 ,然後 跳到 最下方,然後評論框 自動出現@*** 回複之後。想回複下一位,又要把滾動條拖上去。然後 又忘記 這個人是不是已經回複過了。又往下拖 看自己有沒有回複過,或者有沒有漏掉誰。如果評論夠多的話 我相信 各位應該都這樣的感覺,我的那個頭 我的那個暈。
前言
這次開發的部落客要功能或特點:
第一:可以相容各終端,特别是手機端。
第二:到時會用到大量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存在也不統計。
哪位大蝦知道更好的解決方案能告訴我下,萬分感謝。
- 學習本是一個不斷抄襲、模仿、練習、創新的過程。
- 雖然,園中已有本人無法超越的同主題博文,為什麼還是要寫。
- 對于自己,博文隻是總結。在總結的過程發現問題,解決問題。
- 對于他人,在此過程如果還能附帶幫助他人,那就再好不過了。
- 由于部落客能力有限,文中可能存在描述不正确,歡迎指正、補充!
- 感謝您的閱讀。如果文章對您有用,那麼請輕輕點個贊,以資鼓勵。
- 工控物聯Q群:995475200