序言
Trantor 是一个中后台业务应用快速研发和交付体系。Trantor 通过对应用、交互和场景的抽象,以元数据驱动的方式帮助开发者高效可控的构建业务应用或对已有应用进行二次开发。在这个快速开始教程中,我们将介绍一些 Trantor 的入门知识,通过开发一个非常简单,但是功能完备的人事应用带领读者快速入门。本文将展示在 Trantor 中如何设计模型、如何在线化编辑元信息、如何进行简单开发。此外,为了让您更好的体验和使用 Trantor,本文将简单介绍 Trantor 的部署形态。通过观看这个入门教程,足以使您能开始通过 Trantor 开发您自己的应用程序。
产品形态

在学习 Trantor 前我们先了解下 Terminus 的产品形态,这样可以便于我们再在学习 Trantor 的过程中带入场景。使其能够高效的理解相关概念和快速上手。我们可以看到上图是整个 Terminus 产品的结构,它覆盖了整个软件研发的全链路。
- 最底下是我们的 Erda,它负责帮我们提供 DevOps、微服务治理、多云管理以及快数据管理等多功能的开源一站式企业数字化平台。
- 接下来是我们的 Trantor,它帮助我们解决企业级中后台业务系统的快速研发、低成本定制,以及被定制后软件的持续升级和服务。
- 再往上是我们的 Gaia,Gaia 是不限定于某个特定行业或领域的通用业务能力,提供从采到销完整的数据流、业务流、资金流的打通。
- gaia 之上是我们的 Gaia-App,Gaia App 通过复用和扩展 Gaia 来提供特定行业或领域的应用,并保证彼此之间的三流打通。
- 最后针对特定的企业及生产交付场景,我们引入了交付物的概念,来满足不同公司的定制化需求
在了解到整个 Terminus 的产品形态后,我们可以看到 Gaia、Gaia-App 以及交付物是依托于 Trantor 的研发体系生长起来的一个软件生态。Trantor 为其提供从研发到部署运维的全链路管控。其中以资源抽象、逻辑编排等元数据驱动的方式提供高效解耦的定制能力。
部署结构
在 Trantor 的概念中,模型、视图、逻辑等都称为 元信息,Trantor 通过管理这些元信息可以帮助用户省略掉很多繁琐的步骤,专注于应用的业务逻辑开发,达到快速研发的目的。Trantor 1.0 版本后通过用户在线化编辑的方式得到这些元信息。元信息编辑后立即在运行环境生效。
💡Tips:业务域概念详见[Trantor 业务域](../concept/trantor-module.md),下图中每个组件的概念详见Trantor 部署形态

本地环境搭建
开始使用 Trantor 开发之前需要搭建本地环境。
底座环境
Trantor 提供配套的 Command Line 工具可以帮助开发者快速搭建本地环境以供开发和调试。
安装好工具之后我们就可以启动 Trantor 底座了
启动本地环境: (版本号可按需替换)
trantor platform run 1.0
若启动失败详见 FAQ: Trantor 启动失败
(注:目前 0.13 版本的底座没有做 m1 系统的支持)
启动后本地 MySQL 实例就已经存在,访问 mysql 链接信息如下:
| 参数名 | 值 |
|---|---|
| ip | localhost |
| port | 3307 |
| username | root |
| password | password |
REDIS 信息:
| 参数名 | 值 |
|---|---|
| REDIS_PORT | 6380 |
| REDIS_PASSWORD | password |
插件安装
Trantor 提供了 IDEA 配套插件,可以帮助用户快速开发。
在线化定义元信息
环境部署成功后就可以打开交付控制台进行 Trantor 的基础开发了!在进行在线化操作前需要完成以下工作:
(1)请确保你的 Trantor 底座已经 run 起来了
至于 Trantor 是否底座正常运行,可以通过 docker ps 查看所有容器是否正常运行,如下八个服务/中间件 正常运行,代表底座可以正常使用。

