跳转到内容

数据字典

字典

代码定义

@Dictionary

全限定名:io.terminus.trantorframework.api.annotation.Dictionary

要声明一个 Trantor 字典资源,我们推荐使用 Java interface 定义字典资源信息,例如:

  • Integer 类型字典
@Dictionary(name = "性别", desc = "性别字典", type = DictType.Int)
public interface SexDict {
/**
* 通过@DictionaryItem注解对每一个类型进行标注,iconColor:字典类型的颜色;icon字典类型的图标
*/
@DictionaryItem(value = "", icon = Icon.dot, iconColor = Icon.Color.Green, displayOrder = 1)
Integer male = 0;
@DictionaryItem(value = "", icon = Icon.dot, iconColor = Icon.Color.Purple, displayOrder = 2)
Integer female = 1;
@DictionaryItem(value = "保密", icon = Icon.dot, iconColor = Icon.Color.Orange, displayOrder = 3)
Integer unknown = 2;
}
  • String 类型字典
@Dictionary(name = "课程枚举", desc = "所有课程枚举")
public interface SubjectDict {
/**
* 通过dictItemGroup属性为字典项进行分组
*/
@DictionaryItem(value = "语文", dictItemGroup = {"arts"})
String Chinese = "Chinese";
@DictionaryItem(value = "数学", dictItemGroup = {"science"})
String Mathematics = "Mathematics";
@DictionaryItem(value = "英语", dictItemGroup = {"arts", "science"})
String English = "English";
}

参数解释:

属性类型必填默认值解释
nameString当前类名字典名称
descString-字典描述
typeEnumDictType.String字典类型,目前 Trantor 支持两中类型:
DictType.String
DictType.Int
userEditableBooleanfalse统一工作台用户是否可编辑,目前该功能不可用

@DictionaryItem

全限定名:io.terminus.trantorframework.api.annotation.DictionaryItem

声明 Trantor 字典类的字段为字典项,当前类必须使用 @Dictionary 声明。

参数解释:

属性类型必填默认值解释
valueString-字典项展示标签名,主要用于在前端显示的标签信息,类似 label。
iconEnumIcon.None展示在标签名前的图标。
更多可选项请参考: io.terminus.trantorframework.api.annotation.typemeta.Icon
iconColorEnumIcon.Color.Black图标颜色。
更多可选项请参考:io.terminus.trantorframework.api.annotation.typemeta.Icon.Color
displayOrderInteger-1字典项的排序值
dictItemGroupArray空数组字典项分组,通过该属性将字典项进行分组,主要用于前端分组过滤和展示。
用法可以查看参考示例

在线化

Trantor 1.0 开始字典编排都在线上完成,打开交付控制台进行创建/编排字典(各开发环境的交付控制台不同,请各位开发同学根据自己实际的开发情况去访问)。

字典编排的入口为 进入项目 -> 配置 -> 业务域 -> 当前App在线化业务域 -> 字典

⚠️ 在线化只能创建字典项类型为 String 类型的字典。dict

扩展字典

扩展字典不是字典,字典扩展只是对原字典进行 修改或者新增 字典项,并不会产生新的字典。

代码定义

@ExtendDictionary

全限定名:io.terminus.trantorframework.api.annotation.ExtendDictionary

扩展字典类上必须标记@ExtendDictionary,且类 必须 继承原字典类或其他扩展字典类。

下面的代码演示了在原字典 CompanyStatus 上新增一个字典项

@ExtendDictionary()
public interface CompanyStatusExtend extends CompanyStatus {
@DictionaryItem(value = "rest")
public final String rest = "rest";
}

在线化

字典扩展的入口为 进入项目 -> 配置 -> 业务域 -> 进入依赖APP/基础项目的在线化业务域 -> 字典 。字典记录点击”扩展” 操作,提交后,实际生成的 “扩展字典”(不是字典),在之前选择的业务域的字典列表里。

具体操作参考下图。

dictextend

💡 交付物可以 “任意修改”(本质上是覆盖)原字典项或其他 “扩展字典” 除了 key 外的其他属性。

image-20220402141442573

在线化创建的 “扩展字典” 生成代码的逻辑:从哪个字典(类)点的扩展,则 java 父类为那个类,举个例子:

1)gaia 新建原字典: key 为 gaia_A,java 类型为 io.terminus.gaia.A

2)gaia-app 从类名为 A,唯一标识为 gaia_A的字典记录,执行扩展, 创建 java 类型为 io.terminus.gaia.app.B的 “扩展字典”,则生成的 B 代码如下

package io.terminus.gaia.app;
import io.terminus.gaia.A;
import io.terminus.trantorframework.api.annotation.ExtendModel;
@ExtendDictionary()
public interface B extends A {
}

3)custom 从类名为 B,唯一标识为 gaia_A的字典记录,执行扩展, 创建 java 类型 为 io.terminus.custom.C的 “扩展字典”,则生成的 C 代码如下

package io.terminus.custom;
import io.terminus.gaia.A;
import io.terminus.gaia.app.B;
import io.terminus.trantorframework.api.annotation.ExtendModel;
@ExtendDictionary()
public interface C extends B {
}

使用

@DictionaryMeta

全限定名:io.terminus.trantorframework.api.annotation.typemeta.DictionaryMeta

主要标识模型 Model 中的某个字段 Field 的类型为字典类型,用于指定当前字段的可选值范围来源于哪个 Trantor 字典资源。

此外,Trantor 支持定义单选字典多选字典,在字典声明上是一样的,区别在于使用字典的模型字段类型是否是集合,示例如下:

  • 单选字典
@Data
@Model(name = "学生模型", mainField = Student.name_field)
public class Student extends BaseModel<Long> {
// 单字典定义
@Field(name = "性别")
@DictionaryMeta(value = SexDict.class)
private Integer sex;
}
  • 多选字典
@Data
@Model(name = "学生模型", mainField = Student.name_field)
public class Student extends BaseModel<Long> {
// 多字典定义,通过 Collection<String> 存储多个字典值
@Field(name = "主修课程")
@DictionaryMeta(value = SubjectDict.class)
private Collection<String> subjects;
}

参数解释:

属性类型必填默认值解释
valueClass<?>-字典值来源类,来源类必须是 Trantor 字典,即使用 @Dictionary 注解声明。