支付宝 接入一系列修改

This commit is contained in:
2025-02-08 16:30:07 +08:00
parent 27aff930c7
commit cbdce12462
31 changed files with 1432 additions and 357 deletions

View File

@@ -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"
}

View File

@@ -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
}

View File

@@ -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
}