【JEECG Boot】 JEECG Boot 数据字典管理——六大核心功能(内含:《JEECG Boot 数据字典开发速查清单》)

文章目录

JEECG Boot 数据字典管理------核心功能


JEECG Boot 数据字典管理的核心功能,围绕可视化配置、自动翻译、前端组件化渲染、缓存管控、安全校验、高级扩展 六大核心模块,实现静态业务数据全生命周期统一管控,下面从核心功能定义、完整能力拆解、关键实现机制、功能边界与适用场景四个维度做详细介绍。


一、核心功能总览

JEECG Boot 数据字典核心功能,本质是解决系统内枚举/状态/常量数据的"统一配置、自动翻译、全局复用、动态维护"问题 ,无需硬编码、一处修改全系统生效,覆盖后端翻译、前端渲染、数据安全、缓存优化、多场景扩展全链路。

核心定位:可视化配置中心 + 后端自动翻译引擎 + 前端组件化渲染器 + 缓存与安全管控层

二、六大核心功能

(一)可视化字典配置与管理(后台核心)

这是字典数据的源头管控功能,提供Web可视化界面,无需写SQL/代码即可完成字典全生命周期维护,是所有字典能力的基础。

1. 字典主表管理(sys_dict)
  • 新增/编辑/删除/查询字典:配置字典名称、唯一字典编码(全局调用标识)、描述、租户/低代码应用归属,支持逻辑删除(del_flag=1),不物理删除保障历史数据兼容
  • 字典分类/分组:按业务模块(系统、用户、订单、设备)归类,支持搜索、分页、状态筛选(启用/禁用)
  • 多租户/低代码隔离:通过tenant_id、low_app_id字段,实现不同租户/应用字典数据完全隔离,互不干扰
2. 字典项明细管理(sys_dict_item)
  • 字典项增删改:配置item_value(存储值,如1/2)、item_text(展示文本,如男/女)、排序号、状态(启用/禁用)、颜色标识(用于标签/状态高亮)
  • 批量操作:批量新增、批量导入导出(Excel)、批量启用/禁用、批量排序
  • 字典项校验:同一字典下item_value唯一,避免重复值;禁用项不参与前端渲染与后端翻译
  • 颜色配置:支持为字典项配置颜色(如success/error/warning),用于表格状态列、标签组件高亮展示
3. 字典导入导出(Excel)
  • 导出:自动将字典值翻译为文本,导出完整字典结构(主表+明细),支持按字典编码筛选导出
  • 导入:支持Excel批量导入字典/字典项,自动校验编码唯一性、值合法性,覆盖批量初始化场景

(二)后端自动字典翻译(核心能力,@Dict注解)

这是JEECG Boot 字典最核心的自动化能力 ,通过AOP切面+注解,实现数据库存储值 ↔ 前端展示文本的双向自动转换,彻底消除手动翻译代码。

1. @Dict注解核心翻译功能
  • 普通字典翻译(最常用):标注在实体字段,指定dicCode(字典编码),接口返回时自动生成字段名_dictText翻译字段(如sex → sex_dictText=男)

    java 复制代码
    @Dict(dicCode = "user_status") // 对应字典编码user_status
    private Integer status; // 数据库存1/2/3,返回自动加status_dictText=正常/禁用/锁定
  • 表字典翻译(动态业务字典):无需在字典界面配置,直接关联业务表,指定dictTable(表名)、dicText(展示字段)、dicCode(存储字段),动态从业务表加载数据并翻译

    java 复制代码
    @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
    private String createBy; // 存储用户ID,自动翻译为用户真实姓名createBy_dictText
  • 多数据源/跨库翻译:通过ds参数指定数据源,支持跨库表字典翻译

    java 复制代码
    @Dict(dictTable = "biz_order", dicText = "order_name", dicCode = "order_id", ds = "biz_db")
2. 翻译切面(DictAspect)核心机制
  • 拦截范围:自动拦截Controller返回的Result、IPage、List、实体对象等类型,覆盖所有业务接口
  • 批量查询优化:一次性加载所有待翻译字典,避免N+1查询,大幅提升性能
  • 缓存优先:优先从Redis缓存读取字典数据,不重复查库
  • 自动注入:翻译结果自动注入到返回对象的_dictText扩展字段,前端直接使用,无需额外处理
3. 字典值合法性校验(@DictVerify)

