Explorar o código

修改内容:玩家登陆日志列表;登陆IP玩家列表

lth hai 1 ano
pai
achega
c2466b0c7d

+ 18 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/PlayerDataController.java

@@ -1,7 +1,9 @@
 package com.zanxiang.game.data.serve.controller;
 
 import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.game.data.serve.pojo.dto.PlayerBannedListDTO;
 import com.zanxiang.game.data.serve.pojo.dto.PlayerDataListDTO;
+import com.zanxiang.game.data.serve.pojo.dto.PlayerLoginLogDataListDTO;
 import com.zanxiang.game.data.serve.pojo.dto.PlayerRoleDataListDTO;
 import com.zanxiang.game.data.serve.pojo.vo.PlayerDataVO;
 import com.zanxiang.game.data.serve.pojo.vo.PlayerRoleDataVO;
@@ -17,6 +19,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Map;
+
 /**
  * @author tianhua
  * @time 2023/9/6
@@ -45,4 +49,18 @@ public class PlayerDataController {
         return ResultVO.ok(playerDataService.getPlayerRoleDataList(dto));
     }
 
+    @ApiOperation("玩家登陆日志列表")
+    @PreAuthorize(permissionKey = "playerData:player:loginLog")
+    @PostMapping("/login/list")
+    public ResultVO<Page<Map>> getPlayerLoginLogDataList(@RequestBody PlayerLoginLogDataListDTO dto) {
+        return ResultVO.ok(playerDataService.getPlayerLoginLogDataList(dto));
+    }
+
+    @ApiOperation("登陆IP玩家列表")
+    @PreAuthorize(permissionKey = "playerData:player:banned")
+    @PostMapping("/banned/list")
+    public ResultVO<Page<Map>> getPlayerBannedDataList(@RequestBody PlayerBannedListDTO dto) {
+        return ResultVO.ok(playerDataService.getPlayerBannedDataList(dto));
+    }
+
 }

+ 21 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PlayerBannedListDTO.java

@@ -0,0 +1,21 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import com.zanxiang.game.data.serve.pojo.base.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author tianhua
+ * @time 2023/10/8
+ * @Description
+ **/
+@Data
+public class PlayerBannedListDTO extends BasePage {
+
+    /**
+     * 登陆IP
+     */
+    @ApiModelProperty(value = "登陆IP")
+    private String ip;
+
+}

+ 107 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/PlayerLoginLogDataListDTO.java

@@ -0,0 +1,107 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import com.zanxiang.game.data.serve.pojo.base.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+/**
+ * @author tianhua
+ * @time 2023/10/8
+ * @Description 前端查询用户登陆日志参数实体
+ **/
+@Data
+public class PlayerLoginLogDataListDTO extends BasePage {
+
+    /**
+     * 开始时间
+     */
+    @ApiModelProperty(value = "开始时间")
+    private LocalDate beginDate;
+
+    /**
+     * 登陆结束时间
+     */
+    @ApiModelProperty(value = "结束时间")
+    private LocalDate endDate;
+
+    /**
+     * SDK来源
+     */
+    @ApiModelProperty(value = "SDK来源")
+    private String sourceSystem;
+
+    /**
+     * 用户名
+     */
+    @ApiModelProperty(value = "用户名")
+    private String username;
+
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty(value = "用户ID")
+    private Long userId;
+
+    /**
+     * 角色ID
+     */
+    @ApiModelProperty(value = "角色ID")
+    private Long roleId;
+
+    /**
+     * 角色名
+     */
+    @ApiModelProperty(value = "角色名")
+    private String roleName;
+
+    /**
+     * 游戏ID
+     */
+    @ApiModelProperty(value = "游戏ID")
+    private Long gameId;
+
+    /**
+     * 父游戏ID
+     */
+    @ApiModelProperty(value = "父游戏ID")
+    private Long parentGameId;
+
+    /**
+     * 游戏类型
+     */
+    @ApiModelProperty(value = "游戏类型")
+    private Long gameClassify;
+
+    /**
+     * 区服ID
+     */
+    @ApiModelProperty(value = "区服ID")
+    private Long serverId;
+
+    /**
+     * 操作系统
+     */
+    @ApiModelProperty(value = "操作系统")
+    private String os;
+
+    /**
+     * 登陆IP
+     */
+    @ApiModelProperty(value = "登陆IP")
+    private String ip;
+
+    /**
+     * 客户端类型:1-安卓APP;2-iosAPP;3-H5网页;4-小程序
+     */
+    @ApiModelProperty(value = "客户端类型:1-安卓APP;2-iosAPP;3-H5网页;4-小程序")
+    private Long deviceType;
+
+    /**
+     * 类型:0-注册;1-登陆;2-退出
+     */
+    @ApiModelProperty(value = "类型:0-注册;1-登陆;2-退出")
+    private Long type;
+
+}

