Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MaxKey单点登录官方(MaxKeyTop)
MaxKey
提交
6d7cfc52
MaxKey
项目概览
MaxKey单点登录官方(MaxKeyTop)
/
MaxKey
9 个月 前同步成功
通知
75
Star
3
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MaxKey
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
6d7cfc52
编写于
12月 10, 2020
作者:
MaxKey单点登录官方
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
动态用户组管理
上级
09beb7c1
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
414 addition
and
8 deletion
+414
-8
maxkey-core/src/main/java/org/maxkey/domain/Groups.java
maxkey-core/src/main/java/org/maxkey/domain/Groups.java
+37
-2
maxkey-web-manage/src/main/resources/messages/message.properties
...web-manage/src/main/resources/messages/message.properties
+3
-0
maxkey-web-manage/src/main/resources/messages/message_en.properties
...-manage/src/main/resources/messages/message_en.properties
+3
-0
maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties
...nage/src/main/resources/messages/message_zh_CN.properties
+3
-0
maxkey-web-manage/src/main/resources/templates/views/groups/groupAdd.ftl
...ge/src/main/resources/templates/views/groups/groupAdd.ftl
+176
-2
maxkey-web-manage/src/main/resources/templates/views/groups/groupUpdate.ftl
...src/main/resources/templates/views/groups/groupUpdate.ftl
+190
-2
maxkey-web-manage/src/main/resources/templates/views/groups/groupsList.ftl
.../src/main/resources/templates/views/groups/groupsList.ftl
+2
-2
未找到文件。
maxkey-core/src/main/java/org/maxkey/domain/Groups.java
浏览文件 @
6d7cfc52
...
...
@@ -38,9 +38,19 @@ public class Groups extends JpaBaseDomain implements Serializable {
@Length
(
max
=
60
)
@Column
private
String
name
;
String
name
;
@Column
private
int
isdefault
;
String
dynamic
;
@Column
String
filters
;
@Column
String
orgIdsList
;
@Column
int
isdefault
;
@Column
String
description
;
@Column
...
...
@@ -146,6 +156,31 @@ public class Groups extends JpaBaseDomain implements Serializable {
this
.
status
=
status
;
}
public
String
getDynamic
()
{
return
dynamic
;
}
public
void
setDynamic
(
String
dynamic
)
{
this
.
dynamic
=
dynamic
;
}
public
String
getFilters
()
{
return
filters
;
}
public
void
setFilters
(
String
filters
)
{
this
.
filters
=
filters
;
}
public
String
getOrgIdsList
()
{
return
orgIdsList
;
}
public
void
setOrgIdsList
(
String
orgIdsList
)
{
this
.
orgIdsList
=
orgIdsList
;
}
@Override
public
String
toString
()
{
StringBuilder
builder
=
new
StringBuilder
();
...
...
maxkey-web-manage/src/main/resources/messages/message.properties
浏览文件 @
6d7cfc52
...
...
@@ -413,6 +413,9 @@ apps.oauth.connect.userInfoEncryptionMethod=\u7528\u6237\u52a0\u5bc6\u65b9\u6cd5
#group
group.id
=
\u
7ec4
\u
7f16
\u7801
group.name
=
\u7528\u6237\u
7ec4
group.dynamic
=
\u
52a8
\u6001\u
7ec4
group.filters
=
\u
8fc7
\u
6ee4
\u5668
group.orgidslist
=
\u
673a
\u6784\u5217\u8868
#role
role.id
=
\u
89d2
\u8272\u
7f16
\u7801
...
...
maxkey-web-manage/src/main/resources/messages/message_en.properties
浏览文件 @
6d7cfc52
...
...
@@ -412,6 +412,9 @@ apps.oauth.connect.userInfoEncryptionMethod=idTokenEncryptionMethod
#group
group.id
=
id
group.name
=
name
group.dynamic
=
dynamic
group.filters
=
filters
group.orgidslist
=
orgIdsList
#role
role.id
=
id
...
...
maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties
浏览文件 @
6d7cfc52
...
...
@@ -414,6 +414,9 @@ apps.oauth.connect.userInfoEncryptionMethod=\u7528\u6237\u52a0\u5bc6\u65b9\u6cd5
#group
group.id
=
\u
7ec4
\u
7f16
\u7801
group.name
=
\u7528\u6237\u
7ec4
group.dynamic
=
\u
52a8
\u6001\u
7ec4
group.filters
=
\u
8fc7
\u
6ee4
\u5668
group.orgidslist
=
\u
673a
\u6784\u5217\u8868
#role
role.id
=
\u
89d2
\u8272\u
7f16
\u7801
...
...
maxkey-web-manage/src/main/resources/templates/views/groups/groupAdd.ftl
浏览文件 @
6d7cfc52
...
...
@@ -9,6 +9,155 @@
vertical-align
:
middle
;
}
</style>
<script
type=
"text/javascript"
>
function
onClick
(
event
,
treeId
,
treeNode
)
{
var
zTree
=
$
.
fn
.
zTree
.
getZTreeObj
(
"
orgsTree
"
);
nodes
=
zTree
.
getCheckedNodes
(
true
);
var
orgsName
=
""
;
var
orgsId
=
""
;
for
(
var
i
=
0
,
l
=
nodes
.
length
;
i
<
l
;
i
++
)
{
orgsName
+=
nodes
[
i
].
name
+
"
,
"
;
orgsId
+=
nodes
[
i
].
id
+
"
,
"
;
}
$
(
"
#orgIdsListName
"
).
val
(
orgsName
);
$
(
"
#orgIdsList
"
).
val
(
orgsId
);
}
$
(
function
()
{
var
treeSettings
=
{
element
:
"
orgsTree
"
,
rootId
:
"
1
"
,
checkbox
:
true
,
onClick
:
onClick
,
onDblClick
:
null
,
url
:
"
<@base/>/orgs/tree
"
};
function
singlePath
(
newNode
)
{
if
(
newNode
===
curExpandNode
)
return
;
if
(
curExpandNode
&&
curExpandNode
.
open
==
true
)
{
var
zTree
=
$
.
fn
.
zTree
.
getZTreeObj
(
treeSettings
.
element
);
if
(
newNode
.
parentTId
===
curExpandNode
.
parentTId
)
{
zTree
.
expandNode
(
curExpandNode
,
false
);
}
else
{
var
newParents
=
[];
while
(
newNode
)
{
newNode
=
newNode
.
getParentNode
();
if
(
newNode
===
curExpandNode
)
{
newParents
=
null
;
break
;
}
else
if
(
newNode
)
{
newParents
.
push
(
newNode
);
}
}
if
(
newParents
!=
null
)
{
var
oldNode
=
curExpandNode
;
var
oldParents
=
[];
while
(
oldNode
)
{
oldNode
=
oldNode
.
getParentNode
();
if
(
oldNode
)
{
oldParents
.
push
(
oldNode
);
}
}
if
(
newParents
.
length
>
0
)
{
for
(
var
i
=
Math
.
min
(
newParents
.
length
,
oldParents
.
length
)
-
1
;
i
>=
0
;
i
--
)
{
if
(
newParents
[
i
]
!==
oldParents
[
i
])
{
zTree
.
expandNode
(
oldParents
[
i
],
false
);
break
;
}
}
}
else
{
zTree
.
expandNode
(
oldParents
[
oldParents
.
length
-
1
],
false
);
}
}
}
}
curExpandNode
=
newNode
;
};
function
beforeExpand
(
treeId
,
treeNode
)
{
var
pNode
=
curExpandNode
?
curExpandNode
.
getParentNode
():
null
;
var
treeNodeP
=
treeNode
.
parentTId
?
treeNode
.
getParentNode
():
null
;
var
zTree
=
$
.
fn
.
zTree
.
getZTreeObj
(
""
+
treeSettings
.
element
);
for
(
var
i
=
0
,
l
=!
treeNodeP
?
0
:
treeNodeP
.
children
.
length
;
i
<
l
;
i
++
)
{
if
(
treeNode
!==
treeNodeP
.
children
[
i
])
{
zTree
.
expandNode
(
treeNodeP
.
children
[
i
],
false
);
}
}
while
(
pNode
)
{
if
(
pNode
===
treeNode
)
{
break
;
}
pNode
=
pNode
.
getParentNode
();
}
if
(
!
pNode
)
{
singlePath
(
treeNode
);
}
};
$
.
fn
.
zTree
.
init
(
$
(
"
#
"
+
treeSettings
.
element
),
//element
{
//json object
check
:
{
enable
:
treeSettings
.
checkbox
},
async
:
{
enable
:
true
,
url
:
treeSettings
.
url
,
autoParam
:
[
"
id
"
,
"
name=n
"
,
"
level=lv
"
],
otherParam
:
{
"
otherParam
"
:
"
zTreeAsyncTest
"
,
id
:
treeSettings
.
rootId
},
dataFilter
:
function
(
treeId
,
parentNode
,
childNodes
)
{
if
(
!
childNodes
)
return
null
;
for
(
var
i
=
0
,
l
=
childNodes
.
length
;
i
<
l
;
i
++
)
{
childNodes
[
i
].
name
=
childNodes
[
i
].
name
.
replace
(
/
\.
n/g
,
'
.
'
);
}
return
childNodes
;
}
},
data
:
{
simpleData
:
{
enable
:
true
}
},
callback
:
{
onClick
:
treeSettings
.
onClick
,
onDblClick
:
treeSettings
.
onDblClick
,
beforeAsync
:
function
(
treeId
,
treeNode
){
$
.
loading
();
},
onAsyncSuccess
:
function
(
event
,
treeId
,
treeNode
,
msg
){
$
.
unloading
();
},
//beforeExpand : beforeExpand,
onExpand
:
function
onExpand
(
event
,
treeId
,
treeNode
)
{
curExpandNode
=
treeNode
;
}
}
}
);
//end tree
});
function
onBodyDown
(
event
)
{
if
(
!
(
event
.
target
.
id
==
"
menuBtn
"
||
event
.
target
.
id
==
"
orgIdsListName
"
||
event
.
target
.
id
==
"
orgContent
"
||
$
(
event
.
target
).
parents
(
"
#orgContent
"
).
length
>
0
))
{
$
(
"
#orgContent
"
).
fadeOut
(
"
fast
"
);
$
(
"
body
"
).
unbind
(
"
mousedown
"
,
onBodyDown
);
}
}
function
showOrgsTree
()
{
var
treeObj
=
$
(
"
#orgIdsListName
"
);
var
treeOffset
=
$
(
"
#orgIdsListName
"
).
offset
();
$
(
"
#orgContent
"
).
css
({
left
:
treeOffset
.
left
+
"
px
"
,
top
:
treeOffset
.
top
+
treeObj
.
outerHeight
()
+
"
px
"
}).
slideDown
(
"
fast
"
);
$
(
"
body
"
).
bind
(
"
mousedown
"
,
onBodyDown
);
}
</script>
</head>
<body>
<form
id=
"actionForm"
method=
"post"
type=
"label"
autoclose=
"true"
action=
"<@base/>/groups/add"
class=
"needs-validation"
novalidate
>
...
...
@@ -21,15 +170,37 @@
</td>
</tr>
<tr>
<th><
@
locale
code=
"
role
.name"
/>
:
</th>
<th><
@
locale
code=
"
group
.name"
/>
:
</th>
<td
nowrap
>
<input
type=
"text"
id=
"name"
name=
"name"
class=
"form-control"
title=
""
value=
""
required=
""
/>
</td>
</tr>
<tr>
<th><
@
locale
code=
"group.dynamic"
/>
:
</th>
<td
nowrap
>
<select
id=
"dynamic"
name=
"dynamic"
class=
"form-control"
>
<option
value=
"0"
selected
><
@
locale
code=
"common.text.no"
/></option>
<option
value=
"1"
><
@
locale
code=
"common.text.yes"
/></option>
</select>
</td>
</tr>
<tr>
<th><
@
locale
code=
"group.orgidslist"
/>
:
</th>
<td
nowrap
>
<input
type=
"text"
id=
"orgIdsListName"
name=
"orgIdsListName"
readonly
class=
"form-control"
title=
""
value=
""
onclick=
"showOrgsTree();"
/>
<input
type=
"hidden"
id=
"orgIdsList"
name=
"orgIdsList"
readonly
class=
"form-control"
title=
""
value=
""
/>
</td>
</tr>
<tr>
<th><
@
locale
code=
"group.filters"
/>
:
</th>
<td
nowrap
>
<textarea
id=
"filters"
name=
"filters"
class=
"form-control"
rows=
"7"
cols=
"20"
></textarea>
</td>
</tr>
<tr>
<th><
@
locale
code=
"common.text.description"
/>
:
</th>
<td
nowrap
>
<
input
type=
"text"
id=
"description"
name=
"description"
class=
"form-control"
title=
""
value=
""
/
>
<
textarea
id=
"description"
name=
"description"
class=
"form-control"
rows=
"6"
cols=
"20"
></textarea
>
</td>
</tr>
<tr>
...
...
@@ -43,5 +214,8 @@
</tbody>
</table>
</form>
<div
id=
"orgContent"
class=
"menuContent"
style=
"display:none; position: absolute;"
>
<ul
id=
"orgsTree"
class=
"ztree"
style=
"margin-top:0; width:180px; height: 300px;"
></ul>
</div>
</body>
</html>
\ No newline at end of file
maxkey-web-manage/src/main/resources/templates/views/groups/groupUpdate.ftl
浏览文件 @
6d7cfc52
...
...
@@ -9,6 +9,169 @@
vertical-align
:
middle
;
}
</style>
<script
type=
"text/javascript"
>
function
onClick
(
event
,
treeId
,
treeNode
)
{
var
zTree
=
$
.
fn
.
zTree
.
getZTreeObj
(
"
orgsTree
"
);
nodes
=
zTree
.
getCheckedNodes
(
true
);
var
orgsName
=
""
;
var
orgsId
=
""
;
for
(
var
i
=
0
;
i
<
nodes
.
length
;
i
++
)
{
orgsName
+=
nodes
[
i
].
name
+
"
,
"
;
orgsId
+=
nodes
[
i
].
id
+
"
,
"
;
}
$
(
"
#orgIdsListName
"
).
val
(
orgsName
);
$
(
"
#orgIdsList
"
).
val
(
orgsId
);
}
$
(
function
()
{
var
treeSettings
=
{
element
:
"
orgsTree
"
,
rootId
:
"
1
"
,
checkbox
:
true
,
onClick
:
onClick
,
onDblClick
:
null
,
url
:
"
<@base/>/orgs/tree
"
};
function
singlePath
(
newNode
)
{
if
(
newNode
===
curExpandNode
)
return
;
if
(
curExpandNode
&&
curExpandNode
.
open
==
true
)
{
var
zTree
=
$
.
fn
.
zTree
.
getZTreeObj
(
treeSettings
.
element
);
if
(
newNode
.
parentTId
===
curExpandNode
.
parentTId
)
{
zTree
.
expandNode
(
curExpandNode
,
false
);
}
else
{
var
newParents
=
[];
while
(
newNode
)
{
newNode
=
newNode
.
getParentNode
();
if
(
newNode
===
curExpandNode
)
{
newParents
=
null
;
break
;
}
else
if
(
newNode
)
{
newParents
.
push
(
newNode
);
}
}
if
(
newParents
!=
null
)
{
var
oldNode
=
curExpandNode
;
var
oldParents
=
[];
while
(
oldNode
)
{
oldNode
=
oldNode
.
getParentNode
();
if
(
oldNode
)
{
oldParents
.
push
(
oldNode
);
}
}
if
(
newParents
.
length
>
0
)
{
for
(
var
i
=
Math
.
min
(
newParents
.
length
,
oldParents
.
length
)
-
1
;
i
>=
0
;
i
--
)
{
if
(
newParents
[
i
]
!==
oldParents
[
i
])
{
zTree
.
expandNode
(
oldParents
[
i
],
false
);
break
;
}
}
}
else
{
zTree
.
expandNode
(
oldParents
[
oldParents
.
length
-
1
],
false
);
}
}
}
}
curExpandNode
=
newNode
;
};
function
beforeExpand
(
treeId
,
treeNode
)
{
var
pNode
=
curExpandNode
?
curExpandNode
.
getParentNode
():
null
;
var
treeNodeP
=
treeNode
.
parentTId
?
treeNode
.
getParentNode
():
null
;
var
zTree
=
$
.
fn
.
zTree
.
getZTreeObj
(
""
+
treeSettings
.
element
);
for
(
var
i
=
0
,
l
=!
treeNodeP
?
0
:
treeNodeP
.
children
.
length
;
i
<
l
;
i
++
)
{
if
(
treeNode
!==
treeNodeP
.
children
[
i
])
{
zTree
.
expandNode
(
treeNodeP
.
children
[
i
],
false
);
}
}
while
(
pNode
)
{
if
(
pNode
===
treeNode
)
{
break
;
}
pNode
=
pNode
.
getParentNode
();
}
if
(
!
pNode
)
{
singlePath
(
treeNode
);
}
};
function
onLoadSuccessed
(){
var
zTree
=
$
.
fn
.
zTree
.
getZTreeObj
(
"
orgsTree
"
);
var
orgsIdValues
=
$
(
"
#orgIdsList
"
).
val
().
split
(
"
,
"
)
;
var
orgsName
=
""
;
for
(
var
i
=
0
;
i
<
orgsIdValues
.
length
;
i
++
)
{
var
node
=
zTree
.
getNodeByParam
(
"
id
"
,
orgsIdValues
[
i
]
);
if
(
node
!=
null
){
zTree
.
checkNode
(
node
,
true
,
false
);
//将指定ID的节点选中
orgsName
+=
node
.
name
;
}
}
$
(
"
#orgIdsListName
"
).
val
(
orgsName
);
}
$
.
fn
.
zTree
.
init
(
$
(
"
#
"
+
treeSettings
.
element
),
//element
{
//json object
check
:
{
enable
:
treeSettings
.
checkbox
},
async
:
{
enable
:
true
,
url
:
treeSettings
.
url
,
autoParam
:
[
"
id
"
,
"
name=n
"
,
"
level=lv
"
],
otherParam
:
{
"
otherParam
"
:
"
zTreeAsyncTest
"
,
id
:
treeSettings
.
rootId
},
dataFilter
:
function
(
treeId
,
parentNode
,
childNodes
)
{
if
(
!
childNodes
)
return
null
;
for
(
var
i
=
0
,
l
=
childNodes
.
length
;
i
<
l
;
i
++
)
{
childNodes
[
i
].
name
=
childNodes
[
i
].
name
.
replace
(
/
\.
n/g
,
'
.
'
);
}
return
childNodes
;
}
},
data
:
{
simpleData
:
{
enable
:
true
}
},
callback
:
{
onClick
:
treeSettings
.
onClick
,
onDblClick
:
treeSettings
.
onDblClick
,
beforeAsync
:
function
(
treeId
,
treeNode
){
$
.
loading
();
},
onAsyncSuccess
:
function
(
event
,
treeId
,
treeNode
,
msg
){
$
.
unloading
();
onLoadSuccessed
();
},
//beforeExpand : beforeExpand,
onExpand
:
function
onExpand
(
event
,
treeId
,
treeNode
)
{
curExpandNode
=
treeNode
;
}
}
}
);
//end tree
});
function
onBodyDown
(
event
)
{
if
(
!
(
event
.
target
.
id
==
"
menuBtn
"
||
event
.
target
.
id
==
"
orgIdsListName
"
||
event
.
target
.
id
==
"
orgContent
"
||
$
(
event
.
target
).
parents
(
"
#orgContent
"
).
length
>
0
))
{
$
(
"
#orgContent
"
).
fadeOut
(
"
fast
"
);
$
(
"
body
"
).
unbind
(
"
mousedown
"
,
onBodyDown
);
}
}
function
showOrgsTree
()
{
var
treeObj
=
$
(
"
#orgIdsListName
"
);
var
treeOffset
=
$
(
"
#orgIdsListName
"
).
offset
();
$
(
"
#orgContent
"
).
css
({
left
:
treeOffset
.
left
+
"
px
"
,
top
:
treeOffset
.
top
+
treeObj
.
outerHeight
()
+
"
px
"
}).
slideDown
(
"
fast
"
);
$
(
"
body
"
).
bind
(
"
mousedown
"
,
onBodyDown
);
}
</script>
</head>
<body>
<form
id=
"actionForm"
method=
"post"
type=
"label"
autoclose=
"true"
action=
"<@base/>/groups/update"
class=
"needs-validation"
novalidate
>
...
...
@@ -26,12 +189,34 @@
<input
type=
"text"
id=
"name"
name=
"name"
class=
"form-control"
title=
""
value=
"${model.name}"
required=
""
/>
</td>
</tr>
<tr>
<th><
@
locale
code=
"group.dynamic"
/>
:
</th>
<td
nowrap
>
<select
id=
"dynamic"
name=
"dynamic"
class=
"form-control"
>
<option
value=
"0"
<
#if
'0'==
model.dynamic
>
selected
</
#
if>
>
<
@
locale
code=
"common.text.no"
/></option>
<option
value=
"1"
<
#if
'1'==
model.dynamic
>
selected
</
#
if>
>
<
@
locale
code=
"common.text.yes"
/></option>
</select>
</td>
</tr>
<tr>
<th><
@
locale
code=
"group.orgidslist"
/>
:
</th>
<td
nowrap
>
<input
type=
"text"
id=
"orgIdsListName"
name=
"orgIdsListName"
readonly
class=
"form-control"
title=
""
value=
""
onclick=
"showOrgsTree();"
/>
<input
type=
"hidden"
id=
"orgIdsList"
name=
"orgIdsList"
readonly
class=
"form-control"
title=
""
value=
"${model.orgIdsList!}"
/>
</td>
</tr>
<tr>
<th><
@
locale
code=
"group.filters"
/>
:
</th>
<td
nowrap
>
<textarea
id=
"filters"
name=
"filters"
class=
"form-control"
rows=
"7"
cols=
"20"
>
${model.filters!}
</textarea>
</td>
</tr>
<tr>
<th><
@
locale
code=
"common.text.description"
/>
:
</th>
<td
nowrap
>
<input
type=
"text"
id=
"description"
name=
"description"
class=
"form-control"
title=
""
value=
"${model.description!}"
/
>
<textarea
id=
"description"
name=
"description"
class=
"form-control"
rows=
"6"
cols=
"20"
>
${model.description!}
</textarea
>
</td>
</tr>
</tr>
<tr>
<td
nowrap
colspan=
"2"
class=
"center"
>
<input
id=
"_method"
type=
"hidden"
name=
"_method"
value=
"post"
/>
...
...
@@ -43,5 +228,8 @@
</tbody>
</table>
</form>
<div
id=
"orgContent"
class=
"menuContent"
style=
"display:none; position: absolute;"
>
<ul
id=
"orgsTree"
class=
"ztree"
style=
"margin-top:0; width:180px; height: 300px;"
></ul>
</div>
</body>
</html>
\ No newline at end of file
maxkey-web-manage/src/main/resources/templates/views/groups/groupsList.ftl
浏览文件 @
6d7cfc52
...
...
@@ -52,13 +52,13 @@
<input
class=
"button btn btn-success mr-3"
id=
"addBtn"
type=
"button"
value=
"<@locale code="
button.text.add
"
/>
"
wurl="
<
@
base
/>
/groups/forwardAdd"
wwidth="500"
wheight="
2
00"
wheight="
6
00"
target="window">
<input
class=
"button btn btn-info mr-3 "
id=
"modifyBtn"
type=
"button"
value=
"<@locale code="
button.text.edit
"
/>
"
wurl="
<
@
base
/>
/groups/forwardUpdate"
wwidth="500"
wheight="
2
00"
wheight="
6
00"
target="window">
<input
class=
"button btn btn-danger mr-3 "
id=
"deleteBtn"
type=
"button"
value=
"<@locale code="
button.text.delete
"
/>
"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录