第一章 诸论
在Internet飞速发展的今天,互联网成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个方面发挥着重要的作用。Internet上发布信息主要是通过网站来实现的,获取信息也是要在Internet“海洋”中按照一定的检索方式将所需要的信息从网站上下载下来。因此网站建设在Internet应用上的地位显而易见,它已成为政府、企事业单位信息化建设中的重要组成部分,从而倍受人们的重视。为了更好的办学,提高学校知名度,特构学校网站。
1 . 1 设计思想
通过网站,全面宣传,展示学校风采、优点与特色,发布学校的重大活动安排与招生政策,增强家长与学校之间的联系,在Internet上实现完成部分校务,提高办事效率。
1.2 开发工具的选用及介绍
ASP 的优势:
Active Server Pages :“动态服务器网页”,一般简称为“ASP”,ASP之所以能受到大家的重视与使用的原因,主要在于所产生的执行结果都是标准的HTML格式,而且这些程序是在网络服务端中执行,使用一般的浏览器(如IE 或Netscape)都可以正确地获得ASP的“执行”结果,并且将这ASP执行的结果直接在浏览器中“浏览”,不像VBScript或 javascript是在客户端(Client)的浏览器上执行,若使用VBScript来设计程序,客户端(Client)在IE浏览器中可以显示程序执行的结果,可是,客户端(Client)若使用Netscape浏览器就无法显示VBScript的执行结果。
ASP的特点:
任何开发工具皆可发展ASP
只要使用一般的文书编辑程序,如Windows记事本,就可以编辑。当然,其他网页发展工具,例如,FrontPage Express、 FrontPage等也都可以;不过还是建议你用记事本来写,既省钱又方便,若是使用那些所见即所得的网页编辑来写ASP,可能会发生一些意想不到的离奇状态。
通吃各家浏览由于ASP程序是在网络服务器端中执行,执行结果所产生的HTML文件适用于不同的浏览器。
语言相容性高
ASP 与所有的ActiveX Script语言都相容,除了可结合HTML,VBScript、Java Script、Active X服务器组件来设计外,并可经由“plug-In(外挂组件模组)的方式,使用其他厂商(Third Party)所提供的语言。
隐密安全性高
如果我们在浏览器中直接查看网页的原始代码,就只能看到HTML文件,原始的ASP程序代码是看不到的!这是因杰ASP程序先于网站服务(Web Server)端执行后,将结果转换成标准HTML文件,再传送到客户端(Client)的浏览器上,因此,我们所辛苦撰写的ASP程序并不会轻易地被看见进而被盗用。
易于操控数据库
ASP可以轻易地通过ODBC(Open Database Connectivity)驱动程序连接各种不同的数据库,例如:Acess、Foxpro、dBase、Oracle等等,另外,ASP亦可将“文本文件”或是”Excel” 文件当成数据库用。
面向对象学习容易
ASP具备有面向对象(Object-Oriented)功能,学习容易,ASP提供了五种方便能力强大的内建对象:Request、Response、Sever、Application以及Session,同时,若使用ASP内建的“Application”对象或”Session”对象所撰写出来的ASP程序可以在多个网页之间暂时保存必要的信息。
ASP 的六大内部对象
对象名称 功能描述
RequestResponseServerSessionApplicationObjectContext 从客户端取得信息将信息送给客户端提供一些Web服务器工具储存在一个Session内的用户信息,该信息仅可被该用户访问在一个ASP-Application中让不同的客户端共享信息可以用来配合Microsoft Transaction 服务器进行分布式事务处理
所以我选择了ASP结合Frontpage架构长沙市工商职业中专学校网站
第二章 网站总体分析与设计
2 .1网站系统分析
根据前面的设计思想进行分析,按照系统开发的基本观点对网站进行分解,从内容上可对网站作如下划分:
l 学校风采 通过学校概括、教师风采、校园之星及部分图片等内容来展现。
l 优点特色 通过新闻、生动活泼的教育教学栏目来展现。
l 信息发布 通过公告栏、信息查询等栏目来实现,内容有招生政策、
活动安排等。
l 部分校务 根据校务的公开程度与参与人数的多少,特选择图书管
理、评优、考试查分、家校联系四大校务在网上实现。
2.2 主页设计
网站主页采用静、动相结合的方式,即静态的主画面和动态的图片相结合,体现学校的勃勃生气,静态主页方式介绍学校风采、优点特色、信息发布,对于四大校务,就得利用ASP与数据库结合的技术建立数据库查询管理系统,采用交互式的动态的web画面来实现。
主页结构图
注:带下划线的表示是链接方式
2 .3数据库设计
采用的数据库是Microsoft Access ,拟建立teach.mdb库文件,包含如下几个表文件:
allmessage 留言信息表
Libbooks 图书信息表
Libcategories 图书类别信息表
Libemps 图书馆用户信息表;
stud 学生信息表
第三章 详细设计
3 .1 家长学校联络簿
3 .1.1功能:
利用SQL语法过滤特定的家长留言意见,让老师可以针对某位特定学生家长所发表的意见作出独立的回答,同时,家长在发表个人意见时,若认为意见内容涉及敏感的话题或是意见内容涉及私人隐私,都可用“悄悄话”的方式发言,这些“悄悄话”将不会被显示出来让大家看到,当然,老师拥有管理的能力,只要以密码登录管理模式,就可以进行各个学生家长的单独意见回复,而且还能看到家长们所留下的“悄悄话”。
3 .1.2组成构造
共分成六大部分:
1 , 意见留言结果网页guest.asp:用来显示家长发言与老师回复内容,同时还具备一般模式与管理模式两种显示方法。
2 , 家长发言表单网页addmsg.asp:让学生家长填写发言内容并选择发言性质。
3 , 家长发言数据处理ASP程序add.asp:处理家长发表的意见数据,同时将这些意见数据记录起来并将网页显示转向至意见留言结果网页。
4 , 老师回复表单网页teachans.asp:让老师针对某位特定学生家长所发表的意见作出独立的回答。
5 , 老师回复数据处理ASP程序anssave.asp:处理老师回复的数据内容,同时将这些意见数据起来并将网页显示转向至意见留言结果网页。
6 , 数据表文件allmessage:用来储存家长发言数据与老师回复数据的Access类型数据库文件。
“数据表文件”负责存放家长发言数据与老师回复内容的数据记录,为Access类型的库文件,将它定名为:“message.mdb”。
下图为家庭联络簿的组成与流程图:
老师回复
家长留言
读入 写入
写入
3 .1.3数据库结构设计
数据库文件”teach.mdb“中的数据表” allmessage“的栏目设置,如下图:
字段名 字段类型
3 .1.4界面设计与重点、难点代码的设计
数据库与留言显示程序网页
家长发言与老师回复的内容数据全部储存在数据库中,要在网页中显示目前的家长发言与老师回复数据,必须先进行数据库的链接与打开,要链接数据库我们必须使用ADO对象群的Connection对象;而要打开数据库则必须使用ADO对象群的Recordset对象,程序:
set cn=server.createobject("adodb.connection")
cn.open "filedsn=c:/program files/common files/odbc/data sources/ms access database.dsn"
set rs=server.createobject("adodb.recordset")
sql="select * from allmessage order by 留言时间 desc"
rs.open sql,cn,1,1
Recordset 对象是负责浏览与操作从数据库取出来的数据,Connection对象只负责与数据库进行链接的动作,并不能使用数据库内的数据,因此必须建立一个可以存取数据库数据的Recordset对象,
使用RS.Open方法存取”teach.mdb”数据库
RS.Open SQL,CN,1,1
使用open方法来打开数据表或执行Select指令参数设置如下:
1 , 参数一(SOURCE):为欲打开的数据表或SQL指令。
2 , 参数二(ActionConnection):指定一个已打开的数据库对象,将此参数设为链接我们已经建立好的Connection对象“CN”。
3 , 参数三( CursorType):指定Recordset的打开类型,1为可读写且可自由移动。
4 , 参数四(LockType):指定锁定类型,1为只读。
数据排序与SQL指令
1 . Select 指令的筛选语句:
格式: Select…From
在SQL语言中:“Select”数据表“中选取某些“栏位”的数据.
2. 如果要选取的数据表数据包含了一个以上的栏位,则我们可以利用“,”逗号来栏位名称隔开。
3 . 如果要选取的数据表数据包含了全部的栏位,则可以利用万用字符“*”来代表全部的栏位。
可排序数据的Select指令
1 . 当我们希望被选取出来的数据记录数据能够依据某个或某几个栏位的内容来排序时,只要将这些排序依据的栏位摆放在“Order By“保留字之后,然后将这处排序的语句连接在”Select…From“后面就行了。
2 . “Order By“默认的排序方式是“由小排到大”,但若是希望排序方式是“由大排到小”,则我们可在栏位名称后再加上“Desc“保留字!将排序方式改为”由大排到小“。
在“显示留言意见”网页中的打开数据库ASP程序中的语句:
SELECT*From allmessage order by 留言日期 Desc
功能为:从数据表“allmessage“中取出所有栏位的数据,并将取出的数据记录内容依照”留言日期“栏位使用的”由大排到小“排序方式进行排序。
留言显示网页的管理模式
“显示留言意见”的网页就必须具备显示模式选择的功能,当显示模式在一般情况时要能显示家长们的一般性发言,同时还得将“悄悄话“的发言隐藏起来。当老师以密码登录成为管理模式时,则必须将一般性发言与悄悄话发言的数据全部显示出来,同时还得让老师们可以针对某位特定学生家长所发表的意见作出独立的回答。
这两个情况是通过密码登录管理模式的ASP程序实现的:
<form method="post">
<%if session("checkedit")="yes" then%>
<input type="hidden" value="yes" name="goexit">
<input type="submit" value=" 离开管理模式">
<%else%>
密码:<input type="password" name="password" size="4" maxlength="4"> <input type="submit" value="教师管理">
<%end if%>
</form>
在这段网页语句中,利用Session对象来记录目前的工作模式。当我们第一次进入“显示留言意见”网页的时候,我们所见的网页画面一定是一般!因为Session尚未被建立,因此它的“变量”值一定不会是“yes”,所以网页中会出现一个输入密码进入“教师管理”模式的栏位,只有当我们输入密码按下“教师管理”的按钮组织上发ASP程序中的进入管理模式语句后,Session对象才会被建立,同时,“checkedit“Session对象变量值被设置为“yes“,所以我们就进入了能将一般性发言与悄悄话发言的数据全部显示出来,同时还让教师们可以针对某位特定学生家长所发表的意见作出独立回答的管理模式页面。
留言显示网页的分页
当家长的发言与老师回复的数据笔数太多时,一次要将全部的数据内容显示在网页中,等待网页下载的时间太长了,因此采用固定笔数分页浏览方式来显示网页。
要进行分页显示,得先知道目前有多少笔的留言数据,而留言数据笔数可以通过Recordset对象的“Recordcount“(记录个数)属性得知,我们将每10笔数据为一单位分页显示:
count=rs.recordcount
if count/10>(count/10) then
totalpage=(count/10)+1
else totalpage=(count/10)
end if
“/”为浮点数除法,“/”为整数除法。
跳页选择的ASP程序语句
所有的发言数据采用固定笔数分页浏览的方式来显示后,还要提供一个跳页链接显示的功能,让浏览者可以选择希望浏览的页次进得浏览,ASP程序语句:
pagecount=0
rs.movefirst
if request.querystring("topage")<>"" then pagecount=cint(request.querystring("topage"))
if pagecount<=0 then pagecount=1
if pagecount>totalpage then pagecount=totalpage
rs.move(pagecount-1)*10
发言表单网页制作
inse tu3
表单的参数
表单的Action参数:Action参数是用来指定Server端处理此一表单数据内容的程序,此处表单处理ASP程序为“add.asp“,
表单的Mothed参数:要将表单传送至Server端的方式有两种,设置值分别为GET及POST,若设置为POST,则浏览器会等Server端来读取数据,若设置为GET,则当我们按下送出按钮时,浏览器会立即将表单中的数据内传送出去。利用POST方法,在传送的数据上将不受限制,利用GET方法传送的数据量则大约只有2K左右。
留言处理程序
要将家长发言数据作后续处理及将这些数据内容存入数据库,须利用添加数据记录的Insert Into 指令,然后再写入数据库文件中:
Inset into 指令语句格式:
Insert into 数据表名 (栏目名) values(栏目值)
sql="insert into allmessage( 家长姓名,留言主题,联络信箱,留言内容,私人公开,留言时间,班级) values("
sql=sql&"'"& parent&"',"
sql=sql&"'"&subject&"',"
sql=sql&"'"&email&"',"
sql=sql&"'"&memo&"',"
sql=sql&"'"&personal&"',"
sql=sql&"'"&now&"',"
sql=sql&"'"&bj&"')"
cn.execute sql
回复表单程序网页
必 须让老师们可以针对某位特定学生家长所发表的意见作出独立的回答,
使用Select…From…Where筛选语句
sql="select * from allmessage where( 编号="&ID&")"
rs.open sql,cn,1,3
然后将特定的家长发言数据放在表单,方法是将数据库中的数据取出来,然后放在表单栏位中:
“家长姓名“栏位网页语句标签
<td bgcolor="#CCCCFF"><font size="2"><%=RS(" 家长姓名")%><font></td>
“留言主题“栏位网页语句标签
<td bgcolor="#CCCCFF"><font size="2"><%=RS(" 留言主题")%></font></td>
“留言内容“栏位网页语句标签
<td bgcolor="#CCCCFF"><font size="2"><%=RS(" 留言内容")%><font></td>
老师在回复栏位中所填入的数据,必须送给处理老师回复数据的ASP程序”anssave.asp”来记录以及处理这些回复数据。当老师填写好回复发言的数据后按下“送出回复”按钮后,表单中的数据内容就会以“POST”的方式由SEVER端读取,然后将数据内容交由处理老师回复数据的ASP程序“anssave.asp”来将数据内容写入数据库。
3 .2网上图书馆
网上图书馆将学校图书馆图书放到网络上供人借阅,这样不仅方便了校内的学生与教职员工使用图书馆的资源,还为图书馆管理员提供了一种简便地管理图书馆的方法.
3 .2.1功能
网上图书馆系统可以进行图书的出借和归还.还可以在系统中按照多种字段对图书进行查找,还可以浏览某个种类的所有图书.该应用程序也为图书馆管理员提供了一些功能,如添加、编辑以及删除图书等,或者在分类层次结构中添加新的种类。
3 .2.2系统的层次结构
下图的每个方框代表校园图书馆网站中的一个页面。除了只包含HTML的Search页面外,其他的均为ASP页面。因为每个图书的页面都不同,所以大多数的页面实际上都是多页面。
3.2.3 数据库设计
本系统共使用3个数据表:
LibBooks 表包含与图书有关的所有数据。该表中的字段内容的图书的通用信息。另外,对于已经出借的图书,该表中还包含借阅该图书的用户的ID号,以及图书的状态。
表视图如下:
字段名 意义 字段类型 字段名 意义 字段类型
bookid 书号(主键) 数字 (no null) status 状态 文本
title 书名 文本 checkedoutto 用户id 数字
author 著者 文本 reservedby 用户学号 数字
Subject 主题 文本 description 描述 文本
Isbn Isbn 号 文本 keywords 关键字 文本
LibCategories 表包含Library中的所有类别,在访问者浏览图书列表时将会用到这些类别。每个类别都可以作为另外类别的父类别。有一个特殊的类别,Top-Level,没有出现在类别列表中,但是可以作为其他任何类别的父类别。
字段名 意义 字段类型
Categoryname 类别 文本(noll)
parentcategory 父类别 文本(noll)
LibEmps表包含可以访问图书馆网站的用户信息。该表包含一些通用的信息字段,比如用于进入图书馆的用户密码等。
字段名 意义 字段类型 字段名 意义 字段类型
empid 用户id (主键no null) 数字 password 用户密码 文本
Empname 用户姓名 文本 manager 管理员代号 数字
emailaddress 用户邮箱 文本
图书馆数据库的数据关系如图9-22所示。其中表LibEmps和表Lib Categories与表LibBooks之间都是一对多的关系。每个雇员都可以借阅多本图书,每个类别都可以包含多本图书。
3.2.3 界面设计与重点代码的设计
网上图书馆系统有两种用户,一是管理员。另一种是只允许使用图书馆系统,而没有管理功能的一般用户。访问者进入网站,首先要进行登录,如下图所示。登录页面(index.asp)
访问者输入E-mail地址和密码来登录,然后单击“登录”按钮。输入的数据提交后与数据库中的用户表进行匹配。
须创建一个记录来保存基于访问者登录的用户信息
set RSFindEmp = conn.Execute("select EmpID, Manager from LibEmps where " _
& "EmailAddress = '" & Request.Form("EmailAddress") & "' and " _
& "Password = '" & Request.Form("Password") & "'")
if RSFindEmp.EOF then
TheMessage = " 密码或email地址不对."
else
Session("EmpID") = RSFindEmp("EmpID")
Session("Manager") = RSFindEmp("Manager")
Response.Redirect "../yk.htm"
end if
表单域EmailAddress和Password 用于Where了句中来获取一个记录。如果访问者输入了一个无效的用户名,则记录集中将不会返回匹配的记录。我们可以通过查看EOF标记来判断一个记录集是否为空。为空,则访问者将被拒绝进入该系统。不为空,则访问者的EmpID值和Manager值将从记录集中返回。写入Session 变量, 变量将在整个网站的所有网页中都是有效的。这些变量的存在与否及其取值将用于确定是否允许进入一个特定的网页,同时也用于访问者进行书目的归还和借阅操作。
图书馆菜单页面
图书馆菜单页面包含指向其他4个页面的链接:管理页面、搜索页面、图书列表页面和主页面。还有一个可显示用户所借书籍的按纽。如果访问者是图书馆管理员,则菜单界面如图所示。如果访问者不是图书馆管理员,则看到如图所示的界面。非管理员的访问者的界面上没有指向管理员菜单页面的链接。
实现办法:访问者登录时在登录页面上的创建的会话变量Session 用于从数据库中获取访问者的有关信息,表示它是否是管理员。如果值为1,就表明访问者是一个管理员,则用如下代码写入一个指向管理员页面的链接:
<% If Session("Manager") = 1 then %>
<A HREF="../html/management_menu.asp"> 管理员菜单</A>
<% end if %>
通过按纽B1是否为空来判断要不要显示用户所借图书,利用一个记录集来获取访问者已经借出了的所有图书的列表。
if NOT isempty(Request.Form("B1")) then
set RSBooks = conn.Execute ("select BookID, Title from LibBooks where " _
& "CheckedOutTo = " & Session("EmpID"))
end if
再用循环语句将所借书以表格形式显示出来。
<table border=1 width="90%" >
<% if NOT isempty(Request.Form("B1")) then
Do Until RSBooks.EOF%>
<TR >
<TD WIDTH=40% height="20"><% Response.Write RSBooks("Title") %></td></tr>
<% RSBooks.MoveNext
loop
end if
%>
</table>
循环将遍历Rsbooks记录集中的每个记录,直到该记录集结束:
该网站中的所有ASP页面都会在访问者访问之前对其进行登录检查。这样就可以避免访问者通过输入某个页面地址然后在没有登录的情况下直接进入该页面的情况发生。此外,每个管理页面都要确认访问者是管理员。
管理菜单页面
管理菜单页面有一个HTML表单,根据选择的按钮的不同,可以进行5种不同的操作:图书的归还、图书的编辑、图书的删除、图书的添加和类别的添加。不管选择了哪一个按钮,该表单都提交人其自身进行处理。
要进行图书的归还、图书的编辑、图书的删除三种操作,须先进行搜索,找到该书后,由图书Book.asp返回一个链接:
<% If Session("Manager") = 1 then %>
<A HREF="../html/management_menu.asp?title=<% response.write RSBooks("Title") %>&BOOKID=<% response.write RSBooks("BOOKID") %>"> 管理员菜单</A>
<% end if %>
而管理者页面通过下列语句
<%=request.querystring("title")%>
<inputzztype=hidden name="BOOKID1"value="<%=request.querystring("BOOKID")%>>
这样就将所找到的书的书号BookID、书名Title传递管理者页面。再进行所须操作。共有3个不同的铵纽,可以进行3种操作。若单击“修改”钮:
则重定向到编辑图书页面,同时把Bookid 传递给该页面。
Response.Redirect "./edit_book.asp?BOOKID="&request("BOOKID1")
将其他的情况需要建立到数据库的连接:
set conn = server.createobject ("adodb.connection")
Conn.Open("FILEDSN=c:/Program Files/Common Files/ODBC/Data Sources/ms access database.dsn")
if NOT isempty(Request.Form("Delete")) and request("BOOKID1")<>"" then
conn.Execute "delete from LibBooks where BOOKID ="&request("BOOKID1")
end if
if (NOT isempty(Request.Form("checkin"))) and request("BOOKID1")<>"" then
conn.Execute "update LibBooks set checkedoutto= 0, status= 'Available' where BookID="&Request("BOOKID1")
end if
页面中的添加新的种类部分包含一个文本控件和一个选择控件。其中选择控件是用所有已经存在的类别列表进行填充的,包括特殊类别 Top level ,该类别表明当前类别是处于类别层次结构中的最顶层。代码如下:
先用一个记录集来填充父类别选择控件:
set RSCategories = conn.Execute("select CategoryName from LibCategories order by CategoryName")
再用下列循环语句:
<%
Do Until RSCategories.EOF
%>
<OPTION VALUE="<% response.write RSCategories("CategoryName") %>"><% response.write RSCategories("CategoryName") %></OPTION>
<%
RSCategories.MoveNext
Loop
%>
遍历RSCategories记录集中的每个记录,并作为一个选项添加到列表中,而记录集中CategoryName 同时作为显示值和传递值:
本页面还包含一个指向添加图书页面的链接。
搜索结果页面
搜索页面的代码获取与访问者查找规则相匹配的图书,然后将这些图书显示给访问者。
搜索页面上的表单包含一个选择控件和一个文本控件。选择控件中的选项是用可搜索 的字段填充的:
需要用一个记录集来保存与访问者的查找规则相匹配的记录:
set RSBooks = conn.Execute("select BookID, Author, Title, Subject from LibBooks where " _
& Request.Form("SearchField") & " Like '%" & Request.Form("SearchCriteria") & "%'")
注意:,符号%表示的是一个广义搜索。这一点类似于ACCESS中的符号*。
然后将所找到的书以表格形式显示出来。代码如下:
<% Do Until RSBooks.EOF %>
<TR VALIGN="top" ALIGN="left">
<TD WIDTH=40% height="20"><B> 书名:</B> <A HREF="../html/book.asp?BookID=<% Response.Write RSBooks("BookID") %>"><% Response.Write RSBooks("Title") %></A></TD>
<td width=20% height="20"><B> 著者:</B> <% Response.Write RSBooks("Author") %></td>
<td width=30% height="20"><B> 主题:</B> <% Response.Write RSBooks("Subject") %> </td>
<% RSBooks.MoveNext
Loop %>
图书页面
图书页面的代码显示图书的有关信息,以及管理图书的出借操作。
该页面通过Querystring 传递BookID
if isempty(Request.QueryString("BookID")) then
Response.Redirect "./search.html"
end if
如果其中不存在,则访问者将被重定向到搜索页面:
如果同时传递表单中包含的变量Action不为空,则表明访问者正借阅该图书:
if Not isempty(Request.QueryString("Action")) then
在这种情况下,需要将图书状态改为 Checkout, 同时需要将Checkedoutto 字段修改为该访问者:
conn.Execute "update LibBooks set Status = 'Checked Out', " _
& "CheckedOutTo = " & Session("EmpID") & " where BookID = " _
& Request.QueryString("BookID")
Response.Redirect "./library_menu.asp"
end if
然后将该访问者重定到图书馆菜单页面:
下一步,利用图书的状态来确定不同的链接
未借出时链接如下:
if RSBooks("status") = "Available" then
LinkText = "<A HREF=""../html/book.asp?Action=CheckOut&BookID=" _
& Request.QueryString("BookID") & """> 借这本书</A>"
如果图书已经借出,就创建一个不同的消息,并将链接设置为指向Library menu 页面:
LinkText = "<A HREF=""../html/library_menu.asp""> 图书已出借,返回主菜单。</A>"
最后根据是否是管理员,显示管理员菜单链接。
<% If Session("Manager") = 1 then %><A HREF="../html/management_menu.asp?title=<% response.write RSBooks("Title") %>&BOOKID=<% response.write RSBooks("BOOKID") %>"> 管理员菜单</A><% end if %>
3.3 网上评优投票系统
3.3.1 功能:
能实现全校性的评选,快捷、公平,且有效,不允许做票。
3.3.2 组成构造
这个系统由3个部分组成——投票页面vote.htm ,处理投票结果的脚本,显示投票页面 。
3 .3.3数据表的设计:
3 .3.4界面设计与重点、难点代码设计
投票页面
该页面是一个纯HTML文件,它让用户选择自己想选举的候选人,并填写自己的详细资料,以确认投票的有效性。页面显示如图所示。
表单处理脚本
在vote.htm中各项数据都填写完毕后,单击确定投票按钮,表单的数据就被提交,
本次评优共有4个候选人,但只能选两个。故用复选框。
投票的有效性通过是否是本校学生,且是否投过票来判断。
if request("passno")<>"" then
sql="select * from stud where password="&"'"&request("passno")&"'" &"and yitu=0"
set rs=cn.execute(sql)
if rs.eof then%>
<h2 align=center><%response.write" 你无权投票"%></h2>
本设计允许少选,不允许多选。通过判断Vote投票界面传递过来的复选按纽值的长度看是否多选。
vo=request("cand")
if len(vo)>4 then%>
<h2 align=center><%response.write " 多选了,无效"%></h2>
然后根据所投的票将对应候选人的投票结果字段加1,同时将该投票人的已投字段置为1。
sqq="update stud set yitu=1 where password="&"'"&request("passno")&"'"
cn.execute(sqq)
if instr(vo,"1") then
cn.execute("update stud set result=result+1 where name=' 李宁'")
end if
if instr(vo,"2") then
cn.execute("update stud set result=result+1 where name=' 杨兰'")
end if
if instr(vo,"3") then
cn.execute("update stud set result=result+1 where name=' 江道明'")
end if
if instr(vo,"4") then
cn.execute("update stud set result=result+1 where name=' 段启文'")
end if%>
显示当前投票情况show.asp
由于投票处理页面已经完成了绝大部分的工作,所以 显示结果页面就很简单了,其功能是从 Stud表文件中读取候选人所得票数,显示在页面上。
页面显示如图
值得注意的代码主要有以下几处:
该页面有自动刷新功能,使在线用户可以尽快的看到最新的选举情况。我们这里设定每隔30秒钟自动刷新一次。
<meta http-equiv="refresh" content="10;URL=show.asp">
显示投票时,我们采用了while循环,把候选人及其得票数,整齐地显示在一个表格中,这种技术在数据库查询结果的显示中也经常用到。代码如下:
<%while not hs.eof %>
<tr>
<td width="100%"><center>
<font color="#8000ff"><big>
<%=hs("name")&" "&hs("result")&" 票"%>
</big> </font>
</center>
</td>
</tr>
<%hs.movenext%>
<%wend%>
3 .4达级考试在线查分系统与计数器的制作
3 .4.1功能:
它提供了在线查看成绩。考生可以在网上使用这一系统,通过输入准考证编号来查询达级考试的结果。
3 .4.2数据表的设计
与评优系统共用STUd表,表设计同上。
3 .4.3界面设计与重点难点代码的设计
该模块需要查询者输入准考证号后来查看结果。若ID1不为空时,表示有表单输入,开始查询数据库。使用 SELECT的SQL指令查询数据库的数据。先设定SQL指令,查询ID符合准考证编号Request.Form("ID1")的数据,下个“Execute”指令,即可开始执行存取、查询数据的动作了。并将查询结果储存到Recordsets组件RS中。
IF Request.Form("ID1")<>"" THEN
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("FILEDSN=c:/Program Files/Common Files/ODBC/Data Sources/ms access database.dsn")
SQL = "SELECT name,id,score FROM stud WHERE id='" & Request.Form("ID1") & "'"
Set RS = Conn.Execute(SQL)
若考试通过,则显示考试的结果,包括姓名、准考证编号、总分和考试结果,分别由RecordSets 组件的RS(0)、RS(1)、RS(2)、RS(3)得到。FS.Field.Count表示RecordSets组件的域的总数,由“for I=0 to RS.Fields.count -1”,取得RS(I)各域的数据。配合 <Table> 表格的HTML语法,将结果填入表格的各单元格中。 若还有下一个数据,就使用RS.MoveNext 移到下一个位置。
3.4.4 页面访问计数器的制作
利用文件处理组件FILESYSTEM的强大功能来制作,比用Application对象计数器要好,Application计数器当有20分钟没有人连上该网页或关机时,计数器会被归零。而文件计数器却不会因时间而消失。我用Count.txt存放访问人次。代码如下:
whichfile=server.mappath("pic/count.txt")
set myfile=server.createobject("scripting.filesystemobject") 创建一个
set thisfile=myfile.opentextfile(whichfile) 组件对象
visit=thisfile.readline
thisfile.close 读取计数器数据文件Count.txt中的计数数据
visit=visit+1 记录自加一次
length=len(visit)
for i=1 to length
response.write "<img src="&mid(visit,i,1)&".jpg></img>" 将记录的数据用图片显示出来
next
set thisfile=myfile.createtextfile(whichfile,1) 将新计数数据写入文件thisfile.writeline(visit)
set myfile=nothing
数字图片我利用PHOTOSHOP中的文字特效制作了9个立方数字:
等
四.系统的使用说明与安装
4 .1运行环境要求
Windows98
Personal Web Server 3.0 (PWS)
Microsoft? Access 2000 (9.0.2812)
4 .2安装设置
A. 将本网站拷贝到硬盘上的某一目录下,如:拷贝至c:/y1下。
B. 运行PWS,将默认的Web站点主目录设置为该目录,如上例应为c:/y1;
具体步骤:
a. 选择“高级”项;
b. 单击“编辑属性”按钮,在出现的“编辑属性”对话框中的“目录”项中填入“c:/y 1”,其他不变,确定;
C. 设置启动默认文档为:yy.asp
在Internet飞速发展的今天,互联网成为人们快速获取、发布和传递信息的重要渠道,它在人们政治、经济、生活等各个方面发挥着重要的作用。Internet上发布信息主要是通过网站来实现的,获取信息也是要在Internet“海洋”中按照一定的检索方式将所需要的信息从网站上下载下来。因此网站建设在Internet应用上的地位显而易见,它已成为政府、企事业单位信息化建设中的重要组成部分,从而倍受人们的重视。为了更好的办学,提高学校知名度,特构学校网站。
1 . 1 设计思想
通过网站,全面宣传,展示学校风采、优点与特色,发布学校的重大活动安排与招生政策,增强家长与学校之间的联系,在Internet上实现完成部分校务,提高办事效率。
1.2 开发工具的选用及介绍
ASP 的优势:
Active Server Pages :“动态服务器网页”,一般简称为“ASP”,ASP之所以能受到大家的重视与使用的原因,主要在于所产生的执行结果都是标准的HTML格式,而且这些程序是在网络服务端中执行,使用一般的浏览器(如IE 或Netscape)都可以正确地获得ASP的“执行”结果,并且将这ASP执行的结果直接在浏览器中“浏览”,不像VBScript或 javascript是在客户端(Client)的浏览器上执行,若使用VBScript来设计程序,客户端(Client)在IE浏览器中可以显示程序执行的结果,可是,客户端(Client)若使用Netscape浏览器就无法显示VBScript的执行结果。
ASP的特点:
任何开发工具皆可发展ASP
只要使用一般的文书编辑程序,如Windows记事本,就可以编辑。当然,其他网页发展工具,例如,FrontPage Express、 FrontPage等也都可以;不过还是建议你用记事本来写,既省钱又方便,若是使用那些所见即所得的网页编辑来写ASP,可能会发生一些意想不到的离奇状态。
通吃各家浏览由于ASP程序是在网络服务器端中执行,执行结果所产生的HTML文件适用于不同的浏览器。
语言相容性高
ASP 与所有的ActiveX Script语言都相容,除了可结合HTML,VBScript、Java Script、Active X服务器组件来设计外,并可经由“plug-In(外挂组件模组)的方式,使用其他厂商(Third Party)所提供的语言。
隐密安全性高
如果我们在浏览器中直接查看网页的原始代码,就只能看到HTML文件,原始的ASP程序代码是看不到的!这是因杰ASP程序先于网站服务(Web Server)端执行后,将结果转换成标准HTML文件,再传送到客户端(Client)的浏览器上,因此,我们所辛苦撰写的ASP程序并不会轻易地被看见进而被盗用。
易于操控数据库
ASP可以轻易地通过ODBC(Open Database Connectivity)驱动程序连接各种不同的数据库,例如:Acess、Foxpro、dBase、Oracle等等,另外,ASP亦可将“文本文件”或是”Excel” 文件当成数据库用。
面向对象学习容易
ASP具备有面向对象(Object-Oriented)功能,学习容易,ASP提供了五种方便能力强大的内建对象:Request、Response、Sever、Application以及Session,同时,若使用ASP内建的“Application”对象或”Session”对象所撰写出来的ASP程序可以在多个网页之间暂时保存必要的信息。
ASP 的六大内部对象
对象名称 功能描述
RequestResponseServerSessionApplicationObjectContext 从客户端取得信息将信息送给客户端提供一些Web服务器工具储存在一个Session内的用户信息,该信息仅可被该用户访问在一个ASP-Application中让不同的客户端共享信息可以用来配合Microsoft Transaction 服务器进行分布式事务处理
所以我选择了ASP结合Frontpage架构长沙市工商职业中专学校网站
第二章 网站总体分析与设计
2 .1网站系统分析
根据前面的设计思想进行分析,按照系统开发的基本观点对网站进行分解,从内容上可对网站作如下划分:
l 学校风采 通过学校概括、教师风采、校园之星及部分图片等内容来展现。
l 优点特色 通过新闻、生动活泼的教育教学栏目来展现。
l 信息发布 通过公告栏、信息查询等栏目来实现,内容有招生政策、
活动安排等。
l 部分校务 根据校务的公开程度与参与人数的多少,特选择图书管
理、评优、考试查分、家校联系四大校务在网上实现。
2.2 主页设计
网站主页采用静、动相结合的方式,即静态的主画面和动态的图片相结合,体现学校的勃勃生气,静态主页方式介绍学校风采、优点特色、信息发布,对于四大校务,就得利用ASP与数据库结合的技术建立数据库查询管理系统,采用交互式的动态的web画面来实现。
主页结构图
注:带下划线的表示是链接方式
2 .3数据库设计
采用的数据库是Microsoft Access ,拟建立teach.mdb库文件,包含如下几个表文件:
allmessage 留言信息表
Libbooks 图书信息表
Libcategories 图书类别信息表
Libemps 图书馆用户信息表;
stud 学生信息表
第三章 详细设计
3 .1 家长学校联络簿
3 .1.1功能:
利用SQL语法过滤特定的家长留言意见,让老师可以针对某位特定学生家长所发表的意见作出独立的回答,同时,家长在发表个人意见时,若认为意见内容涉及敏感的话题或是意见内容涉及私人隐私,都可用“悄悄话”的方式发言,这些“悄悄话”将不会被显示出来让大家看到,当然,老师拥有管理的能力,只要以密码登录管理模式,就可以进行各个学生家长的单独意见回复,而且还能看到家长们所留下的“悄悄话”。
3 .1.2组成构造
共分成六大部分:
1 , 意见留言结果网页guest.asp:用来显示家长发言与老师回复内容,同时还具备一般模式与管理模式两种显示方法。
2 , 家长发言表单网页addmsg.asp:让学生家长填写发言内容并选择发言性质。
3 , 家长发言数据处理ASP程序add.asp:处理家长发表的意见数据,同时将这些意见数据记录起来并将网页显示转向至意见留言结果网页。
4 , 老师回复表单网页teachans.asp:让老师针对某位特定学生家长所发表的意见作出独立的回答。
5 , 老师回复数据处理ASP程序anssave.asp:处理老师回复的数据内容,同时将这些意见数据起来并将网页显示转向至意见留言结果网页。
6 , 数据表文件allmessage:用来储存家长发言数据与老师回复数据的Access类型数据库文件。
“数据表文件”负责存放家长发言数据与老师回复内容的数据记录,为Access类型的库文件,将它定名为:“message.mdb”。
下图为家庭联络簿的组成与流程图:
老师回复
家长留言
读入 写入
写入
3 .1.3数据库结构设计
数据库文件”teach.mdb“中的数据表” allmessage“的栏目设置,如下图:
字段名 字段类型
3 .1.4界面设计与重点、难点代码的设计
数据库与留言显示程序网页
家长发言与老师回复的内容数据全部储存在数据库中,要在网页中显示目前的家长发言与老师回复数据,必须先进行数据库的链接与打开,要链接数据库我们必须使用ADO对象群的Connection对象;而要打开数据库则必须使用ADO对象群的Recordset对象,程序:
set cn=server.createobject("adodb.connection")
cn.open "filedsn=c:/program files/common files/odbc/data sources/ms access database.dsn"
set rs=server.createobject("adodb.recordset")
sql="select * from allmessage order by 留言时间 desc"
rs.open sql,cn,1,1
Recordset 对象是负责浏览与操作从数据库取出来的数据,Connection对象只负责与数据库进行链接的动作,并不能使用数据库内的数据,因此必须建立一个可以存取数据库数据的Recordset对象,
使用RS.Open方法存取”teach.mdb”数据库
RS.Open SQL,CN,1,1
使用open方法来打开数据表或执行Select指令参数设置如下:
1 , 参数一(SOURCE):为欲打开的数据表或SQL指令。
2 , 参数二(ActionConnection):指定一个已打开的数据库对象,将此参数设为链接我们已经建立好的Connection对象“CN”。
3 , 参数三( CursorType):指定Recordset的打开类型,1为可读写且可自由移动。
4 , 参数四(LockType):指定锁定类型,1为只读。
数据排序与SQL指令
1 . Select 指令的筛选语句:
格式: Select…From
在SQL语言中:“Select”数据表“中选取某些“栏位”的数据.
2. 如果要选取的数据表数据包含了一个以上的栏位,则我们可以利用“,”逗号来栏位名称隔开。
3 . 如果要选取的数据表数据包含了全部的栏位,则可以利用万用字符“*”来代表全部的栏位。
可排序数据的Select指令
1 . 当我们希望被选取出来的数据记录数据能够依据某个或某几个栏位的内容来排序时,只要将这些排序依据的栏位摆放在“Order By“保留字之后,然后将这处排序的语句连接在”Select…From“后面就行了。
2 . “Order By“默认的排序方式是“由小排到大”,但若是希望排序方式是“由大排到小”,则我们可在栏位名称后再加上“Desc“保留字!将排序方式改为”由大排到小“。
在“显示留言意见”网页中的打开数据库ASP程序中的语句:
SELECT*From allmessage order by 留言日期 Desc
功能为:从数据表“allmessage“中取出所有栏位的数据,并将取出的数据记录内容依照”留言日期“栏位使用的”由大排到小“排序方式进行排序。
留言显示网页的管理模式
“显示留言意见”的网页就必须具备显示模式选择的功能,当显示模式在一般情况时要能显示家长们的一般性发言,同时还得将“悄悄话“的发言隐藏起来。当老师以密码登录成为管理模式时,则必须将一般性发言与悄悄话发言的数据全部显示出来,同时还得让老师们可以针对某位特定学生家长所发表的意见作出独立的回答。
这两个情况是通过密码登录管理模式的ASP程序实现的:
<form method="post">
<%if session("checkedit")="yes" then%>
<input type="hidden" value="yes" name="goexit">
<input type="submit" value=" 离开管理模式">
<%else%>
密码:<input type="password" name="password" size="4" maxlength="4"> <input type="submit" value="教师管理">
<%end if%>
</form>
在这段网页语句中,利用Session对象来记录目前的工作模式。当我们第一次进入“显示留言意见”网页的时候,我们所见的网页画面一定是一般!因为Session尚未被建立,因此它的“变量”值一定不会是“yes”,所以网页中会出现一个输入密码进入“教师管理”模式的栏位,只有当我们输入密码按下“教师管理”的按钮组织上发ASP程序中的进入管理模式语句后,Session对象才会被建立,同时,“checkedit“Session对象变量值被设置为“yes“,所以我们就进入了能将一般性发言与悄悄话发言的数据全部显示出来,同时还让教师们可以针对某位特定学生家长所发表的意见作出独立回答的管理模式页面。
留言显示网页的分页
当家长的发言与老师回复的数据笔数太多时,一次要将全部的数据内容显示在网页中,等待网页下载的时间太长了,因此采用固定笔数分页浏览方式来显示网页。
要进行分页显示,得先知道目前有多少笔的留言数据,而留言数据笔数可以通过Recordset对象的“Recordcount“(记录个数)属性得知,我们将每10笔数据为一单位分页显示:
count=rs.recordcount
if count/10>(count/10) then
totalpage=(count/10)+1
else totalpage=(count/10)
end if
“/”为浮点数除法,“/”为整数除法。
跳页选择的ASP程序语句
所有的发言数据采用固定笔数分页浏览的方式来显示后,还要提供一个跳页链接显示的功能,让浏览者可以选择希望浏览的页次进得浏览,ASP程序语句:
pagecount=0
rs.movefirst
if request.querystring("topage")<>"" then pagecount=cint(request.querystring("topage"))
if pagecount<=0 then pagecount=1
if pagecount>totalpage then pagecount=totalpage
rs.move(pagecount-1)*10
发言表单网页制作
inse tu3
表单的参数
表单的Action参数:Action参数是用来指定Server端处理此一表单数据内容的程序,此处表单处理ASP程序为“add.asp“,
表单的Mothed参数:要将表单传送至Server端的方式有两种,设置值分别为GET及POST,若设置为POST,则浏览器会等Server端来读取数据,若设置为GET,则当我们按下送出按钮时,浏览器会立即将表单中的数据内传送出去。利用POST方法,在传送的数据上将不受限制,利用GET方法传送的数据量则大约只有2K左右。
留言处理程序
要将家长发言数据作后续处理及将这些数据内容存入数据库,须利用添加数据记录的Insert Into 指令,然后再写入数据库文件中:
Inset into 指令语句格式:
Insert into 数据表名 (栏目名) values(栏目值)
sql="insert into allmessage( 家长姓名,留言主题,联络信箱,留言内容,私人公开,留言时间,班级) values("
sql=sql&"'"& parent&"',"
sql=sql&"'"&subject&"',"
sql=sql&"'"&email&"',"
sql=sql&"'"&memo&"',"
sql=sql&"'"&personal&"',"
sql=sql&"'"&now&"',"
sql=sql&"'"&bj&"')"
cn.execute sql
回复表单程序网页
必 须让老师们可以针对某位特定学生家长所发表的意见作出独立的回答,
使用Select…From…Where筛选语句
sql="select * from allmessage where( 编号="&ID&")"
rs.open sql,cn,1,3
然后将特定的家长发言数据放在表单,方法是将数据库中的数据取出来,然后放在表单栏位中:
“家长姓名“栏位网页语句标签
<td bgcolor="#CCCCFF"><font size="2"><%=RS(" 家长姓名")%><font></td>
“留言主题“栏位网页语句标签
<td bgcolor="#CCCCFF"><font size="2"><%=RS(" 留言主题")%></font></td>
“留言内容“栏位网页语句标签
<td bgcolor="#CCCCFF"><font size="2"><%=RS(" 留言内容")%><font></td>
老师在回复栏位中所填入的数据,必须送给处理老师回复数据的ASP程序”anssave.asp”来记录以及处理这些回复数据。当老师填写好回复发言的数据后按下“送出回复”按钮后,表单中的数据内容就会以“POST”的方式由SEVER端读取,然后将数据内容交由处理老师回复数据的ASP程序“anssave.asp”来将数据内容写入数据库。
3 .2网上图书馆
网上图书馆将学校图书馆图书放到网络上供人借阅,这样不仅方便了校内的学生与教职员工使用图书馆的资源,还为图书馆管理员提供了一种简便地管理图书馆的方法.
3 .2.1功能
网上图书馆系统可以进行图书的出借和归还.还可以在系统中按照多种字段对图书进行查找,还可以浏览某个种类的所有图书.该应用程序也为图书馆管理员提供了一些功能,如添加、编辑以及删除图书等,或者在分类层次结构中添加新的种类。
3 .2.2系统的层次结构
下图的每个方框代表校园图书馆网站中的一个页面。除了只包含HTML的Search页面外,其他的均为ASP页面。因为每个图书的页面都不同,所以大多数的页面实际上都是多页面。
3.2.3 数据库设计
本系统共使用3个数据表:
LibBooks 表包含与图书有关的所有数据。该表中的字段内容的图书的通用信息。另外,对于已经出借的图书,该表中还包含借阅该图书的用户的ID号,以及图书的状态。
表视图如下:
字段名 意义 字段类型 字段名 意义 字段类型
bookid 书号(主键) 数字 (no null) status 状态 文本
title 书名 文本 checkedoutto 用户id 数字
author 著者 文本 reservedby 用户学号 数字
Subject 主题 文本 description 描述 文本
Isbn Isbn 号 文本 keywords 关键字 文本
LibCategories 表包含Library中的所有类别,在访问者浏览图书列表时将会用到这些类别。每个类别都可以作为另外类别的父类别。有一个特殊的类别,Top-Level,没有出现在类别列表中,但是可以作为其他任何类别的父类别。
字段名 意义 字段类型
Categoryname 类别 文本(noll)
parentcategory 父类别 文本(noll)
LibEmps表包含可以访问图书馆网站的用户信息。该表包含一些通用的信息字段,比如用于进入图书馆的用户密码等。
字段名 意义 字段类型 字段名 意义 字段类型
empid 用户id (主键no null) 数字 password 用户密码 文本
Empname 用户姓名 文本 manager 管理员代号 数字
emailaddress 用户邮箱 文本
图书馆数据库的数据关系如图9-22所示。其中表LibEmps和表Lib Categories与表LibBooks之间都是一对多的关系。每个雇员都可以借阅多本图书,每个类别都可以包含多本图书。
3.2.3 界面设计与重点代码的设计
网上图书馆系统有两种用户,一是管理员。另一种是只允许使用图书馆系统,而没有管理功能的一般用户。访问者进入网站,首先要进行登录,如下图所示。登录页面(index.asp)
访问者输入E-mail地址和密码来登录,然后单击“登录”按钮。输入的数据提交后与数据库中的用户表进行匹配。
须创建一个记录来保存基于访问者登录的用户信息
set RSFindEmp = conn.Execute("select EmpID, Manager from LibEmps where " _
& "EmailAddress = '" & Request.Form("EmailAddress") & "' and " _
& "Password = '" & Request.Form("Password") & "'")
if RSFindEmp.EOF then
TheMessage = " 密码或email地址不对."
else
Session("EmpID") = RSFindEmp("EmpID")
Session("Manager") = RSFindEmp("Manager")
Response.Redirect "../yk.htm"
end if
表单域EmailAddress和Password 用于Where了句中来获取一个记录。如果访问者输入了一个无效的用户名,则记录集中将不会返回匹配的记录。我们可以通过查看EOF标记来判断一个记录集是否为空。为空,则访问者将被拒绝进入该系统。不为空,则访问者的EmpID值和Manager值将从记录集中返回。写入Session 变量, 变量将在整个网站的所有网页中都是有效的。这些变量的存在与否及其取值将用于确定是否允许进入一个特定的网页,同时也用于访问者进行书目的归还和借阅操作。
图书馆菜单页面
图书馆菜单页面包含指向其他4个页面的链接:管理页面、搜索页面、图书列表页面和主页面。还有一个可显示用户所借书籍的按纽。如果访问者是图书馆管理员,则菜单界面如图所示。如果访问者不是图书馆管理员,则看到如图所示的界面。非管理员的访问者的界面上没有指向管理员菜单页面的链接。
实现办法:访问者登录时在登录页面上的创建的会话变量Session 用于从数据库中获取访问者的有关信息,表示它是否是管理员。如果值为1,就表明访问者是一个管理员,则用如下代码写入一个指向管理员页面的链接:
<% If Session("Manager") = 1 then %>
<A HREF="../html/management_menu.asp"> 管理员菜单</A>
<% end if %>
通过按纽B1是否为空来判断要不要显示用户所借图书,利用一个记录集来获取访问者已经借出了的所有图书的列表。
if NOT isempty(Request.Form("B1")) then
set RSBooks = conn.Execute ("select BookID, Title from LibBooks where " _
& "CheckedOutTo = " & Session("EmpID"))
end if
再用循环语句将所借书以表格形式显示出来。
<table border=1 width="90%" >
<% if NOT isempty(Request.Form("B1")) then
Do Until RSBooks.EOF%>
<TR >
<TD WIDTH=40% height="20"><% Response.Write RSBooks("Title") %></td></tr>
<% RSBooks.MoveNext
loop
end if
%>
</table>
循环将遍历Rsbooks记录集中的每个记录,直到该记录集结束:
该网站中的所有ASP页面都会在访问者访问之前对其进行登录检查。这样就可以避免访问者通过输入某个页面地址然后在没有登录的情况下直接进入该页面的情况发生。此外,每个管理页面都要确认访问者是管理员。
管理菜单页面
管理菜单页面有一个HTML表单,根据选择的按钮的不同,可以进行5种不同的操作:图书的归还、图书的编辑、图书的删除、图书的添加和类别的添加。不管选择了哪一个按钮,该表单都提交人其自身进行处理。
要进行图书的归还、图书的编辑、图书的删除三种操作,须先进行搜索,找到该书后,由图书Book.asp返回一个链接:
<% If Session("Manager") = 1 then %>
<A HREF="../html/management_menu.asp?title=<% response.write RSBooks("Title") %>&BOOKID=<% response.write RSBooks("BOOKID") %>"> 管理员菜单</A>
<% end if %>
而管理者页面通过下列语句
<%=request.querystring("title")%>
<inputzztype=hidden name="BOOKID1"value="<%=request.querystring("BOOKID")%>>
这样就将所找到的书的书号BookID、书名Title传递管理者页面。再进行所须操作。共有3个不同的铵纽,可以进行3种操作。若单击“修改”钮:
则重定向到编辑图书页面,同时把Bookid 传递给该页面。
Response.Redirect "./edit_book.asp?BOOKID="&request("BOOKID1")
将其他的情况需要建立到数据库的连接:
set conn = server.createobject ("adodb.connection")
Conn.Open("FILEDSN=c:/Program Files/Common Files/ODBC/Data Sources/ms access database.dsn")
if NOT isempty(Request.Form("Delete")) and request("BOOKID1")<>"" then
conn.Execute "delete from LibBooks where BOOKID ="&request("BOOKID1")
end if
if (NOT isempty(Request.Form("checkin"))) and request("BOOKID1")<>"" then
conn.Execute "update LibBooks set checkedoutto= 0, status= 'Available' where BookID="&Request("BOOKID1")
end if
页面中的添加新的种类部分包含一个文本控件和一个选择控件。其中选择控件是用所有已经存在的类别列表进行填充的,包括特殊类别 Top level ,该类别表明当前类别是处于类别层次结构中的最顶层。代码如下:
先用一个记录集来填充父类别选择控件:
set RSCategories = conn.Execute("select CategoryName from LibCategories order by CategoryName")
再用下列循环语句:
<%
Do Until RSCategories.EOF
%>
<OPTION VALUE="<% response.write RSCategories("CategoryName") %>"><% response.write RSCategories("CategoryName") %></OPTION>
<%
RSCategories.MoveNext
Loop
%>
遍历RSCategories记录集中的每个记录,并作为一个选项添加到列表中,而记录集中CategoryName 同时作为显示值和传递值:
本页面还包含一个指向添加图书页面的链接。
搜索结果页面
搜索页面的代码获取与访问者查找规则相匹配的图书,然后将这些图书显示给访问者。
搜索页面上的表单包含一个选择控件和一个文本控件。选择控件中的选项是用可搜索 的字段填充的:
需要用一个记录集来保存与访问者的查找规则相匹配的记录:
set RSBooks = conn.Execute("select BookID, Author, Title, Subject from LibBooks where " _
& Request.Form("SearchField") & " Like '%" & Request.Form("SearchCriteria") & "%'")
注意:,符号%表示的是一个广义搜索。这一点类似于ACCESS中的符号*。
然后将所找到的书以表格形式显示出来。代码如下:
<% Do Until RSBooks.EOF %>
<TR VALIGN="top" ALIGN="left">
<TD WIDTH=40% height="20"><B> 书名:</B> <A HREF="../html/book.asp?BookID=<% Response.Write RSBooks("BookID") %>"><% Response.Write RSBooks("Title") %></A></TD>
<td width=20% height="20"><B> 著者:</B> <% Response.Write RSBooks("Author") %></td>
<td width=30% height="20"><B> 主题:</B> <% Response.Write RSBooks("Subject") %> </td>
<% RSBooks.MoveNext
Loop %>
图书页面
图书页面的代码显示图书的有关信息,以及管理图书的出借操作。
该页面通过Querystring 传递BookID
if isempty(Request.QueryString("BookID")) then
Response.Redirect "./search.html"
end if
如果其中不存在,则访问者将被重定向到搜索页面:
如果同时传递表单中包含的变量Action不为空,则表明访问者正借阅该图书:
if Not isempty(Request.QueryString("Action")) then
在这种情况下,需要将图书状态改为 Checkout, 同时需要将Checkedoutto 字段修改为该访问者:
conn.Execute "update LibBooks set Status = 'Checked Out', " _
& "CheckedOutTo = " & Session("EmpID") & " where BookID = " _
& Request.QueryString("BookID")
Response.Redirect "./library_menu.asp"
end if
然后将该访问者重定到图书馆菜单页面:
下一步,利用图书的状态来确定不同的链接
未借出时链接如下:
if RSBooks("status") = "Available" then
LinkText = "<A HREF=""../html/book.asp?Action=CheckOut&BookID=" _
& Request.QueryString("BookID") & """> 借这本书</A>"
如果图书已经借出,就创建一个不同的消息,并将链接设置为指向Library menu 页面:
LinkText = "<A HREF=""../html/library_menu.asp""> 图书已出借,返回主菜单。</A>"
最后根据是否是管理员,显示管理员菜单链接。
<% If Session("Manager") = 1 then %><A HREF="../html/management_menu.asp?title=<% response.write RSBooks("Title") %>&BOOKID=<% response.write RSBooks("BOOKID") %>"> 管理员菜单</A><% end if %>
3.3 网上评优投票系统
3.3.1 功能:
能实现全校性的评选,快捷、公平,且有效,不允许做票。
3.3.2 组成构造
这个系统由3个部分组成——投票页面vote.htm ,处理投票结果的脚本,显示投票页面 。
3 .3.3数据表的设计:
3 .3.4界面设计与重点、难点代码设计
投票页面
该页面是一个纯HTML文件,它让用户选择自己想选举的候选人,并填写自己的详细资料,以确认投票的有效性。页面显示如图所示。
表单处理脚本
在vote.htm中各项数据都填写完毕后,单击确定投票按钮,表单的数据就被提交,
本次评优共有4个候选人,但只能选两个。故用复选框。
投票的有效性通过是否是本校学生,且是否投过票来判断。
if request("passno")<>"" then
sql="select * from stud where password="&"'"&request("passno")&"'" &"and yitu=0"
set rs=cn.execute(sql)
if rs.eof then%>
<h2 align=center><%response.write" 你无权投票"%></h2>
本设计允许少选,不允许多选。通过判断Vote投票界面传递过来的复选按纽值的长度看是否多选。
vo=request("cand")
if len(vo)>4 then%>
<h2 align=center><%response.write " 多选了,无效"%></h2>
然后根据所投的票将对应候选人的投票结果字段加1,同时将该投票人的已投字段置为1。
sqq="update stud set yitu=1 where password="&"'"&request("passno")&"'"
cn.execute(sqq)
if instr(vo,"1") then
cn.execute("update stud set result=result+1 where name=' 李宁'")
end if
if instr(vo,"2") then
cn.execute("update stud set result=result+1 where name=' 杨兰'")
end if
if instr(vo,"3") then
cn.execute("update stud set result=result+1 where name=' 江道明'")
end if
if instr(vo,"4") then
cn.execute("update stud set result=result+1 where name=' 段启文'")
end if%>
显示当前投票情况show.asp
由于投票处理页面已经完成了绝大部分的工作,所以 显示结果页面就很简单了,其功能是从 Stud表文件中读取候选人所得票数,显示在页面上。
页面显示如图
值得注意的代码主要有以下几处:
该页面有自动刷新功能,使在线用户可以尽快的看到最新的选举情况。我们这里设定每隔30秒钟自动刷新一次。
<meta http-equiv="refresh" content="10;URL=show.asp">
显示投票时,我们采用了while循环,把候选人及其得票数,整齐地显示在一个表格中,这种技术在数据库查询结果的显示中也经常用到。代码如下:
<%while not hs.eof %>
<tr>
<td width="100%"><center>
<font color="#8000ff"><big>
<%=hs("name")&" "&hs("result")&" 票"%>
</big> </font>
</center>
</td>
</tr>
<%hs.movenext%>
<%wend%>
3 .4达级考试在线查分系统与计数器的制作
3 .4.1功能:
它提供了在线查看成绩。考生可以在网上使用这一系统,通过输入准考证编号来查询达级考试的结果。
3 .4.2数据表的设计
与评优系统共用STUd表,表设计同上。
3 .4.3界面设计与重点难点代码的设计
该模块需要查询者输入准考证号后来查看结果。若ID1不为空时,表示有表单输入,开始查询数据库。使用 SELECT的SQL指令查询数据库的数据。先设定SQL指令,查询ID符合准考证编号Request.Form("ID1")的数据,下个“Execute”指令,即可开始执行存取、查询数据的动作了。并将查询结果储存到Recordsets组件RS中。
IF Request.Form("ID1")<>"" THEN
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("FILEDSN=c:/Program Files/Common Files/ODBC/Data Sources/ms access database.dsn")
SQL = "SELECT name,id,score FROM stud WHERE id='" & Request.Form("ID1") & "'"
Set RS = Conn.Execute(SQL)
若考试通过,则显示考试的结果,包括姓名、准考证编号、总分和考试结果,分别由RecordSets 组件的RS(0)、RS(1)、RS(2)、RS(3)得到。FS.Field.Count表示RecordSets组件的域的总数,由“for I=0 to RS.Fields.count -1”,取得RS(I)各域的数据。配合 <Table> 表格的HTML语法,将结果填入表格的各单元格中。 若还有下一个数据,就使用RS.MoveNext 移到下一个位置。
3.4.4 页面访问计数器的制作
利用文件处理组件FILESYSTEM的强大功能来制作,比用Application对象计数器要好,Application计数器当有20分钟没有人连上该网页或关机时,计数器会被归零。而文件计数器却不会因时间而消失。我用Count.txt存放访问人次。代码如下:
whichfile=server.mappath("pic/count.txt")
set myfile=server.createobject("scripting.filesystemobject") 创建一个
set thisfile=myfile.opentextfile(whichfile) 组件对象
visit=thisfile.readline
thisfile.close 读取计数器数据文件Count.txt中的计数数据
visit=visit+1 记录自加一次
length=len(visit)
for i=1 to length
response.write "<img src="&mid(visit,i,1)&".jpg></img>" 将记录的数据用图片显示出来
next
set thisfile=myfile.createtextfile(whichfile,1) 将新计数数据写入文件thisfile.writeline(visit)
set myfile=nothing
数字图片我利用PHOTOSHOP中的文字特效制作了9个立方数字:
等
四.系统的使用说明与安装
4 .1运行环境要求
Windows98
Personal Web Server 3.0 (PWS)
Microsoft? Access 2000 (9.0.2812)
4 .2安装设置
A. 将本网站拷贝到硬盘上的某一目录下,如:拷贝至c:/y1下。
B. 运行PWS,将默认的Web站点主目录设置为该目录,如上例应为c:/y1;
具体步骤:
a. 选择“高级”项;
b. 单击“编辑属性”按钮,在出现的“编辑属性”对话框中的“目录”项中填入“c:/y 1”,其他不变,确定;
C. 设置启动默认文档为:yy.asp