一步步開發自己的博客 .NET版(3、注冊登錄功能)


前言 

這次開發的博客主要功能或特點:
    第一:可以兼容各終端,特別是手機端。
    第二:到時會用到大量html5,炫啊。
    第三:導入博客園的精華文章,並做分類。(不要封我)
    第四:做個插件,任何網站上的技術文章都可以轉發收藏 到本博客。

所以打算寫個系類:《一步步搭建自己的博客

 

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

 

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

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

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

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

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

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

獲取激活碼和激活

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

獲取激活碼

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

  public class EmailHelper
    {

        #region Eail 屬性

        private string _mailFrom = "system@haojima.net";
        /// <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();//發送

效果圖:

激活

      激活,復制你郵件收到的激活碼 和 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)//驗證提示消息 

    效果圖:   

    演示地址:http://blog.haojima.net/UserManage/Regis   

    注冊和登錄中最重要的 獲取激活碼、激活和數據驗證都已經分析完了,那么下面就簡單的說下注冊、登錄和重置密碼吧。

注冊

     首先關於注冊信息包含:用戶名、密碼、昵稱、郵箱。

     用戶名:必填非空非重復,主要用來驗證登錄 和url中的鏈接。如:http://blog.haojima.net/zhaopei/1.html   中的 zhaopei。

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

     昵稱:非必填,主要用來友好顯示在你的個人主頁、方便別人記住你。如果是空,則用 用戶名替代。

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

     效果圖:

登錄

     1.如果登錄成功。保存登錄用戶信息到session。

     2.如果勾選了“自動登錄” 則保存 用戶信息到 客戶端 cookie,下次取session 時如果 session 為null  在看cookie是否有 有效用戶信息。

     在這里 我還在數據庫里面 加了個 “IsLock” 是否被鎖定。如果 檢測到 發布惡意  或違法內容 可以用來 鎖定用戶。使之不能登錄。

     效果圖:

重置密碼

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

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

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

      效果圖:

總結

        這里主要是分析介紹了下 博客用戶的 注冊、登錄和密碼重置。其主要的共用模塊功能有 獲取激活碼、觸發激活 和 數據驗證。

        注冊流程:填寫注冊信息-> 驗證信息-> 郵件驗證-> 注冊成功

        登錄流程:填寫登錄信息-> 數據庫查詢-> 

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

                      2.未鎖定->登錄成功

        演示地址:http://blog.haojima.net/UserManage/Regis  (界面丑是丑了點,后期再美化)

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

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

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

        本文鏈接:http://www.cnblogs.com/zhaopei/p/4770340.html

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM