动态网站建设 ——利用ASP来制作动态网站

目录

1ASP构建动态网页

1.1动态网站的优点

1.2 ASP概述

1.3 ASP工作环境

1.4 ASP工作原理

1.5 ASP技术特点

1.6 ASP内置函数

1.7 ASPApplicationSession对象

二、用ASP进行动态网页设计

2.1利用ASP进行动态数据查询.

2.2 ASP访问数据库概述及工作原理.

2.2.1ASP访问数据库概述

2.2.2ASP访问数据库的工作原理

2.3 ASP连接数据库的方法.

2.4 ASP访问数据库.

三、网页的界面设计.

3.1网页界面构成要素.

3.2网页的整体造型.

3.3网页的色彩搭配.

四、在建设中遇到的问题和解决方法.

4.1媒体对象需要激活——虚线环绕.

4.2动态网站不亲和搜索引擎——搜索引擎不收录动态页面.

4.2.1网站优化技术——SEO技术.

4.2.2 PageRank.

4.2.3反向链接、内部链接、外部链接.

五、结束语

六、参考文献.

七、致谢

1用ASP构建动态网页

1.1动态网站的优点

•动态网站可以实现交互功能,如用户注册、信息发布、产品展示、订单管理等等;
•动态网页并不是独立存在于服务器的网页文件,而是浏览器发出请求时才反馈网页;
•动态网页中包含有服务器端脚本,所以页面文件名常以ASP、jsp、php等为后缀;
•动态网页由于需要数据库处理,所以动态网站的访问速度大大减慢;
•动态网页由于存在特殊代码,所以不易被搜索引擎检索.

1.2 ASP概述

做动态网站我选择用ASP语言编写.

ASP是Active Server Page的缩写,意为“活动服务器网页”.ASP是微软公司开发的代替CGI脚本程序的一种应用,它可以与数据库和其它程序进行交互,是一种简单、方便的编程工具.ASP的网页文件的格式是.ASP,现在常用于各种动态网站中. ASP是一种服务器端脚本编写环境,可以用来创建和运行动态网页或Web应用程序.ASP网页可以包含HTML标记、普通文本、脚本命令以及COM组件等.利用ASP可以向网页中添加交互式内容(如在线表单),也可以创建使用HTML网页作为用户界面的web应用程序. 与HTML相比,ASP网页具有以下特点:

(1)利用ASP可以实现突破静态网页的一些功能限制,实现动态网页技术;

(2)ASP文件是包含在HTML代码所组成的文件中的,易于修改和测试;

(3)服务器上的ASP解释程序会在服务器端制定ASP程序,并将结果以HTML格式传送到客户端浏览器上,因此使用各种浏览器都可以正常浏览ASP所产生的网页;

(4)ASP提供了一些内置对象,使用这些对象可以使服务器端脚本功能更强.例如可以从web浏览器中获取用户通过HTML表单提交的信息,并在脚本中对这些信息进行处理,然后向web浏览器发送信息;

(5)ASP可以使用服务器端ActiveX组件来执行各种各样的任务,例如存取数据库、发现哦那个Email或访问文件系统等.

(6)由于服务器是将ASP程序执行的结果以HTML格式传回客户端浏览器,因此使用者不会看到ASP所编写的原始程序代码,可放置ASP程序代码被窃取.

1.3 ASP工作环境

ASP需要运行在PWS或IIS下.PWS或IIS服务在windows98或windows2000的光盘上附带着,可以通过“添加/删除程序”中的“添加/删除windows组件”来安装.

一般ASP需与access数据库或SQL Server数据库结合使用,编出功能强大的程序.

能够运行ASP的web服务器软件  

Windows2000默认安装的是IIS5.0(internet information server),而windows xp默认安装的是IIS5.1,windows 2003默认安装的IIS6.0.

PWS(personal web server)运行在windows98环境下的简单个人网页服务器

1.4 ASP工作原理

当在Web站点中融入ASP功能后,将发生以下事情:

1、用户向浏览器地址栏输入网址,默认页面的扩展名是.ASP.

2、浏览器向服务器发出请求.

3、服务器引擎开始运行ASP程序.

4、ASP文件按照从上到下的顺序开始处理,执行脚本命令,执行HTML页面内容.

5、页面信息发送到浏览器.

1.5 ASP技术特点

ASP( Application Service Provider,应用软体租赁服务提供者 )即是指「透过网路以租赁方式提供应用软体服务的业者」,即是指业者以应用软体为主体,透过网路一对多地传递服务,这种以服务为主的交易模式促使企业可藉由租赁的方式,以更符合成本效益的方式拥有软体的使用权,并且亦能因为业者集中式的管理而大幅降低企业维护的成本.

基本上,ASP即具有「软体服务化,服务网路化」,「资讯委外服务与网路结合」与「产品通路化,通路产品化」等三大特性,其甚至可以被视为是ISP(Internet Service Provider)与ITS(Information Technology Service)的结合.

ASP的英文是Application Service Provider,中文的标准翻译就是“应用服务提 供商”,是指为商业或者个人客户提供管理应用解决方案的公司或者企业.最近 ASP被媒体炒做十分火热,不是IT行业的人面对一堆技术名词专业术语很难弄清楚ASP的内容,本文试图用浅显的语言来为广大的读者揭开ASP神秘的面纱,对于IT行业的大热门ASP领域有一些基本的认识.  

1. ASP是什么东西?  

简单地讲,ASP就是为客户提供服务的服务商,它和会计事物所、婚姻介绍所没有什么本质方面的区别.不同的是ASP主要是通过INTERNET(国际互联网络)作为主要工作和业务工具,采用一对多的方式,向企业、公司提供标准化的应用软件以及相关的技术咨询、管理租赁的服务,ASP的概念最早是1998年由美国人提出来的.目前被全球各大IT厂商看好并被认为是可以推动网络经济发展的,有稳固基础的第三种网络商业模式.  

和传统的外包服务(Outsourcing)相比,ASP的主要区别在于:ASP是一对多的经营模式,提供的服务有兼容性和可协调性,并且ASP的收费方式一般是按月收费.

业界认为:ASP一般有这样一些“成员”:电信运营商、传统IT服务厂商、互联网络接入服务商(ISP)、独立软件供应商(ISV)、系统集成商和单纯的ASP公司.

根据流行的观点,ASP有如下五个核心内涵:  

a. ASP着重应用为中心,提供对于应用方面的访问和管理.  

b. ASP服务可以为用户提供没有在服务器、人员、系统和系统授权等前期资源投入情况下就可以在“定制”的全新应用系统环境进行访问的服务,如ISP,而这样的服务一般按月份ASP收取服务费.  

c. ASP采用集中管理的方式---ASP一般都有一个管理中心,所有的客户通过INTERNET来进行远程访问,获得技术支持和咨询服务.  

d. 一对多的服务,也就是讲,ASP提供的是标准化的产品包,产品都是最低程度的自定义或者没有实现客户定制化,对于行业用户来讲已经达到实用方便的标准.  

e. 按照合同交付,在ASP客户的眼中,ASP是一家根据客户协议内容提供相关服务,保证应用服务系统服务可以得到确实履行的机构.  

2. ASP为什么会火?

从大的方面来讲,困扰国内企业生存、发展的核心问题是管理问题.随着互联网络的普及和应用的深入,企业用户可以随时随地直接租用ASP的服务器和软件系统来进行自己的业务管理,这样做的好处在于;第一,企业可以节省大笔用于IT建设方面的资金,大幅度降低企业管理信息化的成本.第二,ASP的用户可以采用各种方式获得应用和服务,软件类服务产品完全可以通过网络在非常短的时间内组成一个完善的、高效的、先进的企业管理系统,迅速获得企业一体化的运营管理方案.  

网络经济发展突飞猛进,电子商务一日千里,网络和网站从门户到内容、从注意力到垂直性,目前逐渐转向热衷ASP也是一个主要的原因.  

笔者资料中,国内最早对ASP触电的是网友“飞鸟”,在1998年6月自发组织了研究、交流和探讨ASP技术的“飞鸟之家”,现在已经发展成为chinaASP.com,成为国内最早的ASP应用技术服务提供商网站.上海的互易网络有限公司结合国内实际情况,推出了为国内企业服务的ASP平台互易网,向企业提供以电子商务为核心的,企业内、外部网络设施和应用的远程构架和托管服务,创造虚拟企业门户(EP)直接将ASP应用到商业增殖环节中去.  

此外,ISP也全面转向ASP的怀抱,成为ISP进一步发展的产物.软件商对于ASP更是情有独钟.业界最新的消息是,中国第三电信“网通”已经制定ASP发展战略,国内最大的管理咨询公司“汉普”将把旗下八个子公司定位在企业内部资源计划管理(ERP)领域的ASP中,北京“联成互动”瞄准客户关系管理(CRM)领域的ASP,北京“数码方舟”定位在网络办公的ASP,HP正在和中国建设银行讨论共建金融领域的ASP.  

ASP正在IT经济大潮中显山露水,其发展前景不可估量.  

3. ASP的发展阶段和面临的问题  

以网络服务商、软件厂商和ISP为主力的各种IT角色,正在根据自己的优势条件出发对ASP领域进行多种方面的尝试.就目前阶段来讲,ASP提供的服务不计其数五花八门,没有标准化和量化的概念,硬件厂商向ASP的“土壤”和势力方向靠拢,软件厂商和ISP则直接参与到ASP业务的第一线.  

