Write the Code. Change the World.

9月 07

随着业务逻辑的充实,发现前边有些地方还是需要修改和完善。哪里呢。就是最最开始的地方,就是定义 api 的那地方。其实在那里,最开始,只需要定义 Req 和 Res。里边不需要先填充任意的东西。为什么这么说呢。因为 路由指向 ctrl,ctrl 通过 service 的绑定去调用 logic。而 logic 里的输入输出却是在 mode 里定义的。所以,model 里边的输入输出和 api 里的输入输出一般都是一样的。这个时候,只需要定义 model 里的输出输出。 api 那边直接继承过来就可以了。所以,步骤是这样的。

  • 定义 api 里的 req 和 res,空的就行(接口path 和 method 还是要加上),名字和方法名字想好。执行 gf gen ctrl 生就好。
  • 然后再生成 dao 和 model。 执行 gf gen dao 生就好。
  • 再在 model 下定义输入和输出。这个定义输入和输出也有一点矛盾。是业务场景带来的。model 和 dao 自身一般是不会有矛盾的,因为他们对应的数据库里的表。而输出和输入却要对应业务场景。比如一个项目有后台登录和 app 登录两个场景。往往,会分出两个路由组来处理这两种业务场景。虽然都是登录,输入和输出一般都不会都是相同的。这个时候 model 下定义输入和输出就得加个分组了。比如当前逻辑是后台逻辑。我会在 internal/model/ 下再多建立一层文件夹,就叫 admin。然后在里边再建立对应的输入输出文件。其实叫的这个 admin 和 api 下的文件夹是一个意思。就是初始化项目时候 api 下的 v1 的意思。这个时候都是 v1 或都是 admin,继承的时候就要用别名哈。下边会给出例子。
  • 再去建立 logic 的初步实现。然后去生 service,再回头完善 logic。 gf gen service

在 api req 的时候,里边一定要有 g.Meta。否则,不会生成对应的 ctrl 文件。

go 语言刚开始学,goframe 也是第一次用。如果理解错了,可以留言哈。

输入输出例子

internal/model/admin/user.go 定义输入输出

type SignInReq struct {
    Passport string `v:"required|length:2,64#请输入账号|账号长度为 {min} 到 {max} 位" json:"passport"`
    Password string `v:"required|length:6,16#请输入密码|密码长度为 {min} 到 {max} 位" json:"password"`
}

type SignUpReq struct {
    Nickname   string `v:"required|length:2,12#请输入昵称|昵称长度为 {min} 到 {max} 位" json:"nickname"`
    Passport   string `v:"required|length:2,64#请输入账号|账号长度为 {min} 到 {max} 位" json:"passport"`
    Password   string `v:"required|length:6,16#请输入密码|密码长度为 {min} 到 {max} 位" json:"password"`
    VerifyKey  string `v:"required|length:12#缺少验证KEY|验证KEY长度为 12 位" json:"verify_key"`
    VerifyCode string `v:"required|length:4#请输入验证码|验证码长度为 4 位" json:"verify_code"`
}

然后吧,在 api/admin/user.go 中继承过来。就是组合过来。

package admin

import (
    model "goSimpleAdmin/internal/model/admin"

    "github.com/gogf/gf/v2/frame/g"
)

// 登录
type SignInReq struct {
    g.Meta `path:"/user/sign-in" method:"post" tags:"UserService" summary:"user sign in"`
    model.SignInReq
}

// 注册(只需要数字验证码就可以)
type SignUpReq struct {
    g.Meta `path:"/user/sign-up" method:"post" tags:"UserService" summary:"user sign up"`
    model.SignUpReq
}

package 都叫 admin,就用了下别名哈。这样就把输出输入搞统一一个文件了。免得重复代码多。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注