Files
ai/models/ListView.go
2023-04-25 16:49:39 +08:00

324 lines
6.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}