分享

asp4

 uu2233 2010-10-27
asp 心得
 对于ASP来说相信大家都并不陌生,在这里我就不浪费太多的时间来进行阐述了。
       我这里主要是记录了我在读ASP时的一些心得和我自己认为应该注意的地方,希望这些点点滴滴能够为那些初学的朋友有一定的帮助,同时也希望和已经有很深经验和对ASP有所研究的人进行讨教,还希望朋友们不吝赐教啊!呵呵!
       好了我也就不多说什么了,下来我就将我的很小的一部分 心得和大家分享:
request.form  <"表单元素名">
              request.querystring《地址栏参数名“》
                        formatdatetime  函数    功能:格式化日期或时间
abs(number)  功能: 求绝对值
                          now()   功能: 获取现在时间       注:《不需要参数的函数》
formatdatetime(date【,namedformat】)  功能:  格式化时间   注《需要一个或几个参数的函数》
sin(number)  功能:  取sin值
ucase(string)  功能:转换   例如《他可以将大小写转换》                    注《需要一个或几个参数的函数》
如果一个参数被括号括起来表示可以不写        date必须写    如果函数有多个参数各个参数要用“,”隔开
在使用常数作为参数的时候可以写成英文方式的,也可以直接写成值。
函数:是一个模块的程序代码,只要定义一次,我们就可以在其它的程序中调用即使用他们。
         通常函数会有一个或多个以上的参数,有预先定义的程序进行一连串的运算处理,最后将产生的结果以函数名称将值返回。对于原本需重复编写的程序代码,想在只要在需要用到他们的地方,利用函数的名称调用他们即可。
1.定义函数的方法:    <%
                              定义函数关键字function函数名([参数})
                              实现函数功能的语句块
                               函数名=需要返回的值(函数运行结果)
                                end function
                                   %>
注:《在函数调用之前要先定义!》
2.定义子程序的方法:       sub  子程序名([参数])
                                    实现子程序功能的语句块
                                     end  sub
由此可以看出定义函数(2)是有返回值的函数;而子程序是没有返回值的函数。
有关键字在前面的话如(call):子程序参数必须用括号括起来        而如果直接用子程序名称加参数则不需要用扩号括起来
重点:在子程序里也可以使用全局变量,子程序里的同名局部变量也会使全局变量失效。
当我们调用一个不需要返回值的函数值时,也是可以用call语句的。
函数和子程序都可以直接使用全局变量;可以在函数或子程序里面改变全局变量的值。
3.参数的传递方式:传值方式和传址方式               byval  指定参数的传递方式为传值方式。
调用函数时是将实参的值传给了形参,事实上在VBSscript语言中默认不是这样的,它是将实参的地址传递给了形参。
传址方式是将实参的格子编号给了形参,这样形参改变值的时候就会改这个格子编号中的变量值。
函数参数的传递方式默认的是传址方式。
传址方式是将实际参数的值复制一份给形参,这样在函数或子程序体内不管我们怎样改变形参,也不会影响到实参的值了。
如果我们想把一个数组作为一个参数传递的话,我们可以直接将数组名作为参数。
contenttype属性       指定http输出内容类型                 response.contenttype=内容类型
binarywrite   作用:  不经过任何转换,将指定的信息输出,它主要输出非字符信息。
语法:response.binarywrite     二进制数据
redirect方法:   它的作用是跳转网页,它和clear及flush方法一样,对buffer属性有依赖,也就是说如果要在网页中使用redirect方法的话,必须将buffer属性设置为ture      用法:response.redirect  网址
buffer属性是用来设置页面是否缓存以后在输出。对buffer属性的设置最好在ASP文件第一行。
session和cookies的最大相同点就是他们都可以用来保存用户的数据或者跟踪用户    最大的不同之处就是session存储在”服务端“而Cookies存储在”客户端“的机器里。
session要比cookies安全     因为:session是存储在服务端的而cookies是储存在客户端,想要改变客户端信息很容易,但是改变服务端信息是很难的,因此session是安全的。
当一个session变量被建立后,如果没有超时或是人为删除的话,可以在站点的其他页面里使用它。
select   字段名表     ;   [top 返回记录条数]    ;     from   数据表序列    ;[where  条件表达式]
[order  by  排序字段表[asc/desc]]            注:("[]")括号内的语句是可选择的和函数语法的括号意思一样       select * form  info   查询info表的全部记录   意思为:(选择所有字段从info表)
 