笔者估计,经过一段时间的试探和发展,ASP将向服务集成方面发展,产品和服务初步的标准化将很快建立起来,接着进入到市场细化和标准制定、ASP产品成熟时期,ASP的稳步增长,最终将成为IT行业商务模式的核心!  

目前在ASP发展的道路上,主要面临的问题是观念的转变方面:用租赁代替购买,服务集成代替产品经销商、服务经济代替产品经济等等.具体到实际方面来讲,安全和服务的质量是ASP和客户共同关心的头等大事,要实现ASP提出的“租赁高科技”的口号,ASP任重而道远!

1.6 ASP内置函数

1,日期/时间函数

这些函数包括对“年”、“月”、“日”、“时”、“分”、“秒”、“星期”等的显示.

(1)Now函数:根据计算机系统设定的日期和时间,返回当前的日期和时间值.使用方法now();

(2)Date函数:只返回当前计算机系统设定的日期值.使用方法:date();

(3)Time函数:只返回当前计算机系统设定的时间值.使用方法:time();

(4)Year函数:返回一个代表某年的整数.使用方法:year(date),其中date参数是任意的可以代表日期的参数,比如“year(date())”就表示是从“date()”得出的日期中提取其中“年”的整数.

另外,还可以这样应用:“year(#5 20,2006#)”表示提取“2006年5月20日”中“年”的整数值.关于“5 20,2006”,也可使用“5-20-2006”、“5/20/2006”等形式表现,即“某月某日”和“某年”的组合.同时注意使用“#”进行包括以表示日期值.

(5)Month函数:返回1到12之间的整数值,表示一年中某月.使用方法:month(date).关于参数date的说明和year函数相同.但要注意日期的正确性,比如“#13-31-2006#”,根本就没有“13”月,肯定是错误的了.

(6)Day函数:返回1到31之间的整数值,表示一个月中的某天.使用方法:day(date).关于参数date的说明和year函数相同.同样要注意日期的正确性,比如“#2-30-2006#”其中对“2”月定义的“30”日这天就是错误的.

(7)Hour函数:返回0到23之间的整数值,表示一天中的某个小时.使用方法:hour(time).其中参数time是任意的可代表时间的表达式.比如“hour(time())”就表示是从“time()”得出的时间中提取其中“小时”的整数.同样,参数time还可以这样应用“hour(#11:45:50#)”表示从“11”时“45”分“50”秒中提取当前小时数.当然,定义的时间要符合时间的规范.

(8)Minute函数:返回0到59之间的整数值,表示一小时中的某分钟.使用方法:minute(time).time参数的说明和hour函数相同.

(9)Second函数:返回0到59之间的整数值,表示一分钟中的某秒.使用方法:second(time).time参数的说明和hour函数相同.

(10)Weekday函数:返回一个星期中某天的整数.使用方法:weekday(date).关于参数date的说明和year函数相同.该函数返回值为“1”到“7”,分别代表“星期日”、“星期一”……“星期六”.比如当返回值是“4”时就表示“星期三”.

(11)WeekDayName函数:返回一个星期中具体某天的字符串.相对weekday函数而言即翻译出“星期几”,使用方法:weekdayname(weekday).参数weekday即星期中具体某天的数值.比如“weekdayname(weekday(date()))”就表示当前是“星期几”.因为“date()”表示的是当前的时间,而“weekday(date())”就表示的是一星期中具体某天的整数.

当然weekdayname函数最终显示的字符串内容还与当前操作系统语系有关,比如中文操作系统将显示“星期一”这类的中文字符,而英文操作系统则显示为“Mon”(Monday简写).

此外,在VBScript中还有一些关于时间间隔的计算函数:

(1)DateAdd函数:返回指定时间间隔的日期、时间.可以计算出相隔多少年、或相隔几个月、又或相隔几个小时等的新日期、时间.使用方法:dateadd(interval, number, date).

其中参数interval表示需要添加的时间间隔单位.其是以字符串的形式表达的,比如“yyyy”表示年,“q”表示季度,“m”表示月份,“d”表示天数,“ww”表示周数,“h”表示小时数,“n”表示分钟数,“s”表示秒数.

而参数number则表示添加的时间间隔数.其是以数值的形式表达的,可以为负值.参数date则要求是日期、时间的正确格式.

比如dateadd("d",100,"2006-5-20")就表示2006年5月20号以后的100天的日期值:2006-8-28.再比如dateadd("h",-12,"2005-5-20 10:00:00")就表示2005年5月20号上午10点前的12小时的日期时间:2005-5-19 22:00:00.

(2)DateDiff函数:返回两个日期时间之间的间隔.可计算出两个日期相隔的年代、小时数等.使用方法:datediff(interval,date1,date2).

参数interval和dateadd函数中的interval参数内容描述相同,date1和date2参数分别就是相互比较的两个日期时间.另外,当date1的日期时间值大于date2时,将显示为负值.

比如DateDiff("yyyy","1982-7-18",date)表示某人的出生到现在已经多少年了.又比如DateDiff("d","1982-7-18","2062-7-18")则计算了80年过了多少天:29220.

2,字符串处理函数

在脚本的功能处理中,通常需要对一些字符串进行一些修饰性处理.比如过滤掉字符串中的敏感字眼以符合最终显示的要求;又比如一段较长的字符串,需要提取开头的几个字符时.

(1)Asc函数:返回字符串中第一个字母对应的ANSI字符代码.使用方法:asc(string).其中string参数表示字符串.

(2)Chr函数:返回指定了ANSI 字符代码对应的字符.使用方法:chr(chrcode).参数chrcode是相关的标识数字.该函数的功能和asc函数形成对应.

比如:asc(“a”)表示小写字母“a”的ANSI 字符“97”;同样chr(97)表示的就是“小写字母a”.另外chr(chrcode)中参数chrcode值为0到31的数字时,表示不可打印的ASCII码.比如“chr(10)”表示换行符,“chr(13)”表示回车符等,这常用于输入和显示格式的转换中.

(3)Len函数:返回字符串内字符的数目(字节数).使用方法:len(string).比如len(“love”)的值就是4.

(4)LCase函数:返回所有字符串的小写形式.使用方法:lcase(string).比如lcase(“CNBruce”)返回为“cnbruce”.

(5)UCase函数:返回所有字符串的大写形式.与lcase函数形成对应.同样,ucase(“CNBruce”)返回为“CNBRUCE”.

(6)Trim函数、LTrim函数和RTrim函数:分别返回前导和后续不带空格、前导不带空格或后续不带空格的字符串内容.比如:

trim(“ cnbruce ”)返回为“cnbruce”,前导和后续都不带空格;

ltrim(“ cnbruce ”)返回为“cnbruce ”,前导不带空格;

rtrim(“ cnbruce ”)返回为“ cnbruce”,后续不带空格;

该函数常用于注册信息中,比如确保注册用户名前或后的空格.

(7)Left函数:返回从字符串的左边算起的指定数目的字符.使用方法:left(string,length).比如left(“brousce”,5)返回为“brous”,即前五位字符.

(8)Right函数:返回从字符串的左边算起的指定数目的字符.使用方法:right(string,length).比如right(“brousce”,4)返回为“usce”,即后四位字符.

(9)instr函数:返回某字符串在另一字符串中第一次出现的位置.比如现在查找字母“A”在字符串“A110B121C119D1861”中第一次出现的位置,则可以 instr(my_string,"A110B121C119D1861")

(10)Mid函数:从字符串中返回指定数目的字符.比如现在的“110”则应该是从字符串“A110B121C119D1861”的第2位取得3个单位的值:mid("A110B121C119D1861",2,3)

(11)Replace函数:在字符串中查找、替代指定的字符串.replace(strtobesearched,strsearchfor,strreplacewith)其中strtobesearched是字符串,strsearchfor是被查找的子字符串,strreplacewith是用来替代的子字符串.比如 replace(rscon,"<","<") 则表示将rscon中所有“<”的字符替换为“<”

3,类型转换函数

Cbool(string) 转换为布尔值

Cbyte(string) 转换为字节类型的值

Ccur(string) 转换为货币类值

Cdate(string) 转换为日前类型的值

Cdbl(string) 转换为双精度值

Cint(string) 转换为整数值

Clng(string) 转换为长整型的值

Csng(string) 转换为单精度的值

Cstr(var) 转换为字符串值

Str(var) 数值转换为字符串

Val(string) 字符串转换为数值

4,运算函数

Abs(nmb) 返回数子的绝对值

Atn(nmb) 返回一个数的反正切

Cos(nmb) 返回一个角度的余炫值

Exp(nmb) 返回自然指数的次方值

Int(nmb) 返回数字的整形(进位)部份

Fix(nmb) 返回数字的整形(舍去)部份

Formatpercent(表达式) 返回百分比

Hex(nmb) 返回数据的16进制数

Log(nmb) 返回自然对数

Oct(nmb) 返回数字的8进制数

Rnd 返回大于“0”而小于“1”的随机数,但此前需 randomize 声明产生随机种子

Sgn(nmb) 判断一个数字的正负号

Sin(nmb) 返回角度的正铉值

Sqr(nmb) 返回数字的二次方根

Tan(nmb) 返回一个数的正切值

5,其他函数

IsArray(var) 判断一个变量是否是数组

IsDate(var) 判断一个变量是否是日期

IsNull(var) 判断一个变量是否为空

IsNumeric(var) 判断表达式是否包含数值

IsObject(var) 判断一个变量是否是对象

TypeName(var) 返回变量的数据类型

Array(list) 返回数组

Split(liststr) 从一个列表字符串中返回一个一维数组

LBound(arrayP 返回数组的最小索引

Ubound(array) 返回数组的最大索引

CreateObject(class) 创建一个对象

GetObject(pathfilename) 得到文件对象

1.7 ASP中Application和Session对象

一、Application对象的成员概述

Application对象成员包括Application对象的集合、方法和事件.

⒈Application对象的集合

Contents集合:没有使用元素定义的存储于Applicaiton对象中的所有变量的集合

StaticObjects:使用元素定义的存储于Application对象中的所有变量 的集合

  例:在default.ASP中有如下赋值

application("a")="a"

application("b")=128

application("c")=false

  则有contents集合

application.contents(1)="a" '也可写为application.contents("a")="a"

application.contents(2)=128 '也可写为application.contents("b")=128

application.contents(3)=false '也可写为application.contents("c")=false

  在此笔者推荐你在调用时使用类如application.contents("a")的方法,因为这样更为直观,如果用序号来表示的话则要考虑赋值的先后顺序.

⒉Application对象的方法

Contents.Remove("变量名"):从Application.Contents集合中删除指定的变量

Contents.RemoveAll() :把Application.Contents集合中的所有变量删除

Lock() :锁定Application对象,使得只有当前的ASP页对内容能进行访问

Unlock() :解除对Application对象的锁定

  例:在default.ASP中:

application("a")="a"

application("b")=128

application("c")=false

response.write application.contents(1)&"

"

response.write application.contents(2)&"

"

response.write application.contents(3)&"

"

response.write "After Remove b:"

application.contents.remove("b")

response.write application.contents(1)&"

"

response.write application.contents(2)&"

"

  执行结果:

a

128

False

After Remove b:

a

False

  如果要删除集合中所有变量用application.contents.removeall即可,至于Lock和Unlock方法在实际中经常用到,读者也比较熟悉,在此就不在累赘.

⒊Application对象事件

OnStart:第一个访问服务器的用户第一次访问某一页面时发生

OnEnd :当最后一个用户的会话已经结束并且该会话的OnEnd事件所有代码已经执行完毕后发生,或最后一个用户访问服务器一段时间(一般为20分钟)后仍然没有人访问该服务器产生.

  想要定义application对象的OnStart和OnEnd事件里做什么需要将代码写在Global.asa这个文件里(下文有举例),并且将该文件放在站点的根目录下(一般是Inetpub\wwwroot\)

  二、Session对象的成员概述

Session对象的成员比Application对象多一项属性,即:集合、属性、方法、事件

⒈Session对象的集合

Contents :没有使用元素定义的存储于特定Session对象的所有变量的集合.

StaticObject:使用元素定义的、存储于Session对象中的所有变量的集合.

  例:在default.ASP中有如下赋值

session("a")="a"

session("b")=128

session("c")=false

  则有contents集合

session.contents(1)="a" '也可写为session.contents("a")="a"

session.contents(2)=128 '也可写为session.contents("b")=128

session.contents(3)=false '也可写为session.contents("c")=false

⒉Session对象的属性

CodePage: 可读/可写.整型.定义用于在浏览器中显示页内容的代码页.代码页是字符集的数字值,不同的语言使用不同的代码页.例如,ANSI代码页为1252,日文代码页为932,简体中文代码页为936.

LCID : 可读/可写.整型.定义发送给浏览器的页面地区标识.LCID是唯一地标识地区的一个国际标准缩写,例如,2057定义当前地区的货币符号是"£".

SessionID: 只读.长整型.返回本会话的会话标识符.每创建一个会话,由服务器自动分配一个标识符.可以根据它的值判断两个用户是谁先访问服务器.

Timeout : 可读/可写.整型.为会话定义以分钟为单位的超时限定.如果用户在这个时间内没有刷新或请求任何一个网页,则该用户产生的会话自动结束.缺省值是20.

以上属性在实际应用中作用不大,而且基本上不需要怎么修改,这几个属性也没什么特殊的地方.

⒊Session对象的方法

Contents.Remove("变量名"): 从Session.contents集合中删除指定的变量

Contents.Removeall() : 删除Session.contents集合中的所有变量

Abandon() : 结束当前用户会话并且撤消当前Session对象.

Session对象的Contents.Remove("变量名")和Contents.Removeall()方法与Application对象的基本上没什么区别,为帮助理解,大家可以参照上面的例子将Application改为Session.这里要说明一下的是Contents.Removeall()和Abandon()的区别,执行这两个方法都会释放当前

  用户会话的所有Session变量,不同的是Contents.Removeall()单纯地释放Session变量的值而不终止当前的会话,而Abandon()除了释放Session变量外还会终止会话引发Session_OnEnd事件,希望大家注意两者的区别.

⒋Session对象的事件

OnStart: 当ASP用户会话产生时触发,一旦有任一用户对本服务器请求任一页面即产生该事件.

OnEnd : 当ASP用户会话结束时触发,当使用Abandon()方法或超时也会触发该事件.

  这两个事件和Application的OnStart、OnEnd事件一样,也是必须放在Global.asa文件里,下

面就重点和大家研究一下这四个事件的使用.

  三、Global.asa

ASP的Application和Session对象体现了其他ASP内置对象所没有的特征--事件.每一个访客访问服务器时都会触发一个OnStart事件(第一个访客会同时触发Application和Session的OnStart事件,但Application先于Session),每个访客的会话结束时都会触发一个OnEnd事件(最后一个访客会话结束时会同时触发Application和Session的OnEnd事件,但Session先于Application).

OnStart和OnEnd这两个事件一般应用在虚拟社区中统计在线人数、修改用户的在线离线状态等.要具体定义这两个事件,需要将代码写在Global.asa文件,并将该文件放在站点的根目录下(缺省是\Inetpub\wwwroot\).另外,Application和Session对象规定了在OnEnd事件里除了Application对象外其他ASP内置对象(Response、Request、Server、Session...)一概不能使用.以下举一个虚拟社区统计在线人数的例子来说明如何使用这两个事件.

  文件说明:

global.asa 位于d:\Inetpub\wwwroot\目录下

default.ASP 位于d:\Inetpub\wwwroot\目录下,虚拟社区登录页面

login.ASP 位于d:\Inetpub\wwwroot\目录下,用于检测用户输入的用户名及密码

index.ASP 位于d:\Inetpub\wwwroot\目录下,虚拟社区首页

bbs.mdb 位于d:\Inetpub\wwwroot\目录下,存储用户信息的数据库

  数据库(ACCESS)结构:

===bbs表===

id 用户ID,长整型

name 用户名,文本型

code 密码,文本型

online 在线状态,是/否

 ===global.asa===

  <script LANGUAGE="VBScript" RUNAT="Server">

Sub Application_OnStart

application("online")=0

End Sub

sub Application_OnEnd

nd Sub

Sub Session_OnStart

End Sub

Sub Session_OnEnd

if session.contents("pass") then '判断是否为登录用户的Session_OnEnd

application.lock

application("online")=application("online")-1

application.unlock

end if

End Sub

  </script>

===login.ASP===

......'密码验证,连接数据库,检测用户输入的用户名及密码是否正确

if 密码验证通过 then

session("name")=rs("name")

session("id")=rs("id")

session("pass")=true

else

rs.close

conn.close

response.write "密码错误!"

response.end

end if

application.lock

application("online")=application("online")+1

conn.Execute ("update bbs set online=1 where id="&session("id"))'将用户的状态设为在线

application.unlock

rs.close

conn.close

response.redirect "index.ASP" '初始化数据后跳转到社区首页

===========

  在本例中,用application("online")变量记录已经登录社区的在线人数,因为一旦有用户访问服务器而不管用户是否登录,都会产生OnStart事件,所以不能在OnStart事件里使Applicaiton("online")加一.因为不管是否是登录用户的会话结束都会产生OnEnd事件(假如有访客访问了服务器但并不登录社区,他的会话结束后也会产生OnEnd事件),所以在Session_OnEnd事件里用了句if语句来判断是否为已登录用户的OnEnd事件,如果是才将在线人数减一.

  这只是一个统计在线人数的简单例子,对于一个完整的虚拟社区来说,仅仅统计有多少人在线是不够的,在本例中数据库里有个online字段是用来记录用户的在线状态,用户登录的时候,在login.ASP里将online设为1,但用户离线时并没有将online设为0,要完善它,就要修改一下Session_OnEnd事件,在该事件里将online设为0.

===global.sas===

  <script LANGUAGE="VBScript" RUNAT="Server">

Sub Application_OnStart

application("online")=0

set application("conn")=Server.CreateObject("ADODB.Connection")

application("db")=Server.MapPath("\bbs.mdb") '此处最好使用绝对路径\bbs.mdb,下文有详细介绍

End Sub

sub Application_OnEnd

set application("conn")=nothing

End Sub

Sub Session_OnStart

End Sub

Sub Session_OnEnd

if session.contents("pass") then '判断是否为登录用户的Session_OnEnd

application("con").open ="driver={Microsoft Access Driver (*.mdb)};dbq="&application("db")

application.lock

application("online")=application("online")-1

application("con").Execute ("update friends set online=0 where id="&session.contents("id"))

application.unlock

application("con").close

end if

End Sub

  </script>

==============

  至此,完整的代码已经完成了.因为在Application和Session的OnEnd事件里不能使用Server对象,所以要将数据库的连接及数据库在服务器上的物理地址(d:\inetpub\wwwroot\bbs.mdb)存储在application变量中,并在Application_OnStart事件中预先处理.同理,在Session_OnEnd事件中不能用session("pass")来代替session.contents("pass")(以下有详尽说明).

  四、本文实例中值得引起注意的两点

⒈OnEnd事件里的session.contents

  刚开始接触global.asa的朋友经常会将上面Session_OnEnd事件里的

if session.contents("pass") then 写成

if session("pass") then,

  这样的话系统不会提示错误,但是永远也不会执行then后面的内容,这是因为在OnEnd事件里禁止使用Session对象,但是可以用Session对象的集合来调用session变量.因为IIS并没提示任何错误信息,所以笔者曾经在这上面浪费了很多时间.在此希望大家引以为鉴!

⒉Application_OnStart事件里用Server.MapPath获取数据库的物理地址时应使用绝对地址为了说明这个问题,大家可以做个实验:将上面Application_OnStart事件里的

application("db")=Server.MapPath("\bbs.mdb")改为:

application("db")=Server.MapPath("bbs.mdb")

然后在d:\inetpub\wwwroot\目录下建立一个test子目录,写一个temp.ASP在test目录里.

====test.ASP====

  <%response.write application("db")%>

================

再将temp.ASP拷贝一份放在根目录下(d:\inetpub\wwwroot\).用记事本打开global.asa,再打开两个浏览器,浏览器A输入地址http://localhost/temp.ASP,按回车,将在浏览器上输出:

d:\inetpub\wwwroot\bbs.mdb

然后,在记事本的窗口上点"文件"菜单,选"保存"(使global.asa的修改时间改变,从而使IIS重启动所有服务),再在浏览器B输入地址http://localhost/test/temp.ASP,按回车,在浏览器上输出的是:

d:\inetpub\wwwroot\test\bbs.mdb

global.asa文件虽然是放在站点根目录下,但是如果在server.mappath中使用的是相对地址,而触发Application_OnStart事件的用户第一次访问的页面又不是属于根目录的话,得到数据库的物理地址将不会是期望的结果,希望大家要特别小心.

全面解析ASP Server对象

Server对象提供对服务器上访问的方法和属性.大多数方法和属性是作为实用程序的功能提供的.

  语法:

Server.property|method

  属性(property)

Server对象只有一个属性:ScriptTimeout 程序能够运行的最大时间

  方法(Methods)

CreateObject 建立一个对象实例.

Execute 执行一个ASP文件

GetLastError 返回一个错误代码

HTMLEncode 对指定的HTML代码进行转换.

MapPath 将一个相对路径转化为一个绝对路径.

Transfer 将当前的所有状态信息发送给另一个ASP文件

URLEncode 以URL形式转化指定的代码,包括空格

Server对象的方法详细说明

CreateObject

   语法

Server.CreateObject( progID )

   参数

progID

    指定要创建的组件名称,格式如下: [Vendor.]Component[.Version].

   要点:

    一般来说,用由Server.CreateObject方法创建的对象拥有页面的范围.这就说,当这页的ASP程序执行完后,这种对象会自动地消失.

  为了创建一个拥有Session或Application范围的对象,你可以在Global.asa文件中使用

Execute

Execute 方法呼叫一个ASP文件并且执行它就像这个呼叫的ASP文件存在这个ASP文件中一样.这很像许多语言中的类的调用.

  语法

Server.Execute( Path )

  参数

Path

  指定执行的那个ASP文件的路径.如是它是一个绝对路径,那么它必须是一个在这个ASP应用程序相同的地方(目录).

  讲解

Server.Execute 方法提供了一种将一个复杂ASP应用程序分化为小块单位来执行的方法.通过这种方法,你能够建一个ASP图书馆,你能够随便在你需要时调用你图书馆中的ASP文件.这个就有点像SSI了!嘿嘿!

  当IIS根据指定的ASP文件路径执行完这个ASP文件之后,就会自动返回以前的ASP文件.这个刚刚执行完的ASP文件有可能改变了HTTP head.但是和其它的ASP文件一样,当程序试图改变http head时,就会报错!

  这个path参数可以包括一个询问信息.

  如果在被呼叫和呼叫的ASP文件中都含有相同的子函数,那么这些子函数只在本ASP文件中起作用.举个例子,如果在下面的ASP1和ASP2两个文件中都含有放弃程序的子函数.首先ASP1呼叫ASP2,那么ASP2中的的OnTransactionAbort开始执行,当ASP2执行完毕,ASP1中的OnTransactionAbort才开始执行.

ASP1:

< %@ Transaction=

Required

%>

< %

Server.Execute ("Page22.ASP")

Sub OnTransactionAbort

Sub OnTransactionCommit

%>

ASP2.ASP:

< %@

Transaction=Required

Sub OnTransactionAbort

Sub OnTransactionCommit

%>

Example

ASP1

< % Response.Write("I am going to execute ASP2 ")

Server.Execute("/myASPs/ASP2.ASP")

%>

ASP2

< % Response.Write("Here I am")%>

GetLastError

GetLastError 方法返回一个ASPError Object 来描述一个错误信息.这个方法只适用于在ASP文件发送任何内容给用户机之前.

  语法

Server.GetLastError ()

  要点

  如果一个500;100 用户错误已经被定义在一个ASP应用程序中,它是指的一个以.ASP为后缀的文件.这种情况下,在这个程序运行时当一个错误发生时,服务器就会自动的以Server.Transfer这种方式传送到这个正在执行的ASP页面.ASP应用程序就会将有效的处理这个错误.另外,这个ASPError Object一定要有效,这样你就能够看到服务器提供给你的错误信息来改这个文件了!

  一般的Web Site 都是根据文件\iishelp\common\500-100.ASP来构造的.你能够用它来执行一个ASP错误,当然你能够自己定义了!.如果你想改变为另外一个ASP文件的来执行这些用户错误.那么你可以用IIS中的snap-in.

  注意:当IIS发现了一个ASP文件或者global.asa文件中的一个错误,那么一个500;100用户错误产生.以下的程序将不能执行!

Example

  下面的三个例子证明不同的错误会产生的用户错误.三个错误是:

  编译错误

  运行错误

  逻辑错误

  第一个例子证明了一个编译错误,就是当IIS试图包含一个文件时产生的.这个错误会产生是因为在这个包含文件中没有定义所需的参数.第二个例子显示的是一个运行错误,这个程序中断的原因是程序中没有“next".第三个例子显示的是一个逻辑错误,因为这个程序试图除以一个0. 不行啦! 

Example 1

< %

response.write "hello"

%>

Example 2

< %

dim I

for i=1 to 1

nxt

%>

Example 3

< %

dim i,j

dim sum

sum=0

j=0

for i=1 to 10

sum=sum+1

next

sum=sum/j

%>

HTMLEncode

HTMLEncode方法对指定的字符串进行HTML编码.

  语法

Server.HTMLEncode( string )

  参数

string 要进行编码的字符

  例子

下面的程序:

  < %= Server.HTMLEncode("The paragraph tag: ") %>

  输出为:

The paragraph tag:

  注意 程序执行后在浏览器中看到的是:

The paragraph tag:

  但是如果你用"查看源文件"看一下的话,源代码就不是了.

MapPath

MapPath 方法将相对路径转化为服务器上的物理路径

  语法

Server.MapPath( Path )

  参数

Path

  相对路径.这个路径是以"/"或"\"开头的路径,如果这个路径中没有"\",那么MapPath方法就会返回以当前目录为基础的路径.

  讲解

MapPath 方法不能检查路径在这个服务器下是否存在.因为 MapPath 转化路径时是不管这个路径是否在这个服务器下存在的.

  你能够用它来将一个相对路径转化为一个物理路径,然后再在这个路径下进行各种操作.

Example

  在下面的例子中,data.txt文件存在 C:\Inetpub\Wwwroot\Script 目录中,而且一个test.ASP 文件包括下面的代码.C:\Inetpub\Wwwroot 是该服务器的主目录 .

  下面的例子中,首先用环境变量"PATH_INFO"获得当前文件的物理路径.

  下面是Script 代码:

  < %= server.mappath(Request.ServerVariables("PATH_INFO"))%>

  显示为:

c:\inetpub\wwwroot\script\test.ASP

  因为下面的例子中路径参数没有以"/"开头,所以它是以当前目录转化的,ASP文件是放在C:\Inetpub\Wwwroot\Script中的.以下是 scripts的内容:

  < %= server.mappath("data.txt")%>

  < %= server.mappath("script/data.txt")%>

  显示为:

c:\inetpub\wwwroot\script\data.txt

c:\inetpub\wwwroot\script\script\data.txt

  以下的两个例子是以"/"开头的.以下是scripts的内容:

  < %= server.mappath("\script")%>

  显示为:

c:\inetpub\wwwroot\script\data.txt

c:\inetpub\wwwroot\script

  直接用"/"或"\"就会得到服务器的主目录:

  < %= server.mappath("\")%>

  显示为:

c:\inetpub\wwwroot

c:\inetpub\wwwroot

Transfer

transfer 方法会把一个正在执行的ASP文件的所有信息传给另外一人ASP文件.

  语法

Server.Transfer (path)

  参数

Path

  将要接收信息的ASP文件的位置.

  要点

  当你调用Server.Transfer时,所有内建对象的状态信息都会包含在这次传送之中.这就是说,所有在保存在Session或Application中的信息都会被传送,而且,所有当前请求的信息都会被接收信息的ASP文件所接受.

Example

  下面的例子示范了从一个ASP文件传送到另一个ASP文件例子!

ASP1

< % Dim sessvar1 Response.Write Session.SessionID

Response.Write ("")

Response.Write("I am going to ASP2 ")

Server.

Transfer

("/MyASPs/ASP2.ASP")

% >

ASP2

< % Response.Write Session.SessionID %>

URLEncode

URLEncode 方法可以将指定字符串进行URL编码.

  语法

Server.URLEncode( string )

  参数

string 指定要转化的字符串

Example

  下面是代码:

  < % Respones.Write(Server.URLEncode("http://www.microsoft.com")) % >

  显示为:

http%3A%2F%2Fwww%2Emicrosoft%2Ecom

  属性:ScriptTimeout

ScriptTimeout 属性规定了程序的最大运行时间.

  语法

Server.ScriptTimeout = NumSeconds

  参数

NumSeconds

  规定了程序的最大的运行时间(以秒计算).缺省值是90秒

Remarks

  一个缺省的Scritpt Timeout的值会能过ASPScriptTimeOUT属性来设置在Web sertvic 或 Web server上.在程序中,ScriptTimeout属性的值不能小于这个缺省值.举个例子吧,如果NumSeconds我们设置为10秒,而缺省值为90秒,那么程序就会中止在90秒以后,而不是10秒以后的.同样,如果我们设置ScriptTimeout的值为100秒,那么,程序就会在100秒之后中止,而不是90秒.

Example

  下面的例了中程序将被设置为100秒后自动中止.

  < % Server.ScriptTimeout = 100 %>

  下面的例子中将重新得到ScriptTimeout的值,然后把它存在Timout变量中

< % TimeOut = Server.ScriptTimeout %>

二、用ASP进行动态网页设计

2.1利用ASP进行动态数据查询.

涉及网站制作的成本,在制作网站使用的数据库我采用office的Acces.

这里我们先了解以下数据库的概念:

数据库,顾名思义,是存入数据的仓库.只不过这个仓库是在计算机存储设备上的,而且数据是按一定格式存放的.

当人们收集了大量的数据后,应该把它们保存起来进入近一步的处理,进一步的抽取有用的信息.当年人们把数据存放在文件柜中,可现在随着社会的发展,数据量急剧增长,现在人们就借助计算机和数据库技术科学的保存大量的数据,以便能更好的利用这些数据资源.

要是下定义的话,就应该是:指长期储存在计算机内的、有组织的、可共享的数据集合.

数据库包含关系数据库、面向对象数据库及新兴的XML数据库等多种,目前应用最广泛的是关系数据库,若在关系数据库基础上提供部分面向对象数据库功能的对象关系数据库.在数据库技术的早期还曾经流行过层次数据库与网状数据库,但这两类数据库目前已经极少使用.

2.2 ASP访问数据库概述及工作原理.

2.2.1ASP访问数据库概述 

访问Web数据库的技术有以下几种:公共网关接口CGI(Common Gateway Interface)、Internet Server应用程序编程接口ISAPI(Internet Server Application Programming Interface)、Java/JDBC、Plug_in(插件)和ASP技术.这些技术都是为了克服HTML静态页面发展起来的,在网页制作中应用以上技术可以随心所欲地开发出动态页面,利用它们更是可以开发出高性能的数据库系统.

CGI是较早开发的技术,但是开发成本高、编程复杂、服务器性能差、功能有限且不具备事务(Transaction)功能.ISAPI改进了CGI的缺点,利用DLL技术,但编程更加复杂.JDBC和Plug_in技术功能较完备,但适用性较差.ASP技术是微软公司推出的最新的Web应用程序开发技术,在访问数据库方面更加方便、简单,目前ASP已成为开发动态网站和Web数据库的主要技术之一.

ASP是一个基于Web服务器的脚本开发环境,在ASP平台上可开发和运行动态的、交互的、高性能的Web服务器应用程序.

2.2.2ASP访问数据库的工作原理 

ASP程序在Web服务器端工作,当前端用户请求一个ASP主页时,Web服务器响应HTTP请求并调用ASP引擎执行该文件并解释执行其中的任何脚本(VBScript或JavaScript),若脚本中有访问数据库请求,立刻通过ODBC或OLE DB与相应的后台数据库相连,由数据库访问组件ADO(ActiveX Data Objects)完成操作,最后,ASP根据访问数据库的结果集生成HTML语言的主页返回给前端用户(工作原理见下图).用户看到的只是HTML网页,看不到ASP的程序代码,增强了保密性.

2.3 ASP连接数据库的方法.

前文已经概述,我们使用的数据库为Acces,这里已ASP链接Acces数据库为例:

有两种方式,个人推荐使用第一种方式.  

1、

<%

dim conn,mdbfile

mdbfile=server.mappath("数据库名称.mdb")

set conn=server.createobject("adodb.connection")

conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile

'//若数据库无用户和密码请把“uid=admin;pwd="数据库密码”去掉

%>

2、

<%

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

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("xxx.mdb")

%>

2.4 ASP访问数据库.

检索记录

一个成功的数据库应用程序都使用 Connection 对象建立链接并使用 Recordset 对象处理返回的数据.通过“协调”两个对象的特定功能,您可以开发出几乎可以执行任何数据处理任务的数据库应用程序.例如,下面的服务器端脚本使用 Recordset 对象执行 SQL SELECT 命令.SELECT 命令检索一组基于查询限制的信息.查询也包含 SQL WHERE 子句,用来缩小查询的范围.此例中,WHERE 子句将查询限制为所有的 Customers 数据库表中包含的姓 Smith 的记录.

注意,在前面的例子中,用来建立数据库连接的 Connection 对象和 Recordset 对象使用该连接从数据库中检索结果.当您需要精确地设置和数据库建立链接所采用的方式时,这个方法是非常有用的.例如,如果您需要在连接尝试失败之前指定等待的时间,则需要使用 Connection 对象去设置属性.但是,如果您仅仅想使用 ADO 默认的连接属性建立连接,则应该使用 Recordset 对象的 Open 方法去建立链接:

当使用 Recordset 对象的 Open 方法建立一个连接时,必须使用 Connection 对象去保证链接的安全.

用 Command 对象改善查询

通过 ADO Command 对象,可以象用 Connection 对象和 Recordset 对象那样执行查询,唯一的不同在于用 Command 对象您可以在数据库源上准备、编译您的查询并且反复使用一组不同的值来发出查询.这种方式的编译查询的优点是您可以最大程度地减少向现有查询重复发出修改的请求所需的时间.另外,您还可以在执行之前通过您的查询的可变部分的选项使 SQL 查询保持局部未定义.

三、网页的界面设计.

3.1网页界面构成要素.

界面构成要素与传统媒体不同,网页除了文字和图像以外,还包含声音、视频和动画等新兴多媒体元素,更借助由代码语言编程所实现的各种交互式效果,增加了网页界面的生动性和复杂性,也使得网页设计者需要考虑更多页面元素的排布、优化.

文字元素是信息传达的主体部分,从网页最初的纯文字界面发展至今,文字仍是其他任何元素无法取代的重要构成.这首先是文字信息符合人类的阅读习惯,其次因为文字所占存取空间小,节省了下载和浏览时间.网页中的文字主要包括标题、信息、文字链接、几种主要形式.标题和传统媒体中信息传达的基本作用相同,是内容的简概说明一般比较醒目、优先编排.文字作为占据页面重要比率的元素,同时又是信息重要载体,它的字体、大小、颜色和排布对页面整体设计影响极大,应精心处理.

图形在网页界面中具有重要作用.图形的出现,打破了网页初期单纯的文字界面,也带来了新的直观表现形式.很多网页中,图形占据了重要页面,有的甚至是全部页面.图形往往能引起人们的注意,并激发阅读兴趣,图形给人的视觉印象要优于文字,合理的运用图形.可以生动直观、形象地表现设计主题.网页中常用的图形格式包括jpg和gif,这两种格式压缩比高,得到了规范浏览器的支持,下载速度快,具有跨平台的特性,不需要浏览器安装插件即可直接阅览.图形元素包括标题、背景、主图、链接图标四种.以图像作为标题和链接可以使网页具有更好的视觉效果,配合文字增强生动和形象性.需要特别注意的是背景和主图的作用.以图形为背景能衬托主题的表现,增加网页的层次感,使网页不再但点枯燥,融入设计者的风格.主图与背景和装饰性小土不同,背景是衬托主题,主图则是突出表现主题.主图是整个网页的视觉中心,它具有直观性强的特点,可以为单调的文字信息增强活力,不需要象文字那样去逐句阅读,可以不受文化水平的限制,能给人强烈的视觉信息.

页面版式也称页面的构图,版式是网页界面设计的重要组成部分,它将文字、图形等视觉元素进行组合配置,使页面整体视觉效果美观和谐,便于阅读,实现信息传达的最佳效果.以下是几个成功的版式的例子:[图例3]页面层次感强,简洁流畅.看似随意的大处留白正是版式布局的精妙之处.[图例4]借助图片对页面的黄金分割,在淡雅的色调上成功排布了文字信息,整个页面清新素雅,平衡和谐.

网页构成中的多媒体元素主要包括音频、视频和动画.这些是界面构成中最吸引人的元素,但是我个人始终认为网页应该“内容为王”,任何技术的应用应该以信息的更好传达为中心,不能唯视觉化.

网页的技术要素并非任何情况下在网页中都能直观体现,但是却代表了设计的整体水平,也是衡量设计成功的重要标准.网页界面设计最基本的技术要求包括:

  浏览器,应该保证成功的设计作品在不同的主流浏览器下所显现的页面与原设计作品一致(主要考虑IE与Netscape).具体技术细节后面会有详细说明...

  传输速度,界面设计的视觉成功,不能以牺牲网页下载显示速度为代价,图形是网页界面中最常见的易造成传输速度缓慢的因素,下面是一些网页图形处理的常用原则(技术细节参见图像优化章节):保证所需清晰度的条件下,尽量压缩图形文件大小/采用图片分割,切割成若干小图多线程下载/采用尽量少的界面颜色/优化版式、表格排布,使主要页面框架内容先行载入/减少客户端程序如javascript等的应用.

  屏幕分辨率,专业设计人员的标准显示器应工作在1024*768模式下,但是必须考虑验证其他较低分辨率下的兼容显示效果.

  颜色显示,通常显示设备的显示颜色模式主要是256色、32378色(32K)、65536色(64K,16位增强色)、或1677万色(24位真彩色).16色可以满足绝大多数网络图形的颜色要求,如果需要更高精度的图像文件,应该在文件大小和显示质量之间选择平衡.

网页界面设计需要设计师综合多方面的知识.他与网络艺术、经济学、心理学及美学等领域都有着密切的联系,界面设计的中心是“信息传达”这一主题

这里我们还是以事例来说明,下面的图片为一家制作电器的企业网站.

3.2网页的整体造型.

什么是造型,造型就是创造出来的物体形象.这里是指页面的整体形象,这种形象应该是一个整体,图形与文本的接合应该是层叠有序.虽然,显示器和浏览器都是矩形,但对于页面的造型,你可以充分运用自然界中的其它形状以及它们的组合:矩形,圆形,三角形,菱形等.

  对于不同的形状,它们所代表的意义是不同的.比如矩形代表着正式,规则,你注意到很多ICP和政府网页都是以矩形为整体造型;圆形带表着柔和,团结,温暖,安全等,许多时尚站点喜欢以圆形为页面整体造型;三角形代表着力量,权威,牢固,侵略等,许多大型的商业站点为显示它的权威性常以三角形为页面整体造型;菱形代表着平衡,协调,公平,一些交友站点常运用菱形作为页面整体造型.虽然不同形状带表着不同意义,但目前的网页制作多数是接合多个图形加以设计,在这其中某种图形的构图比例可能占的多一些.

这里我们还是以事例来说明,下面的图片为一家制作电器的企业网站.

3.3网页的色彩搭配.

网页的色彩是树立网站形象的关键之一,色彩搭配却是网友们感到头疼的问题.网页的背景,文字,图标,边框,超链接...,应该采用什么样的色彩,应该搭配什么色彩才能最好的表达出预想的内涵呢?阿捷这里谈一些心得,希望对你有所启发. 首先我们先来了解一些色彩的基本知识:

1.颜色是因为光的折射而产生的.

2.红,黄,蓝是三原色,其它的色彩都可以用这三种色彩调和而成.网页html语言中的色彩表达即是用这三种颜色的数值表示例如:红色是color (255,0,0)十六进制的表示方法为(FF0000)白色为(FFFFFF), 我们经常看到的"bgColor=#FFFFFF"就是指背景色为白色.

3.颜色分非彩色和彩色两类.非彩色是指黑,白,灰系统色.彩色是指除了非彩色以外的所有色彩.

4.任何色彩都有饱和度和透明度的属性,属性的变化产生不同的色相,所以至少可以制作几百万种色彩.

  网页制作用彩色还是非彩色好呢?根据专业的研究机构研究表明:彩色的记忆效果是黑白的3.5倍.也就是说,在一般情况下,彩色页面较完全黑白页面更加吸引人.

  我们通常的做法是:主要内容文字用非彩色(黑色),边框,背景,图片用彩色.这样页面整体不单调,看主要内容也不会眼花.

非彩色的搭配

  黑白是最基本和最简单的搭配,白字黑底,黑底白字都非常清晰明了. 灰色是万能色,可以和任何彩色搭配,也可以帮助两种对立的色彩和谐过渡.如果你实在找不出合适的色彩,那么用灰色试试,效果绝对不会太差.

  彩色的搭配

  色彩千变万化,彩色的搭配是我们研究的重点.我们依然需要进一步学习一些色彩的知识.

一.色环.我们将色彩按"红->黄->绿->蓝->红"依次过度渐变,就可以得到一个色彩环.色环的两端是暖色和寒色,当中是中型色. 红.橙.橙黄.黄.黄绿.绿.青绿.蓝绿.蓝.蓝紫.紫.紫红.红 . 暖色系. 中性系. 寒色系. 中性系

  二.色彩的心理感觉.不同的颜色会给浏览者不同的心理感受. 红色---是一种激奋的色彩.刺激效果,能使人产生冲动,愤怒,热情,活力的感觉. 绿色---介于冷暖两中色彩的中间,显得和睦,宁静,健康,安全的感觉. 它和金黄,淡白搭配,可以产生优雅,舒适的气氛. 橙色---也是一种激奋的色彩,具有轻快,欢欣,热烈,温馨,时尚的效果. 黄色---具有快乐,希望,智慧和轻快的个性,它的明度最高. 蓝色---是最具凉爽,清新,专业的色彩.它和白色混合,能体现柔顺,淡雅,浪漫的气氛(象天空的色彩:) 白色---具有洁白,明快,纯真,清洁的感受. 黑色---具有深沉,神秘,寂静,悲哀,压抑的感受. 灰色---具有中庸,平凡,温和,谦让,中立和高雅的感觉.

  每种色彩在饱和度,透明度上略微变化就会产生不同的感觉.以绿色为例,黄绿色有青春,旺盛的视觉意境,而蓝绿色则显得幽宁,阴深.

网页色彩搭配的原理

1.色彩的鲜明性.网页的色彩要鲜艳,容易引人注目.

2.色彩的独特性.要有与众不同的色彩,使得大家对你的印象强烈.(参考设计思考第二篇网站CI的标准色彩一节)

3.色彩的合适性.就是说色彩和你表达的内容气氛相适合.如用粉色体现女性站点的柔性.

4.色彩的联想性.不同色彩会产生不同的联想,蓝色想到天空,黑色想到黑夜,红色想到喜事等,选择色彩要和你网页的内涵相关联.

  网页色彩掌握的过程

  随着网页制作经验的积累,我们用色有这样的一个趋势:单色->五彩缤纷->标准色->单色.一开始因为技术和知识缺乏,只能制作出简单的网页,色彩单一;在有一定基础和材料后,希望制作一个漂亮的网页,将自己收集的最好的图片,最满意色彩堆砌在页面上;但是时间一长,却发现色彩杂乱,没有个性和风格;第三次重新定位自己的网站,选择好切合自己的色彩,推出的站点往往比较成功;当最后设计理念和技术达到顶峰时,则又返朴归真,用单一色彩甚至非彩色就可以设计出简洁精美的站点.

  网页色彩搭配的技巧

1.用一种色彩.这里是指先选定一种色彩,然后调整透明度或者饱和度,(说得通俗些就是将 色彩变淡或则加深),产生新的色彩,用于网页.这样的页面看起来色彩统一,有层次感.

2.用两种色彩.先选定一种色彩,然后选择它的对比色(在photoshop里按ctrl+shift+I).我的主页用蓝色和黄色就是这样确定的.整个页面色彩丰富但不花稍.

3.用一个色系.简单的说就是用一个感觉的色彩,例如淡蓝,淡黄,淡绿;或者土黄,土灰,土蓝.确定色彩的方法各人不同,我是在photoshop里按前景色方框,在跳出的拾色器窗中选择"自定义",然后在"色库"中选就可以了:)

4.用黑色和一种彩色.比如大红的字体配黑色的边框感觉很"跳". 在网页配色中,忌讳的是:不要将所有颜色都用到,尽量控制在三种色彩以内.

还记得张老师跟我说过,做网站尽量选择三种色彩之内,再在这三种颜色里面换对比率来挑战网页的颜色.我一直遵守这三种颜色的规律.

在这里还是多用事例来证明颜色搭配的方案. 

四、在建设中遇到的问题和解决方法.

4.1媒体对象需要激活——虚线环绕.

2006年2月,微软针对IE浏览器发布了一项非安全性更新,禁止了IE浏览的ActiveX控件自动激活功能.

补丁为KB912945

2006年4月,微软发布KB912812,是针对的IE浏览器的安全性更新.功能大体就是禁止ActiveX控件自动激活.

补丁为KB912812

不过由于很多软件都来不及更新ActiveX控件的处理方式,禁止ActiveX控件自动激活将使目前很多软件无法正常使用.具体的效果就是当IE中要显示ActiveX部分的时候,会被一个灰色边框围住,鼠标指向这个ActiveX时会显示一个TIP,内容为"单击以激活并使用此控件

对FLASH最大的影响就是不美观,其次会使FLASH中的实例不能接受到鼠标事件.

我的解决方式是在网页代码head 头中添加下面代码,连接这个 ObjectWrap.Js,其他就不用管了,加载网页的时候会自动对页面中的 object 进行重写,激活问题就解决了,不单只是解决flash 像一些流媒体都能解决.
"<script type="text/javascript" src="objectSwap.js"></script>"

ObjectSwap 代码如下:

/* ObjectSwap - Bypasses the new ActiveX Activation requirement in Internet Explorer by swapping existing ActiveX objects on the page with the same objects. Can also be used for Flash version detection by adding the param:

<param name="flashVersion" value="8" /> to the object tag.

Author: Karina Steffens, www.neo-archaic.net

Created: April 2006

Changes and bug fixes: May 2006

Bug fixes: June 2006

Changes: October 2006 (Included Opera9 and excluded IE5.5)

*/

//Check if the browser is InternetExplorer, and if it supports the getElementById DOM method

var ie = (document.defaultCharset && document.getElementById && !window.home);

var opera9 = false;

if (ie){

//Check for ie 5.5 and exclude it from the script

var ver=navigator.appVersion.split("MSIE")

ver=parseFloat(ver[1])

ie = (ver >=6)

}else if (navigator.userAgent.indexOf("Opera")!=-1) {

//Check for Opera9 and include it in the ObjectSwap

var versionindex=navigator.userAgent.indexOf("Opera")+6

if (parseInt(navigator.userAgent.charAt(versionindex))>=9)

opera9 = true;

}

//Perform ObjectSwap if the browser is IE or Opera (if not just check flashVersion)

var oswap = (ie || opera9)

//Hide the object to prevent it from loading twice

if (oswap){

document.write ("<style id='hideObject'> object{display:none;} </style>");

}

/*Replace all flash objects on the page with the same flash object,

by rewriting the outerHTML values

This bypasses the new IE ActiveX object activation issue*/

objectSwap = function(){

if (!document.getElementsByTagName){

return;

}

//An array of ids for flash detection

var stripQueue = [];

//Get a list of all ActiveX objects

var objects = document.getElementsByTagName('object');

for (var i=0; i<objects.length; i++){

var o = objects[i];

var h = o.outerHTML;

//The outer html omits the param tags, so we must retrieve and insert these separately

var params = "";

var hasFlash = true;

for (var j = 0; j<o.childNodes.length; j++) {

var p = o.childNodes[j];

if (p.tagName == "PARAM"){

//Check for version first - applies to all browsers

//For this to work, a new param needs to be included in the object with the name "flashVersion" eg:

//<param name="flashVersion" value="7" />

if (p.name == "flashVersion"){

hasFlash = detectFlash(p.value);

if (!hasFlash){

//Add the objects id to the list (create a new id if there's isn't one already)

o.id = (o.id == "") ? ("stripFlash"+i) : o.id;

stripQueue.push(o.id);

break;

}

}

params += p.outerHTML;        

}

}

if (!hasFlash){

continue;

}

//Only target internet explorer

if (!oswap){

continue;

}

//Avoid specified objects, marked with a "noswap" classname

if (o.className.toLowerCase().indexOf ("noswap") != -1){

continue;

}

//Get the tag and attributes part of the outer html of the object

var tag = h.split(">")[0] + ">";

//Add up the various bits that comprise the object:

//The tag with the attributes, the params and it's inner html

var newObject = tag + params + o.innerHTML + " </OBJECT>";

//And rewrite the outer html of the tag

o.outerHTML = newObject;

}

//Strip flash objects

if (stripQueue.length) {

stripFlash(stripQueue)

}

//Make the objects visible again

if (oswap){

document.getElementById("hideObject").disabled = true;

}

}

detectFlash = function(version){

if(navigator.plugins && navigator.plugins.length){

//Non-IE flash detection.

var plugin = navigator.plugins["Shockwave Flash"];

if (plugin == undefined){

return false;

}

var ver = navigator.plugins["Shockwave Flash"].description.split(" ")[2];

return (Number(ver) >= Number(version))

} else if (ie && typeof (ActiveXObject) == "function"){

//IE flash detection.

try{

var flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + version);

return true;

}

catch(e){

return false;

}

}

//Catchall - skip detection

return true;

}

//Loop through an array of ids to strip

//Replace the object by a div tag containing the same innerHTML.

//To display an alternative image, message for the user or a link to the flash installation page, place it inside the object tag.  

//For the usual object/embed pairs it needs to be enclosed in comments to hide from gecko based browsers.

stripFlash = function (stripQueue){

if (!document.createElement){

return;

}

for (var i=0; i<stripQueue.length; i++){

var o = document.getElementById(stripQueue[i]);

var newHTML = o.innerHTML;

//Strip the comments

newHTML = newHTML.replace(/<!--\s/g, "");

newHTML = newHTML.replace(/\s-->/g, "");

//Neutralise the embed tag

newHTML = newHTML.replace(/<embed/gi, "<span");

//Create a new div element with properties from the object

var d = document.createElement("div");

d.innerHTML = newHTML;

d.className = o.className;

d.id = o.id;

//And swap the object with the new div

o.parentNode.replaceChild(d, o);

}

}

//Initiate the function without conflicting with the window.onload event of any preceding scripts

var tempFunc = window.onload;

window.onload = function(){

if (typeof (tempFunc) == "function"){

try{

tempFunc();

} catch(e){}

}

objectSwap();

}

4.2动态网站不亲和搜索引擎——搜索引擎不收录动态页面.

在动态网站制作后随机出现了个致命的问题,企业客户在寻求我们帮助制作网站后,数月过后网络搜索引擎上没有收录我制作网站的任何信息.

查找网站是否收录网站页面方法:

这里以Google搜索引擎为例,打开Google首页:http://www.Google.com

在搜索栏里输入site:http://www.fotita.cn

结果下图可见:

Google没有收录我做做的网站任何一页,而根据Google百度的收录注释而言,一般在新站成立后的一个星期至一个月的时间,网站就会被搜索引擎而收录,收录的页面多少来自于页面链接的结构内容,但是我做的页面一个也没有收录.

针对问题,在网上寻找了许多资料加上自己的分析,主要原因来自于网页采用动态数据的模式,下面列出我搜索的资料及自己的理解:

1、网页使用框架:框架内的内容通常不在搜索引擎抓取的范围之内.

2、图片太多,文本太少.

3、提交页面转向另一网站:搜索引擎可能完全跳过这个页面.

4、提交太过频繁:一个月内提交2次以上,很多搜索引擎就受不了,认为你在提交垃圾.

5、网站关键词密度太大:不幸的是搜索引擎并没解释多高的密度是极限,一般认为100个字的描述中含有3-4个关键词为最佳.

6、文本颜色跟背景色彩一样:搜索引擎认为你在堆砌关键词欺骗它.

7、动态网页:网站的内容管理系统方便了网页更新,却给大部分搜索引擎带来麻烦,很多搜索引擎不收取动态页面,或只收取第一层页面,不会向下深入收取.

8、网站转移服务器:搜索引擎通常只认IP地址,转换主机或域名时,IP/DNS地址发生改变,这时你要重新提交网站.

9、免费的网站空间:有的搜索引擎拒绝索引来自免费空间的网站,抱怨很多垃圾,质量差.

10、搜索引擎抓取时网站不在线:如果主机不稳定,就有可能出现这种情况.更糟糕的是,即使网站已经收录,重新抓取时发现不在线,还会将网站整个删除.

11、错误地阻挡了robots索引网站:有两种方法可能阻挡robots:主机服务器的根目录下有简单文本文件;网页中含某种META标签.

12、大量运用Flash、DHTML、cookies、javascript、Java制作或密码进入的网页,搜索引擎很难从这种页面中提取内容.

13、搜索引擎不能解析你的DNS:新域名注册后需要1-2天的时间才能生效,因此不要一注册了域名马上提交网站.

14、网站的链接广泛度太低:链接广泛度太低,搜索引擎难以找到你,这时要考虑把网站登录到知名分类目录,或多做几个友情链接.

15、服务器速度太慢:网络带宽小,网页下载速度太慢,或者网页太复杂,都可能导致搜索引擎还没搜到文本内容就暂停.

16、关键字问题:如果正文没有出现你的META标签中提到的关键字,搜索引擎可能以为是垃圾关键字.

4.2.1网站优化技术——SEO技术. 

网站优化也叫SEO, 是一种利用长期总结出的搜索引擎收录和排名规则,对网站进行程序、内容、版块、布局等的调整,使网站更容易被搜索引擎收录,在搜索引擎中相关关键词的排名中占据有利的位置.在国外,SEO已经是比较成熟的行业,而在国内还尚处于起步和发展阶段.

为了了解网站怎么样才能被搜索引擎收录,我们必须的先了解搜索引擎的工作原理:

为了收集数据,搜索引擎让爬行器跟踪链接漫游、组织数据并判断每个页面上的文本与什么内容相关.当搜索者进行搜索时,搜索引擎利用爬行器收集的信息,通过专用排名算法建立与这次查询最相关的站点列表,并显示在 SERP 中.

     因为搜索引擎以Google为搜索引擎方面的领航机构,在这里网站优化我们主要针对的就是Google搜索引擎,这里以Google搜索引擎为例子.

     从长远角度来看,在 SEO 方面的努力最好投入在优化站点以促进 Google 和其他爬行器的深度漫游上.

Google 的排名算法是一项顶级机密.关于 Google 的已知情况如下:

Google 的主要结果来自在 Web 上漫游的爬行器.

Google 的爬行器只查看页面上的可见文本.

Google 为以下类型的文件编制索引:html、pdf、ps、wk1、wk2、wk3、wk4、wk5、wki、wks、wku、lwp、mw、xls、ppt、doc、wks、wps、wdb、wri、rtf、swf、ans 和 txt.

Google 索引的创建过程主要关注页面内容和链接流行度.决定页面在 Google 列表中的排名的部分因素包括:指向这个站点的链接数量、链接到这个站点的站点的质量、指向这个站点的链接中和链接周围的文本以及页面本身链接到的内容.

Google 公布,其结果由超过 100 种因素决定.

Google 使用 PageRank 检查 Web 站点的链接结构,从而判断哪些页面是最重要的.

Google 还会进行它所说的超文本匹配分析(hypertext-matching analysis) 来判断哪些页面与特定的搜索查询相关.

基本上,Google 使用 PageRank 来评估入站链接(链接到您的站点的站点)和出站链接(您的站点链接到的站点)的质量,它会给出一个值来表示这些链接的数量和质量(流行度).Google 认为的高质量站点会获得更高的 PageRank.然后,Google 综合使用 PageRank 排名和超文本匹配分析来寻找与搜索相关的页面.

经过整理网络上的一些素材及资料,我总结出以下几点

1)、标题的设置
2)、META标签的设置
3)、页面当中的图片及动画的处理.
4)、导航栏的优化
5)、网站目录的优化.
6)、页面当中关键词的处理.
7)、网站结构及内部链接的优化.
8)、网站地图的制作和用处.
9)、关于Google PR值:

