浏览代码

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

周玉环 1 周之前
父节点
当前提交
3a2f264411
共有 15 个文件被更改,包括 596 次插入91 次删除
  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_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
      * reids中保存邮箱用户注册,key=前缀+email
      */
      */
     public static final String SLD_PC_NEW_REGISTER_USER_EMAIL = "sld_pc_new_register_user: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
      * reids中保存邮箱用户忘记密码,key=前缀+email
      */
      */
     public static final String SLD_PC_FORGET_PWD_USER_EMAIL = "sld_pc_forget_pwd_user: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
      * reids中保存邮箱用户忘记密码,key=前缀+email
      */
      */
     public static final String TIME = "sld_pc_forget_pwd_user: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
 该邮箱已注册,请登录=This email has been registered, please log in
 邮件不能为空=Email cannot be empty
 邮件不能为空=Email cannot be empty
+手机号码不能为空=Phone number cannot be empty
 验证码不能为空=Verification cannot be empty
 验证码不能为空=Verification cannot be empty
 请勿频繁操作,请1分钟后重试=Please do not operate frequently, please retry in 1 minute
 请勿频繁操作,请1分钟后重试=Please do not operate frequently, please retry in 1 minute
 验证码发送失败,请重试=Failed to send verification code, please try again
 验证码发送失败,请重试=Failed to send verification code, please try again
@@ -2535,9 +2536,11 @@ pc端注册页面logo=
 注册链接不正确,请重新注册=The registration link is incorrect, please register again
 注册链接不正确,请重新注册=The registration link is incorrect, please register again
 密码不一致,请重新输入=Passwords do not match. Please reenter
 密码不一致,请重新输入=Passwords do not match. Please reenter
 会员邮箱不存在,请重新注册=Member email does not exist, please re register
 会员邮箱不存在,请重新注册=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
 注册链接激活码已失效,请重新注册=The registration link activation code has expired, please re register
 会员邮箱账户激活成功=Member email account activated successfully
 会员邮箱账户激活成功=Member email account activated successfully
+会员手机号激活成功=Member phone number activation successful
 注册链接已失效,请重新注册=The registration link has expired, please register again
 注册链接已失效,请重新注册=The registration link has expired, please register again
 发送重置密码邮件失败,请重试=Failed to send the reset password email. Please try again
 发送重置密码邮件失败,请重试=Failed to send the reset password email. Please try again
 该邮箱未激活,请先激活=This mail is not activated, please activate it first
 该邮箱未激活,请先激活=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("更新时间")
     @ApiModelProperty("更新时间")
     private Date updateTime;
     private Date updateTime;
 
 
