|
@@ -1,14 +1,24 @@
|
|
package com.citu.module.menduner.system.service.user;
|
|
package com.citu.module.menduner.system.service.user;
|
|
|
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.lang.Assert;
|
|
import cn.hutool.core.util.IdUtil;
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
import com.citu.framework.common.enums.CommonStatusEnum;
|
|
import com.citu.framework.common.enums.CommonStatusEnum;
|
|
|
|
+import com.citu.framework.common.enums.TerminalEnum;
|
|
|
|
+import com.citu.framework.common.enums.UserTypeEnum;
|
|
import com.citu.framework.common.pojo.PageResult;
|
|
import com.citu.framework.common.pojo.PageResult;
|
|
import com.citu.framework.common.util.object.BeanUtils;
|
|
import com.citu.framework.common.util.object.BeanUtils;
|
|
-import com.citu.module.menduner.system.controller.admin.user.vo.MdeUserPageReqVO;
|
|
|
|
-import com.citu.module.menduner.system.controller.admin.user.vo.MdeUserSaveReqVO;
|
|
|
|
|
|
+import com.citu.module.menduner.system.controller.admin.user.vo.*;
|
|
|
|
+import com.citu.module.menduner.system.convert.MdeAuthConvert;
|
|
import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
|
|
import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
|
|
import com.citu.module.menduner.system.dal.mysql.user.MdeUserMapper;
|
|
import com.citu.module.menduner.system.dal.mysql.user.MdeUserMapper;
|
|
|
|
+import com.citu.module.system.api.sms.SmsCodeApi;
|
|
|
|
+import com.citu.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
|
|
|
+import com.citu.module.system.api.social.SocialClientApi;
|
|
|
|
+import com.citu.module.system.api.social.dto.SocialWxPhoneNumberInfoRespDTO;
|
|
|
|
+import com.citu.module.system.enums.sms.SmsSceneEnum;
|
|
|
|
+import com.google.common.annotations.VisibleForTesting;
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -18,7 +28,8 @@ import javax.annotation.Resource;
|
|
import java.time.LocalDateTime;
|
|
import java.time.LocalDateTime;
|
|
|
|
|
|
import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
-import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_USER_NOT_EXISTS;
|
|
|
|
|
|
+import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
|
|
|
|
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
|
|
|
|
|
|
/**
|
|
/**
|
|
* 门墩儿-用户登录 Service 实现类
|
|
* 门墩儿-用户登录 Service 实现类
|
|
@@ -35,7 +46,14 @@ public class MdeUserServiceImpl implements MdeUserService {
|
|
@Resource
|
|
@Resource
|
|
private PasswordEncoder passwordEncoder;
|
|
private PasswordEncoder passwordEncoder;
|
|
|
|
|
|
|
|
+ @Resource
|
|
|
|
+ private SmsCodeApi smsCodeApi;
|
|
|
|
+
|
|
|
|
+ @Resource
|
|
|
|
+ private SocialClientApi socialClientApi;
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
public Long createMdeUser(MdeUserSaveReqVO createReqVO) {
|
|
public Long createMdeUser(MdeUserSaveReqVO createReqVO) {
|
|
// 插入
|
|
// 插入
|
|
MdeUserDO mdeUser = BeanUtils.toBean(createReqVO, MdeUserDO.class);
|
|
MdeUserDO mdeUser = BeanUtils.toBean(createReqVO, MdeUserDO.class);
|
|
@@ -45,6 +63,7 @@ public class MdeUserServiceImpl implements MdeUserService {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
public void updateMdeUser(MdeUserSaveReqVO updateReqVO) {
|
|
public void updateMdeUser(MdeUserSaveReqVO updateReqVO) {
|
|
// 校验存在
|
|
// 校验存在
|
|
validateMdeUserExists(updateReqVO.getId());
|
|
validateMdeUserExists(updateReqVO.getId());
|
|
@@ -54,6 +73,7 @@ public class MdeUserServiceImpl implements MdeUserService {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
public void deleteMdeUser(Long id) {
|
|
public void deleteMdeUser(Long id) {
|
|
// 校验存在
|
|
// 校验存在
|
|
validateMdeUserExists(id);
|
|
validateMdeUserExists(id);
|
|
@@ -78,6 +98,7 @@ public class MdeUserServiceImpl implements MdeUserService {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
public void updateUserLogin(Long id, String loginIp) {
|
|
public void updateUserLogin(Long id, String loginIp) {
|
|
mdeUserMapper.updateById(new MdeUserDO().setId(id)
|
|
mdeUserMapper.updateById(new MdeUserDO().setId(id)
|
|
.setLoginIp(loginIp).setLoginDate(LocalDateTime.now()));
|
|
.setLoginIp(loginIp).setLoginDate(LocalDateTime.now()));
|
|
@@ -102,6 +123,7 @@ public class MdeUserServiceImpl implements MdeUserService {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
public MdeUserDO createUser(String avtar, String registerIp, Integer terminal) {
|
|
public MdeUserDO createUser(String avtar, String registerIp, Integer terminal) {
|
|
return createUser(null, avtar, registerIp, terminal);
|
|
return createUser(null, avtar, registerIp, terminal);
|
|
}
|
|
}
|
|
@@ -138,4 +160,115 @@ public class MdeUserServiceImpl implements MdeUserService {
|
|
private String encodePassword(String password) {
|
|
private String encodePassword(String password) {
|
|
return passwordEncoder.encode(password);
|
|
return passwordEncoder.encode(password);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
+ public MdeUserDO createUserIfAbsentH5(MdeUserCreatePhonePCReqVO reqVO) {
|
|
|
|
+ // 用户已经存在
|
|
|
|
+ MdeUserDO user = mdeUserMapper.selectByPhone(reqVO.getPhone());
|
|
|
|
+ if (user != null) {
|
|
|
|
+ return user;
|
|
|
|
+ }
|
|
|
|
+ // 用户不存在,则进行创建
|
|
|
|
+ return createUser(reqVO.getPhone(), null, getClientIP(), TerminalEnum.H5.getTerminal());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @VisibleForTesting
|
|
|
|
+ MdeUserDO validateUserExists(Long id) {
|
|
|
|
+ if (id == null) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ MdeUserDO user = mdeUserMapper.selectById(id);
|
|
|
|
+ if (user == null) {
|
|
|
|
+ throw exception(MDE_USER_NOT_EXISTS);
|
|
|
|
+ }
|
|
|
|
+ return user;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @VisibleForTesting
|
|
|
|
+ void validatePhoneUnique(Long id, String phone) {
|
|
|
|
+ if (StrUtil.isBlank(phone)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ MdeUserDO user = mdeUserMapper.selectByPhone(phone);
|
|
|
|
+ if (user == null) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // 如果 id 为空,说明不用比较是否为相同 id 的用户
|
|
|
|
+ if (id == null) {
|
|
|
|
+ throw exception(MDE_USER_MOBILE_USED, phone);
|
|
|
|
+ }
|
|
|
|
+ if (!user.getId().equals(id)) {
|
|
|
|
+ throw exception(MDE_USER_MOBILE_USED, phone);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
+ public void updateUserPhone(Long userId, MdeUserUpdatePhoneReqVO reqVO) {
|
|
|
|
+ // 1.1 检测用户是否存在
|
|
|
|
+ MdeUserDO user = validateUserExists(userId);
|
|
|
|
+ // 1.2 校验新手机是否已经被绑定
|
|
|
|
+ validatePhoneUnique(null, reqVO.getPhone());
|
|
|
|
+
|
|
|
|
+ // 2.1 校验旧手机和旧验证码
|
|
|
|
+ if (StrUtil.isNotEmpty(reqVO.getOldCode())) {
|
|
|
|
+ smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getPhone()).setCode(reqVO.getOldCode())
|
|
|
|
+ .setScene(SmsSceneEnum.MENDUNER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP())).getCheckedData();
|
|
|
|
+ }
|
|
|
|
+ // 2.2 使用新验证码
|
|
|
|
+ smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(reqVO.getPhone()).setCode(reqVO.getCode())
|
|
|
|
+ .setScene(SmsSceneEnum.MENDUNER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP())).getCheckedData();
|
|
|
|
+
|
|
|
|
+ // 3. 更新用户手机
|
|
|
|
+ mdeUserMapper.updateById(MdeUserDO.builder().id(userId).phone(reqVO.getPhone()).build());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void updateUserMobileByWeixin(Long userId, MdeUserUpdatePhoneByWeixinReqVO reqVO) {
|
|
|
|
+ // 1.1 获得对应的手机号信息
|
|
|
|
+ SocialWxPhoneNumberInfoRespDTO phoneNumberInfo = socialClientApi.getWxMaPhoneNumberInfo(
|
|
|
|
+ UserTypeEnum.MEMBER.getValue(), reqVO.getCode()).getCheckedData();
|
|
|
|
+ Assert.notNull(phoneNumberInfo, "获得手机信息失败,结果为空");
|
|
|
|
+ // 1.2 校验新手机是否已经被绑定
|
|
|
|
+ validatePhoneUnique(userId, phoneNumberInfo.getPhoneNumber());
|
|
|
|
+
|
|
|
|
+ // 2. 更新用户手机
|
|
|
|
+ mdeUserMapper.updateById(MdeUserDO.builder().id(userId).phone(phoneNumberInfo.getPhoneNumber()).build());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void updateUserPassword(Long userId, MdeUserUpdatePasswordReqVO reqVO) {
|
|
|
|
+ // 检测用户是否存在
|
|
|
|
+ MdeUserDO user = validateUserExists(userId);
|
|
|
|
+ // 校验验证码
|
|
|
|
+ smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getPhone()).setCode(reqVO.getCode())
|
|
|
|
+ .setScene(SmsSceneEnum.MEMBER_UPDATE_PASSWORD.getScene()).setUsedIp(getClientIP())).getCheckedData();
|
|
|
|
+
|
|
|
|
+ // 更新用户密码
|
|
|
|
+ mdeUserMapper.updateById(MdeUserDO.builder().id(userId)
|
|
|
|
+ .password(passwordEncoder.encode(reqVO.getPassword())).build());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private MdeUserDO validateUserExists(String mobile) {
|
|
|
|
+ MdeUserDO user = mdeUserMapper.selectByPhone(mobile);
|
|
|
|
+ if (user == null) {
|
|
|
|
+ throw exception(MDE_USER_MOBILE_NOT_EXISTS);
|
|
|
|
+ }
|
|
|
|
+ return user;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void resetUserPassword(MdeUserResetPasswordReqVO reqVO) {
|
|
|
|
+ // 检验用户是否存在
|
|
|
|
+ MdeUserDO user = validateUserExists(reqVO.getPhone());
|
|
|
|
+
|
|
|
|
+ // 使用验证码
|
|
|
|
+ smsCodeApi.useSmsCode(MdeAuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MENDUNER_RESET_PASSWORD,
|
|
|
|
+ getClientIP())).getCheckedData();
|
|
|
|
+
|
|
|
|
+ // 更新密码
|
|
|
|
+ mdeUserMapper.updateById(MdeUserDO.builder().id(user.getId())
|
|
|
|
+ .password(passwordEncoder.encode(reqVO.getPassword())).build());
|
|
|
|
+ }
|
|
}
|
|
}
|