起因

最近给公司写接口的过程中,发现每有一种新的数据形式,出现就需要重新写一个数据表,并提供相关的数据接口。这个过程中有很多的代码复用。
一开始我写了一组使用范类的常用controller和service,并让新写的controller和service继承他们,效果还可以,但是还是要自己写entity以及配置数据库一些重复的操作。所以我想能否也省去写这些部分的时间。

实现结果

只通过一个json文件(即数据格式),生成一系列接口以及文档。

test.json
{"name": "hi", "age": 1} 

生成效果(下面都是通过一个json生成的内容)

生成的文档目录(更新了app.module)

接口

接口内包括筛选,查找,分页,缓存等一系列选项。

数据格式文档

数据表

实现思路

  1. nesjs有类似component的概念,component之间可以通过插入继承来实现复用。我这里使用了继承,因为想复用的部分都是可以共用的增查删改操作。
  2. 在网上搜索资料的时候发现,有人也有同样的思路,并写了一个包nestjsx/crud。star数有点少, 不过很好用,暂时只支持typeorm。既然有了轮子就不用自己造了。这个包含了swagger的配置,所以会自动生成文档。
  3. 基于这个包扩展开来,我要做的只是把json转成entity.ts文件,生成module,controller, service(继承crud)以及配置好数据库就行了。实现很简单我用了jupter notebook 然后转成了python。源码地址 实现过程在ipynb里,py是转换好的文件。

运行

ipython beg.py test(实例/数据表名) test.json(数据内容)

对nestjsx/crud的改进部分

  1. 增加了json转entity
  2. 补充了swagger分区(ApiTags)和显示entity内部属性(ApiModelProperty)
  3. 生成module,controller,service,并注入entiity repository
  4. 更新app.module

之后的扩展方向

  1. 丰富json数据类型支持,目前只支持string, int, bool
  2. 添加mongodb支持
  3. 提供更多entity column选项
  4. 添加接口权限控制
  5. 根据list of json 批量生成接口
  6. 生成一个接口,供前端使用,前端可以根据数据需求创造接口。
  7. js重新打包成cli发布到npm

0.0.1

  1. 添加relation {} 为 one to one or many to one (default one to one)
    [] 为 one to many or many to many (default one to many)
  2. 只生成entity
  3. 描述 descrption 根据

已知bug

json 中不能用id属性,因为id是由primaryGenerateColumn默认生成的。

I am a real pikachu!