数据字典(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 删除字典项

七、常见操作流程示例

场景:需要新建一个"发票类型"下拉选项供销售模块使用

  1. 进入 数据字典分类 页面,新建分类(如:"财务")
  2. 进入 数据字典 主页面,点击"新增",编号填 INVOICE_TYPE,名称填"发票类型",分类选"财务"
  3. 点击该字典行的"字典管理"按钮,依次新增字典项:
    • 编号 VAT_SPECIAL,名称"增值税专用发票",排序 1
    • 编号 VAT_NORMAL,名称"增值税普通发票",排序 2
    • 编号 ELECTRONIC,名称"电子发票",排序 3
  4. 在销售模块中调用 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 组合键)