(2)前往交付控制台 ( T-Console ) 创建标准产品
本地底座启动的交付控制台地址为 http://trantor.terminus.io:8099

输入资源标识,资源名称,如果资源仓库没有任何资源时,第一次创建请创建标准产品。

如下图,创建成功,进入项目开始对进行对当前项目的基础开发学习吧!

定义 Trantor 业务域
业务域逻辑上是一个 namespace ,用于划分资源作用域,并使资源可以按业务域粒度分发和复用。而当自定义代码需要被部署和调用时,业务域又将成为物理上存在的微服务,以分布式的方式提供服务。(业务域概念详见Trantor 业务域)
Trantor 1.0 开始业务域的定义通过在线化的方式进行定义。定义方式为 进入项目 -> 业务域 -> 新增, 具体操作如下图:

需要维护业务域标识, 业务域名称,包名和描述。
需要注意的是业务域标识的应用前缀在新增时就已经指定了,需要填入的标识必须为小写字母和数字的组合。包名的维护需要符合具体的业务域定义场景以及 maven 包名规则。
如下图,这里以创建 sfa 业务域为例,下图为业务域详细信息,业务域创建成功后就可以进行元信息的定义了。

业务域定义完成后,在当前版本需要先进行业务域的发布,发布后回到交付控制台,进行在线化元信息的定义。
发布前,需要先进行运行环境的增加,否则业务域发布时,选择运行环境的时候,会没有可选择的运行环境。
创建运行环境在 homePage -> 运行环境 -> 点击任意资源 。

- 创建运行环境:
由于目前底座环境启动的 Metastore 服务是启动 8082 端口,所以 metastore url 维护端口为 8082, 访问凭证在发布资源时需要用到。


维护完成后,就可以去发布你的业务域了。
目前的 Trantor 在线过程需要给当前版本绑定运行环境,并将新建的业务域发布到运行环境,成功之后返回到研发中心进入对应的 erp 业务域,进行在线化定义操作。
- 到交付控制台团队主页面,点击当前标准产品 gaia, 点击版本后面的编辑

进行运行环境的绑定。

发布业务域在 homePage -> 发布管理 ->资源发布, 新增发布计划,选择应用版本,选择要发布的业务域,选择运行环境,提交发布计划。

提交完毕后点击执行计划

- 点击
执行计划 -> 确认执行,如下图发布成功。

需要注意的是,base 模块是 metastore 内置模块,不属于任何标准产品,应用,交付物。metastore 启动成功后该模块就会存在,如果不需要用到该模块,则该模块不需要发布。
发布业务域之后,在业务域中做的所有在线化操作都能理解生效,下面请大家一起尝试一下模型的定义和创建吧!
定义模型
从 Trantor 项目发起至今,我们一直在思考一个问题,如何能够让初次接触 Trantor 的开发人员更快速和方便地使用这套技术提供各种功能和特性?
经过内部多次讨论,我们认为首先需要我们自己能够跳出研发者角度,站在新人和使用者的立场上思考,最有效的方式可能还是通过构建一套较为合理的场景和业务需求,通过对场景进行拆解和分析,尽可能形成一个在思路上保持连续性的开发过程,并且按照这个过程逐步引导使用者接触 Trantor 中的特性和能力。
场景模拟
比如,我们打算基于 Trantor 的技术框架上开发一套 SFA 系统。要开发一套系统,我们首先要搞清楚系统内部包含哪些实体,以及实体间关系,sfa 场景思维导图如下:

