Parcourir la source

feat: 忘记密码页面获取手机验证码增加人机校验

周玉环 il y a 1 semaine
Parent
commit
3a2f264411
15 fichiers modifiés avec 596 ajouts et 91 suppressions
  1. 12 0
      xinkeaboard-server/b2b2c-core/src/main/java/com/slodon/b2b2c/core/constant/RedisConst.java
  2. 4 1
      xinkeaboard-server/b2b2c-core/src/main/resources/i18n_en.properties
  3. 1 1
      xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/member/pojo/Member.java
  4. 2 1
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/goods/front/FrontGoodsCategoryController.java
  5. 1 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/member/front/MemberPasswordController.java
  6. 367 61
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/member/front/advich/MemberEmailActiveController.java
  7. 1 1
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/msg/seller/SellerVerifyController.java
  8. 1 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/seller/seller/SellerVendorController.java
  9. 0 1
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/system/admin/AdminSettingController.java
  10. 182 14
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/advich/MemberRegisterActiveModel.java
  11. 1 1
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/seller/StoreModel.java
  12. 8 6
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/system/TplPcMallDataModel.java
  13. 3 3
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/member/FollowProductVO.java
  14. 5 1
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/AdminPresentIndexVO.java
  15. 8 0
      xinkeaboard-server/doc/DDL/update.sql

+ 12 - 0
xinkeaboard-server/b2b2c-core/src/main/java/com/slodon/b2b2c/core/constant/RedisConst.java

