服務器狀態
This commit is contained in:
		
							
								
								
									
										48
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								README.md
									
									
									
									
									
								
							@@ -200,38 +200,38 @@ GET /api/images
 | 
			
		||||
 | 
			
		||||
列表视图:(输出控制)
 | 
			
		||||
 | 
			
		||||
Method | URL                            | Info                              | Status
 | 
			
		||||
-------|--------------------------------|-----------------------------------|--------
 | 
			
		||||
GET    | /api/images                    | 标准顺序查询                        | ok
 | 
			
		||||
GET    | /api/images?page=1&pageSize=20 | 指定页码和指定分页大小                | ok
 | 
			
		||||
Method | URL                            | Info
 | 
			
		||||
-------|--------------------------------|----------------------------------
 | 
			
		||||
GET    | /api/images                    | 标准顺序查询
 | 
			
		||||
GET    | /api/images?page=1&pageSize=20 | 指定页码和指定分页大小
 | 
			
		||||
DELETE | /api/images/{image_id}         | 刪除指定圖片
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
筛选规则:(数据过滤)
 | 
			
		||||
 | 
			
		||||
Method | URL                            | Info                              | Statu
 | 
			
		||||
-------|--------------------------------|-----------------------------------|--------
 | 
			
		||||
GET    | /api/images?user=1234          | 筛选指定某用户发表的图片              |
 | 
			
		||||
GET    | /api/images?choice=1234        | 筛选指定精选集下的图片                |
 | 
			
		||||
GET    | /api/images?like=1234          | 筛选指定用户点赞的图片                |
 | 
			
		||||
GET    | /api/images?tag=1234           | 筛选含有指定标签的图片                |
 | 
			
		||||
GET    | /api/images?tag=1234,1235      | 筛选含有多个标签之一的图片(并集)       |
 | 
			
		||||
GET    | /api/images?tag=1234&tag=1235  | 筛选含有指定多个标签的图片(交集)       |
 | 
			
		||||
GET    | /api/images?user=1234&tag=123  | 筛选指定用户的指定标签图片(交集)       |
 | 
			
		||||
GET    | /api/images?date=20220214+     | 时间范围(之后)                      |
 | 
			
		||||
GET    | /api/images?date=20220214-     | 时间范围(之前)                      |
 | 
			
		||||
GET    | /api/images?date=2022~2023     | 时间范围(之间)                      |
 | 
			
		||||
Method | URL                            | Info
 | 
			
		||||
-------|--------------------------------|----------------------------------
 | 
			
		||||
GET    | /api/images?user=1234          | 筛选指定某用户发表的图片
 | 
			
		||||
GET    | /api/images?choice=1234        | 筛选指定精选集下的图片
 | 
			
		||||
GET    | /api/images?like=1234          | 筛选指定用户点赞的图片
 | 
			
		||||
GET    | /api/images?tag=1234           | 筛选含有指定标签的图片
 | 
			
		||||
GET    | /api/images?tag=1234,1235      | 筛选含有多个标签之一的图片(并集)
 | 
			
		||||
GET    | /api/images?tag=1234&tag=1235  | 筛选含有指定多个标签的图片(交集)
 | 
			
		||||
GET    | /api/images?user=1234&tag=123  | 筛选指定用户的指定标签图片(交集)
 | 
			
		||||
GET    | /api/images?date=20220214+     | 时间范围(之后)
 | 
			
		||||
GET    | /api/images?date=20220214-     | 时间范围(之前)
 | 
			
		||||
GET    | /api/images?date=2022~2023     | 时间范围(之间)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
排序规则:(权重强化)
 | 
			
		||||
 | 
			
		||||
Method | URL                            | Info                              | Status
 | 
			
		||||
-------|--------------------------------|-----------------------------------|--------
 | 
			
		||||
GET    | /api/images?similar=1234       | 根据指定图片的相似图片(指定图片ID)     | ok
 | 
			
		||||
GET    | /api/images?sort=date+         | 排序规则(相似图片查询时此项无效)       |
 | 
			
		||||
GET    | /api/images?sort=like          | 根据用户偏好推荐(指定用户的偏好)       |
 | 
			
		||||
GET    | /api/images?sort=history       | 根据浏览记录推荐(指定用户的记录)       |
 | 
			
		||||
GET    | /api/images?sort=choice        | 根据精选集推荐(指定精选集ID,取一组权重) |
 | 
			
		||||
Method | URL                            | Info
 | 
			
		||||
-------|--------------------------------|----------------------------------
 | 
			
		||||
