3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

asp 与 database (3)

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asp 与 database (3) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

5.4? XML技術(shù)報表打印方案

隨著Internet的迅速發(fā)展和廣泛普及,XML的出現(xiàn)體現(xiàn)出了它的適用性和重要性。XML是由W3C定義的一種標(biāo)記語言,由于XML是沒有版權(quán)限制的,這樣用戶可以建立屬于自己的一套軟件而無須支付任何費(fèi)用。利用ASP結(jié)合XML技術(shù),可以實(shí)現(xiàn)對XML數(shù)據(jù)的報表打印操作。其原理是:通過XML強(qiáng)大的自定義功能,用戶可以很方便地自定義出所需要的數(shù)據(jù)結(jié)構(gòu),然后在服務(wù)器端進(jìn)行動態(tài)編碼,通過Web服務(wù)器將數(shù)據(jù)發(fā)送到客戶端,在客戶端進(jìn)行格式解析后,再根據(jù)服務(wù)器端定義的打印格式,從客戶端直接控制打印機(jī)打印出所需要的報表。

5.4.1? 打印XML數(shù)據(jù)報表

XML的出現(xiàn)推動了Web的發(fā)展。在XML文檔中用戶可以自己定義標(biāo)記,從而明確表達(dá)出數(shù)據(jù)之間的結(jié)構(gòu)關(guān)系。在一些數(shù)據(jù)量不是很大的情況下,可以使用XML文檔作為存儲數(shù)據(jù)的容器,因?yàn)橄鄬τ谠L問數(shù)據(jù)庫而言,訪問XML文檔的速度比較快。在ASP應(yīng)用程序中,可以訪問XML文檔中的數(shù)據(jù),從而將其顯示到頁面中進(jìn)行打印操作。

1.方案分析

XML具有靈活的語法和擴(kuò)展性,極大地強(qiáng)化了保存數(shù)據(jù)和處理數(shù)據(jù)的能力。

XML文檔中的標(biāo)記是由用戶自己定義的,瀏覽器是不能識別的,這就使得XML文檔的數(shù)據(jù)和顯示格式是分離的。在ASP中,通過DOM技術(shù)可以訪問XML文檔中的數(shù)據(jù),然后將其內(nèi)容顯示到ASP頁面中,再應(yīng)用打印技術(shù)打印此XML數(shù)據(jù)報表。

打印XML數(shù)據(jù)報表的流程圖,如圖5.28所示。

圖5.28? 打印XML數(shù)據(jù)報表流程圖

2.實(shí)施過程

? 實(shí)例位置:光盤"mr"5"5.4"5.4.1

XML在處理數(shù)據(jù)的方面應(yīng)用很廣泛,在ASP中通過使用Microsoft XML類庫,可以訪問和操控XML文檔中的數(shù)據(jù),從而實(shí)現(xiàn)對數(shù)據(jù)的有效操作。下面以網(wǎng)上企業(yè)辦公自動化管理系統(tǒng)為例,介紹如何將存儲在XML文檔中的員工工資信息讀取到ASP頁面并進(jìn)行打印操作。運(yùn)行效果如圖5.29所示。

圖5.29? 打印XML數(shù)據(jù)報表

在運(yùn)行本例程之前,需要建立有效的XML文檔,代碼如下:

例程5-16? 代碼位置:光盤"mr"5"5.4"5.4.1"payfor.xml

<?xml version="1.0" encoding="gb2312"?>

<Records>

?? <Record>

?? ??? <num>001</num>

?????? <Name>楊麗麗</Name>

?????? <age>31</age>

?????? <department>研發(fā)部</department>

?????? <payfor>5500</payfor>

?????? <other>1000</other>

?? </Record>

?? <Record>

?? ??? <num>002</num>

?????? <Name>劉圓圓</Name>

?????? <age>28</age>

?????? <department>銷售部</department>

?????? <payfor>4600</payfor>

?????? <other>592</other>

?? </Record>

?? <Record>

?? ??? <num>003</num>

?????? <Name>李方方</Name>

?????? <age>25</age>

?????? <department>廣告部</department>

?????? <payfor>4050</payfor>

?????? <other>976</other>

?? </Record>

?? <Record>

?? ??? <num>004</num>

?????? <Name>李明明</Name>

?????? <age>29</age>

?????? <department>采購部</department>

?????? <payfor>4650</payfor>

?????? <other>1050</other>

?? </Record>

</Records>

在員工工資查看程序處理頁面中,首先創(chuàng)建Document對象實(shí)例,然后設(shè)置該對象的async屬性值為false(即不允許異步下載),并調(diào)用Document對象的Load方法加載指定的XML文檔,再調(diào)用Document對象的getElementsByTagName方法以及childNodes屬性讀取XML文檔中的數(shù)據(jù)。代碼如下:

例程5-17? 代碼位置:光盤"mr"5"5.4"5.4.1"index.asp

<%

?? Set xmlDoc=Server.CreateObject("Microsoft.XMLDOM")

?? Set xml_Record=Server.CreateObject("Microsoft.XMLDOM")

?? Set xml_child=Server.CreateObject("Microsoft.XMLDOM")

?? xmlDoc.async=False

?? xmlDoc.Load(Server.MapPath("payfor.xml"))

?? If xmlDoc.parseError.errorCode <> 0 Then

?? ? Response.Write("<tr><td colspan='6'>出現(xiàn)異常錯誤!</td></tr>")??? ?

?? Else

調(diào)用Document對象的getElementsByTagName方法返回指定名稱的元素集合,使用集合的length屬性獲取到元素的總數(shù),再應(yīng)用for…to循環(huán)語句讀取元素中各節(jié)點(diǎn)的內(nèi)容。

?? ? Set xml_Record=xmlDoc.getElementsByTagName("Record")

?? ? record_num=xml_Record.length

?? ? For i=0 to (record_num-1)

?? ? Set xml_child=xml_Record.item(i)

? %>

<tr>

? <td height="22" align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(0).text%></td>

? <td height="22" align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(1).text%></td>

? <td height="22" align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(2).text%></td>

? <td height="22" align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(3).text%></td>

? <td height="22" align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(4).text%></td>

? <td align="center" valign="middle" bgcolor="#FFFFFF"><%=xml_child.childNodes(5).text%></td>

</tr>

<%Next

? End If

%>

將XML文檔中的數(shù)據(jù)信息顯示到ASP頁面后,就可以應(yīng)用WebBrowse組件對頁面中的報表信息進(jìn)行打印操作了。代碼如下:

例程5-18? 代碼位置:光盤"mr"5"5.4"5.4.1"index.asp

<style type="text/css">

