goframe-以user接口为例,简单编写一下书写顺序

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值