断点

每天进步一点点!
posts - 174, comments - 56, trackbacks - 0, articles - 21

有两个简单例子,以说明 “exists”和“in”的效率问题

1) select * from T1 where exists(select * from T2 where T1.a=T2.a) ;

    T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。

2) select * from T1 where T1.a in (select T2.a from T2) ;

     T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。

exists 用法:

1)句中的“select * from T2 where T1.a=T2.a” 相当于一个关联表查询,

     相当于“select * from T1,T2  where T1.a=T2.a”;

    “exists(xxx)”它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这1)句的where 条件成立。

in的用法:

2)句中的“select * from T1 where T1.a in (select T2.a from T2) ”,这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。

---------------------------------------------------------------

+++++++++++++   下面转载  +++++++++++++++++++

---------------------------------------------------------------

今天市场报告有个sql及慢,运行需要20多分钟,如下:
update p_container_decl cd
set cd.ANNUL_FLAG=\'0001\',ANNUL_DATE = sysdate
where exists(
select 1
from (
select tc.decl_no,tc.goods_no
from p_transfer_cont tc,P_AFFIRM_DO ad
where tc.GOODS_DECL_NO = ad.DECL_NO
and ad.DECL_NO = \'sssssssssssssssss\'
) a
where a.decl_no = cd.decl_no
and a.goods_no = cd.goods_no
)
上面涉及的3个表的记录数都不小,均在百万左右。根据这种情况,我想到了前不久看的tom的一篇文章,说的是exists和in的区别,in 是把外表和那表作hash join,而exists是对外表作loop,每次loop再对那表进行查询。
这样的话,in适合内外表都很大的情况,exists适合外表结果集很小的情况。

而我目前的情况适合用in来作查询,于是我改写了sql,如下:
update p_container_decl cd
set cd.ANNUL_FLAG=\'0001\',ANNUL_DATE = sysdate
where (decl_no,goods_no) in
(
select tc.decl_no,tc.goods_no
from p_transfer_cont tc,P_AFFIRM_DO ad
where tc.GOODS_DECL_NO = ad.DECL_NO
and ad.DECL_NO = ‘ssssssssssss’
)

让市场人员测试,结果运行时间在1分钟内。问题解决了,看来exists和in确实是要根据表的数据量来决定使用。

--------------------------------------------------------------------------


posted @ 2009-02-01 17:54 断点 阅读(240) | 评论 (0)

posted @ 2010-01-14 21:42 断点 阅读(291) | 评论 (0)编辑 收藏

在卸载Oracle时删不干净,搞的要重装系统,本人在工作中总结出如下方法,希望对大家有所帮助。
注意:oracle的源程序的路径必须是英文路径,否则安装会出错!

1.以Administrators 身份登陆windows系统。
2.停掉Oracle Service服务。 
3.通过Oracle installer 卸载任何orcle产品及组件。
4.删除%ORACLE_base%文档和SYSTEM_DRIVE:\program files下的oracle文档。
5.删除SYSTEM_DRIVE:\Documents and Settings\All Users\「开始」菜单\程式中的oracle项。
6.在“开始菜单”—点“运行”—输入“regedit”打开注册表:
   到HKEY_CLASSES_ROOT下,删除以Oracle,ORA,ORCL开头的键;
   到HKEY_LOCAL_MACHINE\SOFTWARE下,删除ORACLE键和Apache Group键;
   到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下,删除以Oracle开头的键;
   到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \Eventlog\Application下,删除以Oracle
开头的键;
  到HKEY_CURRENT_USER下,删除Oracle键;
  到HKEY_CURRENT_USER\SOFTWARE\ORACLE下,删除以Oracle 或 Orcl开头的键(假如有的话);
7.打开系统系统环境变量(我的电脑->右键->系统属性->高级->环境变量),在PATH中删除任何以%
ORACLE_HOME%开始的项。
8.重启电脑。


posted @ 2008-12-18 12:37 断点 阅读(68) | 评论 (0)