配套校验注解,用于入参/表单数据校验,自动校验提交值是否在字典有效值范围内,拦截非法数据入库:

java 复制代码
@DictVerify(dictCode = "user_status", message = "用户状态值无效,请传入有效值")
private Integer status;

(三)前端字典组件渲染(JDictSelectTag,核心组件)

基于Ant Design Vue封装的专用字典渲染组件,一行代码实现字典下拉/单选/按钮单选,自动加载数据、双向绑定、缓存复用,是前端使用字典的唯一标准组件。

1. 核心渲染能力
  • 多类型渲染:支持3种核心渲染模式(type参数):
    • select:下拉选择框(默认,最常用)
    • radio:单选框组
    • radioButton:按钮式单选
  • 自动数据加载:传入dictCode,组件自动调用/sys/dict/getDictItems/{dictCode}接口加载字典数据,无需手动写请求
  • 双向绑定:v-model:value直接绑定字典item_value,提交时自动传存储值,回显时自动匹配展示文本
  • 基础增强:支持placeholder、禁用、默认"请选择"选项、数值类型自动转换(stringToNumber)、滚动定位(getPopupContainer)
2. 核心用法(覆盖所有场景)
  1. 普通字典(下拉)
vue 复制代码
<JDictSelectTag v-model:value="form.sex" dictCode="sex" placeholder="请选择性别" />
  1. 表字典(动态业务数据)
vue 复制代码
<JDictSelectTag v-model:value="form.userId" dictCode="sys_user,realname,id" placeholder="请选择用户" />
  1. 带过滤的表字典
vue 复制代码
<JDictSelectTag v-model:value="form.userId" dictCode="sys_user,realname,id,sex='2'" placeholder="请选择女性用户" />
  1. 按钮单选/普通单选
vue 复制代码
<JDictSelectTag v-model:value="form.status" dictCode="order_status" type="radioButton" />
<JDictSelectTag v-model:value="form.type" dictCode="pay_type" type="radio" />
3. 配套工具函数(JDictSelectUtil)

提供手动加载、翻译工具,适配表格自定义渲染、非组件场景:

  • initDictOptions(dictCode):手动加载字典数据
  • filterDictText(options, value):手动将字典值翻译为文本(用于表格列渲染)

(四)多层级缓存管控(高性能保障)

针对字典读多写少 特性,设计后端Redis缓存 + 前端本地缓存双层架构,兼顾性能与一致性,是高并发场景的核心保障。

1. 后端Redis缓存(核心)
  • 普通字典缓存:key=sys:dict:cache,字典新增/编辑/删除时主动清空(@CacheEvict),实时一致
  • 表字典缓存:key=sys:table:dict:cache:*,定时过期(默认5分钟),避免业务表变更导致不一致
  • 缓存预热:支持系统启动时预热高频字典,减少首次访问延迟
2. 前端本地缓存
  • 缓存载体:Pinia + localStorage(加密存储)
  • 懒加载:同一dictCode多次使用,仅首次请求接口,后续从缓存读取
  • 缓存刷新:后台修改字典后,自动推送刷新事件,前端清空缓存并重新加载;支持手动点击"刷新缓存"按钮

(五)安全与权限管控(防风险)

1. 字典管理权限
  • 菜单/按钮权限:仅管理员角色可访问字典管理、增删改字典,普通用户仅可读
  • 数据权限:多租户下,仅能管理本租户字典,禁止跨租户操作
2. 表字典安全防护(防SQL注入)
  • 白名单机制:仅允许查询平台配置的白名单表/字段,禁止非法表/字段
  • 过滤条件限制:仅支持简单字段=值格式,禁止子查询、函数、OR/AND复杂语法
  • SQL注入拦截:内置拦截器,自动检测并阻断恶意SQL

(六)高级扩展功能(适配复杂业务)

1. 多级联动字典

支持父子级字典(如省市区、分类-子类),通过字典编码关联,实现一级选择后自动加载二级选项,适配树形/级联选择场景

2. 字典状态联动与颜色高亮

字典项配置颜色后,前端表格/表单可自动渲染为带颜色的标签(如正常=绿色、禁用=红色),提升界面可读性

3. 代码生成器集成

JEECG 代码生成器可自动识别字段并匹配字典,生成实体时自动添加@Dict注解、前端页面自动生成JDictSelectTag组件,零代码完成字典集成

4. 多语言/国际化支持

