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