posted @ 2010-01-14 21:41 断点 阅读(240) | 评论 (0)编辑 收藏

一、建库和建表以及插入数据的实例。
drop database if exists school; -- 如果存在SCHOOL则删除
create database school; -- 建立库SCHOOL
use school; -- 打开库SCHOOL
create table teacher -- 建立表TEACHER
(
id integer auto_increment not null primary key,
name varchar(10) not null
); -- 建表结束
insert into teacher values(null,'t');
insert into teacher values(null,'j');
在dos下命令不方便调试,你可以将以上命令写入一个文件中取名为school.sql,然后复制到c:\下,并在DOS窗口下键入以下命令:mysql -uroot -p密码 < c:/school.sql。

二、Windows下.sql文件的导入导出。
DOS窗口:开始->运行->cmd
导入为:mysql -uroot -proot<c:/school.sql
导出为:mysqldump -uroot -proot school>c:/school.sql

三、数据的备份(命令在DOS窗口下执行):
1.备份数据库:(将数据库school备份)
mysqldump -uroot -proot school>c:/school.sql
2.将备份数据导入到数据库:(导回school数据库)
mysql -uroot -proot school<c:/school.sql
注意:此时已有数据库school。
注意:另一种方式,就是进入mysql数据库控制台,use school,然后使用source命令source c:/school.sql即可。

四、将文本数据导入到mysql数据库中。
1、文本数据应符合相应的格式:字段数据之间用tab键隔开,null值用\n来代替。
例:取一个文件名为teacher.txt,里面内容如下:
\n w
\n h
2、数据传入命令 load data local infile "c:/teacher.txt" into table teacher;
注意:在mysql命令窗口中,先要用use命令打开此表所在的数据库。


posted @ 2009-03-26 10:05 断点 阅读(90) | 评论 (0)

posted @ 2010-01-14 21:40 断点 阅读(370) | 评论 (0)编辑 收藏

一、常用命令
列出数据库:show databases;
选择数据库:use databaseName;
列出表格:show tables;
建库create database 库名;
建表create table 表名;
显示数据表的结构:desc 表名;
删库 drop database 库名;
删表 drop table 表名;
将表中记录清空:delete from 表名;
显示表中的记录:select * from 表名;

二、连接MYSQL。
格式: mysql -h主机地址 -u用户名 -p用户密码
1、例1:连接到本机上的MYSQL。
首先在打开DOS窗口,键入命令mysql -uroot -p,回车后提示你输密码。
2、例2:连接到远程主机上的MYSQL。假设远程主机的IP为:192.168.1.5,用户名为root,密码为root。则键入以下命令: mysql -h192.168.1.5 -uroot -proot
3、退出MYSQL命令: exit (回车)

三、其它命令:
查询时间:select now();
查询数据库版本:select version();
查询当前用户:select user();
查询当前使用的数据库:select database();  
匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;
增加一个字段:alter table tabelName add column fieldName dateType;
增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;
修改密码:mysqladmin -u用户名 -p旧密码 password新密码

以下转载:

增加新用户:
格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"

例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:
grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";
但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见例2。

例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。
grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";

例3.如果你不想test2有密码,可以再打一个命令将密码消掉。
grant select,insert,update,delete on mydb.* to test2@localhost identified by "";

例4.增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";

其它命令集:
从已经有的表中复制表的结构create table table2 select * from table1 where 1<>1; 
复制表create table table2 select * from table1; 
对表重新命名alter table table1 rename as table2;
修改列的类型:
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned 
创建索引:
alter table table1 add index ind_id (id);
create index ind_id on table1 (id);
create unique index ind_id on table1 (id);//建立唯一性索引 
删除索引:
drop index idx_id on table1;
alter table table1 drop index ind_id; 
联合字符或者多个列(将列id与":"和列name和"="连接):
select concat(id,':',name,'=') from students。  
limit(选出10到20条)<第一个记录集的编号是0>:
select * from students order by id limit 9,10。  
MySQL不支持的功能:事务,视图,外键和引用完整性,存储过程和触发器。


