diff --git a/bin/main.go b/bin/main.go index ecfdee5..7c1839f 100644 --- a/bin/main.go +++ b/bin/main.go @@ -197,9 +197,7 @@ func main() { http.Error(w, result.Errors[0].Error(), 500) return } - // 格式化输出 rJSON, _ := json.MarshalIndent(result, "", " ") - fmt.Printf("%s \n", rJSON) w.Write(rJSON) }) @@ -388,8 +386,8 @@ func main() { defer rows.Close() for rows.Next() { var image Image - rows.Scan(&image.Id, &image.Width, &image.Height, &image.Content, &image.UpdateTime, &image.CreateTime, &image.User.Id, &image.Article.Id, &image.ArticleCategoryTopId, &image.PraiseCount, &image.CollectCount) - fmt.Println("image", image.User.Id, image.Article.Id) + rows.Scan(&image.Id, &image.Width, &image.Height, &image.Content, &image.UpdateTime, &image.CreateTime, &image.User.ID, &image.Article.Id, &image.ArticleCategoryTopId, &image.PraiseCount, &image.CollectCount) + fmt.Println("image", image.User.ID, image.Article.Id) image.UpdateTime = image.UpdateTime.UTC() image.CreateTime = image.CreateTime.UTC() image.Content = regexp.MustCompile(`http:`).ReplaceAllString(image.Content, "https:") @@ -427,7 +425,7 @@ func main() { var article_ids []int for _, image := range image_list { fmt.Println("image", image) - user_ids = append(user_ids, image.User.Id) + user_ids = append(user_ids, image.User.ID) article_ids = append(article_ids, image.Article.Id) } @@ -435,7 +433,7 @@ func main() { users := models.QueryUserList(user_ids) for i, image := range image_list { for _, user := range users { - if image.User.Id == user.Id { + if image.User.ID == user.ID { image_list[i].User = user } } diff --git a/go.mod b/go.mod index 3cfa080..b5d0ece 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,9 @@ 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/elastic/go-elasticsearch/v8 v8.11.0 + github.com/graphql-go/graphql v0.8.1 + github.com/jmoiron/sqlx v1.3.5 github.com/milvus-io/milvus-sdk-go/v2 v2.2.1 github.com/spf13/viper v1.15.0 ) @@ -21,10 +24,8 @@ require ( github.com/aliyun/credentials-go v1.1.2 // indirect github.com/clbanning/mxj/v2 v2.5.6 // indirect github.com/elastic/elastic-transport-go/v8 v8.3.0 // indirect - github.com/elastic/go-elasticsearch/v8 v8.11.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/graphql-go/graphql v0.8.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -55,7 +56,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.0 + github.com/go-sql-driver/mysql v1.7.1 github.com/sizeofint/gif-to-webp v0.0.0-20210224202734-e9d7ed071591 golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect ) diff --git a/go.sum b/go.sum index 3fa7a58..20f3e03 100644 --- a/go.sum +++ b/go.sum @@ -103,8 +103,9 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -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-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +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-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/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -179,6 +180,8 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= +github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -195,8 +198,12 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= 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/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= 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/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= diff --git a/models/graphql.go b/models/graphql.go index 6f62991..987a5c2 100644 --- a/models/graphql.go +++ b/models/graphql.go @@ -2,50 +2,70 @@ package models import ( "fmt" + "strings" "github.com/graphql-go/graphql" + "github.com/graphql-go/graphql/language/ast" ) func NewSchema() (graphql.Schema, error) { user := graphql.NewObject(graphql.ObjectConfig{ Name: "User", Fields: graphql.Fields{ - "id": &graphql.Field{Type: graphql.Int}, - "name": &graphql.Field{Type: graphql.String}, - "age": &graphql.Field{Type: graphql.Int}, - "info": &graphql.Field{Type: graphql.String}, - "price": &graphql.Field{Type: graphql.Float}, - "avatar": &graphql.Field{Type: graphql.String}, + "id": &graphql.Field{Type: graphql.Int}, + "user_name": &graphql.Field{Type: graphql.String}, + "avatar": &graphql.Field{Type: graphql.String}, + "rank": &graphql.Field{Type: graphql.String}, + "price": &graphql.Field{Type: graphql.Float}, + "create_time": &graphql.Field{Type: graphql.DateTime}, + "update_time": &graphql.Field{Type: graphql.DateTime}, }, }) users := &graphql.Field{ Type: graphql.NewList(user), Args: graphql.FieldConfigArgument{ - "id": &graphql.ArgumentConfig{ - Type: graphql.Int, - }, + "id": &graphql.ArgumentConfig{Type: graphql.Int}, + "user_name": &graphql.ArgumentConfig{Type: graphql.String}, + "avatar": &graphql.ArgumentConfig{Type: graphql.String}, + "rank": &graphql.ArgumentConfig{Type: graphql.String}, + "create_time": &graphql.ArgumentConfig{Type: graphql.DateTime}, + "update_time": &graphql.ArgumentConfig{Type: graphql.DateTime}, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { - fmt.Println("p.Args:", p.Args) - return []interface{}{ - map[string]interface{}{ - "id": 1, - "name": "user1", - "age": 10, - "info": "info", - "price": 1.1, - "avatar": "", - }, - map[string]interface{}{ - "id": 2, - "name": "user2", - "age": 20, - "info": "info", - "price": 2.2, - "avatar": "", - }, - }, nil + var fields []string + requestedFields := p.Info.FieldASTs[0].SelectionSet.Selections + for _, field := range requestedFields { + fieldAST, ok := field.(*ast.Field) + if ok { + fields = append(fields, fieldAST.Name.Value) + } + } + fields_str := strings.Join(fields, ",") + + var where []string + if p.Args["id"] != nil { + where = append(where, fmt.Sprintf("id=%d", p.Args["id"])) + } + if p.Args["user_name"] != nil { + where = append(where, fmt.Sprintf("user_name='%s'", p.Args["user_name"])) + } + + // 筛选条件 + where_str := strings.Join(where, " AND ") + fmt.Println(where_str) + + var query strings.Builder + query.WriteString(fmt.Sprintf("SELECT %s FROM web_member WHERE %s LIMIT %s", fields_str, where_str, "10")) + fmt.Println(query.String()) + + var users []User + if err := connection.Select(&users, query.String()); err != nil { + fmt.Println("获取用户列表失败", err) + return nil, err + } + fmt.Println(users) + return users, nil }, } @@ -76,6 +96,9 @@ func NewSchema() (graphql.Schema, error) { }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { fmt.Println("p.Args:", p.Args) + + //connection.Query("SELECT ") + return []interface{}{ map[string]interface{}{ "id": 1, diff --git a/models/mysql.go b/models/mysql.go index 4585ac7..8746d9c 100644 --- a/models/mysql.go +++ b/models/mysql.go @@ -10,14 +10,29 @@ import ( "time" _ "github.com/go-sql-driver/mysql" + "github.com/jmoiron/sqlx" ) +var connection *sqlx.DB +var connectionx *sql.DB + +func init() { + var err error + user := Viper.Get("mysql.user").(string) + password := Viper.Get("mysql.password").(string) + host := Viper.Get("mysql.host").(string) + port := Viper.Get("mysql.port").(int) + database := Viper.Get("mysql.database").(string) + connection, err = sqlx.Connect("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, host, port, database)) + if err != nil { + log.Fatalln("连接数据库失败", err) + } +} + type MysqlConnection struct { Database *sql.DB } -var connection *sql.DB - // 初始化数据库连接 func (m *MysqlConnection) Init() (err error) { user := Viper.Get("mysql.user").(string) @@ -26,12 +41,12 @@ func (m *MysqlConnection) Init() (err error) { port := Viper.Get("mysql.port").(int) database := Viper.Get("mysql.database").(string) sqlconf := user + ":" + password + "@tcp(" + host + ":" + strconv.Itoa(port) + ")/" + database + "?charset=utf8mb4&parseTime=True&loc=Local" - connection, err = sql.Open("mysql", sqlconf) // 连接数据库 + m.Database, err = sql.Open("mysql", sqlconf) // 连接数据库 if err != nil { log.Println("连接数据库失败", err) return } - m.Database = connection + connectionx = m.Database return } @@ -83,11 +98,12 @@ func (m *MysqlConnection) GetImages(page int, size int) (images []byte, err erro } type User struct { - Id int `json:"id"` - UserName string `json:"user_name"` - Avatar string `json:"avatar"` - CreateTime time.Time `json:"create_time"` - UpdateTime time.Time `json:"update_time"` + ID int `json:"id" db:"id"` + UserName string `json:"user_name" db:"user_name"` + Avatar string `json:"avatar" db:"avatar"` + Rank string `json:"rank" db:"rank"` + CreateTime time.Time `json:"create_time" db:"create_time"` + UpdateTime time.Time `json:"update_time" db:"update_time"` } // 获取一组用户信息 @@ -98,7 +114,7 @@ func QueryUserList(id_list []int) (users []User) { return } idstr := strings.Trim(strings.Replace(fmt.Sprint(id_list), " ", ",", -1), "[]") - rows, err := connection.Query("SELECT id, user_name, avatar, update_time, create_time FROM web_member WHERE id IN (" + idstr + ") LIMIT " + strconv.Itoa(count)) + rows, err := connectionx.Query("SELECT id, user_name, avatar, update_time, create_time FROM web_member WHERE id IN (" + idstr + ") LIMIT " + strconv.Itoa(count)) if err != nil { log.Println("获取用户列表失败", err) return @@ -106,7 +122,7 @@ func QueryUserList(id_list []int) (users []User) { defer rows.Close() for rows.Next() { var u User - rows.Scan(&u.Id, &u.UserName, &u.Avatar, &u.UpdateTime, &u.CreateTime) + rows.Scan(&u.ID, &u.UserName, &u.Avatar, &u.UpdateTime, &u.CreateTime) u.UpdateTime = u.UpdateTime.UTC() u.CreateTime = u.CreateTime.UTC() users = append(users, u) @@ -130,7 +146,7 @@ func QueryArticleList(id_list []int) (articles []Article) { return } idstr := strings.Trim(strings.Replace(fmt.Sprint(id_list), " ", ",", -1), "[]") - rows, err := connection.Query("SELECT id, title, tags, update_time, create_time FROM web_article WHERE id IN (" + idstr + ") LIMIT " + strconv.Itoa(count)) + rows, err := connectionx.Query("SELECT id, title, tags, update_time, create_time FROM web_article WHERE id IN (" + idstr + ") LIMIT " + strconv.Itoa(count)) if err != nil { log.Println("获取文章列表失败", err) return