asp通用分页类

一、类的属性、方法
  这是个asp通用分页类。你能用他方便的给记录集分页,当然在网上有许多的分页类和分页函数。本分页主要有conn、sql、url、fieldlist、pagesize、template、init、show、close等属性和方法。
  1.conn属性    :用来获取一个已创建的connection对象。
  2.sql属性      :根据传入的sql语句,自动创建recordset对象
  3.pagesize属性   :设置第页的记录条数
  4.fieldlist属性    :如果需要显示库中的数据,一定要设置此属性。他是用来获取需要显示的正确的字段名。
  5.url属性     :设置分页条中链接的文件地址。
  6.template属性   :设置分页文件的模版。
  7.init过程     :分页类初始化数据。
  8.show过程   :显示数据。
  9.close过程    :分页类结束

全部代码由此下载

二、类的原始码(inc_clspage.asp)

<%
/************************************************
* *
* name : asp pagnation class *
* author : cjj *
* version : v2.8 *
* time : 2004-01-16 *
* comefrom: http://www.blueidea.com/ *
* homepage: none (maybe soon) *
* notice : you can use and modify it freely, *
* but please hold this item. *
* if you modify it that i hope you *
* can send a mail for me. *
* *
************************************************/

#########声明变量#########

定义链接的显示类型
const sw_intshowchinese = 0 汉字,如"上一页、下一页"
const sw_intshowenglish = 1 英文,如"back、next"
const sw_intshowcharacter = 2 特别字符
定义数据的显示类型
const sw_inthorizontalview = 0 横排
const sw_intverticalview = 1 竖排
线的显示类型
const sw_intshowbigborder = 2 粗线
const sw_intshowsmallborder = 1 细线
const sw_intshownoborder = 0 无线

标题栏线的显示类型
const sw_inttlesmallborder = 1 细线
const sw_inttlenoborder = 0 无线

显示分页信息的位置
const sw_intpageinnone = 0 不显示分页条
const sw_intpageintop = 1 在顶部显示
const sw_intpageinbottom = 2 在底部显示
const sw_intpageinall = 3 在顶、底部显示

显示的页数的数字个数
const sw_intshowpages = 10

swpage class
private sw_blnishavers,sw_strfields,sw_blninconn,sw_intshowpagepos,sw_strshowwidth
#########初始化变量##########
sw_blnishavers = false 设置记录集获取标志为fasle,就是无记录集状态
sw_strshowwidth = "90%" 默认的显示宽度为90%
sw_strfields = ""
sw_blninconn = true 由内部创建connection,如果设为false则由外部创建
sw_intshowpagepos = sw_intpageinall


*****************************************
类型: 类
目的: 给记录集分页
*****************************************
class swpage
声明类私有变量
private sw_objrs,sw_objconn

private sw_strsql,sw_strurl,sw_strerror,sw_strformaction,sw_strheadjs,sw_strfootjs

private sw_intpagesize,sw_inttlebdtype,sw_intshowpagetype,sw_intshowtype
private sw_lngtotalpage,sw_lngtotalrecord,sw_lngpageno
private sw_aryfldname,sw_aryfldnote,sw_aryfldwidth,sw_aryfldalign,sw_aryfldlink
private sw_blninit,sw_blnopenrs,sw_blnconn,sw_blnpagesize,sw_blnfieldlist,sw_blngeturl,sw_blnshowtype,sw_blnshowpagetype,sw_blntemplate

*****************************************
类型: 属性
目的: 根据获取的信息,创建数据库连接
输入: a_strconn:数据类型字符串
返回: 无
*****************************************
public property let conn(a_strconn)
dim strerror
sw_blnconn = false
set sw_objconn = createobject("adodb.connection")
on error resume next
sw_objconn.open a_strconn
if err.number <> 0 then strerror = strerror & "
创建connection对象失败"
on error goto 0

if trim(strerror)="" then
sw_blnconn = true
else
sw_strerror = sw_strerror & " conn属性:" & vbcrlf
sw_strerror = sw_strerror & " " & strerror & "" & vbcrlf
end if
end property

*****************************************
类型: 属性
目的: 设定或显示sql语句。
输入: a_strsql: sql语句。
返回: sql语句。
*****************************************
public property let sql(a_strsql)
dim strerror