支持字典项配置多语言文本,根据前端语言环境自动切换展示文本,适配国际化系统

三、核心功能边界与适用场景

✅ 适用场景

  1. 系统通用枚举:性别、状态、类型、开关、订单状态等固定枚举
  2. 动态业务数据:用户、部门、分类、产品等需从业务表动态加载的选项
  3. 表单/表格渲染:所有需要下拉、单选、状态展示的页面
  4. 数据校验:入参/表单值合法性校验
  5. 多租户/跨库:多租户系统、多数据源业务场景

❌ 不适用场景

  1. 海量动态数据(百万级):字典适合静态/低频变更数据,海量数据建议用分页查询
  2. 实时性要求极高(毫秒级):表字典有缓存延迟,不适合强实时场景
  3. 复杂业务逻辑计算:字典仅做数据映射,不承载业务计算

四、核心功能价值总结

  1. 开发效率提升:可视化配置+自动翻译+组件化,减少80%以上枚举相关代码
  2. 维护成本降低:一处修改全系统生效,无需改代码、发版
  3. 数据一致性:统一数据源,避免多地方硬编码导致的不一致
  4. 性能优化:双层缓存,读多写少场景下接口响应毫秒级
  5. 安全可控:权限+防注入,保障字典数据安全

JEECG Boot 数据字典------开发速查清单

适配JEECG Boot 3.x/4.x主流版本,覆盖全流程开发场景,所有代码/参数可直接复制使用,按开发使用逻辑排序,方便快速查阅。

一、核心基础信息速览

1. 核心存储表(开发必知)

表名 核心作用 开发核心字段
sys_dict 字典主表,存储字典元数据 dict_code(全局唯一字典编码,开发核心调用标识)、dict_name(展示名称)、tenant_id(租户隔离)
sys_dict_item 字典从表,存储字典明细选项 item_value(数据库存储值)、item_text(前端展示文本)、sort_order(排序)、status(1启用/0禁用)、dict_id(关联主表)

2. 核心能力链路

后台配置字典 → 实体加@Dict注解 → 接口自动翻译生成xxx_dictText → 前端用JDictSelectTag渲染 → 双层缓存保障性能


二、后端核心注解速查(全参数+可复制示例)

1. @Dict 自动翻译注解(核心)

字典自动翻译的核心载体,标注在实体类字段上,AOP切面自动完成值→文本的翻译,生成字段名_dictText扩展字段。

全参数明细
参数名 类型 必填 适用场景 参数说明
dicCode String 是(普通字典) 系统内置固定字典 对应sys_dict表的唯一字典编码
dictTable String 是(表字典) 动态业务表字典 要关联的业务表名
dicText String 是(表字典) 动态业务表字典 业务表中作为前端展示文本的字段名
dicCode String 是(表字典) 动态业务表字典 业务表中作为数据库存储值的字段名
ds String 多数据源/跨库场景 表字典所在的数据源名称,不填默认主数据源
可直接复制的3大核心场景示例
场景1:普通固定字典(最常用)
java 复制代码
import org.jeecg.common.aspect.annotation.Dict;

/**
 * 用户状态(对应字典编码:user_status)
 * 数据库存储值:1=正常 2=禁用 3=锁定
 * 接口返回自动生成:status_dictText 字段
 */
@Dict(dicCode = "user_status")
private Integer status;
场景2:表字典(动态业务数据,无需后台配置)
java 复制代码
/**
 * 创建人ID,关联用户表,自动翻译为用户真实姓名
 * 格式:dictTable=表名, dicText=展示字段, dicCode=存储字段
 */
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
private String createBy;
场景3:跨数据源表字典
java 复制代码
/**
 * 跨库关联业务订单表,翻译订单名称
 * ds参数指定配置文件中的数据源名称
 */
@Dict(dictTable = "biz_order", dicText = "order_name", dicCode = "order_id", ds = "biz_db")
private String orderId;

2. @DictVerify 入参合法性校验注解

用于表单/接口入参校验,自动校验提交值是否在字典有效值范围内,拦截非法数据入库。

全参数明细
参数名 类型 必填 参数说明
dictCode String 对应sys_dict表的字典编码
message String 校验失败的提示文案,不填使用默认提示
可复制示例
java 复制代码
import org.jeecg.common.aspect.annotation.DictVerify;

/**
 * 校验提交的性别值必须是字典sex中定义的有效值
 */
