會員系統中需要驗證用戶的郵箱是否真實存在

来源:http://www.cnblogs.com/insus/archive/2016/10/26/5996385.html
-Advertisement-
Play Games

在開髮網站時,我們需要對用戶註冊的郵箱進行核對與驗證,用戶填寫的郵箱是否有效郵箱。好吧,我們先從資料庫入手,修改用戶表讓用戶有填寫email的欄位,添加了2個欄位: ALTER TABLE [dbo].[Users] ADD [Email] VARCHAR(100) NULL, [IsVerify] ...


在開髮網站時,我們需要對用戶註冊的郵箱進行核對與驗證,用戶填寫的郵箱是否有效郵箱。

好吧,我們先從資料庫入手,修改用戶表讓用戶有填寫email的欄位,添加了2個欄位:

 

ALTER TABLE [dbo].[Users]
ADD [Email] VARCHAR(100) NULL, 
[IsVerify] BIT NOT NULL DEFAULT(0)


 SELECT * FROM [dbo].[Users]
Source Code


由於你需要做2個功能,一個是要求用戶驗證郵箱有效性,也有可以以郵箱來讓用戶修改用戶密碼。因此需要創建一個表來存儲這2個類型的數據:


 

CREATE TABLE [dbo].[RequestActionType]
(
    [Type] NVARCHAR(2) NOT NULL PRIMARY KEY,
    [Description] NVARCHAR(30) NULL
)
GO
INSERT INTO [dbo].[RequestActionType] ([Type],[Description])
VALUES ('V',N'驗證郵箱是否有效。'),
('C',N'用戶修改密碼')
Source Code

 

接下來,你還需要創建另外一張表,是記用戶請求的事件,記錄用戶的一些信息,如帳號,郵箱,鏈接有時效性等:

 

CREATE TABLE [dbo].[UserRequestAction](
    [Type] NVARCHAR(2) NOT NULL FOREIGN KEY REFERENCES [dbo].[RequestActionType] ([Type]),
    [Token] [uniqueidentifier] NOT NULL DEFAULT(NEWID()),
    [Account] [nvarchar](30) NOT NULL,
    [Email] [nvarchar](150) NOT NULL,
    [Expire] [datetime] NOT NULL DEFAULT (DATEADD(day,(1),CURRENT_TIMESTAMP)),
)

GO
Source Code

 


當用戶更改郵箱成功時,需要同進對[IsVerify] 更改為false。因此你需要對最開始的表寫一個觸發器:


 

CREATE TRIGGER [dbo].[tri_Users_Update] 
ON [dbo].[Users]
FOR UPDATE
AS
DECLARE @U_nbr NVARCHAR(20),@IsVerify BIT
DECLARE @old_email VARCHAR(100),@new_email VARCHAR(100)

SELECT @new_email = [Email] FROM INSERTED
SELECT @U_nbr = [U_nbr],@old_email = [Email],@IsVerify = [IsVerify] FROM DELETED

IF @IsVerify = 1 AND (lEN(ISNULL(@new_email,'')) = 0 OR  @new_email <> @old_email)
    UPDATE [dbo].[Users] SET [IsVerify] = 0 WHERE [U_nbr] = @U_nbr
GO
Source Code

 
當用戶發出驗證郵箱或是更改密碼時,讓程式執行下麵的存儲過程:

 

CREATE PROCEDURE [dbo].[usp_UserRequestAction_Request]
(
    @Type NVARCHAR(2),
    @U_nbr NVARCHAR(20)
)
AS
IF NOT EXISTS(SELECT TOP 1 1 FROM [dbo].[Users] WHERE [U_nbr] = @U_nbr)
BEGIN
    RAISERROR(N'帳號錯誤或不存存在,請聯繫系統管理員。',16,1)
    RETURN
END

DECLARE @Email NVARCHAR(100)
SELECT @Email = [Email] FROM [dbo].[Users] WHERE [U_nbr] = @U_nbr


IF EXISTS(SELECT TOP 1 1 FROM [dbo].[UserRequestAction] WHERE [Type] = @Type AND [Account] = @U_nbr AND [Email] = @Email)
    UPDATE [dbo].[UserRequestAction] SET [Token] = NEWID(),[Expire] = DATEADD(day,(1),CURRENT_TIMESTAMP) WHERE [Type] = @Type AND [Account] = @U_nbr AND [Email] = @Email
ELSE
    INSERT INTO [dbo].[UserRequestAction] ([Type],[Account],[Email]) VALUES (@Type,@U_nbr,@Email)
GO
Source Code


用戶驗證郵箱有效性,是在登錄之後進行的,因此只需要點擊“驗證”銨鈕即可,系統即發送驗證的郵件至用戶的郵箱中。
另外,當用戶忘記密碼時,是在沒有登錄系統之下進行的,因此需要輸入用戶的帳號才能進行下一步。
均是使用這個存儲過程[dbo].[usp_UserRequestAction_Request]。

 
接下來的流程是,用戶會打開他的郵箱,查閱剛剛系統發送的郵件。郵件內容就是看實際需求了,如提示用戶,是不是自己本人操作,安全性等,這些都不是怎樣重要,重要的是那一條鏈接。
指示用戶點擊鏈接。這個鏈接會導上到網站一個頁面。當到這個頁面時,系統會在這頁面進行一些程式處理,檢查鏈接有效性,時間是否過期,如果一切沒有問題,會進更新IsVerify欄位為ture.

