第十二章. 系统管理(六):字典管理(解耦数据与显示的“活字典”)

第十二章. 系统管理(六):字典管理(解耦数据与显示的“活字典”)

摘要:本章我们将学习一个在二次开发中“幸福感”极高的模块——字典管理。我们将深入探讨它设计的“灵魂”:为什么我们要用 0 代表“男”,而不是直接存“男”字?理解这一点,将帮助我们在开发中写出更灵活、更易维护的代码。


本章学习路径

我们将从“为什么需要字典”这个核心问题出发,逐步掌握其使用:

字典管理


12.1. [核心] 为什么不存“男”/“女”,而要存 0/1

在我们开始“点点点”之前,我们必须先停下来,思考一个贯穿本章的 核心问题

“为什么系统要这么麻烦?数据库里存个 0,显示时却要变成‘男’。我直接在数据库 user 表的 sex 字段存‘男’、‘女’两个汉字,不是更直观吗?”

这是一个非常好的问题。如果你能想通这一点,就掌握了字典管理 80% 的精髓。

12.1.1. “硬编码”的灾难(Bad Practice)

我们假设真的这么做了:在 user 表的 sex 字段中存储了 。某天,产品经理来了个新需求:“‘男’和‘女’太生硬了,我们改成‘先生’和‘女士’。”

你怎么办?

  1. 修改数据库:你必须写一条 SQL 语句:UPDATE user SET sex = '先生' WHERE sex = '男'。你得在 所有 存储了“男”字的表里都执行一遍。如果这个字段被 50 个表引用了呢?
  2. 修改代码:你的代码里可能写了 if (user.getSex().equals("男")) { ... }。现在你必须全局搜索,把所有 "男" 都改成 "先生"

这就是“硬编码”的灾难。你的数据()和你的业务(判断性别)被 紧紧地耦合 在了一起。

12.1.2. 字典的“解耦”之道(Good Practice)

现在,我们看看 RVP 的“字典”是怎么做的:

  1. 数据库user 表的 sex 字段存储 01
  2. 字典表:我们有另一张“字典数据”表,里面写着映射关系:
    • 0 = 男
    • 1 = 女
  3. 前端显示:前端从后端拿到 0,然后自动去“字典”里一查,哦,0 对应的是“男”,于是显示“男”。

现在,产品经理又来了:“把‘男’改成‘先生’。”

你怎么办?你 只需要 登录后台的“字典管理”,找到“用户性别”字典,把“男”那条数据的“字典标签”修改为“先生”,保存。

完成了。

  • 数据库的 0 需要动吗?不需要。
  • 代码里的 if (user.getSex() == 0) { ... } 需要动吗?不需要。

你只改了一个配置项,就完成了需求。数据和显示被完美地“解耦”了。

12.1.3. 开发者思维:编码的“稳定性”与“灵活性”

我们存储到数据库的 01,就是“字典键值 (Value)”——它必须是 稳定不变 的。我们显示给用户看的 先生,就是“字典标签 (Label)”——它必须是 灵活可变 的。

字典管理,就是用来维护 ValueLabel 之间映射关系的工具。这就是它的灵魂。


12.2. [重点] “字典类型”与“字典数据”的“皮”与“馅”

理解了“为什么”,我们再来看“是什么”。

RVP 的字典管理由两张表构成,构成了一个“主从”关系,我们用一个“皮”和“馅”的比喻来理解。

12.2.1. sys_dict_type(字典类型):字典的“分类”(皮)

我们现在看到的列表,是 sys_dict_type 表,即“字典类型”。

这就像是“包子铺”的菜单,它告诉你我们有“用户性别”、“菜单状态”、“系统开关”这几种“包子”(字典)。

  • 字典名称(如 用户性别):给人看的,方便理解。
  • 字典类型(如 sys_user_sex):给程序看的“唯一标识符”。我们在代码中就是靠这个 sys_user_sex 来获取它下面的所有数据的。

12.2.2. sys_dict_data(字典数据):字典的“条目”(馅)

这个“用户性别”包子里,到底是什么“馅”呢?

我们点击 sys_user_sex 这行数据中蓝色的“字典类型”链接,系统会“钻”进去,带我们来到 sys_dict_data 表,即“字典数据”列表。

在这里,我们才看到了真正的“映射关系”:

  • 字典标签:, 字典键值:0
  • 字典标签:, 字典键值:1
  • 字典标签:未知, 字典键值:2

12.2.3. [注意] 系统内置字典的“只读”原则

你会发现 RVP 已经内置了很多 sys_ 开头的字典(如 sys_normal_disable,0 = 正常, 1 = 停用)。

一个铁律: 除非你 100% 知道自己在做什么,否则 永远不要修改或删除系统内置的字典

这些字典与 RVP 框架的运行(比如菜单的“正常/停用”)是深度绑定的。删除了它们,系统会立刻报错。我们只应该修改我们自己创建的字典。


