第5章 文章的发布与管理
学习导读
文章的发布与管理是属于后台管理的一部分,是管理员操作的内容。网站的信息主要是通过文章来表现的,而大量文章的添加、修改、更新及删除必须要有一个统一的管理系统,这样才会使网站的管理更科学,网站的更新才会更容易。本章所要讲述的就是为管理者搭建一个文章管理平台,保证管理员快捷、高效地管理网站。
掌握新知:ASP脚本语言的基本用法和VBScript函数的应用。
操作重点:缩写各类表单、设计好数据库并建立连接和建立各页面间的联系。
难点把握:网页间传值及向数据库中添加数据。
做每一步前先有个规划,最好有个草图,添加数据时要一步一步测试,这样才是通向成功的最佳途径。
5.2 操作实录
每个网站都有大量的文章,网上的信息主要由这些文章发布出去。通过这一部分内容的学习,大家将会掌握文章发布和管理的基本方法。这一部分内容很重要,希望大家认真学习,不仅仅要掌握,而且要学会应用。下面我们先从网站管理入口讲起。
5.2.1 网站管理入口
网站中大量的文章是怎样添加、删除与更新的呢?如果手动向网页添加,每次都要对网页进行编辑,这个量是可想而知的,而且也增加了网站的管理难度。如果直接向数据库中输入,那么每更改一篇文章都要打开数据库,这既不科学,也缺少安全性。因此必须采用一种方法,使文章的添加、删除与更新更加简单,而且管理也更方便和科学。这就是要向大家介绍的文章发布与管理系统。从安全角度考虑,这个系统只有管理员才能进入,管理员可以对网站的信息进行处理:发表文章、修改文章、更新文章与删除文章。其他用户无权对文章进行处理。
文章管理页面的预览效果如图5-3所示。
|
| 图5-3 |
在文章管理系统中有添加文章、编辑文章、上传图片等功能,以后还将有不同版块的管理项添加到这里,使这个管理系统的功能更全面。单击不同的文字,将进入到不同的链接页面。为了减少网页的数量,可以把链接内容写在同一个页面中,只要传递的变量值不同,即可实现不同的编辑结果。
添加文章就是向数据库中写入数据。一般添加文章应该包括文章的标题、作者、类别、内容及发布时间等,这些内容是通过表单的提交写入数据库中的。所以在建立页面时一定要先设计好表格,再嵌入表单,通过表单填写数据,然后提交给下一个URL页面处理,完成向数据库写入数据。
根据前面的分析,首先要进入管理页面。管理页面的入口文件是admin.asp,其代码构成如下。
1.<body > 2.<!--#include file="include/up.htm"--> 3.<table align="center" cellpadding="0" bgcolor="#003300"cellspacing="0" height="550" 4.width="756"> 5.<tr><td height="50"></td></tr> 6.<tr> 7.<td colspan=4 align="center"><font size="5" color="#FFCC00" face="华文彩云 8." >网站管理入口</font></td> 9.</tr> 10.<tr> 11.<td colspan=4 align="center"><table width=200 align="center"> 12.<tr> 13.<td><hr align="center"></td> 14.</tr> 15.</table></td> 16.</tr> 17.<tr> 18.<td align="center"><a href="edit.asp?jhf=add" target="mody" >添加文章 19.</a></td> 20.<td align="center"><a href="edit.asp?jhf=edit" target="mody">编辑文章 21.</a></td> 22.<td align="center"><a href="edit.asp?jhf=photo" target="mody">上传图片 23.</a></td> 24.<td align="center"><a href="edit.asp?jhf=mody"target="mody" >修改留言 25.</a></td> 26.</tr> 27.<tr> 28.<td colspan="4"> 29.<table align="center" cellpadding="0" cellspacing="0" width="700" 30.height="400"> 31.<tr><td align="center" width="100%" height="100%"> 32.<iframe frameborder=0 width=100% height=100% scrolling=auto 33.src="edit.asp"name="mody"></iframe> 34.</td></tr> 35.</table> 36.</td> 37.</tr> 38.</table> 39.<!--#include file="include/down.htm"--> 40.</body>
|
代码释义:
当管理员单击添加文章或编辑文章的超链接时,将跳转到不同的页面。这个页面既可以重新打开一个新的窗口,也可以在本页内实现。作为网站管理,一般都是在本页内打开为宜。而且根据页面的构成来看,在本页内打开也最为合理。怎样才能在本页打开链接的页面呢?那就是建立一个内部框架,当单击不同的链接时,由于变量传递的值不同,即问号后面的值不同,可以显示不同的链接页面,也就会在框架内显示不同的内容,即起到对文章的管理效果。
第2和39行,是两个包含文件,即网页的头、脚文件。
第3~38行,这是一个大表格,在表格内嵌套了两个表格,即第11~15行和29~35行,这两个表格分别是加入的水平线及框架,嵌入表格能使所添加的内容易于确定位置。如果一时找不到位置,可多看几遍。
标记的就是一个表格。只要找到头尾,还是比较容易确定的。另外大家可以把草图画在纸上进行分析,这样就相对容易些。
第18~24行,这是该页的一个主体部分,即文字链接。每个链接的网页后都有参数,而且打开的目标均为target="mody",即内部框架内。
第32行,是一个内部框架,默认的源文件是edit.asp,即打开网页时显示的文字内容。那么,大家可能会有疑惑,因为添加或编辑等链接的都是同一个网页,为什么刚打开网页时却没有出现任何编辑或添加的内容,而是出现了一句文字呢?其实这就是在edit.asp页面的代码中进行了条件设置,也就是当没有参数传递,即刚打开该网页时,网页应该显示的效果。框架的名称为name="mody",只要其他网页所设置的目标是这个名称,那么该网页就可以在框架内打开。当需要在新的窗口打开时,可以把目标设为target="_blank"。
5.2.2 添加文章
文章的添加和编辑内容都写在了edit.asp网页中,首先看一下添加文章的实际效果,如图5-4所示。
 |
