Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

feix0518 5 dienas atpakaļ
vecāks
revīzija
a67c0b7755
18 mainītis faili ar 457 papildinājumiem un 18 dzēšanām
  1. 8 0
      xinkeaboard-server/b2b2c-core/src/main/java/com/slodon/b2b2c/core/constant/RedisConst.java
  2. 9 0
      xinkeaboard-server/b2b2c-core/src/main/java/com/slodon/b2b2c/core/util/AssertUtil.java
  3. 10 0
      xinkeaboard-server/b2b2c-core/src/main/resources/i18n_en.properties
  4. 6 0
      xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/member/example/MemberExample.java
  5. 9 0
      xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/member/pojo/Member.java
  6. 14 0
      xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/system/dto/CountryAreaApiDto.java
  7. 1 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/member/front/MemberInfoController.java
  8. 211 1
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/member/front/advich/MemberEmailActiveController.java
  9. 11 9
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/sso/front/FrontAuthController.java
  10. 2 2
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/sso/seller/SellerAuthController.java
  11. 2 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dto/GpUserInfoDto.java
  12. 7 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/MemberProductLookLogModel.java
  13. 10 2
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/advich/MemberEnquiryModel.java
  14. 91 2
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/advich/MemberRegisterActiveModel.java
  15. 11 2
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/advich/OneClickLoginModel.java
  16. 4 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/member/FollowProductVO.java
  17. 3 0
      xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/vo/member/ProductLookLogVO.java
  18. 48 0
      xinkeaboard-server/b2b2c-web/src/main/resources/mapper/write/member/MemberWriteMapper.xml

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

@@ -78,6 +78,8 @@ public class RedisConst {
      */
     public static final String DRAW_PREFIX = "draw_";
 
+    public static final String SLD_PC_EMAIL_VERIFY_CODE_LIMIT="sld_pc_verify_code_limit:email::";
+
     /**
      * reids中保存邮箱用户注册,key=前缀+email
      */
@@ -98,6 +100,12 @@ public class RedisConst {
      */
     public static final long REGISTER_USER_AND_FORGETPWD_USER_EMAIL_LINK_EXPIRE_TIME = 60L * 10 * 6 * 24;
 
+
+    /**
+     * 用户注册、忘记密码验证码有效时间:5min
+     */
+    public static final long REGISTER_USER_AND_FORGETPWD_USER_EMAIL_VERIFICATION_CODE_EXPIRE_TIME = 60L * 5;
+
     /**
      * 单点登录链接有效时间:600秒即10分钟
      */

+ 9 - 0
xinkeaboard-server/b2b2c-core/src/main/java/com/slodon/b2b2c/core/util/AssertUtil.java

@@ -214,4 +214,13 @@ public class AssertUtil {
             throw new MallException("请输入正确的数字");
         }
     }
+
+    public static void passwordCheck(String password) {
+        String check = "^[a-zA-Z0-9!@#$%^&*()\\\\{\\\\}\\\\[\\\\]|\\\\\\\\:;'\\\",./?]{6,20}$";
+        Pattern regex = Pattern.compile(check);
+        Matcher matcher = regex.matcher(password);
+        if (!matcher.matches()) {
+            throw new MallException("请输入正确的密码");
+        }
+    }
 }

+ 10 - 0
xinkeaboard-server/b2b2c-core/src/main/resources/i18n_en.properties

@@ -1807,6 +1807,7 @@ admin账号不可删除=admin account can not be deleted
 更新直播和短视频设置表失败,请重试=Live updates and short video settings table failed, please try again
 退出成功=exit successfully
 用户名或密码错误=wrong user name or password
+会员邮箱或密码错误=wrong member email or password
 系统开小差了=System deserted
 账号已被冻结=Account has been frozen
 账号不可用=Account unavailable
@@ -2519,9 +2520,17 @@ pc端注册页面logo=
 榜单分类不存在=
 该邮箱已注册,请登录=This email has been registered, please log in
 邮件不能为空=Email 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
 发送验证邮件失败,请重试=Failed to send verification email, please try again
 发送验证邮件成功=Successfully sent the verification email
+验证码发送成功=Successfully sent the verification code
+验证码已过期,请重新获取=Verification code has expired, please get a new one
+验证码校验失败=Verification code verification failed
+验证码校验成功=Verification code verification successful
 注册链接不正确,请重新注册=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
 注册链接激活码已失效,请重新注册=The registration link activation code has expired, please re register
@@ -2537,6 +2546,7 @@ pc端注册页面logo=
 重置密码链接已失效,请重新获取=The reset password link has expired, please obtain it again
 亲爱的=Dear 
 感谢您申请注册=Thank you for applying for registration
+验证码=Verification code
 请点击或复制以下链接到浏览器激活账号=Please click or copy the following link to the browser to activate your account
 欢迎注册=Welcome to register 
 请验证您的邮箱=Please verify your email

+ 6 - 0
xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/member/example/MemberExample.java

