324 lines
6.3 KiB
Go
324 lines
6.3 KiB
Go
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
|
||
}
|