下载项目(当前使用主分支)
git clone https://github.com/go-admin-team/go-admin.git && cd go-admin
安装依赖(提前配置好GOPROXY)
go mod tidy
整个数据库(最简单的就是直接拉个docker跑起来),然后创个库,修改config/settings.yml
配置文件中数据库的配置:
# config/settings.yml
database:
driver: mysql
# 修改账号、密码、表名
source: user:xxxxx@tcp(127.0.0.1:3306)/test_db?charset=utf8&parseTime=True&loc=Local&timeout=1000ms
gen:
# 代码生成读取的数据库名称
dbname: test_db
执行migrate刷表刷数据(框架自带的一些默认数据)
go run main.go migrate
启动服务
go run main.go server
我们通常都把代码按业务上的模块进行划分,这样一个模块称为一个app,大部分都提供了CLI工具用来快速创建一个app所需的一些基础目录和代码,比如django的python manage.py createapp $appname
,go-admin也不例外,通过以下命令创建一个app
go run main.go createapp --name myfamily
执行完命令之后,会在app目录下生成myfamily目录,该目录下包含一些基础的子目录,一个router.go文件,帮我们搭建好了app的路由框架。同时生成了cmd/api/myfamily.go
这个文件,将app的路由进行注册
git status
new file: app/myfamily/router/router.go
new file: cmd/api/family.go
接下来先来编写一个简单的HTTP接口;
编写api:
// app/myfamily/apis/family_menu.go
package apis
import (
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/sdk/api"
)
type FamilyMenu struct {
api.Api
}
func (e FamilyMenu) GetTest(c *gin.Context) {
e.MakeContext(c) // 设置http上下文
e.OK(nil, "查询成功") // 设置返回值
}
编写路由:
// app/myfamily/router/family_menu.go
package router
import (
"github.com/gin-gonic/gin"
"go-admin/app/myfamily/apis"
)
func init() {
routerNoCheckRole = append(routerNoCheckRole, registerHouseMenuRouter)
}
func registerHouseMenuRouter(v1 *gin.RouterGroup) {
api := apis.HouseMenu{}
r := v1.Group("/family/menu")
{
r.GET("", api.GetTest)
}
}
然后重新启动服务,访问API:
# http类似curl;可通过pip3 install httpie 进行安装
http 127.0.0.1:8000/api/v1/family/menu
{
"code": 200,
"data": null,
"msg": "查询成功",
"requestId": "f2d7da6b-49d1-441f-be1c-d83bf3849639"
}
一个简单的无需认证的API就编写完成了
基础的HTTP接口跑通之后,来为这个app把数据库的CURD给打通
使用数据库的第一步就是设计好需要用到的表,然后编写DDL并执行。
不过大部分框架都会基于ORM通过代码的方式管理数据库表的创建、修改,并且有版本的概念,比如v1版本创建了表,v2版本新增了一个字段。
设计好表之后,定义表的结构(需要先了解gorm)
// cmd/migrate/migration/models/family_menu.go
package models
import "go-admin/common/models"
type FamilyMenu struct {
MenuId int `json:"menuId" gorm:"primaryKey;autoIncrement;type:int"` // 菜单ID
MenuName string `json:"MenuName" gorm:"size:255;"` // 菜单名称
OrderNum int `json:"orderNum" gorm:"size:255;type:int;"` // 被下单次数
MainImg string `json:"mainImg" gorm:"size:255;"` // 主图
Description string `json:"description" gorm:"type:longtext;"` // 描述(富文本)
CookBook string `json:"cookBook" gorm:"type:longtext;"` // 做法(富文本)
models.ControlBy
models.ModelTime
}
func (FamilyMenu) TableName() string {
return "family_menu"
}
接着执行命令,此时会在 cmd/migrate/migration/version
下生成一个migrate配置
go run main.go migrate -a true -g true
修改migrate迁移文件
package version
import (
"gorm.io/gorm"
"runtime"
"go-admin/cmd/migrate/migration"
common "go-admin/common/models"
)
func init() {
_, fileName, _, _ := runtime.Caller(0)
migration.Migrate.SetVersion(migration.GetFilename(fileName), _1659185997198Test)
}
func _1659185997198Test(db *gorm.DB, version string) error {
return db.Transaction(func(tx *gorm.DB) error {
// 创建数据表
err := tx.Debug().Migrator().AutoMigrate(
new(models.FamilyMenu),
)
if err != nil {
return err
}
return tx.Create(&common.Migration{
Version: version,
}).Error
})
}
执行迁移
go run main.go migrate
这样自己定义的数据表就创建好了,查看sys_migration
这张表,也可以看到迁移的记录
这个框架的管理界面提供了自动生成一些通用代码的功能,现在先把后台管理给开起来
git clone [email protected]:go-admin-team/go-admin-ui.git && cd go-admin-ui
# 配置好代理,方法自行搜索
yarn install && yarn run dev
后台管理默认会连接localhost的后端,直接打开 localhost:9527
就可以了。
然后将刚刚创建好的表导入到代码生成的配置项里面
编辑不同的接口需要哪些字段,生成信息中,配置应用名为 myfamily
点击预览就可以看到需要的代码了
点击生成代码,项目就会插入相应的代码。默认的CURD接口就实现了。
先将这些路由设置为无须JWT验证
// app/myfamily/router/family_menu.go
func registerHouseMenuRouter(v1 *gin.RouterGroup) {
api := apis.FamilyMenu{}
r := v1.Group("/family-menu")
{
r.GET("test", api.GetTest)
r.GET("", actions.PermissionAction(), api.GetPage)
r.GET("/:id", actions.PermissionAction(), api.Get)
r.POST("", api.Insert)
r.PUT("/:id", actions.PermissionAction(), api.Update)
r.DELETE("", api.Delete)
}
}
插入一条数据后查询:
curl http://127.0.0.1:8000/api/v1/family-menu
{
"requestId": "02c1ac93-395b-47e1-87ba-cee4f6342b5b",
"code": 200,
"msg": "查询成功",
"data": {
"count": 1,
"pageIndex": 1,
"pageSize": 10,
"list": [
{
"menuId": 1,
"menuName": "测试",
"orderNum": 111,
"mainImg": "ttt",
"description": "ttt",
"cookBook": "ttt",
"createBy": 0,
"updateBy": 0,
"createdAt": "xxx",
"updatedAt": "xxx"
}
]
}
}
CURD接口就实现了。