@@ -281,4 +281,10 @@ public class MemberExample implements Serializable {
      * gp系统用户token
      */
     private String gpToken;
+
+
+    /**
+     * 会员类型
+     */
+    private String memberType;
 }

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

@@ -139,6 +139,15 @@ public class Member implements Serializable {
     @ApiModelProperty("主营业务")
     private String memberMainProduct;
 
+    @ApiModelProperty("国家")
+    private String country;
+
+    @ApiModelProperty("城市")
+    private String city;
+
+    @ApiModelProperty("会员类型 1:海外门户 2:国内分销门户 ")
+    private String memberType;
+
     /**
      * 获取账户余额
      */

+ 14 - 0
xinkeaboard-server/b2b2c-entity/src/main/java/com/slodon/b2b2c/system/dto/CountryAreaApiDto.java

@@ -8,6 +8,8 @@ package com.slodon.b2b2c.system.dto;
 public class CountryAreaApiDto {
     private String countryZhCN;
     private String countryIsoCode;
+    private String cityZhCN;
+    private String cityIsoCode;
     private String subdivisionZhCN;
     private String subdivisionIsoCode;
     private String timeZone;
@@ -28,6 +30,18 @@ public class CountryAreaApiDto {
         this.countryIsoCode = countryIsoCode;
     }
 
+    public String getCityZhCN() {return cityZhCN;}
+
+    public void setCityZhCN(String cityZhCN) {
+        this.cityZhCN = cityZhCN;
+    }
+
+    public String getCityIsoCode() {return cityIsoCode;}
+
+    public void setCityIsoCode(String cityIsoCode) {
+        this.cityIsoCode = cityIsoCode;
+    }
+
     public String getSubdivisionZhCN() {
         return subdivisionZhCN;
     }

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

@@ -32,6 +32,7 @@ import com.slodon.b2b2c.model.msg.MemberReceiveModel;
 import com.slodon.b2b2c.model.promotion.CouponMemberModel;
 import com.slodon.b2b2c.msg.example.MemberReceiveExample;
 import com.slodon.b2b2c.promotion.example.CouponMemberExample;
+import com.slodon.b2b2c.system.dto.CountryAreaApiDto;
 import com.slodon.b2b2c.vo.member.MemberInfoVO;
 import com.slodon.b2b2c.vo.member.MemberVO;
 import io.swagger.annotations.Api;

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

@@ -9,6 +9,7 @@ import com.slodon.b2b2c.core.response.SldResponse;
 import com.slodon.b2b2c.core.util.AssertUtil;
 import com.slodon.b2b2c.core.util.Md5;
 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.member.example.MemberExample;
@@ -18,19 +19,23 @@ import com.slodon.b2b2c.model.member.advich.MemberEnquiryModel;
 import com.slodon.b2b2c.model.member.advich.MemberRegisterActiveModel;
 import com.slodon.b2b2c.model.seller.VendorModel;
 import com.slodon.b2b2c.seller.dto.VendorRegisterDTO;
+import com.slodon.b2b2c.system.dto.CountryAreaApiDto;
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 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.concurrent.TimeUnit;
 
 /**
  * @author cyan
@@ -62,6 +67,13 @@ public class MemberEmailActiveController extends BaseController {
     @Resource
     private VendorModel vendorModel;
 
+    private static final Map<Integer, String> EMAIL_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);
+    }
+
 //    /**
 //     * @param request
 //     * @param email
@@ -140,6 +152,204 @@ public class MemberEmailActiveController extends BaseController {
         return SldResponse.success(Language.translate("发送验证邮件成功", Language.EN_LANGUAGE_TYPE));
     }
 
+
+    /**
+     * 发送注册或忘记密码验证码
+     *
+     * @param request
+     * @param email
+     * @param source
+     * @param type
+     * @param memberType
+     * @return
+     */
+    @PostMapping("/verification/code")
+    public JsonResult<Object> getMemberEmailVerificationCode(HttpServletRequest request, String email, Integer source, Integer type, @RequestParam(value = "memberType", required = false, defaultValue = "1") String memberType) {
+        log.info("getMemberEmailVerificationCode - email:{},source:{},type:{},memberType:{}", email, source, type, memberType);
+        if (StringUtil.isEmpty(email)) {
+            return SldResponse.fail(Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
+        }
+        AssertUtil.emailCheck(email);
+
+        // 1. 判断是否在1分钟内已发送过验证码
+        String redisKey = RedisConst.SLD_PC_EMAIL_VERIFY_CODE_LIMIT + email + ":type::" + type + ":memberType::" + memberType;
+        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, memberType);
+            AssertUtil.isTrue((count == 0), Language.translate("验证码发送失败,请重试", Language.EN_LANGUAGE_TYPE));
+            AssertUtil.isTrue((count == 2), Language.translate("该邮箱已注册,请登录", Language.EN_LANGUAGE_TYPE));
+        } else {
+            count = memberRegisterActiveModel.checkMemberUserInfo(email, memberType);
+            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));
+        }
+        // 2. 设置 Redis 标记,1分钟内不可重复发送
+        stringRedisTemplate.opsForValue().set(redisKey, "1", 60, TimeUnit.SECONDS);
+        return SldResponse.success(Language.translate("验证码发送成功", Language.EN_LANGUAGE_TYPE));
+
+    }
+
+
+    /**
+     * 校验注册或忘记密码验证码
+     *
+     * @param request
+     * @param email
+     * @param type
+     * @param verificationCode
+     * @param memberType
+     * @return
+     */
+    @PostMapping("/check/verification/code")
+    public JsonResult<Object> checkMemberEmailVerificationCode(HttpServletRequest request, String email, Integer type, String verificationCode, @RequestParam(value = "memberType", required = false, defaultValue = "1") String memberType) {
+        log.info("checkMemberEmailVerificationCode - email:{},type:{},verificationCode:{},memberType:{}", email, type, verificationCode, memberType);
+        if (StringUtil.isEmpty(email)) {
+            return SldResponse.fail(Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
+        }
+        if (StringUtil.isEmpty(verificationCode)) {
+            return SldResponse.fail(Language.translate("验证码不能为空", Language.EN_LANGUAGE_TYPE));
+        }
+        AssertUtil.emailCheck(email);
+
+        String baseKey = EMAIL_KEY_MAP.get(type);
+        if (baseKey == null) {
+            return SldResponse.fail(Language.translate("验证码不能为空", Language.EN_LANGUAGE_TYPE));
+        }
+
+        String redisKey = baseKey + email + ":memberType::" + memberType;
+        if (!stringRedisTemplate.hasKey(redisKey)) {
+            return SldResponse.fail(Language.translate("验证码已过期,请重新获取", Language.EN_LANGUAGE_TYPE));
+        }
+
+        String storedCode = stringRedisTemplate.opsForValue().get(redisKey);
+        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));
+    }
+
+
+    /**
+     * 注册
+     *
+     * @param request
+     * @param email
+     * @param nickName
+     * @param password
+     * @param confirmPassword
+     * @param memberType
+     * @return
+     */
+    @PostMapping("/register")
+    public JsonResult<Object> activeMemberEmailInfo(HttpServletRequest request, String email, String nickName, String password, String confirmPassword, @RequestParam(value = "memberType", required = false, defaultValue = "1") String memberType) {
+        log.info("activeMemberEmailInfo - email:{},nickName:{},password:{},confirmPassword:{},memberType:{}", email, nickName, password, confirmPassword, memberType);
+        if (StringUtil.isEmpty(email)) {
+            return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
+        }
+        if (!password.equals(confirmPassword)) {
+            return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("密码不一致,请重新输入", Language.EN_LANGUAGE_TYPE));
+        }
+        AssertUtil.passwordCheck(password);
+        MemberExample memberExample = new MemberExample();
+        memberExample.setMemberEmail(email.toLowerCase());
+        memberExample.setMemberType(memberType);
+        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));
+        }
+
+        // 更新用户邮箱激活状态
+        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);
+
+        // 发送账户注册成功邮件
+        memberRegisterActiveModel.sendRegisterSuccessEmail(email, nickName);
+        return SldResponse.success(Language.translate("会员邮箱账户激活成功", Language.EN_LANGUAGE_TYPE));
+    }
+
+
+    /**
+     * 用户邮箱重置忘记密码
+     *
+     * @param request
+     * @param email
+     * @param verificationCode
+     * @param loginPwd
+     * @param confirmPassWord
+     * @param memberType
+     * @return
+     */
+    @PostMapping("/email/reset/pwdNew")
+    public JsonResult<Object> emailResetPwdNew(HttpServletRequest request, String email, String verificationCode, String loginPwd, String confirmPassWord, @RequestParam(value = "memberType", required = false, defaultValue = "1") String memberType) {
+        log.info("emailResetPwd - email:{},verificationCode:{},loginPwd:{},confirmPassWord:{},memberType:{}", email, verificationCode, loginPwd, confirmPassWord, memberType);
+        if (StringUtil.isEmpty(email)) {
+            return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("邮件不能为空", Language.EN_LANGUAGE_TYPE));
+        }
+        MemberExample memberExample = new MemberExample();
+        memberExample.setMemberEmail(email.toLowerCase());
+        memberExample.setMemberType(memberType);
+        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() == 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));
+        }
+
+        AssertUtil.passwordCheck(loginPwd);
+
+        String forgetPwdEmailKey = RedisConst.SLD_PC_FORGET_PWD_USER_EMAIL + email;
+        log.info("forgetPwdEmailKey:{}", forgetPwdEmailKey);
+        if (stringRedisTemplate.hasKey(forgetPwdEmailKey)) {
+            String verifyNumber = stringRedisTemplate.opsForValue().get(forgetPwdEmailKey);
+            log.info("verifyNumber:{}", verifyNumber);
+            if (!verificationCode.equals(verifyNumber)) {
+                return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("验证码校验失败", Language.EN_LANGUAGE_TYPE));
+            }
+
+            // 更新用户密码
+            Member memberNew = new Member();
+            memberNew.setMemberId(memberInfo.getMemberId());
+            memberNew.setLoginPwd(Md5.getMd5String(loginPwd));
+            memberNew.setUpdateTime(new Date());
+            memberModel.updateMember(memberNew);
+
+            stringRedisTemplate.delete(forgetPwdEmailKey);
+
+            return SldResponse.success(Language.translate("重置登录密码成功", Language.EN_LANGUAGE_TYPE));
+        }
+        return SldResponse.fail(ResponseConst.STATE_FAIL, Language.translate("验证码已过期,请重新获取", Language.EN_LANGUAGE_TYPE));
+    }
+
+
+
     /**
      * 用户邮箱链接激活
      *

+ 11 - 9
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/sso/front/FrontAuthController.java

@@ -96,11 +96,12 @@ public class FrontAuthController {
             @ApiImplicitParam(name = "password", value = "登陆类型为1时:是密码;为2时:是验证码", paramType = "query"),
             @ApiImplicitParam(name = "cartInfo", value = "离线购物车信息 如 [{\"productId\":1,\"buyNum\":1},{\"productId\":2,\"buyNum\":2}]", paramType = "query"),
             @ApiImplicitParam(name = "clientId", value = "客户端身份ID app传参", paramType = "query"),
-            @ApiImplicitParam(name = "alias", value = "客户端身份别名 app传参", paramType = "query")
+            @ApiImplicitParam(name = "alias", value = "客户端身份别名 app传参", paramType = "query"),
+            @ApiImplicitParam(name = "memberType", value = "会员类型", paramType = "query")
     })
     @PostMapping("token")
     public JsonResult<Object> doLogin(HttpServletRequest request, @RequestParam(value = "loginType", required = false, defaultValue = "1") Integer loginType,
-                                      String username, String password, String cartInfo, String clientId, String alias, String refresh_token, Integer ssoType) {
+                                      String username, String password, String cartInfo, String clientId, String alias, String refresh_token, Integer ssoType,@RequestParam(value = "memberType",required = false, defaultValue = "1") String memberType) {
         Member member;
         if (!StringUtils.isEmpty(refresh_token)) {
             //校验token
@@ -112,25 +113,26 @@ public class FrontAuthController {
 //            memberExample.setMemberNameOrMemberMobile(username.replace(":", ""));
             // 改为邮箱账户验证登录
             memberExample.setMemberName(username);
+            memberExample.setMemberType(memberType);
             List<Member> memberList = memberModel.getMemberList(memberExample, null);
             if (loginType == 1) {
                 if (CollectionUtils.isEmpty(memberList)) {
                     // 检测gp系统用户是否存在
-                    GpUserInfoDto gpUserInfoDto = oneClickLoginModel.checkGpSystemUserIsExist(request, username, password, "PC");
+                    GpUserInfoDto gpUserInfoDto = oneClickLoginModel.checkGpSystemUserIsExist(request, username, password, "PC",memberType);
                     if (gpUserInfoDto == null) {
-                        AssertUtil.notEmpty(memberList, Language.translate("用户名或密码错误",Language.EN_LANGUAGE_TYPE));
-                        AssertUtil.isTrue(!memberList.get(0).getLoginPwd().equals(Md5.getMd5String(password)), Language.translate("用户名或密码错误",Language.EN_LANGUAGE_TYPE));
+                        AssertUtil.notEmpty(memberList, Language.translate("用户不存在",Language.EN_LANGUAGE_TYPE));
+                        AssertUtil.isTrue(!memberList.get(0).getLoginPwd().equals(Md5.getMd5String(password)), Language.translate("会员邮箱或密码错误",Language.EN_LANGUAGE_TYPE));
                     } else {
                         memberList = memberModel.getMemberList(memberExample, null);
                     }
                 } else {
-                    AssertUtil.notEmpty(memberList, Language.translate("用户名或密码错误",Language.EN_LANGUAGE_TYPE));
+                    AssertUtil.notEmpty(memberList, Language.translate("会员邮箱或密码错误",Language.EN_LANGUAGE_TYPE));
                     if (ssoType != null && ssoType == 1) {
-                        AssertUtil.isTrue(!memberList.get(0).getLoginPwd().equals(password), Language.translate("用户名或密码错误",Language.EN_LANGUAGE_TYPE));
+                        AssertUtil.isTrue(!memberList.get(0).getLoginPwd().equals(password), Language.translate("会员邮箱或密码错误",Language.EN_LANGUAGE_TYPE));
                     } else {
-                        oneClickLoginModel.checkGpSystemUserIsExist(request, username, password, "PC");
+                        oneClickLoginModel.checkGpSystemUserIsExist(request, username, password, "PC", memberType);
                         memberList = memberModel.getMemberList(memberExample, null);
-                        AssertUtil.isTrue(!memberList.get(0).getLoginPwd().equals(Md5.getMd5String(password)), Language.translate("用户名或密码错误",Language.EN_LANGUAGE_TYPE));
+                        AssertUtil.isTrue(!memberList.get(0).getLoginPwd().equals(Md5.getMd5String(password)), Language.translate("会员邮箱或密码错误",Language.EN_LANGUAGE_TYPE));
                     }
                 }
             } else {

+ 2 - 2
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/controller/sso/seller/SellerAuthController.java

@@ -98,14 +98,14 @@ public class SellerAuthController {
             List<Vendor> vendorList = vendorModel.getVendorList(vendorExample, null);
             if (CollectionUtils.isEmpty(vendorList)) {
                 // 检测gp系统用户是否存在
-                GpUserInfoDto gpUserInfoDto = oneClickLoginModel.checkGpSystemUserIsExist(request,username, password,"SELLER");
+                GpUserInfoDto gpUserInfoDto = oneClickLoginModel.checkGpSystemUserIsExist(request, username, password, "SELLER", null);
                 if (gpUserInfoDto == null) {
                     AssertUtil.notEmpty(vendorList, "用户名或密码错误");
                 } else {
                     vendorList = vendorModel.getVendorList(vendorExample, null);
                 }
             } else {
-                GpUserInfoDto gpUserInfoDto = oneClickLoginModel.checkGpSystemUserIsExist(request,username, password,"SELLER");
+                GpUserInfoDto gpUserInfoDto = oneClickLoginModel.checkGpSystemUserIsExist(request, username, password, "SELLER", null);
                 if (gpUserInfoDto == null) {
                     AssertUtil.notEmpty(vendorList, "用户名或密码错误");
                 } else {

+ 2 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/dto/GpUserInfoDto.java

@@ -35,4 +35,6 @@ public class GpUserInfoDto {
     private Long vendorId;
 
     private String statusMsg;
+
+    private String memberType;
 }

+ 7 - 0
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/MemberProductLookLogModel.java

@@ -3,6 +3,7 @@ package com.slodon.b2b2c.model.member;
 import com.slodon.b2b2c.core.exception.MallException;
 import com.slodon.b2b2c.core.i18n.Language;
 import com.slodon.b2b2c.core.response.PagerInfo;
+import com.slodon.b2b2c.core.util.AssertUtil;
 import com.slodon.b2b2c.core.util.StringUtil;
 import com.slodon.b2b2c.dao.read.goods.GoodsReadMapper;
 import com.slodon.b2b2c.dao.read.member.MemberProductLookLogReadMapper;
@@ -16,6 +17,7 @@ import com.slodon.b2b2c.member.example.MemberProductLookLogExample;
 import com.slodon.b2b2c.member.pojo.MemberFollowProduct;
 import com.slodon.b2b2c.member.pojo.MemberProductLookLog;
 import com.slodon.b2b2c.model.goods.GoodsExtendModel;
+import com.slodon.b2b2c.model.goods.GoodsModel;
 import com.slodon.b2b2c.vo.member.ProductLookLogVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -45,6 +47,8 @@ public class MemberProductLookLogModel {
     private MemberFollowProductModel memberFollowProductModel;
     @Resource
     private GoodsExtendModel goodsExtendModel;
+    @Resource
+    private GoodsModel goodsModel;
 
 
     /**
@@ -217,6 +221,9 @@ public class MemberProductLookLogModel {
                     if (!CollectionUtils.isEmpty(followProductList)) {
                         productLookLogInfo.setIsFollowProduct(true);
                     }
+                    Goods goods = goodsModel.getGoodsByGoodsId(productLookLog.getGoodsId());
+                    AssertUtil.notNull(goods, Language.translate("查询的商品信息为空",Language.EN_LANGUAGE_TYPE));
+                    productLookLogInfo.setState(goods.getState());
                     infos.add(productLookLogInfo);
                 });
                 vo.setProductLookLogInfoList(infos);

+ 10 - 2
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/advich/MemberEnquiryModel.java

@@ -6,6 +6,7 @@ import com.maxmind.db.CHMCache;
 import com.maxmind.geoip2.DatabaseReader;
 import com.maxmind.geoip2.exception.GeoIp2Exception;
 import com.maxmind.geoip2.model.CityResponse;
+import com.maxmind.geoip2.record.City;
 import com.maxmind.geoip2.record.Country;
 import com.maxmind.geoip2.record.Location;
 import com.maxmind.geoip2.record.Subdivision;
@@ -135,10 +136,17 @@ public class MemberEnquiryModel {
             if ("台湾".equals(country.getNames().get("zh-CN"))) {
                 dto.setCountryZhCN("中国台湾");
             }
+            if ("中华民国".equals(country.getNames().get("zh-CN"))) {
+                dto.setCountryZhCN("中国台湾");
+            }
             if ("澳门".equals(country.getNames().get("zh-CN"))) {
                 dto.setCountryZhCN("中国澳门");
             }
             dto.setCountryIsoCode(country.getIsoCode());
+            //城市
+            City city = response.getCity();
+            dto.setCityZhCN(city.getNames().get("zh-CN"));
+            dto.setCityIsoCode(StringUtil.isEmpty(city.getName()) ? country.getIsoCode() : city.getName());
             //省份
             Subdivision subdivision = response.getMostSpecificSubdivision();
             dto.setSubdivisionIsoCode(subdivision.getIsoCode());
@@ -597,10 +605,10 @@ public class MemberEnquiryModel {
                 try {
                     String[] siteParam = {siteName};
                     //定义参数值
-                    if(StringUtil.isEmpty(enquiry.getPhone())){
+                    if (StringUtil.isEmpty(enquiry.getPhone())) {
                         enquiry.setPhoneCode("");
                     }
-                    String[] templateArray = {enquiry.getName(), enquiry.getEmail(), enquiry.getCountry(),enquiry.getPhoneCode(), enquiry.getPhone(), enquiry.getQuantity() == null ? "-" : String.valueOf(enquiry.getQuantity()), enquiry.getMessage(), enquiry.getPageUrl()};
+                    String[] templateArray = {enquiry.getName(), enquiry.getEmail(), enquiry.getCountry(), enquiry.getPhoneCode(), enquiry.getPhone(), enquiry.getQuantity() == null ? "-" : String.valueOf(enquiry.getQuantity()), enquiry.getMessage(), enquiry.getPageUrl()};
                     sendHtmlMail(storeTpl.getEmailContent(), tos, siteParam, templateArray, pattern);
                 } catch (Exception e) {
                     log.error("[sendEnquiryInfo][发送邮件]:", e);

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

@@ -5,6 +5,7 @@ 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.i18n.Language;
+import com.slodon.b2b2c.core.random.RandomUtil;
 import com.slodon.b2b2c.core.uid.GoodsIdGenerator;
 import com.slodon.b2b2c.core.util.StringUtil;
 import com.slodon.b2b2c.dao.read.member.MemberReadMapper;
@@ -71,7 +72,7 @@ public class MemberRegisterActiveModel {
         } else {
             res = 1;
             sendEmailActiveLink(email);
-            saveEmailUserInfo(email, source);
+            saveEmailUserInfo(email, source, null);
         }
         return res;
     }
@@ -136,7 +137,7 @@ public class MemberRegisterActiveModel {
      * @param source
      */
     @Transactional(rollbackFor = Exception.class)