@media print{

.Noprint{display:none /*應(yīng)用該樣式的對象在實(shí)際打印時將不可見*/

}

</style>

<object id=WebBrowser classid=ClSID:8856F961-340A-11D0-A96B-00C04Fd705A2 width="0" height="0"></object>

<a href="#" οnclick="document.all.WebBrowser.Execwb(8,1)" class="Noprint">頁面屬性</a> <a href="#" οnclick="document.all.WebBrowser.Execwb(7,1)" class="Noprint">打印預(yù)覽</a> <a href="#" οnclick="document.all.WebBrowser.Execwb(6,1)" class="Noprint">打印</a>

?? 注意:在打印時,通過頁面設(shè)置可以設(shè)置打印時的邊距。

3.補(bǔ)充說明

在實(shí)際應(yīng)用中,有時需要將數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出到XML文檔中,再進(jìn)行下一步的操作(如打印XML數(shù)據(jù)庫報表、查詢XML數(shù)據(jù)等)。

通過創(chuàng)建XML文檔對象,并設(shè)置對象的相關(guān)屬性和調(diào)用相關(guān)方法,可以實(shí)現(xiàn)將數(shù)據(jù)庫中的數(shù)據(jù)寫入到指定XML文檔的功能,代碼如下:

<%

If Not Isempty(Request("sure")) Then

'將數(shù)據(jù)庫中的數(shù)據(jù)寫入到XML文檔中

Set rs = Server.CreateObject("ADODB.RecordSet")

sqlstr = "SELECT * FROM tb_user"???

rs.Open sqlstr,conn,1,1

If rs.Eof Then

? Response.Write("<script language='javascript'>alert('數(shù)據(jù)庫中暫無記錄,請?zhí)砑佑涗浐笤賴L試運(yùn)行本程序!');window.location.href='index.asp';</script>")

? Response.End()

Else???????

? Dim objXMLDOM, objRootNode, objNode

? Set objXMLDOM = Server.CreateObject("MSXML2.DOMDocument") '創(chuàng)建XML文檔對象

? Set objRootNode = objXMLDOM.createElement("xml") '創(chuàng)建根節(jié)點(diǎn)??

? objXMLDOM.documentElement = objRootNode

? Do While Not rs.Eof??????

?? ??? Set objRowNode = objXMLDOM.createElement("row") '創(chuàng)建父節(jié)點(diǎn)

?? ??? Set objNode = objXMLDOM.createElement("UserName") '創(chuàng)建子節(jié)點(diǎn)

?? ??? objNode.text = rs("UserName")

?? ??? objRowNode.appendChild(objNode)

?? ??? Set objNode = objXMLDOM.createElement("UserPassword") '創(chuàng)建子節(jié)點(diǎn)

?? ??? objNode.text = rs("Upwd")???????????

?? ??? objRowNode.appendChild(objNode)?????????????????

?? ??? Set objNode = objXMLDOM.createElement("UserTel")???? '創(chuàng)建子節(jié)點(diǎn)??????

?? ??? objNode.text = rs("Utel")???????????

?? ??? objRowNode.appendChild(objNode)?????????????????

?? ??? objRootNode.appendChild(objRowNode)???????

?? ??? rs.MoveNext

? loop????????????????

objXMLDOM.Save Server.MapPath("MyXMLDoc.xml")

Response.Write("<script language='javascript'>alert('將數(shù)據(jù)庫中的數(shù)據(jù)成功寫入到XML文檔中!');window.location.href='index.asp';</script>")

? Set objNode = Nothing????????????

? Set objRowNode = Nothing????????

? Set objRootNode = Nothing????

End If???

rs.Close???

Set rs = Nothing

End If

%>

5.4.2? 分頁報表打印

在一般情況下,顯示數(shù)據(jù)的頁面都會提供分頁程序,以方便用戶查看數(shù)據(jù)信息。在ASP應(yīng)用程序中,可以使用JavaScript腳本語言來操作XML文檔中存儲的數(shù)據(jù),并將信息進(jìn)行分頁顯示。

1.方案分析

在使用XML文檔作為存儲數(shù)據(jù)的容器時,根據(jù)實(shí)際情況,對顯示的數(shù)據(jù)可以進(jìn)行分頁控制。應(yīng)用JavaScript腳本語言可以創(chuàng)建XML的Document對象,并使用Document對象的相關(guān)屬性和方法,讀取XML文檔中各節(jié)點(diǎn)包含的數(shù)據(jù),同時還可以對數(shù)據(jù)進(jìn)行分頁控制,然后在ASP頁面中通過CSS樣式來規(guī)范讀取到的XML數(shù)據(jù)的顯示格式,最后應(yīng)用打印技術(shù)按照顯示的分頁效果打印XML數(shù)據(jù)報表。

分頁報表打印的流程圖,如圖5.30所示。

圖5.30? 分頁報表打印的流程圖

2.實(shí)施過程

? 實(shí)例位置:光盤"mr"5"5.4"5.4.2

使用JavaScript腳本語言可以操縱XML文檔中的數(shù)據(jù),并可以將獲取到的數(shù)據(jù)進(jìn)行分頁處理。在ASP頁面中,應(yīng)用CSS樣式可以定義XML數(shù)據(jù)的顯示格式。下面以校園管理系統(tǒng)的檔案管理模塊為例,介紹應(yīng)用JavaScript腳本語言將讀取到的XML數(shù)據(jù)進(jìn)行分頁顯示,并對顯示在頁面中XML數(shù)據(jù)報表進(jìn)行打印。運(yùn)行效果如圖5.31所示。

圖5.31? 分頁報表打印

在運(yùn)行本例程之前,需要建立有效的XML文檔,代碼如下:

例程5-19 代碼位置:光盤"mr"5"5.4"5.4.2"resume.xml

<?xml version="1.0" encoding="gb2312"?>

<Persons>

?? <Person>

?????? <Name>張三</Name>

?????? <Sex>男</Sex>

?????? <Grand>本科</Grand>

?????? <Tel>139565580</Tel>

?????? <Email>1@1.com</Email>

?????? <Like>計算機(jī)、英語</Like>

?? </Person>

?? <Person>

?????? <Name>李四</Name>

?????? <Sex>男</Sex>

?????? <Grand>本科</Grand>

?????? <Tel>133884580</Tel>

?????? <Email>2@1.com</Email>

?????? <Like>計算機(jī)、運(yùn)動</Like>

?? </Person>

?? <Person>

?????? <Name>王元元</Name>

?????? <Sex>女</Sex>

?????? <Grand>專科</Grand>

?????? <Tel>135899680</Tel>

?????? <Email>3@1.com</Email>

?????? <Like>日語、英語</Like>

?? </Person>

?? <Person>

?????? <Name>趙明明</Name>

?????? <Sex>女</Sex>

?????? <Grand>本科</Grand>

?????? <Tel>139258880</Tel>

?????? <Email>4@1.com</Email>

?????? <Like>繪畫、英語</Like>

?? </Person>

</Persons>

在檔案信息列表查看頁面中,用戶可以通過單擊“前一頁”或“后一頁”超鏈接,進(jìn)行分頁查看信息的操作,也可以通過選擇下拉列表框中的頁碼來分頁查看數(shù)據(jù)信息。在此頁面中,提供了“直接打印”、“頁面屬性”、“打印預(yù)覽”和“打印”4個關(guān)于打印技術(shù)的超鏈接,用戶可以根據(jù)實(shí)際需要進(jìn)行相應(yīng)的操作。

在程序處理頁面編寫的JavaScript腳本中,首先創(chuàng)建XML的Document對象實(shí)例,調(diào)用對象的load方法加載指定的XML文檔;然后獲取XML文檔中指定元素的個數(shù),以及元素中包含節(jié)點(diǎn)的數(shù)目,根據(jù)所設(shè)置的初始值,計算顯示的頁碼總數(shù);再定義執(zhí)行翻頁操作的相關(guān)函數(shù),并在定義的顯示XML文檔內(nèi)容的函數(shù)中包含顯示分頁狀態(tài)的函數(shù);最后調(diào)用顯示XML文檔內(nèi)容的函數(shù),實(shí)現(xiàn)分頁顯示XML數(shù)據(jù)報表的功能。代碼如下:

例程5-20 代碼位置:光盤"mr"5"5.4"5.4.2"index.asp

<script language="javascript">

var pagenum=2; //每頁顯示的記錄數(shù)

var page=0;?

var BodyHTML="";

var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");

var mode="Person";

創(chuàng)建Document對象實(shí)例后,加載指定的XML文檔。

xmlDoc.async=false;

xmlDoc.load("resume.xml");

header="<table align='center' width='500' cellspaceing='1' cellpadding='2' border='1' bgcolor='#FFFFEE'><caption>職工檔案登記表</caption><tr align='center' class='title' bgcolor='#C1E6DB'><td>姓名</td><td>性別</td><td>學(xué)歷</td><td>電話</td><td>Email</td><td>愛好</td></tr>";

獲取XML文檔中的記錄條數(shù),以及記錄包含的字段數(shù),并計算顯示的總頁碼數(shù)。

recordNum=xmlDoc.getElementsByTagName(mode).length;

column=xmlDoc.getElementsByTagName(mode).item(0).childNodes;

colNum=column.length;

//計算總頁數(shù)

pagesNumber=Math.ceil(recordNum/pagenum)-1;

自定義顯示“前一頁”超鏈接的函數(shù)。

function Up_Page(page)

{

thePage="<font class='input'>前一頁</font>"

if(page+1 > 1) thePage="<a class='input' href='#' οnclick='JavaScript:return UpPageGo()'>前一頁</a>";

return thePage;

}

function UpPageGo()

{

if(page > 0) page--;

showContent();

BodyHTML="";

}

自定義顯示“后一頁”超鏈接的函數(shù)。

function Next_Page(page)

{

thePage="<font class='input'>后一頁</font>"

if(page < pagesNumber) thePage="<a class='input' href='#' οnclick='JavaScript:return NextPageGo()'>后一頁</a>";

return thePage;

}

function NextPageGo()

{

if(page < pagesNumber) page++;

showContent();

BodyTex="";

}

自定義顯示當(dāng)前頁碼的函數(shù)。

function currentPage()//顯示當(dāng)前頁碼

{

var str;

str="<font class='input'>當(dāng)前是第"+(page+1)+"頁</font>";

return str;

}

自定義顯示總頁碼的函數(shù)。

function totalPage()//顯示總頁碼

{

var str;

str="<font class='input'>共有"+(pagesNumber+1)+"頁</font>";

return str;

}

自定義顯示“分頁狀態(tài)條”的函數(shù)。

function pageBar(page)//顯示分頁狀態(tài)條

{

var str;

str="<br><center class='Noprint'>"+Up_Page(page)+" "+Next_Page(page)+" "+currentPage()+" "+totalPage()+selectPage()+"</center>";

return str;

}

自定義自動轉(zhuǎn)換顯示頁的函數(shù)。

function changePage(tpage)

{

page=tpage;

if(page >= 0) page--;

if(page < pagesNumber) page++;

showContent();

BodyHTML="";

}

自定義具體顯示頁碼功能的下拉列表框函數(shù)。

function selectPage()

{

var sp;

sp="<select name='sel_page' onChange='javascript:changePage(this.options[this.selectedIndex].value)'>";

sp=sp+"<option value=''></option>";

for(t=0;t<=pagesNumber;t++)

{

? sp=sp+"<option value='"+t+"'>"+(t+1)+"</option>";

}

sp=sp+"</select>";

return sp;

}

自定義顯示XML文檔內(nèi)容的函數(shù)。

function showContent()//將XML中的數(shù)據(jù)顯示到頁面中

{

if(!page) page=0;

n=page*pagenum;

endNum=(page+1)*pagenum;

if(endNum > recordNum) endNum=recordNum;

BodyHTML=header+BodyHTML;

for(;n<endNum;n++)

{

? kn=n+1;

? BodyHTML=BodyHTML+"<tr>";

? for(mNum=0;mNum<=colNum-1;mNum++)

? {

??? mName=column.item(mNum).tagName;

?? BodyHTML=BodyHTML+("<td>"+xmlDoc.getElementsByTagName(mName).item(n).text+"</td>");

? }

? BodyHTML=BodyHTML+"</tr>";

}

document.all.showXML.innerHTML=BodyHTML+"</table>"+pageBar(page);

BodyHTML="";

}

調(diào)用自定義的showContent()函數(shù),將XML文檔中的數(shù)據(jù)信息顯示到頁面中指定的DIV標(biāo)記中。

if(recordNum==0)

{

? document.Write("沒有可以顯示的數(shù)據(jù)!");

}

else

{

? showContent();

}

</script>

將XML文檔中的內(nèi)容顯示到頁面后,可以調(diào)用WebBrowser組件對報表進(jìn)行打印,代碼如下:

例程5-21 代碼位置:光盤"mr"5"5.4"5.4.2"index.asp

<div id="showXML"></div>

<p class="Noprint">

<object id=WebBrowser classid=ClSID:8856F961-340A-11D0-A96B-00C04Fd705A2 width="0" height="0"></object>

<a href="#" onClick="document.all.WebBrowser.Execwb(6,6)">直接打印</a> <a href="#" onClick="document.all.WebBrowser.Execwb(8,1)">頁面屬性</a> <a href="#" onClick="document.all.WebBrowser.Execwb(7,1)">打印預(yù)覽</a> <a href="#" onClick="document.all.WebBrowser.Execwb(6,1)">打印</a>

</p>

在頁面中應(yīng)用的CSS樣式定義如下:

例程5-22 代碼位置:光盤"mr"5"5.4"5.4.2"Include"css.css

body,td{font-size:9pt}

A:link{color:#0000FF; text-decoration:none;}

A:visited{color:#0000FF; text-decoration:none;}

A:active{color:#3333ff; text-decoration:none;}

A:hover{color:#FF0000; text-decoration:none;}

td{font-size:9pt; line-height:150%}

.title{font-size:10.8pt; font-weight:bold}

.alert{font-size:9pt; color:#990000; font-weight:bold}

.input{font-size:9pt}

3.補(bǔ)充說明

除了使用JavaScript腳本語言對XML文檔中的數(shù)據(jù)進(jìn)行分頁操作,在ASP中也可以將XML數(shù)據(jù)分頁顯示到網(wǎng)頁中。具體實(shí)現(xiàn)步驟如下:

(1)創(chuàng)建一個XML的FreeThreadedXMLDOM對象,并加載指定的XML文檔,然后選取相關(guān)節(jié)點(diǎn),代碼如下:

<%

Set newXML=Server.CreateObject("Microsoft.FreeThreadedXMLDOM")

newXML.load(server. mappath("content.xml"))

Set newobj=newXML.documentElement.selectSingleNode("newxml")

%>

(2)通過以下代碼實(shí)現(xiàn)對XML數(shù)據(jù)進(jìn)行分頁顯示,代碼如下:

<%

PageSize =5

'設(shè)置每頁顯示5條留言信息

newNum =newobj.childNodes.length-1

PageN=newNum"PageSize+1

'算出總頁數(shù)

PNo=request.querystring("PageNo")

if PNo="" then

'確定每一頁顯示最新的留言

PNo=PageN

end if

Ends=PNo*PageSize-1

'獲得起始節(jié)點(diǎn)

Strs=(PNo-1)*PageSize

'獲得結(jié)束節(jié)點(diǎn)

if Strs<0 then

Strs=0

end if

if Ends>newNum then

Strs=Strs-(Ends-newNum)

Ends=newNum

end if

if Strs<0 then

Strs=0

end if

while Strs<=Ends

'從結(jié)束節(jié)點(diǎn)到起始節(jié)點(diǎn)之間讀取節(jié)點(diǎn)數(shù)據(jù)

title=newobj.childNodes.item(Strs).childNodes.item(0).text

content = newobj.childNodes.item(Strs).childNodes.item(1).text

'取得留言內(nèi)容

content = replace(content,chr(13),"<br>")

'應(yīng)用replace函數(shù)替代回車符

content = replace(content,chr(32)," ")

'應(yīng)用replace函數(shù)替代空格符

%>

<tr>

<td ><div align="center" class="STYLE2"><%=title%></div></td>

<td class="STYLE2"><div align="center"><%=content%></div></td>

</tr>

<%

Strs=Strs+1

wend

set newXML=nothing

%> ?

</table><br>共有<<%=PageN%>>頁

<%

'分頁

if cint(PNo)<>1 then

response.write "<a href='index.asp?PageNo="&(PNo-1)&"'>上一頁</a> "

end if

if cint(PNo)<>PageN then???????

response.write "<a href='index.asp?PageNo="&(PNo+1)&"'>下一頁</a>"

end if

%>

5.4.3? XSL瀏覽報表打印

XSL語言可以用于轉(zhuǎn)換XML文檔,也可以格式化XML文檔。應(yīng)用XSL語言可以定義XML文檔的顯示格式,即將XML文檔轉(zhuǎn)換成能被瀏覽器識別的HTML文件;應(yīng)用XSL語言還可以向輸出文件中添加新的元素、重新排列數(shù)據(jù)以及決定哪些元素顯示哪些元素不顯示等。

根據(jù)實(shí)際需要,可以通過XSL格式化XML文檔,并使數(shù)據(jù)信息以一定的格式顯示到ASP頁面中,然后對報表數(shù)據(jù)執(zhí)行打印操作。

1.方案分析

使用XSL語言可以靈活、快速地定義出XML文檔的顯示格式,使格式化后的XML文檔數(shù)據(jù)以清晰的結(jié)構(gòu)顯示在用戶面前。在ASP程序中,可以應(yīng)用XSL瀏覽XML數(shù)據(jù)報表,并進(jìn)行打印操作。

首先,用戶需要建立有效的.xml文件和.xsl文件,然后在ASP程序中創(chuàng)建XML的DOMDocument對象實(shí)例,應(yīng)用該對象的相關(guān)方法加載建立好的兩個文件,并應(yīng)用.xsl文件來格式化.xml文件,這樣XML文檔中的數(shù)據(jù)就能夠以.xsl文件規(guī)定的格式進(jìn)行顯示了,再應(yīng)用相關(guān)的打印技術(shù)打印顯示在ASP頁面中的數(shù)據(jù)報表。

XSL瀏覽報表打印的流程圖,如圖5.32所示。

圖5.32? XSL瀏覽報表打印流程圖

2.實(shí)施過程

? 實(shí)例位置:光盤"mr"5"5.4"5.4.3

在實(shí)際應(yīng)用中,不僅可以通過CSS樣式來定義XML文檔的顯示格式,還可以應(yīng)用XSL語言來轉(zhuǎn)換或格式化XML文檔,使瀏覽器可以識別XML文檔中的數(shù)據(jù)結(jié)構(gòu),從而使數(shù)據(jù)以指定的格式顯示在頁面中。下面以企業(yè)績效管理系統(tǒng)的員工考勤模塊為例,介紹如何使用XSL格式化XML文檔,并將XML文檔中的數(shù)據(jù)以分頁的形式顯示在頁面中,然后打印顯示的報表。運(yùn)行效果如圖5.33所示。

圖5.33? XSL瀏覽報表打印

在運(yùn)行本例程之前,需要建立有效的XML文檔,代碼如下:

例程5-23? 代碼位置:光盤"mr"5"5.4"5.4.3"emp_work.xml

<?xml version="1.0" encoding="gb2312"?>

<Persons>

?? <Person>

?? ??? <num>001</num>

?????? <date>2007年9月</date>

?????? <Name>張三</Name>

?????? <department>研發(fā)部</department>

?????? <count>10</count>

?????? <day>1</day>

?? </Person>

?? <Person>

?? ??? <num>002</num>

?????? <date>2007年9月</date>

?????? <Name>李四</Name>

?????? <department>銷售部</department>

?????? <count>2</count>

?????? <day>0</day>

?? </Person>

下面定義了兩個<Person2>的標(biāo)記,作為分頁的標(biāo)識。

?? <Person2>

?? ??? <num>003</num>

?????? <date>2007年9月</date>

?????? <Name>楊林林</Name>

?????? <department>企劃部</department>

?????? <count>0</count>

?????? <day>2</day>

?? </Person2>

?? <Person2>

?? ??? <num>004</num>

?????? <date>2007年9月</date>

?????? <Name>孫圓圓</Name>

?????? <department>廣告部</department>

?????? <count>1</count>

?????? <day>0</day>

?? </Person2>

</Persons>

建立了有效的XML文檔后,為此XML文檔建立.xsl文件,在.xsl文件中使用表格來規(guī)定數(shù)據(jù)的顯示格式。代碼如下:

例程5-24? 代碼位置:光盤"mr"5"5.4"5.4.3"emp_work.xsl

<?xml version="1.0" encoding="gb2312"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/Persons">

首先在<p>標(biāo)記中建立表格,此表格的作用是使XML文檔中<Person>標(biāo)記內(nèi)的數(shù)據(jù)顯示在指定的單元格中。

<p><table align="center" width="500" cellpadding="2" cellspacing="1" border="0" bgcolor="#666600" class="table_style">

<caption align="center">員工考勤記錄表</caption>

? <tr align="center" class="title" bgcolor="#e5e5e5">

??? <td width="25"><xsl:text disable-output-escaping="yes"></xsl:text></td>

?? <td>序號</td>

?? <td>日期</td>

?? <td>姓名</td>

?? <td>所屬部門</td>

?? <td>早退遲到次數(shù)</td>

?? <td>缺席天數(shù)</td>

? </tr>

? <xsl:for-each select="Person">

? <tr bgcolor="#ffffff">

??? <td align="right"><xsl:value-of select="position()"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="num"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="date"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="Name"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="department"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="count"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="day"/></td>

? </tr>

? </xsl:for-each>

</table></p>

再次在<p>標(biāo)記中建立表格,此表格的作用是使XML文檔中<Person2>標(biāo)記內(nèi)的數(shù)據(jù)顯示在指定的單元格中。

<p><table align="center" width="500" cellpadding="2" cellspacing="1" border="0" bgcolor="#666600" class="table_style">

? <tr align="center" class="title" bgcolor="#e5e5e5">

??? <td width="25"><xsl:text disable-output-escaping="yes"></xsl:text></td>

?? <td>序號</td>

?? <td>日期</td>

?? <td>姓名</td>

?? <td>所屬部門</td>

?? <td>早退遲到次數(shù)</td>

?? <td>缺席天數(shù)</td>

? </tr>

? <xsl:for-each select="Person2">

? <tr bgcolor="#ffffff">

??? <td align="right"><xsl:value-of select="position()"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="num"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="date"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="Name"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="department"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="count"/></td>

?? <td style="color:#990000" align="center"><xsl:value-of select="day"/></td>

? </tr>

? </xsl:for-each>

</table></p>

</xsl:template>

</xsl:stylesheet>

建立了有效的.xml文件和.xsl文件后,自定義一個函數(shù),此函數(shù)的作用是創(chuàng)建XML的DOMDocument對象實(shí)例,應(yīng)用對象的load方法分別加載.xml文件和.xsl文件,然后調(diào)用DOMDocument對象的TransformNode方法使用.xsl文件格式化.xml文件。代碼如下:

例程5-25? 代碼位置:光盤"mr"5"5.4"5.4.3"Include"formatxml.asp

<%

Function FormatXML(XMLfile,XSLfile)

Dim objXML,objXSL

strXMLfile=Server.MapPath(XMLfile)

strXSLfile=Server.MapPath(XSLfile)

Set objXML=Server.CreateObject("MSXML2.DOMDocument")

Set objXSL=Server.CreateObject("MSXML2.DOMDocument")

objXML.async=false

If objXML.Load(strXMLfile) Then

? objXSL.async=false

? objXSL.ValidateonParse=false

? If objXSL.Load(strXSLfile) Then

??? On Error Resume Next

?? FormatXML=objXML.transformNode(objXSL)'很重要

?? If objXSL.parseError.errorCode <> 0 Then

?? ? Response.Write("<br><hr>")

?? ? Response.Write("Error Code: "&objXSL.parseError.errorCode)

?? ? Response.Write("<br>Error Reason: "&objXSL.parseError.reason)

?? ? Response.Write("<br>Error Line: "&objXSL.parseError.line)

?? ? FormatXML="<span class=""alert"">格式化XML文件錯誤!</span>"

?? End IF

? Else

?? ? Response.Write("<br><hr>")

?? ? Response.Write("Error Code: "&objXSL.parseError.errorCode)

?? ? Response.Write("<br>Error Reason: "&objXSL.parseError.reason)

?? ? Response.Write("<br>Error Line: "&objXSL.parseError.line)

?? ? FormatXML="<span class=""alert"">格式化XML文件錯誤!</span>"

? End If

Else

?? ? Response.Write("<br><hr>")

?? ? Response.Write("Error Code: "&objXSL.parseError.errorCode)

?? ? Response.Write("<br>Error Reason: "&objXSL.parseError.reason)

?? ? Response.Write("<br>Error Line: "&objXSL.parseError.line)

?? ? FormatXML="<span class=""alert"">格式化XML文件錯誤!</span>"

End If

Set objXML=Nothing

Set objXSL=Nothing

End Function

%>

做好前期準(zhǔn)備之后,在首頁面中包含Include文件夾中的formatxml.asp文件,調(diào)用自定義的FormatXML(XMLfile,XSLfile)函數(shù)顯示XML文檔中的數(shù)據(jù)信息,并引用WebBrowser組件打印頁面中的XML數(shù)據(jù)報表。代碼如下:

例程5-26? 代碼位置:光盤"mr"5"5.4"5.4.3"index.asp

<style media="print">

.Noprint{display:none;}

</style>

<!--#include file="Include/formatxml.asp"-->

<%=FormatXML("emp_work.xml","emp_work.xsl")%>

<object id=WebBrowser classid=ClSID:8856F961-340A-11D0-A96B-00C04Fd705A2 width="0" height="0">

</object>

<p> <a href="#" οnclick="document.all.WebBrowser.Execwb(8,1)" class="Noprint">頁面屬性</a> <a href="#" οnclick="document.all.WebBrowser.Execwb(7,1)" class="Noprint">打印預(yù)覽</a> <a href="#" οnclick="document.all.WebBrowser.Execwb(6,1)" class="Noprint">打印</a> </div></p>

3.補(bǔ)充說明

除了調(diào)用XML對象的相關(guān)方法使用.xsl文件格式化.xml文件,還可以在XML文檔中直接鏈接指定的.xsl文件,從而實(shí)現(xiàn)轉(zhuǎn)換XML文檔格式的效果。代碼如下:

XSL樣式表文件xmlf.xsl。

<?xml version="1.0" encoding="gb2312"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">

?? <html>

?? <body>

?? <center>

?? <table width="300" height="30" border="10" cellspacing="0" cellpadding="0">

?? ? <tr align="center">

?????? <td>書名</td>

?????? <td>頁碼</td>

?? ? </tr>

<xsl:for-each select="PUBLICATION/BOOK">

?? ? <tr align="center" height="30">

?????? <td><xsl:value-of select="TITLE"/></td>

?????? <td><xsl:value-of select="PAGES"/></td>

?? ? </tr>

</xsl:for-each>?????

?? </table>

?? </center>

?? </body>

?? </html>

</xsl:template>

</xsl:stylesheet>

XML文件index.xml。

<?xml version="1.0" encoding="gb2312"?>

<?xml-stylesheet type="text/xsl" href="xmlf.xsl"?>

<PUBLICATION>

?? <BOOK>

?????? <TITLE>ASP技術(shù)</TITLE>

?????? <PAGES>760</PAGES>

?? </BOOK>

?? <BOOK>

?????? <TITLE>SQL技術(shù)</TITLE>

?????? <PAGES>520</PAGES>

?? </BOOK>

</PUBLICATION>

在XML文檔中如果鏈接了多個XSL樣式表,瀏覽器將使用第一個XSL樣式表而忽略其他XSL樣式表;如果同時鏈接一個CSS樣式表文件和一個XSL樣式表,瀏覽器將只使用XSL樣式表。

5.5? 其他報表打印方案

除了以上介紹的Excel報表打印方案、XML技術(shù)報表打印方案和Crystal Report水晶報表打印方案,在ASP程序中還可以應(yīng)用其他技術(shù)來實(shí)現(xiàn)報表打印的功能。本節(jié)將介紹Word報表打印、自定義ActiveX組件打印Access報表、圖形報表打印以及套打報表。

5.5.1? Word報表打印

Microsoft Word是微軟公司推出的Microsoft Office辦公軟件中的一個組件,它是一個功能強(qiáng)大的文字處理軟件,可以進(jìn)行文字輸入、編輯、排版和打印操作等。在ASP程序中,可以創(chuàng)建Word的相關(guān)對象將網(wǎng)頁中的內(nèi)容導(dǎo)入到Word中,也可以調(diào)用Word中的數(shù)據(jù)報表,然后進(jìn)行報表打印。

1.方案分析

在Web服務(wù)器上安裝了Microsoft Word軟件后,ASP就可以創(chuàng)建Word的相關(guān)對象,從而應(yīng)用該對象的屬性和方法對網(wǎng)頁中的數(shù)據(jù)或者Word文檔中的數(shù)據(jù)進(jìn)行操作了。

網(wǎng)頁上顯示的數(shù)據(jù)一般都是從數(shù)據(jù)庫中讀取出來的,創(chuàng)建Word的Application對象可以將網(wǎng)頁中具有一定顯示格式的數(shù)據(jù)導(dǎo)入到Word文檔中,然后進(jìn)行報表打印的操作。

在一些實(shí)際工作中,用戶可能會應(yīng)用Word文檔來存儲一些數(shù)據(jù)報表(如:制作商務(wù)表格等),并進(jìn)行排版工作等,為了方便用戶查看Word文檔中的內(nèi)容,ASP可以編寫動態(tài)代碼打開指定的Word文檔,然后再執(zhí)行打印命令。

Word報表打印的流程圖,如圖5.34所示。

圖5.34? Word報表打印的流程圖

2.實(shí)施過程

Microsoft Word在文字編輯、打印方面的應(yīng)用很廣泛,ASP通過調(diào)用Word的相關(guān)對象可以訪問Word文檔中的數(shù)據(jù)內(nèi)容。下面介紹兩種在ASP程序中通過Word進(jìn)行報表打印的方法,分別是將網(wǎng)頁內(nèi)容導(dǎo)入到Word和打印Word報表。

l????????? 方法一? 將網(wǎng)頁內(nèi)容導(dǎo)入到Word

? 實(shí)例位置:光盤"mr"5"5.5"5.5.1"01

在本章的5.2節(jié)中介紹了Excel報表打印方案,在ASP中不僅可以將網(wǎng)頁中的內(nèi)容保存到Excel中,還可以將網(wǎng)頁中指定的內(nèi)容導(dǎo)入到Word中。下面以企業(yè)內(nèi)部管理系統(tǒng)的庫存管理模塊為例,介紹將網(wǎng)頁中顯示的數(shù)據(jù)導(dǎo)入到Word,然后再進(jìn)行打印操作的過程。運(yùn)行結(jié)果如圖5.35所示。

圖5.35? 將網(wǎng)頁內(nèi)容導(dǎo)入到Word

在庫存商品信息查看頁面中,可以瀏覽到從庫存商品信息表中讀取到的數(shù)據(jù)信息。代碼如下:

例程5-27? 代碼位置:光盤"mr"5"5.5"5.5.1"01"index.asp

<%

??? Set rs=Server.CreateObject("ADODB.Recordset")

?? sqlstr="select * from tb_store"

?? rs.open sqlstr,conn,1,1

?? do while not rs.eof

%>

<tr align="center">

? <td height="26"><%=rs("Gname")%></td>

? <td height="26"><%=rs("Gunit")%></td>

? <td width="93" height="26"><%=rs("Gstd")%></td>

? <td width="167" height="26"> <%=rs("Gprovide")%></td>

? <td width="85" height="26"> <%=rs("Gconect")%></td>

</tr>

<%

??? rs.movenext

?? loop

?? rs.close

?? Set rs=Nothing

%>

<div align="center"><a href="vbscript:" onClick="vbscript:SaveDoc()">Word報表打印</a></div>

單擊頁面中的“Word報表打印”超鏈接,就可以將表格中的數(shù)據(jù)寫入到Word文檔中,同時生成的臨時Word文檔會自動打開。運(yùn)行效果如圖5.36所示。

圖5.36? 保存網(wǎng)頁內(nèi)容的Word文檔

在程序處理頁面的客戶端VBScript腳本中,自定義一個子過程用于將網(wǎng)頁中的表格數(shù)據(jù)寫入到Word文檔中。具體的實(shí)現(xiàn)步驟如下:

(1)創(chuàng)建一個Word的Application對象實(shí)例,再調(diào)用Word的Documents集合的Add方法建立一個新的文檔,并將頁面中的表格數(shù)據(jù)存儲在一個數(shù)組中。

(2)將表格的標(biāo)題寫入到Word中,并增添一個空行。

(3)在Word文檔中建立一個表格,并將數(shù)組中的內(nèi)容填寫在該表格中。

(4)保存新建立的Word文檔。

代碼如下:

例程5-28? 代碼位置:光盤"mr"5"5.5"5.5.1"01"index.asp

<script language="vbscript">

Sub SaveDoc

Dim Table1

Set table1=document.all.data

row=Table1.rows.length

set wdapp=CreateObject("Word.Application")? //創(chuàng)建Word應(yīng)用程序

wdapp.visible=true

set wddoc=wdapp.documents.add? //添加新的文檔

colnum =Table1.rows(1).cells.length

將頁面中表格的內(nèi)容存放在數(shù)組中。

reDim theArray(colnum,row)

For i=0 to row-1

?? For j=0 to colnum-1

?????? thearray(j+1,i+1)=table1.rows(i).cells(j).innerHTML

?? next

next

intNumrows=row

將表格的標(biāo)題信息寫入到Word文檔中,并設(shè)置其字體樣式。

wdapp.application.activedocument.paragraphs.add.range.insertbefore("庫存商品記錄表")

set rngpara=wdapp.application.activedocument.paragraphs.add.range

with rngpara

.paragraphformat.alignment=1

.font.name="arial"

.font.size=9

End with

Set rngPara=wdapp.Application.ActiveDocument.Paragraphs(1).Range

With rngPara

.Bold=True

.ParagraphFormat.Alignment=1

.Font.Name="Arial"

.Font.Size=12

End With

在文檔的指定段落的區(qū)域內(nèi),添加一表格,將數(shù)組中的數(shù)據(jù)寫入到表格中。

set rngcurrent=wdapp.application.activedocument.paragraphs(3).range

set tabCurent=wdapp.application.activedocument.tables.add(rngcurrent,intnumrows,colnum)

For i=1 To row

?? For j=1 to colnum??? ?????? wdapp.application.activeDocument.Tables(1).Rows(i).Cells(j).Range.InsertAfter theArray(j,i)? ?????? wdapp.application.activeDocument.Tables(1).Rows(i).Cells(j).Range.paragraphFormat.alignment=1

?? next

next

保存建立的Word文檔。

wdapp.application.activeDocument.SaveAs "NewDoc.doc",0,false,"",true,"",false,false,false,false,false

End sub

</script>

將網(wǎng)頁中的內(nèi)容導(dǎo)入到Word文檔后,用戶可以根據(jù)實(shí)際需要再對數(shù)據(jù)報表進(jìn)行編輯操作,然后打印報表。

l????????? 方法二? 打印Word報表

? 實(shí)例位置:光盤"mr"5"5.5"5.5.1"02

在ASP中不僅可以調(diào)用Word的相關(guān)對象將網(wǎng)頁中的內(nèi)容導(dǎo)入到Word,還可以打開Word文檔直接進(jìn)行打印操作。下面以企業(yè)營銷管理系統(tǒng)的銷售報表模塊為例,介紹如何打開指定的Word報表文件,并進(jìn)行打印操作。運(yùn)行效果如圖5.37所示。

圖5.37? 打印Word報表

在銷售報表查看和打印頁面中,首先選擇相關(guān)的Word文檔,然后單擊“Word報表打印”按鈕,這時選擇的Word文檔將自動打開,并處于打印的狀態(tài)中。

為了便于讀者理解,下面以列表的形式給出銷售報表查看頁面index.asp中所涉及到的表單及表單元素,如表5.8所示。

表5.8?????????? ??????銷售報表查看頁面index.asp中的表單及表單元素

名稱

元素類型

重要屬性

含義

form

form

action="" method="post" enctype="multipart/form-data"

選擇需要打印的Word文檔

file1

input

type="file" id="file1" size="20"

確定Word文檔的路徑

print

input

type="submit" id="print" onClick="openWord(file1.value)"

Excel文件路徑

在頁面中單擊“Word報表打印”按鈕后的運(yùn)行效果如圖5.38所示。

圖5.38? 打開指定的Word文檔

在程序處理頁面中的客戶端VBScript腳本中,自定義一個子過程用于打開并打印指定的Word文檔。在該子過程中,首先創(chuàng)建Word的Application對象實(shí)例,再調(diào)用Documents集合的Open方法打開Word文檔,最后調(diào)用Printout方法打印Word文檔。代碼如下:

例程5-29? 代碼位置:光盤"mr"5"5.5"5.5.1"02"index.asp

<script language="vbscript">

Sub openWord(filename)?

Set wrd=CreateObject("word.Application")

wrd.visible=true

wrd.Documents.Open(filename)

wrd.Application.Printout()

wrd=null

End Sub

</script>

3.補(bǔ)充說明

Microsoft Word是常用的文字編輯工具,使用Word可以進(jìn)行記錄會議內(nèi)容、起草協(xié)議等工作。為了用戶操作方便,在ASP中可以調(diào)用Word直接打印頁面中的數(shù)據(jù)信息,即將用戶在表單中輸入的信息直接封裝到Word中,然后再進(jìn)行打印操作。如圖5.39所示。

圖5.39? 調(diào)用Word進(jìn)行Web打印

自定義一個VBScript腳本子過程,在該子過程中,首先獲取頁面中表單的數(shù)據(jù)信息,然后在客戶端VBScript腳本中創(chuàng)建Word的Document對象,應(yīng)用對象的相應(yīng)方法將頁面內(nèi)容裝入到Word文檔中,并直接進(jìn)行打印操作。代碼如下:

<script language="vbscript">

Sub word_print

Set objWordDoc=CreateObject("Word.Document")

title=document.all.form1.txt_title.value&CHR(10)

nowtime=document.all.form1.txt_time.value&CHR(10)

table=title&nowtime&document.all.form1.txt_content.value

objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertBefore(table)

objWordDoc.Application.ActiveDocument.Paragraphs.Add.Range.InsertBefore("")

Set rngPara=objworddoc.Application.ActiveDocument.Paragraphs(1).Range

objworddoc.Application.ActiveDocument.SaveAs "如何調(diào)用Word進(jìn)行Web打印"

objWordDoc.application.printout()

End Sub

</script>

5.5.2? 打印Access報表

在Microsoft Access數(shù)據(jù)庫中,用戶可以根據(jù)數(shù)據(jù)表創(chuàng)建Access報表,從而快速、準(zhǔn)確地掌握數(shù)據(jù)信息。在ASP應(yīng)用程序中,通過調(diào)用Access的相關(guān)對象可以打印指定的Access報表。

1.方案分析

Microsoft Access數(shù)據(jù)庫不僅具有強(qiáng)大的數(shù)據(jù)存儲功能,還擁有完善的報表功能,它支持子報、表、多欄報表、圖形報表等多種復(fù)雜元素。在ASP中,調(diào)用Access的Application對象,可以開發(fā)直接打印Access報表的程序。

打印Access報表的流程圖,如圖5.40所示。

圖5.40? 打印Access報表流程圖

2.實(shí)施過程

? 實(shí)例位置:光盤"mr"5"5.5"5.5.2

在ASP應(yīng)用程序中直接打印Access報表,可以方便用戶對數(shù)據(jù)庫的一些相關(guān)操作。下面以新聞網(wǎng)站為例,介紹ASP調(diào)用Access的Application對象實(shí)現(xiàn)打印Access數(shù)據(jù)庫中新聞報表的功能。運(yùn)行效果如圖5.41所示。

圖5.41? 打印Access報表

在Microsoft Access數(shù)據(jù)庫中,可以使用向?qū)?chuàng)建報表。下面介紹具體創(chuàng)建報表的步驟:

(1)打開Access數(shù)據(jù)庫,單擊左側(cè)面板中的“報表”對象,在右側(cè)選擇“使用向?qū)?chuàng)建報表”的命令,打開“報表向?qū)А贝翱?#xff0c;在此窗口中選擇表及字段名稱,如圖5.42所示。

圖5.42? 選擇表及指定字段

(2)單擊“下一步”按鈕,可在打開的窗口中“確定是否添加分組類別”。再單擊“下一步”按鈕,在打開的窗口中可以確定記錄所用的排序次序,如圖5.43所示。

圖5.43? 確定記錄所用的排序次序

(3)單擊兩次“下一步”按鈕,分別確定報表的布局方式和所用樣式。然后在下一個窗口中為報表指定標(biāo)題,這里輸入“打印新聞報表”,如圖5.44所示。最后,單擊“完成”按鈕成功創(chuàng)建Access報表。

圖5.44? 定義報表標(biāo)題

創(chuàng)建Access報表后,在ASP頁面中建立表單。在表單中,用戶通過選擇所要操作的數(shù)據(jù)庫文件以及輸入Access數(shù)據(jù)庫中報表的名稱,來觸發(fā)打印Access報表的程序。下面給出表單中關(guān)鍵元素的代碼:

例程5-30? 代碼位置:光盤"mr"5"5.5"5.5.2"index.asp

<form action="" method="post" name="form1" onSubmit="PrintReport()">

Access數(shù)據(jù)庫路徑:<input name="txt_db" type="file" id="txt_db">

Access數(shù)據(jù)庫中報表名稱:<input name="txt_report" type="text" id="txt_report" title="Access數(shù)據(jù)庫中報表名稱">

<input type="submit" name="Submit" value="打印Access報表"? onClick="return Mycheck(this.form)">

<input type="reset" name="Submit2" value="重置表單內(nèi)容"></td>

</form>

在ASP頁面中,自定義一個客戶端VBScript腳本的sub過程。在該過程中,首先創(chuàng)建Access的Application對象實(shí)例,然后調(diào)用對象的OpenCurrentDatabase方法連接所指定的Access數(shù)據(jù)庫,再調(diào)用OpenReport方法打印指定名稱的Access報表,最后給出打印成功的提示信息。代碼如下:

例程5-31? 代碼位置:光盤"mr"5"5.5"5.5.2"index.asp

<script language="vbscript">

sub PrintReport()

Set pr = CreateObject("Access.Application")

pr.OpenCurrentDatabase document.all.txt_db.value

pr.DoCmd.OpenReport document.all.txt_report.value

pr.CloseCurrentDatabase

Set pr = Nothing

Msgbox "恭喜您,打印Access報表成功!"

end sub

</script>

3.補(bǔ)充說明

編寫ASP應(yīng)用程序所采用的VBScript語言是一種簡單的腳本語言,只能實(shí)現(xiàn)有限的功能。而使用一些開發(fā)工具編寫的組件,可以調(diào)用各種系統(tǒng)資源,實(shí)現(xiàn)較為復(fù)雜的功能。微軟公司的ASP具有良好的可擴(kuò)展性,而擴(kuò)展ASP最有效的途徑就是開發(fā)自定義的DLL組件,使用DLL組件的優(yōu)勢如下:

(1)實(shí)現(xiàn)代碼封裝技術(shù)。在開發(fā)程序時,ASP代碼是嵌入在HTML語言中的,如果頁面設(shè)計有變動,設(shè)計人員很難對嵌有代碼的頁面做改動,如果將代碼封裝在組件中,既方便設(shè)計人員進(jìn)行頁面布局,又增強(qiáng)程序的可讀性。

(2)起到保護(hù)頁面源碼的作用。ASP程序是無須編譯的,即它是以源碼的形式存儲在服務(wù)器上的,源程序很容易被他人獲取。而組件是經(jīng)過編譯的,服務(wù)器端只有一個編譯的DLL文件,保證源代碼不被泄漏。

(3)編譯好的組件可以重復(fù)使用,節(jié)約開發(fā)時間。

(4)用戶將程序開發(fā)代碼封裝在組件中,可以申請知識產(chǎn)權(quán)保護(hù)其利益。

讀者可以嘗試使用Visual Basic軟件來自定義ActiveX組件,然后調(diào)用該組件來實(shí)現(xiàn)特定的功能模塊。

5.5.3? 圖形報表打印

圖形報表是一種非常直觀的數(shù)據(jù)表現(xiàn)形式,它是通過柱狀圖、餅型圖、折線圖等多種圖表格式來統(tǒng)計數(shù)據(jù)的報表形式。在ASP中,可以利用圖形報表來統(tǒng)計和處理數(shù)據(jù),并進(jìn)行打印操作等。

1.方案分析

在實(shí)際工作中,為了使用戶能夠以直觀的方式查看到數(shù)據(jù)報表的內(nèi)在結(jié)構(gòu),并能夠明確報表所表達(dá)的含義,可以使用圖形報表作為報表的表現(xiàn)形式。在ASP應(yīng)用程序中,可以調(diào)用Visual Basic軟件中內(nèi)置的MSChart組件(MSChart組件是Microsoft提供的ActiveX組件之一,可以使用圖形方式顯示數(shù)據(jù)的圖表),將數(shù)據(jù)庫中的數(shù)據(jù)信息以圖形的方式展現(xiàn)在頁面中,從而實(shí)現(xiàn)圖形報表打印的功能。

圖形報表打印的流程圖,如圖5.45所示。

圖5.45? 圖形報表打印流程圖

2.實(shí)施過程

? 實(shí)例位置:光盤"mr"5"5.5"5.5.3

在ASP中可以引用外部組件,使用柱狀圖、折線圖等形式將統(tǒng)計數(shù)據(jù)展現(xiàn)在網(wǎng)頁中。下面以網(wǎng)站的銷售管理模塊為例,介紹在選擇查詢條件并對商品銷售情況進(jìn)行統(tǒng)計核實(shí)時,利用圖形報表顯示查詢結(jié)果的過程。運(yùn)行效果如圖5.46所示。

圖5.46? 圖形報表打印

在商品銷售統(tǒng)計頁面中,提供了按月、按年或者按照具體日期進(jìn)行銷售統(tǒng)計的功能。在默認(rèn)情況下,是針對所有商品進(jìn)行銷售統(tǒng)計的,用戶也可以輸入具體的商品編號只針對一種商品進(jìn)行銷售統(tǒng)計。

在程序處理頁面中,首先根據(jù)選擇的統(tǒng)計類型,確定對應(yīng)的SQL查詢語句;然后使用<object>標(biāo)記嵌入MSChart組件;再通過JavaScript腳本語言設(shè)定MSChart組件的各屬性值,使查詢到的結(jié)果以圖形方式顯示在頁面中。代碼如下:

例程5-32? 代碼位置:光盤"mr"5"5.5"5.5.3"index.asp

<%

If Not Isempty(Request("btt_sell")) Then

? txt_Gnum=Request.Form("txt_Gnum")

? txt_type=Request.Form("txt_type")

? txt_amount=Request.Form("txt_amount")

? txt_start=Request.Form("txt_start")

? txt_end=Request.Form("txt_end")

如果用戶在商品編號文本框中輸入內(nèi)容,則判斷此商品編號是否存在。

? If txt_Gnum<>"" Then

??? Set rs=Server.CreateObject("ADODB.Recordset")

??? sqlstr="select Gnum from tb_sell where Gnum='"&txt_Gnum&"'"

??? rs.open sqlstr,conn,1,1

??? If rs.eof or rs.bof Then

????? Response.Write("<script language='javascript'>alert('此商品沒有銷售信息,請重新輸入!');history.back();</script>")??? ?

??? End If

?? rs.close

?? Set rs=Nothing

? End If

根據(jù)用戶選擇的統(tǒng)計類型,確定SQL查詢語句。獲取到的變量txt_type的值如果值為1,則按照商品的銷售月份進(jìn)行分組查詢,并統(tǒng)計指定月份的銷售金額;如果值為2,則按照商品的銷售年份進(jìn)行分組查詢,并統(tǒng)計指定年份的銷售金額。

? Select case txt_type

? case "1"

??? fig="個月"

??? If txt_Gnum<>"" Then

????? sqlstr="select * from (select top "&txt_amount&" sum(Smoney) as totals,Month(Sdate) as IssueDate from tb_sell where Gnum='"&txt_Gnum&"' group by Month(Sdate) order by Month(Sdate) desc) as a order by a.IssueDate"

??? Else

????? sqlstr="select * from (select top "&txt_amount&" sum(Smoney) as totals,Month(Sdate) as IssueDate from tb_sell group by Month(Sdate) order by Month(Sdate) desc) as a order by a.IssueDate"

??? End If

? case "2"

??? fig="年"

??? If txt_Gnum<>"" Then

????? sqlstr="select * from (select top "&txt_amount&" sum(Smoney) as totals,Year(Sdate) as IssueDate from tb_sell where Gnum='"&txt_Gnum&"' group by Year(Sdate) order by Year(Sdate) desc) as a order by a.IssueDate"

??? Else

????? sqlstr="select * from (select top "&txt_amount&" sum(Smoney) as totals,Year(Sdate) as IssueDate from tb_sell group by Year(Sdate) order by Year(Sdate) desc) as a order by a.IssueDate"

??? End If

? End Select

通過日期區(qū)間統(tǒng)計商品銷售情況。

? If txt_start<>"" and txt_end<>"" Then

??? If txt_Gnum<>"" Then

?? ? sqlstr="select * from (select sum(Smoney) as totals,Sdate as IssueDate from tb_sell where Gnum='"&txt_Gnum&"' and Sdate between #"&txt_start&"# and #"&txt_end&"# group by Sdate order by Sdate desc) as a order by a.IssueDate"

?? Else

????? sqlstr="select * from (select sum(Smoney) as totals,Sdate as IssueDate from tb_sell where Sdate between #"&txt_start&"# and #"&txt_end&"# group by Sdate order by Sdate desc) as a order by a.IssueDate"

?? End If

? End If

? Set rs=Server.CreateObject("ADODB.Recordset")

? rs.open sqlstr,conn,1,1

? counts=rs.recordcount

%>

使用<object>標(biāo)記引用MSChart組件,并在JavaScript腳本中定義組件的各屬性值,從而將查詢到的結(jié)果以圖表的形式顯示在頁面表格中。

<table width="600" border="1" align="center" cellpadding="0" cellspacing="0"?? bordercolor="#FFFFFF" bordercolorlight="#9CA6C6" bordercolordark="#CCE3FF">

? <tr bgcolor="#FF9933">

??? <td height="10" colspan="6" class="word_white">&nbsp; </td>

? </tr>

? <tr align="center" bgcolor="#C8E3FF">

??? <td height="14">

<%

if counts>0 then

sum=0

%>

<object classid="clsid:3A2B370C-BA0A-11D1-B137-0000F8753F5D" name="chart" width="100%" height="300">

?? <%'定義對象,該對象命名為chart%>

</object>

<% for i=1 to counts

? If txt_amount="" Then txt_amount=1

? If fig="" Then fig="企業(yè)"

%>

<script language="javascript">

chart.chartType=1;

chart.ColumnCount=1;???

chart.TitleText="最近 "+<%=txt_amount%>+"<%=fig%>"+" 商品銷售情況顯示圖表 : ";??

chart.rowcount=<%=counts%>;???????????

chart.row=<%=i%>;??????????????????????

chart.rowlabel="<%=rs("IssueDate")%>(月/年/日期)";

chart.Data=<%=rs("totals")%>;?????????

chart.Footnote="注:縱坐標(biāo)為銷售金額";

</script>

<%sum=sum+rs("totals")

? rs.movenext?????

? next???????????

%>

&nbsp;</td>

? </tr>

? <tr>

??? <td height="30" colspan="6">&nbsp; 最近<%Response.Write(txt_amount&fig)%>的銷售金額為 <%=sum%>元 </td>

? </tr>

</table>

<br>

引用WebBrowser組件,打印頁面中的圖形報表。

<object id=WebBrowser classid=ClSID:8856F961-340A-11D0-A96B-00C04Fd705A2 width="0" height="0"></object>

<div align="center"><a href="#" onClick="document.all.WebBrowser.Execwb(8,1)" class="Noprint">頁面屬性</a> <a href="#" onClick="document.all.WebBrowser.Execwb(7,1)" class="Noprint">打印預(yù)覽</a> <a href="#" onClick="document.all.WebBrowser.Execwb(6,1)" class="Noprint">打印</a></div>

<%End IF

End IF

%>

3.補(bǔ)充說明

在網(wǎng)絡(luò)應(yīng)用程序中,經(jīng)常會遇到由瀏覽者自己輸入日期的情況,如注冊頁面中的生日、商品銷售中售貨日期等,如果輸入的日期格式不正確,數(shù)據(jù)則不能正確保存。為了方便用戶操作及保證輸入日期格式的正確性,可以在需要輸入日期的位置加入Visual Basic的日期拾取組件(Microsoft Date and Time Picker),由用戶自己選擇日期。如圖5.47所示。

圖5.47? 調(diào)用Microsoft Date and Time Picker組件

DateTimePicker組件是Microsoft提供的ActiveX組件之一,可以返回格式化的日期字段,使得選擇日期很容易。在使用DateTimePicker組件之前,應(yīng)注冊MSCOMCT2.OCX文件并安裝Visual Basic軟件。調(diào)用日歷組件及獲取選擇的日期的關(guān)鍵代碼如下:

<form name="myform" method="post" action="">

? <tr bgcolor="#FFFFFF">

??? <td width="107" height="22" align="right">您選擇的日期為:</td>

??? <td width="286" height="22"><input name="Date_time" type="text" id="Date_time" onMouseOver="myevent()" onFocus="myevent()"></td>

? </tr>?

</form>

? <tr bgcolor="#FFFFFF">

??? <td height="22" align="right">選擇日期:</td>

??? <td height="22">

<script language="javascript">

function myevent(){

var date=new Date(mydate.value) ;

year=date.getUTCFullYear();

month=date.getUTCMonth()+1;

day=date.getUTCDate();

myform.Date_time.value=year+"-"+month+"-"+day;

//myform.submit();

}

</script>

<object classid="clsid:20DD1B9E-87C4-11D1-8BE3-0000F8754DA1" name="mydate" width="110" height="20">

? <param name="format" value=1>

</object></td>

? </tr>

5.5.4? 套打報表

套打是現(xiàn)在應(yīng)用較為廣范的一種打印方式,它是一種在印制有憑證、賬簿、報表格式、證書等紙張上進(jìn)行打印的打印方式,以這種方式進(jìn)行打印時,無須打印表格的表格線及其他固定的格式內(nèi)容,有利于加快打印速度、節(jié)約打印耗材、延長打印機(jī)的使用壽命等。

1.方案分析

在一些工作領(lǐng)域中(例如通信、郵政、商務(wù)洽談、財務(wù)等),為了加快工作效率,并為用戶提供方便,工作人員通常會將一些常用的業(yè)務(wù)事項或流程、憑證等事先打印出來,再由用戶按照上面的提示進(jìn)行填寫、核實(shí)等。

使用ASP開發(fā)動態(tài)網(wǎng)站時,可以在頁面中設(shè)計出所需要的格式,然后從數(shù)據(jù)庫中讀取所需要的數(shù)據(jù),并將數(shù)據(jù)放置在頁面指定的位置,從而實(shí)現(xiàn)套打報表的功能。套打報表的流程圖,如圖5.48所示。

圖5.48? 套打報表流程圖

2.實(shí)施過程

? 實(shí)例位置:光盤"mr"5"5.5"5.5.4

在生活和工作過程中,當(dāng)人們郵寄一些快件時,首先要在快遞單上填寫郵件的基本信息。在開發(fā)動態(tài)網(wǎng)站時,為了滿足用戶需求,可以提供實(shí)時打印快遞單的功能。下面以電子商務(wù)網(wǎng)站的訂單信息管理模塊為例,介紹套打快遞單的實(shí)現(xiàn)過程。運(yùn)行效果如圖5.49所示。

圖5.49? 套打快遞單

在套打快遞單頁面中,用戶可以通過填寫寄件人或收件人的姓名來查詢快遞單的詳細(xì)信息。程序處理頁面根據(jù)獲取到的表單數(shù)據(jù),確定查詢的SQL語句,然后將從數(shù)據(jù)庫中讀取到的數(shù)據(jù)添加到頁面中指定位置,并應(yīng)用打印技術(shù)執(zhí)行套打操作。代碼如下:

例程5-33? 代碼位置:光盤"mr"5"5.5"5.5.4"index.asp

<%

Dim SendTime,SendAddress,ReceiveAddress,SendTel,Sender,ReceiveTel,Receiver,ThingsName,PayMoney,ThingsNumber,ThingsWeight,ThingsPrice

sql_type=Trim(Request.Form("type"))

txt_name=Trim(Request.Form("txt_name"))

Set rs=Server.CreateObject("ADODB.Recordset")

sqlstr="select * from tb_info where 1=1"

根據(jù)用戶填寫的查詢條件,確定SQL查詢語句。

If txt_name<>"" then

?? select case sql_type

?? case "0"

?? sqlstr=sqlstr&" and sender='"&txt_name&"'"

?? case "1"

?? sqlstr=sqlstr&" and receiver='"&txt_name&"'"

?? end select

End If

rs.open sqlstr,conn,1,1

If rs.eof or rs.bof Then

? ? Response.Write("<p align=center>暫時不能提供任何信息!</p>")

?? Response.End

End if

對查詢到信息的進(jìn)行分頁處理。

rs.pagesize=1? '定義每頁顯示的記錄數(shù)

pages=clng(Request("pages"))? '獲得當(dāng)前頁數(shù)

If pages<1 Then pages=1

If pages>rs.recordcount Then pages=rs.recordcount

showpage rs,pages? '執(zhí)行分頁子程序showpage?????

Sub showpage(rs,pages) ?'分頁子程序showpage(rs,pages)

rs.absolutepage=pages?? '指定指針?biāo)诘漠?dāng)前位置

For i=1 to rs.pagesize? '循環(huán)顯示記錄集中的記錄SendTime=Now()

SendAddress=rs("sendAddress")

ReceiveAddress=rs("ReceiveAddress")

SendTel=rs("SendTel")

Sender=rs("Sender")

ReceiveTel=rs("ReceiveTel")

Receiver=rs("Receiver")

ThingsName=rs("ThingsName")

PayMoney=rs("PayMoney")

ThingsNumber=rs("ThingsNumber")

ThingsWeight=rs("ThingsWeight")

ThingsPrice=rs("ThingsPrice")

SendTime=rs("sendTime")

%>

…略,表格信息

<%

? rs.movenext

? If rs.eof Then Exit For

? Next

? End Sub

%>

????? <br>

????? <table width="450" height="25"? border="0" align="center" cellpadding="-2" cellspacing="0" class="print">

??????? <tr valign="middle" bgcolor="#FFFFFF">

????????? <%If Not (rs.eof and rs.bof) Then%>

????????? <td width="280" height="28"><% if pages<>1 then %>

??????????? <a href=?pages=1>第一頁</a> <a href=?pages=<%=(pages-1)%>>上一頁</a>

??????????? <%end if

????????????? if pages<>rs.pagecount then %>

??????????? <a href=?pages=<%=(pages+1)%>>下一頁</a> <a href=?pages=<%=rs.pagecount%>>最后一頁</a>

??????????? <%end if%></td>

????????? <%If not(rs.Eof and rs.Bof) Then%>

????????? <td width="220" height="28" align="right" class="word_grey">[<%=pages%>/<%=rs.PageCount%>]&nbsp;&nbsp;每頁<%=rs.PageSize%>條&nbsp;&nbsp;共<%=rs.RecordCount%>條信息</td>

??? <%End If

?? ? rs.close

?? ? Set rs=Nothing

?? ?End If

?? %>

??????? </tr>

??????? <tr bgcolor="#000000">

????????? <td colspan="2" valign="bottom" height="1"></td>

??????? </tr>

????? </table>

????? <br>

應(yīng)用WebBrowser組件進(jìn)行套打報表的操作。

<object id=WebBrowser classid=ClSID:8856F961-340A-11D0-A96B-00C04Fd705A2 width="0" height="0"> </object>

????? <div align="center"><a href="#" onClick="document.all.WebBrowser.Execwb(8,1)" class="Noprint">頁面設(shè)置</a> <a href="#" onClick="document.all.WebBrowser.Execwb(7,1)" class="Noprint">打印預(yù)覽</a> <a href="#" onClick="document.all.WebBrowser.Execwb(6,1)" class="Noprint">打印</a></div>

3.補(bǔ)充說明

使用WebBrowser組件執(zhí)行打印報表操作時,根據(jù)報表的實(shí)際結(jié)構(gòu),用戶可以通過“頁面設(shè)置”來定義打印選項,從而使打印能夠順利進(jìn)行。例如,當(dāng)紙張縱向打印不適合報表的寬度時,可以調(diào)整為“橫向”打印;可以設(shè)置“頁邊距”,使報表在指定的紙張位置處進(jìn)行打印;可以設(shè)置打印頁面的頁眉頁腳等。

“頁面設(shè)置”所包含的選項,如圖5.50所示。

圖5.50? 頁面設(shè)置窗口

?

在網(wǎng)絡(luò)信息時代,人們對網(wǎng)絡(luò)信息系統(tǒng)的依賴正逐漸增加,保證網(wǎng)絡(luò)安全變得愈加重要。網(wǎng)絡(luò)安全的本質(zhì)就是需要保證網(wǎng)絡(luò)上的信息安全,主要包括信息的保密性、完整性、可用性和準(zhǔn)確性等。

網(wǎng)站屬于計算機(jī)網(wǎng)絡(luò)中的一部分,它用來向用戶提供服務(wù)及相關(guān)信息。因此網(wǎng)絡(luò)中的安全隱患都會映射到它的身上。如何更有效地保護(hù)重要的數(shù)據(jù)信息,提高網(wǎng)站的安全性已經(jīng)成為Web程序開發(fā)中必須考慮和解決的一個重要問題。

本章將詳細(xì)介紹在網(wǎng)絡(luò)開發(fā)中的一些安全問題,及針對這些安全問題實(shí)施的各種策略和解決方案。讀者通過本章的學(xué)習(xí),可采用這些技術(shù)加強(qiáng)網(wǎng)站的安全,使網(wǎng)站的運(yùn)行得到可靠的保障。

6.3? 用戶權(quán)限方案

為了提高網(wǎng)站的安全性,經(jīng)常會為網(wǎng)站中的用戶分配不同的權(quán)限,這樣不僅可以有效的管理用戶,而且可以在很大程度上提高網(wǎng)站的安全性。本節(jié)將對在開發(fā)和運(yùn)營一個網(wǎng)站時,如何為不同級別的用戶分配不同的權(quán)限做了具體、全面的分析。

6.3.1? 默認(rèn)用戶權(quán)限

在一些企業(yè)管理系統(tǒng)中,經(jīng)常會有多位管理人員對系統(tǒng)中的內(nèi)部資源進(jìn)行管理。為了提高系統(tǒng)的安全性,大多數(shù)情況下,系統(tǒng)中只有一位具有全局權(quán)限的管理員,并且該管理員具有添加普通管理員的權(quán)限,在添加這些普通管理員時,可以為新的管理員進(jìn)行權(quán)限的分配。

1.方案分析

? 實(shí)例位置:光盤"mr"6"6.3"6.3.1

進(jìn)入用戶登錄頁面后,首先在登錄表單中添加用戶的登錄信息,然后提交表單,這樣該用戶的所有登錄信息將被提交的用戶登錄信息處理頁。在用戶信息處理頁中,首先判斷用戶的用戶名和密碼是否正確,如果錯誤則返回登錄頁面,否則繼續(xù)判斷該用戶所屬級別,并根據(jù)用戶級別為其分配不同的權(quán)限。例如,人力資源管理系統(tǒng)中的用戶可以分為系統(tǒng)用戶(或全局用戶)、讀寫用戶和只讀用戶,系統(tǒng)用戶具有全局管理的權(quán)限,讀寫用戶具有對常規(guī)數(shù)據(jù)進(jìn)行修改、刪除等權(quán)限,而只讀用戶只具有最基本的瀏覽權(quán)限。默認(rèn)用戶權(quán)限方案分析的示意圖,如圖6.16所示。

圖6.16? 默認(rèn)用戶權(quán)限的示意圖

2.實(shí)施過程

? 實(shí)例位置:光盤"mr"6"6.3"6.3.1

運(yùn)行網(wǎng)上企業(yè)辦公自動化系統(tǒng)的用戶信息修改頁面,如圖6.17所示,單擊該頁面中的用戶“權(quán)限”下拉列表框,可以發(fā)現(xiàn)該系統(tǒng)中用戶權(quán)限主要分為系統(tǒng)、讀寫和只讀3種。當(dāng)對用戶權(quán)限進(jìn)行修改時首先從用戶權(quán)限下拉列表中為用戶指定權(quán)限,然后單擊“修改”按鈕即可實(shí)現(xiàn)用戶權(quán)限的修改。

圖6.17? 用戶權(quán)限修改頁面

在網(wǎng)上企業(yè)辦公自動化系統(tǒng)管理頁面中單擊“人力資源”超鏈接,即可進(jìn)入用戶信息管理頁面。在該頁面中可以添加新用戶信息、修改個人信息、修改其他用戶信息、刪除用戶信息等操作。用戶信息添加頁面主要用于向數(shù)據(jù)庫中添加新的用戶信息。運(yùn)行結(jié)果如圖6.18所示。

圖6.18? 用戶信息添加頁面

制作添加用戶信息的表單頁面,該頁面主要用于系統(tǒng)用戶添加用戶信息。在添加用戶信息時,將應(yīng)用JavaScript腳本驗(yàn)證輸入信息是否合法。添加用戶信息表單頁面所涉及的重要表單元素如表6.1所示。

表6.1????????????? ????添加用戶信息頁面所涉及的重要表單元素

名稱

元素類型

含義

重要屬性

form1

form

表單

<form ACTION="personnel_add.asp" METHOD="POST" name="form1">

username

text

用戶名

<input name="username" type="text" class="Sytle_text" id="username">

branch

select

部門

<select name="branch" id="select4"> <option value="開發(fā)部" selected>開發(fā)部</option> <option value="人事部">人事部</option> <option value="銷售部">銷售部</option> </select>

name

text

姓名

<input name="name" type="text" class="Sytle_text" id="name">

sex

select

性別

<select name="sex" id="sex"> <option value="男" selected>男</option><option value="女">女</option>

</select>

purview

select

權(quán)限

<select name="purview" id="select"> <option value="系統(tǒng)" selected>系統(tǒng)</option> <option value="讀寫">讀寫</option><option value="只讀">只讀</option>

</select>

Button

Button

“提交”按鈕

<input name="Button" type="button" class="Style_button" value="提交" onClick="Mycheck()">

Submit2

reset

“重置”按鈕

<input name="Submit2" type="reset" class="Style_button" value="重置">

myclose

button

“關(guān)閉”按鈕

<input name="myclose" type="button" class="Style_button" id="myclose" value="關(guān)閉" onClick="javascrip:window.close()">

在實(shí)現(xiàn)用戶信息添加時,首先判斷客戶端輸入的用戶信息是否合法,然后在將合法的用戶信息保存到用戶信息表中,通過以下代碼實(shí)現(xiàn)用戶信息的添加,代碼如下:

例程6-15? 代碼位置:光盤"mr"6"6.3"6.3.2"personnel_add.asp

<!--#include file="../Connections/conn.asp" -->

<%

if request.Form("username")<>""then

'檢測用戶名是否存在

?? Set rs= Server.CreateObject("ADODB.Recordset")

?? sql="SELECT UserName FROM dbo.Tab_User WHERE UserName='" &Request.Form("UserName")&"'"

?? rs.open sql,conn,1,3

?? if rs.eof then

'保存員工信息

?????? username=request.Form("username")

?????? cname=request.Form("name")

?????? branch=request.Form("branch")

?????? PWD=request.Form("PWD")

?????? job=request.Form("job")

?????? tel=request.Form("tel")

?????? purview=request.Form("purview")

?????? sex=request.Form("sex")

?????? email=request.Form("email")

?????? address=request.Form("address")

?????? Ins="Insert into dbo.Tab_User (username,name,branch,PWD,job,tel,purview,sex,"&_

?????? "email,address) values('"&username&"','"&cname&"','"&branch&"','"&PWD&"','"&_

?????? job&"','"&tel&"','"&purview&"','"&sex&"','"&email&"','"&address&"')"

?????? conn.execute(Ins)

%>

?????? <script language="javascript">

?????? alert("員工信息添加成功!");

?????? opener.parent.location.reload();

?????? window.close();

?????? </script>

?? <%

Else

%>

?????? <script language="javascript">

?????? alert("該員工信息已經(jīng)存在!");

?????? </script>

?? <%

?? end if

end if

%>

<script language="javascript">

function Mycheck()

{

if (form1.username.value=="")

{ alert("請輸入員工姓名!");form1.username.focus();return;}

if (form1.PWD.value=="")

{ alert("請輸入密碼!");form1.PWD.focus();return;}

if (form1.tel.value=="")

{

alert("請輸入員工的聯(lián)系電話!");

form1.tel.focus();return;

}

if(form1.email.value!="" && (form1.email.value.indexOf('@',0)==-1|| form1.email.value.indexOf('.',0)==-1))

{alert("您輸入的E-mail地址不對!");form1.email.focus();return;}

if (form1.address.value=="")

{

alert("請輸入員工的住址!");

form1.address.focus();return;

}

form1.submit();}

</script>

用戶成功登錄后,首先判斷此用戶是否是系統(tǒng)用戶,如果該用戶是系統(tǒng)用戶,則可以通過“人力資源管理”模塊,進(jìn)行“添加新用戶”、“修改個人信息”、“用戶信息修改”和“用戶信息刪除”操作(可以對所有用戶進(jìn)行修改和刪除操作);否則只可以對用戶本身的密碼進(jìn)行修改。用戶信息修改頁面的運(yùn)行結(jié)果如圖6.19所示。

圖6.19? 用戶信息修改頁面

通過以下代碼實(shí)現(xiàn)用戶信息的修改,代碼如下:

例程6-16? 代碼位置:光盤"mr"6"6.3"6.3.2"personnel_modify.asp

<!--#include file="../Connections/conn.asp" -->

<%

'查詢員工信息

If Request.QueryString("ID")<>""then

session("ID")=Request.QueryString("ID")

end if

Set rs_personnel = Server.CreateObject("ADODB.Recordset")

sql_P="SELECT ID,UserName,name,PWD,purview,branch,job,sex,Email,Tel,Address"&_

" FROM dbo.Tab_User WHERE ID="&session("ID")&""

rs_personnel.open sql_p,conn,1,3

%>

<%

'修改員工信息

if request.Form("Name")<>"" then

?? cname=request.Form("name")

?? PWD=request.Form("PWD")

?? purview=request.Form("purview")

?? sex=request.Form("sex")

?? tel=request.Form("tel")

?? branch=request.Form("branch")

?? job=request.Form("job")

?? email=request.Form("email")

?? address=request.Form("address")

?? UP="Update dbo.Tab_User set name='"&cname&"',PWD='"&PWD&"',purview='"&_

?? purview&"',sex='"&sex&"',tel='"&tel&"',branch='"&branch&"',job='"&job&_

?? "',email='"&email&"',address='"&address&"' where ID='"&session("ID")&"'"

?? conn.execute(UP)

%>

?? <script language="javascript">

?? alert("數(shù)據(jù)修改成功!");

?? opener.parent.location.reload();

?? window.close();

?? </script>

<%

end if

%>

<script language="javascript">

function Mycheck()

{

if (form1.name.value=="")

{ alert("請輸入員工姓名!");form1.name.focus();return;}

if (form1.PWD.value=="")

{ alert("請輸入密碼!");form1.PWD.focus();return;}

if (form1.tel.value=="")

{

alert("請輸入員工的聯(lián)系電話!");

form1.tel.focus();return;

}

if(form1.email.value!="" && (form1.email.value.indexOf('@',0)==-1|| form1.email.value.indexOf('.',0)==-1))

{

alert("您輸入的E-mail地址不對!");

form1.email.focus();return;

}

if (form1.address.value=="")

{

alert("請輸入員工的住址!");

form1.address.focus();return;

}

form1.submit();}

</script>

通過以下代碼實(shí)現(xiàn)用戶信息的刪除,代碼如下:

例程6-17? 代碼位置:光盤"mr"6"6.3"6.3.2"personnel_del.asp

<!--#include file="../Connections/conn.asp" -->

<%

if request.Form("UserName")<>"" then

?? DEL="Delete From dbo.Tab_User where ID='"&session("ID")&"'"

?? conn.execute(Del)

%>

?? <script language="javascript">

?? alert("員工信息已經(jīng)刪除!");

?? opener.location.reload();

?? window.close();

?? </script>

<%end if%>

<%

if Request.QueryString("ID")<>""then

?? session("ID")=Request.QueryString("ID")

end if

Set rs_personnel = Server.CreateObject("ADODB.Recordset")

sql_P="SELECT ID,UserName,Name,PWD,purview,branch,sex,Email,Tel,Address"&_

" FROM dbo.Tab_User WHERE ID="&session("ID")&""

rs_personnel.open sql_P,conn,1,3

%>

3.補(bǔ)充說明

為用戶分配默認(rèn)的權(quán)限,即可在添加用戶信息時指定,也可以先注冊用戶信息,然后根據(jù)不同用戶的職能為其分配不同的權(quán)限。為了提高網(wǎng)站的安全性,在為用戶指定默認(rèn)權(quán)限時,一定要根據(jù)用戶的職能權(quán)限進(jìn)行的合理分配,否則一旦非法用戶登錄系統(tǒng)將會給整個系統(tǒng)造成極大的損失。

6.3.2? 簡單自定義用戶權(quán)限

簡單自定義權(quán)限是指在添加新管理員時,根據(jù)該管理員的管理職責(zé)而為其分配的權(quán)限。例如,在為系統(tǒng)添加數(shù)據(jù)錄入管理人員時,只需為其分配數(shù)據(jù)添加和數(shù)據(jù)刪除的權(quán)限即可,為了提高整個系統(tǒng)的安全性,不必為其過多的分配其他權(quán)限。下面將以辦公自化管理系統(tǒng)為例來講解簡單自定義用戶權(quán)限的具體實(shí)現(xiàn)過程。

1.方案分析

一個網(wǎng)站管理系統(tǒng)的后臺用戶主要分為兩種,一種是全局管理員,另一種是普通管理員。全局管理員具有整個后臺的全局管理權(quán)限,除了具有對后臺數(shù)據(jù)進(jìn)行管理的所有權(quán)限外,還具有對普通管理員進(jìn)行管理的權(quán)限;而普通管理員只具有對后臺數(shù)據(jù)進(jìn)行添加、修改和刪除的權(quán)限以及對個人信息進(jìn)行修改的權(quán)限。管理人員首先進(jìn)入后臺登錄頁面,然后在登錄表單中輸入個人的登錄信息并提交表單,這樣該管理員的登錄信息將被提交到用戶信息驗(yàn)證頁,如果用戶的個人信息填寫錯誤則返回到登錄頁,否則對用戶的級別進(jìn)行判斷,并根據(jù)用戶的級別為其分配不同的權(quán)限。實(shí)現(xiàn)簡單自定義用戶權(quán)限的示意圖,如圖6.20所示。

圖6.20? 簡單自定義用戶權(quán)限的示意圖

2.實(shí)施過程

? 實(shí)例位置:光盤"mr"6"6.3"6.3.2

下面將以辦公自動化管理系統(tǒng)為例講解如何實(shí)現(xiàn)簡單自定義用戶權(quán)限。當(dāng)超級用戶成功進(jìn)入系統(tǒng)后,可以進(jìn)行新用戶的添加,如圖6.21所示。首先在該頁面的用戶名和密碼的文本框中輸入合法的用戶名和密碼,然后從權(quán)限列表框中選擇要為該用戶分配的權(quán)限,最后單擊“提交”按鈕即可實(shí)現(xiàn)自定義權(quán)限的添加。

圖6.21? 添加超級用戶信息頁面

通過以下代碼實(shí)現(xiàn)數(shù)據(jù)庫的連接,代碼如下:

例程6-18? 代碼位置:光盤"mr"6"6.3"6.3.2"data"conn.asp

<%

set conn=server.CreateObject("Adodb.Connection")

Path="driver={SQL Server};server=.;uid=sa;pwd=;database=db_safe"

conn.open path

function HTMLcode(fString)

if not isnull(fString) then

??? fString = Replace(fString, CHR(13), "")

??? fString = Replace(fString, CHR(10) & CHR(10), "</P><P>")

??? fString = Replace(fString, CHR(10), "<BR>")

?? fString = Replace(fString, CHR(32), "&nbsp;")

??? HTMLcode = fString

end if

end function

%>

在用戶管理模塊中單擊“用戶添加”超鏈接,即可進(jìn)入到用戶添加頁面。用戶信息添加頁面主要用于向數(shù)據(jù)庫中添加新的用戶信息。其運(yùn)行結(jié)果如圖6.22所示。

圖6.22? 用戶信息添加頁面的運(yùn)行結(jié)果

制作添加用戶信息的表單頁面,該頁面主要用于收集超級用戶添加的用戶信息和驗(yàn)證輸入信息是否合法。添加用戶信息表單頁面所涉及的重要表單元素如表6.2所示。

表6.2????????????????? 添加用戶信息頁面所涉及的重要表單元素

名稱

元素類型

含義

重要屬性

form1

form

表單

action="" method="post" name="form1"

username

text

用戶名

<input name="username" type="text" id="username" size="20">

post

hidden

隱藏域

<input name="post" type="hidden" id="post" value="1">

userpwd

password

密碼

<input name="userpwd" type="password" id="userpwd" size="20">

menu1

select

文本域

<select name="menu1" size="3" onChange="MM_jumpMenu('nei',this,0)">

<% set rs2=server.CreateObject("adodb.recordset")

sql2="select * from renshi" rs2.open sql2,conn,1,1

if not rs2.eof then for i=1 to rs2.recordcount and not rs2.eof%>?

<option value=nei.asp?id=<%=rs2("id")%>>

<%=rs2("name")%></option>

<% rs2.movenext if rs2.eof then exit for

Next else response.Write("<option value='沒有用戶'>沒有用戶</option>")? end if????????? %></select>

Submit

Submit

“提交”按鈕

<input type="submit" name="Submit" value="提交">

Submit2

reset

“重置”按鈕

<input type="reset" name="Submit2" value="重置">

在實(shí)現(xiàn)用戶信息添加時,首先判斷客戶端輸入的用戶信息是否合法,然后在將合法的用戶信息保存到用戶信息表中,通過以下代碼實(shí)現(xiàn)用戶信息的添加,代碼如下:

例程6-19? 代碼位置:光盤"mr"6"6.3"6.3.2"adduser.asp

<!--#include file=data/conn.asp-->

<!--#include file=connfig.asp-->

<!--#include file=inc/yan.asp-->

<%

?? '驗(yàn)證用戶身份

?? call case10

?? if request("post")=1 then

?? ? if request("username")="" or request("userpwd")="" then

?? response.Write("<script language=JavaScript>" & "alert('用戶名或者密碼不能為空!');" & "history.back()" & "</script>")

?? else

?? ?if request("user")=0 then

?????? ? call wr1

?????? else

?????? ?? call wr2

?????? end if

?? ? end if

?? end if

?? '添加普通用戶

?? function wr1

?? username=trim(replace(request("username"),"'",""))

?? userpwd=trim(replace(request("userpwd"),"'",""))

?? for i=1 to len(username)

?? ? user=mid(username,i,1)

?? ? if user="'" or user="%" or user="<" or user=">" or user="&" or user="|" then

?????? response.write "<script language=JavaScript>" & "alert('您的用戶名含有非法字符,請重新輸入!');" & "history.back()" & "</script>"

?????? response.end

?? ? end if

?? next

?? for i=1 to len(userpwd)

?? ? pass=mid(userpwd,i,1)

?? ? if pass="'" or pass="%" or pass="<" or pass=">" or pass="&" or pass="|" then

?????? ?response.write "<script language=JavaScript>" & "alert('您的密碼含有非法字符,請重新輸入!');" & "history.back()" & "</script>"

?????? ?response.end

?? ? end if

?? next

?? ???? '判斷用戶名是否已經(jīng)存在

?????? ?set rs1=server.CreateObject("adodb.recordset")

?????? ?sql1 = "Select * From users Where username='"&request("username")&"'"

?????? ?rs1.open sql1,conn,1,1

?????? ?If not rs1.EOF Then

?????? ?response.Write("<script language=JavaScript>" & "alert('用戶名已經(jīng)存在!');" & "window.location.href='adduser.asp';" & "</script>")

?????? ?response.End()

?????? ?end if

?????? ?rs1.close

?? '添加用戶權(quán)限

?? set rs=server.CreateObject("adodb.recordset")

?? sql="select * from users"

?? rs.open sql,conn,1,3

?? rs.addnew

?? rs("username")=request("username")

?? rs("userpwd")=request("userpwd")

?? rs("shenhe")=request("shenhe")

?? rs("huiyi")=request("huiyi")

?? rs("gonggong")=request("gonggong")

?? rs("geren")=request("geren")

?? rs("renshi")=request("renshi")

?? rs("name")=session("na")

?? rs("time")=now()

?? rs.update

?? rs.close

?? response.Write("<script language=JavaScript>" & "alert('添加成功!');" & "window.location.href='adduser.asp';" & "</script>")

?? response.End()

?? end function

?? ?'添加超級用戶

?? function wr2

?? username=trim(replace(request("username"),"'",""))

?? userpwd=trim(replace(request("userpwd"),"'",""))

?? for i=1 to len(username)

?? ? user=mid(username,i,1)

?? ? if user="'" or user="%" or user="<" or user=">" or user="&" or user="|" then

?????? response.write "<script language=JavaScript>" & "alert('您的用戶名含有非法字符,請重新輸入!');" & "history.back()" & "</script>"

?????? response.end

?? ? end if

?? next

?? for i=1 to len(userpwd)

?? ? pass=mid(userpwd,i,1)

?? ? if pass="'" or pass="%" or pass="<" or pass=">" or pass="&" or pass="|" then

?????? ?response.write "<script language=JavaScript>" & "alert('您的密碼含有非法字符,請重新輸入!');" & "history.back()" & "</script>"

?????? ?response.end

?? ? end if

?? next

?????? ?set rs1=server.CreateObject("adodb.recordset")

?????? ?sql1 = "Select * From users Where username='"&request("username")&"'"

?????? ?rs1.open sql1,conn,1,1

?????? ?If not rs1.EOF Then

?????? ?response.Write("<script language=JavaScript>" & "alert('用戶名已經(jīng)存在!');" & "history.back()" & "</script>")

?????? ?end if

?????? ?rs1.close

?? set rs=server.CreateObject("adodb.recordset")

?? sql="select * from users"

?? rs.open sql,conn,1,3

?? rs.addnew

?? rs("username")=request("username")

?? rs("userpwd")=request("userpwd")

?? rs("name")=session("na")

?? rs("chaoji")=1

?? rs("time")=now()

?? rs.update

?? rs.close

?? response.Write("<script language=JavaScript>" & "alert('添加成功!');" & "history.back()" & "</script>")

?? end function

%>

在進(jìn)行用戶登錄時,首先判斷此用戶是否是超級用戶,如果該用戶是超級用戶,則可以通過“用戶管理”模塊,進(jìn)行“用戶添加”、“用戶修改”和“刪除”操作(可以對所有用戶進(jìn)行修改和刪除操作);否則只可以對用戶本身的密碼進(jìn)行修改。用戶信息修改頁面的運(yùn)行結(jié)果如圖6.23所示。

圖6.23? 用戶信息修改頁面的運(yùn)行結(jié)果

通過以下代碼實(shí)現(xiàn)用戶信息的修改,代碼如下:

例程6-20? 代碼位置:光盤"mr"6"6.3"6.3.2"adduser1.asp

<!--#include file=data/conn.asp-->

<!--#include file=connfig.asp-->

<!--#include file=inc/yan.asp-->

<%

call case10

?set rs2=server.CreateObject("adodb.recordset")

??? sql2="select * from users where id="&request("id")

??? rs2.open sql2,conn,1,1

if request("post")=1 then

? if request("username")="" or request("userpwd")="" then

response.Write("<script language=JavaScript>" & "alert('用戶名或者密碼不能為空!');" & "history.back()" & "</script>")

else

?if request("user")=0 then

????? call wr1

??? else

?????? call wr2

??? end if

? end if

end if

function wr1

if session("na")="" then

na=rs2("name")

else

na=session("na")

end if

username=trim(replace(request("username"),"'",""))

userpwd=trim(replace(request("userpwd"),"'",""))

for i=1 to len(username)

? user=mid(username,i,1)

? if user="'" or user="%" or user="<" or user=">" or user="&" or user="|" then

??? response.write "<script language=JavaScript>" & "alert('您的用戶名含有非法字符,請重新輸入!');" & "history.back()" & "</script>"

??? response.end

? end if

next

for i=1 to len(userpwd)

? pass=mid(userpwd,i,1)

? if pass="'" or pass="%" or pass="<" or pass=">" or pass="&" or pass="|" then

???? response.write "<script language=JavaScript>" & "alert('您的密碼含有非法字符,請重新輸入!');" & "history.back()" & "</script>"

???? response.end

? end if

next

set rs=server.CreateObject("adodb.recordset")

sql="select * from users where id="&session("id")

rs.open sql,conn,1,3

rs("username")=request("username")

rs("userpwd")=request("userpwd")

rs("shenhe")=request("shenhe")

rs("huiyi")=request("huiyi")

rs("gonggong")=request("gonggong")

rs("geren")=request("geren")

rs("renshi")=request("renshi")

rs("name")=na

rs("chaoji")=0

rs.update

rs.close

response.Write("<script language=JavaScript>" & "alert('修改成功!');" & "history.back()" & "</script>")

end function

?function wr2

?if session("na")="" then

na=rs2("name")

else

na=session("na")

end if

username=trim(replace(request("username"),"'",""))

userpwd=trim(replace(request("userpwd"),"'",""))

for i=1 to len(username)

? user=mid(username,i,1)

? if user="'" or user="%" or user="<" or user=">" or user="&" or user="|" then

??? response.write "<script language=JavaScript>" & "alert('您的用戶名含有非法字符,請重新輸入!');" & "history.back()" & "</script>"

??? response.end

? end if

next

for i=1 to len(userpwd)

? pass=mid(userpwd,i,1)

? if pass="'" or pass="%" or pass="<" or pass=">" or pass="&" or pass="|" then

???? response.write "<script language=JavaScript>" & "alert('您的密碼含有非法字符,請重新輸入!');" & "history.back()" & "</script>"

???? response.end

? end if

next

set rs=server.CreateObject("adodb.recordset")

sql="select * from users where id="&session("id")

rs.open sql,conn,1,3

rs("username")=request("username")

rs("userpwd")=request("userpwd")

rs("name")=na

rs("chaoji")=1

rs.update

rs.close

response.Write("<script language=JavaScript>" & "alert('修改成功!');" & "history.back()" & "</script>")

end function

%>

通過以下代碼實(shí)現(xiàn)用戶信息的刪除,代碼如下:

例程6-21? 代碼位置:光盤"mr"6"6.3"6.3.2"del.asp

<!--#include file=data/conn.asp-->

<!--#include file=connfig.asp-->

<!--#include file=inc/yan.asp-->

<%

?? '驗(yàn)證用戶權(quán)限

?? call case10

?? if request("del")<>"" and ps("chaoji")=1 then

?? call del

?? end if

?? '刪除用戶

?? function del

?? sql2="delete from users where id="&request("del")

?? conn.Execute(sql2)

?? end function

%>

當(dāng)?shù)卿浀挠脩羰瞧胀ㄓ脩魰r,只可以對用戶本身的密碼進(jìn)行修改。通過以下代碼實(shí)現(xiàn)普通用戶密碼的修改操作,代碼如下:

