数据字典

前言

枚举类字典 对应的是系统管理->数据字典模块,主要有两种类型的字典

  • Java枚举类字典
  • 后台管理的数据字典

都采用了label和value的结构,使用的是同一个字典接口,但它们在实际应用中有着不同的用途和特性。

枚举类字典

  • 定义:Java枚举类字典通常是在Java代码中定义的一种数据结构,用于表示一组固定的常量值,并为每个常量值提供一个描述性的标签(label)。
  • 用途:Java枚举类字典主要用于在代码中定义和管理一组固定的选项或状态,例如订单状态(待支付、已支付、已发货等)。
  • 特点:
    • 枚举类中的每个枚举项都是唯一的,且数量固定。
    • 枚举类通常提供了一些方法来获取枚举项的label和value。
    • 枚举类字典通常与代码紧密耦合,用于定义代码中的逻辑和状态。
  • 样例
package com.mldong.modules.sys.enums;


import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.mldong.annotation.DictEnum;
import com.mldong.base.CodedEnum;

/**
 * @author mldong
 * @date 2022/9/7
 */
@DictEnum(key="sys_role_role_type",name="角色类型")
public enum RoleTypeEnum implements CodedEnum {
    COMMON_ROLE(1,"普通角色"),
    DATA_ROLE(2,"数据角色"),
    WORKFLOW_ROLE(3, "工作流")
    ;
    private Integer code;
    private String message;
    @JsonCreator
    public static RoleTypeEnum forValue(Object value) {
        return CodedEnum.codeOf(RoleTypeEnum.class, value).get();
    }
    RoleTypeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
    @JsonValue
    @Override
    public Integer getCode() {
        return this.code;
    }

    @Override
    public String getMessage() {
        return this.message;
    }
}

这段代码定义了一个名为 RoleTypeEnum 的Java枚举,用于表示角色类型。以下是代码的主要部分的解读:

  1. 枚举定义:
    • RoleTypeEnum 是一个枚举,它实现了 CodedEnum 接口。
    • 它有三个枚举项:COMMON_ROLE, DATA_ROLE, 和 WORKFLOW_ROLE,每个都有对应的整数 code 和描述性字符串 message。
  2. 注解:
  • @DictEnum 是一个自定义注解,用于标记特定的枚举类,使其具有特殊的系统行为。具体来说,这个注解允许系统执行以下操作:
    1. 自动扫描:带有 @DictEnum 注解的枚举类会被系统自动扫描到。这意味着在程序启动或某个初始化阶段,系统会查找所有使用了 @DictEnum 注解的枚举类,并将它们注册到某个地方,以便后续使用。
    2. 数据字典展示:系统会在“系统管理->数据字典->枚举字典”这样的界面上展示这些枚举类及其项。这对于管理员或开发者来说是一个便利的功能,因为他们可以直观地看到所有的枚举项和它们的值。
    3. 通过关键字调用字典接口:通过 key 属性(在这里是 sys_role_role_type),系统提供了一个接口,允许外部系统或内部组件通过这个关键字来获取枚举项的列表。这对于动态生成表单选项、API参数校验或其他需要枚举值的场景非常有用。
  • @DictEnum 注解在系统中起到了一个桥梁的作用,它将枚举类与系统的数据字典功能连接起来,使得枚举值能够被方便地管理和使用。
  • 在实际应用中,这样的注解和配套的系统功能可以极大地提高开发效率和系统可维护性。开发者只需要在枚举类上添加一个简单的注解,就可以享受到数据字典带来的各种便利,而无需编写额外的代码来处理枚举值的存储、查询和展示。

后台管理的数据字典

  • 定义:后台管理的数据字典是在数据库中定义的一组label和value的对应关系,用于管理系统的各种数据项和选项。
  • 用途:后台管理的数据字典主要用于支持系统的动态配置和扩展性,允许管理员在后台管理系统中添加、修改或删除数据项和选项。
  • 特点:
    • 数据字典中的label和value对应关系是动态可配置的,可以根据业务需求进行扩展或修改。
    • 数据字典与数据库相关联,可以在不修改代码的情况下进行更新。
    • 数据字典可以用于前端界面展示、后端逻辑处理等多个方面,为系统提供统一的数据管理和配置机制。

区别总结:

  • 定义和用途:Java枚举类字典主要用于Java代码中定义和管理一组固定的常量值;而后台管理的数据字典则主要用于支持系统的动态配置和扩展性。
  • 动态性:Java枚举类字典是静态的,与代码紧密耦合;后台管理的数据字典是动态的,可以根据业务需求进行配置和修改。
  • 管理和维护:Java枚举类字典通常通过修改代码来管理和维护;后台管理的数据字典则可以通过后台管理系统进行管理和维护,无需修改代码。

在实际应用中,可以根据具体需求选择使用Java枚举类字典还是后台管理的数据字典。如果是一组固定的常量值,且不需要频繁修改,可以使用Java枚举类字典;如果需要支持动态配置和扩展性,可以考虑使用后台管理的数据字典。

关于枚举解析处理类

mldong-framework/mldong-base/src/main/java/com/mldong/dict/DictScanner.java

关于字典接口

  • 接口地址:/sys/dict/getByDictType
  • 请求方式:POST
  • 入参样例:
{
  "dictType": "sys_role_role_type"
}
  • 响应样例:
{
    "code": 0,
    "msg": "成功",
    "data": [
        {
            "value": 1,
            "label": "普通角色"
        },
        {
            "value": 2,
            "label": "数据角色"
        },
        {
            "value": 3,
            "label": "工作流"
        }
    ]
}

另一种特殊的字典CustomDictService

CustomDictService接口代表了一种自定义字典服务的抽象,它旨在提供一个统一的接口来访问那些不是通过静态枚举或数据库查询获得的动态字典数据。这些动态字典数据可能依赖于文件系统、类加载器或其他运行时环境的特定逻辑。通过实现这个接口,业务模块可以灵活地处理各种动态字典数据,同时保持与其他组件或系统的交互方式的一致性。

具体来说,getByDictKey方法接受一个Map<String, Object>类型的参数args,并返回一个DictModel对象。这个args参数可能包含用于检索字典数据的各种参数,例如文件夹路径、类名前缀等。DictModel则是一个包含字典项信息的模型类,如键值对、描述等。 实现这个接口时,业务模块将需要根据具体需求编写逻辑来处理这些参数,并返回相应的字典数据。例如,如果args中包含一个文件夹路径,那么实现类可能需要遍历该路径下的所有文件夹,并将这些文件夹的名称和相关信息作为字典项返回。

这样的设计使得业务模块能够灵活应对各种动态字典数据的需求,同时也保持了API的一致性。其他组件或系统只需要通过调用CustomDictService接口的getByDictKey方法,并传入适当的参数,就可以获取所需的字典数据,而无需关心数据是如何获取的。

CustomDictService实现样例

目前系统实现该接口的地方有点少,只有工作流有个地方用到了,大家可以自行查看

mldong-core/mldong-wf-core/src/main/java/com/mldong/modules/wf/flow/handlers/AssignmentHandlerScanner.java