posted @ 2009-03-26 10:02 断点 阅读(79) | 评论 (0)

posted @ 2010-01-14 21:38 断点 阅读(223) | 评论 (0)编辑 收藏

这个问题主要是MySQL自身的配置问题,修改一下,即可解决。

把E:\MySQL\MySQL Server 5.0里面的my.ini文件,default-character-set项修改为

default-character-set=gbk

注意:default-character-set两处需要进行修改,且修改后的值一样为gbk。

posted @ 2009-02-12 10:23 断点 阅读(65) | 评论 (0)

posted @ 2010-01-14 21:36 断点 阅读(179) | 评论 (0)编辑 收藏

项目开始的时候用的是这个my97,选一下日期就能带出来,感觉挺好,但到了后来项目上线了,有一个“保险起期”、“保险止期”联动,发现控件上的日期需要双击才可联动;如果只单击一下“保险起期”,然后离开点页面其他地方,两个时间没有联动起来。经项目组js牛人(wuguojian)努力攻关,终于实现了点击就可以联动的效果。

 

改造有两个方面的原因:

1.如果业务人员,只单击了“保险起期”,而“保险止期”没有联动,以前的默认的保险期间365天没有发生变化,而保单打印出来的时间“保险起期”、“保险止期”有变化,易引起麻烦。

2.刚才提到双击可以联动,还有单击后点刷新也可以联动,但是在网络慢的情况下,影响出单员的效率。

改造如下:

对文件My97DatePicker.htm部分进行修改,增加一个js方法,在body里面引用:
<head>
<script>
// 增加日历控件关闭事件 2009-10-26
function getObj() {
 var divs = document.body.getElementsByTagName("div");
 for (var i=0,len=divs.length;i<len;i++) {
  if (divs[i].className == 'WdateDiv') {
   divs[i].onblur = function () {
    $dp.el.onchange();
   };
   break;
  }
 }
}
</script>
</head>
<body leftmargin="0" topmargin="0" onload="$c.autoSize();getObj();">
</body>

控件连接地址:http://www.my97.net/dp/demo/index.htm

posted @ 2009-10-31 18:08 断点 阅读(19) | 评论 (0)

posted @ 2010-01-14 21:34 断点 阅读(678) | 评论 (2)编辑 收藏

什么是正则表达式
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。

其作用如下:
1、测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
2、替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。
3、根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。

 
正则表达式的形式一般如下:

/love/ 其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
 
1、元字符。常用的包括: “+”, “*”,以及 “?”。
“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。
“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次。
“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。 
\s:用于匹配单个空格符,包括tab键和换行符;
\S:用于匹配除单个空格符之外的所有字符;
\d:用于匹配从0到9的数字;
\w:用于匹配字母,数字或下划线字符;
\W:用于匹配所有与\w不匹配的字符;
. :用于匹配除换行符之外的所有字符。
例子:
/fo+/ 因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。
/eg*/ 因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。
/Wil?/ 因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的 “Win”, 或者“Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。
/\s+/ 上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。
/\d000/ 如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。

2、限定符。有时候不知道要匹配多少字符。为了能适应这种不确定性,正则表达式支持限定符的概念。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。


3、定位符。定位符用于规定匹配模式在目标对象中的出现位置。 包括: “^”, “$”, “\b” 以及 “\B”。
“^”定位符规定匹配模式必须出现在目标字符串的开头
“$”定位符规定匹配模式必须出现在目标对象的结尾
“\b”定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一
“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内。

举例:
/^hell/ 因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或“hellhound”开头的字符串相匹配。
 /ar$/ 因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。
/\bbom/ 因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。
/man\b/ 因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。

4、为了方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体字符。例如: 
/[A-Z]/ 上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。
/[a-z]/ 上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。
/[0-9]/ 上述正则表达式将会与从0到9范围内任何一个数字相匹配。
/([a-z][A-Z][0-9])+/ 上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。


5、这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。
6、如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。
例如:/to|too|2/ 上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。

