Przeglądaj źródła

登录登出实现

DESKTOP-YALE\greyg 1 rok temu
rodzic
commit
0d69cb1d57

+ 55 - 0
src/main/java/com/hy/common/tools/EncodeUtils.java

@@ -0,0 +1,55 @@
+package com.hy.common.tools;
+
+import java.nio.charset.Charset;
+
+public class EncodeUtils {
+
+    private static final String CHARSET = "ABCDEFGHIJ0123456789KLMNOPQRSTUVWXYZklmnopqrstuvwxyzabcdefghij~`!@#$%^&*()_-+={[}]|:;\"'<,>.?/";
+
+    // 映射表,用于快速查找字符对应的索引
+    private static final byte[] INDEX_MAP = new byte[128];
+
+    static {
+        for (int i = 0; i < CHARSET.length(); i++) {
+            INDEX_MAP[CHARSET.charAt(i)] = (byte) i;
+        }
+    }
+
+    public static String customBase64Encode(String str) {
+        return customBase64Encode(str,"utf-8");
+    }
+
+    public static String customBase64Encode(String str, Charset charset) {
+        byte[] data = str.getBytes(charset);
+        StringBuilder sb = new StringBuilder(data.length * 4 / 3 + 4); // 预留足够的空间
+        int bitCount = 0;
+        int bitBuffer = 0;
+
+        for (byte b : data) {
+            bitBuffer = (bitBuffer << 8) | (b & 0xFF); // 左移并添加新字节
+            bitCount += 8;
+
+            // 每6位对应一个字符,因此当bitCount达到24时,输出4个字符
+            while (bitCount >= 6) {
+                bitCount -= 6;
+                sb.append(CHARSET.charAt((bitBuffer >> bitCount) & 0x3F));
+            }
+        }
+
+        // 处理剩余的位(如果有)
+        if (bitCount > 0) {
+            sb.append(CHARSET.charAt((bitBuffer << (6 - bitCount)) & 0x3F));
+        }
+
+        // 如果不是4的倍数,添加'='作为填充
+        while (sb.length() % 4 != 0) {
+            sb.append('=');
+        }
+
+        return sb.toString();
+    }
+
+    public static String customBase64Encode(String str, String charset) {
+        return customBase64Encode(str,Charset.forName(charset));
+    }
+}

+ 12 - 4
src/main/java/com/hy/modules/bz/webapi/controller/BzWebApiController.java

@@ -2,10 +2,7 @@ package com.hy.modules.bz.webapi.controller;
 
 import com.hy.common.web.base.BaseController;
 import com.hy.common.web.domain.response.Result;
-import com.hy.modules.bz.webapi.dto.LoginInfoDto;
-import com.hy.modules.bz.webapi.dto.LoginResultDto;
-import com.hy.modules.bz.webapi.dto.RankingDto;
-import com.hy.modules.bz.webapi.dto.RankingFetchDto;
+import com.hy.modules.bz.webapi.dto.*;
 import com.hy.modules.bz.webapi.service.WebApiService;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +31,17 @@ public class BzWebApiController extends BaseController {
         }
     }
 
+    @RequestMapping("/logout.json")
+    @ResponseBody
+    public Result<Void> logout(@RequestBody LogoutDto logout){
+        try{
+            apiService.logout(logout);
+            return success();
+        }catch (Exception ex){
+            return failure(ex.getMessage());
+        }
+    }
+
     @RequestMapping("/rankingList.json")
     public Result<List<RankingDto>> rankingList(@RequestBody RankingFetchDto fetchDto) {
         try{

+ 18 - 0
src/main/java/com/hy/modules/bz/webapi/dto/LogoutDto.java

@@ -0,0 +1,18 @@
+package com.hy.modules.bz.webapi.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 退出登录请求实体
+ */
+@Data
+public class LogoutDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String cardNo;
+
+    private String token;
+}

+ 3 - 4
src/main/java/com/hy/modules/bz/webapi/service/WebApiService.java

@@ -1,9 +1,6 @@
 package com.hy.modules.bz.webapi.service;
 
-import com.hy.modules.bz.webapi.dto.LoginInfoDto;
-import com.hy.modules.bz.webapi.dto.LoginResultDto;
-import com.hy.modules.bz.webapi.dto.RankingDto;
-import com.hy.modules.bz.webapi.dto.RankingFetchDto;
+import com.hy.modules.bz.webapi.dto.*;
 
 import java.util.List;
 
@@ -11,5 +8,7 @@ public interface WebApiService {
 
     LoginResultDto login(LoginInfoDto loginInfo);
 
+    void logout(LogoutDto logoutDto);
+
     List<RankingDto> rankingList(RankingFetchDto fetchDto);
 }

+ 49 - 5
src/main/java/com/hy/modules/bz/webapi/service/impl/WebApiServiceImpl.java

@@ -1,23 +1,67 @@
 package com.hy.modules.bz.webapi.service.impl;
 
-import com.hy.modules.bz.webapi.dto.LoginInfoDto;
-import com.hy.modules.bz.webapi.dto.LoginResultDto;
-import com.hy.modules.bz.webapi.dto.RankingDto;
-import com.hy.modules.bz.webapi.dto.RankingFetchDto;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.hy.common.tools.EncodeUtils;
+import com.hy.modules.bz.domain.BzPlayer;
+import com.hy.modules.bz.service.IBzPlayerService;
+import com.hy.modules.bz.webapi.dto.*;
 import com.hy.modules.bz.webapi.service.WebApiService;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
 
+import javax.annotation.Resource;
 import java.util.Collections;
 import java.util.List;
+import java.util.UUID;
 
 @Service
 public class WebApiServiceImpl implements WebApiService {
 
+    private static final String TOKEN_PRIFIX = "user:";
+
+    @Resource
+    private IBzPlayerService playerService;
+
+    @Resource
+    private StringRedisTemplate redisTemplate;
+
     @Override
     public LoginResultDto login(LoginInfoDto loginInfo) {
-        return null;
+        QueryWrapper<BzPlayer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("card_no",loginInfo.getCardNo())
+                        .eq("card_password",loginInfo.getCardPwd())
+                                .eq("status","normal");
+        BzPlayer player = playerService.getOne(queryWrapper,false);
+        Assert.notNull(player,"No player found");
+
+        String toEncode = UUID.randomUUID().toString().concat(String.valueOf(loginInfo.getTimestamp()));
+        String token = EncodeUtils.customBase64Encode(toEncode);
+        redisTemplate.opsForValue().set(TOKEN_PRIFIX.concat(loginInfo.getCardNo()),token);
+        LoginResultDto loginResultDto = new LoginResultDto();
+        loginResultDto.setToken(token);
+        loginResultDto.setCardNo(loginResultDto.getCardNo());
+        return loginResultDto;
     }
 
+    @Override
+    public void logout(LogoutDto logoutDto) {
+        QueryWrapper<BzPlayer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("card_no",logoutDto.getCardNo())
+                .eq("status","normal");
+        BzPlayer player = playerService.getOne(queryWrapper,false);
+        Assert.notNull(player,"No player found");
+
+        String token = redisTemplate.opsForValue().get(TOKEN_PRIFIX.concat(logoutDto.getCardNo()));
+        if(null!=token){
+            if(!token.equals(logoutDto.getToken())){
+                throw new RuntimeException("Illegal request for user: " + logoutDto.getCardNo());
+            }
+        }
+        redisTemplate.delete(TOKEN_PRIFIX.concat(logoutDto.getCardNo()));
+    }
+
+
     @Override
     public List<RankingDto> rankingList(RankingFetchDto fetchDto) {
         return Collections.emptyList();