此次開發的博客主要功能或特色:
第一:能夠兼容各終端,特別是手機端。
第二:到時會用到大量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 是不是"父評論"
如圖:
經過對錶結構的簡單分析,我相信 你們應該已經很是明白 我會怎麼去實現了。
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
我在構思開發博客的時候,有個疑問。那就是怎樣更好的統計文章閱讀量。
我知道的方式:
第1、經過Cookie。(缺點:若是要進行訪問量排行的話,能夠人爲清理cookie,惡意刷新訪問量)
第2、經過客戶端取得IP(缺點:1.若是訪問量大的話,每次插入數據庫以前都要先查詢是否存在。2.如今咱們大可能是公用外網IP,沒法統計獨立訪客)
疑問:1.cnzz的獨立訪客(UV)是怎麼統計的。2.博客園的文章閱讀量是怎麼統計的。(進過測試,文章刷新第二遍的時候能夠看到 閱讀量 加一 ,而後清理cookie 後刷新 閱讀量 加一,而後無論怎麼刷 都沒反應了)
若是實在是找不到好的解決方案,我打算用 IP+系統版本+瀏覽器版本號 做爲「聯合主鍵」,若是「主鍵」24小時內重複兩次以上,則不統計,若是cookie存在也不統計。
哪位大蝦知道更好的解決方案能告訴我下,萬分感謝。