sw_blnopenrs = false
sw_strsql = a_strsql

创建recordset对象
set sw_objrs = createobject("adodb.recordset")
on error resume next
sw_objrs.open sw_strsql,sw_objconn,1,1
if err.number <> 0 then strerror = "
记录集打开失败"
on error goto 0

if trim(strerror)="" then
sw_blnopenrs = true
else
sw_strerror = sw_strerror & " sql属性:" & vbcrlf
sw_strerror = sw_strerror & " " & strerror & "" & vbcrlf
end if
end property


*****************************************
类型: 属性
目的: 设置需要显示的数据的字段名
输入: a_strfldname:字段名字符串,多个字段之间以逗号分隔
返回: 无
*****************************************
public property let fieldlist(a_strfldname)
dim strerror

sw_blnfieldlist = false
if trim(a_strfldname) <> "" then
sw_aryfldname = split(lcase(a_strfldname),",")
else
strerror = strerror & "
你必须设置需要显示的字段名,否则无法显示数据"
end if
if trim(strerror)="" then
sw_blnfieldlist = true
else
sw_strerror = sw_strerror & " fieldlist属性:" & vbcrlf
sw_strerror = sw_strerror & " " & strerror & "" & vbcrlf
end if
end property

*****************************************
类型: 属性
目的: 设定或显示每页的记录数。
输入: a_intpagesize: 每页显示的记录数。
返回: 每页显示的记录数。
*****************************************
public property let pagesize(a_intpagesize)
dim strerror

pagesize获取失败标志
sw_blnpagesize = false
if trim(a_intpagesize) = "" or (not(isnumeric(a_intpagesize))) then
strerror = strerror & "
非法的pagesize"
else
if (a_intpagesize <= 2147483647 and a_intpagesize>=-2147483648) then
sw_intpagesize = clng(a_intpagesize)
else
strerror = strerror & "
pagesize溢出"
end if
if (sw_intpagesize<=0) then
strerror = strerror & "
pagesize只能是正整数"
end if
end if
if trim(strerror)="" then
sw_blnpagesize = true
else
sw_strerror = sw_strerror & " pagesize属性:" & vbcrlf
sw_strerror = sw_strerror & " " & strerror & "" & vbcrlf
end if
end property

*****************************************
类型: 属性
目的: 设定分页文件显示模板信息。
输入: a_strtemplate: 模板描述。
返回: 无。
*****************************************
public property let template(a_strtemplate)
dim arytemplate,i,j,strerror,strtemp,intitem,arytemp,arytemp1

sw_blntemplate = false

arytemplate = split(trim(lcase(a_strtemplate)),"+")
intitem = ubound(arytemplate)
if intitem < 4 then strerror = "
此属性是必选项"

if intitem < 4 then
获取文件头
strtemp = trim(arytemplate(0))

if strcomp(left(strtemp,6),"[file=")= 0 then
sw_strheadjs = ""
else
sw_strheadjs = mid(strtemp,7,len(strtemp)-7)
end if

获取文件尾
strtemp = trim(arytemplate(3))

if strcomp(left(strtemp,6),"[file=") = 0 then
sw_strfootjs = ""
else
sw_strfootjs = mid(strtemp,7,len(strtemp)-7)
end if

获取分页模版
arytemp = split(arytemplate(1),",")
if arytemp(0) <> "" then strtemp = replace(arytemp(0),"[page=","")

if isnumeric(strtemp) then strtemp = cint(strtemp)
if strtemp <> sw_intpageinnone then

if isnumeric(strtemp) then strtemp = cint(strtemp)

sw_intshowpagepos = strtemp
strtemp = arytemp(1)
if strtemp <> "" then strtemp = replace(strtemp,"]","")

if isnumeric(strtemp) then strtemp = cint(strtemp)
sw_intshowpagetype = strtemp
else
sw_intshowpagepos = sw_intpageshowinnone
end if

