Browse Source

Merge remote-tracking branch 'origin/package' into package

zhangxianyu 3 months ago
parent
commit
ca582b64ef
17 changed files with 280 additions and 81 deletions
  1. 10 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/HttpStatusEnum.java
  2. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  3. 10 2
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameUserChatController.java
  4. 15 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/UserDTO.java
  5. 5 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameUserChatListParam.java
  6. 2 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameUserChatService.java
  7. 16 8
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameUserChatServiceImpl.java
  8. 31 5
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserBanServiceImpl.java
  9. 45 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/UserBan.java
  10. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  11. 6 4
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IIpBanService.java
  12. 32 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IUserBanService.java
  13. 11 49
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/IpBanServiceImpl.java
  14. 12 9
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java
  15. 71 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserBanServiceImpl.java
  16. 8 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserCardServiceImpl.java
  17. 4 2
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserTokenServiceImpl.java

+ 10 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/HttpStatusEnum.java

@@ -87,6 +87,16 @@ public enum HttpStatusEnum {
      */
     IP_HALT(41109, "ip封禁, 请联系客服"),
 
+    /**
+     * 实名封禁
+     */
+    CARD_ID_HALT(41109, "实名封禁, 请联系客服"),
+
+    /**
+     * 设备封禁
+     */
+    DEVICES_HALT(41109, "设备封禁, 请联系客服"),
+
     /**
      * 账户未绑定手机
      */

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java

@@ -23,7 +23,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 < (头条渠道兼容星广联投任务id-01 ・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 < (玩家封禁新增游戏id字段 ・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 10 - 2
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameUserChatController.java

@@ -20,7 +20,7 @@ import java.util.Map;
 /**
  * @author : lingfeng
  * @time : 2025-03-13
- * @description :
+ * @description : 游戏聊天记录
  */
 @Api(tags = {"游戏聊天记录相关接口"})
 @RestController
@@ -35,10 +35,18 @@ public class GameUserChatController {
     @GetMapping(value = "/game/list")
     @PreAuthorize(permissionKey = "manage:gameChat:gameList")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Map.class)})
-    public ResultVO<Map<Long, String>> listOfPage() {
+    public ResultVO<Map<Long, String>> chatGameMap() {
         return ResultVO.ok(gameUserChatService.chatGameMap());
     }
 
+    @ApiOperation(value = "查询指定游戏区服")
+    @GetMapping(value = "/game/server/list")
+    @PreAuthorize(permissionKey = "manage:gameChat:gameServerList")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Map.class)})
+    public ResultVO<Map<String, String>> chatGameServerMap(@RequestParam Long supperGameId) {
+        return ResultVO.ok(gameUserChatService.chatGameServerMap(supperGameId));
+    }
+
     @ApiOperation(value = "查询游戏聊天记录")
     @PostMapping(value = "/list")
     @PreAuthorize(permissionKey = "manage:gameChat:chatList")

+ 15 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/UserDTO.java

