记得上下班打卡 | git大法好,push需谨慎

Commit cc695400 authored by 张国柄's avatar 张国柄

fix;

parent f1200510
......@@ -48,12 +48,12 @@ public class AdamRedisConst {
/* ----------------------------------------------------------------- */
public static final String LOCK_KEY_UMEMBER_NO = "adam:lk:member:no";
// public static final String LOCK_KEY_UMEMBER_NO = "adam:lk:member:no";
// // // // // // // // // //
public static final String LOCK_KEY_SMS_CODE_MOBILE = "adam:lk:sms:code:mobile:";
public static final String LOCK_KEY_UREGISTER = "adam:lk:register:";
public static final String LOCK_KEY_UIDENTITY = "adam:lk:identity:";
public static final String LOCK_KEY_UMEMBER_CODE = "adam:lk:member:code:";
// public static final String LOCK_KEY_SMS_CODE_MOBILE = "adam:lk:sms:code:mobile:";
// public static final String LOCK_KEY_UREGISTER = "adam:lk:register:";
// public static final String LOCK_KEY_UIDENTITY = "adam:lk:identity:";
// public static final String LOCK_KEY_UMEMBER_CODE = "adam:lk:member:code:";
/* ----------------------------------------------------------------- */
}
......@@ -3,36 +3,28 @@ package com.liquidnet.client.admin.zhengzai.adam.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.client.admin.zhengzai.adam.service.IAdamMemberCodeAdminService;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.common.cache.redisson.util.RedisLockUtil;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.AdamMemberCodeParam;
import com.liquidnet.service.adam.dto.vo.AdamMemberCodeVo;
import com.liquidnet.service.adam.dto.vo.AdamMemberVo;
import com.liquidnet.service.adam.dto.vo.AdamUserMemberVo;
import com.liquidnet.service.adam.entity.AdamMemberCode;
import com.liquidnet.service.adam.mapper.AdamMemberCodeMapper;
import com.liquidnet.service.adam.util.MemberUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.regex.Pattern;
import static com.liquidnet.service.adam.constant.AdamRedisConst.LOCK_KEY_UMEMBER_NO;
@Slf4j
@Service
public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMapper, AdamMemberCode> implements IAdamMemberCodeAdminService {
@Autowired
AdamMemberCodeMapper memberCodeMapper;
@Autowired
MongoTemplate mongoTemplate;
// @Autowired
// MongoTemplate mongoTemplate;
@Autowired
RedisUtil redisUtil;
......@@ -42,9 +34,10 @@ public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMa
boolean exists;
do {
mCode = MemberUtil.freeCode();
exists = mongoTemplate.exists(
Query.query(Criteria.where("code").is(mCode)), AdamMemberCodeVo.class.getSimpleName()
);
// exists = mongoTemplate.exists(
// Query.query(Criteria.where("code").is(mCode)), AdamMemberCodeVo.class.getSimpleName()
// );
exists = redisUtil.hasKey(mCode);
} while (exists);
// 需要主动生成会员编号
......@@ -64,7 +57,7 @@ public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMa
memberCodeMapper.insert(initMemberCode);
AdamMemberCodeVo vo = AdamMemberCodeVo.getNew().copy(initMemberCode);
mongoTemplate.insert(vo, AdamMemberCodeVo.class.getSimpleName());
// mongoTemplate.insert(vo, AdamMemberCodeVo.class.getSimpleName());
setMemberCodeVoByCode(mCode, vo);
......@@ -75,25 +68,27 @@ public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMa
long s = System.currentTimeMillis();
int memberMaxNo = getMaxMemberNo();
if (-1 == memberMaxNo) {
if (RedisLockUtil.tryLock(LOCK_KEY_UMEMBER_NO, 1, 3)) {
memberMaxNo = getMaxMemberNo();
if (-1 == memberMaxNo) {
Query query = Query.query(Criteria.where("memberId").is(memberId)).with(Sort.by(Sort.Direction.DESC, "memberNo")).limit(1);
AdamUserMemberVo latestMaxMemberNoVo = mongoTemplate.findOne(query, AdamUserMemberVo.class, AdamUserMemberVo.class.getSimpleName());
if (null == latestMaxMemberNoVo) {
AdamMemberVo memberVo = getMemberVoByMemberId(memberId);
setMaxMemberNo(memberVo.getStartNo());
} else {
setMaxMemberNo(Integer.parseInt(latestMaxMemberNoVo.getMemberNo()));
}
}
RedisLockUtil.unlock(LOCK_KEY_UMEMBER_NO);
} else {
return null;
}
// TODO: 2021/7/29 降级DB
throw new LiquidnetServiceException();
// if (RedisLockUtil.tryLock(LOCK_KEY_UMEMBER_NO, 1, 3)) {
// memberMaxNo = getMaxMemberNo();
// if (-1 == memberMaxNo) {
// Query query = Query.query(Criteria.where("memberId").is(memberId)).with(Sort.by(Sort.Direction.DESC, "memberNo")).limit(1);
//
// AdamUserMemberVo latestMaxMemberNoVo = mongoTemplate.findOne(query, AdamUserMemberVo.class, AdamUserMemberVo.class.getSimpleName());
//
// if (null == latestMaxMemberNoVo) {
// AdamMemberVo memberVo = getMemberVoByMemberId(memberId);
//
// setMaxMemberNo(memberVo.getStartNo());
// } else {
// setMaxMemberNo(Integer.parseInt(latestMaxMemberNoVo.getMemberNo()));
// }
// }
// RedisLockUtil.unlock(LOCK_KEY_UMEMBER_NO);
// } else {
// return null;
// }
}
String nextMemberNoStr = String.valueOf(incrMemberNo());
if (Pattern.matches("([\\d])\\1{" + (nextMemberNoStr.length() - 1) + "}", nextMemberNoStr)) {
......@@ -109,22 +104,22 @@ public class AdamMemberCodeAdminServiceImpl extends ServiceImpl<AdamMemberCodeMa
return null == o ? -1 : (int) o;
}
public AdamMemberVo getMemberVoByMemberId(String memberId) {
String key = AdamRedisConst.INFO_MEMBER_CATEGORY.concat(memberId);
long s = System.currentTimeMillis();
AdamMemberVo vo = (AdamMemberVo) redisUtil.get(key);
if (null == vo) {
s = System.currentTimeMillis();
vo = mongoTemplate.findOne(
Query.query(Criteria.where("memberId").is(memberId).and("state").is(1)),
AdamMemberVo.class, AdamMemberVo.class.getSimpleName()
);
log.debug("#MDB耗时:{}ms", System.currentTimeMillis() - s);
if (null != vo) redisUtil.set(key, vo);
}
log.debug("#RDM耗时:{}ms", System.currentTimeMillis() - s);
return vo;
}
// public AdamMemberVo getMemberVoByMemberId(String memberId) {
// String key = AdamRedisConst.INFO_MEMBER_CATEGORY.concat(memberId);
// long s = System.currentTimeMillis();
// AdamMemberVo vo = (AdamMemberVo) redisUtil.get(key);
// if (null == vo) {
// s = System.currentTimeMillis();
// vo = mongoTemplate.findOne(
// Query.query(Criteria.where("memberId").is(memberId).and("state").is(1)),
// AdamMemberVo.class, AdamMemberVo.class.getSimpleName()
// );
// log.debug("#MDB耗时:{}ms", System.currentTimeMillis() - s);
// if (null != vo) redisUtil.set(key, vo);
// }
// log.debug("#RDM耗时:{}ms", System.currentTimeMillis() - s);
// return vo;
// }
public boolean setMaxMemberNo(int val) {
return redisUtil.set(AdamRedisConst.INCR_MEMBER_NO, val);
......
......@@ -9,7 +9,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.common.cache.redisson.util.RedisLockUtil;
import com.liquidnet.common.sms.constant.SmsEnum;
import com.liquidnet.common.sms.processor.SmsProcessor;
import com.liquidnet.commons.lang.constant.LnsEnum;
......@@ -49,8 +48,6 @@ import java.util.Arrays;
import java.util.Map;
import java.util.Objects;
import static com.liquidnet.service.adam.constant.AdamRedisConst.LOCK_KEY_SMS_CODE_MOBILE;
@ApiSupport(order = 10010)
@Api(tags = "用户登录")
@Slf4j
......@@ -132,7 +129,6 @@ public class AdamLoginController {
@GetMapping(value = {"send"})
public ResponseDto<Object> sendSms(@Pattern(regexp = "\\d{11}", message = "手机号格式有误") @RequestParam String mobile) {
log.debug("send to mobile:{}", mobile);
if (RedisLockUtil.tryLock(LOCK_KEY_SMS_CODE_MOBILE + mobile, 1, 5)) {
// Map<String, Object> respMap = null;
// String respStr = null;
// try {
......@@ -163,6 +159,12 @@ public class AdamLoginController {
// return ResponseDto.failure(ErrorMapping.get("10003"));
// }
String smsCodeByMobile = adamRdmService.getSmsCodeByMobile(mobile);
if (StringUtils.isNotEmpty(smsCodeByMobile)) {
return ResponseDto.failure(ErrorMapping.get("10003"));
}
String smsCode = RandomStringUtils.randomNumeric(6);
// SmsMessage smsMessage = SmsMessage.builder().setPhone(mobile).setSignName(SmsEnum.ADSignName.正在现场.name())
// .setTemplateCode(SmsEnum.ADTemplate.SMS_109535335.name())
......@@ -177,9 +179,6 @@ public class AdamLoginController {
return ResponseDto.success();
}
return ResponseDto.failure(ErrorMapping.get("10002"));
} else {
return ResponseDto.failure(ErrorMapping.get("10000"));
}
}
@ApiOperationSupport(order = 3)
......
package com.liquidnet.service.adam.controller;
import com.fasterxml.jackson.databind.JsonNode;
import com.github.pagehelper.PageInfo;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.common.cache.redisson.util.RedisLockUtil;
import com.liquidnet.commons.lang.constant.LnsEnum;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
......@@ -16,8 +14,8 @@ import com.liquidnet.service.adam.dto.AdamMemberOrderCodeParam;
import com.liquidnet.service.adam.dto.AdamMemberOrderParam;
import com.liquidnet.service.adam.dto.AdamMemberOrderResult;
import com.liquidnet.service.adam.dto.vo.*;
import com.liquidnet.service.adam.service.IAdamMemberOrderService;
import com.liquidnet.service.adam.service.AdamRdmService;
import com.liquidnet.service.adam.service.IAdamMemberOrderService;
import com.liquidnet.service.adam.service.IAdamUserService;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.PagedResult;
......@@ -36,11 +34,8 @@ import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import java.util.List;
import static com.liquidnet.service.adam.constant.AdamRedisConst.LOCK_KEY_UMEMBER_CODE;
@ApiSupport(order = 10031)
@Api(tags = "购买会员")
@Slf4j
......@@ -225,16 +220,16 @@ public class AdamMemberOrderController {
return ResponseDto.failure(ErrorMapping.get("10000"));
}
}
if (RedisLockUtil.tryLock(LOCK_KEY_UMEMBER_CODE + param.getMemberCode(), 1, 5)) {
// if (RedisLockUtil.tryLock(LOCK_KEY_UMEMBER_CODE + param.getMemberCode(), 1, 5)) {
ResponseDto<AdamMemberOrderResult> responseDto = adamMemberOrderService.exchangeMemberCode(param);
if (!responseDto.isSuccess()) {
RedisLockUtil.unlock(LOCK_KEY_UMEMBER_CODE + param.getMemberCode());
}
// if (!responseDto.isSuccess()) {
// RedisLockUtil.unlock(LOCK_KEY_UMEMBER_CODE + param.getMemberCode());
// }
return responseDto;
} else {
return ResponseDto.failure(ErrorMapping.get("10000"));
}
// } else {
// return ResponseDto.failure(ErrorMapping.get("10000"));
// }
}
@ApiOperationSupport(order = 5)
......
......@@ -50,7 +50,8 @@ public class AdamRdmService {
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | <Mobile, SMS CODE> */
public boolean setSmsCodeByMobile(String mobile, String smsCode) {
return redisUtil.set(AdamRedisConst.VALID_SMS_CODE_MOBILE + mobile, smsCode, 15 * 60);
// TODO: 2021/7/29 改为1分钟
return redisUtil.set(AdamRedisConst.VALID_SMS_CODE_MOBILE + mobile, smsCode, 1 * 60);
}
public String getSmsCodeByMobile(String mobile) {
......@@ -526,28 +527,14 @@ public class AdamRdmService {
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | <AdamMemberCodeVo::buyOrderNo, MEMBER_CODE + STATE> */
public boolean setMemberCodeByBuyOrderNo(String buyOrderNo, String memberCodeAndState) {
return redisUtil.set(buyOrderNo, memberCodeAndState);
public boolean setMemberCodeByBuyOrderNo(String buyOrderNo, String memberCode) {
return redisUtil.set(buyOrderNo, memberCode);
}
public String getMemberCodeByBuyOrderNo(String buyOrderNo) {
return (String) redisUtil.get(buyOrderNo);
}
public int getMemberCodeStateByBuyOrderNoVal(String memberCodeAndState) {
if (StringUtils.isEmpty(memberCodeAndState)) {
return 0;
}
return Integer.parseInt(org.apache.commons.lang3.StringUtils.right(memberCodeAndState, 1));
}
public String getMemberCodeByBuyOrderNoVal(String memberCodeAndState) {
if (StringUtils.isEmpty(memberCodeAndState)) {
return "";
}
return memberCodeAndState.substring(0, memberCodeAndState.length() - 1);
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | */
/**
......@@ -562,11 +549,7 @@ public class AdamRdmService {
// );
// log.debug("#MDB耗时:{}ms", System.currentTimeMillis() - s);
// return vo;
String memberCodeByBuyOrderNo = this.getMemberCodeByBuyOrderNo(buyOrderNo);
AdamMemberCodeVo vo = AdamMemberCodeVo.getNew();
vo.setCode(this.getMemberCodeByBuyOrderNoVal(memberCodeByBuyOrderNo));
vo.setState(this.getMemberCodeStateByBuyOrderNoVal(memberCodeByBuyOrderNo));
return vo;
return this.getMemberCodeVoByCode(this.getMemberCodeByBuyOrderNo(buyOrderNo));
}
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | TAGS:List<AdamTagVo> */
......
package com.liquidnet.service.adam.service.impl;
import com.liquidnet.common.cache.redisson.util.RedisLockUtil;
import com.liquidnet.service.adam.dto.vo.AdamMemberVo;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.service.adam.service.AdamRdmService;
import com.liquidnet.service.adam.service.IAdamUserMemberService;
import lombok.extern.slf4j.Slf4j;
......@@ -10,8 +9,6 @@ import org.springframework.stereotype.Service;
import java.util.regex.Pattern;
import static com.liquidnet.service.adam.constant.AdamRedisConst.LOCK_KEY_UMEMBER_NO;
@Slf4j
@Service
public class AdamUserMemberServiceImpl implements IAdamUserMemberService {
......@@ -25,25 +22,27 @@ public class AdamUserMemberServiceImpl implements IAdamUserMemberService {
long s = System.currentTimeMillis();
int memberMaxNo = adamRdmService.getMaxMemberNo();
if (-1 == memberMaxNo) {
if (RedisLockUtil.tryLock(LOCK_KEY_UMEMBER_NO, 1, 3)) {
memberMaxNo = adamRdmService.getMaxMemberNo();
if (-1 == memberMaxNo) {
// Query query = Query.query(Criteria.where("memberId").is(memberId)).with(Sort.by(Sort.Direction.DESC, "memberNo")).limit(1);
//
// AdamUserMemberVo latestMaxMemberNoVo = mongoTemplate.findOne(query, AdamUserMemberVo.class, AdamUserMemberVo.class.getSimpleName());
// TODO: 2021/7/29 降级DB
throw new LiquidnetServiceException();
// if (RedisLockUtil.tryLock(LOCK_KEY_UMEMBER_NO, 1, 3)) {
// memberMaxNo = adamRdmService.getMaxMemberNo();
// if (-1 == memberMaxNo) {
//// Query query = Query.query(Criteria.where("memberId").is(memberId)).with(Sort.by(Sort.Direction.DESC, "memberNo")).limit(1);
////
//// AdamUserMemberVo latestMaxMemberNoVo = mongoTemplate.findOne(query, AdamUserMemberVo.class, AdamUserMemberVo.class.getSimpleName());
////
//// if (null == latestMaxMemberNoVo) {
// AdamMemberVo memberVo = adamRdmService.getMemberVoByMemberId(memberId);
//
// if (null == latestMaxMemberNoVo) {
AdamMemberVo memberVo = adamRdmService.getMemberVoByMemberId(memberId);
adamRdmService.setMaxMemberNo(memberVo.getStartNo());
// } else {
// adamRdmService.setMaxMemberNo(Integer.parseInt(latestMaxMemberNoVo.getMemberNo()));
// }
}
RedisLockUtil.unlock(LOCK_KEY_UMEMBER_NO);
} else {
return null;
}
// adamRdmService.setMaxMemberNo(memberVo.getStartNo());
//// } else {
//// adamRdmService.setMaxMemberNo(Integer.parseInt(latestMaxMemberNoVo.getMemberNo()));
//// }
// }
// RedisLockUtil.unlock(LOCK_KEY_UMEMBER_NO);
// } else {
// return null;
// }
}
String nextMemberNoStr = String.valueOf(adamRdmService.incrMemberNo());
if (Pattern.matches("([\\d])\\1{" + (nextMemberNoStr.length() - 1) + "}", nextMemberNoStr)) {
......
package com.liquidnet.service.adam.service.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.liquidnet.common.cache.redisson.util.RedisLockUtil;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.*;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.AdamThirdPartParam;
import com.liquidnet.service.adam.dto.vo.AdamRealInfoVo;
import com.liquidnet.service.adam.dto.vo.AdamThirdPartInfoVo;
......@@ -34,8 +32,6 @@ import java.time.LocalDateTime;
import java.util.LinkedList;
import java.util.List;
import static com.liquidnet.service.adam.constant.AdamRedisConst.LOCK_KEY_UREGISTER;
/**
* <p>
* 用户 服务实现类
......@@ -70,7 +66,7 @@ public class AdamUserServiceImpl implements IAdamUserService {
LocalDateTime now = LocalDateTime.now();
AdamUserInfoVo userInfoVo = null;
if (RedisLockUtil.tryLock(LOCK_KEY_UREGISTER + mobile, 1, 5)) {
// if (RedisLockUtil.tryLock(LOCK_KEY_UREGISTER + mobile, 1, 5)) {
String uid = adamRdmService.getUidByMobile(mobile);
if (StringUtils.isEmpty(uid)) {
userInfoVo = AdamUserInfoVo.getNew();
......@@ -110,8 +106,8 @@ public class AdamUserServiceImpl implements IAdamUserService {
} else {
userInfoVo = adamRdmService.getUserInfoVoByUid(uid);
}
RedisLockUtil.unlock(LOCK_KEY_UREGISTER + mobile);
}
// RedisLockUtil.unlock(LOCK_KEY_UREGISTER + mobile);
// }
return userInfoVo;
}
......@@ -121,7 +117,7 @@ public class AdamUserServiceImpl implements IAdamUserService {
LocalDateTime now = LocalDateTime.now();
AdamUserInfoVo userInfoVo = null;
if (RedisLockUtil.tryLock(LOCK_KEY_UREGISTER + param.getOpenId() + param.getPlatform(), 1, 5)) {
// if (RedisLockUtil.tryLock(LOCK_KEY_UREGISTER + param.getOpenId() + param.getPlatform(), 1, 5)) {
String uid = adamRdmService.getUidByPlatformOpenId(param.getPlatform(), param.getOpenId());
if (StringUtils.isEmpty(uid)) {
long s = System.currentTimeMillis();
......@@ -188,8 +184,8 @@ public class AdamUserServiceImpl implements IAdamUserService {
} else {
userInfoVo = adamRdmService.getUserInfoVoByUid(uid);
}
RedisLockUtil.unlock(LOCK_KEY_UREGISTER + param.getOpenId() + param.getPlatform());
}
// RedisLockUtil.unlock(LOCK_KEY_UREGISTER + param.getOpenId() + param.getPlatform());
// }
return userInfoVo;
}
......@@ -377,9 +373,9 @@ public class AdamUserServiceImpl implements IAdamUserService {
// @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public AdamRealInfoVo identity(String uid, String name, String idCard) {
AdamRealInfoVo vo = null;
if (RedisLockUtil.tryLock(AdamRedisConst.LOCK_KEY_UIDENTITY + uid, 1, 3)) {
vo = adamRdmService.getRealInfoVoByUid(uid);
if (null == vo) {
// if (RedisLockUtil.tryLock(AdamRedisConst.LOCK_KEY_UIDENTITY + uid, 1, 3)) {
// vo = adamRdmService.getRealInfoVoByUid(uid);
// if (null == vo) {
if (!adamRdmService.isCertification(1, idCard, name)) {
// String respStr = null;
// try {
......@@ -431,9 +427,9 @@ public class AdamUserServiceImpl implements IAdamUserService {
adamRdmService.setRealInfoVoByUid(uid, vo);
adamRdmService.setCertification(1, idCard, name);
log.debug("#RDS耗时:{}ms", System.currentTimeMillis() - s);
}
RedisLockUtil.unlock(AdamRedisConst.LOCK_KEY_UIDENTITY + uid);
}
// }
// RedisLockUtil.unlock(AdamRedisConst.LOCK_KEY_UIDENTITY + uid);
// }
return vo;
}
}
......@@ -6,7 +6,7 @@
10000=请求频繁,稍后再试
10001=
10002=验证码发送失败
10003=已超时,请重新获取验证码
10003=发送过于频繁,请稍后再试
10004=验证码错误,请重新输入
10005=手机号获取失败,请更换登录方式
10006=第三方账号未注册
......@@ -52,7 +52,7 @@
10211=订单不存在
10212=订单状态查询失败
10213=感谢您选择登登登。距您上一次离开不足一年,登登登还没准备好再次邀您加入。不如我们给彼此多一些时间,有缘再相见。
10214=
10214=兑换失败
10215=本次摩登天空会员购买名额已满
10216=
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment