跳转到内容

定制项目模块开发

代码地址:trantor-demo-custom

本文基于 制品项目模块开发,在原模块基础上进行模块二开,由于模块定义,运行和访问机制不变,因此本文仅描述定制下模块二开的资源覆盖定义写法。

用户常见的覆盖资源是行为,视图,因此本文重点会着重讲述这两个资源如何实现覆盖,其他类型的资源覆盖原理与之类似。

Trantor为什么能二开

在trantor下,每个资源都有唯一对应的resourceKey,针对原始模块对应的资源key,只要在二开模块增加相同的资源key,然后使二开的资源key生效,而原模块的资源key失效即可,详情见:Trantor为什么能二开

新建定制项目

定制项目的新建依赖制品一个制品版本,且需要制品版本为稳定版本,因此先设置依赖制品版本为稳定版本(设置为稳定版后,资源不可修改)。

1

模块定义

定义trantor.yml文件

二开模块可以上报到制品项目,也可以上报到定制项目,具体看项目要求。

如果需要上报到定制项目,则模块key需要以项目key开头,如:定制项目key为trantor_custom,则模块名需要以trantor_custom开头,本文示例模块名为:trantor_custom_demo。

trantor.yml 编写详情见:模块定义

!!!注意:每个模块定义的的packageName都应该唯一。

定义application.yml

定义demo-server下的application.yml,将依赖的terminus_trantor_demo加入内嵌模块,内嵌模块详情见:模块->内嵌模块

spring:
profiles:
include: >
trantor
trantor:
# 模型元信息定义类
mainModule: trantor_custom_demo
embedModules: # trantor.yml 中定义的模块 key
- terminus_trantor_demo
enabledModuleKeys: terminus_trantor_demo

定义扩展模型

!!!注意:扩展模型仍使用的是原模型,如下Classes模型,modelKey的仍是terminus_trantor_demo_Classes,不存在ClassesExt模型。

对依赖的terminus_trantor_demo中的Classes模型进行二开,新增一个headTeacherName扩展字段。在发布模块之后,就可以从数据库中看出原先的terminus_trantor_demo__classes表新增了headTeacherName字段。

ClassesExt 扩展模型定义如下:

@Data
@ExtendTModel(Classes.class)
public class ClassesExt extends Classes {
private static final long serialVersionUID = 2L;
@TModelField(name = "二开字段(班主任姓名)")
String headTeacherName;
}

定义扩展字典项

可以使用 @ExtendTDict 注解扩展产品中字典的字典项,如:

@ExtendTDict
public class SexEnumExt extends SexEnum {
@Label("保密")
public static final Integer Secrecy = 2;
}

用户扩展时需要注意:

  • 和扩展模型字段不同,扩展字典项时继承原本的字典类是必须的,只有明确继承才能知道是要扩展哪个字典的字典项。
  • 多个扩展字典类包含同值字典项时,启动会报错。

覆盖视图

如果想覆盖原视图,则需要在view-mainfest.json中定义相同的forModel+key,然后在运行环境中,扩展使覆盖的视图生效。

{
"key": "List",
"name": "班级列表覆盖",
"type": "Form",
"forModel": "terminus_trantor_demo_Classes",
"template": "classes/classes-list-view.xml",
"isDefault": false
}

2

覆盖action

ViewAction覆盖

如果想覆盖原action,则需要在*-actions.json中定义相同的forModel+key,然后在运行环境中,扩展使覆盖的视图生效。

  1. 比如我们需要去覆盖Classes模型的编辑视图,增加二开字段,首先定义视图,使用的依然是terminus_trantor_demo_Classes_toEdit。
{
"key": "toEdit",
"forModel": "terminus_trantor_demo_Classes",
"extra": {
"dataSource": "Empty",
"target": "terminus_trantor_demo_Classes_Edit",
"openViewType": "Self"
}
}

3

ServerAction重写

ServerAction是否重写分两种情况:

  1. 使用原逻辑,对扩展字段不做校验或其他处理的情况下,可依旧使用原ServerAction。
  2. 增加了扩展字段校验或其他处理的情况下,需要使用自定义ServerAction。

2. 配置定制项目应用(制品请忽略)

在创建定制项目时,需要依赖某个制品版本,用户可以通过安装应用/解决方案的形式将制品中的应用/解决方案资源复制到当前定制项目里。

同时,在安装应用/解决方案后,应用/解决方案依赖的模块也会引入到当前定制项目,可以通过模块-》引入模块 查看当前模块的引入。

4