前言
這次開發的博客主要功能或特點:
第一:可以兼容各終端,特別是手機端。
第二:到時會用到大量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/
關於免費的企業有申請,這里就不做過多介紹了,申請后綁定自己的域名就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; } } }
用法:
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/