GET    | /api/images?similar=1234       | 根据指定图片的相似图片(指定图片ID)
 | 
			
		||||
GET    | /api/images?sort=date+         | 排序规则(相似图片查询时此项无效)
 | 
			
		||||
GET    | /api/images?sort=like          | 根据用户偏好推荐(指定用户的偏好)
 | 
			
		||||
GET    | /api/images?sort=history       | 根据浏览记录推荐(指定用户的记录)
 | 
			
		||||
GET    | /api/images?sort=choice        | 根据精选集推荐(指定精选集ID,取一组权重)
 | 
			
		||||
 | 
			
		||||
* 注意, 筛选规则为多条件取交集, 单条件的复数取并集
 | 
			
		||||
* 权重强化属于排序规则而非过滤规则
 | 
			
		||||
@@ -257,7 +257,7 @@ GET /api/models
 | 
			
		||||
篩選規則:(數據過濾)
 | 
			
		||||
 | 
			
		||||
Method | URL                            | Info
 | 
			
		||||
-------|--------------------------------|------------------
 | 
			
		||||
-------|--------------------------------|----------------------------------
 | 
			
		||||
GET    | /api/models                    | 獲取所有模型
 | 
			
		||||
GET    | /api/models?user=1234          | 僅取指定用戶的(按用戶ID過濾)
 | 
			
		||||
