分享
 
 
 

曾几何时,你是否也曾有一个博客梦?

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

1.现在的你是否还有梦想?

座在客厅的沙发上,戴着耳机,闭上眼睛,听着那首我听了上百遍的see you again,想着速度与激情的那群人,我很羡慕他们,一群志同道合的人在一起,干着一件大家都那么向往的事,梦想,感觉这两个字离我越来越远,太多世俗的东西,夺走了我们原有的天真,每天感觉除了上班,吃饭,睡觉,我感觉不到还有什么乐趣.

曾经也想自己写一些东西,可惜能力不够,一次偶然的机会,认识了敷衍不起,相见如故,一下子聊了很多,给我的印象是,大神级的人物,有想法,文艺青年,我谈到了我想搞一个自己博客的想法。

说到这里,他比我还激动,曾几何时,他也有这样的想法,那时候也是能力不够,现在终于有那么点能力了,说开始就开始,一开始的计划是,每个星期更新一个模块的东西,现在的情况是开源博客系统的基本原型都出来了,如果你心怀这样的一个博客梦想,想写一个真正属于自己的博客系统,那么还犹豫什么,加入我们。

在此给出see you again百度音乐盒地址:http://music.baidu.com/song/s/4707e5121d80855c1d51b在你不忙的时候,静下心来,听听音乐,音乐有的时候能带给我们一种微妙的感觉。

送大家一句话:梦想是春天的绿,娇嫩脆弱充满新意;梦想是生命的水,给人希望润物无声;梦想是天边的风,来去匆匆追之不及;梦想是凋零的叶,滋养大树迎来新生。

2.开源博客系列文章目录《一步步搭建自己的博客》

一、一步步开发自己的博客 .NET版(1、页面布局、blog迁移、数据加载)

二、一步步开发自己的博客 .NET版(2、评论功能)

三、一步步开发自己的博客 .NET版(3、注册登录功能)

四、一步步开发自己的博客 .NET版(4、文章发布功能)

五、一步步开发自己的博客 .NET版(5、搜索功能)

六、一步步开发自己的博客 .NET版(6、手机端的兼容)

演示地址:http://blog.haojima.net/ 群内共享源码:469075305

3.开源博客框架说明 开发工具:vs2013+mssql+EF6.0

整个项目采用的asp.netMVC4.0+EF6.0+经典的简单三层

项目采用最经典的三层架构,其实博客系统用这个完全就够用了,EF采用的是model frist,BLL层和DAL采用T4模板自动生成。下面是数据库表的一些说明。

4.在这个项目中你能学到什么?博客系统的中的亮点,在这里使用HtmlAgilityPack组件解析HTML网页,我们只需要把我们的博客园的账号在这里输入就可以很快的把我们博客园中的文章备份过来。

其核心代码如下:

///<summary>///根据用户导入cnblog数据///</summary>///<param name="userName"></param>///<returns></returns>publicstringImport(stringuserName,stringiszf,stringisshowhome,stringisshowmyhome)

