歸併
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