Quellcode durchsuchen

update 新增获取玩家列表、获取玩家详情、获取玩家中奖记录(默认查询最近三天)接口

Alvin vor 8 Monaten
Ursprung
Commit
1fe329acfe

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

@@ -0,0 +1,69 @@
+package controller
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/mhaya/game/game_cluster/internal/code"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/common"
+	"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 {
+		common.PackOkResult(ctx, code.ParamError)
+		return
+	}
+	resp, err := w.sev.List(ctx, req)
+	if err != nil {
+		common.PackOkResult(ctx, err.Code)
+		return
+	}
+
+	common.PackOkResult(ctx, code.OK, resp)
+}
+
+// 获取玩家详情
+func (w *PlayerManage) GetPlayerInfo(ctx *gin.Context) {
+	req := entity.PlayerInfoReq{}
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		common.PackOkResult(ctx, code.ParamError)
+		return
+	}
+
+	resp, err := w.sev.PlayerInfo(ctx, req)
+	if err != nil {
+		common.PackOkResult(ctx, err.Code)
+		return
+	}
+
+	common.PackOkResult(ctx, code.OK, resp)
+}
+
+// 获取玩家中奖记录(默认查询最近三天)
+func (w *PlayerManage) GetRewardList(ctx *gin.Context) {
+	req := entity.RewardListReq{}
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		common.PackOkResult(ctx, code.ParamError)
+		return
+	}
+
+	resp, err := w.sev.RewardList(ctx, req)
+	if err != nil {
+		common.PackOkResult(ctx, err.Code)
+		return
+	}
+
+	common.PackOkResult(ctx, code.OK, resp)
+}

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

@@ -61,3 +61,100 @@ 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 {
+	Details []*PlayerListDetail `json:"details"`
+	Total   int64               `json:"total"`
+}
+
+type PlayerListDetail 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"`       // 是否已领取首次登陆奖励
+}
+
+type RewardListReq struct {
+	Page      int    `json:"page" binding:"required"`
+	Size      int    `json:"size" binding:"required"`
+	UserName  string `json:"userName"`   // 用户名
+	StartTime int64  `json:"start_time"` // 开始时间
+	EndTime   int64  `json:"end_time"`   // 结束时间
+}
+
+type RewardListResp struct {
+	Details []*RewardListDetail `json:"details"`
+	Total   int64               `json:"total"`
+}
+
+type RewardListDetail struct {
+	UserName   string        `json:"userName" bson:"userName"` // 用户名
+	AddReward  []*ItemReward `json:"AddReward" bson:"addReward"`
+	CreateTime int64         `json:"createTime" bson:"createTime"`
+}
+
+type ItemReward struct {
+	ItemID   int    // itemID:道具ID
+	Amount   int    // amount:数量
+	ItemName string // itemName:道具名称
+}

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

