座在客廳的沙發上,戴着耳機,閉上眼睛,聽着那首我聽了上百遍的see you again,想着速度與激情的那羣人,我很羨慕他們,一羣志同道合的人在一塊兒,幹着一件你們都那麼嚮往的事,夢想,感受這兩個字離我愈來愈遠,太多世俗的東西,奪走了咱們原有的天真,天天感受除了上班,吃飯,睡覺,我感受不到還有什麼樂趣.html
曾經也想本身寫一些東西,惋惜能力不夠,一次偶然的機會,認識了敷衍不起,相見如故,一會兒聊了不少,給個人印象是,大神級的人物,有想法,文藝青年,我談到了我想搞一個本身博客的想法。web
說到這裏,他比我還激動,曾幾什麼時候,他也有這樣的想法,那時候也是能力不夠,如今終於有那麼點能力了,說開始就開始,一開始的計劃是,每一個星期更新一個模塊的東西,如今的狀況是開源博客系統的基本原型都出來了,若是你心懷這樣的一個博客夢想,想寫一個真正屬於本身的博客系統,那麼還猶豫什麼,加入咱們。sql
在此給出see you again百度音樂盒地址:http://music.baidu.com/song/s/4707e5121d80855c1d51b在你不忙的時候,靜下心來,聽聽音樂,音樂有的時候能帶給咱們一種微妙的感受。數據庫
送你們一句話:夢想是春天的綠,嬌嫩脆弱充滿新意;夢想是生命的水,給人但願潤物無聲;夢想是天邊的風,來去匆匆追之不及;夢想是凋零的葉,滋養大樹迎來新生。json
《一步步搭建本身的博客》架構
1、一步步開發本身的博客 .NET版(一、頁面佈局、blog遷移、數據加載)mvc
3、一步步開發本身的博客 .NET版(三、註冊登陸功能)ssh
4、一步步開發本身的博客 .NET版(四、文章發佈功能)ide
5、一步步開發本身的博客 .NET版(五、搜索功能)
6、一步步開發本身的博客 .NET版(六、手機端的兼容)
演示地址:http://blog.haojima.net/ 羣內共享源碼:469075305
開發工具:vs2013+mssql+EF6.0
整個項目採用的Asp.net MVC4.0+EF6.0+經典的簡單三層
項目採用最經典的三層架構,其實博客系統用這個徹底就夠用了,EF採用的是model frist,BLL層和DAL採用T4模板自動生成。下面是數據庫表的一些說明。
博客系統的中的亮點,在這裏使用HtmlAgilityPack組件解析HTML網頁,咱們只須要把咱們的博客園的帳號在這裏輸入就能夠很快的把咱們博客園中的文章備份過來。
其核心代碼以下:
/// <summary> /// 根據用戶導入cnblog數據 /// </summary> /// <param name="userName"></param> /// <returns></returns> public string Import(string userName, string iszf, string isshowhome, string isshowmyhome) { int blosNumber = 0; JavaScriptSerializer jss = new JavaScriptSerializer(); string url = "http://www.cnblogs.com/" + userName + @"/mvc/blog/sidecolumn.aspx"; HtmlAgilityPack.HtmlWeb htmlweb = new HtmlAgilityPack.HtmlWeb(); HtmlAgilityPack.HtmlDocument document = new HtmlDocument(); var docment = htmlweb.Load(url); string userid = GetCnblogUserId(userName); var liS = docment.DocumentNode.SelectNodes("//*[@id='sidebar_categories']/div[1]/ul/li"); foreach (var item in liS) { var tXPath = item.XPath; var href = item.SelectSingleNode(tXPath + "/a").Attributes["href"].Value; var blogtype = htmlweb.Load(href); //var entrylistItem = blogtype.DocumentNode.SelectNodes("//*[@id='mainContent']/div/div[2]/div[@class='entrylistItem']"); var entrylistItem = blogtype.DocumentNode.SelectNodes("//div[@class='entrylistItem']"); if (null == entrylistItem)//作兼容 entrylistItem = blogtype.DocumentNode.SelectNodes("//div[@class='post post-list-item']"); // if (null == entrylistItem) { continue; } foreach (var typeitem in entrylistItem) { var typeitemXPath = typeitem.XPath; var typeitemhrefObj = typeitem.SelectSingleNode(typeitemXPath + "/div/a"); if (null == typeitemhrefObj) //作兼容 typeitemhrefObj = typeitem.SelectSingleNode(typeitemXPath + "/h2/a"); var typeitemhref = typeitemhrefObj.Attributes["href"].Value; if (IsAreBlog(typeitemhref)) continue;//說明這篇文章已經備份過了的 var bloghtml = htmlweb.Load(typeitemhref); var blogcontextobj = bloghtml.DocumentNode.SelectSingleNode("//*[@id='cnblogs_post_body']");//.InnerHtml; if (blogcontextobj == null) continue;//有多是加密文章 var blogcontext = blogcontextobj.InnerHtml; var blogNameObj = bloghtml.DocumentNode.SelectSingleNode("//*[@id='Header1_HeaderTitle']"); if (null == blogNameObj) blogNameObj = bloghtml.DocumentNode.SelectSingleNode("//*[@id='lnkBlogTitle']"); try { blogName = blogNameObj.InnerText; } catch (Exception) { } var blogtitle = bloghtml.DocumentNode.SelectSingleNode("//*[@id='cb_post_title_url']").InnerText; var blogurl = bloghtml.DocumentNode.SelectSingleNode("//*[@id='cb_post_title_url']").Attributes["href"].Value; var blogtypetagurl = "http://www.cnblogs.com/mvc/blog/CategoriesTags.aspx?blogApp=" + userName + "&blogId=" + userid + "&postId=" + typeitemhref.Substring(typeitemhref.LastIndexOf('/') + 1, typeitemhref.LastIndexOf('.') - typeitemhref.LastIndexOf('/') - 1); var blogtag = Blogs.Common.Helper.MyHtmlHelper.GetRequest(blogtypetagurl); var jsonobj = jss.Deserialize<Dictionary<string, string>>(blogtag); if (null == jsonobj) continue;//若是沒有 則返回 (這裏只能去 數字.html 不能取那種自定義的url) var tagSplit = jsonobj["Tags"].Split(','); var blogtagid = new List<int>(); for (int i = 0; i < tagSplit.Length; i++) { if (tagSplit[i].Length >= 1 && tagSplit[i].LastIndexOf('<') >= 1) { var blogtagname = tagSplit[i].Substring(tagSplit[i].IndexOf('>') + 1, tagSplit[i].LastIndexOf('<') - tagSplit[i].IndexOf('>') - 1); blogtagid.Add(this.GetTagId(blogtagname, userName)); } } var categoriesSplit = jsonobj["Categories"].Split(','); var blogtypeid = new List<int>(); for (int i = 0; i < categoriesSplit.Length; i++) { if (categoriesSplit[i].Length >= 1 && categoriesSplit[i].LastIndexOf('<') >= 1) { var blogtypename = categoriesSplit[i].Substring(categoriesSplit[i].IndexOf('>') + 1, categoriesSplit[i].LastIndexOf('<') - categoriesSplit[i].IndexOf('>') - 1); blogtypeid.Add(this.GetTypeId(blogtypename, userName)); } } var blogtimeobj = bloghtml.DocumentNode.SelectSingleNode("//*[@id='post-date']"); var blogtime = ""; if (null != blogtimeobj) blogtime = blogtimeobj.InnerText; DateTime? createtime = null; var Outcreatetime = DateTime.Now; if (DateTime.TryParse(blogtime, out Outcreatetime)) createtime = Outcreatetime; BlogsBLL blog = new BlogsBLL(); var myBlogTags = new BlogTagsBLL().GetList(t => blogtagid.Contains(t.Id), isAsNoTracking: false).ToList();//.ToList(); var myBlogTypes = new BLL.BlogTypesBLL().GetList(t => blogtypeid.Contains(t.Id), isAsNoTracking: false).ToList();//.ToList(); try { var modelMyBlogs = new ModelDB.Blogs() { BlogContent = blogcontext, BlogCreateTime = createtime, BlogTitle = blogtitle, BlogUrl = blogurl, IsDel = false, BlogTags = myBlogTags, BlogTypes = myBlogTypes, UsersId = GetUserId(userName), BlogForUrl = blogurl, IsForwarding = iszf == "true", IsShowMyHome = isshowmyhome == "true", IsShowHome = isshowhome == "true" }; blog.Add(modelMyBlogs); blog.save(); var newtag = string.Empty; modelMyBlogs.BlogTags.Where(t => true).ToList().ForEach(t => newtag += t.TagName + " "); var newblogurl = "/" + modelMyBlogs.BlogUsersSet.UserName + "/" + modelMyBlogs.Id + ".html"; SearchResult search = new SearchResult() { flag = modelMyBlogs.UsersId, id = modelMyBlogs.Id, title = blogtitle, clickQuantity = 0, blogTag = newtag, content = getText(blogcontext, document), url = newblogurl }; SafetyWriteHelper<SearchResult>.logWrite(search, PanGuLuceneHelper.instance.CreateIndex); var postid = blogurl.Substring(blogurl.LastIndexOf('/') + 1); postid = postid.Substring(0, postid.LastIndexOf('.')); testJumonyParser(modelMyBlogs.Id, 1, postid, userName); blosNumber++; } catch (Exception) { throw; } } } if (blosNumber > 0) { Blogs.BLL.Common.CacheData.GetAllTag(true); Blogs.BLL.Common.CacheData.GetAllType(true); Blogs.BLL.Common.CacheData.GetUserInfo(true); return "成功導入" + blosNumber + "篇Blog"; } return "ok"; }
private int GetTagId(string tagname, string userName) { BlogTagsBLL blogtag = new BlogTagsBLL(); try { var blogtagmode = blogtag.GetList(t => t.TagName == tagname); if (blogtagmode.Count() >= 1) return blogtagmode.FirstOrDefault().Id; else { blogtag.Add(new ModelDB.BlogTags() { TagName = tagname, IsDel = false, UsersId = GetUserId(userName) }); blogtag.save(); return GetTagId(tagname, userName); } } catch (Exception ex) { return -1; } }
private int GetTypeId(string typename, string userName) { BlogTypesBLL blogtype = new BlogTypesBLL(); var blogtagmode = blogtype.GetList(t => t.TypeName == typename); if (blogtagmode.Count() >= 1) return blogtagmode.FirstOrDefault().Id; else { blogtype.Add(new ModelDB.BlogTypes() { TypeName = typename, CreateTime = DateTime.Now, IsDel = false, UsersId = GetUserId(userName) }); blogtype.save(); return GetTypeId(typename, userName); } }
private int GetUserId(string userName) { BlogUsersBLL user = new BlogUsersBLL(); var blogtagmode = user.GetList(t => t.UserName == userName); if (blogtagmode.Count() >= 1) return blogtagmode.FirstOrDefault().Id; else { user.Add(new ModelDB.BlogUsersSet() { UserName = userName, IsDel = false, UserPass = "admin", UserNickname = string.IsNullOrEmpty(blogName.Trim()) ? userName : blogName, IsLock = false, UserMail = "無效", UserInfo = null }); try { user.save(false); } catch (Exception ex) { throw; } return GetUserId(userName); } }
private bool IsAreBlog(string url) { BLL.BlogsBLL blog = new BLL.BlogsBLL(); var blogs = blog.GetList(t => t.BlogUrl == url); return blogs.Count() >= 1; }
private string GetCnblogUserId(string url) { HtmlAgilityPack.HtmlWeb htmlweb = new HtmlAgilityPack.HtmlWeb(); var docment = htmlweb.Load("http://www.cnblogs.com/" + url); var list = docment.DocumentNode.SelectNodes("//link[@rel='stylesheet']"); foreach (var item in list) { if (null != item.Attributes && item.Attributes.Contains("href")) { var href = item.Attributes["href"].Value; href = href.Substring(href.LastIndexOf("/") + 1, href.IndexOf(".") - href.LastIndexOf("/") - 1); int userid = -1; if (int.TryParse(href, out userid)) return userid.ToString(); } } return ""; }
public string testJumonyParser(int BlogsId = 1, int BlogUsersId = 1, string postId = "4368417", string blogApp = "zhaopei") { bool isNext = true; int i = 0; //List<BlogCommentSet> blogcommen = new List<BlogCommentSet>(); BlogCommentBLL blogcommenbll = new BlogCommentBLL(); while (isNext) { i++; var url = "http://www.cnblogs.com/mvc/blog/GetComments.aspx?postId=" + postId + "&blogApp=" + blogApp + "&pageIndex=" + i; var jumony = new JumonyParser(); var htmlSource = jumony.LoadDocument(url).InnerHtml(); JavaScriptSerializer _jsSerializer = new JavaScriptSerializer(); CnBlogComments comm = _jsSerializer.Deserialize<CnBlogComments>(htmlSource); var commentsHtml = jumony.Parse(comm.commentsHtml); var pager = commentsHtml.Find("div.pager").FirstOrDefault(); if (null != pager) { var Next = pager.Find("*").LastOrDefault().InnerText(); if (Next != "Next >") isNext = false; } else isNext = false; var listComment = commentsHtml.Find("div.feedbackItem").ToList(); foreach (var item in listComment) { var commentDataNode = item.Find("div.feedbackListSubtitle span.comment_date").FirstOrDefault(); // var commentData = DateTime.Parse(commentDataNode.InnerText()); var commentUserNode = item.Find("div.feedbackListSubtitle a[target='_blank']").FirstOrDefault(); var commentUser = commentUserNode.InnerText(); var Content = item.Find("div.blog_comment_body").FirstOrDefault().InnerText(); blogcommenbll.Add( new BlogCommentSet() { BlogsId = BlogsId, CommentID = -1, IsDel = false, Content = Content, CreateTime = commentData, ReplyUserName = commentUser, BlogUsersId = BlogUsersId, IsInitial = true } ); } } try { blogcommenbll.save(false); } catch (Exception) { } return "ok"; }
在着好比說這個盤古分詞,全文檢索,效果以下
代碼太多,我就截圖算了...
固然開源博客系統中還有不少其餘的東西,若是你感興趣,或者你有什麼好的主意,就加入咱們的隊伍中來吧。
虛擬空間申請地址:http://wanwang.aliyun.com/hosting/free/
雖然說免費的東西都不怎麼好,流量空間各方面都有限制,當時用來作我的博客已經夠用了。。。
若是您對本篇文章感興趣,那就麻煩您點個贊,您的鼓勵將是個人動力。 固然您還能夠加入QQ羣:討論。
若是您有更好的處理方式,但願不要吝嗇賜教。