+ 73 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/enums/DeviceTypeEnum.java

@@ -0,0 +1,73 @@
+package com.zanxiang.game.data.serve.pojo.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Objects;
+
+/**
+ * @author : tianhua
+ * @time : 2023-10-09
+ * @description : 客户端类型枚举
+ */
+@Getter
+@AllArgsConstructor
+public enum DeviceTypeEnum {
+
+    /**
+     * 安卓APP
+     */
+    ANDROID_APP(1, "安卓APP"),
+
+    /**
+     * 苹果iosAPP
+     */
+    IOS_APP(2, "iosAPP"),
+
+    /**
+     * H5网页
+     */
+    H5(3, "H5网页"),
+
+    /**
+     * 小程序
+     */
+    APPLET(4, "小程序");
+
+    /**
+     * 标识ID
+     */
+    private Integer id;
+
+    /**
+     * 类型名
+     */
+    private String name;
+
+    /**
+     * 获取客户端类型名字
+     *
+     * @param deviceTypeId id
+     * @return {@link String}
+     */
+    public static String getName(Integer deviceTypeId) {
+        DeviceTypeEnum deviceType = DeviceTypeEnum.getDeviceType(deviceTypeId);
+        return deviceType == null ? null : deviceType.getName();
+    }
+
+    /**
+     * 获取客户端类型枚举
+     *
+     * @param deviceTypeId id
+     * @return DeviceTypeEnum
+     */
+    public static DeviceTypeEnum getDeviceType(Integer deviceTypeId) {
+        for (DeviceTypeEnum deviceTypeEnum : DeviceTypeEnum.values()) {
+            if (Objects.equals(deviceTypeEnum.getId(), deviceTypeId)) {
+                return deviceTypeEnum;
+            }
+        }
+        return null;
+    }
+
+}

+ 64 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/enums/LogTypeEnum.java