获取数据显示模版
arytemp = split(arytemplate(2),"|")
for i = 0 to ubound(arytemp)
strtemp = lcase(trim(arytemp(i)))
select case i
case 0 获取并设置显示宽度
if strtemp <> "" then strtemp = replace(strtemp,"[data=","")
sw_strshowwidth = strtemp
case 1 获取数据显示方式
if isnumeric(strtemp) then strtemp = cint(strtemp)
sw_intshowtype = strtemp
case 2
if strtemp <> "" then strtemp = replace(strtemp,"]","")
arytemp1 = split(trim(strtemp),"#")
if ubound(arytemp1) >= 3 then
sw_aryfldnote = split(arytemp1(0),",")
sw_aryfldalign = split(arytemp1(1),",")
sw_aryfldwidth = split(arytemp1(2),",")
sw_aryfldlink = split(arytemp1(3),",")
end if
end select
next
end if

if strerror = "" then
sw_blntemplate = true
else
sw_strerror = sw_strerror & " template属性:" & vbcrlf
sw_strerror = sw_strerror & " " & strerror & "" & vbcrlf
end if
end property

*****************************************
类型: 属性
目的: 设定或显示url。
输入: a_strurl: 需要分页的文件地址。
返回: 需要分页的文件地址。
*****************************************
public property let url(a_strurl)
dim strerror,objfso

sw_blngeturl = false
if trim(a_strurl)="" then
strerror = "
非法的url地址"
else
set objfso = createobject("scripting.filesystemobject")
if objfso.fileexists(server.mappath(a_strurl)) then
sw_strurl = a_strurl
else
strerror = strerror & "
你能确定文件 " & a_strurl & " 存在么?"
end if
set objfso = nothing
end if
if strerror = "" then
sw_blngeturl = true
else
sw_strerror = sw_strerror & " url属性:" & vbcrlf
sw_strerror = sw_strerror & " " & strerror & "" & vbcrlf
end if
end property


*****************************************
类型: 属性
目的: 设置显示标题时单元格的宽度
输入: a_strtlewidth:单元格宽度字符串
返回: 无
*****************************************
public property let tlewidth(a_strwidth)
sw_strtlewidth = a_strwidth
end property

*****************************************
类型: 属性
目的: 设置显示标题时单元格分隔线的类型
输入: a_intbdtype 单元格分隔线的类型
返回: 无
*****************************************
public property let tlebdtype(a_intbdtype)
sw_inttlebdtype = a_intbdtype
end property

*****************************************
类型: 过程
目的: 统计总记录数、计算总页数
输入: 无
返回: 无
*****************************************
sub init()
dim intpostion,strerror,i,objrstemp,lngtotalrecord

if not (sw_blnconn and sw_blnopenrs and sw_blnpagesize and sw_blngeturl) then
call showerrors()
exit sub
end if

if sw_objrs.eof and sw_objrs.bof then
strerror = strerror & "
库中无所有记录"
end if

计算总计录数
set objrstemp = sw_objconn.execute("select * from sw_reccount")
lngtotalrecord = clng(objrstemp("sw_reccount").value)
sw_lngtotalrecord = lngtotalrecord
if (sw_lngtotalrecord<=2147483647 and sw_lngtotalrecord>=-2147483648) then
sw_lngtotalrecord = clng(sw_lngtotalrecord)
else
strerror = strerror & "
分页初始化时:总记录数溢出"
end if
if sw_lngtotalrecord <=0 then strerror = strerror & "
分页初始化时:总记录数小于零"

计算总页数
if sw_lngtotalrecord mod sw_intpagesize = 0 then
sw_lngtotalpage = clng(sw_lngtotalrecord \ sw_intpagesize * -1)*-1
else
sw_lngtotalpage = clng(sw_lngtotalrecord \ sw_intpagesize * -1)*-1 + 1
end if

获取页数
sw_lngpageno = trim(request.querystring("pageno"))
if sw_lngpageno = "" then sw_lngpageno = trim(request.form("pageno"))
if sw_lngpageno = "" then sw_lngpageno = 1
如果没有选择第几页,则默认显示第一页
if sw_lngpageno <> "" and isnumeric(sw_lngpageno) then
if (sw_lngpageno <= 2147483647 and sw_lngpageno>=-2147483648) then
sw_lngpageno = clng(sw_lngpageno)
else
strerror = strerror & "
页数溢出,请检查!"
end if
if (sw_lngpageno<=0) then strerror = strerror & "
页数只能是正整数!"
else
strerror = strerror & "
你确信此页数 " & sw_lngpageno & " 存在?"
end if

