Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
T
topology
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
姜立玮
topology
Commits
90ac416e
提交
90ac416e
authored
11月 23, 2020
作者:
RuoYi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
新增缓存监控功能
上级
5b63f0ca
变更
6
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
226 行增加
和
11 行删除
+226
-11
CacheController.java
...ava/com/ruoyi/web/controller/monitor/CacheController.java
+53
-0
ServerController.java
...va/com/ruoyi/web/controller/monitor/ServerController.java
+1
-2
cache.js
ruoyi-ui/src/api/monitor/cache.js
+9
-0
redis.svg
ruoyi-ui/src/assets/icons/svg/redis.svg
+1
-0
index.vue
ruoyi-ui/src/views/monitor/cache/index.vue
+151
-0
ry_20201123.sql
sql/ry_20201123.sql
+11
-9
没有找到文件。
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
0 → 100644
浏览文件 @
90ac416e
package
com
.
ruoyi
.
web
.
controller
.
monitor
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Properties
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.redis.core.RedisCallback
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.ruoyi.common.core.domain.AjaxResult
;
import
com.ruoyi.common.utils.StringUtils
;
/**
* 缓存监控
*
* @author ruoyi
*/
@RestController
@RequestMapping
(
"/monitor/cache"
)
public
class
CacheController
{
@Autowired
private
RedisTemplate
<
String
,
String
>
redisTemplate
;
@PreAuthorize
(
"@ss.hasPermi('monitor:cache:list')"
)
@GetMapping
()
public
AjaxResult
getInfo
()
throws
Exception
{
Properties
info
=
(
Properties
)
redisTemplate
.
execute
((
RedisCallback
<
Object
>)
connection
->
connection
.
info
());
Properties
commandStats
=
(
Properties
)
redisTemplate
.
execute
((
RedisCallback
<
Object
>)
connection
->
connection
.
info
(
"commandstats"
));
Object
dbSize
=
redisTemplate
.
execute
((
RedisCallback
<
Object
>)
connection
->
connection
.
dbSize
());
Map
<
String
,
Object
>
result
=
new
HashMap
<>(
3
);
result
.
put
(
"info"
,
info
);
result
.
put
(
"dbSize"
,
dbSize
);
List
<
Map
<
String
,
String
>>
pieList
=
new
ArrayList
<>();
commandStats
.
stringPropertyNames
().
forEach
(
key
->
{
Map
<
String
,
String
>
data
=
new
HashMap
<>(
2
);
String
property
=
commandStats
.
getProperty
(
key
);
data
.
put
(
"name"
,
StringUtils
.
removeStart
(
key
,
"cmdstat_"
));
data
.
put
(
"value"
,
StringUtils
.
substringBetween
(
property
,
"calls="
,
",usec"
));
pieList
.
add
(
data
);
});
result
.
put
(
"commandStats"
,
pieList
);
return
AjaxResult
.
success
(
result
);
}
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java
浏览文件 @
90ac416e
...
...
@@ -4,7 +4,6 @@ import org.springframework.security.access.prepost.PreAuthorize;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.ruoyi.common.core.controller.BaseController
;
import
com.ruoyi.common.core.domain.AjaxResult
;
import
com.ruoyi.framework.web.domain.Server
;
...
...
@@ -15,7 +14,7 @@ import com.ruoyi.framework.web.domain.Server;
*/
@RestController
@RequestMapping
(
"/monitor/server"
)
public
class
ServerController
extends
BaseController
public
class
ServerController
{
@PreAuthorize
(
"@ss.hasPermi('monitor:server:list')"
)
@GetMapping
()
...
...
ruoyi-ui/src/api/monitor/cache.js
0 → 100644
浏览文件 @
90ac416e
import
request
from
'@/utils/request'
// 查询缓存详细
export
function
getCache
()
{
return
request
({
url
:
'/monitor/cache'
,
method
:
'get'
})
}
ruoyi-ui/src/assets/icons/svg/redis.svg
0 → 100644
浏览文件 @
90ac416e
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg
t=
"1605865043777"
class=
"icon"
viewBox=
"0 0 1024 1024"
version=
"1.1"
xmlns=
"http://www.w3.org/2000/svg"
p-id=
"856"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
width=
"200"
height=
"200"
><defs><style
type=
"text/css"
></style></defs><path
d=
"M1023.786667 611.84c-0.426667 9.770667-13.354667 20.693333-39.893334 34.56-54.613333 28.458667-337.749333 144.896-397.994666 176.298667-60.288 31.402667-93.738667 31.104-141.354667 8.32-47.616-22.741333-348.842667-144.469333-403.114667-170.368-27.093333-12.970667-40.917333-23.893333-41.386666-34.218667v103.509333c0 10.325333 14.250667 21.290667 41.386666 34.261334 54.272 25.941333 355.541333 147.626667 403.114667 170.368 47.616 22.784 81.066667 23.082667 141.354667-8.362667 60.245333-31.402667 343.338667-147.797333 397.994666-176.298667 27.776-14.464 40.106667-25.728 40.106667-35.925333v-102.058667l-0.213333-0.085333z m0-168.746667c-0.512 9.770667-13.397333 20.650667-39.893334 34.517334-54.613333 28.458667-337.749333 144.896-397.994666 176.298666-60.288 31.402667-93.738667 31.104-141.354667 8.362667-47.616-22.741333-348.842667-144.469333-403.114667-170.410667-27.093333-12.928-40.917333-23.893333-41.386666-34.176v103.509334c0 10.325333 14.250667 21.248 41.386666 34.218666 54.272 25.941333 355.498667 147.626667 403.114667 170.368 47.616 22.784 81.066667 23.082667 141.354667-8.32 60.245333-31.402667 343.338667-147.84 397.994666-176.298666 27.776-14.506667 40.106667-25.770667 40.106667-35.968v-102.058667l-0.256-0.042667z m0-175.018666c0.469333-10.410667-13.141333-19.541333-40.533334-29.610667-53.248-19.498667-334.634667-131.498667-388.522666-151.253333-53.888-19.712-75.818667-18.901333-139.093334 3.84C392.234667 113.706667 92.629333 231.253333 39.338667 252.074667c-26.666667 10.496-39.68 20.181333-39.253334 30.506666V386.133333c0 10.325333 14.250667 21.248 41.386667 34.218667 54.272 25.941333 355.498667 147.669333 403.114667 170.410667 47.616 22.741333 81.066667 23.04 141.354666-8.362667 60.245333-31.402667 343.338667-147.84 397.994667-176.298667 27.776-14.506667 40.106667-25.770667 40.106667-35.968V268.074667h-0.341334zM366.677333 366.08l237.269334-36.437333-71.68 105.088-165.546667-68.650667z m524.8-94.634667l-140.330666 55.466667-15.232 5.973333-140.245334-55.466666 155.392-61.44 140.373334 55.466666z m-411.989333-101.674666l-22.954667-42.325334 71.594667 27.989334 67.498667-22.101334-18.261334 43.733334 68.778667 25.770666-88.704 9.216-19.882667 47.786667-32.085333-53.290667-102.4-9.216 76.416-27.562666z m-176.768 59.733333c70.058667 0 126.805333 21.973333 126.805333 49.109333s-56.746667 49.152-126.805333 49.152-126.848-22.058667-126.848-49.152c0-27.136 56.789333-49.152 126.848-49.152z"
p-id=
"857"
></path></svg>
\ No newline at end of file
ruoyi-ui/src/views/monitor/cache/index.vue
0 → 100644
浏览文件 @
90ac416e
<
template
>
<div
class=
"app-container"
>
<el-row>
<el-col
:span=
"24"
class=
"card-box"
>
<el-card>
<div
slot=
"header"
><span>
基本信息
</span></div>
<div
class=
"el-table el-table--enable-row-hover el-table--medium"
>
<table
cellspacing=
"0"
style=
"width: 100%"
>
<tbody>
<tr>
<td><div
class=
"cell"
>
Redis版本
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
cache
.
info
.
redis_version
}}
</div></td>
<td><div
class=
"cell"
>
运行模式
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
cache
.
info
.
redis_mode
==
"standalone"
?
"单机"
:
"集群"
}}
</div></td>
<td><div
class=
"cell"
>
端口
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
cache
.
info
.
tcp_port
}}
</div></td>
<td><div
class=
"cell"
>
客户端数
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
cache
.
info
.
connected_clients
}}
</div></td>
</tr>
<tr>
<td><div
class=
"cell"
>
运行时间(天)
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
cache
.
info
.
uptime_in_days
}}
</div></td>
<td><div
class=
"cell"
>
使用内存
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
cache
.
info
.
used_memory_human
}}
</div></td>
<td><div
class=
"cell"
>
使用CPU
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
parseFloat
(
cache
.
info
.
used_cpu_user_children
).
toFixed
(
2
)
}}
</div></td>
<td><div
class=
"cell"
>
内存配置
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
cache
.
info
.
maxmemory_human
}}
</div></td>
</tr>
<tr>
<td><div
class=
"cell"
>
AOF是否开启
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
cache
.
info
.
aof_enabled
==
"0"
?
"否"
:
"是"
}}
</div></td>
<td><div
class=
"cell"
>
RDB是否成功
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
cache
.
info
.
rdb_last_bgsave_status
}}
</div></td>
<td><div
class=
"cell"
>
Key数量
</div></td>
<td><div
class=
"cell"
v-if=
"cache.dbSize"
>
{{
cache
.
dbSize
}}
</div></td>
<td><div
class=
"cell"
>
网络入口/出口
</div></td>
<td><div
class=
"cell"
v-if=
"cache.info"
>
{{
cache
.
info
.
instantaneous_input_kbps
}}
kps/
{{
cache
.
info
.
instantaneous_output_kbps
}}
kps
</div></td>
</tr>
</tbody>
</table>
</div>
</el-card>
</el-col>
<el-col
:span=
"12"
class=
"card-box"
>
<el-card>
<div
slot=
"header"
><span>
命令统计
</span></div>
<div
class=
"el-table el-table--enable-row-hover el-table--medium"
>
<div
ref=
"commandstats"
style=
"height: 420px"
/>
</div>
</el-card>
</el-col>
<el-col
:span=
"12"
class=
"card-box"
>
<el-card>
<div
slot=
"header"
>
<span>
内存信息
</span>
</div>
<div
class=
"el-table el-table--enable-row-hover el-table--medium"
>
<div
ref=
"usedmemory"
style=
"height: 420px"
/>
</div>
</el-card>
</el-col>
</el-row>
</div>
</
template
>
<
script
>
import
{
getCache
}
from
"@/api/monitor/cache"
;
import
echarts
from
"echarts"
;
export
default
{
name
:
"Server"
,
data
()
{
return
{
// 加载层信息
loading
:
[],
// 统计命令信息
commandstats
:
null
,
// 使用内存
usedmemory
:
null
,
// cache信息
cache
:
[],
};
},
created
()
{
this
.
getList
();
this
.
openLoading
();
},
methods
:
{
/** 查缓存询信息 */
getList
()
{
getCache
().
then
((
response
)
=>
{
this
.
cache
=
response
.
data
;
this
.
loading
.
close
();
this
.
commandstats
=
echarts
.
init
(
this
.
$refs
.
commandstats
,
"macarons"
);
this
.
commandstats
.
setOption
({
tooltip
:
{
trigger
:
"item"
,
formatter
:
"{a} <br/>{b} : {c} ({d}%)"
,
},
series
:
[
{
name
:
"命令"
,
type
:
"pie"
,
roseType
:
"radius"
,
radius
:
[
15
,
95
],
center
:
[
"50%"
,
"38%"
],
data
:
response
.
data
.
commandStats
,
animationEasing
:
"cubicInOut"
,
animationDuration
:
1000
,
},
],
});
this
.
usedmemory
=
echarts
.
init
(
this
.
$refs
.
usedmemory
,
"macarons"
);
this
.
usedmemory
.
setOption
({
tooltip
:
{
formatter
:
"{b} <br/>{a} : {c}M"
,
},
series
:
[
{
name
:
"峰值"
,
type
:
"gauge"
,
detail
:
{
formatter
:
"{value}M"
,
},
data
:
[
{
value
:
parseFloat
(
this
.
cache
.
info
.
used_memory_human
),
name
:
"内存消耗"
,
},
],
},
],
});
});
},
// 打开加载层
openLoading
()
{
this
.
loading
=
this
.
$loading
({
lock
:
true
,
text
:
"拼命读取中"
,
spinner
:
"el-icon-loading"
,
background
:
"rgba(0, 0, 0, 0.7)"
,
});
},
},
};
</
script
>
sql/ry_20201
021
.sql
→
sql/ry_20201
123
.sql
浏览文件 @
90ac416e
...
...
@@ -174,9 +174,10 @@ insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'm
insert
into
sys_menu
values
(
'110'
,
'定时任务'
,
'2'
,
'2'
,
'job'
,
'monitor/job/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'monitor:job:list'
,
'job'
,
'admin'
,
sysdate
(),
''
,
null
,
'定时任务菜单'
);
insert
into
sys_menu
values
(
'111'
,
'数据监控'
,
'2'
,
'3'
,
'druid'
,
'monitor/druid/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'monitor:druid:list'
,
'druid'
,
'admin'
,
sysdate
(),
''
,
null
,
'数据监控菜单'
);
insert
into
sys_menu
values
(
'112'
,
'服务监控'
,
'2'
,
'4'
,
'server'
,
'monitor/server/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'monitor:server:list'
,
'server'
,
'admin'
,
sysdate
(),
''
,
null
,
'服务监控菜单'
);
insert
into
sys_menu
values
(
'113'
,
'表单构建'
,
'3'
,
'1'
,
'build'
,
'tool/build/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'tool:build:list'
,
'build'
,
'admin'
,
sysdate
(),
''
,
null
,
'表单构建菜单'
);
insert
into
sys_menu
values
(
'114'
,
'代码生成'
,
'3'
,
'2'
,
'gen'
,
'tool/gen/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'tool:gen:list'
,
'code'
,
'admin'
,
sysdate
(),
''
,
null
,
'代码生成菜单'
);
insert
into
sys_menu
values
(
'115'
,
'系统接口'
,
'3'
,
'3'
,
'swagger'
,
'tool/swagger/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'tool:swagger:list'
,
'swagger'
,
'admin'
,
sysdate
(),
''
,
null
,
'系统接口菜单'
);
insert
into
sys_menu
values
(
'113'
,
'缓存监控'
,
'2'
,
'5'
,
'cache'
,
'monitor/cache/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'monitor:cache:list'
,
'redis'
,
'admin'
,
sysdate
(),
''
,
null
,
'缓存监控菜单'
);
insert
into
sys_menu
values
(
'114'
,
'表单构建'
,
'3'
,
'1'
,
'build'
,
'tool/build/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'tool:build:list'
,
'build'
,
'admin'
,
sysdate
(),
''
,
null
,
'表单构建菜单'
);
insert
into
sys_menu
values
(
'115'
,
'代码生成'
,
'3'
,
'2'
,
'gen'
,
'tool/gen/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'tool:gen:list'
,
'code'
,
'admin'
,
sysdate
(),
''
,
null
,
'代码生成菜单'
);
insert
into
sys_menu
values
(
'116'
,
'系统接口'
,
'3'
,
'3'
,
'swagger'
,
'tool/swagger/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'tool:swagger:list'
,
'swagger'
,
'admin'
,
sysdate
(),
''
,
null
,
'系统接口菜单'
);
-- 三级菜单
insert
into
sys_menu
values
(
'500'
,
'操作日志'
,
'108'
,
'1'
,
'operlog'
,
'monitor/operlog/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'monitor:operlog:list'
,
'form'
,
'admin'
,
sysdate
(),
''
,
null
,
'操作日志菜单'
);
insert
into
sys_menu
values
(
'501'
,
'登录日志'
,
'108'
,
'2'
,
'logininfor'
,
'monitor/logininfor/index'
,
1
,
0
,
'C'
,
'0'
,
'0'
,
'monitor:logininfor:list'
,
'logininfor'
,
'admin'
,
sysdate
(),
''
,
null
,
'登录日志菜单'
);
...
...
@@ -247,12 +248,12 @@ insert into sys_menu values('1052', '任务删除', '110', '4', '#', '', 1, 0, '
insert
into
sys_menu
values
(
'1053'
,
'状态修改'
,
'110'
,
'5'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'monitor:job:changeStatus'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1054'
,
'任务导出'
,
'110'
,
'7'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'monitor:job:export'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
-- 代码生成按钮
insert
into
sys_menu
values
(
'1055'
,
'生成查询'
,
'11
4
'
,
'1'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:query'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1056'
,
'生成修改'
,
'11
4
'
,
'2'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:edit'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1057'
,
'生成删除'
,
'11
4
'
,
'3'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:remove'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1058'
,
'导入代码'
,
'11
4
'
,
'2'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:import'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1059'
,
'预览代码'
,
'11
4
'
,
'4'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:preview'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1060'
,
'生成代码'
,
'11
4
'
,
'5'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:code'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1055'
,
'生成查询'
,
'11
5
'
,
'1'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:query'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1056'
,
'生成修改'
,
'11
5
'
,
'2'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:edit'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1057'
,
'生成删除'
,
'11
5
'
,
'3'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:remove'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1058'
,
'导入代码'
,
'11
5
'
,
'2'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:import'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1059'
,
'预览代码'
,
'11
5
'
,
'4'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:preview'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
insert
into
sys_menu
values
(
'1060'
,
'生成代码'
,
'11
5
'
,
'5'
,
'#'
,
''
,
1
,
0
,
'F'
,
'0'
,
'0'
,
'tool:gen:code'
,
'#'
,
'admin'
,
sysdate
(),
''
,
null
,
''
);
-- ----------------------------
...
...
@@ -305,6 +306,7 @@ insert into sys_role_menu values ('2', '112');
insert
into
sys_role_menu
values
(
'2'
,
'113'
);
insert
into
sys_role_menu
values
(
'2'
,
'114'
);
insert
into
sys_role_menu
values
(
'2'
,
'115'
);
insert
into
sys_role_menu
values
(
'2'
,
'116'
);
insert
into
sys_role_menu
values
(
'2'
,
'500'
);
insert
into
sys_role_menu
values
(
'2'
,
'501'
);
insert
into
sys_role_menu
values
(
'2'
,
'1000'
);
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论