一、项目配置
下载项目(当前使用主分支)
1
| git clone https://github.com/go-admin-team/go-admin.git && cd go-admin
|
安装依赖(提前配置好GOPROXY)
整个数据库(最简单的就是直接拉个docker跑起来),然后创个库,修改config/settings.yml
配置文件中数据库的配置:
1 2 3 4 5 6 7 8
| 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刷表刷数据(框架自带的一些默认数据)
启动服务
二、编写新的app
2.1.创建app
我们通常都把代码按业务上的模块进行划分,这样一个模块称为一个app,大部分都提供了CLI工具用来快速创建一个app所需的一些基础目录和代码,比如django的python manage.py createapp $appname
,go-admin也不例外,通过以下命令创建一个app
1
| go run main.go createapp --name myfamily
|
执行完命令之后,会在app目录下生成myfamily目录,该目录下包含一些基础的子目录,一个router.go文件,帮我们搭建好了app的路由框架。同时生成了cmd/api/myfamily.go
这个文件,将app的路由进行注册
1 2 3 4
| git status
new file: app/myfamily/router/router.go new file: cmd/api/family.go
|
2.2.编写API
2.2.1.简单的接口
接下来先来编写一个简单的HTTP接口;
编写api:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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) e.OK(nil, "查询成功") }
|
编写路由:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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:
1 2 3 4 5 6 7 8
| http 127.0.0.1:8000/api/v1/family/menu { "code": 200, "data": null, "msg": "查询成功", "requestId": "f2d7da6b-49d1-441f-be1c-d83bf3849639" }
|
一个简单的无需认证的API就编写完成了
2.2.2.为app创建数据库
基础的HTTP接口跑通之后,来为这个app把数据库的CURD给打通
使用数据库的第一步就是设计好需要用到的表,然后编写DDL并执行。
不过大部分框架都会基于ORM通过代码的方式管理数据库表的创建、修改,并且有版本的概念,比如v1版本创建了表,v2版本新增了一个字段。
- v1、v2这些版本称为migrations(迁移版本)
- 执行这些数据库的迁移版本操作称为migrate(迁移)。
设计好表之后,定义表的结构(需要先了解gorm)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package models
import "go-admin/common/models"
type FamilyMenu struct { MenuId int `json:"menuId" gorm:"primaryKey;autoIncrement;type:int"` 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配置
1
| go run main.go migrate -a true -g true
|
修改migrate迁移文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| 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 }) }
|
执行迁移
这样自己定义的数据表就创建好了,查看sys_migration
这张表,也可以看到迁移的记录
2.2.3.数据库CURD接口
这个框架的管理界面提供了自动生成一些通用代码的功能,现在先把后台管理给开起来
1 2 3 4
| git clone git@github.com:go-admin-team/go-admin-ui.git && cd go-admin-ui
yarn install && yarn run dev
|
后台管理默认会连接localhost的后端,直接打开 localhost:9527
就可以了。
然后将刚刚创建好的表导入到代码生成的配置项里面
编辑不同的接口需要哪些字段,生成信息中,配置应用名为 myfamily
点击预览就可以看到需要的代码了
点击生成代码,项目就会插入相应的代码。默认的CURD接口就实现了。
先将这些路由设置为无须JWT验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
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) } }
|
插入一条数据后查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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接口就实现了。