Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
apaas-ui
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gzga-jzapi
apaas-ui
Commits
3bc708ea
Commit
3bc708ea
authored
Jul 01, 2020
by
张俊
Browse files
Options
Browse Files
Download
Plain Diff
合并
parents
1adcb9f9
d4249333
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
285 additions
and
64 deletions
+285
-64
src/pages/workbench/fwgl/serviceEdit.vue
src/pages/workbench/fwgl/serviceEdit.vue
+3
-2
src/pages/workbench/yygl/deployment.vue
src/pages/workbench/yygl/deployment.vue
+282
-62
No files found.
src/pages/workbench/fwgl/serviceEdit.vue
View file @
3bc708ea
...
@@ -69,7 +69,7 @@
...
@@ -69,7 +69,7 @@
<p
class=
"formname"
>
接口编码:
</p>
<p
class=
"formname"
>
接口编码:
</p>
<el-input
v-model=
"form.code"
></el-input>
<el-input
v-model=
"form.code"
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
v-if=
"now_user==2"
prop=
"people"
:rules=
"[
<
!--
<
el-form-item
v-if=
"now_user==2"
prop=
"people"
:rules=
"[
{ required: true, message: '请输入发布人', trigger: 'blur' },
{ required: true, message: '请输入发布人', trigger: 'blur' },
]">
]">
<p
class=
"formname"
>
发布人:
</p>
<p
class=
"formname"
>
发布人:
</p>
...
@@ -80,7 +80,7 @@
...
@@ -80,7 +80,7 @@
]">
]">
<p
class=
"formname"
>
联系方式:
</p>
<p
class=
"formname"
>
联系方式:
</p>
<el-input
v-model=
"form.phone"
></el-input>
<el-input
v-model=
"form.phone"
></el-input>
</el-form-item>
</el-form-item>
-->
<el-form-item
prop=
"resource"
>
<el-form-item
prop=
"resource"
>
<p
class=
"formname"
>
开放程度:
</p>
<p
class=
"formname"
>
开放程度:
</p>
<el-radio-group
v-model=
"form.resource"
>
<el-radio-group
v-model=
"form.resource"
>
...
@@ -395,6 +395,7 @@ export default {
...
@@ -395,6 +395,7 @@ export default {
if
(
valid
)
{
if
(
valid
)
{
this
.
setService
()
this
.
setService
()
}
else
{
}
else
{
this
.
$message
.
error
(
'
请填写完整表单
'
)
console
.
log
(
'
error submit!!
'
);
console
.
log
(
'
error submit!!
'
);
return
false
;
return
false
;
}
}
...
...
src/pages/workbench/yygl/deployment.vue
View file @
3bc708ea
...
@@ -36,7 +36,7 @@
...
@@ -36,7 +36,7 @@
<el-option
<el-option
v-for=
"item in area_options"
v-for=
"item in area_options"
:key=
"item.value"
:key=
"item.value"
:label=
"item.
label
"
:label=
"item.
text
"
:value=
"item.value"
:value=
"item.value"
>
>
</el-option>
</el-option>
...
@@ -50,7 +50,7 @@
...
@@ -50,7 +50,7 @@
</el-form-item>
</el-form-item>
</el-form>
</el-form>
<div
class=
"apass_button step_action"
>
<div
class=
"apass_button step_action"
>
<el-button
type=
"primary"
@
click=
"sub_yy_form('step1_form'
)"
>
<el-button
type=
"primary"
:disabled=
"is_loading"
@
click=
"sub_yy_form('step1_form',1
)"
>
下一步
下一步
</el-button>
</el-button>
</div>
</div>
...
@@ -66,36 +66,35 @@
...
@@ -66,36 +66,35 @@
ref=
"step2_form"
ref=
"step2_form"
class=
"step_form"
class=
"step_form"
label-position=
"top"
label-position=
"top"
:model=
"app_set"
:rules=
"app_set_rules"
:rules=
"app_set_rules"
>
>
<el-form-item
label=
"标题:"
prop=
"title"
>
<div
v-for=
"(item,index) in step2_arr"
:key=
"index+10000"
>
<el-form-item
:label=
"item.text"
v-if=
"item.type=='text'"
>
<el-input
<el-input
v-model=
"app_set.title"
v-model=
"item.value"
placeholder=
"请输入标题"
></el-input>
></el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"镜像版本:"
prop=
"vision
"
>
<el-form-item
:label=
"item.text"
v-if=
"item.type=='radio'
"
>
<div
<div
:class=
"
{ select_box: true, is_select:
app_set.vision
== vision }"
:class=
"
{ select_box: true, is_select:
item.val
== vision }"
v-for="vision in
vision_arr
"
v-for="vision in
item.value
"
:key="vision"
:key="vision"
@click="
app_set.vision = vision
"
@click="
change_appset(item,'val',vision)
"
>
>
{{
vision
}}
{{
vision
}}
</div>
</div>
</el-form-item>
</el-form-item>
<el-form-item
label=
"资源限制-内存:"
prop=
"memory"
class=
"limitsd
"
>
<el-form-item
:label=
"item.text+'-内存:'"
class=
"limitsd"
v-if=
"item.type=='resource'
"
>
<el-input
<el-input
type=
"number"
type=
"number"
class=
"limitinput"
class=
"limitinput"
v-model=
"
app_set
.memory"
v-model=
"
item
.memory"
placeholder=
"请输入内存"
placeholder=
"请输入内存"
></el-input>
></el-input>
<el-select
<el-select
v-model=
"
app_set
.memory_type"
v-model=
"
item
.memory_type"
class=
"timeslect"
class=
"timeslect"
placeholder=
"请选择内存"
placeholder=
"请选择内存"
>
>
...
@@ -109,22 +108,22 @@
...
@@ -109,22 +108,22 @@
</el-select>
</el-select>
</el-form-item>
</el-form-item>
<el-form-item
label=
"资源限制-CPU:"
prop=
"cpu
"
>
<el-form-item
:label=
"item.text+'-CPU:'"
v-if=
"item.type=='resource'
"
>
<el-input
<el-input
type=
"number"
type=
"number"
v-model=
"
app_set
.cpu"
v-model=
"
item
.cpu"
placeholder=
"请输入标题"
placeholder=
"请输入标题"
>
>
<template
slot=
"append"
>
M
</
template
>
<template
slot=
"append"
>
M
</
template
>
</el-input>
</el-input>
</el-form-item>
</el-form-item>
<el-form-item
label=
"是否监控:"
prop=
"watch
"
>
<el-form-item
:label=
"item.text"
v-if=
"item.type=='switch'
"
>
<div
<div
class=
"openbgc"
class=
"openbgc"
@
click=
"openstart"
@
click=
"openstart
(item,'value')
"
:style=
"
:style=
"
!
app_set.watch
!
item.value
? {
? {
backgroundImage:
backgroundImage:
'url(' + require('@/assets/imgs/btn_off_hov.png') + ')',
'url(' + require('@/assets/imgs/btn_off_hov.png') + ')',
...
@@ -133,19 +132,21 @@
...
@@ -133,19 +132,21 @@
"
"
></div>
></div>
</el-form-item>
</el-form-item>
<el-form-item
label=
"储存容量:"
prop=
"save_memory
"
>
<el-form-item
:label=
"item.text"
v-if=
"item.type=='storage'
"
>
<div
<div
:class=
"{
:class=
"{
select_box: true,
select_box: true,
is_select:
app_set.save_memory
== save,
is_select:
item.storage
== save,
}"
}"
v-for=
"save in save_arr"
v-for=
"save in save_arr
[item.dwtype]
"
:key=
"save"
:key=
"save"
@
click=
"
app_set.save_memory = save
"
@
click=
"
change_appset(item,'storage',save)
"
>
>
{{ save }}
{{ save }}
</div>
</div>
</el-form-item>
</el-form-item>
</div>
</el-form>
</el-form>
<div
class=
"senior_box"
@
click=
"senior_flag = true"
v-if=
"!senior_flag"
>
<div
class=
"senior_box"
@
click=
"senior_flag = true"
v-if=
"!senior_flag"
>
高级配置
高级配置
...
@@ -154,7 +155,7 @@
...
@@ -154,7 +155,7 @@
<el-button
type=
"primary"
plain
@
click=
"preStep"
>
<el-button
type=
"primary"
plain
@
click=
"preStep"
>
上一步
上一步
</el-button>
</el-button>
<el-button
type=
"primary"
@
click=
"sub_yy_form('step2_form'
)"
>
<el-button
type=
"primary"
:disabled=
"is_loading"
@
click=
"sub_app_set(
)"
>
下一步
下一步
</el-button>
</el-button>
</div>
</div>
...
@@ -164,13 +165,13 @@
...
@@ -164,13 +165,13 @@
>
>
高级配置:
高级配置:
</p>
</p>
<v-apaas-code
v-
show=
"senior_flag"
:datas=
"app_set.
code"
></v-apaas-code>
<v-apaas-code
v-
if=
"senior_flag"
:datas=
"app_set_
code"
></v-apaas-code>
<div
class=
"apass_button step_action"
v-if=
"senior_flag"
>
<div
class=
"apass_button step_action"
v-if=
"senior_flag"
>
<el-button
type=
"primary"
plain
@
click=
"deal_code(0)"
>
<el-button
type=
"primary"
plain
@
click=
"deal_code(0)"
>
取消
取消
</el-button>
</el-button>
<el-button
type=
"primary"
@
click=
"deal_code(1)"
>
<el-button
type=
"primary"
:disabled=
"is_loading"
@
click=
"deal_code(1)"
>
保存
下一步
</el-button>
</el-button>
</div>
</div>
</app-build-step>
</app-build-step>
...
@@ -208,6 +209,7 @@ import appBuildSteps from "@/components/app-build-steps/app-build-steps";
...
@@ -208,6 +209,7 @@ import appBuildSteps from "@/components/app-build-steps/app-build-steps";
import
appBuildStep
from
"
@/components/app-build-steps/app-build-step
"
;
import
appBuildStep
from
"
@/components/app-build-steps/app-build-step
"
;
import
apassDialog
from
"
@/components/apass-dialog
"
;
import
apassDialog
from
"
@/components/apass-dialog
"
;
import
codes
from
"
@/components/codes
"
;
import
codes
from
"
@/components/codes
"
;
import
yaml
from
"
js-yaml
"
;
var
checkNumber
=
(
rule
,
value
,
callback
)
=>
{
var
checkNumber
=
(
rule
,
value
,
callback
)
=>
{
if
(
!
value
)
{
if
(
!
value
)
{
return
callback
(
new
Error
(
"
不能为空
"
));
return
callback
(
new
Error
(
"
不能为空
"
));
...
@@ -250,16 +252,8 @@ export default {
...
@@ -250,16 +252,8 @@ export default {
namespace
:
""
,
namespace
:
""
,
name
:
""
,
name
:
""
,
},
},
app_set
:
{
app_set
:
{},
title
:
""
,
app_set_info
:
{},
vision
:
""
,
memory
:
""
,
memory_type
:
1
,
cpu
:
""
,
watch
:
0
,
save_memory
:
""
,
code
:
""
,
},
area_options
:
[
area_options
:
[
{
{
name
:
"
12312
"
,
name
:
"
12312
"
,
...
@@ -268,24 +262,37 @@ export default {
...
@@ -268,24 +262,37 @@ export default {
],
],
vision_arr
:
[
"
1.0.1
"
,
"
10.1.2
"
,
"
2.2.3
"
],
vision_arr
:
[
"
1.0.1
"
,
"
10.1.2
"
,
"
2.2.3
"
],
save_arr
:
[
save_arr
:
[
"
2GI
"
,
[
"
4GI
"
,
"
2Gi
"
,
"
8GI
"
,
"
4Gi
"
,
"
16GI
"
,
"
8Gi
"
,
"
32GI
"
,
"
16Gi
"
,
"
64GI
"
,
"
32Gi
"
,
"
128GI
"
,
"
64Gi
"
,
"
256GI
"
,
"
128Gi
"
,
"
512GI
"
,
"
256Gi
"
,
"
512Gi
"
,
],
[
"
2TB
"
,
"
4TB
"
,
"
8TB
"
,
"
16TB
"
,
"
32TB
"
,
"
64TB
"
,
"
128TB
"
,
"
256TB
"
,
"
512TB
"
,
],
],
],
memory_arr
:
[
memory_arr
:
[
{
{
value
:
1
,
value
:
'
Mi
'
,
label
:
"
M
I
"
,
label
:
"
M
i
"
,
},
},
{
{
value
:
2
,
value
:
'
Gi
'
,
label
:
"
G
I
"
,
label
:
"
G
i
"
,
},
},
],
],
image_rules
:
{
image_rules
:
{
...
@@ -297,6 +304,9 @@ export default {
...
@@ -297,6 +304,9 @@ export default {
{
validator
:
checkName
,
trigger
:
"
blur
"
},
{
validator
:
checkName
,
trigger
:
"
blur
"
},
],
],
},
},
app_set_code
:
''
,
is_change
:
false
,
is_loading
:
false
,
app_set_rules
:
{
app_set_rules
:
{
title
:
[{
required
:
true
,
message
:
"
请输入标题
"
,
trigger
:
"
blur
"
}],
title
:
[{
required
:
true
,
message
:
"
请输入标题
"
,
trigger
:
"
blur
"
}],
memory
:
[
memory
:
[
...
@@ -316,38 +326,246 @@ export default {
...
@@ -316,38 +326,246 @@ export default {
evtSource
:
null
,
evtSource
:
null
,
stateList
:
[],
stateList
:
[],
finallyState
:
0
,
finallyState
:
0
,
listStatus
:
[],
state
:
""
,
text
:
""
,
url
:
""
,
act
:
0
,
stateList
:
[
{
name
:
"
获取部署参数
"
,
value
:
"
values
"
,
content
:
"
获取部署参数
"
,
state
:
1
,
},
{
name
:
"
拉取部署文件
"
,
value
:
"
pull-chart
"
,
content
:
"
拉取部署文件
"
,
state
:
1
,
},
{
name
:
"
开始部署
"
,
value
:
"
install
"
,
content
:
"
开始部署
"
,
state
:
1
,
},
{
name
:
"
部署状态
"
,
value
:
"
deploy-status
"
,
content
:
"
部署状态
"
,
state
:
2
,
},
],
step2_arr
:[],
}),
}),
methods
:
{
methods
:
{
get_name_space
(){
this
.
$http
.
get
(
`/apaas/hubApi/market/namespaces`
)
.
then
((
response
)
=>
{
console
.
log
(
response
);
this
.
area_options
=
response
.
data
.
data
});
},
get_step_info
()
{
get_step_info
()
{
this
.
$http
this
.
$http
.
get
(
`/apaas/hubApi/market/step/
${
this
.
$route
.
params
.
app_id
}
`
)
.
get
(
`/apaas/hubApi/market/step/
${
this
.
$route
.
params
.
app_id
}
`
)
.
then
((
response
)
=>
{
.
then
((
response
)
=>
{
console
.
log
(
JSON
.
parse
(
response
.
data
.
data
));
let
step2_arr
=
JSON
.
parse
(
response
.
data
.
data
).
configInfo
console
.
log
(
step2_arr
);
step2_arr
.
forEach
(
e
=>
{
if
(
e
.
type
==
'
radio
'
){
e
[
'
val
'
]
=
e
.
value
[
0
]
// this.deal_key_value(this.app_set_info,e.name,e.type,e.value[0])
}
else
if
(
e
.
type
==
'
storage
'
){
e
[
'
dwtype
'
]
=
e
.
storage
.
indexOf
(
'
Gi
'
)
==-
1
?
1
:
0
// this.deal_key_value(this.app_set_info,e.name,e.type,e.storage)
}
else
if
(
e
.
type
==
'
resource
'
){
let
memory
=
e
.
memory
let
cpu
=
e
.
cpu
e
[
'
memory_type
'
]
=
memory
.
indexOf
(
'
Mi
'
)
==-
1
?
'
Gi
'
:
'
Mi
'
e
[
'
memory
'
]
=
parseInt
(
memory
)
e
[
'
cpu
'
]
=
parseInt
(
cpu
)
// this.deal_key_value(this.app_set_info,e.name,'resource',[memory,cpu])
}
else
{
// this.deal_key_value(this.app_set_info,e.name,e.type,e.value)
}
});
this
.
step2_arr
=
step2_arr
;
console
.
log
(
this
.
app_set_info
);
});
},
get_step_file
(){
this
.
$http
.
get
(
`/apaas/hubApi/market/values/
${
this
.
$route
.
params
.
app_id
}
`
)
.
then
((
response
)
=>
{
this
.
app_set_code
=
response
.
data
.
data
})
},
change_appset
(
obj
,
key
,
val
){
console
.
log
(
key
,
val
);
this
.
$set
(
obj
,
key
,
val
)
},
deal_key_value
(
key_string
,
type
,
value
){
var
key_arr
=
key_string
.
split
(
'
.
'
)
var
temp
=
this
.
app_set_info
key_arr
.
forEach
((
e
,
index
)
=>
{
if
(
key_arr
.
length
-
1
==
index
){
if
(
type
==
'
resource
'
){
temp
[
e
]
=
{
limits
:{
memory
:
value
[
1
]
+
value
[
0
],
cpu
:
value
[
2
]
+
'
m
'
},
requests
:{
memory
:
value
[
1
]
+
value
[
0
],
cpu
:
value
[
2
]
+
'
m
'
}
}
}
else
if
(
type
==
'
storage
'
){
temp
[
e
]
=
{
"
volumeClaimTemplate
"
:{
"
spec
"
:{
"
storageClassName
"
:
"
nfs-client
"
,
"
accessModes
"
:[
"
ReadWriteOnce
"
],
"
resources
"
:{
"
requests
"
:{
"
storage
"
:
value
}
}
},
"
selector
"
:{
}
}
}
}
else
{
temp
[
e
]
=
value
}
}
else
{
if
(
temp
[
e
]){
}
else
{
temp
[
e
]
=
{}
}
temp
=
temp
[
e
]
}
});
},
deal_key_text
(
obj
,
key_string
){
var
key_arr
=
key_string
.
split
(
'
.
'
)
var
temp
=
obj
;
key_arr
.
forEach
((
e
,
index
)
=>
{
if
(
key_arr
.
length
-
1
==
index
){
}
else
{
temp
=
temp
[
e
]
}
});
});
},
},
deal_code
(
n
)
{
deal_code
(
n
)
{
if
(
n
)
{
if
(
n
)
{
this
.
begin_code
=
this
.
app_set
.
code
;
//调用接口
}
else
{
this
.
change_form_aploy
(
0
)
this
.
app_set
.
code
=
this
.
begin_code
;
}
}
this
.
senior_flag
=
false
;
this
.
senior_flag
=
false
;
},
},
sub_yy_form
(
formName
)
{
change_form_aploy
(
n
){
this
.
is_loading
=
true
if
(
n
==
1
){
//表单提交
var
temp
=
{
"
app_id
"
:
parseInt
(
this
.
$route
.
params
.
app_id
),
"
up_userid
"
:
this
.
$store
.
state
.
userInfo
.
user_id
,
"
name
"
:
this
.
baseInfoForm
.
name
,
"
namespace
"
:
this
.
baseInfoForm
.
namespace
,
"
uu
"
:
this
.
evtUuid
,
"
values
"
:
this
.
app_set_info
}
}
else
{
//编辑提交
var
temp
=
{
"
app_id
"
:
parseInt
(
this
.
$route
.
params
.
app_id
),
"
up_userid
"
:
this
.
$store
.
state
.
userInfo
.
user_id
,
"
name
"
:
this
.
baseInfoForm
.
name
,
"
namespace
"
:
this
.
baseInfoForm
.
namespace
,
"
uu
"
:
this
.
evtUuid
,
"
values
"
:
yaml
.
load
(
this
.
app_set_code
)
}
}
this
.
$http
.
post
(
`/apaas/hubApi/market/build`
,
temp
)
.
then
((
response
)
=>
{
this
.
is_loading
=
false
if
(
response
.
data
.
data
){
this
.
$message
.
success
(
'
开始部署成功
'
)
this
.
nextStep
()
}
}).
catch
(()
=>
{
this
.
is_loading
=
false
})
},
sub_yy_form
(
formName
,
n
)
{
this
.
$refs
[
formName
].
validate
((
valid
)
=>
{
this
.
$refs
[
formName
].
validate
((
valid
)
=>
{
if
(
valid
)
{
if
(
valid
)
{
this
.
nextStep
();
if
(
n
==
1
){
this
.
get_work_name
()
}
else
if
(
n
==
2
){
this
.
sub_app_set
()
}
}
else
{
}
else
{
console
.
log
(
"
error submit!!
"
);
console
.
log
(
"
error submit!!
"
);
return
false
;
return
false
;
}
}
});
});
},
},
openstart
()
{
get_work_name
(){
if
(
this
.
app_set
.
watch
)
{
this
.
is_loading
=
true
this
.
app_set
.
watch
=
0
;
this
.
$http
.
get
(
`/apaas/hubApi/market/exist/
${
this
.
baseInfoForm
.
namespace
}
?name=
${
this
.
baseInfoForm
.
name
}
`
)
.
then
((
response
)
=>
{
console
.
log
(
response
);
this
.
is_loading
=
false
if
(
response
.
data
.
success
){
if
(
response
.
data
.
data
){
this
.
$message
.
error
(
'
工作名称已存在
'
)
}
else
{
this
.
nextStep
();
}
}
}).
catch
(()
=>
{
this
.
is_loading
=
false
})
},
sub_app_set
(){
this
.
is_loading
=
true
this
.
step2_arr
.
forEach
(
e
=>
{
if
(
e
.
type
==
'
radio
'
){
this
.
deal_key_value
(
e
.
name
,
e
.
type
,
e
.
val
)
}
else
if
(
e
.
type
==
'
storage
'
){
this
.
deal_key_value
(
e
.
name
,
e
.
type
,
e
.
storage
)
}
else
if
(
e
.
type
==
'
resource
'
){
let
memory
=
e
.
memory
let
cpu
=
e
.
cpu
this
.
deal_key_value
(
e
.
name
,
'
resource
'
,[
e
.
memory_type
,
e
.
memory
,
e
.
cpu
])
}
else
{
this
.
deal_key_value
(
e
.
name
,
e
.
type
,
e
.
value
)
}
});
console
.
log
(
this
.
app_set_info
);
console
.
log
(
this
.
step2_arr
);
//表单提交调用接口
this
.
change_form_aploy
(
1
)
},
openstart
(
item
,
key
)
{
if
(
item
[
key
])
{
this
.
$set
(
item
,
key
,
false
)
// item[key] = false;
}
else
{
}
else
{
this
.
app_set
.
watch
=
1
;
// item[key] = true;
this
.
$set
(
item
,
key
,
true
)
}
}
},
},
preStep
()
{
preStep
()
{
...
@@ -489,7 +707,9 @@ export default {
...
@@ -489,7 +707,9 @@ export default {
},
},
created
()
{
created
()
{
this
.
getStatus
();
this
.
getStatus
();
this
.
get_name_space
();
this
.
get_step_info
();
this
.
get_step_info
();
this
.
get_step_file
();
},
},
};
};
</
script
>
</
script
>
...
@@ -519,7 +739,6 @@ export default {
...
@@ -519,7 +739,6 @@ export default {
}
}
.select_box
{
.select_box
{
height
:
35px
;
height
:
35px
;
width
:
80px
;
line-height
:
35px
;
line-height
:
35px
;
background-color
:
#f7f8f9
;
background-color
:
#f7f8f9
;
border-radius
:
6px
;
border-radius
:
6px
;
...
@@ -529,6 +748,7 @@ export default {
...
@@ -529,6 +748,7 @@ export default {
float
:
left
;
float
:
left
;
margin-right
:
10px
;
margin-right
:
10px
;
cursor
:
pointer
;
cursor
:
pointer
;
padding
:
0
20px
;
}
}
.is_select
{
.is_select
{
background-color
:
#515fe7
;
background-color
:
#515fe7
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment