From 0e12e4ab45db6768a0f45d8952f78b0ae9190723 Mon Sep 17 00:00:00 2001
From: ZQN <364596817@qq.com>
Date: 星期一, 19 五月 2025 16:09:01 +0800
Subject: [PATCH] 手机号登录,去掉短信验证。脱敏

---
 project-framework/src/main/java/com/project/framework/web/service/SysLoginService.java |  214 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 187 insertions(+), 27 deletions(-)

diff --git a/project-framework/src/main/java/com/project/framework/web/service/SysLoginService.java b/project-framework/src/main/java/com/project/framework/web/service/SysLoginService.java
index 1f8d563..e622e67 100644
--- a/project-framework/src/main/java/com/project/framework/web/service/SysLoginService.java
+++ b/project-framework/src/main/java/com/project/framework/web/service/SysLoginService.java
@@ -1,20 +1,23 @@
 package com.project.framework.web.service;
 
-import javax.annotation.Resource;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.stereotype.Component;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.aliyuncs.CommonRequest;
+import com.aliyuncs.CommonResponse;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.http.MethodType;
+import com.aliyuncs.profile.DefaultProfile;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.project.common.constant.AliyunSmsConstants;
 import com.project.common.constant.CacheConstants;
 import com.project.common.constant.Constants;
 import com.project.common.core.domain.entity.SysUser;
 import com.project.common.core.domain.model.LoginUser;
 import com.project.common.core.redis.RedisCache;
 import com.project.common.exception.ServiceException;
+import com.project.common.exception.base.BaseException;
 import com.project.common.exception.user.CaptchaException;
 import com.project.common.exception.user.CaptchaExpireException;
 import com.project.common.exception.user.UserPasswordNotMatchException;
@@ -26,36 +29,44 @@
 import com.project.framework.manager.AsyncManager;
 import com.project.framework.manager.factory.AsyncFactory;
 import com.project.framework.security.context.AuthenticationContextHolder;
+import com.project.system.domain.bo.editBo.UserPhoneLoginBo;
+import com.project.system.mapper.SysUserMapper;
 import com.project.system.service.ISysConfigService;
 import com.project.system.service.ISysUserService;
+import com.project.system.sms.YPSmsApi;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.stereotype.Component;
+
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 鐧诲綍鏍¢獙鏂规硶
- * 
+ *
  * @author project
  */
 @Component
 @Slf4j
