Prechádzať zdrojové kódy

update 完善用户相关接口

Alvin 8 mesiacov pred
rodič
commit
6414cebafe

+ 4 - 0
game/game_cluster/internal/mdb/eventmodels/basic.go

@@ -16,6 +16,10 @@ type UserBasic struct {
 	ParentUserId      string `json:"parent_user_id"`        // 上级用户id
 	IsRobot           bool   `json:"is_robot"`              // 是否为机器人
 	IfInviteUserTgVip bool   `json:"if_invite_user_tg_vip"` // 被邀请用户是否为telegram会员
+	TonWall           string `json:"tonWall"`               // 绑定钱包地址
+	Email             string `json:"email"`                 // 邮箱
+	Level             int    `json:"level"`                 // 等级
+	UserStatus        int    `json:"user_status"`           // 用户账号状态  1:有效 2:禁用
 	PointsRankSeq     int64  `json:"points_rank_seq"`       // 积分排名
 	ThrowDiceRankSeq  int64  `json:"throw_dice_rank_seq"`   // 投掷骰子次数排名
 	InviteUserRankSeq int64  `json:"invite_user_rank_seq"`  // 邀请人数排名

+ 1 - 1
game/game_cluster/internal/mdb/eventmodels/userRegisterEvent.go

@@ -7,7 +7,7 @@ type UserRegisterEventContent struct {
 	Ip       string `json:"ip"`       // IP
 	Platform string `json:"platform"` // 平台
 	Channel  string `json:"channel"`  // 渠道
-	Source   string `json:"source"`   // 来源
+	Source   string `json:"source"`   // 来源 eg:来自某活动
 }
 
 func (e *UserRegisterEventContent) EventName() string {

+ 13 - 14
game/game_cluster/nodes/webadmin/entity/admin.go

@@ -88,20 +88,19 @@ type PlayerListResp struct {
 }
 
 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"`           // 注册时间
+	UserName  string `json:"userName" bson:"userName"`   // 用户名
+	OpenId    string `json:"openId" bson:"openId"`       // 对应tgid
+	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 {

+ 356 - 114
game/game_cluster/nodes/webadmin/service/playerMange.go

@@ -8,6 +8,7 @@ import (
 	"github.com/mhaya/game/game_cluster/internal/code"
 	"github.com/mhaya/game/game_cluster/internal/constant"
 	"github.com/mhaya/game/game_cluster/internal/mdb"
+	"github.com/mhaya/game/game_cluster/internal/mdb/eventmodels"
 	"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"
@@ -15,6 +16,7 @@ import (
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/mongo"
 	"go.mongodb.org/mongo-driver/mongo/options"
+	"gorm.io/gorm"
 )
 
 type PlayerManage struct {
@@ -31,155 +33,395 @@ func NewPlayerManage() *PlayerManage {
 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
+	var registerRecords []*eventmodels.UserRegisterEventContent
+
+	where := &eventmodels.UserRegisterEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId:       req.UserName,
+			TgId:         req.OpenId,
+			XId:          req.XID,
+			ParentUserId: req.Pid,
+			TonWall:      req.TonWall,
+			Email:        req.Email,
+			UserStatus:   req.Status,
+		},
 	}
+	db := mdb.LogstashDB.Model(&eventmodels.UserRegisterEventContent{}).Where(where).Order("create_at")
+
 	if req.LevelMin > 0 && req.LevelMax == 0 {
-		filter["level"] = bson.M{
-			"$gte": req.LevelMin,
-			"$lte": 1000, // 等级最大值
-		}
+		db = db.Where("level >= ? and level <= ?", req.LevelMin, 1000) // 等级最大值 暂定1000
 	}
+
 	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
+		db = db.Where("level >= ? and level <= ?", req.LevelMin, req.LevelMax)
 	}
+
 	if req.JoinTimeMin > 0 && req.JoinTimeMax > 0 && req.JoinTimeMin <= req.JoinTimeMax {
-		filter["joinTime"] = bson.M{
-			"$gte": req.JoinTimeMin,
-			"$lte": req.JoinTimeMax,
-		}
+		db = db.Where("create_at >= ? and create_at <= ?", req.JoinTimeMin, 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 {
+	pages := Paginate(db, page, pageSize)
+	err := db.Scopes(pages.Limit).Find(&registerRecords).Error
+	if err != nil && err != gorm.ErrRecordNotFound {
 		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)
+
+	var results []*entity.PlayerListDetail
+	for _, v := range registerRecords {
+		// 获取最新的用户信息更新记录
+		var updateRecord *eventmodels.UserUpdateInfoEventContent
+		updateWhere := &eventmodels.UserUpdateInfoEventContent{
+			UserBasic: eventmodels.UserBasic{UserId: v.UserName, TgId: v.TgId},
+		}
+		err := mdb.LogstashDB.Model(&eventmodels.UserUpdateInfoEventContent{}).Where(updateWhere).Order("create_at desc").First(&updateRecord).Error
+		if err != nil && err != gorm.ErrRecordNotFound {
+			mhayaLogger.Warnf("List First updateRecord error:%v", err)
+			return nil, common.NewResult(code.InternalError)
 		}
-	}()
 
-	// 解析结果
-	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)
+		// 获取最新的用户登录记录
+		var loginRecord *eventmodels.UserLoginEventContent
+		loginWhere := &eventmodels.UserLoginEventContent{
+			UserBasic: eventmodels.UserBasic{UserId: v.UserName, TgId: v.TgId},
+		}
+		err = mdb.LogstashDB.Model(&eventmodels.UserLoginEventContent{}).Where(loginWhere).Order("create_at desc").First(&loginRecord).Error
+		if err != nil && err != gorm.ErrRecordNotFound {
+			mhayaLogger.Warnf("List First loginRecord 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
+		results = append(results, &entity.PlayerListDetail{
+			UserName: v.UserId,
+			OpenId: func() string {
+				if updateRecord == nil {
+					return v.TgId
+				}
+
+				return updateRecord.TgId
+			}(),
+			NickName: func() string {
+				if updateRecord == nil {
+					return v.UserName
+				}
+
+				return updateRecord.UserName
+			}(),
+			Pid: func() string {
+				if updateRecord == nil {
+					return v.ParentUserId
+				}
+
+				return updateRecord.ParentUserId
+			}(),
+			XID: func() string {
+				if updateRecord == nil {
+					return v.XId
+				}
+
+				return updateRecord.XId
+			}(),
+			TonWall: func() string {
+				if updateRecord == nil {
+					return v.TonWall
+				}
+
+				return updateRecord.TonWall
+			}(),
+			Email: func() string {
+				if updateRecord == nil {
+					return v.Email
+				}
+
+				return updateRecord.Email
+			}(),
+			Level: func() int {
+				if updateRecord == nil {
+					return v.Level
+				}
+
+				return updateRecord.Level
+			}(),
+			Status: func() int {
+				if updateRecord == nil {
+					return v.UserStatus
+				}
+
+				return updateRecord.UserStatus
+			}(),
+			LoginTime: func() int64 {
+				if loginRecord != nil {
+					return loginRecord.CreateAt
+				}
+
+				return 0
+			}(),
+			LoginIP: func() string {
+				if loginRecord != nil {
+					return loginRecord.Ip
+				}
+
+				return ""
+			}(),
+			JoinIP:   v.Ip,
+			JoinTime: v.CreateAt,
+		})
 	}
 
 	return &entity.PlayerListResp{
-		Details: details,
-		Total:   count,
+		Details: results,
+		Total:   pages.Count,
 	}, nil
 }
 
+// 获取的是注册的总人数
 func (a *PlayerManage) GetPlayerTotalCount() (int64, *code.Result) {
-	count := 0
-	playerServerLoadStats, codeResult := NewAdmin().GetServerStatus(context.Background())
-	if codeResult != nil {
-		return 0, codeResult
+	where := &eventmodels.UserRegisterEventContent{
+		EventBasic: eventmodels.EventBasic{
+			Status: 0,
+		},
 	}
+	db := mdb.LogstashDB.Model(&eventmodels.UserRegisterEventContent{}).Where(where).Order("create_at")
 
-	for _, v := range playerServerLoadStats {
-		count += int(v.TotalUser)
+	var count int64
+	err := db.Count(&count).Error
+	if err != nil {
+		mhayaLogger.Warnf("GetPlayerTotalCount Count error:%v", err)
+		return 0, common.NewResult(code.InternalError)
 	}
 
-	return int64(count), nil
+	return count, nil
+}
+
+// 获取的是登录过的总人数 根据user_id去重
+func (a *PlayerManage) GetLoginedPlayerTotalCount() (int64, *code.Result) {
+	where := &eventmodels.UserLoginEventContent{
+		EventBasic: eventmodels.EventBasic{
+			Status: 0,
+		},
+	}
+	db := mdb.LogstashDB.Model(&eventmodels.UserLoginEventContent{}).Distinct("user_id").Where(where)
+
+	var count int64
+	err := db.Count(&count).Error
+	if err != nil {
+		mhayaLogger.Warnf("GetLoginedPlayerTotalCount Count error:%v", err)
+		return 0, common.NewResult(code.InternalError)
+	}
+
+	return 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)
+	// 获取最新的用户信息更新记录
+	var updateRecord *eventmodels.UserUpdateInfoEventContent
+	updateWhere := &eventmodels.UserUpdateInfoEventContent{
+		UserBasic: eventmodels.UserBasic{UserId: req.UserName},
+	}
+	err := mdb.LogstashDB.Model(&eventmodels.UserUpdateInfoEventContent{}).Where(updateWhere).Order("create_at desc").First(&updateRecord).Error
+	if err != nil && err != gorm.ErrRecordNotFound {
+		mhayaLogger.Warnf("PlayerInfo First updateRecord error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	var registerRecord *eventmodels.UserRegisterEventContent
+	if updateRecord == nil {
+		where := &eventmodels.UserRegisterEventContent{
+			UserBasic: eventmodels.UserBasic{UserId: req.UserName},
+		}
+		err := mdb.LogstashDB.Model(&eventmodels.UserRegisterEventContent{}).Where(where).First(&registerRecord).Error
+		if err != nil && err != gorm.ErrRecordNotFound {
+			mhayaLogger.Warnf("PlayerInfo First registerRecord error:%v", err)
+			return nil, common.NewResult(code.InternalError)
+		}
+	}
+
+	// 获取最新的用户登录记录
+	var loginRecord *eventmodels.UserLoginEventContent
+	loginWhere := &eventmodels.UserLoginEventContent{
+		UserBasic: eventmodels.UserBasic{UserId: req.UserName},
+	}
+	err = mdb.LogstashDB.Model(&eventmodels.UserLoginEventContent{}).Where(loginWhere).Order("create_at desc").First(&loginRecord).Error
+	if err != nil && err != gorm.ErrRecordNotFound {
+		mhayaLogger.Warnf("PlayerInfo First loginRecord 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,
-		Item:           player.Item,
-		SinIn:          player.SinIn,
-		DailyTask:      player.DailyTask,
-		AchieveTask:    player.AchieveTask,
-		RankReward:     player.RankReward,
-		Invite:         player.Invite,
-		InviteReward:   player.InviteReward,
-		Roll:           player.Roll,
+		UserName: func() string {
+			if updateRecord != nil {
+				return updateRecord.UserId
+			}
+
+			if registerRecord != nil {
+				return registerRecord.UserId
+			}
+
+			return ""
+		}(),
+		OpenId: func() string {
+			if updateRecord != nil {
+				return updateRecord.TgId
+			}
+
+			if registerRecord != nil {
+				return registerRecord.TgId
+			}
+
+			return ""
+		}(),
+		NickName: func() string {
+			if updateRecord != nil {
+				return updateRecord.UserName
+			}
+
+			if registerRecord != nil {
+				return registerRecord.UserName
+			}
+
+			return ""
+		}(),
+		Pid: func() string {
+			if updateRecord != nil {
+				return updateRecord.ParentUserId
+			}
+
+			if registerRecord != nil {
+				return registerRecord.ParentUserId
+			}
+
+			return ""
+		}(),
+		XID: func() string {
+			if updateRecord != nil {
+				return updateRecord.XId
+			}
+
+			if registerRecord != nil {
+				return registerRecord.XId
+			}
+
+			return ""
+		}(),
+		TonWall: func() string {
+			if updateRecord != nil {
+				return updateRecord.TonWall
+			}
+
+			if registerRecord != nil {
+				return registerRecord.TonWall
+			}
+
+			return ""
+		}(),
+		Email: func() string {
+			if updateRecord != nil {
+				return updateRecord.Email
+			}
+
+			if registerRecord != nil {
+				return registerRecord.Email
+			}
+
+			return ""
+		}(),
+		Level: func() int {
+			if updateRecord != nil {
+				return updateRecord.Level
+			}
+
+			if registerRecord != nil {
+				return registerRecord.Level
+			}
+
+			return 0
+		}(),
+		Status: func() int {
+			if updateRecord != nil {
+				return updateRecord.UserStatus
+			}
+
+			if registerRecord != nil {
+				return registerRecord.UserStatus
+			}
+
+			return 0
+		}(),
+		LoginTime: func() int64 {
+			if loginRecord != nil {
+				return loginRecord.CreateAt
+			}
+
+			return 0
+		}(),
+		LoginIP: func() string {
+			if loginRecord != nil {
+				return loginRecord.Ip
+			}
+
+			return ""
+		}(),
+		JoinIP: func() string {
+			if registerRecord != nil {
+				return registerRecord.Ip
+			}
+
+			return ""
+		}(),
+		JoinTime: func() int64 {
+			if registerRecord != nil {
+				return registerRecord.CreateAt
+			}
+
+			return 0
+		}(),
+		Avatar: "",
+		IsRobot: func() int {
+			if updateRecord != nil && updateRecord.IsRobot {
+				return 1
+			}
+
+			if registerRecord != nil && registerRecord.IsRobot {
+				return 1
+			}
+
+			return 0
+		}(),
+		IsLeader: func() int {
+			if updateRecord != nil && updateRecord.IsLeader {
+				return 1
+			}
+
+			return 0
+		}(),
+		IsVip: func() int {
+			if updateRecord != nil && updateRecord.IsVip {
+				return 1
+			}
+
+			return 0
+		}(),
+		Successions:    0, // TODO
+		MaxSuccessions: 0, // TODO
+		PrevTime: func() int64 {
+			if loginRecord != nil {
+				return loginRecord.CreateAt
+			}
+
+			return 0
+		}(),
+		UpdateTime: func() int64 {
+			if updateRecord != nil {
+				return updateRecord.CreateAt
+			}
+
+			return 0
+		}(),
+		IsDrawShare:   0,
+		DrawShareTime: 0,
+		FirstReward:   0,
+		// TODO 其他玩家信息
 	}, nil
 }