Explorar el Código

增加部分接口

wucan hace 1 mes
padre
commit
a9337efed4
Se han modificado 8 ficheros con 482 adiciones y 35 borrados
  1. 1 1
      bootstrap/mongodb.go
  2. 184 25
      controller/v1/gameAction.go
  3. 0 1
      controller/v1/user.go
  4. 22 8
      controller/v1/userAds.go
  5. 249 0
      controller/v1/userBehavior.go
  6. 8 0
      model/user.go
  7. 2 0
      route/api.go
  8. 16 0
      utils/map.go

+ 1 - 1
bootstrap/mongodb.go

@@ -19,7 +19,7 @@ func InitializeMongo() *mongo.Client {
 		url = "mongodb://admin:admin@localhost:27017"
 	}
 
-	//url = "mongodb://admin:admin@124.223.73.12:27017"
+	url = "mongodb://admin:admin@124.223.73.12:27017"
 
 	client, _ := mongo.Connect(mongoOption.Client().ApplyURI(url))
 	//client, _ := mongo.Connect(mongoOption.Client().ApplyURI("mongodb://localhost:27017"))

+ 184 - 25
controller/v1/gameAction.go

@@ -9,14 +9,17 @@ import (
 	"fmt"
 	"github.com/gin-gonic/gin"
 	"github.com/pkg/errors"
+	"sort"
+	"strconv"
+	"strings"
 )
 
 func UserActionList(c *gin.Context) {
 	form := request.Check(c, &struct {
-		Gid       string   `form:"gid" binding:"required"`
-		Pf        []string `form:"pf" binding:""`
-		StartTime string   `form:"startTime" binding:"required"`
-		EndTime   string   `form:"endTime" binding:"required"`
+		Gid string `form:"gid" binding:"required"`
+		//Pf        []string `form:"pf" binding:""`
+		StartTime string `form:"startTime" binding:"required"`
+		EndTime   string `form:"endTime" binding:"required"`
 	}{})
 
 	form.EndTime = form.EndTime + " 23:59:59"
@@ -34,31 +37,33 @@ func UserActionList(c *gin.Context) {
 		response.Fail(c, 1003, err.Error())
 		return
 	}
-	//查询出时间段内的活跃用户,登录次数
-	var userLogin []model.UserLogin
-	query1 := global.App.DB.Table("user_login")
-	if len(form.Pf) > 0 {
 
-		query1 = query1.WhereIn("pf", form.Pf)
+	var optionIdList []int
+	for _, v := range actionList {
+		optionIdList = append(optionIdList, v.ID)
 	}
-	err = query1.
-		Where("gid", form.Gid).
-		Where("loginTime", ">=", form.StartTime).
-		Where("loginTime", "<=", form.EndTime).
-		Select("userId", "loginTime").
-		Scan(&userLogin).Error
+
+	//查询出有无选项
+	var optionIdList1 []int
+	err = global.App.DB.Table("game_action_option").
+		WhereIn("actionId", optionIdList).
+		Distinct("actionId").
+		Pluck("actionId", &optionIdList1).Error
 	if err != nil {
-		response.Fail(c, 1001, err.Error())
+		response.Fail(c, 1003, err.Error())
 		return
 	}
+
+	//查出用户登录数据
+	userLogin, err := GetUserLogin(form.Gid, form.StartTime, form.EndTime)
 	userLoginCount := len(userLogin)
 
 	//查询出时间段内事件触发数量,以及触发人的ID
 	var userAction []model.UserAction
 	query2 := global.App.DB.Table("user_action")
-	if len(form.Pf) > 0 {
-		query2 = query2.WhereIn("pf", form.Pf)
-	}
+	//if len(form.Pf) > 0 {
+	//	query2 = query2.WhereIn("pf", form.Pf)
+	//}
 	err = query2.
 		Where("gid", form.Gid).
 		Where("createdAt", ">=", form.StartTime).
@@ -71,11 +76,14 @@ func UserActionList(c *gin.Context) {
 	}
 	//计算事件的触发总数和触发用户数
 	actionSumMap := make(map[string]int)
-	actionUserSumMap := make(map[string][]int)
-	//fmt.Println(userAction)
+	actionUserSumMap := make(map[string]map[int]bool)
+
 	for _, action := range userAction {
+		if actionUserSumMap[action.ActionId] == nil {
+			actionUserSumMap[action.ActionId] = make(map[int]bool)
+		}
 		actionSumMap[action.ActionId]++
-		actionUserSumMap[action.ActionId] = append(actionUserSumMap[action.ActionId], action.UserId)
+		actionUserSumMap[action.ActionId][action.UserId] = true
 	}
 
 	//根据事件触发和活跃用户数量进行比对得出其他数据
@@ -96,16 +104,16 @@ func UserActionList(c *gin.Context) {
 		ActionUserCount int     `json:"actionUserCount"`
 		ActiveUserRate  float64 `json:"activeUserRate"`
 		LoginActiveRate float64 `json:"loginActiveRate"`
+		HaveOption      bool    `json:"haveOption"`
 	}
 
 	var res []responses
-
 	for _, v := range actionList {
 		var ActiveUserRate float64
 		var LoginActiveRate float64
 		if userLoginCount > 0 {
-			ActiveUserRate = float64(actionSumMap[v.ActionId] / userLoginCount)
-			LoginActiveRate = float64(len(actionUserSumMap[v.ActionId]) / userLoginCount)
+			ActiveUserRate = DivideWithPrecision(actionSumMap[v.ActionId], userLoginCount)
+			LoginActiveRate = DivideWithPrecision(len(actionUserSumMap[v.ActionId]), userLoginCount)
 		}
 
 		res = append(res, responses{
@@ -116,15 +124,166 @@ func UserActionList(c *gin.Context) {
 			ActionUserCount: len(actionUserSumMap[v.ActionId]),
 			ActiveUserRate:  ActiveUserRate,
 			LoginActiveRate: LoginActiveRate,
+			HaveOption:      utils.InArray(v.ID, optionIdList1),
+		})
+	}
+
+	response.Success(c, gin.H{
+		"data":  res,
+		"count": len(res),
+	})
+}
+
+func GetUserLogin(Gid string, StartTime string, EndTime string) ([]model.UserLogin, error) {
+	//查询出时间段内的活跃用户,登录次数
+	var userLogin []model.UserLogin
+	query1 := global.App.DB.Table("user_login")
+	//if len(form.Pf) > 0 {
+	//	query1 = query1.WhereIn("pf", form.Pf)
+	//}
+	err := query1.
+		Where("gid", Gid).
+		Where("loginTime", ">=", StartTime).
+		Where("loginTime", "<=", EndTime).
+		Select("userId", "loginTime").
+		Distinct("userId").
+		Scan(&userLogin).Error
+	if err != nil {
+		return userLogin, err
+	}
+
+	return userLogin, nil
+}
+
+func UserActionOptionList(c *gin.Context) {
+	form := request.Check(c, &struct {
+		Gid       string `form:"gid" binding:"required"`
+		ActionId  string `form:"actionId" binding:"required"`
+		StartTime string `form:"startTime" binding:"required"`
+		EndTime   string `form:"endTime" binding:"required"`
+	}{})
+
+	form.EndTime = form.EndTime + " 23:59:59"
+
+	//查出用户登录数据
+	userLogin, err := GetUserLogin(form.Gid, form.StartTime, form.EndTime)
+	if err != nil {
+		response.Fail(c, 1003, err.Error())
+		return
+	}
+	userLoginCount := len(userLogin)
+	//查询出所有的事件选项
+	var actionOption []struct {
+		model.UserActionOption
+		UserId int `json:"userId" gorm:"not null;column:userId;"`
+	}
+
+	err = global.App.DB.Table("user_action_option").
+		LeftJoin("user_action", "user_action.id = user_action_option.UserActionId").
+		Where("user_action.actionId", form.ActionId).
+		Where("user_action.gid", form.Gid).
+		Where("user_action.createdAt", ">=", form.StartTime).
+		Where("user_action.createdAt", "<=", form.EndTime).
+		Select("user_action_option.*", "user_action.userId").
+		Scan(&actionOption).Error
+	if err != nil {
+		response.Fail(c, 1004, err.Error())
+		return
+	}
+
+	//循环得出选项
+	optionList := make(map[string]int)
+	for _, v := range actionOption {
+		optionList[v.OptionId+"|"+v.Value]++
+	}
+
+	//根据人数进行比对
+	//计算事件的触发总数和触发用户数
+	actionSumMap := make(map[string]int)
+	actionUserSumMap := make(map[string]map[int]bool)
+
+	for _, action := range actionOption {
+		if actionUserSumMap[action.OptionId+"|"+action.Value] == nil {
+			actionUserSumMap[action.OptionId+"|"+action.Value] = make(map[int]bool)
+		}
+		actionSumMap[action.OptionId+"|"+action.Value]++
+		actionUserSumMap[action.OptionId+"|"+action.Value][action.UserId] = true
+	}
+
+	//根据事件触发和活跃用户数量进行比对得出其他数据
+	activeUser := make(map[int]bool)
+	var activeUserSlice []int
+	for _, users := range userLogin {
+		activeUser[users.UserId] = true
+	}
+	for k := range activeUser {
+		activeUserSlice = append(activeUserSlice, k)
+	}
+
+	type responses struct {
+		Id              int     `json:"id"`
+		ActionId        int     `json:"actionId"`
+		ActionName      string  `json:"actionName"`
+		ActionCount     int     `json:"actionCount"`
+		ActionUserCount int     `json:"actionUserCount"`
+		ActiveUserRate  float64 `json:"activeUserRate"`
+		LoginActiveRate float64 `json:"loginActiveRate"`
+	}
+
+	var res []responses
+
+	var optionName []model.GameActionOption
+	optionIdToName := make(map[string]string)
+	global.App.DB.Table("game_action_option").
+		LeftJoin("game_action", "game_action.id = game_action_option.actionId").
+		Where("gid", form.Gid).Scan(&optionName)
+	for _, v := range optionName {
+		optionIdToName[v.OptionId] = v.OptionName
+	}
+
+	for k, v := range optionList {
+		var ActiveUserRate float64
+		var LoginActiveRate float64
+		if userLoginCount > 0 {
+			ActiveUserRate = DivideWithPrecision(actionSumMap[k], userLoginCount)
+			LoginActiveRate = DivideWithPrecision(len(actionUserSumMap[k]), userLoginCount)
+		}
+
+		optionId := strings.Split(k, "|")[0]
+		value := strings.Split(k, "|")[1]
+		valueInt, _ := strconv.Atoi(value)
+
+		res = append(res, responses{
+			ActionId:        valueInt,
+			ActionName:      optionIdToName[optionId] + ":" + value,
+			ActionCount:     v,
+			ActionUserCount: len(actionUserSumMap[k]),
+			ActiveUserRate:  ActiveUserRate,
+			LoginActiveRate: LoginActiveRate,
 		})
 	}
 
+	sort.Slice(res, func(i, j int) bool {
+		return res[i].ActionId < res[j].ActionId // 正序规则:i的Age小于j时返回true
+	})
+
 	response.Success(c, gin.H{
 		"data":  res,
 		"count": len(res),
 	})
 }
 
+func DivideWithPrecision(a, b int) float64 {
+	if b == 0 {
+		panic("除数不能为零") // 实际项目中建议返回 error 类型
+	}
+	// 转换为浮点数再相除
+	result := float64(a) / float64(b)
+	// 格式化为三位小数并转换回 float64
+	formatted, _ := strconv.ParseFloat(fmt.Sprintf("%.3f", result), 64)
+	return formatted
+}
+
 func UserActionDetail(c *gin.Context) {
 	form := request.Check(c, &struct {
 		Id        int      `form:"id" binding:"required"`

+ 0 - 1
controller/v1/user.go

@@ -114,7 +114,6 @@ func RefreshToken(c *gin.Context) {
 	response.Success(c, gin.H{
 		"data": data,
 	})
-
 }
 
 /* 获取时间 */

+ 22 - 8
controller/v1/userAds.go

@@ -8,6 +8,8 @@ import (
 	"designs/utils"
 	"github.com/gin-gonic/gin"
 	"math"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -234,12 +236,13 @@ func UserAdsDetail(c *gin.Context) {
 // 广告详细数据 --- 饼状图
 func UserAdsCake(c *gin.Context) {
 	form := request.Check(c, &struct {
-		Gid       string   `json:"gid" binding:"required"`
-		Pf        []string `form:"pf" binding:""`
-		StartTime string   `form:"startTime" json:"startTime" binding:""`
-		EndTime   string   `form:"endTime" json:"endTime" binding:""`
-		AdsState  []int    `json:"adsState" binding:""`
-		AdsType   string   `json:"adsType" binding:""`
+		Gid        string   `json:"gid" binding:"required"`
+		Pf         []string `form:"pf" binding:""`
+		StartTime  string   `form:"startTime" json:"startTime" binding:""`
+		EndTime    string   `form:"endTime" json:"endTime" binding:""`
+		CreateTime string   `form:"createTime" json:"createTime" binding:""`
+		AdsState   []int    `json:"adsState" binding:""`
+		AdsType    string   `json:"adsType" binding:""`
 	}{})
 
 	form.EndTime = form.EndTime + " 23:59:59"
@@ -250,6 +253,17 @@ func UserAdsCake(c *gin.Context) {
 		query = query.WhereIn("pf", form.Pf)
 	}
 
+	if form.CreateTime != "" {
+		createTime := strings.Split(form.CreateTime, ",")
+		startTime, _ := strconv.Atoi(createTime[0])
+		endTime, _ := strconv.Atoi(createTime[1])
+
+		t := time.Unix(int64(startTime)/1000, 0)
+		s := time.Unix(int64(endTime)/1000, 0)
+
+		query = query.Where("user_see_ads.createdAt", ">=", t).Where("user_see_ads.createdAt", "<=", s)
+	}
+
 	if form.StartTime != "" && form.EndTime != "" {
 		query = query.Where("user_see_ads.createdAt", ">=", form.StartTime).Where("user_see_ads.createdAt", "<=", form.EndTime)
 	}
@@ -262,14 +276,14 @@ func UserAdsCake(c *gin.Context) {
 
 	var data []struct {
 		Count    int64  `json:"count" gorm:"column:count;"`
-		AdsScene string `json:"adsScene" gorm:"not null;column:adsScene;"`
+		Name     string `json:"name" gorm:"not null;column:name;"`
 		SumType1 int    `json:"sumType1" gorm:"not null;column:sumType1;"`
 		SumType2 int    `json:"sumType2" gorm:"not null;column:sumType2;"`
 		SumType0 int    `json:"sumType0" gorm:"not null;column:sumType0;"`
 	}
 
 	err := query.Select(
-		"adsScene",
+		"adsScene as name",
 		"adsState",
 		"count(*) as count",
 		"SUM(adsState = 1) AS sumType1",

+ 249 - 0
controller/v1/userBehavior.go

@@ -14,6 +14,8 @@ import (
 	"go.mongodb.org/mongo-driver/v2/mongo/options"
 	"math"
 	"math/big"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -1139,3 +1141,250 @@ func GameConditionList(c *gin.Context) {
 		"count": count,
 	})
 }
+
+func BehaviorListCake(c *gin.Context) {
+	form := request.Check(c, &struct {
+		Gid string `form:"gid" json:"gid" binding:"required"`
+		Pf  string `form:"pf" json:"pf" binding:"required"`
+
+		ActiveStatus       string `form:"activeStatus" json:"activeStatus" binding:""`         //all true false
+		ConversionStatus   string `form:"conversionStatus" json:"conversionStatus" binding:""` //all true false
+		TotalDuration      string `form:"totalDuration" json:"totalDuration" binding:""`
+		TotalAdReqCount    string `form:"totalAdReqCount" json:"totalAdReqCount" binding:""`
+		TotalAdEposedCount string `form:"totalAdEposedCount" json:"totalAdEposedCount" binding:""`
+		CreateTime         string `json:"createTime" bson:"createTime"`
+
+		//AdFromCount string `form:"adFromCount" json:"adFromCount" binding:""`
+		//StartNum string `form:"startNum" json:"startNum" binding:""`
+	}{})
+	collection := global.App.MongoDB.Database("chunhao").Collection("userBehavior")
+
+	ctx := context.Background()
+	filter := bson.M{"gid": form.Gid}
+
+	if form.Pf != "" {
+		filter["pf"] = form.Pf
+	}
+
+	if form.ActiveStatus == "true" {
+		filter["activeStatus"] = true
+	} else if form.ActiveStatus == "false" {
+		filter["activeStatus"] = false
+	}
+
+	if form.ActiveStatus == "true" {
+		filter["activeStatus"] = true
+	} else if form.ActiveStatus == "false" {
+		filter["activeStatus"] = false
+	}
+
+	if form.CreateTime != "" {
+		createTime := strings.Split(strings.Replace(form.CreateTime, ",", ",", -1), ",")
+		filters := bson.M{}
+		filters["$gt"], _ = strconv.Atoi(createTime[0])
+		filters["$lte"], _ = strconv.Atoi(createTime[1])
+		filter["createTime"] = filters
+	}
+
+	type resData struct {
+		Count int    `json:"count"`
+		Name  string `json:"name"`
+	}
+
+	filterListTotalDuration := make(map[string]bson.M)
+
+	filterList := make(map[string]bson.M)
+
+	var data []resData
+	if form.TotalDuration != "" {
+		totalDuration := strings.Split(strings.Replace(form.TotalDuration, ",", ",", -1), ",")
+		for k, _ := range totalDuration {
+			var gt, lte int
+			if k == 0 {
+				gt = 0
+				lte, _ = strconv.Atoi(totalDuration[k])
+			} else {
+				gt, _ = strconv.Atoi(totalDuration[k-1])
+				lte, _ = strconv.Atoi(totalDuration[k])
+			}
+
+			filters := bson.M{}
+			filters["$gt"] = gt
+			filters["$lte"] = lte
+
+			filter1 := utils.DeepCopyMap(filter)
+
+			filter1["totalDuration"] = filters
+
+			name := "在线时长:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
+
+			filterListTotalDuration[name] = filter1
+		}
+
+		filters := bson.M{}
+		filters["$gt"], _ = strconv.Atoi(totalDuration[len(totalDuration)-1])
+		filter["totalDuration"] = filters
+
+		name := "在线时长:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
+
+		filterListTotalDuration[name] = filter
+	}
+
+	if form.TotalAdReqCount != "" {
+		totalDuration := strings.Split(strings.Replace(form.TotalAdReqCount, ",", ",", -1), ",")
+
+		for k, _ := range totalDuration {
+			var gt, lte int
+			if k == 0 {
+				gt = 0
+				lte, _ = strconv.Atoi(totalDuration[k])
+			} else {
+				gt, _ = strconv.Atoi(totalDuration[k-1])
+				lte, _ = strconv.Atoi(totalDuration[k])
+			}
+
+			filters := bson.M{}
+			filters["$gt"] = gt
+			filters["$lte"] = lte
+
+			if len(filterListTotalDuration) != 0 {
+				for nameD, filterD := range filterListTotalDuration {
+					filterE := utils.DeepCopyMap(filterD)
+
+					filterE["totalAdReqCount"] = filters
+
+					name := nameD + "&&" + "广告观看次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
+
+					filterList[name] = filterE
+				}
+
+			} else {
+				filter1 := utils.DeepCopyMap(filter)
+
+				filter1["totalAdReqCount"] = filters
+				name := "广告观看次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
+
+				filterList[name] = filter1
+			}
+		}
+
+		filters := bson.M{}
+		filters["$gt"], _ = strconv.Atoi(totalDuration[len(totalDuration)-1])
+		filter["totalAdReqCount"] = filters
+
+		if len(filterListTotalDuration) != 0 {
+			for nameD, filterD := range filterListTotalDuration {
+
+				filterD["totalAdReqCount"] = filters
+
+				name := nameD + "&&" + "广告观看次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
+
+				filterList[name] = filterD
+			}
+		} else {
+			filter1 := utils.DeepCopyMap(filter)
+			filter["totalAdReqCount"] = filters
+			name := "广告观看次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
+
+			filterList[name] = filter1
+		}
+
+		//count, err := collection.CountDocuments(ctx, filter)
+		//if err != nil {
+		//	response.Fail(c, 1001, err.Error())
+		//	return
+		//}
+		//data = append(data, resData{
+		//	Count: int(count),
+		//	Name:  totalDuration[len(totalDuration)-1] + "-" + "∞",
+		//})
+	}
+
+	if form.TotalAdEposedCount != "" {
+		totalDuration := strings.Split(strings.Replace(form.TotalAdEposedCount, ",", ",", -1), ",")
+
+		for k, _ := range totalDuration {
+			var gt, lte int
+			if k == 0 {
+				gt = 0
+				lte, _ = strconv.Atoi(totalDuration[k])
+			} else {
+				gt, _ = strconv.Atoi(totalDuration[k-1])
+				lte, _ = strconv.Atoi(totalDuration[k])
+			}
+
+			filters := bson.M{}
+			filters["$gt"] = gt
+			filters["$lte"] = lte
+
+			if len(filterListTotalDuration) != 0 {
+				for nameD, filterD := range filterListTotalDuration {
+					filterE := utils.DeepCopyMap(filterD)
+
+					filterE["TotalAdEposedCount"] = filters
+
+					name := nameD + "&&" + "广告看完次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
+
+					filterList[name] = filterE
+				}
+
+			} else {
+				filter1 := utils.DeepCopyMap(filter)
+
+				filter1["TotalAdEposedCount"] = filters
+				name := "广告看完次数:" + strconv.Itoa(gt) + "-" + strconv.Itoa(lte)
+
+				filterList[name] = filter1
+			}
+		}
+
+		filters := bson.M{}
+		filters["$gt"], _ = strconv.Atoi(totalDuration[len(totalDuration)-1])
+		filter["TotalAdEposedCount"] = filters
+
+		if len(filterListTotalDuration) != 0 {
+			for nameD, filterD := range filterListTotalDuration {
+
+				filterD["TotalAdEposedCount"] = filters
+
+				name := nameD + "&&" + "广告看完次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
+
+				filterList[name] = filterD
+			}
+		} else {
+			filter1 := utils.DeepCopyMap(filter)
+			filter["TotalAdEposedCount"] = filters
+			name := "广告看完次数:" + totalDuration[len(totalDuration)-1] + "-" + "∞"
+
+			filterList[name] = filter1
+		}
+
+		//count, err := collection.CountDocuments(ctx, filter)
+		//if err != nil {
+		//	response.Fail(c, 1001, err.Error())
+		//	return
+		//}
+		//data = append(data, resData{
+		//	Count: int(count),
+		//	Name:  totalDuration[len(totalDuration)-1] + "-" + "∞",
+		//})
+	}
+
+	if len(filterList) == 0 {
+		filterList = filterListTotalDuration
+	}
+
+	for k, filterC := range filterList {
+		count, _ := collection.CountDocuments(ctx, filterC)
+
+		data = append(data, resData{
+			Name:  k,
+			Count: int(count),
+		})
+	}
+
+	response.Success(c, gin.H{
+		"data": data,
+	})
+
+}

+ 8 - 0
model/user.go

@@ -134,3 +134,11 @@ type UserAction struct {
 	CreatedAt XTime  `json:"createdAt" gorm:"column:createdAt;type:date;"`
 	Data      string `json:"data" gorm:"not null;column:data;"`
 }
+
+type UserActionOption struct {
+	ID           int    `json:"id" gorm:"not null;"`
+	OptionId     string `json:"optionId" gorm:"not null;column:optionId;"`
+	Value        string `json:"value" gorm:"not null;column:value;"`
+	CreatedAt    XTime  `json:"createdAt" gorm:"column:createdAt;type:date;"`
+	UserActionId int    `json:"userActionId" gorm:"not null;column:userActionId;"`
+}

+ 2 - 0
route/api.go

@@ -61,6 +61,7 @@ func SetApiGroupRoutes(router *gin.RouterGroup) {
 		//游戏自定义事件统计
 		GroupV1.POST("/user/userActionDetail", v1.UserActionDetail)
 		GroupV1.POST("/user/userActionList", v1.UserActionList)
+		GroupV1.POST("/user/userActionOptionList", v1.UserActionOptionList)
 		GroupV1.POST("/user/userActionDetailDistribution", v1.UserActionDetailDistribution)
 
 		GroupV1.POST("/user/behaviorList", v1.BehaviorList)
@@ -74,6 +75,7 @@ func SetApiGroupRoutes(router *gin.RouterGroup) {
 		GroupV1.POST("/user/userAdsDetail", v1.UserAdsDetail)
 
 		GroupV1.POST("/user/userAdsCake", v1.UserAdsCake)
+		GroupV1.POST("/user/behaviorListCake", v1.BehaviorListCake)
 	}
 
 	router.POST("/SetUserBehaviorBak", v1.SetUserBehaviorBak)       //测试接口

+ 16 - 0
utils/map.go

@@ -1,5 +1,7 @@
 package utils
 
+import "reflect"
+
 func MergeMaps(destMap, sourceMap map[string]interface{}) map[string]interface{} {
 	newMap := make(map[string]interface{})
 
@@ -15,3 +17,17 @@ func MergeMaps(destMap, sourceMap map[string]interface{}) map[string]interface{}
 
 	return newMap
 }
+
+func DeepCopyMap(original map[string]interface{}) map[string]interface{} {
+	cloned := make(map[string]interface{})
+	for k, v := range original {
+		// 检查值是否为引用类型,递归处理
+		switch reflect.TypeOf(v).Kind() {
+
+		default:
+			// 基本类型直接赋值
+			cloned[k] = v
+		}
+	}
+	return cloned
+}