例程6-22? 代碼位置:光盤"mr"6"6.3"6.3.2"yonghugai.asp

<!--#include file=data/conn.asp-->

<!--#include file=connfig.asp-->

<%

if request("post")<>"" then

call write1

end if

function write1

if request("userpwd1")<>"" and request("userpwd2")<>"" then

if request("userpwd1")<>request("userpwd2") then

response.Write("<script language=javascript>alert('兩次輸入密碼不一致!!')</script>")

else

set rs=server.CreateObject("adodb.recordset")

sql="select * from users where username='"&session("admin_name")&"'"

rs.open sql,conn,1,3

rs("userpwd")=request("userpwd1")

rs.update

end if

else

response.Write("<script language=javascript>alert('密碼不能為空!')</script>")

end if

if request("qq")<>"" then

set rs1=server.CreateObject("adodb.recordset")

sql1="select * from renshi where name='"&rs("name")&"'"

rs1.open sql1,conn,1,3

rs1("tel")=request("tel")

rs1("age")=request("age")

rs1("email")=request("email")

rs1("address")=request("address")

rs1.update

rs1.close

end if

response.Redirect("chenggong.htm")

end function

set rs3=server.CreateObject("adodb.recordset")

sql3="select * from users where username='"&session("admin_name")&"'"

