Go Admin基础开发

一、项目配置

下载项目(当前使用主分支)

1
git clone https://github.com/go-admin-team/go-admin.git && cd go-admin

安装依赖(提前配置好GOPROXY)

1
go mod tidy

整个数据库(最简单的就是直接拉个docker跑起来),然后创个库,修改config/settings.yml 配置文件中数据库的配置:

1
2
3
4
5
6
7
8
# 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刷表刷数据(框架自带的一些默认数据)

1
go run main.go migrate

启动服务

1
go run main.go server

二、编写新的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
// 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, "查询成功") // 设置返回值
}

编写路由:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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:

1
2
3
4
5
6
7
8
# 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就编写完成了

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
// 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配置

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
})
}

执行迁移

1
go run main.go migrate

这样自己定义的数据表就创建好了,查看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
// 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)
}
}

插入一条数据后查询:

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接口就实现了。