支付宝 接入一系列修改
This commit is contained in:
@@ -2,14 +2,13 @@ package admin
|
||||
|
||||
import (
|
||||
"common/connection"
|
||||
"time"
|
||||
)
|
||||
|
||||
func init() {
|
||||
//注册数据库
|
||||
connection.RegisterDBModel(&Admin{})
|
||||
connection.RegisterDBModel(&RecordLoginOfWxUser{})
|
||||
connection.RegisterDBModel(&RecordWatchADOfWxUser{})
|
||||
connection.RegisterDBModel(&RecordAveragePlayTimes{})
|
||||
connection.RegisterDBModel(&RecordAverageWatchADNum{})
|
||||
}
|
||||
|
||||
type Admin struct {
|
||||
@@ -36,28 +35,71 @@ type Admin struct {
|
||||
type RecordLoginOfWxUser struct {
|
||||
ID int64 `gorm:"column:id;primary_key;comment:自增索引;autoIncrementIncrement" json:"id"`
|
||||
Uid int64 `gorm:"column:uid;comment:用户唯一Id" json:"uid"`
|
||||
SeverId int32 `gorm:"column:severId;comment:区服Id" json:"severId"`
|
||||
RecordDate int64 `gorm:"column:recorddate;comment:记录日期" json:"recorddate"` //只记录当天0点的时间戳,方便查询某一日的数据
|
||||
LoginInTime int64 `gorm:"column:loginintime;comment:登录时间" json:"loginintime"`
|
||||
LoginOutTime int64 `gorm:"column:loginouttime;comment:登出时间" json:"loginouttime"`
|
||||
PlayTimes int64 `gorm:"column:playtimes;comment:游玩时长" json:"playtimes"`
|
||||
//用于统计当日的总上线人数 0=否,1=是
|
||||
IsFirstLogin int32 `gorm:"column:isfirstlogin;comment:是否首次登录" json:"isfirstlogin"`
|
||||
}
|
||||
|
||||
// 看广告相关记录
|
||||
// 记录日期便于按天统计
|
||||
type RecordWatchADOfWxUser struct {
|
||||
ID int64 `gorm:"column:id;primary_key;comment:自增索引;autoIncrementIncrement" json:"id"`
|
||||
RecordDate time.Time `gorm:"column:recorddate;type:date;comment:记录日期" json:"recorddate"`
|
||||
Uid int64 `gorm:"column:uid;comment:用户唯一Id" json:"uid"`
|
||||
WatchADNum int32 `gorm:"column:watchadnum;comment:看广告次数" json:"watchadnum"`
|
||||
ID int64 `gorm:"column:id;primary_key;comment:自增索引;autoIncrementIncrement" json:"id"`
|
||||
RecordDate int64 `gorm:"column:recorddate;comment:记录日期" json:"recorddate"` //只记录当天0点的时间戳,方便查询某一日的数据
|
||||
Uid int64 `gorm:"column:uid;comment:用户唯一Id" json:"uid"`
|
||||
SeverId int32 `gorm:"column:severId;comment:区服Id" json:"severId"`
|
||||
WatchADNum int32 `gorm:"column:watchadnum;comment:看广告次数" json:"watchadnum"`
|
||||
}
|
||||
|
||||
// 历史平均看广告次数的记录
|
||||
// 再次查询的时候就不用计算了
|
||||
type RecordAverageWatchADNum struct {
|
||||
ID int64 `gorm:"column:id;primary_key;comment:自增索引;autoIncrementIncrement" json:"id"`
|
||||
RecordDate int64 `gorm:"column:recorddate;comment:记录日期" json:"recorddate"` //只记录当天0点的时间戳,方便查询某一日的数据
|
||||
SeverId int32 `gorm:"column:severid;comment:区服ID" json:"severid"`
|
||||
AverageWatchADNum float32 `gorm:"column:averageplaytimes;comment:平均看广告次数" json:"averageplaytimes"`
|
||||
PlayerNum int64 `gorm:"column:playernum;comment:当日看广告人数人数" json:"playernum"`
|
||||
}
|
||||
|
||||
// 历史平均在线时长的记录
|
||||
// 再次查询的时候就不用计算了
|
||||
type RecordAveragePlayTimes struct {
|
||||
ID int64 `gorm:"column:id;primary_key;comment:自增索引;autoIncrementIncrement" json:"id"`
|
||||
RecordDate int64 `gorm:"column:recorddate;comment:记录日期" json:"recorddate"` //只记录当天0点的时间戳,方便查询某一日的数据
|
||||
SeverId int32 `gorm:"column:severid;comment:区服ID" json:"severid"`
|
||||
AveragePlayTimes int64 `gorm:"column:averageplaytimes;comment:平均在线时长" json:"averageplaytimes"`
|
||||
PlayerNum int64 `gorm:"column:playernum;comment:当日上线人数" json:"playernum"`
|
||||
}
|
||||
|
||||
// 记录当前为止的开服数
|
||||
type WxUserSeverList struct {
|
||||
ID int64 `gorm:"column:id;primary_key;comment:自增索引;autoIncrementIncrement" json:"id"`
|
||||
SeverId int32 `gorm:"column:severId;comment:区服Id" json:"severId"`
|
||||
}
|
||||
|
||||
func (Admin) TableName() string {
|
||||
return "admin"
|
||||
}
|
||||
|
||||
func (RecordLoginOfWxUser) TableName() string {
|
||||
return "recordloginofwxuser"
|
||||
func (RecordAveragePlayTimes) TableName() string {
|
||||
return "recordaverageplaytimes"
|
||||
}
|
||||
|
||||
func (RecordAverageWatchADNum) TableName() string {
|
||||
return "recordaveragewatchadnum"
|
||||
}
|
||||
|
||||
func (WxUserSeverList) TableName() string {
|
||||
return "wxuserseverlist"
|
||||
}
|
||||
|
||||
func (RecordWatchADOfWxUser) TableName() string {
|
||||
return "recordwatchadofwxuser"
|
||||
}
|
||||
|
||||
func (RecordLoginOfWxUser) TableName() string {
|
||||
return "recordloginofwxuser"
|
||||
}
|
||||
|
||||
@@ -203,55 +203,213 @@ func (a *AdminApi) Login(account string, password string) (responseObj *webServe
|
||||
return
|
||||
}
|
||||
|
||||
// 查询玩家登录相关记录
|
||||
// 获取某一天玩家的平均在线时长
|
||||
func init() {
|
||||
moduleName := "AdminApi"
|
||||
methodName := "QueryloginRecord"
|
||||
methodName := "GetAveragePlaytimes"
|
||||
skipVerifyTokenPage := true
|
||||
methodDesc := "查询玩家登录相关记录"
|
||||
methodDesc := "获取某一天玩家的平均在线时长"
|
||||
methodAuthor := "youjinlan"
|
||||
methodMendor := ""
|
||||
methodDate := "2025-01-21 16:00:00"
|
||||
methodInParam := []string{"int64:uid"}
|
||||
methodInParam := []string{"int64 startTime, int64 endTime"}
|
||||
methodOutParam := `
|
||||
{
|
||||
"Code '类型:int'": "响应结果的状态值",
|
||||
"Message '类型:string'": "响应结果的状态值所对应的描述信息",
|
||||
"Data '类型:interface{}'": "响应结果的数据"
|
||||
{
|
||||
"FirstLoginTime '类型:int64'": "首次登录时间",
|
||||
"PlayDayNum '类型:int32'": "生命周期",
|
||||
"PlayTimes '类型:int64'": "在线时长",
|
||||
"AveragePlaytimesForEachSever '类型:map[int32]map[int64]int64'": "各个服在该时间段内的各天平均在线时长",
|
||||
}
|
||||
}`
|
||||
|
||||
remark.RegisterMethodRemark(moduleName, methodName, methodDesc, methodAuthor, methodMendor, methodDate, methodInParam, methodOutParam, skipVerifyTokenPage)
|
||||
}
|
||||
|
||||
func (a *AdminApi) QueryloginRecord(uid int64) (responseObj *webServer.ResponseObject) {
|
||||
func (a *AdminApi) GetAveragePlaytimes(startTime, endTime int64) (responseObj *webServer.ResponseObject) {
|
||||
responseObj = webServer.GetInitResponseObj()
|
||||
//验证参数
|
||||
nowTime := time.Now().Unix()
|
||||
nowZero := mytime.ZeroTime(nowTime, 0)
|
||||
if startTime == 0 || endTime == 0 {
|
||||
responseObj.SetResultStatus(resultStatus.APIDataError)
|
||||
return
|
||||
}
|
||||
if startTime > nowTime {
|
||||
responseObj.SetResultStatus(resultStatus.APIDataError)
|
||||
return
|
||||
}
|
||||
startZero := mytime.ZeroTime(startTime, 0)
|
||||
endZero := mytime.ZeroTime(endTime, 0)
|
||||
if endZero > nowZero {
|
||||
endZero = nowZero
|
||||
}
|
||||
GetAveragePlaytimes()
|
||||
totalMap := make(map[int32]map[int64]int64)
|
||||
userSeverList, _ := GetUserSeverList()
|
||||
date := startZero
|
||||
for _, severlist := range userSeverList {
|
||||
dateMap := make(map[int64]int64)
|
||||
for {
|
||||
var averagePlaytimes int64
|
||||
if date != mytime.ZeroTime(nowTime, 0) {
|
||||
averagePlaytimes, _, _ = GetRecordAveragePlayTimes(date, severlist.SeverId)
|
||||
if averagePlaytimes == 0 {
|
||||
playtimes := GetUserTotalPlayTimes(date, severlist.SeverId)
|
||||
count := GetUserTotalPlayerNum(date, severlist.SeverId)
|
||||
if playtimes == 0 || count == 0 {
|
||||
averagePlaytimes = 0
|
||||
} else {
|
||||
averagePlaytimes = playtimes / count
|
||||
}
|
||||
//把今日之前的数据添加到数据库,因为数据不会再变化了,下次查询就不用计算了
|
||||
recordAveragePlayTimes := &RecordAveragePlayTimes{}
|
||||
recordAveragePlayTimes.AveragePlayTimes = averagePlaytimes
|
||||
recordAveragePlayTimes.PlayerNum = count
|
||||
recordAveragePlayTimes.SeverId = severlist.SeverId
|
||||
recordAveragePlayTimes.RecordDate = date
|
||||
AddRecordAveragePlayTimes(recordAveragePlayTimes)
|
||||
}
|
||||
} else {
|
||||
playtimes := GetUserTotalPlayTimes(date, severlist.SeverId)
|
||||
count := GetUserTotalPlayerNum(date, severlist.SeverId)
|
||||
if playtimes == 0 || count == 0 {
|
||||
averagePlaytimes = 0
|
||||
} else {
|
||||
averagePlaytimes = playtimes / count
|
||||
}
|
||||
}
|
||||
dateMap[date] = averagePlaytimes
|
||||
if date+86400 > endZero {
|
||||
date = startZero
|
||||
break
|
||||
}
|
||||
date = date + 86400
|
||||
}
|
||||
totalMap[severlist.SeverId] = dateMap
|
||||
}
|
||||
resultMap := make(map[string]any)
|
||||
resultMap["AveragePlaytimesForEachSever"] = totalMap
|
||||
responseObj.SetData(resultMap)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取某一天玩家的平均看广告次数
|
||||
func init() {
|
||||
moduleName := "AdminApi"
|
||||
methodName := "GetAverageWatchADNum"
|
||||
skipVerifyTokenPage := true
|
||||
methodDesc := "获取某一天玩家的平均看广告次数"
|
||||
methodAuthor := "youjinlan"
|
||||
methodMendor := ""
|
||||
methodDate := "2025-01-24 15:00:00"
|
||||
methodInParam := []string{"int64 startTime, int64 endTime"}
|
||||
methodOutParam := `
|
||||
{
|
||||
"Code '类型:int'": "响应结果的状态值",
|
||||
"Message '类型:string'": "响应结果的状态值所对应的描述信息",
|
||||
"Data '类型:interface{}'": "响应结果的数据"
|
||||
{
|
||||
"AverageWatchADNumForEachSever '类型:map[int32]map[int64]int32'": "各个服在该时间段内的各天平均看广告次数",
|
||||
}
|
||||
}`
|
||||
remark.RegisterMethodRemark(moduleName, methodName, methodDesc, methodAuthor, methodMendor, methodDate, methodInParam, methodOutParam, skipVerifyTokenPage)
|
||||
}
|
||||
|
||||
func (a *AdminApi) GetAverageWatchADNum(startTime, endTime int64) (responseObj *webServer.ResponseObject) {
|
||||
responseObj = webServer.GetInitResponseObj()
|
||||
//验证参数
|
||||
nowTime := time.Now().Unix()
|
||||
nowZero := mytime.ZeroTime(nowTime, 0)
|
||||
if startTime == 0 || endTime == 0 {
|
||||
responseObj.SetResultStatus(resultStatus.APIDataError)
|
||||
return
|
||||
}
|
||||
if startTime > nowTime {
|
||||
responseObj.SetResultStatus(resultStatus.APIDataError)
|
||||
return
|
||||
}
|
||||
startZero := mytime.ZeroTime(startTime, 0)
|
||||
endZero := mytime.ZeroTime(endTime, 0)
|
||||
if endZero > nowZero {
|
||||
endZero = nowZero
|
||||
}
|
||||
GetAveragePlaytimes()
|
||||
totalMap := make(map[int32]map[int64]float32)
|
||||
userSeverList, _ := GetUserSeverList()
|
||||
date := startZero
|
||||
for _, severlist := range userSeverList {
|
||||
dateMap := make(map[int64]float32)
|
||||
for {
|
||||
if date != mytime.ZeroTime(nowTime, 0) {
|
||||
avgWatchADNum, _, _ := GetRecordAverageWatchADNum(date, severlist.SeverId)
|
||||
if avgWatchADNum == 0 {
|
||||
avgWatchADNum = GetUserAvgWatchADNum(date, severlist.SeverId)
|
||||
count := GetUserWatchADPlayerNum(date, severlist.SeverId)
|
||||
//把今日之前的数据添加到数据库,因为数据不会再变化了,下次查询就不用计算了
|
||||
recordAverageWatchADNum := &RecordAverageWatchADNum{}
|
||||
recordAverageWatchADNum.AverageWatchADNum = avgWatchADNum
|
||||
recordAverageWatchADNum.PlayerNum = count
|
||||
recordAverageWatchADNum.SeverId = severlist.SeverId
|
||||
recordAverageWatchADNum.RecordDate = date
|
||||
AddRecordAverageWatchADNum(recordAverageWatchADNum)
|
||||
}
|
||||
} else {
|
||||
avgWatchADNum := GetUserAvgWatchADNum(date, severlist.SeverId)
|
||||
dateMap[date] = avgWatchADNum
|
||||
if date+86400 > endZero {
|
||||
date = startZero
|
||||
break
|
||||
}
|
||||
date = date + 86400
|
||||
}
|
||||
}
|
||||
totalMap[severlist.SeverId] = dateMap
|
||||
}
|
||||
resultMap := make(map[string]any)
|
||||
resultMap["AverageWatchADNumForEachSever"] = totalMap
|
||||
responseObj.SetData(resultMap)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取某个玩家的生命周期
|
||||
func init() {
|
||||
moduleName := "AdminApi"
|
||||
methodName := "GetPlayerLiveNum"
|
||||
skipVerifyTokenPage := true
|
||||
methodDesc := "获取某个玩家的生命周期"
|
||||
methodAuthor := "youjinlan"
|
||||
methodMendor := ""
|
||||
methodDate := "2025-01-24 17:00:00"
|
||||
methodInParam := []string{"int64 uid"}
|
||||
methodOutParam := `
|
||||
{
|
||||
"Code '类型:int'": "响应结果的状态值",
|
||||
"Message '类型:string'": "响应结果的状态值所对应的描述信息",
|
||||
"Data '类型:interface{}'": "响应结果的数据"
|
||||
{
|
||||
"LiveNum '类型:int32'": "玩家的生命周期(玩了多少天)",
|
||||
}
|
||||
}`
|
||||
remark.RegisterMethodRemark(moduleName, methodName, methodDesc, methodAuthor, methodMendor, methodDate, methodInParam, methodOutParam, skipVerifyTokenPage)
|
||||
}
|
||||
|
||||
func (a *AdminApi) GetPlayerLiveNum(uid int64) (responseObj *webServer.ResponseObject) {
|
||||
responseObj = webServer.GetInitResponseObj()
|
||||
if uid == 0 {
|
||||
responseObj.SetResultStatus(resultStatus.APIDataError)
|
||||
return
|
||||
}
|
||||
var userfirstRecord *RecordLoginOfWxUser
|
||||
if userfirstRecord, _ = GetUserFirstRecord(uid); userfirstRecord == nil {
|
||||
var userRecord *RecordLoginOfWxUser
|
||||
if userRecord, _ = GetUserFirstRecord(uid); userRecord == nil {
|
||||
responseObj.SetResultStatus(resultStatus.PlayerNotExist)
|
||||
return
|
||||
}
|
||||
userLastRecord, _ := GetUserLastRecord(uid)
|
||||
firstLoginInTime := userfirstRecord.LoginInTime
|
||||
var lastLoginOutTime int64
|
||||
if userLastRecord.LoginOutTime == 0 {
|
||||
lastLoginOutTime = userLastRecord.LoginInTime
|
||||
}
|
||||
lastLoginOutTime = userLastRecord.LoginOutTime
|
||||
playDayNum := mytime.DiffDays(lastLoginOutTime, firstLoginInTime)
|
||||
firstDate := userRecord.RecordDate
|
||||
userRecord, _ = GetUserLastRecord(uid)
|
||||
lastDate := userRecord.RecordDate
|
||||
resultMap := make(map[string]any)
|
||||
resultMap["FirstLoginTime"] = firstLoginInTime
|
||||
resultMap["PlayDayNum"] = playDayNum
|
||||
resultMap["PlayTimes"] = GetUserTotalPlayTime(uid)
|
||||
liveNum := mytime.DiffDays(lastDate, firstDate)
|
||||
resultMap["LiveNum"] = liveNum
|
||||
responseObj.SetData(resultMap)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -62,8 +62,82 @@ func GetUserLastRecord(uid int64) (*RecordLoginOfWxUser, error) {
|
||||
return userRecord, nil
|
||||
}
|
||||
|
||||
func GetUserTotalPlayTime(uid int64) int64 {
|
||||
// 计算某日某服的玩家在线总时长
|
||||
func GetUserTotalPlayTimes(date int64, severId int32) int64 {
|
||||
var totalPlayTime int64
|
||||
connection.GetUserDB().Table("recordloginofwxuser").Where("uid = ?", uid).Select("SUM(playtimes)").Scan(&totalPlayTime)
|
||||
connection.GetUserDB().Table("recordloginofwxuser").Where("recorddate = ? AND severid = ?", date, severId).Select("SUM(playtimes)").Scan(&totalPlayTime)
|
||||
return totalPlayTime
|
||||
}
|
||||
|
||||
// 计算某日某服的玩家上线总人数
|
||||
func GetUserTotalPlayerNum(date int64, severId int32) int64 {
|
||||
var count int64
|
||||
connection.GetUserDB().Table("recordloginofwxuser").Where("recorddate = ? AND severid = ? AND isfirstlogin = ?", date, severId, 1).Count(&count)
|
||||
return count
|
||||
}
|
||||
|
||||
// 获取区服列表
|
||||
func GetUserSeverList() ([]*WxUserSeverList, error) {
|
||||
var userSeverList []*WxUserSeverList
|
||||
result := connection.GetUserDB().Find(&userSeverList)
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("查询用户区服列表失败 错误信息:%s", result.Error.Error())
|
||||
return nil, result.Error
|
||||
}
|
||||
return userSeverList, nil
|
||||
}
|
||||
|
||||
// 添加玩家的平均在线时长数据到数据库
|
||||
func AddRecordAveragePlayTimes(recordAveragePlayTimes *RecordAveragePlayTimes) (int64, error) {
|
||||
connection.CheckTableExists(connection.GetAdminDB(), &RecordAveragePlayTimes{})
|
||||
result := connection.GetAdminDB().Create(&recordAveragePlayTimes) // 通过数据的指针来创建
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("添加平均在线时长记录失败 错误信息:%s", result.Error)
|
||||
}
|
||||
return recordAveragePlayTimes.ID, nil
|
||||
}
|
||||
|
||||
// 获取某日某服的玩家平均在线时长记录和总上线人数
|
||||
func GetRecordAveragePlayTimes(date int64, severId int32) (int64, int64, error) {
|
||||
var recordAveragePlayTimes *RecordAveragePlayTimes
|
||||
result := connection.GetAdminDB().Where("recorddate = ? AND severid = ?", date, severId).First(&recordAveragePlayTimes)
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("查询平均在线时长记录失败 错误信息:%s", result.Error)
|
||||
return 0, 0, result.Error
|
||||
}
|
||||
return recordAveragePlayTimes.AveragePlayTimes, recordAveragePlayTimes.PlayerNum, nil
|
||||
}
|
||||
|
||||
// 计算某日某服的玩家平均看广告次数
|
||||
func GetUserAvgWatchADNum(date int64, severId int32) float32 {
|
||||
var avgWatchADNum float32
|
||||
connection.GetUserDB().Table("recordwatchadofwxuser").Where("recorddate = ? AND severid = ?", date, severId).Select("AVG(watchadnum)").Scan(&avgWatchADNum)
|
||||
return avgWatchADNum
|
||||
}
|
||||
|
||||
// 计算某日某服玩家的看广告总人数
|
||||
func GetUserWatchADPlayerNum(date int64, severId int32) int64 {
|
||||
var count int64
|
||||
connection.GetUserDB().Table("recordwatchadofwxuser").Where("recorddate = ? AND severid = ?", date, severId).Count(&count)
|
||||
return count
|
||||
}
|
||||
|
||||
// 添加玩家的平均看广告次数到数据库
|
||||
func AddRecordAverageWatchADNum(recordAverageWatchADNum *RecordAverageWatchADNum) (int64, error) {
|
||||
result := connection.GetAdminDB().Create(&recordAverageWatchADNum) // 通过数据的指针来创建
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("添加平均看广告次数记录失败 错误信息:%s", result.Error)
|
||||
}
|
||||
return recordAverageWatchADNum.ID, nil
|
||||
}
|
||||
|
||||
// 获取某日某服玩家的平均看广告次数和总人数
|
||||
func GetRecordAverageWatchADNum(date int64, severId int32) (float32, int64, error) {
|
||||
var recordAverageWatchADNum *RecordAverageWatchADNum
|
||||
result := connection.GetAdminDB().Where("recorddate = ? AND severid = ?", date, severId).First(&recordAverageWatchADNum)
|
||||
if result.Error != nil {
|
||||
logUtilPlus.ErrorLog("查询平均看广告次数记录失败 错误信息:%s", result.Error)
|
||||
return 0, 0, result.Error
|
||||
}
|
||||
return recordAverageWatchADNum.AverageWatchADNum, recordAverageWatchADNum.PlayerNum, nil
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"sync"
|
||||
|
||||
_ "admincenter/internal/admin"
|
||||
_ "common/resultStatus"
|
||||
"common/webServer"
|
||||
)
|
||||
|
||||
@@ -37,7 +36,6 @@ func loadConfig() {
|
||||
|
||||
//设置数据类型
|
||||
connection.SetModelDB(connection.GetAdminDB())
|
||||
connection.SetModelDB(connection.GetUserDB())
|
||||
|
||||
//构建数据库
|
||||
connection.BuildDB()
|
||||
|
||||
Reference in New Issue
Block a user