Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zhaoyufei133
litepal
提交
76a7a5b7
L
litepal
项目概览
zhaoyufei133
/
litepal
与 Fork 源项目一致
从无法访问的项目Fork
通知
4
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
litepal
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
76a7a5b7
编写于
9月 04, 2018
作者:
guolin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add kotlin extensions to FluentQuery class for better usage.
上级
bcd050f9
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
445 addition
and
28 deletion
+445
-28
litepal/src/main/java/org/litepal/FluentQuery.java
litepal/src/main/java/org/litepal/FluentQuery.java
+28
-28
litepal/src/main/java/org/litepal/extension/FluentQuery.kt
litepal/src/main/java/org/litepal/extension/FluentQuery.kt
+371
-0
litepal/src/main/java/org/litepal/extension/LitePal.kt
litepal/src/main/java/org/litepal/extension/LitePal.kt
+46
-0
未找到文件。
litepal/src/main/java/org/litepal/FluentQuery.java
浏览文件 @
76a7a5b7
...
...
@@ -71,7 +71,7 @@ public class FluentQuery {
* Declaring to query which columns in table.
*
* <pre>
* LitePal
Support
.select("name", "age").find(Person.class);
* LitePal.select("name", "age").find(Person.class);
* </pre>
*
* This will find all rows with name and age columns in Person table.
...
...
@@ -91,7 +91,7 @@ public class FluentQuery {
* Declaring to query which rows in table.
*
* <pre>
* LitePal
Support
.where("name = ? or age > ?", "Tom", "14").find(Person.class);
* LitePal.where("name = ? or age > ?", "Tom", "14").find(Person.class);
* </pre>
*
* This will find rows which name is Tom or age greater than 14 in Person
...
...
@@ -111,7 +111,7 @@ public class FluentQuery {
* Declaring how to order the rows queried from table.
*
* <pre>
* LitePal
Support
.order("name desc").find(Person.class);
* LitePal.order("name desc").find(Person.class);
* </pre>
*
* This will find all rows in Person table sorted by name with inverted
...
...
@@ -132,7 +132,7 @@ public class FluentQuery {
* Limits the number of rows returned by the query.
*
* <pre>
* LitePal
Support
.limit(2).find(Person.class);
* LitePal.limit(2).find(Person.class);
* </pre>
*
* This will find the top 2 rows in Person table.
...
...
@@ -152,7 +152,7 @@ public class FluentQuery {
* used with {@link #limit(int)}, or nothing will return.
*
* <pre>
* LitePal
Support
.limit(1).offset(2).find(Person.class);
* LitePal.limit(1).offset(2).find(Person.class);
* </pre>
*
* This will find the third row in Person table.
...
...
@@ -171,7 +171,7 @@ public class FluentQuery {
* way to finish a complicated query:
*
* <pre>
* LitePal
Support
.select("name").where("age > ?", "14").order("age").limit(1).offset(2)
* LitePal.select("name").where("age > ?", "14").order("age").limit(1).offset(2)
* .find(Person.class);
* </pre>
*
...
...
@@ -271,7 +271,7 @@ public class FluentQuery {
* way to finish a complicated query:
*
* <pre>
* LitePal
Support.select("name").where("age > ?", "14").order("age").limit(1
).offset(2)
* LitePal
.select("name").where("age > ?", "14").order("age").limit(10
).offset(2)
* .findFirst(Person.class);
* </pre>
*
...
...
@@ -357,7 +357,7 @@ public class FluentQuery {
* way to finish a complicated query:
*
* <pre>
* LitePal
Support.select("name").where("age > ?", "14").order("age").limit(1
).offset(2)
* LitePal
.select("name").where("age > ?", "14").order("age").limit(10
).offset(2)
* .findLast(Person.class);
* </pre>
*
...
...
@@ -443,14 +443,14 @@ public class FluentQuery {
* Count the records.
*
* <pre>
* LitePal
Support
.count(Person.class);
* LitePal.count(Person.class);
* </pre>
*
* This will count all rows in person table.<br>
* You can also specify a where clause when counting.
*
* <pre>
* LitePal
Support
.where("age > ?", "15").count(Person.class);
* LitePal.where("age > ?", "15").count(Person.class);
* </pre>
*
* @param modelClass
...
...
@@ -476,14 +476,14 @@ public class FluentQuery {
* Count the records.
*
* <pre>
* LitePal
Support
.count("person");
* LitePal.count("person");
* </pre>
*
* This will count all rows in person table.<br>
* You can also specify a where clause when counting.
*
* <pre>
* LitePal
Support
.where("age > ?", "15").count("person");
* LitePal.where("age > ?", "15").count("person");
* </pre>
*
* @param tableName
...
...
@@ -530,13 +530,13 @@ public class FluentQuery {
* Calculates the average value on a given column.
*
* <pre>
* LitePal
Support
.average(Person.class, "age");
* LitePal.average(Person.class, "age");
* </pre>
*
* You can also specify a where clause when calculating.
*
* <pre>
* LitePal
Support
.where("age > ?", "15").average(Person.class, "age");
* LitePal.where("age > ?", "15").average(Person.class, "age");
* </pre>
*
* @param modelClass
...
...
@@ -566,13 +566,13 @@ public class FluentQuery {
* Calculates the average value on a given column.
*
* <pre>
* LitePal
Support
.average("person", "age");
* LitePal.average("person", "age");
* </pre>
*
* You can also specify a where clause when calculating.
*
* <pre>
* LitePal
Support
.where("age > ?", "15").average("person", "age");
* LitePal.where("age > ?", "15").average("person", "age");
* </pre>
*
* @param tableName
...
...
@@ -624,13 +624,13 @@ public class FluentQuery {
* with the same data type of the column.
*
* <pre>
* LitePal
Support
.max(Person.class, "age", int.class);
* LitePal.max(Person.class, "age", int.class);
* </pre>
*
* You can also specify a where clause when calculating.
*
* <pre>
* LitePal
Support
.where("age > ?", "15").max(Person.class, "age", Integer.TYPE);
* LitePal.where("age > ?", "15").max(Person.class, "age", Integer.TYPE);
* </pre>
*
* @param modelClass
...
...
@@ -665,13 +665,13 @@ public class FluentQuery {
* with the same data type of the column.
*
* <pre>
* LitePal
Support
.max("person", "age", int.class);
* LitePal.max("person", "age", int.class);
* </pre>
*
* You can also specify a where clause when calculating.
*
* <pre>
* LitePal
Support
.where("age > ?", "15").max("person", "age", Integer.TYPE);
* LitePal.where("age > ?", "15").max("person", "age", Integer.TYPE);
* </pre>
*
* @param tableName
...
...
@@ -727,13 +727,13 @@ public class FluentQuery {
* with the same data type of the column.
*
* <pre>
* LitePal
Support
.min(Person.class, "age", int.class);
* LitePal.min(Person.class, "age", int.class);
* </pre>
*
* You can also specify a where clause when calculating.
*
* <pre>
* LitePal
Support
.where("age > ?", "15").min(Person.class, "age", Integer.TYPE);
* LitePal.where("age > ?", "15").min(Person.class, "age", Integer.TYPE);
* </pre>
*
* @param modelClass
...
...
@@ -768,13 +768,13 @@ public class FluentQuery {
* with the same data type of the column.
*
* <pre>
* LitePal
Support
.min("person", "age", int.class);
* LitePal.min("person", "age", int.class);
* </pre>
*
* You can also specify a where clause when calculating.
*
* <pre>
* LitePal
Support
.where("age > ?", "15").min("person", "age", Integer.TYPE);
* LitePal.where("age > ?", "15").min("person", "age", Integer.TYPE);
* </pre>
*
* @param tableName
...
...
@@ -830,13 +830,13 @@ public class FluentQuery {
* with the same data type of the column.
*
* <pre>
* LitePal
Support
.sum(Person.class, "age", int.class);
* LitePal.sum(Person.class, "age", int.class);
* </pre>
*
* You can also specify a where clause when calculating.
*
* <pre>
* LitePal
Support
.where("age > ?", "15").sum(Person.class, "age", Integer.TYPE);
* LitePal.where("age > ?", "15").sum(Person.class, "age", Integer.TYPE);
* </pre>
*
* @param modelClass
...
...
@@ -871,13 +871,13 @@ public class FluentQuery {
* with the same data type of the column.
*
* <pre>
* LitePal
Support
.sum("person", "age", int.class);
* LitePal.sum("person", "age", int.class);
* </pre>
*
* You can also specify a where clause when calculating.
*
* <pre>
* LitePal
Support
.where("age > ?", "15").sum("person", "age", Integer.TYPE);
* LitePal.where("age > ?", "15").sum("person", "age", Integer.TYPE);
* </pre>
*
* @param tableName
...
...
litepal/src/main/java/org/litepal/extension/FluentQuery.kt
0 → 100644
浏览文件 @
76a7a5b7
/*
* Copyright (C) Tony Green, LitePal Framework Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.litepal.extension
import
org.litepal.FluentQuery
import
org.litepal.LitePal
import
org.litepal.crud.async.FindExecutor
/**
* Extension of FluentQuery class for Kotlin api.
* @author Tony Green
* @since 2.1
*/
/**
* Finds multiple records by the cluster parameters. You can use the below
* way to finish a complicated query:
*
* LitePal.select("name").where("age > ?", "14").order("age").limit(1).offset(2).find<Person>()
*
* You can also do the same job with SQLiteDatabase like this:
*
* getSQLiteDatabase().query("Person", "name", "age > ?", new String[] { "14" }, null, null, "age",
* "2,1")
*
* Obviously, the first way is much more semantic.<br>
* Note that the associated models won't be loaded by default considering
* the efficiency, but you can do that by using
* {@link FluentQuery#find(Class, boolean)}.
*
* @return An object list with founded data from database, or an empty list.
*/
inline
fun
<
reified
T
>
FluentQuery
.
find
():
List
<
T
>
=
find
(
T
::
class
.
java
)
/**
* Basically same as {@link #find(Class)} but pending to a new thread for executing.
*
* @return A FindMultiExecutor instance.
*/
inline
fun
<
reified
T
>
FluentQuery
.
findAsync
()
=
findAsync
(
T
::
class
.
java
)
/**
* It is mostly same as {@link FluentQuery#find(Class)} but an isEager
* parameter. If set true the associated models will be loaded as well.
*
* Note that isEager will only work for one deep level relation, considering the query efficiency.
* You have to implement on your own if you need to load multiple deepness of relation at once.
*
* @param isEager
* True to load the associated models, false not.
* @return An object list with founded data from database, or an empty list.
*/
inline
fun
<
reified
T
>
FluentQuery
.
find
(
isEager
:
Boolean
):
List
<
T
>
=
find
(
T
::
class
.
java
,
isEager
)
/**
* Basically same as {@link #find(Class, boolean)} but pending to a new thread for executing.
*
* @param isEager
* True to load the associated models, false not.
* @return A FindMultiExecutor instance.
*/
inline
fun
<
reified
T
>
FluentQuery
.
findAsync
(
isEager
:
Boolean
)
=
findAsync
(
T
::
class
.
java
,
isEager
)
/**
* Finds the first record by the cluster parameters. You can use the below
* way to finish a complicated query:
*
* LitePal.select("name").where("age > ?", "14").order("age").limit(10).offset(2).findFirst<Person>()
*
* Note that the associated models won't be loaded by default considering
* the efficiency, but you can do that by using
* {@link FluentQuery#findFirst(Class, boolean)}.
*
* @return An object with founded data from database, or null.
*/
inline
fun
<
reified
T
>
FluentQuery
.
findFirst
():
T
?
=
findFirst
(
T
::
class
.
java
)
/**
* Basically same as {@link #findFirst(Class)} but pending to a new thread for executing.
*
* @return A FindExecutor instance.
*/
inline
fun
<
reified
T
>
FluentQuery
.
findFirstAsync
():
FindExecutor
<
T
>
=
findFirstAsync
(
T
::
class
.
java
)
/**
* It is mostly same as {@link FluentQuery#findFirst(Class)} but an isEager
* parameter. If set true the associated models will be loaded as well.
*
* Note that isEager will only work for one deep level relation, considering the query efficiency.
* You have to implement on your own if you need to load multiple deepness of relation at once.
*
* @param isEager
* True to load the associated models, false not.
* @return An object with founded data from database, or null.
*/
inline
fun
<
reified
T
>
FluentQuery
.
findFirst
(
isEager
:
Boolean
):
T
?
=
findFirst
(
T
::
class
.
java
,
isEager
)
/**
* Basically same as {@link #findFirst(Class, boolean)} but pending to a new thread for executing.
*
* @param isEager
* True to load the associated models, false not.
* @return A FindExecutor instance.
*/
inline
fun
<
reified
T
>
FluentQuery
.
findFirstAsync
(
isEager
:
Boolean
):
FindExecutor
<
T
>
=
findFirstAsync
(
T
::
class
.
java
,
isEager
)
/**
* Finds the last record by the cluster parameters. You can use the below
* way to finish a complicated query:
*
* LitePal.select("name").where("age > ?", "14").order("age").limit(10).offset(2).findLast<Person>()
*
* Note that the associated models won't be loaded by default considering
* the efficiency, but you can do that by using
* {@link FluentQuery#findLast(Class, boolean)}.
*
* @return An object with founded data from database, or null.
*/
inline
fun
<
reified
T
>
FluentQuery
.
findLast
():
T
?
=
findLast
(
T
::
class
.
java
)
/**
* Basically same as {@link #findLast(Class)} but pending to a new thread for executing.
*
* @return A FindExecutor instance.
*/
inline
fun
<
reified
T
>
FluentQuery
.
findLastAsync
():
FindExecutor
<
T
>
=
findLastAsync
(
T
::
class
.
java
)
/**
* It is mostly same as {@link FluentQuery#findLast(Class)} but an isEager
* parameter. If set true the associated models will be loaded as well.
*
* Note that isEager will only work for one deep level relation, considering the query efficiency.
* You have to implement on your own if you need to load multiple deepness of relation at once.
*
* @param isEager
* True to load the associated models, false not.
* @return An object with founded data from database, or null.
*/
inline
fun
<
reified
T
>
FluentQuery
.
findLast
(
isEager
:
Boolean
):
T
?
=
findLast
(
T
::
class
.
java
,
isEager
)
/**
* Basically same as {@link #findLast(Class, boolean)} but pending to a new thread for executing.
*
* @param isEager
* True to load the associated models, false not.
* @return A FindExecutor instance.
*/
inline
fun
<
reified
T
>
FluentQuery
.
findLastAsync
(
isEager
:
Boolean
):
FindExecutor
<
T
>
=
findLastAsync
(
T
::
class
.
java
,
isEager
)
/**
* Count the records.
*
* LitePal.count<Person>()
*
* This will count all rows in person table.
*
* You can also specify a where clause when counting.
*
* LitePal.where("age > ?", "15").count<Person>()
*
* @return Count of the specified table.
*/
inline
fun
<
reified
T
>
FluentQuery
.
count
()
=
count
(
T
::
class
.
java
)
/**
* Basically same as [LitePal.count] but pending to a new thread for executing.
*
* @return A CountExecutor instance.
*/
inline
fun
<
reified
T
>
FluentQuery
.
countAsync
()
=
countAsync
(
T
::
class
.
java
)
/**
* Calculates the average value on a given column.
*
* LitePal.average<Person>("age")
*
* You can also specify a where clause when calculating.
*
* LitePal.where("age > ?", "15").average<Person>("age")
*
* @param column
* The based on column to calculate.
* @return The average value on a given column.
*/
inline
fun
<
reified
T
>
FluentQuery
.
average
(
column
:
String
)
=
average
(
T
::
class
.
java
,
column
)
/**
* Basically same as [LitePal.average] but pending to a new thread for executing.
*
* @param column
* The based on column to calculate.
* @return A AverageExecutor instance.
*/
inline
fun
<
reified
T
>
FluentQuery
.
averageAsync
(
column
:
String
)
=
averageAsync
(
T
::
class
.
java
,
column
)
/**
* Calculates the maximum value on a given column. The value is returned
* with the same data type of the column.
*
* LitePal.max<Person, Int>("age")
*
* You can also specify a where clause when calculating.
*
* LitePal.where("age > ?", "15").max<Person, Int>("age")
*
* @param columnName
* The based on column to calculate.
*
* @return The maximum value on a given column.
*/
inline
fun
<
reified
T
,
reified
R
>
FluentQuery
.
max
(
columnName
:
String
):
R
=
max
(
T
::
class
.
java
,
columnName
,
R
::
class
.
java
)
/**
* Basically same as [LitePal.max] but pending to a new thread for executing.
*
* @param columnName
* The based on column to calculate.
* @return A FindExecutor instance.
*/
inline
fun
<
reified
T
,
reified
R
>
FluentQuery
.
maxAsync
(
columnName
:
String
)
=
maxAsync
(
T
::
class
.
java
,
columnName
,
R
::
class
.
java
)
/**
* Calculates the maximum value on a given column. The value is returned
* with the same data type of the column.
*
* LitePal.max<Int>("person", "age")
*
* You can also specify a where clause when calculating.
*
* LitePal.where("age > ?", "15").max<Int>("person", "age")
*
* @param tableName
* Which table to query from.
* @param columnName
* The based on column to calculate.
* @return The maximum value on a given column.
*/
inline
fun
<
reified
R
>
FluentQuery
.
max
(
tableName
:
String
,
columnName
:
String
):
R
=
max
(
tableName
,
columnName
,
R
::
class
.
java
)
/**
* Basically same as [LitePal.max] but pending to a new thread for executing.
*
* @param tableName
* Which table to query from.
* @param columnName
* The based on column to calculate.
* @return A FindExecutor instance.
*/
inline
fun
<
reified
R
>
FluentQuery
.
maxAsync
(
tableName
:
String
,
columnName
:
String
)
=
maxAsync
(
tableName
,
columnName
,
R
::
class
.
java
)
/**
* Calculates the minimum value on a given column. The value is returned
* with the same data type of the column.
*
* LitePal.min<Person, Int>("age")
*
* You can also specify a where clause when calculating.
*
* LitePal.where("age > ?", "15").min<Person, Int>("age")
*
* @param columnName
* The based on column to calculate.
* @return The minimum value on a given column.
*/
inline
fun
<
reified
T
,
reified
R
>
FluentQuery
.
min
(
columnName
:
String
):
R
=
min
(
T
::
class
.
java
,
columnName
,
R
::
class
.
java
)
/**
* Basically same as [LitePal.min] but pending to a new thread for executing.
*
* @param columnName
* The based on column to calculate.
* @return A FindExecutor instance.
*/
inline
fun
<
reified
T
,
reified
R
>
FluentQuery
.
minAsync
(
columnName
:
String
)
=
minAsync
(
T
::
class
.
java
,
columnName
,
R
::
class
.
java
)
/**
* Calculates the minimum value on a given column. The value is returned
* with the same data type of the column.
*
* LitePal.min<Int>("person", "age")
*
* You can also specify a where clause when calculating.
*
* LitePal.where("age > ?", "15").min<Int>("person", "age")
*
* @param tableName
* Which table to query from.
* @param columnName
* The based on column to calculate.
* @return The minimum value on a given column.
*/
inline
fun
<
reified
R
>
FluentQuery
.
min
(
tableName
:
String
,
columnName
:
String
):
R
=
min
(
tableName
,
columnName
,
R
::
class
.
java
)
/**
* Basically same as [LitePal.min] but pending to a new thread for executing.
*
* @param tableName
* Which table to query from.
* @param columnName
* The based on column to calculate.
* @return A FindExecutor instance.
*/
inline
fun
<
reified
R
>
FluentQuery
.
minAsync
(
tableName
:
String
,
columnName
:
String
)
=
minAsync
(
tableName
,
columnName
,
R
::
class
.
java
)
/**
* Calculates the sum of values on a given column. The value is returned
* with the same data type of the column.
*
* LitePal.sum<Person, Int>("age")
*
* You can also specify a where clause when calculating.
*
* LitePal.where("age > ?", "15").sum<Person, Int>("age")
*
* @param columnName
* The based on column to calculate.
* @return The sum value on a given column.
*/
inline
fun
<
reified
T
,
reified
R
>
FluentQuery
.
sum
(
columnName
:
String
):
R
=
sum
(
T
::
class
.
java
,
columnName
,
R
::
class
.
java
)
/**
* Basically same as [LitePal.sum] but pending to a new thread for executing.
*
* @param columnName
* The based on column to calculate.
* @return A FindExecutor instance.
*/
inline
fun
<
reified
T
,
reified
R
>
FluentQuery
.
sumAsync
(
columnName
:
String
)
=
sumAsync
(
T
::
class
.
java
,
columnName
,
R
::
class
.
java
)
/**
* Calculates the sum of values on a given column. The value is returned
* with the same data type of the column.
*
* LitePal.sum<Int>("person", "age")
*
* You can also specify a where clause when calculating.
*
* LitePal.where("age > ?", "15").sum<Int>("person", "age")
*
* @param tableName
* Which table to query from.
* @param columnName
* The based on column to calculate.
* @return The sum value on a given column.
*/
inline
fun
<
reified
R
>
FluentQuery
.
sum
(
tableName
:
String
,
columnName
:
String
):
R
=
sum
(
tableName
,
columnName
,
R
::
class
.
java
)
/**
* Basically same as [LitePal.sum] but pending to a new thread for executing.
*
* @param tableName
* Which table to query from.
* @param columnName
* The based on column to calculate.
* @return A FindExecutor instance.
*/
inline
fun
<
reified
R
>
FluentQuery
.
sumAsync
(
tableName
:
String
,
columnName
:
String
)
=
sumAsync
(
tableName
,
columnName
,
R
::
class
.
java
)
\ No newline at end of file
litepal/src/main/java/org/litepal/extension/LitePal.kt
浏览文件 @
76a7a5b7
...
...
@@ -25,6 +25,52 @@ import org.litepal.LitePal
* @since 2.1
*/
/**
* Count the records.
*
* LitePal.count<Person>()
*
* This will count all rows in person table.
*
* You can also specify a where clause when counting.
*
* LitePal.where("age > ?", "15").count<Person>()
*
* @return Count of the specified table.
*/
inline
fun
<
reified
T
>
LitePal
.
count
()
=
count
(
T
::
class
.
java
)
/**
* Basically same as [LitePal.count] but pending to a new thread for executing.
*
* @return A CountExecutor instance.
*/
inline
fun
<
reified
T
>
LitePal
.
countAsync
()
=
countAsync
(
T
::
class
.
java
)
/**
* Calculates the average value on a given column.
*
* LitePal.average<Person>("age")
*
* You can also specify a where clause when calculating.
*
* LitePal.where("age > ?", "15").average<Person>("age")
*
* @param column
* The based on column to calculate.
* @return The average value on a given column.
*/
inline
fun
<
reified
T
>
LitePal
.
average
(
column
:
String
)
=
average
(
T
::
class
.
java
,
column
)
/**
* Basically same as [LitePal.average] but pending to a new thread for executing.
*
* @param column
* The based on column to calculate.
* @return A AverageExecutor instance.
*/
inline
fun
<
reified
T
>
LitePal
.
averageAsync
(
column
:
String
)
=
averageAsync
(
T
::
class
.
java
,
column
)
/**
* Calculates the maximum value on a given column. The value is returned
* with the same data type of the column.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录