@@ -0,0 +1,64 @@
+package com.zanxiang.game.data.serve.pojo.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author : tianhua
+ * @time : 2023-10-09
+ * @description : 登陆类型
+ */
+@Getter
+@AllArgsConstructor
+public enum LogTypeEnum {
+
+    /**
+     * 注册
+     */
+    LOGIN_REG(0, "注册"),
+
+    /**
+     * 登录
+     */
+    LOGIN_IN(1, "登录"),
+
+    /**
+     * 退出
+     */
+    LOGIN_OUT(2, "退出");
+
+    /**
+     * 标识ID
+     */
+    private Integer id;
+
+    /**
+     * 类型
+     */
+    private String name;
+
+    /**
+     * 获取登陆枚举
+     * @param logTypeId 登陆类型ID
+     * @return LogTypeEnum
+     */
+    public static LogTypeEnum getLogTypeEnum(Integer logTypeId) {
+        for (LogTypeEnum logTypeEnum : LogTypeEnum.values()) {
+            if (logTypeEnum.id.equals(logTypeId)) {
+                return logTypeEnum;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取登陆类型的名字
+     * @param logTypeId 登陆类型id
+     * @return String
+     */
+    public static String getLogTypeName(Integer logTypeId) {
+        LogTypeEnum logTypeEnum = LogTypeEnum.getLogTypeEnum(logTypeId);
+        return logTypeEnum == null ? null : logTypeEnum.getName();
+    }
+
+}

+ 17 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IPlayerDataService.java

@@ -1,11 +1,15 @@
 package com.zanxiang.game.data.serve.service;
 
+import com.zanxiang.game.data.serve.pojo.dto.PlayerBannedListDTO;
 import com.zanxiang.game.data.serve.pojo.dto.PlayerDataListDTO;
+import com.zanxiang.game.data.serve.pojo.dto.PlayerLoginLogDataListDTO;
 import com.zanxiang.game.data.serve.pojo.dto.PlayerRoleDataListDTO;
 import com.zanxiang.game.data.serve.pojo.vo.PlayerDataVO;
 import com.zanxiang.game.data.serve.pojo.vo.PlayerRoleDataVO;
 import com.zanxiang.game.data.serve.utils.Page;
 
+import java.util.Map;
+
 /**
  * @author tianhua
  * @time 2023/9/6
@@ -27,4 +31,17 @@ public interface IPlayerDataService {
      */
     Page<PlayerRoleDataVO> getPlayerRoleDataList(PlayerRoleDataListDTO dto);
 
+    /**
+     * 玩家登陆日志列表
+     * @param dto PlayerLoginLogDataListDTO
+     * @return Page<Map>
+     */
+    Page<Map> getPlayerLoginLogDataList(PlayerLoginLogDataListDTO dto);
+
+    /**
+     * 封禁玩家列表
+     * @param dto PlayerBannedListDTO
+     * @return Page<Map>
+     */
+    Page<Map> getPlayerBannedDataList(PlayerBannedListDTO dto);
 }

+ 294 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PlayerDataServiceImpl.java

@@ -1,14 +1,19 @@
 package com.zanxiang.game.data.serve.service.impl;
 
 import com.zanxiang.game.data.serve.component.DataPowerComponent;
+import com.zanxiang.game.data.serve.pojo.dto.PlayerBannedListDTO;
 import com.zanxiang.game.data.serve.pojo.dto.PlayerDataListDTO;
+import com.zanxiang.game.data.serve.pojo.dto.PlayerLoginLogDataListDTO;
 import com.zanxiang.game.data.serve.pojo.dto.PlayerRoleDataListDTO;
+import com.zanxiang.game.data.serve.pojo.enums.DeviceTypeEnum;
 import com.zanxiang.game.data.serve.pojo.enums.GameCategoryEnum;
+import com.zanxiang.game.data.serve.pojo.enums.LogTypeEnum;
 import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
 import com.zanxiang.game.data.serve.pojo.vo.PlayerDataVO;
 import com.zanxiang.game.data.serve.pojo.vo.PlayerRoleDataVO;
 import com.zanxiang.game.data.serve.service.IPlayerDataService;
 import com.zanxiang.game.data.serve.utils.Page;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.nutz.dao.Cnd;
@@ -20,8 +25,10 @@ import org.nutz.dao.sql.Sql;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -30,6 +37,7 @@ import java.util.stream.Collectors;
  * @Description 玩家数据的逻辑实现层
  **/
 @Service
+@Slf4j
 public class PlayerDataServiceImpl implements IPlayerDataService {
 
     @Autowired
@@ -326,6 +334,141 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
         return new Page<>(list, pager);
     }
 
+    /**
+     * 玩家登陆日志列表
+     * @param dto PlayerLoginLogDataListDTO
+     * @return Page<Map>
+     */
+    @Override
+    public Page<Map> getPlayerLoginLogDataList(PlayerLoginLogDataListDTO dto) {
+        //查询条件
+        Criteria cri = Cnd.cri();
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            cri.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        if (dto.getBeginDate() != null && dto.getEndDate() != null) {
+            //日期查询条件
+            cri.where().andBetween("DATE(dt)", dto.getBeginDate(), dto.getEndDate());
+        }
+        if (StringUtils.isNotBlank(dto.getUsername())) {
+            cri.where().andEquals("username", dto.getUsername());
+        }
+        if (dto.getUserId() != null) {
+            cri.where().andEquals("user_id", dto.getUserId());
+        }
+        if (dto.getGameId() != null) {
+            cri.where().andEquals("game_id", dto.getGameId());
+        }
+        if (dto.getGameClassify() != null) {
+            cri.where().andEquals("classify", dto.getGameClassify());
+        }
+        if (dto.getParentGameId() != null) {
+            cri.where().andEquals("parent_game_id", dto.getParentGameId());
+        }
+        if (dto.getRoleId() != null) {
+            cri.where().andEquals("role_id", dto.getRoleId());
+        }
+        if (StringUtils.isNotBlank(dto.getRoleName())) {
+            cri.where().andEquals("role_name", dto.getRoleName());
+        }
+        if (dto.getServerId() != null) {
+            cri.where().andEquals("server_id", dto.getServerId());
+        }
+        if (StringUtils.isNotBlank(dto.getOs())) {
+            cri.where().andEquals("os", dto.getOs());
+        }
+        if (dto.getDeviceType() != null) {
+            cri.where().andEquals("device_type", dto.getDeviceType());
+        }
+        if (dto.getType() != null) {
+            cri.where().andEquals("log_type", dto.getType());
+        }
+        //分页
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        //获取记录数
+        Sql countSql = Sqls.create(getPlayerLoginLogDataCountSql() + cri);
+        countSql.setCallback(Sqls.callback.integer());
+        dao.execute(countSql);
+        pager.setRecordCount(countSql.getInt());
+
+        //添加默认排序
+        cri.getOrderBy().orderBy("dt", OrderByEnum.DESC.getOrderType());
+        //创建SQL语句
+        Sql sql = Sqls.create(getPlayerLoginLogDataSql() + cri);
+        sql.setCallback(Sqls.callback.maps());
+        sql.setPager(pager);
+        //获取结果
+        dao.execute(sql);
+        List<Map> list = sql.getList(Map.class).stream().map( map -> {
+            //获取游戏类型
+            String gameClassify = GameCategoryEnum.getNameByCategory(Long.valueOf((Integer)map.get("classify")));
+            if (StringUtils.isNotBlank(gameClassify)) {
+                map.put("classify", gameClassify);
+            }
+            //获取客户端类型
+            String deviceType = DeviceTypeEnum.getName((Integer) map.get("device_type"));
+            if (StringUtils.isNotBlank(deviceType)) {
+                map.put("device_type", deviceType);
+            }
+            //获取登陆类型
+            String logTypeName = LogTypeEnum.getLogTypeName((Integer) map.get("log_type"));
+            if (StringUtils.isNotBlank(logTypeName)) {
+                map.put("log_type", logTypeName);
+            }
+
+            return map;
+        }).collect(Collectors.toList());
+
+        return new Page<>(list, pager);
+    }
+
+    /**
+     * 登陆IP玩家列表
+     * @param dto PlayerBannedListDTO
+     * @return Page<Map>
+     */
+    @Override
+    public Page<Map> getPlayerBannedDataList(PlayerBannedListDTO dto) {
+        Criteria cri = Cnd.cri();
+        if (StringUtils.isBlank(dto.getIp())) {
+            return null;
+        }
+        cri.where().andEquals("ip", dto.getIp());
+        cri.where().andEquals("source_system", "ZX_ONE");
+        //查询出所有玩家的ID
+        Sql findUserIdSql = Sqls.create("""
+                SELECT
+                	DISTINCT user_id
+                FROM dm_game_order.t_user_login_log
+                """ + cri);
+        findUserIdSql.setCallback(Sqls.callback.longs());
+        dao.execute(findUserIdSql);
+        //执行结果
+        Collection userIds = findUserIdSql.getObject(Collection.class);
+        //分页
+        Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
+        //查询出用户列表
+        Criteria userMapCri = Cnd.cri();
+        userMapCri.where().andEquals("source_system", "ZX_ONE");
+        userMapCri.where().andInList("user_id", userIds.stream().toList());
+
+        //查询记录数
+        Sql userMapCountSql = Sqls.create(getUserMapCountSql() + userMapCri);
+        userMapCountSql.setCallback(Sqls.callback.integer());
+        dao.execute(userMapCountSql);
+        pager.setRecordCount(userMapCountSql.getInt());
+
+        //查询结果
+        Sql userMapSql = Sqls.create(getUserMapSql() + userMapCri);
+        userMapSql.setCallback(Sqls.callback.maps());
+        userMapSql.setPager(pager);
+        dao.execute(userMapSql);
+        List<Map> list = userMapSql.getList(Map.class);
+
+        return new Page<>(list, pager);
+    }
+
+
     /**
      * 查询玩家列表数据SQL
      * @return String
@@ -746,4 +889,155 @@ public class PlayerDataServiceImpl implements IPlayerDataService {
                 """;
     }
 
+    /**
+     * 玩家登陆日志查询列表
+     * @return String
+     */
+    private String getPlayerLoginLogDataSql() {
+        return """
+                SELECT
+                	*
+                FROM (
+                	SELECT
+                		a.source_system , -- SDK来源
+                		a.id , -- 主键id
+                		a.create_time as dt, -- 时间
+                		c.username , -- 玩家账号
+                		a.user_id , -- 用户id
+                		a.game_id , -- 登陆游戏id
+                		b.game_name , -- 登陆游戏名
+                		b.classify , -- 游戏类型
+                		IFNULL(b.parent_id, a.game_id ) as parent_game_id , -- 父游戏id
+                		IFNULL(e.game_name, b.game_name) as parent_game_name, -- 父游戏名
+                		b.super_game_id , -- 超父游戏id
+                		a.role_id , -- 角色id
+                		a.role_name , -- 角色名
+                		d.server_id , -- 区服id
+                		d.server_name , -- 区服名
+                		f.server_name as source_server_name, -- 原始区服名
+                		a.os , -- 操作系统
+                		a.ip , -- 登陆ip
+                		a.device_type , -- 客户端类型
+                		a.`type` as log_type -- 登陆类型 0-注册;1-登陆;2-退出
+                	FROM dm_game_order.t_user_login_log a
+                	LEFT JOIN dm_game_order.t_game b on a.source_system = b.source_system AND a.game_id = b.id
+                	LEFT JOIN dm_game_order.t_game_user c on a.source_system = c.source_system AND a.user_id = c.id
+                	LEFT JOIN dm_game_order.t_game_user_role d on a.source_system = d.source_system AND a.user_id = d.user_id AND a.role_id = d.role_id
+                	LEFT JOIN dm_game_order.t_game e on b.source_system = e.source_system AND b.parent_id = e.id
+                	LEFT JOIN dm_game_order.t_game_server_merge f on a.source_system = f.source_system AND b.super_game_id = f.game_id AND d.server_id = f.server_id
+                ) a
+                """;
+    }
+
+    /**
+     * 玩家登陆日志记录数
+     * @return String
+     */
+    private String getPlayerLoginLogDataCountSql() {
+        return """
+                SELECT
+                    COUNT(1)
+                FROM (
+                        SELECT
+                        *
+                    FROM (
+                        SELECT
+                            a.source_system , -- SDK来源
+                            a.id , -- 主键id
+                            a.create_time as dt, -- 时间
+                            c.username , -- 玩家账号
+                            a.user_id , -- 用户id
+                            a.game_id , -- 登陆游戏id
+                            b.game_name , -- 登陆游戏名
+                            b.classify , -- 游戏类型
+                            IFNULL(b.parent_id, a.game_id ) as parent_game_id , -- 父游戏id
+                            IFNULL(e.game_name, b.game_name) as parent_game_name, -- 父游戏名
+                            b.super_game_id , -- 超父游戏id
+                            a.role_id , -- 角色id
+                            a.role_name , -- 角色名
+                            d.server_id , -- 区服id
+                            d.server_name , -- 区服名
+                            f.server_name , -- 原始区服名
+                            a.os , -- 操作系统
+                            a.ip , -- 登陆ip
+                            a.device_type , -- 客户端类型
+                            a.`type` as log_type -- 登陆类型 0-注册;1-登陆;2-退出
+                        FROM dm_game_order.t_user_login_log a
+                        LEFT JOIN dm_game_order.t_game b on a.source_system = b.source_system AND a.game_id = b.id
+                        LEFT JOIN dm_game_order.t_game_user c on a.source_system = c.source_system AND a.user_id = c.id
+                        LEFT JOIN dm_game_order.t_game_user_role d on a.source_system = d.source_system AND a.user_id = d.user_id AND a.role_id = d.role_id
+                        LEFT JOIN dm_game_order.t_game e on b.source_system = e.source_system AND b.parent_id = e.id
+                        LEFT JOIN dm_game_order.t_game_server_merge f on a.source_system = f.source_system AND b.super_game_id = f.game_id AND d.server_id = f.server_id
+                    ) a
+                ) a
+                """;
+    }
+
+    /**
+     * 获取所有用户sql
+     * @return String
+     */
+    private String getUserMapSql() {
+        return """
+                SELECT
+                    *
+                FROM (
+                    SELECT
+                    	a.source_system ,
+                    	a.id as user_id,
+                    	a.username ,
+                    	a.nickname ,
+                    	b.role_id ,
+                    	b.role_name
+                    FROM dm_game_order.t_game_user a
+                    LEFT JOIN (
+                    	SELECT
+                    		source_system ,
+                    		user_id ,
+                    		role_id ,
+                    		role_name ,
+                    		ROW_NUMBER() OVER(PARTITION BY user_id,source_system order by create_time desc) as num
+                    	FROM dm_game_order.t_user_login_log
+                    	WHERE NOT role_id = 'null'
+                    ) b on a.source_system = b.source_system AND a.id = b.user_id AND b.num = 1
+                ) a
+                """;
+    }
+
+    /**
+     * 获取所有用户记录数sql
+     * @return String
+     */
+    private String getUserMapCountSql() {
+        return """
+                SELECT
+                    COUNT(1)
+                FROM (
+                    SELECT
+                        *
+                    FROM (
+                        SELECT
+                            a.source_system ,
+                            a.id as user_id,
+                            a.username ,
+                            a.nickname ,
+                            b.role_id ,
+                            b.role_name
+                        FROM dm_game_order.t_game_user a
+                        LEFT JOIN (
+                            SELECT
+                                source_system ,
+                                user_id ,
+                                role_id ,
+                                role_name ,
+                                ROW_NUMBER() OVER(PARTITION BY user_id,source_system order by create_time desc) as num
+                            FROM dm_game_order.t_user_login_log
+                            WHERE NOT role_id = 'null'
+                        ) b on a.source_system = b.source_system AND a.id = b.user_id AND b.num = 1
+                    ) a
+                ) a
+                """;
+    }
+
+
 }