天天看點

一步步開發自己的部落格 .NET版(3、注冊登入功能)

一步步開發自己的部落格 .NET版(3、注冊登入功能)

今天主要來分析下注冊和登入。關于這兩個功能的實作我相信大家都有自己的經驗,說容易可以做的很容易 說複雜可以做的很複雜。

其實說白了,注冊就是往資料庫裡面插入一條資料,登入就是查詢資料庫裡面是否存在這條資料。當然,還可以有自己的規則驗證。如:使用者名不能重複,密碼不能為空...

當然還有就是,為了防止别人惡意注冊 可以加個郵箱驗證。那我們用什麼郵箱發郵件通知呢, 163 Mail ? QQ Mail ?, 那我們做站長的 也忒掉面子了吧。企業也得來也和你域名相關的企業郵箱啊,是不 (*^__^*)

前言 

這次開發的部落客要功能或特點:

    第一:可以相容各終端,特别是手機端。

    第二:到時會用到大量html5,炫啊。

    第三:導入部落格園的精華文章,并做分類。(不要封我)

    第四:做個插件,任何網站上的技術文章都可以轉發收藏 到本部落格。

是以打算寫個系類:《一步步搭建自己的部落格》

  • 一步步開發自己的部落格  .NET版(1、頁面布局、blog遷移、資料加載)
  • 一步步開發自己的部落格  .NET版(2、評論功能)
  • 一步步開發自己的部落格  .NET版(3、注冊登入功能)
  • 一步步開發自己的部落格  .NET版(4、文章釋出功能)
  • 一步步開發自己的部落格  .NET版(5、搜尋功能)
  • 一步步開發自己的部落格  .NET版(6、手機端的相容)

    示範位址:http://blog.haojima.net/      群内共享源碼:469075305 

    今天主要來分析下注冊和登入。關于這兩個功能的實作我相信大家都有自己的經驗,說容易可以做的很容易 說複雜可以做的很複雜。

    其實說白了,注冊就是往資料庫裡面插入一條資料,登入就是查詢資料庫裡面是否存在這條資料。當然,還可以有自己的規則驗證。如:使用者名不能重複,密碼不能為空...

    為了防止别人惡意注冊 可以加個郵箱驗證。那我們用什麼郵箱發郵件通知呢, 163 Mail ? QQ Mail ?, 那我們做站長的 也忒掉面子了吧。起碼也得來個和你域名相關的企業郵箱啊,是不 (*^__^*)

    在這裡我給大家分享一個免費的企業郵箱。 http://wanwang.aliyun.com/promotion/free-times/

一步步開發自己的部落格 .NET版(3、注冊登入功能)
一步步開發自己的部落格 .NET版(3、注冊登入功能)
一步步開發自己的部落格 .NET版(3、注冊登入功能)

      關于免費的企業有申請,這裡就不做過多介紹了,申請後綁定自己的域名就ok了。

      接下來,開始分析我的注冊和登入功能的實作。

擷取激活碼和激活

     這裡首先說下擷取激活碼和激活處理。首先什麼是激活碼? 這裡的激活碼主要是用來驗證。第一、證明郵箱使用者确實存在,這樣可以有效防止惡意注冊。第二、隻有郵箱使用者才可以做使用者資訊修改處理,如 密碼修改。因為需要用到激活碼的地方“可能”比較多,所有   我們把 這兩個方法 分離出來。    

擷取激活碼

    擷取激活碼,其實也就是 先生成一個随機數,先儲存到Session,然後通過郵件發送到注冊郵箱。當然 這裡有個重要的地方,那就郵件的發送幫助類。