rs3.open sql3,conn,1,3

set rs4=server.CreateObject("adodb.recordset")

sql4="select * from renshi where name='"&rs3("name")&"'"

rs4.open sql4,conn,1,3

%>

3.補(bǔ)充說明

在實(shí)現(xiàn)簡單自定義用戶權(quán)限時,也可以將普通用戶權(quán)限和超級用戶權(quán)限的選項放在下拉列表中,并在Dreamweaver中插入兩個下拉列表框,同時將下拉列表的類型設(shè)置為“列表”類型,選擇“允許多選”前面的復(fù)選框,設(shè)置完成后將相關(guān)的權(quán)限信息輸入到下拉列表框中,此時可以按shift鍵進(jìn)行用戶權(quán)限的多選操作,即實(shí)現(xiàn)與復(fù)選框同樣的功能。通過該方法同樣可以實(shí)現(xiàn)簡單自定義用戶權(quán)限的設(shè)置,運(yùn)行結(jié)果如圖6.24所示。

圖6.24? 應(yīng)用下拉列表實(shí)現(xiàn)簡單自定義用戶權(quán)限的設(shè)置

6.3.3? 復(fù)雜自定義用戶權(quán)限

在某些較大規(guī)模的管理系統(tǒng)中,為了有效合理的對系統(tǒng)信息進(jìn)行管理,無論是全局管理員還是普通管理者的權(quán)限都是極其復(fù)雜的。那么如何在復(fù)雜的管理系統(tǒng)中定義及分配用戶的權(quán)限呢?下面將以企業(yè)進(jìn)銷存管理系統(tǒng)為例來講解復(fù)雜自定義用戶權(quán)限的設(shè)計方案及具體實(shí)現(xiàn)過程。