if (sw_lngpageno > sw_lngtotalpage and sw_lngtotalpage<>0) then sw_lngpageno = sw_lngtotalpage

sw_objrs.pagesize = sw_intpagesize
sw_objrs.absolutepage = sw_lngpageno

intpostion = instrrev(sw_strurl,"?")
sw_strformaction = sw_strurl
if intpostion > 0 then
sw_strurl = sw_strurl & "&pageno="
else
sw_strurl = sw_strurl & "?pageno="
end if

if trim(sw_strfields) = "" then
for i = 0 to sw_objrs.fields.count-1
sw_strfields = sw_strfields & sw_objrs(i).name & ","
next
end if

sw_strfields = lcase("," & trim(sw_strfields))
if isarray(sw_aryfldname) then
for i = lbound(sw_aryfldname) to ubound(sw_aryfldname)
if instr(sw_strfields,"," & sw_aryfldname(i) & ",") = 0 then strerror = strerror & "
字段名 " & sw_aryfldname(i) & " 正确吗?"
next

if (isarray(sw_aryfldnote) and ubound(sw_aryfldname)>ubound(sw_aryfldnote)) then strerror = strerror & "
字段相应中文说明项目不能小于字段个数"

if (isarray(sw_aryfldwidth) and ubound(sw_aryfldname)>ubound(sw_aryfldwidth)) then strerror = strerror & "
字段相应宽度项目不能小于字段个数"

if (isarray(sw_aryfldalign) and ubound(sw_aryfldname)>ubound(sw_aryfldalign)) then strerror = strerror & "
字段数据相应对齐方式项目不能小于字段个数"
if (isarray(sw_aryfldlink) and ubound(sw_aryfldname)>ubound(sw_aryfldlink)) then strerror = strerror & "
字段数据相应文件链接项目不能小于字段个数"
end if

if trim(strerror) = "" then
sw_blninit = true
else
sw_strerror = sw_strerror & " init过程:" & vbcrlf
sw_strerror = sw_strerror & " " & strerror & "" & vbcrlf
end if
response.write(sw_strheadjs & vbcrlf)
end sub

*****************************************
类型: 过程
目的: 显示分页信息
输入: 无
返回: 无
*****************************************
private sub pages()
dim strpages,k,inttemp,inttemp1

if not(sw_blninit) then call showerrors()

if sw_lngtotalpage = 1 then exit sub
response.write("" & vbcrlf)