4.2.2 PageRank.

既然我们选择针对google搜索引擎来进行网站优化,那么我们有必要来熟悉一下google推出的PR值概念:

在GOOGLE开始推出PR这个概念后,人们对网页的评价有了新的标准.

       PageRank 是基于「从许多优质的网页链接过来的网页,必定还是优质网页」的回归关系,来判定所有网页的重要性.

在以下冗长的说明中,许多部分大量地使用了专业用语,会造成理解上的困难.这一章虽然准备集中于定性而简单的解说,但是,即使如此也会有怎么也不明白的时候,此时只要能够理解「从许多优质的网页链接过来的网页,必定还是优质网页」这一思考方法也就非常得可贵了.因为在所有几个要点中,这个是最重要的思考方法.

来自于 Google 自己对PR的介绍是这样解说的.

关于PageRank

     PageRank,有效地利用了 Web 所拥有的庞大链接构造的特性. 从网页A导向网页B的链接被看作是对页面A对页面B的支持投票,Google根据这个投票数来判断页面的重要性.可是 Google 不单单只看投票数(即链接数),对投票的页面也进行分析.「重要性」高的页面所投的票的评价会更高,因为接受这个投票页面会被理解为「重要的物品」.

     根据这样的分析,得到了高评价的重要页面会被给予较高的 Page Rank(网页等级),在检索结果内的名次也会提高.PageRank 是 Google 中表示网页重要性的综合性指标,而且不会受到各种检索(引擎)的影响.倒不如说,PageRank 就是基于对"使用复杂的算法而得到的链接构造"的分析,从而得出的各网页本身的特性.

     当然,重要性高的页面如果和检索词句没有关联同样也没有任何意义.为此 Google 使用了精练后的文本匹配技术,使得能够检索出重要而且正确的页面. 