1.方案分析

實(shí)現(xiàn)“復(fù)雜自定義用戶權(quán)限”與實(shí)現(xiàn)“簡單自定義用戶權(quán)限”的實(shí)現(xiàn)方案大體類似,區(qū)別是在為用戶指定權(quán)限時需要考慮更多的因素。管理人員首先進(jìn)入后臺登錄頁面,然后在登錄表單中輸入個人的登錄信息并提交表單,這樣該管理員的登錄信息將被提交到用戶信息驗(yàn)證頁,如果用戶的個人信息填寫錯誤則返回到登錄頁,否則可以對用戶的級別進(jìn)行判斷,并根據(jù)用戶的級別為其分配不同的權(quán)限。實(shí)現(xiàn)復(fù)雜自定義用戶權(quán)限的示意圖,如圖6.25所示

圖6.25? 復(fù)雜自定義用戶權(quán)限的示意圖

2.實(shí)施過程

? 實(shí)例位置:光盤"mr"6"6.3"6.3.3

全局管理員成功登錄企業(yè)進(jìn)銷存管理系統(tǒng)的后臺時,就可以進(jìn)入該系統(tǒng)的“權(quán)限管理”模塊,如圖6.26所示。在“權(quán)限管理”模塊中列出了所有管理員的用戶名和該管理員的權(quán)限信息,如果預(yù)刪除某管理員,可以直接單擊該管理員所對應(yīng)的“刪除”超鏈接即可。如果對某用戶的權(quán)限進(jìn)行設(shè)置或重新分配時,可以單擊該管理員后的“權(quán)限設(shè)置”超鏈接進(jìn)入權(quán)限設(shè)置頁面可以對該管理員的權(quán)限進(jìn)行重新設(shè)定。

圖6.26? 復(fù)雜自定義用戶權(quán)限管理頁面

本系統(tǒng)后臺數(shù)據(jù)庫采用的是Access數(shù)據(jù)庫,系統(tǒng)數(shù)據(jù)庫名稱為db_database.mdb。數(shù)據(jù)庫db_database.mdb中包含兩張數(shù)據(jù)表:分別為tb_use(管理員信息表)和tb_purview(權(quán)限信息表)。下面將分別給出這兩個數(shù)據(jù)表的表結(jié)構(gòu)。

(1)tb_use(管理員信息表)主要用于保存管理員的名稱及密碼信息,其表結(jié)構(gòu)如表6.3所示。

表6.3?? ????????????????????????表tb_use的結(jié)構(gòu)

字段名稱

數(shù)據(jù)類型

長度

默認(rèn)值

描述

id

自動編號

管理員ID號

use

文本

50

管理員名稱

pwd

文本

50

管理員密碼

(2)tb_purview(權(quán)限信息表)主要用于保存管理員的權(quán)限信息,其表結(jié)構(gòu)如表6.4所示。

表6.4???????????????????????????? tb_purview表

字段名稱

數(shù)據(jù)類型

長度

默認(rèn)值

描述

id

數(shù)字

長整型

0

管理員ID號

purviewSet

是/否

權(quán)限設(shè)置

basicSet

是/否

基本信息管理

stockSet

是/否

進(jìn)貨管理

sellSet

是/否

銷售管理

storageSet

是/否

庫存管理

querySet

是/否

查詢統(tǒng)計

reportSet

是/否

報表管理

通過以下代碼實(shí)現(xiàn)數(shù)據(jù)庫的連接,代碼如下:

例程6-23? 代碼位置:光盤"mr"6"6.3"6.3.3"Conn"conn.asp

<%

Set conn=Server.CreateObject("ADODB.Connection")

sql="Provider=Microsoft.jet.oledb.4.0;data source="&Server.MapPath("database/db_database.mdb")

conn.open(sql)

%>

在權(quán)限管理的主頁中單擊“添加管理員信息”超鏈接,即可進(jìn)入到添加管理員信息頁面。添加管理員信息頁面主要用于向數(shù)據(jù)庫中添加新的管理員。運(yùn)行結(jié)果如圖6.27所示。

圖6.27? 添加管理員信息頁面的運(yùn)行結(jié)果

制作添加管理員信息的表單頁面,該頁面主要用于收集管理員添加的管理員信息和驗(yàn)證輸入信息是否合法。添加管理員信息表單頁面所涉及的重要表單元素如表6.5所示。

表6.5????????????????? 添加管理員信息頁面所涉及的重要表單元素

名稱

元素類型

含義

重要屬性

form1

form

表單

action="tjyg.asp" method="post" name="form1"

use

text

管理員名稱

<input name="use" type="text" id="use" size="19">

pwd

password

管理員密碼

<input name="pwd" type="password" id="pwd" size="20">

pwd1

password

確認(rèn)密碼

<input name="pwd1" type="password" id="pwd1" size="20">

Img1

Img

“保存”按鈕

<img src="images/button2.gif" width="58" height="24" onClick="Mycheck1();">

Img2

img

“關(guān)閉”按鈕

<img src="images/button3.gif" width="58" height="24" onClick="window.close();opener.location.reload();">

在實(shí)現(xiàn)管理員信息添加時,首先判斷客戶端輸入的管理員信息是否合法,然后在將合法的管理員信息保存到管理員信息表中,并同時級聯(lián)插入權(quán)限信息,級聯(lián)插入權(quán)限信息主要通過獲取Access數(shù)據(jù)庫中插入記錄的自動編號實(shí)現(xiàn)的。代碼如下:

例程6-24? 代碼位置:光盤"mr"6"6.3"6.3.3"tjyg.asp

<!--#include file="conn/conn.asp"-->

<%

function filter_Str(InString)

'***********************************

'功能:過濾輸入字符串中的危險符號

'調(diào)用方法:filter_Str("String")

'***********************************

?? NewStr=Replace(InString,"'","''")

?? NewStr=Replace(NewStr,"<","&lt;")

?? NewStr=Replace(NewStr,">","&gt;")

?? NewStr=Replace(NewStr,"chr(60)","&lt;")

?? NewStr=Replace(NewStr,"chr(37)","&gt;")

