Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Q
qk_backend
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
quanku
qk_backend
Commits
1a0ee1aa
Commit
1a0ee1aa
authored
Sep 11, 2023
by
shiyu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
成交记录
parent
76527c20
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
148 additions
and
8 deletions
+148
-8
ch-admin-api/src/main/java/com/wwdz/ch/admin/job/SynCoinJob.java
...n-api/src/main/java/com/wwdz/ch/admin/job/SynCoinJob.java
+68
-0
ch-admin-api/src/test/java/com/wwdz/ch/admin/impl/SynCoinJobTest.java
.../src/test/java/com/wwdz/ch/admin/impl/SynCoinJobTest.java
+6
-0
ch-core/src/main/java/com/wwdz/ch/core/util/CacheUtil.java
ch-core/src/main/java/com/wwdz/ch/core/util/CacheUtil.java
+29
-0
ch-dao/src/main/java/com/wwdz/ch/db/dao/CategoryDao.java
ch-dao/src/main/java/com/wwdz/ch/db/dao/CategoryDao.java
+3
-0
ch-dao/src/main/java/com/wwdz/ch/db/impl/CategoryDaoImpl.java
...ao/src/main/java/com/wwdz/ch/db/impl/CategoryDaoImpl.java
+8
-0
ch-wx-api/src/main/java/com/wwdz/ch/wx/entity/vo/BidRecordVo.java
...i/src/main/java/com/wwdz/ch/wx/entity/vo/BidRecordVo.java
+3
-0
ch-wx-api/src/main/java/com/wwdz/ch/wx/impl/QueryPriceServiceImpl.java
.../main/java/com/wwdz/ch/wx/impl/QueryPriceServiceImpl.java
+27
-6
ch-wx-api/src/main/java/com/wwdz/ch/wx/service/QueryPriceService.java
...c/main/java/com/wwdz/ch/wx/service/QueryPriceService.java
+2
-1
ch-wx-api/src/main/java/com/wwdz/ch/wx/web/QueryPriceController.java
...rc/main/java/com/wwdz/ch/wx/web/QueryPriceController.java
+2
-1
No files found.
ch-admin-api/src/main/java/com/wwdz/ch/admin/job/SynCoinJob.java
View file @
1a0ee1aa
...
@@ -4,10 +4,13 @@ import com.github.pagehelper.PageInfo;
...
@@ -4,10 +4,13 @@ import com.github.pagehelper.PageInfo;
import
com.wwdz.ch.core.consts.*
;
import
com.wwdz.ch.core.consts.*
;
import
com.wwdz.ch.core.storage.QiniuStorage
;
import
com.wwdz.ch.core.storage.QiniuStorage
;
import
com.wwdz.ch.core.util.RedisUtils
;
import
com.wwdz.ch.core.util.RedisUtils
;
import
com.wwdz.ch.db.dao.CategoryDao
;
import
com.wwdz.ch.db.dao.CoinsDao
;
import
com.wwdz.ch.db.dao.CoinsDao
;
import
com.wwdz.ch.db.dao.ItemDao
;
import
com.wwdz.ch.db.dao.ItemDao
;
import
com.wwdz.ch.db.domain.Category
;
import
com.wwdz.ch.db.domain.Coins
;
import
com.wwdz.ch.db.domain.Coins
;
import
com.wwdz.ch.db.domain.Item
;
import
com.wwdz.ch.db.domain.Item
;
import
com.wwdz.ch.db.dto.request.CategorySearchRequestDto
;
import
com.wwdz.ch.db.dto.request.CoinRequestDto
;
import
com.wwdz.ch.db.dto.request.CoinRequestDto
;
import
com.wwdz.ch.db.es.ItemEsDao
;
import
com.wwdz.ch.db.es.ItemEsDao
;
import
com.xxdxxs.utils.CommonUtils
;
import
com.xxdxxs.utils.CommonUtils
;
...
@@ -57,6 +60,9 @@ public class SynCoinJob {
...
@@ -57,6 +60,9 @@ public class SynCoinJob {
@Autowired
@Autowired
RedissonClient
redissonClient
;
RedissonClient
redissonClient
;
@Autowired
CategoryDao
categoryDao
;
public
void
execute
()
{
public
void
execute
()
{
logger
.
info
(
">>>>>>>>>>>>>>>>>>>>>>> 同步coins表数据到item表, 开始执行 <<<<<<<<<<<<<<<<<<<<<"
);
logger
.
info
(
">>>>>>>>>>>>>>>>>>>>>>> 同步coins表数据到item表, 开始执行 <<<<<<<<<<<<<<<<<<<<<"
);
...
@@ -219,6 +225,68 @@ public class SynCoinJob {
...
@@ -219,6 +225,68 @@ public class SynCoinJob {
}
}
/**
* 类目图片加上尺寸
*/
public
void
addSizeForCategoryIcon
()
{
logger
.
info
(
">>>>>>>>>>>>>>>>>>>>>>> 更新类目图片尺寸, 开始执行 <<<<<<<<<<<<<<<<<<<<<"
);
try
{
CategorySearchRequestDto
categorySearchRequestDto
=
new
CategorySearchRequestDto
();
categorySearchRequestDto
.
setPage
(
1
);
categorySearchRequestDto
.
setLimit
(
100
);
List
<
Category
>
list
=
categoryDao
.
findByPage
(
categorySearchRequestDto
);
int
totalPageNum
=
new
PageInfo
<>(
list
).
getPages
();
long
total
=
new
PageInfo
<>(
list
).
getTotal
();
logger
.
info
(
"total page : {}, total : {}"
,
totalPageNum
,
total
);
IntStream
.
rangeClosed
(
1
,
totalPageNum
).
parallel
().
forEach
(
i
->
{
logger
.
info
(
">>>>>>>>>>>>>>>>> 当前更新数据的页码: {} 更新开始 <<<<<<<<<<<<<<<<<"
,
i
);
CategorySearchRequestDto
dto
=
new
CategorySearchRequestDto
();
dto
.
setPage
(
i
);
dto
.
setLimit
(
100
);
List
<
Category
>
categoryList
=
categoryDao
.
findByPage
(
dto
);
categoryList
.
parallelStream
().
forEach
(
category
->
{
String
imageUrl
=
category
.
getIcon
();
if
(
StringUtils
.
hasLength
(
imageUrl
)
&&
!
imageUrl
.
contains
(
"_"
)
)
{
String
[]
images
=
imageUrl
.
split
(
";"
);
StringBuffer
stringBuffer
=
new
StringBuffer
();
Arrays
.
stream
(
images
).
parallel
().
forEach
(
image
->
{
if
(
stringBuffer
.
length
()
!=
0
)
{
stringBuffer
.
append
(
";"
);
}
try
{
URL
url
=
new
URL
(
image
);
InputStream
inputStream
=
url
.
openStream
();
BufferedImage
bufferedImage
=
ImageIO
.
read
(
inputStream
);
String
keyName
=
CommConsts
.
UPLOAD_PRE_DIRECTORY
+
CommonUtils
.
getUUID
()
+
"_"
+
bufferedImage
.
getWidth
()
+
"x"
+
bufferedImage
.
getHeight
()
+
"."
+
MediaTypeEnum
.
IMAGE_JPG
.
getExt
();
InputStream
imageStream
=
bufferedImageToInputStream
(
bufferedImage
,
MediaTypeEnum
.
IMAGE_JPG
.
getExt
());
qiniuStorage
.
store
(
imageStream
,
1
,
MediaTypeEnum
.
IMAGE_JPG
.
getMime
(),
keyName
);
String
urlOfSize
=
qiniuStorage
.
generateUrl
(
keyName
);
logger
.
info
(
">>>>>>>>>>>>> id : {} ; new URL = {}"
,
category
.
getId
(),
urlOfSize
);
stringBuffer
.
append
(
urlOfSize
);
}
catch
(
Exception
e
)
{
stringBuffer
.
append
(
image
);
logger
.
error
(
"更新类目错误 id: {} , url : {}, error :{}"
,
category
.
getId
(),
image
,
e
);
}
});
Category
newCategory
=
new
Category
();
newCategory
.
setId
(
category
.
getId
());
newCategory
.
setIcon
(
stringBuffer
.
toString
());
categoryDao
.
updateById
(
newCategory
);
logger
.
info
(
">>>>>>>>>>>>> id : {} ; 更新类目图片地址成功 !!!"
,
category
.
getId
());
}
});
logger
.
info
(
">>>>>>>>>>>>>>>>> 更新类目图片尺寸的页码: {}, 更新成功 <<<<<<<<<<<<<<<<<"
,
i
);
});
logger
.
info
(
">>>>>>>>>>>>>>>>>>>>>>> 更新类目图片尺寸, 执行完毕 <<<<<<<<<<<<<<<<<<<<<"
);
}
catch
(
Exception
e
)
{
logger
.
error
(
"更新类目图片尺寸 error {}"
,
e
);
}
}
public
void
syn
(){
public
void
syn
(){
/* RLock lock = redissonClient.getLock(SYN_NEPHRITE_TO_ES_TASK_KEY);
/* RLock lock = redissonClient.getLock(SYN_NEPHRITE_TO_ES_TASK_KEY);
if (!lock.tryLock()) {
if (!lock.tryLock()) {
...
...
ch-admin-api/src/test/java/com/wwdz/ch/admin/impl/SynCoinJobTest.java
View file @
1a0ee1aa
...
@@ -77,4 +77,10 @@ public class SynCoinJobTest {
...
@@ -77,4 +77,10 @@ public class SynCoinJobTest {
public
void
importNephriteData
()
throws
Exception
{
public
void
importNephriteData
()
throws
Exception
{
importNephriteDataJob
.
execute
();
importNephriteDataJob
.
execute
();
}
}
@Test
public
void
addSizeForCategoryIcon
()
throws
Exception
{
synCoinJob
.
addSizeForCategoryIcon
();
}
}
}
\ No newline at end of file
ch-core/src/main/java/com/wwdz/ch/core/util/CacheUtil.java
View file @
1a0ee1aa
...
@@ -2,12 +2,17 @@ package com.wwdz.ch.core.util;
...
@@ -2,12 +2,17 @@ package com.wwdz.ch.core.util;
import
com.github.benmanes.caffeine.cache.AsyncLoadingCache
;
import
com.github.benmanes.caffeine.cache.AsyncLoadingCache
;
import
com.github.benmanes.caffeine.cache.Caffeine
;
import
com.github.benmanes.caffeine.cache.Caffeine
;
import
com.wwdz.ch.db.dao.CategoryDao
;
import
com.wwdz.ch.db.dao.dts.DtsAdminDao
;
import
com.wwdz.ch.db.dao.dts.DtsAdminDao
;
import
com.wwdz.ch.db.dao.dts.DtsUserDao
;
import
com.wwdz.ch.db.dao.dts.DtsUserDao
;
import
com.wwdz.ch.db.domain.Admin
;
import
com.wwdz.ch.db.domain.Admin
;
import
com.wwdz.ch.db.domain.Category
;
import
com.wwdz.ch.db.domain.User
;
import
com.wwdz.ch.db.domain.User
;
import
com.wwdz.ch.db.dto.request.CategorySearchRequestDto
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.TimeUnit
;
...
@@ -22,6 +27,9 @@ public class CacheUtil {
...
@@ -22,6 +27,9 @@ public class CacheUtil {
@Autowired
@Autowired
DtsUserDao
dtsUserDao
;
DtsUserDao
dtsUserDao
;
@Autowired
CategoryDao
categoryDao
;
public
String
getAppletUserNameById
(
long
key
)
{
public
String
getAppletUserNameById
(
long
key
)
{
try
{
try
{
...
@@ -84,4 +92,25 @@ public class CacheUtil {
...
@@ -84,4 +92,25 @@ public class CacheUtil {
}
}
/**
* 查询后台用户
*
* @return
*/
public
List
<
Category
>
getAllCategory
(
Integer
pid
)
{
CategorySearchRequestDto
dto
=
new
CategorySearchRequestDto
();
List
<
Category
>
categoryList
=
categoryDao
.
listSelective
(
dto
);
Map
<
Integer
,
List
<
Category
>>
map
=
new
HashMap
<>();
for
(
Category
category
:
categoryList
)
{
if
(
category
.
getIsLeaf
())
{
continue
;
}
int
nextPid
=
category
.
getId
();
List
<
Category
>
childCategroyList
=
categoryDao
.
queryByPid
(
nextPid
);
map
.
put
(
nextPid
,
childCategroyList
);
}
return
map
.
get
(
pid
);
}
}
}
ch-dao/src/main/java/com/wwdz/ch/db/dao/CategoryDao.java
View file @
1a0ee1aa
...
@@ -50,4 +50,7 @@ public interface CategoryDao {
...
@@ -50,4 +50,7 @@ public interface CategoryDao {
Integer
getMaxCagtegoryLevel
();
Integer
getMaxCagtegoryLevel
();
List
<
String
>
getCategoryPath
(
Integer
id
);
List
<
String
>
getCategoryPath
(
Integer
id
);
List
<
Category
>
findByPage
(
CategorySearchRequestDto
dto
);
}
}
ch-dao/src/main/java/com/wwdz/ch/db/impl/CategoryDaoImpl.java
View file @
1a0ee1aa
...
@@ -136,4 +136,12 @@ public class CategoryDaoImpl implements CategoryDao {
...
@@ -136,4 +136,12 @@ public class CategoryDaoImpl implements CategoryDao {
return
pathList
;
return
pathList
;
}
}
@Override
public
List
<
Category
>
findByPage
(
CategorySearchRequestDto
dto
)
{
CategoryExample
example
=
new
CategoryExample
();
CategoryExample
.
Criteria
criteria
=
example
.
createCriteria
();
PageHelper
.
startPage
(
dto
.
getPage
(),
dto
.
getLimit
());
return
categoryMapper
.
selectByExample
(
example
);
}
}
}
ch-wx-api/src/main/java/com/wwdz/ch/wx/entity/vo/BidRecordVo.java
View file @
1a0ee1aa
...
@@ -40,6 +40,9 @@ public class BidRecordVo implements Entity {
...
@@ -40,6 +40,9 @@ public class BidRecordVo implements Entity {
*/
*/
private
Date
updateTime
;
private
Date
updateTime
;
public
BidRecordVo
()
{
}
public
BidRecordVo
(
BidRecord
record
)
{
public
BidRecordVo
(
BidRecord
record
)
{
this
.
id
=
record
.
getId
();
this
.
id
=
record
.
getId
();
this
.
cid
=
record
.
getCid
();
this
.
cid
=
record
.
getCid
();
...
...
ch-wx-api/src/main/java/com/wwdz/ch/wx/impl/QueryPriceServiceImpl.java
View file @
1a0ee1aa
...
@@ -7,9 +7,13 @@ import com.wwdz.ch.core.type.PageSearchResult;
...
@@ -7,9 +7,13 @@ import com.wwdz.ch.core.type.PageSearchResult;
import
com.wwdz.ch.core.type.Result
;
import
com.wwdz.ch.core.type.Result
;
import
com.wwdz.ch.db.dao.BidRecordDao
;
import
com.wwdz.ch.db.dao.BidRecordDao
;
import
com.wwdz.ch.db.dao.CategoryDao
;
import
com.wwdz.ch.db.dao.CategoryDao
;
import
com.wwdz.ch.db.dao.ItemDao
;
import
com.wwdz.ch.db.domain.BidRecord
;
import
com.wwdz.ch.db.domain.BidRecord
;
import
com.wwdz.ch.db.domain.Category
;
import
com.wwdz.ch.db.domain.Category
;
import
com.wwdz.ch.db.domain.Item
;
import
com.wwdz.ch.db.dto.request.BidRecordRequestDto
;
import
com.wwdz.ch.db.dto.request.BidRecordRequestDto
;
import
com.wwdz.ch.db.dto.request.CoinRequestDto
;
import
com.wwdz.ch.wx.entity.request.ItemRequestDto
;
import
com.wwdz.ch.wx.entity.request.QueryPriceRequestDto
;
import
com.wwdz.ch.wx.entity.request.QueryPriceRequestDto
;
import
com.wwdz.ch.wx.entity.vo.BidRecordVo
;
import
com.wwdz.ch.wx.entity.vo.BidRecordVo
;
import
com.wwdz.ch.wx.entity.vo.CategoryVo
;
import
com.wwdz.ch.wx.entity.vo.CategoryVo
;
...
@@ -18,6 +22,8 @@ import org.slf4j.Logger;
...
@@ -18,6 +22,8 @@ import org.slf4j.Logger;
import
org.slf4j.LoggerFactory
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.StringUtils
;
import
java.time.*
;
import
java.time.*
;
import
java.time.format.DateTimeFormatter
;
import
java.time.format.DateTimeFormatter
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
...
@@ -37,6 +43,9 @@ public class QueryPriceServiceImpl implements QueryPriceService {
...
@@ -37,6 +43,9 @@ public class QueryPriceServiceImpl implements QueryPriceService {
@Autowired
@Autowired
BidRecordDao
bidRecordDao
;
BidRecordDao
bidRecordDao
;
@Autowired
ItemDao
itemDao
;
@Override
@Override
public
Result
queryPrice
(
QueryPriceRequestDto
queryPriceRequestDto
)
{
public
Result
queryPrice
(
QueryPriceRequestDto
queryPriceRequestDto
)
{
...
@@ -86,13 +95,25 @@ public class QueryPriceServiceImpl implements QueryPriceService {
...
@@ -86,13 +95,25 @@ public class QueryPriceServiceImpl implements QueryPriceService {
@Override
@Override
public
Result
findBidRecord
(
BidRecord
RequestDto
dto
)
{
public
Result
findBidRecord
(
Coin
RequestDto
dto
)
{
try
{
try
{
List
<
BidRecord
>
bidRecordList
=
bidRecordDao
.
queryByCidOrderBySelf
(
dto
);
List
<
Item
>
itemList
=
itemDao
.
findListByPage
(
dto
);
List
<
BidRecordVo
>
bidRecordVos
=
new
ArrayList
<>();
PageInfo
pageInfo
=
PageInfo
.
of
(
itemList
);
bidRecordVos
=
bidRecordList
.
stream
().
map
(
i
->
new
BidRecordVo
(
i
)).
collect
(
Collectors
.
toList
());
List
<
Map
<
String
,
Object
>>
mapList
=
new
ArrayList
<>();
PageInfo
pageInfo
=
PageInfo
.
of
(
bidRecordVos
);
itemList
.
stream
().
forEach
(
i
->
{
return
Result
.
success
(
PageSearchResult
.
of
(
pageInfo
));
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"bidTime"
,
i
.
getBidTime
());
map
.
put
(
"price"
,
i
.
getPrice
()
/
(
double
)
100
);
map
.
put
(
"platform"
,
"电商平台"
);
map
.
put
(
"detail"
,
i
.
getDetail
());
if
(
StringUtils
.
hasLength
(
i
.
getTopImage
()))
{
map
.
put
(
"image"
,
i
.
getTopImage
());
}
else
{
map
.
put
(
"image"
,
StringUtils
.
isEmpty
(
i
.
getImages
())?
""
:
i
.
getImages
().
split
(
";"
)[
0
]);
}
mapList
.
add
(
map
);
});
return
Result
.
success
(
PageSearchResult
.
of
(
pageInfo
,
mapList
));
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
logger
.
info
(
"成交记录查询失败:{}"
,
e
);
logger
.
info
(
"成交记录查询失败:{}"
,
e
);
}
}
...
...
ch-wx-api/src/main/java/com/wwdz/ch/wx/service/QueryPriceService.java
View file @
1a0ee1aa
...
@@ -2,6 +2,7 @@ package com.wwdz.ch.wx.service;
...
@@ -2,6 +2,7 @@ package com.wwdz.ch.wx.service;
import
com.wwdz.ch.core.type.Result
;
import
com.wwdz.ch.core.type.Result
;
import
com.wwdz.ch.db.dto.request.BidRecordRequestDto
;
import
com.wwdz.ch.db.dto.request.BidRecordRequestDto
;
import
com.wwdz.ch.db.dto.request.CoinRequestDto
;
import
com.wwdz.ch.wx.entity.request.QueryPriceRequestDto
;
import
com.wwdz.ch.wx.entity.request.QueryPriceRequestDto
;
public
interface
QueryPriceService
{
public
interface
QueryPriceService
{
...
@@ -13,5 +14,5 @@ public interface QueryPriceService {
...
@@ -13,5 +14,5 @@ public interface QueryPriceService {
* @param dto
* @param dto
* @return
* @return
*/
*/
Result
findBidRecord
(
BidRecord
RequestDto
dto
);
Result
findBidRecord
(
Coin
RequestDto
dto
);
}
}
ch-wx-api/src/main/java/com/wwdz/ch/wx/web/QueryPriceController.java
View file @
1a0ee1aa
...
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
...
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import
com.wwdz.ch.core.consts.ResultCode
;
import
com.wwdz.ch.core.consts.ResultCode
;
import
com.wwdz.ch.core.type.Result
;
import
com.wwdz.ch.core.type.Result
;
import
com.wwdz.ch.db.dto.request.BidRecordRequestDto
;
import
com.wwdz.ch.db.dto.request.BidRecordRequestDto
;
import
com.wwdz.ch.db.dto.request.CoinRequestDto
;
import
com.wwdz.ch.wx.entity.request.CategoryRequestDto
;
import
com.wwdz.ch.wx.entity.request.CategoryRequestDto
;
import
com.wwdz.ch.wx.entity.request.QueryPriceRequestDto
;
import
com.wwdz.ch.wx.entity.request.QueryPriceRequestDto
;
import
com.wwdz.ch.wx.service.CategoryService
;
import
com.wwdz.ch.wx.service.CategoryService
;
...
@@ -43,7 +44,7 @@ public class QueryPriceController {
...
@@ -43,7 +44,7 @@ public class QueryPriceController {
@ApiOperation
(
value
=
"查价成交记录"
)
@ApiOperation
(
value
=
"查价成交记录"
)
@PostMapping
(
"/findBidRecords"
)
@PostMapping
(
"/findBidRecords"
)
public
Result
findBidRecords
(
@RequestBody
BidRecord
RequestDto
dto
)
{
public
Result
findBidRecords
(
@RequestBody
Coin
RequestDto
dto
)
{
logger
.
info
(
"【请求开始】查价成交记录,请求参数:{}"
,
JSON
.
toJSONString
(
dto
));
logger
.
info
(
"【请求开始】查价成交记录,请求参数:{}"
,
JSON
.
toJSONString
(
dto
));
if
(
StringUtils
.
isEmpty
(
dto
.
getCid
()))
{
if
(
StringUtils
.
isEmpty
(
dto
.
getCid
()))
{
return
Result
.
failed
(
ResultCode
.
PARAM_ERROR
);
return
Result
.
failed
(
ResultCode
.
PARAM_ERROR
);
...
...
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