跳转到内容

字典

开发文档:字典开发文档

示例代码:字典代码示例

字典是 Trantor 定义的枚举类的静态资源。如,国家字典,包含中国、美国、英国等枚举字典项。这类资源用以在模型构建时,维护枚举类字段,从而体现在业务中,用以做业务内容识别和代码逻辑判断。开发者用户可以在控制台进行字典及字典中的枚举项维护,或者在线下模块中声明字典资源,在模型字段创建时声明使用的字典。

定义字典

一个普通的 Java interface 通过 @Dictionary 注解即声明成为 Trantor 的字典资源。通过 @DictionaryItem 注解描述接口属性就是该字典具备的字典项。因为业务需求,难免会需要 String 类型或者 Integer 类型的字典值,所以 Trantor 也提供了两种类型的字典类型。

作为 Trantor 模块下资源,我们推荐将其定义在 api 模块dict 包中。参考开发指南-业务域中的包结构

  • Integer 类型字典
/**
* @author ymf
* 通过 @Dictionary 注解来标明这是一个字典类,name 标签标明字典类的名称
* 通过继承 ItemDisplaySortRule 接口来排序(前端视图下拉框展示的顺序)
* 字典类型为Integer
*/
@Dictionary(name = "性别", desc = "性别枚举", type = DictType.Int)
public interface SexDict extends ItemDisplaySortRule {
/**
* 通过@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 extends ItemDisplaySortRule {
/**
* 通过 dictItemGroup 属性为字典项进行分组
*/
@DictionaryItem(value = "语文", dictItemGroup = {"arts"})
String Chinese = "Chinese";
@DictionaryItem(value = "数学", dictItemGroup = {"science"})
String Mathematics = "Mathematics";
@DictionaryItem(value = "英语", dictItemGroup = {"arts", "science"})
String English = "English";
}

参数解释

请参考字典开发文档

字典项分组

在日常业务中会经常出现枚举值分类的需求,已上面的课程为例,可以分为文科理科 两类。那这个时候我们通过@DictionaryItem 注解中的 dictItemGroup 属性进行提前标记,然后在视图中使用。

<Field name="type"/>
<Field name="name">
<RenderType>
<Select allowGroups="#{(!this.data.type || this.data.type === 'all') ? ['arts', 'science'] : this.data.type === 'arts' ? ['arts'] : ['science']}"/>
</RenderType>
</Field>

我们可以看到上面视图代码中以 type 字段的值作为条件,当等于 undefined 或者 all 的时候显示 artsscience两个分组下的 字典项;当等于 arts 时显示 arts 分组下的字典项;当等于 science 时显示 science 分组下的字典项。

allowGroups参数接受的是一个 字符串数组

定义模型

我们定义一个 学生 模型,在模型内定义一个字典类型字段性别·。

@Data
@Model(
name = "学生模型",
mainField = Student.name_field
)
public class Student extends BaseModel<Long> {
@Field(name = "姓名", nullable = false)
@NotNull(message = "姓名不可为空")
private String name;
@Field(name = "性别")
@DictionaryMeta(value = SexDict.class)
private Integer sex;
}

此外,我们再定义一个 课程 模型,用于演示字典项分组的效果。

@Data
@Model(name = "科目")
public class Subject extends BaseModel<Long> {
// 我们直接在这里定义一个枚举,也可以在外面单独定义,效果是一样的
public enum Type {
@Label("所有")
all,
@Label("文科")
arts,
@Label("理科")
science,
}
@Field(name = "课程类别")
private Subject.Type type;
@Field(name = "科目名称", nullable = false)
@DictionaryMeta(value = SubjectDict.class)
private String name;
}

定义视图

学生模型的视图我们使用内建视图就可以了,但是要演示字典项分组的效果,对于课程模型的视图要自定义,我们定义两个视图,课程列表视图和创建课程的表单视图。

列表视图实现在搜索条件上实现分组过滤,如下:

<?xml version="1.0" encoding="UTF-8"?>
<View menuView="true" type="List" forModel="example_dict_Subject" title="课程列表" version="2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://trantor-docs-dev.app.terminus.io/static/v0.16.x/schema/base.xsd">
<Table key="table" model="example_dict_Subject" dataCondition="">
<Search>
<Fields>
<Field name="type"/>
<Field name="name">
<RenderType>
<!--字典在 Table Search 中的交互表现是多选方式,取值是数组-->
<Select allowGroups="#{(!this.searchData.type || this.searchData.type.includes('all')) ? ['arts', 'science'] : this.searchData.type}"/>
</RenderType>
</Field>
</Fields>
</Search>
<RecordActions label="操作">
<Action label="详细" openViewType="Dialog" targetView="example_dict_Subject_subjectDetail"/>
<Action label="编辑" openViewType="Dialog" targetView="example_dict_Subject_subjectEdit"/>
<Action label="删除" after="Refresh" confirm="确定要删除?" logicFunction="example_dict_DeleteSubjectBuiltInFunc"/>
</RecordActions>
<Fields>
<Field name="type"/>
<Field name="name"/>
</Fields>
<Actions>
<Action label="创建" openViewType="Dialog" targetView="example_dict_Subject_subjectEdit"/>
</Actions>
</Table>
</View>

创建课程的表单视图实现在表单字段填写时实现分组过滤,如下:

<?xml version="1.0" encoding="UTF-8"?>
<View title="课程信息" forModel="example_dict_Subject" type="Form" version="2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://trantor-docs-dev.app.terminus.io/static/v0.16.x/schema/base.xsd">
<Form model="example_dict_Subject" dataCondition="id = ?" dataParams="[pageContext.record.id]">
<Fields>
<Field name="type"/>
<Field name="name">
<RenderType>
<!--表单视图单字典为单选,取值结果为字符串-->
<Select allowGroups="#{(!this.data.type || this.data.type === 'all') ? ['arts', 'science'] : this.data.type === 'arts' ? ['arts'] : ['science']}"/>
</RenderType>
</Field>
</Fields>
<Actions>
<Action type="Submit" show="#{!this.data.id}" logicFunction="example_dict_CreateSubjectBuiltInFunc" after="GoBack" layout="Footer"/>
<Action type="Submit" show="#{!!this.data.id}" logicFunction="example_dict_UpdateSubjectBuiltInFunc" after="GoBack" layout="Footer"/>
</Actions>
</Form>
</View>

资源上报发布

定义好模型、视图等资源后就可以上报发布到运行态,配置模块和相应菜单后也进行模块发布,注意课程模型菜单视图选择我们上面自定义的视图,流程步骤可以查看 快速入门 文档。

效果展示

  • 带图标的字典项

dict-demo

  • 字典项分组

dict-group

定义多字典

上述内容介绍了如何定义和使用单字典的场景,同时 Trantor 也支持声明和使用多字典,我们接着上述的案例,在 学生 模型增加多字典的使用,比如 课程 字段,如下。

@Data
@Model(
name = "学生模型",
mainField = Student.name_field
)
public class Student extends BaseModel<Long> {
@Field(name = "姓名", nullable = false)
@NotNull(message = "姓名不可为空")
private String name;
@Field(name = "性别")
@DictionaryMeta(value = SexDict.class)
private Integer sex;
@Field(name = "主修课程")
@DictionaryMeta(value = SubjectDict.class)
private Collection<String> subjects;
}

效果演示

multi-dict-demo