css&javascript jquery使用ajax驗證帳號(運用介面、多型)
這篇比上篇還更難寫
網頁註冊時滿常見的驗證功能,也很簡單
不過,這並不是這章的重點
這章其實主要在繼承及多型
為什麼會講到這個呢
上一篇文章第一步資料庫連結端
就是這次的重點啦!!
上篇的NWDB類別庫裡,最重要的就是SearchCustomer()這個方法
這樣寫沒有問題喔!不過在實務管理上會有點混亂,怎麼說呢?
今天是搜尋客戶,如果說,我想要搜尋產品,或搜尋價格
難道說就一直在NWDB.cs檔裡面不斷加新的方法嗎?
如果今天有2、3百個搜尋、更新要做,那管理上不就很困擾?
可能寫個「搜尋」的介面,再由需要做搜尋的方法去
實作可能會是比較妥當的管理方法。
簡單來說,我們現在要做的是資料庫連結端的再切割
並且在NWDB檔裡引入實作方法的行為
如此在使用上只要引用NWDB檔就即可
觀念如果搞懂,程式碼會做上一篇NWDB的修改
及加入驗證帳戶的功能
其中「介面」的cs有3個:
ICustomer.cs
Imember.cs
IProduct.cs //這可以不要做,實際程式上也不會用到
真正在「實作」的cs有2個:
ImplCustomer.cs
ImplImember.cs
而NWDB呢,只是個空殼,會引入實作的方法
這部份真的有點抽像,我也不知道該怎麼用文字正確的敘述
打個比方可能比較容易懂:
NWDB是總承包商,自已不會做事
只是連接資料庫與中間商的橋梁
會分別放包給小的中間商,也就是介面
而中間商呢,也不會做事,就是畫好架構後
由最底層的工人來實作
如此層層分工,維護上會方便許多
在出問題時也比較容易找出徵結點
程式碼分別如下:
NWDB.cs:
ICustomer.cs:
ImplCustomer.cs:
IMember.cs:
ImplImember.cs:
==========================================================================
以上就完成了NWDB類別庫的作法
後面就簡單了,跟上一篇的作法差不多:
一、用ashx撰寫泛式
二、選寫網頁端
由於本篇會改變上篇的引入方法,所以上篇的引入方法需更改:
其他地方就不用更動
再來就是驗證帳戶的ashx,放在/Tools/CheckAccountDuplicate.ashx:
這樣就完成第2步啦~!
最後就是網頁端的撰寫
這個加入會員的網頁在之前的文章就寫過,可以前往參考
這邊就只補上需要加入的程式碼:
如此就大功告成啦!!!
這篇寫得好累~
這篇要求的功能其實不難:
當使用者輸入帳號後
帳號的框框一但失去焦點
馬上檢測是否有同帳號
聽起來很簡單吧!
不過後面連結資料的部份
才是觀念需要釐清的地方…
網頁註冊時滿常見的驗證功能,也很簡單
不過,這並不是這章的重點
這章其實主要在繼承及多型
為什麼會講到這個呢
上一篇文章第一步資料庫連結端
就是這次的重點啦!!
上篇的NWDB類別庫裡,最重要的就是SearchCustomer()這個方法
這樣寫沒有問題喔!不過在實務管理上會有點混亂,怎麼說呢?
今天是搜尋客戶,如果說,我想要搜尋產品,或搜尋價格
難道說就一直在NWDB.cs檔裡面不斷加新的方法嗎?
如果今天有2、3百個搜尋、更新要做,那管理上不就很困擾?
可能寫個「搜尋」的介面,再由需要做搜尋的方法去
實作可能會是比較妥當的管理方法。
簡單來說,我們現在要做的是資料庫連結端的再切割
並且在NWDB檔裡引入實作方法的行為
如此在使用上只要引用NWDB檔就即可
觀念如果搞懂,程式碼會做上一篇NWDB的修改
及加入驗證帳戶的功能
其中「介面」的cs有3個:
ICustomer.cs
Imember.cs
IProduct.cs //這可以不要做,實際程式上也不會用到
真正在「實作」的cs有2個:
ImplCustomer.cs
ImplImember.cs
而NWDB呢,只是個空殼,會引入實作的方法
這部份真的有點抽像,我也不知道該怎麼用文字正確的敘述
打個比方可能比較容易懂:
NWDB是總承包商,自已不會做事
只是連接資料庫與中間商的橋梁
會分別放包給小的中間商,也就是介面
而中間商呢,也不會做事,就是畫好架構後
由最底層的工人來實作
如此層層分工,維護上會方便許多
在出問題時也比較容易找出徵結點
程式碼分別如下:
NWDB.cs:
//需實作3個介面的方法,IProduct可以不用
public class NWDB : ICustomer, IProduct,IMember
{
private SqlConnection cnn;
public SqlConnection Connection
{
get { return this.cnn; }
}
//建構子(建立資料庫連線)
public NWDB()
{
cnn = new SqlConnection("server=localhost;database=中文北風;UID=SQLUser;PWD=1234");
}
//帶參數的建構子,引用時要加帳密
public NWDB(string Account, string Password)
{
SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
scsb.DataSource = "localhost";
scsb.InitialCatalog = "中文北風";
scsb.UserID = Account;
scsb.Password = Password;
scsb.IntegratedSecurity = false;
cnn = new SqlConnection(scsb.ConnectionString);
}
//分別引入各介面
private ICustomer ic;
private IProduct ip;
private IMember im;
public void SetCustomer(ICustomer ic)
{
this.ic=ic;
}
public void SetProduct(IProduct ip)
{
this.ip=ip;
}
public void SetMember(IMember im)
{
this.im = im;
}
//引入實作的方法
#region 客戶
public DataTable SearchCustomer(string CustomerName)
{
return ic.SearchCustomer(CustomerName);
}
#endregion
#region 產品
public DataTable SearchProduct()
{
return ip.SearchProduct();
}
#endregion
#region 帳戶驗證
public bool CheckMemberDuplicate(string Account)
{
return im.CheckMemberDuplicate(Account);
}
#endregion 帳戶驗證
//解構子,確保有關閉資料庫連線
~NWDB()
{
cnn.Close();
cnn.Dispose();
}
}
ICustomer.cs:
//介面,由ImplCustomer來實作
public interface ICustomer
{
DataTable SearchCustomer(string CustomerName);
}
//實作ICustomer
public class ImplCustomer : ICustomer
{
private SqlConnection cnn;
public ImplCustomer(SqlConnection cnn)
{
this.cnn = cnn;
}
//查詢客戶的程式碼
public DataTable SearchCustomer(string CustomerName)
{
SqlCommand cmd = new SqlCommand("WAITFOR DELAY '00:00:01' SELECT 客戶編號,公司名稱,連絡人,連絡人職稱,地址 FROM 客戶 WHERE 公司名稱 LIKE ('%'+@cname+'%')", cnn);
cmd.Parameters.Add("@cname", SqlDbType.VarChar).Value = CustomerName;
cnn.Open();
SqlDataReader mydr = cmd.ExecuteReader();
DataTable tt = new DataTable();
tt.Load(mydr);
mydr.Close();
cmd.Dispose();
cnn.Close();
return tt;
}
}
IMember.cs:
public interface IMember
{
bool CheckMemberDuplicate(string Account);
}
ImplImember.cs:
//實作IMember
public class ImplImember:IMember
{
SqlConnection cnn;
public ImplImember(SqlConnection cnn)
{
this.cnn = cnn;
}
//查詢帳戶有無重複的程式碼
public bool CheckMemberDuplicate(string Account)
{
SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM 會員表 WHERE 帳號 =@member", cnn);
cmd.Parameters.Add("@member", SqlDbType.VarChar).Value = Account;
cnn.Open();
int nn = (int)cmd.ExecuteScalar();
cmd.Dispose();
cnn.Close();
if (nn > 0)
return true;
else
return false;
}
}
==========================================================================
以上就完成了NWDB類別庫的作法
後面就簡單了,跟上一篇的作法差不多:
一、用ashx撰寫泛式
二、選寫網頁端
由於本篇會改變上篇的引入方法,所以上篇的引入方法需更改:
//引入網頁傳來的值 string cname = context.Request.QueryString["cname"]; //new 出nwdb NWDB.NWDB nwdb = new NWDB.NWDB(); //將nwdb中的連接方法傳給NWDB中ImplCustomer NWDB.ImplCustomer im = new NWDB.ImplCustomer(nwdb.Connection); //傳好後,將nwdb中設為im,如此nwdb.SearchCustome才會有值 nwdb.SetCustomer(im); DataTable tt =nwdb.SearchCustomer(cname);
再來就是驗證帳戶的ashx,放在/Tools/CheckAccountDuplicate.ashx:
public void ProcessRequest(HttpContext context)
{
string nn = context.Request.QueryString["nn"];
NWDB.NWDB mwdb = new NWDB.NWDB();
NWDB.ImplImember checkMember = new NWDB.ImplImember(mwdb.Connection);
mwdb.SetMember(checkMember);
bool result = mwdb.CheckMemberDuplicate(nn);
string ans = "";
if (result)
ans = "t";
else
ans = "f";
context.Response.Write(ans);
}
最後就是網頁端的撰寫
這個加入會員的網頁在之前的文章就寫過,可以前往參考
這邊就只補上需要加入的程式碼:
$(document).ready(function () {
//blur,當id為Account改變焦點時
$("#Account").blur(function () {
if ($("#Account").val() == "") {
$("#AccountCheckResult").text("");
return;
}
var checkaccount = $.param({ nn: $("#Account").val() });
$.get("/Tools/CheckAccountDuplicate.ashx"
, checkaccount
, function (xx) {
if (xx == "t")
$("#AccountCheckResult").text("帳號已被注冊").css("color","red");
else
$("#AccountCheckResult").text("帳號可以使用").css("color","blue");
});
});
});
function checkForm() {
var msg = "";
if ($("#AccountCheckResult").text() == "帳號已被注冊")
msg += "* 請注冊別的帳號";
if (msg != "") {
alert(msg);
return false;
}
else {
$("#form1").submit();
}
});
如此就大功告成啦!!!
這篇寫得好累~



留言
張貼留言