在这里插入图片描述

效率工具集是一套旨在提升产品研发及项目交付过程中开发、设计、配置迁移等流程效率的工具集,包括IDEA插件H-Copilot、表设计、配置迁移、前端扫描、种子数据导出导入、文档生成插件等工具。

我们将提供一系列推文,介绍效率工具的使用,帮助您快速了解本工具,给您更好的使用体验。

本文为系列推文的第八讲,将为大家介绍飞码插件的自定义脚手架代码模板功能

功能亮点

飞码开发插件全新支持自定义脚手架代码模板,通过简单语法将项目团队沉淀的标准代码维护成开箱即用的可复用模板,一键快速生成标准代码骨架,配置简单,易维护。

应用场景

快速入门

选择项目文件夹,在右键菜单中选择 HZERO Tools->生成自定义模板代码 ,即可进入脚手架生成交互页面:

通过模板类型下拉框,在不同模板之间进行快速切换;选择不同模板后,将会动态渲染模板中的自定义参数;维护好参数后,点击确认,即可在所选目录下生成目标类骨架代码:

如何配置自定义模板

在IDEA中通过路径:File->Settings->HZERO Tools->Custom Template,进入模板配置页面:

配置页面是一个F型布局,左侧区域展示模板列表,点击模板名称可以切换到不同的模板;右侧区域分别是模版编辑区及使用说明。首次安装时,默认有一个Default样例模板。同时支持新增、删除、复制、导入及导出等能力。

最佳实践

接下来我们将通过一个真实的配置案例,来详细介绍自定义模板的步骤

第一步:提取代码中的变量

这一步需要对目标脚手架代码进行分析,提取出代码中需要被动态替换的部分。本例的目标脚手架代码如下:

package org.o2.customer.management.app.event;
import lombok.extern.slf4j.Slf4j;
import org.o2.customer.management.domain.customer.Customer;
import org.o2.queue.app.service.Consumer;
import org.o2.queue.app.service.impl.AbstractWrapperConsumer;
import org.o2.queue.domain.context.ConsumerContext;
import org.springframework.stereotype.Component;
// 事件消费
@Component
@Slf4j
public class TempEventConsumer extends AbstractWrapperConsumer<Customer> implements Consumer<Customer> {
    @Override
    public void consume(Long tenantId, ConsumerContext<Customer> context) {
        // todo 数据消费
    }
    @Override
    public void errorHandler(Long tenantId, ConsumerContext<Customer> context, Exception e) {
        // todo 消费异常处理,一般会存放至 xxx_retry 表, 通过 xxxRetryJob 进行重试处理。
    }
}

通过分析,我们提取出如下需要动态替换的数据:

  • 目标类的名称,例如,此处的 TempEventConsumer
  • 目标类的包名,例如,此处的 org.o2.customer.management.app.event
  • 泛型类的名称,例如,此处的 Customer
  • 泛型类的导入语句,例如,此处的
    import org.o2.customer.management.domain.customer.Customer

第二步:将变量转化为模板参数

这一步需要基于脚手架代码中的变量设计模板参数。系统已内置如下参数可直接引用:

basePackage:
目标类的包名,也即触发生成代码时的光标所在包完整限定名;无需在模板参数中显示定义

className:
目标类名,需要在模版参数中显式定义出来,供用户手工输入;如果不定义,则默认为DefaultClass

author:
代码作者,取值来源于File->Settings->HZERO Tools配置页面中代码作者的配置值;无需在模板参数中显示定义

time:
当前时间;无需在模板参数中显示定义

在本例中,需要转化为模板参数的部分只有 泛型类名称 和 泛型类导入语句 。在模板配置的说明文档中有对参数类型的详细说明,除了 TEXT 和

COMBO 类型外,还支持 PSI\_CLASS 类型的参数,该类型参数支持选择当前项目下的类定义作为参数值;在该类定义中包含了类的名称,全限类名等基本信息。因此我们只需要新增一个 PSI\_CLASS 类型的参数 customerPsiClass 即可。