| 图5-4 |
前面已经分析了添加文章的具体思路,现在看预览的实际效果。不难发现,在添加文章的表单中包括了两个本文框、一个下拉列表框及一个多行文本框,另外还包括两个按钮,这两个按钮的代码即可以用一个单独的表格来写,也可以写在合并的单元格内(合并表格的列),中间采用空格的形式。根据这样的分析,在没有看代码的情况下,大家可以试着写一下,看看能不能达到实际的运行效果。其实学习的过程就是在这种分析、实践中不断提高的。
在edit.asp文件中,有关添加文章的代码如下。
1.<style> 2.Body{ 3.SCROLLBAR-FACE-COLOR:red; 4.SCROLLBAR-HIGHLIGHT-COLOR:blue; 5.SCROLLBAR-SHADOW-COLOR: green; 6.SCROLLBAR-ARROW-COLOR:yellow; 7.SCROLLBAR-BASE-COLOR:black; 8.SCROLLBAR-DARK-SHADOW-COLOR: white; 9.margin-left: 0px; 10.margin-top: 0px; 11.background-color: #003300; 12.} 13.textarea { 14.background-color: #006633; 15.} 16..jt2 { 17.background-color: #9999FF; 18.color: #006633; 19.font-weight: bold; 20.} 21.option { 22.background-color: #9999FF; 23.border:#006699; 24.border-style:double; 25.} 26.td { 27.font-size: 12px; 28.font-weight: bold; 29.color: #FF3300; 30.} 31.a:link { 32.text-decoration: none; 33.color: #0033FF; 34.} 35..cys { 36.border: thin dotted #00CCFF; 37.} 38.a:visited { 39.text-decoration: none; 40.color: #0000FF; 41.} 42.a:hover { 43.text-decoration: none; 44.color: #CCFF00; 45.} 46.a:active { 47.text-decoration: none; 48.color: #CCFF00; 49.} 50.--> 51.</style> 52.<!--#include file="include/conn.asp"--> 53.<% 54.dim jhf 55.jhf=request.QueryString("jhf") 56.if jhf="" then 57.%> 58.<table width="500" height="300" cellpadding="0" cellspacing="0" align= "center"> 59.<tr> 60.<td align="center"><b><font face="华文彩云" size="6"> 欢迎进入后台管理系 61.统! </font></b></td> 62.</tr> 63.</table> 64.<% 65.elseif jhf="add" then 66.%> 67.<table cellspacing=0 width="500" height="260" cellpadding=4 align="center"> 68.<form action="add.asp?jhf=add" method="post" name="aticle"> 69.<tr> 70.<td >文章标题:</td> 71.<td><input type="text" class="jt2" name="t_topic" size=20 /></td> 72.</tr> 73.<tr> 74.<td>文章作者:</td> 75.<td><input type="text" class="jt2" name="t_writer" size=20/></td> 76.</tr> 77.<tr> 78.<td>文章类别:</td> 79.<td><select name="t_leibie"> 80.<option value="青春诗行">青春诗行</option> 81.<option value="星光灿烂">星光灿烂</option> 82.<option value="事事关心">事事关心</option> 83.</select></td> 84.</tr> 85.<tr> 86.<td >文章内容:</td> 87.<td><textarea name="t_content" class="jt2" rows="10" 88.cols="35"></textarea></td> 89.</tr> 90.<tr> 91.<td colspan=2 align="center" ><input type="submit" class="jt2" value=" 提交"> 92. 93.<input type="reset" class="jt2" value="重置"></td> 94.</tr> 95.</form> 96.</table>
|
代码释义:
这是一个在内部框架中嵌入的网页,所以对网页无用的代码可全部删除,否则容易造成页面出现错误。这段代码整体上很长,根据传递的变量值不同,可以将它分成几个部分,这样再分析每一部分的代码就相对容易些。下面分别进行解释。
第1~51行,定义的样式表,在CSS中完成的。每部分的具体作用如下。
? 第3~8行,定义滚动条的颜色。
? 第3行,立体滚动条凸出部分的颜色。
? 第4行,滚动条空白部分的颜色。
? 第5行,立体滚动条阴影的颜色。
? 第6行,按钮上箭头的颜色。
? 第7行,滚动条的基本颜色。
? 第8行,立体滚动条强阴影的颜色。
关于这些颜色的设定及其实际效果,只有在制作过程中具体设置和浏览以后才能感知,不经过实践是很难想象其结果的。
第13~15行,定义文本框的背景。
第16~20行,定义了一个类,可以在任何标签中引用。
第38~48行,定义的链接效果,包括是否有下画线,以及链接的颜色等。
第54~59行,定义变量,并从上个网页中获取变量的值,这个值就是上一个网页问号后边的jhf的值。根据不同的值才能确定链接的是哪种处理文章的方式。如果是空,则说明刚进入登录文章管理页面,或者还没有单击过任何链接,这时就会显示一句话“欢迎进入后台管理系统”,即第60行的效果。
第65行的效果为当变量不为空时的几种情况。
第67~96行,文章的添加功能,其实就是一个嵌入在表格中的表单,具体内容如下。
? 第67行,定义一个表格,设置了表格的宽、高值,边框与内部空间的距离,对齐方式。
? 第68行,表单标记,设置了传递数据的方式,表单的提交网页及表单的名称。
? 第71行,定义文章标题输入框。
? 第75行,定义文章作者输入框。
? 第79~83行,定义下拉列表框。
? 第87~88行,定义文章内容输入框。
? 第91~93行,合并表格的列,并把表单的两个按钮放在合并的列中,这样的好处是,可以把它们放在表格的中间,如果它们之间的距离较近,可以采用添加空格的方法使它们隔开。
当与添加文章的有关内容填写完毕后,单击【提交】按钮,则将链接到add.asp页面(网页代码第68行)。add.asp页面要处理的工作是把刚刚写好的内容存入数据库中,因此要用到Insert into…values…where…语句。其代码构成如下。
1.<body> 2.<!--#include file="include/conn.asp"--> 3.<% 4.dim jhf,t_topic,t_writer,t_leibie,t_content 5.jhf=request.QueryString("jhf") 6.t_topic=request.form("t_topic") 7.t_writer=request.form("t_writer") 8.t_leibie=request.form("t_leibie") 9.t_content=request.form("t_content") 10.if jhf="add" then 11.sql="INSER TINTO mody 12.(t_topic,t_writer,t_leibie,t_content) 13.VALUES('"&t_topic&"','"&t_12writer&"','"&t_leibie&"','13"&t_content&"')" 14.conn.execute sql 15.%> 16.<script> 17.alert("操作成功!") 18.location.href="edit.asp?jhf=add"; 19.</script> 20.<%end if%> 21.</body>
|
代码释义:
第2行,包含数据库连接页面。
第4行,定义几个变量,用来获取表单中的信息。
第5~9行,变量分别获得由表单所传递过来的值。
第11~14行,向数据库中添加数据。添加数据时,要注意单、双引号及连接符的使用,其规则是字符型的变量一定要加定界符。
第16~19行,当数据存入数据库后,弹出一个窗口,这个窗口是用JavaScript写的,显示的是“操作成功!”。当单击【确定】按钮时,网页将返回到添加文章时的页面。
至此,文章的添加功能全部完成。
5.2.3 编辑文章
编辑文章包括编辑与删除两种功能。编辑文章与添加文章的不同之处在于:编辑文章要显示所编辑的内容,显示编辑内容则必须先从数据库中提取有关的内容,通过修改再次提交,这一次的提交是对数据库的更新;而删除文章则要传递文章的ID号,这样才能只删除目标文章。另外,当网站的文章较多时,为了便于编辑,必须采用分页形式来显示文章列表。
编辑文章页面的预览效果如图5-5所示。
 |
| 图5-5 |
在Dreamweaver中,打开admin.asp页面,代码的第97~117行如下所示。
97.<% 98.elseif jhf="edit" then 99.sql="select * from mody order by t_time desc" 100.rs.open sql,conn,1,1 101.%> 102.<table class="cys" cellpadding="0" cellspacing="10" width="600" align= "center"> 103.<% 104.do while not rs.eof 105.%> 106.<tr> 107.<td><%=rs("t_topic")%></td> 108.<td><%=rs("t_writer")%></td> 109.<td><%=rs("t_time")%></td> 110.<td><a href="renew.asp?id=<%=rs("id")%>">编辑</a></td> 111.<td><a href="del1.asp?id=<%=rs("id")%>">删除</a></td> 112.</tr> 113.<% 114.rs.movenext 115.loop 116.%> 117.</table>
|
代码释义:
第97~117行代码实现的是文章的编辑功能,既然是对文章的编辑,就要先把文章列出来,然后再进行修改或者删除。而列出文章就是从数据库中把文章提取出来,所以必然要用到SQL语句的查询功能,同时查询文章应该按降序排列,也就是越晚发表的文章,排列得越靠前,具体解释如下。
? 第99、100行,查询语句,从mody表中按t_time字段降序排列。
? 第102行,建立一个表格,把文章排列在表格中,便于控制位置。
? 第104~115行,建立一个循环,从表的开始部分查起一直到结尾,其中107~109行分别显示文章的标题、作者及发布时间;110和111行分别显示编辑及删除的链接,而且这两个链接分别进行了文章ID号的传递,这样就会有针对性地对文章进行编辑和处理。
在设计分析中已经提到过,当网站有多篇文章时,应该做成分页的形式,便于浏览,这时需要对上面的代码进行修改,修改后的代码如下。
1.elseif jhf="edit" then 2.dim pages 3.pages=request.QueryString("page") 4.if pages="" then 5.pages=1 6.end if 7.sql="select * from mody order by t_time desc" 8.rs.open sql,conn,1,1 9.rs.pagesize=8 10.if int(pages)>rs.pagecount then 11.pages=rs.pagecount 12.end if 13.if not rs.eof then 14.rs.absolutepage=int(pages) 15.end if 16.%> 17.<table class="cys" cellpadding="0" cellspacing="10" width="600" align= "center"> 18.<% 19.for i=1 to rs.pagesize 20.%> 21.<tr> 22.<td><%=rs("t_topic")%></td> 23.<td><%=rs("t_writer")%></td> 24.<td><%=rs("t_time")%></td> 25.<td><a href="renew.asp?id=<%=rs("id")%>">编辑</a></td> 26.<td><a href="del1.asp?id=<%=rs("id")%>">删除</a></td> 27.</tr> 28.<% 29.rs.movenext 30.if rs.eof then 31.exit for 32.end if 33.next 34.%> 35.<tr><td colspan="5" align="center" > 36.<%if int(pages)>1 then%> 37.<a href="edit.asp?page=1&jhf=edit"> 第一页</a> 38.<a href="edit.asp?page=<%=pages-1%>&jhf=edit"> 上一页</a> 39.<% end if%> 40.<% if int(pages)<rs.pagecount then%> 41.<a href="edit.asp?page=<%=pages+1%>&jhf=edit">下一页</a> 42.<a href="edit.asp?page=<%=rs.pagecount%>&jhf=edit">最后一页</a> 43.<% end if%> 44.</td></tr>
|
代码释义:
制作分页网页时,要了解分页的3个属性,即pagesize、pagecount、absolutepage,它们分别代表每页显示的数量、总的页数、当前页。因为分页效果是在查询语句里显示的,所以都应以rs.pagesize、rs.pagecount、rs.absolutepage形式来表示。其实分页就是对一个变量的判断,根据变量值的不同,分别显示第几页,而这个变量是从网页本身所传递的变量值获得的,每页显示的文章数则由pagesize来决定。
第2行,先定义一个变量,这个变量就是用来判断显示第几页的。
第3行,为变量赋值,这里的request.QueryString("page")是获取链接第几页时传递的变量值,比如第一页,则page=1。
第4、5行,当变量为空时,即刚进入页面时,还没有进行翻页,这时的页面定义为第一页。
第9行,定义每页显示的文章数,这里定义为8,即列出8行。
第10、11行,当页数大于总的页数时,让它等于总的页数。当页数大于1时,就会出现分页的效果,但如果单击下一页时,可以一直单击下去,当达到总页数时还可继续单击,很显然这是不对的,为此加上这一句进行判断处理,使页面更加准确。在书写程序代码时,要切记注意语句的严密性,否则就会出现意想不到的错误。
第13、14行,如果循环还没有到达尾部,则当前页即是现在获取的页。
第30~32行,如果遍历到末尾,则直接退出for循环。这条语句是很重要的,如果不加,就会出现错误。
第37~42行,显示分页页码,在什么情况下显示第一页、下一页、上一页及最后一页等。在此要特别注意的是,一定要加上jhf=edit变量,因为这是当jhf=edit的情况下显示的页面,所以必须传递这个变量,否则一经分页,这个变量就会失效,也就不能显示编辑页面了。
从上面的页面中可见,第25和26行又链接了两个页面,要对文章进行下一步的编辑处理,必须单击链接文字所链接的页面才能完成。编辑文章所链接的网页名称是renew.asp。在这个链接页面传递了一个变量id=<%=rs("id")%,这个变量很重要,只有确定了具体的文章ID号,才能对所选择的文章进行编辑,因为每个文章的ID是唯一的,所以获得了变量的值,也就获得了所编辑的文章。
当单击“编辑文章”超链接时出现的界面如图5-6所示。
 |
| 图5-6 |
图5-6是没加分页前的预览效果,加了分页后就会在文章显示列表下出现页码,如图5-7所示。
 |
| 图5-7 |
当单击“编辑”超链接时,则出现编辑文章页面,如图5-5所示。
在图5-5中显示了文章的标题、作者、类别及文章内容,对其修改后单击【提交】按钮,可以更新数据表中的信息,这样就可更新文章。其renew.asp页面的代码如下。
1.<style> 2.Body{ 3.SCROLLBAR-FACE-COLOR:red; 4.SCROLLBAR-HIGHLIGHT-COLOR:blue; 5.SCROLLBAR-SHADOW-COLOR: green; 6.SCROLLBAR-ARROW-COLOR:yellow; 7.SCROLLBAR-BASE-COLOR:black; 8.SCROLLBAR-DARK-SHADOW-COLOR: white; 9.margin-left: 0px; 10.margin-top: 0px; 11. background-color: #003300; 12.} 13.textarea { 14.background-color: #006633; 15.} 16..jt2 { 17.background-color: #9999FF; 18.color: #006633; 19.font-weight: bold; 20.} 21.option { 22.background-color: #9999FF; 23.border:#006699; 24.border-style:double; 25.} 26.td { 27.font-size: 12px; 28.font-weight: bold; 29.color: #FF3300; 30.} 31.a:link { 32.color: #0033FF; 33.text-decoration: none; 34.} 35.a:visited { 36.text-decoration: none; 37. color: #66FFFF; 38.} 39.a:hover { 40.text-decoration: none; 41.} 42.a:active { 43.text-decoration: none; 44.} 45.--> 46.</style> 47.<!--#include file="include/conn.asp"--> 48.<% 49.dim id 50.id=request.QueryString("id") 51.sql="select * from mody where id="&id 52.s.open sql,conn,1,1 53.%> 54.table align="center" cellpadding="0" bgcolor="#003300" cellspacing="0" 55.height="300" width="500"> 56.<form action="gengxin.asp?id=<%=id%>" method="post" name="aticle"> 57.<tr> 58.<td >文章标题:</td> 59.<td><input type="text" class="jt2" name="t_topic" value="<%=rs("t_topic")%>" 60.size=20 /></td> 61.</tr> 62.<tr> 63.<td>文章作者:</td> 64.<td><input type="text" class="jt2" name="t_writer" value="<%=rs ("t_writer")%>" 65.size=20/></td> 66.</tr> 67.<tr> 68.<td>文章类别:</td> 69.<td><select name="t_leibie"> 70.<option value="青春诗行" <%if rs("t_leibie")="青春诗行" then 71.response.write "selected" end if%>>青春诗行</option> 72.<option value="星光灿烂" <%if rs("t_leibie")="星光灿烂" then 73.response.write "selected" end if%>>星光灿烂</option> 74.<option value="事事关心" <%if rs("t_leibie")="事事关心" then 75.response.write "selected" end if%>>事事关心</option> 76.</select></td> 77.</tr> 78.<tr> 79.<td >文章内容:</td> 80.<td><textarea name="t_content" class="jt2" rows="10" 81.cols="35"><%=rs("t_content")%></textarea></td> 82.</tr> 83.<tr> 84.<td colspan=2 align="center" ><input type="submit" class="jt2" value ="提交"> 85. 86.<input type="reset" class="jt2" value="重置"></td> 87.</tr> 88.</form> 89.</table>
|
代码释义:
第1~46行,定义样式,主要是表格、文本框及链接的内容,与前面的一样。不过这里的滚动条是多行文本框的滚动条。
第50行,获得文章的ID号。
第51、52行,建立SQL语句并打开该查询。
第54~89行,是用一个表格制作的表单。在这个表单中分别写入了文章的标题、作者、类别及文章内容。
第59行,显示文章的标题<%=rs("t_topic")%>。
第64行,显示文章的作者<%=rs("t_writer")%>。
第69~76行,显示文章的类别,对文章类别进行判断,即当选择某一类别时,就使这个类别处于当前选择状态。即response.write "selected",因为这里的选项较少,所以用了if语句来判断,如果选项较多,用这种方法就稍显复杂些。这时,可以对原代码进行改动,使用另外一种方法实现这种功能,即数组的方法,其代码构成如下。
1.<% 2.Dim jhf 3.jhf=array("A1","A2","A3","A4","An") 4.for i=0 to int(ubound(jhf)) 5.response.Write "<option value="&jhf(i) 6.if rs("t_leibie")=jhfr(i) then 7.response.write " selected" 8.end if 9.response.write ">"&jhf(i)&"</option>" 10.next%>
|
代码释义:
第2、3行,定义一个数组,并把各类别写入数组中。
第3~10行,用一个for语句,形成一个循环,定义数组的索引,ubound(jhf)函数返回一个数组的最大上限。如果查询的类别与数组中的值相等,就把这个类别作为当前类别加以选择,并显示出来。这种写法,对于类别较多时相对要简单些,而第一种使用if语句,则较容易理解。
第81行,显示文章的内容。
文章修改完成后,就要进行提交处理,提交的表单是action="gengxin.asp?id=<%=id%"。这个提交中参数的目的是保证修改的文章对号入座。
接下来分析gengxin.asp页面。在解读这个网页代码前,提醒读者注意,在制作网页、编写网页代码时,其关键在于自己的思路要清晰。如果思维不集中,则很难完成制作过程。这是因为网页之间的链接一环套一环。如果制作时,不能保证思路一致,或者认识模糊,那么在几个网页之间游走时,稍不注意就会混乱。一旦代码有误,再检查起来就颇费周折。因此,建议大家在写代码时要养成写制作手记的习惯,这样即使停下来,也会在下次制作中很快找到接入点。同时也希望大家每写一段代码就在浏览器中预览一次,否则一旦代码过多,再一起预览时,出错点就不易确定。随时检测,每当实现预期效果时,会有一种成就感,使制作网页成为一种乐趣。