diff --git a/README.md b/README.md index d4c00a5..b4bbfce 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,21 @@ ## 项目目录结构 -| 项目目录 | 目录说明 | -|-------------|----------| -| conf | beego配置 | -| controllers | 控制器 | -| dto | 数据库存储对象 | -| models | 与客户端传输对象 | -| routers | 路由 | -| sdk | SDK | -| service | 游戏服务器逻辑 | -| sign | 签名 | -| util | 公共库 | -| util-lx | 公共库(李旭) | +| 项目目录 | 目录说明 | +|----------------|----------| +| conf | beego配置 | +| configs | 游戏配置处理 | +| controllers | 控制器 | +| middleware | 中间件 | +| models | 与客户端传输对象 | +| routers | 路由 | +| service-common | 服务器公共模块 | +| service | 游戏服务器逻辑 | +| util | 公共库 | +| util-lx | 公共库(李旭) | ## 游戏和游戏功能列表 -| 功能模块名 | 所属功能 | 负责人 | -|---------------|------|-----| +| 功能模块名 | 所属功能 | 负责人 | +|------------|------|-----| | cardholder | 卡包卡牌 | 王家文 | diff --git a/common/svconst/consts.go b/common/svconst/consts.go deleted file mode 100644 index 7e1c15f..0000000 --- a/common/svconst/consts.go +++ /dev/null @@ -1 +0,0 @@ -package svconst diff --git a/common/svconst/vars.go b/common/svconst/vars.go deleted file mode 100644 index c2c254a..0000000 --- a/common/svconst/vars.go +++ /dev/null @@ -1,13 +0,0 @@ -package svconst - -import "gorm.io/gorm" - -var ( - AppName = "" - - DbApi *gorm.DB - DbCommon *gorm.DB - DbConfig *gorm.DB - - GameListCardHolder = []string{"10149"} -) diff --git a/common/svdto/dto.go b/common/svdto/dto.go deleted file mode 100644 index 39630e2..0000000 --- a/common/svdto/dto.go +++ /dev/null @@ -1,68 +0,0 @@ -package svdto - -import ( - "apigame/util/utdto" - "apigame/util/util-lx/lxalilog" -) - -func InitTable(tb IDtoData, gameId string) { - rule := tb.GetRule(gameId) - utdto.InitTable(rule.DbMysql, tb, rule.TableName) -} - -func Insert(data IDtoData, gameId string) (err error) { - rule := data.GetRule(gameId) - result := utdto.Insert(rule.DbMysql, data, rule.TableName) - err = result.Error - if err != nil { - lxalilog.Errors(err, gameId) - return - } - return -} - -func Update(data IDtoData, gameId string) (err error) { - rule := data.GetRule(gameId) - result := utdto.Update(rule.DbMysql, data, rule.TableName) - err = result.Error - if err != nil { - lxalilog.Errors(err, gameId) - return - } - return -} - -func Save(data IDtoData, gameId string) (err error) { - rule := data.GetRule(gameId) - result := utdto.Save(rule.DbMysql, data, rule.TableName) - err = result.Error - if err != nil { - lxalilog.Errors(err, gameId) - return - } - return -} - -func First(data IDtoData, gameId string) (has bool, err error) { - rule := data.GetRule(gameId) - result := utdto.First(rule.DbMysql, data, rule.TableName) - has = result.RowsAffected != 0 - err = result.Error - if err != nil { - lxalilog.Errors(err, gameId) - return - } - return -} - -func Find(data any, dataTemp IDtoData, gameId string) (has bool, err error) { - rule := dataTemp.GetRule(gameId) - result := utdto.Find(rule.DbMysql, data, rule.TableName) - has = result.RowsAffected != 0 - err = result.Error - if err != nil { - lxalilog.Errors(err, rule.TableName) - return - } - return -} diff --git a/common/svdto/init.go b/common/svdto/init.go deleted file mode 100644 index 61eee7b..0000000 --- a/common/svdto/init.go +++ /dev/null @@ -1,2 +0,0 @@ -package svdto - diff --git a/common/svdto/interface.go b/common/svdto/interface.go deleted file mode 100644 index fb3e7a2..0000000 --- a/common/svdto/interface.go +++ /dev/null @@ -1,23 +0,0 @@ -package svdto - -import "gorm.io/gorm" - -const ( - REDIS_CACHEP_REFIX = "apigame" // 缓存前缀 -) - -// DtoRule dto参数 -type DtoRule struct { - DbMysql *gorm.DB - TableName string - CacheKey string - CacheTime int -} - -// IDtoData dto数据 -type IDtoData interface { - // TableName 表名模板 - TableName() string - // GetRule 表名模板 - GetRule(gameId string) *DtoRule -} diff --git a/common/svdto/record.go b/common/svdto/record.go deleted file mode 100644 index 274e2d3..0000000 --- a/common/svdto/record.go +++ /dev/null @@ -1,10 +0,0 @@ -package svdto - -import ( - "apigame/util/utdto" -) - -func SaveRecord(gameId string, data IDtoData) { - rule := data.GetRule(gameId) - utdto.Insert(rule.DbMysql, data, rule.TableName) -} diff --git a/common/svlog/ali-log.go b/common/svlog/ali-log.go deleted file mode 100644 index e83c11a..0000000 --- a/common/svlog/ali-log.go +++ /dev/null @@ -1,40 +0,0 @@ -package svlog - -import ( - "apigame/util/util-lx/lxalilog" - "fmt" - "github.com/astaxie/beego" - lalilog "github.com/lixu-any/go-tools/ali/log" -) - -func InitAliLog(appName string) { - - //初始化阿里云日志 - logm, _ := beego.AppConfig.GetSection("alilog") - lxalilog.InitAliLog(lxalilog.MapAlilogConfig{ - Endpoint: logm["endpoint"], - AccessKeyId: logm["accesskeyid"], - AccessKeySecret: logm["accesskeysecret"], - Project: logm["project"], - AppNaame: appName, - On: logm["on"], - Debug: logm["debug"], - TableError: "api_code_merge", - TableDebug: logm["tabledebug"], - Env: beego.AppConfig.String("env"), - }) - - lalilog.InitAliLog(lalilog.MapAlilogConfig{ - Endpoint: logm["endpoint"], - AccessKeyId: logm["accesskeyid"], - AccessKeySecret: logm["accesskeysecret"], - Project: logm["project"], - On: logm["on"], - Debug: logm["debug"], - TableError: logm["tableerror"], - TableDebug: logm["tabledebug"], - Env: beego.AppConfig.String("env"), - }) - - fmt.Println(appName + " alilog init success") -} diff --git a/common/svlog/log.go b/common/svlog/log.go deleted file mode 100644 index 4c34d40..0000000 --- a/common/svlog/log.go +++ /dev/null @@ -1,22 +0,0 @@ -package svlog - -import ( - "apigame/common/svconst" - "apigame/util/util-lx/lxbeego" - "fmt" - "github.com/astaxie/beego" -) - -func Init() { - - // 初始化日志文件 - conf, _ := beego.AppConfig.GetSection("log") - conf["filename"] = conf["path"] + "api.log" - - if err := lxbeego.Inits(conf); err != nil { - fmt.Println("svlog.Inits Error::" + err.Error()) - } - - fmt.Println(svconst.AppName + " svlog init success") - -} diff --git a/common/svmysql/index.go b/common/svmysql/index.go deleted file mode 100644 index acfdc75..0000000 --- a/common/svmysql/index.go +++ /dev/null @@ -1,119 +0,0 @@ -package svmysql - -import ( - "apigame/common/svconst" - "apigame/service/constd" - "apigame/util/utdto" - "apigame/util/util-lx/lxalilog" - "fmt" - "github.com/astaxie/beego" - "gorm.io/gorm" - "strings" -) - -func Init() bool { - - // ConnectMySQL - if db, err := utdto.ConnectMySQL(beego.AppConfig.String("mysql::" + constd.MYSQL_DBAPI)); err == nil { - svconst.DbApi = db - } else { - fmt.Println("svmysql.Init DbApi Error::" + err.Error()) - return false - } - if db, err := utdto.ConnectMySQL(beego.AppConfig.String("mysql::mergecommon")); err == nil { - svconst.DbCommon = db - } else { - fmt.Println("svmysql.Init DbCommon Error::" + err.Error()) - return false - } - if db, err := utdto.ConnectMySQL(beego.AppConfig.String("mysql::" + constd.MYSQL_MERGECONFIG)); err == nil { - svconst.DbConfig = db - } else { - fmt.Println("svmysql.Init DbConfig Error::" + err.Error()) - return false - } - return true - -} - -func InitTable(obj IMysqlData, gameId string) { - info := obj.MysqlInfo(gameId) - utdto.InitTable(info.DbMysql, obj, info.TableName) -} - -func Insert(obj IMysqlData, gameId string) (err error) { - info := obj.MysqlInfo(gameId) - db := info.DbMysql - stmt := db.Session(&gorm.Session{DryRun: true}).Create(obj).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) - result := db.Exec(sql, stmt.Vars...) - err = result.Error - if err != nil { - lxalilog.Errors(err, gameId) - return - } - return -} - -func Updates(obj IMysqlData, gameId string) (err error) { - info := obj.MysqlInfo(gameId) - db := info.DbMysql - stmt := db.Session(&gorm.Session{DryRun: true}).Updates(obj).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) - result := db.Exec(sql, stmt.Vars...) - err = result.Error - if err != nil { - lxalilog.Errors(err, gameId) - return - } - return -} - -func Save(obj IMysqlData, gameId string) (err error) { - info := obj.MysqlInfo(gameId) - db := info.DbMysql - stmt := db.Session(&gorm.Session{DryRun: true}).Save(obj).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) - result := db.Exec(sql, stmt.Vars...) - err = result.Error - if err != nil { - lxalilog.Errors(err, gameId) - return - } - return -} - -func First(obj IMysqlData, gameId string) (has bool, err error) { - info := obj.MysqlInfo(gameId) - db := info.DbMysql - stmt := db.Session(&gorm.Session{DryRun: true}).First(obj).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) - result := db.Raw(sql, stmt.Vars...).Scan(obj) - has = result.RowsAffected != 0 - err = result.Error - if err != nil { - lxalilog.Errors(err, gameId) - return - } - return -} - -func Find(obj IMysqlData, gameId string) (has bool, err error) { - info := obj.MysqlInfo(gameId) - db := info.DbMysql - stmt := db.Session(&gorm.Session{DryRun: true}).Find(obj).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) - result := db.Raw(sql, stmt.Vars...).Scan(obj) - has = result.RowsAffected != 0 - err = result.Error - if err != nil { - lxalilog.Errors(err, gameId) - return - } - return -} diff --git a/common/svmysql/interface.go b/common/svmysql/interface.go deleted file mode 100644 index fba3d4d..0000000 --- a/common/svmysql/interface.go +++ /dev/null @@ -1,15 +0,0 @@ -package svmysql - -import "gorm.io/gorm" - -// MysqlInfo mysql存储信息 -type MysqlInfo struct { - DbMysql *gorm.DB - TableName string -} - -// IMysqlData mysql存储对象 -type IMysqlData interface { - // MysqlInfo mysql存储信息 - MysqlInfo(gameId string) *MysqlInfo -} diff --git a/common/svredis/index.go b/common/svredis/index.go deleted file mode 100644 index 92f43c7..0000000 --- a/common/svredis/index.go +++ /dev/null @@ -1,58 +0,0 @@ -package svredis - -import ( - "apigame/common/svconst" - "apigame/util/utstring" - "apigame/util/zjson" - "apigame/util/zredis" - "fmt" - "github.com/astaxie/beego" - "github.com/mitchellh/mapstructure" -) - -type RedisConfig struct { - Host string `json:"host"` - Port string `json:"port"` - Pwd string `json:"pwd"` - Db string `json:"Db"` - Prefix string `json:"prefix"` -} - -func Init() bool { - //初始化Redis - confText, _ := beego.AppConfig.GetSection("redis") - var conf RedisConfig - err := mapstructure.Decode(confText, &conf) - if err != nil { - fmt.Println("svredis.Init mapstructure.Decode Error::" + err.Error()) - } - zredis.Init(conf.Host+":"+conf.Port, conf.Pwd, utstring.StringToInt(conf.Db)) - if !zredis.Check() { - return false - } - - fmt.Println(svconst.AppName + " redis init success") - return true -} - -func SaveData(gameId string, obj IRedisData) { - info := obj.RedisInfo(gameId) - _ = zredis.SetEx(zredis.GetConn(), info.CacheKey, zjson.Str(obj), info.CacheTime) -} - -func LoadData[T IRedisData](gameId string, obj T) (has bool) { - has = true - info := obj.RedisInfo(gameId) - text, err := zredis.Get(zredis.GetConn(), info.CacheKey) - if err != nil { - has = false - return - } - err = zjson.Obj(text, &obj) - if err != nil { - fmt.Println(err) - has = false - return - } - return -} diff --git a/common/svredis/interface.go b/common/svredis/interface.go deleted file mode 100644 index 0c24d5d..0000000 --- a/common/svredis/interface.go +++ /dev/null @@ -1,13 +0,0 @@ -package svredis - -// RedisInfo redis存储信息 -type RedisInfo struct { - CacheKey string - CacheTime int -} - -// IRedisData redis存储对象 -type IRedisData interface { - // RedisInfo redis存储信息 - RedisInfo(gameId string) *RedisInfo -} diff --git a/common/thinkingdata/index.go b/common/thinkingdata/index.go deleted file mode 100644 index 2b16552..0000000 --- a/common/thinkingdata/index.go +++ /dev/null @@ -1,119 +0,0 @@ -package thinkingdata - -import ( - "crypto/tls" - "encoding/json" - "errors" - "fmt" - "gitee.com/lxgow/lxconv" - "github.com/astaxie/beego" - "github.com/astaxie/beego/httplib" - lconv "github.com/lixu-any/go-tools/conv" - "time" -) - -// index -// 创建时间:2023/10/23 10:06 -// 创建人:lixu - -// index 数数科技 -// 创建时间:2023/7/18 16:03 -// 创建人:lixu - -// GetNowDateTime 当前日期时间 -func GetNowDateTime() string { - tim := time.Unix(time.Now().Unix(), 0).Format("2006-01-02 15:04:05") - return fmt.Sprintf("%s", tim) -} - -type MThinkDataConfig struct { - Url string `json:"url"` - Debug int `json:"debug"` -} - -type MRespData struct { - Msg string `json:"Msg"` - Code int `json:"code"` -} - -var THINKINGDATACONFIG MThinkDataConfig - -// InitThinkData 初始化数数 -func InitThinkData() (err error) { - thinkingdata, _ := beego.AppConfig.GetSection("thinkingdata") - THINKINGDATACONFIG.Url = thinkingdata["url"] - THINKINGDATACONFIG.Debug = lxconv.ParseInt(thinkingdata["debug"]) - return -} - -// AddOneData 数据上报 -func AddOneData(appid, account_id, distinct_id string, event string, data map[string]interface{}, typ string) (resp MRespData, err error) { - - _data := map[string]interface{}{ - "#type": typ, - //"#event_name": event, - "#time": GetNowDateTime(), - "#account_id": account_id, - "#distinct_id": distinct_id, - "properties": data, - } - - if typ == "track" && event != "" { - _data["#event_name"] = event - } - - postdata := map[string]interface{}{ - "appid": appid, - "debug": THINKINGDATACONFIG.Debug, - "data": _data, - } - - req := httplib.Post(THINKINGDATACONFIG.Url + "/sync_json") - - req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true}) - - _, err = req.JSONBody(&postdata) - if err != nil { - err = errors.New("thinkingdata-AddOneData req.JSONBody() error::" + err.Error() + "::" + lconv.JsonEncode(postdata)) - return - } - - var ( - bytes []byte - ) - - bytes, err = req.Bytes() - if err != nil { - err = errors.New("thinkingdata-AddOneData req.Bytes() error::" + err.Error() + "::" + lconv.JsonEncode(postdata) + "::" + string(bytes)) - return - } - - _ = json.Unmarshal(bytes, &resp) - - if resp.Code != 0 { - err = errors.New("thinkingdata-AddOneData resp.Code error:: " + lconv.JsonEncode(postdata) + "::" + string(bytes)) - return - } - - return -} - -// TrackOne 向事件表传入一个事件 -func TrackOne(appid, account_id string, event string, data map[string]interface{}) (resp MRespData, err error) { - return AddOneData(appid, account_id, "", event, data, "track") -} - -// UserSet 对用户表进行操作,覆盖一个或多个用户属性,如果该属性已有值存在,覆盖先前值 -func UserSet(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) { - return AddOneData(appid, account_id, "", "", data, "user_set") -} - -// UserSetOnce 对用户表进行操作,初始化一个或多个用户属性,如果该属性已有值存在,则忽略本次操作 -func UserSetOnce(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) { - return AddOneData(appid, account_id, "", "", data, "user_setOnce") -} - -// UserAdd 对用户表进行操作,为一个或多个数值型用户属性做累加计算 -func UserAdd(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) { - return AddOneData(appid, account_id, "", "", data, "user_add") -} diff --git a/configs/feat-api.go b/configs/feat-api.go index 0217f8b..3f1df05 100644 --- a/configs/feat-api.go +++ b/configs/feat-api.go @@ -1,10 +1,9 @@ package configs import ( - "apigame/common/svconst" - "apigame/common/svdto" - "apigame/common/svmysql" - "apigame/common/svredis" + "apigame/service-common/svconst" + "apigame/service-common/svmysql" + "apigame/service-common/svredis" "fmt" ) @@ -20,7 +19,7 @@ type ApiGameConfig struct { func (c *ApiGameConfig) RedisInfo(gameId string) *svredis.RedisInfo { tableName := "s_game_config" return &svredis.RedisInfo{ - CacheKey: fmt.Sprintf("%s:%s:%s", svdto.REDIS_CACHEP_REFIX, tableName, gameId), + CacheKey: fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, gameId), CacheTime: 300, } } diff --git a/configs/feat-cardholder.go b/configs/feat-cardholder.go index dede1ce..071c20e 100644 --- a/configs/feat-cardholder.go +++ b/configs/feat-cardholder.go @@ -1,11 +1,9 @@ package configs import ( - "apigame/common/svconst" - "apigame/common/svdto" - "apigame/common/svmysql" - "apigame/common/svredis" - "apigame/service/constd" + "apigame/service-common/svconst" + "apigame/service-common/svmysql" + "apigame/service-common/svredis" "fmt" ) @@ -33,9 +31,9 @@ type CardActivityConfig struct { } func (c *CardActivityConfig) RedisInfo(gameId string) *svredis.RedisInfo { - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_CONFIG + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG return &svredis.RedisInfo{ - CacheKey: fmt.Sprintf("%s:%s:%s", svdto.REDIS_CACHEP_REFIX, tableName, gameId), + CacheKey: fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, gameId), CacheTime: 300, } } @@ -61,7 +59,7 @@ type CardActivityConfigRaw struct { } func (c *CardActivityConfigRaw) MysqlInfo(gameId string) *svmysql.MysqlInfo { - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_CONFIG + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG return &svmysql.MysqlInfo{ DbMysql: svconst.DbConfig.Where("status = ?", 1), TableName: tableName + gameId, diff --git a/configs/index.go b/configs/index.go deleted file mode 100644 index cac20bd..0000000 --- a/configs/index.go +++ /dev/null @@ -1,14 +0,0 @@ -package configs - -import ( - "apigame/common/svdto" -) - -// func GetConfigRedis[T svconfig.IDtoData](gameId string) (result *T, has bool) { -// t = new(T) -// var rule = t.GetRule(gameId) -// return -// } -func GetConfigMysql[T svdto.IDtoData](gameId string, t T) (result *T, has bool) { - return -} diff --git a/configs/registry.go b/configs/registry.go index 1a9e4b9..3149e77 100644 --- a/configs/registry.go +++ b/configs/registry.go @@ -1,8 +1,8 @@ package configs import ( - "apigame/common/svmysql" - "apigame/common/svredis" + "apigame/service-common/svmysql" + "apigame/service-common/svredis" "fmt" ) diff --git a/controllers/base.go b/controllers/base.go index 6bdb4ef..02f2f96 100644 --- a/controllers/base.go +++ b/controllers/base.go @@ -2,7 +2,7 @@ package controllers import ( "apigame/middleware/sign" - "apigame/service/constd" + "apigame/service/code-msg" "encoding/json" "github.com/astaxie/beego" ) @@ -27,7 +27,7 @@ func (c *BaseController) RetRspData(rspData any) { // RetRspCodeData 返回封装 func (c *BaseController) RetRspCodeData(code string, rspData any) { resp := make(map[string]any) - resp = constd.CodeMsg(resp, code) + resp = code_msg.CodeMsg(resp, code) resp["data"] = rspData c.RetData(resp) } @@ -35,7 +35,7 @@ func (c *BaseController) RetRspCodeData(code string, rspData any) { // RetCode 返回错误封装 func (c *BaseController) RetCode(code string) { resp := make(map[string]any) - resp = constd.CodeMsg(resp, code) + resp = code_msg.CodeMsg(resp, code) c.RetData(resp) } @@ -48,7 +48,7 @@ func (c *BaseController) GetPostData(postData any) bool { if checkLocal() { err := json.Unmarshal(req, &postData) if err != nil { - c.RetCode(constd.RECODE_PARAMERROR) + c.RetCode(code_msg.RECODE_PARAMERROR) return false } return true @@ -58,7 +58,7 @@ func (c *BaseController) GetPostData(postData any) bool { code, err := sign.Check(req, &postData, true, true) if err != nil { resp := make(map[string]interface{}) - resp = constd.CodeMsg(resp, code) + resp = code_msg.CodeMsg(resp, code) c.RetData(resp) return false } diff --git a/main.go b/main.go index 3e7a817..e80ade1 100644 --- a/main.go +++ b/main.go @@ -1,12 +1,12 @@ package main import ( - "apigame/common/svconst" - "apigame/common/svlog" - "apigame/common/svmysql" - "apigame/common/svredis" "apigame/configs" _ "apigame/routers" + "apigame/service-common/svconst" + "apigame/service-common/svlog" + "apigame/service-common/svmysql" + "apigame/service-common/svredis" "apigame/service/cardholder" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" diff --git a/middleware/sign/index.go b/middleware/sign/index.go index 23a2056..6347ea0 100644 --- a/middleware/sign/index.go +++ b/middleware/sign/index.go @@ -3,7 +3,7 @@ package sign import ( "apigame/configs" "apigame/middleware/sdk" - "apigame/service/constd" + "apigame/service/code-msg" "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxarray" "apigame/util/util-lx/lxconv" @@ -77,7 +77,7 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig time_stamp = getTimeStamp(tempData["time_stamp"]) if time_stamp < (nowtime-JG) || time_stamp > (nowtime+JG) { - code = constd.RECODE_REQUESTTIME_ERROR + code = code_msg.RECODE_REQUESTTIME_ERROR err = errors.New(code) lxalilog.Errors("RECODE_REQUESTTIME_ERROR error:", string(cgg.Bodys)) return @@ -100,7 +100,7 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig } if cgg.CheckUrlGameID && urlGameId == "" { - code = constd.RECODE_PARAMERROR + code = code_msg.RECODE_PARAMERROR err = errors.New(code) lxalilog.Errors("urlGameid error:") return @@ -109,21 +109,21 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig postGameId, ty = lxlimit.CheckLimit(c) if cgg.CheckUrlGameID && postGameId != urlGameId { - code = constd.RECODE_PARAMERROR + code = code_msg.RECODE_PARAMERROR err = errors.New(code) lxalilog.Errors("urlGameid !=postGameId:", urlGameId, postdata) return } if ty != "" { - code = constd.RECODE_REQUESTXIANLIU_ERROR + code = code_msg.RECODE_REQUESTXIANLIU_ERROR err = errors.New(ty) return } err = json.Unmarshal(cgg.Bodys, &postdata) if err != nil { - code = constd.RECODE_PARAMERROR + code = code_msg.RECODE_PARAMERROR lxalilog.Errors("json.Unmarshal error:", err, string(cgg.Bodys)) return } @@ -134,13 +134,13 @@ func InitCheck(postdata interface{}, cgg MCheckConfig) (code string, gameconfig b, err = valid.Valid(postdata) if err != nil { - code = constd.RECODE_PARAMERROR + code = code_msg.RECODE_PARAMERROR lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors) return } if !b { - code = constd.RECODE_PARAMERROR + code = code_msg.RECODE_PARAMERROR err = errors.New(code) lxalilog.Errors("valid.Valid error:", err, string(cgg.Bodys), valid.Errors) return @@ -161,7 +161,7 @@ func Check(req []byte, postdata interface{}, checkSign bool, checkToken bool) (c err = json.Unmarshal(req, &postdata) if err != nil { - code = constd.RECODE_PARAMERROR + code = code_msg.RECODE_PARAMERROR lxalilog.Errors("json.Unmarshal error:", err, string(req)) return } @@ -172,13 +172,13 @@ func Check(req []byte, postdata interface{}, checkSign bool, checkToken bool) (c b, err = valid.Valid(postdata) if err != nil { - code = constd.RECODE_PARAMERROR + code = code_msg.RECODE_PARAMERROR lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors) return } if !b { - code = constd.RECODE_PARAMERROR + code = code_msg.RECODE_PARAMERROR err = errors.New(code) lxalilog.Errors("valid.Valid error:", err, string(req), valid.Errors) return @@ -209,13 +209,13 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf err = json.Unmarshal(jsonBody, &newdata) if err != nil { - code = constd.RECODE_SIGNERROR + code = code_msg.RECODE_SIGNERROR lxalilog.Errors("json.Unmarshal error:", err) return } if newdata["gameid"] == "" || newdata["channel"] == "" || newdata["sign"] == "" || newdata["sign_type"] == "" || newdata["time_stamp"] == "" || newdata["ver"] == "" { - code = constd.RECODE_SIGNERROR + code = code_msg.RECODE_SIGNERROR err = errors.New("签名错误,参数错误" + logstr) lxalilog.Errors(err) return @@ -236,7 +236,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf appkey := gameconfig.AppKey if appkey == "" { - code = constd.RECODE_SIGNERROR + code = code_msg.RECODE_SIGNERROR err = errors.New("签名错误,参数错误" + gameid + "no appkey") lxalilog.Errors(err) return @@ -262,7 +262,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf } if len(fiterkey) > 0 { - code = constd.RECODE_WEIXINAZIFU_ERROR + code = code_msg.RECODE_WEIXINAZIFU_ERROR err = errors.New("fiterkey error" + logstr) lxalilog.Errors(err, lxconv.JsonEncode(fiterkey), "data:", lxconv.JsonEncode(newdata)) return @@ -282,7 +282,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf md5key := strings.ToLower(lxconv.EncryMD5(valstr)) if md5key != sign { - code = constd.RECODE_SIGNERROR + code = code_msg.RECODE_SIGNERROR err = errors.New(code) lxalilog.Errors("sign error,md5key::", md5key, ",sign:", sign, logstr, "data:", lxconv.JsonEncode(newdata)) return @@ -291,7 +291,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf if checkToken { if newdata["uid"] == nil || newdata["token"] == nil { - code = constd.RECODE_PARAMERROR + code = code_msg.RECODE_PARAMERROR err = errors.New(code) lxalilog.Errors("no uid or token", "data:", lxconv.JsonEncode(newdata)) return @@ -299,7 +299,7 @@ func CheckSign(data interface{}, checkToken bool) (code string, gameconfig *conf err = sdk.CheckSdkToken(gameid, lxconv.ToInt64(newdata["uid"]), lxconv.InterfaceToStr(newdata["token"])) if err != nil { - code = constd.RECODE_LOGINCHECK_ERROR + code = code_msg.RECODE_LOGINCHECK_ERROR return } diff --git a/service-common/svconst/consts.go b/service-common/svconst/consts.go new file mode 100644 index 0000000..34e43ed --- /dev/null +++ b/service-common/svconst/consts.go @@ -0,0 +1,5 @@ +package svconst + +const ( + REDIS_CACHEP_REFIX = "apigame" // 缓存前缀 +) diff --git a/service-common/svconst/mysql.go b/service-common/svconst/mysql.go new file mode 100644 index 0000000..3ef85ec --- /dev/null +++ b/service-common/svconst/mysql.go @@ -0,0 +1,21 @@ +package svconst + +// mysql +// 创建时间:2023/4/3 15:28 +// 创建人:lixu + +const ( + MYSQL_DEFAULT = "default" + MYSQL_DBAPI = "api" + MYSQL_MERGECOMMON = "merge_common" + MYSQL_MERGECONFIG = "merge_config" + MYSQL_DEFAULT_QUERY_MAXCOUNT = 100 + + MYSQL_TABLE_S_CARDHOLDER_CONFIG = "s_card_activity_" // 开卡包活动配置 + MYSQL_TABLE_S_CARDHOLDER_DATA = "s_cardholder_data_" // 开卡包活动数据 + MYSQL_TABLE_S_CARDHOLDER_RECORD_GETNEW = "s_cardholder_record_getnew_" // 开卡包活动日志获得卡包 + MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN = "s_cardholder_record_open_" // 开卡包活动日志开卡包 + MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM = "s_cardholder_record_rewardalbum_" // 开卡包活动日志领取卡组奖励 + MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND = "s_cardholder_record_rewardround_" // 开卡包活动日志领取轮次奖励 + +) diff --git a/service-common/svconst/vars.go b/service-common/svconst/vars.go new file mode 100644 index 0000000..c2c254a --- /dev/null +++ b/service-common/svconst/vars.go @@ -0,0 +1,13 @@ +package svconst + +import "gorm.io/gorm" + +var ( + AppName = "" + + DbApi *gorm.DB + DbCommon *gorm.DB + DbConfig *gorm.DB + + GameListCardHolder = []string{"10149"} +) diff --git a/service-common/svlog/ali-log.go b/service-common/svlog/ali-log.go new file mode 100644 index 0000000..e83c11a --- /dev/null +++ b/service-common/svlog/ali-log.go @@ -0,0 +1,40 @@ +package svlog + +import ( + "apigame/util/util-lx/lxalilog" + "fmt" + "github.com/astaxie/beego" + lalilog "github.com/lixu-any/go-tools/ali/log" +) + +func InitAliLog(appName string) { + + //初始化阿里云日志 + logm, _ := beego.AppConfig.GetSection("alilog") + lxalilog.InitAliLog(lxalilog.MapAlilogConfig{ + Endpoint: logm["endpoint"], + AccessKeyId: logm["accesskeyid"], + AccessKeySecret: logm["accesskeysecret"], + Project: logm["project"], + AppNaame: appName, + On: logm["on"], + Debug: logm["debug"], + TableError: "api_code_merge", + TableDebug: logm["tabledebug"], + Env: beego.AppConfig.String("env"), + }) + + lalilog.InitAliLog(lalilog.MapAlilogConfig{ + Endpoint: logm["endpoint"], + AccessKeyId: logm["accesskeyid"], + AccessKeySecret: logm["accesskeysecret"], + Project: logm["project"], + On: logm["on"], + Debug: logm["debug"], + TableError: logm["tableerror"], + TableDebug: logm["tabledebug"], + Env: beego.AppConfig.String("env"), + }) + + fmt.Println(appName + " alilog init success") +} diff --git a/service-common/svlog/log.go b/service-common/svlog/log.go new file mode 100644 index 0000000..242d963 --- /dev/null +++ b/service-common/svlog/log.go @@ -0,0 +1,22 @@ +package svlog + +import ( + "apigame/service-common/svconst" + "apigame/util/util-lx/lxbeego" + "fmt" + "github.com/astaxie/beego" +) + +func Init() { + + // 初始化日志文件 + conf, _ := beego.AppConfig.GetSection("log") + conf["filename"] = conf["path"] + "api.log" + + if err := lxbeego.Inits(conf); err != nil { + fmt.Println("svlog.Inits Error::" + err.Error()) + } + + fmt.Println(svconst.AppName + " svlog init success") + +} diff --git a/service-common/svmysql/dto.go b/service-common/svmysql/dto.go new file mode 100644 index 0000000..d379890 --- /dev/null +++ b/service-common/svmysql/dto.go @@ -0,0 +1,84 @@ +package svmysql + +import ( + "apigame/util/util-lx/lxalilog" + "gorm.io/gorm" + "strings" +) + +func Insert(obj IMysqlData, gameId string) (err error) { + info := obj.MysqlInfo(gameId) + db := info.DbMysql + stmt := db.Session(&gorm.Session{DryRun: true}).Create(obj).Statement + stmtSQL := stmt.SQL.String() + sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) + result := db.Exec(sql, stmt.Vars...) + err = result.Error + if err != nil { + lxalilog.Errors(err, gameId) + return + } + return +} + +func Updates(obj IMysqlData, gameId string) (err error) { + info := obj.MysqlInfo(gameId) + db := info.DbMysql + stmt := db.Session(&gorm.Session{DryRun: true}).Updates(obj).Statement + stmtSQL := stmt.SQL.String() + sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) + result := db.Exec(sql, stmt.Vars...) + err = result.Error + if err != nil { + lxalilog.Errors(err, gameId) + return + } + return +} + +func Save(obj IMysqlData, gameId string) (err error) { + info := obj.MysqlInfo(gameId) + db := info.DbMysql + stmt := db.Session(&gorm.Session{DryRun: true}).Save(obj).Statement + stmtSQL := stmt.SQL.String() + sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) + result := db.Exec(sql, stmt.Vars...) + err = result.Error + if err != nil { + lxalilog.Errors(err, gameId) + return + } + return +} + +func First(obj IMysqlData, gameId string) (has bool, err error) { + info := obj.MysqlInfo(gameId) + db := info.DbMysql + stmt := db.Session(&gorm.Session{DryRun: true}).First(obj).Statement + stmtSQL := stmt.SQL.String() + sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) + result := db.Raw(sql, stmt.Vars...).Scan(obj) + has = result.RowsAffected != 0 + err = result.Error + if err != nil { + lxalilog.Errors(err, gameId) + return + } + return +} + +func Find(obj IMysqlData, gameId string) (has bool, err error) { + info := obj.MysqlInfo(gameId) + db := info.DbMysql + stmt := db.Session(&gorm.Session{DryRun: true}).Find(obj).Statement + stmtSQL := stmt.SQL.String() + sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) + result := db.Raw(sql, stmt.Vars...).Scan(obj) + has = result.RowsAffected != 0 + err = result.Error + if err != nil { + lxalilog.Errors(err, gameId) + return + } + return +} diff --git a/service-common/svmysql/index.go b/service-common/svmysql/index.go new file mode 100644 index 0000000..f389989 --- /dev/null +++ b/service-common/svmysql/index.go @@ -0,0 +1,38 @@ +package svmysql + +import ( + "apigame/service-common/svconst" + "fmt" + "github.com/astaxie/beego" + "gorm.io/driver/mysql" + "gorm.io/gorm" +) + +func Init() bool { + + // ConnectMySQL + if db, err := ConnectMySQL(beego.AppConfig.String("mysql::" + svconst.MYSQL_DBAPI)); err == nil { + svconst.DbApi = db + } else { + fmt.Println("svmysql.Init DbApi Error::" + err.Error()) + return false + } + if db, err := ConnectMySQL(beego.AppConfig.String("mysql::mergecommon")); err == nil { + svconst.DbCommon = db + } else { + fmt.Println("svmysql.Init DbCommon Error::" + err.Error()) + return false + } + if db, err := ConnectMySQL(beego.AppConfig.String("mysql::" + svconst.MYSQL_MERGECONFIG)); err == nil { + svconst.DbConfig = db + } else { + fmt.Println("svmysql.Init DbConfig Error::" + err.Error()) + return false + } + return true + +} + +func ConnectMySQL(dsn string) (db *gorm.DB, err error) { + return gorm.Open(mysql.Open(dsn), &gorm.Config{}) +} diff --git a/service-common/svmysql/interface.go b/service-common/svmysql/interface.go new file mode 100644 index 0000000..fba3d4d --- /dev/null +++ b/service-common/svmysql/interface.go @@ -0,0 +1,15 @@ +package svmysql + +import "gorm.io/gorm" + +// MysqlInfo mysql存储信息 +type MysqlInfo struct { + DbMysql *gorm.DB + TableName string +} + +// IMysqlData mysql存储对象 +type IMysqlData interface { + // MysqlInfo mysql存储信息 + MysqlInfo(gameId string) *MysqlInfo +} diff --git a/service-common/svmysql/table.go b/service-common/svmysql/table.go new file mode 100644 index 0000000..5b9733a --- /dev/null +++ b/service-common/svmysql/table.go @@ -0,0 +1,135 @@ +package svmysql + +import ( + "fmt" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/migrator" + "strings" +) + +func InitTable(obj IMysqlData, gameId string) { + info := obj.MysqlInfo(gameId) + db := info.DbMysql + tableName := info.TableName + m := db.Migrator().(mysql.Migrator).Migrator + queryTx, execTx := m.GetQueryAndExecTx() + if HasTable(queryTx.Migrator().(mysql.Migrator).Migrator, obj, tableName) { + fmt.Println(tableName + " exist, skip!") + } else { + err := CreateTable(execTx, obj, tableName) + if err != nil { + fmt.Println("err", err) + } + } +} + +func HasTable(m migrator.Migrator, obj any, tableName string) bool { + var count int64 + + m.RunWithValue(obj, func(stmt *gorm.Statement) error { + currentDatabase := m.DB.Migrator().CurrentDatabase() + 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) + }) + + return count > 0 +} + +func CreateTable(execTx *gorm.DB, value any, tableName string) error { + m := execTx.Migrator().(mysql.Migrator).Migrator + tx := m.DB.Session(&gorm.Session{}) + + if err := m.RunWithValue(value, func(stmt *gorm.Statement) (err error) { + var ( + createTableSQL = "CREATE TABLE ? (" + values = []interface{}{clause.Table{Name: tableName}} + hasPrimaryKeyInDataType bool + ) + + for _, dbName := range stmt.Schema.DBNames { + field := stmt.Schema.FieldsByDBName[dbName] + if !field.IgnoreMigration { + createTableSQL += "? ?" + hasPrimaryKeyInDataType = hasPrimaryKeyInDataType || strings.Contains(strings.ToUpper(m.DataTypeOf(field)), "PRIMARY KEY") + values = append(values, clause.Column{Name: dbName}, m.DB.Migrator().FullDataTypeOf(field)) + createTableSQL += "," + } + } + + if !hasPrimaryKeyInDataType && len(stmt.Schema.PrimaryFields) > 0 { + createTableSQL += "PRIMARY KEY ?," + primaryKeys := make([]interface{}, 0, len(stmt.Schema.PrimaryFields)) + for _, field := range stmt.Schema.PrimaryFields { + primaryKeys = append(primaryKeys, clause.Column{Name: field.DBName}) + } + + values = append(values, primaryKeys) + } + + for _, idx := range stmt.Schema.ParseIndexes() { + if m.CreateIndexAfterCreateTable { + defer func(value interface{}, name string) { + if err == nil { + err = tx.Migrator().CreateIndex(value, name) + } + }(value, idx.Name) + } else { + if idx.Class != "" { + createTableSQL += idx.Class + " " + } + createTableSQL += "INDEX ? ?" + + if idx.Comment != "" { + createTableSQL += fmt.Sprintf(" COMMENT '%s'", idx.Comment) + } + + if idx.Option != "" { + createTableSQL += " " + idx.Option + } + + createTableSQL += "," + values = append(values, clause.Column{Name: idx.Name}, tx.Migrator().(migrator.BuildIndexOptionsInterface).BuildIndexOptions(idx.Fields, stmt)) + } + } + + if !m.DB.DisableForeignKeyConstraintWhenMigrating && !m.DB.IgnoreRelationshipsWhenMigrating { + for _, rel := range stmt.Schema.Relationships.Relations { + if rel.Field.IgnoreMigration { + continue + } + if constraint := rel.ParseConstraint(); constraint != nil { + if constraint.Schema == stmt.Schema { + sql, vars := constraint.Build() + createTableSQL += sql + "," + values = append(values, vars...) + } + } + } + } + + for _, uni := range stmt.Schema.ParseUniqueConstraints() { + createTableSQL += "CONSTRAINT ? UNIQUE (?)," + values = append(values, clause.Column{Name: uni.Name}, clause.Expr{SQL: stmt.Quote(uni.Field.DBName)}) + } + + for _, chk := range stmt.Schema.ParseCheckConstraints() { + createTableSQL += "CONSTRAINT ? CHECK (?)," + values = append(values, clause.Column{Name: chk.Name}, clause.Expr{SQL: chk.Constraint}) + } + + createTableSQL = strings.TrimSuffix(createTableSQL, ",") + + createTableSQL += ")" + + if tableOption, ok := m.DB.Get("gorm:table_options"); ok { + createTableSQL += fmt.Sprint(tableOption) + } + + err = tx.Exec(createTableSQL, values...).Error + return err + }); err != nil { + return err + } + return nil +} diff --git a/service-common/svredis/index.go b/service-common/svredis/index.go new file mode 100644 index 0000000..46c6a29 --- /dev/null +++ b/service-common/svredis/index.go @@ -0,0 +1,58 @@ +package svredis + +import ( + "apigame/service-common/svconst" + "apigame/util/utstring" + "apigame/util/zjson" + "apigame/util/zredis" + "fmt" + "github.com/astaxie/beego" + "github.com/mitchellh/mapstructure" +) + +type RedisConfig struct { + Host string `json:"host"` + Port string `json:"port"` + Pwd string `json:"pwd"` + Db string `json:"Db"` + Prefix string `json:"prefix"` +} + +func Init() bool { + //初始化Redis + confText, _ := beego.AppConfig.GetSection("redis") + var conf RedisConfig + err := mapstructure.Decode(confText, &conf) + if err != nil { + fmt.Println("svredis.Init mapstructure.Decode Error::" + err.Error()) + } + zredis.Init(conf.Host+":"+conf.Port, conf.Pwd, utstring.StringToInt(conf.Db)) + if !zredis.Check() { + return false + } + + fmt.Println(svconst.AppName + " redis init success") + return true +} + +func SaveData(gameId string, obj IRedisData) { + info := obj.RedisInfo(gameId) + _ = zredis.SetEx(zredis.GetConn(), info.CacheKey, zjson.Str(obj), info.CacheTime) +} + +func LoadData[T IRedisData](gameId string, obj T) (has bool) { + has = true + info := obj.RedisInfo(gameId) + text, err := zredis.Get(zredis.GetConn(), info.CacheKey) + if err != nil { + has = false + return + } + err = zjson.Obj(text, &obj) + if err != nil { + fmt.Println(err) + has = false + return + } + return +} diff --git a/service-common/svredis/interface.go b/service-common/svredis/interface.go new file mode 100644 index 0000000..0c24d5d --- /dev/null +++ b/service-common/svredis/interface.go @@ -0,0 +1,13 @@ +package svredis + +// RedisInfo redis存储信息 +type RedisInfo struct { + CacheKey string + CacheTime int +} + +// IRedisData redis存储对象 +type IRedisData interface { + // RedisInfo redis存储信息 + RedisInfo(gameId string) *RedisInfo +} diff --git a/service-common/thinkingdata/index.go b/service-common/thinkingdata/index.go new file mode 100644 index 0000000..2b16552 --- /dev/null +++ b/service-common/thinkingdata/index.go @@ -0,0 +1,119 @@ +package thinkingdata + +import ( + "crypto/tls" + "encoding/json" + "errors" + "fmt" + "gitee.com/lxgow/lxconv" + "github.com/astaxie/beego" + "github.com/astaxie/beego/httplib" + lconv "github.com/lixu-any/go-tools/conv" + "time" +) + +// index +// 创建时间:2023/10/23 10:06 +// 创建人:lixu + +// index 数数科技 +// 创建时间:2023/7/18 16:03 +// 创建人:lixu + +// GetNowDateTime 当前日期时间 +func GetNowDateTime() string { + tim := time.Unix(time.Now().Unix(), 0).Format("2006-01-02 15:04:05") + return fmt.Sprintf("%s", tim) +} + +type MThinkDataConfig struct { + Url string `json:"url"` + Debug int `json:"debug"` +} + +type MRespData struct { + Msg string `json:"Msg"` + Code int `json:"code"` +} + +var THINKINGDATACONFIG MThinkDataConfig + +// InitThinkData 初始化数数 +func InitThinkData() (err error) { + thinkingdata, _ := beego.AppConfig.GetSection("thinkingdata") + THINKINGDATACONFIG.Url = thinkingdata["url"] + THINKINGDATACONFIG.Debug = lxconv.ParseInt(thinkingdata["debug"]) + return +} + +// AddOneData 数据上报 +func AddOneData(appid, account_id, distinct_id string, event string, data map[string]interface{}, typ string) (resp MRespData, err error) { + + _data := map[string]interface{}{ + "#type": typ, + //"#event_name": event, + "#time": GetNowDateTime(), + "#account_id": account_id, + "#distinct_id": distinct_id, + "properties": data, + } + + if typ == "track" && event != "" { + _data["#event_name"] = event + } + + postdata := map[string]interface{}{ + "appid": appid, + "debug": THINKINGDATACONFIG.Debug, + "data": _data, + } + + req := httplib.Post(THINKINGDATACONFIG.Url + "/sync_json") + + req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true}) + + _, err = req.JSONBody(&postdata) + if err != nil { + err = errors.New("thinkingdata-AddOneData req.JSONBody() error::" + err.Error() + "::" + lconv.JsonEncode(postdata)) + return + } + + var ( + bytes []byte + ) + + bytes, err = req.Bytes() + if err != nil { + err = errors.New("thinkingdata-AddOneData req.Bytes() error::" + err.Error() + "::" + lconv.JsonEncode(postdata) + "::" + string(bytes)) + return + } + + _ = json.Unmarshal(bytes, &resp) + + if resp.Code != 0 { + err = errors.New("thinkingdata-AddOneData resp.Code error:: " + lconv.JsonEncode(postdata) + "::" + string(bytes)) + return + } + + return +} + +// TrackOne 向事件表传入一个事件 +func TrackOne(appid, account_id string, event string, data map[string]interface{}) (resp MRespData, err error) { + return AddOneData(appid, account_id, "", event, data, "track") +} + +// UserSet 对用户表进行操作,覆盖一个或多个用户属性,如果该属性已有值存在,覆盖先前值 +func UserSet(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) { + return AddOneData(appid, account_id, "", "", data, "user_set") +} + +// UserSetOnce 对用户表进行操作,初始化一个或多个用户属性,如果该属性已有值存在,则忽略本次操作 +func UserSetOnce(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) { + return AddOneData(appid, account_id, "", "", data, "user_setOnce") +} + +// UserAdd 对用户表进行操作,为一个或多个数值型用户属性做累加计算 +func UserAdd(appid, account_id string, data map[string]interface{}) (resp MRespData, err error) { + return AddOneData(appid, account_id, "", "", data, "user_add") +} diff --git a/service/cardholder/dto-game.go b/service/cardholder/dto-game.go index 4069890..a502090 100644 --- a/service/cardholder/dto-game.go +++ b/service/cardholder/dto-game.go @@ -1,9 +1,8 @@ package cardholder import ( - "apigame/common/svconst" - "apigame/common/svmysql" - "apigame/service/constd" + "apigame/service-common/svconst" + "apigame/service-common/svmysql" "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" "encoding/json" @@ -20,7 +19,7 @@ type DataCardHolder struct { } func (d *DataCardHolder) MysqlInfo(gameId string) *svmysql.MysqlInfo { - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_DATA + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_DATA return &svmysql.MysqlInfo{ DbMysql: svconst.DbCommon, TableName: tableName + gameId, diff --git a/service/cardholder/dto-record.go b/service/cardholder/dto-record.go index abfb196..60bf9fe 100644 --- a/service/cardholder/dto-record.go +++ b/service/cardholder/dto-record.go @@ -1,9 +1,8 @@ package cardholder import ( - "apigame/common/svconst" - "apigame/common/svmysql" - "apigame/service/constd" + "apigame/service-common/svconst" + "apigame/service-common/svmysql" "apigame/util/util-lx/lxtime" ) @@ -41,7 +40,7 @@ type RecordCardHolderOpen struct { } func (d *RecordCardHolderOpen) MysqlInfo(gameId string) *svmysql.MysqlInfo { - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN return &svmysql.MysqlInfo{ DbMysql: svconst.DbCommon, TableName: tableName + gameId, @@ -66,7 +65,7 @@ type RecordCardHolderRewardAlbum struct { } func (d *RecordCardHolderRewardAlbum) MysqlInfo(gameId string) *svmysql.MysqlInfo { - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM return &svmysql.MysqlInfo{ DbMysql: svconst.DbCommon, TableName: tableName + gameId, @@ -89,7 +88,7 @@ type RecordCardHolderRewardRound struct { } func (d *RecordCardHolderRewardRound) MysqlInfo(gameId string) *svmysql.MysqlInfo { - tableName := constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND return &svmysql.MysqlInfo{ DbMysql: svconst.DbCommon, TableName: tableName + gameId, diff --git a/service/cardholder/handle.go b/service/cardholder/handle.go index 3ce049d..ae014dd 100644 --- a/service/cardholder/handle.go +++ b/service/cardholder/handle.go @@ -3,7 +3,7 @@ package cardholder import ( "apigame/configs" "apigame/models" - "apigame/service/constd" + "apigame/service/code-msg" "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" "apigame/util/utslice" @@ -13,7 +13,7 @@ import ( // HandleGetConfig 活动配置 func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp models.RspCardHolderGetConfig) { rsp = models.RspCardHolderGetConfig{} - code = constd.RECODE_OK + code = code_msg.RECODE_OK // 尝试更新配置 config, _ := configs.GetCardActivityConfig(req.GameID) @@ -31,19 +31,19 @@ func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp model // HandleInfo 卡包信息 func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardHolderInfo) { rsp = models.RspCardHolderInfo{} - code = constd.RECODE_OK + code = code_msg.RECODE_OK // 尝试更新配置 config, hasConfig := configs.GetCardActivityConfig(req.GameID) if !hasConfig { - code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR return } // 判断预告时间 sec := lxtime.NowUninx() if sec < config.StartTime { - code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR return } @@ -61,25 +61,25 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH NewCards: make([][]int, 0), AwardAlbum: make(map[int]string), } - code = constd.RECODE_OK + code = code_msg.RECODE_OK // 尝试更新配置 config, hasConfig := configs.GetCardActivityConfig(req.GameID) if !hasConfig { - code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR return } // 检查活动状态 code = CheckStatus(config) - if code != constd.RECODE_OK { + if code != code_msg.RECODE_OK { return } // 检查卡包ID for _, idCardholder := range req.Ids { _, okCardholder := config.CardholderConfig[strconv.Itoa(idCardholder)] if !okCardholder { - code = constd.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR + code = code_msg.RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR return } } @@ -88,7 +88,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH gameData := LoadData(req.GameID, req.UID, config) // 检查游戏数据 轮次等 code = CheckGameData(gameData, config) - if code != constd.RECODE_OK { + if code != code_msg.RECODE_OK { return } @@ -136,24 +136,24 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model NewCards: make([]int, 0), AwardAlbum: make(map[int]string), } - code = constd.RECODE_OK + code = code_msg.RECODE_OK // 尝试更新配置 config, hasConfig := configs.GetCardActivityConfig(req.GameID) if !hasConfig { - code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR return } // 检查活动状态 code = CheckStatus(config) - if code != constd.RECODE_OK { + if code != code_msg.RECODE_OK { return } // 检查星星商店ID confStarShop, okStarShopConfig := config.StarShopConfig[req.Id] if !okStarShopConfig { - code = constd.RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR + code = code_msg.RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR return } @@ -161,39 +161,39 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model gameData := LoadData(req.GameID, req.UID, config) // 检查游戏数据 轮次等 code = CheckGameData(gameData, config) - if code != constd.RECODE_OK { + if code != code_msg.RECODE_OK { return } // 判断星星数是否足够 if gameData.Details.StarCount < confStarShop.NeedStarNumber { - code = constd.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR + code = code_msg.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR return } // 判断配置 if len(confStarShop.CardBagIds) < 3 { lxalilog.Errors("StarShopConfig.CardBagIds error", confStarShop.Id) - code = constd.RECODE_MERGE_CONFIG_ERROR + code = code_msg.RECODE_MERGE_CONFIG_ERROR return } cardholderId := confStarShop.CardBagIds[1] cardholderCount := confStarShop.CardBagIds[2] if cardholderCount < 1 { lxalilog.Errors("StarShopConfig.CardBagIds error", confStarShop.Id) - code = constd.RECODE_MERGE_CONFIG_ERROR + code = code_msg.RECODE_MERGE_CONFIG_ERROR return } confCardholder, okCardholder := config.CardholderConfig[strconv.Itoa(cardholderId)] if !okCardholder { - code = constd.RECODE_MERGE_CONFIG_ERROR + code = code_msg.RECODE_MERGE_CONFIG_ERROR return } // 按照规则扣除星星 enough, cardList := GetStarCardList(gameData, config, confStarShop.NeedStarNumber) if !enough { - code = constd.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR + code = code_msg.RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR return } for i, i2 := range cardList { @@ -242,18 +242,18 @@ func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp m AwardAlbum: make(map[int]string), AutoExchangeHolder: make([]int, 0), } - code = constd.RECODE_OK + code = code_msg.RECODE_OK // 尝试更新配置 config, hasConfig := configs.GetCardActivityConfig(req.GameID) if !hasConfig { - code = constd.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR + code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR return } // 检查活动状态 code = CheckStatus(config) - if code != constd.RECODE_OK { + if code != code_msg.RECODE_OK { return } @@ -261,12 +261,12 @@ func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp m gameData := LoadData(req.GameID, req.UID, config) // 检查游戏数据 轮次等 code = CheckGameData(gameData, config) - if code != constd.RECODE_OK { + if code != code_msg.RECODE_OK { return } if gameData.Details.LastStarCount <= 0 { - code = constd.RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR + code = code_msg.RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR return } diff --git a/service/cardholder/init.go b/service/cardholder/init.go index e2774c0..bc5a4f3 100644 --- a/service/cardholder/init.go +++ b/service/cardholder/init.go @@ -1,8 +1,8 @@ package cardholder import ( - "apigame/common/svconst" - "apigame/common/svmysql" + "apigame/service-common/svconst" + "apigame/service-common/svmysql" ) func Init() { diff --git a/service/cardholder/logic.go b/service/cardholder/logic.go index cf99f2b..55d7bd5 100644 --- a/service/cardholder/logic.go +++ b/service/cardholder/logic.go @@ -1,10 +1,10 @@ package cardholder import ( - "apigame/common/svmysql" "apigame/configs" "apigame/models" - "apigame/service/constd" + "apigame/service-common/svmysql" + "apigame/service/code-msg" "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" "apigame/util/utjson" @@ -65,23 +65,23 @@ func LoadData(gameId string, uid int64, config *configs.CardActivityConfig) (d * func CheckStatus(conf *configs.CardActivityConfig) string { sec := lxtime.NowUninx() if conf.Id == 0 { - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR + return code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR } if sec < conf.StartTime { - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR + return code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR } if sec > conf.EndTime { - return constd.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR + return code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR } - return constd.RECODE_OK + return code_msg.RECODE_OK } // CheckGameData 检查游戏数据 轮次等 func CheckGameData(d *DataCardHolder, conf *configs.CardActivityConfig) string { if d.Details.Round > conf.Round { - return constd.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR + return code_msg.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR } - return constd.RECODE_OK + return code_msg.RECODE_OK } // GetUserSequenceIdAndCohort 获取 用户序列组ID(sequenceId) 用户分组(cohort) diff --git a/service/code-msg/code-msg.go b/service/code-msg/code-msg.go new file mode 100644 index 0000000..e2df54c --- /dev/null +++ b/service/code-msg/code-msg.go @@ -0,0 +1,121 @@ +package code_msg + +import ( + "apigame/util/util-lx/lxalilog" + "apigame/util/util-lx/lxtime" +) + +const ( + RECODE_OK = "0" + RECODE_FALIED = "1000" + RECODE_UNKNOWERR = "1001" + RECODE_PARAMERROR = "1002" + RECODE_SIGNERROR = "1003" + RECODE_DATA_BUCUNZIA_ERROR = "1004" + RECODE_PARAMDECODE_ERROR = "1005" + RECODE_DATANOEXIST_ERROR = "1006" + RECODE_CREATEUID_ERROR = "1007" + RECODE_LOGINCHECK_ERROR = "1008" + RECODE_WEIXINAZIFU_ERROR = "1009" + RECODE_SDKMEMBER_ERROR = "1010" + RECODE_CAOZUOPINFAN_ERROR = "1011" + RECODE_REQUESTXIANLIU_ERROR = "1110" + RECODE_REQUESTTIME_ERROR = "1111" + + RECODE_MERGE_CONFIG_ERROR = "2000" + RECODE_MERGE_CFLQ_ERROR = "2001" + RECODE_MERGE_AZSXLQ_ERROR = "2002" + RECODE_MERGE_QXGMSP_ERROR = "2003" + RECODE_MERGE_MEMBERSHIP_QXCZZK_ERROR = "2010" + RECODE_MERGE_MEMBERSHIP_QXCZYK_ERROR = "2011" + RECODE_MERGE_MEMBERSHIP_QXCZ_ERROR = "2012" + RECODE_MERGE_MEMBERSHIP_BNCFLQ_ERROR = "2013" + + RECODE_MERGE_NOVICE_QXCZ_ERROR = "2021" + RECODE_MERGE_NOVICE_BNCFLQ_ERROR = "2032" + RECODE_MERGE_NOVICE_MYDDLQTJ_ERROR = "2033" + RECODE_MERGE_HUODONGWEIKAISHI_ERROR = "2040" + RECODE_MERGE_HUODONGYIJIESHU_ERROR = "2041" + RECODE_MERGE_CCZDXX_ERROR = "2042" + RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR = "2051" + RECODE_MERGE_QINGXIANGMTXZ_ERROR = "2052" + + RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR = "2100" + RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR = "2101" + RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR = "2102" + RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR = "2103" + RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR = "2104" + RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105" + RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106" + RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR = "2107" +) + +var recodeText = map[string]string{ + RECODE_OK: "成功", + RECODE_FALIED: "操作失败", + RECODE_UNKNOWERR: "未知错误", + RECODE_PARAMERROR: "参数错误", + RECODE_SIGNERROR: "签名错误", + RECODE_DATA_BUCUNZIA_ERROR: "数据不存在", + RECODE_PARAMDECODE_ERROR: "解析参数失败,请检查参数合法性", + RECODE_DATANOEXIST_ERROR: "数据不存在", + RECODE_CREATEUID_ERROR: "创建用户UID失败", + RECODE_LOGINCHECK_ERROR: "登录验证失败,请重新登录", + RECODE_WEIXINAZIFU_ERROR: "参数存在危险字符", + RECODE_SDKMEMBER_ERROR: "获取SDK用户信息失败", + RECODE_CAOZUOPINFAN_ERROR: "操作频繁", + RECODE_REQUESTXIANLIU_ERROR: "操作被限流", + RECODE_REQUESTTIME_ERROR: "time errors", + + RECODE_MERGE_CONFIG_ERROR: "获取配置文件错误", + RECODE_MERGE_CFLQ_ERROR: "不能重复领取", + RECODE_MERGE_AZSXLQ_ERROR: "请按照顺序领取", + RECODE_MERGE_QXGMSP_ERROR: "请先购买对应商品", + + RECODE_MERGE_MEMBERSHIP_QXCZZK_ERROR: "请先购买周卡", + RECODE_MERGE_MEMBERSHIP_QXCZYK_ERROR: "请先购买月卡", + RECODE_MERGE_MEMBERSHIP_QXCZ_ERROR: "请先购买对应商品", + RECODE_MERGE_MEMBERSHIP_BNCFLQ_ERROR: "不能重复领取", + + RECODE_MERGE_NOVICE_QXCZ_ERROR: "请先购买对应商品", + RECODE_MERGE_NOVICE_BNCFLQ_ERROR: "不能重复领取", + RECODE_MERGE_NOVICE_MYDDLQTJ_ERROR: "没有达到领取条件", + + RECODE_MERGE_HUODONGWEIKAISHI_ERROR: "活动未开始", + RECODE_MERGE_HUODONGYIJIESHU_ERROR: "活动已结束", + RECODE_MERGE_CCZDXX_ERROR: "超出最大限制", + + RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR: "通行证不存在", + RECODE_MERGE_QINGXIANGMTXZ_ERROR: "请先购买通行证", + + RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR: "活动未开放", + RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR: "活动未开始", + RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR: "活动已结束", + RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR: "活动轮次已全部完成", + RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR: "卡包ID错误", + RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误", + RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足", + RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR: "没有星星商店自动兑换信息", +} + +func RecodeText(code string) string { + str, ok := recodeText[code] + if ok { + return str + } + return RecodeText(RECODE_UNKNOWERR) +} + +func CodeMsg(data map[string]interface{}, code interface{}) map[string]interface{} { + data["code"] = code + data["msg"] = RecodeText(code.(string)) + lxtime.NowUninx() + data["servertime"] = lxtime.NowUninx() + return data +} + +func CodeMsgLog(data map[string]interface{}, code interface{}, log ...interface{}) map[string]interface{} { + // 写入日志 + lxalilog.ErrorCode(code, log) + return CodeMsg(data, code) +} diff --git a/service/constd/code-msg.go b/service/constd/code-msg.go deleted file mode 100644 index 125257a..0000000 --- a/service/constd/code-msg.go +++ /dev/null @@ -1,121 +0,0 @@ -package constd - -import ( - "apigame/util/util-lx/lxalilog" - "apigame/util/util-lx/lxtime" -) - -const ( - RECODE_OK = "0" - RECODE_FALIED = "1000" - RECODE_UNKNOWERR = "1001" - RECODE_PARAMERROR = "1002" - RECODE_SIGNERROR = "1003" - RECODE_DATA_BUCUNZIA_ERROR = "1004" - RECODE_PARAMDECODE_ERROR = "1005" - RECODE_DATANOEXIST_ERROR = "1006" - RECODE_CREATEUID_ERROR = "1007" - RECODE_LOGINCHECK_ERROR = "1008" - RECODE_WEIXINAZIFU_ERROR = "1009" - RECODE_SDKMEMBER_ERROR = "1010" - RECODE_CAOZUOPINFAN_ERROR = "1011" - RECODE_REQUESTXIANLIU_ERROR = "1110" - RECODE_REQUESTTIME_ERROR = "1111" - - RECODE_MERGE_CONFIG_ERROR = "2000" - RECODE_MERGE_CFLQ_ERROR = "2001" - RECODE_MERGE_AZSXLQ_ERROR = "2002" - RECODE_MERGE_QXGMSP_ERROR = "2003" - RECODE_MERGE_MEMBERSHIP_QXCZZK_ERROR = "2010" - RECODE_MERGE_MEMBERSHIP_QXCZYK_ERROR = "2011" - RECODE_MERGE_MEMBERSHIP_QXCZ_ERROR = "2012" - RECODE_MERGE_MEMBERSHIP_BNCFLQ_ERROR = "2013" - - RECODE_MERGE_NOVICE_QXCZ_ERROR = "2021" - RECODE_MERGE_NOVICE_BNCFLQ_ERROR = "2032" - RECODE_MERGE_NOVICE_MYDDLQTJ_ERROR = "2033" - RECODE_MERGE_HUODONGWEIKAISHI_ERROR = "2040" - RECODE_MERGE_HUODONGYIJIESHU_ERROR = "2041" - RECODE_MERGE_CCZDXX_ERROR = "2042" - RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR = "2051" - RECODE_MERGE_QINGXIANGMTXZ_ERROR = "2052" - - RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR = "2100" - RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR = "2101" - RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR = "2102" - RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR = "2103" - RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR = "2104" - RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR = "2105" - RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR = "2106" - RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR = "2107" -) - -var recodeText = map[string]string{ - RECODE_OK: "成功", - RECODE_FALIED: "操作失败", - RECODE_UNKNOWERR: "未知错误", - RECODE_PARAMERROR: "参数错误", - RECODE_SIGNERROR: "签名错误", - RECODE_DATA_BUCUNZIA_ERROR: "数据不存在", - RECODE_PARAMDECODE_ERROR: "解析参数失败,请检查参数合法性", - RECODE_DATANOEXIST_ERROR: "数据不存在", - RECODE_CREATEUID_ERROR: "创建用户UID失败", - RECODE_LOGINCHECK_ERROR: "登录验证失败,请重新登录", - RECODE_WEIXINAZIFU_ERROR: "参数存在危险字符", - RECODE_SDKMEMBER_ERROR: "获取SDK用户信息失败", - RECODE_CAOZUOPINFAN_ERROR: "操作频繁", - RECODE_REQUESTXIANLIU_ERROR: "操作被限流", - RECODE_REQUESTTIME_ERROR: "time errors", - - RECODE_MERGE_CONFIG_ERROR: "获取配置文件错误", - RECODE_MERGE_CFLQ_ERROR: "不能重复领取", - RECODE_MERGE_AZSXLQ_ERROR: "请按照顺序领取", - RECODE_MERGE_QXGMSP_ERROR: "请先购买对应商品", - - RECODE_MERGE_MEMBERSHIP_QXCZZK_ERROR: "请先购买周卡", - RECODE_MERGE_MEMBERSHIP_QXCZYK_ERROR: "请先购买月卡", - RECODE_MERGE_MEMBERSHIP_QXCZ_ERROR: "请先购买对应商品", - RECODE_MERGE_MEMBERSHIP_BNCFLQ_ERROR: "不能重复领取", - - RECODE_MERGE_NOVICE_QXCZ_ERROR: "请先购买对应商品", - RECODE_MERGE_NOVICE_BNCFLQ_ERROR: "不能重复领取", - RECODE_MERGE_NOVICE_MYDDLQTJ_ERROR: "没有达到领取条件", - - RECODE_MERGE_HUODONGWEIKAISHI_ERROR: "活动未开始", - RECODE_MERGE_HUODONGYIJIESHU_ERROR: "活动已结束", - RECODE_MERGE_CCZDXX_ERROR: "超出最大限制", - - RECODE_MERGE_TONGXINGZHENGBUCUNZAI_ERROR: "通行证不存在", - RECODE_MERGE_QINGXIANGMTXZ_ERROR: "请先购买通行证", - - RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR: "活动未开放", - RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR: "活动未开始", - RECODE_MERGE_CARDHOLDER_NOTOPEN2_ERROR: "活动已结束", - RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR: "活动轮次已全部完成", - RECODE_MERGE_CARDHOLDER_CARDHOLDERID_ERROR: "卡包ID错误", - RECODE_MERGE_CARDHOLDER_STARSHOPID_ERROR: "商店ID错误", - RECODE_MERGE_CARDHOLDER_STAR_NOTENOUGH_ERROR: "星星商店星星不足", - RECODE_MERGE_CARDHOLDER_NOAUTOEXCHANGEINFO_ERROR: "没有星星商店自动兑换信息", -} - -func RecodeText(code string) string { - str, ok := recodeText[code] - if ok { - return str - } - return RecodeText(RECODE_UNKNOWERR) -} - -func CodeMsg(data map[string]interface{}, code interface{}) map[string]interface{} { - data["code"] = code - data["msg"] = RecodeText(code.(string)) - lxtime.NowUninx() - data["servertime"] = lxtime.NowUninx() - return data -} - -func CodeMsgLog(data map[string]interface{}, code interface{}, log ...interface{}) map[string]interface{} { - // 写入日志 - lxalilog.ErrorCode(code, log) - return CodeMsg(data, code) -} diff --git a/service/constd/mysql.go b/service/constd/mysql.go deleted file mode 100644 index 773671c..0000000 --- a/service/constd/mysql.go +++ /dev/null @@ -1,21 +0,0 @@ -package constd - -// mysql -// 创建时间:2023/4/3 15:28 -// 创建人:lixu - -const ( - MYSQL_DEFAULT = "default" - MYSQL_DBAPI = "api" - MYSQL_MERGECOMMON = "merge_common" - MYSQL_MERGECONFIG = "merge_config" - MYSQL_DEFAULT_QUERY_MAXCOUNT = 100 - - MYSQL_TABLE_S_CARDHOLDER_CONFIG = "s_card_activity_" // 开卡包活动配置 - MYSQL_TABLE_S_CARDHOLDER_DATA = "s_cardholder_data_" // 开卡包活动数据 - MYSQL_TABLE_S_CARDHOLDER_RECORD_GETNEW = "s_cardholder_record_getnew_" // 开卡包活动日志获得卡包 - MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN = "s_cardholder_record_open_" // 开卡包活动日志开卡包 - MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM = "s_cardholder_record_rewardalbum_" // 开卡包活动日志领取卡组奖励 - MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND = "s_cardholder_record_rewardround_" // 开卡包活动日志领取轮次奖励 - -) diff --git a/util/utdto/base.go b/util/utdto/base.go deleted file mode 100644 index e2f247b..0000000 --- a/util/utdto/base.go +++ /dev/null @@ -1,44 +0,0 @@ -package utdto - -import ( - "gorm.io/gorm" - "strings" -) - -// Insert 插入 -func Insert(db *gorm.DB, value any, tableName string) *gorm.DB { - stmt := db.Session(&gorm.Session{DryRun: true}).Create(value).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, MYSQL_TABLE_TEMPLATE, tableName, -1) - return db.Exec(sql, stmt.Vars...) -} - -// Update 更新 -func Update(db *gorm.DB, value any, tableName string) *gorm.DB { - stmt := db.Session(&gorm.Session{DryRun: true}).Updates(value).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, MYSQL_TABLE_TEMPLATE, tableName, -1) - return db.Exec(sql, stmt.Vars...) -} - -// Save 保存 -func Save(db *gorm.DB, value any, tableName string) *gorm.DB { - stmt := db.Session(&gorm.Session{DryRun: true}).Save(value).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, MYSQL_TABLE_TEMPLATE, tableName, -1) - return db.Exec(sql, stmt.Vars...) -} - -func First(db *gorm.DB, value any, tableName string) *gorm.DB { - stmt := db.Session(&gorm.Session{DryRun: true}).First(value).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, MYSQL_TABLE_TEMPLATE, tableName, -1) - return db.Raw(sql, stmt.Vars...).Scan(value) -} - -func Find(db *gorm.DB, value any, tableName string) *gorm.DB { - stmt := db.Session(&gorm.Session{DryRun: true}).Find(value).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, MYSQL_TABLE_TEMPLATE, tableName, -1) - return db.Raw(sql, stmt.Vars...).Scan(value) -} diff --git a/util/utdto/mysql.go b/util/utdto/mysql.go deleted file mode 100644 index 3cc7e28..0000000 --- a/util/utdto/mysql.go +++ /dev/null @@ -1,12 +0,0 @@ -package utdto - -import ( - "gorm.io/driver/mysql" - "gorm.io/gorm" -) - -const MYSQL_TABLE_TEMPLATE = "all_table_template" // 表名模板 - -func ConnectMySQL(dsn string) (db *gorm.DB, err error) { - return gorm.Open(mysql.Open(dsn), &gorm.Config{}) -} diff --git a/util/utdto/table.go b/util/utdto/table.go deleted file mode 100644 index b26f53a..0000000 --- a/util/utdto/table.go +++ /dev/null @@ -1,132 +0,0 @@ -package utdto - -import ( - "fmt" - "gorm.io/driver/mysql" - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/migrator" - "strings" -) - -func InitTable(db *gorm.DB, value any, tableName string) { - m := db.Migrator().(mysql.Migrator).Migrator - queryTx, execTx := m.GetQueryAndExecTx() - if HasTable(queryTx.Migrator().(mysql.Migrator).Migrator, value, tableName) { - fmt.Println(tableName + " exist, skip!") - } else { - err := CreateTable(execTx, value, tableName) - if err != nil { - fmt.Println("err", err) - } - } -} - -func HasTable(m migrator.Migrator, value interface{}, tableName string) bool { - var count int64 - - m.RunWithValue(value, func(stmt *gorm.Statement) error { - currentDatabase := m.DB.Migrator().CurrentDatabase() - 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) - }) - - return count > 0 -} - -func CreateTable(execTx *gorm.DB, value any, tableName string) error { - m := execTx.Migrator().(mysql.Migrator).Migrator - tx := m.DB.Session(&gorm.Session{}) - - if err := m.RunWithValue(value, func(stmt *gorm.Statement) (err error) { - var ( - createTableSQL = "CREATE TABLE ? (" - values = []interface{}{clause.Table{Name: tableName}} - hasPrimaryKeyInDataType bool - ) - - for _, dbName := range stmt.Schema.DBNames { - field := stmt.Schema.FieldsByDBName[dbName] - if !field.IgnoreMigration { - createTableSQL += "? ?" - hasPrimaryKeyInDataType = hasPrimaryKeyInDataType || strings.Contains(strings.ToUpper(m.DataTypeOf(field)), "PRIMARY KEY") - values = append(values, clause.Column{Name: dbName}, m.DB.Migrator().FullDataTypeOf(field)) - createTableSQL += "," - } - } - - if !hasPrimaryKeyInDataType && len(stmt.Schema.PrimaryFields) > 0 { - createTableSQL += "PRIMARY KEY ?," - primaryKeys := make([]interface{}, 0, len(stmt.Schema.PrimaryFields)) - for _, field := range stmt.Schema.PrimaryFields { - primaryKeys = append(primaryKeys, clause.Column{Name: field.DBName}) - } - - values = append(values, primaryKeys) - } - - for _, idx := range stmt.Schema.ParseIndexes() { - if m.CreateIndexAfterCreateTable { - defer func(value interface{}, name string) { - if err == nil { - err = tx.Migrator().CreateIndex(value, name) - } - }(value, idx.Name) - } else { - if idx.Class != "" { - createTableSQL += idx.Class + " " - } - createTableSQL += "INDEX ? ?" - - if idx.Comment != "" { - createTableSQL += fmt.Sprintf(" COMMENT '%s'", idx.Comment) - } - - if idx.Option != "" { - createTableSQL += " " + idx.Option - } - - createTableSQL += "," - values = append(values, clause.Column{Name: idx.Name}, tx.Migrator().(migrator.BuildIndexOptionsInterface).BuildIndexOptions(idx.Fields, stmt)) - } - } - - if !m.DB.DisableForeignKeyConstraintWhenMigrating && !m.DB.IgnoreRelationshipsWhenMigrating { - for _, rel := range stmt.Schema.Relationships.Relations { - if rel.Field.IgnoreMigration { - continue - } - if constraint := rel.ParseConstraint(); constraint != nil { - if constraint.Schema == stmt.Schema { - sql, vars := constraint.Build() - createTableSQL += sql + "," - values = append(values, vars...) - } - } - } - } - - for _, uni := range stmt.Schema.ParseUniqueConstraints() { - createTableSQL += "CONSTRAINT ? UNIQUE (?)," - values = append(values, clause.Column{Name: uni.Name}, clause.Expr{SQL: stmt.Quote(uni.Field.DBName)}) - } - - for _, chk := range stmt.Schema.ParseCheckConstraints() { - createTableSQL += "CONSTRAINT ? CHECK (?)," - values = append(values, clause.Column{Name: chk.Name}, clause.Expr{SQL: chk.Constraint}) - } - - createTableSQL = strings.TrimSuffix(createTableSQL, ",") - - createTableSQL += ")" - - if tableOption, ok := m.DB.Get("gorm:table_options"); ok { - createTableSQL += fmt.Sprint(tableOption) - } - - err = tx.Exec(createTableSQL, values...).Error - return err - }); err != nil { - return err - } - return nil -} -- libgit2 0.21.0