學習 《一步步搭建本身的博客》 初版 邊理解邊記錄

《一步步搭建本身的博客》 源碼地址 :http://www.cnblogs.com/zhaopei/p/4737958.html   若是你也在學習,請私密或者留言,歡迎一切學習總結,分享!html

 

首先我從導數據開始  -------  一切的源頭 

AdminHelperController  index  view中的  :git

   $.post("http://" + location.host + "/" + $("#iszf").attr("checked") + "/AdminHelper/butOk/" + $("#user").val(),github

 標識  post的地址 : Request URL:http://localhost:49532/checked/AdminHelper/butOk/zhaopei   //這裏的checked參數 ?ajax

 注意 :sql

location.host 包含端口,好比是 127.0.0.1:81。若是端口是 80,那麼就沒有端口,就是 127.0.0.1。數據庫

location.hostname 不包含端口,好比是 127.0.0.1。緩存

 

根據上面的代碼 : 發現 post執行的 Controller 與 Action 分別是 : AdminHelper/butOk  對應的 路由應該是 :session

//第四種狀況:以 域名 + 用戶名
            routes.MapRoute(
             name: "UserIndex",
             url: "{name}/{controller}/{action}/{id}",
             defaults: new { action = "UserBlogList", controller = "UserBlog", id = UrlParameter.Optional }
          );

 然而 butOk 內部調用的是 :Import方法 ,這個方法比較複雜待我好好研讀! mvc

進入 Import 方法後發現 博主拼接了  url  這裏以我本身的博客爲例 :http://www.cnblogs.com/izhiniao/mvc/blog/sidecolumn.aspx 感興趣的能夠單機進去看看 ,能夠幫助理解! 然而Import中結尾包含 下面這段代碼 ,我想應該是把數據 存如數據庫ide

var modelMyBlogs = new ModelDB.Blogs()
                        {
                            BlogContent = blogcontext,
                            BlogCreateTime = blogtime,
                            BlogTitle = blogtitle,
                            BlogUrl = blogurl,
                            IsDel = false,
                            BlogTags = myBlogTags,
                            BlogTypes = myBlogTypes,
                            UsersId = GetUserId(userName),
                            BlogForUrl = blogurl,
                            IsForwarding = iszf == "checked"
                        };
                        blog.Add(modelMyBlogs);
                        blog.save();

 那麼 下面 的這段代碼 背後隱藏寫什麼呢 ? 我先來個猜測 , 後續聯繫博主待證明......? 

 blog.Add(modelMyBlogs);

  

         猜測 :F12 過去  

           

         這裏我標出的「須要注意」  主要是Model1Container 是數據庫的網關類 ,crud都是統一入口, 繼承自 DbContext 這裏有篇博客介紹了 ObjectContext

         DbContext 和ObjectContext二者的區別 : ObjectContext是一種模型優先的開發模式,DbContext是代碼優先的開發模式 , 還能夠相互轉換!

 最後 save()是這樣構造的 :這裏才進行數據庫操做(順便提提 上面的 add(model)是生存sql語句

 public int save()
        {
            return db.SaveChanges();
        }

  這個類暫時解說到這裏,對HtmlAgilityPack的理解 自行找資料(不事後期我會開博客寫寫HtmlAgilityPack) , 其實國人開發的  Jumony 更好用 

 

 

 

2015-09-06  今天看看數據庫 , 把數據庫關係給大概理清晰

有三個暫時未知幹嗎,別的根據數據很快就能看出來,這裏我直接上圖

 

 

 

既然前面咱們把數據給寫入到數據庫了,那麼接下來我就去看看 博主是怎麼把數據給顯示出來的 ...

那麼咱們首先來從 Blogs.Web 開始 往數據方向一步一步去推導 ...

HomeController 下的 Index()  就是 博客view對應的action 方法 , 這個方法 裏面第一行代碼是  BLL.BlogsBLL blog = new BLL.BlogsBLL(); 建立了一個邏輯Blogs類,

具體怎麼處理 , 背後隱藏了些什麼 (這是三層中的邏輯層,待我稍後細細分析) , 我先看看 下面的代碼 :

 var bloglist = blog.GetList(t => t.Id < 50)//我本人對Lamda表達式不熟練,到時候我單獨寫一篇關於lamda表達式的文章,在對這裏作個解析
                .Select(t => new
                {
                    Id = t.Id,
                    BlogTitle = t.BlogTitle,
                    BlogContent = t.BlogContent,
                    UserName = t.Users.UserName,
                    UserNickname = t.Users.UserNickname,
                    BlogCreateTime = t.BlogCreateTime
                })
                .ToList()
                .Select(t => new ModelDB.Blogs()
                {
                    Id = t.Id,
                    BlogTitle = t.BlogTitle,
                    BlogContent = MyHtmlHelper.GetHtmlText(t.BlogContent),
                    BlogCreateTime = t.BlogCreateTime,
                    Users = new ModelDB.BlogUsers()
                    {
                        UserName = t.UserName,
                        UserNickname = t.UserNickname
                    },
                }).ToList();

  

 這裏的  bloglist 就是博客文章清單 ,而後把這個清單放入 數據字典中 供view 強類型解析

  Dictionary<string, object> dic = new Dictionary<string, object>();

  這裏的  CacheData.GetUserInfo() 是得到用戶信息,博主這裏用的緩存(本人水平有限,暫時尚未設計到緩存,之後在細說緩存)

對於view中的代碼我就解析幾個有意思的地方

     <a href="~/@(blog.Users.UserName)/@(blog.Id).html">@blog.BlogTitle</a>

  這個 條 語句生成的html代碼是 :  <a href="/zhaopei/12.html">一步步開發本身的博客 .NET版(三、註冊登陸功能)</a>

 

因此它對應的 路由大概是  :

   //第一種狀況:以 域名 + 用戶名 + id + html 後綴組合(默認控制器)
            routes.MapRoute(
               name: "UserPage",
               url: "{name}/{id}.html/{controller}/{action}",
               defaults: new { action = "UserBlog", controller = "UserBlog", name = "zhaopei", id = 1 }
           );

對於獲取全部博客的用戶信息 作的緩存 我這裏分析下   :

 /// <summary>
        /// 獲取全部博客的用戶信息
        /// </summary>
        /// <param name="newCache">是否從新獲取</param>
        /// <returns></returns>
        public static List<BlogUsers> GetUserInfo(bool newCache = false)
        {
            if (null == HttpRuntime.Cache["UserInfo"] || newCache)
            {
                BLL.BlogUsersBLL user = new BlogUsersBLL();
                HttpRuntime.Cache["UserInfo"] = user.GetList(t => true).ToList();
            }
            return (List<BlogUsers>)HttpRuntime.Cache["UserInfo"];
        }

  根據代碼能夠看出 首先判斷緩存是否存在和是否重新得到緩存 , 若是不爲空 咱們就返回緩存-----那麼問題又來了,咱們第一次的緩存從那裏得到呢 ?

 這裏只能待 博主來回答了  ,我暫時不得而知 。。。。(這個問題待我今天重新看 , 秒懂 ,昨天這麼就沒看出來呢 )

 當 null == HttpRuntime.Cache["UserInfo"] 時  就獲取啊 (這不就是第一次獲取嗎 , 本身SB ^_^ ) HttpRuntime.Cache["UserInfo"] = user.GetList(t => true).ToList();

 下面這段代碼主要是 實現內容過長而隱藏 ...

   @Html.Raw(blog.BlogContent.Substring(0, con_length))

 

2.下面就是用戶單擊 博客標題後進入博客內容的實現 UserBlogController /UserBlog:

 public ActionResult UserBlog(string name, int id)
        {
            BLL.BlogsBLL blog = new BLL.BlogsBLL();
            var blogobj = blog.GetList(t => t.Id == id && t.Users.UserName == name).FirstOrDefault();

            //這裏看 能不能只查詢一次
            var blogNext = blog.GetList(t => t.Id > id && t.Users.UserName == name).OrderBy(t => t.Id).FirstOrDefault();
            var blogLast = blog.GetList(t => t.Id < id && t.Users.UserName == name).OrderBy(t => t.Id).FirstOrDefault();

            var commentList = blogobj.BlogComment.ToList();

            Dictionary<string, object> dic = new Dictionary<string, object>();
            dic.Add("blog", blogobj);
            dic.Add("blogNext", blogNext);
            dic.Add("blogLast", blogLast);
            dic.Add("commentList", commentList);//對應的評論
            dic.Add("contentBlogType", blogobj.BlogTypes.ToList());
            dic.Add("contentBlogTag", blogobj.BlogTags.ToList());

            SetDic(dic, name);
            return View(dic);
        }

  看到這段代碼我就理解了,就不須要進行詳細的講解,若是你不懂,能夠在下面進行留言,寫明狀況我有時間會回覆你!

  弄到這裏我原本想看看博主的這個博客系統 的資源是怎麼放置的 , 初版發現 圖片連接都是直接調用 博客園的 連接

對於標籤問題(這裏只截了部分代碼)

 <a href="~/@(blogName)/GetTagBlogs/@(item.Id).html" >

 發現匹配的 路由是 : 

 //第二種狀況:以 域名 + 用戶名 + action  + id + html 後綴組合
            routes.MapRoute(
             name: "UserTagOrType",
             url: "{name}/{action}/{id}.html/{controller}",
             defaults: new { action = "UserBlogList", controller = "UserBlog" }
          );

  

 今天就解讀到這裏 , 下次解讀異常處理!

 

 

如今開始繼續讀代碼 : 這裏先把昨天的遺留的問題給提下 , 已經解決 , 樓下的 遊戲世界 也問了 , 因爲博主時間有限 , 我就本身在認真的找了下 , 秒懂 , 上面的紅體部分給出解析

那麼接下來我就 研讀下異常處理吧 , 由於我沒本身搭建過項目 , 因此不懂, 就從博主的開始 ,至於他的處理方式好很差,我在文章中不作什麼解析(我本身沒這能力去評價,不過你以爲你的方法好,能夠指點下我,小弟在這謝謝您了

 

        /// 全局未處理異常捕獲
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Application_Error(object sender, EventArgs e)
        {
            #region 異常註釋
            Exception ex = Server.GetLastError().GetBaseException();
            ErrLog.ErrLogSave(ex);
            string strErr = ErrLog.GetExceptionInfo(ex);
            //處理完及時清理異常 
            Server.ClearError();
            #endregion

            //Application_Error 裏不能訪問和操做 session爲null 20150205            
            //HttpContext.Current.Session
            //Context.Session

            #region 跳轉至出錯頁面
            //跳轉至出錯頁面 
            //Server.Transfer("~/html/500.aspx");
            //注意:若是是ajax的請求 是不能 Response.Redirect 重定向的
            string sheader = Context.Request.Headers["X-Requested-With"];
            bool isAjax = (sheader != null && sheader == "XMLHttpRequest") ? true : false;
            if (isAjax)
            {
                HttpContext.Current.Response.Write(
              new CustomModel.JSData()
              {
                  State = CustomModel.EnumState.異常或Session超時,
                  JSurl = "/html/500.html?err=" + Microsoft.JScript.GlobalObject.escape(strErr)//System.Web.HttpUtility.UrlEncode(strErr)
              }.ToJson());
            }
            else
                Response.Redirect("~/html/500.html?err=" + Microsoft.JScript.GlobalObject.escape(strErr));
            #endregion
        }

按F12 走了個大致流程我以爲有必要專門寫一篇 關於 異常在這個博客系統中的應用 !

 那麼本篇文章到此結束 , 若是你感興趣請繼續閱讀下篇 http://www.cnblogs.com/izhiniao/p/4790149.html

 

     本文以學習、研究和分享爲主,版權歸做者和博客園共有,未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接 http://www.cnblogs.com/izhiniao,不然保留追究法律責任的權利 

相關文章
相關標籤/搜索