首页 文章 精选 留言 我的

精选列表

搜索[AI功能],共10000篇文章
优秀的个人博客,低调大师

Kimi 上线付费会员计划,会员可使用深度研究 Agent 功能

月之暗面旗下智能助手Kimi近日悄然上线了全新的Agent会员服务。 昨晚,多位用户在打开Kimi界面时,意外收到一封感谢信,专为此前打赏的用户量身定制福利:订阅会员后,打赏金额将全额转换为会员时长。 会员订阅分为三挡: Adagio(慢板)对应的是免费版本。 Andante(行板)49 元中档订阅,更多的 K2 和深度研究额度,另外会送等额 API 兑换券。 Moderato(中速)99 元有更高的额度,支持深度研究并发,依然送等额 API 代金券。 建议有打赏记录的用户速去App查看详情,机会有限。

优秀的个人博客,低调大师

VonaJS 5.0 隆重推出自动推断生成 DTO 的功能

​在Nodejs生态中,Prisma是一个非常流行的ORM库,支持Typescript,提供了非常友好的类型推断能力。但是,Prisma却不能优雅的支持DTO。在与其他后端框架整合时,DTO是进行参数验证、生成Swagger元数据的关键节点。如果不能像推断类型一样自动推断出DTO,那么,我们就仍然需要手工创建DTO。随着业务的增长,复杂的表间关系会让手工补充DTO的工作日益繁重。 而VonaJS 5.0就提供了非常便利的工具,使我们可以非常直观的动态推断出DTO,就像推断类型一样,从而解放我们的双手,显著提升生产力。甚至可以说,能够自动推断DTO,为Nodejs后端框架打开了一扇窗。 限于篇幅,这里不展开讲解Vona ORM所有的知识点,而是以目录树为例,演示如何查询一棵目录树,以及如何动态生成DTO,并最终生成Swagger元数据。 1. 创建Entity 在VSCode中,可以通过右键菜单Vona Create/Entity创建Entity的代码骨架: @Entity('demoStudentCategory') export class EntityCategory extends EntityBase { @Api.field() name: string; @Api.field(v.optional()) categoryIdParent?: TableIdentity; } 行2: 继承自EntityBase,就会自动提供5个基础字段:id、createdAt、updatedAt、deleted、iid iid:是实例Id,通过多实例的机制支持多租户系统的开发 行4、7: 定义两个业务字段:name、categoryIdParent @Api.field:通过此装饰器定义的信息,可同时应用于参数验证和Swagger元数据 v.optional:声明为可选字段 2. 创建Model 在VSCode中,可以通过右键菜单Vona Create/Model创建Model的代码骨架: import { EntityCategory } from '../entity/category.ts'; @Model({ entity: EntityCategory }) export class ModelCategory extends BeanModelBase {} 行3: entity:指定Model所对应的Entity 行4: 继承自BeanModelBase,从而拥有大量操作数据库的方法,如:CRUD、聚合、分组,等等 3. 创建树形结构 如果要创建一棵目录树,本质就是建立Model引用自身的递归结构。Vona ORM同样支持4种关系:1对1、1对多、多对1,多对多。那么,在这里,我们就需要采用1对多来创建目录的自身引用关系。 import { EntityCategory } from '../entity/category.ts'; @Model({ entity: EntityCategory, + relations: { + children: $relation.hasMany(() => ModelCategory, 'categoryIdParent', { + autoload: true, + columns: ['id', 'name'], + }), + }, }) export class ModelCategory extends BeanModelBase {} 行5: relations:可以定义多个关系 行6: children:定义一个1对多的关系 $relation.hasMany: 参数1: 引用自身ModelCategory 参数2: 设置关联外键categoryIdParent 参数3: 关联选项 autoload:是否自动加载关联数据 columns:控制关联数据的字段列表 4. 创建Controller 在VSCode中,可以通过右键菜单Vona Create/Controller创建Controller的代码骨架: @Controller() export class ControllerCategory extends BeanBase {} 接下来我们创建一个Api,用于获取目录树: export class ControllerCategory extends BeanBase { @Web.get('getCategoryTree') async getCategoryTree() { } } 行2: 通过@Web.get定义一个api,path为getCategoryTree 5. 查询目录树 一般而言,我们还需要创建一个Service,从而实现以下调用链:Controller->Service->Model->操作数据库。为了简化起见,在这里,我们直接在Controller中调用Model方法: export class ControllerCategory extends BeanBase { @Web.get('getCategoryTree') async getCategoryTree() { const tree = await this.scope.model.category.select({ columns: ['id', 'name'], }); return tree; } } 行4: 通过this.scope取得Category Model,然后调用select方法 columns:指定要查询的字段列表 由于前面我们设置children关系为autoload: true,因此,查询结果tree就是一棵完整的目录树。下面我们看一下tree的类型推断效果: 6. 自动推断DTO 现在我们自动推断DTO,并且设为API的返回数据的类型: export class ControllerCategory extends BeanBase { @Web.get('getCategoryTree') + @Api.body(v.array(v.object($Dto.get(() => ModelCategory, { columns: ['id', 'name'] })))) async getCategoryTree() { const tree = await this.scope.model.category.select({ columns: ['id', 'name'], }); return tree; } } 行3: 通过@Api.body定义API返回数据的类型: v.array:定义数组类型 v.object:定义对象类型 $Dto.get:动态推断DTO 参数1:指定目标Model 参数2:指定选项 columns:指定要提取的字段列表 同样,由于前面我们设置children关系为autoload: true,因此,$Dto.get生成的DTO就是一棵完整的目录树。下面我们看一下API的Swagger效果: 从示意图中,我们可以清晰的看到,这棵树引用的children类型是名称为demo-student.entity.category_2c7d642ee581efa300341e343180fbb0ecdc785d的动态Entity的数组,从而形成一种递归的引用关系。 7. 封装DTO 虽然我们已经实现了预期的目标,但是Vona ORM提供的能力还没有结束。我们可以创建一个新的DTO,将前面的代码$Dto.get(() => ModelCategory, { columns: ['id', 'name'] })封装起来,从而用于其他地方: 在VSCode中,可以通过右键菜单Vona Create/Dto创建DTO的代码骨架: @Dto() export class DtoCategoryTree {} 然后我们通过继承机制来封装DTO: @Dto() export class DtoCategoryTree + extends $Dto.get(() => ModelCategory, { columns: ['id', 'name'] }) {} 现在,我们再使用新创建的DTO来改造前面的API代码: export class ControllerCategory extends BeanBase { @Web.get('getCategoryTree') + @Api.body(v.array(v.object(DtoCategoryTree))) + async getCategoryTree(): Promise<DtoCategoryTree[]> { const tree = await this.scope.model.category.select({ columns: ['id', 'name'], }); return tree; } } 行3: 直接传入DtoCategoryTree 行4: 返回类型为Promise<DtoCategoryTree[]> ​

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册