GET    | /api/models?tag=xxx            | 按標籤分類篩選
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,29 @@ type Model struct {
 | 
			
		||||
	UserID       int    `json:"user_id"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (model *Model) SendToTrain() error {
 | 
			
		||||
	db, err := configs.GetDB()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer db.Close()
 | 
			
		||||
	stmt, err := db.Prepare("UPDATE models SET status = ?, progress = ?, updated_at = ? WHERE id = ?")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer stmt.Close()
 | 
			
		||||
	_, err = stmt.Exec(model.Status, model.Progress, model.UpdatedAt, model.ID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	// TODO: 創建一個新線程管理訓練任務
 | 
			
		||||
	// 將任務放入隊列中, 將自動回調更新任務狀態
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (model *Model) Create() error {
 | 
			
		||||
	db, err := configs.GetDB()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										140
									
								
								models/Servers.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								models/Servers.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,140 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"log"
 | 
			
		||||
	"main/configs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Server struct {
 | 
			
		||||
	ID        int    `json:"id"`
 | 
			
		||||
	Name      string `json:"name"`
 | 
			
		||||
	IP        string `json:"ip"`
 | 
			
		||||
	Port      int    `json:"port"`
 | 
			
		||||
	Username  string `json:"username"`
 | 
			
		||||
	Password  string `json:"password"`
 | 
			
		||||
	CreatedAt string `json:"created_at"`
 | 
			
		||||
	UpdatedAt string `json:"updated_at"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (server *Server) Create() error {
 | 
			
		||||
	db, err := configs.GetDB()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer db.Close()
 | 
			
		||||
	stmt, err := db.Prepare("INSERT INTO servers(name, ip, port, username, password, created_at, updated_at) values(?, ?, ?, ?, ?, ?, ?)")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer stmt.Close()
 | 
			
		||||
	result, err := stmt.Exec(server.Name, server.IP, server.Port, server.Username, server.Password, server.CreatedAt, server.UpdatedAt)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	id, err := result.LastInsertId()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	server.ID = int(id)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (server *Server) Delete() error {
 | 
			
		||||
	db, err := configs.GetDB()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer db.Close()
 | 
			
		||||
	stmt, err := db.Prepare("DELETE FROM servers WHERE id = ?")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer stmt.Close()
 | 
			
		||||
	_, err = stmt.Exec(server.ID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (server *Server) Update() error {
 | 
			
		||||
	db, err := configs.GetDB()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer db.Close()
 | 
			
		||||
	stmt, err := db.Prepare("UPDATE servers SET name = ?, ip = ?, port = ?, username = ?, password = ?, updated_at = ? WHERE id = ?")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer stmt.Close()
 | 
			
		||||
	_, err = stmt.Exec(server.Name, server.IP, server.Port, server.Username, server.Password, server.UpdatedAt, server.ID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (server *Server) Get() error {
 | 
			
		||||
	db, err := configs.GetDB()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer db.Close()
 | 
			
		||||
	err = db.QueryRow("SELECT id, name, ip, port, username, password, created_at, updated_at FROM servers WHERE id = ?", server.ID).Scan(&server.ID, &server.Name, &server.IP, &server.Port, &server.Username, &server.Password, &server.CreatedAt, &server.UpdatedAt)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func QueryServers(page int, pagesize int) (servers []interface{}) {
 | 
			
		||||
	db, err := configs.GetDB()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer db.Close()
 | 
			
		||||
	rows, err := db.Query("SELECT id, name, ip, port, username, password, created_at, updated_at FROM servers ORDER BY id DESC LIMIT ?, ?", page*pagesize, pagesize)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer rows.Close()
 | 
			
		||||
	for rows.Next() {
 | 
			
		||||
		server := Server{}
 | 
			
		||||
		err := rows.Scan(&server.ID, &server.Name, &server.IP, &server.Port, &server.Username, &server.Password, &server.CreatedAt, &server.UpdatedAt)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Println(err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		servers = append(servers, server)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CountServers() (count int) {
 | 
			
		||||
	db, err := configs.GetDB()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer db.Close()
 | 
			
		||||
	err = db.QueryRow("SELECT COUNT(*) FROM servers").Scan(&count)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
@@ -81,18 +81,44 @@ func ModelItemGet(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ModelItemPatch(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	var model models.Model
 | 
			
		||||
	// 取出原始数据
 | 
			
		||||
	model := models.Model{ID: utils.ParamInt(mux.Vars(r)["id"], 0)}
 | 
			
		||||
	if err := model.Get(); err != nil {
 | 
			
		||||
		w.WriteHeader(http.StatusNotFound)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 取出更新数据
 | 
			
		||||
	var model_new models.Model
 | 
			
		||||
	body, err := ioutil.ReadAll(r.Body)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer r.Body.Close()
 | 
			
		||||
	if err = json.Unmarshal(body, &model); err != nil {
 | 
			
		||||
	if err = json.Unmarshal(body, &model_new); err != nil {
 | 
			
		||||
		log.Println(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	model.ID = utils.ParamInt(mux.Vars(r)["id"], 0)
 | 
			
		||||
 | 
			
		||||
	// 字段不爲空且不等於原始數據時更新
 | 
			
		||||
	if model_new.Name != "" && model_new.Name != model.Name {
 | 
			
		||||
		model.Name = model_new.Name
 | 
			
		||||
	}
 | 
			
		||||
	if model_new.Type != "" && model_new.Type != model.Type {
 | 
			
		||||
		model.Type = model_new.Type
 | 
			
		||||
	}
 | 
			
		||||
	if model_new.Status != "" && model_new.Status != model.Status {
 | 
			
		||||
		model.Status = model_new.Status
 | 
			
		||||
		// 如果狀態被改變爲 ready, 將模型發送到訓練隊列
 | 
			
		||||
		if model.Status == "ready" {
 | 
			
		||||
			model.SendToTrain()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if model_new.Image != "" && model_new.Image != model.Image {
 | 
			
		||||
		model.Image = model_new.Image
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	model.Update()
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 | 
			
		||||
	w.Write(utils.ToJSON(model))
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										50
									
								
								routers/servers.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								routers/servers.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
package routers
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"main/models"
 | 
			
		||||
	"main/utils"
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func ServersGet(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	var listview models.ListView
 | 
			
		||||
	listview.Page = utils.ParamInt(r.URL.Query().Get("page"), 1)
 | 
			
		||||
	listview.PageSize = utils.ParamInt(r.URL.Query().Get("pageSize"), 10)
 | 
			
		||||
	listview.List = models.QueryServers(listview.Page, listview.PageSize)
 | 
			
		||||
	listview.Total = models.CountServers()
 | 
			
		||||
	listview.Next = listview.Page*listview.PageSize < listview.Total
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 | 
			
		||||
	w.Write(listview.ToJSON())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ServersPost(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	var server models.Server
 | 
			
		||||
	server.Create()
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 | 
			
		||||
	w.Write(utils.ToJSON(server))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ServersItemGet(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	server := models.Server{ID: utils.ParamInt(mux.Vars(r)["id"], 0)}
 | 
			
		||||
	server.Get()
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 | 
			
		||||
	w.Write(utils.ToJSON(server))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ServersItemPatch(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	server := models.Server{ID: utils.ParamInt(mux.Vars(r)["id"], 0)}
 | 
			
		||||
	server.Get()
 | 
			
		||||
	server.Update()
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 | 
			
		||||
	w.Write(utils.ToJSON(server))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ServersItemDelete(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	server := models.Server{ID: utils.ParamInt(mux.Vars(r)["id"], 0)}
 | 
			
		||||
	server.Get()
 | 
			
		||||
	server.Delete()
 | 
			
		||||
	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 | 
			
		||||
	w.Write(utils.ToJSON(server))
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user