就拿我们模拟的这套 SFA 系统来举例,系统可能包含客户,线索、商机、报价单这些基础实体信息;下面我们来简单罗列下这些实体的属性:
实体信息
-
客户(CustomerBO)
ID 等基础字段、客户名称
-
线索(ClueBO)
ID 等基础字段、关联客户,线索状态,名称
商机(BizOpportunityBO)
ID 等基础字段、名称,关联客户
-
报价单(PricingBO)
ID 等基础字段、名称、金额、状态
模型定义解释
- 每个线索实体下会关联一个客户,线索状态为字典类型;
- 每个商机实体会关联一个客户;
- 报价单存在金额字段为 Currency 类型, 状态为字典类型
由于 sfa 只是一个简单的 demo 示例场景,所以只使用到了简单的一对一关联关系,在实际的开发过程中可以根据具体需求选择需要的关联关系: 模型关联关系
模型创建
Trantor 1.0 开始所有的模型创建及定义工作都通过在线操作的方式进行,开发者可以不需要线下进行模型定义,直接在线上操作,一定程度上节约开发成本。模型创建前请先确保模型对应的业务域已经创建完成。
模型创建的入口为 进入项目 -> 配置 -> 业务域 -> 进入对应的业务域 进行模型创建, 如下图:

新建模型介绍
点击右上角新建模型,进入新建模型页面,新建模型页面中需要对模型的基础信息、字段配置、分表配置、字段组配置以及索引配置进行在线化编辑。
基本信息

基本信息中需要配置模型名称,模型识别标识,资源描述以及配置信息。其中模型识别标识可以理解为声明的类名,配置信息包括删除策略(默认物理删除),开启快照(默认否),开启搜索(默认否),开启订阅(默认否)四种配置,点击配置信息后面的提示信息会对这四种配置项作简要的解释。
定义完成后点击下一步进行字段配置。
字段配置
点击字段配置后,可以看到新增的业务模型默认继承自 BaseModel, 每个业务模型在增加任何业务字段前都配置了 id, createAt, createBy, updateAt, updateBy 这五个字段,其中 id 为主键。

可以通过添加行进行字段的添加,分别维护字段标识,字段类型,字段名称,是否持久化,可否为空配置项。

是否分表
目前支持按照设置字段进行水平分表,该配置默认为否,即不分表。

后续字段组配置和索引配置开发者可以根据自身业务需求进行配置。配置完成后点击保存。
接下来根据我们在前文所设计的模型实体和模型间的关联关系,可以进行以下模型配置。在创建模型前需要先创建模型用到的字典。进入:制品中心->配置->业务域->字典
字典 1: 线索操作状态
资源标识:OperationStatus
资源名称: 线索操作状态
字典项
-
todo 未处理
-
processing 处理中
-
closed 已关闭
-
transformed 已转化

字典 2:报价单状态
资源标识:PricingStatus
资源名称: 报价单状态
字典项
- unConfirmed 未确认
- confirmed 已确认

模型 1:客户
模型名称:客户
模型识别标识: CustomerBO
字段
| 字段标识 | 字段类型 | 字段名称 |
|---|---|---|
| name | Text | 姓名 |


模型 2:线索
模型名称:线索
模型识别标识: ClueBO
字段
| 字段标识 | 字段类型 | 字段名称 | 关联 |
|---|---|---|---|
| customer | Link | 客户 | 客户(gaia_sfa_CustomerBO) |
| status | Dictionary | 状态 | 线索操作状态(gaia_sfa_OperationStatus) |
| name | Text | 名称 |


模型 3:商机
模型名称:商机
模型识别标识: BizOpportunityBO
字段
| 字段标识 | 字段类型 | 字段名称 | 关联 |
|---|---|---|---|
| name | Text | 名称 | |
| customer | Link | 客户 | 客户(gaia_sfa_CustomerBO) |
模型 4:报价单
模型名称:报价单
模型识别标识: PricingBO
字段
| 字段标识 | 字段类型 | 字段名称 | 关联 |
|---|---|---|---|
| name | Text | 名称 | |
| amount | Currency | 金额 | |
| status | Dictionary | 状态 | 报价单状态(gaia_sfa_PricingStatus) |

我们以同样的方法创建 Company、Department、Equipment、StaffDepartmentRelation 等模型。

创建完成后可以在模型列表中看到所维护的模型,并且可以看到维护好后可以立即生效到运行态。

