文档
This commit is contained in:
		
							
								
								
									
										165
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										165
									
								
								README.md
									
									
									
									
									
								
							@@ -8,28 +8,157 @@
 | 
			
		||||
  - [ ] 列表翻页
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GraphQL
 | 
			
		||||
GraphQL 基本规则
 | 
			
		||||
- 必须指定要求返回的每个字段, 不指定的字段不会被返回, 用于减少无效查询
 | 
			
		||||
- 通过 after before 作为游标翻页, 返回指定id之前或之后的列表, 而不是使用 pageNum, 作用是防止列表变化导致翻页请求结果的部分重复
 | 
			
		||||
- 通过 first last 替代 pageSize 决定选择游标前n个还是游标后的n个列表
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
const query = `
 | 
			
		||||
query ($id: Int!) {
 | 
			
		||||
  article(id: $id) {
 | 
			
		||||
    id
 | 
			
		||||
    title
 | 
			
		||||
    content
 | 
			
		||||
    author {
 | 
			
		||||
      id
 | 
			
		||||
      name
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
// 假设服务器上的数据
 | 
			
		||||
const database = {
 | 
			
		||||
    users: [
 | 
			
		||||
        { id: 1, user_name:'xx1', avatar:'xx1.png', create_time:'2022-01-02 12:12:12' }
 | 
			
		||||
        { id: 2, user_name:'xx2', avatar:'xx2.png', create_time:'2022-01-02 12:12:12' }
 | 
			
		||||
        { id: 3, user_name:'xx3', avatar:'xx3.png', create_time:'2022-01-02 12:12:12' }
 | 
			
		||||
        { id: 4, user_name:'xx4', avatar:'xx4.png', create_time:'2022-01-02 12:12:12' }
 | 
			
		||||
    ],
 | 
			
		||||
    images: [
 | 
			
		||||
        { id: 1, title:'xx1', content:'xx1.png', user_id: 1, article_id: 2 }
 | 
			
		||||
        { id: 2, title:'xx2', content:'xx2.png', user_id: 1, article_id: 2 }
 | 
			
		||||
        { id: 3, title:'xx3', content:'xx3.png', user_id: 2, article_id: 4 }
 | 
			
		||||
        { id: 4, title:'xx4', content:'xx4.png', user_id: 2, article_id: 4 }
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
// GET 查询id为1的用户列表, 要求列表中每项只返回 id, 用户名, 头像, 以及符合筛选条件的总数 total
 | 
			
		||||
const query = `users(id:1){total,list{id,user_name,avatar}}`
 | 
			
		||||
fetch('/api?'+query).then(res => res.json()).then(data => {
 | 
			
		||||
    console.log(data)
 | 
			
		||||
    // { data: { users: { total:1, list:[{ id: 1, user_name:'xx1', avatar:'xx1.png' }] } } }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
// GET 查询 user_id 为 2 的图像列表, 并且包含 user 的部分信息, 以及符合筛选条件的总数 total
 | 
			
		||||
const query = `images(user_id:2){total,list{id,content,user:{id,username,avatar}}}`
 | 
			
		||||
fetch('/api?'+query).then(res => res.json()).then(data => {
 | 
			
		||||
    console.log(data)
 | 
			
		||||
    /*
 | 
			
		||||
    {
 | 
			
		||||
        data: {
 | 
			
		||||
            images: {
 | 
			
		||||
                total:2,
 | 
			
		||||
                list:[
 | 
			
		||||
                    {id:3,content:'xx3.png',user:{id:2,user_name:'xx2',avatar:'xx2.png'}},
 | 
			
		||||
                    {id:4,content:'xx4.png',user:{id:2,user_name:'xx2',avatar:'xx2.png'}},
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    */
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
// GET 查询所有图像的前2个(第一页)
 | 
			
		||||
const query = `images(first:2){total,list{id,content,user:{id,username,avatar}}}`
 | 
			
		||||
fetch('/api?'+query).then(res => res.json()).then(data => {
 | 
			
		||||
    console.log(data)
 | 
			
		||||
    /*
 | 
			
		||||
    {
 | 
			
		||||
        data: {
 | 
			
		||||
            images: {
 | 
			
		||||
                total:4,
 | 
			
		||||
                list:[
 | 
			
		||||
                    {id:1,content:'xx1.png',user:{id:1,user_name:'xx1',avatar:'xx1.png'}},
 | 
			
		||||
                    {id:2,content:'xx2.png',user:{id:1,user_name:'xx1',avatar:'xx1.png'}},
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    */
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// GET 查询所有图像的指定id之后的前2个(翻页)
 | 
			
		||||
const query = `images(after:2,first:2){total,list{id,content,user:{id,username,avatar}}}`
 | 
			
		||||
fetch('/api?'+query).then(res => res.json()).then(data => {
 | 
			
		||||
    console.log(data)
 | 
			
		||||
    /*
 | 
			
		||||
    {
 | 
			
		||||
        data: {
 | 
			
		||||
            images: {
 | 
			
		||||
                total:4,
 | 
			
		||||
                list:[
 | 
			
		||||
                    {id:3,content:'xx3.png',user:{id:2,user_name:'xx2',avatar:'xx2.png'}},
 | 
			
		||||
                    {id:4,content:'xx4.png',user:{id:2,user_name:'xx2',avatar:'xx2.png'}},
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    */
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
如何获取schema结构(GraphQL自省)
 | 
			
		||||
```javascript
 | 
			
		||||
