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