字典
开发文档:字典开发文档
示例代码:字典代码示例
字典是 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 的时候显示 arts 和 science两个分组下的 字典项;当等于 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>资源上报发布
定义好模型、视图等资源后就可以上报发布到运行态,配置模块和相应菜单后也进行模块发布,注意课程模型菜单视图选择我们上面自定义的视图,流程步骤可以查看 快速入门 文档。
效果展示
- 带图标的字典项

- 字典项分组

定义多字典
上述内容介绍了如何定义和使用单字典的场景,同时 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;}效果演示
