|
@@ -2,16 +2,15 @@ package cn.iocoder.yudao.module.member.service.user;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.collection.ListUtil;
|
|
|
+import cn.hutool.core.lang.Assert;
|
|
|
import cn.hutool.core.util.*;
|
|
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
|
|
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
|
|
|
import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
|
|
|
-import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserResetPasswordReqVO;
|
|
|
-import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO;
|
|
|
-import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO;
|
|
|
-import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO;
|
|
|
+import cn.iocoder.yudao.module.member.controller.app.user.vo.*;
|
|
|
import cn.iocoder.yudao.module.member.convert.auth.AuthConvert;
|
|
|
import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
|
|
|
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
|
@@ -19,6 +18,8 @@ import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
|
|
|
import cn.iocoder.yudao.module.member.mq.producer.user.MemberUserProducer;
|
|
|
import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
|
|
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
|
|
+import cn.iocoder.yudao.module.system.api.social.SocialClientApi;
|
|
|
+import cn.iocoder.yudao.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO;
|
|
|
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
|
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
@@ -54,6 +55,9 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|
|
@Resource
|
|
|
private SmsCodeApi smsCodeApi;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private SocialClientApi socialClientApi;
|
|
|
+
|
|
|
@Resource
|
|
|
private PasswordEncoder passwordEncoder;
|
|
|
|
|
@@ -145,22 +149,38 @@ public class MemberUserServiceImpl implements MemberUserService {
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO) {
|
|
|
- // 检测用户是否存在
|
|
|
+ // 1.1 检测用户是否存在
|
|
|
MemberUserDO user = validateUserExists(userId);
|
|
|
- // 校验新手机是否已经被绑定
|
|
|
+ // 1.2 校验新手机是否已经被绑定
|
|
|
validateMobileUnique(null, reqVO.getMobile());
|
|
|
|
|
|
- // 校验旧手机和旧验证码
|
|
|
- smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getMobile()).setCode(reqVO.getOldCode())
|
|
|
- .setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP()));
|
|
|
- // 使用新验证码
|
|
|
+ // 2.1 校验旧手机和旧验证码
|
|
|
+ // 补充说明:从安全性来说,老手机也校验 oldCode 验证码会更安全。但是由于 uni-app 商城界面暂时没做,所以这里不强制校验
|
|
|
+ if (StrUtil.isNotEmpty(reqVO.getOldCode())) {
|
|
|
+ smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getMobile()).setCode(reqVO.getOldCode())
|
|
|
+ .setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP()));
|
|
|
+ }
|
|
|
+ // 2.2 使用新验证码
|
|
|
smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(reqVO.getMobile()).setCode(reqVO.getCode())
|
|
|
.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP()));
|
|
|
|
|
|
- // 更新用户手机
|
|
|
+ // 3. 更新用户手机
|
|
|
memberUserMapper.updateById(MemberUserDO.builder().id(userId).mobile(reqVO.getMobile()).build());
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void updateUserMobileByWeixin(Long userId, AppMemberUserUpdateMobileByWeixinReqVO reqVO) {
|
|
|
+ // 1.1 获得对应的手机号信息
|
|
|
+ SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo(
|
|
|
+ UserTypeEnum.MEMBER.getValue(), reqVO.getCode());
|
|
|
+ Assert.notNull(phoneNumberInfo, "获得手机信息失败,结果为空");
|
|
|
+ // 1.2 校验新手机是否已经被绑定
|
|
|
+ validateMobileUnique(userId, phoneNumberInfo.getPhoneNumber());
|
|
|
+
|
|
|
+ // 2. 更新用户手机
|
|
|
+ memberUserMapper.updateById(MemberUserDO.builder().id(userId).mobile(phoneNumberInfo.getPhoneNumber()).build());
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO) {
|
|
|
// 检测用户是否存在
|