通过下面的图我们来具体地看一下刚才所阐述的算法.具体的算法是,将某个页面的 PageRank 除以存在于这个页面的正向链接,由此得到的值分别和正向链接所指向的页面的 PageRank 相加,即得到了被链接的页面的 PageRank.

让我们详细地看一下.提高 PageRank 的要点,大致有3个.

反向链接数 (单纯意义上的受欢迎度指标)

反向链接是否来自推荐度高的页面 (有根据的受欢迎指标)

反向链接源页面的链接数 (被选中的几率指标)

首先最基本的是,被许多页面链接会使得推荐度提高.也就是说「(被许多页面链接的)受欢迎的页面,必定是优质的页面」.所以以反向链接数作为受欢迎度的一个指标是很自然的想法.这是因为,“链接”是一种被看作「可以看看这个页面/这个页会有用」的推荐行为.但是,值得骄傲的是 PageRank 的思考方法并没有停留在这个地方.

也就是说,不仅仅是通过反向链接数的多少,还给推荐度较高页面的反向链接以较高的评价.同时,对 来自总链接数少页面的链接给予较高的评价,而来自总链接数多的页面的链接给予较低的评价. 换句话说「(汇集着许多推荐的)好的页面所推荐的页面,必定也是同样好的页面」和「与感觉在被胡乱链接的链接相比,被少数挑选出的链接肯定是优质的链接」 这两种判断同时进行着.一方面,来自他人高水平网页的正规链接将会被明确重视,另一方面,来自张贴有完全没有关联性的类似于书签的网页的链接会作为「几乎 没有什么价值(虽然比起不被链接来说好一些)」而被轻视.