asp学习心得汇总2008年05月24日 星期六 15:46  1、注意单词的拼写,重中之重!
  
  2、使用request.form("")可获取文本框的内容
  
  3、使用response.write("")可直接显示文本,response.write 变量可显示变量的值
  
  4、使用response.Redirect("页面链接")可将页面跳转到相关链接页面
  
  5、使用dim可以定义变量,也可以不定义直接使用,但按语法还应该定义。
  
  6、使用< BR>可以换行,行间距小于使用< P>< /P>所换的行。
  
  7、response.write(server.MapPath("数据库名")),可直接显示数据库的在硬盘中的绝对路径。
  
  8、rs.open exec,conn,1,1中,1,1是只读取数据库,1,3是可修改记录
  
  9、除了ODBC方式外,数据库也可以用OLEDB方式来连接,效果更好。
  
  10、如果数据库在上一级目录,就用"/*.mdb"的写法,如果在下级目录,就用"./目录名/*.mdb"的写法
 
5、Access数据库连接代码
(1)方法一:
db="mydata.mdb" ’如果放在目录中,就要写明"database/mydata.mdb"
Set conn = Server.CreateObject("ADODB.Connection")
cServer.MapPath(db)
conn.Open connstr
(2)方法二:
’如果你的服务器采用较老版本Access驱动,请用下面连接方法
db="mydata.mdb" ’如果放在目录中,就要写明"database/mydata.mdb"
Set conn = Server.CreateObject("ADODB.Connection")
c & Server.MapPath(db)
conn.Open connstr
(3)方法三:
set conn1=server.CreateObject("adodb.connection")
conn1.open"driver={microsoft access driver (*.mdb)};dbq="&server.MapPath("数据库路径")
 
学习目的:掌握ACCESS数据库的连接和读取记录
    今天要学习的内容有一点枯燥,但是很重要。在这里大家不需要知道命令具体的运行情况,外面的很多书籍之所以不适合入门就是因为介绍了太多的理论知识,让初学者一头雾水。
    下面开门见山,看两句话:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
%>
第一句话定义了一个adodb数据库连接组件,第二句连接了数据库,大家只要修改后面的数据库名字就可以了。是不是很简单?
下面再看三句:
<%
exec="select * from guestbook"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
%>
这三句加在前面两句的后面,第一句:设置查询数据库的命令,select后面加的是字段,如果都要查询的话就用*,from后面再加上表的名字,我们前面建立的是不是一个gustbook表阿?第二句:定义一个记录集组件,所有搜索到的记录都放在这里面,第三句是打开这个记录集,exec就是前面定义的查询命令,conn就是前面定义的数据库连接组件,后面参数“1,1”,这是读取,后面讲到修改记录就把参数设置为1,3,好了接下来我们读取记录。
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<%do while not rs.eof%><tr>
<td><%=rs("name")%></td>
<td><%=rs("tel")%></td>
<td><%=rs("message")%></td>
<td><%=rs("time")%></td>
</tr><%
rs.movenext
loop
%>
</table>
在一个表格中,我们用4列分别显示了上次建立的表里面的四个字段,用do循环,not rs.eof的意思是条件为没有读到记录集的最后,rs.movenext的意思是显示完一条转到下面一条记录,<%=%>就等于<%response.write%>用于在html代码里面插入asp代码,主要用于显示变量。
    好了今天就结束了,大家可以多实践,可以先下载我的示例看一下,调试一下。下面是我机器上面的结果图片。
 
十天学会ASP之第五天
学习目的:学会数据库的基本操作1(写入记录)
    数据库的基本操作无非是:查询记录,写入记录,删除记录,修改记录。今天我们先学习写入记录。