@@ -133,11 +133,26 @@ public class UserDTO {
      */
     private String imei;
 
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
     /**
      * 安卓id, (仅安卓设备才有值)
      */
     private String androidId;
 
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+
     /**
      * 注册时间
      */

+ 5 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameUserChatListParam.java

@@ -42,4 +42,9 @@ public class GameUserChatListParam extends BaseListDTO<GameUserChat> {
      * 聊天结束日期
      */
     private LocalDate chatEnd;
+
+    /**
+     * 区服id
+     */
+    private String serverId;
 }

+ 2 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameUserChatService.java

@@ -18,6 +18,8 @@ public interface IGameUserChatService extends IService<GameUserChat> {
 
     Map<Long, String> chatGameMap();
 
+    Map<String, String> chatGameServerMap(Long supperGameId);
+
     IPage<GameUserChatVO> listOfPage(GameUserChatListParam param);
 
     void addGameUserChat(ChatSubmitParam param);

+ 16 - 8
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameUserChatServiceImpl.java

@@ -6,14 +6,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.manage.pojo.params.ChatSubmitParam;
 import com.zanxiang.game.module.manage.pojo.params.GameUserChatListParam;
 import com.zanxiang.game.module.manage.pojo.vo.GameUserChatVO;
-import com.zanxiang.game.module.manage.service.IGameService;
-import com.zanxiang.game.module.manage.service.IGameSupperService;
-import com.zanxiang.game.module.manage.service.IGameUserChatService;
-import com.zanxiang.game.module.manage.service.IGameUserRoleService;
-import com.zanxiang.game.module.mybatis.entity.Game;
-import com.zanxiang.game.module.mybatis.entity.GameSupper;
-import com.zanxiang.game.module.mybatis.entity.GameUserChat;
-import com.zanxiang.game.module.mybatis.entity.GameUserRole;
+import com.zanxiang.game.module.manage.service.*;
+import com.zanxiang.game.module.mybatis.entity.*;
 import com.zanxiang.game.module.mybatis.mapper.GameUserChatMapper;
 import com.zanxiang.module.util.DateUtil;
 import com.zanxiang.module.util.JsonUtil;
@@ -45,6 +39,9 @@ public class GameUserChatServiceImpl extends ServiceImpl<GameUserChatMapper, Gam
     @Autowired
     private IGameService gameService;
 
+    @Autowired
+    private IGameServerService gameServerService;
+
     @Autowired
     private IGameSupperService gameSupperService;
 
@@ -56,6 +53,16 @@ public class GameUserChatServiceImpl extends ServiceImpl<GameUserChatMapper, Gam
         return Collections.singletonMap(12L, "仙剑");
     }
 
+    @Override
+    public Map<String, String> chatGameServerMap(Long supperGameId) {
+        return gameServerService.list(new LambdaQueryWrapper<GameServer>()
+                .select(GameServer::getServerId, GameServer::getServerName)
+                .eq(GameServer::getGameId, supperGameId)
+                .eq(GameServer::getIsSourceServer, Boolean.TRUE)
+                .orderByDesc(GameServer::getCreateTime)
+        ).stream().collect(Collectors.toMap(GameServer::getServerId, GameServer::getServerName));
+    }
+
     @Override
     public IPage<GameUserChatVO> listOfPage(GameUserChatListParam param) {
         GameSupper gameSupper = gameSupperService.getById(param.getSupperGameId());
@@ -63,6 +70,7 @@ public class GameUserChatServiceImpl extends ServiceImpl<GameUserChatMapper, Gam
                 .eq(GameUserChat::getSupperGameId, param.getSupperGameId())
                 .eq(Strings.isNotBlank(param.getRoleId()), GameUserChat::getRoleId, param.getRoleId())
                 .like(Strings.isNotBlank(param.getRoleName()), GameUserChat::getRoleName, param.getRoleName())
+                .eq(Strings.isNotBlank(param.getServerId()), GameUserChat::getServerId, param.getServerId())
                 .ge(param.getChatStart() != null, GameUserChat::getChatTime,
                         param.getChatStart() == null ? null : LocalDateTime.of(param.getChatStart(), LocalTime.MIN))
                 .le(param.getChatEnd() != null, GameUserChat::getChatTime,

+ 31 - 5
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserBanServiceImpl.java

@@ -12,9 +12,11 @@ import com.zanxiang.game.module.manage.pojo.params.UserBanListParam;
 import com.zanxiang.game.module.manage.pojo.params.UserBanUpdateParam;
 import com.zanxiang.game.module.manage.pojo.vo.UserBanVO;
 import com.zanxiang.game.module.manage.service.IUserBanService;
+import com.zanxiang.game.module.manage.service.IUserCardService;
 import com.zanxiang.game.module.manage.service.IUserService;
 import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.UserBan;
+import com.zanxiang.game.module.mybatis.entity.UserCard;
 import com.zanxiang.game.module.mybatis.mapper.UserBanMapper;
 import com.zanxiang.module.util.bean.BeanUtil;
 import com.zanxiang.module.util.exception.BaseException;
@@ -40,6 +42,9 @@ public class UserBanServiceImpl extends ServiceImpl<UserBanMapper, UserBan> impl
     @Autowired
     private IUserService userService;
 
+    @Autowired
+    private IUserCardService userCardService;
+
     @Override
     public IPage<UserBanVO> list(UserBanListParam param) {
         return page(param.toPage(), new QueryWrapper<UserBan>().lambda()
@@ -51,10 +56,10 @@ public class UserBanServiceImpl extends ServiceImpl<UserBanMapper, UserBan> impl
                 .ge(param.getBeginDate() != null, UserBan::getBanTime, param.getBeginDate() == null ? null : LocalDateTime.of(param.getBeginDate(), LocalTime.MIN))
                 .le(param.getEndDate() != null, UserBan::getBanTime, param.getEndDate() == null ? null : LocalDateTime.of(param.getEndDate(), LocalTime.MAX))
                 .orderByDesc(UserBan::getCreateTime))
-                .convert(this::toVo);
+                .convert(this::toVO);
     }
 
-    private UserBanVO toVo(UserBan userBan) {
+    private UserBanVO toVO(UserBan userBan) {
         if (Objects.isNull(userBan)) {
             return null;
         }
@@ -87,18 +92,39 @@ public class UserBanServiceImpl extends ServiceImpl<UserBanMapper, UserBan> impl
                     .eq(UserBan::getUserId, param.getUserId()));
         }
         //添加玩家封禁信息
-        return super.save(UserBan.builder()
+        userBan = this.transform(userDTO, param.getStatus());
+        //查询玩家实名信息
+        UserCard userCard = userCardService.getOne(new LambdaQueryWrapper<UserCard>()
+                .eq(UserCard::getUserId, userBan.getUserId())
+                .orderByDesc(UserCard::getCreateTime)
+                .last("limit 1"));
+        if (userCard != null && Strings.isNotBlank(userCard.getCardId())) {
+            userBan.setCardId(userCard.getCardId());
+        }
+        return super.save(userBan);
+    }
+
+    private UserBan transform(UserDTO userDTO, Integer status) {
+        return UserBan.builder()
                 .userId(userDTO.getId())
+                .gameId(userDTO.getGameId())
                 .userName(userDTO.getUsername())
                 .userNickName(userDTO.getNickname())
                 .regTime(userDTO.getCreateTime())
                 .banTime(LocalDateTime.now())
-                .status(param.getStatus())
+                .status(status)
+                .ip(Strings.isNotBlank(userDTO.getIp()) ? userDTO.getIp() : null)
+                .mac(Strings.isNotBlank(userDTO.getMac()) ? userDTO.getMac() : null)
+                .imei(Strings.isNotBlank(userDTO.getImei()) ? userDTO.getImei() : null)
+                .oaid(Strings.isNotBlank(userDTO.getOaid()) ? userDTO.getOaid() : null)
+                .androidId(Strings.isNotBlank(userDTO.getAndroidId()) ? userDTO.getAndroidId() : null)
+                .idfa(Strings.isNotBlank(userDTO.getIdfa()) ? userDTO.getIdfa() : null)
+                .caid(Strings.isNotBlank(userDTO.getCaid()) ? userDTO.getCaid() : null)
                 .operateId(SecurityUtil.getUserId())
                 .operateName(SecurityUtil.getTokenInfo().getNickname())
                 .createTime(LocalDateTime.now())
                 .updateTime(LocalDateTime.now())
-                .build());
+                .build();
     }
 
 }

+ 45 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/UserBan.java

@@ -35,6 +35,11 @@ public class UserBan implements Serializable {
      */
     private Long userId;
 
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
     /**
      * 用户账号
      */
@@ -60,6 +65,46 @@ public class UserBan implements Serializable {
      */
     private Integer status;
 
+    /**
+     * 用户注册ip
+     */
+    private String ip;
+
+    /**
+     * 用户设备mac地址
+     */
+    private String mac;
+
+    /**
+     * 设备唯一编号IMEI
+     */
+    private String imei;
+
+    /**
+     * 设备OAID
+     */
+    private String oaid;
+
+    /**
+     * 安卓id, (仅安卓设备才有值)
+     */
+    private String androidId;
+
+    /**
+     * IOS设备IDFA
+     */
+    private String idfa;
+
+    /**
+     * IOS设备CAID
+     */
+    private String caid;
+
+    /**
+     * 身份证号
+     */
+    private String cardId;
+
     /**
      * 操作者id
      */

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java

@@ -25,7 +25,7 @@ public class SDKApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <角色信息上报-等级更新回传-02> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <封禁新增设备信息封禁, 实名信息封禁> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 6 - 4
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IIpBanService.java

@@ -1,8 +1,10 @@
 package com.zanxiang.game.module.sdk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
 import com.zanxiang.game.module.mybatis.entity.IpBan;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
+import reactor.util.function.Tuple2;
 
 /**
  * @author : lingfeng
@@ -12,10 +14,10 @@ import com.zanxiang.game.module.sdk.pojo.param.UserData;
 public interface IIpBanService extends IService<IpBan> {
 
     /**
-     * 检查ip禁令
+     * 封禁IP和设备检测
      *
-     * @param userData 用户数据
-     * @return boolean
+     * @param userData : 用户数据
+     * @return : 返回检测结果
      */
-    boolean checkIpBan(UserData userData);
+    Tuple2<Boolean, HttpStatusEnum> banCheck(UserData userData);
 }

+ 32 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IUserBanService.java

@@ -0,0 +1,32 @@
+package com.zanxiang.game.module.sdk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
+import com.zanxiang.game.module.mybatis.entity.UserBan;
+import com.zanxiang.game.module.sdk.pojo.param.UserData;
+import reactor.util.function.Tuple2;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-28
+ * @description : 玩家封禁管理
+ */
+public interface IUserBanService extends IService<UserBan> {
+
+    /**
+     * 设备封禁检测
+     *
+     * @param userData : 用户数据
+     * @return : 返回检测结果
+     */
+    Tuple2<Boolean, HttpStatusEnum> banCheckByDevice(UserData userData);
+
+    /**
+     * 身份证号匹配
+     *
+     * @param gameId : 游戏id
+     * @param cardId : 身份证号
+     * @return : 返回匹配结果
+     */
+    boolean banCheckByCardId(Long gameId, String cardId);
+}

+ 11 - 49
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/IpBanServiceImpl.java

@@ -1,27 +1,19 @@
 package com.zanxiang.game.module.sdk.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.github.sd4324530.jtuple.Tuple2;
 import com.zanxiang.game.module.base.pojo.enums.BanStatusEnum;
 import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
-import com.zanxiang.game.module.mybatis.entity.Game;
-import com.zanxiang.game.module.mybatis.entity.GameSupper;
 import com.zanxiang.game.module.mybatis.entity.IpBan;
-import com.zanxiang.game.module.mybatis.entity.UserEvent;
 import com.zanxiang.game.module.mybatis.mapper.IpBanMapper;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
-import com.zanxiang.game.module.sdk.service.IGameService;
-import com.zanxiang.game.module.sdk.service.IGameSupperService;
 import com.zanxiang.game.module.sdk.service.IIpBanService;
-import com.zanxiang.game.module.sdk.service.IUserEventService;
+import com.zanxiang.game.module.sdk.service.IUserBanService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-
-import java.util.Objects;
-import java.util.Optional;
+import reactor.util.function.Tuple2;
+import reactor.util.function.Tuples;
 
 /**
  * @author : lingfeng
@@ -33,49 +25,19 @@ import java.util.Optional;
 public class IpBanServiceImpl extends ServiceImpl<IpBanMapper, IpBan> implements IIpBanService {
 
     @Autowired
-    private IUserEventService userEventService;
-
-    @Autowired
-    private IGameSupperService gameSupperService;
-
-    @Autowired
-    private IGameService gameService;
+    private IUserBanService userBanService;
 
     @Override
-    public boolean checkIpBan(UserData userData) {
-        IpBan ipBan = super.getOne(new LambdaUpdateWrapper<IpBan>()
-                .eq(IpBan::getIp, userData.getIp())
+    public Tuple2<Boolean, HttpStatusEnum> banCheck(UserData userData) {
+        //IP检测
+        if (super.count(new LambdaQueryWrapper<IpBan>()
                 .eq(IpBan::getGameId, userData.getGameId())
-        );
-        return ipBan != null && Objects.equals(ipBan.getStatus(), BanStatusEnum.BAN_STATUS.getStatus());
-    }
-
-    public Tuple2<Boolean, HttpStatusEnum> checkIpBanAndGetStatus(UserData userData) {
-        IpBan ipBan = super.getOne(new LambdaUpdateWrapper<IpBan>()
                 .eq(IpBan::getIp, userData.getIp())
-                .eq(IpBan::getGameId, userData.getGameId())
-        );
-        if (ipBan != null && Objects.equals(ipBan.getStatus(), BanStatusEnum.BAN_STATUS.getStatus())) {
-            return Tuple2.with(Boolean.TRUE, HttpStatusEnum.IP_HALT);
-        }
-        //获取游戏维护状态
-        Boolean serverMaintain = Optional.ofNullable(gameService.getById(userData.getGameId()))
-                .map(Game::getSuperGameId)
-                .flatMap(superGameId -> Optional.ofNullable(gameSupperService.getById(superGameId)))
-                .map(GameSupper::getServerMaintain)
-                .orElse(null);
-        //没有维护, 直接放行
-        if (!Objects.equals(serverMaintain, Boolean.TRUE)) {
-            return Tuple2.with(Boolean.FALSE, HttpStatusEnum.SUCCESS);
-        }
-        //维护中, 测试账号直接放行
-        if (userEventService.count(new LambdaQueryWrapper<UserEvent>()
-                .eq(UserEvent::getGameId, userData.getGameId())
-                .eq(UserEvent::getIp, userData.getIp())
+                .eq(IpBan::getStatus, BanStatusEnum.BAN_STATUS.getStatus())
         ) > 0) {
-            return Tuple2.with(Boolean.FALSE, HttpStatusEnum.SUCCESS);
+            return Tuples.of(Boolean.TRUE, HttpStatusEnum.IP_HALT);
         }
-        //返回服务器正在维护中
-        return Tuple2.with(Boolean.TRUE, HttpStatusEnum.SERVER_MAINTAIN);
+        //设备检测
+        return userBanService.banCheckByDevice(userData);
     }
 }

+ 12 - 9
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java

@@ -120,9 +120,10 @@ public class LoginServiceImpl implements IRegisterLoginService {
     @Transactional(rollbackFor = Exception.class)
     public ResultVO<UserLoginVO> loginWxCode(LoginVxCodeParam param, UserData userData, HttpServletRequest request) {
         log.error("登录请求参数 , param : {}, userData : {}", JsonUtil.toString(param), JsonUtil.toString(userData));
-        //验证登录ip是否封禁
-        if (ipBanService.checkIpBan(userData)) {
-            return ResultVO.fail(HttpStatusEnum.IP_HALT.getMsg());
+        //验证是否被封禁
+        Tuple2<Boolean, HttpStatusEnum> banCheckTuple2 = ipBanService.banCheck(userData);
+        if (banCheckTuple2.getT1()) {
+            return ResultVO.fail(banCheckTuple2.getT2().getMsg());
         }
         //查询微信小游戏信息
         GameAppletDTO gameAppletDTO = gameAppletService.getByGameId(userData.getGameId());
@@ -167,9 +168,10 @@ public class LoginServiceImpl implements IRegisterLoginService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public ResultVO<UserLoginVO> loginPassword(LoginPasswordParam param, UserData userData) {
-        //验证登录ip是否封禁
-        if (ipBanService.checkIpBan(userData)) {
-            return ResultVO.fail(HttpStatusEnum.IP_HALT.getMsg());
+        //验证是否被封禁
+        Tuple2<Boolean, HttpStatusEnum> banCheckTuple2 = ipBanService.banCheck(userData);
+        if (banCheckTuple2.getT1()) {
+            return ResultVO.fail(banCheckTuple2.getT2().getMsg());
         }
         String username = param.getUsername();
         String password = param.getPassword();
@@ -230,9 +232,10 @@ public class LoginServiceImpl implements IRegisterLoginService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public ResultVO<UserLoginVO> loginMobile(LoginMobileParam param, UserData userData) {
-        //验证ip是否封禁
-        if (ipBanService.checkIpBan(userData)) {
-            return ResultVO.fail(HttpStatusEnum.IP_HALT.getMsg());
+        //验证是否被封禁
+        Tuple2<Boolean, HttpStatusEnum> banCheckTuple2 = ipBanService.banCheck(userData);
+        if (banCheckTuple2.getT1()) {
+            return ResultVO.fail(banCheckTuple2.getT2().getMsg());
         }
         String mobile = param.getMobile();
         //验证码校验

+ 71 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserBanServiceImpl.java

@@ -0,0 +1,71 @@
+package com.zanxiang.game.module.sdk.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
+import com.zanxiang.game.module.mybatis.entity.UserBan;
+import com.zanxiang.game.module.mybatis.mapper.UserBanMapper;
+import com.zanxiang.game.module.sdk.pojo.param.UserData;
+import com.zanxiang.game.module.sdk.service.IUserBanService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import reactor.util.function.Tuple2;
+import reactor.util.function.Tuples;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-28
+ * @description : 玩家封禁管理
+ */
+@Slf4j
+@Service
+public class UserBanServiceImpl extends ServiceImpl<UserBanMapper, UserBan> implements IUserBanService {
+
+    @Override
+    public Tuple2<Boolean, HttpStatusEnum> banCheckByDevice(UserData userData) {
+        //设备参数不存在, 无法检测
+        if (StringUtils.isAllBlank(userData.getImei(), userData.getAndroidId(), userData.getOaid())) {
+            return Tuples.of(Boolean.FALSE, HttpStatusEnum.SUCCESS);
+        }
+        //匹配已封禁设备标识
+        LambdaQueryWrapper<UserBan> queryWrapper = new LambdaQueryWrapper<UserBan>()
+                .eq(UserBan::getGameId, userData.getGameId());
+        queryWrapper.and(qw -> {
+            boolean hasCondition = false;
+            //安卓id匹配
+            if (StringUtils.isNoneBlank(userData.getAndroidId())) {
+                qw.or().eq(UserBan::getAndroidId, userData.getAndroidId());
+                hasCondition = true;
+            }
+            //imei匹配
+            if (StringUtils.isNoneBlank(userData.getImei())) {
+                qw.or().eq(UserBan::getImei, userData.getImei());
+                hasCondition = true;
+            }
+            //oaid匹配
+            if (StringUtils.isNoneBlank(userData.getOaid())) {
+                qw.or().eq(UserBan::getOaid, userData.getOaid());
+                hasCondition = true;
+            }
+            // 避免无条件的OR查询
+            if (!hasCondition) {
+                qw.or().apply("1=0");
+            }
+        });
+        //查询
+        if (super.count(queryWrapper) > 0) {
+            return Tuples.of(Boolean.TRUE, HttpStatusEnum.DEVICES_HALT);
+        }
+        return Tuples.of(Boolean.FALSE, HttpStatusEnum.SUCCESS);
+    }
+
+    @Override
+    public boolean banCheckByCardId(Long gameId, String cardId) {
+        //身份证号匹配
+        return super.count(new LambdaQueryWrapper<UserBan>()
+                .eq(UserBan::getGameId, gameId)
+                .eq(UserBan::getCardId, cardId)
+        ) > 0;
+    }
+}

+ 8 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserCardServiceImpl.java

@@ -11,6 +11,7 @@ import com.zanxiang.game.module.sdk.constant.RegexConstant;
 import com.zanxiang.game.module.sdk.pojo.param.UserCardUpdateParam;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
 import com.zanxiang.game.module.sdk.service.IAliApiService;
+import com.zanxiang.game.module.sdk.service.IUserBanService;
 import com.zanxiang.game.module.sdk.service.IUserCardService;
 import com.zanxiang.game.module.sdk.service.IUserService;
 import com.zanxiang.module.util.pojo.ResultVO;
@@ -45,9 +46,16 @@ public class UserCardServiceImpl extends ServiceImpl<UserCardMapper, UserCard> i
     @Autowired
     private IAliApiService aliApiService;
 
+    @Autowired
+    private IUserBanService userBanService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public ResultVO<Boolean> userAuthentication(UserCardUpdateParam param, UserData userData) {
+        //判断实名信息是否可用
+        if (userBanService.banCheckByCardId(userData.getGameId(), param.getCardId())) {
+            return ResultVO.fail(HttpStatusEnum.CARD_ID_HALT.getMsg());
+        }
         //查询实名认证信息
         UserCard userCard = super.getOne(new LambdaQueryWrapper<UserCard>()
                 .eq(UserCard::getUserId, userData.getUserId()));

+ 4 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserTokenServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.base.pojo.enums.BanStatusEnum;
 import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
+import com.zanxiang.game.module.base.pojo.enums.HttpStatusEnum;
 import com.zanxiang.game.module.base.util.DateUtils;
 import com.zanxiang.game.module.mybatis.entity.Game;
 import com.zanxiang.game.module.mybatis.entity.GameExt;
@@ -212,8 +213,9 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
         if (Strings.isBlank(token) || userToken.getUpdateTime().isBefore(localDateTime)) {
             return Boolean.FALSE;
         }
-        //判断是否ip封禁
-        if (ipBanService.checkIpBan(userData)) {
+        //验证是否被封禁
+        Tuple2<Boolean, HttpStatusEnum> banCheckTuple2 = ipBanService.banCheck(userData);
+        if (banCheckTuple2.getT1()) {
             return Boolean.FALSE;
         }
         //查询用户信息