12.3. [实战] 从 0 到 1 创建“是否成功”字典

理论结束,我们来亲手创建一个属于自己的字典。

需求:在我们的业务中,需要一个字段来标记“操作是否成功”,0 代表“失败”,1 代表“成功”。

12.3.1. 步骤一:创建“字典类型”(user_is_success

我们必须先创建“包子皮”(字典类型)。

  1. 回到“字典管理”的主列表页。
  2. 点击左上角的“新增”。
  3. 字典名称是否成功 (给人看的)
  4. 字典类型user_is_success (给程序看的,我们用 user_ 开头,以区别于系统 sys_)
  5. 备注标记操作成功或失败
  6. 点击“确定”。(你可能需要去第二页才能找到它)

image-20251111204440335

12.3.2. 步骤二:添加“字典数据”(0=失败, 1=成功

现在,“包子皮”有了,但里面是空的。我们点击刚创建的 user_is_success 蓝色链接,“钻”进去添加“馅”。

  1. 在“字典数据”页面,点击“新增”。
  2. 字典标签失败
  3. 字典键值0
  4. 排序1
  5. 点击“确定”。

我们再新增一个:

  1. 点击“新增”。
  2. 字典标签成功
  3. 字典键值1
  4. 排序2
  5. 点击“确定”。

好了!我们自己的“活字典”就创建完毕了。

image-20251111204624870

12.3.3. [重点] 安全约束:删除的正确顺序

现在我们来试试“删除”这个字典,RVP 会阻止我们。

  1. 错误操作:回到“字典管理”主列表(第二页),找到 是否成功,点击“删除”。
  2. 现象:系统提示“已分配,不能删除”。
  3. 原因:这是 RVP 的“安全锁”。它在保护你,防止你把“包子皮”删了,而“馅”还在。
  4. 正确流程
    • 第一步:必须先点击 user_is_success “钻”进去。
    • 第二步:在“字典数据”页面,删除 失败成功 这两条“馅”
    • 第三步:返回“字典管理”主列表。
    • 第四步:此时,再点击 是否成功 的“删除”,操作成功!

你必须先清空“馅”,才能扔掉“皮”。


12.4. [实战] 字典的“颜值”:回显样式(Tag 标签)

我们的字典现在能用了,但还不够“漂亮”。我们希望“失败”显示为红色,“成功”显示为绿色。

12.4.1. 案例剖析:“操作日志”中的多彩标签

RVP 是如何实现“颜值”的呢?我们去“偷师”一下。

  1. 进入 日志管理 -> 操作日志
  2. 你会看到“操作类型”这一列,删除 是红色的,新增 是蓝色的,导出 是橙色的。五彩缤纷,一目了然。

这正是通过字典的“回显样式”功能实现的。

12.4.2. 实战配置:为“成功/失败”配置 successdanger 样式

我们来为自己的 user_is_success 字典也加上“颜值”。(请重新创建它)

  1. “钻”进入 user_is_success 的“字典数据”列表。
  2. 找到 失败 (键值 0) 这一行,点击“修改”。
  3. 你会看到一个“回显样式”字段。
  4. RVP 内置了 Element Plus 的几种样式:
    • primary (蓝色,默认)
    • success (绿色)
    • info (灰色)
    • warning (橙色)
    • danger (红色)
  5. 失败 选择 danger,点击“确定”。
  6. 同理,修改 成功 (键值 1),将其“回显样式”设置为 success

12.4.3. 刷新缓存:让新字典“活”起来

配置完成后,我们可能会发现在前端页面中(比如我们自己开发的业务表),这个字典并没有立刻生效,样式也没变。

这是因为 RVP 为了性能,会把字典数据 缓存 在 Redis 或内存中。

我们必须告诉 RVP:“嘿,我更新了字典,你该刷新缓存了!”

  • 操作:回到“字典管理”主列表,右上角有一个“刷新缓存”按钮。
  • 点击它,RVP 就会清空旧的字典缓存,加载最新的配置。

12.5 第十二章总结

本章我们深入了“字典管理”的核心。它表面上是“增删改查”,实际上是一种“解耦”的开发思想。

  • 核心思想:我们存储 稳定 的“键值”(如 0),映射 灵活 的“标签”(如 失败)。这使得我们修改显示文字时,无需触碰数据库和后端代码。
  • 两级结构:“字典类型”(sys_dict_type)是“分类”,“字典数据”(sys_dict_data)是“条目”。
  • 安全约束:必须先删除“字典数据”(馅),才能删除“字典类型”(皮)。
  • 回显样式:通过配置 dangersuccess 等样式,可以让我们的表格数据(如“操作日志”)更具可读性。
  • 刷新缓存:新增或修改字典后,如果前端未生效,记得“刷新缓存”