如果是用戶忘記密碼的話,在用戶點擊鏈接,系統也會檢有效性,沒有期,面會出現更改密碼的form,讓用戶進行更改全新的密碼。

Ok,還差2個存儲過程,第一個是更新IsVerify欄位值:

 

CREATE PROCEDURE [dbo].[usp_Users_UpdateIsVerifyField]
(
    @token NVARCHAR(36)
)
AS
IF EXISTS(SELECT TOP 1 1 FROM [dbo].[UserRequestAction] WHERE [Token] = @token AND [Expire] >= CURRENT_TIMESTAMP)
BEGIN
    DECLARE @Account NVARCHAR(30)
    SELECT @Account = [Account] FROM [dbo].[UserRequestAction] WHERE [Token] = @token
        
    UPDATE [dbo].[Users] SET [IsVerify] = 1 WHERE [U_nbr] = @Account

    UPDATE [dbo].[UserRequestAction] SET [Expire] = DATEADD(DAY,-1,CURRENT_TIMESTAMP) WHERE [Token] = @token
END
GO
Source Code


另一個是ResetPassword的,重設密碼:

 

CREATE PROCEDURE [dbo].[usp_Users_ResetPassword]
(
    @token NVARCHAR(36),
    @Password NVARCHAR(100)
)
AS
IF EXISTS(SELECT TOP 1 1 FROM [dbo].[UserRequestAction] WHERE [Token] = @token AND [Expire] >= CURRENT_TIMESTAMP)
BEGIN
    DECLARE @Account NVARCHAR(30)
    SELECT @Account = [Account] FROM [dbo].[UserRequestAction] WHERE [Token] = @token

    DECLARE @pwd VARBINARY(MAX) = ENCRYPTBYPASSPHRASE('insus#sec!%y',@Password)
    UPDATE [dbo].[Users] SET [Pwd] = @pwd WHERE [U_nbr] = @Account 

    UPDATE [dbo].[UserRequestAction] SET [Expire] = DATEADD(DAY,-1,CURRENT_TIMESTAMP) WHERE [Token] = @token
END
ELSE
BEGIN
    RAISERROR(N'無法更改密碼,請聯繫客服或網路管理員。',16,1)
    RETURN
END
Source Code

 

 資料庫方面開發就這樣子,程式方面看你自己發揮了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 資料庫版本:11GR2 一、介紹 在oracle中沒有其他資料庫系統中的資料庫的概念,對象都是創建在用戶下。當前用戶具有當前用戶下所有對象的所有許可權無論該對象是否是當前用戶所創建。舉個簡單例子創建一個用戶授予該用戶連接許可權,然後用管理員用戶在該用戶下創建一張表,該用戶可以刪除管理員在該用戶下創建的表 ...
  • 1. 確保Java已經正確安裝。 查看Java版本:java -version 2. 下載hadoop源程式並解壓到apache的官網下載某一版本的hadoop,不同版本可能會存在較大差異。本教程中使用版本為2.7.1 https://dist.apache.org/repos/dist/relea ...
  • Zookeeper概論(對zookeeper的概論、原理、架構等的理解) 一、概論 Zookeeper是一個分散式的、開放源碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是hadoop和hbase 的重要組件。它是一個為分散式應用提供一致性服務的軟體。提供的功能包括:配置維 ...
  • 定義 若左子樹非空,則左子樹上所有結點關鍵字值均小於根節點關鍵字值 若右子樹非空,則右子樹上所有節點關鍵字值均大於根節點關鍵字值 左,右子樹分別是一顆二叉排序樹 二叉排序樹插入 二查排序樹插入定義:若原二叉樹為空,則直接插入節點。否則,若關鍵字K小於根節點關鍵字,則插入到左子樹中。若關鍵字K大於根節... ...
  • 以前寫了篇SQL SERVER 2008資料庫各版本功能對比,官網提供的那個功能確實很好很強大,後面發現那個鏈接失效了。今天又遇到要對比SQL Server 2014資料庫版本功能需求,搜索找了好久才找到,索性將這些鏈接收錄在此,以備不時之需。 SQL Server 2008https://tech... ...
  • Hadoop集群搭建安裝過程(三)(圖文詳解 盡情點擊!!!) 一、JDK的安裝 安裝位置都在同一位置(/usr/tools/jdk1.8.0_73) jdk的安裝在克隆三台機器的時候可以提前安裝,通過scp使安裝文件和環境配置(/etc/profile)都拷貝過去,並使三台機 器都通過(sourc ...
  • 對於大神來說,不看都知道,但是對於和我一樣的菜鳥,就需要解釋一下了。 a,b是數據表名稱,c,d,e,f是數據。而c,d,e,f這些數據不一定非得來自b表,可以來自left join,right join和內連接查詢出來的結果 個人覺得使用起來還是比較方便的。 1 SELECT c,d,e FROM ...
  • 業務運行一段時間,發現原來的主鍵設置並不合理,這個時候,想變更主鍵。這種需求在實際生產中還是蠻多的。 下麵,看看pt-online-schema-change解決這類問題的處理方式。 首先,創建一張測試表 create table t2(c1 int primary key, c2 int); 構造 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...