教程
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
,model
和view
内容 - 支持生成
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
变量(可选) gomod
为 go.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
请求时对应0
和1
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
, HEAD
和 OPTIONS
七种
路由
路由由/mode
/view
/method
/ 三段(有且只支持三段)组成, mode
相同的会生成在同一个文件夹下, mode
和 view
相同的会生成在同一文件内, 同一个 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
文件 include
进 all.niuhe
中