niuhe 插件极简教程

教程

niuhe 插件, 基于 Go 语言的 VS Code 摸鱼神器!只需轻轻一点,就能自动生成:

  • ✅ 项目骨架(告别 Ctrl+C/V 的痛苦)
  • ✅ Xorm 数据库操作代码(CRUD 写到吐?不存在的!)
  • ✅ 前端代码(Vue / 微信小程序 TypeScript 协议一键生成)
  • ✅ Swagger 接口文档(让后端和前端的 battle 变成手拉手)
  • ✅ 跨语言转换(Kotlin 等其他前端协议也能轻松拿捏)

插件功能

  • 支持生成 go 语言 web 开发框架
  • 支持生成 ts 语言的接口定义, 类型定义
  • 支持生成 swagger.json 文档, 支持导入 apifox, postman 等测试工具
  • 支持生成 route 信息, 方法名, 路径映射
  • 支持生成 protocol 信息, 可读取 json 格式协议用于生成其他语言格式的接口和类型定义
  • 支持 .models.niuhe 定义 xorm 基础操作, 生成 dao, service, modelview 内容
  • 支持生成 vue 代码(依赖 .models.niuhe), 生成基于 vue3-element-admin 项目的前端页面
  • 语法高亮, 跳转到定义位置, .niuhe 代码提示等

插件依靠上述功能达成 一次定义、多处协作 的前后端协议一致性开发.

线上教程

  • niuhe 插件使用教程 官方教程
  • niuhe 插件 在稀土掘金开了一个专栏, 介绍了如何使用 niuhe 进行 IDL 接口开发.
  • 需要 .vsix 文件的可以加QQ群 971024252 联系管理员获取

专栏文章包含要点:

  • IDL 定义代码结构
  • IDL 生成 swagger 文档, swagger 文档可导入 apifox[推荐] postman 中使用
  • 前端 接口定义, 类型定义[ts]
  • 基于 niuhe 插件的开箱即用的前(vite+ts+element-plus)后端(go)管理后台代码库

使用本插件

  • 图标点击生成: 安装后在资源管理器顶部会发现</>图标, 点击即可生成代码, 同时在视图的标题菜单也会出现 </>图标, 点击即可。
  • niuhe idl 生成 命令生成
    • command+shift+p 中输入 niuhe 使用 niuhe idl 生成 命令生成;
    • 在资源管理起中在任意文件右键, 使用第一个niuhe idl 生成

生成 go 代码时, 命令行支持 gofmt 会更好

niuhe 语法

niuhe 文件语法上遵从 python 语法. 可引用 include 引入文件

入口

默认读取当前工作区下的 niuhe 文件夹 内的 all.niuhe 文件. 可通过修改设置来更改此入文件的位置。

定义 app name(admin), 默认为 admin

#app=admin

同时可定义 gomod 变量(可选) gomodgo.mod 中的 module, 默认值为 app。定义语法为

#gomod=admin

定义整数常量

class AuthTypeEnum(ConstGroup)
    ALL = Item(0, '所有人可见')
    SOME = Item(1, '部分人可见')

生成的代码

var AuthTypeEnum struct {
	*niuhe.IntConstGroup
	ALL  niuhe.IntConstItem `name:"所有人可见" value:"0"`
	SOME niuhe.IntConstItem `name:"部分人可见" value:"1"`
}

其中 ConstGroup 为常量类型, AuthTypeEnum 为本组枚举的名字. class 为一个结构开始标记

定义请求结构

class UserItem():
    '''用户信息, class 注释例子, 注释可选'''
    nickname = required.String()
    avatar = optional.String(desc='头像')

生成的代码

type UserItem struct {
	Nickname string `json:"nickname" zpf_name:"nickname" zpf_reqd:"true"` //
	Avatar   string `json:"avatar" zpf_name:"avatar"`     // 头像
}

class 表示定义的是一个结构, 结构变量修饰符为label.type, 以及可选的说明注释组成.

label

required, optional, repeated, mapping

  • required 表示这个此结构作为请求参数时本参数必填
  • optional 表示此结构作为请求结构时本参数可选
  • repeated 表示生成的成员为数组
  • mapping 表示生成的成员为 map 形式, 内部可填充任意值

type

Integer, Decimal, Float, Long, String, Boolean, Message, Enum,StringEnum, File, Any

  • Integer 生成 int
  • Decimal 生成 float64
  • Float 生成 float64
  • Long 生成 int64
  • String 生成 string
  • Boolean 生成 bool 请求时对应01
  • Message 对应定义的 Message 结构. 通过 cls 指定,如: users = repeated.Message(desc='用户列表', cls=UserItem)
  • Enum 对应定义的 ConstGroup 结构. 通过 group 指定,如: auth = repeated.Enum(desc='认证类型', group=AuthTypeEnum)
  • File 读取 header 中对应的文件
  • Any map[string]interface{}

定义一个无成员的空结构时使用pass 如:

class NoneReq(Message):
    '''这是类说明, 可选'''
    pass

