From 5997dc8acfa81a6c867c28810d1c3c9714efc46c Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期六, 29 三月 2025 14:55:42 +0800 Subject: [PATCH] fix: 登录 --- src/main/java/com/mzl/flower/web/supplier/SupplierController.java | 8 +- 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 | 14 ++-- src/main/resources/application-test.yml | 2 src/main/java/com/mzl/flower/service/system/UserService.java | 53 +++++++++++++++++ 7 files changed, 162 insertions(+), 11 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..bd8bf1e 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); +// 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("短信发送失败"); - } +// } 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..62a34f5 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; @@ -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..2314b40 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(),"登录错误"); + } + } } diff --git a/src/main/java/com/mzl/flower/web/supplier/SupplierController.java b/src/main/java/com/mzl/flower/web/supplier/SupplierController.java index 79c4d87..e0671a2 100644 --- a/src/main/java/com/mzl/flower/web/supplier/SupplierController.java +++ b/src/main/java/com/mzl/flower/web/supplier/SupplierController.java @@ -33,7 +33,7 @@ @Slf4j public class SupplierController extends BaseController { - private static final R ALLOWED_CONTENT_TYPES = R.valueOf("jpg"); +// private static final R ALLOWED_CONTENT_TYPES = R.valueOf("jpg"); private final SupplierService supplierService; public SupplierController(SupplierService supplierService) { @@ -74,9 +74,9 @@ // 2. 检查文件类型 String contentType = avatar.getContentType(); - if (!ALLOWED_CONTENT_TYPES.contains(contentType)) { - throw new ValidationException("不支持的文件类型"); - } +// if (!ALLOWED_CONTENT_TYPES.contains(contentType)) { +// throw new ValidationException("不支持的文件类型"); +// } // 3. 生成文件名 String fileName = "avatar/" + UUID.randomUUID().toString() + diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index df7197a..95fecd6 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -3,7 +3,7 @@ active: test,swagger datasource: type: com.alibaba.druid.pool.DruidDataSource - url: jdbc:mysql://47.96.225.205:3306/flower1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8&allowMultiQueries=true + url: jdbc:mysql://47.96.225.205:3306/smart_message?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8&allowMultiQueries=true username: root password: CloudRoam druid: -- Gitblit v1.9.3