文档
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
 | 
					```javascript
 | 
				
			||||||
const query = `
 | 
					// 假设服务器上的数据
 | 
				
			||||||
query ($id: Int!) {
 | 
					const database = {
 | 
				
			||||||
  article(id: $id) {
 | 
					    users: [
 | 
				
			||||||
    id
 | 
					        { id: 1, user_name:'xx1', avatar:'xx1.png', create_time:'2022-01-02 12:12:12' }
 | 
				
			||||||
    title
 | 
					        { id: 2, user_name:'xx2', avatar:'xx2.png', create_time:'2022-01-02 12:12:12' }
 | 
				
			||||||
    content
 | 
					        { id: 3, user_name:'xx3', avatar:'xx3.png', create_time:'2022-01-02 12:12:12' }
 | 
				
			||||||
    author {
 | 
					        { id: 4, user_name:'xx4', avatar:'xx4.png', create_time:'2022-01-02 12:12:12' }
 | 
				
			||||||
      id
 | 
					    ],
 | 
				
			||||||
      name
 | 
					    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认证观众身份
 | 
					对视频地址添加有效期, 过期需由服务器重新提供token认证观众身份
 | 
				
			||||||
可后期增加基于用户账户或cookie信任度评估的视频播放权限认证
 | 
					可后期增加基于用户账户或cookie信任度评估的视频播放权限认证
 | 
				
			||||||
@@ -179,7 +308,7 @@ https://github.com/facebookarchive/fb.resnet.torch/tree/master/pretrained
 | 
				
			|||||||
通用权重模型接口
 | 
					通用权重模型接口
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 获取图片列表(标准查询)
 | 
					### 获取图片列表(RESTful标准查询)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GET /api/images
 | 
					GET /api/images
 | 
				
			||||||
```javascript
 | 
					```javascript
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -210,7 +210,7 @@ func main() {
 | 
				
			|||||||
		w.Write([]byte("Hello World!"))
 | 
							w.Write([]byte("Hello World!"))
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	http.Handle("/graphql", handler.New(&handler.Config{
 | 
						http.Handle("/api", handler.New(&handler.Config{
 | 
				
			||||||
		Schema: &schema,
 | 
							Schema: &schema,
 | 
				
			||||||
		Pretty: true,
 | 
							Pretty: true,
 | 
				
			||||||
	}))
 | 
						}))
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user