當(dāng)我們登錄到某些論壇或社區(qū)時,在頁面中會出現(xiàn)“短消息”提示對話框,用于提醒登錄用戶查收、管理站務(wù)短消息。該系統(tǒng)即為網(wǎng)站短消息系統(tǒng)。它主要用于網(wǎng)站管理員發(fā)送站務(wù)管理信息,和注冊用戶好友之間的相互聯(lián)系、溝通。本文將以Dreamweaver MX 2004為基礎(chǔ),結(jié)合Access 2003后臺數(shù)據(jù)庫,實(shí)現(xiàn)一個完整的網(wǎng)站短消息系統(tǒng)。讓你的網(wǎng)站更加豐富多采,個性化十足。
一、短信系統(tǒng)分析與開發(fā)準(zhǔn)備1.短信系統(tǒng)功能說明(1)因?yàn)槎滔⑾到y(tǒng)必須存在于要求登錄會員系統(tǒng)中,所以需要一個簡單的用戶注冊和登錄。 (2)每位用戶擁有屬于自己的收件箱和發(fā)件箱。 (3)發(fā)送的消息在對方登錄時應(yīng)該獲得提醒前去查閱。 (4)批量刪除消息的功能(其實(shí)是不顯示而已)。 (5)群發(fā)消息功能(可以對幾個用戶發(fā)出同樣的消息)。 (6)用戶可以自定義好友組。 2.建立Web共享為了可以在本機(jī)對所開發(fā)的Web程序進(jìn)行測試、預(yù)覽,我們需要在本地磁盤上對開發(fā)目錄做“Web共享”操作。 (1)在Windows 2000/XP中,單擊“開始→設(shè)置→控制面板”菜單項(xiàng),在出現(xiàn)的對話框中雙擊“添加或刪除程序”圖標(biāo),在出現(xiàn)的對話框中單擊“添加/刪除Windows組件”按鈕,然后在出現(xiàn)的對話框中單擊“Internet信息服務(wù)”選項(xiàng),單擊“下一步”按鈕,將Windows XP安裝光盤置入光驅(qū),即開始安裝和配置“Internet信息服務(wù)”組件。安裝完成,單擊“完成”按鈕即可。 注意:在Windows 98中,需要安裝PWS(Personal Web Server,個人Web服務(wù))。 (2)在本地磁盤上建立目錄“Smail”,如C:\smail,用于存放“短消息系統(tǒng)”所有的文件。 (3)右鍵單擊該目錄,在出現(xiàn)的菜單中選擇“屬性”命令,在出現(xiàn)的對話框中單擊“Web共享”選項(xiàng)卡,單擊“共享這個文件夾”選項(xiàng),然后在出現(xiàn)的對話框中單擊“目錄瀏覽”選項(xiàng)即可。 完成后你可以通過http://localhost/Smail來訪問存在于該目錄中的文件。 3.數(shù)據(jù)庫設(shè)計(jì)這里,我們使用Access 2003作為站點(diǎn)的后臺數(shù)據(jù)庫,在前面建立的“Smail”目錄中建立一個名字為“Smail”的數(shù)據(jù)庫,根據(jù)需要的功能,我們在庫中建立3個數(shù)據(jù)表。 (1)用戶信息表:需要用戶登錄自然要有存儲用戶信息的數(shù)據(jù)表,下面是一個簡單的用戶信息表結(jié)構(gòu)。
注意:在設(shè)計(jì)完“用戶信息表”后直接在表中加入了一些用戶名作為系統(tǒng)開發(fā)過程中測試使用。 (2)短消息內(nèi)容表:用于存放短消息的內(nèi)容以及相關(guān)信息。
(3)好友組信息表:由于希望實(shí)現(xiàn)方便的群發(fā)功能,因此創(chuàng)建該表用來記錄用戶常用的發(fā)件對象集合。
二、在Dreamweaver MX 2004中建立站點(diǎn)1.建立站點(diǎn)(1)啟動Dreamweaver MX 2004,在歡迎頁面上單擊“Dreamweaver Site…”(Dreamweaver站點(diǎn))選項(xiàng),啟動創(chuàng)建站點(diǎn)向?qū)А?/P> (2)在“Basic”(基本)模式下建立站點(diǎn),首先輸入站點(diǎn)名稱“短消息系統(tǒng)”。單擊“Next”按鈕。 (3)在出現(xiàn)的對話框中,詢問當(dāng)前站點(diǎn)使用何種動態(tài)網(wǎng)頁技術(shù)開發(fā)。單擊“Yes,I want to......”選項(xiàng),然后選擇“ASP VBScript”選項(xiàng)。單擊“Next”按鈕。 (4)在出現(xiàn)的對話框中,詢問對測試文件存放、預(yù)覽等選項(xiàng),一般我們均在本地測試系統(tǒng),這里選擇前面建立的目錄即可,如C:\smail。單擊“Next”按鈕。 (5)在出現(xiàn)的對話框中,詢問當(dāng)前站點(diǎn)的測試路徑,我們按照先前定義的“Web共享”目錄名輸入“http://localhost/Smail/”后單擊“Test URL”(測試URL)按鈕,系統(tǒng)提示通過測試,單擊“確定”按鈕。單擊“Next”按鈕。 (6)在出現(xiàn)的對話框中,詢問你完成后的頁面是否及時更新到其他機(jī)器中,該選項(xiàng)主要針對團(tuán)隊(duì)開發(fā)設(shè)立,讓你的同事可以隨時了解你開發(fā)過程中的改動,單擊“No”選項(xiàng)。單擊“Next”按鈕。 (7)在出現(xiàn)的對話框中,顯示站點(diǎn)定義完畢的一些信息,直接單擊“Done”(完成)按鈕,完成“Smail”站點(diǎn)的建立。 2.建立數(shù)據(jù)源鏈接在Dreamweaver中進(jìn)行動態(tài)網(wǎng)頁開發(fā),必須先要與數(shù)據(jù)庫鏈接。在歡迎窗口上選擇“ASP VBScript”選項(xiàng)創(chuàng)建一個新文件。單擊“Application”(應(yīng)用程序)工作面板,單擊“Database”(數(shù)據(jù)庫)選項(xiàng)卡,然后單擊“+”按鈕,選擇“Custom Connection String”(自定義連接字符串)命令,在出現(xiàn)的對話框中進(jìn)行鏈接設(shè)置。其中: “Connection name”(連接名稱):Smail。 “Connection string”(連接字符串): Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Smail\smail.mdb。 注意:這里的數(shù)據(jù)源位置C:\Smail\smail.mdb,即是你前面存放數(shù)據(jù)庫的位置,需要根據(jù)你自己的具體情況修改。 “Dreamweaver should connect”(Dreamweaver應(yīng)連接):Using driver on this machine(使用本地計(jì)算機(jī)上的驅(qū)動程序)。 完成后單擊“Test”(測試)按鈕,如果鏈接成功則會出現(xiàn)“Connection was made successfully”提示對話框。 3.決定系統(tǒng)必要的文件和操作根據(jù)需要的功能,我們必須先設(shè)定好需要開發(fā)的頁面及其相應(yīng)的功能。 (1)用戶注冊、登錄以及必要的信息提示。包括: Default.asp(用戶登錄頁)、Login.asp(新用戶注冊頁)、LoginError.asp(新用戶注冊重名提示頁)、Error.asp(登錄錯誤后轉(zhuǎn)向的錯誤提示頁)、Restrict.asp(限制未登錄用戶訪問的代碼頁)等。 (2)實(shí)現(xiàn)短消息收發(fā)的主體文件。包括: Index.asp(登錄正確后轉(zhuǎn)向的首頁)、S_Take.asp(用戶的收件箱頁面)、S_Send.asp(用戶的發(fā)件箱頁面)、S_Mail.asp(用戶發(fā)送短消息的頁面)、S_Group.asp(用戶自定義組的頁面)等。 (3)對必要的細(xì)節(jié)進(jìn)行修改。包括: 修改S_Mail.asp頁以適合群發(fā)消息、修改Login.asp頁屏蔽“,"字符等操作。 三、用戶注冊、登錄以及必要的信息提示1.Default.asp:用戶登錄頁凡是涉及用戶概念的系統(tǒng)免不了都需要制作注冊和登錄等頁面。 (1)新建Default.asp頁面,在頁面內(nèi)設(shè)計(jì)一個登錄表單,如圖1所示。在Properties(屬性)面板中設(shè)置文本框名分別為“username”和“password”,其中“password”文本框的“Type”類型設(shè)置為“password”。 ![]() (2)單擊“Application”(應(yīng)用程序)工作面板,單擊“Server Behaviors”(服務(wù)器行為)選項(xiàng)卡,單擊“+”按鈕,選擇“User Authentication”(用戶身份驗(yàn)證)選項(xiàng),在出現(xiàn)的菜單中選擇“Log In User(登錄用戶)”命令,在出現(xiàn)的對話框中進(jìn)行如下設(shè)置:
Get input from form(從表單獲取輸入):因?yàn)轫撁嬷挥幸粋€表單,所以默認(rèn)即為“form1”。 Username field(用戶名字段):username。對應(yīng)用戶名的文本框username。 Password field(密碼字段):password。對應(yīng)密碼的文本框password。 Validate using connection(使用連接驗(yàn)證):使用我們已經(jīng)建立的“smail”。 Table(表格):用戶信息表。 Username column(用戶名列):用戶名。 Password column(密碼列):密碼。 If login succeeds, go to(如果登錄成功,轉(zhuǎn)到):index.asp。 Go to precious URL (if it exists)(轉(zhuǎn)到前一個URL(如果它存在)):選中。這是一個比較實(shí)用的選項(xiàng),比如你在頁面A使用了“Restrict Access To Page”限制對頁訪問的服務(wù)器行為后,該頁面需要用戶登錄后才可訪問,而用戶沒有經(jīng)過登錄直接鏈接到頁面A,那么就會被轉(zhuǎn)到default.asp頁要求登錄。選中該選項(xiàng),在登錄完成后則不前往index.asp頁,而是直接轉(zhuǎn)向頁面A。 If login fails, go to(如果登錄失敗,轉(zhuǎn)到):Error.asp。 Restrict access based on(基于以下項(xiàng)限制訪問):Username and password。這里可以設(shè)置你的登錄是否還需要用戶等級概念,如果需要則選擇“Username, password, and access level”(用戶名、密碼和訪問級別)選項(xiàng),并且在“Get level from”(獲取級別自)選項(xiàng)中選擇從哪個字段來獲得等級標(biāo)準(zhǔn)。設(shè)置完畢后即完成登錄驗(yàn)證。 這里簡要的說明一下登錄驗(yàn)證的原理,我們分析源碼后可以得知該頁是根據(jù)用戶名、密碼與數(shù)據(jù)庫中“用戶信息表”的匹配來決定登錄的用戶是否為合法用戶,從而產(chǎn)生一個名為“MM_Username”的Session變量,只要合法用戶登錄后并且在變量的生命周期內(nèi),這個變量就代表登錄的用戶名,如果你選擇的是區(qū)分等級的用戶登錄,則還會有一個區(qū)別等級的Session變量“MM_UserAuthorization”。 (3)為了避免用戶沒有在表單內(nèi)輸入必要的信息就單擊“登錄”按鈕,還需要對表單進(jìn)行一個簡單的驗(yàn)證。選中“登錄”按鈕,單擊“Tag<input>”(<input>標(biāo)簽)工作面板(或按Shift+F3組合鍵),單擊“Behaviors”(行為)選項(xiàng)卡,單擊“+”按鈕,選擇“Validate Form”(檢查表單行為)命令,在出現(xiàn)的對話框中,將兩個文本框欄中的“Value”(值)選項(xiàng)設(shè)置為“Required”(必需的)選項(xiàng),以進(jìn)行必填驗(yàn)證。 (4)最后在登錄頁建立一個到Login.asp注冊頁的鏈接,完成該頁。 2.Login.asp:新用戶注冊頁(1)新建Login.asp頁面,單擊“Application”(應(yīng)用程序)工作面板,單擊“Server Behaviors”(服務(wù)器行為)選項(xiàng)卡,單擊“+”按鈕,選擇“Insert Record”(插入記錄)選項(xiàng),在出現(xiàn)的菜單中選擇“Record Insertion Form Wizard”(插入記錄表單向?qū)?命令。在出現(xiàn)的對話框中進(jìn)行設(shè)置: Connection(連接):smail。 Insert into table(插入到表格):用戶信息表。 After inserting, go to(插入后,轉(zhuǎn)向):default.asp。 在選擇需插入的數(shù)據(jù)表后,Dreamweaver會將該數(shù)據(jù)表中的所有字段都顯示在“Form fields”(表單字段)列表內(nèi)供選擇設(shè)置。我們在這里需要選中“UID”項(xiàng),然后單擊“-”按鈕將其刪除(因?yàn)樵撟侄问亲詣泳幪栴愋偷?,不可插?。選中用戶名時,在對話框下方的項(xiàng)目中將出現(xiàn)默認(rèn)的值,你可以對其進(jìn)行修改: Label(文本):對應(yīng)選中字段在頁面中顯示的文本。 Display as(顯示為):對應(yīng)選中字段在頁面中出現(xiàn)供插入數(shù)據(jù)的控件。 Submit as(提交為):對應(yīng)選中字段提交的數(shù)據(jù)類型。 Default value(默認(rèn)值):插入數(shù)據(jù)的控件上顯示的默認(rèn)值。在這里我們按下表設(shè)定:
完成后確定返回,頁面上會自動插入表單和輸入數(shù)據(jù)用的控件。 (2)對生成的表單進(jìn)行簡單修改后,我們需要作避免相同用戶名注冊的操作。單擊“Application”(應(yīng)用程序)選項(xiàng)卡,單擊“User Authentication”(用戶身份驗(yàn)證)按鈕,在出現(xiàn)的菜單中選擇“Check New Username”(檢查新用戶名)命令,在出現(xiàn)的對話框中進(jìn)行設(shè)置: Username field(驗(yàn)證用戶名):因?yàn)檩斎胄彰奈谋究蚩丶怯煞?wù)器行為自動生成的,所以選擇對應(yīng)用戶名的文本框控件名“Element”。 If already exists, go to(如果輸入的用戶名已經(jīng)存在,轉(zhuǎn)向):LoginError.asp。 完成設(shè)定后返回,最后需要對表單輸入做必填驗(yàn)證,該操作與Default.asp頁面的表單驗(yàn)證一樣,這里不作過多說明。 3.LoginError.asp:新用戶注冊重名提示頁該頁是在注冊新用戶時,遇到重名后轉(zhuǎn)向的提示頁,所以只需要在頁面上輸入提示信息,并給出返回注冊頁的鏈接即可。 新建LoginError.asp頁面,單擊“Application”(應(yīng)用程序)工作面板,單擊“Binding”(綁定)選項(xiàng)卡,單擊“+”按鈕選中“Request Variable”(請求變量)選項(xiàng),在出現(xiàn)的對話框中進(jìn)行設(shè)置: Type(類型):Request.QueryString,即URL變量。 Name(名稱):RequserName。該變量名由Login.asp頁面中“Check New Username”服務(wù)器行為創(chuàng)建,當(dāng)注冊的用戶名重復(fù)時,該行為將輸入值命名為“RequserName”,通過URL傳遞到LoginError.asp頁,這里只是做了一個承接的作用。 完成后將該變量拖入到頁面相應(yīng)位置即可。如圖2所示。
![]() 該錯誤提示頁面主要是登錄錯誤而轉(zhuǎn)向的頁面,在頁面上說明并加上重新轉(zhuǎn)到Default.asp頁登錄的鏈接即可。 5.Restrict.asp:限制未登錄用戶訪問的代碼頁在制作Login.asp頁面時已經(jīng)講到,用戶登錄系統(tǒng)后會自動創(chuàng)建Session變量“MM_Username”,那么只要在該變量內(nèi)檢查到它的存在就可以認(rèn)為用戶已經(jīng)成功登錄了?,F(xiàn)在我們創(chuàng)建一段檢查該變量的代碼,然后將代碼置入需要登錄才可訪問的頁面中就可以限制未登錄用戶的訪問了。 (1)新建Restrict.asp頁面,單擊“Application”(應(yīng)用程序)工作面板,單擊“Server Behaviors”(服務(wù)器行為)選項(xiàng)卡,單擊“+”按鈕,選擇“User Authentication”(用戶身份驗(yàn)證)選項(xiàng),在出現(xiàn)的菜單中選擇“Restrict Access To Page”(限制對頁的訪問)命令,在出現(xiàn)的對話框中進(jìn)行設(shè)置: Restrict based on(驗(yàn)證包括的項(xiàng)目):Username and password,僅驗(yàn)證用戶名和密碼。 If access denied, go to(如果拒絕訪問,則轉(zhuǎn)向):Default.asp。 (2)完成設(shè)定后我們轉(zhuǎn)到源代碼窗口,因?yàn)榇隧撁鎸⒈话狡渌撁?,所以這里只需要“Restrict Access To Page”生成的ASP代碼即可,而其他的都可以刪除。 首先刪除<%@LANGUAGE=″VBSCRIPT″ CODEPAGE=″936″%>一句。然后刪除ASP代碼以后的全部HTML代碼,完成后即可存盤。 其實(shí),你也可以在每個頁面都使用這個“Restrict Access To Page”來為登錄用戶限定訪問,不過為了代碼的簡潔、易懂,可以將常用代碼存為一頁,然后使用包含頁的方法來置入到所有登錄后才能訪問的頁面中。你只需要在頁面源碼窗口頂部加入代碼即可。 四、實(shí)現(xiàn)短消息收發(fā)的主體文件1.S_Take.asp:用戶的收件箱頁面該頁為收件箱頁面,任何發(fā)送給登錄用戶的消息都可在此瀏覽。收件箱根據(jù)用戶登錄后的“Session”變量在“短消息內(nèi)容表”的“收件人”字段中比對,符合的就屬于該用戶的收件箱。 (1)新建S_Take.asp頁面,在頁面建立靜態(tài)元素,如圖3所示。 ![]() 其中,“發(fā)送消息”鏈接到S_Mail.asp頁面;“發(fā)件箱”鏈接到S_Send.asp頁面;“管理組”鏈接到S_Group.asp頁面。
(2)單擊“Application”(應(yīng)用程序)工作面板,單擊“Binding”(綁定)選項(xiàng)卡,單擊“+”按鈕選中“Recordset(Query)”(記錄集)選項(xiàng),在出現(xiàn)的對話框中建立記錄集: Name(名稱):SM1。 Connection(連接):smail。 Table(數(shù)據(jù)表):短消息內(nèi)容表。 Columns(字段):All。 Filter(過濾條件):收件人、=、Session Variable、MM_Username。 Sort(排序):SID、Descending。 完成前面的設(shè)定后,單擊“Advanced”(高級)按鈕,在出現(xiàn)的對話框中的“SQL”區(qū)域中添加過濾代碼“AND 收件顯示 = True”,然后修改代碼為: SELECT * FROM 短消息內(nèi)容表。 WHERE 收件人 = ‘MMColParam‘ AND 收件顯示 = True ORDER BY SID DESC 該代碼表示記錄集篩選的不只是收件人,并且“收件顯示”字段值必須為True,這樣做是為了在后面可以過濾已經(jīng)刪除的消息。單擊“確定”按鈕完成記錄集建立。 (3)在“Application”工作面板中單擊“Binding”(綁定)選項(xiàng)卡,單擊“+”按鈕,選擇“Session Variable”(創(chuàng)建變量)選項(xiàng),在出現(xiàn)的對話框中設(shè)置“Name”值為“MM_Username”,在站點(diǎn)中建立一個Session變量,該類型變量在你站點(diǎn)內(nèi)的任何以登錄頁面上都可以使用。使用時只需要選擇需要替換的文字后單擊“insert”按鈕即可。 選擇頁面上的“某某人”文字,然后選擇該變量后單擊“insert”按鈕,用戶登錄后的名字就可在此顯示出來。 (4)在“Application”工作面板中單擊“Binding”(綁定)選項(xiàng)卡,然后將記錄集“SM1”展開,拖動動態(tài)數(shù)據(jù)到相應(yīng)的頁面位置,對于復(fù)選框設(shè)定“Name”為“DELID”,將動態(tài)數(shù)據(jù)“SID”綁定到“Checked Value”項(xiàng)目中。然后選擇動態(tài)數(shù)據(jù)所在的行,應(yīng)用“Server Behavior”下的“Repeat Region”(重復(fù)區(qū)域)服務(wù)器行為,在出現(xiàn)的對話框中選擇“SM1”記錄集和默認(rèn)每頁顯示10條記錄,完成后如圖4所示。 ![]() (5)增加翻頁鏈接。單擊“Application”(應(yīng)用程序)工作面板,單擊“Server Behaviors”(服務(wù)器行為)選項(xiàng)卡,單擊“+”按鈕,選擇“Recordset Paging”(記錄集翻頁)選項(xiàng),在出現(xiàn)的菜單中選擇“Recordset Navigation Bar”(記錄集導(dǎo)航條)選項(xiàng),在出現(xiàn)的對話框中設(shè)置“Recordset”(記錄集)為“SM1”,“Display using”(顯示方式)為“Text”,單擊“確定”按鈕即可在頁面當(dāng)前位置插入前后的翻頁鏈接。
(6)增加刪除信息的Command。前面說過,當(dāng)你不需要收件箱中的某條消息時,應(yīng)該將其刪除(其實(shí)是不顯示而已)。在“Application”工作面板中單擊“Binding”(綁定)選項(xiàng)卡,單擊“+”按鈕,選中“Command(Store Procedure)”(存儲過程)選項(xiàng)。在出現(xiàn)的對話框中設(shè)置建立名稱為“Command1”的命令。其中“SQL”域和“Variables”變量域中的代碼表示由表單獲得“DELID”參數(shù)放入變量“MM_DEL”,然后根據(jù)該變量來修改“短消息內(nèi)容表”中的“收件顯示”字段值為False。確定后轉(zhuǎn)到“代碼”窗口,找到以下兩段代碼: 代碼段1: ?。? if(Request.QueryString ("DelID") <> "") then Command1__MM_Del = Request.QueryString ("DelID") %> 代碼段2: ?。? set Command1 = Server.CreateObject("ADODB.Command") Command1.ActiveConnection = MM_smail_STRING Command1.CommandText = "UPDATE 短消息內(nèi)容表 SET 發(fā)件顯示 = False WHERE SID in (" + Replace(Command1__MM_Del, "‘","‘‘") +")" Command1.CommandType = 1 Command1.CommandTimeout = 0 Command1.Prepared = true Command1.Execute() %> 上述兩段代碼是剛才Command操作產(chǎn)生的,我們需要修改一下后放在其他代碼的上方,讓其在打開該頁面時首先執(zhí)行該段代碼。 ?。? if(Request.QueryString ("DelID") <>"") then Command1__MM_Del = Request.QueryString ("DelID") set Command1 = Server.CreateObject("ADODB.Command") Command1.ActiveConnection = MM_smail_STRING Command1.CommandText = "UPDATE 短消息內(nèi)容表 SET 發(fā)件顯示 = False WHERE SID in (" + Replace(Command1__MM_Del, "‘","‘‘") + ") " Command1.CommandType = 1 Command1.CommandTimeout = 0 Command1.Prepared = true Command1.Execute() Response.Redirect "S_Take.asp" End If %> 修改后的代碼表示,如果表單參數(shù)“DELID”不為空,那么就根據(jù)“SID”字段決定哪些記錄需要修改“收件顯示”字段為False,完成后重新加載該頁,否則就跳過該段修改代碼。 提交表單還需要設(shè)置“Action”(動作)為提交到本頁“S_Take.asp”;數(shù)據(jù)傳遞“Method”模式為“GET”,表示從URL傳遞參數(shù)。 (7)增加閱讀消息時間的Command。當(dāng)有消息到達(dá)時,你必須要將當(dāng)前時間寫入到“收件時間”字段中。我們可以在頁面上再加一個Command,將屬于登錄用戶并且“收件時間”為空的記錄都寫入當(dāng)前時間。你可以按照上述方法在對話框中設(shè)置Command,“SQL”區(qū)域代碼如下: UPDATE 短消息內(nèi)容表 SET 收件時間 = Now() WHERE 收件人 = ‘MM_name‘ and 收件時間 is null 變量“MM_name”由Session變量“MM_Username”獲得,它與建立“SM1”記錄集是一樣的,然后在源碼窗口中整合代碼,將其移動到記錄集的結(jié)束代碼段: <% SM1.Close() Set SM1 = Nothing %> 整合后代碼如下: ?。? UpCmd__MM_name = Session("MM_Username") set UpCmd = Server.CreateObject("ADODB.Command") UpCmd.ActiveConnection = MM_smail_STRING UpCmd.CommandText = "UPDATE 短消息內(nèi)容表 SET 收件時間 = Now() WHERE 收件人 = ‘" + Replace(UpCmd__MM_name, "‘", "‘‘") + "‘ and 收件時間 is null " UpCmd.CommandType = 1 UpCmd.CommandTimeout = 0 UpCmd.Prepared = true UpCmd.Execute() %> 該代碼表示將當(dāng)前登錄用戶的Session變量存入“UpCmd_MM_name”變量,根據(jù)當(dāng)前用戶和收件時間為空的記錄來修改“收件時間”等于當(dāng)前時間。 經(jīng)過以上步驟,完成收件箱頁面的制作。 2.S_Send.asp:用戶的發(fā)件箱頁面發(fā)件箱保留所有的發(fā)送信息,實(shí)現(xiàn)原理和收件箱基本相同,下面簡單介紹其實(shí)現(xiàn)方法。 (1)建立靜態(tài)頁面。其結(jié)構(gòu)與S_Take.asp頁面類似,這里的“閱讀”是指顯示當(dāng)收件人閱讀這條消息的時間。如圖5所示。 ![]() (2)建立發(fā)件記錄集“SM1”并綁定到頁面。記錄集建立如圖6所示,表示只顯示當(dāng)前用戶自己的并且“發(fā)件顯示”字段為“True”的消息,以序號“SID”的降序排列。
![]() (3)綁定記錄到頁面。如上述操作,依次綁定動態(tài)數(shù)據(jù)到頁面上,復(fù)選框“DELID”綁定“SID”動態(tài)記錄;使用“Repeat Region”(重復(fù)區(qū)域)服務(wù)器行為和“Recordset Navigation Bar”(記錄集導(dǎo)航條)即可。
提交表單與上述設(shè)置相同,,設(shè)置“Action”為提交到本頁“S_Send.asp”,“Method”為“GET”。完成后如圖7所示。 ![]() (4)增加修改信息為在發(fā)件箱不顯示的Command。該Command的建立與前面介紹的S-Take.asp頁面方法大致一樣(讀者可參看前文講述),你只要拷貝前面的代碼,無須在對話框中設(shè)置。代碼如下:
<% If(Request.QueryString("DELID") <> "") Then Command1__MM_DEL = Request.QueryString("DELID") set Command1 = Server.CreateObject("ADODB.Command") Command1.ActiveConnection = MM_Smail_STRING Command1.CommandText = "UPDATE 短消息內(nèi)容表 SET 發(fā)件顯示 = False WHERE SID in (" + Replace(Command1__MM_DEL, "‘","‘‘") + ") " Command1.CommandType = 1 Command1.CommandTimeout = 0 Command1.Prepared = true Command1.Execute() Response.Redirect "S_Send.asp" End If %> 同樣,將這段代碼放在頁面頂端,完成該頁。 3.S_Mail.asp 用戶發(fā)送短消息的頁面該頁面為發(fā)送消息的頁面,需要在數(shù)據(jù)庫中插入收件人、消息內(nèi)容和發(fā)件人信息。 單擊“Application”(應(yīng)用程序)工作面板,單擊“+”按鈕,選擇“Insert Record”(插入記錄)選項(xiàng),在出現(xiàn)的菜單中選擇“Record Insertion Form Wizard”(插入記錄表單向?qū)?命令。在出現(xiàn)的對話框中進(jìn)行設(shè)置。 Connection(連接):smail。 Insert into table(插入到表格):短消息內(nèi)容表。 After inserting, go to(插入后,轉(zhuǎn)向):S_Send.asp。 在“Form fields”(表單字段)列表我們只保留需要插入記錄的字段,其他字段選擇后單擊“-”按鈕刪除。另外對“消息內(nèi)容”字段的“Display as”屬性設(shè)定為“Text atea”,對“發(fā)件人”字段的“Default value”屬性設(shè)為“<%=Session(″MM_Username″)%>”,表示從Session變量直接獲取,其他的一些設(shè)置如前述操作。 完成插后在頁面上加入一些鏈接信息即可。如圖8所示。
![]() 該頁面為用戶登錄正確的轉(zhuǎn)向頁,短消息系統(tǒng)作為論壇或者社區(qū)中的一個模塊,在該頁面只需要存在鏈接,如果有新的消息到達(dá)即出現(xiàn)提醒信息即可。 首先,你需要建立記錄集判斷用戶是否有新的消息到來。該判斷很簡單,在數(shù)據(jù)庫中過濾“收件人”屬于當(dāng)前用戶并且“收件時間”為空的記錄,如果存在這樣的記錄,那么顯示提示信息。記錄集建立如圖9所示。 ![]() 完成后,在頁面上添加提示有新消息的文字并做好到S_Take.asp頁的鏈接,在選擇該行文字后使用“Application”(應(yīng)用程序)工作面板中“Show Region”(顯示區(qū)域)選項(xiàng)卡中的“Show If Recordset Not Empty”(如果記錄集不為空顯示區(qū)域)服務(wù)器行為。
在出現(xiàn)的對話框中選擇“Recordset”記錄集為“SM1”,完成后確定返回頁面。這樣,當(dāng)你登錄到該頁,如果數(shù)據(jù)庫中存在收件人為用戶本人,并且“收件時間”還為空的信息,那么記錄集就會返回記錄,你的提示信息就會顯示在頁面上。 經(jīng)過上述操作,短消息系統(tǒng)已經(jīng)可以正常運(yùn)行了,不過對于論壇或者社區(qū)的管理員來說,有時需要把一條消息同時發(fā)送給幾個人甚至幾十個人,一條條操作是很麻煩的。下面,讓我們來建立用戶組,實(shí)現(xiàn)短消息群發(fā)的功能。 五、實(shí)現(xiàn)短消息群發(fā)功能建立S_Group.asp頁面,在這個頁面中,我們需要有增加組、刪除組和給組內(nèi)用戶發(fā)消息的鏈接等功能。先建立框架,準(zhǔn)備好動態(tài)數(shù)據(jù)存放的位置。如圖10所示。 ![]() 建立記錄集獲得屬于當(dāng)前登錄用戶自己的組信息,各項(xiàng)設(shè)置如圖11所示,它與前面建立的操作基本一樣,這里不再說明。
![]() 將“SMG”記錄集中的“組名”和“組成員”綁定到頁面,然后選擇該行使用“Repeat Region”(重復(fù)區(qū)域)服務(wù)器行為,注意在出現(xiàn)的對話框中設(shè)置顯示所有記錄,即選中“All record”項(xiàng)。
接下來的操作與前面發(fā)送消息頁面一樣,使用“Application”中的“Record Insertion Form Wizard”插入記錄表單,在出現(xiàn)的對話框中設(shè)置: Connection:smail。 Insert into table:好友組信息表。 After inserting, go to:S_Group.asp。 在“Form fields”中,我們刪除“ZID”字段,保留其余3個。“組名”和“組成員”使用默認(rèn)的屬性即可,對“組屬于”字段的“Display as”屬性設(shè)定為“Hidden field”(隱藏域),“Default value”屬性設(shè)為“<%=Session(″MM_Username″)%>”表示從該好友組屬于當(dāng)前登錄用戶。 完成后表單上注明在輸入“組成員”文本框中用戶名之間需要用半角逗號分隔,這主要是為了后面對每個用戶發(fā)送消息時,讓程序知道如何區(qū)別用戶名。接下來,我們需要實(shí)現(xiàn)刪除記錄的功能,選擇“刪除”文字綁定鏈接: S_Group.asp?DELID=<%=(SMG.Fields.Item("ZID").Value)%> 上述代碼表示,鏈接到本頁并傳遞“DELID”參數(shù),而參數(shù)值由記錄集中的“ZID”獲得。 刪除數(shù)據(jù)的代碼還是由Command來實(shí)現(xiàn),操作方法與前面一樣,不過這次是刪除記錄的操作所以其中的“Type”應(yīng)該選擇“Delete”,完成后同樣需要進(jìn)行合并和移動到頁面前端。下面給出Command中的SQL代碼以及合并后的程序代碼: SQL代碼: DELETE FROM 好友組信息表 WHERE ZID = MM_ID 合并修改后的代碼: <% If (Request.QueryString("DELID") <> "") Then DelCommand__MM_ID = Request.QueryString("DELID") set DelCommand = Server.CreateObject("ADODB.Command") DelCommand.ActiveConnection = MM_Smail_STRING DelCommand.CommandText = "DELETE FROM組信息表 WHERE ZID = " + Replace(DelCommand__MM_ID, "‘", "‘‘") + "" DelCommand.CommandType = 1 DelCommand.CommandTimeout = 0 DelCommand.Prepared = true DelCommand.Execute() Response.Redirect "S_Group.asp" End If %> 最后在組名上做好鏈接到發(fā)送消息頁面的鏈接: S_Mail.asp?ALL=<%=(SMG.Fields.Item("組成員").Value)%> 這里表示通過組名鏈接到發(fā)送消息的頁面并且傳遞參數(shù)“ALL”,參數(shù)值由記錄集的“組成員”獲得,也就是傳遞一個由多個用戶名組成且以英文逗號分隔的字符串。完成頁面如圖12所示。
![]() 1.修改S_Mail.asp頁以適合群發(fā)消息首先獲得S_Group.asp頁傳遞過來的組成員信息,單擊收件人的文本框,在“Properties”屬性面板→“Init val”初始值中填入: ?。?= Request.QueryString("ALL") %> 表示收件人文本框值可以由URL參數(shù)“ALL”來獲得。 選擇“Command”,如圖13設(shè)置建立名稱為“Command1”的插入記錄命令(Command): ![]() 自己建立的變量運(yùn)行值都是要一一對應(yīng)頁面上的文本框名。確定后轉(zhuǎn)到源碼視窗可以找到以下代碼:
?。? if(Request.Form("Element") <> "") then Command1__MM_Send = Request.Form("Element") if(Request.Form("Element3") <> "") then Command1__MM_Mail = Request.Form("Element3") if(Request.Form("Element5") <> "") then Command1__MM_Take = Request.Form("Element5") %> ?。? set Command1 = Server.CreateObject("ADODB.Command") Command1.ActiveConnection = MM_smail_STRING Command1.CommandText = "INSERT INTO 短消息內(nèi)容表 (發(fā)件人, 消息內(nèi)容, 收件人) VALUES (‘" + Replace(Command1__MM_Send, "‘", "‘‘") + "‘,‘" + Replace(Command1__MM_Mail, "‘", "‘‘") + "‘,‘" + Replace(Command1__MM_Take, "‘", "‘‘") + "‘ ) " Command1.CommandType = 1 Command1.CommandTimeout = 0 Command1.Prepared = true Command1.Execute() %> 修改成以下代碼并放在頁面頂部就可以根據(jù)多用戶來發(fā)送消息了。 ?。? If (CStr(Request("MM_insert")) = "form1") Then DIM Str_Take Str_Take = (Request.Form("Element5")) If (InStr((Str_Take),",") > (0)) Then If (Right(Str_Take,1)) = "," Then Str_Take = StrReverse(Replace(StrReverse(Str_Take),",","",1,1)) if(Request.Form("Element") <> "") then Command1__MM_Send = Request.Form("Element") if(Request.Form("Element3") <> "") then Command1__MM_Mail = Request.Form("Element3") For EACH Command1__MM_Take IN (Split(Str_Take,",")) set Command1 = Server.CreateObject("ADODB.Command") Command1.ActiveConnection = MM_Smail_STRING Command1.CommandText = "INSERT INTO 短消息內(nèi)容表 (發(fā)件人, 消息內(nèi)容, 收件人) VALUES (‘" + Replace(Command1__MM_Send, "‘", "‘‘") + "‘,‘" + Replace(Command1__MM_Mail, "‘", "‘‘") + "‘,‘" + Replace(Command1__MM_Take, "‘", "‘‘") + "‘) " Command1.CommandType = 1 Command1.CommandTimeout = 0 Command1.Prepared = true Command1.Execute() NEXT Response.Redirect "S_Send.asp" End If End If %> 以上代碼看起來好像很復(fù)雜,其實(shí)分解一下就很容易理解了,下面對添加的語句逐條說明: ?。? If (CStr(Request("MM_insert")) = "form1") Then 因?yàn)樘峤挥涗浀谋韱问怯蒁reamweaver自動生成,表單中會存在一個名為“MM_insert”隱藏域,值包含提交的表單名,所以這里以變量“MM_insert”是否存在來判斷表單是否提交,如果變量值等于“form1”那么表示表單已經(jīng)被提交,繼續(xù)執(zhí)行下面的代碼: DIM Str_Take 聲明變量Str_Take Str_Take = (Request.Form("Element5")) 設(shè)置變量Str_Take從表單參數(shù)中獲得收件人的值 If (InStr((Str_Take),",") > (0)) Then 利用InStr函數(shù)獲得半角逗號字符在收件人變量中的位置,如果大于0表示存在該字符,也就是說明該信息是多用戶收取的,那么繼續(xù)執(zhí)行下面的代碼: 注意:下面做的一步是判斷用戶名后是否存在多余的半角逗號字符,因?yàn)樾稳?#8220;用戶1,用戶2,”這樣的字符串在后面數(shù)組分隔中會認(rèn)為是三個用戶從而多出一條收件人為空的記錄,所以要作下面一個去除操作。 If (Right(Str_Take,1)) = "," Then Str_Take = StrReverse(Replace(StrReverse(Str_Take),",","",1,1)) 如果收件人變量中右起第一個字符為半角逗號字符那么先用StrReverse函數(shù)將字符串的字符順序顛倒過來,再利用Replace函數(shù)從第一個字符開始搜索半角逗號,搜索到后替換成空值并且只替換一次,最后再將該字符串順序顛倒回來。上來描述得好像有些復(fù)雜,其實(shí)就是將形如“用戶1,用戶2,”這樣的字符串最后一個半角逗號去除。 if(Request.Form("Element") <> "") then Command1__MM_Send = Request.Form("Element") if(Request.Form("Element3") <> "") then Command1__MM_Mail = Request.Form("Element3") 上面使用Command代碼獲得發(fā)件人和短消息內(nèi)容,還有一個獲得收件人信息的代碼已經(jīng)用變量Str_Take替代了。 For EACH Command1__MM_Take IN (Split(Str_Take,",")) 利用Split函數(shù)以半角逗號將收件人變量分隔存入數(shù)組,使用數(shù)組循環(huán)語句進(jìn)行插入記錄代碼的循環(huán)。 set Command1 = Server.CreateObject("ADODB.Command") Command1.ActiveConnection = MM_Smail_STRING Command1.CommandText = "INSERT INTO dbo.短消息表 (發(fā)件人, 消息內(nèi)容, 收件人) VALUES (‘" + Replace(Command1__MM_Send, "‘", "‘‘") + "‘,‘" + Replace(Command1__MM_Mail, "‘", "‘‘") + "‘,‘" + Replace(Command1__MM_Take, "‘", "‘‘") + "‘) " Command1.CommandType = 1 Command1.CommandTimeout = 0 Command1.Prepared = true Command1.Execute() 以上Command插入代碼不變。 NEXT 數(shù)組中的循環(huán)結(jié)束后跳出循環(huán)。 Response.Redirect "S_Send.asp" 完成插入后前往發(fā)件箱頁面查看剛剛發(fā)送的短消息。 End If End If %> 以上操作完成后頁面會根據(jù)是收件人的信息來決定由哪段代碼來進(jìn)行插入操作,不過其結(jié)果是一樣的都是在數(shù)據(jù)庫中插入記錄。當(dāng)然你可以刪除以前的插入代碼而都使用現(xiàn)在的Command代碼來做到,這里就不講解了。圖14測試群發(fā)后轉(zhuǎn)到的發(fā)件箱頁面:
![]() 最后還有一個小問題,由于群發(fā)是根據(jù)半角逗號來區(qū)分用戶名的,所以用戶名的注冊需要屏蔽這個字符,可以在注冊時用個簡單的JS來避免。 先刪除“注冊”按鈕上已有的表單驗(yàn)證,然后在源碼窗口的<head></head>標(biāo)簽內(nèi)寫入以下JS語句: ?。約cript language="javascript"> ?。?-- function MM_CheckForm() { if (document.form1.Element.value.indexOf(‘,‘) != -1||document.form1.Element.value == ""||document.form1.Element2.value == "") { alert("用戶名和密碼不可為空\n用戶名不可包含“,”字符"); return false ; } } //--> </script> 代碼表示當(dāng)用戶名和密碼文本框輸入為空時或者用戶名文本框內(nèi)包含了“,”半角逗號標(biāo)記時,表單不可提交,并彈出消息框進(jìn)行提示。 然后在提交表單的“注冊”按鈕上修改代碼成為如下: ?。糹nput name="Submit" type="submit" onClick="return MM_CheckForm(this.form);" value="注冊"> 完成后你可以在頁面上測試一下這個JS可以是否成功提示錯誤信息,另外提醒一下不要忘了將“Restrict.asp”限制訪問的代碼加入到需要登錄頁面的每個頁面頂部。 現(xiàn)在的新消息提醒設(shè)定是在登錄Index.asp頁時顯示文字,你也可以改成圖片或者聲音提示,并且將代碼存成一個頁面在其它頁中調(diào)用,加上設(shè)定自動刷新時間,如此就可以隨時都獲得短消息了。 系統(tǒng)的開發(fā)是具有多樣性的,你可以根據(jù)需要來實(shí)現(xiàn)不同的功能,前提就是明確需求、理清思路,然后再動手。 最后要說的是雖然Macromedia公司給我們提供了強(qiáng)大的視窗操作界面,不過對于開發(fā)完整、靈活的系統(tǒng)不熟悉代碼還是不行的,我們主張?jiān)贒reamweaver MX 2004的界面下構(gòu)建網(wǎng)頁框架和大致的程序代碼,對于細(xì)節(jié)上的還是多修改源碼和做好注釋,否則滿地的找插件也解決不了你的問題。 |
|
|