Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
V
volunteer_service
Project
Project
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
licc
volunteer_service
Commits
2bae35a2
Commit
2bae35a2
authored
Jan 15, 2021
by
licc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
格式修改
parent
a771dcb6
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
203 additions
and
60 deletions
+203
-60
BannerMapper.java
...apper/src/main/java/cn/wisenergy/mapper/BannerMapper.java
+0
-1
BannerService.java
...src/main/java/cn/wisenergy/service/app/BannerService.java
+1
-1
SendSmsSerVice.java
...rc/main/java/cn/wisenergy/service/app/SendSmsSerVice.java
+12
-0
BannerServiceImpl.java
...java/cn/wisenergy/service/app/impl/BannerServiceImpl.java
+32
-28
SendSmsSerViceImpl.java
...ava/cn/wisenergy/service/app/impl/SendSmsSerViceImpl.java
+25
-0
UserLoginServiceImpl.java
...a/cn/wisenergy/service/app/impl/UserLoginServiceImpl.java
+5
-1
Common.java
...ice/src/main/java/cn/wisenergy/service/common/Common.java
+4
-0
SmsSign.java
...vice/src/main/java/cn/wisenergy/service/util/SmsSign.java
+74
-0
BannerController.java
.../wisenergy/web/admin/controller/app/BannerController.java
+24
-28
SendSmsController.java
...wisenergy/web/admin/controller/app/SendSmsController.java
+20
-0
UserLongController.java
...isenergy/web/admin/controller/app/UserLongController.java
+6
-1
No files found.
wisenergy-mapper/src/main/java/cn/wisenergy/mapper/BannerMapper.java
View file @
2bae35a2
package
cn
.
wisenergy
.
mapper
;
import
cn.wisenergy.common.utils.R
;
import
cn.wisenergy.model.app.Banner
;
import
cn.wisenergy.model.dto.BannerDto
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/app/BannerService.java
View file @
2bae35a2
...
...
@@ -18,7 +18,7 @@ public interface BannerService {
* @param advertising 广告信息
* @return 广告信息
*/
int
add
(
Banner
advertising
);
R
<
Boolean
>
add
(
Banner
advertising
);
/**
* 编辑广告
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/app/SendSmsSerVice.java
0 → 100644
View file @
2bae35a2
package
cn
.
wisenergy
.
service
.
app
;
import
cn.wisenergy.common.utils.R
;
/**
*@ Description: 短信验证码接口定义
*@ Author : 86187
*@ Date : 2021/1/15 15:44
*/
public
interface
SendSmsSerVice
{
R
<
Object
>
getSmCode
(
String
phone
);
}
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/BannerServiceImpl.java
View file @
2bae35a2
...
...
@@ -18,48 +18,52 @@ import java.util.HashMap;
import
java.util.List
;
/**
*
@ Description: 广告接口是实现
*
@ Author : 86187
*
@ Date : 2021/1/7 17:07
*/
*
@ Description: 广告接口是实现
*
@ Author : 86187
*
@ Date : 2021/1/7 17:07
*/
@Slf4j
@Service
public
class
BannerServiceImpl
extends
ServiceImpl
<
BannerMapper
,
Banner
>
implements
BannerService
{
@Autowired
private
BannerMapper
bannerMapper
;
@Override
public
int
add
(
Banner
advertising
)
{
log
.
info
(
"BannerServiceImpl[].add[].input.param:advertising:
{}"
+
advertising
);
public
R
<
Boolean
>
add
(
Banner
advertising
)
{
log
.
info
(
"BannerServiceImpl[].add[].input.param:advertising:
"
+
advertising
);
//判断是否存在广告图片,给定初始值
if
(!
StringUtils
.
isEmpty
(
advertising
.
getImage
()))
{
advertising
.
setIsHaveImage
(
1
);
}
else
{
}
else
{
advertising
.
setIsHaveImage
(
0
);
}
advertising
.
setStatus
(
0
);
//数据添加
int
add
=
bannerMapper
.
add
(
advertising
);
return
add
;
int
count
=
bannerMapper
.
add
(
advertising
);
if
(
count
==
0
)
{
return
R
.
ok
(
1
,
false
);
}
return
R
.
ok
(
0
,
true
);
}
@Override
public
R
edit
(
Banner
advertising
)
{
log
.
info
(
"BannerServiceImpl[].getById[].input.param:advertising"
+
advertising
);
log
.
info
(
"BannerServiceImpl[].getById[].input.param:advertising"
+
advertising
);
if
(
null
==
advertising
)
{
if
(
null
==
advertising
)
{
return
R
.
error
(
"输入的参数有误"
);
}
if
(
advertising
.
getStatus
()
<
0
||
advertising
.
getStatus
()>
1
)
{
if
(
advertising
.
getStatus
()
<
0
||
advertising
.
getStatus
()
>
1
)
{
return
R
.
error
(
"缺少重要数据"
);
}
int
edit
=
bannerMapper
.
edit
(
advertising
);
//判断数据是否修改成功
if
(
edit
==
0
)
{
if
(
edit
==
0
)
{
return
R
.
error
(
"数据修改失败"
);
}
...
...
@@ -68,13 +72,13 @@ public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> impleme
@Override
public
R
<
Banner
>
getById
(
Integer
id
)
{
log
.
info
(
"BannerServiceImpl[].getById[].input.param:id"
+
id
);
if
(
null
==
id
||
id
.
equals
(
""
))
{
log
.
info
(
"BannerServiceImpl[].getById[].input.param:id"
+
id
);
if
(
null
==
id
||
id
.
equals
(
""
))
{
return
R
.
error
(
"传入参数无效"
);
}
Banner
banner
=
bannerMapper
.
getById
(
id
);
if
(
null
==
banner
)
{
if
(
null
==
banner
)
{
return
R
.
error
(
"数据获取失败"
);
}
...
...
@@ -83,8 +87,8 @@ public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> impleme
@Override
public
R
<
PageInfo
<
BannerDto
>>
getList
(
AdvertisingQueryVo
advertisingQueryVo
)
{
log
.
info
(
"BannerServiceImpl[].getList[].input.param:advertisingQueryVo:{}"
+
advertisingQueryVo
);
if
(
null
==
advertisingQueryVo
)
{
log
.
info
(
"BannerServiceImpl[].getList[].input.param:advertisingQueryVo:{}"
+
advertisingQueryVo
);
if
(
null
==
advertisingQueryVo
)
{
return
R
.
error
(
"输入参数无效"
);
}
...
...
@@ -100,8 +104,8 @@ public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> impleme
//封装参数
HashMap
<
String
,
Object
>
map
=
new
HashMap
<>(
4
);
map
.
put
(
"pageNo"
,
pageNo
-
1
);
map
.
put
(
"pageSize"
,
pageSize
);
map
.
put
(
"pageNo"
,
pageNo
-
1
);
map
.
put
(
"pageSize"
,
pageSize
);
//查询数据;
List
<
BannerDto
>
list
=
bannerMapper
.
getList
(
map
);
...
...
@@ -121,15 +125,15 @@ public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> impleme
@Override
public
R
putIn
(
Integer
id
,
Integer
status
)
{
log
.
info
(
"BannerServiceImpl[].putIn[].input.param,status,id"
+
status
,
id
);
log
.
info
(
"BannerServiceImpl[].putIn[].input.param,status,id"
+
status
,
id
);
//判断数据是否正确
if
(
id
==
null
||
id
.
equals
(
""
))
{
if
(
id
==
null
||
id
.
equals
(
""
))
{
return
R
.
error
(
"缺少重要数据"
);
}
if
(
status
==
null
||
status
.
equals
(
""
))
{
if
(
status
==
null
||
status
.
equals
(
""
))
{
return
R
.
error
(
"缺少重要数据"
);
}
if
(
status
<
0
||
status
>
1
)
{
if
(
status
<
0
||
status
>
1
)
{
return
R
.
error
(
"缺少重要数据"
);
}
...
...
@@ -137,7 +141,7 @@ public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> impleme
int
i
=
bannerMapper
.
putIn
(
id
,
status
);
//判断数据是否修改成功
if
(
i
==
0
)
{
if
(
i
==
0
)
{
return
R
.
error
(
"数据修改失败"
);
}
return
R
.
ok
();
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/SendSmsSerViceImpl.java
0 → 100644
View file @
2bae35a2
package
cn
.
wisenergy
.
service
.
app
.
impl
;
import
cn.wisenergy.common.utils.R
;
import
cn.wisenergy.service.app.SendSmsSerVice
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.stereotype.Service
;
/**
*@ Description: 短信验证码接口实现
*@ Author : 86187
*@ Date : 2021/1/15 15:45
*/
@Service
@Slf4j
public
class
SendSmsSerViceImpl
implements
SendSmsSerVice
{
@Override
public
R
<
Object
>
getSmCode
(
String
phone
)
{
log
.
info
(
"volunteer-service[]SendSmsSerViceImpl[]getSmCode[]input.param.phone:"
+
phone
);
if
(
StringUtils
.
isBlank
(
phone
)){
return
R
.
error
(
"手机号码不能为空!"
);
}
return
null
;
}
}
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserLoginServiceImpl.java
View file @
2bae35a2
...
...
@@ -38,7 +38,11 @@ public class UserLoginServiceImpl extends ServiceImpl<UsersMapper, UserInfo> imp
@Override
public
R
<
Boolean
>
register
(
UserRegisterVo
userVo
)
{
log
.
info
(
"volunteer-service[]UserLoginServiceImpl[]register[]input.param.userVo:"
+
userVo
);
if
(
null
==
userVo
||
StringUtils
.
isBlank
(
userVo
.
getPhone
())
||
if
(
null
==
userVo
)
{
return
R
.
error
(
"入参为空!"
);
}
if
(
StringUtils
.
isBlank
(
userVo
.
getPhone
())
||
StringUtils
.
isBlank
(
userVo
.
getPassword
()))
{
return
R
.
error
(
"入参为空!"
);
}
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/common/Common.java
View file @
2bae35a2
...
...
@@ -12,5 +12,9 @@ public class Common {
*/
public
static
final
String
RESET_PASSWORD_VALUE
=
"123456"
;
/**
* 阿里云短信发送Url
*/
public
static
final
String
SEND_SMS_URL
=
"http://dysmsapi.aliyuncs.com/?Signature="
;
}
wisenergy-service/src/main/java/cn/wisenergy/service/util/SmsSign.java
0 → 100644
View file @
2bae35a2
package
cn
.
wisenergy
.
service
.
util
;
import
cn.wisenergy.service.common.Common
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* @author 86187
*/
public
class
SmsSign
{
public
static
String
getUrl
()
throws
Exception
{
String
accessKeyId
=
"testId"
;
String
accessSecret
=
"testSecret"
;
java
.
text
.
SimpleDateFormat
df
=
new
java
.
text
.
SimpleDateFormat
(
"yyyy-MM-dd'T'HH:mm:ss'Z'"
);
// 这里一定要设置GMT时区
df
.
setTimeZone
(
new
java
.
util
.
SimpleTimeZone
(
0
,
"GMT"
));
Map
<
String
,
String
>
paras
=
new
HashMap
<
String
,
String
>();
// 1. 系统参数
paras
.
put
(
"SignatureMethod"
,
"HMAC-SHA1"
);
paras
.
put
(
"SignatureNonce"
,
java
.
util
.
UUID
.
randomUUID
().
toString
());
paras
.
put
(
"AccessKeyId"
,
accessKeyId
);
paras
.
put
(
"SignatureVersion"
,
"1.0"
);
paras
.
put
(
"Timestamp"
,
df
.
format
(
new
java
.
util
.
Date
()));
paras
.
put
(
"Format"
,
"XML"
);
// 2. 业务API参数
paras
.
put
(
"Action"
,
"SendSms"
);
paras
.
put
(
"Version"
,
"2017-05-25"
);
paras
.
put
(
"RegionId"
,
"cn-hangzhou"
);
paras
.
put
(
"PhoneNumbers"
,
"15300000001"
);
paras
.
put
(
"SignName"
,
"阿里云短信测试专用"
);
paras
.
put
(
"TemplateParam"
,
"{\"customer\":\"test\"}"
);
paras
.
put
(
"TemplateCode"
,
"SMS_71390007"
);
paras
.
put
(
"OutId"
,
"123"
);
// 3. 去除签名关键字Key
if
(
paras
.
containsKey
(
"Signature"
))
{
paras
.
remove
(
"Signature"
);
}
// 4. 参数KEY排序
java
.
util
.
TreeMap
<
String
,
String
>
sortParas
=
new
java
.
util
.
TreeMap
<
String
,
String
>();
sortParas
.
putAll
(
paras
);
// 5. 构造待签名的字符串
java
.
util
.
Iterator
<
String
>
it
=
sortParas
.
keySet
().
iterator
();
StringBuilder
sortQueryStringTmp
=
new
StringBuilder
();
while
(
it
.
hasNext
())
{
String
key
=
it
.
next
();
sortQueryStringTmp
.
append
(
"&"
).
append
(
specialUrlEncode
(
key
)).
append
(
"="
).
append
(
specialUrlEncode
(
paras
.
get
(
key
)));
}
// 去除第一个多余的&符号
String
sortedQueryString
=
sortQueryStringTmp
.
substring
(
1
);
StringBuilder
stringToSign
=
new
StringBuilder
();
stringToSign
.
append
(
"GET"
).
append
(
"&"
);
stringToSign
.
append
(
specialUrlEncode
(
"/"
)).
append
(
"&"
);
stringToSign
.
append
(
specialUrlEncode
(
sortedQueryString
));
String
sign
=
sign
(
accessSecret
+
"&"
,
stringToSign
.
toString
());
// 6. 签名最后也要做特殊URL编码
String
signature
=
specialUrlEncode
(
sign
);
System
.
out
.
println
(
Common
.
SEND_SMS_URL
+
signature
+
sortQueryStringTmp
);
return
Common
.
SEND_SMS_URL
+
signature
+
sortQueryStringTmp
;
}
public
static
String
specialUrlEncode
(
String
value
)
throws
Exception
{
return
java
.
net
.
URLEncoder
.
encode
(
value
,
"UTF-8"
).
replace
(
"+"
,
"%20"
).
replace
(
"*"
,
"%2A"
).
replace
(
"%7E"
,
"~"
);
}
public
static
String
sign
(
String
accessSecret
,
String
stringToSign
)
throws
Exception
{
javax
.
crypto
.
Mac
mac
=
javax
.
crypto
.
Mac
.
getInstance
(
"HmacSHA1"
);
mac
.
init
(
new
javax
.
crypto
.
spec
.
SecretKeySpec
(
accessSecret
.
getBytes
(
"UTF-8"
),
"HmacSHA1"
));
byte
[]
signData
=
mac
.
doFinal
(
stringToSign
.
getBytes
(
"UTF-8"
));
return
new
sun
.
misc
.
BASE64Encoder
().
encode
(
signData
);
}
}
wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/BannerController.java
View file @
2bae35a2
...
...
@@ -28,68 +28,64 @@ public class BannerController {
@Autowired
private
BannerService
bannerService
;
@ApiOperation
(
value
=
"广告添加"
,
notes
=
"广告添加"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"advertising"
,
value
=
"广告数据"
,
dataType
=
"Banner"
)
@ApiOperation
(
value
=
"广告添加"
,
notes
=
"广告添加"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"advertising"
,
value
=
"广告数据"
,
dataType
=
"Banner"
)
@PostMapping
(
"/add"
)
public
R
add
(
@RequestBody
Banner
advertising
)
{
log
.
info
(
"BannerController[].add[].input.param:advertising
{}"
+
advertising
);
public
R
<
Boolean
>
add
(
@RequestBody
Banner
advertising
)
{
log
.
info
(
"BannerController[].add[].input.param:advertising
:"
+
advertising
);
if
(
StringUtils
.
isEmpty
(
advertising
))
{
return
R
.
error
(
"输入参数无效"
);
}
int
add
=
bannerService
.
add
(
advertising
);
if
(
add
==
0
)
{
return
R
.
error
(
"数据添加失败"
);
}
return
R
.
ok
();
return
bannerService
.
add
(
advertising
);
}
@ApiOperation
(
value
=
"广告查询"
,
notes
=
"广告查询"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"advertisingQueryVo"
,
value
=
"分页数据"
,
dataType
=
"AdvertisingQueryVo"
)
@ApiOperation
(
value
=
"广告查询"
,
notes
=
"广告查询"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"advertisingQueryVo"
,
value
=
"分页数据"
,
dataType
=
"AdvertisingQueryVo"
)
@PostMapping
(
"/getList"
)
public
R
<
PageInfo
<
BannerDto
>>
add
(
@RequestBody
AdvertisingQueryVo
advertisingQueryVo
){
log
.
info
(
"BannerController[].add[].input.param:advertisingQueryVo
{}"
+
advertisingQueryVo
);
public
R
<
PageInfo
<
BannerDto
>>
add
(
@RequestBody
AdvertisingQueryVo
advertisingQueryVo
)
{
log
.
info
(
"BannerController[].add[].input.param:advertisingQueryVo
:"
+
advertisingQueryVo
);
R
<
PageInfo
<
BannerDto
>>
list
=
bannerService
.
getList
(
advertisingQueryVo
);
return
list
;
}
@ApiOperation
(
value
=
"查看详情"
,
notes
=
"查看详情"
,
httpMethod
=
"GET"
)
@ApiImplicitParam
(
name
=
"id"
,
value
=
"广告id"
,
dataType
=
"int"
)
@ApiOperation
(
value
=
"查看详情"
,
notes
=
"查看详情"
,
httpMethod
=
"GET"
)
@ApiImplicitParam
(
name
=
"id"
,
value
=
"广告id"
,
dataType
=
"int"
)
@GetMapping
(
"/getById"
)
public
R
<
Banner
>
getById
(
Integer
id
){
log
.
info
(
"BannerController[].getById[].input.param:id"
+
id
);
public
R
<
Banner
>
getById
(
Integer
id
)
{
log
.
info
(
"BannerController[].getById[].input.param:id"
+
id
);
R
<
Banner
>
bannerR
=
bannerService
.
getById
(
id
);
return
bannerR
;
}
@ApiOperation
(
value
=
"广告投放"
,
notes
=
"广告投放"
,
httpMethod
=
"GET"
)
@ApiOperation
(
value
=
"广告投放"
,
notes
=
"广告投放"
,
httpMethod
=
"GET"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"id"
,
value
=
"广告id"
,
dataType
=
"int"
,
required
=
true
),
@ApiImplicitParam
(
name
=
"status"
,
value
=
"广告状态:0:暂停中 1:投放中"
,
dataType
=
"int"
,
required
=
true
)
@ApiImplicitParam
(
name
=
"id"
,
value
=
"广告id"
,
dataType
=
"int"
,
required
=
true
),
@ApiImplicitParam
(
name
=
"status"
,
value
=
"广告状态:0:暂停中 1:投放中"
,
dataType
=
"int"
,
required
=
true
)
})
@GetMapping
(
"/putIn"
)
public
R
putIn
(
Integer
id
,
Integer
status
)
{
log
.
info
(
"BannerController[].putIn[].input.param:id,status"
+
id
,
status
);
public
R
putIn
(
Integer
id
,
Integer
status
)
{
log
.
info
(
"BannerController[].putIn[].input.param:id,status"
+
id
,
status
);
R
booleanR
=
bannerService
.
putIn
(
id
,
status
);
//判断数据是否修改成功
if
(
booleanR
.
getCode
()
==
0
)
{
if
(
booleanR
.
getCode
()
==
0
)
{
return
booleanR
;
}
return
R
.
error
(
"数据修改失败"
);
}
@ApiOperation
(
value
=
"广告编辑"
,
notes
=
"广告编辑"
,
httpMethod
=
"POST"
)
@ApiOperation
(
value
=
"广告编辑"
,
notes
=
"广告编辑"
,
httpMethod
=
"POST"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"advertising"
,
value
=
"广告修改数据"
,
dataType
=
"Banner"
),
@ApiImplicitParam
(
name
=
"advertising"
,
value
=
"广告修改数据"
,
dataType
=
"Banner"
),
})
@PostMapping
(
"/edit"
)
public
R
edit
(
@RequestBody
Banner
advertising
){
log
.
info
(
"BannerController[].edit[].input.param:advertising:{}"
+
advertising
);
public
R
edit
(
@RequestBody
Banner
advertising
)
{
log
.
info
(
"BannerController[].edit[].input.param:advertising:{}"
+
advertising
);
R
booleanR
=
bannerService
.
edit
(
advertising
);
//判断数据是否修改成功
if
(
booleanR
.
getCode
()
==
0
)
{
if
(
booleanR
.
getCode
()
==
0
)
{
return
booleanR
;
}
return
R
.
error
(
"数据修改失败"
);
...
...
wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/SendSmsController.java
0 → 100644
View file @
2bae35a2
package
cn
.
wisenergy
.
web
.
admin
.
controller
.
app
;
import
io.swagger.annotations.Api
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
/**
* @ Description: 短信管理
* @ Author : 86187
* @ Date : 2021/1/15 15:40
*/
@RestController
@Api
(
tags
=
"用户管理"
)
@RequestMapping
(
"/user"
)
@Slf4j
public
class
SendSmsController
{
}
wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/UserLongController.java
View file @
2bae35a2
...
...
@@ -36,7 +36,12 @@ public class UserLongController {
@PostMapping
(
"/register"
)
public
R
<
Boolean
>
resetPassword
(
@RequestBody
UserRegisterVo
userVo
)
{
log
.
info
(
"volunteer-service[]UserLongController[]resetPassword[]input.param.userVo:"
+
userVo
);
if
(
null
==
userVo
||
StringUtils
.
isBlank
(
userVo
.
getPhone
())
||
StringUtils
.
isBlank
(
userVo
.
getPassword
()))
{
if
(
null
==
userVo
)
{
return
R
.
error
(
"入参为空!"
);
}
if
(
StringUtils
.
isBlank
(
userVo
.
getPhone
())
||
StringUtils
.
isBlank
(
userVo
.
getPassword
()))
{
return
R
.
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