{intblosNumber =0;javaScriptSerializer jss=newJavascriptSerializer();stringurl ="http://www.cnblogs.com/"+ userName +@"/mvc/blog/sidecolumn.aspx";

HtmlAgilityPack.HtmlWeb htmlweb=newHtmlAgilityPack.HtmlWeb();

HtmlAgilityPack.HtmlDocument document=newHtmlDocument();vardocment =htmlweb.Load(url);stringuserid =GetCnblogUserId(userName);varliS = docment.DocumentNode.SelectNodes("//*[@id='sidebar_categories']/div[1]/ul/li");foreach(variteminliS)

{vartXPath =item.XPath;varhref = item.SelectSingleNode(tXPath +"/a").Attributes["href"].Value;varblogtype =htmlweb.Load(href);//var entrylistItem = blogtype.DocumentNode.SelectNodes("//*[@id='mainContent']/div/div[2]/div[@class='entrylistItem']");varentrylistItem = blogtype.DocumentNode.SelectNodes("//div[@class='entrylistItem']");if(null== entrylistItem)//做兼容entrylistItem = blogtype.DocumentNode.SelectNodes("//div[@class='post post-list-item']");//if(null==entrylistItem)

{continue;

}foreach(vartypeiteminentrylistItem)

{vartypeitemXPath =typeitem.XPath;vartypeitemhrefObj = typeitem.SelectSingleNode(typeitemXPath +"

/div/a");if(null== typeitemhrefObj)//做兼容typeitemhrefObj = typeitem.SelectSingleNode(typeitemXPath +"/h2/a");vartypeitemhref = typeitemhrefObj.Attributes["href"].Value;if(IsAreBlog(typeitemhref))continue;//说明这篇文章已经备份过了的varbloghtml =htmlweb.Load(typeitemhref);varblogcontextobj = bloghtml.DocumentNode.SelectSingleNode("//*[@id='cnblogs_post_body']");//.InnerHtml;if(blogcontextobj ==null)continue;//有可能是加密文章varblogcontext =blogcontextobj.InnerHtml;varblogNameObj = bloghtml.DocumentNode.SelectSingleNode("//*[@id='Header1_HeaderTitle']");if(null==blogNameObj)

blogNameObj= bloghtml.DocumentNode.SelectSingleNode("//*[@id='lnkBlogTitle']");try{

blogName=blogNameObj.InnerText;

}catch(Exception)

{ }varblogtitle = bloghtml.DocumentNode.SelectSingleNode("//*[@id='cb_post_title_url']").InnerText;varblogurl = bloghtml.DocumentNode.SelectSingleNode("//*[@id='cb_post_title_url']").Attributes["href"].Value;varblogtypetagurl ="http://www.cnblogs.com/mvc/blog/CategoriesTags.aspx?blogApp="+ userName +"&blogId="+ userid +"&postId="+typeitemhref.Substring(typeitemhref.LastIndexOf('/') +1, typeitemhref.LastIndexOf('.') - typeitemhref.LastIndexOf('/') -1);varblogtag =Blogs.Common.Helper.MyHtmlHelper.GetRequest(blogtypetagurl);varjsonobj = jss.Deserialize<Dictionary<string,string>>(blogtag);if(null==jsonobj)continue;//如果没有 则返回 (这里只能去 数字.html 不能取那种自定义的url)vartagSplit = jsonobj["Tags"].Split(',');varblogtagid =newList<int>();for(inti =0; i < tagSplit.Length; i++)

{if(tagSplit[i].Length >=1&& tagSplit[i].LastIndexOf('<') >=1)

{varblogtagname = tagSplit[i].Substring(tagSplit[i].IndexOf('>') +1, tagSplit[i].LastIndexOf('<') - tagSplit[i].IndexOf('>') -1);

blogtagid.Add(this.GetTagId(blogtagname, userName));

}

}varcategoriesSplit = jsonobj["Categories"].Split(',');varblogtypeid =newList<int>();for(inti =0; i < categoriesSplit.Length; i++)

{if(categoriesSplit[i].Length >=1&& categoriesSplit[i].LastIndexOf('<') >=1)

{varblogtypename = categoriesSplit[i].Substring(categoriesSplit[i].IndexOf('>') +1, categoriesSplit[i].LastIndexOf('<') - categoriesSplit[i].IndexOf('>') -1);

blogtypeid.Add(this.GetTypeId(blogtypename, userName));

}

}varblogtimeobj = bloghtml.DocumentNode.SelectSingleNode("//*[@id='post-date']");varblogtime ="";if(null!=blogtimeobj)

blogtime=blogtimeobj.InnerText;

DateTime? createtime =null;varOutcreatetime =DateTime.Now;if(DateTime.TryParse(blogtime,outOutcreatetime))

createtime=Outcreatetime;

BlogsBLL blog=newBlogsBLL();varmyBlogTags =newBlogTagsBLL().GetList(t => blogtagid.Contains(t.Id), isAsNoTracking:false).ToList();//.ToList();varmyBlogTypes =newBLL.BlogTypesBLL().GetList(t => blogtypeid.Contains(t.Id), isAsNoTracking:false).ToList();//.ToList();try{varmodelMyBlogs =newModelDB.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();varnewtag =string.Empty;

modelMyBlogs.BlogTags.Where(t=>true).ToList().ForEach(t => newtag += t.TagName +"");varnewblogurl ="/"+ modelMyBlogs.BlogUsersset.UserName +"/"+ modelMyBlogs.Id +".html";

SearchResult search=newSearchResult()

{

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);varpostid = 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";

}

public string Import(string userName, string iszf, string isshowhome, string isshowmyhome)

PRivateintGetTagId(stringtagname,stringuserName)

{

BlogTagsBLL blogtag=newBlogTagsBLL();try{varblogtagmode = blogtag.GetList(t => t.TagName ==tagname);if(blogtagmode.Count() >=1)returnblogtagmode.FirstOrDefault().Id;else{

blogtag.Add(newModelDB.BlogTags()

{

TagName=tagname,

IsDel=false,

UsersId=GetUserId(userName)

});

blogtag.save();returnGetTagId(tagname, userName);

}

}catch(Exception ex)

{return-1;

}

}

privateintGetTypeId(stringtypename,stringuserName)

{

BlogTypesBLL blogtype=newBlogTypesBLL();varblogtagmode = blogtype.GetList(t => t.TypeName ==typename);if(blogtagmode.Count() >=1)returnblogtagmode.FirstOrDefault().Id;else{

blogtype.Add(newModelDB.BlogTypes()

{

TypeName=typename,

CreateTime=DateTime.Now,

IsDel=false,

UsersId=GetUserId(userName)

});

blogtype.save();returnGetTypeId(typename, userName);

}

}

privateintGetUserId(stringuserName)

{

BlogUsersBLL user=newBlogUsersBLL();varblogtagmode = user.GetList(t => t.UserName ==userName);if(blogtagmode.Count() >=1)returnblogtagmode.FirstOrDefault().Id;else{

user.Add(newModelDB.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;

}returnGetUserId(userName);

}

}

privateboolIsAreBlog(stringurl)

{

BLL.BlogsBLL blog=newBLL.BlogsBLL();varblogs = blog.GetList(t => t.BlogUrl ==url);returnblogs.Count() >=1;

}

privatestringGetCnblogUserId(stringurl)

{

HtmlAgilityPack.HtmlWeb htmlweb=newHtmlAgilityPack.HtmlWeb();vardocment = htmlweb.Load("http://www.cnblogs.com/"+url);varlist = docment.DocumentNode.SelectNodes("//link[@rel='stylesheet']");foreach(variteminlist)

{if(null!= item.Attributes && item.Attributes.Contains("href"))

{varhref = item.Attributes["href"].Value;

href= href.Substring(href.LastIndexOf("/") +1, href.IndexOf(".") - href.LastIndexOf("/") -1);intuserid = -1;if(int.TryParse(href,outuserid))returnuserid.ToString();

}

}return"";

}

publicstringtestJumonyParser(intBlogsId =1,intBlogUsersId =1,stringpostId ="4368417",stringblogApp ="zhaopei")

{boolisNext =true;inti =0;//List<BlogCommentSet> blogcommen = new List<BlogCommentSet>();BlogCommentBLL blogcommenbll =newBlogCommentBLL();while(isNext)

{

i++;varurl ="http://www.cnblogs.com/mvc/blog/GetComments.aspx?postId="+ postId +"&blogApp="+ blogApp +"&pageIndex="+i;varjumony =newJumonyParser();varhtmlSource =jumony.LoadDocument(url).InnerHtml();

JavaScriptSerializer _jsSerializer=newJavaScriptSerializer();

CnBlogComments comm= _jsSerializer.Deserialize<CnBlogComments>(htmlSource);varcommentsHtml =jumony.Parse(comm.commentsHtml);varpager = commentsHtml.Find("div.pager").FirstOrDefault();if(null!=pager)

{varNext = pager.Find("*").LastOrDefault().InnerText();if(Next !="Next >")

isNext=false;

}elseisNext=false;varlistComment = commentsHtml.Find("div.feedbackItem").ToList();foreach(variteminlistComment)

{varcommentDataNode = item.Find("div.feedbackListSubtitle span.comment_date").FirstOrDefault();//varcommentData =DateTime.Parse(commentDataNode.InnerText());varcommentUserNode = item.Find("div.feedbackListSubtitle a[target='_blank']").FirstOrDefault();varcommentUser =commentUserNode.InnerText();varContent = item.Find("div.blog_comment_body").FirstOrDefault().InnerText();

blogcommenbll.Add(newBlogCommentSet()

{

BlogsId=BlogsId,

CommentID= -1,

IsDel=false,

Content=Content,

CreateTime=commentData,

ReplyUserName=commentUser,

BlogUsersId=BlogUsersId,

IsInitial=true}

);

}

}try{

blogcommenbll.save(false);

}catch(Exception)

{ }return"ok";

}

在着比如说这个盘古分词,全文检索,效果如下

代码太多,我就截图算了...

当然开源博客系统中还有很多其他的东西,如果你感兴趣,或者你有什么好的主意,就加入我们的队伍中来吧。

5.机会来了,阿里云两年免费的主机!

虚拟空间申请地址:http://wanwang.aliyun.com/hosting/free/

虽说免费的东西都不怎么好,流量空间各方面都有限制,当时用来做个人博客已经够用了。。。

如果您对本篇文章感兴趣,那就麻烦您点个赞,您的鼓励将是我的动力。 当然您还可以加入QQ群:讨论。

如果您有更好的处理方式,希望不要吝啬赐教。

本文链接:http://www.cnblogs.com/zhaopei/p/4744846.html

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有