This commit is contained in:
2024-07-31 15:03:10 +08:00
parent 1befa9ff3a
commit 6bc7acba47
2 changed files with 98 additions and 2 deletions

View File

@@ -343,6 +343,97 @@ func NewSchema(config Config) (graphql.Schema, error) {
}, nil }, nil
}, },
}, },
"articles": &graphql.Field{
Type: graphql.NewObject(graphql.ObjectConfig{
Name: "ArticleConnection",
Fields: graphql.Fields{
"list": &graphql.Field{Type: graphql.NewList(article)},
"total": &graphql.Field{Type: graphql.Int},
},
}),
Args: graphql.FieldConfigArgument{
"id": &graphql.ArgumentConfig{Type: graphql.Int},
"title": &graphql.ArgumentConfig{Type: graphql.String},
"tags": &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) {
var fields []string
requestedFields := p.Info.FieldASTs[0].SelectionSet.Selections
for _, field := range requestedFields {
fieldAST, ok := field.(*ast.Field)
if ok {
switch fieldAST.Name.Value {
case "list":
for _, field := range fieldAST.SelectionSet.Selections {
fieldAST, ok := field.(*ast.Field)
if ok {
fields = append(fields, fieldAST.Name.Value)
}
}
case "total":
fmt.Println("total")
default:
fmt.Println(fieldAST.Name.Value)
}
}
}
first := p.Args["first"]
after := p.Args["after"]
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["title"] != nil {
where = append(where, fmt.Sprintf("title='%s'", p.Args["title"]))
}
// 筛选条件
where_str := strings.Join(where, " AND ")
if where_str != "" {
where_str = "WHERE " + where_str
}
var query strings.Builder
query.WriteString(fmt.Sprintf("SELECT %s FROM web_article %s LIMIT %d OFFSET %s", fields_str, where_str, first, after))
// 返回翻页信息
var articles []Article
if err := connection.Select(&articles, query.String()); err != nil {
fmt.Println("获取文章列表失败", err)
return nil, err
}
return map[string]interface{}{
"list": articles,
"total": 0,
}, nil
},
},
"tags": &graphql.Field{
Type: graphql.NewObject(graphql.ObjectConfig{
Name: "TagConnection",
Fields: graphql.Fields{
"list": &graphql.Field{Type: graphql.NewList(graphql.String)},
"total": &graphql.Field{Type: graphql.Int},
},
}),
Args: graphql.FieldConfigArgument{
"first": &graphql.ArgumentConfig{Type: graphql.Int, DefaultValue: 10},
"after": &graphql.ArgumentConfig{Type: graphql.String, DefaultValue: "0"},
"before": &graphql.ArgumentConfig{Type: graphql.String},
},
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
var tags []string
if err := connection.Select(&tags, "SELECT DISTINCT tags FROM web_images LIMIT 10"); err != nil {
fmt.Println("获取标签列表失败", err)
return nil, err
}
return map[string]interface{}{
"list": tags,
"total": 0,
}, nil
},
},
}})}) }})})
if err != nil { if err != nil {
return schema, err return schema, err

View File

@@ -316,6 +316,13 @@ func main() {
// 文字搜索支持翻页 // 文字搜索支持翻页
// 文字搜索支持与按颜色筛选混合 // 文字搜索支持与按颜色筛选混合
// TODO 查找含有指定文字的图像
// TODO 查找含有指定标签的图像
// TODO 查找含有指定特征的图像
// TODO 查找含有指定颜色的图像(倒排索引)
// TODO 查找含有指定分类的图像
// 1,000,000
// 获取查询条件(忽略空值) // 获取查询条件(忽略空值)
QueryConditions := func(key string) (list []string) { QueryConditions := func(key string) (list []string) {
for _, item := range strings.Split(r.URL.Query().Get(key), ",") { for _, item := range strings.Split(r.URL.Query().Get(key), ",") {
@@ -350,8 +357,6 @@ func main() {
images.Total = 0 images.Total = 0
images.Next = false images.Next = false
images.List = make([]interface{}, 0) images.List = make([]interface{}, 0)
// 将对象转换为有缩进的JSON输出
data, _ := json.MarshalIndent(images, "", " ") data, _ := json.MarshalIndent(images, "", " ")
w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.Write(data) w.Write(data)