因此,如果从类似于 Yahoo! 那样的 PageRank 非常高的站点被链接的话,仅此网页的 PageRank 也会一下子上升;相反地,无论有多少反向链接数,如果全都是从那些没有多大意义的页面链接过来的话,PageRank 也不会轻易上升.不仅是 Yahoo!, 在某个领域中可以被称为是有权威的(或者说固定的)页面来的反向链接是非常有益的.但是,只是一个劲地在自己一些同伴之间制作的链接,比如像「单纯的内部照顾」这样的做法很难看出有什么价值.也就是说,从注目于全世界所有网页的视点来判断(你的网页)是否真正具有价值.

综合性地分析这些指标,最终形成了将评价较高的页面显示在检索结果的相对靠前处的搜索结构.

以往的做法只是单纯地使用反向链接数来评价页面的重要性,但 PageRank 所采用方式的优点是能够不受机械生成的链接的影响. 也就是说,为了提高 PageRank 需要有优质页面的反向链接. 譬如如果委托 Yahoo! 登陆自己的网站,就会使得 PageRank 骤然上升.但是为此必须致力于制作(网页的)充实的内容.这样一来,就使得基本上没有提高 PageRank 的近路(或后门).不只限于PageRank (Clever 和 HITS 等也同样),在利用链接构造的排序系统中,以前单纯的 SPAM 手法将不再通用.这是最大的一个优点,也是 Google 方便于使用的最大理由.(虽然是最大的理由,但并不是唯一的理由.)

