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

2023-10-28 12:20
文章标签 是否 博客 曾几何时

本文主要是介绍曾几何时,你是否也曾有一个博客梦?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.net MVC4.0+EF6.0+经典的简单三层

 

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

 4.在这个项目中你能学到什么?

博客系统的中的亮点,在这里使用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";}
public string Import(string userName, string iszf, string isshowhome, string isshowmyhome)
 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;}elseisNext = 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";}

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

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

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

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

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

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

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

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

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

转载于:https://www.cnblogs.com/fenglingyi/p/4783018.html

这篇关于曾几何时,你是否也曾有一个博客梦?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293179

相关文章

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

linux 判断某个命令是否安装

linux 判断某个命令是否安装 if ! [ -x "$(command -v git)" ]; thenecho 'Error: git is not installed.' >&2exit 1fi

搜狗浏览器打开CSDN博客排版错乱问题解决

之前发生过几次,不知道什么原因。 今天一直用着好好的,打开一个csdn连接,显示404,博文被删除了,于是就用百度快照打开试试,百度快照打开显示的排版很乱也没找到有用信息。 后面再浏览CSDN博客就排版错乱,显示一个大大二维码图片。 尝试删除IE缓存无效,使用谷歌浏览是好的。 基本锁定就是搜狗缓存导致的,于是找如何删除搜狗缓存   清除后恢复正常

如何判断一个数组中是否包含一个字符或字符串

第一种方法:遍历数组 String[] arr1 = {"1","2","3","4","6","7"}; for (int i = 0; i < arr1.length; i++) { if("5".equals(arr1[i])) { System.out.println("包含"); }else { System.out.println("不包含"); } } 第二种方法:先把数组

828华为云征文|基于华为云Flexus云服务器X实例部搭建Halo博客平台

华为云征文|基于华为云Flexus云服务器X实例部搭建Halo博客平台 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Halo介绍2.1 Halo 简介2.2 Halo 特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、购买华为云Flexus云服务器X实例4.

postgres数据库中如何看查询是否走索引,以及在什么情况下走索引

在 PostgreSQL 中,可以通过 EXPLAIN 或 EXPLAIN ANALYZE 查看查询计划,以判断查询是否使用了索引。除此之外,了解索引的使用条件对于优化查询性能也很重要。 1. 如何查看查询是否使用索引 使用 EXPLAIN 查看查询计划 EXPLAIN 显示 PostgreSQL 如何执行查询,包括是否使用索引。 EXPLAIN SELECT * FROM users WH

缓存的常见问题 以及解决博客文章

1.jedispool 连 redis 高并发卡死  (子非鱼yy) https://blog.csdn.net/ztx114/article/details/78291734 2. Redis安装及主从配置 https://blog.csdn.net/ztx114/article/details/78320193 3.Spring中使用RedisTemplate操作Redis(sprin

模拟退火判断一个圆是否可以放在一个多边形内

/*给定n个点的一个多边形,一个圆的半径,判断圆是否可以放在多边形里*//* ***********************************************Author :rabbitCreated Time :2014/7/3 22:46:38File Name :2.cpp**********************************************