在当前业务域点击版本详情回到资源仓库主页面,点击部署到 Maven 仓库,会将我们当前业务域的所有元信息 deploy 到当前交付控制台配置的 maven 仓库中,本地底座的 maven 仓库地址如下:

注意需要将本地 maven 仓库地址配置成默认值 ~/.m2/repository, 如果自定义仓库地址则需要修改底座启动配置,不推荐。

部署完成后会弹窗显示开发的模块需要引入的依赖:
<dependency> <groupId>io.terminus.trantor</groupId> <artifactId>gaia_1_trantor</artifactId> <version>1.0-SNAPSHOT</version></dependency>将该依赖引入本地工程 impl 模块中即可使用刚才我们维护好的模型信息, 如下图在本地的 Trantor Demo 工程依赖的 jar 包中可以看到。

模型生成代码解析
Trantor 1.0 将元信息的编辑在线化后,减少了开发者 api 层的代码工作量,也降低了协同开发的成本和风险,以下是模型在线化定义生成的代码分析,帮助大家理解在线化定义模型的生效原理, 大家也可以打开自己本地工程引入的 jar 包进行详细了解(如果没有本地工程则可以使用我们的示例代码先进行学习,下文会有创建工程介绍)。
- CustomerBO
package io.terminus.trantor.sfa.model;
import io.terminus.trantorframework.api.BaseModel;import io.terminus.trantorframework.api.annotation.Model;import io.terminus.trantorframework.api.annotation.IDRule;import io.terminus.trantorframework.api.annotation.DeleteStrategy;import io.terminus.trantorframework.api.annotation.Partition;import io.terminus.trantorframework.api.annotation.ModelConfig;import io.terminus.trantorframework.api.annotation.Snapshot;import lombok.NoArgsConstructor;import lombok.AllArgsConstructor;import io.terminus.trantorframework.api.annotation.Field;import io.terminus.trantorframework.api.annotation.typemeta.TextMeta;
/** * * @author Trantor * @date 2022/01/14 */@Model(name = "客户", mainField = "id", idRule = @IDRule(rule = "AUTO_INCREMENT"), deleteStrategy = DeleteStrategy.Physical, partition = @Partition(enabled = false), config = @ModelConfig(enableSearch = false, enableImport = true, enableExport = true, enableTag = false, enableSubscribe = false), snapshot = @Snapshot(enabled = false), subscribeChangeEvent = false, superClass = false)@NoArgsConstructor@AllArgsConstructorpublic class CustomerBO extends BaseModel<Long> {
@Field(name = "姓名", nullable = true) @TextMeta(length = 100) private String name;
public String getName() { return this.name; } public void setName(String name) { this.name = name; }
}- ClueBO
package io.terminus.trantor.sfa.model;
import io.terminus.trantorframework.api.BaseModel;import io.terminus.trantorframework.api.annotation.Model;import io.terminus.trantorframework.api.annotation.IDRule;import io.terminus.trantorframework.api.annotation.DeleteStrategy;import io.terminus.trantorframework.api.annotation.Partition;import io.terminus.trantorframework.api.annotation.ModelConfig;import io.terminus.trantorframework.api.annotation.Snapshot;import lombok.NoArgsConstructor;import lombok.AllArgsConstructor;import io.terminus.trantor.sfa.model.CustomerBO;import io.terminus.trantorframework.api.annotation.Field;import io.terminus.trantorframework.api.annotation.typemeta.LinkMeta;import io.terminus.trantorframework.api.annotation.typemeta.TextMeta;import io.terminus.trantorframework.api.annotation.typemeta.DictionaryMeta;import io.terminus.trantor.sfa.dict.OperationStatus;
/** * * @author Trantor * @date 2022/01/14 */@Model(name = "线索", mainField = "id", idRule = @IDRule(rule = "AUTO_INCREMENT"), deleteStrategy = DeleteStrategy.Physical, partition = @Partition(enabled = false), config = @ModelConfig(enableSearch = false, enableImport = true, enableExport = true, enableTag = false, enableSubscribe = false), snapshot = @Snapshot(enabled = false), subscribeChangeEvent = false, superClass = false)@NoArgsConstructor@AllArgsConstructorpublic class ClueBO extends BaseModel<Long> {
@Field(name = "客户", nullable = true) @LinkMeta private CustomerBO customer;
@Field(name = "名称", nullable = true) @TextMeta(length = 256) private String name;
@Field(name = "状态", nullable = true) @DictionaryMeta(value = OperationStatus.class) private String status;
public CustomerBO getCustomer() { return this.customer; } public void setCustomer(CustomerBO customer) { this.customer = customer; }
public String getName() { return this.name; } public void setName(String name) { this.name = name; }
public String getStatus() { return this.status; } public void setStatus(String status) { this.status = status; }
}- BizOpportunityBO
package io.terminus.trantor.sfa.model;
import io.terminus.trantorframework.api.BaseModel;import io.terminus.trantorframework.api.annotation.Model;import io.terminus.trantorframework.api.annotation.IDRule;import io.terminus.trantorframework.api.annotation.DeleteStrategy;import io.terminus.trantorframework.api.annotation.Partition;import io.terminus.trantorframework.api.annotation.ModelConfig;import io.terminus.trantorframework.api.annotation.Snapshot;import lombok.NoArgsConstructor;import lombok.AllArgsConstructor;import io.terminus.trantor.sfa.model.CustomerBO;import io.terminus.trantorframework.api.annotation.Field;import io.terminus.trantorframework.api.annotation.typemeta.LinkMeta;import io.terminus.trantorframework.api.annotation.typemeta.TextMeta;
/** * * @author Trantor * @date 2022/01/14 */@Model(name = "商机", mainField = "id", idRule = @IDRule(rule = "AUTO_INCREMENT"), deleteStrategy = DeleteStrategy.Physical, partition = @Partition(enabled = false), config = @ModelConfig(enableSearch = false, enableImport = true, enableExport = true, enableTag = false, enableSubscribe = false), snapshot = @Snapshot(enabled = false), subscribeChangeEvent = false, superClass = false)@NoArgsConstructor@AllArgsConstructorpublic class BizOpportunityBO extends BaseModel<Long> {
@Field(name = "客户", nullable = true) @LinkMeta private CustomerBO customer;
@Field(name = "名称", nullable = true) @TextMeta(length = 256) private String name;
public CustomerBO getCustomer() { return this.customer; } public void setCustomer(CustomerBO customer) { this.customer = customer; }
public String getName() { return this.name; } public void setName(String name) { this.name = name; }
}- PricingBO
package io.terminus.trantor.sfa.model;
import io.terminus.trantorframework.api.BaseModel;import io.terminus.trantorframework.api.annotation.Model;import io.terminus.trantorframework.api.annotation.IDRule;import io.terminus.trantorframework.api.annotation.DeleteStrategy;import io.terminus.trantorframework.api.annotation.Partition;import io.terminus.trantorframework.api.annotation.ModelConfig;import io.terminus.trantorframework.api.annotation.Snapshot;import lombok.NoArgsConstructor;import lombok.AllArgsConstructor;import io.terminus.trantorframework.api.type.Currency;import io.terminus.trantorframework.api.annotation.Field;import io.terminus.trantorframework.api.annotation.typemeta.CurrencyMeta;import io.terminus.trantorframework.api.annotation.typemeta.TextMeta;import io.terminus.trantorframework.api.annotation.typemeta.DictionaryMeta;import io.terminus.trantor.sfa.dict.PricingStatus;
/** * * @author Trantor * @date 2022/01/14 */@Model(name = "报价单", mainField = "id", idRule = @IDRule(rule = "AUTO_INCREMENT"), deleteStrategy = DeleteStrategy.Physical, partition = @Partition(enabled = false), config = @ModelConfig(enableSearch = false, enableImport = true, enableExport = true, enableTag = false, enableSubscribe = false), snapshot = @Snapshot(enabled = false), subscribeChangeEvent = false, superClass = false)@NoArgsConstructor@AllArgsConstructorpublic class PricingBO extends BaseModel<Long> {
@Field(name = "金额", nullable = true) @CurrencyMeta(intDigits = 26, decimalDigits = 6) private Currency amount;
@Field(name = "名称", nullable = true) @TextMeta(length = 256) private String name;
@Field(name = "状态", nullable = true) @DictionaryMeta(value = PricingStatus.class) private String status;
public Currency getAmount() { return this.amount; } public void setAmount(Currency amount) { this.amount = amount; }
public String getName() { return this.name; } public void setName(String name) { this.name = name; }
public String getStatus() { return this.status; } public void setStatus(String status) { this.status = status; }
}创建工程
建议配合 示例代码 一起学习
创建工程和之前版本没有太大区别,使用 Intellij IDEA 菜单创建一个空的 Trantor 项目,并命名为 sfa。Trantor 项目是本质是 Maven Project,所以这里创建一个空的 Maven 项目,我们将使用 Java 8 作为默认的 JDK。
在创建项目的时候我们可以手动创建也可以使用 Trantor 插件创建。(使用插件创建教程具体请看创建 Trantor 模块)
一个简单的 Trantor 应用结构,主要分为
impl、runtime两个maven子模块(与前期版本不同,Trantor1.0 中将 api 进行了在线化处理,api 模块主要放置业务域、模型 、字典、逻辑流 、可编排服务 等可供其他模块依赖的资源,在 Trantor1.0 中开发者可以不用进行 api 的线下定义,直接在线上创建好后, 引入对应的 maven 依赖即可)。impl 模块主要放置逻辑流 、可编排服务 等逻辑实现,因为 Trantor 的业务域本质上来说还是一个 SpringBoot 项目,所以我们还需要添加 application.yml 和 Main Class 放置到我们的 runtime 模块下。
.├── sfa-impl│ ├── sfa-impl.iml│ └── src│ └── main│ ├── java│ │ └── io│ │ └── terminus│ │ └── trantor│ │ └── sfa│ │ ├── ext│ │ └── func│ └── resources│ └── pom.xml├── sfa-runtime│ ├── sfa-runtime.iml│ ├── pom.xml│ └── src│ └── main│ ├── java│ │ └── io│ │ └── terminus│ │ └── trantor│ │ └── sfa│ │ └── Application.java│ └── resources│ └── application.yml├── sfa.iml└── pom.xml- sfa-impl 模块内未来会放置很多资源,视图、逻辑流实现、可编排服务实现等,在该模块内添加插件配置
由于目前 trantor 中的 function 实现还需要通过上报发布的方式做生效处理,所以在此简单地对上报配置及过程进行解释。moduleKey 标签内定义值需要和 api 模块下 trantor.yml 中 module.key 定义一致,否则会上报失败。
<build> <plugins> <plugin> <groupId>io.terminus.trantor</groupId> <artifactId>metadata-maven-plugin</artifactId> <version>0.18.22.RELEASE</version> <configuration> <!-- demo-api 模块 trantor.yml 内声明,保持一致 --> <moduleKey>sfa</moduleKey> <!-- 上报 trantor 元信息地址(即: 研发态 metastore 地址), 格式为: <metastoreAddr>/<tenantKey>/<projectKey> --> <repositoryUrl>http://localhost:8082/terminus/trantor</repositoryUrl> </configuration> <executions> <execution> <goals> <goal>deploy</goal> </goals> </execution> </executions> </plugin> </plugins> </build>其中:
moduleKey 为上报的模块 key。
repositoryUrl为 meta-store-management 请求 url 地址,请求格式为:
<repositoryUrl>http://{remoteMetaStoreURL}/{tenantCode}/{projectCode}</repositoryUrl>includeDepends 为资源一键上报,相当于包含所有依赖模块,一起上报,模块依赖顺序取的是 trantor.yml 中的 dependencies 部分。为了保证原数据安全,includeDepends 仅在本地模式中有效。
remoteMetaStoreURL为交付控制台(console)对应的 meta-store 域名。
tenantCode为需要上报的租户标识。
projectCode为需要上报的项目标识。
- sfa-impl 模块下引入我们刚刚在 maven 仓库 deploy 的元信息定义模块和 trantor-sdk 依赖
<dependencies> <dependency> <groupId>io.terminus.trantor</groupId> <artifactId>gaia_1_trantor</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>io.terminus.trantor</groupId> <artifactId>trantor-sdk</artifactId> </dependency> </dependencies>完成之后就可以直接在 IDEA 终端上(如果使用 示例代码上报的话需要进入工程中 erp 模块下)输入命令,将元信息编译上报到 MetaStore。
mvn clean compile -Dtrantor.deploy=true上报成功后控制台打印信息如下。

