更换热重载工具为air
This commit is contained in:
		
							
								
								
									
										9
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								Makefile
									
									
									
									
									
								
							@@ -1,13 +1,12 @@
 | 
			
		||||
# 运行本地开发环境(使用SSH隧道代理端口)
 | 
			
		||||
dev:
 | 
			
		||||
	@if ! go list -m github.com/gravityblast/fresh >/dev/null 2>&1; then \
 | 
			
		||||
		echo "github.com/gravityblast/fresh is not installed. Installing..."; \
 | 
			
		||||
		go get github.com/gravityblast/fresh; \
 | 
			
		||||
	@if ! go list -m github.com/air-verse/air@latest >/dev/null 2>&1; then \
 | 
			
		||||
		echo "github.com/air-verse/air@latest is not installed. Installing..."; \
 | 
			
		||||
		go get github.com/air-verse/air@latest; \
 | 
			
		||||
	fi;
 | 
			
		||||
	@ssh -NCPf main -L 3306:localhost:3306 -L 19530:localhost:19530 & \
 | 
			
		||||
		sleep 1; \
 | 
			
		||||
		echo "Starting Go application..."; \
 | 
			
		||||
		go run github.com/gravityblast/fresh; \
 | 
			
		||||
		go run github.com/air-verse/air@latest --build.cmd "go build -o ./data/ bin/main.go" --build.bin "./data/main"; \
 | 
			
		||||
		wait
 | 
			
		||||
 | 
			
		||||
# 编译项目
 | 
			
		||||
 
 | 
			
		||||
@@ -8,12 +8,6 @@
 | 
			
		||||
  - [ ] 列表翻页
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GraphQL 基本规则
 | 
			
		||||
- 必须指定要求返回的每个字段, 不指定的字段不会被返回, 用于减少无效查询
 | 
			
		||||
- 通过 after before 作为游标翻页, 返回指定id之前或之后的列表, 而不是使用 pageNum, 作用是防止列表变化导致翻页请求结果的部分重复
 | 
			
		||||
- 通过 first last 替代 pageSize 决定选择游标前n个还是游标后的n个列表
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
// GET 查询id为1的用户列表, 要求列表中每项只返回 id, 用户名, 头像, 以及符合筛选条件的总数 total
 | 
			
		||||
const query = `/api?query={users(id:1){total,list{id,user_name,avatar}}}`
 | 
			
		||||
