Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
suliangchun
dbeaver
提交
b2f86a24
D
dbeaver
项目概览
suliangchun
/
dbeaver
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dbeaver
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
b2f86a24
编写于
3月 31, 2022
作者:
S
serge-rider
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Revert "dbeaver/dbeaver-ee#1523 restructure notifications (#15947)"
This reverts commit
63c83096
上级
2d75f862
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
65 addition
and
55 deletion
+65
-55
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/sql/task/SQLScriptExecuteHandler.java
...jkiss/dbeaver/tools/sql/task/SQLScriptExecuteHandler.java
+3
-2
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/DataTransferJob.java
...src/org/jkiss/dbeaver/tools/transfer/DataTransferJob.java
+2
-1
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/task/DTTaskHandlerTransfer.java
...ss/dbeaver/tools/transfer/task/DTTaskHandlerTransfer.java
+4
-2
plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/tasks/MySQLNativeToolHandler.java
...jkiss/dbeaver/ext/mysql/tasks/MySQLNativeToolHandler.java
+2
-2
plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/task/SQLToolExecuteHandler.java
...g/jkiss/dbeaver/model/sql/task/SQLToolExecuteHandler.java
+3
-2
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/task/DBTTaskExecutionListener.java
...rg/jkiss/dbeaver/model/task/DBTTaskExecutionListener.java
+2
-2
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/task/DBTTaskHandler.java
...odel/src/org/jkiss/dbeaver/model/task/DBTTaskHandler.java
+2
-1
plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/task/TaskRunJob.java
...istry/src/org/jkiss/dbeaver/registry/task/TaskRunJob.java
+5
-6
plugins/org.jkiss.dbeaver.tasks.native/src/org/jkiss/dbeaver/tasks/nativetool/AbstractNativeToolHandler.java
...s/dbeaver/tasks/nativetool/AbstractNativeToolHandler.java
+33
-4
plugins/org.jkiss.dbeaver.tasks.ui/META-INF/MANIFEST.MF
plugins/org.jkiss.dbeaver.tasks.ui/META-INF/MANIFEST.MF
+1
-2
plugins/org.jkiss.dbeaver.tasks.ui/src/org/jkiss/dbeaver/tasks/ui/wizard/TaskProcessorUI.java
...rc/org/jkiss/dbeaver/tasks/ui/wizard/TaskProcessorUI.java
+7
-30
plugins/org.jkiss.dbeaver.tasks.ui/src/org/jkiss/dbeaver/tasks/ui/wizard/TaskWizardExecutor.java
...org/jkiss/dbeaver/tasks/ui/wizard/TaskWizardExecutor.java
+1
-1
未找到文件。
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/sql/task/SQLScriptExecuteHandler.java
浏览文件 @
b2f86a24
...
...
@@ -59,7 +59,8 @@ public class SQLScriptExecuteHandler implements DBTTaskHandler {
@NotNull
Locale
locale
,
@NotNull
Log
log
,
@NotNull
PrintStream
logStream
,
@NotNull
DBTTaskExecutionListener
listener
)
throws
DBException
@NotNull
DBTTaskExecutionListener
listener
,
boolean
showNotifications
)
throws
DBException
{
SQLScriptExecuteSettings
settings
=
new
SQLScriptExecuteSettings
();
settings
.
loadConfiguration
(
runnableContext
,
task
.
getProperties
());
...
...
@@ -89,7 +90,7 @@ public class SQLScriptExecuteHandler implements DBTTaskHandler {
if
(
error
!=
null
)
{
log
.
error
(
error
);
}
listener
.
taskFinished
(
task
,
null
,
error
,
settings
);
listener
.
taskFinished
(
settings
,
null
,
error
);
log
.
debug
(
"SQL script execute completed"
);
}
...
...
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/DataTransferJob.java
浏览文件 @
b2f86a24
...
...
@@ -87,11 +87,12 @@ public class DataTransferJob implements DBRRunnableWithProgress {
hasErrors
=
true
;
}
}
catch
(
Exception
e
)
{
listener
.
subTaskFinished
(
e
);
throw
new
InvocationTargetException
(
e
);
}
}
monitor
.
done
();
// listener.subTaskFinished(task,
null);
listener
.
subTaskFinished
(
null
);
elapsedTime
=
System
.
currentTimeMillis
()
-
startTime
;
}
...
...
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/task/DTTaskHandlerTransfer.java
浏览文件 @
b2f86a24
...
...
@@ -55,7 +55,8 @@ public class DTTaskHandlerTransfer implements DBTTaskHandler {
@NotNull
Locale
locale
,
@NotNull
Log
log
,
@NotNull
PrintStream
logStream
,
@NotNull
DBTTaskExecutionListener
listener
)
throws
DBException
@NotNull
DBTTaskExecutionListener
listener
,
boolean
showNotifications
)
throws
DBException
{
DataTransferSettings
[]
settings
=
new
DataTransferSettings
[
1
];
try
{
...
...
@@ -81,7 +82,7 @@ public class DTTaskHandlerTransfer implements DBTTaskHandler {
try
{
indexOfLastPipeWithDisabledReferentialIntegrity
=
initializePipes
(
runnableContext
,
settings
);
Throwable
error
=
runDataTransferJobs
(
runnableContext
,
task
,
locale
,
log
,
listener
,
settings
);
listener
.
taskFinished
(
task
,
null
,
error
,
settings
);
listener
.
taskFinished
(
settings
,
null
,
error
);
}
catch
(
InvocationTargetException
e
)
{
DBWorkbench
.
getPlatformUI
().
showError
(
DTMessages
.
data_transfer_task_handler_unexpected_error_title
,
...
...
@@ -150,6 +151,7 @@ public class DTTaskHandlerTransfer implements DBTTaskHandler {
}
catch
(
InterruptedException
e
)
{
break
;
}
listener
.
subTaskFinished
(
error
);
}
return
error
;
}
...
...
plugins/org.jkiss.dbeaver.ext.mysql/src/org/jkiss/dbeaver/ext/mysql/tasks/MySQLNativeToolHandler.java
浏览文件 @
b2f86a24
...
...
@@ -42,9 +42,9 @@ public abstract class MySQLNativeToolHandler<SETTINGS extends AbstractNativeTool
private
File
config
;
@Override
protected
boolean
doExecute
(
DBRProgressMonitor
monitor
,
DBTTask
task
,
SETTINGS
settings
,
Log
log
)
throws
DBException
,
InterruptedException
{
protected
boolean
doExecute
(
DBRProgressMonitor
monitor
,
DBTTask
task
,
SETTINGS
settings
,
Log
log
,
boolean
showNotifications
)
throws
DBException
,
InterruptedException
{
try
{
return
super
.
doExecute
(
monitor
,
task
,
settings
,
log
);
return
super
.
doExecute
(
monitor
,
task
,
settings
,
log
,
showNotifications
);
}
finally
{
if
(
config
!=
null
&&
!
config
.
delete
())
{
log
.
debug
(
"Failed to delete configuration file"
);
...
...
plugins/org.jkiss.dbeaver.model.sql/src/org/jkiss/dbeaver/model/sql/task/SQLToolExecuteHandler.java
浏览文件 @
b2f86a24
...
...
@@ -59,7 +59,8 @@ public abstract class SQLToolExecuteHandler<OBJECT_TYPE extends DBSObject, SETTI
@NotNull
Locale
locale
,
@NotNull
Log
log
,
@NotNull
PrintStream
logStream
,
@NotNull
DBTTaskExecutionListener
listener
)
throws
DBException
@NotNull
DBTTaskExecutionListener
listener
,
boolean
showNotifications
)
throws
DBException
{
SETTINGS
settings
=
createToolSettings
();
settings
.
loadConfiguration
(
runnableContext
,
task
.
getProperties
());
...
...
@@ -209,7 +210,7 @@ public abstract class SQLToolExecuteHandler<OBJECT_TYPE extends DBSObject, SETTI
}
finally
{
monitor
.
done
();
}
listener
.
taskFinished
(
task
,
null
,
lastError
,
settings
);
listener
.
taskFinished
(
settings
,
null
,
lastError
);
outLog
.
println
(
"Tool execution finished"
);
outLog
.
flush
();
...
...
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/task/DBTTaskExecutionListener.java
浏览文件 @
b2f86a24
...
...
@@ -26,8 +26,8 @@ public interface DBTTaskExecutionListener {
void
taskStarted
(
@NotNull
Object
task
);
void
taskFinished
(
@NotNull
DBTTask
task
,
@Nullable
Object
result
,
@Nullable
Throwable
error
,
@Nullable
Object
settings
);
void
taskFinished
(
@NotNull
Object
task
,
@Nullable
Object
result
,
@Nullable
Throwable
error
);
void
subTaskFinished
(
@N
otNull
DBTTask
task
,
@Nullable
Throwable
error
,
@Nullable
Object
settings
);
void
subTaskFinished
(
@N
ullable
Throwable
error
);
}
plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/task/DBTTaskHandler.java
浏览文件 @
b2f86a24
...
...
@@ -36,7 +36,8 @@ public interface DBTTaskHandler {
@NotNull
Locale
locale
,
@NotNull
Log
log
,
@NotNull
PrintStream
logStream
,
@NotNull
DBTTaskExecutionListener
listener
)
@NotNull
DBTTaskExecutionListener
listener
,
boolean
showNotifications
)
throws
DBException
;
...
...
plugins/org.jkiss.dbeaver.registry/src/org/jkiss/dbeaver/registry/task/TaskRunJob.java
浏览文件 @
b2f86a24
...
...
@@ -23,7 +23,6 @@ import org.jkiss.code.Nullable;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.Log
;
import
org.jkiss.dbeaver.model.runtime.*
;
import
org.jkiss.dbeaver.model.task.DBTTask
;
import
org.jkiss.dbeaver.model.task.DBTTaskExecutionListener
;
import
org.jkiss.dbeaver.model.task.DBTTaskHandler
;
import
org.jkiss.dbeaver.model.task.DBTTaskRunStatus
;
...
...
@@ -124,7 +123,7 @@ public class TaskRunJob extends AbstractJob implements DBRRunnableContext {
private
DBTTaskRunStatus
executeTask
(
DBRProgressMonitor
monitor
,
PrintStream
logWriter
)
throws
DBException
{
activeMonitor
=
monitor
;
DBTTaskHandler
taskHandler
=
task
.
getType
().
createHandler
();
return
taskHandler
.
executeTask
(
this
,
task
,
locale
,
taskLog
,
logWriter
,
executionListener
);
return
taskHandler
.
executeTask
(
this
,
task
,
locale
,
taskLog
,
logWriter
,
executionListener
,
true
);
}
@Override
...
...
@@ -165,15 +164,15 @@ public class TaskRunJob extends AbstractJob implements DBRRunnableContext {
}
@Override
public
void
taskFinished
(
@NotNull
DBTTask
task
,
@Nullable
Object
result
,
@Nullable
Throwable
error
,
@Nullable
Object
settings
)
{
parent
.
taskFinished
(
task
,
result
,
error
,
settings
);
public
void
taskFinished
(
@NotNull
Object
task
,
@Nullable
Object
result
,
@Nullable
Throwable
error
)
{
parent
.
taskFinished
(
task
,
result
,
error
);
elapsedTime
=
System
.
currentTimeMillis
()
-
startTime
;
taskError
=
error
;
}
@Override
public
void
subTaskFinished
(
@N
otNull
DBTTask
task
,
@Nullable
Throwable
error
,
@Nullable
Object
settings
)
{
parent
.
subTaskFinished
(
task
,
error
,
settings
);
public
void
subTaskFinished
(
@N
ullable
Throwable
error
)
{
parent
.
subTaskFinished
(
error
);
}
}
...
...
plugins/org.jkiss.dbeaver.tasks.native/src/org/jkiss/dbeaver/tasks/nativetool/AbstractNativeToolHandler.java
浏览文件 @
b2f86a24
...
...
@@ -60,7 +60,8 @@ public abstract class AbstractNativeToolHandler<SETTINGS extends AbstractNativeT
@NotNull
Locale
locale
,
@NotNull
Log
log
,
@NotNull
PrintStream
logStream
,
@NotNull
DBTTaskExecutionListener
listener
)
throws
DBException
{
@NotNull
DBTTaskExecutionListener
listener
,
boolean
showNotifications
)
throws
DBException
{
SETTINGS
settings
=
createTaskSettings
(
runnableContext
,
task
);
settings
.
setLogWriter
(
logStream
);
if
(!
validateTaskParameters
(
task
,
settings
,
log
))
{
...
...
@@ -75,11 +76,11 @@ public abstract class AbstractNativeToolHandler<SETTINGS extends AbstractNativeT
listener
.
taskStarted
(
task
);
Throwable
error
=
null
;
try
{
doExecute
(
monitor
,
task
,
settings
,
log
);
doExecute
(
monitor
,
task
,
settings
,
log
,
showNotifications
);
}
catch
(
Exception
e
)
{
error
=
e
;
}
finally
{
listener
.
taskFinished
(
task
,
null
,
error
,
settings
);
listener
.
taskFinished
(
settings
,
null
,
error
);
Log
.
setLogWriter
(
null
);
monitor
.
worked
(
1
);
...
...
@@ -241,7 +242,27 @@ public abstract class AbstractNativeToolHandler<SETTINGS extends AbstractNativeT
}
}
protected
boolean
doExecute
(
DBRProgressMonitor
monitor
,
DBTTask
task
,
SETTINGS
settings
,
Log
log
)
throws
DBException
,
InterruptedException
{
protected
void
onSuccess
(
DBTTask
task
,
SETTINGS
settings
,
long
workTime
)
{
StringBuilder
message
=
new
StringBuilder
();
message
.
append
(
"Task ["
).
append
(
task
.
getName
()).
append
(
"] is completed ("
).
append
(
workTime
).
append
(
"ms)"
);
List
<
String
>
objNames
=
new
ArrayList
<>();
for
(
BASE_OBJECT
obj
:
settings
.
getDatabaseObjects
())
{
objNames
.
add
(
obj
.
getName
());
}
message
.
append
(
"\nObject(s) processed: "
).
append
(
String
.
join
(
","
,
objNames
));
DBWorkbench
.
getPlatformUI
().
showNotification
(
task
.
getName
(),
message
.
toString
(),
false
);
}
protected
void
onError
(
DBTTask
task
,
SETTINGS
settings
,
long
workTime
)
{
// DBWorkbench.getPlatformUI().showError(
// taskTitle,
// errorMessage == null ? "Internal error" : errorMessage,
// SWT.ICON_ERROR);
}
protected
boolean
doExecute
(
DBRProgressMonitor
monitor
,
DBTTask
task
,
SETTINGS
settings
,
Log
log
,
boolean
showNotifications
)
throws
DBException
,
InterruptedException
{
validateClientHome
(
monitor
,
settings
);
long
startTime
=
System
.
currentTimeMillis
();
...
...
@@ -277,6 +298,14 @@ public abstract class AbstractNativeToolHandler<SETTINGS extends AbstractNativeT
long
workTime
=
System
.
currentTimeMillis
()
-
startTime
;
notifyToolFinish
(
task
.
getType
().
getName
()
+
" - "
+
task
.
getName
()
+
" has finished"
,
workTime
);
if
(
isSuccess
)
{
if
(
showNotifications
)
{
onSuccess
(
task
,
settings
,
workTime
);
}
}
else
{
onError
(
task
,
settings
,
workTime
);
}
return
isSuccess
;
}
...
...
plugins/org.jkiss.dbeaver.tasks.ui/META-INF/MANIFEST.MF
浏览文件 @
b2f86a24
...
...
@@ -21,8 +21,7 @@ Require-Bundle: org.eclipse.core.runtime,
org.jkiss.dbeaver.registry,
org.jkiss.dbeaver.ui,
org.jkiss.dbeaver.ui.navigator,
org.jkiss.dbeaver.ui.editors.base,
org.jkiss.dbeaver.tasks.native
org.jkiss.dbeaver.ui.editors.base
Export-Package: org.jkiss.dbeaver.tasks.ui,
org.jkiss.dbeaver.tasks.ui.registry,
org.jkiss.dbeaver.tasks.ui.wizard,
...
...
plugins/org.jkiss.dbeaver.tasks.ui/src/org/jkiss/dbeaver/tasks/ui/wizard/TaskProcessorUI.java
浏览文件 @
b2f86a24
...
...
@@ -25,20 +25,16 @@ import org.jkiss.dbeaver.Log;
import
org.jkiss.dbeaver.model.DBPMessageType
;
import
org.jkiss.dbeaver.model.runtime.DBRRunnableContext
;
import
org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress
;
import
org.jkiss.dbeaver.model.struct.DBSObject
;
import
org.jkiss.dbeaver.model.task.DBTTask
;
import
org.jkiss.dbeaver.model.task.DBTTaskExecutionListener
;
import
org.jkiss.dbeaver.runtime.DBWorkbench
;
import
org.jkiss.dbeaver.runtime.DBeaverNotifications
;
import
org.jkiss.dbeaver.runtime.ui.DBPPlatformUI
;
import
org.jkiss.dbeaver.tasks.nativetool.AbstractNativeToolSettings
;
import
org.jkiss.dbeaver.tasks.ui.internal.TaskUIMessages
;
import
org.jkiss.dbeaver.ui.UIUtils
;
import
org.jkiss.dbeaver.utils.RuntimeUtils
;
import
java.lang.reflect.InvocationTargetException
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
TaskProcessorUI
implements
DBRRunnableContext
,
DBTTaskExecutionListener
{
private
static
final
Log
log
=
Log
.
getLog
(
TaskProcessorUI
.
class
);
...
...
@@ -49,7 +45,6 @@ public class TaskProcessorUI implements DBRRunnableContext, DBTTaskExecutionList
private
DBRRunnableContext
staticContext
;
private
long
startTime
;
private
boolean
started
;
private
long
timeSincePreviousTask
;
public
TaskProcessorUI
(
@NotNull
DBRRunnableContext
staticContext
,
@NotNull
DBTTask
task
)
{
this
.
staticContext
=
staticContext
;
...
...
@@ -77,60 +72,42 @@ public class TaskProcessorUI implements DBRRunnableContext, DBTTaskExecutionList
public
void
taskStarted
(
@NotNull
Object
task
)
{
this
.
started
=
true
;
this
.
startTime
=
System
.
currentTimeMillis
();
this
.
timeSincePreviousTask
=
startTime
;
}
@Override
public
void
taskFinished
(
@NotNull
DBTTask
task
,
@Nullable
Object
result
,
@Nullable
Throwable
error
,
@Nullable
Object
settings
)
{
public
void
taskFinished
(
@NotNull
Object
task
,
@Nullable
Object
result
,
@Nullable
Throwable
error
)
{
this
.
started
=
false
;
long
elapsedTime
=
System
.
currentTimeMillis
()
-
startTime
;
sendNotification
(
task
,
error
,
elapsedTime
,
settings
);
}
private
void
sendNotification
(
@NotNull
DBTTask
task
,
@Nullable
Throwable
error
,
long
elapsedTime
,
@Nullable
Object
settings
)
{
UIUtils
.
asyncExec
(()
->
{
// Make a sound
Display
.
getCurrent
().
beep
();
// Notify agent
boolean
hasErrors
=
error
!=
null
;
DBPPlatformUI
platformUI
=
DBWorkbench
.
getPlatformUI
();
StringBuilder
completeMessage
=
new
StringBuilder
();
completeMessage
.
append
(
task
.
getType
().
getName
()).
append
(
" "
).
append
(
TaskUIMessages
.
task_processor_ui_message_task_completed
).
append
(
" ("
).
append
(
RuntimeUtils
.
formatExecutionTime
(
elapsedTime
)).
append
(
")"
);
List
<
String
>
objects
=
new
ArrayList
<>();
if
(
settings
instanceof
AbstractNativeToolSettings
)
{
for
(
DBSObject
databaseObject
:
((
AbstractNativeToolSettings
<?>)
settings
).
getDatabaseObjects
())
{
objects
.
add
(
databaseObject
.
getName
());
}
completeMessage
.
append
(
"\nObject(s) processed: "
).
append
(
String
.
join
(
","
,
objects
));
}
String
completeMessage
=
this
.
task
.
getType
().
getName
()
+
" "
+
TaskUIMessages
.
task_processor_ui_message_task_completed
+
" ("
+
RuntimeUtils
.
formatExecutionTime
(
elapsedTime
)
+
")"
;
if
(
elapsedTime
>
platformUI
.
getLongOperationTimeout
()
*
1000
)
{
platformUI
.
notifyAgent
(
completeMessage
.
toString
()
,
!
hasErrors
?
IStatus
.
INFO
:
IStatus
.
ERROR
);
completeMessage
,
!
hasErrors
?
IStatus
.
INFO
:
IStatus
.
ERROR
);
}
if
(
isShowFinalMessage
()
&&
!
hasErrors
)
{
// Show message box
DBeaverNotifications
.
showNotification
(
"task"
,
task
.
getName
(),
completeMessage
.
toString
()
,
t
his
.
t
ask
.
getName
(),
completeMessage
,
DBPMessageType
.
INFORMATION
,
null
);
}
else
if
(
error
!=
null
)
{
DBWorkbench
.
getPlatformUI
().
showError
(
"Task error"
,
"Task execution failed"
,
error
);
}
});
}
}
@Override
public
void
subTaskFinished
(
@NotNull
DBTTask
task
,
@Nullable
Throwable
error
,
@Nullable
Object
settings
)
{
long
elapsedTime
=
System
.
currentTimeMillis
()
-
timeSincePreviousTask
;
timeSincePreviousTask
=
System
.
currentTimeMillis
();
sendNotification
(
task
,
error
,
elapsedTime
,
settings
);
public
void
subTaskFinished
(
@Nullable
Throwable
error
)
{
}
...
...
plugins/org.jkiss.dbeaver.tasks.ui/src/org/jkiss/dbeaver/tasks/ui/wizard/TaskWizardExecutor.java
浏览文件 @
b2f86a24
...
...
@@ -46,7 +46,7 @@ public class TaskWizardExecutor extends TaskProcessorUI {
@Override
protected
void
runTask
()
throws
DBException
{
DBTTaskHandler
handlerTransfer
=
getTask
().
getType
().
createHandler
();
handlerTransfer
.
executeTask
(
this
,
getTask
(),
Locale
.
getDefault
(),
log
,
logWriter
,
this
);
handlerTransfer
.
executeTask
(
this
,
getTask
(),
Locale
.
getDefault
(),
log
,
logWriter
,
this
,
true
);
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录