Browse Source

增加二维码扫码登录

guoenzhou 2 years ago
parent
commit
3d33a126e9

+ 5 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SendSmsController.java

@@ -1,13 +1,13 @@
 package com.usky.system.controller.web;
 
 
-import com.alibaba.nacos.shaded.com.google.gson.Gson;
 import com.aliyuncs.DefaultAcsClient;
 import com.aliyuncs.IAcsClient;
 import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
 import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
 import com.aliyuncs.exceptions.ClientException;
 import com.aliyuncs.profile.DefaultProfile;
+import com.google.gson.Gson;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.redis.core.RedisHelper;
 import com.usky.system.domain.SysMobileTenantConfig;
@@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.RestController;
 import java.rmi.ServerException;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.TimeUnit;
 
 /**
  * <p>
@@ -59,5 +60,8 @@ public class SendSmsController {
         return ApiResult.success();
     }
 
+
+
+
 }
 

+ 28 - 10
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/TokenController.java

@@ -4,6 +4,7 @@ import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.util.BeanMapperUtils;
 import com.usky.common.core.util.JwtUtils;
 import com.usky.common.core.util.StringUtils;
+import com.usky.common.redis.core.RedisHelper;
 import com.usky.common.security.auth.AuthUtil;
 import com.usky.common.security.service.TokenService;
 import com.usky.common.security.utils.SecurityUtils;
@@ -20,10 +21,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 /**
  * token 控制
@@ -71,14 +70,27 @@ public class TokenController {
     }
 
 
-    @PostMapping("login1")
-    public ApiResult<?> login1(@RequestBody LoginBody form) {
-        // 用户登录
-        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(), form.getTenantId());
-        // 获取登录token
-        return ApiResult.success(tokenService.createToken(userInfo));
+    //手机端发送扫码信息,二维码编号,用户名信息
+    @GetMapping("getQrCodeResult")
+    public ApiResult<String> getQrCodeResult(@RequestParam String qrCode){
+        String qrCodeResult = sysLoginService.getQrCodeResult(qrCode);
+        return ApiResult.success(qrCodeResult);
     }
 
+    //PC通过二维码编号获取用户登录授权
+
+    //
+
+
+
+//    @PostMapping("login1")
+//    public ApiResult<?> login1(@RequestBody LoginBody form) {
+//        // 用户登录
+//        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(), form.getTenantId());
+//        // 获取登录token
+//        return ApiResult.success(tokenService.createToken(userInfo));
+//    }
+
     @DeleteMapping("logout")
     public ApiResult<?> logout(HttpServletRequest request) {
         String token = SecurityUtils.getToken(request);
@@ -130,4 +142,10 @@ public class TokenController {
 //        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword());
 //        return ApiResult.success();
 //    }
+
+    @GetMapping("/qrCodeSend")
+    public ApiResult<Void> qrCodeSend(@RequestParam String userName, @RequestParam String qrCode,@RequestParam Integer tenantId) {
+        sysLoginService.qrCodeSend(userName,qrCode,tenantId);
+        return ApiResult.success();
+    }
 }

+ 46 - 6
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/SysLoginService.java

@@ -4,21 +4,24 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.usky.common.core.constants.Constants;
-import com.usky.common.core.util.IpUtils;
-import com.usky.common.core.util.ServletUtils;
+import com.usky.common.core.util.*;
 import com.usky.common.redis.core.RedisHelper;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.exception.BusinessException;
-import com.usky.common.core.util.BeanMapperUtils;
-import com.usky.common.core.util.StringUtils;
+import com.usky.system.RuoYiSystemApplication;
 import com.usky.system.domain.*;
 import com.usky.system.domain.constants.UserConstants;
 import com.usky.system.model.LoginUser;
 import com.usky.system.service.enums.UserStatus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 登录校验方法
@@ -43,6 +46,11 @@ public class SysLoginService {
     @Autowired
     private  SysTenantService sysTenantService;
 
+
+    public final String LOGIN_QRCODE_VERIFY ="login_qrcode_verify";
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(SysLoginService.class);
+
     /**
      * 登录
      */
