歸併
This commit is contained in:
@@ -242,6 +242,7 @@ POST /api/models
|
|||||||
name: '', // 設定名稱
|
name: '', // 設定名稱
|
||||||
type: '', // 指定訓練類型
|
type: '', // 指定訓練類型
|
||||||
source: '', // 指定源模型ID
|
source: '', // 指定源模型ID
|
||||||
|
type: '', // 模型類型(RoLa|SD2|SD1.5)
|
||||||
data: {
|
data: {
|
||||||
oss: [], // 直接上傳到OSS的圖片地址列表
|
oss: [], // 直接上傳到OSS的圖片地址列表
|
||||||
images: [], // 指定圖片的ID們
|
images: [], // 指定圖片的ID們
|
||||||
|
65
configs/sqlite3.go
Normal file
65
configs/sqlite3.go
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
package configs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
_ "github.com/mattn/go-sqlite3"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 使用SQLite3初始化數據庫
|
||||||
|
func init() {
|
||||||
|
// 初始化數據庫
|
||||||
|
db, err := sql.Open("sqlite3", "data/sqlite3.db")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 一次性創建多個數據表(自增主鍵)
|
||||||
|
_, err = db.Exec(`
|
||||||
|
CREATE TABLE IF NOT EXISTS images(
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name TEXT,
|
||||||
|
created_at TEXT,
|
||||||
|
updated_at TEXT
|
||||||
|
);
|
||||||
|
CREATE TABLE IF NOT EXISTS models(
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name TEXT,
|
||||||
|
created_at TEXT,
|
||||||
|
updated_at TEXT
|
||||||
|
);
|
||||||
|
CREATE TABLE IF NOT EXISTS users(
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name TEXT,
|
||||||
|
password TEXT,
|
||||||
|
created_at TEXT,
|
||||||
|
updated_at TEXT
|
||||||
|
);
|
||||||
|
CREATE TABLE IF NOT EXISTS tags(
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name TEXT,
|
||||||
|
created_at TEXT,
|
||||||
|
updated_at TEXT
|
||||||
|
);
|
||||||
|
CREATE TABLE IF NOT EXISTS tasks(
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
name TEXT,
|
||||||
|
created_at TEXT,
|
||||||
|
updated_at TEXT
|
||||||
|
);
|
||||||
|
`)
|
||||||
|
defer db.Close()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDB 獲取數據庫連接
|
||||||
|
func GetDB() (*sql.DB, error) {
|
||||||
|
db, err := sql.Open("sqlite3", "data/sqlite3.db")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return db, nil
|
||||||
|
}
|
5
go.mod
5
go.mod
@@ -2,4 +2,7 @@ module main
|
|||||||
|
|
||||||
go 1.18
|
go 1.18
|
||||||
|
|
||||||
require github.com/mattn/go-sqlite3 v1.14.16
|
require (
|
||||||
|
github.com/gorilla/mux v1.8.0
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.16
|
||||||
|
)
|
||||||
|
2
go.sum
2
go.sum
@@ -1,2 +1,4 @@
|
|||||||
|
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
||||||
|
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||||
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
|
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
|
||||||
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
|
||||||
|
435
main.go
435
main.go
@@ -1,18 +1,158 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"main/models"
|
"main/models"
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Object interface {
|
||||||
|
ToJSON() []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateObject(w http.ResponseWriter, r *http.Request) {
|
||||||
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
|
|
||||||
|
// 從body中獲取收到的JSON數據
|
||||||
|
body, err := ioutil.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer r.Body.Close()
|
||||||
|
|
||||||
|
// 將JSON數據轉換成目標對象
|
||||||
|
object := models.GetObject(mux.Vars(r)["name"], 0)
|
||||||
|
if err = json.Unmarshal(body, object); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 將對象存入數據庫
|
||||||
|
err = object.Create()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回結果
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
|
w.Write(object.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetObjetc(w http.ResponseWriter, r *http.Request) {
|
||||||
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
|
|
||||||
|
// 獲取對象
|
||||||
|
object := models.GetObject(mux.Vars(r)["name"], ParamInt(mux.Vars(r)["id"], 0))
|
||||||
|
err := object.Get()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回結果
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
|
w.Write(object.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateObject(w http.ResponseWriter, r *http.Request) {
|
||||||
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
|
|
||||||
|
// 從body中獲取收到的JSON數據
|
||||||
|
body, err := ioutil.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer r.Body.Close()
|
||||||
|
|
||||||
|
// 將JSON數據轉換成目標對象
|
||||||
|
object := models.GetObject(mux.Vars(r)["name"], ParamInt(mux.Vars(r)["id"], 0))
|
||||||
|
if err = json.Unmarshal(body, object); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新對象
|
||||||
|
err = object.Update()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回結果
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
|
w.Write(object.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteObject(w http.ResponseWriter, r *http.Request) {
|
||||||
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
|
|
||||||
|
// 刪除對象
|
||||||
|
object := models.GetObject(mux.Vars(r)["name"], ParamInt(mux.Vars(r)["id"], 0))
|
||||||
|
err := object.Delete()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回結果
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
|
w.Write(object.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetObjects(w http.ResponseWriter, r *http.Request) {
|
||||||
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
|
|
||||||
|
var listview models.ListView
|
||||||
|
|
||||||
|
// 獲取查詢參數: page, pageSize
|
||||||
|
name := mux.Vars(r)["name"]
|
||||||
|
page := ParamInt(r.URL.Query().Get("page"), 1)
|
||||||
|
pagesize := ParamInt(r.URL.Query().Get("pageSize"), 10)
|
||||||
|
|
||||||
|
// 獲取對象列表
|
||||||
|
listview.Read(name, page, pagesize)
|
||||||
|
|
||||||
|
// 返回結果
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
|
w.Write(listview.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
||||||
|
|
||||||
|
r := mux.NewRouter()
|
||||||
|
r.HandleFunc("/api/{name}", GetObjects).Methods("GET")
|
||||||
|
r.HandleFunc("/api/{name}", CreateObject).Methods("POST")
|
||||||
|
r.HandleFunc("/api/{name}/{id}", GetObjetc).Methods("GET")
|
||||||
|
r.HandleFunc("/api/{name}/{id}", UpdateObject).Methods("PATCH")
|
||||||
|
r.HandleFunc("/api/{name}/{id}", DeleteObject).Methods("DELETE")
|
||||||
|
|
||||||
|
http.ListenAndServe(":8080", r)
|
||||||
|
|
||||||
|
// 初始化數據庫
|
||||||
|
//db, err := configs.GetDB()
|
||||||
|
//if err != nil {
|
||||||
|
// log.Fatal(err)
|
||||||
|
//}
|
||||||
|
|
||||||
|
/**
|
||||||
http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
|
http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
|
||||||
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
wecome := "Welcome to the home page!"
|
wecome := "Welcome to the home page!"
|
||||||
@@ -20,51 +160,274 @@ func main() {
|
|||||||
})
|
})
|
||||||
http.HandleFunc("/api/images", func(w http.ResponseWriter, r *http.Request) {
|
http.HandleFunc("/api/images", func(w http.ResponseWriter, r *http.Request) {
|
||||||
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
|
|
||||||
|
// 處理GET請求
|
||||||
|
if r.Method == "GET" {
|
||||||
var listview models.ListView
|
var listview models.ListView
|
||||||
|
|
||||||
|
// 獲取查詢參數: page, pageSize
|
||||||
|
listview.Page = ParamInt(r.URL.Query().Get("page"), 1)
|
||||||
|
listview.PageSize = ParamInt(r.URL.Query().Get("pageSize"), 10)
|
||||||
|
|
||||||
|
// 拼接查詢條件
|
||||||
|
condition := ""
|
||||||
|
if user_id := ParamString(r.URL.Query().Get("user_id"), ""); user_id != "" {
|
||||||
|
condition += fmt.Sprintf(" AND user_id = '%s'", user_id)
|
||||||
|
}
|
||||||
|
if created_at := ParamString(r.URL.Query().Get("created_at"), ""); created_at != "" {
|
||||||
|
condition += fmt.Sprintf(" AND created_at = '%s'", created_at)
|
||||||
|
}
|
||||||
|
if updated_at := ParamString(r.URL.Query().Get("updated_at"), ""); updated_at != "" {
|
||||||
|
condition += fmt.Sprintf(" AND updated_at = '%s'", updated_at)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 獲取總數
|
||||||
|
row := db.QueryRow("SELECT COUNT(*) FROM images WHERE 1 = 1" + condition)
|
||||||
|
err := row.Scan(&listview.Total)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 從數據庫查詢一組圖片
|
||||||
|
rows, err := db.Query("SELECT id, name, created_at, updated_at FROM images LIMIT ?, ?", (listview.Page-1)*listview.PageSize, listview.PageSize)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
// 將查詢結果裝載到ListView中
|
||||||
|
for rows.Next() {
|
||||||
|
var image models.Image
|
||||||
|
err := rows.Scan(&image.ID, &image.Name, &image.CreatedAt, &image.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
listview.List = append(listview.List, image)
|
||||||
|
}
|
||||||
|
|
||||||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
w.Write(listview.ToJson())
|
w.Write(listview.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 處理POST請求
|
||||||
|
if r.Method == "POST" {
|
||||||
|
// 從body中獲取收到的JSON數據
|
||||||
|
body, err := ioutil.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 將JSON數據轉換成Image對象
|
||||||
|
image := models.Image{}
|
||||||
|
err = image.FromJSON(body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 將Image對象存入數據庫
|
||||||
|
err = image.Create()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
|
w.Write(image.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 處理DELETE請求
|
||||||
|
if r.Method == "DELETE" {
|
||||||
|
// 從body中獲取收到的JSON數據
|
||||||
|
body, err := ioutil.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 將JSON數據轉換成Image對象
|
||||||
|
image := models.Image{}
|
||||||
|
err = image.FromJSON(body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 將Image對象從數據庫中刪除
|
||||||
|
err = image.Delete()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
|
w.Write(image.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
http.HandleFunc("/api/models", func(w http.ResponseWriter, r *http.Request) {
|
http.HandleFunc("/api/models", func(w http.ResponseWriter, r *http.Request) {
|
||||||
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
var listview models.ListView
|
|
||||||
|
// 創建一個模型
|
||||||
|
if r.Method == "POST" {
|
||||||
|
// 從body中解析出模型
|
||||||
|
body, err := ioutil.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer r.Body.Close()
|
||||||
|
|
||||||
|
// 將JSON數據轉換成Model對象
|
||||||
|
var model models.Model
|
||||||
|
if err := json.Unmarshal(body, &model); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 將Model對象存入數據庫
|
||||||
|
err = model.Create()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回創建的模型
|
||||||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
w.Write(listview.ToJson())
|
w.Write(model.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查詢一組模型
|
||||||
|
if r.Method == "GET" {
|
||||||
|
var listview models.ListView
|
||||||
|
|
||||||
|
// 獲取查詢參數: page, pageSize
|
||||||
|
listview.Page = ParamInt(r.URL.Query().Get("page"), 1)
|
||||||
|
listview.PageSize = ParamInt(r.URL.Query().Get("pageSize"), 10)
|
||||||
|
|
||||||
|
// 拼接查詢條件
|
||||||
|
condition := ""
|
||||||
|
if user_id := ParamString(r.URL.Query().Get("user_id"), ""); user_id != "" {
|
||||||
|
condition += fmt.Sprintf(" AND user_id = '%s'", user_id)
|
||||||
|
}
|
||||||
|
if created_at := ParamString(r.URL.Query().Get("created_at"), ""); created_at != "" {
|
||||||
|
condition += fmt.Sprintf(" AND created_at = '%s'", created_at)
|
||||||
|
}
|
||||||
|
if updated_at := ParamString(r.URL.Query().Get("updated_at"), ""); updated_at != "" {
|
||||||
|
condition += fmt.Sprintf(" AND updated_at = '%s'", updated_at)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 從數據庫查詢一組模型
|
||||||
|
rows, err := db.Query("SELECT id, name, created_at, updated_at FROM models LIMIT ?, ?", (listview.Page-1)*listview.PageSize, listview.PageSize)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
// 將查詢結果裝載到ListView中
|
||||||
|
for rows.Next() {
|
||||||
|
var model models.Model
|
||||||
|
err := rows.Scan(&model.ID, &model.Name, &model.CreatedAt, &model.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
listview.List = append(listview.List, model)
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
|
w.Write(listview.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
})
|
})
|
||||||
http.HandleFunc("/api/tasks", func(w http.ResponseWriter, r *http.Request) {
|
http.HandleFunc("/api/tasks", func(w http.ResponseWriter, r *http.Request) {
|
||||||
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
|
|
||||||
// 查詢一組任務
|
// 創建一個任務
|
||||||
// tasks, err := models.GetTasks()
|
if r.Method == "POST" {
|
||||||
// if err != nil {
|
task := models.Task{}
|
||||||
// log.Println(err)
|
task.Type = ParamString(r.URL.Query().Get("type"), "")
|
||||||
// return
|
task.CreatedAt = ParamString(r.URL.Query().Get("created_at"), "")
|
||||||
// }
|
task.UpdatedAt = ParamString(r.URL.Query().Get("updated_at"), "")
|
||||||
// fmt.Println(tasks)
|
err := task.Create()
|
||||||
|
if err != nil {
|
||||||
// 將取得的任務裝載到ListView中
|
log.Println(err)
|
||||||
// listView := ListView{}
|
return
|
||||||
// for _, task := range tasks {
|
}
|
||||||
// listView.Tasks = append(listView.Tasks, task)
|
|
||||||
// }
|
|
||||||
var listview models.ListView
|
|
||||||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
w.Write(listview.ToJson())
|
w.Write(task.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查詢一組任務
|
||||||
|
if r.Method == "GET" {
|
||||||
|
var listview models.ListView
|
||||||
|
|
||||||
|
// 獲取查詢參數: page, pageSize
|
||||||
|
listview.Page = ParamInt(r.URL.Query().Get("page"), 1)
|
||||||
|
listview.PageSize = ParamInt(r.URL.Query().Get("pageSize"), 10)
|
||||||
|
|
||||||
|
// 拼接查詢條件
|
||||||
|
condition := ""
|
||||||
|
if user_id := ParamString(r.URL.Query().Get("user_id"), ""); user_id != "" {
|
||||||
|
condition += fmt.Sprintf(" AND user_id = '%s'", user_id)
|
||||||
|
}
|
||||||
|
if created_at := ParamString(r.URL.Query().Get("created_at"), ""); created_at != "" {
|
||||||
|
condition += fmt.Sprintf(" AND created_at = '%s'", created_at)
|
||||||
|
}
|
||||||
|
if updated_at := ParamString(r.URL.Query().Get("updated_at"), ""); updated_at != "" {
|
||||||
|
condition += fmt.Sprintf(" AND updated_at = '%s'", updated_at)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 從數據庫查詢一組任務
|
||||||
|
rows, err := db.Query("SELECT id, type, created_at, updated_at FROM tasks LIMIT ?, ?", (listview.Page-1)*listview.PageSize, listview.PageSize)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
// 將查詢結果裝載到ListView中
|
||||||
|
for rows.Next() {
|
||||||
|
var task models.Task
|
||||||
|
err := rows.Scan(&task.ID, &task.Type, &task.CreatedAt, &task.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
listview.List = append(listview.List, task)
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
|
w.Write(listview.ToJSON())
|
||||||
|
return
|
||||||
|
}
|
||||||
})
|
})
|
||||||
http.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
|
http.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
|
||||||
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
var listview models.ListView
|
var listview models.ListView
|
||||||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
w.Write(listview.ToJson())
|
w.Write(listview.ToJSON())
|
||||||
})
|
})
|
||||||
http.HandleFunc("/api/tags", func(w http.ResponseWriter, r *http.Request) {
|
http.HandleFunc("/api/tags", func(w http.ResponseWriter, r *http.Request) {
|
||||||
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
|
||||||
var listview models.ListView
|
var listview models.ListView
|
||||||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||||
w.Write(listview.ToJson())
|
w.Write(listview.ToJSON())
|
||||||
})
|
})
|
||||||
|
|
||||||
log.Println("Web Server is running on http://localhost:8080")
|
log.Println("Web Server is running on http://localhost:8080")
|
||||||
http.ListenAndServe(":8080", nil)
|
http.ListenAndServe(":8080", nil)
|
||||||
|
**/
|
||||||
}
|
}
|
||||||
|
|
||||||
func LogComponent(startTime int64, r *http.Request) {
|
func LogComponent(startTime int64, r *http.Request) {
|
||||||
@@ -88,3 +451,35 @@ func LogComponent(startTime int64, r *http.Request) {
|
|||||||
url := fmt.Sprintf("\033[1;34m%s\033[0m", r.URL) // 藍色加重
|
url := fmt.Sprintf("\033[1;34m%s\033[0m", r.URL) // 藍色加重
|
||||||
log.Println(method, url, endTime)
|
log.Println(method, url, endTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 獲取查詢參數(int 類型)
|
||||||
|
func ParamInt(value string, defaultValue int64) int64 {
|
||||||
|
if value == "" {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
result, err := strconv.ParseInt(value, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// 獲取查詢參數(string 類型)
|
||||||
|
func ParamString(value string, defaultValue string) string {
|
||||||
|
if value == "" {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// 獲取查詢參數(bool 類型)
|
||||||
|
func ParamBool(value string, defaultValue bool) bool {
|
||||||
|
if value == "" {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
result, err := strconv.ParseBool(value)
|
||||||
|
if err != nil {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
@@ -1,24 +0,0 @@
|
|||||||
package models
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
_ "github.com/mattn/go-sqlite3"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Image struct {
|
|
||||||
ID string `json:"id"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
CreatedAt string `json:"created_at"`
|
|
||||||
UpdatedAt string `json:"updated_at"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用SQLite3初始化數據庫
|
|
||||||
func init() {
|
|
||||||
db, err := sql.Open("sqlite3", "data/sqlite3/image.db")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer db.Close()
|
|
||||||
}
|
|
@@ -3,19 +3,20 @@ package models
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"log"
|
"log"
|
||||||
|
"main/configs"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ListView struct {
|
type ListView struct {
|
||||||
Code int `json:"code"`
|
Code int64 `json:"code"`
|
||||||
Page int `json:"page"`
|
Page int64 `json:"page"`
|
||||||
PageSize int `json:"page_size"`
|
PageSize int64 `json:"page_size"`
|
||||||
Total int `json:"total"`
|
Total int64 `json:"total"`
|
||||||
Next bool `json:"next"`
|
Next bool `json:"next"`
|
||||||
List []interface{} `json:"list"`
|
List []interface{} `json:"list"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 輸出JSON給瀏覽器
|
// 輸出JSON給瀏覽器
|
||||||
func (listview *ListView) ToJson() []byte {
|
func (listview *ListView) ToJSON() []byte {
|
||||||
|
|
||||||
// 即使list爲空,也要返回空的JSON數組
|
// 即使list爲空,也要返回空的JSON數組
|
||||||
if listview.List == nil {
|
if listview.List == nil {
|
||||||
@@ -30,3 +31,293 @@ func (listview *ListView) ToJson() []byte {
|
|||||||
}
|
}
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查詢數據(分頁, 每頁數量, 排序, 條件, 關聯, 獲取總數)
|
||||||
|
func (listview *ListView) Read(name string, page int64, page_size int64) error {
|
||||||
|
|
||||||
|
// 獲取數據庫連接
|
||||||
|
db, err := configs.GetDB()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 獲取總數
|
||||||
|
var total int64
|
||||||
|
err = db.QueryRow("SELECT COUNT(*) FROM " + name).Scan(&total)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 獲取數據
|
||||||
|
rows, err := db.Query("SELECT * FROM "+name+" LIMIT ?, ?", (page-1)*page_size, page_size)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
// 將數據轉換成對象
|
||||||
|
switch name {
|
||||||
|
case "images":
|
||||||
|
for rows.Next() {
|
||||||
|
var image Image
|
||||||
|
err = rows.Scan(&image.ID, &image.Name, &image.CreatedAt, &image.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
listview.List = append(listview.List, image)
|
||||||
|
}
|
||||||
|
case "models":
|
||||||
|
for rows.Next() {
|
||||||
|
var model Model
|
||||||
|
err = rows.Scan(&model.ID, &model.Name, &model.CreatedAt, &model.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
listview.List = append(listview.List, model)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
for rows.Next() {
|
||||||
|
var object Object
|
||||||
|
err = rows.Scan(&object.ID, &object.Name, &object.CreatedAt, &object.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
listview.List = append(listview.List, object)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 設置返回值
|
||||||
|
listview.Code = 0
|
||||||
|
listview.Page = page
|
||||||
|
listview.PageSize = page_size
|
||||||
|
listview.Total = total
|
||||||
|
listview.Next = total > page*page_size
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type Object struct {
|
||||||
|
ID int64 `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
CreatedAt string `json:"created_at"`
|
||||||
|
UpdatedAt string `json:"updated_at"`
|
||||||
|
tablename string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Image struct {
|
||||||
|
Object
|
||||||
|
}
|
||||||
|
|
||||||
|
type Model struct {
|
||||||
|
Object
|
||||||
|
Type string `json:"type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Tag struct {
|
||||||
|
Object
|
||||||
|
}
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
Object
|
||||||
|
}
|
||||||
|
|
||||||
|
type Task struct {
|
||||||
|
Object
|
||||||
|
}
|
||||||
|
|
||||||
|
type ObjectInterface interface {
|
||||||
|
Create() error
|
||||||
|
Delete() error
|
||||||
|
Update() error
|
||||||
|
Get() error
|
||||||
|
GetAll() ([]Object, error)
|
||||||
|
GetPage(page int64, page_size int64) (ListView, error)
|
||||||
|
ToJSON() []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按照名稱返回響應的對象類型
|
||||||
|
func GetObject(name string, id int64) ObjectInterface {
|
||||||
|
switch name {
|
||||||
|
case "images":
|
||||||
|
return &Image{
|
||||||
|
Object{tablename: name, ID: id},
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return &Object{tablename: name, ID: id}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 創建對象
|
||||||
|
func (d *Object) Create() error {
|
||||||
|
db, err := configs.GetDB()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
stmt, err := db.Prepare("INSERT INTO " + d.tablename + "(name, created_at, updated_at) values(?, ?, ?)")
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
result, err := stmt.Exec(d.Name, d.CreatedAt, d.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
id, err := result.LastInsertId()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
d.ID = id
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 刪除對象
|
||||||
|
func (d *Object) Delete() error {
|
||||||
|
db, err := configs.GetDB()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
stmt, err := db.Prepare("DELETE FROM " + d.tablename + " WHERE id = ?")
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
_, err = stmt.Exec(d.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新對象
|
||||||
|
func (d *Object) Update() error {
|
||||||
|
db, err := configs.GetDB()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
stmt, err := db.Prepare("UPDATE " + d.tablename + " SET name = ?, updated_at = ? WHERE id = ?")
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
_, err = stmt.Exec(d.Name, d.UpdatedAt, d.ID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 獲取對象
|
||||||
|
func (d *Object) Get() error {
|
||||||
|
db, err := configs.GetDB()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
stmt, err := db.Prepare("SELECT * FROM " + d.tablename + " WHERE id = ?")
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
row := stmt.QueryRow(d.ID)
|
||||||
|
err = row.Scan(&d.ID, &d.Name, &d.CreatedAt, &d.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 獲取所有對象
|
||||||
|
func (d *Object) GetAll() ([]Object, error) {
|
||||||
|
db, err := configs.GetDB()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
stmt, err := db.Prepare("SELECT * FROM " + d.tablename)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
rows, err := stmt.Query()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
var list []Object
|
||||||
|
for rows.Next() {
|
||||||
|
var item Object
|
||||||
|
err = rows.Scan(&item.ID, &item.Name, &item.CreatedAt, &item.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
list = append(list, item)
|
||||||
|
}
|
||||||
|
return list, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 獲取分頁對象
|
||||||
|
func (d *Object) GetPage(page int64, page_size int64) (ListView, error) {
|
||||||
|
db, err := configs.GetDB()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return ListView{}, err
|
||||||
|
}
|
||||||
|
stmt, err := db.Prepare("SELECT * FROM " + d.tablename + " LIMIT ?, ?")
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return ListView{}, err
|
||||||
|
}
|
||||||
|
defer stmt.Close()
|
||||||
|
rows, err := stmt.Query((page-1)*page_size, page_size)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return ListView{}, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
var list []interface{}
|
||||||
|
for rows.Next() {
|
||||||
|
var item Object
|
||||||
|
err = rows.Scan(&item.ID, &item.Name, &item.CreatedAt, &item.UpdatedAt)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return ListView{}, err
|
||||||
|
}
|
||||||
|
list = append(list, item)
|
||||||
|
}
|
||||||
|
var listview ListView
|
||||||
|
listview.Code = 0
|
||||||
|
listview.Page = page
|
||||||
|
listview.PageSize = page_size
|
||||||
|
listview.List = list
|
||||||
|
return listview, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 轉換為格式化的JSON
|
||||||
|
func (d *Object) ToJSON() []byte {
|
||||||
|
b, err := json.MarshalIndent(d, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
@@ -1,24 +0,0 @@
|
|||||||
package models
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
_ "github.com/mattn/go-sqlite3"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Model struct {
|
|
||||||
ID string `json:"id"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
CreatedAt string `json:"created_at"`
|
|
||||||
UpdatedAt string `json:"updated_at"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用SQLite3初始化數據庫
|
|
||||||
func init() {
|
|
||||||
db, err := sql.Open("sqlite3", "data/sqlite3/model.db")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer db.Close()
|
|
||||||
}
|
|
@@ -1,24 +0,0 @@
|
|||||||
package models
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
_ "github.com/mattn/go-sqlite3"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Tag struct {
|
|
||||||
ID string `json:"id"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
CreatedAt string `json:"created_at"`
|
|
||||||
UpdatedAt string `json:"updated_at"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用SQLite3初始化數據庫
|
|
||||||
func init() {
|
|
||||||
db, err := sql.Open("sqlite3", "data/sqlite3/tag.db")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer db.Close()
|
|
||||||
}
|
|
@@ -1,24 +0,0 @@
|
|||||||
package models
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
_ "github.com/mattn/go-sqlite3"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Task struct {
|
|
||||||
ID string `json:"id"`
|
|
||||||
Type string `json:"type"`
|
|
||||||
CreatedAt string `json:"created_at"`
|
|
||||||
UpdatedAt string `json:"updated_at"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用SQLite3初始化數據庫
|
|
||||||
func init() {
|
|
||||||
db, err := sql.Open("sqlite3", "data/sqlite3/task.db")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer db.Close()
|
|
||||||
}
|
|
@@ -1,25 +0,0 @@
|
|||||||
package models
|
|
||||||
|
|
||||||
import (
|
|
||||||
"database/sql"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
_ "github.com/mattn/go-sqlite3"
|
|
||||||
)
|
|
||||||
|
|
||||||
type User struct {
|
|
||||||
ID string `json:"id"`
|
|
||||||
UserName string `json:"username"`
|
|
||||||
Password string `json:"password"`
|
|
||||||
CreatedAt string `json:"created_at"`
|
|
||||||
UpdatedAt string `json:"updated_at"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用SQLite3初始化數據庫
|
|
||||||
func init() {
|
|
||||||
db, err := sql.Open("sqlite3", "data/sqlite3/user.db")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer db.Close()
|
|
||||||
}
|
|
Reference in New Issue
Block a user