beego 程式碼自動生成器

LeeChan發表於2019-09-17

平時我們用 Beego 開發小專案的時候,經常會遇到一個這樣的問題,就是同樣的業務 ,程式碼我們要重複寫好多次,改的只是一個小小的地方。即使是複製也會顯得很繁瑣。所以我不自量力搞了個工具幫助我們快速實現增刪查改操作。下面來介紹一下這個小工具。

Gii beego 自動化程式碼生成

1.介紹

Gii 是一個為了協助快速開發 beego 專案而建立的專案,通過 Gii 您可以很容易地為你已存在的資料表在你指定的目錄建立 Model 以及 Controller 。它基於 beego 為你寫好created ,update,put,以及 delete 等操作方法。

注意不能完全依靠 Gii 為你生成的東西,你需要檢查一下再進行使用。

2.安裝

您可以通過如下的方式安裝 bee 工具:

go get github.com/1920853199/go-gii 

3.使用

package main

import (
    "github.com/1920853199/go-gii"
)

func main() {

    source := "xxxx:xxxxxxxx@tcp(127.0.0.1)/abc"
    gii.Column(source,"article","")

    //beego.Run()
}

引數介紹

  1. 第一個引數 source :資料庫連線資訊
  2. 第二個引數 name 資料表名稱
  3. 第三個引數 controllerPath 是指定 Controller 生成的路徑

直接執行這個檔案後會在 beego 專案的目錄的 models下生成對應資料表的 model,在 controller 下的指定路徑生成控制器

結果:

Controller article.go程式碼

package home

import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    "github.com/astaxie/beego/validation"
)

type ArticleController struct {
    beego.Controller
}

func (c *ArticleController) List() {

    limit, _ := beego.AppConfig.Int64("limit") // 一頁的數量
    page, _ := c.GetInt64("page", 1)           // 頁數
    offset := (page - 1) * limit               // 偏移量

    o := orm.NewOrm()
    obj := new(models.Article)

    var data []*models.Article
    qs := o.QueryTable(obj)

    // 獲取資料
    _, err := qs.OrderBy("-id").Limit(limit).Offset(offset).All(&data)
    if err != nil {
        c.Abort("404")
    }

    /*c.Data["json"]= &data
    c.ServeJSON()
    c.StopRun()*/

    // 統計
    count, err := qs.Count()
    if err != nil {
        c.Abort("404")
    }

    c.Data["Data"] = &data
    c.Data["Count"] = count
    c.Data["Limit"] = limit
    c.Data["Page"] = page
}

func (c *ArticleController) Put() {
    id, err := c.GetInt("id", 0)

    if id == 0 {
        c.Abort("404")
    }

    // 基礎資料
    o := orm.NewOrm()
    obj := new(models.Article)
    var data []*models.Article
    qs := o.QueryTable(obj)
    err = qs.Filter("id", id).One(&data)
    if err != nil {
        c.Abort("404")
    }
    c.Data["Data"] = data[0]

}

func (c *ArticleController) Update() {

    id, _ := c.GetInt("id", 0)

    /*c.Data["json"] = c.Input()
    c.ServeJSON()
    c.StopRun()*/

    response := make(map[string]interface{})

    o := orm.NewOrm()

    obj := models.Article{Id: id}
    if o.Read(&obj) == nil {
        // 需要補充修改的資訊
        // 如 :obj.Reply = reply

        valid := validation.Validation{}

        // 補充需要驗證的資訊
        // 如:valid.Required(message.Reply, "Reply")

        if valid.HasErrors() {
            // 如果有錯誤資訊,證明驗證沒通過
            // 列印錯誤資訊
            for _, err := range valid.Errors {
                //log.Println(err.Key, err.Message)
                response["msg"] = "新增失敗!"
                response["code"] = 500
                response["err"] = err.Key + " " + err.Message
                c.Data["json"] = response
                c.ServeJSON()
                c.StopRun()
            }
        }

        if _, err := o.Update(&obj); err == nil {
            response["msg"] = "修改成功!"
            response["code"] = 200
            response["id"] = id
        } else {
            response["msg"] = "修改失敗!"
            response["code"] = 500
            response["err"] = err.Error()
        }
    } else {
        response["msg"] = "修改失敗!"
        response["code"] = 500
        response["err"] = "ID 不能為空!"
    }

    c.Data["json"] = response
    c.ServeJSON()
    c.StopRun()
}

func (c *ArticleController) Delete() {
    id, _ := c.GetInt("id", 0)

    response := make(map[string]interface{})

    o := orm.NewOrm()
    obj := models.Article{Id: id}

    if _, err := o.Delete(&obj); err == nil {
        response["msg"] = "刪除成功!"
        response["code"] = 200
    }else{
        response["msg"] = "刪除失敗!"
        response["code"] = 500
        response["err"] = err.Error()
    }

    c.Data["json"] = response
    c.ServeJSON()
    c.StopRun()
}

Model Article.go程式碼

package models

import (
    "github.com/astaxie/beego/orm"
    "time"
)

type Article struct {
    Id          int
    Title           string
    BusinessType            string
    BusinessName            string
    DemandType          string
    Province            string
    City            string
    District            string
    Address         string
    Content         string      `orm:"type(text)"`
    PublisherId         float64
    PublishDate         time.Time       `orm:"type(datetime)"`
    Created         time.Time       `orm:"auto_now_add;type(datetime)"`
}

func init() {
    // 需要在init中註冊定義的model
    orm.RegisterModel(new(Article))
}

實現上可能會存在很多的缺點不足,希望各位大佬不吝賜教。最後如果大家有覺得還有一點點存在的價值的話給個星星鼓勵一下謝謝各位。Github:https://github.com/1920853199/go-gii

閱讀原文

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章