Browse Source

修改公告相关逻辑

master
wserver 2 years ago
parent
commit
a4a3e58f76
  1. 44
      api/v1/game/custom.go
  2. 13
      api/v1/game/game.go
  3. 57
      api/v1/game/manage.go
  4. 52
      api/v1/game/notice.go
  5. 9
      api/v1/game/order.go
  6. 28
      internal/controller/game_custom.go
  7. 33
      internal/controller/game_manage.go
  8. 32
      internal/controller/game_notice.go
  9. 24
      internal/controller/game_order.go
  10. 30
      internal/controller/game_pub.go
  11. 11
      internal/model/entity/base_info.go
  12. 4
      internal/router/router.go
  13. 86
      internal/serviceGame/custom.go
  14. 13
      internal/serviceGame/internal/basicinfo.go
  15. 12
      internal/serviceGame/internal/dbinit.go
  16. 16
      internal/serviceGame/internal/mail.go
  17. 127
      internal/serviceGame/internal/manage.go
  18. 7
      internal/serviceGame/internal/mqtt_client.go
  19. 14
      internal/serviceGame/internal/notice.go
  20. 50
      internal/serviceGame/internal/order.go
  21. 2
      internal/serviceGame/mail.go
  22. 104
      internal/serviceGame/manage.go
  23. 169
      internal/serviceGame/notice.go
  24. 125
      internal/serviceGame/order.go

44
api/v1/game/custom.go

@ -0,0 +1,44 @@
package game
import (
"github.com/gogf/gf/v2/frame/g"
commonApi "tyj_admin/api/v1/common"
"tyj_admin/internal/model/entity"
)
type BugAddReq struct {
g.Meta `path:"/custom/bugadd" tags:"增加BUG" method:"post" summary:"增加BUG"`
Uid int32 `p:"uid" v:"required#uid不能为空"`
Server int32 `p:"server" `
Qq string `p:"qq" `
Tel string `p:"tel" `
Bug string `p:"bug"`
OccurrenceTime int64 `p:"occurrenceTime"`
CreateTime int64 `p:"createTime"`
State int32 `p:"state"`
}
type BugAddRes struct {
}
type BugListReq struct {
g.Meta `path:"/custom/buglist" tags:"BUG列表" method:"get" summary:"BUG列表"`
LowTime int64 `p:"lowTime"`
UpTime int64 `p:"upTime"`
State int64 `p:"state"` //0表示所有的,1表示没处理的,2表示处理完的
commonApi.PageReq
}
type BugListRes struct {
g.Meta `mime:"application/json"`
Bugs []*entity.GameBug `json:"list"`
commonApi.ListRes
}
type OperateBugReq struct {
g.Meta `path:"/custom/operatebug" tags:"处理BUG" method:"post" summary:"处理BUG"`
Id int32 `p:"Id"`
}
type OperateBugRes struct {
}

13
api/v1/game/game.go

@ -0,0 +1,13 @@
package game
import "github.com/gogf/gf/v2/frame/g"
type GetGameUpdateUrlReq struct {
g.Meta `path:"/updateurl/get" tags:"强更地址" method:"get" summary:"强更地址"`
Channel string `p:"channel"`
}
type GetGameUpdateUrlRes struct {
g.Meta `mime:"application/json"`
Url string `json:"url"`
}

57
api/v1/game/manage.go

