当我们登录到某些论坛或社区时,在页面中会出现“短消息”提示对话框,用于提醒登录用户查收、管理站务短消息。该系统即为网站短消息系统。它主要用于网站管理员发送站务管理信息,和注册用户好友之间的相互联系、沟通。本文将以Dreamweaver MX 2004为基础,结合Access 2003后台数据库,实现一个完整的网站短消息系统。让你的网站更加丰富多采,个性化十足。
一、短信系统分析与开发准备1.短信系统功能说明(1)因为短消息系统必须存在于要求登录会员系统中,所以需要一个简单的用户注册和登录。 (2)每位用户拥有属于自己的收件箱和发件箱。 (3)发送的消息在对方登录时应该获得提醒前去查阅。 (4)批量删除消息的功能(其实是不显示而已)。 (5)群发消息功能(可以对几个用户发出同样的消息)。 (6)用户可以自定义好友组。 2.建立Web共享为了可以在本机对所开发的Web程序进行测试、预览,我们需要在本地磁盘上对开发目录做“Web共享”操作。 (1)在Windows 2000/XP中,单击“开始→设置→控制面板”菜单项,在出现的对话框中双击“添加或删除程序”图标,在出现的对话框中单击“添加/删除Windows组件”按钮,然后在出现的对话框中单击“Internet信息服务”选项,单击“下一步”按钮,将Windows XP安装光盘置入光驱,即开始安装和配置“Internet信息服务”组件。安装完成,单击“完成”按钮即可。 注意:在Windows 98中,需要安装PWS(Personal Web Server,个人Web服务)。 (2)在本地磁盘上建立目录“Smail”,如C:\smail,用于存放“短消息系统”所有的文件。 (3)右键单击该目录,在出现的菜单中选择“属性”命令,在出现的对话框中单击“Web共享”选项卡,单击“共享这个文件夹”选项,然后在出现的对话框中单击“目录浏览”选项即可。 完成后你可以通过http://localhost/Smail来访问存在于该目录中的文件。 3.数据库设计这里,我们使用Access 2003作为站点的后台数据库,在前面建立的“Smail”目录中建立一个名字为“Smail”的数据库,根据需要的功能,我们在库中建立3个数据表。 (1)用户信息表:需要用户登录自然要有存储用户信息的数据表,下面是一个简单的用户信息表结构。
注意:在设计完“用户信息表”后直接在表中加入了一些用户名作为系统开发过程中测试使用。 (2)短消息内容表:用于存放短消息的内容以及相关信息。
(3)好友组信息表:由于希望实现方便的群发功能,因此创建该表用来记录用户常用的发件对象集合。
二、在Dreamweaver MX 2004中建立站点1.建立站点(1)启动Dreamweaver MX 2004,在欢迎页面上单击“Dreamweaver Site…”(Dreamweaver站点)选项,启动创建站点向导。 (2)在“Basic”(基本)模式下建立站点,首先输入站点名称“短消息系统”。单击“Next”按钮。 (3)在出现的对话框中,询问当前站点使用何种动态网页技术开发。单击“Yes,I want to......”选项,然后选择“ASP VBScript”选项。单击“Next”按钮。 (4)在出现的对话框中,询问对测试文件存放、预览等选项,一般我们均在本地测试系统,这里选择前面建立的目录即可,如C:\smail。单击“Next”按钮。 (5)在出现的对话框中,询问当前站点的测试路径,我们按照先前定义的“Web共享”目录名输入“http://localhost/Smail/”后单击“Test URL”(测试URL)按钮,系统提示通过测试,单击“确定”按钮。单击“Next”按钮。 (6)在出现的对话框中,询问你完成后的页面是否及时更新到其他机器中,该选项主要针对团队开发设立,让你的同事可以随时了解你开发过程中的改动,单击“No”选项。单击“Next”按钮。 (7)在出现的对话框中,显示站点定义完毕的一些信息,直接单击“Done”(完成)按钮,完成“Smail”站点的建立。 2.建立数据源链接在Dreamweaver中进行动态网页开发,必须先要与数据库链接。在欢迎窗口上选择“ASP VBScript”选项创建一个新文件。单击“Application”(应用程序)工作面板,单击“Database”(数据库)选项卡,然后单击“+”按钮,选择“Custom Connection String”(自定义连接字符串)命令,在出现的对话框中进行链接设置。其中: “Connection name”(连接名称):Smail。 “Connection string”(连接字符串): Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Smail\smail.mdb。 注意:这里的数据源位置C:\Smail\smail.mdb,即是你前面存放数据库的位置,需要根据你自己的具体情况修改。 “Dreamweaver should connect”(Dreamweaver应连接):Using driver on this machine(使用本地计算机上的驱动程序)。 完成后单击“Test”(测试)按钮,如果链接成功则会出现“Connection was made successfully”提示对话框。 3.决定系统必要的文件和操作根据需要的功能,我们必须先设定好需要开发的页面及其相应的功能。 (1)用户注册、登录以及必要的信息提示。包括: Default.asp(用户登录页)、Login.asp(新用户注册页)、LoginError.asp(新用户注册重名提示页)、Error.asp(登录错误后转向的错误提示页)、Restrict.asp(限制未登录用户访问的代码页)等。 (2)实现短消息收发的主体文件。包括: Index.asp(登录正确后转向的首页)、S_Take.asp(用户的收件箱页面)、S_Send.asp(用户的发件箱页面)、S_Mail.asp(用户发送短消息的页面)、S_Group.asp(用户自定义组的页面)等。 (3)对必要的细节进行修改。包括: 修改S_Mail.asp页以适合群发消息、修改Login.asp页屏蔽“,"字符等操作。 三、用户注册、登录以及必要的信息提示1.Default.asp:用户登录页凡是涉及用户概念的系统免不了都需要制作注册和登录等页面。 (1)新建Default.asp页面,在页面内设计一个登录表单,如图1所示。在Properties(属性)面板中设置文本框名分别为“username”和“password”,其中“password”文本框的“Type”类型设置为“password”。 ![]() (2)单击“Application”(应用程序)工作面板,单击“Server Behaviors”(服务器行为)选项卡,单击“+”按钮,选择“User Authentication”(用户身份验证)选项,在出现的菜单中选择“Log In User(登录用户)”命令,在出现的对话框中进行如下设置:
Get input from form(从表单获取输入):因为页面只有一个表单,所以默认即为“form1”。 Username field(用户名字段):username。对应用户名的文本框username。 Password field(密码字段):password。对应密码的文本框password。 Validate using connection(使用连接验证):使用我们已经建立的“smail”。 Table(表格):用户信息表。 Username column(用户名列):用户名。 Password column(密码列):密码。 If login succeeds, go to(如果登录成功,转到):index.asp。 Go to precious URL (if it exists)(转到前一个URL(如果它存在)):选中。这是一个比较实用的选项,比如你在页面A使用了“Restrict Access To Page”限制对页访问的服务器行为后,该页面需要用户登录后才可访问,而用户没有经过登录直接链接到页面A,那么就会被转到default.asp页要求登录。选中该选项,在登录完成后则不前往index.asp页,而是直接转向页面A。 If login fails, go to(如果登录失败,转到):Error.asp。 Restrict access based on(基于以下项限制访问):Username and password。这里可以设置你的登录是否还需要用户等级概念,如果需要则选择“Username, password, and access level”(用户名、密码和访问级别)选项,并且在“Get level from”(获取级别自)选项中选择从哪个字段来获得等级标准。设置完毕后即完成登录验证。 这里简要的说明一下登录验证的原理,我们分析源码后可以得知该页是根据用户名、密码与数据库中“用户信息表”的匹配来决定登录的用户是否为合法用户,从而产生一个名为“MM_Username”的Session变量,只要合法用户登录后并且在变量的生命周期内,这个变量就代表登录的用户名,如果你选择的是区分等级的用户登录,则还会有一个区别等级的Session变量“MM_UserAuthorization”。 (3)为了避免用户没有在表单内输入必要的信息就单击“登录”按钮,还需要对表单进行一个简单的验证。选中“登录”按钮,单击“Tag<input>”(<input>标签)工作面板(或按Shift+F3组合键),单击“Behaviors”(行为)选项卡,单击“+”按钮,选择“Validate Form”(检查表单行为)命令,在出现的对话框中,将两个文本框栏中的“Value”(值)选项设置为“Required”(必需的)选项,以进行必填验证。 (4)最后在登录页建立一个到Login.asp注册页的链接,完成该页。 2.Login.asp:新用户注册页(1)新建Login.asp页面,单击“Application”(应用程序)工作面板,单击“Server Behaviors”(服务器行为)选项卡,单击“+”按钮,选择“Insert Record”(插入记录)选项,在出现的菜单中选择“Record Insertion Form Wizard”(插入记录表单向导)命令。在出现的对话框中进行设置: Connection(连接):smail。 Insert into table(插入到表格):用户信息表。 After inserting, go to(插入后,转向):default.asp。 在选择需插入的数据表后,Dreamweaver会将该数据表中的所有字段都显示在“Form fields”(表单字段)列表内供选择设置。我们在这里需要选中“UID”项,然后单击“-”按钮将其删除(因为该字段是自动编号类型的,不可插入)。选中用户名时,在对话框下方的项目中将出现默认的值,你可以对其进行修改: Label(文本):对应选中字段在页面中显示的文本。 Display as(显示为):对应选中字段在页面中出现供插入数据的控件。 Submit as(提交为):对应选中字段提交的数据类型。 Default value(默认值):插入数据的控件上显示的默认值。在这里我们按下表设定:
完成后确定返回,页面上会自动插入表单和输入数据用的控件。 (2)对生成的表单进行简单修改后,我们需要作避免相同用户名注册的操作。单击“Application”(应用程序)选项卡,单击“User Authentication”(用户身份验证)按钮,在出现的菜单中选择“Check New Username”(检查新用户名)命令,在出现的对话框中进行设置: Username field(验证用户名):因为输入姓名的文本框控件是由服务器行为自动生成的,所以选择对应用户名的文本框控件名“Element”。 If already exists, go to(如果输入的用户名已经存在,转向):LoginError.asp。 完成设定后返回,最后需要对表单输入做必填验证,该操作与Default.asp页面的表单验证一样,这里不作过多说明。 3.LoginError.asp:新用户注册重名提示页该页是在注册新用户时,遇到重名后转向的提示页,所以只需要在页面上输入提示信息,并给出返回注册页的链接即可。 新建LoginError.asp页面,单击“Application”(应用程序)工作面板,单击“Binding”(绑定)选项卡,单击“+”按钮选中“Request Variable”(请求变量)选项,在出现的对话框中进行设置: Type(类型):Request.QueryString,即URL变量。 Name(名称):RequserName。该变量名由Login.asp页面中“Check New Username”服务器行为创建,当注册的用户名重复时,该行为将输入值命名为“RequserName”,通过URL传递到LoginError.asp页,这里只是做了一个承接的作用。 完成后将该变量拖入到页面相应位置即可。如图2所示。
![]() 该错误提示页面主要是登录错误而转向的页面,在页面上说明并加上重新转到Default.asp页登录的链接即可。 5.Restrict.asp:限制未登录用户访问的代码页在制作Login.asp页面时已经讲到,用户登录系统后会自动创建Session变量“MM_Username”,那么只要在该变量内检查到它的存在就可以认为用户已经成功登录了。现在我们创建一段检查该变量的代码,然后将代码置入需要登录才可访问的页面中就可以限制未登录用户的访问了。 (1)新建Restrict.asp页面,单击“Application”(应用程序)工作面板,单击“Server Behaviors”(服务器行为)选项卡,单击“+”按钮,选择“User Authentication”(用户身份验证)选项,在出现的菜单中选择“Restrict Access To Page”(限制对页的访问)命令,在出现的对话框中进行设置: Restrict based on(验证包括的项目):Username and password,仅验证用户名和密码。 If access denied, go to(如果拒绝访问,则转向):Default.asp。 (2)完成设定后我们转到源代码窗口,因为此页面将被包含到其他页面,所以这里只需要“Restrict Access To Page”生成的ASP代码即可,而其他的都可以删除。 首先删除<%@LANGUAGE=″VBSCRIPT″ CODEPAGE=″936″%>一句。然后删除ASP代码以后的全部HTML代码,完成后即可存盘。 其实,你也可以在每个页面都使用这个“Restrict Access To Page”来为登录用户限定访问,不过为了代码的简洁、易懂,可以将常用代码存为一页,然后使用包含页的方法来置入到所有登录后才能访问的页面中。你只需要在页面源码窗口顶部加入代码即可。 四、实现短消息收发的主体文件1.S_Take.asp:用户的收件箱页面该页为收件箱页面,任何发送给登录用户的消息都可在此浏览。收件箱根据用户登录后的“Session”变量在“短消息内容表”的“收件人”字段中比对,符合的就属于该用户的收件箱。 (1)新建S_Take.asp页面,在页面建立静态元素,如图3所示。 ![]() 其中,“发送消息”链接到S_Mail.asp页面;“发件箱”链接到S_Send.asp页面;“管理组”链接到S_Group.asp页面。
(2)单击“Application”(应用程序)工作面板,单击“Binding”(绑定)选项卡,单击“+”按钮选中“Recordset(Query)”(记录集)选项,在出现的对话框中建立记录集: Name(名称):SM1。 Connection(连接):smail。 Table(数据表):短消息内容表。 Columns(字段):All。 Filter(过滤条件):收件人、=、Session Variable、MM_Username。 Sort(排序):SID、Descending。 完成前面的设定后,单击“Advanced”(高级)按钮,在出现的对话框中的“SQL”区域中添加过滤代码“AND 收件显示 = True”,然后修改代码为: SELECT * FROM 短消息内容表。 WHERE 收件人 = ‘MMColParam‘ AND 收件显示 = True ORDER BY SID DESC 该代码表示记录集筛选的不只是收件人,并且“收件显示”字段值必须为True,这样做是为了在后面可以过滤已经删除的消息。单击“确定”按钮完成记录集建立。 (3)在“Application”工作面板中单击“Binding”(绑定)选项卡,单击“+”按钮,选择“Session Variable”(创建变量)选项,在出现的对话框中设置“Name”值为“MM_Username”,在站点中建立一个Session变量,该类型变量在你站点内的任何以登录页面上都可以使用。使用时只需要选择需要替换的文字后单击“insert”按钮即可。 选择页面上的“某某人”文字,然后选择该变量后单击“insert”按钮,用户登录后的名字就可在此显示出来。 (4)在“Application”工作面板中单击“Binding”(绑定)选项卡,然后将记录集“SM1”展开,拖动动态数据到相应的页面位置,对于复选框设定“Name”为“DELID”,将动态数据“SID”绑定到“Checked Value”项目中。然后选择动态数据所在的行,应用“Server Behavior”下的“Repeat Region”(重复区域)服务器行为,在出现的对话框中选择“SM1”记录集和默认每页显示10条记录,完成后如图4所示。 ![]() (5)增加翻页链接。单击“Application”(应用程序)工作面板,单击“Server Behaviors”(服务器行为)选项卡,单击“+”按钮,选择“Recordset Paging”(记录集翻页)选项,在出现的菜单中选择“Recordset Navigation Bar”(记录集导航条)选项,在出现的对话框中设置“Recordset”(记录集)为“SM1”,“Display using”(显示方式)为“Text”,单击“确定”按钮即可在页面当前位置插入前后的翻页链接。
(6)增加删除信息的Command。前面说过,当你不需要收件箱中的某条消息时,应该将其删除(其实是不显示而已)。在“Application”工作面板中单击“Binding”(绑定)选项卡,单击“+”按钮,选中“Command(Store Procedure)”(存储过程)选项。在出现的对话框中设置建立名称为“Command1”的命令。其中“SQL”域和“Variables”变量域中的代码表示由表单获得“DELID”参数放入变量“MM_DEL”,然后根据该变量来修改“短消息内容表”中的“收件显示”字段值为False。确定后转到“代码”窗口,找到以下两段代码: 代码段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 短消息内容表 SET 发件显示 = False WHERE SID in (" + Replace(Command1__MM_Del, "‘","‘‘") +")" Command1.CommandType = 1 Command1.CommandTimeout = 0 Command1.Prepared = true Command1.Execute() %> 上述两段代码是刚才Command操作产生的,我们需要修改一下后放在其他代码的上方,让其在打开该页面时首先执行该段代码。 <% 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 短消息内容表 SET 发件显示 = 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 %> 修改后的代码表示,如果表单参数“DELID”不为空,那么就根据“SID”字段决定哪些记录需要修改“收件显示”字段为False,完成后重新加载该页,否则就跳过该段修改代码。 提交表单还需要设置“Action”(动作)为提交到本页“S_Take.asp”;数据传递“Method”模式为“GET”,表示从URL传递参数。 (7)增加阅读消息时间的Command。当有消息到达时,你必须要将当前时间写入到“收件时间”字段中。我们可以在页面上再加一个Command,将属于登录用户并且“收件时间”为空的记录都写入当前时间。你可以按照上述方法在对话框中设置Command,“SQL”区域代码如下: UPDATE 短消息内容表 SET 收件时间 = Now() WHERE 收件人 = ‘MM_name‘ and 收件时间 is null 变量“MM_name”由Session变量“MM_Username”获得,它与建立“SM1”记录集是一样的,然后在源码窗口中整合代码,将其移动到记录集的结束代码段: <% 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 短消息内容表 SET 收件时间 = Now() WHERE 收件人 = ‘" + Replace(UpCmd__MM_name, "‘", "‘‘") + "‘ and 收件时间 is null " UpCmd.CommandType = 1 UpCmd.CommandTimeout = 0 UpCmd.Prepared = true UpCmd.Execute() %> 该代码表示将当前登录用户的Session变量存入“UpCmd_MM_name”变量,根据当前用户和收件时间为空的记录来修改“收件时间”等于当前时间。 经过以上步骤,完成收件箱页面的制作。 2.S_Send.asp:用户的发件箱页面发件箱保留所有的发送信息,实现原理和收件箱基本相同,下面简单介绍其实现方法。 (1)建立静态页面。其结构与S_Take.asp页面类似,这里的“阅读”是指显示当收件人阅读这条消息的时间。如图5所示。 ![]() (2)建立发件记录集“SM1”并绑定到页面。记录集建立如图6所示,表示只显示当前用户自己的并且“发件显示”字段为“True”的消息,以序号“SID”的降序排列。
![]() (3)绑定记录到页面。如上述操作,依次绑定动态数据到页面上,复选框“DELID”绑定“SID”动态记录;使用“Repeat Region”(重复区域)服务器行为和“Recordset Navigation Bar”(记录集导航条)即可。
提交表单与上述设置相同,,设置“Action”为提交到本页“S_Send.asp”,“Method”为“GET”。完成后如图7所示。 ![]() (4)增加修改信息为在发件箱不显示的Command。该Command的建立与前面介绍的S-Take.asp页面方法大致一样(读者可参看前文讲述),你只要拷贝前面的代码,无须在对话框中设置。代码如下:
<% 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 短消息内容表 SET 发件显示 = 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 用户发送短消息的页面该页面为发送消息的页面,需要在数据库中插入收件人、消息内容和发件人信息。 单击“Application”(应用程序)工作面板,单击“+”按钮,选择“Insert Record”(插入记录)选项,在出现的菜单中选择“Record Insertion Form Wizard”(插入记录表单向导)命令。在出现的对话框中进行设置。 Connection(连接):smail。 Insert into table(插入到表格):短消息内容表。 After inserting, go to(插入后,转向):S_Send.asp。 在“Form fields”(表单字段)列表我们只保留需要插入记录的字段,其他字段选择后单击“-”按钮删除。另外对“消息内容”字段的“Display as”属性设定为“Text atea”,对“发件人”字段的“Default value”属性设为“<%=Session(″MM_Username″)%>”,表示从Session变量直接获取,其他的一些设置如前述操作。 完成插后在页面上加入一些链接信息即可。如图8所示。
![]() 该页面为用户登录正确的转向页,短消息系统作为论坛或者社区中的一个模块,在该页面只需要存在链接,如果有新的消息到达即出现提醒信息即可。 首先,你需要建立记录集判断用户是否有新的消息到来。该判断很简单,在数据库中过滤“收件人”属于当前用户并且“收件时间”为空的记录,如果存在这样的记录,那么显示提示信息。记录集建立如图9所示。 ![]() 完成后,在页面上添加提示有新消息的文字并做好到S_Take.asp页的链接,在选择该行文字后使用“Application”(应用程序)工作面板中“Show Region”(显示区域)选项卡中的“Show If Recordset Not Empty”(如果记录集不为空显示区域)服务器行为。
在出现的对话框中选择“Recordset”记录集为“SM1”,完成后确定返回页面。这样,当你登录到该页,如果数据库中存在收件人为用户本人,并且“收件时间”还为空的信息,那么记录集就会返回记录,你的提示信息就会显示在页面上。 经过上述操作,短消息系统已经可以正常运行了,不过对于论坛或者社区的管理员来说,有时需要把一条消息同时发送给几个人甚至几十个人,一条条操作是很麻烦的。下面,让我们来建立用户组,实现短消息群发的功能。 五、实现短消息群发功能建立S_Group.asp页面,在这个页面中,我们需要有增加组、删除组和给组内用户发消息的链接等功能。先建立框架,准备好动态数据存放的位置。如图10所示。 ![]() 建立记录集获得属于当前登录用户自己的组信息,各项设置如图11所示,它与前面建立的操作基本一样,这里不再说明。
![]() 将“SMG”记录集中的“组名”和“组成员”绑定到页面,然后选择该行使用“Repeat Region”(重复区域)服务器行为,注意在出现的对话框中设置显示所有记录,即选中“All record”项。
接下来的操作与前面发送消息页面一样,使用“Application”中的“Record Insertion Form Wizard”插入记录表单,在出现的对话框中设置: Connection:smail。 Insert into table:好友组信息表。 After inserting, go to:S_Group.asp。 在“Form fields”中,我们删除“ZID”字段,保留其余3个。“组名”和“组成员”使用默认的属性即可,对“组属于”字段的“Display as”属性设定为“Hidden field”(隐藏域),“Default value”属性设为“<%=Session(″MM_Username″)%>”表示从该好友组属于当前登录用户。 完成后表单上注明在输入“组成员”文本框中用户名之间需要用半角逗号分隔,这主要是为了后面对每个用户发送消息时,让程序知道如何区别用户名。接下来,我们需要实现删除记录的功能,选择“删除”文字绑定链接: S_Group.asp?DELID=<%=(SMG.Fields.Item("ZID").Value)%> 上述代码表示,链接到本页并传递“DELID”参数,而参数值由记录集中的“ZID”获得。 删除数据的代码还是由Command来实现,操作方法与前面一样,不过这次是删除记录的操作所以其中的“Type”应该选择“Delete”,完成后同样需要进行合并和移动到页面前端。下面给出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 %> 最后在组名上做好链接到发送消息页面的链接: S_Mail.asp?ALL=<%=(SMG.Fields.Item("组成员").Value)%> 这里表示通过组名链接到发送消息的页面并且传递参数“ALL”,参数值由记录集的“组成员”获得,也就是传递一个由多个用户名组成且以英文逗号分隔的字符串。完成页面如图12所示。
![]() 1.修改S_Mail.asp页以适合群发消息首先获得S_Group.asp页传递过来的组成员信息,单击收件人的文本框,在“Properties”属性面板→“Init val”初始值中填入: <%= Request.QueryString("ALL") %> 表示收件人文本框值可以由URL参数“ALL”来获得。 选择“Command”,如图13设置建立名称为“Command1”的插入记录命令(Command): ![]() 自己建立的变量运行值都是要一一对应页面上的文本框名。确定后转到源码视窗可以找到以下代码:
<% 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 短消息内容表 (发件人, 消息内容, 收件人) VALUES (‘" + Replace(Command1__MM_Send, "‘", "‘‘") + "‘,‘" + Replace(Command1__MM_Mail, "‘", "‘‘") + "‘,‘" + Replace(Command1__MM_Take, "‘", "‘‘") + "‘ ) " Command1.CommandType = 1 Command1.CommandTimeout = 0 Command1.Prepared = true Command1.Execute() %> 修改成以下代码并放在页面顶部就可以根据多用户来发送消息了。 <% 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 短消息内容表 (发件人, 消息内容, 收件人) 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 %> 以上代码看起来好像很复杂,其实分解一下就很容易理解了,下面对添加的语句逐条说明: <% If (CStr(Request("MM_insert")) = "form1") Then 因为提交记录的表单是由Dreamweaver自动生成,表单中会存在一个名为“MM_insert”隐藏域,值包含提交的表单名,所以这里以变量“MM_insert”是否存在来判断表单是否提交,如果变量值等于“form1”那么表示表单已经被提交,继续执行下面的代码: DIM Str_Take 声明变量Str_Take Str_Take = (Request.Form("Element5")) 设置变量Str_Take从表单参数中获得收件人的值 If (InStr((Str_Take),",") > (0)) Then 利用InStr函数获得半角逗号字符在收件人变量中的位置,如果大于0表示存在该字符,也就是说明该信息是多用户收取的,那么继续执行下面的代码: 注意:下面做的一步是判断用户名后是否存在多余的半角逗号字符,因为形如“用户1,用户2,”这样的字符串在后面数组分隔中会认为是三个用户从而多出一条收件人为空的记录,所以要作下面一个去除操作。 If (Right(Str_Take,1)) = "," Then Str_Take = StrReverse(Replace(StrReverse(Str_Take),",","",1,1)) 如果收件人变量中右起第一个字符为半角逗号字符那么先用StrReverse函数将字符串的字符顺序颠倒过来,再利用Replace函数从第一个字符开始搜索半角逗号,搜索到后替换成空值并且只替换一次,最后再将该字符串顺序颠倒回来。上来描述得好像有些复杂,其实就是将形如“用户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代码获得发件人和短消息内容,还有一个获得收件人信息的代码已经用变量Str_Take替代了。 For EACH Command1__MM_Take IN (Split(Str_Take,",")) 利用Split函数以半角逗号将收件人变量分隔存入数组,使用数组循环语句进行插入记录代码的循环。 set Command1 = Server.CreateObject("ADODB.Command") Command1.ActiveConnection = MM_Smail_STRING Command1.CommandText = "INSERT INTO dbo.短消息表 (发件人, 消息内容, 收件人) 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 数组中的循环结束后跳出循环。 Response.Redirect "S_Send.asp" 完成插入后前往发件箱页面查看刚刚发送的短消息。 End If End If %> 以上操作完成后页面会根据是收件人的信息来决定由哪段代码来进行插入操作,不过其结果是一样的都是在数据库中插入记录。当然你可以删除以前的插入代码而都使用现在的Command代码来做到,这里就不讲解了。图14测试群发后转到的发件箱页面:
![]() 最后还有一个小问题,由于群发是根据半角逗号来区分用户名的,所以用户名的注册需要屏蔽这个字符,可以在注册时用个简单的JS来避免。 先删除“注册”按钮上已有的表单验证,然后在源码窗口的<head></head>标签内写入以下JS语句: <script 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> 代码表示当用户名和密码文本框输入为空时或者用户名文本框内包含了“,”半角逗号标记时,表单不可提交,并弹出消息框进行提示。 然后在提交表单的“注册”按钮上修改代码成为如下: <input name="Submit" type="submit" onClick="return MM_CheckForm(this.form);" value="注册"> 完成后你可以在页面上测试一下这个JS可以是否成功提示错误信息,另外提醒一下不要忘了将“Restrict.asp”限制访问的代码加入到需要登录页面的每个页面顶部。 现在的新消息提醒设定是在登录Index.asp页时显示文字,你也可以改成图片或者声音提示,并且将代码存成一个页面在其它页中调用,加上设定自动刷新时间,如此就可以随时都获得短消息了。 系统的开发是具有多样性的,你可以根据需要来实现不同的功能,前提就是明确需求、理清思路,然后再动手。 最后要说的是虽然Macromedia公司给我们提供了强大的视窗操作界面,不过对于开发完整、灵活的系统不熟悉代码还是不行的,我们主张在Dreamweaver MX 2004的界面下构建网页框架和大致的程序代码,对于细节上的还是多修改源码和做好注释,否则满地的找插件也解决不了你的问题。 |
|