一步步開發自己的部落格 .NET版(3、注冊登入功能)
一步步開發自己的部落格 .NET版(3、注冊登入功能)
public class EmailHelper
    {

        #region Eail 屬性

        private string _mailFrom = "[email protected]";
        /// <summary>
        /// 發送者
        /// </summary>
        public string mailFrom { get { return _mailFrom; } set { _mailFrom = value; } }

        /// <summary>
        /// 收件人
        /// </summary>
        public string[] mailToArray { get; set; }

        /// <summary>
        /// 抄送
        /// </summary>
        public string[] mailCcArray { get; set; }

        /// <summary>
        /// 标題
        /// </summary>
        public string mailSubject { get; set; }

        /// <summary>
        /// 正文
        /// </summary>
        public string mailBody { get; set; }

        /// <summary>
        /// 發件人密碼
        /// </summary>
        public string mailPwd { get; set; }

        private string _host = "smtp.haojima.net";
        /// <summary>
        /// SMTP郵件伺服器
        /// </summary>
        public string host { get { return _host; } set { _host = value; } }

        private bool _isbodyHtml = true;
        /// <summary>
        /// 正文是否是html格式
        /// </summary>
        public bool isbodyHtml { get { return _isbodyHtml; } set { _isbodyHtml = value; } }

        private string _nickname = "嗨-部落格 系統通知";
        /// <summary>
        /// 發送者昵稱
        /// </summary>
        public string nickname
        {
            get { return _nickname; }
            set
            {
                _nickname = value;
            }
        }

        /// <summary>
        /// 附件
        /// </summary>
        public string[] attachmentsPath { get; set; }

        //優先級别
        private MailPriority _Priority = MailPriority.Normal;
        /// <summary>
        /// 優先級别  預設正常優先級
        /// </summary>
        public MailPriority Priority
        {
            get
            {
                return _Priority;
            }
            set
            {
                _Priority = value;
            }
        }
        #endregion

        public bool Send()
        {
            //使用指定的郵件位址初始化MailAddress執行個體
            MailAddress maddr = new MailAddress(mailFrom, nickname);
            //初始化MailMessage執行個體
            MailMessage myMail = new MailMessage();

            //向收件人位址集合添加郵件位址
            if (mailToArray != null)
            {
                for (int i = 0; i < mailToArray.Length; i++)
                {
                    myMail.To.Add(mailToArray[i].ToString());
                }
            }

            //向抄送收件人位址集合添加郵件位址
            if (mailCcArray != null)
            {
                for (int i = 0; i < mailCcArray.Length; i++)
                {
                    myMail.CC.Add(mailCcArray[i].ToString());
                }
            }
            //發件人位址
            myMail.From = maddr;

            //電子郵件的标題
            myMail.Subject = mailSubject;

            //電子郵件的主題内容使用的編碼
            myMail.SubjectEncoding = Encoding.UTF8;

            //電子郵件正文
            myMail.Body = mailBody;

            //電子郵件正文的編碼
            myMail.BodyEncoding = Encoding.Default;

            //郵件優先級
            myMail.Priority = Priority;

            myMail.IsBodyHtml = isbodyHtml;

            //在有附件的情況下添加附件
            try
            {
                if (attachmentsPath != null && attachmentsPath.Length > 0)
                {
                    Attachment attachFile = null;
                    foreach (string path in attachmentsPath)
                    {
                        attachFile = new Attachment(path);
                        myMail.Attachments.Add(attachFile);
                    }
                }
            }
            catch (Exception err)
            {
                throw new Exception("在添加附件時有錯誤:" + err);
            }

            SmtpClient smtp = new SmtpClient();
            //指定發件人的郵件位址和密碼以驗證發件人身份
            smtp.Credentials = new System.Net.NetworkCredential(mailFrom, mailPwd);//115                 //設定SMTP郵件伺服器
            smtp.Host = host;
            // smtp.EnableSsl = true;
            //smtp.Port = 587;
            try
            {
                //将郵件發送到SMTP郵件伺服器
                smtp.Send(myMail);
                return true;

            }
            catch (System.Net.Mail.SmtpException ex)
            {
                return false;
            }

        }
    }      

View Code 

    用法:

EmailHelper email = new EmailHelper()
            {
                mailPwd = 發送者密碼,
                host = 郵件伺服器,
                mailFrom = 發送者郵箱,
                mailSubject = 郵件标題,
                mailBody = 郵件正文,
                mailToArray = new string[] { 發送給}
            };
 email.Send();//發送      

效果圖:

一步步開發自己的部落格 .NET版(3、注冊登入功能)

激活

      激活,複制你郵件收到的激活碼 和 session 裡面儲存的資料數  比較。如果 相等 則表示驗證成功。然後,該注冊 的注冊 、該改密碼的改密碼。(驗證成功後 可以發個郵件告知 注冊成功 并發送注冊資訊 以免 注冊使用者 忘記 登出資訊)

資料驗證

      在注冊和登入的過程中,有多處地方需要驗證。如:使用者名密碼 必填非空 郵箱格式比較正确。然而,在MVC裡的特性驗證用起來 那個爽歪歪的。

      這裡來說說我的用法(初次使用)。

      特性驗證: Required 非空 [Required(ErrorMessage = "使用者名不能為空")] public string UserName { get; set; }   

      我們直接把特性辨別在屬性的上面就可以了,如果在資料儲存的時候 驗證不通過 則會抛出自定義的 異常資訊。不過這裡有個問題,我們的實體類都是通過 tt 檔案自動生成的。我們加上去的特性 在下次儲存 tt 檔案的時候 又會清空。不過微軟的猿們 早就替我們想好了。tt 生成的是部分類。那麼 我們也就可以在外部生成 一個部分類來 加特性 然後在編譯的時候 自動合并。 

     這裡是背景驗證。當然 我們不能隻僅僅驗證背景,要是能直接在前台就能 屏蔽 驗證不通過的請求 也能減輕伺服器的 負擔。接下來要說的 就是 “爽歪歪”的。我們在背景加的特性驗證,可以直接在前台也做驗證。好神奇,這是怎麼實作的呢?其實我們看看生成的html代碼 就大概會猜到了。

     首先 我們在View 的 Razor視圖 使用的強類型的“聲明”。 @model BlogUsersSet 

     然後 在View的使用  @Html.TextBoxFor(t => t.UserName)    可以直接使用拉姆達表達式 爽啊。

     我們可以看到前台生成的html代碼 