?? NewStr=Replace(NewStr,"""","&quot;")

?? NewStr=Replace(NewStr,";",";;")

?? NewStr=Replace(NewStr,"--","-")

?? NewStr=Replace(NewStr,"/*"," ")

?? NewStr=Replace(NewStr,"%"," ")

?? filter_Str=NewStr

end function

if request.Form("use")<>"" then

?? use=filter_Str(request.Form("use"))

?? pwd=filter_Str(request.Form("pwd"))

?? '檢測輸入的管理員是否已存在

?? set rs=server.CreateObject("Adodb.recordset")

?? sql="select * from tb_use where use='"&use&"'"

?? rs.open sql,conn,1,3

?? if rs.eof and rs.bof then

?? '通過下面的程序代碼來保存用戶注冊信息

?? rs.addnew()

?? rs("use")=use

?? rs("pwd")=pwd

?? rs.update

?? '獲取Access數(shù)據(jù)庫中插入記錄的自動編號

?? temp=rs.bookmark

?? rs.bookmark=temp

?? id=rs("id")

?? ins1="insert into tb_purview(id,purviewSet,basicSet,stockSet,sellSet,storageSet,querySet,reportSet)values("&id&","&false&","&false&","&false&","&false&","&false&","&false&","&false&")"

?? conn.execute(ins1)

%>

?? <script language="javascript">

?? alert("管理員信息添加成功,繼續(xù)添加!");

?? window.location='tjyg.asp';

?? </script>

?? <%

Else

%>

?? <script language="javascript">

?? alert("該管理員信息已存在!");

?? window.location='tjyg.asp';

?? </script>

<%

end if

end if

%>

顯示管理員列表頁面即權(quán)限管理的主頁面,在該頁面中將顯示所有管理員信息,其中管理員的權(quán)限是以復(fù)選框的形式進(jìn)行顯示,頁面運(yùn)行結(jié)果如圖6.26所示,代碼如下:

例程6-25? 代碼位置:光盤"mr"6"6.3"6.3.3"main.asp

<%

Set rs=Server.CreateObject("Adodb.RecordSet")

sql="select * from tb_use u inner join tb_purview p on u.id=p.id order by u.id asc"

rs.open sql,conn,1,3

if rs.bof and rs.eof then

response.Write("暫無管理員信息!")

else

%>

<table width="696" height="67" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#6598CD">

<tr>

<td height="25" bgcolor="#99CDFF">

<div align="center" class="STYLE6">管理員名稱</div>

</td>

<td bgcolor="#99CDFF"><div align="center" class="STYLE6">權(quán)限管理</div></td>

<td bgcolor="#99CDFF"><div align="center" class="STYLE6">基礎(chǔ)信息管理</div></td>

<td bgcolor="#99CDFF"><div align="center" class="STYLE6">進(jìn)貨管理</div></td>

<td bgcolor="#99CDFF"><div align="center" class="STYLE6">銷售管理</div></td>

<td bgcolor="#99CDFF"><div align="center" class="STYLE6">庫存管理</div></td>

<td bgcolor="#99CDFF"><div align="center" class="STYLE6">查詢統(tǒng)計</div></td>

<td bgcolor="#99CDFF"><div align="center" class="STYLE6">報表管理</div></td>

<td bgcolor="#99CDFF"><div align="center" class="STYLE6">權(quán)限設(shè)置</div></td>

<td bgcolor="#99CDFF"><div align="center" class="STYLE6">操作</div></td>

</tr>

<%

for i=1 to rs.recordcount

%>

<tr>

<td height="20" bgcolor="#FFFFFF">

<div align="center" class="STYLE6"><%=rs("use")%></div>

</td>

<td bgcolor="#FFFFFF">

<div align="center" class="STYLE6">

<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled"

<%if rs("purviewSet") then response.write("checked") end if%>>

</div>

</td>

<td bgcolor="#FFFFFF">

<div align="center" class="STYLE6">

<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("basicSet") then response.write("checked") end if%>>

</div>

</td>

<td bgcolor="#FFFFFF">

<div align="center" class="STYLE6">

<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("stockSet") then response.write("checked") end if%>>

</div>

</td>

<td bgcolor="#FFFFFF">

<div align="center" class="STYLE6">

<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("sellSet") then response.write("checked") end if%>>

</div>

</td>

<td bgcolor="#FFFFFF">

<div align="center" class="STYLE6">

<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("storageSet") then response.write("checked") end if%>>

</div>

</td>

<td bgcolor="#FFFFFF">

<div align="center" class="STYLE6">

<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("querySet") then response.write("checked") end if%>>

</div>

</td>

<td bgcolor="#FFFFFF">

<div align="center" class="STYLE6">

<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("reportSet") then response.write("checked") end if%>>

</div>

</td>

<td bgcolor="#FFFFFF"><div align="center"><span class="STYLE6">

<%

if rs1("purviewSet")=true and rs("use")<>"mr" then

%>

<a href="#" onClick="window.open('qx.asp?id=<%=rs("u.id")%>','','width=292,height=175')"><span class="STYLE9">權(quán)限設(shè)置</span></a>

<%else%>

<span class="STYLE9"> &nbsp;</span>

<%end if%>

</td>

<td bgcolor="#FFFFFF">

<div align="center">

<%if rs1("purviewSet")=true and rs("use")<>"mr" then%>?

<a href="del.asp?id=<%=rs("u.id")%>"><span class="STYLE9">刪除</span></a>

<%

Else

%>

<span class="STYLE9">&nbsp;</span>

<%

end if

%>

</div>

</td>

</tr>

<%

rs.movenext

if rs.eof then exit for

next

%>

</table>

<%

end if

%>

管理員在進(jìn)行登錄時,首先判斷此管理員是否擁有權(quán)限管理的功能,如果有權(quán)限管理功能,則可以通過單擊某條管理員信息右側(cè)的“權(quán)限設(shè)置”超鏈接即可進(jìn)入到管理員權(quán)限修改頁面,在該頁面中將顯示該管理員的權(quán)限信息,設(shè)置相應(yīng)的信息后,單擊“保存”按鈕即可將管理員的權(quán)限信息保存到數(shù)據(jù)表中;否則將不顯示“權(quán)限設(shè)置”超鏈接。管理員權(quán)限修改頁面的運(yùn)行結(jié)果如圖6.28所示。

圖6.28? 管理員權(quán)限修改頁面的運(yùn)行結(jié)果

通過以下代碼實(shí)現(xiàn)管理員權(quán)限的修改,代碼如下:

例程6-26? 代碼位置:光盤"mr"6"6.3"6.3.3"ok.asp

<!--#include file="conn/conn.asp"-->

<%

if request.Form("Button")="保存" then

?? purviewSet=request.Form("purviewSet")

?? if purviewSet="" then purviewSet=false

?? basicSet=request.Form("basicSet")

?? if basicSet="" then basicSet=false

?? stockSet=request.Form("stockSet")

?? if stockSet="" then stockSet=false

?? sellSet=request.Form("sellSet")

?? if sellSet="" then sellSet=false

?? storageSet=request.Form("storageSet")

?? if storageSet="" then storageSet=false

?? querySet=request.Form("querySet")

?? if querySet="" then querySet=false

?? reportSet=request.Form("reportSet")?

?? if reportSet="" then reportSet=false

?? UP="Update tb_purview set purviewSet="&purviewSet&",basicSet="&basicSet&",stockSet="&stockSet&",sellSet="&sellSet&",storageSet="&storageSet&",querySet="&querySet&",reportSet="&reportSet&" where ID="&session("ID")&""

?? conn.execute(UP)

end if

%>

通過以下代碼實(shí)現(xiàn)管理員信息的刪除,代碼如下:

例程6-27? 代碼位置:光盤"mr"6"6.3"6.3.3"del.asp

<!--#include file="conn/conn.asp"-->

<%

if request.QueryString("id")<>"" then

?? Del="Delete from tb_use where ID="&request.QueryString("id")&""

?? conn.execute(Del)

%>

<script language="javascript">

window.location.href='main.asp';

</script>

<%

end if

%>

3.補(bǔ)充說明

在本方案中實(shí)現(xiàn)管理員信息添加時,首先需要將管理員信息添加到管理員信息數(shù)據(jù)表中,然后需要在權(quán)限信息表中也同時級聯(lián)插入該管理員的權(quán)限信息,實(shí)現(xiàn)級聯(lián)插入管理員權(quán)限信息主要通過獲取Access數(shù)據(jù)庫中插入記錄的自動編號實(shí)現(xiàn)的。下面對該技術(shù)進(jìn)行詳細(xì)介紹。

本方案主要通過Bookmark屬性使用戶對Recordset中的記錄進(jìn)行標(biāo)記,稍后再返回給它。使用Bookmark屬性可以保存當(dāng)前記錄的位置并隨時返回該記錄。Bookmark屬性只能在支持書簽功能的Recordset對象中使用。

打開Recordset對象時,其每個記錄都有唯一的書簽。要保存當(dāng)前記錄的書簽,請將Bookmark 屬性的值賦給一個變量。移動到其他記錄后要快速返回到該記錄時,請將該Recordset對象的 Bookmark屬性設(shè)置為該變量的值。

如果使用Clone方法創(chuàng)建Recordset對象的一個副本,則原始的和復(fù)制的Recordset對象Bookmark屬性設(shè)置相同并可以替換使用。但是無法替換使用不同Recordset對象的書簽,即使這些書簽是通過同一數(shù)據(jù)源或命令創(chuàng)建的。

在客戶端上使用Recordset對象時,Bookmark屬性始終有效。例如以下代碼:

temp=rs.bookmark

rs.bookmark=temp

為了使讀者能夠更好地理解和運(yùn)用該技術(shù),下面將給出一個具體的應(yīng)用方案。在開發(fā)留言板程序時,應(yīng)設(shè)置回復(fù)功能。本方案主要通過Recordset對象中的Bookmark屬性使用戶對Recordset 中的記錄進(jìn)行標(biāo)記,稍后再返回給它。當(dāng)對留言信息進(jìn)行回復(fù)時,回復(fù)的信息將直接與留言信息依依相對應(yīng),就無須在指定回復(fù)留言的ID號。運(yùn)行結(jié)果如圖6.29所示。

圖6.29? 向Access數(shù)據(jù)庫中插入記錄

通過以下代碼實(shí)現(xiàn)數(shù)據(jù)庫的連接,代碼如下:

<%

set conn=server.CreateObject("adodb.connection")

sql="Driver={Microsoft Access Driver (*.mdb)};DBQ=" &server.MapPath("Database/db_database.mdb")

conn.open(sql)

%>

添加表單、文本框和文本域,并設(shè)置其相關(guān)的屬性值,代碼如下:

<form method="post" name="form1">

<input name="title" type="text" class="text" id="title" size="32">

<textarea name="content" cols="30" rows="8" class="text" id="content">

</textarea>

<input name="Submit" type="submit" class="button" value="提交">

<input name="Submit2" type="reset" class="button" value="重置">

</form>

通過以下代碼實(shí)現(xiàn)立即獲取插入記錄的自動編號,代碼如下:

<%

if request.form("title")<>"" then

title=request.form("title")

content=request.form("content")

Set rs=Server.CreateObject("ADODB.Recordset")

sql="select * from tb_sml"

rs.open sql,conn,1,3

rs.addnew()

rs("title")=title

rs("content")=content

rs.update()

temp=rs.bookmark

rs.bookmark=temp

topicID=rs("ID")

ins="insert into tb_back (title_ID) values ("&topicID&")"

conn.execute(ins)

end if

%>

6.5? ASP文件安全技術(shù)方案

使用瀏覽器的“查看源文件”功能只可以查看IIS服務(wù)器編譯后的HTML標(biāo)簽和JavaScript等客戶端腳本,但使用迅雷等下載工具就可以將ASP源文件下載到本地,如果不對ASP文件加密,所有站點(diǎn)源文件將被竊取,這樣不僅不利于維護(hù)網(wǎng)站的版權(quán),而且會給站點(diǎn)的安全帶來很大的隱患。本節(jié)將介紹如何對ASP文件進(jìn)行加密。

6.5.1? 應(yīng)用Script Encoder加密工具

Script Encoder是Microsoft推出的一個script加密工具,它是一個簡單的命令行工具,可以對html文件進(jìn)行加密,只是對其中的VBscript部分進(jìn)行加密處理,其他的文本部分均保持不變,加密后對script的功能并無影響,僅是其代碼變成密文,用源文件方式查看只是一些亂碼。該程序除了可對html文件加密外,也可以對asa、asp、cdx、js、sct、vbs文件進(jìn)行加密。該程序很小只有64K,使用非常簡單,在DOS命令行下執(zhí)行,也可在Windows下帶參數(shù)運(yùn)行。

1.方案分析

應(yīng)用Script Encoder對asp文件進(jìn)行加密,首先依次單擊“開始”→“程序”→“附件”→“命令提示符”,在MS-DOS命令行中輸入以下命令,即可對某asp文件進(jìn)行加密,加密格式如下:

SCRENC? [switches]? <要加密asp文件名>? <加密后的文件名>

在SRCENC命令中應(yīng)用到了switches選項,該選項的常用參數(shù)如下所示,下面對常用的屬性進(jìn)行詳細(xì)說明:

/s 可選。命令中帶了該參數(shù),加密過程中屏幕上就不會有輸出。screnc /s lacl.sct ulacl.sct對當(dāng)前目錄中的腳本小程序lacl.sct加密,加密過程中屏幕不顯示任何信息。

/f 可選。指定輸出文件是否覆蓋同名輸入文件。忽略,將不執(zhí)行覆蓋。screnc /f lacl.asp對文件lacl.asp加密,并用編碼后的同名文件覆蓋原文件。

/xl 可選。是否在asp文件的頂部添加@Language指令。忽略,將添加。

/l defLanguage 可選。指定Script Encoder加密中選擇的缺省腳本語言。文件中不包含這種腳本語言特性的腳本將被Script Encoder 忽略。

對于HTML文件,JScript為內(nèi)置缺省腳本語言;對于ASP文件,VBScript為缺省腳本語言;對于擴(kuò)展名為.vbs或.js的文件,Script Encoder也有適應(yīng)能力。screnc /l vbscript lacl.htm ulacl.htm對文件lacl.htm加密,并生成輸出文件ulacl.htm,確保沒有指定語言屬性的腳本使用VBScript。

/e defExtension 可選。指定待加密文件的文件擴(kuò)展名。缺省狀態(tài)下,Script Encoder能識別asa、asp、cdx、htm、html、js、sct和vbs文件。screnc /e asp 11\*.* f:\labxw-jm對11目錄中的所有.ASP 文件進(jìn)行加密,并把編碼后的輸出文件放在f:\labxw-jm目錄中。

2.實(shí)施過程

? 實(shí)例位置:光盤\mr\6\6.5\6.5.1

Script Encoder加密工具可以對asp、html、asa、cdx、sct和vbs等文件進(jìn)行加密。下面將使用Script Encoder加密工具對index.asp進(jìn)行加密,其中index.asp加密前的內(nèi)容如圖6.40所示。

具體步驟如下:

(1)安裝Script Encoder加密工具到目錄c:\test下。

(2)把需要加密的ASP文件也拷到目錄c:\test下。

(2)依次選擇“開始”→“程序”→“附件”→“命令提示符”。

(3)在“命令提示符”對話框中,首先轉(zhuǎn)換到目錄c:\test(即輸入命令 cd c:\test)下,然后再C盤中建立test1文件夾,文件夾建立完成后并輸入以下代碼即可:

screnc *.asp c:\test1

最后應(yīng)該得到如下代碼:

C:\test>screnc *.asp c:\test1

通過Script Encoder加密工具對index.asp文件進(jìn)行加密后的結(jié)果如圖6.41所示。

圖6.40? 加密前的文件

圖6.41? 加密后的文件

3.補(bǔ)充說明

通過本方案的學(xué)習(xí),讀者可以很輕松地對指定的ASP文件進(jìn)行加密,還可以對html文件進(jìn)行加密,但是不能對JavaScript腳本語言進(jìn)行加密處理。

6.5.2? 將ASP文件轉(zhuǎn)換成HTML文件

對ASP文件進(jìn)行加密,除了使用Script Encoder加密工具外,還可以將ASP文件轉(zhuǎn)換為HTML格式的文件。下面將對ASP文件轉(zhuǎn)換為HTML文件的具體實(shí)現(xiàn)過程進(jìn)行分析和說明。

1.方案分析

首先通過Microsoft.XMLHTTP方法可以獲取到asp文件中信息內(nèi)容的二進(jìn)制數(shù)據(jù),然后再通過ADO的Stream對象將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為字符串,最后將獲取到的數(shù)據(jù)寫入到html文件中。

2.實(shí)施過程

? 實(shí)例位置:光盤\mr\6\6.5\6.5.2

在開發(fā)動態(tài)網(wǎng)站時,應(yīng)考慮到隨著網(wǎng)站訪問量的不斷增多,服務(wù)器的承載壓力也會越來越大。如果將asp文件轉(zhuǎn)換成html文件,既可以減輕服務(wù)器的承載壓力和提高網(wǎng)站的瀏覽速度,又可以保證asp文件的源代碼不被泄漏,從而達(dá)到提高asp文件安全性的目的,如圖6.42所示。

圖6.42? 將ASP文件轉(zhuǎn)換成HTML文件的運(yùn)行結(jié)果

運(yùn)行本實(shí)例,如圖6.42所示,首先在圖中的文本框中輸入要轉(zhuǎn)換成html格式的asp文件的地址,然后單擊“提交”按鈕即可實(shí)現(xiàn)將asp格式文件轉(zhuǎn)換為html格式,實(shí)現(xiàn)該過程的關(guān)鍵代碼如下:

例程6-29? 代碼位置:光盤\mr\6\6.5\6.5.2\index.asp

<%

Function GetContent(url)?

'獲取文件內(nèi)容

? Dim XMLObj

? Set XMLObj = CreateObject("Microsoft.XMLHTTP")

? With XMLObj

?? .Open "Get", url, False

?? .Send

?? GetContent=BytesToBstr(.ResponseBody)

? End With?

End Function

Function BytesToBstr(info)?

'將二進(jìn)制轉(zhuǎn)換為字符串

?dim objstream

?set objstream = Server.CreateObject("adodb.stream")

?objstream.Type = 1

?objstream.Mode =3

?objstream.Open

?objstream.Write info

?objstream.Position = 0

?objstream.Type = 2

?objstream.Charset = "GB2312"

?BytesToBstr = objstream.ReadText

?objstream.Close

?set objstream = nothing

End Function

If Request.Form("url")<>"" Then

on error resume next

Url=Request.Form("url")?

'需要注意的是這里的URL指定為您要讀取的頁面地址

'開始獲取/更新頁面...

wstr = GetContent(Url)

'生成html文檔

Set FSO=Server.CreateObject("Scripting.FileSystemObject")

htmPath=server.MapPath("index.htm")

If (FSO.FileExists(htmPath)) Then

? FSO.DeleteFile(htmPath)

End If

Set TSobj=FSO.CreateTextFile(htmPath)

TSobj.Writeline(wstr)

set TSobj=nothing

set FSO=nothing

If err<>0 Then

? Response.Write("<script language='javascript'>alert('操作失敗,未能生成HTML文件!');window.location.href='index.asp';</script>")

? Response.End()

Else

? Response.Redirect("index.htm")

End If

End If

%>

3.補(bǔ)充說明

將asp格式的文件轉(zhuǎn)換為html格式,即可以有效地提高服務(wù)器端的速度,而且還可以在很大程度上提高站點(diǎn)的安全性。

轉(zhuǎn)載于:https://www.cnblogs.com/jiania1224/archive/2009/04/01/1426810.html

總結(jié)

以上是生活随笔為你收集整理的asp 与 database (3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

久久zyz资源站无码中文动漫 | 久久99精品久久久久婷婷 | 女人被男人爽到呻吟的视频 | 成人免费视频在线观看 | 无码国产乱人伦偷精品视频 | 亚洲日本va中文字幕 | 国产亚洲精品久久久久久久久动漫 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 啦啦啦www在线观看免费视频 | 88国产精品欧美一区二区三区 | 荡女精品导航 | 青草视频在线播放 | 天天做天天爱天天爽综合网 | 久久精品国产一区二区三区肥胖 | 亚洲精品综合五月久久小说 | 亚洲成a人片在线观看无码 | 免费网站看v片在线18禁无码 | 人妻少妇精品无码专区动漫 | 久久精品99久久香蕉国产色戒 | 伊在人天堂亚洲香蕉精品区 | 精品国产精品久久一区免费式 | 亚洲区欧美区综合区自拍区 | 国产高潮视频在线观看 | 鲁大师影院在线观看 | 无码午夜成人1000部免费视频 | 国产成人亚洲综合无码 | 精品一区二区三区无码免费视频 | 国产精华av午夜在线观看 | 亚洲欧洲无卡二区视頻 | 精品少妇爆乳无码av无码专区 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲国产av精品一区二区蜜芽 | 国产成人无码av在线影院 | 久久精品人人做人人综合试看 | 久久综合九色综合97网 | 日本熟妇浓毛 | 中文久久乱码一区二区 | 国产一区二区三区日韩精品 | 色婷婷综合激情综在线播放 | 久久久久久久女国产乱让韩 | 女人被男人躁得好爽免费视频 | 免费网站看v片在线18禁无码 | 成熟人妻av无码专区 | 97色伦图片97综合影院 | 老子影院午夜伦不卡 | 老太婆性杂交欧美肥老太 | 亚洲国产精品久久久天堂 | 精品水蜜桃久久久久久久 | 欧美人与物videos另类 | 色综合天天综合狠狠爱 | 丝袜足控一区二区三区 | 国产精品久久久久久无码 | 成人无码精品1区2区3区免费看 | 亚洲精品无码国产 | 任你躁国产自任一区二区三区 | 亚洲人成网站免费播放 | 国产欧美熟妇另类久久久 | 日本精品久久久久中文字幕 | 性色欲网站人妻丰满中文久久不卡 | 中文字幕av无码一区二区三区电影 | 一本久道久久综合婷婷五月 | 亚洲国产精品一区二区第一页 | 精品无码国产一区二区三区av | 少妇的肉体aa片免费 | 中文字幕人成乱码熟女app | 双乳奶水饱满少妇呻吟 | 国产熟女一区二区三区四区五区 | 老子影院午夜精品无码 | 久久久久亚洲精品男人的天堂 | 国产乱人伦av在线无码 | 东京热无码av男人的天堂 | 国内精品久久久久久中文字幕 | 欧美日韩人成综合在线播放 | 国产在线aaa片一区二区99 | 欧美野外疯狂做受xxxx高潮 | 青春草在线视频免费观看 | 波多野结衣 黑人 | 在线欧美精品一区二区三区 | 又大又紧又粉嫩18p少妇 | 久久精品99久久香蕉国产色戒 | 成人欧美一区二区三区黑人免费 | 特黄特色大片免费播放器图片 | 一区二区三区高清视频一 | 97人妻精品一区二区三区 | √天堂资源地址中文在线 | 中文无码伦av中文字幕 | 国产精品亚洲五月天高清 | 色综合久久88色综合天天 | 中文毛片无遮挡高清免费 | 日韩av无码中文无码电影 | 午夜精品久久久久久久久 | 亚洲另类伦春色综合小说 | 国产乱子伦视频在线播放 | 欧美35页视频在线观看 | 六十路熟妇乱子伦 | 久久综合九色综合97网 | 鲁一鲁av2019在线 | 午夜无码人妻av大片色欲 | 国产精品怡红院永久免费 | 鲁大师影院在线观看 | 欧美性生交xxxxx久久久 | 亚洲成a人一区二区三区 | 狠狠综合久久久久综合网 | 日本熟妇大屁股人妻 | 亚洲成av人综合在线观看 | 乱人伦人妻中文字幕无码久久网 | 免费观看黄网站 | 300部国产真实乱 | 亚洲七七久久桃花影院 | 国产日产欧产精品精品app | 波多野结衣 黑人 | 高潮毛片无遮挡高清免费视频 | 97夜夜澡人人爽人人喊中国片 | 老太婆性杂交欧美肥老太 | 人妻插b视频一区二区三区 | 亚洲综合精品香蕉久久网 | 无套内谢的新婚少妇国语播放 | 国产精品国产三级国产专播 | 久久久久se色偷偷亚洲精品av | 久久久久久久人妻无码中文字幕爆 | 亚洲精品鲁一鲁一区二区三区 | 4hu四虎永久在线观看 | 免费国产成人高清在线观看网站 | 国产精品va在线播放 | 久久人人97超碰a片精品 | 午夜性刺激在线视频免费 | 午夜精品一区二区三区在线观看 | 精品亚洲成av人在线观看 | 国精产品一品二品国精品69xx | 夜精品a片一区二区三区无码白浆 | 亚洲色偷偷男人的天堂 | 亚洲国产一区二区三区在线观看 | 精品少妇爆乳无码av无码专区 | 亚洲国产成人a精品不卡在线 | 巨爆乳无码视频在线观看 | 国内揄拍国内精品少妇国语 | 日韩人妻系列无码专区 | 国产精品久久精品三级 | 欧美喷潮久久久xxxxx | 亚洲成色在线综合网站 | 大色综合色综合网站 | 欧美自拍另类欧美综合图片区 | 中文精品无码中文字幕无码专区 | 成人亚洲精品久久久久软件 | 精品亚洲成av人在线观看 | www国产亚洲精品久久网站 | 老司机亚洲精品影院无码 | 在线成人www免费观看视频 | 久久精品国产精品国产精品污 | 亚洲综合无码久久精品综合 | 黑人粗大猛烈进出高潮视频 | 人人澡人摸人人添 | 人人妻人人澡人人爽人人精品 | 欧美人与牲动交xxxx | 国产激情艳情在线看视频 | 国产精品久久久午夜夜伦鲁鲁 | 俺去俺来也在线www色官网 | 色妞www精品免费视频 | 久久精品成人欧美大片 | 无码一区二区三区在线 | 人妻少妇精品久久 | 撕开奶罩揉吮奶头视频 | 精品偷自拍另类在线观看 | 18禁黄网站男男禁片免费观看 | 999久久久国产精品消防器材 | 麻豆国产丝袜白领秘书在线观看 | 亚洲国产一区二区三区在线观看 | 国产成人一区二区三区在线观看 | 国产精品18久久久久久麻辣 | 国产精品久久久午夜夜伦鲁鲁 | 一本精品99久久精品77 | 秋霞成人午夜鲁丝一区二区三区 | 国产精品高潮呻吟av久久 | 久久国产精品_国产精品 | 人人澡人人透人人爽 | 欧美野外疯狂做受xxxx高潮 | 无套内谢老熟女 | 99国产精品白浆在线观看免费 | 国产尤物精品视频 | 亚洲中文字幕在线观看 | 在线视频网站www色 | 特黄特色大片免费播放器图片 | 日日天日日夜日日摸 | 日韩少妇白浆无码系列 | 亚洲精品国产精品乱码不卡 | 国产无遮挡又黄又爽又色 | 久久人妻内射无码一区三区 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产综合色产在线精品 | 黑人巨大精品欧美一区二区 | 成熟女人特级毛片www免费 | 天干天干啦夜天干天2017 | 亚洲精品午夜无码电影网 | 亚洲一区二区观看播放 | 乱码av麻豆丝袜熟女系列 | 激情综合激情五月俺也去 | 国产超碰人人爽人人做人人添 | 国产午夜福利100集发布 | 国精品人妻无码一区二区三区蜜柚 | 中国大陆精品视频xxxx | 亚洲精品久久久久avwww潮水 | 精品国产乱码久久久久乱码 | 鲁鲁鲁爽爽爽在线视频观看 | 精品久久久无码中文字幕 | 日韩视频 中文字幕 视频一区 | 午夜福利一区二区三区在线观看 | 99精品国产综合久久久久五月天 | 一二三四在线观看免费视频 | 一本色道婷婷久久欧美 | 国产手机在线αⅴ片无码观看 | 国产色视频一区二区三区 | 欧美兽交xxxx×视频 | 久久国产精品二国产精品 | 精品厕所偷拍各类美女tp嘘嘘 | 国产激情精品一区二区三区 | 青草青草久热国产精品 | 国产成人综合色在线观看网站 | 纯爱无遮挡h肉动漫在线播放 | 国产熟女一区二区三区四区五区 | 亚洲日韩av一区二区三区四区 | 婷婷丁香五月天综合东京热 | 99久久精品日本一区二区免费 | 99久久婷婷国产综合精品青草免费 | 国产精品久久久久久久9999 | 国产成人一区二区三区在线观看 | 色综合久久网 | 国产亚洲视频中文字幕97精品 | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美黑人巨大xxxxx | 四虎国产精品一区二区 | 久久成人a毛片免费观看网站 | 中文无码精品a∨在线观看不卡 | 亚洲中文无码av永久不收费 | 午夜精品久久久久久久 | 日本xxxx色视频在线观看免费 | 国产成人综合色在线观看网站 | 亚洲人成网站在线播放942 | 日本精品高清一区二区 | 一二三四在线观看免费视频 | 亚洲色无码一区二区三区 | 性欧美熟妇videofreesex | 欧洲熟妇精品视频 | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美老妇交乱视频在线观看 | 亚洲无人区午夜福利码高清完整版 | 亚洲自偷自偷在线制服 | 清纯唯美经典一区二区 | 波多野结衣av一区二区全免费观看 | 一本无码人妻在中文字幕免费 | 日韩精品a片一区二区三区妖精 | 亚洲gv猛男gv无码男同 | 中文字幕av无码一区二区三区电影 | 97夜夜澡人人爽人人喊中国片 | 少妇被粗大的猛进出69影院 | 国产艳妇av在线观看果冻传媒 | 人妻天天爽夜夜爽一区二区 | 少妇被黑人到高潮喷出白浆 | 亚洲精品久久久久久久久久久 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 欧美三级a做爰在线观看 | 九九久久精品国产免费看小说 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产精品视频免费播放 | 成人女人看片免费视频放人 | 免费中文字幕日韩欧美 | 精品国产麻豆免费人成网站 | 伊人久久大香线蕉av一区二区 | 未满小14洗澡无码视频网站 | 亚洲国产高清在线观看视频 | 无码乱肉视频免费大全合集 | 国产精品亚洲专区无码不卡 | 奇米影视7777久久精品人人爽 | 国产精品美女久久久久av爽李琼 | ass日本丰满熟妇pics | 精品无码国产一区二区三区av | 领导边摸边吃奶边做爽在线观看 | 国产在热线精品视频 | 日韩成人一区二区三区在线观看 | 国产精品18久久久久久麻辣 | 亚洲精品国产精品乱码不卡 | 国产熟妇另类久久久久 | 天天综合网天天综合色 | 黑人巨大精品欧美一区二区 | 中文字幕人妻无码一夲道 | 国产婷婷色一区二区三区在线 | 中文精品久久久久人妻不卡 | 国产乱人无码伦av在线a | 久久99精品国产麻豆 | 亚洲日韩av一区二区三区四区 | 亚洲综合伊人久久大杳蕉 | 亚洲爆乳无码专区 | 无遮挡国产高潮视频免费观看 | 国产亚洲精品久久久久久久 | 国产午夜亚洲精品不卡 | 国产熟妇另类久久久久 | 国产色精品久久人妻 | 久久久久久久人妻无码中文字幕爆 | 色 综合 欧美 亚洲 国产 | 一区二区三区乱码在线 | 欧洲 | 国产手机在线αⅴ片无码观看 | 久久综合激激的五月天 | 日本肉体xxxx裸交 | 蜜臀av无码人妻精品 | 久久精品国产大片免费观看 | 亚洲国产综合无码一区 | 图片小说视频一区二区 | 青春草在线视频免费观看 | 99久久精品日本一区二区免费 | 国产精品久久久久影院嫩草 | 伊人久久大香线蕉av一区二区 | 男人扒开女人内裤强吻桶进去 | 人人妻人人澡人人爽人人精品 | 久久视频在线观看精品 | 老子影院午夜伦不卡 | 久久久精品456亚洲影院 | 色妞www精品免费视频 | 午夜福利不卡在线视频 | 久久久久久国产精品无码下载 | 欧美人妻一区二区三区 | 青青久在线视频免费观看 | 精品欧美一区二区三区久久久 | 国产在线精品一区二区三区直播 | 久久久国产精品无码免费专区 | 亚洲精品综合五月久久小说 | 中文字幕乱码人妻二区三区 | 国产亚洲精品久久久久久久久动漫 | 激情五月综合色婷婷一区二区 | 福利一区二区三区视频在线观看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产亚洲精品久久久久久久久动漫 | 久久人妻内射无码一区三区 | 亚洲男人av香蕉爽爽爽爽 | 亚洲小说春色综合另类 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 国内精品久久久久久中文字幕 | 九月婷婷人人澡人人添人人爽 | 亚洲精品午夜国产va久久成人 | 国产国语老龄妇女a片 | 成人免费视频在线观看 | 99麻豆久久久国产精品免费 | 欧美一区二区三区视频在线观看 | 人人超人人超碰超国产 | 亚洲天堂2017无码中文 | 精品无人国产偷自产在线 | 婷婷丁香五月天综合东京热 | 伊人久久大香线焦av综合影院 | 性欧美熟妇videofreesex | 夜精品a片一区二区三区无码白浆 | 无码中文字幕色专区 | 扒开双腿吃奶呻吟做受视频 | 国产精品久久国产三级国 | 中国女人内谢69xxxxxa片 | 精品熟女少妇av免费观看 | 装睡被陌生人摸出水好爽 | 国产成人无码午夜视频在线观看 | 国产内射老熟女aaaa | 小泽玛莉亚一区二区视频在线 | 亚洲日韩中文字幕在线播放 | 99在线 | 亚洲 | 国产精品久久久久久无码 | 国产成人无码av片在线观看不卡 | 国产明星裸体无码xxxx视频 | а√天堂www在线天堂小说 | 特级做a爰片毛片免费69 | 国产三级精品三级男人的天堂 | 性欧美videos高清精品 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久国产精品_国产精品 | 亚洲成a人片在线观看无码 | 在线观看欧美一区二区三区 | 人妻少妇精品视频专区 | 清纯唯美经典一区二区 | 1000部啪啪未满十八勿入下载 | 久久久久久久人妻无码中文字幕爆 | 老头边吃奶边弄进去呻吟 | 午夜精品久久久久久久 | 久久精品女人天堂av免费观看 | 久久久久久久久蜜桃 | 精品久久8x国产免费观看 | 国产精品a成v人在线播放 | 日本免费一区二区三区最新 | 极品尤物被啪到呻吟喷水 | 国产成人一区二区三区在线观看 | 四虎国产精品免费久久 | 一本久道高清无码视频 | 亚洲中文字幕av在天堂 | 欧美第一黄网免费网站 | 成人无码影片精品久久久 | 国产高潮视频在线观看 | 国产无套内射久久久国产 | 极品尤物被啪到呻吟喷水 | 2020久久超碰国产精品最新 | 久久这里只有精品视频9 | 一本一道久久综合久久 | 亚洲国产av精品一区二区蜜芽 | 精品久久久中文字幕人妻 | 日本欧美一区二区三区乱码 | 国产情侣作爱视频免费观看 | 男女猛烈xx00免费视频试看 | 国产精品理论片在线观看 | 水蜜桃色314在线观看 | 国产xxx69麻豆国语对白 | 一本加勒比波多野结衣 | 免费乱码人妻系列无码专区 | 日本成熟视频免费视频 | 狠狠综合久久久久综合网 | 色 综合 欧美 亚洲 国产 | 久热国产vs视频在线观看 | 中文字幕无码乱人伦 | 波多野结衣一区二区三区av免费 | 一本加勒比波多野结衣 | 最新国产乱人伦偷精品免费网站 | 国产人成高清在线视频99最全资源 | 97精品国产97久久久久久免费 | 色五月五月丁香亚洲综合网 | 福利一区二区三区视频在线观看 | 中文字幕av无码一区二区三区电影 | 中文字幕av无码一区二区三区电影 | 狠狠cao日日穞夜夜穞av | 丰满人妻精品国产99aⅴ | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产激情综合五月久久 | 日产精品高潮呻吟av久久 | 亚洲精品一区二区三区在线观看 | 亚洲精品中文字幕久久久久 | 日韩av无码一区二区三区不卡 | 性做久久久久久久免费看 | 正在播放老肥熟妇露脸 | 国内丰满熟女出轨videos | 成人无码视频免费播放 | 强奷人妻日本中文字幕 | 亚洲精品国偷拍自产在线麻豆 | 国产亚洲欧美在线专区 | 色窝窝无码一区二区三区色欲 | 久久99精品久久久久久 | 久久天天躁夜夜躁狠狠 | 乱人伦人妻中文字幕无码久久网 | 久久精品国产大片免费观看 | 99久久久无码国产aaa精品 | 色诱久久久久综合网ywww | 国产精品第一区揄拍无码 | 亚洲精品一区二区三区四区五区 | 少妇邻居内射在线 | 国产国语老龄妇女a片 | aⅴ在线视频男人的天堂 | 99er热精品视频 | 牲欲强的熟妇农村老妇女视频 | 成人欧美一区二区三区黑人免费 | 精品人人妻人人澡人人爽人人 | 日本xxxx色视频在线观看免费 | 99精品视频在线观看免费 | 欧美一区二区三区视频在线观看 | 漂亮人妻洗澡被公强 日日躁 | 亚洲成av人在线观看网址 | 天天躁夜夜躁狠狠是什么心态 | 久久久亚洲欧洲日产国码αv | 国产成人无码av片在线观看不卡 | 亚洲色www成人永久网址 | 激情内射亚州一区二区三区爱妻 | 人妻插b视频一区二区三区 | 亚洲人成网站免费播放 | 久久久av男人的天堂 | 十八禁真人啪啪免费网站 | 欧美人与动性行为视频 | 国产人妻精品一区二区三区不卡 | 精品熟女少妇av免费观看 | 欧美日韩一区二区免费视频 | 国产亚av手机在线观看 | 色情久久久av熟女人妻网站 | 日本一卡二卡不卡视频查询 | 九九久久精品国产免费看小说 | 国产真实伦对白全集 | 天天躁夜夜躁狠狠是什么心态 | 国产av剧情md精品麻豆 | 一本色道婷婷久久欧美 | 熟女俱乐部五十路六十路av | 亚洲精品午夜国产va久久成人 | 1000部夫妻午夜免费 | 领导边摸边吃奶边做爽在线观看 | 国产精品人人爽人人做我的可爱 | 免费播放一区二区三区 | 欧美一区二区三区 | 大地资源中文第3页 | 人妻熟女一区 | 久久综合激激的五月天 | 国产乱人无码伦av在线a | 国产熟女一区二区三区四区五区 | 一区二区三区乱码在线 | 欧洲 | 一本久久a久久精品亚洲 | 日韩av无码中文无码电影 | 无遮无挡爽爽免费视频 | 女人被男人躁得好爽免费视频 | 欧美成人免费全部网站 | 色婷婷香蕉在线一区二区 | 超碰97人人做人人爱少妇 | 欧美日韩一区二区三区自拍 | 中文字幕无码热在线视频 | 日本肉体xxxx裸交 | 欧美35页视频在线观看 | 日日碰狠狠丁香久燥 | 国内精品九九久久久精品 | 精品无码一区二区三区爱欲 | 两性色午夜视频免费播放 | 综合人妻久久一区二区精品 | 人人妻在人人 | 亚洲精品久久久久久久久久久 | 少妇被粗大的猛进出69影院 | 久9re热视频这里只有精品 | 国产精品二区一区二区aⅴ污介绍 | 欧美三级不卡在线观看 | 国产福利视频一区二区 | 亚洲a无码综合a国产av中文 | 精品久久8x国产免费观看 | 在线a亚洲视频播放在线观看 | 国产香蕉尹人综合在线观看 | 国产精品内射视频免费 | 激情内射日本一区二区三区 | 色狠狠av一区二区三区 | 亚欧洲精品在线视频免费观看 | 亚洲国产av美女网站 | 亚洲精品久久久久中文第一幕 | 人妻有码中文字幕在线 | 久久精品成人欧美大片 | 亚洲乱码国产乱码精品精 | 大肉大捧一进一出视频出来呀 | 亚洲日韩av一区二区三区四区 | 丰腴饱满的极品熟妇 | 久久熟妇人妻午夜寂寞影院 | 国产成人一区二区三区在线观看 | 日本又色又爽又黄的a片18禁 | 国产情侣作爱视频免费观看 | 精品 日韩 国产 欧美 视频 | 中文字幕无码热在线视频 | 伦伦影院午夜理论片 | 岛国片人妻三上悠亚 | 狠狠cao日日穞夜夜穞av | 内射巨臀欧美在线视频 | 亚洲综合无码一区二区三区 | 欧美日韩亚洲国产精品 | 国模大胆一区二区三区 | 久久精品中文闷骚内射 | 国产无遮挡又黄又爽又色 | 色偷偷人人澡人人爽人人模 | av在线亚洲欧洲日产一区二区 | 天天摸天天透天天添 | 无码国内精品人妻少妇 | 亚洲精品久久久久中文第一幕 | 四虎影视成人永久免费观看视频 | 国产九九九九九九九a片 | 亚洲国产精华液网站w | 最新版天堂资源中文官网 | 精品人妻中文字幕有码在线 | 国产精品亚洲综合色区韩国 | 久久亚洲精品成人无码 | 精品成人av一区二区三区 | 久久综合久久自在自线精品自 | √天堂中文官网8在线 | 99国产欧美久久久精品 | av人摸人人人澡人人超碰下载 | 欧美色就是色 | 在线精品国产一区二区三区 | 亚洲精品www久久久 | 一本久道久久综合婷婷五月 | 亚洲 另类 在线 欧美 制服 | 国产偷自视频区视频 | 亚洲精品久久久久中文第一幕 | 人妻少妇精品视频专区 | 欧美喷潮久久久xxxxx | 两性色午夜视频免费播放 | 欧美性生交xxxxx久久久 | 欧美人与物videos另类 | 99精品国产综合久久久久五月天 | 国产激情精品一区二区三区 | 亚洲国产欧美国产综合一区 | 久久久久久九九精品久 | 国产精品二区一区二区aⅴ污介绍 | 亚洲一区二区三区四区 | 东京热无码av男人的天堂 | а√资源新版在线天堂 | 麻豆md0077饥渴少妇 | 又大又黄又粗又爽的免费视频 | 亚洲爆乳无码专区 | 永久黄网站色视频免费直播 | 18无码粉嫩小泬无套在线观看 | 日本爽爽爽爽爽爽在线观看免 | 无码av免费一区二区三区试看 | 亚洲人成人无码网www国产 | 午夜精品久久久内射近拍高清 | ass日本丰满熟妇pics | 久久久久99精品国产片 | 国产乱人伦av在线无码 | 国产精品亚洲lv粉色 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲国产av精品一区二区蜜芽 | 精品国产福利一区二区 | а天堂中文在线官网 | 久久久久久av无码免费看大片 | 熟妇人妻激情偷爽文 | 久久久av男人的天堂 | 欧美阿v高清资源不卡在线播放 | 牲欲强的熟妇农村老妇女视频 | 国精产品一区二区三区 | 国产麻豆精品一区二区三区v视界 | 欧美三级不卡在线观看 | 一本大道久久东京热无码av | 亚洲s色大片在线观看 | 久久精品女人的天堂av | 国产办公室秘书无码精品99 | 欧美日韩综合一区二区三区 | 我要看www免费看插插视频 | 亚洲精品一区三区三区在线观看 | 亚洲综合伊人久久大杳蕉 | 青青青爽视频在线观看 | 中文字幕无码免费久久9一区9 | a在线观看免费网站大全 | 亚洲欧美精品伊人久久 | 97夜夜澡人人爽人人喊中国片 | 97夜夜澡人人双人人人喊 | 男女爱爱好爽视频免费看 | 中文字幕无码热在线视频 | 蜜桃无码一区二区三区 | 国产无av码在线观看 | 亚洲欧洲中文日韩av乱码 | 欧美肥老太牲交大战 | 亚洲国产精品一区二区美利坚 | 奇米影视7777久久精品人人爽 | 中文字幕无码日韩欧毛 | 麻豆国产97在线 | 欧洲 | 精品午夜福利在线观看 | 色综合久久久无码网中文 | 欧美性猛交内射兽交老熟妇 | 十八禁真人啪啪免费网站 | 国产精品久久久久久亚洲毛片 | 蜜臀aⅴ国产精品久久久国产老师 | 国产人妻精品一区二区三区 | 日本一本二本三区免费 | 日韩av无码一区二区三区不卡 | 久久99热只有频精品8 | 亚洲日韩av一区二区三区中文 | 疯狂三人交性欧美 | 亚洲国产av精品一区二区蜜芽 | 无码福利日韩神码福利片 | 久久人妻内射无码一区三区 | 亚洲区小说区激情区图片区 | 久久无码人妻影院 | 综合人妻久久一区二区精品 | 男女爱爱好爽视频免费看 | 波多野结衣av在线观看 | 女人被男人爽到呻吟的视频 | 乱人伦人妻中文字幕无码 | 国产热a欧美热a在线视频 | 中文字幕日产无线码一区 | 熟女俱乐部五十路六十路av | 国产精品亚洲а∨无码播放麻豆 | 亚洲成av人综合在线观看 | 乱人伦人妻中文字幕无码 | www国产亚洲精品久久网站 | 色婷婷综合中文久久一本 | 精品国产一区av天美传媒 | 性欧美疯狂xxxxbbbb | 中文字幕人妻丝袜二区 | 国产精品无码永久免费888 | 1000部啪啪未满十八勿入下载 | 欧美zoozzooz性欧美 | 精品一区二区三区无码免费视频 | 色偷偷人人澡人人爽人人模 | 曰韩无码二三区中文字幕 | 亚洲精品国产第一综合99久久 | 色一情一乱一伦一区二区三欧美 | 亚洲高清偷拍一区二区三区 | 精品国产一区av天美传媒 | 天天躁夜夜躁狠狠是什么心态 | 未满成年国产在线观看 | 内射后入在线观看一区 | 久久99精品国产.久久久久 | 99久久精品日本一区二区免费 | 亚洲一区二区三区四区 | 久久国内精品自在自线 | 久久精品女人的天堂av | 久久久久se色偷偷亚洲精品av | 日日麻批免费40分钟无码 | 黑人巨大精品欧美一区二区 | 性欧美牲交xxxxx视频 | 波多野结衣一区二区三区av免费 | 人人妻人人澡人人爽欧美一区 | 曰本女人与公拘交酡免费视频 | 欧美freesex黑人又粗又大 | 中文字幕无码视频专区 | 无码av中文字幕免费放 | 亚洲の无码国产の无码步美 | 亚洲精品综合五月久久小说 | 亚洲熟妇自偷自拍另类 | 日产精品高潮呻吟av久久 | 天堂а√在线中文在线 | 中文字幕无码免费久久99 | 国产成人午夜福利在线播放 | 特大黑人娇小亚洲女 | 狠狠色噜噜狠狠狠7777奇米 | 18禁止看的免费污网站 | 国产精品久久久久久无码 | 思思久久99热只有频精品66 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲精品一区二区三区四区五区 | 77777熟女视频在线观看 а天堂中文在线官网 | 免费无码午夜福利片69 | 国产日产欧产精品精品app | 好屌草这里只有精品 | 日本www一道久久久免费榴莲 | av无码久久久久不卡免费网站 | 亚洲毛片av日韩av无码 | 人妻插b视频一区二区三区 | 高潮毛片无遮挡高清免费视频 | 久久无码中文字幕免费影院蜜桃 | 成人综合网亚洲伊人 | 精品国产av色一区二区深夜久久 | 妺妺窝人体色www在线小说 | 爆乳一区二区三区无码 | 中文字幕无码av波多野吉衣 | 亚洲熟悉妇女xxx妇女av | 性欧美牲交在线视频 | 久久熟妇人妻午夜寂寞影院 | 国语自产偷拍精品视频偷 | 永久免费观看美女裸体的网站 | 成年女人永久免费看片 | 88国产精品欧美一区二区三区 | 精品夜夜澡人妻无码av蜜桃 | 性做久久久久久久久 | 国产亚洲欧美日韩亚洲中文色 | 亚洲精品中文字幕乱码 | 日本一卡2卡3卡四卡精品网站 | 欧美激情内射喷水高潮 | 无码精品人妻一区二区三区av | 亚洲国产av精品一区二区蜜芽 | 激情国产av做激情国产爱 | 粉嫩少妇内射浓精videos | 久久久久成人片免费观看蜜芽 | 一本久道久久综合婷婷五月 | 国产超碰人人爽人人做人人添 | 性欧美熟妇videofreesex | 国产女主播喷水视频在线观看 | 日日摸日日碰夜夜爽av | 欧美成人家庭影院 | 亚洲人交乣女bbw | 男女下面进入的视频免费午夜 | 久久精品国产一区二区三区 | 免费观看激色视频网站 | 亚洲色www成人永久网址 | 成熟女人特级毛片www免费 | 麻豆蜜桃av蜜臀av色欲av | 无码人妻精品一区二区三区不卡 | 国产精品福利视频导航 | 东北女人啪啪对白 | 日本熟妇乱子伦xxxx | 欧美人与禽zoz0性伦交 | 国产在线一区二区三区四区五区 | 无码国产激情在线观看 | 国产在线aaa片一区二区99 | 狂野欧美性猛xxxx乱大交 | 曰韩无码二三区中文字幕 | 99久久婷婷国产综合精品青草免费 | 男人的天堂2018无码 | 性色av无码免费一区二区三区 | 国产97人人超碰caoprom | 岛国片人妻三上悠亚 | 婷婷丁香六月激情综合啪 | 亚洲熟妇色xxxxx欧美老妇 | 欧美午夜特黄aaaaaa片 | 中文字幕日产无线码一区 | 日韩精品乱码av一区二区 | 亚洲一区二区三区国产精华液 | 在线 国产 欧美 亚洲 天堂 | 荫蒂添的好舒服视频囗交 | 亚洲阿v天堂在线 | 免费视频欧美无人区码 | 色妞www精品免费视频 | 精品日本一区二区三区在线观看 | 午夜福利电影 | 精品国产青草久久久久福利 | 色综合久久中文娱乐网 | 亚洲色在线无码国产精品不卡 | 中文字幕人成乱码熟女app | 久久国产精品_国产精品 | 男人的天堂2018无码 | 无码国产乱人伦偷精品视频 | 人妻少妇精品无码专区动漫 | 乌克兰少妇性做爰 | 国产后入清纯学生妹 | 国产成人无码av在线影院 | 亚洲色大成网站www国产 | 帮老师解开蕾丝奶罩吸乳网站 | 99精品无人区乱码1区2区3区 | 欧美日韩一区二区综合 | 亚洲一区二区观看播放 | 无码人妻精品一区二区三区不卡 | 无码人妻少妇伦在线电影 | 扒开双腿吃奶呻吟做受视频 | 亚洲国产一区二区三区在线观看 | 性做久久久久久久免费看 | 人妻人人添人妻人人爱 | 午夜精品久久久久久久 | 成人欧美一区二区三区 | 无遮挡啪啪摇乳动态图 | 国产精品人人爽人人做我的可爱 | 国产又爽又黄又刺激的视频 | 亚洲综合无码一区二区三区 | 88国产精品欧美一区二区三区 | 日产精品99久久久久久 | 欧美阿v高清资源不卡在线播放 | 久久亚洲中文字幕无码 | 国产精品丝袜黑色高跟鞋 | 久久天天躁狠狠躁夜夜免费观看 | 久久精品国产日本波多野结衣 | 国产热a欧美热a在线视频 | 中文字幕中文有码在线 | 国产人妖乱国产精品人妖 | 欧美三级a做爰在线观看 | 欧美 日韩 人妻 高清 中文 | 色婷婷综合激情综在线播放 | 狠狠色欧美亚洲狠狠色www | 欧美国产日产一区二区 | 秋霞成人午夜鲁丝一区二区三区 | 欧美人与动性行为视频 | 亚洲午夜久久久影院 | 男女爱爱好爽视频免费看 | 狠狠噜狠狠狠狠丁香五月 | 婷婷六月久久综合丁香 | 久久无码专区国产精品s | 亚洲欧美色中文字幕在线 | 最新国产麻豆aⅴ精品无码 | 人人澡人人妻人人爽人人蜜桃 | 久久五月精品中文字幕 | 少妇激情av一区二区 | 欧美乱妇无乱码大黄a片 | 久久精品女人天堂av免费观看 | 日本免费一区二区三区最新 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产人妻人伦精品1国产丝袜 | 久久综合网欧美色妞网 | 亚洲中文字幕在线观看 | 免费乱码人妻系列无码专区 | 老太婆性杂交欧美肥老太 | 国产精品久久久久久久9999 | 少妇被黑人到高潮喷出白浆 | 国产情侣作爱视频免费观看 | 国产精品人人妻人人爽 | 成人一区二区免费视频 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲精品国产精品乱码不卡 | 亚洲精品国偷拍自产在线麻豆 | 丰满少妇人妻久久久久久 | 久久午夜无码鲁丝片秋霞 | 双乳奶水饱满少妇呻吟 | 欧美成人午夜精品久久久 | 暴力强奷在线播放无码 | 国产一区二区三区影院 | 久久这里只有精品视频9 | 精品无码国产一区二区三区av | 国产婷婷色一区二区三区在线 | 国内精品一区二区三区不卡 | 国产精品视频免费播放 | 国产成人精品一区二区在线小狼 | 无遮无挡爽爽免费视频 | 免费乱码人妻系列无码专区 | 亚洲熟妇自偷自拍另类 | 美女扒开屁股让男人桶 | 激情人妻另类人妻伦 | 久久视频在线观看精品 | 亚洲欧洲日本综合aⅴ在线 | 亚洲精品国产a久久久久久 | 日韩人妻少妇一区二区三区 | 性色欲情网站iwww九文堂 | 牲欲强的熟妇农村老妇女 | 伊人久久大香线蕉av一区二区 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 综合激情五月综合激情五月激情1 | 露脸叫床粗话东北少妇 | 亚洲熟妇色xxxxx欧美老妇y | 欧美 丝袜 自拍 制服 另类 | 又湿又紧又大又爽a视频国产 | 婷婷五月综合激情中文字幕 | 黑森林福利视频导航 | 日韩人妻无码中文字幕视频 | 国产精品99爱免费视频 | 国产成人精品三级麻豆 | 国产亚洲精品久久久闺蜜 | 精品一区二区三区波多野结衣 | 精品亚洲成av人在线观看 | 高潮喷水的毛片 | 精品国产乱码久久久久乱码 | 国产亚av手机在线观看 | 欧美野外疯狂做受xxxx高潮 | 人妻天天爽夜夜爽一区二区 | 熟妇女人妻丰满少妇中文字幕 | 国产乱码精品一品二品 | 131美女爱做视频 | 日日摸日日碰夜夜爽av | 老头边吃奶边弄进去呻吟 | 国产真实乱对白精彩久久 | 国产另类ts人妖一区二区 | 国产精品无码久久av | 欧美 日韩 人妻 高清 中文 | 欧美阿v高清资源不卡在线播放 | а√天堂www在线天堂小说 | 女人被男人躁得好爽免费视频 | 精品人妻中文字幕有码在线 | 在线a亚洲视频播放在线观看 | 精品无人区无码乱码毛片国产 | 18精品久久久无码午夜福利 | 丰满少妇熟乱xxxxx视频 | 在线精品亚洲一区二区 | 美女扒开屁股让男人桶 | 内射欧美老妇wbb | 亚洲成av人片在线观看无码不卡 | 成人免费视频在线观看 | 亚洲小说图区综合在线 | 亚洲最大成人网站 | 久久精品国产大片免费观看 | 日本xxxx色视频在线观看免费 | 国产精品手机免费 | 国产另类ts人妖一区二区 | 亚洲一区二区三区含羞草 | 黑森林福利视频导航 | 成人欧美一区二区三区黑人免费 | 少妇无码av无码专区在线观看 | 在线 国产 欧美 亚洲 天堂 | 国产美女极度色诱视频www | 久久国产精品偷任你爽任你 | 久久精品国产一区二区三区肥胖 | 欧美一区二区三区视频在线观看 | 成人精品视频一区二区 | 图片区 小说区 区 亚洲五月 | 亚洲精品一区二区三区在线 | 国产人妻人伦精品1国产丝袜 | 少妇无码一区二区二三区 | 久久精品国产一区二区三区 | 国产网红无码精品视频 | 日韩av无码一区二区三区 | 国产97在线 | 亚洲 | 一本大道久久东京热无码av | 亚洲精品久久久久avwww潮水 | 美女黄网站人色视频免费国产 | 丰满肥臀大屁股熟妇激情视频 | 午夜福利试看120秒体验区 | 色欲av亚洲一区无码少妇 | 国产国产精品人在线视 | 99久久久无码国产精品免费 | а√天堂www在线天堂小说 | 老熟女乱子伦 | 99麻豆久久久国产精品免费 | 久久精品女人天堂av免费观看 | 国产精品久久国产三级国 | 欧美丰满少妇xxxx性 | 无套内谢的新婚少妇国语播放 | 久久精品国产大片免费观看 | 性欧美大战久久久久久久 | 呦交小u女精品视频 | 久久久久久久久蜜桃 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲精品欧美二区三区中文字幕 | 久久综合久久自在自线精品自 | 大地资源中文第3页 | 亚洲精品成a人在线观看 | 亚洲综合精品香蕉久久网 | 国产精品香蕉在线观看 | 无码一区二区三区在线观看 | 亚洲精品成人福利网站 | 99久久精品午夜一区二区 | 亚洲 欧美 激情 小说 另类 | 在线播放免费人成毛片乱码 | 55夜色66夜色国产精品视频 | 人妻与老人中文字幕 | 成人无码视频免费播放 | 最新国产乱人伦偷精品免费网站 | 97夜夜澡人人爽人人喊中国片 | 亚洲区小说区激情区图片区 | 乱码午夜-极国产极内射 | 国产成人久久精品流白浆 | 成熟女人特级毛片www免费 | 亚洲色欲色欲欲www在线 | 国产超碰人人爽人人做人人添 | 精品久久久久久人妻无码中文字幕 | 午夜精品久久久久久久久 | 国产情侣作爱视频免费观看 | 亚洲国产欧美在线成人 | 性生交片免费无码看人 | 网友自拍区视频精品 | 免费无码av一区二区 | 精品厕所偷拍各类美女tp嘘嘘 | 97无码免费人妻超级碰碰夜夜 | 一本一道久久综合久久 | 麻豆国产97在线 | 欧洲 | 天堂а√在线中文在线 | 国产成人综合在线女婷五月99播放 | 欧美日本精品一区二区三区 | 377p欧洲日本亚洲大胆 | 精品国产av色一区二区深夜久久 | 天天av天天av天天透 | 任你躁国产自任一区二区三区 | 成 人 免费观看网站 | 国产精品视频免费播放 | 欧洲熟妇精品视频 | 色五月五月丁香亚洲综合网 | 午夜福利试看120秒体验区 | 成 人 网 站国产免费观看 | 在线视频网站www色 | 高清国产亚洲精品自在久久 | 成人免费视频在线观看 | 丰满少妇人妻久久久久久 | 精品欧美一区二区三区久久久 | 精品无码国产自产拍在线观看蜜 | 亚洲综合无码一区二区三区 | √8天堂资源地址中文在线 | 精品无码一区二区三区的天堂 | 人妻少妇精品视频专区 | 精品国产精品久久一区免费式 | 亚洲国产av精品一区二区蜜芽 | 欧洲美熟女乱又伦 | 免费观看黄网站 | 色综合久久久久综合一本到桃花网 | 国产猛烈高潮尖叫视频免费 | 无遮挡国产高潮视频免费观看 | 性欧美videos高清精品 | 国产色xx群视频射精 | 水蜜桃色314在线观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 性欧美疯狂xxxxbbbb | 婷婷色婷婷开心五月四房播播 | 狠狠色欧美亚洲狠狠色www | 55夜色66夜色国产精品视频 | 久久综合九色综合欧美狠狠 | 久久综合香蕉国产蜜臀av | 日韩av无码一区二区三区不卡 | 亚欧洲精品在线视频免费观看 | 国产在线一区二区三区四区五区 | 国内精品一区二区三区不卡 | 久久精品国产精品国产精品污 | 国产内射爽爽大片视频社区在线 | 亚洲欧美精品伊人久久 | 欧美日韩一区二区三区自拍 | 精品午夜福利在线观看 | 成人女人看片免费视频放人 | 亚洲成av人影院在线观看 | 日本熟妇人妻xxxxx人hd | 一本大道久久东京热无码av | 久久午夜无码鲁丝片午夜精品 | 国产国语老龄妇女a片 | 久久久亚洲欧洲日产国码αv | 亚洲色成人中文字幕网站 | 欧美人与动性行为视频 | 国产午夜无码视频在线观看 | 欧美猛少妇色xxxxx | 亚洲中文字幕乱码av波多ji | 亚洲七七久久桃花影院 | 婷婷六月久久综合丁香 | 无码av最新清无码专区吞精 | 久久综合九色综合97网 | 无码乱肉视频免费大全合集 | 免费中文字幕日韩欧美 | 给我免费的视频在线观看 | 天堂а√在线中文在线 | 日韩少妇内射免费播放 | 伊人久久大香线蕉午夜 | 在线视频网站www色 | 国产又粗又硬又大爽黄老大爷视 | 日日摸天天摸爽爽狠狠97 | 欧美老人巨大xxxx做受 | 性色欲网站人妻丰满中文久久不卡 | 国内精品久久久久久中文字幕 | 国产香蕉尹人视频在线 | 亚洲中文字幕无码中字 | 内射白嫩少妇超碰 | 久久精品人妻少妇一区二区三区 | 国内精品人妻无码久久久影院 | 国产成人无码专区 | 国产亚洲精品久久久久久大师 | 99re在线播放 | а天堂中文在线官网 | 2020最新国产自产精品 | 亚洲午夜久久久影院 | 国产内射老熟女aaaa | 久久精品国产日本波多野结衣 | 在教室伦流澡到高潮hnp视频 | 日本乱人伦片中文三区 | 99精品久久毛片a片 | 欧美人与禽猛交狂配 | 国产成人精品优优av | 中文无码伦av中文字幕 | 国产热a欧美热a在线视频 | 国产人妻大战黑人第1集 | 一本加勒比波多野结衣 | 特黄特色大片免费播放器图片 | 久久精品无码一区二区三区 | 天堂а√在线地址中文在线 | 丁香花在线影院观看在线播放 | 欧洲美熟女乱又伦 | 日日干夜夜干 | 午夜福利试看120秒体验区 | 国产色在线 | 国产 | 国产片av国语在线观看 | аⅴ资源天堂资源库在线 | 免费无码一区二区三区蜜桃大 | 成人影院yy111111在线观看 | 精品人妻中文字幕有码在线 | 荫蒂添的好舒服视频囗交 | 伊人色综合久久天天小片 | 九一九色国产 | 国产女主播喷水视频在线观看 | 亚洲一区二区三区四区 | 天天摸天天碰天天添 | 国产美女精品一区二区三区 | 狠狠综合久久久久综合网 | 亚洲第一无码av无码专区 | 日本丰满熟妇videos | 国产熟妇高潮叫床视频播放 | 性欧美牲交xxxxx视频 | 日本va欧美va欧美va精品 | 性欧美videos高清精品 | 熟妇女人妻丰满少妇中文字幕 | 丰满人妻一区二区三区免费视频 | 久久精品中文闷骚内射 | 国产人妻人伦精品1国产丝袜 | 免费乱码人妻系列无码专区 | 国产凸凹视频一区二区 | 无码帝国www无码专区色综合 | 日韩欧美群交p片內射中文 | 亚洲精品午夜国产va久久成人 | 日本精品人妻无码77777 天堂一区人妻无码 | 牲欲强的熟妇农村老妇女视频 | 日本护士xxxxhd少妇 | 丁香花在线影院观看在线播放 | 少妇邻居内射在线 | 免费网站看v片在线18禁无码 | 粉嫩少妇内射浓精videos | 天天av天天av天天透 | 人妻插b视频一区二区三区 | 人妻有码中文字幕在线 | 久久婷婷五月综合色国产香蕉 | 无码中文字幕色专区 | 精品欧美一区二区三区久久久 | 国产精品久久久久久久影院 | 麻豆果冻传媒2021精品传媒一区下载 | 西西人体www44rt大胆高清 | 蜜桃视频韩日免费播放 | 欧美变态另类xxxx | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 性色av无码免费一区二区三区 | 国产色视频一区二区三区 | 伊在人天堂亚洲香蕉精品区 | 久久综合久久自在自线精品自 | 国产97色在线 | 免 | 波多野结衣av在线观看 | 亚洲色无码一区二区三区 | 久久久久人妻一区精品色欧美 | 人妻体内射精一区二区三四 | 久久久婷婷五月亚洲97号色 | 国产口爆吞精在线视频 | 日本又色又爽又黄的a片18禁 | 国产成人人人97超碰超爽8 | 亚洲国产精品无码一区二区三区 | 沈阳熟女露脸对白视频 | 日本精品少妇一区二区三区 | 精品久久综合1区2区3区激情 | 欧美日韩一区二区三区自拍 | 鲁大师影院在线观看 | 伊人久久大香线蕉av一区二区 | 东京无码熟妇人妻av在线网址 | 亚洲七七久久桃花影院 | 亚洲中文字幕在线无码一区二区 | 一本久道久久综合婷婷五月 | 国产艳妇av在线观看果冻传媒 | 精品国产国产综合精品 | 牛和人交xxxx欧美 | 老子影院午夜精品无码 | 亚洲中文字幕va福利 | 在线播放无码字幕亚洲 | 免费网站看v片在线18禁无码 | 牛和人交xxxx欧美 | 欧美第一黄网免费网站 | 国产成人一区二区三区在线观看 | 亚洲色偷偷偷综合网 | 中文字幕无码免费久久9一区9 | 亚洲人成影院在线观看 | 欧美午夜特黄aaaaaa片 | 欧美日韩综合一区二区三区 | 成人精品视频一区二区 | 国产偷抇久久精品a片69 | 久久亚洲精品中文字幕无男同 | 亚洲日韩av片在线观看 | 乌克兰少妇xxxx做受 | 国产偷自视频区视频 | 国产精品va在线观看无码 | 未满成年国产在线观看 | 国产精品18久久久久久麻辣 | 欧美成人家庭影院 | 亚洲精品一区二区三区在线 | 亚洲狠狠婷婷综合久久 | 九九久久精品国产免费看小说 | 无码成人精品区在线观看 | 国产精品人人妻人人爽 | 美女极度色诱视频国产 | 欧美黑人性暴力猛交喷水 | 国产精品丝袜黑色高跟鞋 | 人妻尝试又大又粗久久 | 精品人人妻人人澡人人爽人人 | 国产莉萝无码av在线播放 | 国产精品无套呻吟在线 | 日韩精品无码一区二区中文字幕 | 欧美性生交活xxxxxdddd | 久久久精品国产sm最大网站 | 日韩精品无码一区二区中文字幕 | 亚洲欧美色中文字幕在线 | 成人欧美一区二区三区黑人免费 | 国产69精品久久久久app下载 | 中文字幕av无码一区二区三区电影 | 性欧美熟妇videofreesex | 国产亚av手机在线观看 | 中国大陆精品视频xxxx | 中文字幕乱妇无码av在线 | 久久亚洲国产成人精品性色 | 国产精品高潮呻吟av久久 | 天天躁夜夜躁狠狠是什么心态 | 欧美精品免费观看二区 | 国产免费无码一区二区视频 | 又粗又大又硬又长又爽 | 黑人大群体交免费视频 | 日韩 欧美 动漫 国产 制服 | 无码国产色欲xxxxx视频 | 最新国产乱人伦偷精品免费网站 | 丰满人妻一区二区三区免费视频 | 亚洲s色大片在线观看 | 日本乱人伦片中文三区 | 成人精品视频一区二区 | 国精产品一品二品国精品69xx | 精品熟女少妇av免费观看 | 国产一区二区三区日韩精品 | 婷婷丁香六月激情综合啪 | 精品乱码久久久久久久 | 免费观看的无遮挡av | 精品久久8x国产免费观看 | 国产免费久久久久久无码 | 久久久精品国产sm最大网站 | 久久久久久亚洲精品a片成人 | 香蕉久久久久久av成人 | 少妇人妻偷人精品无码视频 | 国产一区二区不卡老阿姨 | 久久综合香蕉国产蜜臀av | 久9re热视频这里只有精品 | 国产亚洲精品久久久久久国模美 | 在线欧美精品一区二区三区 | 亚洲日本一区二区三区在线 | 欧美第一黄网免费网站 | 国产电影无码午夜在线播放 | 亚洲高清偷拍一区二区三区 | 最近免费中文字幕中文高清百度 | 欧美性色19p | 国产另类ts人妖一区二区 | 午夜精品久久久久久久久 | 高清国产亚洲精品自在久久 | 日日鲁鲁鲁夜夜爽爽狠狠 | 久在线观看福利视频 | 久久视频在线观看精品 | 亚洲精品综合五月久久小说 | 亚洲啪av永久无码精品放毛片 | 亚洲经典千人经典日产 | 性欧美videos高清精品 | 色婷婷综合中文久久一本 | 高清国产亚洲精品自在久久 | a片免费视频在线观看 | 少妇性俱乐部纵欲狂欢电影 | 人人妻人人澡人人爽欧美一区九九 | 人妻aⅴ无码一区二区三区 | 精品久久久久久亚洲精品 | 亚洲中文字幕久久无码 | 四虎永久在线精品免费网址 | 少妇久久久久久人妻无码 | 日韩 欧美 动漫 国产 制服 | 精品国产成人一区二区三区 | 日本精品高清一区二区 | 成人精品一区二区三区中文字幕 | 人人妻人人澡人人爽欧美一区 | 在线亚洲高清揄拍自拍一品区 | 欧洲熟妇精品视频 | 少妇愉情理伦片bd | 亚洲国产综合无码一区 | 中文字幕av日韩精品一区二区 | 男人扒开女人内裤强吻桶进去 | 中文字幕无码热在线视频 | 青青青手机频在线观看 | 性色av无码免费一区二区三区 | 好男人www社区 | 麻豆国产丝袜白领秘书在线观看 | 波多野结衣乳巨码无在线观看 | 日本www一道久久久免费榴莲 | 正在播放老肥熟妇露脸 | 亚洲の无码国产の无码步美 | 精品亚洲韩国一区二区三区 | 国产精品自产拍在线观看 | 偷窥日本少妇撒尿chinese | 在线观看国产一区二区三区 | 婷婷五月综合激情中文字幕 | 2020久久香蕉国产线看观看 | 国产超级va在线观看视频 | 少妇激情av一区二区 | 亚洲乱亚洲乱妇50p | 亚洲欧洲日本综合aⅴ在线 | 久久久亚洲欧洲日产国码αv | 强开小婷嫩苞又嫩又紧视频 | 精品亚洲成av人在线观看 | 性生交大片免费看l | 亚洲熟熟妇xxxx | 成人影院yy111111在线观看 | 日日碰狠狠丁香久燥 | 无码国产色欲xxxxx视频 | 熟女少妇人妻中文字幕 | 2019午夜福利不卡片在线 | 午夜理论片yy44880影院 | 久久久久久久人妻无码中文字幕爆 | 国产av一区二区三区最新精品 | 亚洲国产欧美在线成人 | 日本一区二区三区免费高清 | 国产熟妇另类久久久久 | 日本在线高清不卡免费播放 | 亚拍精品一区二区三区探花 | 波多野结衣av一区二区全免费观看 | 亚洲爆乳无码专区 | 国产偷抇久久精品a片69 | 中文字幕色婷婷在线视频 | a在线亚洲男人的天堂 | 2020最新国产自产精品 | 亚洲va欧美va天堂v国产综合 | 真人与拘做受免费视频 | 亚洲色在线无码国产精品不卡 | 午夜福利试看120秒体验区 | 精品久久久无码人妻字幂 | 久久久久av无码免费网 | 亚洲熟妇色xxxxx欧美老妇 | 国产精品久久久久9999小说 | a国产一区二区免费入口 | 国产精品久久久av久久久 | 无码毛片视频一区二区本码 | 一本大道伊人av久久综合 | 国产人妻人伦精品1国产丝袜 | 国精品人妻无码一区二区三区蜜柚 | 99riav国产精品视频 | 久久综合激激的五月天 | 亚洲精品成人av在线 | 精品一区二区三区波多野结衣 | 久久99精品久久久久久动态图 | 人人爽人人澡人人人妻 | 国产精品人人爽人人做我的可爱 | 一二三四社区在线中文视频 | 一本久道高清无码视频 | 国产97色在线 | 免 | 亚洲国产高清在线观看视频 | 99久久精品无码一区二区毛片 | 一个人免费观看的www视频 | 伊人久久大香线蕉午夜 | 巨爆乳无码视频在线观看 | 在线观看免费人成视频 | 欧美大屁股xxxxhd黑色 | 无套内谢的新婚少妇国语播放 | 国产成人无码区免费内射一片色欲 | 红桃av一区二区三区在线无码av | 亚洲人成网站免费播放 | 国产精品99久久精品爆乳 | 成人免费无码大片a毛片 | 丰满肥臀大屁股熟妇激情视频 | 亚洲无人区午夜福利码高清完整版 | 粗大的内捧猛烈进出视频 | 国产无套内射久久久国产 | 粉嫩少妇内射浓精videos | 国产精品毛片一区二区 | 亚洲va欧美va天堂v国产综合 | 久久国产精品萌白酱免费 | 中文久久乱码一区二区 | 一个人免费观看的www视频 | 欧美日韩一区二区综合 | 日本精品少妇一区二区三区 | 荫蒂添的好舒服视频囗交 | 2019nv天堂香蕉在线观看 | 成人欧美一区二区三区黑人免费 | 4hu四虎永久在线观看 | 亚洲成在人网站无码天堂 | 天天av天天av天天透 | av无码电影一区二区三区 | 大地资源网第二页免费观看 | 国产亚洲精品久久久久久国模美 | 无遮挡啪啪摇乳动态图 | 日韩人妻系列无码专区 | 极品嫩模高潮叫床 | 伦伦影院午夜理论片 | 欧美 日韩 人妻 高清 中文 | 99久久精品日本一区二区免费 | 国产午夜精品一区二区三区嫩草 | 乱中年女人伦av三区 | 成熟女人特级毛片www免费 | 国产艳妇av在线观看果冻传媒 | 一本一道久久综合久久 | 大地资源网第二页免费观看 | 亚洲国产成人a精品不卡在线 | 亚洲成av人在线观看网址 | 日日碰狠狠丁香久燥 | 无码人妻精品一区二区三区不卡 | 亚洲人成网站免费播放 | 亚洲色欲久久久综合网东京热 | 久久久中文字幕日本无吗 | 日本精品人妻无码77777 天堂一区人妻无码 | 欧美怡红院免费全部视频 | 人人澡人人透人人爽 | 欧美成人免费全部网站 | 精品国产精品久久一区免费式 | 久久国内精品自在自线 | 亚洲人成影院在线观看 | 国产免费无码一区二区视频 | 国内老熟妇对白xxxxhd | 学生妹亚洲一区二区 | 亚洲乱码日产精品bd | 国产特级毛片aaaaaa高潮流水 | 精品国产福利一区二区 | 日日橹狠狠爱欧美视频 | 曰韩无码二三区中文字幕 | 国产无套粉嫩白浆在线 | 国产黑色丝袜在线播放 | 偷窥日本少妇撒尿chinese | 国产精品欧美成人 | 丰满护士巨好爽好大乳 | 麻豆国产人妻欲求不满谁演的 | 国产日产欧产精品精品app | 国产办公室秘书无码精品99 | 任你躁在线精品免费 | 99久久人妻精品免费一区 | 综合人妻久久一区二区精品 | 色婷婷综合中文久久一本 | 色情久久久av熟女人妻网站 | 性史性农村dvd毛片 | 两性色午夜免费视频 | 国产手机在线αⅴ片无码观看 | 在线视频网站www色 | 在线精品亚洲一区二区 | 成人精品一区二区三区中文字幕 | 人人爽人人爽人人片av亚洲 | 国精产品一区二区三区 | 国产一区二区三区日韩精品 | 欧美丰满老熟妇xxxxx性 | 美女极度色诱视频国产 | 国产精品欧美成人 | 欧美老人巨大xxxx做受 | 老熟女重囗味hdxx69 | 无码av岛国片在线播放 | 亚洲va欧美va天堂v国产综合 | 乱人伦人妻中文字幕无码久久网 | 97久久超碰中文字幕 | 色综合久久久无码中文字幕 | 东京无码熟妇人妻av在线网址 | 日本高清一区免费中文视频 | 午夜嘿嘿嘿影院 | 99er热精品视频 | 国产九九九九九九九a片 | 天干天干啦夜天干天2017 | 成人精品视频一区二区三区尤物 | 亚洲综合无码一区二区三区 | 人人妻人人藻人人爽欧美一区 | 欧美亚洲国产一区二区三区 | 国产成人精品视频ⅴa片软件竹菊 | 国产亚洲美女精品久久久2020 | 高中生自慰www网站 | 中文字幕日韩精品一区二区三区 | 丝袜 中出 制服 人妻 美腿 | 无码纯肉视频在线观看 | 无人区乱码一区二区三区 | 久久无码专区国产精品s | 大色综合色综合网站 | 久久伊人色av天堂九九小黄鸭 | 国产特级毛片aaaaaaa高清 | 无码av免费一区二区三区试看 | 国产无遮挡又黄又爽免费视频 | 国产熟女一区二区三区四区五区 | 久激情内射婷内射蜜桃人妖 | 小鲜肉自慰网站xnxx | 精品成在人线av无码免费看 | 国产真实夫妇视频 | 又紧又大又爽精品一区二区 | 日韩成人一区二区三区在线观看 | 99视频精品全部免费免费观看 | 丰满少妇人妻久久久久久 | 好爽又高潮了毛片免费下载 | 人妻体内射精一区二区三四 | 精品欧美一区二区三区久久久 | 无码人中文字幕 | 亚洲午夜久久久影院 | 粉嫩少妇内射浓精videos | 麻豆国产人妻欲求不满谁演的 | 夜精品a片一区二区三区无码白浆 | 亚洲中文字幕乱码av波多ji | 欧美阿v高清资源不卡在线播放 | 天堂无码人妻精品一区二区三区 | 亚洲国产精品美女久久久久 | 久热国产vs视频在线观看 | 国产9 9在线 | 中文 | 国产精品对白交换视频 | 丝袜人妻一区二区三区 | 亚洲熟悉妇女xxx妇女av | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲日韩av一区二区三区中文 | 免费观看的无遮挡av | 欧美老妇交乱视频在线观看 | 精品亚洲韩国一区二区三区 | 精品厕所偷拍各类美女tp嘘嘘 | 久久精品女人的天堂av | 久久aⅴ免费观看 | 97精品人妻一区二区三区香蕉 | 亚洲精品综合五月久久小说 | 中文字幕乱码人妻无码久久 | 亚洲国产精品久久久久久 | 国产成人无码一二三区视频 | 亚洲熟妇色xxxxx欧美老妇y | 中文字幕久久久久人妻 | 7777奇米四色成人眼影 | 中文字幕乱码人妻二区三区 | 欧美老熟妇乱xxxxx | 精品无码国产自产拍在线观看蜜 | 亚洲 欧美 激情 小说 另类 | 中文字幕乱妇无码av在线 | 给我免费的视频在线观看 | 帮老师解开蕾丝奶罩吸乳网站 | 国产成人午夜福利在线播放 | 又黄又爽又色的视频 | 激情五月综合色婷婷一区二区 | 蜜桃无码一区二区三区 | 久久天天躁夜夜躁狠狠 | 色窝窝无码一区二区三区色欲 | 国产成人无码a区在线观看视频app | 人妻少妇精品无码专区动漫 | 在线精品国产一区二区三区 | 久久久久se色偷偷亚洲精品av | 亚洲成a人一区二区三区 | 国产精品无码久久av | 国产在线一区二区三区四区五区 | 又湿又紧又大又爽a视频国产 | 精品人妻av区 | 午夜精品久久久久久久久 | 国产两女互慰高潮视频在线观看 | 国产午夜亚洲精品不卡下载 | 色欲av亚洲一区无码少妇 | 亚洲综合在线一区二区三区 | 无码帝国www无码专区色综合 | 日本欧美一区二区三区乱码 | 未满小14洗澡无码视频网站 | 国产超级va在线观看视频 | 18精品久久久无码午夜福利 | 熟妇人妻无乱码中文字幕 | 亚洲第一无码av无码专区 | 亚洲成色在线综合网站 | 特级做a爰片毛片免费69 | 无码帝国www无码专区色综合 | 亚洲 日韩 欧美 成人 在线观看 | 久久亚洲中文字幕无码 | 亚洲国产av美女网站 | 国产激情精品一区二区三区 | 色综合久久久无码中文字幕 | 午夜精品一区二区三区在线观看 | 亚洲综合另类小说色区 | 好爽又高潮了毛片免费下载 | 亚洲天堂2017无码中文 | 男女爱爱好爽视频免费看 | 免费国产成人高清在线观看网站 | 欧美日本日韩 | 国产在线精品一区二区高清不卡 | 久久精品成人欧美大片 | 国产亚洲精品久久久闺蜜 | 亚洲一区二区三区国产精华液 | 色综合久久久久综合一本到桃花网 | 色综合久久久无码网中文 | 亚洲熟妇色xxxxx欧美老妇 | 成人精品天堂一区二区三区 | 久久久久久a亚洲欧洲av冫 | 中文字幕日产无线码一区 | 全球成人中文在线 | 熟女体下毛毛黑森林 | 亚洲日韩一区二区三区 | 亚洲欧美国产精品专区久久 | 熟妇人妻中文av无码 | 国产97色在线 | 免 | 欧美性猛交内射兽交老熟妇 | 小泽玛莉亚一区二区视频在线 | 国产精品igao视频网 | 国产区女主播在线观看 | 成人无码视频在线观看网站 | 一本色道久久综合狠狠躁 | 久久精品国产精品国产精品污 | 一二三四在线观看免费视频 | 最新版天堂资源中文官网 | 亚洲欧美国产精品久久 | 国产精品欧美成人 | 色婷婷欧美在线播放内射 | 国产精品久久精品三级 | 国产激情精品一区二区三区 | 免费无码午夜福利片69 | av无码久久久久不卡免费网站 | 少妇久久久久久人妻无码 | 国产一区二区三区精品视频 | 人妻互换免费中文字幕 | 无码任你躁久久久久久久 | 亚洲综合无码一区二区三区 | 人妻无码久久精品人妻 | 九九久久精品国产免费看小说 | 国内少妇偷人精品视频免费 | 免费国产成人高清在线观看网站 | 成人片黄网站色大片免费观看 | 97色伦图片97综合影院 | 午夜精品一区二区三区在线观看 | 2019午夜福利不卡片在线 | 高清国产亚洲精品自在久久 | 国产偷国产偷精品高清尤物 | 精品国产一区二区三区四区在线看 | 婷婷五月综合缴情在线视频 | 久久综合激激的五月天 | 国产情侣作爱视频免费观看 | 秋霞特色aa大片 | 天天综合网天天综合色 | 无码国内精品人妻少妇 | 99国产精品白浆在线观看免费 | 国产成人无码av一区二区 | 无码纯肉视频在线观看 | 丰满妇女强制高潮18xxxx | 中文字幕无线码 | 帮老师解开蕾丝奶罩吸乳网站 | 久精品国产欧美亚洲色aⅴ大片 | 日韩精品无码免费一区二区三区 | 成人影院yy111111在线观看 | 波多野结衣av在线观看 | 国产猛烈高潮尖叫视频免费 | 精品偷拍一区二区三区在线看 | 2020久久超碰国产精品最新 | 国产精品无码一区二区三区不卡 | 日本一本二本三区免费 | 高潮毛片无遮挡高清免费 | 欧美兽交xxxx×视频 | 中文字幕人妻无码一区二区三区 | 国产人妖乱国产精品人妖 | 超碰97人人射妻 | 精品国产乱码久久久久乱码 | 亚洲男人av天堂午夜在 | 亚洲熟妇色xxxxx欧美老妇 | 乌克兰少妇xxxx做受 | 成人aaa片一区国产精品 | 免费人成网站视频在线观看 | 久久99精品久久久久久 | 伊人久久大香线蕉av一区二区 | 强伦人妻一区二区三区视频18 | 亚洲成a人片在线观看日本 | 亚洲精品成a人在线观看 | 久久亚洲国产成人精品性色 | 2019nv天堂香蕉在线观看 | 麻豆国产丝袜白领秘书在线观看 | 久久久久久国产精品无码下载 | 久久综合给合久久狠狠狠97色 | 午夜福利一区二区三区在线观看 | 精品人妻av区 | 欧美日韩一区二区三区自拍 | 国产三级精品三级男人的天堂 | 国产乱子伦视频在线播放 | 精品国产成人一区二区三区 | | 妺妺窝人体色www在线小说 | 暴力强奷在线播放无码 | 欧美 丝袜 自拍 制服 另类 | 精品无码国产一区二区三区av | 精品国偷自产在线视频 | 日本成熟视频免费视频 | 国内丰满熟女出轨videos | 人妻少妇精品无码专区二区 | 国产av剧情md精品麻豆 | 中文字幕日产无线码一区 | 国产绳艺sm调教室论坛 |