Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
map-parent
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
常超
map-parent
Commits
263fcb48
Commit
263fcb48
authored
Nov 08, 2022
by
宋珺琪
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
服务管理四个下载接口、时空桌面新建图标路径、统计第三方接口sql优化
parent
7059227b
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
156 additions
and
69 deletions
+156
-69
common/service_base/src/main/java/com/founder/servicebase/controller/SkServiceApplyController.java
+38
-0
common/service_base/src/main/java/com/founder/servicebase/controller/SkServiceController.java
+32
-0
common/service_base/src/main/java/com/founder/servicebase/logs/controller/SkSysLogController.java
+42
-0
common/service_base/src/main/java/com/founder/servicebase/logs/mapper/mysqlMapper/SkSysLogMapper.xml
+1
-1
service/publicapi/src/main/java/com/founder/publicapi/controller/SkDataOperation/SkServiceSqController.java
+32
-0
service/publicapi/src/main/java/com/founder/publicapi/controller/SkDataUpload/FtpUtil.java
+0
-50
service/publicapi/src/main/java/com/founder/publicapi/controller/SkypDesktop/SkypDesktopController.java
+6
-6
service/publicapi/src/main/resources/bootstrap-dev.properties
+3
-6
service/publicapi/src/main/resources/bootstrap-prod.properties
+2
-6
No files found.
common/service_base/src/main/java/com/founder/servicebase/controller/SkServiceApplyController.java
View file @
263fcb48
...
...
@@ -6,10 +6,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import
com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
;
import
com.baomidou.mybatisplus.extension.api.ApiController
;
import
com.founder.commonutils.model.newPublicEntity.MapRestResult
;
import
com.founder.commonutils.model.newPublicEntity.SkService
;
import
com.founder.commonutils.model.newPublicEntity.SkServiceApply
;
import
com.founder.commonutils.model.newPublicEntity.ThirdToken
;
import
com.founder.commonutils.model.vo.param.SkServiceApplyParam
;
import
com.founder.commonutils.model.vo.response.SkServiceApplyVO
;
import
com.founder.commonutils.util.ExportExcelUtil
;
import
com.founder.commonutils.util.JwtUser
;
import
com.founder.commonutils.util.KeyUtil
;
import
com.founder.servicebase.logs.OperLog
;
...
...
@@ -25,6 +27,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.annotation.Resource
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.Date
;
import
java.util.List
;
...
...
@@ -160,5 +163,40 @@ public class SkServiceApplyController extends ApiController {
}
/**
* 服务授权列表信息导出
*/
@PostMapping
(
"export"
)
@ApiOperation
(
value
=
"服务授权列表信息导出"
)
@OperLog
(
message
=
"服务授权列表信息导出"
,
operation
=
OperationType
.
QUERY
)
public
void
export
(
HttpServletResponse
response
,
@RequestBody
SkServiceApplyParam
skRegionalsDetailParam
)
throws
Exception
{
QueryWrapper
queryWrapper
=
new
QueryWrapper
<>();
if
(
skRegionalsDetailParam
.
getServicename
()!=
null
&&
!
skRegionalsDetailParam
.
getServicename
().
equals
(
""
)){
queryWrapper
.
like
(
"servicename"
,
skRegionalsDetailParam
.
getServicename
());
}
if
(
skRegionalsDetailParam
.
getServicems
()!=
null
&&
!
skRegionalsDetailParam
.
getServicems
().
equals
(
""
)){
queryWrapper
.
like
(
"servicems"
,
skRegionalsDetailParam
.
getServicems
());
}
if
(
skRegionalsDetailParam
.
getApplygs
()!=
null
&&
!
skRegionalsDetailParam
.
getApplygs
().
equals
(
""
)){
queryWrapper
.
like
(
"applygs"
,
skRegionalsDetailParam
.
getApplygs
());
}
if
(
skRegionalsDetailParam
.
getApplyurl
()!=
null
&&
!
skRegionalsDetailParam
.
getApplyurl
().
equals
(
""
)){
queryWrapper
.
like
(
"applyurl"
,
skRegionalsDetailParam
.
getApplyurl
());
}
queryWrapper
.
orderByDesc
(
"sqsj"
);
List
list
=
skServiceApplyService
.
list
(
queryWrapper
);
ExportExcelUtil
<
SkService
>
exportExcelUtil
=
new
ExportExcelUtil
<>();
String
[]
headersName
=
{
"服务名称"
,
"服务描述"
,
"申请公司"
,
"申请ip"
,
"申请时效"
,
"token值"
,
"备注"
};
String
[]
headersField
=
{
"servicename"
,
"servicems"
,
"applygs"
,
"applyurl"
,
"time"
,
"token"
,
"content"
};
exportExcelUtil
.
exportExcel
(
"DataStatistics"
,
headersName
,
headersField
,
list
,
response
,
"服务授权列表信息"
);
}
}
common/service_base/src/main/java/com/founder/servicebase/controller/SkServiceController.java
View file @
263fcb48
...
...
@@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.extension.api.ApiController;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.founder.commonutils.model.newPublicEntity.MapRestResult
;
import
com.founder.commonutils.model.newPublicEntity.SkService
;
import
com.founder.commonutils.model.newPublicEntity.SkTrail
;
import
com.founder.commonutils.model.vo.param.SkServiceParam
;
import
com.founder.commonutils.util.ExportExcelUtil
;
import
com.founder.commonutils.util.KeyUtil
;
import
com.founder.servicebase.logs.OperLog
;
import
com.founder.servicebase.logs.OperationType
;
...
...
@@ -21,8 +23,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.annotation.Resource
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.util.Date
;
import
java.util.List
;
/**
* 服务列表(SkService)表控制层
...
...
@@ -141,6 +145,34 @@ public class SkServiceController extends ApiController {
/**
* 服务列表信息导出
*/
@PostMapping
(
"export"
)
@ApiOperation
(
value
=
"服务列表信息导出"
)
@OperLog
(
message
=
"服务列表信息导出"
,
operation
=
OperationType
.
QUERY
)
public
void
export
(
HttpServletResponse
response
,
@RequestBody
SkServiceParam
skRegionalsDetailParam
)
throws
Exception
{
QueryWrapper
queryWrapper
=
new
QueryWrapper
();
if
(
skRegionalsDetailParam
.
getName
()!=
null
&&
!
skRegionalsDetailParam
.
getName
().
equals
(
""
)){
queryWrapper
.
like
(
"serviceName"
,
skRegionalsDetailParam
.
getName
());
}
if
(
skRegionalsDetailParam
.
getDes
()!=
null
&&
!
skRegionalsDetailParam
.
getDes
().
equals
(
""
)){
queryWrapper
.
like
(
"serviceMs"
,
skRegionalsDetailParam
.
getDes
());
}
queryWrapper
.
eq
(
"isDeleted"
,
"0"
);
queryWrapper
.
orderByDesc
(
"cjsj"
);
List
list
=
skServiceService
.
list
(
queryWrapper
);
ExportExcelUtil
<
SkService
>
exportExcelUtil
=
new
ExportExcelUtil
<>();
String
[]
headersName
=
{
"服务id"
,
"服务名称"
,
"服务地址"
,
"服务描述"
,
"请求方式"
,
"请求参数"
,
"返回类型"
,
"返回参数"
,
"创建时间"
,
"状态"
};
String
[]
headersField
=
{
"xxzjbh"
,
"servicename"
,
"serviceurl"
,
"servicems"
,
"type"
,
"params"
,
"contenttype"
,
"content"
,
"cjsj"
,
"flag"
};
exportExcelUtil
.
exportExcel
(
"DataStatistics"
,
headersName
,
headersField
,
list
,
response
,
"服务列表信息"
);
}
}
common/service_base/src/main/java/com/founder/servicebase/logs/controller/SkSysLogController.java
View file @
263fcb48
...
...
@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.founder.commonutils.model.newPublicEntity.MapRestResult
;
import
com.founder.commonutils.model.newPublicEntity.SkService
;
import
com.founder.commonutils.util.DateUtil
;
import
com.founder.commonutils.util.ExportExcelUtil
;
import
com.founder.commonutils.util.StringUtil
;
import
com.founder.servicebase.logs.LogMoudleCount
;
import
com.founder.servicebase.logs.OperLog
;
...
...
@@ -20,6 +22,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.UnsupportedEncodingException
;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
...
...
@@ -89,7 +92,46 @@ public class SkSysLogController {
return
new
MapRestResult
(
200
,
"OK"
,
page1
.
getTotal
(),
newList
);
}
@ApiOperation
(
value
=
"日志列表导出"
)
@OperLog
(
message
=
"日志列表导出"
,
operation
=
OperationType
.
QUERY
)
@PostMapping
(
"export"
)
public
void
export
(
HttpServletResponse
response
,
@RequestBody
LogParam
logParam
)
throws
Exception
{
QueryWrapper
queryWrapper
=
new
QueryWrapper
();
SimpleDateFormat
simpleDateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
if
(
logParam
.
getLx
()
!=
null
&&
!
logParam
.
getLx
().
equals
(
""
))
{
queryWrapper
.
eq
(
"lx"
,
logParam
.
getLx
());
}
if
(
logParam
.
getIp
()
!=
null
&&
!
logParam
.
getIp
().
equals
(
""
))
{
queryWrapper
.
like
(
"ip"
,
logParam
.
getIp
());
}
if
(
logParam
.
getUrl
()
!=
null
&&
!
logParam
.
getUrl
().
equals
(
""
))
{
queryWrapper
.
like
(
"url"
,
logParam
.
getUrl
());
}
if
(
logParam
.
getUserId
()
!=
null
&&
!
logParam
.
getUserId
().
equals
(
""
))
{
queryWrapper
.
like
(
"userId"
,
logParam
.
getUserId
());
}
if
(
logParam
.
getStartTime
()
!=
null
&&
!
logParam
.
getStartTime
().
equals
(
""
))
{
queryWrapper
.
ge
(
"str_to_date(createDate,'%Y-%m-%d')"
,
simpleDateFormat
.
parse
(
logParam
.
getStartTime
()));
}
if
(
logParam
.
getEndTime
()
!=
null
&&
!
logParam
.
getEndTime
().
equals
(
""
))
{
queryWrapper
.
lt
(
"str_to_date(createDate,'%Y-%m-%d')"
,
DateUtil
.
addHour
(
simpleDateFormat
.
parse
(
logParam
.
getEndTime
()),
24
));
}
if
(
logParam
.
getMessage
()
!=
null
&&
!
logParam
.
getMessage
().
equals
(
""
))
{
queryWrapper
.
like
(
"message"
,
logParam
.
getMessage
());
}
queryWrapper
.
orderByDesc
(
"createDate"
);
List
list
=
service
.
list
(
queryWrapper
);
ExportExcelUtil
<
SkService
>
exportExcelUtil
=
new
ExportExcelUtil
<>();
String
[]
headersName
=
{
"用户id"
,
"方法名"
,
"ip"
,
"请求url"
,
"传入参数"
,
"返回参数"
,
"响应时长"
,
"访问时间"
};
String
[]
headersField
=
{
"id"
,
"method"
,
"ip"
,
"url"
,
"params"
,
"content"
,
"totaltime"
,
"createdate"
};
exportExcelUtil
.
exportExcel
(
"DataStatistics"
,
headersName
,
headersField
,
list
,
response
,
"日志列表信息"
);
}
@ApiOperation
(
value
=
"统计"
)
@OperLog
(
message
=
"统计"
,
operation
=
OperationType
.
QUERY
)
...
...
common/service_base/src/main/java/com/founder/servicebase/logs/mapper/mysqlMapper/SkSysLogMapper.xml
View file @
263fcb48
...
...
@@ -43,7 +43,7 @@
<select
id=
"countThreeUserId"
resultType=
"com.founder.servicebase.logs.LogMoudleCount"
parameterType=
"com.founder.servicebase.logs.param.LogCountParam"
>
select COUNT(*) as count,userId as moudle from sk_sys_log
where
userId like '%第三方%
'
where
lx = '2
'
<if
test=
"startTime!=null and startTime!='' "
>
and str_to_date(#{startTime},'%Y-%m-%d')
<![CDATA[ <= ]]>
date_format(createDate,'%Y-%m-%d')
</if>
...
...
service/publicapi/src/main/java/com/founder/publicapi/controller/SkDataOperation/SkServiceSqController.java
View file @
263fcb48
...
...
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import
com.founder.commonutils.model.newPublicEntity.SkService
;
import
com.founder.commonutils.model.newPublicEntity.MapRestResult
;
import
com.founder.commonutils.model.vo.param.SkServiceParam
;
import
com.founder.commonutils.util.ExportExcelUtil
;
import
com.founder.servicebase.logs.OperLog
;
import
com.founder.servicebase.logs.OperationType
;
import
com.founder.servicebase.service.SkDictionaryService
;
...
...
@@ -19,6 +20,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.annotation.Resource
;
import
javax.servlet.http.HttpServletResponse
;
import
java.util.List
;
/**
* 服务申请controller层
...
...
@@ -67,6 +70,35 @@ public class SkServiceSqController {
}
/**
* 服务申请列表信息导出
*/
@PostMapping
(
"export"
)
@ApiOperation
(
value
=
"服务申请列表信息导出"
)
@OperLog
(
message
=
"服务申请列表信息导出"
,
operation
=
OperationType
.
QUERY
)
public
void
export
(
HttpServletResponse
response
,
@RequestBody
SkServiceParam
skRegionalsDetailParam
)
throws
Exception
{
QueryWrapper
queryWrapper
=
new
QueryWrapper
();
if
(
skRegionalsDetailParam
.
getName
()!=
null
&&
!
skRegionalsDetailParam
.
getName
().
equals
(
""
)){
queryWrapper
.
like
(
"serviceName"
,
skRegionalsDetailParam
.
getName
());
}
if
(
skRegionalsDetailParam
.
getDes
()!=
null
&&
!
skRegionalsDetailParam
.
getDes
().
equals
(
""
)){
queryWrapper
.
like
(
"serviceMs"
,
skRegionalsDetailParam
.
getDes
());
}
queryWrapper
.
eq
(
"isDeleted"
,
"0"
);
queryWrapper
.
eq
(
"flag"
,
"1"
);
queryWrapper
.
orderByDesc
(
"cjsj"
);
List
list
=
skServiceService
.
list
(
queryWrapper
);
ExportExcelUtil
<
SkService
>
exportExcelUtil
=
new
ExportExcelUtil
<>();
String
[]
headersName
=
{
"服务id"
,
"服务名称"
,
"服务地址"
,
"服务描述"
,
"请求方式"
,
"请求参数"
,
"返回类型"
,
"返回参数"
,
"创建时间"
};
String
[]
headersField
=
{
"xxzjbh"
,
"servicename"
,
"serviceurl"
,
"servicems"
,
"type"
,
"params"
,
"contenttype"
,
"content"
,
"cjsj"
};
exportExcelUtil
.
exportExcel
(
"DataStatistics"
,
headersName
,
headersField
,
list
,
response
,
"服务申请列表信息"
);
}
@PostMapping
(
"updateFlag"
)
@ApiOperation
(
value
=
"更新服务列表展示状态"
)
...
...
service/publicapi/src/main/java/com/founder/publicapi/controller/SkDataUpload/FtpUtil.java
View file @
263fcb48
...
...
@@ -35,14 +35,11 @@ public class FtpUtil {
private
String
password
;
@Value
(
"${basePath}"
)
private
String
basePath
;
@Value
(
"${deskTopBasePath}"
)
private
String
deskTopBasePath
;
public
static
String
hosts
;
private
static
String
ports
;
private
static
String
usernames
;
private
static
String
passwords
;
private
static
String
basePaths
;
private
static
String
deskTopBasePaths
;
//利用@PostConstruct将配置文件中配置的值赋给本地的变量
@PostConstruct
...
...
@@ -65,54 +62,7 @@ public class FtpUtil {
public
void
getBasePath
()
{
basePaths
=
this
.
basePath
;
}
@PostConstruct
public
void
getDeskTopBasePath
()
{
deskTopBasePaths
=
this
.
deskTopBasePath
;
}
public
static
boolean
deskTopuploadFile
(
String
filename
,
InputStream
input
)
{
boolean
result
=
false
;
FTPClient
ftp
=
new
FTPClient
();
try
{
JSch
jsch
=
new
JSch
();
//获取sshSession 账号-ip-端口
Session
sshSession
=
jsch
.
getSession
(
usernames
,
hosts
,
Integer
.
valueOf
(
ports
));
//添加密码
sshSession
.
setPassword
(
passwords
);
Properties
sshConfig
=
new
Properties
();
sshConfig
.
put
(
"userauth.gssapi-with-mic"
,
"no"
);
//严格主机密钥检查
sshConfig
.
put
(
"StrictHostKeyChecking"
,
"no"
);
sshSession
.
setConfig
(
sshConfig
);
//开启sshSession链接
sshSession
.
connect
();
//获取sftp通道
Channel
channel
=
sshSession
.
openChannel
(
"sftp"
);
//开启
channel
.
connect
();
sftp
=
(
ChannelSftp
)
channel
;
//设置为被动模式
ftp
.
enterLocalPassiveMode
();
//设置上传文件的类型为二进制类型
//进入到要上传的目录 然后上传文件
sftp
.
cd
(
deskTopBasePaths
);
sftp
.
put
(
input
,
filename
);
input
.
close
();
result
=
true
;
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
finally
{
if
(
ftp
.
isConnected
())
{
try
{
ftp
.
disconnect
();
}
catch
(
IOException
ioe
)
{
}
}
}
return
result
;
}
/**
* Description: 向FTP服务器上传文件
* host FTP服务器ip
...
...
service/publicapi/src/main/java/com/founder/publicapi/controller/SkypDesktop/SkypDesktopController.java
View file @
263fcb48
...
...
@@ -29,8 +29,8 @@ import java.util.stream.Collectors;
@Api
(
tags
=
"时空桌面"
)
public
class
SkypDesktopController
{
@Value
(
"${
deskTop
Url}"
)
public
String
deskTop
Url
;
@Value
(
"${
images
Url}"
)
public
String
images
Url
;
@Autowired
SkMenuMapper
skMenuMapper
;
@Autowired
...
...
@@ -56,9 +56,9 @@ public class SkypDesktopController {
// 上传图片后缀
String
type
=
photoFile
.
getOriginalFilename
().
substring
(
photoFile
.
getOriginalFilename
().
lastIndexOf
(
"."
));
String
far
=
KeyUtil
.
getUUIDKey
(
"p"
)+
type
;
skMenu
.
setPhoto
(
deskTop
Url
+
far
);
skMenu
.
setPhoto
(
images
Url
+
far
);
// 上传图片到服务器
FtpUtil
.
deskTop
uploadFile
(
far
,
photoFile
.
getInputStream
());
FtpUtil
.
uploadFile
(
far
,
photoFile
.
getInputStream
());
}
else
{
return
new
MapRestResult
(
200
,
"请上传菜单图片"
,
null
);
}
...
...
@@ -112,9 +112,9 @@ public class SkypDesktopController {
// 上传图片后缀
String
type
=
photoFile
.
getOriginalFilename
().
substring
(
photoFile
.
getOriginalFilename
().
lastIndexOf
(
"."
));
String
far
=
KeyUtil
.
getUUIDKey
(
"p"
)+
type
;
skMenu
.
setPhoto
(
deskTop
Url
+
far
);
skMenu
.
setPhoto
(
images
Url
+
far
);
// 上传图片到服务器
FtpUtil
.
deskTop
uploadFile
(
far
,
photoFile
.
getInputStream
());
FtpUtil
.
uploadFile
(
far
,
photoFile
.
getInputStream
());
}
skMenu
.
setGxsj
(
nowTime
());
int
i
=
skMenuMapper
.
updateById
(
skMenu
);
...
...
service/publicapi/src/main/resources/bootstrap-dev.properties
View file @
263fcb48
...
...
@@ -58,9 +58,7 @@ port=54322
usernameFtp
=
root
#FTP\uFFFD\uFFFD\u00BC\uFFFD\uFFFD\uFFFD\uFFFD
password
=
ENC(z+abBc/QcZelKfpAFXXeSwRBOcUjidsu)
#FTP\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u013F\u00BC,/data
2/images
basePath
=
/data
2
/images
#FTP\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u013F\u00BC,/data
/images #\u65F6\u7A7A\u684C\u9762\u56FE\u6807\u8DEF\u5F84
basePath
=
/data/images
imagesUrl
=
http://47.92.48.137:1008/images/
#\u65F6\u7A7A\u684C\u9762\u56FE\u6807\u8DEF\u5F84
deskTopBasePath
=
/data/deskTopImage
deskTopUrl
=
http://47.92.48.137:1008/deskTopImage/
\ No newline at end of file
service/publicapi/src/main/resources/bootstrap-prod.properties
View file @
263fcb48
...
...
@@ -58,9 +58,6 @@ port=54322
usernameFtp
=
root
#FTP\uFFFD\uFFFD\u00BC\uFFFD\uFFFD\uFFFD\uFFFD
password
=
ENC(z+abBc/QcZelKfpAFXXeSwRBOcUjidsu)
#FTP\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u013F\u00BC,/data
2/images
basePath
=
/data
2
/images
#FTP\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u013F\u00BC,/data
/images #\u65F6\u7A7A\u684C\u9762\u56FE\u6807\u8DEF\u5F84
basePath
=
/data/images
imagesUrl
=
http://47.92.48.137:1008/images/
#\u65F6\u7A7A\u684C\u9762\u56FE\u6807\u8DEF\u5F84
deskTopBasePath
=
/data/deskTopImage
deskTopUrl
=
http://47.92.48.137:1008/deskTopImage/
\ No newline at end of file
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