Browse Source

update 新增玩家列表接口、玩家详情接口

Alvin 8 months ago
parent
commit
c1c0ed4c2a

+ 66 - 0
game/game_cluster/nodes/webadmin/controller/player.go

@@ -0,0 +1,66 @@
+package controller
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/service"
+)
+
+type PlayerManage struct {
+	sev *service.PlayerManage
+}
+
+func NewPlayerManage() *PlayerManage {
+	return &PlayerManage{
+		sev: service.NewPlayerManage(),
+	}
+}
+
+func (w *PlayerManage) GetPlayerlist(ctx *gin.Context) {
+	req := entity.PlayerListReq{}
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	resp, total, err := w.sev.List(ctx, req)
+	if err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	ctx.JSON(200, gin.H{
+		"code":  200,
+		"data":  resp,
+		"msg":   "success",
+		"total": total,
+	})
+}
+
+func (w *PlayerManage) GetPlayerInfo(ctx *gin.Context) {
+	req := entity.PlayerInfoReq{}
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	resp, err := w.sev.PlayerInfo(ctx, req)
+	if err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	ctx.JSON(200, gin.H{
+		"code": 200,
+		"data": resp,
+		"msg":  "success",
+	})
+}

+ 67 - 0
game/game_cluster/nodes/webadmin/entity/admin.go

@@ -57,3 +57,70 @@ type AdminUpdateStatusReq struct {
 	Username string `json:"username"`
 	Status   int    `json:"status"`
 }
+
+type PlayerListReq struct {
+	Page        int    `json:"page" binding:"required"`
+	Size        int    `json:"size" binding:"required"`
+	UserName    string `json:"userName"`                    // 用户名
+	NickName    string `json:"nickName" bson:"nickName"`    // 昵称
+	OpenId      string `json:"openId" bson:"openId"`        // 对应tgid
+	Pid         string `json:"pid" bson:"pid"`              // 上级ID
+	XID         string `json:"xID" bson:"xID"`              // 绑定推特ID
+	TonWall     string `json:"tonWall" bson:"tonWall"`      // 绑定钱包地址
+	Email       string `json:"email" bson:"email"`          // 邮箱
+	LevelMin    int    `json:"levelMin" bson:"level"`       // 等级最小值
+	LevelMax    int    `json:"levelMax" bson:"level"`       // 等级最大值
+	Status      int    `json:"status" bson:"status"`        // 状态 1:有效 2:禁用
+	LoginIP     string `json:"loginIP" bson:"loginIP"`      // 登录IP
+	JoinTimeMin int64  `json:"joinTimeMin" bson:"joinTime"` // 注册时间最小值
+	JoinTimeMax int64  `json:"joinTimeMax" bson:"joinTime"` // 注册时间最大值
+}
+
+type PlayerListResp struct {
+	UserName      string `json:"userName" bson:"userName"`           // 用户名
+	OpenId        string `json:"openId" bson:"openId"`               // 对应tgid
+	UserNameMaybe string `json:"userNameMaybe" bson:"userNameMaybe"` // 昵称
+	NickName      string `json:"nickName" bson:"nickName"`           // 昵称
+	Pid           string `json:"pid" bson:"pid"`                     // 上级ID
+	XID           string `json:"xID" bson:"xID"`                     // 绑定推特ID
+	TonWall       string `json:"tonWall" bson:"tonWall"`             // 绑定钱包地址
+	Email         string `json:"email" bson:"email"`                 // 邮箱
+	Level         int    `json:"level" bson:"level"`                 // 等级
+	Status        int    `json:"status" bson:"status"`               // 状态  1:有效 2:禁用
+	LoginTime     int64  `json:"loginTime" bson:"loginTime"`         // 登陆时间
+	LoginIP       string `json:"loginIP" bson:"loginIP"`             // 登录IP
+	JoinIP        string `json:"joinIP" bson:"joinIP"`               // 注册IP
+	JoinTime      int64  `json:"joinTime" bson:"joinTime"`           // 注册时间
+}
+
+type PlayerInfoReq struct {
+	UserName string `json:"userName" binding:"required"` // 用户名
+}
+
+type PlayerInfoResp struct {
+	UserName       string `json:"userName" bson:"userName"`             // 用户名
+	OpenId         string `json:"openId" bson:"openId"`                 // 对应tgid
+	UserNameMaybe  string `json:"userNameMaybe" bson:"userNameMaybe"`   // 昵称
+	NickName       string `json:"nickName" bson:"nickName"`             // 昵称
+	Pid            string `json:"pid" bson:"pid"`                       // 上级ID
+	XID            string `json:"xID" bson:"xID"`                       // 绑定推特ID
+	TonWall        string `json:"tonWall" bson:"tonWall"`               // 绑定钱包地址
+	Email          string `json:"email" bson:"email"`                   // 邮箱
+	Level          int    `json:"level" bson:"level"`                   // 等级
+	Status         int    `json:"status" bson:"status"`                 // 状态  1:有效 2:禁用
+	LoginTime      int64  `json:"loginTime" bson:"loginTime"`           // 登陆时间
+	LoginIP        string `json:"loginIP" bson:"loginIP"`               // 登录IP
+	JoinIP         string `json:"joinIP" bson:"joinIP"`                 // 注册IP
+	JoinTime       int64  `json:"joinTime" bson:"joinTime"`             // 注册时间
+	Avatar         string `json:"avatar" bson:"avatar"`                 // 头像
+	IsRobot        int    `json:"isRobot" bson:"isRobot"`               // 是否为机器人
+	IsLeader       int    `json:"isLeader" bson:"isLeader"`             // 是否是社区长
+	IsVip          int    `json:"isVip" bson:"isVip"`                   // 是否为VIP
+	Successions    int    `json:"successions" bson:"successions"`       // 连续登陆天数
+	MaxSuccessions int    `json:"maxSuccessions" bson:"maxSuccessions"` // 最大连续等级天数
+	PrevTime       int64  `json:"prevTime" bson:"prevTime"`             // 上次登陆时间
+	UpdateTime     int64  `json:"updateTime" bson:"updateTime"`         // 更新时间
+	IsDrawShare    int    `json:"isDrawShare" bson:"isDrawShare"`       // 0未领取,1已领取
+	DrawShareTime  int64  `json:"drawShareTime" bson:"drawShareTime"`   // 领取时间
+	FirstReward    int    `json:"firstReward" bson:"firstReward"`       // 是否已领取首次登陆奖励
+}