-    @ApiModelProperty("会员邮箱是否激活:0未激活,1已激活")
+    @ApiModelProperty("会员邮箱/手机是否激活:0未激活,1已激活")
     private Integer isEmailActive;
     private Integer isEmailActive;
 
 
     @ApiModelProperty("gp系统用户uid")
     @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) {
     public JsonResult<List<FrontGoodsCategoryVO>> topCategory(HttpServletRequest request) {
         List<FrontGoodsCategoryVO> vos = new ArrayList<>();
         List<FrontGoodsCategoryVO> vos = new ArrayList<>();
 
 
+        String webSite = request.getHeader("Web-Site");
         //查询redis缓存
         //查询redis缓存
-        String dataJson = stringRedisTemplate.opsForValue().get(RedisConst.GOODS_CATEGORY);
+        String dataJson = stringRedisTemplate.opsForValue().get(RedisConst.GOODS_CATEGORY + "_" + webSite);
         if (!StringUtils.isEmpty(dataJson)) {
         if (!StringUtils.isEmpty(dataJson)) {
             JSONArray jsonArray = JSONArray.parseArray(dataJson);
             JSONArray jsonArray = JSONArray.parseArray(dataJson);
             for (int i = 0; i < jsonArray.size(); i++) {
             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));
         AssertUtil.isTrue(!Md5.getMd5String(memberUpdateLoginPwdDTO.getOldLoginPwd()).equalsIgnoreCase(memberDb.getLoginPwd()), Language.translate("原密码不对,请重新输入",Language.EN_LANGUAGE_TYPE));
 
 
         memberModel.editLoginPwd(memberUpdateLoginPwdDTO, member.getMemberId());
         memberModel.editLoginPwd(memberUpdateLoginPwdDTO, member.getMemberId());
+        stringRedisTemplate.delete(memberUpdateLoginPwdDTO.getMemberEmail());
         return SldResponse.success(Language.translate("修改登录密码成功",Language.EN_LANGUAGE_TYPE));
         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.core.util.WebUtil;
 import com.slodon.b2b2c.dao.read.member.MemberReadMapper;
 import com.slodon.b2b2c.dao.read.member.MemberReadMapper;
 import com.slodon.b2b2c.dao.write.member.MemberWriteMapper;
 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.example.MemberExample;
 import com.slodon.b2b2c.member.pojo.Member;
 import com.slodon.b2b2c.member.pojo.Member;
 import com.slodon.b2b2c.model.member.MemberModel;
 import com.slodon.b2b2c.model.member.MemberModel;
@@ -31,10 +32,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 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;
 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> EMAIL_KEY_MAP = new HashMap<>();
 
 
+    private static final Map<Integer, String> MOBILE_KEY_MAP = new HashMap<>();
+
     static {
     static {
         EMAIL_KEY_MAP.put(1, RedisConst.SLD_PC_NEW_REGISTER_USER_EMAIL);
         EMAIL_KEY_MAP.put(1, RedisConst.SLD_PC_NEW_REGISTER_USER_EMAIL);
         EMAIL_KEY_MAP.put(2, RedisConst.SLD_PC_FORGET_PWD_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 request
 //     * @param email
 //     * @param email
@@ -160,38 +165,87 @@ public class MemberEmailActiveController extends BaseController {
      * @param email
      * @param email
      * @param source
      * @param source
      * @param type
      * @param type
-     * @param webSite
+     * @param mobile
      * @return
      * @return
      */
      */
     @PostMapping("/verification/code")
     @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)) {
         if (StringUtil.isEmpty(email)) {
             return SldResponse.fail(Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
             return SldResponse.fail(Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
         }
         }
         AssertUtil.emailCheck(email);
         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分钟内已发送过验证码
         // 1. 判断是否在1分钟内已发送过验证码
-        String redisKey = RedisConst.SLD_PC_EMAIL_VERIFY_CODE_LIMIT + email + ":type::" + type + ":webSite::" + webSite;
         if (Boolean.TRUE.equals(stringRedisTemplate.hasKey(redisKey))) {
         if (Boolean.TRUE.equals(stringRedisTemplate.hasKey(redisKey))) {
             return SldResponse.fail(Language.translate("请勿频繁操作,请1分钟后重试", Language.EN_LANGUAGE_TYPE));
             return SldResponse.fail(Language.translate("请勿频繁操作,请1分钟后重试", Language.EN_LANGUAGE_TYPE));
         }
         }
 
 
         int count;
         int count;
         if (type == 1) {
         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 == 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 {
         } 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 == 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分钟内不可重复发送
         // 2. 设置 Redis 标记,1分钟内不可重复发送
         stringRedisTemplate.opsForValue().set(redisKey, "1", 60, TimeUnit.SECONDS);
         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 email
      * @param type
      * @param type
      * @param verificationCode
      * @param verificationCode
-     * @param webSite
+     * @param mobile
      * @return
      * @return
      */
      */
     @PostMapping("/check/verification/code")
     @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);
         String baseKey = EMAIL_KEY_MAP.get(type);
         if (baseKey == null) {
         if (baseKey == null) {
             return SldResponse.fail(Language.translate("验证码不能为空", Language.EN_LANGUAGE_TYPE));
             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)) {
         if (!stringRedisTemplate.hasKey(redisKey)) {
             return SldResponse.fail(Language.translate("验证码已过期,请重新获取", Language.EN_LANGUAGE_TYPE));
             return SldResponse.fail(Language.translate("验证码已过期,请重新获取", Language.EN_LANGUAGE_TYPE));
         }
         }
@@ -230,12 +320,37 @@ public class MemberEmailActiveController extends BaseController {
         if (!verificationCode.equals(storedCode)) {
         if (!verificationCode.equals(storedCode)) {
             return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("验证码校验失败", Language.EN_LANGUAGE_TYPE));
             return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("验证码校验失败", Language.EN_LANGUAGE_TYPE));
         }
         }
-//        stringRedisTemplate.delete(redisKey);
+
         return SldResponse.success(Language.translate("验证码校验成功", Language.EN_LANGUAGE_TYPE));
         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
      * @param request
@@ -243,51 +358,126 @@ public class MemberEmailActiveController extends BaseController {
      * @param nickName
      * @param nickName
      * @param password
      * @param password
      * @param confirmPassword
      * @param confirmPassword
-     * @param webSite
+     * @param mobile
      * @return
      * @return
      */
      */
     @PostMapping("/register")
     @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)) {
         if (!password.equals(confirmPassword)) {
-            return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("密码不一致,请重新输入", Language.EN_LANGUAGE_TYPE));
+            return ValidationResult.invalid("密码不一致,请重新输入");
         }
         }
+
         AssertUtil.passwordCheck(password);
         AssertUtil.passwordCheck(password);
+        return ValidationResult.valid();
+    }
+
+    /**
+     * 查找会员信息
+     */
+    private Member findMemberInfo(String webSite, String email, String mobile) {
         MemberExample memberExample = new MemberExample();
         MemberExample memberExample = new MemberExample();
-        memberExample.setMemberEmail(email.toLowerCase());
         memberExample.setWebSite(webSite);
         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();
         Member memberNew = new Member();
         memberNew.setMemberId(memberInfo.getMemberId());
         memberNew.setMemberId(memberInfo.getMemberId());
         memberNew.setIsEmailActive(1);
         memberNew.setIsEmailActive(1);
         memberNew.setUpdateTime(new Date());
         memberNew.setUpdateTime(new Date());
         memberNew.setMemberNickName(nickName);
         memberNew.setMemberNickName(nickName);
         memberNew.setLoginPwd(Md5.getMd5String(password));
         memberNew.setLoginPwd(Md5.getMd5String(password));
+
         String ip = WebUtil.getRealIp(request);
         String ip = WebUtil.getRealIp(request);
         CountryAreaApiDto countryAreaApiDto = memberEnquiryModel.getCountryAndAreaByIp(ip);
         CountryAreaApiDto countryAreaApiDto = memberEnquiryModel.getCountryAndAreaByIp(ip);
         memberNew.setCountry(countryAreaApiDto.getCountryIsoCode());
         memberNew.setCountry(countryAreaApiDto.getCountryIsoCode());
         memberNew.setCity(countryAreaApiDto.getCityIsoCode());
         memberNew.setCity(countryAreaApiDto.getCityIsoCode());
+
         memberModel.updateMember(memberNew);
         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 verificationCode
      * @param loginPwd
      * @param loginPwd
      * @param confirmPassWord
      * @param confirmPassWord
-     * @param webSite
+     * @param mobile
      * @return
      * @return
      */
      */
     @PostMapping("/email/reset/pwdNew")
     @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));
             return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("该邮箱不存在,请先注册", Language.EN_LANGUAGE_TYPE));
         }
         }
 
 
