窗口分页

This commit is contained in:
2024-11-10 09:43:57 +08:00
parent d5859d8126
commit b4400f00de
4 changed files with 106 additions and 60 deletions

View File

@@ -12,7 +12,7 @@ dev:
wait
link:
ssh -NCPf main -L 3306:localhost:3306 -L 19530:localhost:19530
ssh -NCPf ai -L 3306:localhost:3306 -L 19530:localhost:19530 -L 4080:localhost:4080 -L 5002:localhost:5002
# 编译项目
build:

View File

@@ -8,6 +8,8 @@ import (
"strings"
"git.satori.love/gameui/webp/models"
"github.com/doug-martin/goqu/v9"
_ "github.com/doug-martin/goqu/v9/dialect/mysql"
"github.com/graphql-go/graphql"
"github.com/graphql-go/graphql/language/ast"
"github.com/jmoiron/sqlx"
@@ -396,7 +398,7 @@ func NewSchema(config Config) (graphql.Schema, error) {
Args: graphql.FieldConfigArgument{
"era": &graphql.ArgumentConfig{Type: graphql.String, Description: "筛选图像中指定上线年份的"},
"device": &graphql.ArgumentConfig{Type: graphql.String, Description: "游戏设备"},
"sort": &graphql.ArgumentConfig{Type: graphql.String, Description: "排序方法"},
"sort": &graphql.ArgumentConfig{Type: graphql.String, Description: "排序方法", DefaultValue: "id"},
"order": &graphql.ArgumentConfig{Type: orderType, Description: "排序方向", DefaultValue: "ASC"},
"orientation": &graphql.ArgumentConfig{Type: graphql.String, Description: "筛选横屏竖屏图像"},
"follower": &graphql.ArgumentConfig{Type: graphql.Int, Description: "获取指定ID用户的关注列表发布的图像"},
@@ -441,16 +443,18 @@ func NewSchema(config Config) (graphql.Schema, error) {
mapstructure.Decode(p.Args, &args)
// 限制长度防止全表扫描
var limit = 10
if args.First != 0 {
limit = args.First
} else if args.Last != 0 {
limit = args.Last
}
//var limit = 10
//if args.First != 0 {
// limit = args.First
//} else if args.Last != 0 {
// limit = args.Last
//}
var total int
var images []Image
var query = db.Limit(limit)
//var query = db.Limit(limit).Table("web_images")
//order := "ORDER BY " + p.Args["sort"].(string) + " " + p.Args["order"].(string)
var query = goqu.Dialect("mysql").Select("id", goqu.L("ROW_NUMBER() OVER(ORDER BY id ASC)").As("row_num")).From("web_images")
// 参数映射
var argFormat = []string{"id", "width", "height", "content", "remark", "description", "tags", "rank", "comment_num", "praise_count", "collect_count", "article_id", "user_id"}
@@ -458,7 +462,8 @@ func NewSchema(config Config) (graphql.Schema, error) {
// 筛选条件
for _, format := range argFormat {
if p.Args[format] != nil {
query = query.Where(fmt.Sprintf("web_images.%s = ?", format), p.Args[format])
//query = query.Where(fmt.Sprintf("web_images.%s = ?", format), p.Args[format])
query.Where(goqu.Ex{fmt.Sprintf("web_images.%s = ?", format): p.Args[format]})
}
}
@@ -503,7 +508,7 @@ func NewSchema(config Config) (graphql.Schema, error) {
return map[string]interface{}{"list": []Image{}, "total": 0}, nil
}
query = query.Where("web_images.id IN (?)", item)
query = query.Where(goqu.Ex{"web_images.id": goqu.Op{"in": item}})
}
// 筛选:相似图像
@@ -524,36 +529,16 @@ func NewSchema(config Config) (graphql.Schema, error) {
fmt.Println("Interest:", args.Interest)
}
//// 数据库中筛选: 关注列表
//if args.Follower != 0 {
// // 返回JSON数组(2.5秒)
// var item string
// if err := db.Raw(`
// SELECT JSON_ARRAYAGG(web_images.id) AS json_result
// FROM web_fans
// INNER JOIN web_images ON web_images.user_id = web_fans.blogger_id
// WHERE web_fans.follower_id = ? AND web_images.article_category_top_id = 22
// `, args.Follower).Scan(&item).Error; err != nil {
// fmt.Println("获取关注列表失败", err)
// return nil, err
// }
// var ids []int
// json.Unmarshal([]byte(item), &ids)
// sort.Slice(ids, func(i, j int) bool {
// return ids[i] > ids[j] // 按照降序排列
// })
// id_list = append(id_list, ids)
//}
// 筛选:时间段
applyTimeCondition := func(name string, str string) {
parts := strings.Split(str, "-")
query = query.Where(fmt.Sprintf("YEAR(%s) = ?", name), parts[0])
query = query.Where(goqu.Ex{fmt.Sprintf("YEAR(%s)", name): parts[0]})
if len(parts) > 1 {
query = query.Where(fmt.Sprintf("MONTH(%s) = ?", name), parts[1])
query = query.Where(goqu.Ex{fmt.Sprintf("MONTH(%s)", name): parts[1]})
}
if len(parts) > 2 {
query = query.Where(fmt.Sprintf("DAY(%s) = ?", name), parts[2])
query = query.Where(goqu.Ex{fmt.Sprintf("DAY(%s)", name): parts[2]})
}
}
@@ -569,22 +554,31 @@ func NewSchema(config Config) (graphql.Schema, error) {
// 数据库中筛选:横屏纵屏
if p.Args["orientation"] != nil {
query.Where("article_orientation = ?", p.Args["orientation"])
query = query.Where(goqu.Ex{"article_orientation": p.Args["orientation"]})
}
// 数据库中筛选:游戏设备
if p.Args["device"] != nil {
query = query.Joins("JOIN web_article ON web_images.article_id = web_article.id AND web_article.device = ?", p.Args["device"])
query = query.Join(goqu.T("web_article"), goqu.On(
goqu.I("web_images.article_id").Eq(goqu.I("web_article.id")),
goqu.I("web_article.device").Eq(p.Args["device"]),
))
}
// 数据库中筛选:游戏上线年份
if p.Args["era"] != nil {
query = query.Joins("JOIN web_article ON web_images.article_id = web_article.id AND web_article.era = ?", p.Args["era"])
query = query.Join(goqu.T("web_article"), goqu.On(
goqu.I("web_images.article_id").Eq(goqu.I("web_article.id")),
goqu.I("web_article.era").Eq(p.Args["era"]),
))
}
// 数据库中筛选:按关注列表
if p.Args["follower"] != nil {
query = query.Joins("JOIN web_fans ON web_images.user_id = web_fans.blogger_id AND web_fans.follower_id = ?", p.Args["follower"])
query = query.Join(goqu.T("web_fans"), goqu.On(
goqu.I("web_images.user_id").Eq(goqu.I("web_fans.blogger_id")),
goqu.I("web_fans.follower_id").Eq(p.Args["follower"]),
))
}
// 排序
@@ -604,10 +598,10 @@ func NewSchema(config Config) (graphql.Schema, error) {
total = len(list)
var count int64
if len(list) > 0 {
query = query.Count(&count)
}
//var count int64
//if len(list) > 0 {
// query = query.Count(&count)
//}
// 截取: 分页
if args.After != 0 {
@@ -654,29 +648,61 @@ func NewSchema(config Config) (graphql.Schema, error) {
// 存在外部筛选条件
if len(id_list) > 0 && len(list) > 0 {
query = query.Where("id IN ?", list)
//query = query.Where("id IN ?", list)
//where = fmt.Sprintf("web_images.id IN ?", )
}
for index, item := range LoadItem(p.Info.FieldASTs[0].SelectionSet.Selections) {
fmt.Println(index, item)
query = query.Preload(item)
// 取所有数据的前N条
sql, _, _ := query.Where(goqu.Ex{"article_category_top_id": 22}).ToSQL()
// 取所有数据的前N条
var cursor string
if args.After != 0 {
cursor = fmt.Sprintf(`WHERE row_num > (SELECT row_num FROM RankedArticles WHERE id = %d)`, args.After)
}
// 排序规则
if args.Sort != "" && args.Order != "" {
query = query.Order(fmt.Sprintf("%s %s", args.Sort, args.Order))
}
// 取大于游标的数据
sql = fmt.Sprintf(`
WITH RankedArticles AS (%s)
SELECT web_images.* FROM web_images JOIN(
SELECT id FROM RankedArticles %s ORDER BY row_num LIMIT 5
) AS LimitedRanked ON web_images.id = LimitedRanked.id;
`, sql, cursor)
// 输出(游戏截图分类ID为22)
if err := query.Where("article_category_top_id = 22").Find(&images).Error; err != nil {
fmt.Println(sql)
if err := db.Raw(sql).Scan(&images).Error; err != nil {
fmt.Println("获取图像列表失败", err)
return nil, err
}
if total == 0 && count > 0 {
total = int(count)
var ids []int
for _, item := range images {
ids = append(ids, item.ID)
}
var find = db.Where("web_images.id IN ?", ids)
for index, item := range LoadItem(p.Info.FieldASTs[0].SelectionSet.Selections) {
fmt.Println(index, item)
find = find.Preload(item)
}
if err := find.Find(&images).Error; err != nil {
fmt.Println("获取图像列表失败", err)
return nil, err
}
//var order string
//// 排序规则
//if p.Args["sort"] != nil && p.Args["order"] != nil {
// // query = query.Order(fmt.Sprintf("%s %s", args.Sort, args.Order))
// order = "ORDER BY " + p.Args["sort"].(string) + " " + p.Args["order"].(string) + " "
//}
//if total == 0 && count > 0 {
// total = int(count)
//}
return map[string]interface{}{
"list": images,
"total": total,

6
go.mod
View File

@@ -9,6 +9,7 @@ require (
github.com/alibabacloud-go/tea v1.2.1
github.com/alibabacloud-go/vod-20170321/v2 v2.16.10
github.com/disintegration/imaging v1.6.2
github.com/doug-martin/goqu/v9 v9.19.0
github.com/graphql-go/graphql v0.8.1
github.com/graphql-go/handler v0.2.3
github.com/hashicorp/golang-lru/v2 v2.0.7
@@ -22,6 +23,7 @@ require (
)
require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect
github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 // indirect
github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect
@@ -37,7 +39,9 @@ require (
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-sqlite3 v1.14.24 // indirect
github.com/milvus-io/milvus-proto/go-api v0.0.0-20230301092744-7efc6eec15fd // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
@@ -66,7 +70,7 @@ require (
require (
github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible
github.com/chai2010/webp v1.1.1
github.com/go-sql-driver/mysql v1.7.1
github.com/go-sql-driver/mysql v1.8.1
github.com/sizeofint/gif-to-webp v0.0.0-20210224202734-e9d7ed071591
golang.org/x/image v0.20.0 // indirect
)

24
go.sum
View File

@@ -1,5 +1,9 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo=
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc=
github.com/alibabacloud-go/darabonba-openapi v0.1.18 h1:3eUVmAr7WCJp7fgIvmCd9ZUyuwtJYbtUqJIed5eXCmk=
@@ -41,8 +45,11 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/doug-martin/goqu/v9 v9.19.0 h1:PD7t1X3tRcUiSdc5TEyOFKujZA5gs3VSA7wxSvBx7qo=
github.com/doug-martin/goqu/v9 v9.19.0/go.mod h1:nf0Wc2/hV3gYK9LiyqIrzBEVGlI8qW3GuDCEobC4wBQ=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -55,10 +62,11 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -103,12 +111,16 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/milvus-io/milvus-proto/go-api v0.0.0-20230301092744-7efc6eec15fd h1:9ilgTEqZSdEPbJKSrRGB1TIHTaF7DqVDIwn8/azcaBk=
github.com/milvus-io/milvus-proto/go-api v0.0.0-20230301092744-7efc6eec15fd/go.mod h1:148qnlmZ0Fdm1Fq+Mj/OW2uDoEP25g3mjh0vMGtkgmk=
github.com/milvus-io/milvus-sdk-go/v2 v2.2.1 h1:6p/lrxZCGkw5S2p5GPWy/BUmO6mVUNfrczv98uAnhoU=
@@ -159,6 +171,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
@@ -175,6 +188,8 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -292,6 +307,7 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=