@@ -80,17 +80,29 @@ public class RedisConst {
 
     public static final String SLD_PC_EMAIL_VERIFY_CODE_LIMIT="sld_pc_verify_code_limit:email::";
 
+    public static final String SLD_PC_MOBILE_VERIFY_CODE_LIMIT="sld_pc_verify_code_limit:mobile::";
+
     /**
      * reids中保存邮箱用户注册,key=前缀+email
      */
     public static final String SLD_PC_NEW_REGISTER_USER_EMAIL = "sld_pc_new_register_user:email::";
 
     /**
+     * reids中保存手机用户注册,key=前缀+mobile
+     */
+    public static final String SLD_PC_NEW_REGISTER_USER_MOBILE = "sld_pc_new_register_user:mobile::";
+
+    /**
      * reids中保存邮箱用户忘记密码,key=前缀+email
      */
     public static final String SLD_PC_FORGET_PWD_USER_EMAIL = "sld_pc_forget_pwd_user:email::";
 
     /**
+     * reids中保存手机用户忘记密码,key=前缀+mobile
+     */
+    public static final String SLD_PC_FORGET_PWD_USER_MOBILE = "sld_pc_forget_pwd_user:mobile::";
+
+    /**
      * reids中保存邮箱用户忘记密码,key=前缀+email
      */
     public static final String TIME = "sld_pc_forget_pwd_user:email::";

+ 4 - 1
xinkeaboard-server/b2b2c-core/src/main/resources/i18n_en.properties

@@ -2523,6 +2523,7 @@ pc端注册页面logo=
 榜单分类不存在=
 该邮箱已注册,请登录=This email has been registered, please log in
 邮件不能为空=Email cannot be empty
+手机号码不能为空=Phone number cannot be empty
 验证码不能为空=Verification cannot be empty
 请勿频繁操作,请1分钟后重试=Please do not operate frequently, please retry in 1 minute
 验证码发送失败,请重试=Failed to send verification code, please try again
@@ -2535,9 +2536,11 @@ pc端注册页面logo=
 注册链接不正确,请重新注册=The registration link is incorrect, please register again
 密码不一致,请重新输入=Passwords do not match. Please reenter
 会员邮箱不存在,请重新注册=Member email does not exist, please re register
-会员邮箱已激活,无需重复注册,请登录=Member email has been activated, no need to re register, please log in
+会员手机号不存在,请重新注册=Member phone number does not exist, please re register
+会员账号已激活,无需重复注册,请登录=Member account has been activated, no need to re register, please log in
 注册链接激活码已失效,请重新注册=The registration link activation code has expired, please re register
 会员邮箱账户激活成功=Member email account activated successfully
+会员手机号激活成功=Member phone number activation successful
 注册链接已失效,请重新注册=The registration link has expired, please register again
 发送重置密码邮件失败,请重试=Failed to send the reset password email. Please try again
 该邮箱未激活,请先激活=This mail is not activated, please activate it first

+ 1 - 1
xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/member/pojo/Member.java

@@ -124,7 +124,7 @@ public class Member implements Serializable {
     @ApiModelProperty("更新时间")
     private Date updateTime;
 
-    @ApiModelProperty("会员邮箱是否激活:0未激活,1已激活")
+    @ApiModelProperty("会员邮箱/手机是否激活:0未激活,1已激活")
     private Integer isEmailActive;
 
     @ApiModelProperty("gp系统用户uid")

+ 2 - 1
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/goods/front/FrontGoodsCategoryController.java

@@ -71,8 +71,9 @@ public class FrontGoodsCategoryController extends BaseController {
     public JsonResult<List<FrontGoodsCategoryVO>> topCategory(HttpServletRequest request) {
         List<FrontGoodsCategoryVO> vos = new ArrayList<>();
 
+        String webSite = request.getHeader("Web-Site");
         //查询redis缓存
-        String dataJson = stringRedisTemplate.opsForValue().get(RedisConst.GOODS_CATEGORY);
+        String dataJson = stringRedisTemplate.opsForValue().get(RedisConst.GOODS_CATEGORY + "_" + webSite);
         if (!StringUtils.isEmpty(dataJson)) {
             JSONArray jsonArray = JSONArray.parseArray(dataJson);
             for (int i = 0; i < jsonArray.size(); i++) {

+ 1 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/member/front/MemberPasswordController.java

@@ -210,6 +210,7 @@ public class MemberPasswordController extends BaseController {
         AssertUtil.isTrue(!Md5.getMd5String(memberUpdateLoginPwdDTO.getOldLoginPwd()).equalsIgnoreCase(memberDb.getLoginPwd()), Language.translate("原密码不对,请重新输入",Language.EN_LANGUAGE_TYPE));
 
         memberModel.editLoginPwd(memberUpdateLoginPwdDTO, member.getMemberId());
+        stringRedisTemplate.delete(memberUpdateLoginPwdDTO.getMemberEmail());
         return SldResponse.success(Language.translate("修改登录密码成功",Language.EN_LANGUAGE_TYPE));
     }
 

+ 367 - 61
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/member/front/advich/MemberEmailActiveController.java

@@ -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));
+        }
+
+        // 更新用户信息
+        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;
+        }
+    }
 }

+ 1 - 1
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/msg/seller/SellerVerifyController.java

@@ -148,7 +148,7 @@ public class SellerVerifyController extends BaseController {
         smsCodeModel.saveSmsCode(code);
 
         //将随机数存在redis中
-        stringRedisTemplate.opsForValue().set(mobile, smsResponse.getVerifyCode(), 60L * 10, TimeUnit.SECONDS);
+        stringRedisTemplate.opsForValue().set(mobile, smsResponse.getVerifyCode(), 60L * 5, TimeUnit.SECONDS);
         return SldResponse.success("发送成功");
     }
 

+ 1 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/seller/seller/SellerVendorController.java

@@ -270,6 +270,7 @@ public class SellerVendorController extends BaseController {
         vendorUpdate.setVendorId(allVendorList.get(0).getVendorId());
         vendorUpdate.setVendorPassword(Md5.getMd5String(newPwd));
         vendorModel.updateVendor(vendorUpdate);
+        stringRedisTemplate.delete(mobile);
         return SldResponse.success("修改成功");
     }
 

+ 0 - 1
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/system/admin/AdminSettingController.java

