Răsfoiți Sursa

修改用户behavior相关数据逻辑

wucan 6 luni în urmă
părinte
comite
5cf5b140b6
9 a modificat fișierele cu 170 adăugiri și 23 ștergeri
  1. 3 2
      .env
  2. 10 1
      bootstrap/mongodb.go
  3. 1 0
      config/app.go
  4. 140 1
      controller/v1/userBehavior.go
  5. 3 3
      go.mod
  6. 1 12
      go.sum
  7. 2 1
      route/api.go
  8. 7 2
      service/userBehavior.go
  9. 3 1
      utils/time.go

+ 3 - 2
.env

@@ -2,7 +2,7 @@ APP_ENV=local
 APP_PORT=8000
 APP_NAME=default
 APP_URL=
-
+LOCAL=local
 #redis
 REDIS_HOST=127.0.0.1
 REDIS_PORT=6379
@@ -13,4 +13,5 @@ DOWNLOAD_DIR=
 
 MYSQL_HOST=124.223.73.12
 MYSQL_USERNAME=chunhao
-MYSQL_PASSWORD=chunhao2024
+MYSQL_PASSWORD=chunhao2024
+

+ 10 - 1
bootstrap/mongodb.go

@@ -2,6 +2,7 @@ package bootstrap
 
 import (
 	"context"
+	"designs/config"
 	"designs/global"
 	"go.mongodb.org/mongo-driver/v2/mongo"
 	"go.mongodb.org/mongo-driver/v2/mongo/readpref"
@@ -10,8 +11,16 @@ import (
 import mongoOption "go.mongodb.org/mongo-driver/v2/mongo/options"
 
 func InitializeMongo() *mongo.Client {
-	client, _ := mongo.Connect(mongoOption.Client().ApplyURI("mongodb://admin:admin@localhost:27017"))
 
+	var url string
+	if config.Get("app.local") == "local" {
+		url = "mongodb://localhost:27017"
+	} else {
+		url = "mongodb://admin:admin@localhost:27017"
+	}
+
+	client, _ := mongo.Connect(mongoOption.Client().ApplyURI(url))
+	//client, _ := mongo.Connect(mongoOption.Client().ApplyURI("mongodb://localhost:27017"))
 	err := client.Ping(context.Background(), readpref.Primary())
 	if err != nil {
 		global.App.Log.Error("mongoDB connect ping failed, err:", zap.Any("err", err))

+ 1 - 0
config/app.go

@@ -6,6 +6,7 @@ func App() *ConfigNode {
 		"port":    env("APP_PORT", "8000"),
 		"appName": env("APP_NAME", "goProject"),
 		"appUrl":  env("APP_URL", "http://localhost"),
+		"local":   env("LOCAL", ""),
 
 		"app_secret":       env("APP_SECRET", "6YJSuc50uJ18zj45"),
 		"app_check_secret": env("APP_CHECK_SECRET", "6YJSuc50uJ18zj45"), //检测数据篡改密钥

+ 140 - 1
controller/v1/userBehavior.go

@@ -13,6 +13,7 @@ import (
 	"go.mongodb.org/mongo-driver/v2/bson"
 	"go.mongodb.org/mongo-driver/v2/mongo/options"
 	"math"
+	"strconv"
 	"time"
 )
 
@@ -435,7 +436,6 @@ func DataTradesDetail(c *gin.Context) {
 		response.Fail(c, 1001, err.Error())
 		return
 	}
-
 	for k := range AvgTime {
 		data[k] = dayData{
 			NewUser:         NewUser[k],
@@ -769,3 +769,142 @@ func BehaviorList(c *gin.Context) {
 		"count": count,
 	})
 }
+
+// ConversionCondition 转化条件
+type ConversionCondition struct {
+	Id               string  `bson:"_id" json:"id"`
+	Gid              string  `bson:"gid" json:"gid"`
+	Pid              int64   `bson:"pid" json:"pid"`
+	Aid              int64   `bson:"aid" json:"aid"`
+	Type             string  `bson:"type"  json:"type"`
+	StartNum         int     `bson:"start_num" json:"start_num"` //启动次数
+	EstimatedRevenue float32 `bson:"revenue" json:"revenue"`     //当日预估收益
+	Duration         int64   `bson:"duration" json:"duration"`   //当日在线时长
+	ReqRewardedAd    int     `bson:"req_count" json:"req_count"` //当日的激励视频广告请求次数
+	ExpRewardedAd    int     `bson:"exp_count" json:"exp_count"` //当日的激励视频广告曝光次数
+}
+
+func SetGameCondition(c *gin.Context) {
+	form := request.Check(c, &struct {
+		Gid              string  `form:"gid" json:"gid" binding:"required"`
+		Pid              int64   `form:"pid" json:"pid" binding:""`
+		Aid              int64   `form:"aid" json:"aid" binding:"required"`
+		Type             string  `form:"type" json:"type" binding:"required"`
+		StartNum         int     `form:"start_num" json:"start_num" binding:""`
+		EstimatedRevenue float32 `form:"revenue" json:"revenue" binding:""`
+		Duration         int64   `form:"duration" json:"duration" binding:""`
+		ReqRewardedAd    int     `form:"req_count" json:"req_count" binding:""`
+		ExpRewardedAd    int     `form:"exp_count" json:"exp_count" binding:""`
+	}{})
+
+	id := fmt.Sprintf("%s|%s|%s|%s", form.Gid, strconv.Itoa(int(form.Pid)), strconv.Itoa(int(form.Aid)), form.Type)
+
+	collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
+	filter := bson.M{"_id": id}
+
+	var conversionCondition ConversionCondition
+	err := collection.FindOne(context.TODO(), filter).Decode(&conversionCondition)
+	//if err != nil {
+	//	response.Fail(c, 1002, err.Error())
+	//	return
+	//}
+
+	if conversionCondition.Id != "" {
+		//存在,更新
+		update := bson.M{
+			"$set": struct {
+				StartNum         int     `bson:"start_num"` //启动次数
+				EstimatedRevenue float32 `bson:"revenue"`   //当日预估收益
+				Duration         int64   `bson:"duration"`  //当日在线时长
+				ReqRewardedAd    int     `bson:"req_count"` //当日的激励视频广告请求次数
+				ExpRewardedAd    int     `bson:"exp_count"` //当日的激励视频广告曝光次数
+			}{
+				StartNum:         form.StartNum,
+				EstimatedRevenue: form.EstimatedRevenue,
+				Duration:         form.Duration,
+				ReqRewardedAd:    form.ReqRewardedAd,
+				ExpRewardedAd:    form.ExpRewardedAd,
+			},
+		}
+		_, err = collection.UpdateOne(context.TODO(), filter, update)
+		if err != nil {
+			response.Fail(c, 1003, err.Error())
+			return
+		}
+	} else {
+		//不存在,新增
+		insert := ConversionCondition{
+			Id:               id,
+			Pid:              form.Pid,
+			Aid:              form.Aid,
+			Gid:              form.Gid,
+			Type:             form.Type,
+			StartNum:         form.StartNum,
+			EstimatedRevenue: form.EstimatedRevenue,
+			Duration:         form.Duration,
+			ReqRewardedAd:    form.ReqRewardedAd,
+			ExpRewardedAd:    form.ExpRewardedAd,
+		}
+
+		_, err = collection.InsertOne(context.TODO(), insert)
+		if err != nil {
+			response.Fail(c, 1001, err.Error())
+			return
+		}
+	}
+
+	response.Success(c, gin.H{})
+}
+
+func GameConditionList(c *gin.Context) {
+	form := request.Check(c, &struct {
+		Gid    string `form:"gid" json:"gid" binding:"required"`
+		Pid    int64  `form:"pid" json:"pid" binding:""`
+		Aid    int64  `form:"aid" json:"aid" binding:""`
+		Type   string `form:"type" json:"type" binding:""`
+		Offset int    `form:"offset" json:"offset" binding:""`
+		Limit  int    `form:"limit" json:"limit" binding:"required"`
+	}{})
+
+	collection := global.App.MongoDB.Database("chunhao").Collection("conversionCondition")
+
+	filter := bson.M{"gid": form.Gid, "type": form.Type}
+	if form.Type != "" {
+		filter["type"] = form.Type
+	}
+	if form.Pid != 0 {
+		filter["pid"] = form.Pid
+	}
+	if form.Aid != 0 {
+		filter["aid"] = form.Aid
+	}
+
+	ctx := context.Background()
+	option := options.Find()
+	option.SetLimit(int64(form.Limit))
+	option.SetSkip(int64(form.Offset))
+
+	cur, err := collection.Find(ctx, filter, option)
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	count, err := collection.CountDocuments(ctx, filter)
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	var data []ConversionCondition
+	err = cur.All(ctx, &data)
+	if err != nil {
+		response.Fail(c, 1001, err.Error())
+		return
+	}
+
+	response.Success(c, gin.H{
+		"data":  data,
+		"count": count,
+	})
+}

+ 3 - 3
go.mod

@@ -13,8 +13,11 @@ require (
 	github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20240510055607-89e20ab7b6c6
 	github.com/pkg/errors v0.9.1
 	github.com/sirupsen/logrus v1.9.3
+	go.mongodb.org/mongo-driver/v2 v2.0.0-beta2
 	go.uber.org/zap v1.27.0
 	golang.org/x/crypto v0.27.0
+	gorm.io/driver/mysql v1.5.7
+	gorm.io/gorm v1.25.11
 )
 
 require (
@@ -49,7 +52,6 @@ require (
 	github.com/xdg-go/scram v1.1.2 // indirect
 	github.com/xdg-go/stringprep v1.0.4 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
-	go.mongodb.org/mongo-driver/v2 v2.0.0-beta2 // indirect
 	go.uber.org/multierr v1.10.0 // indirect
 	golang.org/x/arch v0.8.0 // indirect
 	golang.org/x/net v0.27.0 // indirect
@@ -58,6 +60,4 @@ require (
 	golang.org/x/text v0.18.0 // indirect
 	google.golang.org/protobuf v1.34.2 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
-	gorm.io/driver/mysql v1.5.7 // indirect
-	gorm.io/gorm v1.25.11 // indirect
 )

+ 1 - 12
go.sum

@@ -44,9 +44,8 @@ github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17w
 github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
 github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
-github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
@@ -131,8 +130,6 @@ golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
 golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
-golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
 golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
 golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
@@ -153,8 +150,6 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
-golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
 golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -163,18 +158,12 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
-golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
-golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
-golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
 golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
 google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=

+ 2 - 1
route/api.go

@@ -61,6 +61,7 @@ func SetApiGroupRoutes(router *gin.RouterGroup) {
 		GroupV1.POST("/user/userActionDetailDistribution", v1.UserActionDetailDistribution)
 
 		GroupV1.POST("/user/behaviorList", v1.BehaviorList)
-
+		GroupV1.POST("/user/setGameCondition", v1.SetGameCondition)
+		GroupV1.POST("/user/gameConditionList", v1.GameConditionList)
 	}
 }

+ 7 - 2
service/userBehavior.go

@@ -431,12 +431,18 @@ func distinctUserHour(data []model.UserLogin) []time.Time {
 
 // 根据时间求出时段信息
 func getTimeDistribution(todayRegister []time.Time, hours []int64) map[int]int {
+	todayRegisterSum := make(map[int]int)
+	//长度为1 不需要循环
+	if len(hours) == 1 {
+		todayRegisterSum[0] = len(todayRegister)
+		return todayRegisterSum
+	}
+	//循环获取时段信息
 	var todayRegisterUnix []int64
 	for _, t := range todayRegister {
 		todayRegisterUnix = append(todayRegisterUnix, t.Unix())
 	}
 
-	todayRegisterSum := make(map[int]int)
 	for k := range hours {
 		todayRegisterSum[k] = 0
 	}
@@ -457,7 +463,6 @@ func getTimeDistribution(todayRegister []time.Time, hours []int64) map[int]int {
 			}
 		}
 	}
-
 	return todayRegisterSum
 }
 

+ 3 - 1
utils/time.go

@@ -38,7 +38,9 @@ func GetTimeDay(startDate string, endDate string) []int64 {
 
 	for currTime := startTime; !currTime.After(endTime); currTime = currTime.AddDate(0, 0, 1) {
 		// 设置时间为当天的开始时间
-		midnight := time.Date(currTime.Year(), currTime.Month(), currTime.Day(), 0, 0, 0, 0, currTime.Location()).Unix()
+		localLocation, _ := time.LoadLocation("Local") //设置时区
+
+		midnight := time.Date(currTime.Year(), currTime.Month(), currTime.Day(), 0, 0, 0, 0, localLocation).Unix()
 		days = append(days, midnight)
 	}