response.write(" " & vbcrlf)
response.write(" " & vbcrlf)
response.write(" " & vbcrlf)
response.write("
" & vbcrlf)
response.write(" " & vbcrlf)
response.write(" " & vbcrlf & " " & vbcrlf)
response.write(" " & vbcrlf)
response.write(" " & vbcrlf)
case sw_intshowenglish
if sw_lngpageno <= 1 then
response.write ("first prev next last" & vbcrlf)
else
if sw_lngpageno >= sw_lngtotalpage then
response.write ("first prev " & "next last" & vbcrlf)
else
response.write ("first prev " & "next last" & vbcrlf)
end if
end if
response.write (" page no:" & sw_lngpageno & "/" & sw_lngtotalpage & " total records:" & sw_lngtotalrecord & " pagesize:" & sw_intpagesize & "" & vbcrlf)
response.write("
" & vbcrlf)
response.write("
" & vbcrlf)
case sw_intshowcharacter
strpages = ""
inttemp = (sw_lngpageno \ sw_intshowpages) * sw_intshowpages
if sw_lngpageno mod sw_intshowpages = 0 then inttemp = inttemp - 10
for k = 1 to sw_intshowpages
inttemp1 = inttemp + k

if inttemp1 > sw_lngtotalpage then exit for
if sw_lngpageno = inttemp1 then
if len(trim(cstr(inttemp1)))<2 then
strpages = strpages & " 0" & cstr(inttemp1)
else
strpages = strpages & " " & cstr(inttemp1)
end if
else
strpages = strpages & " "
if len(trim(cstr(inttemp1)))<2 then
strpages = strpages & "0" & cstr(inttemp1)
else
strpages = strpages & cstr(inttemp1)
end if
strpages = strpages & "
"
end if
next
if sw_lngpageno <= 1 then
response.write ("9 7" & strpages & " 8 :" & vbcrlf)
else
if sw_lngpageno >= sw_lngtotalpage then
response.write ("9 7" & strpages & " 8 :" & vbcrlf)
else
response.write ("9 7 " & strpages & " 8 :" & vbcrlf)
end if
end if

response.write ("" & vbcrlf)
response.write("
" & vbcrlf)
response.write("
" & vbcrlf)
case sw_intshowimage
case else
response.write("
对不起,你设置的显示方式swpage不支持。")
response.end
end select
end if
response.write("
" & vbcrlf)

if sw_lngtotalpage >= 1 then
select case sw_intshowpagetype
case sw_intshowchinese
if sw_lngpageno <= 1 then
response.write ("首页 前页 后页 末页" & vbcrlf)
else
if sw_lngpageno >= sw_lngtotalpage then
response.write ("首页 前页 " & "后页 末页" & vbcrlf)
else
response.write ("首页 前页 " & "后页 末页" & vbcrlf)
end if
end if
response.write (" 页次:" & sw_lngpageno & "/" & sw_lngtotalpage & "页 共" & sw_lngtotalrecord & "条记录 " & sw_intpagesize & "条/页
第")
response.write(" 页 " & vbcrlf)
response.write("
")
response.write(" " & vbcrlf)
response.write("
")
response.write(" " & vbcrlf)
response.write("
" & vbcrlf)
response.write("
" & vbcrlf)
end sub

*****************************************
类型: 过程
目的: 显示分页数据
输入: 无
返回: 无
*****************************************
sub show()
dim i,j

if not(sw_blninit) then call showerror()

j = 0
if sw_objrs.eof and sw_objrs.bof then
response.write("库中无所有记录
")
response.end
else
if sw_intshowpagepos = sw_intpageinall or sw_intshowpagepos = sw_intpageintop then call pages()

空行
response.write("
" & vbcrlf)

select case sw_intshowtype
case sw_inthorizontalview 横排
do while (not sw_objrs.eof and jresponse.write(" " & vbcrlf)
for i = lbound(sw_aryfldname) to ubound(sw_aryfldname)
response.write(" " & vbcrlf)
response.write(" " & vbcrlf & " " & vbcrlf)
else
response.write(sw_objrs(sw_aryfldname(i)) & "" & vbcrlf)
end if

response.write(" " & vbcrlf)
next
response.write("
" & vbcrlf & "")
if (isarray(sw_aryfldnote)) then
response.write(sw_aryfldnote(i) & vbcrlf)
else
response.write(sw_aryfldname(i) & vbcrlf)
end if

response.write("

if (isarray(sw_aryfldwidth)) then response.write(" width=""" & sw_aryfldwidth(i) & """")

if (isarray(sw_aryfldalign)) then response.write(" align=""" & sw_aryfldalign(i) & """")

response.write(">" & vbcrlf)

if (isarray(sw_aryfldlink) and (trim(sw_aryfldlink(i))<>"")) then
response.write("" & sw_objrs(sw_aryfldname(i)) & "
" & vbcrlf)
空行
response.write("
" & vbcrlf)
sw_objrs.movenext
j = j + 1
loop
case sw_intverticalview 竖排
if sw_inttlebdtype = sw_inttlenoborder then
response.write(" " & vbcrlf)
response.write(" " & vbcrlf)
else
response.write("
" & vbcrlf)
response.write(" ")
for i = lbound(sw_aryfldname) to ubound(sw_aryfldname)
response.write(" " & vbcrlf)
next
response.write("
if (isarray(sw_aryfldwidth)) then response.write(" width=""" & sw_aryfldwidth(i) & """>")
if (isarray(sw_aryfldnote)) then
response.write(sw_aryfldnote(i) & vbcrlf)
else
response.write(sw_aryfldname(i) & vbcrlf)
end if
response.write("
" & vbcrlf)
response.write(" " & vbcrlf)
for i = lbound(sw_aryfldname) to ubound(sw_aryfldname)
response.write(" " & vbcrlf)
next
response.write(" " & vbcrlf)
end if

do while (not sw_objrs.eof and jresponse.write(" " & vbcrlf)
for i = lbound(sw_aryfldname) to ubound(sw_aryfldname)
response.write( "")
else
response.write(sw_objrs(sw_aryfldname(i)) & " " & vbcrlf)
end if
next

response.write(" " & vbcrlf)
sw_objrs.movenext
j = j + 1
loop
response.write("
if (isarray(sw_aryfldwidth)) then response.write(" width=""" & sw_aryfldwidth(i) & """>")
if (isarray(sw_aryfldnote)) then
response.write(sw_aryfldnote(i))
else
response.write(sw_aryfldname(i))
end if
response.write("
if (isarray(sw_aryfldalign)) then response.write(" align=""" & sw_aryfldalign(i) & """ width=""" & sw_aryfldwidth(i) & """>")
if (isarray(sw_aryfldlink) and trim(sw_aryfldlink(i)<>"")) then
response.write(" " & sw_objrs(sw_aryfldname(i)) & "
" & vbcrlf)
response.write("
" & vbcrlf)
case else
response.write("
你还没设置数据的显示方式?或你的设置的显示方式swpage不支持!
")
response.end
end select
if sw_intshowpagepos = sw_intpageinall or sw_intshowpagepos = sw_intpageinbottom then call pages()
response.write( sw_strfootjs & vbcrlf)
end if
end sub

*****************************************
类型: 过程
目的: 显示分页类中出现的错误信息
输入: 无
返回: 无
*****************************************
private sub showerrors()
if sw_strerror <> "" then
sw_strerror = "" & vbcrlf & " " & vbcrlf & sw_strerror & "
swpage分页类错误信息
" & vbcrlf
response.write(sw_strerror)
response.end
end if
end sub

*****************************************
类型: 过程
目的: 释放资源
输入: 无
返回: 无
*****************************************
sub close()
set sw_objrs = nothing
set sw_objconn = nothing
end sub
end class
%>




三、类的应用代码
<%option explicit
dim strstarttime,intusetime,clspage,strshowtemp
strstarttime = timer()
%>

<%
分页显示的位置:sw_intpageinall,sw_intpageintop,sw_intpageinbottom
页数的显示模式:sw_intshowchinese,sw_intshowenglish,sw_intshowcharacter,sw_intshowimage


页面显示模板设置 <文件头> + <页数设置:分页显示模式,页数显示的位置> + <数据显示> + <页数显示> + <文件尾>如果某项不必,只要设置成<>就行了,不过<文件头>和<文件尾是必须的>

设置分页文件头,能直接跟html代码({code=....})
strshowtemp = "[file=head.js] + "
设置分页条显示信息
strshowtemp = strshowtemp & "[page=" & sw_intpageinall & "," & sw_intshowcharacter & "] + "

########设置数据模版信息
strshowtemp = strshowtemp & "[data="
设置显示的宽度
strshowtemp = strshowtemp & "90%|"
数据显示方式,竖排、横排
strshowtemp = strshowtemp & sw_intverticalview & "|"

需要显示的字段的相应的中文说明
strshowtemp = strshowtemp & "编号,用户名,生日#"
需要显示的字段的相应的对齐方式
strshowtemp = strshowtemp & "left,center,right#"
需要显示的字段的相应的宽度
strshowtemp = strshowtemp & "30%,30%,30%#"
需要显示的字段的相应的链接文件名
strshowtemp = strshowtemp & "list.asp,,,"

strshowtemp = strshowtemp & "] + "
#########数据模版结束

#########设置文件尾
strshowtemp = strshowtemp & "[file=foot.js]"

set clspage = new swpage
clspage.conn = "driver={microsoft access driver (*.mdb)};dbq=" & server.mappath("../db/datatest.mdb")
clspage.sql = "select * from datatest"
clspage.pagesize = 10
clspage.url = "pages.asp"
clspage.fieldlist = "id,field1,field2"
clspage.template = strshowtemp 显示模版
clspage.init()
clspage.show
clspage.close
set clspage = nothing

intusetime = formatnumber((timer()-strstarttime)*1000,3)
response.write("

共用时 " & intusetime & " 毫秒
")
%>


上一篇: IP转数字[asp代码]
下一篇: 好用的ASP分页代码
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: 2783
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 300 字 | UBB代码 开启 | [img]标签 关闭