@@ -53,6 +53,11 @@ func (c *Controller) InitApiRouter(u *gin.RouterGroup) {
 	u.POST("/statistics/user/list", controller.NewSynthesis(nodeId).UserList)
 	u.POST("/user/log/daily", controller.NewSynthesis(nodeId).FindUserLogDaily)
 
+	// 玩家相关信息
+	u.POST("/player/list", controller.NewPlayerManage().GetPlayerlist)
+	u.POST("/player/info", controller.NewPlayerManage().GetPlayerInfo)
+	u.POST("/player/rewardList", controller.NewPlayerManage().GetRewardList)
+
 	// 转盘统计
 	u.POST("/statistics/turntable", controller.NewSynthesis(nodeId).Turntable)
 

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

@@ -0,0 +1,251 @@
+package service
+
+import (
+	"context"
+	"time"
+
+	mhayaTime "github.com/mhaya/extend/time"
+	"github.com/mhaya/game/game_cluster/internal/code"
+	"github.com/mhaya/game/game_cluster/internal/constant"
+	"github.com/mhaya/game/game_cluster/internal/data"
+	"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/common"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
+	mhayaLogger "github.com/mhaya/logger"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
+)
+
+type PlayerManage struct {
+	db *mongo.Database
+}
+
+func NewPlayerManage() *PlayerManage {
+	return &PlayerManage{
+		db: mdb.MDB,
+	}
+}
+
+// 获取玩家列表
+func (a *PlayerManage) List(ctx context.Context, req entity.PlayerListReq) (*entity.PlayerListResp, *code.Result) {
+	page, pageSize := checkPageParam(req.Page, req.Size)
+
+	// 构建查询条件
+	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 := a.db.Collection(constant.CNamePlayer).Find(ctx, filter, findOptions)
+	if err != nil {
+		mhayaLogger.Warnf("List Find error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+	defer func() {
+		if closeErr := cursor.Close(ctx); closeErr != nil {
+			mhayaLogger.Warnf("Error closing cursor: %v", closeErr)
+		}
+	}()
+
+	// 解析结果
+	details := make([]*entity.PlayerListDetail, 0)
+	for cursor.Next(ctx) {
+		var detail entity.PlayerListDetail
+		if err := cursor.Decode(&detail); err != nil {
+			mhayaLogger.Warnf("List Decode error:%v", err)
+			return nil, common.NewResult(code.InternalError)
+		}
+		details = append(details, &detail)
+	}
+	if err := cursor.Err(); err != nil {
+		mhayaLogger.Warnf("List cursor error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	count, codeResult := a.GetPlayerTotalCount()
+	if codeResult != nil {
+		mhayaLogger.Warnf("List GetPlayerTotalCount codeResult:%v", codeResult)
+		return nil, codeResult
+	}
+
+	return &entity.PlayerListResp{
+		Details: details,
+		Total:   count,
+	}, nil
+}
+
+func (a *PlayerManage) GetPlayerTotalCount() (int64, *code.Result) {
+	count := 0
+	playerServerLoadStats, codeResult := NewAdmin().GetServerStatus(context.Background())
+	if codeResult != nil {
+		return 0, codeResult
+	}
+
+	for _, v := range playerServerLoadStats {
+		count += int(v.TotalUser)
+	}
+
+	return int64(count), nil
+}
+
+// 获取玩家详情
+func (a *PlayerManage) PlayerInfo(ctx context.Context, req entity.PlayerInfoReq) (*entity.PlayerInfoResp, *code.Result) {
+	var player models.Player
+	err := a.db.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": req.UserName}).Decode(&player)
+	if err != nil {
+		mhayaLogger.Warnf("PlayerInfo cursor error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	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
+}
+
+// 获取玩家中奖记录(默认查询最近三天)
+func (a *PlayerManage) RewardList(ctx context.Context, req entity.RewardListReq) (*entity.RewardListResp, *code.Result) {
+	page, pageSize := checkPageParam(req.Page, req.Size)
+
+	// 构建查询条件
+	filter := bson.M{}
+	if req.UserName != "" {
+		filter["userName"] = bson.M{"$regex": escapeRegex(req.UserName), "$options": "i"}
+	}
+
+	startTime := mhayaTime.Now().StartOfDay().Unix()
+	endTime := mhayaTime.Now().EndOfDay().Add(3 * 24 * time.Hour).Unix()
+	if req.StartTime > 0 && req.StartTime < req.EndTime {
+		startTime = req.StartTime
+	}
+
+	if req.EndTime > 0 && req.EndTime <= endTime {
+		endTime = req.EndTime
+	}
+
+	filter["createTime"] = bson.M{
+		"$gte": startTime,
+		"$lte": endTime,
+	}
+
+	// 设置分页选项
+	skip := (page - 1) * pageSize
+	limit := pageSize
+	findOptions := options.Find().SetSkip(int64(skip)).SetLimit(int64(limit))
+
+	collection := a.db.Collection(constant.CNamePlayerReward)
+	// 获取总数total
+	count, err := collection.CountDocuments(ctx, filter)
+	if err != nil {
+		mhayaLogger.Warnf("RewardList count error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	// 执行查询
+	cursor, err := collection.Find(ctx, filter, findOptions)
+	if err != nil {
+		mhayaLogger.Warnf("RewardList Find error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+	defer func() {
+		if closeErr := cursor.Close(ctx); closeErr != nil {
+			mhayaLogger.Warnf("Error closing cursor: %v", closeErr)
+		}
+	}()
+
+	// 解析结果
+	results := make([]*entity.RewardListDetail, 0)
+	for cursor.Next(ctx) {
+		var result entity.RewardListDetail
+		if err := cursor.Decode(&result); err != nil {
+			mhayaLogger.Warnf("RewardList Decode error:%v", err)
+			return nil, common.NewResult(code.InternalError)
+		}
+		results = append(results, &result)
+	}
+	if err := cursor.Err(); err != nil {
+		mhayaLogger.Warnf("RewardList cursor error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	for _, result := range results {
+		for _, v := range result.AddReward {
+			cfg, exist := data.ItemConfig.Get(v.ItemID)
+			if exist {
+				v.ItemName = cfg.ItemKey
+			}
+		}
+	}
+
+	return &entity.RewardListResp{
+		Details: results,
+		Total:   count,
+	}, nil
+}