package models import ( "encoding/json" "log" "main/configs" ) type ListView struct { 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 { // 即使list爲空,也要返回空的JSON數組 if listview.List == nil { listview.List = make([]interface{}, 0) } // 輸出格式化的JSON b, err := json.MarshalIndent(listview, "", " ") if err != nil { log.Println(err) return nil } 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 }