Browse Source

增加-数据结构

userxzz 9 months ago
parent
commit
d1ddd8874f

+ 22 - 1
game/config/profile-gc.json

@@ -69,6 +69,19 @@
         "enable": true
       }
     ],
+    "web_admin": [
+      {
+        "node_id": "m-web-admin-1",
+        "address": "0.0.0.0:30000",
+        "__settings__": {
+          "db_id_list" : {
+            "game_db_id": "game_db_1"
+          },
+          "ref_logger": "master_log"
+        },
+        "enable": true
+      }
+    ],
     "game": [
       {
         "node_id": "10001",
@@ -125,8 +138,16 @@
         "enable": true,
         "db_id": "game_db_1",
         "db_name": "db_mhaya",
-        "uri": "mongodb://localhost:27017"
+        "uri": "mongodb://192.168.0.68:27017"
       }
+    ],
+    "web_db_admin_group":[
+        {
+            "enable": true,
+            "db_id": "game_db_1",
+            "db_name": "db_user_daily",
+            "uri": "mongodb://192.168.0.68:27017"
+        }
     ]
   },
   "data_config": {

+ 2 - 3
game/game_cluster/internal/mdb/models/cashoutrecord.go

@@ -8,7 +8,6 @@ type CashOutRecord struct {
 	AfterAmount int    `json:"afterAmount" bson:"after_amount"` //
 	Type        int    `json:"type" bson:"type"`                // 货币内型
 	Address     string `json:"address" bson:"address"`          // 地址
-
-	CreateAt int64 `json:"createAt" bson:"createAt"`
-	UpdateAt int64 `json:"updateAt" bson:"updateAt"`
+	CreateAt    int64  `json:"createAt" bson:"createAt"`
+	UpdateAt    int64  `json:"updateAt" bson:"updateAt"`
 }

+ 64 - 62
game/game_cluster/internal/mdb/models/player.go

@@ -3,6 +3,8 @@ package models
 import (
 	"context"
 	"fmt"
+	"time"
+
 	jsoniter "github.com/json-iterator/go"
 	mhayaString "github.com/mhaya/extend/string"
 	mhayaTime "github.com/mhaya/extend/time"
@@ -12,59 +14,59 @@ import (
 	"github.com/mhaya/game/game_cluster/internal/param"
 	"github.com/mhaya/game/game_cluster/internal/third"
 	"github.com/mhaya/game/game_cluster/internal/token"
-	"time"
 
-	mhayaLogger "github.com/mhaya/logger"
 	"math/rand"
 	"strings"
+
+	mhayaLogger "github.com/mhaya/logger"
 )
 
 type Player struct {
-	UserName          string                    `json:"userName" bson:"userName"`
-	OpenId            string                    `json:"openId" bson:"openId"`
-	UserNameMaybe     string                    `json:"userNameMaybe" bson:"userNameMaybe"`
-	NickName          string                    `json:"nickName" bson:"nickName"`
-	Pid               string                    `json:"pid" bson:"pid"`
-	XID               string                    `json:"xID" bson:"xID"`
-	TonWall           string                    `json:"tonWall" bson:"tonWall"`
-	Email             string                    `json:"email" bson:"email"`
-	Mobile            string                    `json:"mobile" bson:"mobile"`
-	Avatar            string                    `json:"avatar" bson:"avatar"`
-	IsRobot           int                       `json:"isRobot" bson:"isRobot"`
-	IsLeader          int                       `json:"isLeader" bson:"isLeader"`
-	IsVip             int                       `json:"isVip" bson:"isVip"`
-	IsFirstBindingXID int                       `json:"isFirstBindingXID" bson:"isFirstBindingXID"`
-	Level             int                       `json:"level" bson:"level"`
-	Exp               int                       `json:"exp" bson:"exp"`
-	Gender            int                       `json:"gender" bson:"gender"`
-	Birthday          string                    `json:"birthday" bson:"birthday"`
-	Successions       int                       `json:"successions" bson:"successions"`
-	MaxSuccessions    int                       `json:"maxSuccessions" bson:"maxSuccessions"`
-	PrevTime          int64                     `json:"prevTime" bson:"prevTime"`
-	LoginTime         int64                     `json:"loginTime" bson:"loginTime"`
-	LoginIP           string                    `json:"loginIP" bson:"loginIP"`
-	LoginFailure      int                       `json:"loginFailure" bson:"loginFailure"`
-	JoinIP            string                    `json:"joinIP" bson:"joinIP"`
-	Rank              int                       `json:"rank" bson:"rank"`
-	JoinTime          int64                     `json:"joinTime" bson:"joinTime"`
-	CreateTime        int64                     `json:"createTime" bson:"createTime"`
-	UpdateTime        int64                     `json:"updateTime" bson:"updateTime"`
-	DailyRefreshTime  int64                     `json:"dailyRefreshTime" bson:"dailyRefreshTime"`
-	WeeklyRefreshTime int64                     `json:"weeklyRefreshTime" bson:"weeklyRefreshTime"`
-	RollDay           int64                     `json:"rollDay" bson:"rollDay"`
-	Status            int                       `json:"status" bson:"status"`
-	Roll              *Roll                     `json:"roll" bson:"roll"`
-	Guide             int                       `json:"guide" bson:"guide"`
-	Share             *Share                    `json:"share" bson:"share"`
-	FirstReward       int                       `json:"firstReward" bson:"firstReward"`
-	Index             int                       `json:"-" bson:"index"`
-	Item              ItemBasePack              `json:"item" bson:"item"`
-	SinIn             SignIn                    `json:"sinIn" bson:"sinIn"`
-	DailyTask         DailyTask                 `json:"dailyTask" bson:"dailyTask"`
-	AchieveTask       AchieveTask               `json:"achieveTask" bson:"achieveTask"`
-	RankReward        RankReward                `json:"rankReward" bson:"rankReward"`
-	Invite            Invite                    `json:"invite" bson:"invite"`
-	InviteReward      *InviteReward             `json:"inviteReward" bson:"inviteReward"`
+	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"`                         // 邮箱
+	Mobile            string                    `json:"mobile" bson:"mobile"`                       // 手机号
+	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
+	IsFirstBindingXID int                       `json:"isFirstBindingXID" bson:"isFirstBindingXID"` // 是否是第一次绑定推特
+	Level             int                       `json:"level" bson:"level"`                         // 等级
+	Exp               int                       `json:"exp" bson:"exp"`                             // 经验
+	Gender            int                       `json:"gender" bson:"gender"`                       // 性别
+	Birthday          string                    `json:"birthday" bson:"birthday"`                   // 生日
+	Successions       int                       `json:"successions" bson:"successions"`             // 连续登陆天数
+	MaxSuccessions    int                       `json:"maxSuccessions" bson:"maxSuccessions"`       // 最大连续等级天数
+	PrevTime          int64                     `json:"prevTime" bson:"prevTime"`                   // 上次登陆时间
+	LoginTime         int64                     `json:"loginTime" bson:"loginTime"`                 // 登陆时间
+	LoginIP           string                    `json:"loginIP" bson:"loginIP"`                     // 登录IP
+	LoginFailure      int                       `json:"loginFailure" bson:"loginFailure"`           // 登陆失败次数
+	JoinIP            string                    `json:"joinIP" bson:"joinIP"`                       // 注册IP
+	Rank              int                       `json:"rank" bson:"rank"`                           // 排名
+	JoinTime          int64                     `json:"joinTime" bson:"joinTime"`                   // 注册时间
+	CreateTime        int64                     `json:"createTime" bson:"createTime"`               // 创建时间
+	UpdateTime        int64                     `json:"updateTime" bson:"updateTime"`               // 更新时间
+	DailyRefreshTime  int64                     `json:"dailyRefreshTime" bson:"dailyRefreshTime"`   // 每日刷新时间
+	WeeklyRefreshTime int64                     `json:"weeklyRefreshTime" bson:"weeklyRefreshTime"` // 每周刷新时间
+	RollDay           int64                     `json:"rollDay" bson:"rollDay"`                     // 抽奖日期
+	Status            int                       `json:"status" bson:"status"`                       // 状态
+	Roll              *Roll                     `json:"roll" bson:"roll"`                           // 抽奖
+	Guide             int                       `json:"guide" bson:"guide"`                         //
+	Share             *Share                    `json:"share" bson:"share"`                         // 分享
+	FirstReward       int                       `json:"firstReward" bson:"firstReward"`             // 首次登陆奖励
+	Index             int                       `json:"-" bson:"index"`                             // 索引
+	Item              ItemBasePack              `json:"item" bson:"item"`                           // 道具
+	SinIn             SignIn                    `json:"sinIn" bson:"sinIn"`                         // 签到
+	DailyTask         DailyTask                 `json:"dailyTask" bson:"dailyTask"`                 // 日常任务
+	AchieveTask       AchieveTask               `json:"achieveTask" bson:"achieveTask"`             // 成就任务
+	RankReward        RankReward                `json:"rankReward" bson:"rankReward"`               // 排行奖励
+	Invite            Invite                    `json:"invite" bson:"invite"`                       // 邀请
+	InviteReward      *InviteReward             `json:"inviteReward" bson:"inviteReward"`           // 邀请奖励
 	PlayerReward      map[int]*PlayerRewardBase `json:"-" bson:"-"`
 }
 
@@ -137,13 +139,13 @@ func (p *Player) Init() {
 func (p *Player) InitDaily() {
 	p.DailyRefreshTime = mhayaTime.Now().Add(-24 * time.Hour).Unix()
 	if !mhayaTime.CreateFromTimestamp(p.DailyRefreshTime).IsToday() {
-		//刷新每日任务
+		// 刷新每日任务
 		p.DailyTask.RefreshDailyTask()
-		//刷新抽奖每日分享
+		// 刷新抽奖每日分享
 		p.Share.RefreshShare()
-		//刷新是否有排行榜奖励
+		// 刷新是否有排行榜奖励
 		p.RankReward.InitRank(p.UserName, 1)
-		//更新时间到当天
+		// 更新时间到当天
 		p.DailyRefreshTime = mhayaTime.Now().Unix()
 	}
 }
@@ -152,7 +154,7 @@ func (p *Player) InitWeekly() {
 	if !mhayaTime.CreateFromTimestamp(p.WeeklyRefreshTime).IsThisWeek() {
 
 		p.SinIn.RefreshSignIn()
-		//刷新是否有排行榜奖励
+		// 刷新是否有排行榜奖励
 		p.RankReward.InitRank(p.UserName, 2)
 
 		p.WeeklyRefreshTime = mhayaTime.Now().Unix()
@@ -176,7 +178,7 @@ func (p *Player) LevelUp() bool {
 			p.Item[ItemRoll].CurNum = 0
 			p.Item[ItemInvite].CurNum = 0
 
-			//升级邀请奖励
+			// 升级邀请奖励
 			p.SetPassiveInviteReward()
 
 			p.SetPlayerRewardLog(SourceLevelUp, p.Level, []data.ItemReward{{ItemID: ItemAllRoll, ItemBaseType: 2, Amount: ret.DiceLimit}}, []data.ItemReward{}, p.Level)
@@ -221,17 +223,17 @@ func (p *Player) RefreshRoll() bool {
 
 func (p *Player) CheckTaskByType1(userID string, id int) bool {
 	switch id {
-	case 1: //关注关注推特
+	case 1: // 关注关注推特
 		return true
-	case 2: //加入TG频道
+	case 2: // 加入TG频道
 		if third.GetIfChannel(userID) == 1 {
 			return true
 		} else {
 			return false
 		}
-	case 3: //关注Yutube账号
+	case 3: // 关注Yutube账号
 		return true
-	case 4: //加入DC频道
+	case 4: // 加入DC频道
 		return true
 	}
 	return false
@@ -239,9 +241,9 @@ func (p *Player) CheckTaskByType1(userID string, id int) bool {
 
 func (p *Player) FinishAchieveTaskByType1(id int) bool {
 	if a, ok := p.AchieveTask[id]; ok {
-		if a.Num == 0 && a.Validate == 1 { //待验证
+		if a.Num == 0 && a.Validate == 1 { // 待验证
 			if p.CheckTaskByType1(p.UserName, id) {
-				p.AchieveTask[id].Validate = 2 //验证成功
+				p.AchieveTask[id].Validate = 2 // 验证成功
 				p.AchieveTask[id].Num = 1
 				p.AchieveTask[id].Status = 1
 			} else {
@@ -312,7 +314,7 @@ func (p *Player) RollOnce(num int) *param.RollOnce {
 	r2 := rand.Int31n(5) + 1
 	r3 := rand.Int31n(5) + 1
 
-	//rule 4
+	// rule 4
 	if (r1 == 1 && r2 == 1 && r3 == 1) || (r1 == 6 && r2 == 6 && r3 == 6) {
 		roll.Score = levelConfig.Ratio * levelConfig.Rule4
 		roll.RollType = constant.RollSpecialTripleBet
@@ -499,7 +501,7 @@ func (p *Player) SetPassiveInviteReward() {
 	if !ok || !tok || c != p.Level {
 		return
 	}
-	//被动邀请
+	// 被动邀请
 	key := fmt.Sprintf("%v:1:%v", constant.InviteKey, p.UserName)
 	pUid := mdb.RDB.Get(context.Background(), key).Val()
 
@@ -516,7 +518,7 @@ func (p *Player) SetPassiveInviteReward() {
 
 	var addItem []data.ItemReward
 	if p.IsVip == 0 {
-		//主动邀请记录
+		// 主动邀请记录
 		key = fmt.Sprintf("%v:%v:%v", constant.InviteKey, InvitePlayer, pUid)
 		mdb.RDB.IncrBy(context.Background(), key, 1)
 

+ 2 - 2
game/game_cluster/internal/mdb/models/share.go

@@ -1,8 +1,8 @@
 package models
 
 type Share struct {
-	IsDrawShare   int   `json:"isDrawShare" bson:"isDrawShare"`
-	DrawShareTime int64 `json:"drawShareTime" bson:"drawShareTime"`
+	IsDrawShare   int   `json:"isDrawShare" bson:"isDrawShare"`     // 0未领取,1已领取
+	DrawShareTime int64 `json:"drawShareTime" bson:"drawShareTime"` // 领取时间
 }
 
 func (l *Share) RefreshShare() {

+ 41 - 0
game/game_cluster/nodes/webadmin/controller/synthesis.go

@@ -0,0 +1,41 @@
+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 Synthesis struct {
+	sev *service.Synthesis
+}
+
+func NewSynthesis() *Synthesis {
+	return &Synthesis{
+		sev: service.NewSynthesis(),
+	}
+}
+
+func (s *Synthesis) FindUserLogDaily(ctx *gin.Context) {
+	req := &entity.UserLogDailyReq{}
+	if err := ctx.ShouldBindJSON(req); err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	resp, err := s.sev.FindMDBUserLogDaily(req)
+	if err != nil {
+		ctx.JSON(200, gin.H{
+			"code": 400,
+			"msg":  err.Error(),
+		})
+		return
+	}
+	ctx.JSON(200, gin.H{
+		"code": 200,
+		"msg":  "success",
+		"data": resp,
+	})
+}

+ 7 - 0
game/game_cluster/nodes/webadmin/entity/user_country_count.go

@@ -0,0 +1,7 @@
+package entity
+
+type UserCountryResp struct {
+	Country    string `json:"country"`    // 国家
+	IPCount    int    `json:"ip_count"`   // IP数量
+	Percentage int    `json:"percentage"` // 百分比
+}

+ 6 - 0
game/game_cluster/nodes/webadmin/entity/user_lavel_count.go

@@ -0,0 +1,6 @@
+package entity
+
+type UserLevelCountResp struct {
+	Level     int `json:"level"`
+	UserCount int `json:"user_count"`
+}

+ 27 - 0
game/game_cluster/nodes/webadmin/entity/user_log_daily.go

@@ -0,0 +1,27 @@
+package entity
+
+type UserLogDailyResp struct {
+	Platform    string  `bson:"platform"  json:"platform,omitempty"`        // platform: 用户所在的平台,例如“Android”或“IOS”
+	Channel     string  `bson:"channel" json:"channel,omitempty"`           // channel: 用户来源渠道
+	Registered  int     `bson:"registered" json:"registered,omitempty"`     // registered: 新用户注册的数量
+	LoggedIn    int     `bson:"logged_in" json:"logged_in,omitempty"`       // logged_in: 登陆产品的用户数量
+	NewLogin    int     `bson:"new_login" json:"new_login,omitempty"`       // new_login: 登陆产品的新注册用户数量
+	OldLogin    int     `bson:"old_login" json:"old_login,omitempty"`       // old_login: 登陆产品的老用户数量
+	ActiveUsers int     `bson:"active_users" json:"active_users,omitempty"` // active_users: 登录游戏后投掷过骰子的用户数量
+	NewActive   int     `bson:"new_active" json:"new_active,omitempty"`     // new_active: 登录游戏后投掷过骰子的新用户数量
+	OldActive   int     `bson:"old_active" json:"old_active,omitempty"`     // old_active: 登录游戏后投掷过骰子的老用户数量
+	TotalPoints int     `bson:"total_points" json:"total_points,omitempty"` // total_points: 全服积分产出总值
+	UProduced   float64 `bson:"u_produced" json:"u_produced,omitempty"`     // u_produced: 全服U的产出总值
+	UCashout    float64 `bson:"u_cashout" json:"u_cashout,omitempty"`       // u_cashout: 全服U的提现总值
+	Timestamp   int64   `bson:"timestamp" json:"timestamp,omitempty"`       // timestamp: 数据记录的时间戳
+}
+
+// UserLogDailyReq 用户日志
+type UserLogDailyReq struct {
+	Platform  string `json:"platform"`
+	StartTime int64  `json:"start_time"`
+	EndTime   int64  `json:"end_time"`
+	Channel   string `json:"channel"`
+	Page      int    `json:"page"`
+	Size      int    `json:"size"`
+}

+ 10 - 0
game/game_cluster/nodes/webadmin/entity/user_reg_count.go

@@ -0,0 +1,10 @@
+package entity
+
+import (
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/model"
+)
+
+// UserRetentionResp 用于存储用户的留存数据
+type UserRetentionResp struct {
+	*model.UserRetentionData
+}

+ 26 - 0
game/game_cluster/nodes/webadmin/entity/user_withdrawal.go

@@ -0,0 +1,26 @@
+package entity
+
+// UserWithdrawalResp \game\game_cluster\nodes\webadmin\entity\user_withdrawal.go
+type UserWithdrawalResp struct {
+	UserName    string `json:"userName" bson:"userName"`        // 用户名字
+	NickName    string `json:"nickName" bson:"nickName"`        // 昵称
+	Status      int    `json:"status" bson:"status"`            // 0:未审核 1:审核通过 2:审核失败
+	Amount      int    `json:"amount" bson:"amount"`            //
+	AfterAmount int    `json:"afterAmount" bson:"after_amount"` //
+	Type        int    `json:"type" bson:"type"`                // 货币内型
+	Address     string `json:"address" bson:"address"`          // 地址
+	CreateAt    int64  `json:"createAt" bson:"createAt"`
+	UpdateAt    int64  `json:"updateAt" bson:"updateAt"`
+}
+
+type UserWithdrawalReq struct {
+	UserName  string `json:"userName" bson:"userName"` // 用户名字
+	NickName  string `json:"nickName" bson:"nickName"` // 昵称
+	StartTime int64  `json:"start_time"`               // 开始时间
+	EndTime   int64  `json:"end_time"`                 // 结束时间
+	Page      int    `json:"page"`                     // 页码
+	Size      int    `json:"size"`                     // 每页数量
+}
+
+type UserWithdrawal struct {
+}

+ 29 - 0
game/game_cluster/nodes/webadmin/mdb/mongo_mdb.go

@@ -0,0 +1,29 @@
+package mdb
+
+import (
+	"context"
+
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
+)
+
+var MdbAdmin *mongo.Database
+
+// InitializeMongoDB 初始化 MongoDB 连接
+func InitializeMongoDB() {
+	// 设置 MongoDB 的连接选项
+	clientOptions := options.Client().ApplyURI("mongodb://192.168.0.68:27017")
+	// 创建一个新的 MongoDB 客户端
+	client, err := mongo.Connect(context.Background(), clientOptions)
+	if err != nil {
+		return
+	}
+	// 检查连接是否成功
+	err = client.Ping(context.Background(), nil)
+	if err != nil {
+		return
+	}
+	// 选择要使用的数据库
+	db := client.Database("db_user_daily") // 替换为你的数据库名称
+	MdbAdmin = db
+}

+ 7 - 0
game/game_cluster/nodes/webadmin/model/user_country_count.go

@@ -0,0 +1,7 @@
+package model
+
+type UserCountryCount struct {
+	Country    string `json:"country"`    // 国家
+	IPCount    int    `json:"ip_count"`   // IP数量
+	Percentage int    `json:"percentage"` // 百分比
+}

+ 6 - 0
game/game_cluster/nodes/webadmin/model/user_lavel_count.go

@@ -0,0 +1,6 @@
+package model
+
+type UserLevelCount struct {
+	Level     int `json:"level"`
+	UserCount int `json:"user_count"`
+}

+ 19 - 0
game/game_cluster/nodes/webadmin/model/user_log_daily.go

@@ -0,0 +1,19 @@
+package model
+
+// UserLogDaily 结构体用于存储游戏推广相关的统计数据
+type UserLogDaily struct {
+	ID          string  `bson:"_id" json:"id" json:"id,omitempty"`          // _id: 文档的唯一标识符
+	Platform    string  `bson:"platform"  json:"platform,omitempty"`        // platform: 用户所在的平台,例如“Android”或“IOS”
+	Channel     string  `bson:"channel" json:"channel,omitempty"`           // channel: 用户来源渠道
+	Registered  int     `bson:"registered" json:"registered,omitempty"`     // registered: 新用户注册的数量
+	LoggedIn    int     `bson:"logged_in" json:"logged_in,omitempty"`       // logged_in: 登陆产品的用户数量
+	NewLogin    int     `bson:"new_login" json:"new_login,omitempty"`       // new_login: 登陆产品的新注册用户数量
+	OldLogin    int     `bson:"old_login" json:"old_login,omitempty"`       // old_login: 登陆产品的老用户数量
+	ActiveUsers int     `bson:"active_users" json:"active_users,omitempty"` // active_users: 登录游戏后投掷过骰子的用户数量
+	NewActive   int     `bson:"new_active" json:"new_active,omitempty"`     // new_active: 登录游戏后投掷过骰子的新用户数量
+	OldActive   int     `bson:"old_active" json:"old_active,omitempty"`     // old_active: 登录游戏后投掷过骰子的老用户数量
+	TotalPoints int     `bson:"total_points" json:"total_points,omitempty"` // total_points: 全服积分产出总值
+	UProduced   float64 `bson:"u_produced" json:"u_produced,omitempty"`     // u_produced: 全服U的产出总值
+	UCashout    float64 `bson:"u_cashout" json:"u_cashout,omitempty"`       // u_cashout: 全服U的提现总值
+	Timestamp   int64   `bson:"timestamp" json:"timestamp,omitempty"`       // timestamp: 数据记录的时间戳
+}

+ 23 - 0
game/game_cluster/nodes/webadmin/model/user_reg_count.go

@@ -0,0 +1,23 @@
+package model
+
+// UserRetentionData 用于存储用户的留存数据
+type UserRetentionData struct {
+	UserID           string    `bson:"_id"` // 用户唯一标识符
+	RegistrationDate int64     // 注册日期
+	RetentionData    Retention `bson:"retention_data"`
+}
+
+// Retention 用于存储不同天数的留存数据
+type Retention struct {
+	Day1  DayRetention `bson:"day_1"`
+	Day3  DayRetention `bson:"day_3"`
+	Day7  DayRetention `bson:"day_7"`
+	Day14 DayRetention `bson:"day_14"`
+	Day30 DayRetention `bson:"day_30"`
+}
+
+// DayRetention 用于存储单一天数的留存数据
+type DayRetention struct {
+	LoggedIn  bool  `bson:"logged_in"`  // 是否在指定天数内登录
+	LoginDate int64 `bson:"login_date"` // 登录日期
+}

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

@@ -0,0 +1,48 @@
+package router
+
+import (
+	"net/http"
+
+	"github.com/gin-gonic/gin"
+	mhayaGin "github.com/mhaya/components/gin"
+	cfacade "github.com/mhaya/facade"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/controller"
+)
+
+type Controller struct {
+	mhayaGin.BaseController
+}
+
+func (c *Controller) Init() {
+	c.SetRouter()
+}
+
+// CreateUserController 创建用户的控制
+func (c *Controller) CreateUserController() {
+	// parentActor := &user.User{}
+	// c.CreateActor(parentActor.AliasID(), parentActor)
+}
+
+func (c *Controller) CreateActor(id string, handler cfacade.IActorHandler) {
+	// system := bcwinActor.NewSystem()
+	// system.SetApp(c.App)
+	// system.CreateActor(id, handler)
+}
+
+// SetRouter 设置路由
+func (c *Controller) SetRouter() {
+	group := c.Group("/")
+	u := group.Group("/v1/admin")
+	c.InitApiRouter(u)
+}
+
+func (c *Controller) InitApiRouter(u *gin.RouterGroup) {
+	u.GET("/hello", func(context *gin.Context) {
+		context.JSON(http.StatusOK, "")
+	})
+	u.POST("/user/log/daily", controller.NewSynthesis().FindUserLogDaily)
+}
+
+// func (c *Controller) InitMdb() {
+// 	MdbAdmin, _ = mdb.InitializeMongoDB()
+// }

+ 131 - 0
game/game_cluster/nodes/webadmin/service/synthesis.go

@@ -0,0 +1,131 @@
+package service
+
+import (
+	"context"
+	"time"
+
+	"github.com/mhaya/game/game_cluster/internal/mdb"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/entity"
+	mdb2 "github.com/mhaya/game/game_cluster/nodes/webadmin/mdb"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
+)
+
+type Synthesis struct {
+	db *mongo.Database
+}
+
+func NewSynthesis() *Synthesis {
+	return &Synthesis{
+		db: mdb2.MdbAdmin,
+	}
+}
+
+func (s *Synthesis) FindMDBUserLogDaily(req *entity.UserLogDailyReq) ([]*entity.UserLogDailyResp, error) {
+	// 定义上下文
+	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
+	defer cancel()
+
+	// 指定集合
+	collection := s.db.Collection("user_logs_daily")
+
+	// 构建查询条件 - 如果查询值为空那就不添加查询条件
+	filter := bson.M{}
+
+	if req.StartTime != 0 {
+		filter["timestamp"] = bson.M{
+			"$gte": req.StartTime,
+			"$lte": req.EndTime,
+		}
+	}
+
+	if req.Platform != "" {
+		filter["platform"] = req.Platform
+	}
+
+	if req.Channel != "" {
+		filter["channel"] = req.Channel
+	}
+
+	// 分页参数
+	skip := (req.Page - 1) * req.Size
+
+	// 执行查询
+	opts := options.Find()
+	opts.SetSkip(int64(skip))
+	opts.SetLimit(int64(req.Size))
+
+	cursor, err := collection.Find(ctx, filter, opts)
+	if err != nil {
+		return nil, err
+	}
+	defer cursor.Close(ctx)
+
+	// 解析查询结果
+	var results []*entity.UserLogDailyResp
+	for cursor.Next(ctx) {
+		var result entity.UserLogDailyResp
+		err := cursor.Decode(&result)
+		if err != nil {
+			return nil, err
+		}
+		results = append(results, &result)
+	}
+
+	if err := cursor.Err(); err != nil {
+		return nil, err
+	}
+
+	return results, nil
+}
+
+// FindWithdrawal 根据请求查询提现记录
+func (s *Synthesis) FindWithdrawal(req *entity.UserWithdrawalReq) ([]*entity.UserWithdrawalResp, error) {
+	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
+	defer cancel()
+	collection := mdb.MDB.Collection("CashOutRecord")
+
+	// 构建过滤器
+	filter := bson.M{}
+	if req.UserName != "" {
+		filter["userName"] = req.UserName
+	}
+	if req.NickName != "" {
+		filter["nickName"] = req.NickName
+	}
+	if req.StartTime > 0 && req.EndTime > 0 {
+		filter["createdAt"] = bson.M{"$gte": time.Unix(req.StartTime, 0), "$lte": time.Unix(req.EndTime, 0)}
+	} else if req.StartTime > 0 {
+		filter["createdAt"] = bson.M{"$gte": time.Unix(req.StartTime, 0)}
+	} else if req.EndTime > 0 {
+		filter["createdAt"] = bson.M{"$lte": time.Unix(req.EndTime, 0)}
+	}
+	// 设置分页选项
+	findOptions := options.Find()
+	findOptions.SetSkip(int64((req.Page - 1) * req.Size))
+	findOptions.SetLimit(int64(req.Size))
+
+	// 查询数据
+	var results []*entity.UserWithdrawalResp
+	cursor, err := collection.Find(ctx, filter, findOptions)
+	if err != nil {
+		return nil, err
+	}
+	defer cursor.Close(ctx)
+
+	// 解析结果
+	for cursor.Next(ctx) {
+		var result entity.UserWithdrawalResp
+		if err := cursor.Decode(&result); err != nil {
+			return nil, err
+		}
+		results = append(results, &result)
+	}
+
+	if err := cursor.Err(); err != nil {
+		return nil, err
+	}
+
+	return results, nil
+}

+ 56 - 0
game/game_cluster/nodes/webadmin/web/web.go

@@ -0,0 +1,56 @@
+package main
+
+import (
+	"github.com/gin-gonic/gin"
+	"github.com/mhaya"
+	mhayaCron "github.com/mhaya/components/cron"
+	mhayaGin "github.com/mhaya/components/gin"
+	mhayaMongo "github.com/mhaya/components/mongo"
+	checkCenter "github.com/mhaya/game/game_cluster/internal/component/check_center"
+	"github.com/mhaya/game/game_cluster/internal/data"
+	"github.com/mhaya/game/game_cluster/internal/mdb"
+	mdb2 "github.com/mhaya/game/game_cluster/nodes/webadmin/mdb"
+	"github.com/mhaya/game/game_cluster/nodes/webadmin/router"
+)
+
+func main() {
+	// 配置mhaya引擎,加载profile配置文件
+	app := mhaya.Configure("./game/config/profile-gc.json", "m-web-admin-1", false, mhaya.Cluster)
+
+	// 注册调度组件
+	app.Register(mhayaCron.New())
+
+	// 注册检查中心服是否启动组件
+	app.Register(checkCenter.New())
+
+	// 注册数据配表组件
+	app.Register(data.New())
+
+	// 加载http server组件
+	app.Register(httpServerComponent(app.Address()))
+	// 注册db组件
+	app.Register(mhayaMongo.NewComponent())
+
+	app.AddActors(
+		&mdb.ActorDB{},
+	)
+	mdb2.InitializeMongoDB()
+	// 启动mhaya引擎
+	app.Startup()
+}
+
+func httpServerComponent(addr string) *mhayaGin.Component {
+	gin.SetMode(gin.DebugMode)
+
+	// new http server
+	httpServer := mhayaGin.NewHttp("http_server", addr)
+	httpServer.Use(mhayaGin.Cors())
+
+	// http server使用gin组件搭建,这里增加一个RecoveryWithZap中间件
+	httpServer.Use(mhayaGin.RecoveryWithZap(true))
+
+	// 注册 controller
+	httpServer.Register(new(router.Controller))
+
+	return httpServer
+}