src/main/java/com/mzl/flower/dto/request/UserLoginDTO.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mzl/flower/service/register/SmsService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mzl/flower/service/system/UserService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/mzl/flower/web/login/CustomerLoginController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/mzl/flower/dto/request/UserLoginDTO.java
@@ -21,4 +21,10 @@ @ApiModelProperty(value = "图形验证码id") private String codeId; @ApiModelProperty(value = "用户类型") private String userType; } src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java
对比新文件 @@ -0,0 +1,19 @@ package com.mzl.flower.dto.request; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class UserPhoneLoginDTO { @ApiModelProperty(value = "用户名/手机号码", required = true) private String username; @ApiModelProperty(value = "短信验证码") private String smsCode; @ApiModelProperty(value = "用户类型") private String userType; } src/main/java/com/mzl/flower/service/register/SmsService.java
@@ -50,7 +50,8 @@ if(existsCode(dto.getTel())){ throw new ValidationException("短信验证码已发送,请勿频繁发送"); } String smsCode = generateSmsCode(); // String smsCode = generateSmsCode(); String smsCode ="888888"; String key; if(Constants.USER_TYPE.admin.name().equals(dto.getUserType())){ key = SMS_CODE_KEY + SEPARATOR + Constants.USER_TYPE.admin.name() + SEPARATOR + dto.getTel(); @@ -66,13 +67,14 @@ Map<String, String> paramMap = new HashMap<>(); paramMap.put("code", smsCode); try { SmsUtil.sendSms(dto.getTel(),smsProperties.getVerificationCode(),paramMap); stringCacheClient.set(SMS_CODE_KEY + SEPARATOR + SEPARATOR + dto.getTel(),smsCode,60); stringCacheClient.set(key,smsCode,600); } catch (ClientException e) { throw new RuntimeException("短信发送失败"); } // try { // //暂时不实际发送验证码 // SmsUtil.sendSms(dto.getTel(),smsProperties.getVerificationCode(),paramMap); stringCacheClient.set(SMS_CODE_KEY + SEPARATOR + SEPARATOR + dto.getTel(),smsCode,60); stringCacheClient.set(key,smsCode,600); // } catch (ClientException e) { // throw new RuntimeException("短信发送失败"); // } //todo 发送短信 } src/main/java/com/mzl/flower/service/system/UserService.java
@@ -8,6 +8,8 @@ import com.mzl.flower.constant.Constants; import com.mzl.flower.dto.request.BindWechatDTO; import com.mzl.flower.dto.request.CreateWechatUserDTO; import com.mzl.flower.dto.request.UserLoginDTO; import com.mzl.flower.dto.request.UserPhoneLoginDTO; import com.mzl.flower.dto.request.customer.UpdateCustomerDTO; import com.mzl.flower.dto.request.system.*; import com.mzl.flower.dto.response.current.CurrentUserDTO; @@ -534,41 +536,41 @@ // 获取锁,最多等待 10 秒,锁自动释放时间 30 秒 if (lock.tryLock(10, 30, TimeUnit.SECONDS)) { try{ // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在 if (StringUtils.isEmpty(dto.getPurePhoneNumber()) && StringUtils.isEmpty(dto.getPhoneNumber())) { throw new ValidationException("微信获取的电话号码为空!无法注册"); } // 1:查看用户存在不存在 List<String> userTypes = new ArrayList<>(); userTypes.add(dto.getUserType()); User user = findByLoginName(dto.getPurePhoneNumber(), userTypes); if (ObjectUtils.isEmpty(user)) { // 是新用户,需要注册 user = new User(); user.setId(UUIDGenerator.getUUID()); user.setLoginName(dto.getPurePhoneNumber()); user.setTel(dto.getPurePhoneNumber()); user.setNickName(dto.getPurePhoneNumber()); user.setPassword(passwordEncoder.encode("12345678")); user.setType(dto.getUserType()); user.setStatus(Constants.STATUS_ACTIVE); user.setIsSys(Constants.N); user.create(); userMapper.insert(user); // 注册商户信息 UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO(); updateCustomerDTO.setUserId(user.getId()); if (StringUtils.isNotBlank(dto.getPurePhoneNumber())) { updateCustomerDTO.setName("花满芫-" + dto.getPurePhoneNumber().substring(dto.getPurePhoneNumber().length() - 4)); // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在 if (StringUtils.isEmpty(dto.getPurePhoneNumber()) && StringUtils.isEmpty(dto.getPhoneNumber())) { throw new ValidationException("微信获取的电话号码为空!无法注册"); } customerService.addOrUpdateCustomer(updateCustomerDTO); } // 1:查看用户存在不存在 List<String> userTypes = new ArrayList<>(); userTypes.add(dto.getUserType()); User user = findByLoginName(dto.getPurePhoneNumber(), userTypes); if (ObjectUtils.isEmpty(user)) { // 是新用户,需要注册 user = new User(); user.setId(UUIDGenerator.getUUID()); user.setLoginName(dto.getPurePhoneNumber()); user.setTel(dto.getPurePhoneNumber()); user.setNickName(dto.getPurePhoneNumber()); user.setPassword(passwordEncoder.encode("12345678")); user.setType(dto.getUserType()); user.setStatus(Constants.STATUS_ACTIVE); user.setIsSys(Constants.N); user.create(); userMapper.insert(user); BindWechatDTO wechatDTO = new BindWechatDTO(); wechatDTO.setRealName(dto.getPurePhoneNumber()); bindWechat(user.getId(), dto.getOpenId(), dto.getUnionId(), dto.getSessionKey(), wechatDTO); // 注册商户信息 UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO(); updateCustomerDTO.setUserId(user.getId()); if (StringUtils.isNotBlank(dto.getPurePhoneNumber())) { updateCustomerDTO.setName("花满芫-" + dto.getPurePhoneNumber().substring(dto.getPurePhoneNumber().length() - 4)); } customerService.addOrUpdateCustomer(updateCustomerDTO); } BindWechatDTO wechatDTO = new BindWechatDTO(); wechatDTO.setRealName(dto.getPurePhoneNumber()); bindWechat(user.getId(), dto.getOpenId(), dto.getUnionId(), dto.getSessionKey(), wechatDTO); }finally { lock.unlock(); } @@ -586,4 +588,55 @@ } public User registPhoneUser(UserPhoneLoginDTO dto) { String RETISTER_KEY = "%s_%s"; RLock lock = redissonClient.getLock(String.format(RETISTER_KEY, dto.getUsername(), dto.getUserType())); try { // 获取锁,最多等待 10 秒,锁自动释放时间 30 秒 if (lock.tryLock(10, 30, TimeUnit.SECONDS)) { try { // 其次查找当前loginName是prephonenume的,userType是customer的用户存在不存在 if (StringUtils.isEmpty(dto.getUsername()) && StringUtils.isEmpty(dto.getUsername())) { throw new ValidationException("电话号码为空!无法注册"); } // 1:查看用户存在不存在 List<String> userTypes = new ArrayList<>(); userTypes.add(dto.getUserType()); User user = findByLoginName(dto.getUsername(), userTypes); if (ObjectUtils.isEmpty(user)) { // 是新用户,需要注册 user = new User(); user.setId(UUIDGenerator.getUUID()); user.setLoginName(dto.getUsername()); user.setTel(dto.getUsername()); user.setNickName(dto.getUsername()); user.setPassword(passwordEncoder.encode("12345678")); user.setType(dto.getUserType()); user.setStatus(Constants.STATUS_ACTIVE); user.setIsSys(Constants.N); user.create(); userMapper.insert(user); // 注册商户信息 UpdateCustomerDTO updateCustomerDTO = new UpdateCustomerDTO(); updateCustomerDTO.setUserId(user.getId()); if (StringUtils.isNotBlank(dto.getUsername())) { updateCustomerDTO.setName("智信-" + dto.getUsername().substring(dto.getUsername().length() - 4)); } customerService.addOrUpdateCustomer(updateCustomerDTO); return user; } } finally { lock.unlock(); } } } catch (InterruptedException e) { throw new RuntimeException(e); } return null; } } src/main/java/com/mzl/flower/web/login/CustomerLoginController.java
@@ -14,6 +14,7 @@ import com.mzl.flower.constant.Constants; import com.mzl.flower.dto.request.CreateWechatUserDTO; import com.mzl.flower.dto.request.UserLoginDTO; import com.mzl.flower.dto.request.UserPhoneLoginDTO; import com.mzl.flower.dto.response.customer.CustomerDTO; import com.mzl.flower.dto.response.wx.WxUserVO; import com.mzl.flower.entity.system.User; @@ -259,4 +260,74 @@ } } } @PostMapping("/login/customer/phone/v2") @ApiOperation(value = "手机验证码登录系统", notes = "手机验证码登录系统") public ResponseEntity<ReturnDataDTO<OAuth2AccessToken>> loginPhoneV2(HttpServletRequest request, @RequestBody UserPhoneLoginDTO loginDTO) { String tel = loginDTO.getUsername(); String smsCode = loginDTO.getSmsCode(); if (StringUtils.isBlank(tel)) { throw new ValidationException("手机号码不能为空"); } if (StringUtils.isBlank(smsCode)) { throw new ValidationException("手机验证码不能为空"); } //从缓存中获取验证码 String smsCacheCode = stringCacheClient.get(SMS_CODE_KEY + SEPARATOR + Constants.USER_TYPE.customer.name() + SEPARATOR + tel); if (!StringUtils.equals(smsCode, smsCacheCode)) { throw new ValidationException("手机验证码不正确"); } User user = userService.findByTel(tel, Constants.USER_TYPE.customer.name()); String tokenCache =""; if(user == null){ loginDTO.setUserType(Constants.USER_TYPE.customer.name()); User user1 = userService.registPhoneUser(loginDTO); if(org.springframework.util.StringUtils.isEmpty(user1)){ throw new ValidationException("注册用户信息报错"); } tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user1.getId()); CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(user1.getId()); if (ObjectUtils.isEmpty(currentCustomer)) { throw new ValidationException("用户不存在"); } if (currentCustomer.getIsEnabled() == false) { throw new ValidationException("用户已禁用,请联系管理员"); } tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user1.getId()); if (StringUtils.isNotBlank(tokenCache)) { //强制删除token,下线 removeToken(tokenCache,user.getId()); } }else{ CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(user.getId()); if (ObjectUtils.isEmpty(currentCustomer)) { throw new ValidationException("用户不存在"); } if (currentCustomer.getIsEnabled() == false) { throw new ValidationException("用户已禁用,请联系管理员"); } tokenCache = stringCacheClient.get(TOKEN_KEY + SEPARATOR + user.getId()); if (StringUtils.isNotBlank(tokenCache)) { //强制删除token,下线 removeToken(tokenCache,user.getId()); } } try { PhoneAuthenticationToken authRequest = new PhoneAuthenticationToken(tel, smsCode, Constants.USER_TYPE.customer.name()); authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); Authentication authentication = authenticationManager.authenticate(authRequest); OAuth2AccessToken token = loginService.getAccessToken(authentication, Constants.USER_TYPE.customer.name()); //删除缓存中的验证码 stringCacheClient.delete(SMS_CODE_KEY + SEPARATOR + Constants.USER_TYPE.customer.name() + SEPARATOR + tel); stringCacheClient.set(TOKEN_KEY + SEPARATOR + user.getId(),token.getValue()); return returnData(R.SUCCESS.getCode(),token); }catch (UsernameNotFoundException e){ throw new ValidationException("用户不存在"); }catch (Exception e) { log.error(e.getMessage(), e); throw new BaseException(R.RUNTIME_EXCEPTION.getCode(),"登录错误"); } } }