Explorar o código

"微信一键登录最终版"

yu_u66 hai 2 semanas
pai
achega
6969f33043

+ 5 - 0
pom.xml

@@ -30,6 +30,11 @@
             <version>1.2.80</version>
         </dependency>
         <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.12.1</version>
+        </dependency>
+        <dependency>
             <groupId>io.jsonwebtoken</groupId>
             <artifactId>jjwt-api</artifactId>
             <version>0.11.5</version>

+ 43 - 0
src/main/java/com/futu/course/common/config/RedissonConfig.java

@@ -0,0 +1,43 @@
+package com.futu.course.common.config;
+
+import org.apache.commons.lang3.StringUtils;
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class RedissonConfig {
+
+  @Value("${spring.redis.host}")
+   private String host;
+    @Value("${spring.redis.port}")
+    private int port;
+    @Value("${spring.redis.database}")
+    private int database;
+    @Value("${spring.redis.password}")
+    private String password;
+
+
+        @Bean
+        public RedissonClient getRedisson() {
+            Config config = new Config();
+            config.useSingleServer().setAddress("redis://" + host + ":" + port)
+                    .setDatabase(database);
+            if (StringUtils.isNotEmpty(password)) {
+                config.useSingleServer().setAddress("redis://" + host + ":" + port).setDatabase(database)
+                        .setPassword(password);
+            } else {
+                config.useSingleServer().setAddress("redis://" + host + ":" + port).setDatabase(database);
+            }
+            //设置全局默认看门狗机续期时间,如果在使用时不设置,则使用全局的,如果全局不设置,则使用默认的30000,单位毫秒
+            config.setLockWatchdogTimeout(2000);
+            return Redisson.create(config);
+        }
+    }
+
+
+
+

+ 11 - 0
src/main/java/com/futu/course/user/controller/UserController.java

@@ -3,6 +3,8 @@ package com.futu.course.user.controller;
 import com.futu.course.common.annotation.NonLoginRequired;
 import com.futu.course.common.entity.R;
 import com.futu.course.user.dto.UserDTO;
+import com.futu.course.user.dto.UserLoginDto;
+import com.futu.course.user.dto.UserRegisterDto;
 import com.futu.course.user.service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -30,4 +32,13 @@ public class UserController {
         System.out.println(dto);
         return userService.logout(dto);
     }
+    //手机号密码登录
+    @NonLoginRequired
+    @PostMapping("login")
+    public R login(@RequestBody UserLoginDto dto) throws InterruptedException {
+        return userService.login(dto);
+    }
+
+
+
 }

+ 14 - 0
src/main/java/com/futu/course/user/dto/UserLoginDto.java

@@ -0,0 +1,14 @@
+package com.futu.course.user.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class UserLoginDto {
+    @NotBlank(message = "手机号不能为空")
+    private String mobile;
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+}

+ 11 - 0
src/main/java/com/futu/course/user/dto/UserRegisterDto.java

@@ -0,0 +1,11 @@
+package com.futu.course.user.dto;
+
+import lombok.Data;
+
+@Data
+public class UserRegisterDto {
+    private String username;
+    private String password;
+    private String nickname;
+    private String  mobile;
+}

+ 6 - 0
src/main/java/com/futu/course/user/service/UserService.java

@@ -4,6 +4,8 @@ import com.futu.course.common.entity.R;
 import com.futu.course.user.domain.User;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.futu.course.user.dto.UserDTO;
+import com.futu.course.user.dto.UserLoginDto;
+import com.futu.course.user.dto.UserRegisterDto;
 
 /**
 * @author yuu
@@ -15,4 +17,8 @@ public interface UserService extends IService<User> {
     R appLogin(UserDTO dto);
 
     R logout(UserDTO dto);
+
+    R login(UserLoginDto dto) throws InterruptedException;
+
+
 }

+ 67 - 0
src/main/java/com/futu/course/user/service/impl/UserServiceImpl.java

@@ -10,11 +10,14 @@ import com.futu.course.common.utils.TokenUtils;
 import com.futu.course.user.domain.User;
 import com.futu.course.user.dto.LoginDTO;
 import com.futu.course.user.dto.UserDTO;
+import com.futu.course.user.dto.UserLoginDto;
+import com.futu.course.user.dto.UserRegisterDto;
 import com.futu.course.user.service.UserService;
 import com.futu.course.user.mapper.UserMapper;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import io.jsonwebtoken.security.Keys;
+import io.lettuce.core.RedisClient;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
@@ -23,10 +26,13 @@ import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
 
 import javax.annotation.Resource;
 import javax.crypto.Cipher;
@@ -51,6 +57,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
 
     @Autowired
     private RedisTemplate redisTemplate;
+    @Autowired
+    private RedissonClient redissonClient;
 
     // 填写上你的AppID,如何获取AppID自行百度,这步骤很简单
     private final static String APP_ID = "wxdbcbc020c8e4b0d9";
@@ -146,6 +154,65 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
         return R.ok("登出成功");
     }
 
+    @Override
+    public R login(UserLoginDto dto) throws InterruptedException {
+        RLock lock = redissonClient.getLock(dto.getMobile());
+        boolean b = lock.tryLock(3, TimeUnit.SECONDS);
+        if (!b)
+        {
+          return R.failed("请勿重复提交");
+        }
+         try {
+             User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getMobile, dto.getMobile()));
+             if (user == null)
+             {
+                 return R.restResult(null,500,"用户不存在");
+             }
+             String salt = user.getSalt();
+             String password = dto.getPassword();
+             String hex = DigestUtils.md5DigestAsHex((salt + password).getBytes());
+             if (hex.equals(user.getPassword()))
+             {
+                 // 生成一个 256 位(32 字节)的安全密钥
+                 SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
+                 // 使用密钥生成 JWT
+                 String jws = Jwts.builder()
+                         .setSubject(user.getId().toString())
+                         .signWith(key)
+                         .compact();
+                 user.setToken(jws);
+                 redisTemplate.opsForValue().set("user",user,1, TimeUnit.DAYS);
+                 return R.ok(user);
+             }
+
+         }catch (Exception e)
+         {
+             e.printStackTrace();
+             throw e;
+         }finally {
+            if (lock.isLocked()&&lock.isHeldByCurrentThread())
+            {
+                lock.unlock();
+            }
+         }
+        return null;
+    }
+
+//    @Override
+//    public R register(UserRegisterDto dto) {
+//        SnowflakeIdWorker worker=new SnowflakeIdWorker(1,1);
+//        if (redisTemplate.opsForValue().get("user") != null)
+//        {
+//            return R.failed("用户已存在");
+//        }
+//        try {
+//            User user = new User();
+//            user.setId(worker.nextId());
+//        }
+//
+//        return null;
+//    }
+
 
     public static String decryptData(String encryptedData, String sessionKey, String iv) throws Exception {
         // Base64 解码