先建立一个表单:
<form name="form1" method="post" action="example5.asp">
name <input type="text" name="name"><br>
tel <input type="text" name="tel"><br>
message <input type="text" name="message" value=""><br>
<input type="submit" name="Submit" value="提交">
<input type="reset" name="Submit2" value="重置">
</form>
表单提交到example5.asp,下面是example5.asp的代码:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
name=request.form("name")
tel=request.form("tel")
message=request.form("message")
exec="insert into guestbook(name,tel,message)values(‘"+name+"‘,"+tel+",‘"+message+"‘)"
conn.execute exec
conn.close
set conn=nothing
response.write "记录添加成功!"
%>
在这里前面两句我不说了,后面三句我也不说了,前面说过exec里面的是执行的命令,添加记录的比较繁,大家要仔细看。insert into后面加的是表的名字,后面的括号里面是需要添加的字段,不用添加的或者字段的内容就是默认值的可以省略。注意,这里的变量一定要和ACCESS里面的字段名对应,否则就会出错。values后面加的是传送过来的变量。exec是一个字符串,"insert into guestbook(name,tel,message)values(‘"是第一段,在ASP里面不能嵌双引号,所以可以用‘代替双引号,放在双引号里面,连接两个变量用+或者&所以"‘,"又是一段,中间夹了一个name就是表单传来的变量,这样就可以在这个变量外面加两个‘‘,表示是字符串了,后面的tel是数字型变量所以不需要外面包围‘‘,大家慢慢分析这句话,如果用表单传来的数据代替变量名字的话这句话为(假设name="aaa",tel=111,message="bbb"):"insert into guestbook(name,tel,message)values(‘aaa‘,111,‘bbb‘)"。
接下来的conn.execute 就是执行这个exec命令,最后别忘记把打开的数据库关闭,把定义的组件设置为空,这样可以返回资源。上次的读取为了简单,我没有关闭,大家可以补充上去:
rs.close
set rs=nothing
conn.close
set conn=nothing
记住,次序不可以颠倒!
大家可以到数据库里面去看一看,或者用example4.asp读取看看是不是多了记录阿?
十天学会ASP之第六天
学习目的:学会数据库的基本操作2(查询记录)
    在第四天中我们有这样一个程序:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
exec="select * from guestbook"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
%>
我们查询的是所有的记录,但是我们要修改、删除记录的时候不可能是所有记录,所有我们要学习检索合适的记录。先看一条语句:
a="张三"
b=111
exec="select * from guestbook where name=‘"+a+"‘and tel="+b
where后面加上的是条件,与是and,或是or,我想=,<=,>=,<,>的含义大家都知道吧。这句话的意思就是搜索name是张三的,并且电话是111的记录。还有一点就是如果要搜索一个字段里面是不是包含一个字符串就可以这么写:where instr(name,a)也就是搜索name里面有a(张三)这个字符串的人。
我这里的a,b,是常量,大家可以让a,b是表单提交过来的变量,这样就可以做一个搜索了。
下面大家看看这个代码,理解一下:
<form name="form1" method="post" action="example6.asp">
搜索:<br>
name =
<input type="text" name="name">
and tel=
<input type="text" name="tel">
<br>
<input type="submit" name="Submit" value="提交">
<input type="reset" name="Submit2" value="重置">
</form>

example6.asp:
<%
name=request.form("name")
tel=request.form("tel")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
exec="select * from guestbook where name=‘"+name+"‘ and tel="+tel
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
%>
<html>
<head>
<title>无标题文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<%
do while not rs.eof
%><tr>
<td><%=rs("name")%></td>
<td><%=rs("tel")%></td>
<td><%=rs("message")%></td>
<td><%=rs("time")%></td>
</tr>
<%
rs.movenext
loop
%>
</table>
</body>
</html>
今天实际上就讲了一个where,大家回去做做试验,把instr()做进去,明天见!
十天学会ASP之第七天

