记得上下班打卡 | git大法好,push需谨慎
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liquidnet-bus-v1
Project
Project
Details
Activity
Releases
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
董敬伟
liquidnet-bus-v1
Commits
37e75515
Commit
37e75515
authored
Oct 21, 2021
by
胡佳晨
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
提交 积分物品相关
parent
018be12a
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
339 additions
and
7 deletions
+339
-7
dev_stone.sql
docu/dev_stone.sql
+1
-1
StoneListParam.java
...ava/com/liquidnet/service/stone/param/StoneListParam.java
+4
-0
StoneLogsController.java
...in/web/controller/zhengzai/stone/StoneLogsController.java
+83
-0
IScoreService.java
...et/client/admin/zhengzai/stone/service/IScoreService.java
+21
-0
ItemServiceImpl.java
...nt/admin/zhengzai/stone/service/impl/ItemServiceImpl.java
+12
-4
ScoreServiceImpl.java
...t/admin/zhengzai/stone/service/impl/ScoreServiceImpl.java
+64
-1
StoneRedisUtils.java
...t/admin/zhengzai/stone/service/utils/StoneRedisUtils.java
+21
-0
StoneUserScoreDetailVo.java
...min/zhengzai/stone/service/vo/StoneUserScoreDetailVo.java
+19
-0
StoneScoreListDto.java
...va/com/liquidnet/service/stone/dto/StoneScoreListDto.java
+45
-0
StoneScoreUser.java
...va/com/liquidnet/service/stone/entity/StoneScoreUser.java
+1
-1
StoneScoreUserMapper.java
.../liquidnet/service/stone/mapper/StoneScoreUserMapper.java
+6
-0
StoneScoreListParam.java
...om/liquidnet/service/stone/param/StoneScoreListParam.java
+25
-0
StoneScoreUserMapper.xml
...m/liquidnet/service/stone/mapper/StoneScoreUserMapper.xml
+37
-0
No files found.
docu/dev_stone.sql
View file @
37e75515
...
...
@@ -42,7 +42,7 @@ create table stone_score_user
mid
bigint
unsigned
auto_increment
primary
key
,
score_id
varchar
(
64
)
default
''
comment
'id'
,
uid
varchar
(
64
)
default
''
comment
'用户id'
,
status
int
default
1
comment
'状态[
0-冻结|1-正常
]'
,
status
int
default
1
comment
'状态[
1-正常|2-冻结
]'
,
created_at
datetime
,
updated_at
datetime
,
comment
text
...
...
liquidnet-bus-api/liquidnet-service-stone-api/src/main/java/com/liquidnet/service/stone/param/StoneListParam.java
View file @
37e75515
package
com
.
liquidnet
.
service
.
stone
.
param
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
@Data
...
...
@@ -7,13 +8,16 @@ public class StoneListParam {
/**
* 名称
*/
@ApiModelProperty
(
required
=
false
,
value
=
"名称"
,
example
=
"测试券1"
)
private
String
title
;
/**
* 状态[-999-全部|1-上架中|2-待上架|7-已下架]
*/
@ApiModelProperty
(
required
=
false
,
value
=
"状态[-999-全部|1-上架中|2-待上架|7-已下架]"
,
example
=
"1"
)
private
Integer
state
;
/**
* 状态[1-券]
*/
@ApiModelProperty
(
required
=
false
,
value
=
"状态[1-券]"
,
example
=
"1"
)
private
Integer
type
;
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/java/com/liquidnet/client/admin/web/controller/zhengzai/stone/StoneLogsController.java
0 → 100644
View file @
37e75515
package
com
.
liquidnet
.
client
.
admin
.
web
.
controller
.
zhengzai
.
stone
;
import
com.github.pagehelper.PageInfo
;
import
com.liquidnet.client.admin.common.annotation.Log
;
import
com.liquidnet.client.admin.common.core.controller.BaseController
;
import
com.liquidnet.client.admin.common.core.domain.AjaxResult
;
import
com.liquidnet.client.admin.common.core.page.TableDataInfo
;
import
com.liquidnet.client.admin.zhengzai.stone.service.IItemService
;
import
com.liquidnet.client.admin.zhengzai.stone.service.IScoreService
;
import
com.liquidnet.client.admin.zhengzai.stone.service.vo.StoneUserScoreDetailVo
;
import
com.liquidnet.service.stone.dto.StoneScoreListDto
;
import
com.liquidnet.service.stone.entity.StoneScoreItems
;
import
com.liquidnet.service.stone.param.StoneItemBuildParam
;
import
com.liquidnet.service.stone.param.StoneListParam
;
import
com.liquidnet.service.stone.param.StoneScoreListParam
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiImplicitParams
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.ui.ModelMap
;
import
org.springframework.web.bind.annotation.*
;
@Api
(
tags
=
"积分明细"
)
@Controller
@RequestMapping
(
"stone/logs"
)
public
class
StoneLogsController
extends
BaseController
{
private
String
prefix
=
"zhengzai/stone"
;
@Autowired
private
IScoreService
iScoreService
;
@GetMapping
(
"integralStore"
)
@ApiOperation
(
value
=
"积分明细:列表View"
,
position
=
0
)
public
String
integralStore
(
ModelMap
mmap
)
{
return
prefix
+
"/integralList"
;
}
@GetMapping
(
"integralStoreEdit"
)
@ApiOperation
(
value
=
"积分明细:详情View"
,
position
=
1
)
public
String
integralStoreEdit
(
ModelMap
mmap
)
{
return
prefix
+
"/integralDetail"
;
}
@Log
(
title
=
"积分明细:列表"
)
@ApiOperation
(
value
=
"积分明细:列表"
,
position
=
2
)
@GetMapping
(
"list"
)
@ResponseBody
public
TableDataInfo
list
(
StoneScoreListParam
listParam
)
{
PageInfo
<
StoneScoreListDto
>
result
=
iScoreService
.
list
(
listParam
);
TableDataInfo
rspData
=
new
TableDataInfo
();
rspData
.
setCode
(
0
);
rspData
.
setRows
(
result
.
getList
());
rspData
.
setTotal
(
result
.
getTotal
());
return
rspData
;
}
@Log
(
title
=
"积分明细:修改状态"
)
@PutMapping
(
"change/status"
)
@ApiOperation
(
value
=
"积分明细:修改状态"
,
position
=
3
)
@ResponseBody
@ApiImplicitParams
({
@ApiImplicitParam
(
type
=
"form"
,
required
=
true
,
dataType
=
"String"
,
name
=
"uid"
,
value
=
"用户id"
),
@ApiImplicitParam
(
type
=
"form"
,
required
=
true
,
dataType
=
"Integer"
,
name
=
"status"
,
value
=
"状态[1-正常|2-冻结]"
),
})
public
AjaxResult
status
(
@RequestParam
(
"uid"
)
String
uid
,
@RequestParam
(
"status"
)
Integer
status
)
{
String
result
=
iScoreService
.
changeStatus
(
uid
,
status
);
return
AjaxResult
.
success
(
result
);
}
@Log
(
title
=
"积分明细:详情"
)
@GetMapping
(
"details"
)
@ApiOperation
(
value
=
"积分明细:详情"
,
position
=
4
)
@ResponseBody
@ApiImplicitParams
({
@ApiImplicitParam
(
type
=
"form"
,
required
=
true
,
dataType
=
"String"
,
name
=
"uid"
,
value
=
"用户id"
),
})
public
AjaxResult
details
(
@RequestParam
(
"uid"
)
String
uid
)
{
StoneUserScoreDetailVo
result
=
iScoreService
.
userScoreDetail
(
uid
);
return
AjaxResult
.
success
(
result
);
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/stone/service/IScoreService.java
View file @
37e75515
package
com
.
liquidnet
.
client
.
admin
.
zhengzai
.
stone
.
service
;
import
com.github.pagehelper.PageInfo
;
import
com.liquidnet.client.admin.zhengzai.stone.service.vo.StoneUserScoreDetailVo
;
import
com.liquidnet.service.stone.dto.StoneScoreListDto
;
import
com.liquidnet.service.stone.param.StoneScoreListParam
;
public
interface
IScoreService
{
PageInfo
<
StoneScoreListDto
>
list
(
StoneScoreListParam
param
);
/**
* 修改 用户积分状态
* @param uid 用户ID
* @param status 状态[-999-全部|1-正常|2-冻结]
* @return
*/
String
changeStatus
(
String
uid
,
Integer
status
);
/**
* 获取 用户积分 详情
* @param uid 用户ID
* @return
*/
StoneUserScoreDetailVo
userScoreDetail
(
String
uid
);
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/stone/service/impl/ItemServiceImpl.java
View file @
37e75515
...
...
@@ -97,7 +97,15 @@ public class ItemServiceImpl implements IItemService {
}
StoneScoreItems
data
=
new
StoneScoreItems
();
data
.
setStatus
(
status
);
//mysql
int
result
=
stoneScoreItemsMapper
.
update
(
data
,
Wrappers
.
lambdaQuery
(
StoneScoreItems
.
class
).
eq
(
StoneScoreItems:
:
getItemId
,
itemId
));
StoneScoreItems
redisData
=
redisUtils
.
getItemData
(
data
.
getItemId
());
redisData
.
setStatus
(
status
);
//redis
redisUtils
.
setItemData
(
data
.
getItemId
(),
redisData
);
//mongo
mongoUtils
.
itemUpdateById
(
redisData
);
if
(
result
<=
0
)
{
return
"修改失败"
;
}
...
...
@@ -127,12 +135,12 @@ public class ItemServiceImpl implements IItemService {
data
.
setItemId
(
IDGenerator
.
nextTimeId2
());
data
.
setGeneralSurplus
(
redisUtils
.
changeStoneGeneralSurplus
(
data
.
getItemId
(),
generalPoor
));
data
.
setCreatedAt
(
now
);
//mysql
int
count
=
stoneScoreItemsMapper
.
insert
(
data
);
//redis
redisUtils
.
setItemData
(
data
.
getItemId
(),
data
);
//mongo
mongoUtils
.
itemCreate
(
data
);
//mysql
int
count
=
stoneScoreItemsMapper
.
insert
(
data
);
if
(
count
<=
0
)
{
return
"创建失败"
;
}
...
...
@@ -151,12 +159,12 @@ public class ItemServiceImpl implements IItemService {
data
.
setItemId
(
param
.
getItemId
());
data
.
setGeneralSurplus
(
redisUtils
.
changeStoneGeneralSurplus
(
data
.
getItemId
(),
generalPoor
));
data
.
setUpdatedAt
(
now
);
//mysql
int
count
=
stoneScoreItemsMapper
.
update
(
data
,
Wrappers
.
lambdaQuery
(
StoneScoreItems
.
class
).
eq
(
StoneScoreItems:
:
getItemId
,
param
.
getItemId
()));
//redis
redisUtils
.
setItemData
(
data
.
getItemId
(),
data
);
//mongo
mongoUtils
.
itemUpdateById
(
data
);
//mysql
int
count
=
stoneScoreItemsMapper
.
update
(
data
,
Wrappers
.
lambdaQuery
(
StoneScoreItems
.
class
).
eq
(
StoneScoreItems:
:
getItemId
,
param
.
getItemId
()));
if
(
count
<=
0
)
{
return
"修改失败"
;
}
...
...
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/stone/service/impl/ScoreServiceImpl.java
View file @
37e75515
package
com
.
liquidnet
.
client
.
admin
.
zhengzai
.
stone
.
service
.
impl
;
import
com.liquidnet.client.admin.zhengzai.stone.service.IItemService
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.github.pagehelper.PageInfo
;
import
com.liquidnet.client.admin.zhengzai.stone.service.IScoreService
;
import
com.liquidnet.client.admin.zhengzai.stone.service.vo.StoneUserScoreDetailVo
;
import
com.liquidnet.commons.lang.util.IDGenerator
;
import
com.liquidnet.service.stone.dto.StoneScoreListDto
;
import
com.liquidnet.service.stone.entity.StoneScoreLogs
;
import
com.liquidnet.service.stone.entity.StoneScoreUser
;
import
com.liquidnet.service.stone.mapper.StoneScoreLogsMapper
;
import
com.liquidnet.service.stone.mapper.StoneScoreUserMapper
;
import
com.liquidnet.service.stone.param.StoneScoreListParam
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.time.LocalDateTime
;
import
java.util.List
;
@Service
@Slf4j
public
class
ScoreServiceImpl
implements
IScoreService
{
@Autowired
StoneScoreUserMapper
stoneScoreUserMapper
;
@Autowired
StoneScoreLogsMapper
stoneScoreLogsMapper
;
@Override
public
PageInfo
<
StoneScoreListDto
>
list
(
StoneScoreListParam
param
)
{
PageInfo
<
StoneScoreListDto
>
pageInfo
;
param
.
setUid
(
"-999"
);
List
<
StoneScoreListDto
>
dto
=
stoneScoreUserMapper
.
list
(
param
);
pageInfo
=
new
PageInfo
(
dto
);
return
pageInfo
;
}
@Override
public
String
changeStatus
(
String
uid
,
Integer
status
)
{
if
(!(
status
==
1
||
status
==
2
)){
return
"状态错误"
;
}
StoneScoreUser
data
=
new
StoneScoreUser
();
data
.
setStatus
(
status
);
int
isExists
=
stoneScoreUserMapper
.
selectCount
(
Wrappers
.
lambdaQuery
(
StoneScoreUser
.
class
).
eq
(
StoneScoreUser:
:
getUid
,
uid
));
int
count
=
0
;
if
(
isExists
>
0
)
{
data
.
setUpdatedAt
(
LocalDateTime
.
now
());
count
=
stoneScoreUserMapper
.
update
(
data
,
Wrappers
.
lambdaQuery
(
StoneScoreUser
.
class
).
eq
(
StoneScoreUser:
:
getUid
,
uid
));
}
else
{
data
.
setScoreId
(
IDGenerator
.
nextTimeId2
());
data
.
setUid
(
uid
);
data
.
setCreatedAt
(
LocalDateTime
.
now
());
count
=
stoneScoreUserMapper
.
insert
(
data
);
}
if
(
count
<=
0
)
{
return
"修改失败"
;
}
return
"修改成功"
;
}
@Override
public
StoneUserScoreDetailVo
userScoreDetail
(
String
uid
)
{
StoneScoreListParam
param
=
new
StoneScoreListParam
();
param
.
setMobile
(
""
);
param
.
setStatus
(-
999
);
param
.
setUid
(
uid
);
List
<
StoneScoreListDto
>
dto
=
stoneScoreUserMapper
.
list
(
param
);
List
<
StoneScoreLogs
>
dataList
=
stoneScoreLogsMapper
.
selectList
(
Wrappers
.
lambdaQuery
(
StoneScoreLogs
.
class
).
eq
(
StoneScoreLogs:
:
getUid
,
uid
));
StoneUserScoreDetailVo
vo
=
new
StoneUserScoreDetailVo
();
vo
.
setDto
(
dto
.
get
(
0
));
vo
.
setScoreLogs
(
dataList
);
return
vo
;
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/stone/service/utils/StoneRedisUtils.java
View file @
37e75515
...
...
@@ -52,9 +52,30 @@ public class StoneRedisUtils {
return
(
int
)
result
;
}
/**
* 设置 积分物品 缓存
*
* @param itemId
* @param data
*/
public
void
setItemData
(
String
itemId
,
StoneScoreItems
data
)
{
String
redisKey
=
StoneConstant
.
ITEM
.
concat
(
itemId
);
redisUtil
.
set
(
redisKey
,
data
);
}
/**
* 获取 积分物品 缓存
*
* @param itemId
*/
public
StoneScoreItems
getItemData
(
String
itemId
)
{
String
redisKey
=
StoneConstant
.
ITEM
.
concat
(
itemId
);
Object
obj
=
redisUtil
.
get
(
redisKey
);
if
(
obj
==
null
)
{
return
null
;
}
else
{
return
(
StoneScoreItems
)
obj
;
}
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/stone/service/vo/StoneUserScoreDetailVo.java
0 → 100644
View file @
37e75515
package
com
.
liquidnet
.
client
.
admin
.
zhengzai
.
stone
.
service
.
vo
;
import
io.swagger.annotations.ApiModelProperty
;
import
com.liquidnet.service.stone.dto.StoneScoreListDto
;
import
com.liquidnet.service.stone.entity.StoneScoreLogs
;
import
lombok.Data
;
import
java.util.List
;
@Data
public
class
StoneUserScoreDetailVo
{
@ApiModelProperty
(
required
=
false
,
value
=
"用户积分信息"
)
public
StoneScoreListDto
dto
;
@ApiModelProperty
(
required
=
false
,
value
=
"积分详情"
)
public
List
<
StoneScoreLogs
>
scoreLogs
;
}
liquidnet-bus-do/liquidnet-service-stone-do/src/main/java/com/liquidnet/service/stone/dto/StoneScoreListDto.java
0 → 100644
View file @
37e75515
package
com
.
liquidnet
.
service
.
stone
.
dto
;
//import io.swagger.annotations.ApiModelProperty;
import
lombok.Data
;
import
java.math.BigDecimal
;
@Data
public
class
StoneScoreListDto
{
/**
* 昵称
*/
// @ApiModelProperty(required = false, value = "昵称", example = "宇航员Marinda")
private
String
nickName
;
/**
* 手机号
*/
// @ApiModelProperty(required = false, value = "手机号", example = "18505123456")
private
String
mobile
;
/**
* 用户id
*/
// @ApiModelProperty(required = false, value = "用户id", example = "310508344264376327445470")
private
String
uid
;
/**
* 状态[-999-全部|1-正常|2-冻结]
*/
// @ApiModelProperty(required = false, value = "状态[-999-全部|1-正常|2-冻结]", example = "1")
private
Integer
status
;
/**
* 总积分
*/
// @ApiModelProperty(required = false, value = "总积分", example = "100.00")
private
BigDecimal
scoreAll
;
/**
* 已用积分
*/
// @ApiModelProperty(required = false, value = "已用积分", example = "50.00")
private
BigDecimal
scoreUse
;
/**
* 剩余积分
*/
// @ApiModelProperty(required = false, value = "剩余积分", example = "50.00")
private
BigDecimal
scoreRest
;
}
liquidnet-bus-do/liquidnet-service-stone-do/src/main/java/com/liquidnet/service/stone/entity/StoneScoreUser.java
View file @
37e75515
...
...
@@ -35,7 +35,7 @@ public class StoneScoreUser implements Serializable {
private
String
uid
;
/**
* 状态[
0-冻结|1-正常
]
* 状态[
1-正常|2-冻结
]
*/
private
Integer
status
;
...
...
liquidnet-bus-do/liquidnet-service-stone-do/src/main/java/com/liquidnet/service/stone/mapper/StoneScoreUserMapper.java
View file @
37e75515
package
com
.
liquidnet
.
service
.
stone
.
mapper
;
import
com.liquidnet.service.stone.dto.StoneScoreListDto
;
import
com.liquidnet.service.stone.param.StoneScoreListParam
;
import
com.liquidnet.service.stone.entity.StoneScoreUser
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
java.util.List
;
/**
* <p>
* 积分用户表 Mapper 接口
...
...
@@ -13,4 +17,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public
interface
StoneScoreUserMapper
extends
BaseMapper
<
StoneScoreUser
>
{
List
<
StoneScoreListDto
>
list
(
StoneScoreListParam
param
);
}
liquidnet-bus-do/liquidnet-service-stone-do/src/main/java/com/liquidnet/service/stone/param/StoneScoreListParam.java
0 → 100644
View file @
37e75515
package
com
.
liquidnet
.
service
.
stone
.
param
;
//import io.swagger.annotations.ApiModelProperty;
import
lombok.Data
;
@Data
public
class
StoneScoreListParam
{
/**
* 手机号
*/
// @ApiModelProperty(required = false, value = "手机号", example = "15901093014")
private
String
mobile
;
/**
* 状态[-999-全部|1-正常|2-冻结]
*/
// @ApiModelProperty(required = false, value = "状态[-999-全部|1-正常|2-冻结]", example = "1")
private
Integer
status
;
/**
* uid
*/
// @ApiModelProperty(required = false, value = "状态[-999-全部|1-正常|2-冻结]", example = "1")
private
String
uid
;
}
liquidnet-bus-do/liquidnet-service-stone-do/src/main/resources/com/liquidnet/service/stone/mapper/StoneScoreUserMapper.xml
View file @
37e75515
...
...
@@ -2,4 +2,41 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.liquidnet.service.stone.mapper.StoneScoreUserMapper"
>
<resultMap
id=
"StoneScoreListDtoResult"
type=
"com.liquidnet.service.stone.dto.StoneScoreListDto"
>
<result
column=
"nickname"
property=
"nickName"
/>
<result
column=
"mobile"
property=
"mobile"
/>
<result
column=
"uid"
property=
"uid"
/>
<result
column=
"status"
property=
"status"
/>
<result
column=
"score_all"
property=
"scoreAll"
/>
<result
column=
"score_use"
property=
"scoreUse"
/>
<result
column=
"score_rest"
property=
"scoreRest"
/>
</resultMap>
<select
id=
"list"
parameterType=
"java.util.Map"
resultMap=
"StoneScoreListDtoResult"
>
select hu.*,
(case when score
<![CDATA[>]]>
0 then sum(score) else 0 END) as 'score_all',
(case when score
<![CDATA[<]]>
0 then sum(score) else 0 END) as 'score_use',
('score_all' - 'score_use') as 'score_rest'
from (select nickname,
mobile,
au.uid,
IFNULL(ssu.status,1) as 'status'
from adam_user as au
inner join adam_user_info aui on au.uid = aui.uid
left join stone_score_user ssu on ssu.uid = aui.uid
<where>
<if
test=
"mobile!=''"
>
AND mobile LIKE concat('%', #{mobile}, '%')
</if>
<if
test=
"status!='-999'"
>
AND status = #{status} OR status is null
</if>
<if
test=
"uid!='-999'"
>
AND au.uid = #{uid}
</if>
</where>
) as hu
left join stone_score_logs sslog on sslog.uid = hu.uid
group by hu.uid;
</select>
</mapper>
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