+@RequiredArgsConstructor
 public class SysLoginService
 {
-    @Autowired
-    private TokenService tokenService;
+    private final TokenService tokenService;
+    private final AuthenticationManager authenticationManager;
+    private final RedisCache redisCache;
+    private final ISysUserService userService;
+    private final SysUserMapper userMapper;
+    private final ISysConfigService configService;
+    private final YPSmsApi smsApi;
 
-    @Resource
-    private AuthenticationManager authenticationManager;
-
-    @Autowired
-    private RedisCache redisCache;
-    
-    @Autowired
-    private ISysUserService userService;
-
-    @Autowired
-    private ISysConfigService configService;
 
     /**
      * 鐧诲綍楠岃瘉
-     * 
+     *
      * @param username 鐢ㄦ埛鍚�
      * @param password 瀵嗙爜
      * @param code 楠岃瘉鐮�
@@ -71,7 +82,7 @@
             validateCaptcha(username, code, uuid);
         }
         // 鐢ㄦ埛楠岃瘉
-        Authentication authentication = null;
+        Authentication authentication;
         try
         {
             UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
@@ -105,12 +116,126 @@
     }
 
     /**
+     * 鏂版敞鍐岃幏鍙栭獙璇佺爜
+     * @param phone 鎵嬫満
+     * @return  楠岃瘉鐮�
+     */
+    public Boolean getVerifyCodeNew(String phone) {
+        // 鐢熸垚4浣嶉殢鏈烘暟
+        String code = "";
+        Random ran = new Random();
+        int randomNum = ran.nextInt(10000);
+        code = String.format("%04d", randomNum);
+        log.info("鎵嬫満鍙凤細"+phone+"->楠岃瘉鐮侊細"+code);
+        boolean send = sendYp(phone, code);
+        if (send){
+            redisCache.setCacheObject(getCacheKey(phone), code, Constants.PHONE_EXPIRATION, TimeUnit.MINUTES);
+            return true;
+        }
+        redisCache.setCacheObject(getCacheKey(phone), code, Constants.PHONE_EXPIRATION, TimeUnit.MINUTES);
+        return false;
+    }
+
+    /**
+     * 鑾峰彇楠岃瘉鐮�
+     * @param phone 鎵嬫満鍙�
+     * @return  楠岃瘉鐮�
+     */
+    public Boolean getVerifyCode(String phone)
+    {
+        SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber,phone));
+        if (user==null){
+            throw new BaseException("鎮ㄦ墜鏈哄彿灏氭湭娉ㄥ唽锛�");
+        }
+        return getVerifyCodeNew(phone);
+    }
+
+    /**
+     * 浜戠墖楠岃瘉鐮�
+     * @param phone 鎵嬫満
+     * @param code  楠岃瘉鐮�
+     * @return  缁撴灉
+     */
+    private boolean sendYp(String phone, String code)
+    {
+        String result = smsApi.sendSms(phone, StringUtils.format(YPSmsApi.CODE_TMP, code, Constants.PHONE_EXPIRATION));
+        if (result.contains("\"code\":0,\"msg\":\"OK\"")){
+            log.info("鍙戦�佹垚鍔� ->楠岃瘉鐮侊細"+code);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 闃块噷楠岃瘉鐮�
+     * @param phone 鎵嬫満
+     * @param code  楠岃瘉鐮�
+     * @return  缁撴灉
+     */
+    private boolean sendAl(String phone, String code )
+    {
+        DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", AliyunSmsConstants.SMS_APPID, AliyunSmsConstants.SMS_SECRET);
+        IAcsClient client = new DefaultAcsClient(profile);
+        CommonRequest request = new CommonRequest();
+        request.setMethod(MethodType.POST);
+        request.setDomain("dysmsapi.aliyuncs.com");
+        request.setVersion("2017-05-25");
+        request.setAction("SendSms");
+        request.putQueryParameter("PhoneNumbers", phone);
+        request.putQueryParameter("SignName", "鐩涘晢鐝犲疂");
+        request.putQueryParameter("TemplateCode", "SMS_460945884");
+        request.putQueryParameter("TemplateParam", "{code:" + code + "}");
+        try {
+            CommonResponse response = client.getCommonResponse(request);
+            JSONObject jsonObject = JSON.parseObject(response.getData());
+            if ("OK".equals(jsonObject.get("Code"))) {
+                log.info("鍙戦�佹垚鍔� ->楠岃瘉鐮侊細"+code);
+                return true;
+            }
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 楠岃瘉鐮佺櫥褰�
+     * @param bo    鍙傛暟
+     * @return  缁撴灉
+     */
+    public String phoneLogin(UserPhoneLoginBo bo)
+    {
+        String phone = bo.getPhone();
+//        Boolean verified = verifyPhone(phone, bo.getCode());
+//        if (!verified){
+//            throw new BaseException("鎵嬫満鍙烽獙璇佺爜鏍¢獙澶辫触锛�");
+//        }
+        SysUser user = null;
+        if ("01".equals(bo.getUserType())){
+            user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+                    .eq(SysUser::getPhonenumber,bo.getPhone())
+                    .and(wrapper->wrapper.eq(SysUser::getUserType,"00").or().eq(SysUser::getUserType, "01")));
+        } else {
+            user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
+                    .eq(SysUser::getPhonenumber,bo.getPhone())
+                    .eq(SysUser::getUserType,bo.getUserType())
+                    );
+        }
+        if (user==null){
+            throw new BaseException("鎮ㄦ墜鏈哄彿灏氭湭娉ㄥ唽鎴栨偍閫夋嫨鐧诲綍绫诲瀷鏈夎锛�");
+        }
+        if (!"0".equals(user.getStatus())){
+            throw new BaseException("鎮ㄨ处鍙峰凡鍋滅敤鎴栧緟瀹℃壒锛岃鑱旂郴钀ュ晢鍔炵鐞嗕汉鍛橈紒");
+        }
+        return this.login(user.getUserName(), user.getRecommendUser(), null, null);
+    }
+
+    /**
      * 鏍¢獙楠岃瘉鐮�
-     * 
+     *
      * @param username 鐢ㄦ埛鍚�
      * @param code 楠岃瘉鐮�
      * @param uuid 鍞竴鏍囪瘑
-     * @return 缁撴灉
      */
     public void validateCaptcha(String username, String code, String uuid)
     {
@@ -142,4 +267,39 @@
         sysUser.setLoginDate(DateUtils.getNowDate());
         userService.updateUserProfile(sysUser);
     }
+
+
+    /**
+     * 鑾峰彇楠岃瘉鐮佸墠缂�
+     * @param phone 鎵嬫満鍙�
+     * @return  楠岃瘉鐮�
+     */
+    private String getCacheKey(String phone)
+    {
+        return CacheConstants.PHONE_CODE_KEY + phone;
+    }
+
+    /**
+     * 鏍¢獙楠岃瘉鐮�
+     * @param phone 鎵嬫満鍙�
+     * @param code  楠岃瘉鐮�
+     * @return  鏍¢獙缁撴灉
+     */
+    public Boolean verifyPhone(String phone, String code)
+    {
+        String key = getCacheKey(phone);
+        if (!redisCache.hasKey(key)) {
+            return false;
+        }
+        String redisCode = redisCache.getCacheObject(key);
+
+        boolean verify = redisCode.equals(code);
+        if (verify){
+            redisCache.deleteObject(getCacheKey(phone));
+        }
+
+        return verify;
+    }
+
+
 }

--
Gitblit v1.9.1