定义方法

with services():
    POST("获取用户信息", '/api/user/info/', NoneReq, UserItem)
	...

with services(): 为定义请求路由的开始结构为: 方法(注释,路由,请求参数结构,返回数据结构) 组成。

方法

请求方法当定义了 POST, GET, PUT, PATCH, DELETE, HEADOPTIONS 七种

路由

路由由/mode/view/method/ 三段(有且只支持三段)组成, mode 相同的会生成在同一个文件夹下, modeview 相同的会生成在同一文件内, 同一个 view 下的 method 生成在同一文件内.

方法的定义分部分的和全部的两种

  POST("获取用户信息", '/api/user/info/')
  POST("获取用户信息", '/api/user/info/', NoneReq, UserItem)
  RPC('RPC demo', url='/api/user/info/')

RPC 格式

RPC 语法如下

RPC('desc', [url/get/post=]'mode/view/method/')[.args(...)][.returns(...)][.codes(...)]

其中 .args, .returns,codes 都是可选的
一个例子:

    RPC('RPC测试用例', get='/api/xxx/yyy/').args(
        name   = required.String(desc='用户名'),
        password    = required.String(desc='密码'),
    ).returns(
        open_id = required.String(desc='用户open_id'),
        account_info = required.String(cls=AccountInfo, desc='账户信息'),
    ).codes(
        LanguageType.ZH_CN, comm.Errors.NOT_FOUND,
    )

args 为请求参数, returns 为返回参数, codes 为错误码, langs 中添加 route 时有效会生成映射代码

数据库格式

conf/appName.yaml 中 db 配置格式

db:
    main:user:pwd@tcp(host:port)/database_name?charset=utf8mb4

.config.json5 配置

生成代码时自动在 niuhe 文件夹下生成 .config.json5 文件, 可根据项目需要自定义功能:

{
  app: "", // 为生成的代码中的 app 名称, 默认为空字符串, 空字符串时同 #app=app_name
  gomod: "", // 为生成的代码中的 gomod 名称, 默认为为空字符串, 空字符串时同 #app=app_name
  langs: [], // 为生成的语言类型, 默认为 "go"。支持的语言有 "go","ts","docs","route","protocol","vite" 分别为 go, typescript, swagger.json 文档, route 为生成的 go route 信息
  tstypes: [], //  langs 中支持 "ts" 时有效, 为生成的 ts 接口文件路径, 默认为 typings/api.ts 文件, 可定义多个, 如: tsapi=["full_api_path1", "full_api_path2"]
  tsapi: [], // langs 中支持 "ts" 时有效, 为生成的 ts 类型文件路径, 默认为 typings/types.d.ts 文件, 可定义多个, 如: tstypes=["full_types_path1","full_types_path2"]
  tsoptional: false, // langs 支持 "ts" 时 optional 是否添加?, 默认为 false
  showlog: false, // 为生成代码时是否生成日志, 默认为不打印日志, 打开时,日志在项目目录下 niuhe.log 中, 生成错误时可进行排查
  endcmd: [], // 为生成代码后执行的命令, 默认为空, 一般第一个为命令名, 后续为参数, 如: go mod tidy 则定义为 ["go","mod","tidy"]
}

生成 swagger json 文档

本功能默认是关闭的, 打开开关为在 .config.json5 中的 langs 中添加 "docs"

{
  langs: ["go","docs"],
}

添加 docs 后会在 niuhe 文件夹下生成 .docs.json5 文档自定义文件。

xorm 生成 model, dao, service, niuhe 代码

niuhe 文件夹下存在 .model.niuhe 文件时将会生成对应 class 名字的 xorm 代码

include('comm.niuhe')
#mode 可选 默认值为 api,
#niuhe 可选, 默认值为 False, 在生成对应的 niuhe 是否覆盖已存在的 niuhe 文件内容
#dao 可选, 默认值为 False, 在生成对应的 dao 是否覆盖已存在的 dao 文件内容
#service 可选, 默认值为 False, 在生成对应的 service 是否覆盖已存在的 service 文件内容
#model 可选, 默认值为 False, 在生成对应的 model 是否覆盖已存在的 model 文件内容
#vite 可选, 默认值为 False, 在生成对应的 vite 是否覆盖已存在的 vite 文件内容, 需在 .config.json5 中 langs 中添加 "vite"
#这里是做示例用, 实际开发中直接写 class Config():即可
class Config(mode='api', niuhe=True, dao=True, service=True, model=True, vite=True):
    '''系统配置表'''
    name = required.String(desc='配置名称', index=True, search=True, len=255, nontull=True)# index 加索引, len varchar 最大长度, notnull 是否为空 search 分页查询时是否出现在参数中
    value = required.Long(desc='配置值', search=True)
    state = required.Enum(desc='状态', group=comm.StateEnum)

上述定义会生成一个表最简单的增删改查 xorm 代码和对应的 niuhe api 定义。需要注意的时, 需要手动将生成的 niuhe 文件 includeall.niuhe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值