此时我们可以在交付控制台 ( T-Console )看到我们刚刚上报的 function 实现。
上报原理:
在终端下执行:
mvn clean compile -Dtrantor.deploy,工程编译时erp-impl子模块pom.xml文件中配置的metadata-maven-plugin插件负责扫描当前项目classpath下声明的 trantor 资源(模型、视图、逻辑资源和其他 Trantor 提供注解声明的资源)。扫描完成后,上报元数据至 trantor metastore 元数据管理中心(发送 HTTP POST 请求), metastore 地址需要在metadata-maven-plugin插件配置中指定,想了解更多插件信息,请访问: Trantor Maven Plugin。
💡Tips: trantor 默认内嵌了 Base 业务域,所以控制台里可以看到属于 Base 的资源。
模型

数据字典

创建模块菜单
为了让这些模型元信息 work 起来,我们需要先创建菜单。创建菜单之前先创建一个模块。
模块:Trantor 中一个安装单位。业务系统中,单一业务身份作业场景的完整功能合集,有独立的菜单、权限体系、组织体系、用户管理体系等。
创建模块


配置菜单
模块创建好之后就可以为其配置菜单了。

点击下图第三步来选择可配置的菜单项。

可以看到我们可以选择的菜单项,每个模型都有自己对应的 List、Form、Detail 视图。这些是 Trantor 为每个上报的模型创建的内建视图。我们为每个模型选择 List 类型的视图作为我们的菜单项。


