From f060439c675cb9185252cfc8f034853290863c62 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期一, 31 三月 2025 09:45:39 +0800 Subject: [PATCH] fix 登录 --- src/main/java/com/mzl/flower/web/login/CustomerLoginController.java | 71 +++++++++++++++++ src/main/java/com/mzl/flower/dto/request/UserLoginDTO.java | 6 + src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java | 19 ++++ src/main/java/com/mzl/flower/service/register/SmsService.java | 18 ++-- src/main/java/com/mzl/flower/service/system/UserService.java | 119 +++++++++++++++++++++-------- 5 files changed, 192 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/mzl/flower/dto/request/UserLoginDTO.java b/src/main/java/com/mzl/flower/dto/request/UserLoginDTO.java index 7ab2151..fb52515 100644 --- a/src/main/java/com/mzl/flower/dto/request/UserLoginDTO.java +++ b/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; + + } diff --git a/src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java b/src/main/java/com/mzl/flower/dto/request/UserPhoneLoginDTO.java new file mode 100644 index 0000000..9464958 --- /dev/null +++ b/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; + + +} diff --git a/src/main/java/com/mzl/flower/service/register/SmsService.java b/src/main/java/com/mzl/flower/service/register/SmsService.java index 3d6f730..61e3e75 100644 --- a/src/main/java/com/mzl/flower/service/register/SmsService.java +++ b/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 发送短信 } diff --git a/src/main/java/com/mzl/flower/service/system/UserService.java b/src/main/java/com/mzl/flower/service/system/UserService.java index 2f0febf..8325c73 100644 --- a/src/main/java/com/mzl/flower/service/system/UserService.java +++ b/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; + } + + } diff --git a/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java b/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java index f0b1510..ee32007 100644 --- a/src/main/java/com/mzl/flower/web/login/CustomerLoginController.java +++ b/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(),"登录错误"); + } + } } -- Gitblit v1.9.3