文章目录
- [JEECG Boot 数据字典管理------核心功能](#JEECG Boot 数据字典管理——核心功能)
-
- 一、核心功能总览
- 二、六大核心功能
-
- (一)可视化字典配置与管理(后台核心)
-
- [1. 字典主表管理(sys_dict)](#1. 字典主表管理(sys_dict))
- [2. 字典项明细管理(sys_dict_item)](#2. 字典项明细管理(sys_dict_item))
- [3. 字典导入导出(Excel)](#3. 字典导入导出(Excel))
- (二)后端自动字典翻译(核心能力,@Dict注解)
-
- [1. @Dict注解核心翻译功能](#1. @Dict注解核心翻译功能)
- [2. 翻译切面(DictAspect)核心机制](#2. 翻译切面(DictAspect)核心机制)
- [3. 字典值合法性校验(@DictVerify)](#3. 字典值合法性校验(@DictVerify))
- (三)前端字典组件渲染(JDictSelectTag,核心组件)
-
- [1. 核心渲染能力](#1. 核心渲染能力)
- [2. 核心用法(覆盖所有场景)](#2. 核心用法(覆盖所有场景))
- [3. 配套工具函数(JDictSelectUtil)](#3. 配套工具函数(JDictSelectUtil))
- (四)多层级缓存管控(高性能保障)
-
- [1. 后端Redis缓存(核心)](#1. 后端Redis缓存(核心))
- [2. 前端本地缓存](#2. 前端本地缓存)
- (五)安全与权限管控(防风险)
-
- [1. 字典管理权限](#1. 字典管理权限)
- [2. 表字典安全防护(防SQL注入)](#2. 表字典安全防护(防SQL注入))
- (六)高级扩展功能(适配复杂业务)
-
- [1. 多级联动字典](#1. 多级联动字典)
- [2. 字典状态联动与颜色高亮](#2. 字典状态联动与颜色高亮)
- [3. 代码生成器集成](#3. 代码生成器集成)
- [4. 多语言/国际化支持](#4. 多语言/国际化支持)
- 三、核心功能边界与适用场景
-
- [✅ 适用场景](#✅ 适用场景)
- [❌ 不适用场景](#❌ 不适用场景)
- 四、核心功能价值总结
- [JEECG Boot 数据字典------开发速查清单](#JEECG Boot 数据字典——开发速查清单)
-
- 一、核心基础信息速览
-
- [1. 核心存储表(开发必知)](#1. 核心存储表(开发必知))
- [2. 核心能力链路](#2. 核心能力链路)
- 二、后端核心注解速查(全参数+可复制示例)
-
- [1. @Dict 自动翻译注解(核心)](#1. @Dict 自动翻译注解(核心))
- [2. @DictVerify 入参合法性校验注解](#2. @DictVerify 入参合法性校验注解)
- 三、前端JDictSelectTag组件速查(全参数+可复制示例)
-
- [1. 核心属性全表](#1. 核心属性全表)
- [2. 渲染类型说明](#2. 渲染类型说明)
- [3. 可直接复制的高频场景示例](#3. 可直接复制的高频场景示例)
- [4. 配套工具函数(JDictSelectUtil)](#4. 配套工具函数(JDictSelectUtil))
- 四、核心API接口速查
-
- [1. 字典查询类接口](#1. 字典查询类接口)
- [2. 缓存管理类接口](#2. 缓存管理类接口)
- 五、开发规范与最佳实践
-
- [1. 字典设计规范](#1. 字典设计规范)
- [2. 性能优化规范](#2. 性能优化规范)
- [3. 安全规范](#3. 安全规范)
- 六、高频问题排查速查表
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. 核心用法(覆盖所有场景)
- 普通字典(下拉)
vue
<JDictSelectTag v-model:value="form.sex" dictCode="sex" placeholder="请选择性别" />
- 表字典(动态业务数据)
vue
<JDictSelectTag v-model:value="form.userId" dictCode="sys_user,realname,id" placeholder="请选择用户" />
- 带过滤的表字典
vue
<JDictSelectTag v-model:value="form.userId" dictCode="sys_user,realname,id,sex='2'" placeholder="请选择女性用户" />
- 按钮单选/普通单选
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. 多语言/国际化支持
支持字典项配置多语言文本,根据前端语言环境自动切换展示文本,适配国际化系统
三、核心功能边界与适用场景
✅ 适用场景
- 系统通用枚举:性别、状态、类型、开关、订单状态等固定枚举
- 动态业务数据:用户、部门、分类、产品等需从业务表动态加载的选项
- 表单/表格渲染:所有需要下拉、单选、状态展示的页面
- 数据校验:入参/表单值合法性校验
- 多租户/跨库:多租户系统、多数据源业务场景
❌ 不适用场景
- 海量动态数据(百万级):字典适合静态/低频变更数据,海量数据建议用分页查询
- 实时性要求极高(毫秒级):表字典有缓存延迟,不适合强实时场景
- 复杂业务逻辑计算:字典仅做数据映射,不承载业务计算
四、核心功能价值总结
- 开发效率提升:可视化配置+自动翻译+组件化,减少80%以上枚举相关代码
- 维护成本降低:一处修改全系统生效,无需改代码、发版
- 数据一致性:统一数据源,避免多地方硬编码导致的不一致
- 性能优化:双层缓存,读多写少场景下接口响应毫秒级
- 安全可控:权限+防注入,保障字典数据安全
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_status、order_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字段是否正确赋值 |