点击提交

按照上图方式创建剩余菜单

内建视图
Trantor 为每一个持久化模型都动态生成了内建视图。内建视图可以使开发者在系统构建之初就获得完整的交互能力,也可以作为构造测试数据的入口。

发布资源
前边的步骤我们已经创建好模块也配置好模块的菜单,并且维护好了运行环境,只需发布到运行态的 metaStore 就可以在Trantor 统一工作台使用我们模块内的资源啦。


发布模块

提交之后可以看到发布状态还是待确认,点击查看完成确认。

token 默认为 Trantor。

至此完成我们的发布任务。

运行展示
发布成功之后我们就可以到Trantor 统一工作台点击菜单试试每个视图的功能了。
首先我们需要启动我们的 sfa 工程。
(1) 通过 trantor env命令获取需要配置到工程的环境变量。

(2)配置环境变量


配置完成启动工程,启动成功之后我们就可以去Trantor 统一工作台 ( T-Workspace ) 使用我们系统了。
可以看到这些内建视图提供了简单的交互功能(查询、详情、新增、编辑、删除)。这些是 Trantor 为每个上报成功的模型创建的内建逻辑。

内建逻辑
Trantor 为每个上报的模型创建一套围绕该模型简单的 CRUD 的业务逻辑,当你没有特殊的业务逻辑需要时可以直接使用内建逻辑。

查询

新增

修改

删除

总结
本节只演示了最基本的搭建环境、元信息在线化定义、创建模型以及元信息生效过程,通过阅读之后的内容您可以了解更多有关 Trantor 资源的使用。