数据字典(Data Dictionary)使用手册
一、概述
数据字典是系统的基础数据管理模块,采用三层结构:分类 → 字典 → 字典项。它用于统一管理系统中的枚举值、下拉选项、状态码等结构化常量数据,方便其他业务模块通过统一的 API 获取选项列表。
二、三层数据模型
分类 (Category) ──1:N──> 字典 (Dictionary) ──1:N──> 字典项 (Item)
| 层级 | 说明 | 示例 |
|---|---|---|
| 分类 | 对字典进行分组归类 | "订单相关"、"财务相关" |
| 字典 | 定义一个枚举字段 | "订单状态"、"支付方式" |
| 字典项 | 字典的具体可选值 | PENDING=待处理、DONE=已完成 |
数据库表结构
| 表名 | 对应实体 | 说明 |
|---|---|---|
sys_data_dic_category |
分类 | id, code, name |
sys_data_dic |
字典 | id, code, name, categoryId |
sys_data_dic_item |
字典项 | id, code, name, dicId, orderNo |
实体关系
SysDataDicCategory (1) ──< (N) SysDataDic
- 删除分类时,如果其下存在字典,则不允许删除
SysDataDic (1) ──< (N) SysDataDicItem
- 删除字典时,会级联删除其下所有字典项
- 字典项必须属于一个字典(dicId 必填)
- 字典项按 orderNo 升序排列
三、功能页面
系统提供三个管理页面,路径均为 /:lang/dashboard/sys/ 下:
3.1 数据字典主页面 (/sys/data-dic)
布局:左侧分类树 + 右侧字典表格的分栏设计。
| 操作 | 说明 |
|---|---|
| 左侧分类树 | 点击分类节点可按分类过滤右侧字典列表;右键显示菜单,可新增/编辑/删除分类 |
| 查询 | 输入编号或名称,点击查询按钮 |
| 重置 | 清空所有查询条件,恢复默认 |
| 新增字典 | 打开弹窗,填写编号、名称、所属分类(选填) |
| 修改字典 | 点击行内"修改"按钮 |
| 删除字典 | 点击行内"删除"按钮。⚠️ 会级联删除该字典下所有字典项,请谨慎操作 |
| 字典管理 | 点击行内"字典管理"按钮,打开字典项管理弹窗(见 3.2) |
| 列设置 | 表格右上角齿轮图标,可自定义表格列的显示/隐藏和顺序 |
字典编号规则:只能包含大写字母、小写字母、数字或 ._-(正则:/^[A-Za-z0-9.\-_]+$/)。
3.2 字典项管理(在字典管理弹窗中操作)
从数据字典表格中点击某行的"字典管理"按钮打开:
| 操作 | 说明 |
|---|---|
| 查询 | 在弹窗内按编号或名称搜索字典项 |
| 新增字典项 | 填写编号、名称、排序号(默认为 1) |
| 修改字典项 | 点击行内"修改"按钮 |
| 删除字典项 | 点击行内"删除"按钮 |
| 排序 | 字典项按 orderNo 升序排列,数字越小越靠前 |
3.3 字典分类页面 (/sys/data-dic-category)
独立管理字典分类的页面,以全表格形式展示。支持新增、编辑、删除分类。
3.4 字典项页面 (/sys/data-dic-item)
独立的字典项列表页面,需要指定 dicId 参数来筛选某个字典下的所有项。
四、如何在其他模块中使用数据字典
4.1 API 接口
前端通过 getSysDataDicItemByCodeApi 获取字典项列表:
import { getSysDataDicItemByCodeApi } from '~/api/sys/sysDataDicItem';
// 根据字典编号获取所有字典项
const items = await getSysDataDicItemByCodeApi('ORDER_STATUS');
// 返回: [{ id: 'ORDER_STATUS@PENDING', code: 'PENDING', name: '待处理' }, ...]
对应的后端接口:GET /system/dic/item/bydic?code={字典编号}
- 无需权限,所有模块可直接调用
- 返回的
id是组合键格式:字典编号@字典项编号(用@分隔) - 结果按
orderNo升序排列 - 带缓存(基于租户 ID + 字典编号)
4.2 典型使用场景
// 在表单中渲染下拉选项
<Select>
{(items || []).map(item => (
<Select.Option key={item.code} value={item.code}>{item.name}</Select.Option>
))}
</Select>
4.3 选择器接口
系统还提供了通用的选择器接口供下拉框组件使用:
| 接口 | 说明 |
|---|---|
GET /selector/dic/category |
分页查询字典分类 |
POST /selector/dic/category/load |
按 ID 批量加载分类 |
GET /selector/dic |
分页查询字典 |
POST /selector/dic/load |
按 ID 批量加载字典 |
五、重要规则与约束
| 规则 | 说明 |
|---|---|
| 编号唯一性 | 同一租户下,字典编号全局唯一,字典项编号在所属字典内唯一 |
| 分类删除限制 | 如果分类下存在字典,则不允许删除该分类,系统会提示"此分类下存在数据字典,无法删除!" |
| 字典删除级联 | 删除字典会同时删除该字典下所有字典项 |
| 分类可选 | 字典可以不归属于任何分类(categoryId 可为空) |
| 多租户隔离 | 所有数据按 tenantId 隔离,不同租户的数据完全独立 |
| 缓存机制 | 字典项查询结果会被缓存,增删改操作会自动清除对应缓存 |
| 编号不可修改 | 编辑模式下,编号字段为禁用状态,只能修改名称 |
六、权限控制
| 权限码 | 对应操作 |
|---|---|
system:dic-category:* |
查询分类 |
system:dic-category:add |
新增分类 |
system:dic-category:modify |
修改分类 |
system:dic-category:delete |
删除分类 |
system:dic:* |
查询字典 |
system:dic:add |
新增字典 |
system:dic:modify |
修改字典 |
system:dic:delete |
删除字典 |
system:dic-item:* |
查询字典项 |
system:dic-item:add |
新增字典项 |
system:dic-item:modify |
修改字典项 |
system:dic-item:delete |
删除字典项 |
七、常见操作流程示例
场景:需要新建一个"发票类型"下拉选项供销售模块使用
- 进入 数据字典分类 页面,新建分类(如:"财务")
- 进入 数据字典 主页面,点击"新增",编号填
INVOICE_TYPE,名称填"发票类型",分类选"财务" - 点击该字典行的"字典管理"按钮,依次新增字典项:
- 编号
VAT_SPECIAL,名称"增值税专用发票",排序 1 - 编号
VAT_NORMAL,名称"增值税普通发票",排序 2 - 编号
ELECTRONIC,名称"电子发票",排序 3
- 编号
- 在销售模块中调用
getSysDataDicItemByCodeApi('INVOICE_TYPE')即可获取全部选项
八、前端文件清单
| 文件路径 | 说明 |
|---|---|
app/views/sys/dataDic.tsx |
数据字典主页面 |
app/views/sys/dataDicCategory.tsx |
分类管理页面 |
app/views/sys/dataDicItem.tsx |
字典项管理页面 |
app/views/sys/dataDic/CategoryTree.tsx |
分类树组件(可复用) |
app/views/sys/dataDic/CategoryFormModal.tsx |
分类表单弹窗组件 |
app/api/sys/sysDataDic.ts |
字典 API |
app/api/sys/sysDataDicCategory.ts |
分类 API |
app/api/sys/sysDataDicItem.ts |
字典项 API |
app/api/sys/model/sysDataDicModel.ts |
字典类型定义 |
app/api/sys/model/sysDataDicCategoryModel.ts |
分类类型定义 |
app/api/sys/model/sysDataDicItemModel.ts |
字典项类型定义 |
九、后端文件清单
| 文件路径 | 说明 |
|---|---|
controller/system/SysDataDicController.java |
字典接口 (/system/dic) |
controller/system/SysDataDicCategoryController.java |
分类接口 (/system/dic/category) |
controller/system/SysDataDicItemController.java |
字典项接口 (/system/dic/item) |
service/impl/SysDataDicServiceImpl.java |
字典业务逻辑 |
service/impl/SysDataDicCategoryServiceImpl.java |
分类业务逻辑 |
service/impl/SysDataDicItemServiceImpl.java |
字典项业务逻辑 |
entity/SysDataDic.java |
字典实体 |
entity/SysDataDicCategory.java |
分类实体 |
entity/SysDataDicItem.java |
字典项实体 |
bo/SysDataDicItemBo.java |
字典项 BO(消费者侧,id 为 dicCode@itemCode 组合键) |