最终转化出的模板参数如下:

[
    {
        "name": "className",
        "label": "类名称",
        "type": "TEXT",
        "comment": "XxEventConsumer(首字母大写)"
    },
    {
        "name": "customerPsiClass",
        "label": "消费者实体",
        "type": "PSI_CLASS",
        "comment": "事件消费的泛型实体类"
    }
]

第三步:构建VM模板

这一步的核心就是使用模板参数,替换脚手架代码中的变量,构建出VM模板。

最终生成的VM模板如下:

package $!{basePackage};
import lombok.extern.slf4j.Slf4j;
import org.o2.queue.app.service.Consumer;
import org.o2.queue.app.service.impl.AbstractWrapperConsumer;
import org.o2.queue.domain.context.ConsumerContext;
import org.springframework.stereotype.Component;
import $!{customerPsiClass.qualifiedName};
/**
 * 事件消费
 * @author $!{author}
 * @since $!time.currTime()
 */
@Component
@Slf4j
public class $!{className} extends AbstractWrapperConsumer<$!{customerPsiClass.name}> implements Consumer<$!{customerPsiClass.name}> {
    @Override
    public void consume(Long tenantId, ConsumerContext<$!{customerPsiClass.name}> context) {
            // todo 数据消费
    }
    @Override
    public void errorHandler(Long tenantId, ConsumerContext<$!{customerPsiClass.name}> context, Exception e) {
            // todo 消费异常处理,一般会存放至 xxx_retry 表, 通过 xxxRetryJob 进行重试处理。
    }
}

第四步:组装模板最终配置

每个模板包含了名称、字段定义、vm模板定义三个部分,而前面步骤中我们已经完成了字段定义和vm模板定义部分。这一步只需要按照规定的格式组装对应的结构即可:

{
    "templateName": "事件监听",
    "fields": [
        {
            "name": "className",
            "label": "类名称",
            "type": "TEXT",
            "comment": "XxEventConsumer(首字母大写)"
        },
        {
            "name": "customerPsiClass",
            "label": "消费者实体",
            "type": "PSI_CLASS",
            "comment": "事件消费的泛型实体类"
        }
    ],
    "vmTemplates": [
        {
            "template": "package $!{basePackage};\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.o2.queue.app.service.Consumer;\nimport org.o2.queue.app.service.impl.AbstractWrapperConsumer;\nimport org.o2.queue.domain.context.ConsumerContext;\nimport org.springframework.stereotype.Component;\n\nimport $!{customerPsiClass.qualifiedName};\n\n/**\n * 事件消费\n * @author $!{author}\n * @since $!time.currTime()\n */\n@Component\n@Slf4j\npublic class $!{className} extends AbstractWrapperConsumer<$!{customerPsiClass.name}> implements Consumer<$!{customerPsiClass.name}> {\n    @Override\n    public void consume(Long tenantId, ConsumerContext<$!{customerPsiClass.name}> context) {\n            // todo 数据消费\n            }\n\n    @Override\n    public void errorHandler(Long tenantId, ConsumerContext<$!{customerPsiClass.name}> context, Exception e) {\n            // todo 消费异常处理,一般会存放至 xxx_retry 表, 通过 xxxRetryJob 进行重试处理。\n            }\n}\n"
        }
    ]
}

想了解更多效率工具实际应用场景?请关注后续一系列推文\~

欢迎在评论区留言,与我们一起探讨效率工具在您业务中的应用潜力\~

联系我们

· 如果您想了解效率工具更详细的功能介绍和产品信息,请登录开放平台查阅我们的产品文档

· 如果您有疑问,可以通过开放平台进行工单反馈,问题分类请选择【产品/汉得基础架构管理平台】

相关产品咨询或更多信息了解,欢迎联系我们。
邮箱: <openhand@vip.hand-china.com>

立即预约,免费演示 👉 获取产品演示


汉得数字平台
1 声望2 粉丝

源于技术,志在四海,HAND融合中台产品交流平台。