When GoAdmin engine is building, some modules are built. Such as: database module, user authentication module. And this chapter tells you how to reuse the modules.
Database module can be used afrer the engine set the global config. For example:
import (
...
"github.com/GoAdminGroup/go-admin/engine"
...
)
func main() {
...
eng := engine.Default()
cfg := config.Config{
...
Databases: config.DatabaseList{
"default": {
Host: "127.0.0.1",
Port: "3306",
User: "root",
Pwd: "root",
Name: "godmin",
MaxIdleCon: 50,
MaxOpenCon: 150,
Driver: config.DriverMysql,
},
},
...
}
_ = eng.AddConfig(cfg). // Here the database module built.
AddPlugins(adminPlugin).
Use(r)
// get mysql connection
conn := eng.MysqlConnection()
// get mssql connection
conn := eng.MssqlConnection()
// get postgresql connection
conn := eng.PostgresqlConnection()
// get sqlite connection
conn := eng.SqliteConnection()
// Note: you get a pointer here which is point to the global database connection object.
// If you want to reuse in you table models file, then you should call before the .Use(r) method.
// Or it will panic. Like:
//
// _ = eng.AddConfig(cfg).
// ResolveMysqlConnection(tables.SetConn)
// AddPlugins(adminPlugin).
// Use(r)
//
// In your tables.go:
//
// var conn db.Connection
//
// func SetConn(c db.Connection) {
// conn = c
// }
//
// And then you call the conn in your table model file.
// get connection by setter function
eng.ResolveMysqlConnection(SetConn)
...
}
var globalConn db.Connection
func SetConn(conn db.Connection) {
globalConn = conn
}
When you receive connection
object, you can call the built-in sql helper methods:
import (
...
"github.com/GoAdminGroup/go-admin/modules/db"
"github.com/GoAdminGroup/go-admin/modules/db/dialect"
...
)
func main() {
// pass the global connection object, then call the helper methods
// query
db.WithDriver(globalConn).Table("users").Select("id", "name").First()
// update
db.WithDriver(globalConn).Table("users").Where("id", "=", 10).
Update(dialect.H{
"name": "jack",
})
// insert
db.WithDriver(globalConn).Table("users").
Insert(dialect.H{
"name": "jack",
})
// delete
db.WithDriver(globalConn).Table("users").Where("id", "=", 10).Delete()
// and so on...
}
You can use APIs of the Connection
too.
// Connection is a connection handler of database.
type Connection interface {
// Initialize
InitDB(cfg map[string]config.Database) Connection
// Get the driver name
Name() string
// Close the connection
Close() []error
// Get the default delimiter
GetDelimiter() string
// Get the sql.DB
GetDB(key string) *sql.DB
// Query with the default connection
Query(query string, args ...interface{}) ([]map[string]interface{}, error)
// Exec with the default connection
Exec(query string, args ...interface{}) (sql.Result, error)
// Query with the specify connection which is the key of Databases of config.Config.
QueryWithConnection(conn, query string, args ...interface{}) ([]map[string]interface{}, error)
// Exec with the specify connection which is the key of Databases of config.Config.
ExecWithConnection(conn, query string, args ...interface{}) (sql.Result, error)
// Transaction operations:
// begin the transaction
BeginTx() *sql.Tx
QueryWithTx(tx *sql.Tx, query string, args ...interface{}) ([]map[string]interface{}, error)
ExecWithTx(tx *sql.Tx, query string, args ...interface{}) (sql.Result, error)
BeginTxWithReadUncommitted() *sql.Tx
BeginTxWithReadCommitted() *sql.Tx
BeginTxWithRepeatableRead() *sql.Tx
BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx
BeginTxWithReadUncommittedAndConnection(conn string) *sql.Tx
BeginTxWithReadCommittedAndConnection(conn string) *sql.Tx
BeginTxWithRepeatableReadAndConnection(conn string) *sql.Tx
BeginTxAndConnection(conn string) *sql.Tx
BeginTxWithLevelAndConnection(conn string, level sql.IsolationLevel) *sql.Tx
}
Also you can use the orm, for example, ```gorm``
package main
import (
...
"github.com/jinzhu/gorm"
...
)
func initORM() {
// conn is the global connection object
orm, _ := gorm.Open("mysql", conn.GetDB("default"))
// See more about gorm: https://gorm.io
}
When we write the page content, need to get the corresponding login user, and to validate its information, need to use user authentication module.
import (
...
adapter "github.com/GoAdminGroup/go-admin/adapter/gin"
"github.com/GoAdminGroup/go-admin/engine"
...
)
func main() {
...
eng := engine.Default()
cfg := config.Config{
...
}
if err := eng.AddConfig(cfg).
AddPlugins(adminPlugin, examplePlugin).
Use(r); err != nil {
panic(err)
}
r.GET("/admin", adapter.Content(func(ctx *gin.Context) (types.Panel, error) {
// get the auth user
user, _ := engine.User(ctx)
// Verify the permissions
if !user.CheckPermission("dashboard") {
return types.Panel{}, errors.New("no permission")
}
// Verify the roles
if !user.CheckRole("operator") {
return types.Panel{}, errors.New("no permission")
}
})
...
}
Retrieve the auth user model in the data model functions:
import (
...
"github.com/GoAdminGroup/go-admin/modules/auth"
"github.com/GoAdminGroup/go-admin/plugins/admin/models"
...
)
func GetUserTable(ctx *context.Context) table.Table {
// retrieve the auth user.
user = auth.Auth(ctx)
}