@@ -63,7 +63,6 @@ public class AdminSettingController extends BaseController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "name", value = "要修改的name名称", paramType = "query"),
             @ApiImplicitParam(name = "value", value = "要修改的value值", paramType = "query"),
-            @ApiImplicitParam(name = "webSite", value = "站点", paramType = "query")
     })
     @OperationLogger(option = "编辑后台参数配置")
     @PostMapping("updateSettingList")

+ 182 - 14
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/advich/MemberRegisterActiveModel.java

@@ -4,21 +4,40 @@ import cn.hutool.core.collection.CollectionUtil;
 import com.slodon.b2b2c.captcha.work.Producer;
 import com.slodon.b2b2c.core.config.DomainUrlUtil;
 import com.slodon.b2b2c.core.constant.RedisConst;
+import com.slodon.b2b2c.core.constant.SMSConst;
+import com.slodon.b2b2c.core.constant.VendorConst;
+import com.slodon.b2b2c.core.exception.MallException;
 import com.slodon.b2b2c.core.i18n.Language;
 import com.slodon.b2b2c.core.random.RandomUtil;
+import com.slodon.b2b2c.core.response.JsonResult;
+import com.slodon.b2b2c.core.response.SldResponse;
+import com.slodon.b2b2c.core.sms.SmsRequest;
+import com.slodon.b2b2c.core.sms.SmsResponse;
 import com.slodon.b2b2c.core.uid.GoodsIdGenerator;
+import com.slodon.b2b2c.core.util.AssertUtil;
 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;
 import com.slodon.b2b2c.model.msg.MsgSendModel;
