|
@@ -12,6 +12,7 @@ import com.slodon.b2b2c.core.util.StringUtil;
|
|
|
import com.slodon.b2b2c.core.util.WebUtil;
|
|
|
import com.slodon.b2b2c.dao.read.member.MemberReadMapper;
|
|
|
import com.slodon.b2b2c.dao.write.member.MemberWriteMapper;
|
|
|
+import com.slodon.b2b2c.enums.WebSiteConstant;
|
|
|
import com.slodon.b2b2c.member.example.MemberExample;
|
|
|
import com.slodon.b2b2c.member.pojo.Member;
|
|
|
import com.slodon.b2b2c.model.member.MemberModel;
|
|
@@ -31,10 +32,7 @@ import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
/**
|
|
@@ -69,11 +67,18 @@ public class MemberEmailActiveController extends BaseController {
|
|
|
|
|
|
private static final Map<Integer, String> EMAIL_KEY_MAP = new HashMap<>();
|
|
|
|
|
|
+ private static final Map<Integer, String> MOBILE_KEY_MAP = new HashMap<>();
|
|
|
+
|
|
|
static {
|
|
|
EMAIL_KEY_MAP.put(1, RedisConst.SLD_PC_NEW_REGISTER_USER_EMAIL);
|
|
|
EMAIL_KEY_MAP.put(2, RedisConst.SLD_PC_FORGET_PWD_USER_EMAIL);
|
|
|
}
|
|
|
|
|
|
+ static {
|
|
|
+ MOBILE_KEY_MAP.put(1, RedisConst.SLD_PC_NEW_REGISTER_USER_MOBILE);
|
|
|
+ MOBILE_KEY_MAP.put(2, RedisConst.SLD_PC_FORGET_PWD_USER_MOBILE);
|
|
|
+ }
|
|
|
+
|
|
|
// /**
|
|
|
// * @param request
|
|
|
// * @param email
|
|
@@ -160,38 +165,87 @@ public class MemberEmailActiveController extends BaseController {
|
|
|
* @param email
|
|
|
* @param source
|
|
|
* @param type
|
|
|
- * @param webSite
|
|
|
+ * @param mobile
|
|
|
* @return
|
|
|
*/
|
|
|
@PostMapping("/verification/code")
|
|
|
- public JsonResult<Object> getMemberEmailVerificationCode(HttpServletRequest request, String email, Integer source, Integer type, @RequestParam(value = "webSite", required = false, defaultValue = "1") String webSite) {
|
|
|
- log.info("getMemberEmailVerificationCode - email:{},source:{},type:{},webSite:{}", email, source, type, webSite);
|
|
|
+ public JsonResult<Object> getMemberEmailVerificationCode(HttpServletRequest request, String email, Integer source, Integer type, String mobile) {
|
|
|
+ log.info("getMemberEmailVerificationCode - email:{},source:{},type:{},mobile:{}", email, source, type, mobile);
|
|
|
+ String webSite = request.getHeader("web-site");
|
|
|
+
|
|
|
+ // 根据站点类型进行不同的处理
|
|
|
+ if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
|
|
|
+ return handleVerificationCodeForOversea(webSite, email, mobile, source, type);
|
|
|
+ } else if (WebSiteConstant.MEMBER_DISTRIBUTOR.equals(webSite)) {
|
|
|
+ return handleVerificationCodeForDistributor(webSite, email, mobile, source, type);
|
|
|
+ }
|
|
|
+
|
|
|
+ return SldResponse.success(Language.translate("验证码发送成功", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理海外站点验证码发送
|
|
|
+ */
|
|
|
+ private JsonResult<Object> handleVerificationCodeForOversea(String webSite, String email, String mobile, Integer source, Integer type) {
|
|
|
if (StringUtil.isEmpty(email)) {
|
|
|
return SldResponse.fail(Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
|
AssertUtil.emailCheck(email);
|
|
|
|
|
|
+ return sendAndLimitVerificationCode(webSite, email, mobile, source, type,
|
|
|
+ RedisConst.SLD_PC_EMAIL_VERIFY_CODE_LIMIT + email + ":type::" + type);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理分销商站点验证码发送
|
|
|
+ */
|
|
|
+ private JsonResult<Object> handleVerificationCodeForDistributor(String webSite, String email, String mobile, Integer source, Integer type) {
|
|
|
+ if (StringUtil.isEmpty(mobile)) {
|
|
|
+ return SldResponse.fail(Language.translate("手机号码不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+ AssertUtil.mobileCheck(mobile);
|
|
|
+
|
|
|
+ return sendAndLimitVerificationCode(webSite, email, mobile, source, type,
|
|
|
+ RedisConst.SLD_PC_MOBILE_VERIFY_CODE_LIMIT + mobile + ":type::" + type);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发送验证码并设置频率限制
|
|
|
+ */
|
|
|
+ private JsonResult<Object> sendAndLimitVerificationCode(String webSite, String email, String mobile, Integer source,
|
|
|
+ Integer type, String redisKey) {
|
|
|
// 1. 判断是否在1分钟内已发送过验证码
|
|
|
- String redisKey = RedisConst.SLD_PC_EMAIL_VERIFY_CODE_LIMIT + email + ":type::" + type + ":webSite::" + webSite;
|
|
|
if (Boolean.TRUE.equals(stringRedisTemplate.hasKey(redisKey))) {
|
|
|
return SldResponse.fail(Language.translate("请勿频繁操作,请1分钟后重试", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
|
|
|
|
int count;
|
|
|
if (type == 1) {
|
|
|
- count = memberRegisterActiveModel.sendRegisterUserEmailVerificationCode(email, source, webSite);
|
|
|
+ count = memberRegisterActiveModel.sendRegisterUserVerificationCode(webSite, email, mobile, source);
|
|
|
AssertUtil.isTrue((count == 0), Language.translate("验证码发送失败,请重试", Language.EN_LANGUAGE_TYPE));
|
|
|
- AssertUtil.isTrue((count == 2), Language.translate("该邮箱已注册,请登录", Language.EN_LANGUAGE_TYPE));
|
|
|
+
|
|
|
+ if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
|
|
|
+ AssertUtil.isTrue((count == 2), Language.translate("该邮箱已注册,请登录", Language.EN_LANGUAGE_TYPE));
|
|
|
+ } else {
|
|
|
+ AssertUtil.isTrue((count == 2), Language.translate("该手机号已注册,请登录", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
} else {
|
|
|
- count = memberRegisterActiveModel.checkMemberUserInfo(email, webSite);
|
|
|
+ count = memberRegisterActiveModel.checkMemberUserInfo(webSite, email, mobile);
|
|
|
AssertUtil.isTrue((count == 0), Language.translate("验证码发送失败,请重试", Language.EN_LANGUAGE_TYPE));
|
|
|
- AssertUtil.isTrue((count == 2), Language.translate("该邮箱未激活,请先激活", Language.EN_LANGUAGE_TYPE));
|
|
|
- AssertUtil.isTrue((count == 3), Language.translate("该邮箱未注册,请先注册", Language.EN_LANGUAGE_TYPE));
|
|
|
+
|
|
|
+ if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
|
|
|
+ AssertUtil.isTrue((count == 2), Language.translate("该邮箱未激活,请先激活", Language.EN_LANGUAGE_TYPE));
|
|
|
+ AssertUtil.isTrue((count == 3), Language.translate("该邮箱未注册,请先注册", Language.EN_LANGUAGE_TYPE));
|
|
|
+ } else {
|
|
|
+ AssertUtil.isTrue((count == 2), Language.translate("该手机号未激活,请先激活", Language.EN_LANGUAGE_TYPE));
|
|
|
+ AssertUtil.isTrue((count == 3), Language.translate("该手机号未注册,请先注册", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
// 2. 设置 Redis 标记,1分钟内不可重复发送
|
|
|
stringRedisTemplate.opsForValue().set(redisKey, "1", 60, TimeUnit.SECONDS);
|
|
|
- return SldResponse.success(Language.translate("验证码发送成功", Language.EN_LANGUAGE_TYPE));
|
|
|
|
|
|
+ return SldResponse.success(Language.translate("验证码发送成功", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
|
|
|
|
|
|
@@ -202,26 +256,62 @@ public class MemberEmailActiveController extends BaseController {
|
|
|
* @param email
|
|
|
* @param type
|
|
|
* @param verificationCode
|
|
|
- * @param webSite
|
|
|
+ * @param mobile
|
|
|
* @return
|
|
|
*/
|
|
|
@PostMapping("/check/verification/code")
|
|
|
- public JsonResult<Object> checkMemberEmailVerificationCode(HttpServletRequest request, String email, Integer type, String verificationCode, @RequestParam(value = "webSite", required = false, defaultValue = "1") String webSite) {
|
|
|
- log.info("checkMemberEmailVerificationCode - email:{},type:{},verificationCode:{},webSite:{}", email, type, verificationCode, webSite);
|
|
|
- if (StringUtil.isEmpty(email)) {
|
|
|
- return SldResponse.fail(Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
+ public JsonResult<Object> checkMemberEmailVerificationCode(HttpServletRequest request, String email, Integer type, String verificationCode, String mobile) {
|
|
|
+ log.info("checkMemberEmailVerificationCode - email:{},type:{},verificationCode:{},mobile:{}", email, type, verificationCode, mobile);
|
|
|
+ String webSite = request.getHeader("web-site");
|
|
|
+
|
|
|
+ // 参数校验
|
|
|
+ ValidationResult validation = validateVerificationParams(webSite, email, mobile, verificationCode);
|
|
|
+ if (!validation.isValid()) {
|
|
|
+ return SldResponse.fail(ResponseConst.STATE_FAIL, validation.getErrorMessage());
|
|
|
}
|
|
|
- if (StringUtil.isEmpty(verificationCode)) {
|
|
|
- return SldResponse.fail(Language.translate("验证码不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
+
|
|
|
+ // 根据站点类型进行验证码校验
|
|
|
+ if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
|
|
|
+ return verifyCodeByEmail(email, type, verificationCode);
|
|
|
+ } else if (WebSiteConstant.MEMBER_DISTRIBUTOR.equals(webSite)) {
|
|
|
+ return verifyCodeByMobile(mobile, type, verificationCode);
|
|
|
}
|
|
|
- AssertUtil.emailCheck(email);
|
|
|
|
|
|
+ return SldResponse.success(Language.translate("验证码校验成功", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过邮箱验证验证码
|
|
|
+ */
|
|
|
+ private JsonResult<Object> verifyCodeByEmail(String email, Integer type, String verificationCode) {
|
|
|
String baseKey = EMAIL_KEY_MAP.get(type);
|
|
|
if (baseKey == null) {
|
|
|
return SldResponse.fail(Language.translate("验证码不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
|
|
|
|
- String redisKey = baseKey + email + ":webSite::" + webSite;
|
|
|
+ String redisKey = baseKey + email;
|
|
|
+ return verifyCodeFromRedis(redisKey, verificationCode);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过手机号验证验证码
|
|
|
+ */
|
|
|
+ private JsonResult<Object> verifyCodeByMobile(String mobile, Integer type, String verificationCode) {
|
|
|
+ String baseKey = MOBILE_KEY_MAP.get(type);
|
|
|
+ if (baseKey == null) {
|
|
|
+ return SldResponse.fail(Language.translate("验证码不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+
|
|
|
+ String redisKey = baseKey + mobile;
|
|
|
+ return verifyCodeFromRedis(redisKey, verificationCode);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从Redis中验证验证码
|
|
|
+ */
|
|
|
+ private JsonResult<Object> verifyCodeFromRedis(String redisKey, String verificationCode) {
|
|
|
if (!stringRedisTemplate.hasKey(redisKey)) {
|
|
|
return SldResponse.fail(Language.translate("验证码已过期,请重新获取", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
@@ -230,12 +320,37 @@ public class MemberEmailActiveController extends BaseController {
|
|
|
if (!verificationCode.equals(storedCode)) {
|
|
|
return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("验证码校验失败", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
|
-// stringRedisTemplate.delete(redisKey);
|
|
|
+
|
|
|
return SldResponse.success(Language.translate("验证码校验成功", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
+ * 验证参数
|
|
|
+ */
|
|
|
+ private ValidationResult validateVerificationParams(String webSite, String email, String mobile, String verificationCode) {
|
|
|
+ if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
|
|
|
+ if (StringUtil.isEmpty(email)) {
|
|
|
+ return ValidationResult.invalid(Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+ if (StringUtil.isEmpty(verificationCode)) {
|
|
|
+ return ValidationResult.invalid(Language.translate("验证码不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+ AssertUtil.emailCheck(email);
|
|
|
+ } else if (WebSiteConstant.MEMBER_DISTRIBUTOR.equals(webSite)) {
|
|
|
+ if (StringUtil.isEmpty(mobile)) {
|
|
|
+ return ValidationResult.invalid(Language.translate("手机不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+ if (StringUtil.isEmpty(verificationCode)) {
|
|
|
+ return ValidationResult.invalid(Language.translate("验证码不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+ AssertUtil.mobileCheck(mobile);
|
|
|
+ }
|
|
|
+ return ValidationResult.valid();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
* 注册
|
|
|
*
|
|
|
* @param request
|
|
@@ -243,51 +358,126 @@ public class MemberEmailActiveController extends BaseController {
|
|
|
* @param nickName
|
|
|
* @param password
|
|
|
* @param confirmPassword
|
|
|
- * @param webSite
|
|
|
+ * @param mobile
|
|
|
* @return
|
|
|
*/
|
|
|
@PostMapping("/register")
|
|
|
- public JsonResult<Object> activeMemberEmailInfo(HttpServletRequest request, String email, String nickName, String password, String confirmPassword, @RequestParam(value = "webSite", required = false, defaultValue = "1") String webSite) {
|
|
|
- log.info("activeMemberEmailInfo - email:{},nickName:{},password:{},confirmPassword:{},webSite:{}", email, nickName, password, confirmPassword, webSite);
|
|
|
- if (StringUtil.isEmpty(email)) {
|
|
|
- return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
+ public JsonResult<Object> activeMemberEmailInfo(HttpServletRequest request, String email, String nickName, String password, String confirmPassword, String mobile) {
|
|
|
+ log.info("activeMemberEmailInfo - email:{},nickName:{},password:{},confirmPassword:{},mobile:{}", email, nickName, password, confirmPassword, mobile);
|
|
|
+ String webSite = request.getHeader("web-site");
|
|
|
+ // 参数校验和密码一致性检查
|
|
|
+ ValidationResult validation = validateRegistrationParams(webSite, email, mobile, password, confirmPassword);
|
|
|
+ if (!validation.isValid()) {
|
|
|
+ return SldResponse.fail(ResponseConst.STATE_FAIL, validation.getErrorMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查找会员信息
|
|
|
+ Member memberInfo = findMemberInfo(webSite, email, mobile);
|
|
|
+ if (memberInfo == null) {
|
|
|
+ String errorMsg = WebSiteConstant.MEMBER_OVERSEA.equals(webSite)
|
|
|
+ ? "会员邮箱不存在,请重新注册"
|
|
|
+ : "会员手机号不存在,请重新注册";
|
|
|
+ return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate(errorMsg, Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查账户是否已激活
|
|
|
+ if (isMemberAlreadyActive(memberInfo)) {
|
|
|
+ return SldResponse.fail(ResponseConst.STATE_FAIL,
|
|
|
+ Language.translate("会员账号已激活,无需重复注册,请登录", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新用户信息
|
|
|
+ Member updatedMember = updateMemberInfo(request, memberInfo, nickName, password);
|
|
|
+
|
|
|
+ // 发送成功通知
|
|
|
+ return sendSuccessNotification(webSite, email, mobile, nickName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证注册参数
|
|
|
+ */
|
|
|
+ private ValidationResult validateRegistrationParams(String webSite, String email, String mobile,
|
|
|
+ String password, String confirmPassword) {
|
|
|
+ if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
|
|
|
+ if (StringUtil.isEmpty(email)) {
|
|
|
+ return ValidationResult.invalid("邮件不能为空");
|
|
|
+ }
|
|
|
+ } else if (WebSiteConstant.MEMBER_DISTRIBUTOR.equals(webSite)) {
|
|
|
+ if (StringUtil.isEmpty(mobile)) {
|
|
|
+ return ValidationResult.invalid("手机不能为空");
|
|
|
+ }
|
|
|
+ AssertUtil.mobileCheck(mobile);
|
|
|
}
|
|
|
+
|
|
|
if (!password.equals(confirmPassword)) {
|
|
|
- return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("密码不一致,请重新输入", Language.EN_LANGUAGE_TYPE));
|
|
|
+ return ValidationResult.invalid("密码不一致,请重新输入");
|
|
|
}
|
|
|
+
|
|
|
AssertUtil.passwordCheck(password);
|
|
|
+ return ValidationResult.valid();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查找会员信息
|
|
|
+ */
|
|
|
+ private Member findMemberInfo(String webSite, String email, String mobile) {
|
|
|
MemberExample memberExample = new MemberExample();
|
|
|
- memberExample.setMemberEmail(email.toLowerCase());
|
|
|
memberExample.setWebSite(webSite);
|
|
|
- List<Member> memberList = memberReadMapper.listByExample(memberExample);
|
|
|
- if (CollectionUtils.isEmpty(memberList)) {
|
|
|
- return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("会员邮箱不存在,请重新注册", Language.EN_LANGUAGE_TYPE));
|
|
|
- }
|
|
|
|
|
|
- Member memberInfo = memberList.get(0);
|
|
|
- if (memberInfo.getIsEmailActive() != null && memberInfo.getIsEmailActive() == 1) {
|
|
|
- return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("会员邮箱已激活,无需重复注册,请登录", Language.EN_LANGUAGE_TYPE));
|
|
|
+ if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
|
|
|
+ memberExample.setMemberEmail(email.toLowerCase());
|
|
|
+ } else if (WebSiteConstant.MEMBER_DISTRIBUTOR.equals(webSite)) {
|
|
|
+ memberExample.setMemberMobile(mobile.toLowerCase());
|
|
|
}
|
|
|
|
|
|
- // 更新用户邮箱激活状态
|
|
|
+ List<Member> memberList = memberReadMapper.listByExample(memberExample);
|
|
|
+ return CollectionUtils.isEmpty(memberList) ? null : memberList.get(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检查会员是否已激活
|
|
|
+ */
|
|
|
+ private boolean isMemberAlreadyActive(Member member) {
|
|
|
+ return member.getIsEmailActive() != null && member.getIsEmailActive() == 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新会员信息
|
|
|
+ */
|
|
|
+ private Member updateMemberInfo(HttpServletRequest request, Member memberInfo, String nickName, String password) {
|
|
|
Member memberNew = new Member();
|
|
|
memberNew.setMemberId(memberInfo.getMemberId());
|
|
|
memberNew.setIsEmailActive(1);
|
|
|
memberNew.setUpdateTime(new Date());
|
|
|
memberNew.setMemberNickName(nickName);
|
|
|
memberNew.setLoginPwd(Md5.getMd5String(password));
|
|
|
+
|
|
|
String ip = WebUtil.getRealIp(request);
|
|
|
CountryAreaApiDto countryAreaApiDto = memberEnquiryModel.getCountryAndAreaByIp(ip);
|
|
|
memberNew.setCountry(countryAreaApiDto.getCountryIsoCode());
|
|
|
memberNew.setCity(countryAreaApiDto.getCityIsoCode());
|
|
|
+
|
|
|
memberModel.updateMember(memberNew);
|
|
|
+ return memberNew;
|
|
|
+ }
|
|
|
|
|
|
- // 发送账户注册成功邮件
|
|
|
- memberRegisterActiveModel.sendRegisterSuccessEmail(email, nickName);
|
|
|
- return SldResponse.success(Language.translate("会员邮箱账户激活成功", Language.EN_LANGUAGE_TYPE));
|
|
|
+ /**
|
|
|
+ * 发送成功通知
|
|
|
+ */
|
|
|
+ private JsonResult<Object> sendSuccessNotification(String webSite, String email, String mobile, String nickName) {
|
|
|
+ if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
|
|
|
+ // 发送账户注册成功邮件
|
|
|
+ memberRegisterActiveModel.sendRegisterSuccessEmail(email, nickName);
|
|
|
+ return SldResponse.success(Language.translate("会员邮箱账户激活成功", Language.EN_LANGUAGE_TYPE));
|
|
|
+ } else {
|
|
|
+ // 发送账户注册成功短信
|
|
|
+ memberRegisterActiveModel.sendRegisterSuccessSms(mobile);
|
|
|
+ return SldResponse.success(Language.translate("会员手机号激活成功", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 用户邮箱重置忘记密码
|
|
|
*
|
|
@@ -296,39 +486,128 @@ public class MemberEmailActiveController extends BaseController {
|
|
|
* @param verificationCode
|
|
|
* @param loginPwd
|
|
|
* @param confirmPassWord
|
|
|
- * @param webSite
|
|
|
+ * @param mobile
|
|
|
* @return
|
|
|
*/
|
|
|
@PostMapping("/email/reset/pwdNew")
|
|
|
- public JsonResult<Object> emailResetPwdNew(HttpServletRequest request, String email, String verificationCode, String loginPwd, String confirmPassWord, @RequestParam(value = "webSite", required = false, defaultValue = "1") String webSite) {
|
|
|
- log.info("emailResetPwd - email:{},verificationCode:{},loginPwd:{},confirmPassWord:{},webSite:{}", email, verificationCode, loginPwd, confirmPassWord, webSite);
|
|
|
- if (StringUtil.isEmpty(email)) {
|
|
|
- return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
|
|
|
+ public JsonResult<Object> emailResetPwdNew(HttpServletRequest request, String email, String verificationCode,
|
|
|
+ String loginPwd, String confirmPassWord, String mobile) {
|
|
|
+ log.info("emailResetPwd - email:{},verificationCode:{},loginPwd:{},confirmPassWord:{},mobile:{}",
|
|
|
+ email, verificationCode, loginPwd, confirmPassWord, mobile);
|
|
|
+
|
|
|
+ String webSite = request.getHeader("web-site");
|
|
|
+
|
|
|
+ // 参数校验
|
|
|
+ ValidationResult validation = validateResetPasswordParams(webSite, email, mobile, loginPwd, confirmPassWord);
|
|
|
+ if (!validation.isValid()) {
|
|
|
+ return SldResponse.fail(ResponseConst.STATE_FAIL, validation.getErrorMessage());
|
|
|
}
|
|
|
- MemberExample memberExample = new MemberExample();
|
|
|
- memberExample.setMemberEmail(email.toLowerCase());
|
|
|
- memberExample.setWebSite(webSite);
|
|
|
- List<Member> memberList = memberReadMapper.listByExample(memberExample);
|
|
|
|
|
|
- if (CollectionUtils.isEmpty(memberList)) {
|
|
|
+ // 密码强度校验
|
|
|
+ AssertUtil.passwordCheck(loginPwd);
|
|
|
+
|
|
|
+ // 根据站点类型处理密码重置
|
|
|
+ if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
|
|
|
+ return resetPasswordByEmail(webSite, email, verificationCode, loginPwd);
|
|
|
+ } else if (WebSiteConstant.MEMBER_DISTRIBUTOR.equals(webSite)) {
|
|
|
+ return resetPasswordByMobile(webSite, mobile, verificationCode, loginPwd);
|
|
|
+ }
|
|
|
+
|
|
|
+ return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("不支持的站点类型", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证重置密码参数
|
|
|
+ */
|
|
|
+ private ValidationResult validateResetPasswordParams(String webSite, String email, String mobile,
|
|
|
+ String loginPwd, String confirmPassWord) {
|
|
|
+ if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
|
|
|
+ if (StringUtil.isEmpty(email)) {
|
|
|
+ return ValidationResult.invalid("邮件不能为空");
|
|
|
+ }
|
|
|
+ } else if (WebSiteConstant.MEMBER_DISTRIBUTOR.equals(webSite)) {
|
|
|
+ if (StringUtil.isEmpty(mobile)) {
|
|
|
+ return ValidationResult.invalid("手机不能为空");
|
|
|
+ }
|
|
|
+ AssertUtil.mobileCheck(mobile);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!loginPwd.equals(confirmPassWord)) {
|
|
|
+ return ValidationResult.invalid("密码不一致,请重新输入");
|
|
|
+ }
|
|
|
+
|
|
|
+ return ValidationResult.valid();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过邮箱重置密码
|
|
|
+ */
|
|
|
+ private JsonResult<Object> resetPasswordByEmail(String webSite, String email, String verificationCode, String loginPwd) {
|
|
|
+ // 查找会员信息
|
|
|
+ Member memberInfo = findMemberByEmail(webSite, email);
|
|
|
+ if (memberInfo == null) {
|
|
|
return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("该邮箱不存在,请先注册", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
|
|
|
|
- Member memberInfo = memberList.get(0);
|
|
|
+ // 检查邮箱是否已激活
|
|
|
if (memberInfo.getIsEmailActive() != null && memberInfo.getIsEmailActive() == 0) {
|
|
|
return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("该邮箱未激活,请先激活", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
|
|
|
|
- if (!loginPwd.equals(confirmPassWord)) {
|
|
|
- return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("密码不一致,请重新输入", Language.EN_LANGUAGE_TYPE));
|
|
|
+ // 验证验证码并重置密码
|
|
|
+ String forgetPwdEmailKey = RedisConst.SLD_PC_FORGET_PWD_USER_EMAIL + email;
|
|
|
+ return verifyCodeAndResetPassword(forgetPwdEmailKey, verificationCode, memberInfo, loginPwd);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过手机号重置密码
|
|
|
+ */
|
|
|
+ private JsonResult<Object> resetPasswordByMobile(String webSite, String mobile, String verificationCode, String loginPwd) {
|
|
|
+ // 查找会员信息
|
|
|
+ Member memberInfo = findMemberByMobile(webSite, mobile);
|
|
|
+ if (memberInfo == null) {
|
|
|
+ return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("该手机号不存在,请先注册", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
|
|
|
|
- AssertUtil.passwordCheck(loginPwd);
|
|
|
+ // 检查手机号是否已激活
|
|
|
+ if (memberInfo.getIsEmailActive() != null && memberInfo.getIsEmailActive() == 0) {
|
|
|
+ return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("该手机号未激活,请先激活", Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
|
|
|
- String forgetPwdEmailKey = RedisConst.SLD_PC_FORGET_PWD_USER_EMAIL + email + ":webSite::" + webSite;
|
|
|
- log.info("forgetPwdEmailKey:{}", forgetPwdEmailKey);
|
|
|
- if (stringRedisTemplate.hasKey(forgetPwdEmailKey)) {
|
|
|
- String verifyNumber = stringRedisTemplate.opsForValue().get(forgetPwdEmailKey);
|
|
|
+ // 验证验证码并重置密码
|
|
|
+ String forgetPwdMobileKey = RedisConst.SLD_PC_FORGET_PWD_USER_MOBILE + mobile;
|
|
|
+ return verifyCodeAndResetPassword(forgetPwdMobileKey, verificationCode, memberInfo, loginPwd);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据邮箱查找会员
|
|
|
+ */
|
|
|
+ private Member findMemberByEmail(String webSite, String email) {
|
|
|
+ MemberExample memberExample = new MemberExample();
|
|
|
+ memberExample.setMemberEmail(email.toLowerCase());
|
|
|
+ memberExample.setWebSite(webSite);
|
|
|
+ List<Member> memberList = memberReadMapper.listByExample(memberExample);
|
|
|
+ return CollectionUtils.isEmpty(memberList) ? null : memberList.get(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据手机号查找会员
|
|
|
+ */
|
|
|
+ private Member findMemberByMobile(String webSite, String mobile) {
|
|
|
+ MemberExample memberExample = new MemberExample();
|
|
|
+ memberExample.setMemberMobile(mobile.toLowerCase());
|
|
|
+ memberExample.setWebSite(webSite);
|
|
|
+ List<Member> memberList = memberReadMapper.listByExample(memberExample);
|
|
|
+ return CollectionUtils.isEmpty(memberList) ? null : memberList.get(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证验证码并重置密码
|
|
|
+ */
|
|
|
+ private JsonResult<Object> verifyCodeAndResetPassword(String redisKey, String verificationCode, Member memberInfo, String loginPwd) {
|
|
|
+ log.info("forgetPwdKey:{}", redisKey);
|
|
|
+ if (stringRedisTemplate.hasKey(redisKey)) {
|
|
|
+ String verifyNumber = stringRedisTemplate.opsForValue().get(redisKey);
|
|
|
log.info("verifyNumber:{}", verifyNumber);
|
|
|
if (!verificationCode.equals(verifyNumber)) {
|
|
|
return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("验证码校验失败", Language.EN_LANGUAGE_TYPE));
|
|
@@ -341,7 +620,8 @@ public class MemberEmailActiveController extends BaseController {
|
|
|
memberNew.setUpdateTime(new Date());
|
|
|
memberModel.updateMember(memberNew);
|
|
|
|
|
|
- stringRedisTemplate.delete(forgetPwdEmailKey);
|
|
|
+ // 删除Redis中的验证码
|
|
|
+ stringRedisTemplate.delete(redisKey);
|
|
|
|
|
|
return SldResponse.success(Language.translate("重置登录密码成功", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
@@ -496,4 +776,30 @@ public class MemberEmailActiveController extends BaseController {
|
|
|
}
|
|
|
return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("重置密码链接已失效,请重新获取", Language.EN_LANGUAGE_TYPE));
|
|
|
}
|
|
|
+
|
|
|
+ private static class ValidationResult {
|
|
|
+ private final boolean valid;
|
|
|
+ private final String errorMessage;
|
|
|
+
|
|
|
+ private ValidationResult(boolean valid, String errorMessage) {
|
|
|
+ this.valid = valid;
|
|
|
+ this.errorMessage = errorMessage;
|
|
|
+ }
|
|
|
+
|
|
|
+ static ValidationResult valid() {
|
|
|
+ return new ValidationResult(true, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ static ValidationResult invalid(String errorMessage) {
|
|
|
+ return new ValidationResult(false, Language.translate(errorMessage, Language.EN_LANGUAGE_TYPE));
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isValid() {
|
|
|
+ return valid;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getErrorMessage() {
|
|
|
+ return errorMessage;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|