在这里请注意,PageRank 自身是由 Google 定量,而与用户检索内容的表达式完全无关.就像后边即将阐述的一样,检索语句不会呈现在 PageRank 自己的计算式上.不管得到多少的检索语句,PageRank 也是一定的、文件固有的评分量.

PageRank 的定性说明大致就是这样一些.但是,为了实际计算排列次序、比较等级,需要更定量性的讨论

4.2.3反向链接、内部链接、外部链接.

以下是增加链接的方法,其实我个人认为就像跟你的网站做广告做宣传一样,大量的宣传必然会给你带来一定量的IP流量,链接上去了IP自然上去了,流量上去了,搜索引擎的收录机器人也自然会多家关注你.

1、将网站提交到DOMZ、yahoo、ODP等一些专业目录网站,这个已经是毋庸置疑的,没有人反对吧;再则把网站提交到各网址站,象hao123,265等,如果你的站点还不是很n,那就先找一些相对没那么有知名度的网址站,现在的网址站多如牛毛.

2、交换友情链接,你可以到个友情链接交换的论坛发布交换信息,提示:给自己网站增加自主申请友情链接功能,吸引其他网站主动与你链接.

3、与行业协会或政府机构联系.实际上这也是友情链接的一种,因为它的独特性把它作为另外一点来说,这些非营利性的机构的网站的链接权重一般都比较高,所以与这些网站交换链接是提高自己网站权重的一种很好方式.