-    public void saveEmailUserInfo(String email, Integer source) {
+    public void saveEmailUserInfo(String email, Integer source,String memberType) {
         Member member = new Member();
         member.setMemberName(email);
 //        member.setMemberName(GoodsIdGenerator.getMemberName());
@@ -149,6 +150,7 @@ public class MemberRegisterActiveModel {
         member.setRegisterChannel(source);
         member.setMemberEmail(email);
         member.setIsEmailActive(0);
+        member.setMemberType(memberType);
         memberModel.saveMember(member);
     }
 
@@ -269,4 +271,91 @@ public class MemberRegisterActiveModel {
         String subject = Language.translate("注册成功", Language.EN_LANGUAGE_TYPE) + " " + pcDomainUrl.toUpperCase();
         msgSendModel.sendHtmlMail(email, subject, emailMsgTpl.toString());
     }
+
+    public Integer sendRegisterUserEmailVerificationCode(String email, Integer source,String memberType) {
+        int res = 0;
+        MemberExample example = new MemberExample();
+        example.setMemberEmail(email.toLowerCase());
+        example.setMemberType(memberType);
+        List<Member> memberList = memberReadMapper.listByExample(example);
+        if (CollectionUtil.isNotEmpty(memberList)) {
+            Member memberInfo = memberList.get(0);
+            if (memberInfo.getIsEmailActive() == 0) {
+                sendEmailRegisterVerificationCode(email, memberType);
+                res = 1;
+            } else {
+                res = 2;
+            }
+        } else {
+            res = 1;
+            sendEmailRegisterVerificationCode(email, memberType);
+            saveEmailUserInfo(email, source,memberType);
+        }
+        return res;
+    }
+
+    private void sendEmailRegisterVerificationCode(String email,String memberType) {
+        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 + ":memberType::" + memberType;
+        verifCode = RandomUtil.randomNumber(4);
+        stringRedisTemplate.opsForValue().set(activeEmailKey, verifCode, expireTime, TimeUnit.SECONDS);
+
+        StringBuffer emailMsgTpl = new StringBuffer();
+        emailMsgTpl.append(Language.translate("感谢您申请注册", Language.EN_LANGUAGE_TYPE) + "\r\n");
+        emailMsgTpl.append(Language.translate("验证码", Language.EN_LANGUAGE_TYPE));
+        emailMsgTpl.append(":" + verifCode);
+
+        String subject = Language.translate("欢迎注册", Language.EN_LANGUAGE_TYPE) + pcDomainUrl.toUpperCase() + "," + Language.translate("请验证您的邮箱", Language.EN_LANGUAGE_TYPE);
+        msgSendModel.sendHtmlMail(email, subject, emailMsgTpl.toString());
+    }
+
+    public Integer checkMemberUserInfo(String email, String memberType) {
+        int res = 0;
+        MemberExample memberExample = new MemberExample();
+        memberExample.setMemberEmail(email);
+        memberExample.setMemberType(memberType);
+        List<Member> memberList = memberReadMapper.listByExample(memberExample);
+        if (CollectionUtil.isNotEmpty(memberList)) {
+            Member memberInfo = memberList.get(0);
+            if (memberInfo.getIsEmailActive() == 1) {
+                sendEmailForgetPasswordVerificationCode(email, memberInfo.getMemberNickName(),memberType);
+                res = 1;
+            } else {
+                res = 2;
+            }
+        } else {
+            res = 3;
+        }
+        return res;
+    }
+
+    private void sendEmailForgetPasswordVerificationCode(String email, String nickName,String memberType) {
+        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 + ":memberType::" + memberType;
+        verifCode = RandomUtil.randomNumber(4);
+        stringRedisTemplate.opsForValue().set(forgetPwdEmailKey, verifCode, expireTime, TimeUnit.SECONDS);
+
+        StringBuffer emailMsgTpl = new StringBuffer(Language.translate("亲爱的", Language.EN_LANGUAGE_TYPE));
+        emailMsgTpl.append(StringUtil.isEmpty(nickName) ? email : nickName + ":" + "<br/>");
+        emailMsgTpl.append(Language.translate("验证码", Language.EN_LANGUAGE_TYPE));
+        emailMsgTpl.append(":" + verifCode);
+        emailMsgTpl.append("<br/>");
+        emailMsgTpl.append(Language.translate("如果您没有请求新密码,请忽略此邮件。", Language.EN_LANGUAGE_TYPE) + "<br/>");
+        emailMsgTpl.append(Language.translate("这是系统邮件,请不要回复。", Language.EN_LANGUAGE_TYPE) + "<br/>");
+        emailMsgTpl.append("<br/>");
+        emailMsgTpl.append(Language.translate("最好的问候", Language.EN_LANGUAGE_TYPE) + "<br/>");
+        emailMsgTpl.append(pcDomainUrl);
+        String subject = Language.translate("重设您的", Language.EN_LANGUAGE_TYPE) + pcDomainUrl.toUpperCase() + " " + Language.translate("帐户密码", Language.EN_LANGUAGE_TYPE);
+        msgSendModel.sendHtmlMail(email, subject, emailMsgTpl.toString());
+    }
 }

+ 11 - 2
xinkeaboard-server/b2b2c-web/src/main/java/com/slodon/b2b2c/model/member/advich/OneClickLoginModel.java

@@ -89,9 +89,11 @@ public class OneClickLoginModel {
      *
      * @param username
      * @param password
+     * @param source
+     * @param memberType
      */
-    public GpUserInfoDto checkGpSystemUserIsExist(HttpServletRequest request, String username, String password, String source) {
-        log.info("****** 开始链接绿道系统检测用户信息是否存在。username:{},password:{} ******", username, password);
+    public GpUserInfoDto checkGpSystemUserIsExist(HttpServletRequest request, String username, String password, String source, String memberType) {
+        log.info("****** 开始链接绿道系统检测用户信息是否存在。username:{},password:{},source:{},memberType:{}, ******", username, password, source, memberType);
         GpUserInfoDto gpUserInfoDto = null;
         String gpUserUrl = DomainUrlUtil.GP_SYSTEM_USER_NAME_PASSWORD_CHECK_API_URL;
         if (!"200".equals(getApiUrlStatus(gpUserUrl))) {
@@ -102,6 +104,9 @@ public class OneClickLoginModel {
         modelMap.put("username", username);
         modelMap.put("password", password);
         modelMap.put("source", source);
+        if("PC".equals(source)){
+            modelMap.put("memberType", memberType);
+        }
         String result = HttpUtil.post(gpUserUrl, modelMap);
         log.info("绿道系统返回信息:" + result);
 //        JSONObject jsonObject = JSONObject.parseObject(result).getJSONObject("code");
@@ -109,6 +114,9 @@ public class OneClickLoginModel {
         if (httpApiResult.getCode() == 200) {
             gpUserInfoDto = JSONObject.parseObject(JSON.toJSONString(httpApiResult.getData()), GpUserInfoDto.class);
             gpUserInfoDto.setPassword(password);
+            if("PC".equals(source)){
+                gpUserInfoDto.setMemberType(memberType);
+            }
             saveOrUpdatePcAndSellerUserInfo(request, source, gpUserInfoDto);
         }
         return gpUserInfoDto;
@@ -128,6 +136,7 @@ public class OneClickLoginModel {
         member.setMemberMobile(gpUserInfoDto.getUserPhone());
         member.setMemberEmail(gpUserInfoDto.getUserEmail());
         member.setGpUid(gpUserInfoDto.getUserId());
+        member.setMemberType(gpUserInfoDto.getMemberType());
 
         //查询会员信息
         MemberExample memberExample = new MemberExample();

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

@@ -63,6 +63,9 @@ public class FollowProductVO implements Serializable {
     @ApiModelProperty("商品自定义价格")
     private String goodsMoney;
 
+    @ApiModelProperty("商品状态:11-放入仓库无需审核;12-放入仓库审核通过;20-立即上架待审核;21-放入仓库待审核;3-上架(a. 审核通过上架,b. 不需要平台审核,商户创建商品后点击上架操作);4-审核驳回(平台驳回);5-商品下架(商户自行下架);6-违规下架(平台违规下架操作);7-已删除(状态1、5、6可以删除后进入此状态)")
+    private Integer state;
+
     public FollowProductVO(MemberFollowProduct memberFollowProduct, Store store, Goods goods) {
         followId = memberFollowProduct.getFollowId();
         productId = memberFollowProduct.getProductId();
@@ -78,6 +81,7 @@ public class FollowProductVO implements Serializable {
         isOwnStoreValue = dealIsOwnStoreValue(store.getIsOwnStore());
         salesNum = goods.getVirtualSales() + goods.getActualSales();
         goodsMoney = goods.getGoodsMoney();
+        state = goods.getState();
     }
 
     public static String dealIsOwnStoreValue(Integer isOwnStore) {

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

@@ -74,6 +74,9 @@ public class ProductLookLogVO implements Serializable {
         @ApiModelProperty("是否收藏商品:false 未收藏, true 收藏")
         private Boolean isFollowProduct;
 
+        @ApiModelProperty("商品状态:11-放入仓库无需审核;12-放入仓库审核通过;20-立即上架待审核;21-放入仓库待审核;3-上架(a. 审核通过上架,b. 不需要平台审核,商户创建商品后点击上架操作);4-审核驳回(平台驳回);5-商品下架(商户自行下架);6-违规下架(平台违规下架操作);7-已删除(状态1、5、6可以删除后进入此状态)")
+        private Integer state;
+
         public ProductLookLogInfo(MemberProductLookLog memberProductLookLog) {
             logId = memberProductLookLog.getLogId();
             memberId = memberProductLookLog.getMemberId();

+ 48 - 0
xinkeaboard-server/b2b2c-web/src/main/resources/mapper/write/member/MemberWriteMapper.xml

@@ -44,6 +44,9 @@
     <result column="gp_token" property="gpToken" />
     <result column="member_company" property="memberCompany" />
     <result column="member_main_product" property="memberMainProduct" />
+    <result column="country" property="country" />
+    <result column="city" property="city" />
+    <result column="member_type" property="memberType" />
   </resultMap>
   <!--除主键外的所有字段,用于插入操作-->
   <sql id="columns">
@@ -171,6 +174,15 @@
       <if test="memberMainProduct != null">
         `member_main_product`,
       </if>
+      <if test="country != null">
+        `country`,
+      </if>
+      <if test="city != null">
+        `city`,
+      </if>
+      <if test="memberType != null">
+        `member_type`,
+      </if>
     </trim>
   </sql>
   <!--按照主键值进行操作-->
@@ -331,6 +343,15 @@
         <if test="example.memberMainProduct != null">
           AND `member_main_product` = #{example.memberMainProduct}
         </if>
+        <if test="example.country != null">
+          AND `country` = #{example.country}
+        </if>
+        <if test="example.city != null">
+            AND `city` = #{example.city}
+        </if>
+        <if test="example.memberType != null">
+          AND `member_type` = #{example.memberType}
+        </if>
       </trim>
     </if>
   </sql>
@@ -579,6 +600,15 @@
       <if test="memberMainProduct != null">
         #{memberMainProduct},
       </if>
+      <if test="country != null">
+        #{country},
+      </if>
+      <if test="city != null">
+        #{city},
+      </if>
+      <if test="memberType != null">
+        #{memberType},
+      </if>
     </trim>
     )
   </insert>
@@ -709,6 +739,15 @@
       <if test="record.memberMainProduct != null">
         member_main_product = #{record.memberMainProduct},
       </if>
+      <if test="record.country != null">
+        `country` = #{record.country},
+      </if>
+      <if test="record.city != null">
+          `city` = #{record.city},
+      </if>
+      <if test="record.memberType != null">
+        member_type = #{record.memberType},
+      </if>
     </trim>
     <include refid="whereCondition" />
   </update>
@@ -839,6 +878,15 @@
       <if test="memberMainProduct != null">
         `member_main_product` = #{memberMainProduct},
       </if>
+      <if test="country != null">
+        `country` = #{country},
+      </if>
+      <if test="city != null">
+        `city` = #{city},
+      </if>
+      <if test="memberType != null">
+        `member_type` = #{memberType},
+      </if>
     </trim>
     WHERE `member_id` = #{memberId}
   </update>