-        Member memberInfo = memberList.get(0);
+        // 检查邮箱是否已激活
         if (memberInfo.getIsEmailActive() != null && memberInfo.getIsEmailActive() == 0) {
         if (memberInfo.getIsEmailActive() != null && memberInfo.getIsEmailActive() == 0) {
             return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("该邮箱未激活,请先激活", Language.EN_LANGUAGE_TYPE));
             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);
             log.info("verifyNumber:{}", verifyNumber);
             if (!verificationCode.equals(verifyNumber)) {
             if (!verificationCode.equals(verifyNumber)) {
                 return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("验证码校验失败", Language.EN_LANGUAGE_TYPE));
                 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());
             memberNew.setUpdateTime(new Date());
             memberModel.updateMember(memberNew);
             memberModel.updateMember(memberNew);
 
 
-            stringRedisTemplate.delete(forgetPwdEmailKey);
+            // 删除Redis中的验证码
+            stringRedisTemplate.delete(redisKey);
 
 
             return SldResponse.success(Language.translate("重置登录密码成功", Language.EN_LANGUAGE_TYPE));
             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));
         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);
         smsCodeModel.saveSmsCode(code);
 
 
         //将随机数存在redis中
         //将随机数存在redis中
-        stringRedisTemplate.opsForValue().set(mobile, smsResponse.getVerifyCode(), 60L * 10, TimeUnit.SECONDS);
+        stringRedisTemplate.opsForValue().set(mobile, smsResponse.getVerifyCode(), 60L * 5, TimeUnit.SECONDS);
         return SldResponse.success("发送成功");
         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.setVendorId(allVendorList.get(0).getVendorId());
         vendorUpdate.setVendorPassword(Md5.getMd5String(newPwd));
         vendorUpdate.setVendorPassword(Md5.getMd5String(newPwd));
         vendorModel.updateVendor(vendorUpdate);
         vendorModel.updateVendor(vendorUpdate);