+import com.slodon.b2b2c.model.msg.SmsCodeModel;
+import com.slodon.b2b2c.msg.pojo.SmsCode;
+import com.slodon.b2b2c.seller.example.VendorExample;
+import com.slodon.b2b2c.seller.pojo.Vendor;
+import com.slodon.b2b2c.sms.DySmsSender;
+import com.slodon.b2b2c.sms.TencentSmsSender;
+import com.slodon.b2b2c.sms.YunPianSmsSender;
+import com.slodon.b2b2c.sms.base.SmsSender;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.util.Date;
@@ -49,6 +68,8 @@ public class MemberRegisterActiveModel {
 
     @Resource
     private MemberModel memberModel;
+    @Resource
+    private SmsCodeModel smsCodeModel;
 
     /**
      * 发送注册用户邮件激活链接
@@ -137,7 +158,7 @@ public class MemberRegisterActiveModel {
      * @param source
      */
     @Transactional(rollbackFor = Exception.class)
-    public void saveEmailUserInfo(String email, Integer source,String webSite) {
+    public void saveEmailUserInfo(String email, Integer source, String webSite) {
         Member member = new Member();
         member.setMemberName(email);
 //        member.setMemberName(GoodsIdGenerator.getMemberName());
@@ -252,7 +273,7 @@ public class MemberRegisterActiveModel {
         emailMsgTpl.append(enText1 + "<br/>");
         emailMsgTpl.append("<br/>");
 
-        String enText2 =Language.translate("您可以通过您的电子邮件地址登录您的${URL}帐户:", Language.EN_LANGUAGE_TYPE);
+        String enText2 = Language.translate("您可以通过您的电子邮件地址登录您的${URL}帐户:", Language.EN_LANGUAGE_TYPE);
         enText2 = enText2.replace("${URL}", pcDomainUrl);
         emailMsgTpl.append(enText2);
 //        emailMsgTpl.append("<font color='#e13841'>"+email+"</font>");
@@ -272,36 +293,145 @@ public class MemberRegisterActiveModel {
         msgSendModel.sendHtmlMail(email, subject, emailMsgTpl.toString());
     }
 
-    public Integer sendRegisterUserEmailVerificationCode(String email, Integer source,String webSite) {
+    public Integer sendRegisterUserVerificationCode(String webSite, String email, String mobile, Integer source) {
         int res = 0;
         MemberExample example = new MemberExample();
-        example.setMemberEmail(email.toLowerCase());
+        if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
+            example.setMemberEmail(email.toLowerCase());
+        } else {
+            example.setMemberMobile(mobile);
+        }
         example.setWebSite(webSite);
         List<Member> memberList = memberReadMapper.listByExample(example);
         if (CollectionUtil.isNotEmpty(memberList)) {
             Member memberInfo = memberList.get(0);
             if (memberInfo.getIsEmailActive() == 0) {
-                sendEmailRegisterVerificationCode(email, webSite);
+                if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
+                    sendEmailRegisterVerificationCode(email);
+                } else {
+                    sendMobileRegisterVerificationCode(mobile);
+                }
+
                 res = 1;
             } else {
                 res = 2;
             }
         } else {
             res = 1;
-            sendEmailRegisterVerificationCode(email, webSite);
-            saveEmailUserInfo(email, source,webSite);
+            if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
+                sendEmailRegisterVerificationCode(email);
+            } else {
+                sendMobileRegisterVerificationCode(mobile);
+            }
+            saveUserInfo(webSite, email, mobile, source);
         }
         return res;
     }
 
-    private void sendEmailRegisterVerificationCode(String email,String webSite) {
+    private void sendMobileRegisterVerificationCode(String mobile) {
+        // 记录手机短信验证码
+        SmsCode code = new SmsCode();
+        code.setMobile(mobile);
+        code.setRequestIp("");
+        code.setCreateTime(new Date());
+        code.setMemberId(0);
+        code.setMemberName(mobile);
+        // 阿里云发送
+        Integer sendSmsType = 3;
+        code.setSmsType(SMSConst.SMS_TYPE_1);
+        String templateCode = stringRedisTemplate.opsForValue().get("notification_sms_ali_register_success_sms_template");
+        sendSms(mobile, code, sendSmsType, templateCode, "register");
+    }
+
+
+    /**
+     * 发送短信
+     *
+     * @param mobile 手机号
+     * @param code   短信验证码记录信息
+     * @return 返回值
+     */
+    private void sendSms(String mobile, SmsCode code, Integer sendSmsType, String templateCode, String type) {
+        SmsRequest smsRequest = new SmsRequest();
+        smsRequest.setSmsType(SMSConst.VERIFY_SMS);
+        smsRequest.setMobile(mobile);
+        //根据系统配置的发送方式,获取短信发送对象
+        SmsSender smsSender;
+        if (sendSmsType == null) {
+            sendSmsType = DomainUrlUtil.SEND_SMS_TYPE;
+        }
+        switch (sendSmsType) {
+            case 1:
+                //腾讯云发送
+                smsSender = new TencentSmsSender(stringRedisTemplate);
+                break;
+            case 2:
+                //云片发送
+                smsSender = new YunPianSmsSender(stringRedisTemplate);
+                break;
+            case 3:
+                //阿里云发送
+                smsSender = new DySmsSender(stringRedisTemplate);
+                break;
+            default:
+                throw new MallException("发送短信失败");
+        }
+        if (sendSmsType == 3) {
+            AssertUtil.notEmpty(templateCode, "短信配置没有填写,无法发送短信");
+            smsRequest.setTemplateId(templateCode);
+        }
+        SmsResponse smsResponse = smsSender.sendSms(smsRequest);
+
+        code.setVerifyCode(smsResponse.getVerifyCode());
+        smsCodeModel.saveSmsCode(code);
+
+        //将随机数存在redis中
+        if ("register".equals(type)) {
+            stringRedisTemplate.opsForValue().set(RedisConst.SLD_PC_NEW_REGISTER_USER_MOBILE + mobile, smsResponse.getVerifyCode(), 60L * 5, TimeUnit.SECONDS);
+        } else if ("forget".equals(type)) {
+            stringRedisTemplate.opsForValue().set(RedisConst.SLD_PC_FORGET_PWD_USER_MOBILE + mobile, smsResponse.getVerifyCode(), 60L * 5, TimeUnit.SECONDS);
+        }
+
+    }
+
+    /**
+     * 保存用户信息
+     *
+     * @param webSite
+     * @param email
+     * @param mobile
+     * @param source
+     */
+    private void saveUserInfo(String webSite, String email, String mobile, Integer source) {
+        Member member = new Member();
+        if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
+            member.setMemberName(email);
+            member.setMemberEmail(email);
+        } else {
+            member.setMemberName(mobile);
+            member.setMemberMobile(mobile);
+        }
+        member.setLoginPwd("");
+        member.setPayPwd("");
+        member.setLastLoginIp("");
+        member.setLoginNumber(0);
+        member.setRegisterTime(new Date());
+        member.setLastLoginTime(new Date());
+        member.setRegisterChannel(source);
+
+        member.setIsEmailActive(0);
+        member.setWebSite(webSite);
+        memberModel.saveMember(member);
+    }
+
+    private void sendEmailRegisterVerificationCode(String email) {
         String pcDomainUrl = DomainUrlUtil.SLD_PC_URL.replace("http://", "").replace("https://", "");
         String verifCode = "";
         //邮件验证码过期时间,单位秒
         long expireTime = RedisConst.REGISTER_USER_AND_FORGETPWD_USER_EMAIL_VERIFICATION_CODE_EXPIRE_TIME;
 
         //将随机数存在redis中
-        String activeEmailKey = RedisConst.SLD_PC_NEW_REGISTER_USER_EMAIL + email + ":webSite::" + webSite;
+        String activeEmailKey = RedisConst.SLD_PC_NEW_REGISTER_USER_EMAIL + email;
         verifCode = RandomUtil.randomNumber(4);
         stringRedisTemplate.opsForValue().set(activeEmailKey, verifCode, expireTime, TimeUnit.SECONDS);
 
@@ -314,16 +444,25 @@ public class MemberRegisterActiveModel {
         msgSendModel.sendHtmlMail(email, subject, emailMsgTpl.toString());
     }
 
-    public Integer checkMemberUserInfo(String email, String webSite) {
+    public Integer checkMemberUserInfo(String webSite, String email, String mobile) {
         int res = 0;
         MemberExample memberExample = new MemberExample();
-        memberExample.setMemberEmail(email);
+        if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
+            memberExample.setMemberEmail(email.toLowerCase());
+        } else {
+            memberExample.setMemberMobile(mobile);
+        }
         memberExample.setWebSite(webSite);
         List<Member> memberList = memberReadMapper.listByExample(memberExample);
         if (CollectionUtil.isNotEmpty(memberList)) {
             Member memberInfo = memberList.get(0);
             if (memberInfo.getIsEmailActive() == 1) {
-                sendEmailForgetPasswordVerificationCode(email, memberInfo.getMemberNickName(),webSite);
+                if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
+                    sendEmailForgetPasswordVerificationCode(email, memberInfo.getMemberNickName());
+                } else {
+                    sendMobileForgetPasswordVerificationCode(mobile);
+                }
+
                 res = 1;
             } else {
                 res = 2;
@@ -334,14 +473,29 @@ public class MemberRegisterActiveModel {
         return res;
     }
 
-    private void sendEmailForgetPasswordVerificationCode(String email, String nickName,String webSite) {
+    private void sendMobileForgetPasswordVerificationCode(String mobile) {
+        // 记录手机短信验证码
+        SmsCode code = new SmsCode();
+        code.setMobile(mobile);
+        code.setRequestIp("");
+        code.setCreateTime(new Date());
+        code.setMemberId(0);
+        code.setMemberName(mobile);
+        // 阿里云发送
+        Integer sendSmsType = 3;
+        code.setSmsType(SMSConst.SMS_TYPE_3);
+        String templateCode = stringRedisTemplate.opsForValue().get("notification_sms_ali_forget_sms_template");
+        sendSms(mobile, code, sendSmsType, templateCode, "forget");
+    }
+
+    private void sendEmailForgetPasswordVerificationCode(String email, String nickName) {
         String pcDomainUrl = DomainUrlUtil.SLD_PC_URL.replace("http://", "").replace("https://", "");
         String verifCode = "";
         //重置密码验证码过期时间,单位秒
         long expireTime = RedisConst.REGISTER_USER_AND_FORGETPWD_USER_EMAIL_VERIFICATION_CODE_EXPIRE_TIME;
 
         //将随机数存在redis中
-        String forgetPwdEmailKey = RedisConst.SLD_PC_FORGET_PWD_USER_EMAIL + email + ":webSite::" + webSite;
+        String forgetPwdEmailKey = RedisConst.SLD_PC_FORGET_PWD_USER_EMAIL + email;
         verifCode = RandomUtil.randomNumber(4);
         stringRedisTemplate.opsForValue().set(forgetPwdEmailKey, verifCode, expireTime, TimeUnit.SECONDS);
 
@@ -358,4 +512,18 @@ public class MemberRegisterActiveModel {
         String subject = Language.translate("重设您的", Language.EN_LANGUAGE_TYPE) + pcDomainUrl.toUpperCase() + " " + Language.translate("帐户密码", Language.EN_LANGUAGE_TYPE);
         msgSendModel.sendHtmlMail(email, subject, emailMsgTpl.toString());
     }
+
+    public void sendRegisterSuccessSms(String mobile) {
+        SmsCode code = new SmsCode();
+        code.setMobile(mobile);
+        code.setRequestIp("");
+        code.setCreateTime(new Date());
+        code.setMemberId(0);
+        code.setMemberName(mobile);
+        // 阿里云发送
+        Integer sendSmsType = 3;
+        code.setSmsType(SMSConst.SMS_TYPE_4);
+        String templateCode = stringRedisTemplate.opsForValue().get("notification_sms_ali_register_sms_template");
+        sendSms(mobile, code, sendSmsType, templateCode, "success");
+    }
 }

+ 1 - 1
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/seller/StoreModel.java

@@ -550,7 +550,7 @@ public class StoreModel {
      */
     public Integer updateSeo(SysSeo sysSeo, Long targetId, String type) {
         SysSeoExample seoExample = new SysSeoExample();
-        seoExample.createCriteria().andTargetIdEqualTo(targetId).andTypeEqualTo(type);
+        seoExample.createCriteria().andTargetIdEqualTo(targetId).andTypeEqualTo(type).andWebSiteEqualTo(sysSeo.getWebSite());
         int count = sysSeoWriteMapper.updateByExampleSelective(sysSeo, seoExample);
         if (count == 0) {
             log.error("更新SEO表失败");

+ 8 - 6
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/system/TplPcMallDataModel.java

@@ -88,12 +88,14 @@ public class TplPcMallDataModel {
         if (StringUtils.isEmpty(tplPcMallData.getDataId())) {
             throw new MallException("请选择要修改的数据");
         }
-        TplPcMallDataExample example = new TplPcMallDataExample();
-        example.setName(tplPcMallData.getName());
-        example.setStoreId(tplPcMallData.getStoreId());
-        example.setWebSite(tplPcMallData.getWebSite());
-        example.setDataIdNotEquals(tplPcMallData.getDataId());
-        AssertUtil.isTrue(tplPcMallDataReadMapper.countByExample(example) > 0, "模板名称重复,请重新输入");
+        if (!StringUtils.isEmpty(tplPcMallData.getName())){
+            TplPcMallDataExample example = new TplPcMallDataExample();
+            example.setName(tplPcMallData.getName());
+            example.setStoreId(tplPcMallData.getStoreId());
+            example.setWebSite(tplPcMallData.getWebSite());
+            example.setDataIdNotEquals(tplPcMallData.getDataId());
+            AssertUtil.isTrue(tplPcMallDataReadMapper.countByExample(example) > 0, "模板名称重复,请重新输入");
+        }
 
         int count = tplPcMallDataWriteMapper.updateByPrimaryKeySelective(tplPcMallData);
         if (count == 0) {

+ 3 - 3
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/member/FollowProductVO.java

@@ -70,12 +70,12 @@ public class FollowProductVO implements Serializable {
         followId = memberFollowProduct.getFollowId();
         productId = memberFollowProduct.getProductId();
         productPrice = memberFollowProduct.getProductPrice();
-        productImage = FileUrlUtil.getFileUrl(memberFollowProduct.getProductImage(), null);
+        productImage = FileUrlUtil.getFileUrl(goods.getMainImage(), null);
         goodsId = memberFollowProduct.getGoodsId();
-        goodsName = memberFollowProduct.getGoodsName();
+        goodsName = goods.getGoodsName();
         storeId = memberFollowProduct.getStoreId();
         storeName = memberFollowProduct.getStoreName();
-        goodsBrief = memberFollowProduct.getGoodsBrief();
+        goodsBrief = goods.getGoodsBrief();
         shareLink = DomainUrlUtil.SLD_H5_URL + "/standard/product/detail?productId=" + memberFollowProduct.getProductId() + "&goodsId=" + memberFollowProduct.getGoodsId();
         isOwnStore = store.getIsOwnStore();
         isOwnStoreValue = dealIsOwnStoreValue(store.getIsOwnStore());

+ 5 - 1
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/statistics/AdminPresentIndexVO.java

@@ -116,7 +116,7 @@ public class AdminPresentIndexVO {
             this.goodsTotalNum = adminPresentDataVO.getPlatformSummary().getGoodsTotalNum();
             this.newGoodsNum = adminPresentDataVO.getPlatformTodaySummary().getNewGoodsNum();
             this.shelfGoodsNum = adminPresentDataVO.getPlatformSummary().getShelfGoodsNum();
-            this.saleGoodsNum = adminPresentDataVO.getPlatformSummary().getSaleGoodsNum();
+            this.saleGoodsNum = adminPresentDataVO.getPlatformSummary().getWebSiteSaleGoodsNum() ;
         }
 
         @ApiModelProperty("更新时间")
@@ -133,6 +133,10 @@ public class AdminPresentIndexVO {
 
         @ApiModelProperty("在售商品总数")
         private Integer saleGoodsNum;
+
+        @ApiModelProperty("站点在售商品总数")
+        private Integer webSiteSaleGoodsNum;
+
     }
 
     /**

+ 8 - 0
xinkeaboard-server/doc/DDL/update.sql

@@ -1,3 +1,7 @@
+INSERT INTO `sys_setting` VALUES ('site_source_china', '国内站', '2', '国内站点码表', 1);
+INSERT INTO `sys_setting` VALUES ('site_source_oversea', '海外站', '1', '海外站点码表', 1);
+
+
 ALTER TABLE member
 ADD COLUMN country VARCHAR(100) NULL COMMENT '国家',
 ADD COLUMN city VARCHAR(100) NULL COMMENT '城市',
@@ -298,6 +302,10 @@ ALTER TABLE sys_pc_navigation ADD COLUMN web_site TINYINT NOT NULL DEFAULT 1 COM
 
 ALTER TABLE cms_friend_link ADD COLUMN web_site TINYINT NOT NULL DEFAULT 1 COMMENT '站点 1:海外门户 2:国内分销门户' AFTER link_id;
 
+INSERT INTO sys_seo
+SELECT NULL,2,0,type,name,code,target_id,title,remark,keywords,alt,create_uid,NOW(),update_uid,NOW()
+FROM sys_seo WHERE type = 'MALL' AND create_uid = 1;
+