学习目的:学会数据库的基本操作3(删除记录)
开门见山,大家直接看程序。
exec="delete * from guestbook where id="&request.form("id")
上面这句话完成了删除记录的操作,不过锁定记录用了记录唯一的表示id,我们前面建立数据库的时候用的是系统给我们的主键,名字是编号,由于是中文的名字不是很方便,大家可以修改为id,不修改的话就是
exec="delete * from guestbook where 编号="&request.form("id")
下面我们看完整的代码:一个表单传给ASP文件一个ID,然后这个ASP文件就删除了这个ID。
<form name="form1" method="post" action="example7.asp">
delete:
<input type="text" name="id">
<input type="submit" name="Submit" value="提交">
</form>
example7.asp:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
exec="delete * from guestbook where 编号="&request.form("id")
conn.execute exec
%>
我在示例里面加了一个example72.asp,和example4.asp差不多,就是加了一个id字段,大家可以先运行这个文件看一下所有记录的ID和想删除记录的ID,删除记录以后也可以通过这个文件复查。等到最后一天,我们会把所有的这些东西整合的。大家就不会需要这么麻烦的操作。
example72.asp:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("example3.mdb")
exec="select * from guestbook"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
%>
<html>
<head>
<title>无标题文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<%
do while not rs.eof
%><tr>
<td><%=rs("编号")%></td>
<td><%=rs("name")%></td>
<td><%=rs("tel")%></td>
<td><%=rs("message")%></td>
<td><%=rs("time")%></td>
</tr>
<%
rs.movenext
loop
%>
</table>
</body>
</html>
十天学会ASP之第八天
学习目的:学会数据库的基本操作4(修改记录)
    先来看代码:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("test.mdb")//这不是以前的一个数据库,里面就aa,bb两个字段
exec="select * from test where id="&request.querystring("id")
set rs=server.createobject("adodb.recordset")
rs.open exec,conn
%>
<form name="form1" method="post" action="modifysave.asp">
<table width="748" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>aa</td>
<td>bb</td>
</tr>
<tr>
<td>
<input type="text" name="aa" value="<%=rs("aa")%>">
</td>
<td>
<input type="text" name="bb" value="<%=rs("bb")%>">
<input type="submit" name="Submit" value="提交">
<input type="hidden" name="id" value="<%=request.querystring("id")%>">
</td>
</tr>
</table>
</form>
<%
rs.close
set rs=nothing
conn.close
set conn=nothing
%>
大家到现在应该分析这个代码没有什么问题,这个代码的作用是接受前面一个页面的ID然后显示这条记录,文本框即是输入的地方也是显示的地方,如果需要修改的话修改以后按提交;如果不需要修改就可以直接按提交按钮。这里还有一个东西以前没有说,那就是隐藏的表单元素:hidden元素,里面的value是不用用户输入的,会随着表单一起提交,用于传递变量。下面是modifysave.asp的代码:
<%
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};dbq="&server.mappath("test.mdb")
exec="select * from test where id="&request.form("id")
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,3
rs("aa")=request.form("aa")
rs("bb")=request.form("bb")
rs.update
rs.close
set rs=nothing
conn.close
set conn=nothing
%>
在这里,rs.open exec,conn,1,3后面的参数是1,3,这我以前提过,修改记录就要用1,3。实际上修改记录很容易看懂,记录集是rs,rs("aa")就是当前记录aa字段的东西,让它等于新的数据request.form("aa")当然就修改了,不过最后别忘记保存,那就是rs.update!
说到这里,记录的搜索,读取,修改,插入都说了,通过这最基本的东西就可以作出复杂的东西了,外面的大型数据库:新闻系统,留言簿就是字段多一点罢了。今天的示例中的代码是结合以前的数据库的,大家DOWN了以后回去调试分析一下。(rar里面的那个example72.asp还是供大家查询记录ID和核对修改以后的记录用的)
十天学会ASP之第九天
学习目的:基本的SESSION组件,总结response,request组件。
    首先,有会员系统的任何程序都会用到检测是不是用户已经登陆这个步骤。这就用到了SESSION组件,下面我们    看一个代码来说明。
<%
session("islogin")="yes"
%>
这句话的意思就是在session里面定义一个islogin字符串变量,值为"yes",直接可以赋值,不需要声明。是不是很简单?
如果我们做管理员登陆系统的话,首先是一段检测是不是管理员
if 是 then
session("isadmin")=yes"
else
session("isadmin")="no"
end if
在每一个需要管理员才能看的页面最前面加上
<%
if not session("isaadmin")="yes"then
response.redirect "login.htm"
%>
这样一般用户就无法打开这个页面。解释一下response.redirect,它是转向的意思,后面的"login.htm"就是转向的文件。这样没有登陆的管理员是无法看到后面的内容的。
    下面总结一下response组件基本就是用到response.write (),response.redirect() 分别是写字符串和转向的作用request基本就是request.form(),request.querystring() 分别是接受post,get方法传来的信息今天就说到这里了,最后我的示范是一个登陆系统大家可以研究一下,基本就是上面的知识点比较简单的。
 