7、否定符 “[^]”。规定目标对象中不能存在模式中所规定的字符串。例如:/[^A-C]/ 上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。
8、当用户需要在正则表达式的模式中加入元字符,可以使用转义符“\”。例如:/Th\*/ 上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。


区号:前面一个0,后面跟2-3位数字 : 0\d{2,3}
电话号码:7-8位数字: \d{7,8}
分机号:一般都是3位数字: \d{3,}
这样连接起来就是验证电话的正则表达式了:/^((0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/

手机号码前面以1开头,第二位现在是3或者5,后面是9位数字,则:/^1[35]\d{9}$/


posted @ 2009-08-15 19:24 断点 阅读(39) | 评论 (0)

posted @ 2010-01-14 21:32 断点 阅读(302) | 评论 (0)编辑 收藏

有人问 Javascript 中如何截取小数位并实现四舍五入,这是一个很常用的 js 技术,因为觉得比较典型,可能很多新手都会遇到此问题,所以将帖子整理了一下,以备新手查阅。


1、round 方法
作用:返回与给出的数值表达式最接近的整数。
语法:Math.round(number) ,必选项 number 参数是要舍入到最接近整数的值。
说明:如果 number 的小数部分大于等于 0.5,返回值是大于 number 的最小整数。否则,round 返回小于等于 number 的最大整数。

2、在 Javascript 1.5 (IE5.5+,NS6+ 以上版本支持)中,新增了2个专门用于货币流通的函数,Number.toFixed(x) 和 Number.toPrecision(x)。

Number.toFixed(x) 是将指定数字截取小数点后 x 位, Number.toPrecision(x) 是将整个数字截取指定(x)长度。注意,一个是计算小数点后的长度,一个是计算整个数字的长度 。

例如:
<script type="text/javascript">
 var aa = 2.3362; 
document.write(aa.toFixed(1)); // 2.3
document.write(aa.toFixed(2)); // 2.34 
document.write(aa.toPrecision(2)); // 2.3
document.write(aa.toPrecision(3)); // 2.34 
document.write(Math.round(aa * 10) / 10); // 2.3
document.write(Math.round(aa * 100) / 100); // 2.34 
</script>

由于是新增函数,所以要考虑浏览器支持问题。


posted @ 2009-08-26 13:52 断点 阅读(157) | 评论 (0)

posted @ 2010-01-14 21:32 断点 阅读(654) | 评论 (0)编辑 收藏

数组分类:
1、从数组的下标分为索引数组、关联数组
/* 索引数组,即通常情况下所说的数组 */ 
var ary1 = [1,3,5,8];  
//按索引去取数组元素,从0开始(当然某些语言实现从1开始),索引实际上就是序数,一个整型数字  
alert(ary1[0]);  
alert(ary1[1]);  
alert(ary1[2]);  
alert(ary1[3]);  
 
/* 关联数组,指以非序数类型为下标来存取的数组  python中称为字典 */ 
var ary2 = {};   //存取时,以非序数(数字),这里是字符串  
ary2["one"] = 1;  
ary2["two"] = 2;  
ary2["thr"]  = 3;  
ary2["fou"] = 4;
 
2、从对数据的存储分为静态数组、动态数组
/* java中的静态数组 */ 
Int[] ary1 = {1,3,6,9}; //定义后数组的长度固定了不能改变,按索引取数组元素  
  
/* java中的动态数组   (java中的ArrayList实现是以Array为基础的。)*/ 
List<Integer> ary2 = new ArrayList<Integer>();  
ary2.add(1);//可以动态的添加元素,数组的长度也随着变化  
ary2.add(3);  
ary2.add(6);
 
/* js的数组属于动态数组 */ 
var ary = [];//定义一个数组,未指定长度  
ary[0] = 1;//可以动态的添加元素  
ary.push(3);  
ary.push(5);   
alert(ary.join(","));//输出1,3,5 

js的数组同时属于索引数组和动态数组,因为本质上它就是一个js对象,体现着js动态语言特性。但js的索引数组并非“连续分配”内存的,因此索引方法并不会带来很高的效率。而java中的数组则是连续分配内存的。


例子:
function test(){
        
var oneArray=new Array();
        oneArray[
"first"]="firstValue";
        oneArray[
"second"]="secondValue";
        
        
        oneDrapList
=document.createElement("select");
        
        
for(att in oneArray){
            
var oneOption=document.createElement("option");
            oneOption.text
=oneArray[att]
            oneOption.value
=att;
            
try{
                oneDrapList.add(oneOption,
null);
                }

            
catch(ex){
                oneDrapList.add(oneOption);
                }

            }

}


function test(){
    var obj = tool.getFilterByName("<%=dwname%>",'VehicleClass');
    if(obj){
     var cProdNo = '<%=cProdNo%>';
     if(cProdNo=="0316"||cProdNo=="0325"){
       var array = {"摩托车类":"摩托车类","拖拉机类":"拖拉机类"};
       for(var temp in array){
      var option = new Option(temp,array[temp]);
      obj.add(option);
         }
    }
  }
}

posted @ 2009-08-14 21:28 断点 阅读(202) | 评论 (0)

posted @ 2010-01-14 21:30 断点 阅读(533) | 评论 (0)编辑 收藏

这几天一直被日期的各种转换缠绕在,现在终于解决,顺便把自己这几天的收获贡献出来,与大家一起共同成长。

1、将日期字符串转换成日期对象。
yyyy-mm-dd这种格式的字符串转化成日期对象,可以用new Date(Date.parse(str.replace(/-/g,"/")));
如下:
var endDateStr = endYear +"-"+ endMonth  +"-"+  endDay;
endDate = new Date(Date.parse(endDateStr.replace(/-/g,"/")));
实例显示:
endDateStr:"2010-5-20"
Date.parse(endDateStr.replace(/-/g,"/")):1274284800000
endDate:Thu May 20 00:00:00 UTC+0800 2010

yyyy/mm/dd这种格式转化成日期对象,可以用new Date(str);
如下:
var endDateStr = endYear +"/"+ endMonth  +"/"+  endDay;
endDate = new Date(endDateStr);
实例显示:"2010/5/20"、Thu May 20 00:00:00 UTC+0800 2010

yyyymmdd这种格式转换成日期对象,可以用new Date(sDate.replace(/^(\d{4})(\d{2})(\d{2})$/,"$1/$2/$3"));
如下:
var sDate="20090516";
sDate=sDate.replace(/^(\d{4})(\d{2})(\d{2})$/,"$1/$2/$3");
new Date(sDate);
实例显示:"2009/05/16"、Sat May 16 00:00:00 UTC+0800 2009

2、显示当前日期的下一天。
var date = new Date();
var b = date.getDate();
b += 1;
date.setDate(b);

3、求两个日期之间相差的天数。
var Date1 =new Date(2008,6,28);               //Mon Jul 28 00:00:00 UTC+0800 2008
var Date2 =new Date(2009,5,16);               //Tue Jun 16 00:00:00 UTC+0800 2009
var n  = (Date2.getTime()-Date1.getTime())/(24*60*60*1000);  //323
var n  = (Date2-Date1)/(24*60*60*1000);   //直接相减得到的是毫秒数。

 4、dateObj.getDay() 返回 Date 对象中用本地时间表示的一周中的日期值。
getDay 方法所返回的值是一个处于 0 到 6 之间的整数,它代表了一周中的某一天,返回值与一周中日期的对应关系如下:

值 星期
0 星期天
1 星期一
2 星期二
3 星期三
4 星期四
5 星期五
6 星期六

此方法可以用来对 ‘工作日’的判断。


posted @ 2009-05-16 15:24 断点 阅读(87) | 评论 (0)

posted @ 2010-01-14 21:29 断点 阅读(458) | 评论 (0)编辑 收藏

仅列出标题
共18页: First 上一页 9 10 11 12 13 14 15 16 17 下一页 Last