Commit c8ff53370753836f5b77351f5c7f8ed1040fde54

Authored by 王家文
1 parent 4c5f3412
Exists in master and in 1 other branch dev-wjw

refactor♻️:redis对象和mysql对象持久化和读取

1 1
2 ## 项目目录结构 2 ## 项目目录结构
3 3
4 -| 项目目录 | 目录说明 |  
5 -|-------------|----------|  
6 -| conf | beego配置 |  
7 -| controllers | 控制器 |  
8 -| dto | 数据库存储对象 |  
9 -| models | 与客户端传输对象 |  
10 -| routers | 路由 |  
11 -| sdk | SDK |  
12 -| service | 游戏服务器逻辑 |  
13 -| sign | 签名 |  
14 -| util | 公共库 |  
15 -| util-lx | 公共库(李旭) | 4 +| 项目目录 | 目录说明 |
  5 +|----------------|----------|
  6 +| conf | beego配置 |
  7 +| configs | 游戏配置处理 |
  8 +| controllers | 控制器 |
  9 +| middleware | 中间件 |
  10 +| models | 与客户端传输对象 |
  11 +| routers | 路由 |
  12 +| service-common | 服务器公共模块 |
  13 +| service | 游戏服务器逻辑 |
  14 +| util | 公共库 |
  15 +| util-lx | 公共库(李旭) |
16 16
17 ## 游戏和游戏功能列表 17 ## 游戏和游戏功能列表
18 18
19 -| 功能模块名 | 所属功能 | 负责人 |  
20 -|---------------|------|-----| 19 +| 功能模块名 | 所属功能 | 负责人 |
  20 +|------------|------|-----|