十天学会ASP之第十天

学习目的:分页技术,总结
    今天最后一天我们学习一下ASP里面稍微难一点地分页技术,毕竟当我们有N条记录的时候我们不可能把所有记录显示在一个页面里面吧。
<%
exec="select * from test"
set rs=server.createobject("adodb.recordset")
rs.open exec,conn,1,1
rs.PageSize=3
pagecount=rs.PageCount
page=int(request.QueryString ("page"))
if page<=0 then page=1
if request.QueryString("page")="" then page=1
rs.AbsolutePage=page
%>
rs.pagesize设置一个页面里面显示的记录数,pagecount是我们自己定义的一个变量,rs.pagecount是记录的个数,page也是我们自己定义的一个变量,我们下一页的链接可以设置为list.asp?page=<%=page+1%>,下一页的链接可以设置为list.asp?page=<%=page-1%>,这样当按下链接的时候调用页面自己,page这个变量就+1或者-1了,最后我们让rs.absolutepage(当前页面)为第page页就可以了。
if request.QueryString("page")="" then page=1,这句话的作用就是我们打开list.asp的时候没有跟随page变量,自动设置为page=1,防止出错,还有当我们if....then...放在一行的时候end if可以省略。是不是分页也不难?
下面说一种特殊情况:
if page=1 and not page=pagecount,这个时候没有上一页,但是有下一页
elseif page=pagecount and not page=1,这个时候没有下一页,但是有上一页
elseif page<1,这个时候没有任何记录
elseif page>pagecount then,这个时候没有任何记录
elseif page=1 and page=pagecount,这个时候没有上一页,没有下一页
else,这个时候有上一页,也有下一页。
下面看一段显示1到n页,且每一个数字点击以后就出现这个数在代表的页面的代码,很常见哦。
<%for i=1 to pagecount%>
<a href="list.asp?page=<%=i%>"><%=i%></a><%next%>
for....next是循环从i=1开始,循环一次加1到pagecount为止。
最后我的实例里面包含了一个最简单的ASP程序,但是功能样样有,是ASP的精髓,每一个ASP大型程序都包含了它。
add.htm增加记录页面
add.asp增加记录操作
conn.asp数据库链接
del.asp删除记录操作
modify.asp修改记录页面
modifysave.asp修改记录操作
list.asp这个是这个程序的核心,通过这个页面实现记录的添加、修改、删除。
test.mdb数据库,里面有aa,bb两个字段:aa数字型只能接受数字,bb是字符型。
好了,十天到今天就结束了,我想我这个教程是让大家入门的,大家觉得写的浅也不要责怪必尽不可能初学者和高手都照顾到吧,最后我想说一句,今天的实例是ASP的精华,大家一定要好好研究,通了这个程序,你会发现你已经会ASP了。谢谢大家的支持!
18. SQL常用命令使用方法:
(1) 数据记录筛选:
sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"
sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
sql="select * from 数据表 where 字段名 in ('值1','值2','值3')"
sql="select * from 数据表 where 字段名 between 值1 and 值2"
(2) 更新数据记录:
sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"
(3) 删除数据记录:
sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表" (将数据表所有记录删除)
(4) 添加数据记录:
sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)
(5) 数据记录统计函数:
AVG(字段名) 得出一个表格栏平均值
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加
引用以上函数的方法:
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)
用 rs("别名" 获取统的计值,其它函数运用同上。
(5) 数据表的建立和删除:
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )
例:CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 数据表名称 (永久性删除一个数据表)
19. 记录集对象的方法:
rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
rs.pagecount 根据 pagesize 的设置返回总页数
rs.recordcount 返回记录总数
rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否
rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否
rs.delete 删除当前记录,但记录指针不会向下移动
rs.addnew 添加记录到数据表末端
rs.update 更新数据表记录
---------------------------------------
20. Recordset对象方法
Open方法
recordset.Open Source,ActiveConnection,CursorType,LockType,Options
Source
Recordset对象可以通过Source属性来连接Command对象。Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这个参数,系统则采用Recordset对象的Source属性。
ActiveConnection
Recordset对象可以通过ActiveConnection属性来连接Connection对象。这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。
CursorType
Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下:
--------------------------------------------------------------
常数 常数值 说明
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多