@@ -109,7 +117,7 @@ public class SysLoginService {
 
     public SysUser appLogin(String username, String password, Integer tenantId, String phone, String verify) {
         SysUser loginUser = new SysUser();
-        if (!StringUtils.isBlank(username)) {
+        if (!StringUtils.isBlank(username) && !StringUtils.isBlank(password)) {
             // 用户名或密码为空 错误
             if (StringUtils.isAnyBlank(username, password)) {
                 recordLogininfor(username, Constants.LOGIN_FAIL, "用户/密码必须填写");
@@ -137,7 +145,8 @@ public class SysLoginService {
                 recordLogininfor(username, Constants.LOGIN_FAIL, "用户密码错误");
                 throw new BusinessException("用户不存在/密码错误");
             }
-        } else {
+        } else if(!StringUtils.isBlank(phone) && !StringUtils.isBlank(verify)) {
+            //手机验证码登录
             if (StringUtils.isBlank(verify)) {
                 throw new BusinessException("验证码不能为空");
             }
@@ -148,6 +157,16 @@ public class SysLoginService {
                 throw new BusinessException("用户名或手机号不能为空");
             }
             loginUser = sysUserService.getAppUserInfo(null, tenantId, phone);
+        } else if(!StringUtils.isBlank(username) && !StringUtils.isBlank(verify)) {
+            LOGGER.info("二维码验证码登录");
+            if (StringUtils.isBlank(username)) {
+                throw new BusinessException("用户名不能为空");
+            }
+            String qrCode_verify = LOGIN_QRCODE_VERIFY+":"+username;
+            if (!verify.equals(redisHelper.get(qrCode_verify))) {
+                throw new BusinessException("扫码验证码失败");
+            }
+            loginUser = sysUserService.getAppUserInfo(username, tenantId, null);
         }
 
         if (UserStatus.DELETED.getCode().equals(loginUser.getDelFlag())) {
@@ -213,8 +232,29 @@ public class SysLoginService {
         } else if (Constants.LOGIN_FAIL.equals(status)) {
             logininfor.setStatus(Constants.LOGIN_FAIL_STATUS);
         }
+        LOGGER.debug(JsonUtils.toJson(logininfor));
         sysLogininforService.insertLogininfor(BeanMapperUtils.map(logininfor, SysLogininfor.class));
     }
 
 
+    public String getQrCodeResult(@RequestParam String qrCode){
+        Object o = redisHelper.get("login_qrcode_verify:" + qrCode);
+        if(null !=o) {
+            String result = String.valueOf(o);
+            return result;
+        }
+       return null;
+    }
+
+
+    public void qrCodeSend(@RequestParam String userName, @RequestParam String qrCode, @RequestParam Integer tenantId) {
+        if(StringUtils.isBlank(userName)){
+            throw new BusinessException("用户名不能为空");
+        }
+        SysUser sysUser = sysUserService.selectUserByUserNameOne(userName,tenantId);
+        String code = String.valueOf(new Random().nextInt(1000000));
+        redisHelper.set(LOGIN_QRCODE_VERIFY+":"+userName,code);
+        redisHelper.set(LOGIN_QRCODE_VERIFY+":"+qrCode,userName+":"+code,30, TimeUnit.SECONDS);
+    }
+
 }

+ 1 - 1
base-modules/service-system/service-system-biz/src/main/resources/bootstrap.yml

@@ -5,7 +5,7 @@ server:
 spring:
   application:
     # 应用名称
-    name: service-system
+    name: usky-system
   profiles:
     # 环境配置
     active: dev

+ 84 - 0
base-modules/service-system/service-system-biz/src/main/resources/config/application-dev.yml

@@ -0,0 +1,84 @@
+mybatis:
+  refresh:
+    delay-seconds: 10
+    enabled: true
+    sleep-seconds: 20
+mybatis-plus:
+  configuration:
+    defaultStatementTimeout: 3
+    lazy-loading-enabled: true
+    map-underscore-to-camel-case: true
+  global-config:
+    db-config:
+      id-type: auto
+    mapperRegistryCache: true
+  mapper-locations: classpath*:mapper/**/*.xml
+server:
+  compression:
+    enabled: true
+    mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain
+spring:
+  autoconfigure:
+    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+  cache:
+    ehcache:
+      config: classpath:ehcache.xml
+      enabled: false
+    redis:
+      enabled: true
+  datasource:
+    druid:
+      stat-view-servlet:
+        enabled: true
+        login-password: '@dmin1234'
+        login-username: admin
+        reset-enable: true
+        url-pattern: /druid/*
+    dynamic:
+      datasource:
+        master:
+          password: password
+          url: jdbc:mysql://172.16.120.165:3306/usky-cloud?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowMultiQueries=true
+          username: root
+      druid:
+        initial-size: 5
+        min-idle: 5
+        maxActive: 20
+        maxWait: 60000
+        timeBetweenEvictionRunsMillis: 60000
+        minEvictableIdleTimeMillis: 300000
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        poolPreparedStatements: true
+        maxPoolPreparedStatementPerConnectionSize: 20
+        filters: stat,slf4j
+        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
+      primary: master
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    default-property-inclusion: always
+    deserialization:
+      fail-on-unknown-properties: false
+    parser:
+      allow-single-quotes: true
+      allow-unquoted-control-chars: true
+    serialization:
+      fail-on-empty-beans: false
+    time-zone: GMT+8
+  redis:
+    host: 172.16.120.165
+    password: 123456
+    port: 6379
+    timeout: 10000
+  influx:
+    url: http://172.16.120.69:8086
+    password: root
+    user: root
+    database: USKTSDB
+  tenant:
+    enable: true
+  mvc:
+    pathmatch:
+      matching-strategy: ant_path_matcher

+ 84 - 0
base-modules/service-system/service-system-biz/src/main/resources/config/application-prod.yml

@@ -0,0 +1,84 @@
+mybatis:
+  refresh:
+    delay-seconds: 10
+    enabled: true
+    sleep-seconds: 20
+mybatis-plus:
+  configuration:
+    defaultStatementTimeout: 3
+    lazy-loading-enabled: true
+    map-underscore-to-camel-case: true
+  global-config:
+    db-config:
+      id-type: auto
+    mapperRegistryCache: true
+  mapper-locations: classpath*:mapper/**/*.xml
+server:
+  compression:
+    enabled: true
+    mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain
+spring:
+  autoconfigure:
+    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+  cache:
+    ehcache:
+      config: classpath:ehcache.xml
+      enabled: false
+    redis:
+      enabled: true
+  datasource:
+    druid:
+      stat-view-servlet:
+        enabled: true
+        login-password: '@dmin1234'
+        login-username: admin
+        reset-enable: true
+        url-pattern: /druid/*
+    dynamic:
+      datasource:
+        master:
+          password: password
+          url: jdbc:mysql://172.16.120.165:3306/usky-cloud?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowMultiQueries=true
+          username: root
+      druid:
+        initial-size: 5
+        min-idle: 5
+        maxActive: 20
+        maxWait: 60000
+        timeBetweenEvictionRunsMillis: 60000
+        minEvictableIdleTimeMillis: 300000
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        poolPreparedStatements: true
+        maxPoolPreparedStatementPerConnectionSize: 20
+        filters: stat,slf4j
+        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
+      primary: master
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    default-property-inclusion: always
+    deserialization:
+      fail-on-unknown-properties: false
+    parser:
+      allow-single-quotes: true
+      allow-unquoted-control-chars: true
+    serialization:
+      fail-on-empty-beans: false
+    time-zone: GMT+8
+  redis:
+    host: 172.16.120.165
+    password: 123456
+    port: 6379
+    timeout: 10000
+  influx:
+    url: http://172.16.120.69:8086
+    password: root
+    user: root
+    database: USKTSDB
+  tenant:
+    enable: true
+  mvc:
+    pathmatch:
+      matching-strategy: ant_path_matcher

+ 10 - 10
base-modules/service-system/service-system-biz/src/main/resources/logback.xml

@@ -15,17 +15,17 @@
 	</appender>
 
     <appender name="file_sql" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${log.path}/sql.log</File>
+        <file>${log.path}/sql.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sql.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>3</maxHistory>
+        </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
         </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <maxIndex>10</maxIndex>
-            <fileNamePattern>${log.path}/sql.log.%i</fileNamePattern>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>100MB</MaxFileSize>
-        </triggeringPolicy>
     </appender>
 
     <!-- 系统日志输出 -->
@@ -36,7 +36,7 @@
             <!-- 日志文件名格式 -->
 			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
 			<!-- 日志最大的历史 60天 -->
-			<maxHistory>60</maxHistory>
+			<maxHistory>3</maxHistory>
 		</rollingPolicy>
 		<encoder>
 			<pattern>${log.pattern}</pattern>
@@ -78,7 +78,7 @@
 	<!-- Spring日志级别控制  -->
 <!--	<logger name="org.springframework" level="warn" />-->
 
-    <logger name="${SQL_PACKAGE}" additivity="false" level="DEBUG">
+    <logger name="${SQL_PACKAGE}" additivity="false" level="debug">
         <appender-ref ref="console"/>
         <appender-ref ref="file_sql"/>
     </logger>