+        stringRedisTemplate.delete(mobile);
         return SldResponse.success("修改成功");
         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({
     @ApiImplicitParams({
             @ApiImplicitParam(name = "name", value = "要修改的name名称", paramType = "query"),
             @ApiImplicitParam(name = "name", value = "要修改的name名称", paramType = "query"),
             @ApiImplicitParam(name = "value", value = "要修改的value值", paramType = "query"),
             @ApiImplicitParam(name = "value", value = "要修改的value值", paramType = "query"),
-            @ApiImplicitParam(name = "webSite", value = "站点", paramType = "query")
     })
     })
     @OperationLogger(option = "编辑后台参数配置")
     @OperationLogger(option = "编辑后台参数配置")
     @PostMapping("updateSettingList")
     @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.captcha.work.Producer;
 import com.slodon.b2b2c.core.config.DomainUrlUtil;
 import com.slodon.b2b2c.core.config.DomainUrlUtil;
 import com.slodon.b2b2c.core.constant.RedisConst;
 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.i18n.Language;
 import com.slodon.b2b2c.core.random.RandomUtil;
 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.uid.GoodsIdGenerator;
+import com.slodon.b2b2c.core.util.AssertUtil;
 import com.slodon.b2b2c.core.util.StringUtil;
 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.read.member.MemberReadMapper;
 import com.slodon.b2b2c.dao.write.member.MemberWriteMapper;
 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.example.MemberExample;
 import com.slodon.b2b2c.member.pojo.Member;
 import com.slodon.b2b2c.member.pojo.Member;
 import com.slodon.b2b2c.model.member.MemberModel;
 import com.slodon.b2b2c.model.member.MemberModel;
 import com.slodon.b2b2c.model.msg.MsgSendModel;
 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 lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.util.Date;
 import java.util.Date;
