はじめに
これは 株式会社 RetailAI X Advent Calendar 2022 の 15 日目の記事です。
昨日は @Mikey さんの記事でした。NFTはなぜ難しいのだろう?
本日は、『迅速開発GoAdminでマスタ管理』について書いています。
この記事の目的
go-adminの使い方法をまとめます:
サンプルコード:https://github.com/GoAdminGroup/example
GoAdminのコマンドラインツールをインストールします。
GO111MODULE=on GOPROXY=https://goproxy.cn go install github.com/GoAdminGroup/go-admin/adm
インストールした後、versionを確認できます。
> adm -V
GoAdmin CLI v1.2.7
GoAdminに必要なsqlファイルをデータベースに導入します。
データモデルファイルを生成
プロジェックトしたに以下のコメンドを実行する:
> adm generate
以下のファイルを作成しました
*注意、自動作成したのコードでGetInfoのHideFilterArea()を使っています。これは削除が必要です。削除しない場合、エラーが発生します。
正しいのは
info := stores.GetInfo()
main.goを書きます:
package main
import (
"context"
"io/ioutil"
"log"
"net/http"
"os"
"os/signal"
"time"
_ "github.com/GoAdminGroup/go-admin/adapter/gin" // web framework adapter
_ "github.com/GoAdminGroup/go-admin/modules/db/drivers/postgres" // sql driver
_ "github.com/GoAdminGroup/themes/adminlte" // ui theme
"github.com/GoAdminGroup/example/pages"
"github.com/GoAdminGroup/example/tables"
"github.com/GoAdminGroup/go-admin/engine"
"github.com/GoAdminGroup/go-admin/template"
"github.com/GoAdminGroup/go-admin/template/chartjs"
"github.com/gin-gonic/gin"
)
func main() {
startServer()
}
func startServer() {
gin.SetMode(gin.ReleaseMode)
gin.DefaultWriter = ioutil.Discard
r := gin.Default()
eng := engine.Default()
template.AddComp(chartjs.NewChart())
if err := eng.AddConfigFromJSON("./config.json").
AddGenerators(tables.Generators).
AddGenerator("external", tables.GetExternalTable).
Use(r); err != nil {
panic(err)
}
r.Static("/uploads", "./uploads")
eng.HTML("GET", "/admin", pages.DashboardPage)
eng.HTML("GET", "/admin/form", pages.GetFormContent)
eng.HTML("GET", "/admin/table", pages.GetTableContent)
eng.HTMLFile("GET", "/admin/hello", "./html/hello.tmpl", map[string]interface{}{
"msg": "Hello world",
})
srv := &http.Server{
Addr: ":9033",
Handler: r,
}
go func() {
if err := srv.ListenAndServe(); err != nil {
log.Printf("listen: %s\n", err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt)
<-quit
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server Shutdown:", err)
}
log.Println("Server exiting")
}
実行してみます:
> go run .
http://localhost:9033/admin/login
パスワード:admin
最後メニュー設定します:
追記機能:
1.指定列で検索
FieldFilterable()
例:店舗番号で検索
info.AddField("店舗番号", "store_cd", db.Int4).
FieldFilterable()
2.名前で曖昧検索
FieldFilterable(types.FilterType{Operator: types.FilterOperatorLike})
例:店舗名で曖昧検索
info.AddField("商品名", "name", db.Varchar).
FieldFilterable(types.FilterType{Operator: types.FilterOperatorLike})
3.登録日、更新日はDefault現在の日時
formList.AddField("登録日時", "created_at", db.Timestamptz, form.Datetime).
FieldNotAllowAdd().FieldDisableWhenUpdate()
formList.AddField("更新日時", "updated_at", db.Timestamptz, form.Text).
FieldNow().FieldNotAllowAdd().FieldHideWhenUpdate()
4.必須項目
FieldMust()
例:データを新規追加/更新する時、店舗名は必須項目場合
formList.AddField("店舗名", "name", db.Varchar, form.Text).FieldMust()
5.更新できない項目
FieldNotAllowEdit()
例:
店舗情報を更新するとき、店舗番号を更新できないように
formList.AddField("店舗番号", "store_cd", db.Int4, form.Text).FieldNotAllowEdit()
6.ボタン追加
info.AddButton("納品書出力", icon.Save, action.PopUp("/admin/delivery", "", func(ctx *context.Context) (success bool, msg string, data interface{}) {
XXXXXXロジックXXXXXX
return true, "", ""
}), "yellow")
ドキュメント資料:
終わりに
最後まで読んでいただき、ありがとうございました!
次回は@takudooonさんの記事です。
お楽しみください!