From 908db8e3fe81efbc44228bf18a530be48c5bc49c Mon Sep 17 00:00:00 2001 From: 王家文 Date: Fri, 12 Apr 2024 10:59:54 +0800 Subject: [PATCH] refactor: orm重构 --- dto/cardholder-record.go | 87 ++++++++++++++++++++++++++------------------------------------------------------------- dto/cardholder.go | 46 +++++++++++----------------------------------- dto/dto.go | 45 +++++---------------------------------------- dto/init-dto.go | 39 +++++++++++++++++++++++++++++++++++++++ dto/inits.go | 4 ++-- dto/interface.go | 22 ++++++++++------------ dto/player-data.go | 68 +++++++++++++++++++------------------------------------------------- dto/record.go | 31 ++----------------------------- go.mod | 6 +++++- go.sum | 12 +++++++++++- service/cardholder/handle.go | 18 +++++++++--------- service/cardholder/logic.go | 2 +- util/utildto/mysql.go | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 13 files changed, 309 insertions(+), 240 deletions(-) create mode 100644 dto/init-dto.go create mode 100644 util/utildto/mysql.go diff --git a/dto/cardholder-record.go b/dto/cardholder-record.go index 5988eb0..4e4c1a7 100644 --- a/dto/cardholder-record.go +++ b/dto/cardholder-record.go @@ -3,31 +3,19 @@ package dto import ( "apigame/service/constd" "apigame/util/util-lx/lxtime" - "fmt" + "apigame/util/utildto" ) // CardHolderRecordBase 开卡包活动日志公共 type CardHolderRecordBase struct { - Id int64 `orm:"auto"` // 日志ID - Uid int64 // 玩家唯一ID - SequenceId string // 用户序列组ID - Cohort string // 用户分组ID - ActivityId int64 // 当前活动ID - Round int // 当前轮次 - CreateTime int64 // 创建时间戳 - UpdateTime int64 // 修改时间戳 -} - -func (d *CardHolderRecordBase) SqlPairsBase() map[string]string { - m := make(map[string]string) - m["uid"] = fmt.Sprintf("%d", d.Uid) - m["sequence_id"] = fmt.Sprintf("'%s'", d.SequenceId) - m["cohort"] = fmt.Sprintf("'%s'", d.Cohort) - m["activity_id"] = fmt.Sprintf("%d", d.ActivityId) - m["round"] = fmt.Sprintf("%d", d.Round) - m["create_time"] = fmt.Sprintf("%d", d.CreateTime) - m["update_time"] = fmt.Sprintf("%d", d.UpdateTime) - return m + Id int64 `gorm:"primaryKey;comment:日志ID"` + Uid int64 `gorm:"comment:玩家唯一ID"` + SequenceId string `gorm:"type:varchar(255);comment:用户序列组ID"` + Cohort string `gorm:"type:varchar(255);comment:用户分组ID"` + ActivityId int64 `gorm:"comment:当前活动ID"` + Round int `gorm:"comment:当前轮次"` + CreateTime int64 `gorm:"comment:创建时间戳"` + UpdateTime int64 `gorm:"comment:修改时间戳"` } func NewCardHolderRecordBase(uid int64, sequenceId string, cohort string, activityId int64, round int) CardHolderRecordBase { @@ -46,23 +34,15 @@ func NewCardHolderRecordBase(uid int64, sequenceId string, cohort string, activi // CardHolderRecordOpen 开卡包活动日志开卡包 type CardHolderRecordOpen struct { CardHolderRecordBase - CardholderId int // 卡包ID - CardList string // 开卡内容 -} - -func (d *CardHolderRecordOpen) TableName(gameId string) string { - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN + gameId + CardholderId int `gorm:"comment:卡包ID"` + CardList string `gorm:"type:varchar(255);comment:开卡内容"` } -func (d *CardHolderRecordOpen) CreateSqlPath() string { - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN +func (d *CardHolderRecordOpen) TableName() string { + return utildto.MYSQL_TABLE_TEMPLATE } - -func (d *CardHolderRecordOpen) SqlPairs() map[string]string { - m := d.SqlPairsBase() - m["cardholder_id"] = fmt.Sprintf("%d", d.CardholderId) - m["card_list"] = fmt.Sprintf("'%s'", d.CardList) - return m +func (d *CardHolderRecordOpen) GetTableName(gameId string) string { + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_OPEN + gameId } func NewCardHolderRecordOpen(recordBase CardHolderRecordBase, @@ -77,23 +57,15 @@ func NewCardHolderRecordOpen(recordBase CardHolderRecordBase, // CardHolderRecordRewardAlbum 开卡包活动日志领取卡组奖励 type CardHolderRecordRewardAlbum struct { CardHolderRecordBase - AlbumId string // 卡组ID - Award string // 奖励内容 + AlbumId string `gorm:"type:varchar(255);comment:卡组ID"` + Award string `gorm:"type:varchar(255);comment:奖励内容"` } -func (d *CardHolderRecordRewardAlbum) TableName(gameId string) string { - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM + gameId +func (d *CardHolderRecordRewardAlbum) TableName() string { + return utildto.MYSQL_TABLE_TEMPLATE } - -func (d *CardHolderRecordRewardAlbum) CreateSqlPath() string { - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM -} - -func (d *CardHolderRecordRewardAlbum) SqlPairs() map[string]string { - m := d.SqlPairsBase() - m["album_id"] = fmt.Sprintf("'%s'", d.AlbumId) - m["award"] = fmt.Sprintf("'%s'", d.Award) - return m +func (d *CardHolderRecordRewardAlbum) GetTableName(gameId string) string { + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDALBUM + gameId } func NewCardHolderRecordRewardAlbum(recordBase CardHolderRecordBase, @@ -108,21 +80,14 @@ func NewCardHolderRecordRewardAlbum(recordBase CardHolderRecordBase, // CardHolderRecordRewardRound 开卡包活动日志领取轮次奖励 type CardHolderRecordRewardRound struct { CardHolderRecordBase - Award string // 奖励内容 -} - -func (d *CardHolderRecordRewardRound) TableName(gameId string) string { - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND + gameId + Award string `gorm:"type:varchar(255);comment:奖励内容"` } -func (d *CardHolderRecordRewardRound) CreateSqlPath() string { - return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND +func (d *CardHolderRecordRewardRound) TableName() string { + return utildto.MYSQL_TABLE_TEMPLATE } - -func (d *CardHolderRecordRewardRound) SqlPairs() map[string]string { - m := d.SqlPairsBase() - m["award"] = fmt.Sprintf("'%s'", d.Award) - return m +func (d *CardHolderRecordRewardRound) GetTableName(gameId string) string { + return constd.MYSQL_TABLE_S_CARDHOLDER_RECORD_REWARDROUND + gameId } func NewCardHolderRecordRewardRound(recordBase CardHolderRecordBase, diff --git a/dto/cardholder.go b/dto/cardholder.go index a317eed..c6f1284 100644 --- a/dto/cardholder.go +++ b/dto/cardholder.go @@ -4,33 +4,18 @@ import ( "apigame/service/constd" "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" + "apigame/util/utildto" "encoding/json" - "fmt" - "github.com/astaxie/beego/orm" ) -func InitCardholder() { - - // create table - o := orm.NewOrm() - for _, gameId := range constd.GameListCardHolder { - CreateTable(o, constd.MYSQL_MERGECOMMON, new(CardHolderData), gameId) - - CreateTable(o, constd.MYSQL_MERGECOMMON, new(CardHolderRecordOpen), gameId) - CreateTable(o, constd.MYSQL_MERGECOMMON, new(CardHolderRecordRewardAlbum), gameId) - CreateTable(o, constd.MYSQL_MERGECOMMON, new(CardHolderRecordRewardRound), gameId) - } - -} - // CardHolderData 卡牌活动持久数据 type CardHolderData struct { - Uid int64 // 玩家唯一ID - ActivityId int64 // 活动ID - Details *CardHolderDataDetails // 活动详情 - DetailsText string // 活动详情封装 - CreateTime int64 // 创建时间戳 - UpdateTime int64 // 修改时间戳 + Uid int64 `gorm:"primaryKey;comment:玩家唯一ID"` + ActivityId int64 `gorm:"comment:活动ID"` + Details *CardHolderDataDetails `gorm:"-"` // 活动详情 + DetailsText string `gorm:"comment:活动详情封装"` + CreateTime int64 `gorm:"comment:创建时间戳"` + UpdateTime int64 `gorm:"comment:修改时间戳"` } // CardHolderDataDetails 卡牌活动详情 @@ -61,21 +46,12 @@ func NewCardHolderDataDetails() *CardHolderDataDetails { } } -func (d *CardHolderData) TableName(gameId string) string { - return constd.MYSQL_TABLE_S_CARDHOLDER_DATA + gameId +func (d *CardHolderData) TableName() string { + return utildto.MYSQL_TABLE_TEMPLATE } -func (d *CardHolderData) CreateSqlPath() string { - return constd.MYSQL_TABLE_S_CARDHOLDER_DATA -} - -func (d *CardHolderData) SqlPairs() map[string]string { - m := make(map[string]string) - m["activity_id"] = fmt.Sprintf("%d", d.ActivityId) - m["details_text"] = fmt.Sprintf("'%s'", d.DetailsText) - m["create_time"] = fmt.Sprintf("%d", d.CreateTime) - m["update_time"] = fmt.Sprintf("%d", d.UpdateTime) - return m +func (d *CardHolderData) GetTableName(gameId string) string { + return constd.MYSQL_TABLE_S_CARDHOLDER_DATA + gameId } func (d *CardHolderData) Init(uid int64) { diff --git a/dto/dto.go b/dto/dto.go index 66f561f..680912c 100644 --- a/dto/dto.go +++ b/dto/dto.go @@ -1,46 +1,11 @@ package dto import ( - "github.com/astaxie/beego/logs" - "github.com/astaxie/beego/orm" - "io/ioutil" - "os" - "strings" + "apigame/util/utildto" + "gorm.io/gorm" ) -func CreateTable(o orm.Ormer, dbName string, tb ITableData, gameId string) (err error) { - - o.Using(dbName) - - createSqlPath := "./conf/conf/db/" + tb.CreateSqlPath() + ".sql" - createSql, err := readFileSql(createSqlPath, tb.TableName(gameId)) - if err != nil { - logs.Error(err) - return - } - - _, err = o.Raw(createSql).Exec() - if err != nil { - //logs.Error(err) - return - } - - return -} - -func readFileSql(createSqlPath, tableName string) (sql string, err error) { - filePtr, err := os.Open(createSqlPath) - if err != nil { - return - } - defer filePtr.Close() - - by, err := ioutil.ReadAll(filePtr) - if err != nil { - return - } - - sql = strings.Replace(string(by), "{tablename}", tableName, -1) - - return +func InitTable(db *gorm.DB, tb ITableData, gameId string) { + tableName := tb.GetTableName(gameId) + utildto.InitTable(db, tb, tableName) } diff --git a/dto/init-dto.go b/dto/init-dto.go new file mode 100644 index 0000000..9164738 --- /dev/null +++ b/dto/init-dto.go @@ -0,0 +1,39 @@ +package dto + +import ( + "apigame/service/constd" + "apigame/util/utildto" + "fmt" + "github.com/astaxie/beego" + "gorm.io/gorm" +) + +var ( + DbCommon *gorm.DB + DbConfig *gorm.DB +) + +func InitDto() { + + // ConnectMySQL + if db, err := utildto.ConnectMySQL(beego.AppConfig.String("mysql::mergecommon")); err == nil { + DbCommon = db + } else { + fmt.Println(" InitMysqls Error::" + err.Error()) + } + if db, err := utildto.ConnectMySQL(beego.AppConfig.String("mysql::" + constd.MYSQL_MERGECONFIG)); err == nil { + DbConfig = db + } else { + + } + + // create table + // 卡牌卡包 + for _, gameId := range constd.GameListCardHolder { + InitTable(DbCommon, new(CardHolderData), gameId) + InitTable(DbCommon, new(CardHolderRecordOpen), gameId) + InitTable(DbCommon, new(CardHolderRecordRewardAlbum), gameId) + InitTable(DbCommon, new(CardHolderRecordRewardRound), gameId) + } + +} diff --git a/dto/inits.go b/dto/inits.go index ff36716..6affc4d 100644 --- a/dto/inits.go +++ b/dto/inits.go @@ -70,8 +70,8 @@ func Inits() (err error) { // //_ = config.InitLxLimit() - // 海滩卡包 - InitCardholder() + // dto + InitDto() return } diff --git a/dto/interface.go b/dto/interface.go index b285a65..65a4c57 100644 --- a/dto/interface.go +++ b/dto/interface.go @@ -2,25 +2,23 @@ package dto // ITableData 数据库表 type ITableData interface { - // TableName 表名 后缀是 gameId - TableName(gameId string) string - // CreateSqlPath 创建sql位置 - CreateSqlPath() string + // GetTableName 表名 后缀是 gameId + GetTableName(gameId string) string } type IRecordData interface { - // TableName 表名 后缀是 gameId - TableName(gameId string) string - // SqlPairs 数据键值对 - SqlPairs() map[string]string + // TableName 表名模板 + TableName() string + // GetTableName 表名 后缀是 gameId + GetTableName(gameId string) string } // IPlayerData 玩家数据表 type IPlayerData interface { - // TableName 表名 后缀是 gameId - TableName(gameId string) string - // SqlPairs 数据键值对 - SqlPairs() map[string]string + // TableName 表名模板 + TableName() string + // GetTableName 表名 后缀是 gameId + GetTableName(gameId string) string // Init 新建 Init(uid int64) } diff --git a/dto/player-data.go b/dto/player-data.go index 3498e98..c26304b 100644 --- a/dto/player-data.go +++ b/dto/player-data.go @@ -1,67 +1,37 @@ package dto import ( - "apigame/service/constd" "apigame/util/util-lx/lxalilog" - "apigame/util/utmysql" - "fmt" - "github.com/astaxie/beego/orm" + "apigame/util/utildto" + "strings" ) func LoadPlayerData(gameId string, uid int64, data IPlayerData) (has bool, err error) { - tableName := data.TableName(gameId) - sql := fmt.Sprintf("select * from %s where uid=%d limit 1", tableName, uid) - has, err = utmysql.FindOneSql(constd.MYSQL_MERGECOMMON, sql, data) - if err != nil { - lxalilog.Errors(err, sql, gameId, uid) - return + result := utildto.First(DbCommon, data, data.GetTableName(gameId)) + err = result.Error + if err == nil { + has = true + } else { + has = false + if strings.Contains(err.Error(), "record not found") { + err = nil + } else { + lxalilog.Errors(err, gameId, uid) + return + } } // 档案不存在 新建 if !has { data.Init(uid) - CreatePlayerData(gameId, uid, data) + CreatePlayerData(gameId, data) } return } -func CreatePlayerData(gameId string, uid int64, data IPlayerData) { - text1 := "" - text2 := "" - for s, s2 := range data.SqlPairs() { - text1 += "," + s - text2 += "," + s2 - } - sql := fmt.Sprintf("insert into %s (uid%s) value (%d%s)", - data.TableName(gameId), text1, uid, text2) - - o := orm.NewOrm() - o.Using(constd.MYSQL_MERGECOMMON) - - _, err := o.Raw(sql).Exec() - if err != nil { - lxalilog.Errors(err, sql, gameId, uid) - return - } +func CreatePlayerData(gameId string, data IPlayerData) { + utildto.Insert(DbCommon, data, data.GetTableName(gameId)) } -func SavePlayerData(gameId string, uid int64, data IPlayerData) { - text := "" - indexPairs := 0 - for s, s2 := range data.SqlPairs() { - if indexPairs != 0 { - text += "," - } - text += fmt.Sprintf("%s=%s", s, s2) - indexPairs++ - } - sql := fmt.Sprintf("update %s set %s where uid=%d", data.TableName(gameId), text, uid) - - o := orm.NewOrm() - o.Using(constd.MYSQL_MERGECOMMON) - - _, err := o.Raw(sql).Exec() - if err != nil { - lxalilog.Errors(err, sql, gameId, uid) - return - } +func SavePlayerData(gameId string, data IPlayerData) { + utildto.Save(DbCommon, data, data.GetTableName(gameId)) } diff --git a/dto/record.go b/dto/record.go index bae1ec6..fa0508d 100644 --- a/dto/record.go +++ b/dto/record.go @@ -1,34 +1,7 @@ package dto -import ( - "apigame/service/constd" - "apigame/util/util-lx/lxalilog" - "fmt" - "github.com/astaxie/beego/orm" -) +import "apigame/util/utildto" func SaveRecord(gameId string, data IRecordData) { - text1 := "" - text2 := "" - indexPairs := 0 - for s, s2 := range data.SqlPairs() { - if indexPairs != 0 { - text1 += "," - text2 += "," - } - text1 += s - text2 += s2 - indexPairs++ - } - sql := fmt.Sprintf("insert into %s (%s) value (%s)", - data.TableName(gameId), text1, text2) - - o := orm.NewOrm() - o.Using(constd.MYSQL_MERGECOMMON) - - _, err := o.Raw(sql).Exec() - if err != nil { - lxalilog.Errors(err, sql, gameId) - return - } + utildto.Insert(DbCommon, data, data.GetTableName(gameId)) } diff --git a/go.mod b/go.mod index 2127c41..1fa9103 100644 --- a/go.mod +++ b/go.mod @@ -7,8 +7,10 @@ require ( github.com/aliyun/aliyun-log-go-sdk v0.1.72 github.com/astaxie/beego v1.12.3 github.com/garyburd/redigo v1.6.4 - github.com/go-sql-driver/mysql v1.5.0 + github.com/go-sql-driver/mysql v1.7.0 github.com/lixu-any/go-tools v0.0.0-20221128094643-07d54c69e9bf + gorm.io/driver/mysql v1.5.6 + gorm.io/gorm v1.25.9 ) require ( @@ -20,6 +22,8 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.4.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/pierrec/lz4 v2.6.0+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum index c8f6a50..5ef80ef 100644 --- a/go.sum +++ b/go.sum @@ -128,8 +128,9 @@ github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -203,6 +204,10 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -541,6 +546,11 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8= +gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8= +gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/service/cardholder/handle.go b/service/cardholder/handle.go index b4bdeb3..7fc1a16 100644 --- a/service/cardholder/handle.go +++ b/service/cardholder/handle.go @@ -92,12 +92,12 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH // 开始处理抽卡 sequenceId, cohort := GetUserSequenceIdAndCohort(req.UID) - //logs.Debug("wjwdbg 用户序列组IDsequenceId", sequenceId) - //logs.Debug("wjwdbg 用户分组IDcohort:", cohort) + //logs.Debug("dwjw 用户序列组IDsequenceId", sequenceId) + //logs.Debug("dwjw 用户分组IDcohort:", cohort) if confCardholder.IsNew != 0 { // 如果是新卡包 按顺序查找数目最少的一张卡抽取 cardId := GetNewCard(gameData, config) - //logs.Debug("wjwdbg 抽取新卡ID:", cardId) + //logs.Debug("dwjw 抽取新卡ID:", cardId) // 增加卡牌 gameData.Details.Cards[cardId] += 1 rsp.NewCards = append(rsp.NewCards, cardId) @@ -113,7 +113,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH gameData.Details.CardSequenceScales[combineId] = scale + 1 // 增加卡牌 gameData.Details.Cards[cardIdInt] += 1 - //logs.Debug("wjwdbg😊 抽取卡牌ID:", cardIdInt) + //logs.Debug("dwjw😊 抽取卡牌ID:", cardIdInt) rsp.NewCards = append(rsp.NewCards, cardIdInt) } } @@ -121,7 +121,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH // 先抽保底卡 if confCardholder.GuaranteedStarCardId != "0" { getCardFunc(confCardholder.GuaranteedStarCardId) - //logs.Debug("wjwdbg 保底卡牌配置ID:", confCardholder.GuaranteedStarCardId) + //logs.Debug("dwjw 保底卡牌配置ID:", confCardholder.GuaranteedStarCardId) } // 非保底卡 if confCardholder.NormalCardNumber > 0 { @@ -133,8 +133,8 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count) // 增加星级刻度 gameData.Details.StarSequenceScales[combineIdStar] = scaleStar + count - //logs.Debug("wjwdbg 非保底卡星级ID:", confCardholder.MinimumGuaranteeCardId) - //logs.Debug("wjwdbg 非保底卡星级抽取序列:", starIds) + //logs.Debug("dwjw 非保底卡星级ID:", confCardholder.MinimumGuaranteeCardId) + //logs.Debug("dwjw 非保底卡星级抽取序列:", starIds) // 遍历星级刻度抽取n张卡牌 for _, id := range starIds { getCardFunc(id) @@ -200,9 +200,9 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH // 存档 SaveData(req.GameID, gameData) - //logs.Debug("wjwdbg 获取卡牌列表:", rsp.NewCards) + //logs.Debug("dwjw 获取卡牌列表:", rsp.NewCards) uttype.Shuffle(rsp.NewCards) - //logs.Debug("wjwdbg 获取卡牌列表打乱:", rsp.NewCards) + //logs.Debug("dwjw 获取卡牌列表打乱:", rsp.NewCards) // 返回信息 rsp.CardHolderInfo = GetInfo(gameData, config) diff --git a/service/cardholder/logic.go b/service/cardholder/logic.go index 01e1d3d..441cf33 100644 --- a/service/cardholder/logic.go +++ b/service/cardholder/logic.go @@ -14,7 +14,7 @@ func SaveData(gameId string, d *dto.CardHolderData) { d.UpdateTime = lxtime.NowUninx() d.Encode() - dto.SavePlayerData(gameId, d.Uid, d) + dto.SavePlayerData(gameId, d) } func _LoadData(gameId string, uid int64) (d *dto.CardHolderData) { diff --git a/util/utildto/mysql.go b/util/utildto/mysql.go new file mode 100644 index 0000000..b724c47 --- /dev/null +++ b/util/utildto/mysql.go @@ -0,0 +1,169 @@ +package utildto + +import ( + "fmt" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/migrator" + "strings" +) + +const MYSQL_TABLE_TEMPLATE = "all_table_template" // 表名模板 + +func ConnectMySQL(dsn string) (db *gorm.DB, err error) { + return gorm.Open(mysql.Open(dsn), &gorm.Config{}) +} + +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 +} + +// 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) +} -- libgit2 0.21.0