@DictVerify(dictCode = "sex", message = "性别值无效,请传入字典定义的有效值")
private Integer sex;

三、前端JDictSelectTag组件速查(全参数+可复制示例)

基于Ant Design Vue封装的专用字典渲染组件,一行代码实现字典渲染,是前端使用字典的唯一标准组件。

1. 核心属性全表

属性名 类型 必填 默认值 说明
dictCode String - 核心配置: 1. 普通字典:直接传字典编码(如sex) 2. 表字典:表名,展示字段,存储字段[,过滤条件]
v-model:value String/Number/Array - 双向绑定值,对应字典item_value
type String select 渲染类型,可选:select/radio/radioButton
placeholder String - 输入框占位提示文本
stringToNumber Boolean false 自动将字典value从string转为number,解决数值类型回显失败问题
disabled Boolean false 禁用整个组件
showChooseOption Boolean true 是否显示【请选择】默认空选项
getPopupContainer Function () => document.body 下拉菜单挂载节点,解决滚动遮挡问题

2. 渲染类型说明

类型值 渲染效果 适用场景
select 下拉选择框(默认) 表单常规选择、选项较多的场景
radio 单选框组 选项较少(≤3个)、需要平铺展示的场景
radioButton 按钮式单选框 状态切换、分类筛选等场景

3. 可直接复制的高频场景示例

示例1:普通字典下拉框(最常用)
vue 复制代码
<JDictSelectTag
  v-model:value="form.sex"
  dictCode="sex"
  placeholder="请选择用户性别"
/>
示例2:数值类型回显修复(必用场景)
vue 复制代码
<!-- 数据库字段为int/number类型,编辑页回显失败时添加 -->
<JDictSelectTag
  v-model:value="form.sex"
  dictCode="sex"
  :stringToNumber="true"
  placeholder="请选择用户性别"
/>
示例3:表字典(动态业务数据)
vue 复制代码
<!-- 从用户表获取数据,展示realname,存储id -->
<JDictSelectTag
  v-model:value="form.userId"
  dictCode="sys_user,realname,id"
  placeholder="请选择操作用户"
/>
示例4:带过滤条件的表字典
vue 复制代码
<!-- 只查询状态正常的用户,过滤条件:status=1 -->
<JDictSelectTag
  v-model:value="form.userId"
  dictCode="sys_user,realname,id,status=1"
  placeholder="请选择正常用户"
/>
示例5:单选按钮/按钮式单选
vue 复制代码
<!-- 普通单选框组 -->
<JDictSelectTag
  v-model:value="form.orderStatus"
  dictCode="order_status"
  type="radio"
/>

<!-- 按钮式单选 -->
<JDictSelectTag
  v-model:value="form.auditStatus"
  dictCode="audit_status"
  type="radioButton"
/>

4. 配套工具函数(JDictSelectUtil)

用于非组件场景的字典手动加载、翻译,适配表格自定义渲染、特殊逻辑处理。

函数名 入参 返回值 适用场景
initDictOptions(dictCode) dictCode:字典编码 Promise,返回字典项数组 手动加载字典数据
filterDictText(options, value) options:字典项数组;value:要翻译的存储值 翻译后的展示文本 表格列、自定义场景的字典值手动翻译
表格列翻译示例(可直接复制)
vue 复制代码
<template>
  <a-table :columns="columns" :data-source="tableData" row-key="id" />
</template>

<script setup>
import { ref, onMounted } from 'vue';
import { initDictOptions, filterDictText } from '@/components/dict/JDictSelectUtil';

// 字典数据存储
const sexDictOptions = ref([]);
// 表格数据
const tableData = ref([]);

// 表格列配置
const columns = [
  {
    title: '用户名',
    dataIndex: 'username',
    align: 'center',
    width: 120
  },
  {
    title: '性别',
    dataIndex: 'sex',
    align: 'center',
    width: 80,
    // 手动翻译字典值为文本
    customRender: ({ text }) => filterDictText(sexDictOptions.value, text)
  }
];

// 页面初始化加载字典
onMounted(async () => {
  const res = await initDictOptions('sex');
  sexDictOptions.value = res.success ? res.result : [];
});
</script>

四、核心API接口速查

1. 字典查询类接口

