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