@@ -42,7 +36,6 @@ fetch(query).then(res => res.json()).then(data => {
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### 流媒体
 | 
			
		||||
通过流媒体服务降低视频文件加载消耗及防止恶意刷流量
 | 
			
		||||
对视频地址添加有效期, 过期需由服务器重新提供token认证观众身份
 | 
			
		||||
 
 | 
			
		||||
@@ -250,6 +250,7 @@ func NewSchema(config Config) (graphql.Schema, error) {
 | 
			
		||||
 | 
			
		||||
				// 筛选条件
 | 
			
		||||
				var where []string
 | 
			
		||||
				var order []string
 | 
			
		||||
				for arg, format := range argToSQLFormat {
 | 
			
		||||
					if p.Args[arg] != nil {
 | 
			
		||||
						where = append(where, fmt.Sprintf(format, p.Args[arg]))
 | 
			
		||||
@@ -273,7 +274,8 @@ func NewSchema(config Config) (graphql.Schema, error) {
 | 
			
		||||
					if ids_str == "" {
 | 
			
		||||
						return map[string]interface{}{"list": []Image{}, "total": 0}, nil
 | 
			
		||||
					}
 | 
			
		||||
					where = append(where, fmt.Sprintf("id IN (%s) LIMIT %d", ids_str, len(id_list)))
 | 
			
		||||
					where = append(where, fmt.Sprintf("id IN (%s)", ids_str))
 | 
			
		||||
					order = append(order, fmt.Sprintf("ORDER BY FIELD(id,%s)", ids_str))
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// 特殊处理 text 参数
 | 
			
		||||
@@ -310,6 +312,7 @@ func NewSchema(config Config) (graphql.Schema, error) {
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				where_str := strings.Join(where, " AND ")
 | 
			
		||||
				order_str := strings.Join(order, "")
 | 
			
		||||
 | 
			
		||||
				if where_str != "" {
 | 
			
		||||
					where_str = "WHERE " + where_str
 | 
			
		||||
@@ -332,23 +335,23 @@ func NewSchema(config Config) (graphql.Schema, error) {
 | 
			
		||||
					offset = len(id_list) - limit
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				where_str += fmt.Sprintf(" LIMIT %d OFFSET %d", limit, offset)
 | 
			
		||||
 | 
			
		||||
				// 执行查询
 | 
			
		||||
				var query strings.Builder
 | 
			
		||||
				fields := strings.Join(get_fields(p.Info.FieldASTs[0].SelectionSet.Selections), ",")
 | 
			
		||||
				query.WriteString(fmt.Sprintf("SELECT %s FROM web_images %s", fields, where_str))
 | 
			
		||||
				query.WriteString(fmt.Sprintf("SELECT %s FROM web_images %s %s LIMIT %d OFFSET %d", fields, where_str, order_str, limit, offset))
 | 
			
		||||
 | 
			
		||||
				var images ImageList
 | 
			
		||||
				if err := connection.Select(&images, query.String()); err != nil {
 | 
			
		||||
				var q = query.String()
 | 
			
		||||
				fmt.Println(q)
 | 
			
		||||
				if err := connection.Select(&images, q); err != nil {
 | 
			
		||||
					fmt.Println("获取图像列表失败", err)
 | 
			
		||||
					return nil, err
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				// 按照 id_list 的顺序重新排序
 | 
			
		||||
				if len(id_list) > 0 {
 | 
			
		||||
					images.SortByIDList(id_list)
 | 
			
		||||
				}
 | 
			
		||||
				//if len(id_list) > 0 {
 | 
			
		||||
				//	images.SortByIDList(id_list)
 | 
			
		||||
				//}
 | 
			
		||||
 | 
			
		||||
				// 获取用户信息(如果图像列表不为空且请求字段中包含user)
 | 
			
		||||
				if len(images) > 0 && strings.Contains(fields, "user") {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										62
									
								
								bin/main.go
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								bin/main.go
									
									
									
									
									
								
							@@ -237,68 +237,6 @@ func main() {
 | 
			
		||||
		Pretty:     false,
 | 
			
		||||
	})))
 | 
			
		||||
 | 
			
		||||
	http.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
 | 
			
		||||
		http.Error(w, "Not Found", http.StatusNotFound)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	http.HandleFunc("/api/default", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
 | 
			
		||||
		http.Error(w, "Not Found", http.StatusNotFound)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// 获取浏览记录
 | 
			
		||||
	http.HandleFunc("/history", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
 | 
			
		||||
 | 
			
		||||
		// 按会话过滤
 | 
			
		||||
		// 按用户过滤
 | 
			
		||||
		// 按时间过滤
 | 
			
		||||
		// 按类型过滤
 | 
			
		||||
		// 按数据过滤
 | 
			
		||||
 | 
			
		||||
		// 日志记录器:
 | 
			
		||||
		// 会话记录, 调取也从SDK本地取数据
 | 
			
		||||
		// URL变化或新开 [URL, 来源, 时间]
 | 
			
		||||
		// 针对某些组件挂载的事件 [组件, 事件, 时间]
 | 
			
		||||
		// 记录用户行为 [用户, 行为, 时间]
 | 
			
		||||
		// 查看过的[图片, 文章, 精选集, 用户]
 | 
			
		||||
		// 请求过的API连接
 | 
			
		||||
 | 
			
		||||
		// 展示了的数据
 | 
			
		||||
		// 展示后被点击的数据(+正反馈)
 | 
			
		||||
		// 展示后被收藏的数据
 | 
			
		||||
		// 展示后被分享的数据
 | 
			
		||||
		// 展示后被评论的数据
 | 
			
		||||
		// 展示后被点赞的数据
 | 
			
		||||
		// 展示后被下载的数据
 | 
			
		||||
		// 展示后被忽略的数据(+负反馈)
 | 
			
		||||
		// 展示后被屏蔽的数据(+屏蔽功能)
 | 
			
		||||
 | 
			
		||||
		// 获取用户id
 | 
			
		||||
		userId := stringToInt(r.URL.Query().Get("user_id"), 0)
 | 
			
		||||
		if userId == 0 {
 | 
			
		||||
			w.Write([]byte("user_id is required"))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 获取图片id列表
 | 
			
		||||
		var ids []int64
 | 
			
		||||
		err := json.Unmarshal([]byte(r.URL.Query().Get("ids")), &ids)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			w.Write([]byte("ids is required"))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 获取图片信息列表
 | 
			
		||||
		var images []Image
 | 
			
		||||
		//mysqlConnection.DB.Where("id in (?)", ids).Find(&images)
 | 
			
		||||
 | 
			
		||||
		// 返回结果
 | 
			
		||||
		w.Header().Set("Content-Type", "application/json")
 | 
			
		||||
		json.NewEncoder(w).Encode(images)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// 获取图片信息列表(分页)
 | 
			
		||||
	http.HandleFunc("/api/images", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
root:              ./bin
 | 
			
		||||
tmp_path:          ./data
 | 
			
		||||
build_name:        bin/main
 | 
			
		||||
build_log:         runner-build-errors.log
 | 
			
		||||
valid_ext:         .go, .tpl, .tmpl, .html
 | 
			
		||||
no_rebuild_ext:    .tpl, .tmpl, .html
 | 
			
		||||
ignored:           assets, tmp
 | 
			
		||||
build_delay:       600
 | 
			
		||||
colors:            1
 | 
			
		||||
		Reference in New Issue
	
	Block a user