0 初始化项目
wget https://github.com/gogf/gf/releases/download/v2.4.1/gf_linux_amd64
mv gf_linux_amd64 /usr/local/bin/gf
chmod +x /usr/local/bin/gf
mkdir -p /usr/local/git/
cd /usr/local/git/
gf init demo
1 配置数据库
配置数据库连接信息
manifest/config/config.yaml
server:
address: ":8000"
openapiPath: "/api.json"
swaggerPath: "/swagger"
logger:
level : "all"
stdout: true
# Database.
database:
logger:
level: "all"
stdout: true
default:
link: "mysql:root:ql2252528@tcp(127.0.0.1:3306)/demo?loc=Local"
debug: true
hack/config.yaml
# CLI tool, only in development environment.
# https://goframe.org/pages/viewpage.action?pageId=3673173
gfcli:
gen:
dao:
- link: "mysql:root:ql2252528@tcp(127.0.0.1:3306)/demo"
descriptionTag: true
noModelComment: false
jsonCase: "Camel"
参数说明
gfcli.gen.dao[0].link数据库账号密码与地址 格式 mysql:账号:密码@tcp(数据库IP地址:端口)/数据库明城
gfcli.gen.dao[0].tables 数据库表名,多个表用逗号分割
gfcli.gen.dao[0].jsonCase 指定model中生成的数据实体对象中json标签名称规则,参数不区分大小写。参数可选为:Camel、CamelLower、Snake、SnakeScreaming、SnakeFirstUpper、Kebab、KebabScreaming。具体介绍请参考命名行帮助示例。
hack/config.yaml
生产环境配置文件位置:hack/config.yaml
manifest/config/config.yaml
发布后的配置文件路径是:manifest/config/config.yaml
创建一张User表
user.sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`department` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
2 使用gf生成dao文件
在项目的根目录执行命令
gf gen dao
3 编写api
api/user.go
这里有2个方法的2个struct,一个是用于接收,一个是返回的
一个是创建user
一个是查询user
package api
import (
"demo/internal/model/entity"
"github.com/gogf/gf/v2/frame/g"
)
type UserCreateReq struct {
g.Meta `path:"/api/user/create" tags:"user相关" method:"post" summary:"创建用户"`
Name string
Password string
Department string
Email string
}
type UserCreateRes struct {
}
type UserQueryReq struct {
g.Meta `path:"/api/user/query" tags:"user相关" method:"post" summary:"查询"`
Name string
}
type UserQueryRes struct {
*entity.User
}
4 编写逻辑层logic
internal/logic/user/user.go
这里的cUser可以理解为Service,因为logic逻辑层调用service层
package user
import (
"context"
"demo/api"
"demo/internal/dao"
"demo/internal/service"
)
func init() {
//user := New() //在执行gf gen service的时候注释这2条,执行完gf gen service就可以取消注释了
//service.RegisterUser(user) //他是注册方法
}
type sUser struct {
}
func New() *sUser {
return &sUser{}
}
//这里使用的是第二步里,通过gf gen dao生成的数据库文件方法,直接在数据库创建字段
func (s *sUser) UserCreate(ctx context.Context, req *api.UserCreateReq) error {
user := &api.UserCreateReq{}
user.Name = req.Name
user.Password = req.Password
user.Department = req.Department
user.Email = req.Email
_, err := dao.User.Ctx(ctx).Save(user)
if err != nil {
return err
}
return err
}
func (s *sUser) UserQuery(ctx context.Context, req *api.UserQueryReq) (res *api.UserQueryRes, err error) {
user := &api.UserQueryRes{}
err = dao.User.Ctx(ctx).Where(req).Scan(user)
if err != nil {
panic(err.Error())
}
return user, err
}
5 生成service
因为编写完logic的之后,就可以生成service方法了,controller调用的是service层
gf gen service
6 编写controller
internal/controller/user.go
这里的cUser可以认为是 controller user的一个缩写
package controller
import (
"context"
"demo/api"
"demo/internal/service"
)
var User = cUser{}
type cUser struct {
}
// 这里直接调用logic生成的service
// 这个req就是用户从api传入的参数,我这里没有进行过滤,而是直接创建的用户
// 这里可以实现,比如说部门是运维部,权限就变成admin,开发部门就是只有一个所属环境的admin
func (c *cUser) UserAdd(ctx context.Context, req *api.UserCreateReq) (res *api.UserCreateRes, err error) {
err = service.User().UserCreate(ctx, req)
return nil, err
}
func (c *cUser) UserQuery(ctx context.Context, req *api.UserQueryReq) (res *api.UserQueryRes, err error) {
queryRes, err := service.User().UserQuery(ctx, req)
if err != nil {
panic(err.Error())
}
return queryRes, err
}
7 注册路由,对外暴露接口
internal/cmd/cmd.go
package cmd
import (
"context"
"demo/internal/controller"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gcmd"
"demo/internal/controller/hello"
)
var (
Main = gcmd.Command{
Name: "main",
Usage: "main",
Brief: "start http server",
Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup) {
group.Middleware(ghttp.MiddlewareHandlerResponse)
group.Bind(
hello.New(),
controller.User, //注册这一行路由
)
})
s.Run()
return nil
},
}
)
8 在main.go中 加入一行 _ “demo/internal/logic” (只需写一次)
package main
import (
_ "demo/internal/packed"
"github.com/gogf/gf/v2/os/gctx"
"demo/internal/cmd"
_ "demo/internal/logic"
)
func main() {
cmd.Main.Run(gctx.New())
}
9 添加数据库驱动
在main.go中加入一行 _ “github.com/gogf/gf/contrib/drivers/mysql/v2” (如果你使用的是mysql;只需写一次)
package main
import (
_ "demo/internal/packed"
"github.com/gogf/gf/v2/os/gctx"
"demo/internal/cmd"
_ "demo/internal/logic"
_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
)
func main() {
cmd.Main.Run(gctx.New())
}
10 测试goframe运行
这里就可以看到我写的2个方法了,一个创建一个查询
root@jcrose:/usr/local/git/demo# go run main.go
2023-09-26 13:22:18.592 [INFO] pid[72682]: http server started listening on [:8000]
2023-09-26 13:22:18.592 [INFO] {edab1390625b88176744833862c02fff} swagger ui is serving at address: http://127.0.0.1:8000/swagger/
2023-09-26 13:22:18.592 [INFO] {edab1390625b88176744833862c02fff} openapi specification is serving at address: http://127.0.0.1:8000/api.json
ADDRESS | METHOD | ROUTE | HANDLER | MIDDLEWARE
----------|--------|------------------|-----------------------------------------------------------------|----------------------------------
:8000 | ALL | /* | github.com/gogf/gf/v2/net/ghttp.internalMiddlewareServerTracing | GLOBAL MIDDLEWARE
----------|--------|------------------|-----------------------------------------------------------------|----------------------------------
:8000 | ALL | /api.json | github.com/gogf/gf/v2/net/ghttp.(*Server).openapiSpec |
----------|--------|------------------|-----------------------------------------------------------------|----------------------------------
:8000 | POST | /api/user/create | demo/internal/controller.(*cUser).UserAdd | ghttp.MiddlewareHandlerResponse
----------|--------|------------------|-----------------------------------------------------------------|----------------------------------
:8000 | POST | /api/user/query | demo/internal/controller.(*cUser).UserQuery | ghttp.MiddlewareHandlerResponse
----------|--------|------------------|-----------------------------------------------------------------|----------------------------------
:8000 | GET | /hello | demo/internal/controller/hello.(*Controller).Hello | ghttp.MiddlewareHandlerResponse
----------|--------|------------------|-----------------------------------------------------------------|----------------------------------
:8000 | ALL | /swagger/* | github.com/gogf/gf/v2/net/ghttp.(*Server).swaggerUI | HOOK_BEFORE_SERVE
----------|--------|------------------|-----------------------------------------------------------------|----------------------------------