@@ -49,6 +68,8 @@ public class MemberRegisterActiveModel {
 
 
     @Resource
     @Resource
     private MemberModel memberModel;
     private MemberModel memberModel;
+    @Resource
+    private SmsCodeModel smsCodeModel;
 
 
     /**
     /**
      * 发送注册用户邮件激活链接
      * 发送注册用户邮件激活链接
@@ -137,7 +158,7 @@ public class MemberRegisterActiveModel {
      * @param source
      * @param source
      */
      */
     @Transactional(rollbackFor = Exception.class)
     @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 member = new Member();
         member.setMemberName(email);
         member.setMemberName(email);
 //        member.setMemberName(GoodsIdGenerator.getMemberName());
 //        member.setMemberName(GoodsIdGenerator.getMemberName());
@@ -252,7 +273,7 @@ public class MemberRegisterActiveModel {
         emailMsgTpl.append(enText1 + "<br/>");
         emailMsgTpl.append(enText1 + "<br/>");
         emailMsgTpl.append("<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);
         enText2 = enText2.replace("${URL}", pcDomainUrl);
         emailMsgTpl.append(enText2);
         emailMsgTpl.append(enText2);
 //        emailMsgTpl.append("<font color='#e13841'>"+email+"</font>");
 //        emailMsgTpl.append("<font color='#e13841'>"+email+"</font>");
@@ -272,36 +293,145 @@ public class MemberRegisterActiveModel {
         msgSendModel.sendHtmlMail(email, subject, emailMsgTpl.toString());
         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;
         int res = 0;
         MemberExample example = new MemberExample();
         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);
         example.setWebSite(webSite);
         List<Member> memberList = memberReadMapper.listByExample(example);
         List<Member> memberList = memberReadMapper.listByExample(example);
         if (CollectionUtil.isNotEmpty(memberList)) {
         if (CollectionUtil.isNotEmpty(memberList)) {
             Member memberInfo = memberList.get(0);
             Member memberInfo = memberList.get(0);
             if (memberInfo.getIsEmailActive() == 0) {
             if (memberInfo.getIsEmailActive() == 0) {
-                sendEmailRegisterVerificationCode(email, webSite);
+                if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
+                    sendEmailRegisterVerificationCode(email);
+                } else {
+                    sendMobileRegisterVerificationCode(mobile);
+                }
+
                 res = 1;
                 res = 1;
             } else {
             } else {
                 res = 2;
                 res = 2;
             }
             }
         } else {
         } else {
             res = 1;
             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;
         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 pcDomainUrl = DomainUrlUtil.SLD_PC_URL.replace("http://", "").replace("https://", "");
         String verifCode = "";
         String verifCode = "";
         //邮件验证码过期时间,单位秒
         //邮件验证码过期时间,单位秒
         long expireTime = RedisConst.REGISTER_USER_AND_FORGETPWD_USER_EMAIL_VERIFICATION_CODE_EXPIRE_TIME;
         long expireTime = RedisConst.REGISTER_USER_AND_FORGETPWD_USER_EMAIL_VERIFICATION_CODE_EXPIRE_TIME;
 
 
         //将随机数存在redis中
         //将随机数存在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);
         verifCode = RandomUtil.randomNumber(4);
         stringRedisTemplate.opsForValue().set(activeEmailKey, verifCode, expireTime, TimeUnit.SECONDS);
         stringRedisTemplate.opsForValue().set(activeEmailKey, verifCode, expireTime, TimeUnit.SECONDS);
 
 
@@ -314,16 +444,25 @@ public class MemberRegisterActiveModel {
         msgSendModel.sendHtmlMail(email, subject, emailMsgTpl.toString());
         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;
         int res = 0;
         MemberExample memberExample = new MemberExample();
         MemberExample memberExample = new MemberExample();
-        memberExample.setMemberEmail(email);
+        if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
+            memberExample.setMemberEmail(email.toLowerCase());
+        } else {
+            memberExample.setMemberMobile(mobile);
+        }
         memberExample.setWebSite(webSite);
         memberExample.setWebSite(webSite);
         List<Member> memberList = memberReadMapper.listByExample(memberExample);
         List<Member> memberList = memberReadMapper.listByExample(memberExample);
         if (CollectionUtil.isNotEmpty(memberList)) {
         if (CollectionUtil.isNotEmpty(memberList)) {
             Member memberInfo = memberList.get(0);
             Member memberInfo = memberList.get(0);
             if (memberInfo.getIsEmailActive() == 1) {
             if (memberInfo.getIsEmailActive() == 1) {
-                sendEmailForgetPasswordVerificationCode(email, memberInfo.getMemberNickName(),webSite);
+                if (WebSiteConstant.MEMBER_OVERSEA.equals(webSite)) {
+                    sendEmailForgetPasswordVerificationCode(email, memberInfo.getMemberNickName());
+                } else {
+                    sendMobileForgetPasswordVerificationCode(mobile);
+                }
+
                 res = 1;
                 res = 1;
             } else {
             } else {
                 res = 2;
                 res = 2;
@@ -334,14 +473,29 @@ public class MemberRegisterActiveModel {
         return res;
         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 pcDomainUrl = DomainUrlUtil.SLD_PC_URL.replace("http://", "").replace("https://", "");
         String verifCode = "";
         String verifCode = "";
         //重置密码验证码过期时间,单位秒
         //重置密码验证码过期时间,单位秒
         long expireTime = RedisConst.REGISTER_USER_AND_FORGETPWD_USER_EMAIL_VERIFICATION_CODE_EXPIRE_TIME;
         long expireTime = RedisConst.REGISTER_USER_AND_FORGETPWD_USER_EMAIL_VERIFICATION_CODE_EXPIRE_TIME;
 
 
         //将随机数存在redis中
         //将随机数存在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);
         verifCode = RandomUtil.randomNumber(4);
         stringRedisTemplate.opsForValue().set(forgetPwdEmailKey, verifCode, expireTime, TimeUnit.SECONDS);
         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);
         String subject = Language.translate("重设您的", Language.EN_LANGUAGE_TYPE) + pcDomainUrl.toUpperCase() + " " + Language.translate("帐户密码", Language.EN_LANGUAGE_TYPE);
         msgSendModel.sendHtmlMail(email, subject, emailMsgTpl.toString());
         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) {
     public Integer updateSeo(SysSeo sysSeo, Long targetId, String type) {
         SysSeoExample seoExample = new SysSeoExample();
         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);
         int count = sysSeoWriteMapper.updateByExampleSelective(sysSeo, seoExample);
         if (count == 0) {
         if (count == 0) {
             log.error("更新SEO表失败");
             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())) {
         if (StringUtils.isEmpty(tplPcMallData.getDataId())) {
             throw new MallException("请选择要修改的数据");
             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);
         int count = tplPcMallDataWriteMapper.updateByPrimaryKeySelective(tplPcMallData);
         if (count == 0) {
         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();
         followId = memberFollowProduct.getFollowId();
         productId = memberFollowProduct.getProductId();
         productId = memberFollowProduct.getProductId();
         productPrice = memberFollowProduct.getProductPrice();
         productPrice = memberFollowProduct.getProductPrice();
-        productImage = FileUrlUtil.getFileUrl(memberFollowProduct.getProductImage(), null);
+        productImage = FileUrlUtil.getFileUrl(goods.getMainImage(), null);
         goodsId = memberFollowProduct.getGoodsId();
         goodsId = memberFollowProduct.getGoodsId();
-        goodsName = memberFollowProduct.getGoodsName();
+        goodsName = goods.getGoodsName();
         storeId = memberFollowProduct.getStoreId();
         storeId = memberFollowProduct.getStoreId();
         storeName = memberFollowProduct.getStoreName();
         storeName = memberFollowProduct.getStoreName();
-        goodsBrief = memberFollowProduct.getGoodsBrief();
+        goodsBrief = goods.getGoodsBrief();
         shareLink = DomainUrlUtil.SLD_H5_URL + "/standard/product/detail?productId=" + memberFollowProduct.getProductId() + "&goodsId=" + memberFollowProduct.getGoodsId();
         shareLink = DomainUrlUtil.SLD_H5_URL + "/standard/product/detail?productId=" + memberFollowProduct.getProductId() + "&goodsId=" + memberFollowProduct.getGoodsId();
         isOwnStore = store.getIsOwnStore();
         isOwnStore = store.getIsOwnStore();
         isOwnStoreValue = dealIsOwnStoreValue(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.goodsTotalNum = adminPresentDataVO.getPlatformSummary().getGoodsTotalNum();
             this.newGoodsNum = adminPresentDataVO.getPlatformTodaySummary().getNewGoodsNum();
             this.newGoodsNum = adminPresentDataVO.getPlatformTodaySummary().getNewGoodsNum();
             this.shelfGoodsNum = adminPresentDataVO.getPlatformSummary().getShelfGoodsNum();
             this.shelfGoodsNum = adminPresentDataVO.getPlatformSummary().getShelfGoodsNum();
-            this.saleGoodsNum = adminPresentDataVO.getPlatformSummary().getSaleGoodsNum();
+            this.saleGoodsNum = adminPresentDataVO.getPlatformSummary().getWebSiteSaleGoodsNum() ;
         }
         }
 
 
         @ApiModelProperty("更新时间")
         @ApiModelProperty("更新时间")
@@ -133,6 +133,10 @@ public class AdminPresentIndexVO {
 
 
         @ApiModelProperty("在售商品总数")
         @ApiModelProperty("在售商品总数")
         private Integer saleGoodsNum;
         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
 ALTER TABLE member
 ADD COLUMN country VARCHAR(100) NULL COMMENT '国家',
 ADD COLUMN country VARCHAR(100) NULL COMMENT '国家',
 ADD COLUMN city 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;
 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;
+