+ 2 - 0
game/game_cluster/nodes/webadmin/router/router.go

@@ -69,6 +69,8 @@ func (c *Controller) InitApiRouter(u *gin.RouterGroup) {
 	u.POST("/whitelist/add", controller.NewWhitelist().AddWhitelist)
 	u.POST("/whitelist/remove", controller.NewWhitelist().RemoveWhitelist)
 	u.POST("/whitelist/list", controller.NewWhitelist().GetWhitelist)
+	u.POST("/player/list", controller.NewPlayerManage().GetPlayerlist)
+	u.POST("/player/info", controller.NewPlayerManage().GetPlayerInfo)
 }
 
 // func (c *Controller) InitMdb() {

+ 153 - 0
game/game_cluster/nodes/webadmin/service/playerMange.go

@@ -0,0 +1,153 @@
+package service
+
+import (
+	"context"
+	"log"
+
+	"github.com/mhaya/game/game_cluster/internal/constant"
+	"github.com/mhaya/game/game_cluster/internal/mdb"
+	"github.com/mhaya/game/game_cluster/internal/mdb/models"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo/options"
+)
+
+type PlayerManage struct {
+}
+
+func NewPlayerManage() *PlayerManage {
+	return &PlayerManage{}
+}
+
+// 获取玩家列表
+func (a *PlayerManage) List(ctx context.Context, req entity.PlayerListReq) ([]*entity.PlayerListResp, int64, error) {
+	page := req.Page
+	// 验证参数
+	if page <= 0 {
+		page = 1
+	}
+	pageSize := req.Size
+	if pageSize <= 0 {
+		pageSize = 10
+	}
+
+	// 构建查询条件
+	filter := bson.M{}
+	if req.UserName != "" {
+		filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
+	}
+	if req.NickName != "" {
+		filter["nickName"] = bson.M{"$regex": escapeRegex(req.NickName), "$options": "i"}
+	}
+	if req.OpenId != "" {
+		filter["openId"] = req.OpenId
+	}
+	if req.Pid != "" {
+		filter["pid"] = req.Pid
+	}
+	if req.XID != "" {
+		filter["xID"] = req.XID
+	}
+	if req.TonWall != "" {
+		filter["tonWall"] = req.TonWall
+	}
+	if req.Email != "" {
+		filter["email"] = req.Email
+	}
+	if req.LevelMin > 0 && req.LevelMax > 0 && req.LevelMin <= req.LevelMax {
+		filter["level"] = bson.M{
+			"$gte": req.LevelMin,
+			"$lte": req.LevelMax,
+		}
+	}
+	if req.Status > 0 {
+		filter["status"] = req.Status
+	}
+	if req.LoginIP != "" {
+		filter["loginIP"] = req.LoginIP
+	}
+	if req.JoinTimeMin > 0 && req.JoinTimeMax > 0 && req.JoinTimeMin <= req.JoinTimeMax {
+		filter["joinTime"] = bson.M{
+			"$gte": req.JoinTimeMin,
+			"$lte": req.JoinTimeMax,
+		}
+	}
+
+	// 设置分页选项
+	skip := (page - 1) * pageSize
+	limit := pageSize
+	findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit))
+
+	// 执行查询
+	cursor, err := mdb.MDB.Collection(constant.CNamePlayer).Find(ctx, filter, findOptions)
+	if err != nil {
+		return nil, 0, err
+	}
+	defer func() {
+		if closeErr := cursor.Close(ctx); closeErr != nil {
+			log.Printf("Error closing cursor: %v", closeErr)
+		}
+	}()
+
+	// 解析结果
+	results := make([]*entity.PlayerListResp, 0)
+	for cursor.Next(ctx) {
+		var result entity.PlayerListResp
+		if err := cursor.Decode(&result); err != nil {
+			return nil, 0, err
+		}
+		results = append(results, &result)
+	}
+	if err := cursor.Err(); err != nil {
+		return nil, 0, err
+	}
+
+	count := 0
+	playerServerLoadStats, err := NewAdmin().GetServerStatus(ctx)
+	if err != nil {
+		return nil, 0, err
+	}
+
+	for _, v := range playerServerLoadStats {
+		count += int(v.TotalUser)
+	}
+
+	return results, int64(count), nil
+}
+
+// 获取玩家详情
+func (a *PlayerManage) PlayerInfo(ctx context.Context, req entity.PlayerInfoReq) (*entity.PlayerInfoResp, error) {
+	var player models.Player
+	err := mdb.MDB.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.UserName}).Decode(&player)
+	if err != nil {
+		return nil, err
+	}
+
+	return &entity.PlayerInfoResp{
+		UserName:       player.UserName,
+		OpenId:         player.OpenId,
+		UserNameMaybe:  player.UserNameMaybe,
+		NickName:       player.NickName,
+		Pid:            player.Pid,
+		XID:            player.XID,
+		TonWall:        player.TonWall,
+		Email:          player.Email,
+		Level:          player.Level,
+		Status:         player.Status,
+		LoginTime:      player.LoginTime,
+		LoginIP:        player.LoginIP,
+		JoinIP:         player.JoinIP,
+		JoinTime:       player.JoinTime,
+		Avatar:         player.Avatar,
+		IsRobot:        player.IsRobot,
+		IsLeader:       player.IsLeader,
+		IsVip:          player.IsVip,
+		Successions:    player.Successions,
+		MaxSuccessions: player.MaxSuccessions,
+		PrevTime:       player.PrevTime,
+		UpdateTime:     player.UpdateTime,
+		IsDrawShare:    player.Share.IsDrawShare,
+		DrawShareTime:  player.Share.DrawShareTime,
+		FirstReward:    player.FirstReward,
+	}, nil
+}