articles
This commit is contained in:
@@ -343,6 +343,97 @@ func NewSchema(config Config) (graphql.Schema, error) {
|
||||
}, 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 {
|
||||
return schema, err
|
||||
|
@@ -316,6 +316,13 @@ func main() {
|
||||
// 文字搜索支持翻页
|
||||
// 文字搜索支持与按颜色筛选混合
|
||||
|
||||
// TODO 查找含有指定文字的图像
|
||||
// TODO 查找含有指定标签的图像
|
||||
// TODO 查找含有指定特征的图像
|
||||
// TODO 查找含有指定颜色的图像(倒排索引)
|
||||
// TODO 查找含有指定分类的图像
|
||||
// 1,000,000
|
||||
|
||||
// 获取查询条件(忽略空值)
|
||||
QueryConditions := func(key string) (list []string) {
|
||||
for _, item := range strings.Split(r.URL.Query().Get(key), ",") {
|
||||
@@ -350,8 +357,6 @@ func main() {
|
||||
images.Total = 0
|
||||
images.Next = false
|
||||
images.List = make([]interface{}, 0)
|
||||
|
||||
// 将对象转换为有缩进的JSON输出
|
||||
data, _ := json.MarshalIndent(images, "", " ")
|
||||
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
|
||||
w.Write(data)
|
||||
|
Reference in New Issue
Block a user