Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
foc_manage
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
首航-临时账号
foc_manage
Commits
044665ec
Commit
044665ec
authored
Jun 08, 2020
by
java-李谡
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改role 名称校验接口
parent
9f6ea048
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
159 additions
and
133 deletions
+159
-133
roleForm.jsp
WebContent/WEB-INF/views/modules/sys/roleForm.jsp
+149
-121
ejweb.properties
resources/ejweb.properties
+1
-1
jdbc.properties
resources/jdbc.properties
+4
-6
mybatis-config.xml
resources/mybatis-config.xml
+1
-1
RoleController.java
src/com/ejweb/modules/sys/web/RoleController.java
+4
-4
No files found.
WebContent/WEB-INF/views/modules/sys/roleForm.jsp
View file @
044665ec
<
%@
page
contentType=
"text/html;charset=UTF-8"
%
>
<
%@
include
file=
"/WEB-INF/views/include/taglib.jsp"
%
>
<
%@
include
file=
"/WEB-INF/views/include/taglib.jsp"
%
>
<html>
<head>
<title>
角色管理
</title>
<meta
name=
"decorator"
content=
"default"
/>
<
%@
include
file=
"/WEB-INF/views/include/treeview.jsp"
%
>
<script
type=
"text/javascript"
>
$
(
document
).
ready
(
function
()
{
// $("#name").focus();
$
(
document
).
ready
(
function
()
{
// $("#name").focus();
$
(
"#inputForm"
).
validate
({
rules
:
{
name
:
{
remote
:
"${ctx}/sys/role/checkName?oldName="
+
encodeURIComponent
(
"${role.name}"
)},
enname
:
{
remote
:
"${ctx}/sys/role/checkEnname?oldEn
n
ame="
+
encodeURIComponent
(
"${role.enname}"
)}
enname
:
{
remote
:
"${ctx}/sys/role/checkEnname?oldEn
N
ame="
+
encodeURIComponent
(
"${role.enname}"
)}
},
messages
:
{
name
:
{
remote
:
"角色名已存在"
},
enname
:
{
remote
:
"英文名已存在"
}
},
submitHandler
:
function
(
form
)
{
submitHandler
:
function
(
form
)
{
var
ids
=
[],
nodes
=
tree
.
getCheckedNodes
(
true
);
for
(
var
i
=
0
;
i
<
nodes
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
nodes
.
length
;
i
++
)
{
ids
.
push
(
nodes
[
i
].
id
);
}
$
(
"#menuIds"
).
val
(
ids
);
var
ids2
=
[],
nodes2
=
tree2
.
getCheckedNodes
(
true
);
for
(
var
i
=
0
;
i
<
nodes2
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
nodes2
.
length
;
i
++
)
{
ids2
.
push
(
nodes2
[
i
].
id
);
}
$
(
"#officeIds"
).
val
(
ids2
);
...
...
@@ -32,9 +32,9 @@
form
.
submit
();
},
errorContainer
:
"#messageBox"
,
errorPlacement
:
function
(
error
,
element
)
{
errorPlacement
:
function
(
error
,
element
)
{
$
(
"#messageBox"
).
text
(
"输入有误,请先更正。"
);
if
(
element
.
is
(
":checkbox"
)
||
element
.
is
(
":radio"
)
||
element
.
parent
().
is
(
".input-append"
))
{
if
(
element
.
is
(
":checkbox"
)
||
element
.
is
(
":radio"
)
||
element
.
parent
().
is
(
".input-append"
))
{
error
.
appendTo
(
element
.
parent
().
parent
());
}
else
{
error
.
insertAfter
(
element
);
...
...
@@ -42,161 +42,188 @@
}
});
var
setting
=
{
check
:{
enable
:
true
,
nocheckInherit
:
true
},
view
:{
selectedMulti
:
false
},
data
:{
simpleData
:{
enable
:
true
}},
callback
:{
beforeClick
:
function
(
id
,
node
){
var
setting
=
{
check
:
{
enable
:
true
,
nocheckInherit
:
true
},
view
:
{
selectedMulti
:
false
},
data
:
{
simpleData
:
{
enable
:
true
}},
callback
:
{
beforeClick
:
function
(
id
,
node
)
{
tree
.
checkNode
(
node
,
!
node
.
checked
,
true
,
true
);
return
false
;
}}};
}
}
};
// 用户-菜单
var
zNodes
=
[
<
c
:
forEach
items
=
"${menuList}"
var
=
"menu"
>
{
id
:
"${menu.id}"
,
pId
:
"${not empty menu.parent.id?menu.parent.id:0}"
,
name
:
"${not empty menu.parent.id?menu.name:'权限列表'}"
},
<
/c:forEach>]
;
var
zNodes
=
[
<
c
:
forEach
items
=
"${menuList}"
var
=
"menu"
>
{
id
:
"${menu.id}"
,
pId
:
"${not empty menu.parent.id?menu.parent.id:0}"
,
name
:
"${not empty menu.parent.id?menu.name:'权限列表'}"
},
<
/c:forEach>]
;
// 初始化树结构
var
tree
=
$
.
fn
.
zTree
.
init
(
$
(
"#menuTree"
),
setting
,
zNodes
);
// 不选择父节点
tree
.
setting
.
check
.
chkboxType
=
{
"Y"
:
"ps"
,
"N"
:
"s"
};
tree
.
setting
.
check
.
chkboxType
=
{
"Y"
:
"ps"
,
"N"
:
"s"
};
// 默认选择节点
var
ids
=
"${role.menuIds}"
.
split
(
","
);
for
(
var
i
=
0
;
i
<
ids
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
ids
.
length
;
i
++
)
{
var
node
=
tree
.
getNodeByParam
(
"id"
,
ids
[
i
]);
try
{
tree
.
checkNode
(
node
,
true
,
false
);}
catch
(
e
){}
try
{
tree
.
checkNode
(
node
,
true
,
false
);
}
catch
(
e
)
{
}
}
// 默认展开全部节点
tree
.
expandAll
(
true
);
// 用户-机构
var
zNodes2
=
[
<
c
:
forEach
items
=
"${officeList}"
var
=
"office"
>
{
id
:
"${office.id}"
,
pId
:
"${not empty office.parent?office.parent.id:0}"
,
name
:
"${office.name}"
},
<
/c:forEach>]
;
var
zNodes2
=
[
<
c
:
forEach
items
=
"${officeList}"
var
=
"office"
>
{
id
:
"${office.id}"
,
pId
:
"${not empty office.parent?office.parent.id:0}"
,
name
:
"${office.name}"
},
<
/c:forEach>]
;
// 初始化树结构
var
tree2
=
$
.
fn
.
zTree
.
init
(
$
(
"#officeTree"
),
setting
,
zNodes2
);
// 不选择父节点
tree2
.
setting
.
check
.
chkboxType
=
{
"Y"
:
"ps"
,
"N"
:
"s"
};
tree2
.
setting
.
check
.
chkboxType
=
{
"Y"
:
"ps"
,
"N"
:
"s"
};
// 默认选择节点
var
ids2
=
"${role.officeIds}"
.
split
(
","
);
for
(
var
i
=
0
;
i
<
ids2
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
ids2
.
length
;
i
++
)
{
var
node
=
tree2
.
getNodeByParam
(
"id"
,
ids2
[
i
]);
try
{
tree2
.
checkNode
(
node
,
true
,
false
);}
catch
(
e
){}
try
{
tree2
.
checkNode
(
node
,
true
,
false
);
}
catch
(
e
)
{
}
}
// 默认展开全部节点
tree2
.
expandAll
(
true
);
// 刷新(显示/隐藏)机构
refreshOfficeTree
();
$
(
"#dataScope"
).
change
(
function
()
{
$
(
"#dataScope"
).
change
(
function
()
{
refreshOfficeTree
();
});
});
function
refreshOfficeTree
(){
if
(
$
(
"#dataScope"
).
val
()
==
9
){
function
refreshOfficeTree
()
{
if
(
$
(
"#dataScope"
).
val
()
==
9
)
{
$
(
"#officeTree"
).
show
();
}
else
{
}
else
{
$
(
"#officeTree"
).
hide
();
}
}
</script>
</head>
<body>
<ul
class=
"nav nav-tabs"
>
<li><a
href=
"${ctx}/sys/role/"
>
角色列表
</a></li>
<li
class=
"active"
><a
href=
"${ctx}/sys/role/form?id=${role.id}"
>
角色
<shiro:hasPermission
name=
"sys:role:edit"
>
${not empty role.id?'修改':'添加'}
</shiro:hasPermission><shiro:lacksPermission
name=
"sys:role:edit"
>
查看
</shiro:lacksPermission></a></li>
</ul><br/>
<form:form
id=
"inputForm"
modelAttribute=
"role"
action=
"${ctx}/sys/role/save"
method=
"post"
class=
"form-horizontal"
>
<form:hidden
path=
"id"
/>
<sys:message
content=
"${message}"
/>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
归属机构:
</label>
<div
class=
"controls"
>
<sys:treeselect
id=
"office"
name=
"office.id"
value=
"${role.office.id}"
labelName=
"office.name"
labelValue=
"${role.office.name}"
title=
"机构"
url=
"/sys/office/treeData"
/>
</div>
<ul
class=
"nav nav-tabs"
>
<li><a
href=
"${ctx}/sys/role/"
>
角色列表
</a></li>
<li
class=
"active"
><a
href=
"${ctx}/sys/role/form?id=${role.id}"
>
角色
<shiro:hasPermission
name=
"sys:role:edit"
>
${not empty role.id?'修改':'添加'}
</shiro:hasPermission><shiro:lacksPermission
name=
"sys:role:edit"
>
查看
</shiro:lacksPermission></a></li>
</ul>
<br/>
<form:form
id=
"inputForm"
modelAttribute=
"role"
action=
"${ctx}/sys/role/save"
method=
"post"
class=
"form-horizontal"
>
<form:hidden
path=
"id"
/>
<sys:message
content=
"${message}"
/>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
归属机构:
</label>
<div
class=
"controls"
>
<sys:treeselect
id=
"office"
name=
"office.id"
value=
"${role.office.id}"
labelName=
"office.name"
labelValue=
"${role.office.name}"
title=
"机构"
url=
"/sys/office/treeData"
/>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
角色名称:
</label
>
<div
class=
"controls"
>
<input
id=
"oldName"
name=
"oldName"
type=
"hidden"
value=
"${role.name}
"
>
<form:input
path=
"name"
htmlEscape=
"false"
maxlength=
"50"
class=
"required"
/
>
<span
class=
"help-inline"
><font
color=
"red"
>
*
</font>
</span
>
<
/div
>
</div
>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
角色名称:
</label
>
<div
class=
"controls
"
>
<input
id=
"oldName"
name=
"oldName"
type=
"hidden"
value=
"${role.name}"
>
<form:input
path=
"name"
htmlEscape=
"false"
maxlength=
"50"
class=
"required"
/
>
<
span
class=
"help-inline"
><font
color=
"red"
>
*
</font>
</span
>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
英文名称:
</label
>
<div
class=
"controls"
>
<input
id=
"oldEnname"
name=
"oldEnname"
type=
"hidden"
value=
"${role.enname}
"
>
<form:input
path=
"enname"
htmlEscape=
"false"
maxlength=
"50"
class=
"required"
/
>
<span
class=
"help-inline"
><font
color=
"red"
>
*
</font>
工作流用户组标识
</span
>
<
/div
>
</div
>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
英文名称:
</label
>
<div
class=
"controls
"
>
<input
id=
"oldEnname"
name=
"oldEnname"
type=
"hidden"
value=
"${role.enname}"
>
<form:input
path=
"enname"
htmlEscape=
"false"
maxlength=
"50"
class=
"required"
/
>
<
span
class=
"help-inline"
><font
color=
"red"
>
*
</font>
工作流用户组标识
</span
>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
角色类型:
</label>
<div
class=
"controls"
>
<form:select
path=
"roleKind"
class=
"input-large required"
>
<form:option
value=
""
label=
"请选择"
/>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
角色类型:
</label>
<div
class=
"controls"
>
<form:select
path=
"roleKind"
class=
"input-large required"
>
<form:option
value=
""
label=
"请选择"
/>
<form:options
items=
"${fns:getDictList('role_kind')}"
itemLabel=
"label"
itemValue=
"value"
htmlEscape=
"false"
/>
</form:select>
<
%
--
<
form:input
path=
"roleType"
htmlEscape=
"false"
maxlength=
"50"
class=
"required"
/>
<span
class=
"help-inline"
title=
"activiti有3种预定义的组类型:security-role、assignment、user 如果使用Activiti Explorer,需要security-role才能看到manage页签,需要assignment才能claim任务"
>
工作流组用户组类型(security-role:管理员、assignment:可进行任务分配、user:普通用户)
</span>
--%>
<
%
--
<
form:select
path=
"roleType"
class=
"input-medium"
>
<form:option
value=
"assignment"
>
任务分配
</form:option>
<form:option
value=
"security-role"
>
管理角色
</form:option>
<form:option
value=
"user"
>
普通角色
</form:option>
</form:select>
<span
class=
"help-inline"
title=
"activiti有3种预定义的组类型:security-role、assignment、user 如果使用Activiti Explorer,需要security-role才能看到manage页签,需要assignment才能claim任务"
>
工作流组用户组类型(任务分配:assignment、管理角色:security-role、普通角色:user)
</span>
--%>
</div>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
是否系统数据:
</label>
<div
class=
"controls"
>
<form:select
path=
"sysData"
>
<form:options
items=
"${fns:getDictList('yes_no')}"
itemLabel=
"label"
itemValue=
"value"
htmlEscape=
"false"
/>
</form:select>
<span
class=
"help-inline"
>
“是”代表此数据只有超级管理员能进行修改,“否”则表示拥有角色修改人员的权限都能进行修改
</span>
</div>
itemLabel=
"label"
itemValue=
"value"
htmlEscape=
"false"
/>
</form:select>
<
%
--
<
form:input
path=
"roleType"
htmlEscape=
"false"
maxlength=
"50"
class=
"required"
/>
<span
class=
"help-inline"
title=
"activiti有3种预定义的组类型:security-role、assignment、user 如果使用Activiti Explorer,需要security-role才能看到manage页签,需要assignment才能claim任务"
>
工作流组用户组类型(security-role:管理员、assignment:可进行任务分配、user:普通用户)
</span>
--%>
<
%
--
<
form:select
path=
"roleType"
class=
"input-medium"
>
<form:option
value=
"assignment"
>
任务分配
</form:option>
<form:option
value=
"security-role"
>
管理角色
</form:option>
<form:option
value=
"user"
>
普通角色
</form:option>
</form:select>
<span
class=
"help-inline"
title=
"activiti有3种预定义的组类型:security-role、assignment、user 如果使用Activiti Explorer,需要security-role才能看到manage页签,需要assignment才能claim任务"
>
工作流组用户组类型(任务分配:assignment、管理角色:security-role、普通角色:user)
</span>
--%>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
是否可用
</label>
<div
class=
"controls"
>
<form:select
path=
"useable"
>
<form:options
items=
"${fns:getDictList('yes_no')}"
itemLabel=
"label"
itemValue=
"value"
htmlEscape=
"false"
/>
</form:select>
<span
class=
"help-inline"
>
“是”代表此数据可用,“否”则表示此数据不可用
</span>
</div>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
是否系统数据:
</label>
<div
class=
"controls"
>
<form:select
path=
"sysData"
>
<form:options
items=
"${fns:getDictList('yes_no')}"
itemLabel=
"label"
itemValue=
"value"
htmlEscape=
"false"
/>
</form:select>
<span
class=
"help-inline"
>
“是”代表此数据只有超级管理员能进行修改,“否”则表示拥有角色修改人员的权限都能进行修改
</span>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
数据范围:
</label>
<div
class=
"controls"
>
<form:select
path=
"dataScope"
class=
"input-medium"
>
<form:options
items=
"${fns:getDictList('sys_data_scope')}"
itemLabel=
"label"
itemValue=
"value"
htmlEscape=
"false"
/>
</form:select>
<span
class=
"help-inline"
>
特殊情况下,设置为“按明细设置”,可进行跨机构授权
</span>
</div>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
是否可用
</label>
<div
class=
"controls"
>
<form:select
path=
"useable"
>
<form:options
items=
"${fns:getDictList('yes_no')}"
itemLabel=
"label"
itemValue=
"value"
htmlEscape=
"false"
/>
</form:select>
<span
class=
"help-inline"
>
“是”代表此数据可用,“否”则表示此数据不可用
</span>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
角色授权:
</label>
<div
class=
"controls"
>
<div
id=
"menuTree"
class=
"ztree"
style=
"margin-top:3px;float:left;"
></div>
<form:hidden
path=
"menuIds"
/>
<div
id=
"officeTree"
class=
"ztree"
style=
"margin-left:100px;margin-top:3px;float:left;"
></div>
<form:hidden
path=
"officeIds"
/>
</div>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
数据范围:
</label>
<div
class=
"controls"
>
<form:select
path=
"dataScope"
class=
"input-medium"
>
<form:options
items=
"${fns:getDictList('sys_data_scope')}"
itemLabel=
"label"
itemValue=
"value"
htmlEscape=
"false"
/>
</form:select>
<span
class=
"help-inline"
>
特殊情况下,设置为“按明细设置”,可进行跨机构授权
</span>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
备注:
</label>
<div
class=
"controls"
>
<form:textarea
path=
"remarks"
htmlEscape=
"false"
rows=
"3"
maxlength=
"200"
class=
"input-xlarge"
/>
</div>
</div>
<div
class=
"control-group"
>
<label
class=
"control-label"
>
角色授权:
</label>
<div
class=
"controls"
>
<div
id=
"menuTree"
class=
"ztree"
style=
"margin-top:3px;float:left;"
></div>
<form:hidden
path=
"menuIds"
/>
<div
id=
"officeTree"
class=
"ztree"
style=
"margin-left:100px;margin-top:3px;float:left;"
></div>
<form:hidden
path=
"officeIds"
/>
</div>
<div
class=
"form-actions"
>
<c:if
test=
"${(role.sysData eq fns:getDictValue('是', 'yes_no', '1') && fns:getUser().admin)||!(role.sysData eq fns:getDictValue('是', 'yes_no', '1'))}
"
>
<shiro:hasPermission
name=
"sys:role:edit"
><input
id=
"btnSubmit"
class=
"btn btn-primary"
type=
"submit"
value=
"保 存"
/>
</shiro:hasPermission
>
</c:if
>
<
input
id=
"btnCancel"
class=
"btn"
type=
"button"
value=
"返 回"
onclick=
"history.go(-1)
"
/>
</div
>
<div
class=
"control-group
"
>
<label
class=
"control-label"
>
备注:
</label
>
<div
class=
"controls"
>
<
form:textarea
path=
"remarks"
htmlEscape=
"false"
rows=
"3"
maxlength=
"200"
class=
"input-xlarge
"
/>
</div>
</form:form>
</div>
<div
class=
"form-actions"
>
<c:if
test=
"${(role.sysData eq fns:getDictValue('是', 'yes_no', '1') && fns:getUser().admin)||!(role.sysData eq fns:getDictValue('是', 'yes_no', '1'))}"
>
<shiro:hasPermission
name=
"sys:role:edit"
><input
id=
"btnSubmit"
class=
"btn btn-primary"
type=
"submit"
value=
"保 存"
/>
</shiro:hasPermission>
</c:if>
<input
id=
"btnCancel"
class=
"btn"
type=
"button"
value=
"返 回"
onclick=
"history.go(-1)"
/>
</div>
</form:form>
</body>
</html>
\ No newline at end of file
resources/ejweb.properties
View file @
044665ec
...
...
@@ -95,7 +95,7 @@ female.user.default.avatar=/images/user/avatar/female_avatar.png
# \u7537\u751F\u5934\u50CF
male.user.default.avatar
=
/images/user/avatar/male_avatar.png
foc.api.url
=
http://
123.56.146.7
/
foc.api.url
=
http://
localhost:8080
/
foc.sound.records.url
=
http://218.241.234.135:8080/ab/jsonData/cdrDataPage
...
...
resources/jdbc.properties
View file @
044665ec
#MySQL Database Config(The All Config Is Must)
db.table.prefix
=
foc_
jdbc.type
=
mysql
jdbc.driver.class
=
com.mysql.jdbc.Driver
jdbc.url
=
jdbc:mysql://106.75.97.50:3306/jd_foc?useUnicode=true&characterEncoding=utf-8
jdbc.username
=
focuser
jdbc.password
=
FOC@2016
#\u521d\u59cb\u5316\u8fde\u63a5
jdbc.url
=
jdbc:mysql://106.75.105.96:5508/jd_foc?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
jdbc.username
=
sms_develop
jdbc.password
=
Develop2018!@#
#\u521d\u59cb\u5316\u8fde\u63a5
jdbc.initialSize
=
0
#\u8fde\u63a5\u6c60\u7684\u6700\u5927\u6d3b\u52a8\u4e2a\u6570
jdbc.maxActive
=
20
...
...
resources/mybatis-config.xml
View file @
044665ec
...
...
@@ -37,7 +37,7 @@
<!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
<setting
name=
"jdbcTypeForNull"
value=
"NULL"
/>
<
setting
name=
"logImpl"
value=
"STDOUT_LOGGING"
/
>
<
!--<setting name="logImpl" value="STDOUT_LOGGING" />--
>
</settings>
...
...
src/com/ejweb/modules/sys/web/RoleController.java
View file @
044665ec
...
...
@@ -264,16 +264,16 @@ public class RoleController extends BaseController {
* 验证角色英文名是否有效
*
* @param oldEnName
* @param en
N
ame
* @param en
n
ame
* @return
*/
@RequiresPermissions
(
"user"
)
@ResponseBody
@RequestMapping
(
value
=
"checkEnname"
)
public
String
checkEnName
(
String
oldEnName
,
String
en
N
ame
)
{
if
(
en
Name
!=
null
&&
enN
ame
.
equals
(
oldEnName
))
{
public
String
checkEnName
(
String
oldEnName
,
String
en
n
ame
)
{
if
(
en
name
!=
null
&&
enn
ame
.
equals
(
oldEnName
))
{
return
"true"
;
}
else
if
(
en
Name
!=
null
&&
systemService
.
getRoleByEnname
(
enN
ame
)
==
null
)
{
}
else
if
(
en
name
!=
null
&&
systemService
.
getRoleByEnname
(
enn
ame
)
==
null
)
{
return
"true"
;
}
return
"false"
;
...
...
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