![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CO2IDO5QDMwITMtEjN0QDMyEDMxQTM5ATNxAjMtYjNygDMy8CX5ATNxAjMvwlN2IDOwIzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
今天主要來分析下注冊和登入。關于這兩個功能的實作我相信大家都有自己的經驗,說容易可以做的很容易 說複雜可以做的很複雜。
其實說白了,注冊就是往資料庫裡面插入一條資料,登入就是查詢資料庫裡面是否存在這條資料。當然,還可以有自己的規則驗證。如:使用者名不能重複,密碼不能為空...
當然還有就是,為了防止别人惡意注冊 可以加個郵箱驗證。那我們用什麼郵箱發郵件通知呢, 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/
關于免費的企業有申請,這裡就不做過多介紹了,申請後綁定自己的域名就ok了。
接下來,開始分析我的注冊和登入功能的實作。
擷取激活碼和激活
這裡首先說下擷取激活碼和激活處理。首先什麼是激活碼? 這裡的激活碼主要是用來驗證。第一、證明郵箱使用者确實存在,這樣可以有效防止惡意注冊。第二、隻有郵箱使用者才可以做使用者資訊修改處理,如 密碼修改。因為需要用到激活碼的地方“可能”比較多,所有 我們把 這兩個方法 分離出來。
擷取激活碼
擷取激活碼,其實也就是 先生成一個随機數,先儲存到Session,然後通過郵件發送到注冊郵箱。當然 這裡有個重要的地方,那就郵件的發送幫助類。
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();//發送
效果圖:
激活
激活,複制你郵件收到的激活碼 和 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版(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