4、找到你网站竞争对手的反向链接,并且主动与这些网站交换链接.举个具体例子,假如e览华夏旅游网的竞争对手是风情假日旅游网和票务天下.那么如 果e览华夏想超越这两个对手的话,最好的办法就是到搜索引擎找到这两个对手的所有反向链接,他们有的你必须都有,他们没有的你有,如果做到这样,那么你的 站离成功不远了.

5、经常到论坛发些高质量的帖子,并加上你的链接.请注意其中三个字“高质量”,不同的人有不同的理解,但是至少你不能发一些纯广告性的帖子,这样 很容易被勤快的版主在第一时间删除,甚至被封id.文章应选择在合适的论坛版块发,并且能为别人解决实际问题,这样别人甚至认为你就是这方面的专家,很有 必要到你的站上认真浏览.

6、在别的博客网站创建博客,在博客文章合理的加上你网站的超链接.前些天跟旅游直通车和金色世纪网的站长聊到此问题时,他们也都对此大为赞同,大家一致认为博客在推广网站中的重要性是不可估量的.

7、用搜索引擎搜索“提交网站,add url”等相关关键词,在搜索到的网页中提交你的网站,增加网站的反向链接.

8、购买反向链接,现在已经有很多站长拥有数量非常多的资源,可以向他们购买反向链接资源,但是必须注意的是价格和质量.
    
9、软文轰炸.如果你有时间,如果你有某一方面的专业知识,那么,动起手来,多写些文章,这对你网站的反向链接,对你网站的推广,绝对有很大的用处.

我们还是以事实说话.

对于搜索引擎不收录我制作的网站,我做了另外一个站点进行试验,实验站点为:http://hi.baidu.com/baiyea

制作了还没有一个月.下图有注册信息

下面这张图是google收录情况,这里同样在搜索栏里输入site:http://hi.baidu.com/baiyea

Google已经收录了这个网页14个页面,随着时间的延长加上文章的更新,我自信认为google会收录更多这个站点页面.

五、结束语

六、参考文献. 

七、致谢

     

全文完

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值