Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
new-api
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
e22e41c9
authored
Nov 12, 2024
by
licoy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 优化数据管理操作栏均为顶部
parent
fac2f50b
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
295 additions
and
298 deletions
+295
-298
web/src/components/ChannelsTable.js
+201
-210
web/src/components/LogsTable.js
+16
-14
web/src/components/RedemptionsTable.js
+34
-31
web/src/components/TokensTable.js
+35
-32
web/src/components/UsersTable.js
+9
-11
No files found.
web/src/components/ChannelsTable.js
View file @
e22e41c9
...
@@ -17,7 +17,7 @@ import {
...
@@ -17,7 +17,7 @@ import {
renderQuota
,
renderQuota
,
}
from
'../helpers/render'
;
}
from
'../helpers/render'
;
import
{
import
{
Button
,
Button
,
Divider
,
Dropdown
,
Dropdown
,
Form
,
Form
,
InputNumber
,
InputNumber
,
...
@@ -707,226 +707,217 @@ const ChannelsTable = () => {
...
@@ -707,226 +707,217 @@ const ChannelsTable = () => {
};
};
return
(
return
(
<>
<>
<
EditChannel
<
EditChannel
refresh
=
{
refresh
}
refresh
=
{
refresh
}
visible
=
{
showEdit
}
visible
=
{
showEdit
}
handleClose
=
{
closeEdit
}
handleClose
=
{
closeEdit
}
editingChannel
=
{
editingChannel
}
editingChannel
=
{
editingChannel
}
/
>
/
>
<
Form
<
Form
onSubmit
=
{()
=>
{
onSubmit
=
{()
=>
{
searchChannels
(
searchKeyword
,
searchGroup
,
searchModel
);
searchChannels
(
searchKeyword
,
searchGroup
,
searchModel
);
}}
}}
labelPosition
=
'left'
labelPosition
=
'left'
>
>
<
div
style
=
{{
display
:
'flex'
}}
>
<
div
style
=
{{
display
:
'flex'
}}
>
<
Space
>
<
Space
>
<
Form
.
Input
<
Form
.
Input
field
=
'search_keyword'
field
=
'search_keyword'
label
=
'搜索渠道关键词'
label
=
'搜索渠道关键词'
placeholder
=
'ID,名称和密钥 ...'
placeholder
=
'ID,名称和密钥 ...'
value
=
{
searchKeyword
}
value
=
{
searchKeyword
}
loading
=
{
searching
}
loading
=
{
searching
}
onChange
=
{(
v
)
=>
{
onChange
=
{(
v
)
=>
{
setSearchKeyword
(
v
.
trim
());
setSearchKeyword
(
v
.
trim
());
}}
}}
/
>
/
>
<
Form
.
Input
<
Form
.
Input
field
=
'search_model'
field
=
'search_model'
label
=
'模型'
label
=
'模型'
placeholder
=
'模型关键字'
placeholder
=
'模型关键字'
value
=
{
searchModel
}
value
=
{
searchModel
}
loading
=
{
searching
}
loading
=
{
searching
}
onChange
=
{(
v
)
=>
{
onChange
=
{(
v
)
=>
{
setSearchModel
(
v
.
trim
());
setSearchModel
(
v
.
trim
());
}}
}}
/
>
/
>
<
Form
.
Select
<
Form
.
Select
field
=
'group'
field
=
'group'
label
=
'分组'
label
=
'分组'
optionList
=
{[{
label
:
'选择分组'
,
value
:
null
},
...
groupOptions
]}
optionList
=
{[{
label
:
'选择分组'
,
value
:
null
},
...
groupOptions
]}
initValue
=
{
null
}
initValue
=
{
null
}
onChange
=
{(
v
)
=>
{
onChange
=
{(
v
)
=>
{
setSearchGroup
(
v
);
setSearchGroup
(
v
);
searchChannels
(
searchKeyword
,
v
,
searchModel
);
searchChannels
(
searchKeyword
,
v
,
searchModel
);
}}
}}
/
>
/
>
<
Button
label
=
'查询'
type
=
'primary'
htmlType
=
'submit'
className
=
'btn-margin-right'
style
=
{{
marginRight
:
8
}}
>
查询
<
/Button
>
<
/Space
>
<
/div
>
<
/Form
>
<
Divider
style
=
{{
marginBottom
:
15
}}
/
>
<
div
style
=
{{
display
:
isMobile
()
?
''
:
'flex'
,
marginTop
:
isMobile
()
?
0
:
-
45
,
zIndex
:
999
,
pointerEvents
:
'none'
,
}}
>
<
Space
style
=
{{
pointerEvents
:
'auto'
,
marginTop
:
isMobile
()
?
0
:
45
}}
>
<
Typography
.
Text
strong
>
使用
ID
排序
<
/Typography.Text
>
<
Switch
checked
=
{
idSort
}
label
=
'使用ID排序'
uncheckedText
=
'关'
aria
-
label
=
'是否用ID排序'
onChange
=
{(
v
)
=>
{
localStorage
.
setItem
(
'id-sort'
,
v
+
''
);
setIdSort
(
v
);
loadChannels
(
0
,
pageSize
,
v
)
.
then
()
.
catch
((
reason
)
=>
{
showError
(
reason
);
});
}}
><
/Switch
>
<
Button
theme
=
'light'
type
=
'primary'
style
=
{{
marginRight
:
8
}}
onClick
=
{()
=>
{
setEditingChannel
({
id
:
undefined
,
});
setShowEdit
(
true
);
}}
>
添加渠道
<
/Button
>
<
Popconfirm
title
=
'确定?'
okType
=
{
'warning'
}
onConfirm
=
{
testAllChannels
}
position
=
{
isMobile
()
?
'top'
:
'top'
}
>
<
Button
theme
=
'light'
type
=
'warning'
style
=
{{
marginRight
:
8
}}
>
测试所有通道
<
/Button
>
<
/Popconfirm
>
<
Popconfirm
title
=
'确定?'
okType
=
{
'secondary'
}
onConfirm
=
{
updateAllChannelsBalance
}
>
<
Button
theme
=
'light'
type
=
'secondary'
style
=
{{
marginRight
:
8
}}
>
更新所有已启用通道余额
<
/Button
>
<
/Popconfirm
>
<
Popconfirm
title
=
'确定是否要删除禁用通道?'
content
=
'此修改将不可逆'
okType
=
{
'danger'
}
onConfirm
=
{
deleteAllDisabledChannels
}
>
<
Button
theme
=
'light'
type
=
'danger'
style
=
{{
marginRight
:
8
}}
>
删除禁用通道
<
/Button
>
<
/Popconfirm
>
<
Button
<
Button
label
=
'查询'
theme
=
'light'
type
=
'primary'
type
=
'primary'
htmlType
=
'submit'
style
=
{{
marginRight
:
8
}}
className
=
'btn-margin-right'
onClick
=
{
refresh
}
style
=
{{
marginRight
:
8
}}
>
>
查询
刷新
<
/Button
>
<
/Button
>
<
/Space
>
<
/Space
>
<
/div
>
<
/div
>
<
/Form
>
<
div
style
=
{{
marginTop
:
20
}}
>
<
div
style
=
{{
marginTop
:
10
,
display
:
'flex'
}}
>
<
Space
>
<
Space
>
<
Space
>
<
Typography
.
Text
strong
>
使用
ID
排序
<
/Typography.Text
>
<
Typography
.
Text
strong
>
开启批量删除
<
/Typography.Text
>
<
Switch
<
Switch
checked
=
{
idSort
}
label
=
'开启批量删除'
label
=
'使用ID排序'
uncheckedText
=
'关'
uncheckedText
=
'关'
aria
-
label
=
'是否开启批量删除'
aria
-
label
=
'是否用ID排序'
onChange
=
{(
v
)
=>
{
onChange
=
{(
v
)
=>
{
setEnableBatchDelete
(
v
);
localStorage
.
setItem
(
'id-sort'
,
v
+
''
);
}}
setIdSort
(
v
);
loadChannels
(
0
,
pageSize
,
v
)
.
then
()
.
catch
((
reason
)
=>
{
showError
(
reason
);
});
}}
><
/Switch
>
><
/Switch
>
<
Popconfirm
title
=
'确定是否要删除所选通道?'
content
=
'此修改将不可逆'
okType
=
{
'danger'
}
onConfirm
=
{
batchDeleteChannels
}
disabled
=
{
!
enableBatchDelete
}
position
=
{
'top'
}
>
<
Button
disabled
=
{
!
enableBatchDelete
}
theme
=
'light'
type
=
'danger'
style
=
{{
marginRight
:
8
}}
>
删除所选通道
<
/Button
>
<
/Popconfirm
>
<
Popconfirm
title
=
'确定是否要修复数据库一致性?'
content
=
'进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用'
okType
=
{
'warning'
}
onConfirm
=
{
fixChannelsAbilities
}
position
=
{
'top'
}
>
<
Button
theme
=
'light'
type
=
'secondary'
style
=
{{
marginRight
:
8
}}
>
修复数据库一致性
<
/Button
>
<
/Popconfirm
>
<
/Space
>
<
/Space
>
<
/Space
>
<
/div
>
<
/div
>
<
Table
className
=
{
'channel-table'
}
style
=
{{
marginTop
:
15
}}
columns
=
{
columns
}
dataSource
=
{
pageData
}
pagination
=
{{
currentPage
:
activePage
,
pageSize
:
pageSize
,
total
:
channelCount
,
pageSizeOpts
:
[
10
,
20
,
50
,
100
],
showSizeChanger
:
true
,
formatPageText
:
(
page
)
=>
''
,
onPageSizeChange
:
(
size
)
=>
{
handlePageSizeChange
(
size
).
then
();
},
onPageChange
:
handlePageChange
,
}}
loading
=
{
loading
}
onRow
=
{
handleRow
}
rowSelection
=
{
enableBatchDelete
?
{
onChange
:
(
selectedRowKeys
,
selectedRows
)
=>
{
// console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
setSelectedChannels
(
selectedRows
);
},
}
:
null
}
/
>
<
div
style
=
{{
display
:
isMobile
()
?
''
:
'flex'
,
marginTop
:
isMobile
()
?
0
:
-
45
,
zIndex
:
999
,
position
:
'relative'
,
pointerEvents
:
'none'
,
}}
>
<
Space
style
=
{{
pointerEvents
:
'auto'
,
marginTop
:
isMobile
()
?
0
:
45
}}
>
<
Button
theme
=
'light'
type
=
'primary'
style
=
{{
marginRight
:
8
}}
onClick
=
{()
=>
{
setEditingChannel
({
id
:
undefined
,
});
setShowEdit
(
true
);
}}
>
添加渠道
<
/Button
>
<
Popconfirm
title
=
'确定?'
okType
=
{
'warning'
}
onConfirm
=
{
testAllChannels
}
position
=
{
isMobile
()
?
'top'
:
'top'
}
>
<
Button
theme
=
'light'
type
=
'warning'
style
=
{{
marginRight
:
8
}}
>
测试所有通道
<
/Button
>
<
/Popconfirm
>
<
Popconfirm
title
=
'确定?'
okType
=
{
'secondary'
}
onConfirm
=
{
updateAllChannelsBalance
}
>
<
Button
theme
=
'light'
type
=
'secondary'
style
=
{{
marginRight
:
8
}}
>
更新所有已启用通道余额
<
/Button
>
<
/Popconfirm
>
<
Popconfirm
title
=
'确定是否要删除禁用通道?'
content
=
'此修改将不可逆'
okType
=
{
'danger'
}
onConfirm
=
{
deleteAllDisabledChannels
}
>
<
Button
theme
=
'light'
type
=
'danger'
style
=
{{
marginRight
:
8
}}
>
删除禁用通道
<
/Button
>
<
/Popconfirm
>
<
Button
<
Table
theme
=
'light'
className
=
{
'channel-table'
}
type
=
'primary'
style
=
{{
marginTop
:
15
}}
style
=
{{
marginRight
:
8
}}
columns
=
{
columns
}
onClick
=
{
refresh
}
dataSource
=
{
pageData
}
>
pagination
=
{{
刷新
currentPage
:
activePage
,
<
/Button
>
pageSize
:
pageSize
,
<
/Space
>
total
:
channelCount
,
{
/*<div style={{width: '100%', pointerEvents: 'none', position: 'absolute'}}>*/
}
pageSizeOpts
:
[
10
,
20
,
50
,
100
],
showSizeChanger
:
true
,
{
/*</div>*/
}
formatPageText
:
(
page
)
=>
''
,
<
/div
>
onPageSizeChange
:
(
size
)
=>
{
<
div
style
=
{{
marginTop
:
20
}}
>
handlePageSizeChange
(
size
).
then
();
<
Space
>
},
<
Typography
.
Text
strong
>
开启批量删除
<
/Typography.Text
>
onPageChange
:
handlePageChange
,
<
Switch
label
=
'开启批量删除'
uncheckedText
=
'关'
aria
-
label
=
'是否开启批量删除'
onChange
=
{(
v
)
=>
{
setEnableBatchDelete
(
v
);
}}
}}
><
/Switch
>
loading
=
{
loading
}
<
Popconfirm
onRow
=
{
handleRow
}
title
=
'确定是否要删除所选通道?'
rowSelection
=
{
content
=
'此修改将不可逆'
enableBatchDelete
okType
=
{
'danger'
}
?
{
onConfirm
=
{
batchDeleteChannels
}
onChange
:
(
selectedRowKeys
,
selectedRows
)
=>
{
disabled
=
{
!
enableBatchDelete
}
// console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
position
=
{
'top'
}
setSelectedChannels
(
selectedRows
);
>
},
<
Button
}
disabled
=
{
!
enableBatchDelete
}
:
null
theme
=
'light'
}
type
=
'danger'
/
>
style
=
{{
marginRight
:
8
}}
<
/
>
>
删除所选通道
<
/Button
>
<
/Popconfirm
>
<
Popconfirm
title
=
'确定是否要修复数据库一致性?'
content
=
'进行该操作时,可能导致渠道访问错误,请仅在数据库出现问题时使用'
okType
=
{
'warning'
}
onConfirm
=
{
fixChannelsAbilities
}
position
=
{
'top'
}
>
<
Button
theme
=
'light'
type
=
'secondary'
style
=
{{
marginRight
:
8
}}
>
修复数据库一致性
<
/Button
>
<
/Popconfirm
>
<
/Space
>
<
/div
>
<
/
>
);
);
};
};
...
...
web/src/components/LogsTable.js
View file @
e22e41c9
...
@@ -767,6 +767,22 @@ const LogsTable = () => {
...
@@ -767,6 +767,22 @@ const LogsTable = () => {
<
Form
.
Section
><
/Form.Section
>
<
Form
.
Section
><
/Form.Section
>
<
/
>
<
/
>
<
/Form
>
<
/Form
>
<
div
style
=
{{
marginTop
:
10
}}
>
<
Select
defaultValue
=
'0'
style
=
{{
width
:
120
}}
onChange
=
{(
value
)
=>
{
setLogType
(
parseInt
(
value
));
loadLogs
(
0
,
pageSize
,
parseInt
(
value
));
}}
>
<
Select
.
Option
value
=
'0'
>
全部
<
/Select.Option
>
<
Select
.
Option
value
=
'1'
>
充值
<
/Select.Option
>
<
Select
.
Option
value
=
'2'
>
消费
<
/Select.Option
>
<
Select
.
Option
value
=
'3'
>
管理
<
/Select.Option
>
<
Select
.
Option
value
=
'4'
>
系统
<
/Select.Option
>
<
/Select
>
<
/div
>
<
Table
<
Table
style
=
{{
marginTop
:
5
}}
style
=
{{
marginTop
:
5
}}
columns
=
{
columns
}
columns
=
{
columns
}
...
@@ -786,20 +802,6 @@ const LogsTable = () => {
...
@@ -786,20 +802,6 @@ const LogsTable = () => {
onPageChange
:
handlePageChange
,
onPageChange
:
handlePageChange
,
}}
}}
/
>
/
>
<
Select
defaultValue
=
'0'
style
=
{{
width
:
120
}}
onChange
=
{(
value
)
=>
{
setLogType
(
parseInt
(
value
));
loadLogs
(
0
,
pageSize
,
parseInt
(
value
));
}}
>
<
Select
.
Option
value
=
'0'
>
全部
<
/Select.Option
>
<
Select
.
Option
value
=
'1'
>
充值
<
/Select.Option
>
<
Select
.
Option
value
=
'2'
>
消费
<
/Select.Option
>
<
Select
.
Option
value
=
'3'
>
管理
<
/Select.Option
>
<
Select
.
Option
value
=
'4'
>
系统
<
/Select.Option
>
<
/Select
>
<
/Layout
>
<
/Layout
>
<
/
>
<
/
>
);
);
...
...
web/src/components/RedemptionsTable.js
View file @
e22e41c9
...
@@ -10,7 +10,7 @@ import {
...
@@ -10,7 +10,7 @@ import {
import
{
ITEMS_PER_PAGE
}
from
'../constants'
;
import
{
ITEMS_PER_PAGE
}
from
'../constants'
;
import
{
renderQuota
}
from
'../helpers/render'
;
import
{
renderQuota
}
from
'../helpers/render'
;
import
{
import
{
Button
,
Button
,
Divider
,
Form
,
Form
,
Modal
,
Modal
,
Popconfirm
,
Popconfirm
,
...
@@ -391,6 +391,39 @@ const RedemptionsTable = () => {
...
@@ -391,6 +391,39 @@ const RedemptionsTable = () => {
onChange
=
{
handleKeywordChange
}
onChange
=
{
handleKeywordChange
}
/
>
/
>
<
/Form
>
<
/Form
>
<
Divider
style
=
{{
margin
:
'5px 0 15px 0'
}}
/
>
<
div
>
<
Button
theme
=
'light'
type
=
'primary'
style
=
{{
marginRight
:
8
}}
onClick
=
{()
=>
{
setEditingRedemption
({
id
:
undefined
,
});
setShowEdit
(
true
);
}}
>
添加兑换码
<
/Button
>
<
Button
label
=
'复制所选兑换码'
type
=
'warning'
onClick
=
{
async
()
=>
{
if
(
selectedKeys
.
length
===
0
)
{
showError
(
'请至少选择一个兑换码!'
);
return
;
}
let
keys
=
''
;
for
(
let
i
=
0
;
i
<
selectedKeys
.
length
;
i
++
)
{
keys
+=
selectedKeys
[
i
].
name
+
' '
+
selectedKeys
[
i
].
key
+
'\n'
;
}
await
copyText
(
keys
);
}}
>
复制所选兑换码到剪贴板
<
/Button
>
<
/div
>
<
Table
<
Table
style
=
{{
marginTop
:
20
}}
style
=
{{
marginTop
:
20
}}
...
@@ -414,36 +447,6 @@ const RedemptionsTable = () => {
...
@@ -414,36 +447,6 @@ const RedemptionsTable = () => {
rowSelection
=
{
rowSelection
}
rowSelection
=
{
rowSelection
}
onRow
=
{
handleRow
}
onRow
=
{
handleRow
}
><
/Table
>
><
/Table
>
<
Button
theme
=
'light'
type
=
'primary'
style
=
{{
marginRight
:
8
}}
onClick
=
{()
=>
{
setEditingRedemption
({
id
:
undefined
,
});
setShowEdit
(
true
);
}}
>
添加兑换码
<
/Button
>
<
Button
label
=
'复制所选兑换码'
type
=
'warning'
onClick
=
{
async
()
=>
{
if
(
selectedKeys
.
length
===
0
)
{
showError
(
'请至少选择一个兑换码!'
);
return
;
}
let
keys
=
''
;
for
(
let
i
=
0
;
i
<
selectedKeys
.
length
;
i
++
)
{
keys
+=
selectedKeys
[
i
].
name
+
' '
+
selectedKeys
[
i
].
key
+
'\n'
;
}
await
copyText
(
keys
);
}}
>
复制所选兑换码到剪贴板
<
/Button
>
<
/
>
<
/
>
);
);
};
};
...
...
web/src/components/TokensTable.js
View file @
e22e41c9
...
@@ -10,7 +10,7 @@ import {
...
@@ -10,7 +10,7 @@ import {
import
{
ITEMS_PER_PAGE
}
from
'../constants'
;
import
{
ITEMS_PER_PAGE
}
from
'../constants'
;
import
{
renderGroup
,
renderQuota
}
from
'../helpers/render'
;
import
{
renderGroup
,
renderQuota
}
from
'../helpers/render'
;
import
{
import
{
Button
,
Button
,
Divider
,
Dropdown
,
Dropdown
,
Form
,
Form
,
Modal
,
Modal
,
...
@@ -596,6 +596,40 @@ const TokensTable = () => {
...
@@ -596,6 +596,40 @@ const TokensTable = () => {
查询
查询
<
/Button
>
<
/Button
>
<
/Form
>
<
/Form
>
<
Divider
style
=
{{
margin
:
'15px 0'
}}
/
>
<
div
>
<
Button
theme
=
'light'
type
=
'primary'
style
=
{{
marginRight
:
8
}}
onClick
=
{()
=>
{
setEditingToken
({
id
:
undefined
,
});
setShowEdit
(
true
);
}}
>
添加令牌
<
/Button
>
<
Button
label
=
'复制所选令牌'
type
=
'warning'
onClick
=
{
async
()
=>
{
if
(
selectedKeys
.
length
===
0
)
{
showError
(
'请至少选择一个令牌!'
);
return
;
}
let
keys
=
''
;
for
(
let
i
=
0
;
i
<
selectedKeys
.
length
;
i
++
)
{
keys
+=
selectedKeys
[
i
].
name
+
' sk-'
+
selectedKeys
[
i
].
key
+
'\n'
;
}
await
copyText
(
keys
);
}}
>
复制所选令牌到剪贴板
<
/Button
>
<
/div
>
<
Table
<
Table
style
=
{{
marginTop
:
20
}}
style
=
{{
marginTop
:
20
}}
...
@@ -619,37 +653,6 @@ const TokensTable = () => {
...
@@ -619,37 +653,6 @@ const TokensTable = () => {
rowSelection
=
{
rowSelection
}
rowSelection
=
{
rowSelection
}
onRow
=
{
handleRow
}
onRow
=
{
handleRow
}
><
/Table
>
><
/Table
>
<
Button
theme
=
'light'
type
=
'primary'
style
=
{{
marginRight
:
8
}}
onClick
=
{()
=>
{
setEditingToken
({
id
:
undefined
,
});
setShowEdit
(
true
);
}}
>
添加令牌
<
/Button
>
<
Button
label
=
'复制所选令牌'
type
=
'warning'
onClick
=
{
async
()
=>
{
if
(
selectedKeys
.
length
===
0
)
{
showError
(
'请至少选择一个令牌!'
);
return
;
}
let
keys
=
''
;
for
(
let
i
=
0
;
i
<
selectedKeys
.
length
;
i
++
)
{
keys
+=
selectedKeys
[
i
].
name
+
' sk-'
+
selectedKeys
[
i
].
key
+
'\n'
;
}
await
copyText
(
keys
);
}}
>
复制所选令牌到剪贴板
<
/Button
>
<
/
>
<
/
>
);
);
};
};
...
...
web/src/components/UsersTable.js
View file @
e22e41c9
...
@@ -476,10 +476,18 @@ const UsersTable = () => {
...
@@ -476,10 +476,18 @@ const UsersTable = () => {
type
=
'primary'
type
=
'primary'
htmlType
=
'submit'
htmlType
=
'submit'
className
=
'btn-margin-right'
className
=
'btn-margin-right'
style
=
{{
marginRight
:
8
}}
>
>
查询
查询
<
/Button
>
<
/Button
>
<
Button
theme
=
'light'
type
=
'primary'
onClick
=
{()
=>
{
setShowAddUser
(
true
);
}}
>
添加用户
<
/Button
>
<
/Space
>
<
/Space
>
<
/div
>
<
/div
>
<
/Form
>
<
/Form
>
...
@@ -496,16 +504,6 @@ const UsersTable = () => {
...
@@ -496,16 +504,6 @@ const UsersTable = () => {
}}
}}
loading
=
{
loading
}
loading
=
{
loading
}
/
>
/
>
<
Button
theme
=
'light'
type
=
'primary'
style
=
{{
marginRight
:
8
}}
onClick
=
{()
=>
{
setShowAddUser
(
true
);
}}
>
添加用户
<
/Button
>
<
/
>
<
/
>
);
);
};
};
...
...
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