const query = `/api?query={__schema{types{name,description,fields{name,type{name}}}}}`
 | 
			
		||||
const data = await fetch(query).then(res.json())
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
当前数据结构
 | 
			
		||||
```go
 | 
			
		||||
type Image struct {
 | 
			
		||||
	ID                   int       `json:"id"                      db:"id"`
 | 
			
		||||
	Width                int       `json:"width"                   db:"width"`
 | 
			
		||||
	Height               int       `json:"height"                  db:"height"`
 | 
			
		||||
	Content              string    `json:"content"                 db:"content"`
 | 
			
		||||
	Remark               string    `json:"remark"                  db:"remark"`
 | 
			
		||||
	Description          string    `json:"description"             db:"description"`
 | 
			
		||||
	Tags                 string    `json:"tags"                    db:"tags"`
 | 
			
		||||
	Rank                 string    `json:"rank"                    db:"rank"`
 | 
			
		||||
	CommentNum           int       `json:"comment_num"             db:"comment_num"`
 | 
			
		||||
	ArticleCategoryTopId int       `json:"article_category_top_id" db:"article_category_top_id"`
 | 
			
		||||
	PraiseCount          int       `json:"praise_count"            db:"praise_count"`
 | 
			
		||||
	CollectCount         int       `json:"collect_count"           db:"collect_count"`
 | 
			
		||||
	ArticleID            int       `json:"article_id"              db:"article_id"`
 | 
			
		||||
	UserID               int       `json:"user_id"                 db:"user_id"`
 | 
			
		||||
	User                 User      `json:"user"                    db:"-"`
 | 
			
		||||
	Article              Article   `json:"article"                 db:"-"`
 | 
			
		||||
	CreateTime           time.Time `json:"create_time"             db:"create_time"`
 | 
			
		||||
	UpdateTime           time.Time `json:"update_time"             db:"update_time"`
 | 
			
		||||
	Text                 TextList  `json:"text"                    db:"text"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type TextList []struct {
 | 
			
		||||
	Text       string      `json:"text"`
 | 
			
		||||
	Confidence float64     `json:"confidence"`
 | 
			
		||||
	Coordinate [][]float64 `json:"coordinate"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type User struct {
 | 
			
		||||
	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"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Article struct {
 | 
			
		||||
	ID         int       `json:"id"          db:"id"`
 | 
			
		||||
	Title      string    `json:"title"       db:"title"`
 | 
			
		||||
	Tags       string    `json:"tags"        db:"tags"`
 | 
			
		||||
	CreateTime time.Time `json:"create_time" db:"create_time"`
 | 
			
		||||
	UpdateTime time.Time `json:"update_time" db:"update_time"`
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
* 以上为当前基本数据结构和查询方法
 | 
			
		||||
* 如需添加筛选条件排序条件或其他字段后续补充
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### 流媒体
 | 
			
		||||
通过流媒体服务降低视频文件加载消耗及防止恶意刷流量
 | 
			
		||||
对视频地址添加有效期, 过期需由服务器重新提供token认证观众身份
 | 
			
		||||
可后期增加基于用户账户或cookie信任度评估的视频播放权限认证
 | 
			
		||||
@@ -179,7 +308,7 @@ https://github.com/facebookarchive/fb.resnet.torch/tree/master/pretrained
 | 
			
		||||
通用权重模型接口
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### 获取图片列表(标准查询)
 | 
			
		||||
### 获取图片列表(RESTful标准查询)
 | 
			
		||||
 | 
			
		||||
GET /api/images
 | 
			
		||||
```javascript
 | 
			
		||||
 
 | 
			
		||||
@@ -210,7 +210,7 @@ func main() {
 | 
			
		||||
		w.Write([]byte("Hello World!"))
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	http.Handle("/graphql", handler.New(&handler.Config{
 | 
			
		||||
	http.Handle("/api", handler.New(&handler.Config{
 | 
			
		||||
		Schema: &schema,
 | 
			
		||||
		Pretty: true,
 | 
			
		||||
	}))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user