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!" w.Write([]byte(wecome)) }) 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()) 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) // 最后打印日志 // 創建一個模型 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(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) // 最后打印日志 // 創建一個任務 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(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()) }) 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()) }) log.Println("Web Server is running on http://localhost:8080") http.ListenAndServe(":8080", nil) **/ } func LogComponent(startTime int64, r *http.Request) { ms := (time.Now().UnixNano() - startTime) / 1000000 color := "\033[1;32m%d\033[0m" if ms > 800 { color = "\033[1;31m%dms\033[0m" // 紅色加重 } else if ms > 500 { color = "\033[1;33m%dms\033[0m" // 黃色加重 } else if ms > 300 { color = "\033[1;32m%dms\033[0m" // 綠色加重 } else if ms > 200 { color = "\033[1;34m%dms\033[0m" // 藍色加重 } else if ms > 100 { color = "\033[1;35m%dms\033[0m" // 紫色加重 } else { color = "\033[1;36m%dms\033[0m" // 黑色加重 } endTime := fmt.Sprintf(color, ms) method := fmt.Sprintf("\033[1;32m%s\033[0m", r.Method) // 綠色加重 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 }