@ -1,6 +1,9 @@
package game
import "github.com/gogf/gf/v2/frame/g"
import (
"github.com/gogf/gf/v2/frame/g"
"tyj_admin/internal/model/entity"
)
// 修改GM权限
type ChangeGmReq struct {
@ -11,8 +14,6 @@ type ChangeGmReq struct {
}
type ChangeGmRes struct {
Account string `p:"account"`
ServerId int `p:"serverId"` //0,总服,其他分服
}
type SearchGmReq struct {
@ -22,5 +23,53 @@ type SearchGmReq struct {
}
type SearchGmRes struct {
Result int `p:"result"`
g.Meta `mime:"application/json"`
Gm int `p:"gm"`
}
type ResetPwdReq struct {
g.Meta `path:"/mange/resetpwd" tags:"修改登录密码" method:"post" summary:"修改登录密码"`
Account string `p:"account"`
Pwd string `p:"pwd"`
}
type ResetPwdRes struct {
}
type MigrateSearchReq struct {
g.Meta `path:"/mange/migratesearch" tags:"迁移查询" method:"get" summary:"迁移查询"`
SrcServerId int `json:"srcServerId"`
SrcUid int32 `json:"srcUid"`
DesServerId int `json:"desServerId"`
DrcUid int32 `json:"drcUid"`
}
type MigrateSearchRes struct {
g.Meta `mime:"application/json"`
RoleList []*entity.RoleDetail `json:"list"`
}
type MigrateReq struct {
g.Meta `path:"/mange/migrate" tags:"迁移" method:"get" summary:"迁移"`
SrcServerId int `json:"srcServerId"`
SrcUid int32 `json:"srcUid"`
DesServerId int `json:"desServerId"`
DesUid int32 `json:"desUid"`
}
type MigrateRes struct {
}
type StatisticsReq struct {
g.Meta `path:"/mange/statistics" tags:"统计数据" method:"get" summary:"统计数据"`
LowTime int64 `json:"lowTime"`
UpTime int64 `json:"upTime"`
}
type StatisticsRes struct {
g.Meta `mime:"application/json"`
RegisterNum int64 `json:"registerNum"`
DepositNum int64 `json:"depositNum"`
Sum int32 `json:"sum"` //总充值
Remain []*entity.Remain `json:"list"`
}

52
api/v1/game/notice.go

@ -0,0 +1,52 @@
package game
import "github.com/gogf/gf/v2/frame/g"
type AddNoticeReq struct {
g.Meta `path:"/notice/add" tags:"维护公告" method:"post" summary:"维护公告"`
Status int `p:"status"`
Content string `p:"content"`
Channel string `p:"channel"`
NoticeType int `p:"noticeType"`
Id int `p:"id"`
}
type AddNoticeRes struct {
}
type GetNoticeReq struct {
g.Meta `path:"/notice/get" tags:"维护公告" method:"get" summary:"维护公告"`
Channel string `p:"channel"`
NoticeType int `p:"noticeType"`
}
type GetNoticeRes struct {
g.Meta `mime:"application/json"`
Status int `json:"status"`
Content string `json:"content"`
Id int `json:"id"`
}
type PopReq struct {
g.Meta `path:"/notice/pop" tags:"弹窗公告" method:"post" summary:"弹窗公告"`
Type int `p:"popType"`
Uids string `p:"uids"`
ServerId int `p:"serverId"`
Content string `p:"content"`
}
type PopRes struct {
}
type GetGameNoticeReq struct {
g.Meta `path:"/gamenotice/get" tags:"维护公告" method:"get" summary:"维护公告"`
Channel string `p:"channel"`
NoticeType int `p:"noticeType"`
}
type GetGameNoticeRes struct {
g.Meta `mime:"application/json"`
Status int `json:"status"`
Content string `json:"content"`
Id int `json:"id"`
}

9
api/v1/game/order.go

@ -42,8 +42,9 @@ type OrderCountRes struct {
type OrderDepositReq struct {
g.Meta `path:"/order/deposit" tags:"充值" method:"post" summary:"补单充值"`
Account string `p:"account"`
DepositId int `p:"depositId"`
ServerId int `p:"serverId"`
DepositId int32 `p:"depositId"`
ServerId int32 `p:"serverId"`
Platform int `p:"platform"`
}
type OrderDepositRes struct {
@ -53,8 +54,8 @@ type OrderDepositRes struct {
type AddCoinReq struct {
g.Meta `path:"/order/addcoin" tags:"修改游戏币" method:"post" summary:"修改游戏币"`
Uid string `p:"uid"`
Amount int `p:"amount"`
AmountType int `p:"amountType"`
Amount int32 `p:"amount"`
AmountType int32 `p:"amountType"`
ServerId int `p:"serverId"`
}

28
internal/controller/game_custom.go

@ -0,0 +1,28 @@
package controller
import (
"context"
"tyj_admin/api/v1/game"
"tyj_admin/internal/serviceGame"
)
var GameCustom = customController{}
type customController struct {
BaseController
}
// bug 列表
func (c *customController) List(ctx context.Context, req *game.BugListReq) (res *game.BugListRes, err error) {
res, err = serviceGame.GameCustom().List(ctx, req)
return
}
func (c *customController) Operate(ctx context.Context, req *game.OperateBugReq) (res *game.OperateBugRes, err error) {
res, err = serviceGame.GameCustom().UpdateState(ctx, req)
return
}
func (c *customController) Add(ctx context.Context, req *game.BugAddReq) (res *game.BugAddRes, err error) {
res, err = serviceGame.GameCustom().Add(ctx, req)
return
}

33
internal/controller/game_manage.go

@ -0,0 +1,33 @@
package controller
import (
"context"
"tyj_admin/api/v1/game"
"tyj_admin/internal/serviceGame"
)
var GameManage = manageController{}
type manageController struct {
BaseController
}
func (c *manageController) ChangeGmAuthority(ctx context.Context, req *game.ChangeGmReq) (res *game.ChangeGmRes, err error) {
res, err = serviceGame.GameManage().ChangeGm(ctx, req)
return
}
func (c *manageController) SearchGmAuthority(ctx context.Context, req *game.SearchGmReq) (res *game.SearchGmRes, err error) {
res, err = serviceGame.GameManage().SearchGm(ctx, req)
return
}
func (c *manageController) ChangePwd(ctx context.Context, req *game.ResetPwdReq) (res *game.ResetPwdRes, err error) {
res, err = serviceGame.GameManage().ChangePwd(ctx, req)
return
}
func (c *manageController) GetStatistics(ctx context.Context, req *game.StatisticsReq) (res *game.StatisticsRes, err error) {
res, err = serviceGame.GameManage().GetStatistics(ctx, req)
return
}

32
internal/controller/game_notice.go

@ -0,0 +1,32 @@
package controller
import (
"context"
"fmt"
"tyj_admin/api/v1/game"
"tyj_admin/internal/serviceGame"
"tyj_admin/library/libUtils"
)
var GameNotice = noticeController{}
type noticeController struct {
BaseController
}
func (c *noticeController) Add(ctx context.Context, req *game.AddNoticeReq) (res *game.AddNoticeRes, err error) {
res, err = serviceGame.GameNotice().AddNotice(ctx, req)
return
}
func (c *noticeController) Get(ctx context.Context, req *game.GetNoticeReq) (res *game.GetNoticeRes, err error) {
ip := libUtils.GetClientIp(ctx)
fmt.Println(ip)
res, err = serviceGame.GameNotice().GetNotice(ctx, req)
return
}
func (c *noticeController) PopNotice(ctx context.Context, req *game.PopReq) (res *game.PopRes, err error) {
res, err = serviceGame.GameNotice().PopNotice(ctx, req)
return
}

24
internal/controller/game_order.go

@ -12,14 +12,32 @@ type orderController struct {
BaseController
}
// mail 列表
func (c *mailController) OrderList(ctx context.Context, req *game.OrderSearchReq) (res *game.OrderSearchRes, err error) {
// order 列表
func (c *orderController) OrderList(ctx context.Context, req *game.OrderSearchReq) (res *game.OrderSearchRes, err error) {
res, err = serviceGame.GameOrder().GetOrders(ctx, req)
return
}
// 订单统计数据
func (c *mailController) OrderCount(ctx context.Context, req *game.OrderCountReq) (res *game.OrderCountRes, err error) {
func (c *orderController) OrderCount(ctx context.Context, req *game.OrderCountReq) (res *game.OrderCountRes, err error) {
res, err = serviceGame.GameOrder().GetOrderCount(ctx, req)
return
}
// 修改金币
func (c *orderController) ChangeCoin(ctx context.Context, req *game.AddCoinReq) (res *game.AddCoinRes, err error) {
res, err = serviceGame.GameOrder().ChangeCoin(ctx, req)
return
}
//充值
func (c *orderController) Deposit(ctx context.Context, req *game.OrderDepositReq) (res *game.OrderDepositRes, err error) {
if req.Platform == 1 {
res, err = serviceGame.GameOrder().AndroidDeposit(ctx, req)
} else {
res, err = serviceGame.GameOrder().IosDeposit(ctx, req)
}
return
}

30
internal/controller/game_pub.go

@ -0,0 +1,30 @@
package controller
import (
"context"
"tyj_admin/api/v1/game"
"tyj_admin/internal/model/entity"
"tyj_admin/internal/service"
"tyj_admin/internal/serviceGame"
)
var GamePub = pubController{}
type pubController struct {
BaseController
}
func (c *pubController) Get(ctx context.Context, req *game.GetGameNoticeReq) (res *game.GetGameNoticeRes, err error) {
res, err = serviceGame.GameNotice().GetGameNotice(ctx, req)
return
}
func (c *pubController) GetUpdateUrl(ctx context.Context, req *game.GetGameUpdateUrlReq) (res *game.GetGameUpdateUrlRes, err error) {
config := new(entity.SysConfig)
res = new(game.GetGameUpdateUrlRes)
config, err = service.Config().GetByKey(ctx, req.Channel+"_url")
if err == nil && config != nil {
res.Url = config.ConfigValue
}
return
}

11
internal/model/entity/base_info.go

@ -9,7 +9,7 @@ type RolePost struct {
TotalTime int64 `json:"totalTime" description:"总在线时间"`
RechargeTotal int32 `json:"rechargeTotal" description:"累计充值"`
CreateTime primitive.DateTime `json:"createTime" description:"创建时间"`
LastLeaveTime primitive.DateTime `json:"lastLeaveTime" description:"修改时间"`
LastLeaveTime primitive.DateTime `json:"lastLeaveTime" description:"离线时间"`
}
type RoleDetail struct {
@ -19,6 +19,7 @@ type RoleDetail struct {
VillageScale int32 `json:"villageScale" description:"规模等级"`
GiftIds []int32 `json:"giftIds" description:"礼包码"`
Account string `json:"account" description:"账号名字"`
Gm int `json:"gm"`
}
type Mail struct {
@ -80,4 +81,12 @@ type AccountInfo struct {
LastLeaveTime primitive.DateTime `json:"lastLeaveTime"`
CreateTime primitive.DateTime `json:"createTime"`
LeftPlayTime int64 `json:"leftPlayTime"`
Gm int `json:"gm"`
}
type Remain struct {
Date int64 `json:"date"`
RemainRate float32 `json:"remainRate"`
RemainVal int32 `json:"remainVal"`
Total int32 `json:"total"`
}

4
internal/router/router.go

@ -89,6 +89,7 @@ func SystemBindController(group *ghttp.RouterGroup) {
func GameBindController(group *ghttp.RouterGroup) {
group.Group("/game", func(group *ghttp.RouterGroup) {
group.Bind(controller.GamePub)
group.Middleware(service.Middleware().MiddlewareCORS)
service.SysGfToken().Middleware(group)
//context拦截器
@ -97,6 +98,9 @@ func GameBindController(group *ghttp.RouterGroup) {
controller.GameRole,
controller.GameMail,
controller.GameOrder,
controller.GameManage,
controller.GameNotice,
controller.GameCustom,
)
})
}

86
internal/serviceGame/custom.go

@ -0,0 +1,86 @@
package serviceGame
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
"tyj_admin/api/v1/game"
"tyj_admin/internal/consts"
"tyj_admin/internal/dao"
"tyj_admin/internal/model/do"
"tyj_admin/library/liberr"
)
type IGameCustom interface {
List(ctx context.Context, req *game.BugListReq) (res *game.BugListRes, err error)
Add(ctx context.Context, req *game.BugAddReq) (res *game.BugAddRes, err error)
UpdateState(ctx context.Context, req *game.OperateBugReq) (res *game.OperateBugRes, err error)
}
type gameCustomImpl struct {
}
func (c gameCustomImpl) UpdateState(ctx context.Context, req *game.OperateBugReq) (res *game.OperateBugRes, err error) {
err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
err = g.Try(ctx, func(ctx context.Context) {
_, err = dao.GameBug.Ctx(ctx).TX(tx).WherePri(req.Id).Update(do.GameBug{State: 1})
})
return err
})
return
}
func (c gameCustomImpl) List(ctx context.Context, req *game.BugListReq) (res *game.BugListRes, err error) {
res = new(game.BugListRes)
g.Try(ctx, func(ctx context.Context) {
model := dao.GameBug.Ctx(ctx)
if req.State != 0 {
model = model.Where("state=", gconv.Int(req.State-1))
}
if req.LowTime != 0 {
model = model.Where("occurrenceTime>", req.LowTime/1000)
}
if req.UpTime != 0 {
model = model.Where("occurrenceTime<", req.UpTime/1000)
}
res.Total, err = model.Count()
liberr.ErrIsNil(ctx, err, "获取BUG数据失败")
if req.PageNum == 0 {
req.PageNum = 1
}
res.CurrentPage = req.PageNum
if req.PageSize == 0 {
req.PageSize = consts.PageSize
}
err = model.Page(res.CurrentPage, req.PageSize).Order("id asc").Scan(&res.Bugs)
liberr.ErrIsNil(ctx, err, "获取bug数据失败")
})
return
}
func (c gameCustomImpl) Add(ctx context.Context, req *game.BugAddReq) (res *game.BugAddRes, err error) {
err = g.DB().Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
err = g.Try(ctx, func(ctx context.Context) {
_, err = dao.GameBug.Ctx(ctx).TX(tx).InsertAndGetId(do.GameBug{
Uid: req.Uid,
Server: req.Server,
Qq: req.Qq,
Tel: req.Tel,
Bug: req.Bug,
CreateTime: req.CreateTime,
OccurrenceTime: req.OccurrenceTime,
State: req.State,
})
})
return err
})
return
}
var customMailService = gameCustomImpl{}
func GameCustom() IGameCustom {
return &customMailService
}

13
internal/serviceGame/internal/basicinfo.go

@ -3,7 +3,6 @@ package internal
import (
"context"
"encoding/json"
"fmt"
"github.com/gogf/gf/v2/errors/gerror"
"go.mongodb.org/mongo-driver/bson"
"tyj_admin/internal/model/entity"
@ -19,6 +18,17 @@ func GetServerList(account string, ctx context.Context) []int {
}
func GetWhiteList(ctx context.Context) ([]string, error) {
rdbTop := RedisDbList[0]
rdbTop.Do(ctx, "select", 0)
var m []string
result := rdbTop.Get(ctx, "ipWhiteList")
json.Unmarshal([]byte(result.Val()), &m)
return m, result.Err()
}
func GetRoleList(ctx context.Context, account string) (RoleList []*entity.RolePost, err error) {
serverList := GetServerList(account, ctx)
for _, v := range serverList {
@ -30,7 +40,6 @@ func GetRoleList(ctx context.Context, account string) (RoleList []*entity.RolePo
}
one.Region = v
RoleList = append(RoleList, one)
fmt.Println("one")
}
return RoleList, err

12
internal/serviceGame/internal/dbinit.go

@ -12,6 +12,7 @@ import (
var (
MongoDatabaseList []*qmgo.Database
RedisDbList []*redis.Client
ServerConfig []map[string]interface{}
)
func init() {
@ -28,16 +29,20 @@ func init() {
return
}
RedisInit(redisCfg.Maps())
svCfg, err := g.Cfg().Get(ctx, "game.server")
if err == nil {
ServerConfig = svCfg.Maps()
}
}
func MongoInit(config []map[string]interface{}) {
ctx := context.Background()
for _, v := range config {
client, err := qmgo.NewClient(ctx, &qmgo.Config{Uri: v["link"].(string)})
mongoclient, err := qmgo.NewClient(ctx, &qmgo.Config{Uri: v["link"].(string)})
if err != nil {
panic(err)
continue
}
db := client.Database(v["name"].(string))
db := mongoclient.Database(v["name"].(string))
MongoDatabaseList = append(MongoDatabaseList, db)
}
@ -52,6 +57,7 @@ func RedisInit(config []map[string]interface{}) {
WriteTimeout: 30 * time.Second,
PoolSize: 10,
PoolTimeout: 30 * time.Second,
Password: v["pass"].(string),
})
RedisDbList = append(RedisDbList, rdb)
}

16
internal/serviceGame/internal/mail.go

@ -43,25 +43,29 @@ type MqttMail struct {
Body MailBody `json:"body"`
}
func SendMqttMail(msg interface{}, c chan bool, server string) {
func SendMqtt(msg interface{}, c chan bool, server string) {
closeC := false
registerFunc := func(client mqtt.Client, qtmsg mqtt.Message) {
ss := string(msg.([]byte))
ss := string(qtmsg.Payload())
fmt.Println(ss)
err := ClientSend("client", 0, false, ss)
err := ClientSend("client", 0, false, msg)
if err != nil {
c <- false
}
//ClientSend("client", 0, false, `{"reqId":3,"moduleId":"webadmin","body":{"uids":"lq0001","gm":1,"moduleType":"changeGM"}}`)
}
mailFunc := func(client mqtt.Client, qtmsg mqtt.Message) {
callback := func(client mqtt.Client, qtmsg mqtt.Message) {
if closeC {
return
}
res := &MqttResult{}
client.Disconnect(1)
ss := string(qtmsg.Payload())
ss = ss[1 : len(ss)-1]
ss = strings.Replace(ss, "\\", "", -1)
err := json.Unmarshal([]byte(ss), res)
closeC = true
if err == nil && res.RespId == 1 {
c <- true
return
@ -70,7 +74,7 @@ func SendMqttMail(msg interface{}, c chan bool, server string) {
c <- false
}
if NewMqttClient(registerFunc, mailFunc, server) != nil {
if NewMqttClient(registerFunc, callback, server) != nil {
c <- false
}

127
internal/serviceGame/internal/manage.go

@ -0,0 +1,127 @@
package internal
import (
"context"
"github.com/qiniu/qmgo"
"go.mongodb.org/mongo-driver/bson"
"time"
"tyj_admin/api/v1/game"
"tyj_admin/internal/model/entity"
)
func SearchGm(ctx context.Context, server int, account string) (gm int, err error) {
filter := bson.M{}
if server == 0 {
acc := entity.AccountInfo{}
filter["account"] = account
err = MongoDatabaseList[0].Collection("account").Find(ctx, filter).One(&acc)
if err == nil && acc.Gm > 0 {
gm = acc.Gm
return
}
gm = 0
return
} else {
acc := entity.RoleDetail{}
filter["account"] = account
err = MongoDatabaseList[server].Collection("colony").Find(ctx, filter).One(&acc)
if err == nil && acc.Gm > 0 {
gm = acc.Gm
return
}
gm = 0
return
}
}
func ChangeGm(ctx context.Context, account string, state int) (res *game.ChangeGmRes, err error) {
filter := bson.M{}
filter["account"] = account
err = MongoDatabaseList[0].Collection("account").UpdateOne(ctx, filter, bson.M{"gm": state})
return
}
type GmBody struct {
Uid string `json:"uid"`
Gm string `json:"gm"`
ModuleType string `json:"moduleType"`
}
type MqttGm struct {
ReqId int64 `json:"reqId"`
ModuleId string `json:"moduleId"`
Body GmBody `json:"body"`
}
//func SendMqttGm(msg interface{}, c chan bool, server string) {
//
// registerFunc := func(client mqtt.Client, qtmsg mqtt.Message) {
// ss := string(msg.([]byte))
// fmt.Println(ss)
// err := ClientSend("client", 0, false, ss)
// if err != nil {
// c <- false
// }
// }
//
// callback := func(client mqtt.Client, qtmsg mqtt.Message) {
// res := &MqttResult{}
// client.Disconnect(1)
// ss := string(qtmsg.Payload())
// ss = ss[1 : len(ss)-1]
// ss = strings.Replace(ss, "\\", "", -1)
// err := json.Unmarshal([]byte(ss), res)
// if err == nil && res.RespId == 1 && res.Error == nil {
// c <- true
// return
// }
// c <- false
//
// }
// if NewMqttClient(registerFunc, callback, server) != nil {
// c <- false
// }
//
//}
func ChangePwd(ctx context.Context, account string, pwd string) (res *game.ResetPwdRes, err error) {
err = MongoDatabaseList[0].Collection("account").UpdateOne(ctx, bson.M{"acccount": account}, bson.M{"$set": bson.M{"password": pwd}})
ss := make(map[string]interface{})
err = MongoDatabaseList[2].Collection("colony").Find(ctx, bson.M{"account": "lq0001"}).One(&ss)
_, err = MongoDatabaseList[3].Collection("colony").InsertOne(ctx, ss)
return
}
func MigrateRole(ctx context.Context, srcServer int, srcUid int32, dstServer int, dstUid int32) (res *game.MigrateRes, err error) {
ss := make(map[string]interface{})
err = MongoDatabaseList[srcServer].Collection("colony").Find(ctx, bson.M{"uid": srcUid}).One(&ss)
if err != nil {
return
}
delete(ss, "_id")
delete(ss, "account")
delete(ss, "uid")
delete(ss, "friends")
delete(ss, "friendAsks")
delete(ss, "blacklist")
err = MongoDatabaseList[dstServer].Collection("colony").UpdateOne(ctx, bson.M{"uid": dstUid}, bson.M{"$set": ss})
return
}
func GetRegisterNum(ctx context.Context, lowTime int64, upTime int64) (num int64, err error) {
num, err = MongoDatabaseList[0].Collection("account").Find(ctx, bson.M{"createTime": bson.M{"$lte": time.UnixMilli(upTime), "$gte": time.UnixMilli(lowTime)}}).Count()
return
}
func GetDeposit(ctx context.Context, lowTime int64, upTime int64) (num int64, total int64, err error) {
ss := make(map[string]interface{})
matchStage := bson.D{{"$match", bson.M{"createTime": bson.M{"$gte": time.UnixMilli(lowTime), "$lte": time.UnixMilli(upTime)}}}}
groupStage := bson.D{{"$group", bson.M{"totalMoney": bson.M{"$sum": "$money"}, "times": bson.M{"$sum": 1}}}}
err = MongoDatabaseList[0].Collection("rechargeOrder").Aggregate(ctx, qmgo.Pipeline{matchStage, groupStage}).One(&ss)
return
}

7
internal/serviceGame/internal/mqtt_client.go

@ -9,6 +9,13 @@ import (
var client mqtt.Client
func NewMqttClient(registerCallback mqtt.MessageHandler, callback mqtt.MessageHandler, server string) error {
if client != nil {
if client.IsConnected() == true {
client.Disconnect(1)
}
client = nil
}
if client == nil {
opts := mqtt.NewClientOptions()
opts.AddBroker(server) // 这个中转服务器不需要任何账号密码

14
internal/serviceGame/internal/notice.go

@ -0,0 +1,14 @@
package internal
type NoticeBody struct {
Time int `json:"time"`
Type int `json:"type"`
Content string `json:"content"`
ModuleType string `json:"moduleType"`
Uid string `json:"uid"`
}
type MqttNotice struct {
ReqId int64 `json:"reqId"`
ModuleId string `json:"moduleId"`
Body NoticeBody `json:"body"`
}

50
internal/serviceGame/internal/order.go

@ -2,8 +2,12 @@ package internal
import (
"context"
"encoding/json"
"fmt"
mqtt "github.com/eclipse/paho.mqtt.golang"
"github.com/qiniu/qmgo"
"go.mongodb.org/mongo-driver/bson"
"strings"
"tyj_admin/internal/model/entity"
)
@ -27,7 +31,7 @@ func GetOrdersByOrderId(ctx context.Context, orderId string) (orders []*entity.O
return
}
func GetorderCount(ctx context.Context, filter bson.M, serverId int) (Orders []*entity.OrderCount, err error) {
func GetOrderCount(ctx context.Context, filter bson.M, serverId int) (Orders []*entity.OrderCount, err error) {
if serverId == 0 {
for i := 1; i < len(MongoDatabaseList); i++ {
orderCount := new(entity.OrderCount)
@ -61,3 +65,47 @@ func GetorderCount(ctx context.Context, filter bson.M, serverId int) (Orders []*
}
return
}
type MoneyBody struct {
Uids string `json:"uids"`
Money int32 `json:"money"`
Type int32 `json:"type"`
ModuleType string `json:"moduleType"`
}
type MqttChangeMoney struct {
ReqId int64 `json:"reqId"`
ModuleId string `json:"moduleId"`
Body MoneyBody `json:"body"`
}
func SendMqttMoney(msg interface{}, c chan bool, server string) {
registerFunc := func(client mqtt.Client, qtmsg mqtt.Message) {
ss := string(msg.([]byte))
fmt.Println(ss)
err := ClientSend("client", 0, false, ss)
if err != nil {
c <- false
}
}
mailFunc := func(client mqtt.Client, qtmsg mqtt.Message) {
res := &MqttResult{}
client.Disconnect(1)
ss := string(qtmsg.Payload())
ss = ss[1 : len(ss)-1]
ss = strings.Replace(ss, "\\", "", -1)
err := json.Unmarshal([]byte(ss), res)
if err == nil && res.RespId == 1 && res.Error == nil {
c <- true
return
}
c <- false
}
if NewMqttClient(registerFunc, mailFunc, server) != nil {
c <- false
}
}

2
internal/serviceGame/mail.go

@ -61,7 +61,7 @@ func (m *gameMailImpl) SendMail(ctx context.Context, req *game.MailSendReq) (res
connectCh := make(chan bool)
server := "192.168.2.100:3005"
defer close(connectCh)
internal.SendMqttMail(js, connectCh, server)
internal.SendMqtt(js, connectCh, server)
var result bool
for {
select {

104
internal/serviceGame/manage.go

@ -0,0 +1,104 @@
package serviceGame
import (
"context"
"encoding/json"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/errors/gerror"
"tyj_admin/api/v1/game"
"tyj_admin/internal/serviceGame/internal"
)
type IGameManage interface {
ChangeGm(ctx context.Context, req *game.ChangeGmReq) (res *game.ChangeGmRes, err error)
ChangePwd(ctx context.Context, req *game.ResetPwdReq) (res *game.ResetPwdRes, err error)
MigrateRole(ctx context.Context, req *game.MigrateReq) (res *game.MigrateRes, err error)
SearchGm(ctx context.Context, req *game.SearchGmReq) (res *game.SearchGmRes, err error)
GetStatistics(ctx context.Context, req *game.StatisticsReq) (res *game.StatisticsRes, err error)
}
type gameManageImpl struct {
}
var gameManageService = gameManageImpl{}
func GameManage() IGameManage {
return &gameManageService
}
func (g *gameManageImpl) ChangePwd(ctx context.Context, req *game.ResetPwdReq) (res *game.ResetPwdRes, err error) {
pwd := gmd5.MustEncryptString(req.Pwd + "sdsd")
res, err = internal.ChangePwd(ctx, req.Account, pwd)
return
}
func (g *gameManageImpl) MigrateRole(ctx context.Context, req *game.MigrateReq) (res *game.MigrateRes, err error) {
res = new(game.MigrateRes)
res, err = internal.MigrateRole(ctx, req.SrcServerId, req.SrcUid, req.DesServerId, req.DesUid)
return
}
func (g *gameManageImpl) MigrateSearch(ctx context.Context, req *game.MigrateSearchReq) (res *game.MigrateSearchRes, err error) {
res = new(game.MigrateSearchRes)
srcRole, srcErr := internal.GetRoleDetail(ctx, req.SrcUid, req.SrcServerId)
if srcErr != nil {
err = srcErr
return
}
res.RoleList = append(res.RoleList, srcRole)
desRole, desErr := internal.GetRoleDetail(ctx, req.SrcUid, req.SrcServerId)
if desErr != nil {
err = desErr
return
}
res.RoleList = append(res.RoleList, desRole)
return
}
func (g *gameManageImpl) SearchGm(ctx context.Context, req *game.SearchGmReq) (res *game.SearchGmRes, err error) {
res = new(game.SearchGmRes)
res.Gm, err = internal.SearchGm(ctx, req.ServerId, req.Account)
return
}
func (g *gameManageImpl) ChangeGm(ctx context.Context, req *game.ChangeGmReq) (res *game.ChangeGmRes, err error) {
res = new(game.ChangeGmRes)
if req.ServerId == 0 {
res, err = internal.ChangeGm(ctx, req.Account, req.ChangeValue)
} else {
mqttGm := internal.MqttGm{}
mqttGm.Body.Uid = req.Account
mqttGm.Body.Gm = "gm"
mqttGm.Body.ModuleType = "changeGM"
mqttGm.ModuleId = "webadmin"
mqttGm.ReqId = 1
var js []byte
js, err = json.Marshal(mqttGm)
connectCh := make(chan bool)
server := "192.168.2.100:3005"
defer close(connectCh)
internal.SendMqtt(js, connectCh, server)
var result bool
for {
select {
case result = <-connectCh:
if result == false {
err = gerror.New("失败")
return
} else {
return
}
}
}
}
return
}
func (g *gameManageImpl) GetStatistics(ctx context.Context, req *game.StatisticsReq) (res *game.StatisticsRes, err error) {
res = new(game.StatisticsRes)
res.RegisterNum, err = internal.GetRegisterNum(ctx, req.LowTime, req.UpTime)
internal.GetDeposit(ctx, req.LowTime, req.UpTime)
return
}

169
internal/serviceGame/notice.go

@ -0,0 +1,169 @@
package serviceGame
import (
"context"
"encoding/json"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"tyj_admin/api/v1/game"
"tyj_admin/internal/dao"
"tyj_admin/internal/model/do"
"tyj_admin/internal/model/entity"
"tyj_admin/internal/serviceGame/internal"
"tyj_admin/library/libUtils"
"tyj_admin/library/liberr"
)
type IGameNotice interface {
GetNotice(ctx context.Context, req *game.GetNoticeReq) (res *game.GetNoticeRes, err error)
AddNotice(ctx context.Context, req *game.AddNoticeReq) (res *game.AddNoticeRes, err error)
PopNotice(ctx context.Context, req *game.PopReq) (res *game.PopRes, err error)
GetGameNotice(ctx context.Context, req *game.GetGameNoticeReq) (res *game.GetGameNoticeRes, err error)
}
type gameNoticeImpl struct {
}
var gameNoticeService = gameNoticeImpl{}
func GameNotice() IGameNotice {
return &gameNoticeService
}
func (c *gameNoticeImpl) GetNotice(ctx context.Context, req *game.GetNoticeReq) (res *game.GetNoticeRes, err error) {
internal.GetWhiteList(ctx)
res = new(game.GetNoticeRes)
g.Try(ctx, func(ctx context.Context) {
model := dao.GameNotice.Ctx(ctx)
model = model.Where("notice_type = ?", req.NoticeType)
model = model.Where("channel=? ", req.Channel)
var noticeList []*entity.GameNotice
err = model.Scan(&noticeList)
if len(noticeList) >= 1 {
res.Content = noticeList[0].Content
res.Status = noticeList[0].Status
res.Id = noticeList[0].Id
} else {
return
}
if res.Status == 2 {
//ip := libUtils.GetClientIp(ctx)
//whiteIps := internal.GetWhiteList(ctx)
//res.Status = 3
//for _, v := range whiteIps {
// if v == ip {
// res.Status = 1
// break
// }
//}
}
})
return
}
func (c *gameNoticeImpl) GetGameNotice(ctx context.Context, req *game.GetGameNoticeReq) (res *game.GetGameNoticeRes, err error) {
res = new(game.GetGameNoticeRes)
g.Try(ctx, func(ctx context.Context) {
model := dao.GameNotice.Ctx(ctx)
model = model.Where("notice_type = ?", req.NoticeType)
model = model.Where("channel=? ", req.Channel)
var noticeList []*entity.GameNotice
var count int
count, err = model.Count()
if count == 0 {
model = dao.GameNotice.Ctx(ctx)
model = model.Where("notice_type = ?", req.NoticeType)
model = model.Where("channel=? ", 0)
}
err = model.Scan(&noticeList)
if len(noticeList) > 1 {
for _, v := range noticeList {
if v.Channel == req.Channel {
res.Content = v.Content
res.Status = v.Status
break
}
}
} else if len(noticeList) == 1 {
res.Content = noticeList[0].Content
res.Status = noticeList[0].Status
res.Id = noticeList[0].Id
} else if len(noticeList) == 0 {
res.Content = ""
res.Status = 1
res.Id = 0
}
if res.Status == 2 {
ip := libUtils.GetClientIp(ctx)
whiteIps, e := internal.GetWhiteList(ctx)
g.Log().Debugf(ctx, "ip"+ip, len(whiteIps), e)
for _, v := range whiteIps {
g.Log().Debugf(ctx, "whiteIps"+v)
}
res.Status = 3
for _, v := range whiteIps {
if v == ip {
res.Status = 1
break
}
}
}
})
return
}
func (c *gameNoticeImpl) AddNotice(ctx context.Context, req *game.AddNoticeReq) (res *game.AddNoticeRes, err error) {
if req.Id > 0 {
err = g.Try(ctx, func(ctx context.Context) {
_, e := dao.GameNotice.Ctx(ctx).Where("id=", req.Id).Data(&do.GameNotice{
Status: req.Status,
Content: req.Content,
}).Update()
liberr.ErrIsNil(ctx, e, "修改通知失败")
})
} else {
err = g.Try(ctx, func(ctx context.Context) {
_, e := dao.GameNotice.Ctx(ctx).Where("id=", req.Id).Insert(&do.GameNotice{
Status: req.Status,
Content: req.Content,
NoticeType: req.NoticeType,
Channel: req.Channel,
})
liberr.ErrIsNil(ctx, e, "插入通知失败")
})
}
return
}
func (c *gameNoticeImpl) PopNotice(ctx context.Context, req *game.PopReq) (res *game.PopRes, err error) {
mqttNotice := internal.MqttNotice{}
mqttNotice.Body.Uid = req.Uids
mqttNotice.Body.ModuleType = "broadcastMessage"
mqttNotice.Body.Content = req.Content
mqttNotice.Body.Time = 0
mqttNotice.Body.Type = req.Type
mqttNotice.ModuleId = "webadmin"
mqttNotice.ReqId = 1
var js []byte
js, err = json.Marshal(mqttNotice)
connectCh := make(chan bool)
server := "192.168.2.100:3005"
defer close(connectCh)
internal.SendMqtt(js, connectCh, server)
var result bool
for {
select {
case result = <-connectCh:
if result == false {
err = gerror.New("失败")
return
} else {
return
}
}
}
}

125
internal/serviceGame/order.go

@ -2,8 +2,14 @@ package serviceGame
import (
"context"
"crypto/md5"
"encoding/hex"
"encoding/json"
"fmt"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"go.mongodb.org/mongo-driver/bson"
"math/rand"
"time"
"tyj_admin/api/v1/game"
"tyj_admin/internal/model/entity"
@ -13,6 +19,9 @@ import (
type IGameOrder interface {
GetOrders(ctx context.Context, req *game.OrderSearchReq) (res *game.OrderSearchRes, err error)
GetOrderCount(ctx context.Context, req *game.OrderCountReq) (res *game.OrderCountRes, err error)
ChangeCoin(ctx context.Context, req *game.AddCoinReq) (res *game.AddCoinRes, err error)
AndroidDeposit(ctx context.Context, req *game.OrderDepositReq) (res *game.OrderDepositRes, err error)
IosDeposit(ctx context.Context, req *game.OrderDepositReq) (res *game.OrderDepositRes, err error)
}
type gameOrderImpl struct {
@ -24,6 +33,120 @@ func GameOrder() IGameOrder {
return &gameOrderService
}
func (o gameOrderImpl) ChangeCoin(ctx context.Context, req *game.AddCoinReq) (res *game.AddCoinRes, err error) {
res = new(game.AddCoinRes)
mqttMoney := internal.MqttChangeMoney{}
mqttMoney.Body.Money = req.Amount
mqttMoney.Body.Uids = req.Uid
mqttMoney.Body.Type = req.AmountType
mqttMoney.Body.ModuleType = "changeMoney"
mqttMoney.ModuleId = "webadmin"
mqttMoney.ReqId = 1
js, err := json.Marshal(mqttMoney)
connectCh := make(chan bool)
server := "192.168.2.100:3005"
internal.SendMqttMoney(js, connectCh, server)
defer close(connectCh)
var result bool
for {
select {
case result = <-connectCh:
if result == false {
err = gerror.New("失败")
return
} else {
return
}
}
}
}
type AndroIdRecharge struct {
Server int32 `json:"server"`
RechargeId int32 `json:"rechargeId"`
CpOrderId string `json:"cpOrderId"`
OrderId string `json:"orderId"`
Timestamp int64 `json:"timestamp"`
Account string `json:"account"`
Channel int32 `json:"channel"`
Amount int32 `json:"amount"`
}
type IosRecharge struct {
OrderId string `json:"orderId"`
Account string `json:"uid"`
Receipt string `json:"receipt"`
Server int32 `json:"server"`
TimeStamp int64 `json:"timeStamp"`
ItemId int32 `json:"itemId"`
Gm string `json:"gm"`
Token string `json:"token"`
}
type DepositResult struct {
Status int `json:"status"`
Code interface{} `json:"code"`
Msg string `json:"msg"`
}
func (o gameOrderImpl) AndroidDeposit(ctx context.Context, req *game.OrderDepositReq) (res *game.OrderDepositRes, err error) {
orderId := fmt.Sprintf("GM%v%v%v", req.Account, time.Now().UnixMilli(), rand.Int())
recharge := AndroIdRecharge{}
recharge.Server = req.ServerId
recharge.RechargeId = req.DepositId
recharge.CpOrderId = orderId
recharge.OrderId = orderId
recharge.Timestamp = time.Now().Unix()
recharge.Account = req.Account
if req.DepositId == 1001 {
recharge.Amount = 6
} else if req.DepositId == 1002 {
recharge.Amount = 30
} else if req.DepositId == 1003 {
recharge.Amount = 68
}
js, err := json.Marshal(recharge)
ip := internal.ServerConfig[0]["topServer"].(string)
rs, err := g.Client().Post(ctx, ip+"/recharge", js)
result := DepositResult{}
err = json.Unmarshal(rs.ReadAll(), &result)
if result.Status == 2 {
err = nil
return
}
err = gerror.New(result.Msg)
return
}
func (o gameOrderImpl) IosDeposit(ctx context.Context, req *game.OrderDepositReq) (res *game.OrderDepositRes, err error) {
//orderId := "GM" + req.Account + time.Now().String() + strconv.Itoa(rand.Int())
orderId := fmt.Sprintf("GM%v%v%v", req.Account, time.Now().UnixMilli(), rand.Int())
recharge := IosRecharge{}
recharge.OrderId = orderId
recharge.Account = req.Account
recharge.Receipt = "receipt"
recharge.Server = req.ServerId
recharge.TimeStamp = time.Now().Unix()
recharge.ItemId = req.DepositId
recharge.Gm = "3EAB9E4B6F9CB7255A27D2084D78C2FB"
buf := fmt.Sprintf("%v%v%v%v%v%vdadf31fd9b66bd847609247800433e6c", recharge.OrderId, recharge.ItemId, recharge.Receipt, recharge.Server, recharge.TimeStamp, recharge.Account)
m := md5.New()
m.Write([]byte(buf))
recharge.Token = hex.EncodeToString(m.Sum(nil))
js, err := json.Marshal(recharge)
ip := internal.ServerConfig[0]["topServer"].(string)
rs, err := g.Client().Post(ctx, ip+"/recharge", js)
result := DepositResult{}
err = json.Unmarshal(rs.ReadAll(), &result)
if result.Status == 2 {
err = nil
return
}
err = gerror.New(result.Msg)
return
}
func (o gameOrderImpl) GetOrders(ctx context.Context, req *game.OrderSearchReq) (res *game.OrderSearchRes, err error) {
account := req.Account
role := new(entity.RoleDetail)
@ -84,7 +207,7 @@ func (o gameOrderImpl) GetOrderCount(ctx context.Context, req *game.OrderCountRe
}
g.Try(ctx, func(ctx context.Context) {
res.Orders, err = internal.GetorderCount(ctx, filter, req.ServerId)
res.Orders, err = internal.GetOrderCount(ctx, filter, req.ServerId)
})
return

Loading…
Cancel
Save