<input class="txt_username" data-val="true" data-val-required="使用者名不能為空" id="UserName" name="UserName" type="text" value="">       

     看到這裡 我們是不是已經明白了點什麼呢? 驗證資訊 直接帶到了 标簽裡面。當然   這僅僅隻是生成在了html标簽裡面。其實  我們現在還不能完成前台的驗證。我們要真的能自動在前台驗證的話   需要引入一些 微軟 提供的js檔案。  jquery.validate.js jquery.validate.unobtrusive.js  看名字就知道   引用之前 還需引用jquery 檔案。

    在此 前台驗證 效果已經ok了。那僅僅 驗證了 也還是不夠的。起碼也得有個 提示資訊吧。 @Html.ValidationMessageFor(t => t.UserName) 自動輸出 驗證不通過的 資訊提示。

    總結下使用MVC中的 特性來驗證:

    第一、需要在背景的模型類 裡面加上特性:如 [Required(ErrorMessage = "使用者名不能為空")] public string UserName { get; set; }  (這裡僅僅完成了背景驗證)

    第二、需要在前台引入兩個js檔案 jquery.validate.js jquery.validate.unobtrusive.js (這裡完成了前台驗證)

    第三、在View檔案中 生成控件 和驗證提示資訊。 @Html.TextBoxFor(t => t.UserName)//生成控件 @Html.ValidationMessageFor(t => t.UserName)//驗證提示消息 

    效果圖:

一步步開發自己的部落格 .NET版(3、注冊登入功能)

    示範位址:http://blog.haojima.net/UserManage/Regis   

    注冊和登入中最重要的 擷取激活碼、激活和資料驗證都已經分析完了,那麼下面就簡單的說下注冊、登入和重置密碼吧。

注冊

     首先關于注冊資訊包含:使用者名、密碼、昵稱、郵箱。

     使用者名:必填非空非重複,主要用來驗證登入 和url中的連結。如:http://blog.haojima.net/zhaopei/1.html   中的 zhaopei。

     密碼:必填非空,主要用來驗證登入。

     昵稱:非必填,主要用來友好顯示在你的個人首頁、友善别人記住你。如果是空,則用 使用者名替代。

     郵箱:必填非空非重複,主要用來 注冊的時候驗證激活、重置密碼的時候驗證激活 和 評論郵件通知、站内消息通知(評論郵件通知 站内消息通知 功能暫未完成)   

     效果圖:

一步步開發自己的部落格 .NET版(3、注冊登入功能)

登入

     1.如果登入成功。儲存登入使用者資訊到session。

     2.如果勾選了“自動登入” 則儲存 使用者資訊到 用戶端 cookie,下次取session 時如果 session 為null  在看cookie是否有 有效使用者資訊。

     在這裡 我還在資料庫裡面 加了個 “IsLock” 是否被鎖定。如果 檢測到 釋出惡意  或違法内容 可以用來 鎖定使用者。使之不能登入。

一步步開發自己的部落格 .NET版(3、注冊登入功能)

重置密碼

      重置密碼,也就是修改密碼。

      需要用到的字段:郵箱、新密碼

      發送驗證碼到郵箱,然後判斷輸入的驗證碼是否正确。如果正确 則把密碼修改成新密碼。

      效果圖:

一步步開發自己的部落格 .NET版(3、注冊登入功能)

總結

        這裡主要是分析介紹了下 部落格使用者的 注冊、登入和密碼重置。其主要的共用子產品功能有 擷取激活碼、觸發激活 和 資料驗證。

        注冊流程:填寫注冊資訊-> 驗證資訊-> 郵件驗證-> 注冊成功

        登入流程:填寫登入資訊-> 資料庫查詢-> 

                      1.鎖定-> 發送郵箱激活碼-> 激活 ->登入成功

                      2.未鎖定->登入成功

        示範位址:http://blog.haojima.net/UserManage/Regis  (界面醜是醜了點,後期再美化)

        如果您對本篇文章感興趣,那就麻煩您點個贊,您的鼓勵将是我的動力。 當然您還可以加入QQ群:

一步步開發自己的部落格 .NET版(3、注冊登入功能)

讨論。

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

        一步步開發自己的部落格 .NET版系列:http://www.cnblogs.com/zhaopei/tag/Hi-Blogs/

        本文連結:http://www.cnblogs.com/zhaopei/p/4770340.html

        開源位址:http://git.oschina.net/zhaopeiym/Hi-Blogs

  • 學習本是一個不斷抄襲、模仿、練習、創新的過程。
  • 雖然,園中已有本人無法超越的同主題博文,為什麼還是要寫。
  • 對于自己,博文隻是總結。在總結的過程發現問題,解決問題。
  • 對于他人,在此過程如果還能附帶幫助他人,那就再好不過了。
  • 由于部落客能力有限,文中可能存在描述不正确,歡迎指正、補充!
  • 感謝您的閱讀。如果文章對您有用,那麼請輕輕點個贊,以資鼓勵。
  • 工控物聯Q群:995475200

繼續閱讀