歸併
This commit is contained in:
		@@ -242,6 +242,7 @@ POST /api/models
 | 
			
		||||
    name: '',    // 設定名稱
 | 
			
		||||
    type: '',    // 指定訓練類型
 | 
			
		||||
    source: '',  // 指定源模型ID
 | 
			
		||||
    type: '',    // 模型類型(RoLa|SD2|SD1.5)
 | 
			
		||||
    data: {
 | 
			
		||||
        oss:     [], // 直接上傳到OSS的圖片地址列表
 | 
			
		||||
        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
 | 
			
		||||
 | 
			
		||||
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/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										435
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										435
									
								
								main.go
									
									
									
									
									
								
							@@ -1,18 +1,158 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"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() {
 | 
			
		||||
	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) {
 | 
			
		||||
		defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
 | 
			
		||||
		wecome := "Welcome to the home page!"
 | 
			
		||||
@@ -20,51 +160,274 @@ func main() {
 | 
			
		||||
	})
 | 
			
		||||
	http.HandleFunc("/api/images", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
 | 
			
		||||
 | 
			
		||||
		// 處理GET請求
 | 
			
		||||
		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)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// 獲取總數
 | 
			
		||||
			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.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) {
 | 
			
		||||
		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.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) {
 | 
			
		||||
		defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
 | 
			
		||||
 | 
			
		||||
		// 查詢一組任務
 | 
			
		||||
		// tasks, err := models.GetTasks()
 | 
			
		||||
		// if err != nil {
 | 
			
		||||
		// 	log.Println(err)
 | 
			
		||||
		// 	return
 | 
			
		||||
		// }
 | 
			
		||||
		// fmt.Println(tasks)
 | 
			
		||||
 | 
			
		||||
		// 將取得的任務裝載到ListView中
 | 
			
		||||
		// listView := ListView{}
 | 
			
		||||
		// for _, task := range tasks {
 | 
			
		||||
		// 	listView.Tasks = append(listView.Tasks, task)
 | 
			
		||||
		// }
 | 
			
		||||
		var listview models.ListView
 | 
			
		||||
		// 創建一個任務
 | 
			
		||||
		if r.Method == "POST" {
 | 
			
		||||
			task := models.Task{}
 | 
			
		||||
			task.Type = ParamString(r.URL.Query().Get("type"), "")
 | 
			
		||||
			task.CreatedAt = ParamString(r.URL.Query().Get("created_at"), "")
 | 
			
		||||
			task.UpdatedAt = ParamString(r.URL.Query().Get("updated_at"), "")
 | 
			
		||||
			err := task.Create()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Println(err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			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) {
 | 
			
		||||
		defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
 | 
			
		||||
		var listview models.ListView
 | 
			
		||||
		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) {
 | 
			
		||||
		defer LogComponent(time.Now().UnixNano(), r) // 最后打印日志
 | 
			
		||||
		var listview models.ListView
 | 
			
		||||
		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")
 | 
			
		||||
	http.ListenAndServe(":8080", nil)
 | 
			
		||||
	**/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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)       // 藍色加重
 | 
			
		||||
	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 (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"log"
 | 
			
		||||
	"main/configs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ListView struct {
 | 
			
		||||
	Code     int           `json:"code"`
 | 
			
		||||
	Page     int           `json:"page"`
 | 
			
		||||
	PageSize int           `json:"page_size"`
 | 
			
		||||
	Total    int           `json:"total"`
 | 
			
		||||
	Code     int64         `json:"code"`
 | 
			
		||||
	Page     int64         `json:"page"`
 | 
			
		||||
	PageSize int64         `json:"page_size"`
 | 
			
		||||
	Total    int64         `json:"total"`
 | 
			
		||||
	Next     bool          `json:"next"`
 | 
			
		||||
	List     []interface{} `json:"list"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 輸出JSON給瀏覽器
 | 
			
		||||
func (listview *ListView) ToJson() []byte {
 | 
			
		||||
func (listview *ListView) ToJSON() []byte {
 | 
			
		||||
 | 
			
		||||
	// 即使list爲空,也要返回空的JSON數組
 | 
			
		||||
	if listview.List == nil {
 | 
			
		||||
@@ -30,3 +31,293 @@ func (listview *ListView) ToJson() []byte {
 | 
			
		||||
	}
 | 
			
		||||
	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