接口地址 请求方式 核心入参 接口说明 适用场景
/sys/dict/getDictItems/{dictCode} GET dictCode:字典编码(路径参数) 根据字典编码获取启用的字典项列表 前端组件自动调用、手动加载普通字典
/sys/dict/queryTableDictItemsByCode GET table:表名;text:展示字段;code:存储字段;filterSql:过滤条件 获取表字典数据 前端表字典组件自动调用、手动加载业务表字典
/sys/dict/list GET dictName、dictCode、status(查询参数) 字典主表分页列表 字典管理页面、自定义字典管理功能

2. 缓存管理类接口

接口地址 请求方式 接口说明 适用场景
/sys/dict/refreshCache DELETE 清空字典全局Redis缓存,触发前端缓存刷新事件 字典修改后不生效、手动刷新缓存

五、开发规范与最佳实践

1. 字典设计规范

  • 编码规范:字典编码使用下划线命名法,语义清晰,如user_statusorder_type,禁止使用拼音、无意义缩写
  • 值规范:字典项值优先使用数字编码(1/2/3),避免使用中文,同一系统内值类型保持统一
  • 生命周期规范:废弃字典项优先禁用,不直接物理删除,避免历史数据翻译失败
  • 分类规范:按业务模块对字典进行分类命名,如sys_开头为系统通用字典,biz_开头为业务字典

2. 性能优化规范

  • 高频使用的字典,在系统启动时做缓存预热,减少首次访问延迟
  • 大批量数据翻译优先使用后端@Dict注解,避免前端循环翻译导致页面卡顿
  • 同一页面多次使用同一字典,优先在页面初始化时一次性加载,避免重复请求
  • 表字典尽量使用简单过滤条件,避免复杂SQL导致的性能问题

3. 安全规范

  • 表字典仅使用简单字段=值过滤条件,禁止拼接子查询、函数、OR/AND等复杂语法,避免SQL注入
  • 敏感业务表禁止作为表字典使用,避免数据泄露
  • 字典管理菜单仅开放给管理员角色,严格控制增删改权限

六、高频问题排查速查表

问题现象 核心根因 一键解决方案
@Dict注解不生效,接口无xxx_dictText字段 1. 实体无getter/setter方法;2. 接口返回类型不在切面拦截范围内;3. 字典编码错误;4. 字典项被禁用 1. 实体添加lombok @Data注解;2. 确认返回类型为Result/IPage/List/实体对象;3. 核对字典编码与后台一致;4. 确认字典项状态为启用
JDictSelectTag组件编辑页数值回显失败 字典item_value为string类型,表单绑定值为number类型,类型不匹配 组件添加:stringToNumber="true"属性
字典修改后,前端仍显示旧数据 前后端缓存未刷新 1. 后台字典管理页点击【刷新缓存】;2. 前端页面手动刷新缓存;3. 确认字典编辑接口添加了@CacheEvict注解
表字典使用时报SQL注入拦截错误 1. 过滤条件使用了复杂SQL语法;2. 表/字段不在白名单内 1. 仅使用字段=值的简单过滤条件;2. 核对表名、字段名是否在平台字典白名单内
同一字典多次使用,重复发起接口请求 前端缓存未生效 1. 确认dictCode拼写完全一致;2. 检查前端Pinia字典缓存是否正常初始化
多租户场景下,租户A能看到租户B的字典 字典查询未加租户隔离条件 1. 确认实体添加了@Tenant注解;2. 核对字典表tenant_id字段是否正确赋值
相关推荐
美式请加冰2 小时前
最短路径问题
java·数据结构·算法
Elastic 中国社区官方博客2 小时前
Elasticsearch:语义搜索,现在默认支持多语言
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
小江的记录本2 小时前
【JEECG Boot】 JEECG Boot——Online表单 系统性知识体系全解
java·前端·spring boot·后端·spring·低代码·mybatis
John_ToDebug2 小时前
Chromium 页面类型与 IPC 通信机制深度解析
前端·c++·chrome
小年糕是糕手2 小时前
【35天从0开始备战蓝桥杯 -- Day9】
数据结构·数据库·c++·算法·蓝桥杯
都说名字长不会被发现2 小时前
Spring 线程池最佳实践:如何优雅管理多线程任务
java·spring·线程池·并发编程
Fanfffff7202 小时前
前端进阶:从请求竞态到并发控制(系统学习笔记)
前端·笔记·学习
大、男人2 小时前
edge浏览器打开baidu.com很慢,我是如何解决的
前端·edge
wok1572 小时前
WebMVC 和 WebFlux 架构选型
java·spring·架构·mvc