21 | cardholder | 卡包卡牌 | 王家文 | 21 | cardholder | 卡包卡牌 | 王家文 |
common/svconst/consts.go
@@ -1 +0,0 @@ @@ -1 +0,0 @@
1 -package svconst  
common/svconst/vars.go
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 -package svconst  
2 -  
3 -import "gorm.io/gorm"  
4 -  
5 -var (  
6 - AppName = ""  
7 -  
8 - DbApi *gorm.DB  
9 - DbCommon *gorm.DB  
10 - DbConfig *gorm.DB  
11 -  
12 - GameListCardHolder = []string{"10149"}  
13 -)  
common/svdto/dto.go
@@ -1,68 +0,0 @@ @@ -1,68 +0,0 @@
1 -package svdto  
2 -  
3 -import (  
4 - "apigame/util/utdto"  
5 - "apigame/util/util-lx/lxalilog"  
6 -)  
7 -  
8 -func InitTable(tb IDtoData, gameId string) {  
9 - rule := tb.GetRule(gameId)  
10 - utdto.InitTable(rule.DbMysql, tb, rule.TableName)  
11 -}  
12 -  
13 -func Insert(data IDtoData, gameId string) (err error) {  
14 - rule := data.GetRule(gameId)  
15 - result := utdto.Insert(rule.DbMysql, data, rule.TableName)  
16 - err = result.Error  
17 - if err != nil {  
18 - lxalilog.Errors(err, gameId)  
19 - return  
20 - }  
21 - return  
22 -}  
23 -  
24 -func Update(data IDtoData, gameId string) (err error) {  
25 - rule := data.GetRule(gameId)  
26 - result := utdto.Update(rule.DbMysql, data, rule.TableName)  
27 - err = result.Error  
28 - if err != nil {  
29 - lxalilog.Errors(err, gameId)  
30 - return  
31 - }  
32 - return  
33 -}  
34 -  
35 -func Save(data IDtoData, gameId string) (err error) {  
36 - rule := data.GetRule(gameId)  
37 - result := utdto.Save(rule.DbMysql, data, rule.TableName)  
38 - err = result.Error  
39 - if err != nil {  
40 - lxalilog.Errors(err, gameId)  
41 - return  
42 - }  
43 - return  
44 -}  
45 -  
46 -func First(data IDtoData, gameId string) (has bool, err error) {  
47 - rule := data.GetRule(gameId)  
48 - result := utdto.First(rule.DbMysql, data, rule.TableName)  
49 - has = result.RowsAffected != 0  
50 - err = result.Error  
51 - if err != nil {  
52 - lxalilog.Errors(err, gameId)  
53 - return  
54 - }  
55 - return  
56 -}  
57 -  
58 -func Find(data any, dataTemp IDtoData, gameId string) (has bool, err error) {  
59 - rule := dataTemp.GetRule(gameId)  
60 - result := utdto.Find(rule.DbMysql, data, rule.TableName)  
61 - has = result.RowsAffected != 0  
62 - err = result.Error  
63 - if err != nil {  
64 - lxalilog.Errors(err, rule.TableName)  
65 - return  
66 - }  
67 - return  
68 -}  
common/svdto/init.go
@@ -1,2 +0,0 @@ @@ -1,2 +0,0 @@
1 -package svdto  
2 -  
common/svdto/interface.go
@@ -1,23 +0,0 @@ @@ -1,23 +0,0 @@
1 -package svdto  
2 -  
3 -import "gorm.io/gorm"  
4 -  
5 -const (  
6 - REDIS_CACHEP_REFIX = "apigame" // 缓存前缀  
7 -)  
8 -  
9 -// DtoRule dto参数  
10 -type DtoRule struct {  
11 - DbMysql *gorm.DB  
12 - TableName string  
13 - CacheKey string  
14 - CacheTime int  
15 -}  
16 -  
17 -// IDtoData dto数据  
18 -type IDtoData interface {  
19 - // TableName 表名模板  
20 - TableName() string  
21 - // GetRule 表名模板  
22 - GetRule(gameId string) *DtoRule  
23 -}  
common/svdto/record.go
@@ -1,10 +0,0 @@ @@ -1,10 +0,0 @@
1 -package svdto  
2 -  
3 -import (  
4 - "apigame/util/utdto"  
5 -)  
6 -  
7 -func SaveRecord(gameId string, data IDtoData) {  
8 - rule := data.GetRule(gameId)  
9 - utdto.Insert(rule.DbMysql, data, rule.TableName)  
10 -}  
common/svlog/ali-log.go
@@ -1,40 +0,0 @@ @@ -1,40 +0,0 @@
1 -package svlog  
2 -  
3 -import (  
4 - "apigame/util/util-lx/lxalilog"  
5 - "fmt"  
6 - "github.com/astaxie/beego"  
7 - lalilog "github.com/lixu-any/go-tools/ali/log"  
8 -)  
9 -  
10 -func InitAliLog(appName string) {  
11 -  
12 - //初始化阿里云日志  
13 - logm, _ := beego.AppConfig.GetSection("alilog")  
14 - lxalilog.InitAliLog(lxalilog.MapAlilogConfig{  
15 - Endpoint: logm["endpoint"],  
16 - AccessKeyId: logm["accesskeyid"],  
17 - AccessKeySecret: logm["accesskeysecret"],  
18 - Project: logm["project"],  
19 - AppNaame: appName,  
20 - On: logm["on"],  
21 - Debug: logm["debug"],  
22 - TableError: "api_code_merge",  
23 - TableDebug: logm["tabledebug"],  
24 - Env: beego.AppConfig.String("env"),  
25 - })  
26 -  
27 - lalilog.InitAliLog(lalilog.MapAlilogConfig{  
28 - Endpoint: logm["endpoint"],  
29 - AccessKeyId: logm["accesskeyid"],  
30 - AccessKeySecret: logm["accesskeysecret"],  
31 - Project: logm["project"],  
32 - On: logm["on"],  
33 - Debug: logm["debug"],  
34 - TableError: logm["tableerror"],  
35 - TableDebug: logm["tabledebug"],  
36 - Env: beego.AppConfig.String("env"),  
37 - })  
38 -  
39 - fmt.Println(appName + " alilog init success")  
40 -}  
common/svlog/log.go
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -package svlog  
2 -  
3 -import (  
4 - "apigame/common/svconst"  
5 - "apigame/util/util-lx/lxbeego"  
6 - "fmt"  
7 - "github.com/astaxie/beego"  
8 -)  
9 -  
10 -func Init() {  
11 -  
12 - // 初始化日志文件  
13 - conf, _ := beego.AppConfig.GetSection("log")  
14 - conf["filename"] = conf["path"] + "api.log"  
15 -  
16 - if err := lxbeego.Inits(conf); err != nil {  
17 - fmt.Println("svlog.Inits Error::" + err.Error())  
18 - }  
19 -  
20 - fmt.Println(svconst.AppName + " svlog init success")  
21 -  
22 -}  
common/svmysql/index.go
@@ -1,119 +0,0 @@ @@ -1,119 +0,0 @@
1 -package svmysql  
2 -  
3 -import (  
4 - "apigame/common/svconst"  
5 - "apigame/service/constd"  
6 - "apigame/util/utdto"  
7 - "apigame/util/util-lx/lxalilog"  
8 - "fmt"  
9 - "github.com/astaxie/beego"  
10 - "gorm.io/gorm"  
11 - "strings"  
12 -)  
13 -  
14 -func Init() bool {  
15 -  
16 - // ConnectMySQL  
17 - if db, err := utdto.ConnectMySQL(beego.AppConfig.String("mysql::" + constd.MYSQL_DBAPI)); err == nil {  
18 - svconst.DbApi = db  
19 - } else {  
20 - fmt.Println("svmysql.Init DbApi Error::" + err.Error())  
21 - return false  
22 - }  
23 - if db, err := utdto.ConnectMySQL(beego.AppConfig.String("mysql::mergecommon")); err == nil {  
24 - svconst.DbCommon = db  
25 - } else {  
26 - fmt.Println("svmysql.Init DbCommon Error::" + err.Error())  
27 - return false  
28 - }  
29 - if db, err := utdto.ConnectMySQL(beego.AppConfig.String("mysql::" + constd.MYSQL_MERGECONFIG)); err == nil {  
30 - svconst.DbConfig = db  
31 - } else {  
32 - fmt.Println("svmysql.Init DbConfig Error::" + err.Error())  
33 - return false  
34 - }  
35 - return true  
36 -  
37 -}  
38 -  
39 -func InitTable(obj IMysqlData, gameId string) {  
40 - info := obj.MysqlInfo(gameId)  
41 - utdto.InitTable(info.DbMysql, obj, info.TableName)  
42 -}  
43 -  
44 -func Insert(obj IMysqlData, gameId string) (err error) {  
45 - info := obj.MysqlInfo(gameId)  
46 - db := info.DbMysql  
47 - stmt := db.Session(&gorm.Session{DryRun: true}).Create(obj).Statement  
48 - stmtSQL := stmt.SQL.String()  
49 - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1)  
50 - result := db.Exec(sql, stmt.Vars...)  
51 - err = result.Error  
52 - if err != nil {  
53 - lxalilog.Errors(err, gameId)  
54 - return  
55 - }  
56 - return  
57 -}  
58 -  
59 -func Updates(obj IMysqlData, gameId string) (err error) {  
60 - info := obj.MysqlInfo(gameId)  
61 - db := info.DbMysql  
62 - stmt := db.Session(&gorm.Session{DryRun: true}).Updates(obj).Statement  
63 - stmtSQL := stmt.SQL.String()  
64 - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1)  
65 - result := db.Exec(sql, stmt.Vars...)  
66 - err = result.Error  
67 - if err != nil {  
68 - lxalilog.Errors(err, gameId)  
69 - return  
70 - }  
71 - return  
72 -}  
73 -  
74 -func Save(obj IMysqlData, gameId string) (err error) {  
75 - info := obj.MysqlInfo(gameId)  
76 - db := info.DbMysql  
77 - stmt := db.Session(&gorm.Session{DryRun: true}).Save(obj).Statement  
78 - stmtSQL := stmt.SQL.String()  
79 - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1)  
80 - result := db.Exec(sql, stmt.Vars...)  
81 - err = result.Error  
82 - if err != nil {  
83 - lxalilog.Errors(err, gameId)  
84 - return  
85 - }  
86 - return  
87 -}  
88 -  
89 -func First(obj IMysqlData, gameId string) (has bool, err error) {  
90 - info := obj.MysqlInfo(gameId)  
91 - db := info.DbMysql  
92 - stmt := db.Session(&gorm.Session{DryRun: true}).First(obj).Statement  
93 - stmtSQL := stmt.SQL.String()  
94 - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1)  
95 - result := db.Raw(sql, stmt.Vars...).Scan(obj)  
96 - has = result.RowsAffected != 0  
97 - err = result.Error  
98 - if err != nil {  
99 - lxalilog.Errors(err, gameId)  
100 - return  
101 - }  
102 - return  
103 -}  
104 -  
105 -func Find(obj IMysqlData, gameId string) (has bool, err error) {  
106 - info := obj.MysqlInfo(gameId)  
107 - db := info.DbMysql  
108 - stmt := db.Session(&gorm.Session{DryRun: true}).Find(obj).Statement  
109 - stmtSQL := stmt.SQL.String()  
110 - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1)  
111 - result := db.Raw(sql, stmt.Vars...).Scan(obj)  
112 - has = result.RowsAffected != 0  
113 - err = result.Error  
114 - if err != nil {  
115 - lxalilog.Errors(err, gameId)  
116 - return  
117 - }  
118 - return  
119 -}  
common/svmysql/interface.go
@@ -1,15 +0,0 @@ @@ -1,15 +0,0 @@
1 -package svmysql  
2 -  
3 -import "gorm.io/gorm"  
4 -  
5 -// MysqlInfo mysql存储信息  
6 -type MysqlInfo struct {  
7 - DbMysql *gorm.DB  
8 - TableName string  
9 -}  
10 -  
11 -// IMysqlData mysql存储对象  
12 -type IMysqlData interface {  
13 - // MysqlInfo mysql存储信息  
14 - MysqlInfo(gameId string) *MysqlInfo  
15 -}  
common/svredis/index.go
@@ -1,58 +0,0 @@ @@ -1,58 +0,0 @@
1 -package svredis  
2 -  
3 -import (  
4 - "apigame/common/svconst"  
5 - "apigame/util/utstring"  
6 - "apigame/util/zjson"  
7 - "apigame/util/zredis"  
8 - "fmt"  
9 - "github.com/astaxie/beego"  
10 - "github.com/mitchellh/mapstructure"  
11 -)  
12 -  
13 -type RedisConfig struct {  
14 - Host string `json:"host"`  
15 - Port string `json:"port"`  
16 - Pwd string `json:"pwd"`  
17 - Db string `json:"Db"`  
18 - Prefix string `json:"prefix"`  
19 -}  
20 -  
21 -func Init() bool {  
22 - //初始化Redis  
23 - confText, _ := beego.AppConfig.GetSection("redis")  
24 - var conf RedisConfig  
25 - err := mapstructure.Decode(confText, &conf)  
26 - if err != nil {  
27 - fmt.Println("svredis.Init mapstructure.Decode Error::" + err.Error())  
28 - }  
29 - zredis.Init(conf.Host+":"+conf.Port, conf.Pwd, utstring.StringToInt(conf.Db))  
30 - if !zredis.Check() {  
31 - return false  
32 - }  
33 -  
34 - fmt.Println(svconst.AppName + " redis init success")  
35 - return true  
36 -}  
37 -  
38 -func SaveData(gameId string, obj IRedisData) {  
39 - info := obj.RedisInfo(gameId)  
40 - _ = zredis.SetEx(zredis.GetConn(), info.CacheKey, zjson.Str(obj), info.CacheTime)  
41 -}  
42 -  
43 -func LoadData[T IRedisData](gameId string, obj T) (has bool) {  
44 - has = true  
45 - info := obj.RedisInfo(gameId)  
46 - text, err := zredis.Get(zredis.GetConn(), info.CacheKey)  
47 - if err != nil {  
48 - has = false  
49 - return  
50 - }  
51 - err = zjson.Obj(text, &obj)  
52 - if err != nil {  
53 - fmt.Println(err)  
54 - has = false  
55 - return  
56 - }  
57 - return  
58 -}  
common/svredis/interface.go
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 -package svredis  
2 -  
3 -// RedisInfo redis存储信息  
4 -type RedisInfo struct {  
5 - CacheKey string  
6 - CacheTime int  
7 -}  
8 -  
9 -// IRedisData redis存储对象  
10 -type IRedisData interface {  
11 - // RedisInfo redis存储信息  
12 - RedisInfo(gameId string) *RedisInfo  
13 -}  
common/thinkingdata/index.go
@@ -1,119 +0,0 @@ @@ -1,119 +0,0 @@
1 -package thinkingdata  
2 -  
3 -import (  
4 - "crypto/tls"  
5 - "encoding/json"  
6 - "errors"  
7 - "fmt"  
8 - "gitee.com/lxgow/lxconv"  
9 - "github.com/astaxie/beego"  
10 - "github.com/astaxie/beego/httplib"  
11 - lconv "github.com/lixu-any/go-tools/conv"  
12 - "time"  
13 -)  
14 -  
15 -// index  
16 -// 创建时间:2023/10/23 10:06  
17 -// 创建人:lixu  
18 -  
19 -// index 数数科技  
20 -// 创建时间:2023/7/18 16:03  
21 -// 创建人:lixu  
22 -  
23 -// GetNowDateTime 当前日期时间  
24 -func GetNowDateTime() string {  
25 - tim := time.Unix(time.Now().Unix(), 0).Format("2006-01-02 15:04:05")  
26 - return fmt.Sprintf("%s", tim)  
27 -}  
28 -  
29 -type MThinkDataConfig struct {  
30 - Url string `json:"url"`  
31 - Debug int `json:"debug"`  
32 -}  
33 -  
34 -type MRespData struct {  
35 - Msg string `json:"Msg"`  
36 - Code int `json:"code"`  
37 -}  
38 -  
39 -var THINKINGDATACONFIG MThinkDataConfig  
40 -  
41 -// InitThinkData 初始化数数  
42 -func InitThinkData() (err error) {  
43 - thinkingdata, _ := beego.AppConfig.GetSection("thinkingdata")  
44 - THINKINGDATACONFIG.Url = thinkingdata["url"]  
45 - THINKINGDATACONFIG.Debug = lxconv.ParseInt(thinkingdata["debug"])  
46 - return  
47 -}  
48 -  
49 -// AddOneData 数据上报  
50 -func AddOneData(appid, account_id, distinct_id string, event string, data map[string]interface{}, typ string) (resp MRespData, err error) {  
51 -  
52 - _data := map[string]interface{}{  
53 - "#type": typ,  
54 - //"#event_name": event,  
55 - "#time": GetNowDateTime(),  
56 - "#account_id": account_id,  
57 - "#distinct_id": distinct_id,  
58 - "properties": data,  
59 - }  
60 -  
61 - if typ == "track" && event != "" {  
62 - _data["#event_name"] = event  
63 - }  
64 -  
65 - postdata := map[string]interface{}{  
66 - "appid": appid,  
67 - "debug": THINKINGDATACONFIG.Debug,  
68 - "data": _data,  
69 - }  
70 -  
71 - req := httplib.Post(THINKINGDATACONFIG.Url + "/sync_json")  
72 -  
73 - req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})  
74 -  
75 - _, err = req.JSONBody(&postdata)  
76 - if err != nil {  
77 - err = errors.New("thinkingdata-AddOneData req.JSONBody() error::" + err.Error() + "::" + lconv.JsonEncode(postdata))  
78 - return  
79 - }  
80 -  
81 - var (  
82 - bytes []byte  
83 - )  
84 -  
85 - bytes, err = req.Bytes()  
86 - if err != nil {  
87 - err = errors.New("thinkingdata-AddOneData req.Bytes() error::" + err.Error() + "::" + lconv.JsonEncode(postdata) + "::" + string(bytes))  
88 - return  
89 - }  
90 -  
91 - _ = json.Unmarshal(bytes, &resp)  
92 -  
93 - if resp.Code != 0 {  
94 - err = errors.New("thinkingdata-AddOneData resp.Code error:: " + lconv.JsonEncode(postdata) + "::" + string(bytes))  
95 - return  
96 - }  
97 -  
98 - return  
99 -}  
100 -  
101 -// TrackOne 向事件表传入一个事件  
102 -func TrackOne(appid, account_id string, event string, data map[string]interface{}) (resp MRespData, err error) {  
103 - return AddOneData(appid, account_id, "", event, data, "track")  
104 -}  
105 -  
106 -// UserSet 对用户表进行操作,覆盖一个或多个用户属性,如果该属性已有值存在,覆盖先前值  
107 -func UserSet(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) {  
108 - return AddOneData(appid, account_id, "", "", data, "user_set")  
109 -}  
110 -  
111 -// UserSetOnce 对用户表进行操作,初始化一个或多个用户属性,如果该属性已有值存在,则忽略本次操作  
112 -func UserSetOnce(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) {  
113 - return AddOneData(appid, account_id, "", "", data, "user_setOnce")  
114 -}  
115 -  
116 -// UserAdd 对用户表进行操作,为一个或多个数值型用户属性做累加计算  
117 -func UserAdd(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) {  
118 - return AddOneData(appid, account_id, "", "", data, "user_add")  
119 -}  
configs/feat-api.go
1 package configs 1 package configs
2 2
3 import ( 3 import (
4 - "apigame/common/svconst"  
5 - "apigame/common/svdto"  
6 - "apigame/common/svmysql"  
7 - "apigame/common/svredis" 4 + "apigame/service-common/svconst"
  5 + "apigame/service-common/svmysql"
  6 + "apigame/service-common/svredis"
8 "fmt" 7 "fmt"
9 ) 8 )
10 9
@@ -20,7 +19,7 @@ type ApiGameConfig struct { @@ -20,7 +19,7 @@ type ApiGameConfig struct {
20 func (c *ApiGameConfig) RedisInfo(gameId string) *svredis.RedisInfo { 19 func (c *ApiGameConfig) RedisInfo(gameId string) *svredis.RedisInfo {
21 tableName := "s_game_config" 20 tableName := "s_game_config"
22 return &svredis.RedisInfo{ 21 return &svredis.RedisInfo{
23 - CacheKey: fmt.Sprintf("%s:%s:%s", svdto.REDIS_CACHEP_REFIX, tableName, gameId), 22 + CacheKey: fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, gameId),
24 CacheTime: 300, 23 CacheTime: 300,
25 } 24 }
26 } 25 }
configs/feat-cardholder.go
1 package configs 1 package configs
2 2
3 import ( 3 import (
4 - "apigame/common/svconst"  
5 - "apigame/common/svdto"  
6 - "apigame/common/svmysql"  
7 - "apigame/common/svredis"  
8 - "apigame/service/constd" 4 + "apigame/service-common/svconst"
  5 + "apigame/service-common/svmysql"
  6 + "apigame/service-common/svredis"
9 "fmt" 7 "fmt"
10 ) 8 )
11 9
@@ -33,9 +31,9 @@ type CardActivityConfig struct { @@ -33,9 +31,9 @@ type CardActivityConfig struct {
33 } 31 }
34 32
35 func (c *CardActivityConfig) RedisInfo(gameId string) *svredis.RedisInfo { 33 func (c *CardActivityConfig) RedisInfo(gameId string) *svredis.RedisInfo {
36 - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_CONFIG 34 + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG
37 return &svredis.RedisInfo{ 35 return &svredis.RedisInfo{
38 - CacheKey: fmt.Sprintf("%s:%s:%s", svdto.REDIS_CACHEP_REFIX, tableName, gameId), 36 + CacheKey: fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, gameId),
39 CacheTime: 300, 37 CacheTime: 300,
40 } 38 }
41 } 39 }
@@ -61,7 +59,7 @@ type CardActivityConfigRaw struct { @@ -61,7 +59,7 @@ type CardActivityConfigRaw struct {
61 } 59 }
62 60
63 func (c *CardActivityConfigRaw) MysqlInfo(gameId string) *svmysql.MysqlInfo { 61 func (c *CardActivityConfigRaw) MysqlInfo(gameId string) *svmysql.MysqlInfo {
64 - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_CONFIG 62 + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG
65 return &svmysql.MysqlInfo{ 63 return &svmysql.MysqlInfo{
66 DbMysql: svconst.DbConfig.Where("status = ?", 1), 64 DbMysql: svconst.DbConfig.Where("status = ?", 1),
67 TableName: tableName + gameId, 65 TableName: tableName + gameId,
configs/index.go
@@ -1,14 +0,0 @@ @@ -1,14 +0,0 @@
1 -package configs  
2 -  
3 -import (  
4 - "apigame/common/svdto"  
5 -)  
6 -  
7 -// func GetConfigRedis[T svconfig.IDtoData](gameId string) (result *T, has bool) {  
8 -// t = new(T)  
9 -// var rule = t.GetRule(gameId)  
10 -// return  
11 -// }  
12 -func GetConfigMysql[T svdto.IDtoData](gameId string, t T) (result *T, has bool) {  
13 - return  
14 -}  
configs/registry.go
1 package configs 1 package configs
2 2
3 import ( 3 import (
4 - "apigame/common/svmysql"  
5 - "apigame/common/svredis" 4 + "apigame/service-common/svmysql"
  5 + "apigame/service-common/svredis"
6 "fmt" 6 "fmt"
7 ) 7 )
8 8
controllers/base.go
@@ -2,7 +2,7 @@ package controllers @@ -2,7 +2,7 @@ package controllers
2 2
3 import ( 3 import (
4 "apigame/middleware/sign" 4 "apigame/middleware/sign"
5 - "apigame/service/constd" 5 + "apigame/service/code-msg"
6 "encoding/json" 6 "encoding/json"
7 "github.com/astaxie/beego" 7 "github.com/astaxie/beego"
8 ) 8 )
@@ -27,7 +27,7 @@ func (c *BaseController) RetRspData(rspData any) { @@ -27,7 +27,7 @@ func (c *BaseController) RetRspData(rspData any) {
27 // RetRspCodeData 返回封装 27 // RetRspCodeData 返回封装
28 func (c *BaseController) RetRspCodeData(code string, rspData any) { 28 func (c *BaseController) RetRspCodeData(code string, rspData any) {
29 resp := make(map[string]any) 29 resp := make(map[string]any)
30 - resp = constd.CodeMsg(resp, code) 30 + resp = code_msg.CodeMsg(resp, code)
31 resp["data"] = rspData 31 resp["data"] = rspData
32 c.RetData(resp) 32 c.RetData(resp)
33 } 33 }
@@ -35,7 +35,7 @@ func (c *BaseController) RetRspCodeData(code string, rspData any) { @@ -35,7 +35,7 @@ func (c *BaseController) RetRspCodeData(code string, rspData any) {
35 // RetCode 返回错误封装 35 // RetCode 返回错误封装
36 func (c *BaseController) RetCode(code string) { 36 func (c *BaseController) RetCode(code string) {
37 resp := make(map[string]any) 37 resp := make(map[string]any)
38 - resp = constd.CodeMsg(resp, code) 38 + resp = code_msg.CodeMsg(resp, code)
39 c.RetData(resp) 39 c.RetData(resp)
40 } 40 }
41 41
@@ -48,7 +48,7 @@ func (c *BaseController) GetPostData(postData any) bool { @@ -48,7 +48,7 @@ func (c *BaseController) GetPostData(postData any) bool {
48 if checkLocal() { 48 if checkLocal() {
49 err := json.Unmarshal(req, &postData) 49 err := json.Unmarshal(req, &postData)
50 if err != nil { 50 if err != nil {
51 - c.RetCode(constd.RECODE_PARAMERROR) 51 + c.RetCode(code_msg.RECODE_PARAMERROR)
52 return false 52 return false
53 } 53 }
54 return true 54 return true
@@ -58,7 +58,7 @@ func (c *BaseController) GetPostData(postData any) bool { @@ -58,7 +58,7 @@ func (c *BaseController) GetPostData(postData any) bool {
58 code, err := sign.Check(req, &postData, true, true) 58 code, err := sign.Check(req, &postData, true, true)
59 if err != nil { 59 if err != nil {
60 resp := make(map[string]interface{}) 60 resp := make(map[string]interface{})
61 - resp = constd.CodeMsg(resp, code) 61 + resp = code_msg.CodeMsg(resp, code)
62 c.RetData(resp) 62 c.RetData(resp)
63 return false 63 return false
64 } 64 }
1 package main 1 package main
2 2
3 import ( 3 import (
4 - "apigame/common/svconst"  
5 - "apigame/common/svlog"  
6 - "apigame/common/svmysql"  
7 - "apigame/common/svredis"  
8 "apigame/configs" 4 "apigame/configs"
9 _ "apigame/routers" 5 _ "apigame/routers"
  6 + "apigame/service-common/svconst"
  7 + "apigame/service-common/svlog"
  8 + "apigame/service-common/svmysql"
  9 + "apigame/service-common/svredis"
10 "apigame/service/cardholder" 10 "apigame/service/cardholder"
11 "github.com/astaxie/beego" 11 "github.com/astaxie/beego"
12 "github.com/astaxie/beego/logs" 12 "github.com/astaxie/beego/logs"
middleware/sign/index.go
@@ -3,7 +3,7 @@ package sign @@ -3,7 +3,7 @@ package sign
3 import ( 3 import (
4 "apigame/configs" 4 "apigame/configs"
5 "apigame/middleware/sdk" 5 "apigame/middleware/sdk"
6 - "apigame/service/constd" 6 + "apigame/service/code-msg"
7 "apigame/util/util-lx/lxalilog" 7 "apigame/util/util-lx/lxalilog"
8 "apigame/util/util-lx/lxarray" 8 "apigame/util/util-lx/lxarray"
9 "apigame/util/util-lx/lxconv" 9 "apigame/util/util-lx/lxconv"
@@ -77,7 +77,7 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig @@ -77,7 +77,7 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig
77 77
78 time_stamp = getTimeStamp(tempData["time_stamp"]) 78 time_stamp = getTimeStamp(tempData["time_stamp"])
79 if time_stamp < (nowtime-JG) || time_stamp > (nowtime+JG) { 79 if time_stamp < (nowtime-JG) || time_stamp > (nowtime+JG) {
80 - code = constd.RECODE_REQUESTTIME_ERROR 80 + code = code_msg.RECODE_REQUESTTIME_ERROR
81 err = errors.New(code) 81 err = errors.New(code)
82 lxalilog.Errors("RECODE_REQUESTTIME_ERROR error:", string(cgg.Bodys)) 82 lxalilog.Errors("RECODE_REQUESTTIME_ERROR error:", string(cgg.Bodys))
83 return 83 return
@@ -100,7 +100,7 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig @@ -100,7 +100,7 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig
100 } 100 }
101 101
102 if cgg.CheckUrlGameID && urlGameId == "" { 102 if cgg.CheckUrlGameID && urlGameId == "" {
103 - code = constd.RECODE_PARAMERROR 103 + code = code_msg.RECODE_PARAMERROR
104 err = errors.New(code) 104 err = errors.New(code)
105 lxalilog.Errors("urlGameid error:") 105 lxalilog.Errors("urlGameid error:")
106 return 106 return
@@ -109,21 +109,21 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig @@ -109,21 +109,21 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig
109 postGameId, ty = lxlimit.CheckLimit(c) 109 postGameId, ty = lxlimit.CheckLimit(c)
110 110
111 if cgg.CheckUrlGameID && postGameId != urlGameId { 111 if cgg.CheckUrlGameID && postGameId != urlGameId {
112 - code = constd.RECODE_PARAMERROR 112 + code = code_msg.RECODE_PARAMERROR
113 err = errors.New(code) 113 err = errors.New(code)
114 lxalilog.Errors("urlGameid !=postGameId:", urlGameId, postdata) 114 lxalilog.Errors("urlGameid !=postGameId:", urlGameId, postdata)
115 return 115 return
116 } 116 }
117 117
118 if ty != "" { 118 if ty != "" {
119 - code = constd.RECODE_REQUESTXIANLIU_ERROR 119 + code = code_msg.RECODE_REQUESTXIANLIU_ERROR
120 err = errors.New(ty) 120 err = errors.New(ty)
121 return 121 return
122 } 122 }
123 123
124 err = json.Unmarshal(cgg.Bodys, &postdata) 124 err = json.Unmarshal(cgg.Bodys, &postdata)
125 if err != nil { 125 if err != nil {
126 - code = constd.RECODE_PARAMERROR 126 + code = code_msg.RECODE_PARAMERROR
127 lxalilog.Errors("json.Unmarshal error:", err, string(cgg.Bodys)) 127 lxalilog.Errors("json.Unmarshal error:", err, string(cgg.Bodys))
128 return 128 return
129 } 129 }
@@ -134,13 +134,13 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig @@ -134,13 +134,13 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig
134 134
135 b, err = valid.Valid(postdata) 135 b, err = valid.Valid(postdata)
136 if err != nil { 136 if err != nil {
137 - code = constd.RECODE_PARAMERROR 137 + code = code_msg.RECODE_PARAMERROR
138 lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors) 138 lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors)
139 return 139 return
140 } 140 }
141 141
142 if !b { 142 if !b {
143 - code = constd.RECODE_PARAMERROR 143 + code = code_msg.RECODE_PARAMERROR
144 err = errors.New(code) 144 err = errors.New(code)
145 lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors) 145 lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors)
146 return 146 return
@@ -161,7 +161,7 @@ func Check(req []byte, postdata interface{}, checkSign bool, checkToken bool) (c @@ -161,7 +161,7 @@ func Check(req []byte, postdata interface{}, checkSign bool, checkToken bool) (c
161 161
162 err = json.Unmarshal(req, &postdata) 162 err = json.Unmarshal(req, &postdata)
163 if err != nil { 163 if err != nil {
164 - code = constd.RECODE_PARAMERROR 164 + code = code_msg.RECODE_PARAMERROR
165 lxalilog.Errors("json.Unmarshal error:", err, string(req)) 165 lxalilog.Errors("json.Unmarshal error:", err, string(req))
166 return 166 return
167 } 167 }
@@ -172,13 +172,13 @@ func Check(req []byte, postdata interface{}, checkSign bool, checkToken bool) (c @@ -172,13 +172,13 @@ func Check(req []byte, postdata interface{}, checkSign bool, checkToken bool) (c
172 172
173 b, err = valid.Valid(postdata) 173 b, err = valid.Valid(postdata)
174 if err != nil { 174 if err != nil {
175 - code = constd.RECODE_PARAMERROR 175 + code = code_msg.RECODE_PARAMERROR
176 lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors) 176 lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors)
177 return 177 return
178 } 178 }
179 179
180 if !b { 180 if !b {
181 - code = constd.RECODE_PARAMERROR 181 + code = code_msg.RECODE_PARAMERROR
182 err = errors.New(code) 182 err = errors.New(code)
183 lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors) 183 lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors)
184 return 184 return
@@ -209,13 +209,13 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf @@ -209,13 +209,13 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf
209 209
210 err = json.Unmarshal(jsonBody, &newdata) 210 err = json.Unmarshal(jsonBody, &newdata)
211 if err != nil { 211 if err != nil {
212 - code = constd.RECODE_SIGNERROR 212 + code = code_msg.RECODE_SIGNERROR
213 lxalilog.Errors("json.Unmarshal error:", err) 213 lxalilog.Errors("json.Unmarshal error:", err)
214 return 214 return
215 } 215 }
216 216
217 if newdata["gameid"] == "" || newdata["channel"] == "" || newdata["sign"] == "" || newdata["sign_type"] == "" || newdata["time_stamp"] == "" || newdata["ver"] == "" { 217 if newdata["gameid"] == "" || newdata["channel"] == "" || newdata["sign"] == "" || newdata["sign_type"] == "" || newdata["time_stamp"] == "" || newdata["ver"] == "" {
218 - code = constd.RECODE_SIGNERROR 218 + code = code_msg.RECODE_SIGNERROR
219 err = errors.New("签名错误,参数错误" + logstr) 219 err = errors.New("签名错误,参数错误" + logstr)
220 lxalilog.Errors(err) 220 lxalilog.Errors(err)
221 return 221 return
@@ -236,7 +236,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf @@ -236,7 +236,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf
236 appkey := gameconfig.AppKey 236 appkey := gameconfig.AppKey
237 237
238 if appkey == "" { 238 if appkey == "" {
239 - code = constd.RECODE_SIGNERROR 239 + code = code_msg.RECODE_SIGNERROR
240 err = errors.New("签名错误,参数错误" + gameid + "no appkey") 240 err = errors.New("签名错误,参数错误" + gameid + "no appkey")
241 lxalilog.Errors(err) 241 lxalilog.Errors(err)
242 return 242 return
@@ -262,7 +262,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf @@ -262,7 +262,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf
262 } 262 }
263 263
264 if len(fiterkey) > 0 { 264 if len(fiterkey) > 0 {
265 - code = constd.RECODE_WEIXINAZIFU_ERROR 265 + code = code_msg.RECODE_WEIXINAZIFU_ERROR
266 err = errors.New("fiterkey error" + logstr) 266 err = errors.New("fiterkey error" + logstr)
267 lxalilog.Errors(err, lxconv.JsonEncode(fiterkey), "data:", lxconv.JsonEncode(newdata)) 267 lxalilog.Errors(err, lxconv.JsonEncode(fiterkey), "data:", lxconv.JsonEncode(newdata))
268 return 268 return
@@ -282,7 +282,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf @@ -282,7 +282,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf
282 md5key := strings.ToLower(lxconv.EncryMD5(valstr)) 282 md5key := strings.ToLower(lxconv.EncryMD5(valstr))
283 283
284 if md5key != sign { 284 if md5key != sign {
285 - code = constd.RECODE_SIGNERROR 285 + code = code_msg.RECODE_SIGNERROR
286 err = errors.New(code) 286 err = errors.New(code)
287 lxalilog.Errors("sign error,md5key::", md5key, ",sign:", sign, logstr, "data:", lxconv.JsonEncode(newdata)) 287 lxalilog.Errors("sign error,md5key::", md5key, ",sign:", sign, logstr, "data:", lxconv.JsonEncode(newdata))
288 return 288 return
@@ -291,7 +291,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf @@ -291,7 +291,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf
291 if checkToken { 291 if checkToken {
292 292
293 if newdata["uid"] == nil || newdata["token"] == nil { 293 if newdata["uid"] == nil || newdata["token"] == nil {
294 - code = constd.RECODE_PARAMERROR 294 + code = code_msg.RECODE_PARAMERROR
295 err = errors.New(code) 295 err = errors.New(code)
296 lxalilog.Errors("no uid or token", "data:", lxconv.JsonEncode(newdata)) 296 lxalilog.Errors("no uid or token", "data:", lxconv.JsonEncode(newdata))
297 return 297 return
@@ -299,7 +299,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf @@ -299,7 +299,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf
299 299
300 err = sdk.CheckSdkToken(gameid, lxconv.ToInt64(newdata["uid"]), lxconv.InterfaceToStr(newdata["token"])) 300 err = sdk.CheckSdkToken(gameid, lxconv.ToInt64(newdata["uid"]), lxconv.InterfaceToStr(newdata["token"]))
301 if err != nil { 301 if err != nil {
302 - code = constd.RECODE_LOGINCHECK_ERROR 302 + code = code_msg.RECODE_LOGINCHECK_ERROR
303 return 303 return
304 } 304 }
305 305
service-common/svconst/consts.go 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +package svconst
  2 +
  3 +const (
  4 + REDIS_CACHEP_REFIX = "apigame" // 缓存前缀
  5 +)
service-common/svconst/mysql.go 0 → 100644
@@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
  1 +package svconst
  2 +
  3 +// mysql
  4 +// 创建时间:2023/4/3 15:28
  5 +// 创建人:lixu
  6 +
  7 +const (
  8 + MYSQL_DEFAULT = "default"
  9 + MYSQL_DBAPI = "api"
  10 + MYSQL_MERGECOMMON = "merge_common"
  11 + MYSQL_MERGECONFIG = "merge_config"
  12 + MYSQL_DEFAULT_QUERY_MAXCOUNT = 100
  13 +
  14 + MYSQL_TABLE_S_CARDHOLDER_CONFIG = "s_card_activity_" // 开卡包活动配置
  15 + MYSQL_TABLE_S_CARDHOLDER_DATA = "s_cardholder_data_" // 开卡包活动数据
  16 + MYSQL_TABLE_S_CARDHOLDER_RECORD_GETNEW = "s_cardholder_record_getnew_" // 开卡包活动日志获得卡包
  17 + MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN = "s_cardholder_record_open_" // 开卡包活动日志开卡包
  18 + MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM = "s_cardholder_record_rewardalbum_" // 开卡包活动日志领取卡组奖励
  19 + MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND = "s_cardholder_record_rewardround_" // 开卡包活动日志领取轮次奖励
  20 +
  21 +)
service-common/svconst/vars.go 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +package svconst
  2 +
  3 +import "gorm.io/gorm"
  4 +
  5 +var (
  6 + AppName = ""
  7 +
  8 + DbApi *gorm.DB
  9 + DbCommon *gorm.DB
  10 + DbConfig *gorm.DB
  11 +
  12 + GameListCardHolder = []string{"10149"}
  13 +)
service-common/svlog/ali-log.go 0 → 100644
@@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
  1 +package svlog
  2 +
  3 +import (
  4 + "apigame/util/util-lx/lxalilog"
  5 + "fmt"
  6 + "github.com/astaxie/beego"
  7 + lalilog "github.com/lixu-any/go-tools/ali/log"
  8 +)
  9 +
  10 +func InitAliLog(appName string) {
  11 +
  12 + //初始化阿里云日志
  13 + logm, _ := beego.AppConfig.GetSection("alilog")
  14 + lxalilog.InitAliLog(lxalilog.MapAlilogConfig{
  15 + Endpoint: logm["endpoint"],
  16 + AccessKeyId: logm["accesskeyid"],
  17 + AccessKeySecret: logm["accesskeysecret"],
  18 + Project: logm["project"],
  19 + AppNaame: appName,
  20 + On: logm["on"],
  21 + Debug: logm["debug"],
  22 + TableError: "api_code_merge",
  23 + TableDebug: logm["tabledebug"],
  24 + Env: beego.AppConfig.String("env"),
  25 + })
  26 +
  27 + lalilog.InitAliLog(lalilog.MapAlilogConfig{
  28 + Endpoint: logm["endpoint"],
  29 + AccessKeyId: logm["accesskeyid"],
  30 + AccessKeySecret: logm["accesskeysecret"],
  31 + Project: logm["project"],
  32 + On: logm["on"],
  33 + Debug: logm["debug"],
  34 + TableError: logm["tableerror"],
  35 + TableDebug: logm["tabledebug"],
  36 + Env: beego.AppConfig.String("env"),
  37 + })
  38 +
  39 + fmt.Println(appName + " alilog init success")
  40 +}
service-common/svlog/log.go 0 → 100644
@@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
  1 +package svlog
  2 +
  3 +import (
  4 + "apigame/service-common/svconst"
  5 + "apigame/util/util-lx/lxbeego"
  6 + "fmt"
  7 + "github.com/astaxie/beego"
  8 +)
  9 +
  10 +func Init() {
  11 +
  12 + // 初始化日志文件
  13 + conf, _ := beego.AppConfig.GetSection("log")
  14 + conf["filename"] = conf["path"] + "api.log"
  15 +
  16 + if err := lxbeego.Inits(conf); err != nil {
  17 + fmt.Println("svlog.Inits Error::" + err.Error())
  18 + }
  19 +
  20 + fmt.Println(svconst.AppName + " svlog init success")
  21 +
  22 +}
service-common/svmysql/dto.go 0 → 100644
@@ -0,0 +1,84 @@ @@ -0,0 +1,84 @@
  1 +package svmysql
  2 +
  3 +import (
  4 + "apigame/util/util-lx/lxalilog"
  5 + "gorm.io/gorm"
  6 + "strings"
  7 +)
  8 +
  9 +func Insert(obj IMysqlData, gameId string) (err error) {
  10 + info := obj.MysqlInfo(gameId)
  11 + db := info.DbMysql
  12 + stmt := db.Session(&gorm.Session{DryRun: true}).Create(obj).Statement
  13 + stmtSQL := stmt.SQL.String()
  14 + sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1)
  15 + result := db.Exec(sql, stmt.Vars...)
  16 + err = result.Error
  17 + if err != nil {
  18 + lxalilog.Errors(err, gameId)
  19 + return
  20 + }
  21 + return
  22 +}
  23 +
  24 +func Updates(obj IMysqlData, gameId string) (err error) {
  25 + info := obj.MysqlInfo(gameId)
  26 + db := info.DbMysql
  27 + stmt := db.Session(&gorm.Session{DryRun: true}).Updates(obj).Statement
  28 + stmtSQL := stmt.SQL.String()
  29 + sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1)
  30 + result := db.Exec(sql, stmt.Vars...)
  31 + err = result.Error
  32 + if err != nil {
  33 + lxalilog.Errors(err, gameId)
  34 + return
  35 + }
  36 + return
  37 +}
  38 +
  39 +func Save(obj IMysqlData, gameId string) (err error) {
  40 + info := obj.MysqlInfo(gameId)
  41 + db := info.DbMysql
  42 + stmt := db.Session(&gorm.Session{DryRun: true}).Save(obj).Statement
  43 + stmtSQL := stmt.SQL.String()
  44 + sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1)
  45 + result := db.Exec(sql, stmt.Vars...)
  46 + err = result.Error
  47 + if err != nil {
  48 + lxalilog.Errors(err, gameId)
  49 + return
  50 + }
  51 + return
  52 +}
  53 +
  54 +func First(obj IMysqlData, gameId string) (has bool, err error) {
  55 + info := obj.MysqlInfo(gameId)
  56 + db := info.DbMysql
  57 + stmt := db.Session(&gorm.Session{DryRun: true}).First(obj).Statement
  58 + stmtSQL := stmt.SQL.String()
  59 + sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1)
  60 + result := db.Raw(sql, stmt.Vars...).Scan(obj)
  61 + has = result.RowsAffected != 0
  62 + err = result.Error
  63 + if err != nil {
  64 + lxalilog.Errors(err, gameId)
  65 + return
  66 + }
  67 + return
  68 +}
  69 +
  70 +func Find(obj IMysqlData, gameId string) (has bool, err error) {
  71 + info := obj.MysqlInfo(gameId)
  72 + db := info.DbMysql
  73 + stmt := db.Session(&gorm.Session{DryRun: true}).Find(obj).Statement
  74 + stmtSQL := stmt.SQL.String()
  75 + sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1)
  76 + result := db.Raw(sql, stmt.Vars...).Scan(obj)
  77 + has = result.RowsAffected != 0
  78 + err = result.Error
  79 + if err != nil {
  80 + lxalilog.Errors(err, gameId)
  81 + return
  82 + }
  83 + return
  84 +}
service-common/svmysql/index.go 0 → 100644
@@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
  1 +package svmysql
  2 +
  3 +import (
  4 + "apigame/service-common/svconst"
  5 + "fmt"
  6 + "github.com/astaxie/beego"
  7 + "gorm.io/driver/mysql"
  8 + "gorm.io/gorm"
  9 +)
  10 +
  11 +func Init() bool {
  12 +
  13 + // ConnectMySQL
  14 + if db, err := ConnectMySQL(beego.AppConfig.String("mysql::" + svconst.MYSQL_DBAPI)); err == nil {
  15 + svconst.DbApi = db
  16 + } else {
  17 + fmt.Println("svmysql.Init DbApi Error::" + err.Error())
  18 + return false
  19 + }
  20 + if db, err := ConnectMySQL(beego.AppConfig.String("mysql::mergecommon")); err == nil {
  21 + svconst.DbCommon = db
  22 + } else {
  23 + fmt.Println("svmysql.Init DbCommon Error::" + err.Error())
  24 + return false
  25 + }
  26 + if db, err := ConnectMySQL(beego.AppConfig.String("mysql::" + svconst.MYSQL_MERGECONFIG)); err == nil {
  27 + svconst.DbConfig = db
  28 + } else {
  29 + fmt.Println("svmysql.Init DbConfig Error::" + err.Error())
  30 + return false
  31 + }
  32 + return true
  33 +
  34 +}
  35 +
  36 +func ConnectMySQL(dsn string) (db *gorm.DB, err error) {
  37 + return gorm.Open(mysql.Open(dsn), &gorm.Config{})
  38 +}
service-common/svmysql/interface.go 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +package svmysql
  2 +
  3 +import "gorm.io/gorm"
  4 +
  5 +// MysqlInfo mysql存储信息
  6 +type MysqlInfo struct {
  7 + DbMysql *gorm.DB
  8 + TableName string
  9 +}
  10 +
  11 +// IMysqlData mysql存储对象
  12 +type IMysqlData interface {
  13 + // MysqlInfo mysql存储信息
  14 + MysqlInfo(gameId string) *MysqlInfo
  15 +}
service-common/svmysql/table.go 0 → 100644
@@ -0,0 +1,135 @@ @@ -0,0 +1,135 @@
  1 +package svmysql
  2 +
  3 +import (
  4 + "fmt"
  5 + "gorm.io/driver/mysql"
  6 + "gorm.io/gorm"
  7 + "gorm.io/gorm/clause"
  8 + "gorm.io/gorm/migrator"
  9 + "strings"
  10 +)
  11 +
  12 +func InitTable(obj IMysqlData, gameId string) {
  13 + info := obj.MysqlInfo(gameId)
  14 + db := info.DbMysql
  15 + tableName := info.TableName
  16 + m := db.Migrator().(mysql.Migrator).Migrator
  17 + queryTx, execTx := m.GetQueryAndExecTx()
  18 + if HasTable(queryTx.Migrator().(mysql.Migrator).Migrator, obj, tableName) {
  19 + fmt.Println(tableName + " exist, skip!")
  20 + } else {
  21 + err := CreateTable(execTx, obj, tableName)
  22 + if err != nil {
  23 + fmt.Println("err", err)
  24 + }
  25 + }
  26 +}
  27 +
  28 +func HasTable(m migrator.Migrator, obj any, tableName string) bool {
  29 + var count int64
  30 +
  31 + m.RunWithValue(obj, func(stmt *gorm.Statement) error {
  32 + currentDatabase := m.DB.Migrator().CurrentDatabase()
  33 + return m.DB.Raw("SELECT count(*) FROM information_schema.tables WHERE table_schema = ? AND table_name = ? AND table_type = ?", currentDatabase, tableName, "BASE TABLE").Row().Scan(&count)
  34 + })
  35 +
  36 + return count > 0
  37 +}
  38 +
  39 +func CreateTable(execTx *gorm.DB, value any, tableName string) error {
  40 + m := execTx.Migrator().(mysql.Migrator).Migrator
  41 + tx := m.DB.Session(&gorm.Session{})
  42 +
  43 + if err := m.RunWithValue(value, func(stmt *gorm.Statement) (err error) {
  44 + var (
  45 + createTableSQL = "CREATE TABLE ? ("
  46 + values = []interface{}{clause.Table{Name: tableName}}
  47 + hasPrimaryKeyInDataType bool
  48 + )
  49 +
  50 + for _, dbName := range stmt.Schema.DBNames {
  51 + field := stmt.Schema.FieldsByDBName[dbName]
  52 + if !field.IgnoreMigration {
  53 + createTableSQL += "? ?"
  54 + hasPrimaryKeyInDataType = hasPrimaryKeyInDataType || strings.Contains(strings.ToUpper(m.DataTypeOf(field)), "PRIMARY KEY")
  55 + values = append(values, clause.Column{Name: dbName}, m.DB.Migrator().FullDataTypeOf(field))
  56 + createTableSQL += ","
  57 + }
  58 + }
  59 +
  60 + if !hasPrimaryKeyInDataType && len(stmt.Schema.PrimaryFields) > 0 {
  61 + createTableSQL += "PRIMARY KEY ?,"
  62 + primaryKeys := make([]interface{}, 0, len(stmt.Schema.PrimaryFields))
  63 + for _, field := range stmt.Schema.PrimaryFields {
  64 + primaryKeys = append(primaryKeys, clause.Column{Name: field.DBName})
  65 + }
  66 +
  67 + values = append(values, primaryKeys)
  68 + }
  69 +
  70 + for _, idx := range stmt.Schema.ParseIndexes() {
  71 + if m.CreateIndexAfterCreateTable {
  72 + defer func(value interface{}, name string) {
  73 + if err == nil {
  74 + err = tx.Migrator().CreateIndex(value, name)
  75 + }
  76 + }(value, idx.Name)
  77 + } else {
  78 + if idx.Class != "" {
  79 + createTableSQL += idx.Class + " "
  80 + }
  81 + createTableSQL += "INDEX ? ?"
  82 +
  83 + if idx.Comment != "" {
  84 + createTableSQL += fmt.Sprintf(" COMMENT '%s'", idx.Comment)
  85 + }
  86 +
  87 + if idx.Option != "" {
  88 + createTableSQL += " " + idx.Option
  89 + }
  90 +
  91 + createTableSQL += ","
  92 + values = append(values, clause.Column{Name: idx.Name}, tx.Migrator().(migrator.BuildIndexOptionsInterface).BuildIndexOptions(idx.Fields, stmt))
  93 + }
  94 + }
  95 +
  96 + if !m.DB.DisableForeignKeyConstraintWhenMigrating && !m.DB.IgnoreRelationshipsWhenMigrating {
  97 + for _, rel := range stmt.Schema.Relationships.Relations {
  98 + if rel.Field.IgnoreMigration {
  99 + continue
  100 + }
  101 + if constraint := rel.ParseConstraint(); constraint != nil {
  102 + if constraint.Schema == stmt.Schema {
  103 + sql, vars := constraint.Build()
  104 + createTableSQL += sql + ","
  105 + values = append(values, vars...)
  106 + }
  107 + }
  108 + }
  109 + }
  110 +
  111 + for _, uni := range stmt.Schema.ParseUniqueConstraints() {
  112 + createTableSQL += "CONSTRAINT ? UNIQUE (?),"
  113 + values = append(values, clause.Column{Name: uni.Name}, clause.Expr{SQL: stmt.Quote(uni.Field.DBName)})
  114 + }
  115 +
  116 + for _, chk := range stmt.Schema.ParseCheckConstraints() {
  117 + createTableSQL += "CONSTRAINT ? CHECK (?),"
  118 + values = append(values, clause.Column{Name: chk.Name}, clause.Expr{SQL: chk.Constraint})
  119 + }
  120 +
  121 + createTableSQL = strings.TrimSuffix(createTableSQL, ",")
  122 +
  123 + createTableSQL += ")"
  124 +
  125 + if tableOption, ok := m.DB.Get("gorm:table_options"); ok {
  126 + createTableSQL += fmt.Sprint(tableOption)
  127 + }
  128 +
  129 + err = tx.Exec(createTableSQL, values...).Error
  130 + return err
  131 + }); err != nil {
  132 + return err
  133 + }
  134 + return nil
  135 +}
service-common/svredis/index.go 0 → 100644
@@ -0,0 +1,58 @@ @@ -0,0 +1,58 @@
  1 +package svredis
  2 +
  3 +import (
  4 + "apigame/service-common/svconst"
  5 + "apigame/util/utstring"
  6 + "apigame/util/zjson"
  7 + "apigame/util/zredis"
  8 + "fmt"
  9 + "github.com/astaxie/beego"
  10 + "github.com/mitchellh/mapstructure"
  11 +)
  12 +
  13 +type RedisConfig struct {
  14 + Host string `json:"host"`
  15 + Port string `json:"port"`
  16 + Pwd string `json:"pwd"`
  17 + Db string `json:"Db"`
  18 + Prefix string `json:"prefix"`
  19 +}
  20 +
  21 +func Init() bool {
  22 + //初始化Redis
  23 + confText, _ := beego.AppConfig.GetSection("redis")
  24 + var conf RedisConfig
  25 + err := mapstructure.Decode(confText, &conf)
  26 + if err != nil {
  27 + fmt.Println("svredis.Init mapstructure.Decode Error::" + err.Error())
  28 + }
  29 + zredis.Init(conf.Host+":"+conf.Port, conf.Pwd, utstring.StringToInt(conf.Db))
  30 + if !zredis.Check() {
  31 + return false
  32 + }
  33 +
  34 + fmt.Println(svconst.AppName + " redis init success")
  35 + return true
  36 +}
  37 +
  38 +func SaveData(gameId string, obj IRedisData) {
  39 + info := obj.RedisInfo(gameId)
  40 + _ = zredis.SetEx(zredis.GetConn(), info.CacheKey, zjson.Str(obj), info.CacheTime)
  41 +}
  42 +
  43 +func LoadData[T IRedisData](gameId string, obj T) (has bool) {
  44 + has = true
  45 + info := obj.RedisInfo(gameId)
  46 + text, err := zredis.Get(zredis.GetConn(), info.CacheKey)
  47 + if err != nil {
  48 + has = false
  49 + return
  50 + }
  51 + err = zjson.Obj(text, &obj)
  52 + if err != nil {
  53 + fmt.Println(err)
  54 + has = false
  55 + return
  56 + }
  57 + return
  58 +}
service-common/svredis/interface.go 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +package svredis
  2 +
  3 +// RedisInfo redis存储信息
  4 +type RedisInfo struct {
  5 + CacheKey string
  6 + CacheTime int
  7 +}
  8 +
  9 +// IRedisData redis存储对象
  10 +type IRedisData interface {
  11 + // RedisInfo redis存储信息
  12 + RedisInfo(gameId string) *RedisInfo
  13 +}
service-common/thinkingdata/index.go 0 → 100644
@@ -0,0 +1,119 @@ @@ -0,0 +1,119 @@
  1 +package thinkingdata
  2 +
  3 +import (
  4 + "crypto/tls"
  5 + "encoding/json"
  6 + "errors"
  7 + "fmt"
  8 + "gitee.com/lxgow/lxconv"
  9 + "github.com/astaxie/beego"
  10 + "github.com/astaxie/beego/httplib"
  11 + lconv "github.com/lixu-any/go-tools/conv"
  12 + "time"
  13 +)
  14 +
  15 +// index
  16 +// 创建时间:2023/10/23 10:06
  17 +// 创建人:lixu
  18 +
  19 +// index 数数科技
  20 +// 创建时间:2023/7/18 16:03
  21 +// 创建人:lixu
  22 +
  23 +// GetNowDateTime 当前日期时间
  24 +func GetNowDateTime() string {
  25 + tim := time.Unix(time.Now().Unix(), 0).Format("2006-01-02 15:04:05")
  26 + return fmt.Sprintf("%s", tim)
  27 +}
  28 +
  29 +type MThinkDataConfig struct {
  30 + Url string `json:"url"`
  31 + Debug int `json:"debug"`
  32 +}
  33 +
  34 +type MRespData struct {
  35 + Msg string `json:"Msg"`
  36 + Code int `json:"code"`
  37 +}
  38 +
  39 +var THINKINGDATACONFIG MThinkDataConfig
  40 +
  41 +// InitThinkData 初始化数数
  42 +func InitThinkData() (err error) {
  43 + thinkingdata, _ := beego.AppConfig.GetSection("thinkingdata")
  44 + THINKINGDATACONFIG.Url = thinkingdata["url"]
  45 + THINKINGDATACONFIG.Debug = lxconv.ParseInt(thinkingdata["debug"])
  46 + return
  47 +}
  48 +
  49 +// AddOneData 数据上报
  50 +func AddOneData(appid, account_id, distinct_id string, event string, data map[string]interface{}, typ string) (resp MRespData, err error) {
  51 +
  52 + _data := map[string]interface{}{
  53 + "#type": typ,
  54 + //"#event_name": event,
  55 + "#time": GetNowDateTime(),
  56 + "#account_id": account_id,
  57 + "#distinct_id": distinct_id,
  58 + "properties": data,
  59 + }
  60 +
  61 + if typ == "track" && event != "" {
  62 + _data["#event_name"] = event
  63 + }
  64 +
  65 + postdata := map[string]interface{}{
  66 + "appid": appid,
  67 + "debug": THINKINGDATACONFIG.Debug,
  68 + "data": _data,
  69 + }
  70 +
  71 + req := httplib.Post(THINKINGDATACONFIG.Url + "/sync_json")
  72 +
  73 + req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true})
  74 +
  75 + _, err = req.JSONBody(&postdata)
  76 + if err != nil {
  77 + err = errors.New("thinkingdata-AddOneData req.JSONBody() error::" + err.Error() + "::" + lconv.JsonEncode(postdata))
  78 + return
  79 + }
  80 +
  81 + var (
  82 + bytes []byte
  83 + )
  84 +
  85 + bytes, err = req.Bytes()
  86 + if err != nil {
  87 + err = errors.New("thinkingdata-AddOneData req.Bytes() error::" + err.Error() + "::" + lconv.JsonEncode(postdata) + "::" + string(bytes))
  88 + return
  89 + }
  90 +
  91 + _ = json.Unmarshal(bytes, &resp)
  92 +
  93 + if resp.Code != 0 {
  94 + err = errors.New("thinkingdata-AddOneData resp.Code error:: " + lconv.JsonEncode(postdata) + "::" + string(bytes))
  95 + return
  96 + }
  97 +
  98 + return
  99 +}
  100 +
  101 +// TrackOne 向事件表传入一个事件
  102 +func TrackOne(appid, account_id string, event string, data map[string]interface{}) (resp MRespData, err error) {
  103 + return AddOneData(appid, account_id, "", event, data, "track")
  104 +}
  105 +
  106 +// UserSet 对用户表进行操作,覆盖一个或多个用户属性,如果该属性已有值存在,覆盖先前值
  107 +func UserSet(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) {
  108 + return AddOneData(appid, account_id, "", "", data, "user_set")
  109 +}
  110 +
  111 +// UserSetOnce 对用户表进行操作,初始化一个或多个用户属性,如果该属性已有值存在,则忽略本次操作
  112 +func UserSetOnce(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) {
  113 + return AddOneData(appid, account_id, "", "", data, "user_setOnce")
  114 +}
  115 +
  116 +// UserAdd 对用户表进行操作,为一个或多个数值型用户属性做累加计算
  117 +func UserAdd(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) {
  118 + return AddOneData(appid, account_id, "", "", data, "user_add")
  119 +}
service/cardholder/dto-game.go
1 package cardholder 1 package cardholder
2 2
3 import ( 3 import (
4 - "apigame/common/svconst"  
5 - "apigame/common/svmysql"  
6 - "apigame/service/constd" 4 + "apigame/service-common/svconst"
  5 + "apigame/service-common/svmysql"
7 "apigame/util/util-lx/lxalilog" 6 "apigame/util/util-lx/lxalilog"
8 "apigame/util/util-lx/lxtime" 7 "apigame/util/util-lx/lxtime"
9 "encoding/json" 8 "encoding/json"
@@ -20,7 +19,7 @@ type DataCardHolder struct { @@ -20,7 +19,7 @@ type DataCardHolder struct {
20 } 19 }
21 20
22 func (d *DataCardHolder) MysqlInfo(gameId string) *svmysql.MysqlInfo { 21 func (d *DataCardHolder) MysqlInfo(gameId string) *svmysql.MysqlInfo {
23 - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_DATA 22 + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_DATA
24 return &svmysql.MysqlInfo{ 23 return &svmysql.MysqlInfo{
25 DbMysql: svconst.DbCommon, 24 DbMysql: svconst.DbCommon,
26 TableName: tableName + gameId, 25 TableName: tableName + gameId,
service/cardholder/dto-record.go
1 package cardholder 1 package cardholder
2 2
3 import ( 3 import (
4 - "apigame/common/svconst"  
5 - "apigame/common/svmysql"  
6 - "apigame/service/constd" 4 + "apigame/service-common/svconst"
  5 + "apigame/service-common/svmysql"
7 "apigame/util/util-lx/lxtime" 6 "apigame/util/util-lx/lxtime"
8 ) 7 )
9 8
@@ -41,7 +40,7 @@ type RecordCardHolderOpen struct { @@ -41,7 +40,7 @@ type RecordCardHolderOpen struct {
41 } 40 }
42 41
43 func (d *RecordCardHolderOpen) MysqlInfo(gameId string) *svmysql.MysqlInfo { 42 func (d *RecordCardHolderOpen) MysqlInfo(gameId string) *svmysql.MysqlInfo {
44 - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN 43 + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN
45 return &svmysql.MysqlInfo{ 44 return &svmysql.MysqlInfo{
46 DbMysql: svconst.DbCommon, 45 DbMysql: svconst.DbCommon,
47 TableName: tableName + gameId, 46 TableName: tableName + gameId,
@@ -66,7 +65,7 @@ type RecordCardHolderRewardAlbum struct { @@ -66,7 +65,7 @@ type RecordCardHolderRewardAlbum struct {
66 } 65 }
67 66
68 func (d *RecordCardHolderRewardAlbum) MysqlInfo(gameId string) *svmysql.MysqlInfo { 67 func (d *RecordCardHolderRewardAlbum) MysqlInfo(gameId string) *svmysql.MysqlInfo {
69 - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM 68 + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM
70 return &svmysql.MysqlInfo{ 69 return &svmysql.MysqlInfo{
71 DbMysql: svconst.DbCommon, 70 DbMysql: svconst.DbCommon,
72 TableName: tableName + gameId, 71 TableName: tableName + gameId,
@@ -89,7 +88,7 @@ type RecordCardHolderRewardRound struct { @@ -89,7 +88,7 @@ type RecordCardHolderRewardRound struct {
89 } 88 }
90 89
91 func (d *RecordCardHolderRewardRound) MysqlInfo(gameId string) *svmysql.MysqlInfo { 90 func (d *RecordCardHolderRewardRound) MysqlInfo(gameId string) *svmysql.MysqlInfo {
92 - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND 91 + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND
93 return &svmysql.MysqlInfo{ 92 return &svmysql.MysqlInfo{
94 DbMysql: svconst.DbCommon, 93 DbMysql: svconst.DbCommon,
95 TableName: tableName + gameId, 94 TableName: tableName + gameId,
service/cardholder/handle.go
@@ -3,7 +3,7 @@ package cardholder @@ -3,7 +3,7 @@ package cardholder
3 import ( 3 import (
4 "apigame/configs" 4 "apigame/configs"
5 "apigame/models" 5 "apigame/models"
6 - "apigame/service/constd" 6 + "apigame/service/code-msg"
7 "apigame/util/util-lx/lxalilog" 7 "apigame/util/util-lx/lxalilog"
8 "apigame/util/util-lx/lxtime" 8 "apigame/util/util-lx/lxtime"
9 "apigame/util/utslice" 9 "apigame/util/utslice"
@@ -13,7 +13,7 @@ import ( @@ -13,7 +13,7 @@ import (
13 // HandleGetConfig 活动配置 13 // HandleGetConfig 活动配置
14 func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp models.RspCardHolderGetConfig) { 14 func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp models.RspCardHolderGetConfig) {
15 rsp = models.RspCardHolderGetConfig{} 15 rsp = models.RspCardHolderGetConfig{}
16 - code = constd.RECODE_OK 16 + code = code_msg.RECODE_OK
17 17
18 // 尝试更新配置 18 // 尝试更新配置
19 config, _ := configs.GetCardActivityConfig(req.GameID) 19 config, _ := configs.GetCardActivityConfig(req.GameID)
@@ -31,19 +31,19 @@ func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp model @@ -31,19 +31,19 @@ func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp model
31 // HandleInfo 卡包信息 31 // HandleInfo 卡包信息
32 func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardHolderInfo) { 32 func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardHolderInfo) {
33 rsp = models.RspCardHolderInfo{} 33 rsp = models.RspCardHolderInfo{}
34 - code = constd.RECODE_OK 34 + code = code_msg.RECODE_OK
35 35
36 // 尝试更新配置 36 // 尝试更新配置
37 config, hasConfig := configs.GetCardActivityConfig(req.GameID) 37 config, hasConfig := configs.GetCardActivityConfig(req.GameID)
38 if !hasConfig { 38 if !hasConfig {
39 - code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR 39 + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
40 return 40 return
41 } 41 }
42 42
43 // 判断预告时间 43 // 判断预告时间
44 sec := lxtime.NowUninx() 44 sec := lxtime.NowUninx()
45 if sec < config.StartTime { 45 if sec < config.StartTime {
46 - code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR 46 + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
47 return 47 return
48 } 48 }
49 49
@@ -61,25 +61,25 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH @@ -61,25 +61,25 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH
61 NewCards: make([][]int, 0), 61 NewCards: make([][]int, 0),
62 AwardAlbum: make(map[int]string), 62 AwardAlbum: make(map[int]string),
63 } 63 }
64 - code = constd.RECODE_OK 64 + code = code_msg.RECODE_OK
65 65
66 // 尝试更新配置 66 // 尝试更新配置
67 config, hasConfig := configs.GetCardActivityConfig(req.GameID) 67 config, hasConfig := configs.GetCardActivityConfig(req.GameID)
68 if !hasConfig { 68 if !hasConfig {
69 - code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR 69 + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
70 return 70 return
71 } 71 }
72 72
73 // 检查活动状态 73 // 检查活动状态
74 code = CheckStatus(config) 74 code = CheckStatus(config)
75 - if code != constd.RECODE_OK { 75 + if code != code_msg.RECODE_OK {
76 return 76 return
77 } 77 }
78 // 检查卡包ID 78 // 检查卡包ID
79 for _, idCardholder := range req.Ids { 79 for _, idCardholder := range req.Ids {
80 _, okCardholder := config.CardholderConfig[strconv.Itoa(idCardholder)] 80 _, okCardholder := config.CardholderConfig[strconv.Itoa(idCardholder)]
81 if !okCardholder { 81 if !okCardholder {
82 - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR 82 + code = code_msg.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR
83 return 83 return
84 } 84 }
85 } 85 }
@@ -88,7 +88,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH @@ -88,7 +88,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH
88 gameData := LoadData(req.GameID, req.UID, config) 88 gameData := LoadData(req.GameID, req.UID, config)
89 // 检查游戏数据 轮次等 89 // 检查游戏数据 轮次等
90 code = CheckGameData(gameData, config) 90 code = CheckGameData(gameData, config)
91 - if code != constd.RECODE_OK { 91 + if code != code_msg.RECODE_OK {
92 return 92 return
93 } 93 }
94 94
@@ -136,24 +136,24 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model @@ -136,24 +136,24 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model
136 NewCards: make([]int, 0), 136 NewCards: make([]int, 0),
137 AwardAlbum: make(map[int]string), 137 AwardAlbum: make(map[int]string),
138 } 138 }
139 - code = constd.RECODE_OK 139 + code = code_msg.RECODE_OK
140 140
141 // 尝试更新配置 141 // 尝试更新配置
142 config, hasConfig := configs.GetCardActivityConfig(req.GameID) 142 config, hasConfig := configs.GetCardActivityConfig(req.GameID)
143 if !hasConfig { 143 if !hasConfig {
144 - code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR 144 + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
145 return 145 return
146 } 146 }
147 147
148 // 检查活动状态 148 // 检查活动状态
149 code = CheckStatus(config) 149 code = CheckStatus(config)
150 - if code != constd.RECODE_OK { 150 + if code != code_msg.RECODE_OK {
151 return 151 return
152 } 152 }
153 // 检查星星商店ID 153 // 检查星星商店ID
154 confStarShop, okStarShopConfig := config.StarShopConfig[req.Id] 154 confStarShop, okStarShopConfig := config.StarShopConfig[req.Id]
155 if !okStarShopConfig { 155 if !okStarShopConfig {
156 - code = constd.RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR 156 + code = code_msg.RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR
157 return 157 return
158 } 158 }
159 159
@@ -161,39 +161,39 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model @@ -161,39 +161,39 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model
161 gameData := LoadData(req.GameID, req.UID, config) 161 gameData := LoadData(req.GameID, req.UID, config)
162 // 检查游戏数据 轮次等 162 // 检查游戏数据 轮次等
163 code = CheckGameData(gameData, config) 163 code = CheckGameData(gameData, config)
164 - if code != constd.RECODE_OK { 164 + if code != code_msg.RECODE_OK {
165 return 165 return
166 } 166 }
167 167
168 // 判断星星数是否足够 168 // 判断星星数是否足够
169 if gameData.Details.StarCount < confStarShop.NeedStarNumber { 169 if gameData.Details.StarCount < confStarShop.NeedStarNumber {
170 - code = constd.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR 170 + code = code_msg.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR
171 return 171 return
172 } 172 }
173 173
174 // 判断配置 174 // 判断配置
175 if len(confStarShop.CardBagIds) < 3 { 175 if len(confStarShop.CardBagIds) < 3 {
176 lxalilog.Errors("StarShopConfig.CardBagIds error", confStarShop.Id) 176 lxalilog.Errors("StarShopConfig.CardBagIds error", confStarShop.Id)
177 - code = constd.RECODE_MERGE_CONFIG_ERROR 177 + code = code_msg.RECODE_MERGE_CONFIG_ERROR
178 return 178 return
179 } 179 }
180 cardholderId := confStarShop.CardBagIds[1] 180 cardholderId := confStarShop.CardBagIds[1]
181 cardholderCount := confStarShop.CardBagIds[2] 181 cardholderCount := confStarShop.CardBagIds[2]
182 if cardholderCount < 1 { 182 if cardholderCount < 1 {
183 lxalilog.Errors("StarShopConfig.CardBagIds error", confStarShop.Id) 183 lxalilog.Errors("StarShopConfig.CardBagIds error", confStarShop.Id)
184 - code = constd.RECODE_MERGE_CONFIG_ERROR 184 + code = code_msg.RECODE_MERGE_CONFIG_ERROR
185 return 185 return
186 } 186 }
187 confCardholder, okCardholder := config.CardholderConfig[strconv.Itoa(cardholderId)] 187 confCardholder, okCardholder := config.CardholderConfig[strconv.Itoa(cardholderId)]
188 if !okCardholder { 188 if !okCardholder {
189 - code = constd.RECODE_MERGE_CONFIG_ERROR 189 + code = code_msg.RECODE_MERGE_CONFIG_ERROR
190 return 190 return
191 } 191 }
192 192
193 // 按照规则扣除星星 193 // 按照规则扣除星星
194 enough, cardList := GetStarCardList(gameData, config, confStarShop.NeedStarNumber) 194 enough, cardList := GetStarCardList(gameData, config, confStarShop.NeedStarNumber)
195 if !enough { 195 if !enough {
196 - code = constd.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR 196 + code = code_msg.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR
197 return 197 return
198 } 198 }
199 for i, i2 := range cardList { 199 for i, i2 := range cardList {
@@ -242,18 +242,18 @@ func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp m @@ -242,18 +242,18 @@ func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp m
242 AwardAlbum: make(map[int]string), 242 AwardAlbum: make(map[int]string),
243 AutoExchangeHolder: make([]int, 0), 243 AutoExchangeHolder: make([]int, 0),
244 } 244 }
245 - code = constd.RECODE_OK 245 + code = code_msg.RECODE_OK
246 246
247 // 尝试更新配置 247 // 尝试更新配置
248 config, hasConfig := configs.GetCardActivityConfig(req.GameID) 248 config, hasConfig := configs.GetCardActivityConfig(req.GameID)
249 if !hasConfig { 249 if !hasConfig {
250 - code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR 250 + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR
251 return 251 return
252 } 252 }
253 253
254 // 检查活动状态 254 // 检查活动状态
255 code = CheckStatus(config) 255 code = CheckStatus(config)
256 - if code != constd.RECODE_OK { 256 + if code != code_msg.RECODE_OK {
257 return 257 return
258 } 258 }
259 259
@@ -261,12 +261,12 @@ func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp m @@ -261,12 +261,12 @@ func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp m
261 gameData := LoadData(req.GameID, req.UID, config) 261 gameData := LoadData(req.GameID, req.UID, config)
262 // 检查游戏数据 轮次等 262 // 检查游戏数据 轮次等
263 code = CheckGameData(gameData, config) 263 code = CheckGameData(gameData, config)
264 - if code != constd.RECODE_OK { 264 + if code != code_msg.RECODE_OK {
265 return 265 return
266 } 266 }
267 267
268 if gameData.Details.LastStarCount <= 0 { 268 if gameData.Details.LastStarCount <= 0 {
269 - code = constd.RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR 269 + code = code_msg.RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR
270 return 270 return
271 } 271 }
272 272
service/cardholder/init.go
1 package cardholder 1 package cardholder
2 2
3 import ( 3 import (
4 - "apigame/common/svconst"  
5 - "apigame/common/svmysql" 4 + "apigame/service-common/svconst"
  5 + "apigame/service-common/svmysql"
6 ) 6 )
7 7
8 func Init() { 8 func Init() {
service/cardholder/logic.go
1 package cardholder 1 package cardholder
2 2
3 import ( 3 import (
4 - "apigame/common/svmysql"  
5 "apigame/configs" 4 "apigame/configs"
6 "apigame/models" 5 "apigame/models"
7 - "apigame/service/constd" 6 + "apigame/service-common/svmysql"
  7 + "apigame/service/code-msg"
8 "apigame/util/util-lx/lxalilog" 8 "apigame/util/util-lx/lxalilog"
9 "apigame/util/util-lx/lxtime" 9 "apigame/util/util-lx/lxtime"
10 "apigame/util/utjson" 10 "apigame/util/utjson"
@@ -65,23 +65,23 @@ func LoadData(gameId string, uid int64, config *configs.CardActivityConfig) (d * @@ -65,23 +65,23 @@ func LoadData(gameId string, uid int64, config *configs.CardActivityConfig) (d *
65 func CheckStatus(conf *configs.CardActivityConfig) string { 65 func CheckStatus(conf *configs.CardActivityConfig) string {
66 sec := lxtime.NowUninx() 66 sec := lxtime.NowUninx()
67 if conf.Id == 0 { 67 if conf.Id == 0 {
68 - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR 68 + return code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR
69 } 69 }
70 if sec < conf.StartTime { 70 if sec < conf.StartTime {
71 - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR 71 + return code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR
72 } 72 }
73 if sec > conf.EndTime { 73 if sec > conf.EndTime {
74 - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR 74 + return code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR
75 } 75 }
76 - return constd.RECODE_OK 76 + return code_msg.RECODE_OK
77 } 77 }
78 78
79 // CheckGameData 检查游戏数据 轮次等 79 // CheckGameData 检查游戏数据 轮次等
80 func CheckGameData(d *DataCardHolder, conf *configs.CardActivityConfig) string { 80 func CheckGameData(d *DataCardHolder, conf *configs.CardActivityConfig) string {
81 if d.Details.Round > conf.Round { 81 if d.Details.Round > conf.Round {
82 - return constd.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR 82 + return code_msg.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR
83 } 83 }
84 - return constd.RECODE_OK 84 + return code_msg.RECODE_OK
85 } 85 }
86 86
87 // GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort) 87 // GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort)
service/code-msg/code-msg.go 0 → 100644
@@ -0,0 +1,121 @@ @@ -0,0 +1,121 @@
  1 +package code_msg
  2 +
  3 +import (
  4 + "apigame/util/util-lx/lxalilog"
  5 + "apigame/util/util-lx/lxtime"
  6 +)
  7 +
  8 +const (
  9 + RECODE_OK = "0"
  10 + RECODE_FALIED = "1000"
  11 + RECODE_UNKNOWERR = "1001"
  12 + RECODE_PARAMERROR = "1002"
  13 + RECODE_SIGNERROR = "1003"
  14 + RECODE_DATA_BUCUNZIA_ERROR = "1004"
  15 + RECODE_PARAMDECODE_ERROR = "1005"
  16 + RECODE_DATANOEXIST_ERROR = "1006"
  17 + RECODE_CREATEUID_ERROR = "1007"
  18 + RECODE_LOGINCHECK_ERROR = "1008"
  19 + RECODE_WEIXINAZIFU_ERROR = "1009"
  20 + RECODE_SDKMEMBER_ERROR = "1010"
  21 + RECODE_CAOZUOPINFAN_ERROR = "1011"
  22 + RECODE_REQUESTXIANLIU_ERROR = "1110"
  23 + RECODE_REQUESTTIME_ERROR = "1111"
  24 +
  25 + RECODE_MERGE_CONFIG_ERROR = "2000"
  26 + RECODE_MERGE_CFLQ_ERROR = "2001"
  27 + RECODE_MERGE_AZSXLQ_ERROR = "2002"
  28 + RECODE_MERGE_QXGMSP_ERROR = "2003"
  29 + RECODE_MERGE_MEMBERSHIP_QXCZZK_ERROR = "2010"
  30 + RECODE_MERGE_MEMBERSHIP_QXCZYK_ERROR = "2011"
  31 + RECODE_MERGE_MEMBERSHIP_QXCZ_ERROR = "2012"
  32 + RECODE_MERGE_MEMBERSHIP_BNCFLQ_ERROR = "2013"
  33 +
  34 + RECODE_MERGE_NOVICE_QXCZ_ERROR = "2021"
  35 + RECODE_MERGE_NOVICE_BNCFLQ_ERROR = "2032"
  36 + RECODE_MERGE_NOVICE_MYDDLQTJ_ERROR = "2033"
  37 + RECODE_MERGE_HUODONGWEIKAISHI_ERROR = "2040"
  38 + RECODE_MERGE_HUODONGYIJIESHU_ERROR = "2041"
  39 + RECODE_MERGE_CCZDXX_ERROR = "2042"
  40 + RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR = "2051"
  41 + RECODE_MERGE_QINGXIANGMTXZ_ERROR = "2052"
  42 +
  43 + RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR = "2100"
  44 + RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR = "2101"
  45 + RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR = "2102"
  46 + RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR = "2103"
  47 + RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR = "2104"
  48 + RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105"
  49 + RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106"
  50 + RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR = "2107"
  51 +)
  52 +
  53 +var recodeText = map[string]string{
  54 + RECODE_OK: "成功",
  55 + RECODE_FALIED: "操作失败",
  56 + RECODE_UNKNOWERR: "未知错误",
  57 + RECODE_PARAMERROR: "参数错误",
  58 + RECODE_SIGNERROR: "签名错误",
  59 + RECODE_DATA_BUCUNZIA_ERROR: "数据不存在",
  60 + RECODE_PARAMDECODE_ERROR: "解析参数失败,请检查参数合法性",
  61 + RECODE_DATANOEXIST_ERROR: "数据不存在",
  62 + RECODE_CREATEUID_ERROR: "创建用户UID失败",
  63 + RECODE_LOGINCHECK_ERROR: "登录验证失败,请重新登录",
  64 + RECODE_WEIXINAZIFU_ERROR: "参数存在危险字符",
  65 + RECODE_SDKMEMBER_ERROR: "获取SDK用户信息失败",
  66 + RECODE_CAOZUOPINFAN_ERROR: "操作频繁",
  67 + RECODE_REQUESTXIANLIU_ERROR: "操作被限流",
  68 + RECODE_REQUESTTIME_ERROR: "time errors",
  69 +
  70 + RECODE_MERGE_CONFIG_ERROR: "获取配置文件错误",
  71 + RECODE_MERGE_CFLQ_ERROR: "不能重复领取",
  72 + RECODE_MERGE_AZSXLQ_ERROR: "请按照顺序领取",
  73 + RECODE_MERGE_QXGMSP_ERROR: "请先购买对应商品",
  74 +
  75 + RECODE_MERGE_MEMBERSHIP_QXCZZK_ERROR: "请先购买周卡",
  76 + RECODE_MERGE_MEMBERSHIP_QXCZYK_ERROR: "请先购买月卡",
  77 + RECODE_MERGE_MEMBERSHIP_QXCZ_ERROR: "请先购买对应商品",
  78 + RECODE_MERGE_MEMBERSHIP_BNCFLQ_ERROR: "不能重复领取",
  79 +
  80 + RECODE_MERGE_NOVICE_QXCZ_ERROR: "请先购买对应商品",
  81 + RECODE_MERGE_NOVICE_BNCFLQ_ERROR: "不能重复领取",
  82 + RECODE_MERGE_NOVICE_MYDDLQTJ_ERROR: "没有达到领取条件",
  83 +
  84 + RECODE_MERGE_HUODONGWEIKAISHI_ERROR: "活动未开始",
  85 + RECODE_MERGE_HUODONGYIJIESHU_ERROR: "活动已结束",
  86 + RECODE_MERGE_CCZDXX_ERROR: "超出最大限制",
  87 +
  88 + RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR: "通行证不存在",
  89 + RECODE_MERGE_QINGXIANGMTXZ_ERROR: "请先购买通行证",
  90 +
  91 + RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR: "活动未开放",
  92 + RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR: "活动未开始",
  93 + RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR: "活动已结束",
  94 + RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR: "活动轮次已全部完成",
  95 + RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR: "卡包ID错误",
  96 + RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误",
  97 + RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足",
  98 + RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR: "没有星星商店自动兑换信息",
  99 +}
  100 +
  101 +func RecodeText(code string) string {
  102 + str, ok := recodeText[code]
  103 + if ok {
  104 + return str
  105 + }
  106 + return RecodeText(RECODE_UNKNOWERR)
  107 +}
  108 +
  109 +func CodeMsg(data map[string]interface{}, code interface{}) map[string]interface{} {
  110 + data["code"] = code
  111 + data["msg"] = RecodeText(code.(string))
  112 + lxtime.NowUninx()
  113 + data["servertime"] = lxtime.NowUninx()
  114 + return data
  115 +}
  116 +
  117 +func CodeMsgLog(data map[string]interface{}, code interface{}, log ...interface{}) map[string]interface{} {
  118 + // 写入日志
  119 + lxalilog.ErrorCode(code, log)
  120 + return CodeMsg(data, code)
  121 +}
service/constd/code-msg.go
@@ -1,121 +0,0 @@ @@ -1,121 +0,0 @@
1 -package constd  
2 -  
3 -import (  
4 - "apigame/util/util-lx/lxalilog"  
5 - "apigame/util/util-lx/lxtime"  
6 -)  
7 -  
8 -const (  
9 - RECODE_OK = "0"  
10 - RECODE_FALIED = "1000"  
11 - RECODE_UNKNOWERR = "1001"  
12 - RECODE_PARAMERROR = "1002"  
13 - RECODE_SIGNERROR = "1003"  
14 - RECODE_DATA_BUCUNZIA_ERROR = "1004"  
15 - RECODE_PARAMDECODE_ERROR = "1005"  
16 - RECODE_DATANOEXIST_ERROR = "1006"  
17 - RECODE_CREATEUID_ERROR = "1007"  
18 - RECODE_LOGINCHECK_ERROR = "1008"  
19 - RECODE_WEIXINAZIFU_ERROR = "1009"  
20 - RECODE_SDKMEMBER_ERROR = "1010"  
21 - RECODE_CAOZUOPINFAN_ERROR = "1011"  
22 - RECODE_REQUESTXIANLIU_ERROR = "1110"  
23 - RECODE_REQUESTTIME_ERROR = "1111"  
24 -  
25 - RECODE_MERGE_CONFIG_ERROR = "2000"  
26 - RECODE_MERGE_CFLQ_ERROR = "2001"  
27 - RECODE_MERGE_AZSXLQ_ERROR = "2002"  
28 - RECODE_MERGE_QXGMSP_ERROR = "2003"  
29 - RECODE_MERGE_MEMBERSHIP_QXCZZK_ERROR = "2010"  
30 - RECODE_MERGE_MEMBERSHIP_QXCZYK_ERROR = "2011"  
31 - RECODE_MERGE_MEMBERSHIP_QXCZ_ERROR = "2012"  
32 - RECODE_MERGE_MEMBERSHIP_BNCFLQ_ERROR = "2013"  
33 -  
34 - RECODE_MERGE_NOVICE_QXCZ_ERROR = "2021"  
35 - RECODE_MERGE_NOVICE_BNCFLQ_ERROR = "2032"  
36 - RECODE_MERGE_NOVICE_MYDDLQTJ_ERROR = "2033"  
37 - RECODE_MERGE_HUODONGWEIKAISHI_ERROR = "2040"  
38 - RECODE_MERGE_HUODONGYIJIESHU_ERROR = "2041"  
39 - RECODE_MERGE_CCZDXX_ERROR = "2042"  
40 - RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR = "2051"  
41 - RECODE_MERGE_QINGXIANGMTXZ_ERROR = "2052"  
42 -  
43 - RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR = "2100"  
44 - RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR = "2101"  
45 - RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR = "2102"  
46 - RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR = "2103"  
47 - RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR = "2104"  
48 - RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105"  
49 - RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106"  
50 - RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR = "2107"  
51 -)  
52 -  
53 -var recodeText = map[string]string{  
54 - RECODE_OK: "成功",  
55 - RECODE_FALIED: "操作失败",  
56 - RECODE_UNKNOWERR: "未知错误",  
57 - RECODE_PARAMERROR: "参数错误",  
58 - RECODE_SIGNERROR: "签名错误",  
59 - RECODE_DATA_BUCUNZIA_ERROR: "数据不存在",  
60 - RECODE_PARAMDECODE_ERROR: "解析参数失败,请检查参数合法性",  
61 - RECODE_DATANOEXIST_ERROR: "数据不存在",  
62 - RECODE_CREATEUID_ERROR: "创建用户UID失败",  
63 - RECODE_LOGINCHECK_ERROR: "登录验证失败,请重新登录",  
64 - RECODE_WEIXINAZIFU_ERROR: "参数存在危险字符",  
65 - RECODE_SDKMEMBER_ERROR: "获取SDK用户信息失败",  
66 - RECODE_CAOZUOPINFAN_ERROR: "操作频繁",  
67 - RECODE_REQUESTXIANLIU_ERROR: "操作被限流",  
68 - RECODE_REQUESTTIME_ERROR: "time errors",  
69 -  
70 - RECODE_MERGE_CONFIG_ERROR: "获取配置文件错误",  
71 - RECODE_MERGE_CFLQ_ERROR: "不能重复领取",  
72 - RECODE_MERGE_AZSXLQ_ERROR: "请按照顺序领取",  
73 - RECODE_MERGE_QXGMSP_ERROR: "请先购买对应商品",  
74 -  
75 - RECODE_MERGE_MEMBERSHIP_QXCZZK_ERROR: "请先购买周卡",  
76 - RECODE_MERGE_MEMBERSHIP_QXCZYK_ERROR: "请先购买月卡",  
77 - RECODE_MERGE_MEMBERSHIP_QXCZ_ERROR: "请先购买对应商品",  
78 - RECODE_MERGE_MEMBERSHIP_BNCFLQ_ERROR: "不能重复领取",  
79 -  
80 - RECODE_MERGE_NOVICE_QXCZ_ERROR: "请先购买对应商品",  
81 - RECODE_MERGE_NOVICE_BNCFLQ_ERROR: "不能重复领取",  
82 - RECODE_MERGE_NOVICE_MYDDLQTJ_ERROR: "没有达到领取条件",  
83 -  
84 - RECODE_MERGE_HUODONGWEIKAISHI_ERROR: "活动未开始",  
85 - RECODE_MERGE_HUODONGYIJIESHU_ERROR: "活动已结束",  
86 - RECODE_MERGE_CCZDXX_ERROR: "超出最大限制",  
87 -  
88 - RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR: "通行证不存在",  
89 - RECODE_MERGE_QINGXIANGMTXZ_ERROR: "请先购买通行证",  
90 -  
91 - RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR: "活动未开放",  
92 - RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR: "活动未开始",  
93 - RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR: "活动已结束",  
94 - RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR: "活动轮次已全部完成",  
95 - RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR: "卡包ID错误",  
96 - RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误",  
97 - RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足",  
98 - RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR: "没有星星商店自动兑换信息",  
99 -}  
100 -  
101 -func RecodeText(code string) string {  
102 - str, ok := recodeText[code]  
103 - if ok {  
104 - return str  
105 - }  
106 - return RecodeText(RECODE_UNKNOWERR)  
107 -}  
108 -  
109 -func CodeMsg(data map[string]interface{}, code interface{}) map[string]interface{} {  
110 - data["code"] = code  
111 - data["msg"] = RecodeText(code.(string))  
112 - lxtime.NowUninx()  
113 - data["servertime"] = lxtime.NowUninx()  
114 - return data  
115 -}  
116 -  
117 -func CodeMsgLog(data map[string]interface{}, code interface{}, log ...interface{}) map[string]interface{} {  
118 - // 写入日志  
119 - lxalilog.ErrorCode(code, log)  
120 - return CodeMsg(data, code)  
121 -}  
service/constd/mysql.go
@@ -1,21 +0,0 @@ @@ -1,21 +0,0 @@
1 -package constd  
2 -  
3 -// mysql  
4 -// 创建时间:2023/4/3 15:28  
5 -// 创建人:lixu  
6 -  
7 -const (  
8 - MYSQL_DEFAULT = "default"  
9 - MYSQL_DBAPI = "api"  
10 - MYSQL_MERGECOMMON = "merge_common"  
11 - MYSQL_MERGECONFIG = "merge_config"  
12 - MYSQL_DEFAULT_QUERY_MAXCOUNT = 100  
13 -  
14 - MYSQL_TABLE_S_CARDHOLDER_CONFIG = "s_card_activity_" // 开卡包活动配置  
15 - MYSQL_TABLE_S_CARDHOLDER_DATA = "s_cardholder_data_" // 开卡包活动数据  
16 - MYSQL_TABLE_S_CARDHOLDER_RECORD_GETNEW = "s_cardholder_record_getnew_" // 开卡包活动日志获得卡包  
17 - MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN = "s_cardholder_record_open_" // 开卡包活动日志开卡包  
18 - MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM = "s_cardholder_record_rewardalbum_" // 开卡包活动日志领取卡组奖励  
19 - MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND = "s_cardholder_record_rewardround_" // 开卡包活动日志领取轮次奖励  
20 -  
21 -)  
util/utdto/base.go
@@ -1,44 +0,0 @@ @@ -1,44 +0,0 @@
1 -package utdto  
2 -  
3 -import (  
4 - "gorm.io/gorm"  
5 - "strings"  
6 -)  
7 -  
8 -// Insert 插入  
9 -func Insert(db *gorm.DB, value any, tableName string) *gorm.DB {  
10 - stmt := db.Session(&gorm.Session{DryRun: true}).Create(value).Statement  
11 - stmtSQL := stmt.SQL.String()  
12 - sql := strings.Replace(stmtSQL, MYSQL_TABLE_TEMPLATE, tableName, -1)  
13 - return db.Exec(sql, stmt.Vars...)  
14 -}  
15 -  
16 -// Update 更新  
17 -func Update(db *gorm.DB, value any, tableName string) *gorm.DB {  
18 - stmt := db.Session(&gorm.Session{DryRun: true}).Updates(value).Statement  
19 - stmtSQL := stmt.SQL.String()  
20 - sql := strings.Replace(stmtSQL, MYSQL_TABLE_TEMPLATE, tableName, -1)  
21 - return db.Exec(sql, stmt.Vars...)  
22 -}  
23 -  
24 -// Save 保存  
25 -func Save(db *gorm.DB, value any, tableName string) *gorm.DB {  
26 - stmt := db.Session(&gorm.Session{DryRun: true}).Save(value).Statement  
27 - stmtSQL := stmt.SQL.String()  
28 - sql := strings.Replace(stmtSQL, MYSQL_TABLE_TEMPLATE, tableName, -1)  
29 - return db.Exec(sql, stmt.Vars...)  
30 -}  
31 -  
32 -func First(db *gorm.DB, value any, tableName string) *gorm.DB {  
33 - stmt := db.Session(&gorm.Session{DryRun: true}).First(value).Statement  
34 - stmtSQL := stmt.SQL.String()  
35 - sql := strings.Replace(stmtSQL, MYSQL_TABLE_TEMPLATE, tableName, -1)  
36 - return db.Raw(sql, stmt.Vars...).Scan(value)  
37 -}  
38 -  
39 -func Find(db *gorm.DB, value any, tableName string) *gorm.DB {  
40 - stmt := db.Session(&gorm.Session{DryRun: true}).Find(value).Statement  
41 - stmtSQL := stmt.SQL.String()  
42 - sql := strings.Replace(stmtSQL, MYSQL_TABLE_TEMPLATE, tableName, -1)  
43 - return db.Raw(sql, stmt.Vars...).Scan(value)  
44 -}  
util/utdto/mysql.go
@@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
1 -package utdto  
2 -  
3 -import (  
4 - "gorm.io/driver/mysql"  
5 - "gorm.io/gorm"  
6 -)  
7 -  
8 -const MYSQL_TABLE_TEMPLATE = "all_table_template" // 表名模板  
9 -  
10 -func ConnectMySQL(dsn string) (db *gorm.DB, err error) {  
11 - return gorm.Open(mysql.Open(dsn), &gorm.Config{})  
12 -}  
util/utdto/table.go
@@ -1,132 +0,0 @@ @@ -1,132 +0,0 @@
1 -package utdto  
2 -  
3 -import (  
4 - "fmt"  
5 - "gorm.io/driver/mysql"  
6 - "gorm.io/gorm"  
7 - "gorm.io/gorm/clause"  
8 - "gorm.io/gorm/migrator"  
9 - "strings"  
10 -)  
11 -  
12 -func InitTable(db *gorm.DB, value any, tableName string) {  
13 - m := db.Migrator().(mysql.Migrator).Migrator  
14 - queryTx, execTx := m.GetQueryAndExecTx()  
15 - if HasTable(queryTx.Migrator().(mysql.Migrator).Migrator, value, tableName) {  
16 - fmt.Println(tableName + " exist, skip!")  
17 - } else {  
18 - err := CreateTable(execTx, value, tableName)  
19 - if err != nil {  
20 - fmt.Println("err", err)  
21 - }  
22 - }  
23 -}  
24 -  
25 -func HasTable(m migrator.Migrator, value interface{}, tableName string) bool {  
26 - var count int64  
27 -  
28 - m.RunWithValue(value, func(stmt *gorm.Statement) error {  
29 - currentDatabase := m.DB.Migrator().CurrentDatabase()  
30 - return m.DB.Raw("SELECT count(*) FROM information_schema.tables WHERE table_schema = ? AND table_name = ? AND table_type = ?", currentDatabase, tableName, "BASE TABLE").Row().Scan(&count)  
31 - })  
32 -  
33 - return count > 0  
34 -}  
35 -  
36 -func CreateTable(execTx *gorm.DB, value any, tableName string) error {  
37 - m := execTx.Migrator().(mysql.Migrator).Migrator  
38 - tx := m.DB.Session(&gorm.Session{})  
39 -  
40 - if err := m.RunWithValue(value, func(stmt *gorm.Statement) (err error) {  
41 - var (  
42 - createTableSQL = "CREATE TABLE ? ("  
43 - values = []interface{}{clause.Table{Name: tableName}}  
44 - hasPrimaryKeyInDataType bool  
45 - )  
46 -  
47 - for _, dbName := range stmt.Schema.DBNames {  
48 - field := stmt.Schema.FieldsByDBName[dbName]  
49 - if !field.IgnoreMigration {  
50 - createTableSQL += "? ?"  
51 - hasPrimaryKeyInDataType = hasPrimaryKeyInDataType || strings.Contains(strings.ToUpper(m.DataTypeOf(field)), "PRIMARY KEY")  
52 - values = append(values, clause.Column{Name: dbName}, m.DB.Migrator().FullDataTypeOf(field))  
53 - createTableSQL += ","  
54 - }  
55 - }  
56 -  
57 - if !hasPrimaryKeyInDataType && len(stmt.Schema.PrimaryFields) > 0 {  
58 - createTableSQL += "PRIMARY KEY ?,"  
59 - primaryKeys := make([]interface{}, 0, len(stmt.Schema.PrimaryFields))  
60 - for _, field := range stmt.Schema.PrimaryFields {  
61 - primaryKeys = append(primaryKeys, clause.Column{Name: field.DBName})  
62 - }  
63 -  
64 - values = append(values, primaryKeys)  
65 - }  
66 -  
67 - for _, idx := range stmt.Schema.ParseIndexes() {  
68 - if m.CreateIndexAfterCreateTable {  
69 - defer func(value interface{}, name string) {  
70 - if err == nil {  
71 - err = tx.Migrator().CreateIndex(value, name)  
72 - }  
73 - }(value, idx.Name)  
74 - } else {  
75 - if idx.Class != "" {  
76 - createTableSQL += idx.Class + " "  
77 - }  
78 - createTableSQL += "INDEX ? ?"  
79 -  
80 - if idx.Comment != "" {  
81 - createTableSQL += fmt.Sprintf(" COMMENT '%s'", idx.Comment)  
82 - }  
83 -  
84 - if idx.Option != "" {  
85 - createTableSQL += " " + idx.Option  
86 - }  
87 -  
88 - createTableSQL += ","  
89 - values = append(values, clause.Column{Name: idx.Name}, tx.Migrator().(migrator.BuildIndexOptionsInterface).BuildIndexOptions(idx.Fields, stmt))  
90 - }  
91 - }  
92 -  
93 - if !m.DB.DisableForeignKeyConstraintWhenMigrating && !m.DB.IgnoreRelationshipsWhenMigrating {  
94 - for _, rel := range stmt.Schema.Relationships.Relations {  
95 - if rel.Field.IgnoreMigration {  
96 - continue  
97 - }  
98 - if constraint := rel.ParseConstraint(); constraint != nil {  
99 - if constraint.Schema == stmt.Schema {  
100 - sql, vars := constraint.Build()  
101 - createTableSQL += sql + ","  
102 - values = append(values, vars...)  
103 - }  
104 - }  
105 - }  
106 - }  
107 -  
108 - for _, uni := range stmt.Schema.ParseUniqueConstraints() {  
109 - createTableSQL += "CONSTRAINT ? UNIQUE (?),"  
110 - values = append(values, clause.Column{Name: uni.Name}, clause.Expr{SQL: stmt.Quote(uni.Field.DBName)})  
111 - }  
112 -  
113 - for _, chk := range stmt.Schema.ParseCheckConstraints() {  
114 - createTableSQL += "CONSTRAINT ? CHECK (?),"  
115 - values = append(values, clause.Column{Name: chk.Name}, clause.Expr{SQL: chk.Constraint})  
116 - }  
117 -  
118 - createTableSQL = strings.TrimSuffix(createTableSQL, ",")  
119 -  
120 - createTableSQL += ")"  
121 -  
122 - if tableOption, ok := m.DB.Get("gorm:table_options"); ok {  
123 - createTableSQL += fmt.Sprint(tableOption)  
124 - }  
125 -  
126 - err = tx.Exec(createTableSQL, values...).Error  
127 - return err  
128 - }); err != nil {  
129 - return err  
130 - }  
131 - return nil  
132 -}