Ruo-Yi基础篇(三):第三章. 核心功能详解

第三章. 核心功能详解

摘要: 本章将深入剖析支撑若依框架高效、安全运行的三大核心功能支柱:权限系统 (RBAC)数据字典菜单管理。我们将从理解 RBAC 的理论模型入手,通过实战创建一个受限角色来掌握其具体应用。接着,我们将聚焦于解决第二章遗留的“下拉框”问题,系统性地学习数据字典的创建与使用。最后,我们还会对其他重要的系统管理功能进行快速概览。学完本章,您将不再仅仅是若依的使用者,而是能够随心所欲配置其核心功能的管理者。


在本章中,我们将像研究一本精密仪器的说明书一样,逐一拆解若依的核心部件:

  1. 首先,我们将深入若依的“安全内核”——权限系统 (RBAC),理解它是如何实现“正确的人,做正确的事”的。
  2. 接着,我们将掌握若依的“数据中枢”——数据字典,学会如何用它来管理系统中的静态数据,并解决实际开发中的 UI 交互问题。
  3. 最后,我们会快速导览 参数配置日志管理 等其他常用功能,完善我们的知识体系。

3.1. 权限系统 (RBAC)

权限管理是任何企业级后台系统的基石。若依内置了一套功能强大且设计经典的权限模型——RBAC(Role-Based Access Control,基于角色的访问控制)。理解 RBAC,是理解若依乃至绝大多数后台系统安全设计的关键。

3.1.1. 理解 RBAC:用户、角色与权限的关系

RBAC 的核心思想非常简洁:不直接给用户分配权限,而是将权限赋予“角色”,再将“角色”赋予用户

想象一下,在一个公司里,我们不会对新员工“张三”说:“你可以使用打印机、可以访问 A 系统、可以审批 B 流程……”。而是直接告诉他:“你的岗位是‘市场专员’”。而“市场专员”这个角色,已经被预先设定好了一揽子完成其工作所必需的权限。

这种模式带来了巨大的管理优势:

  • 高效授权:当一个新员工入职时,我们只需给他分配一个或多个角色,他便立即拥有了这些角色的所有权限。
  • 批量变更:当“市场专员”的职责发生变化,需要增加一项新权限时,我们只需修改“市场专员”这个角色本身,所有拥有该角色的员工权限便会自动更新。
  • 职责清晰:角色本身就代表了一组业务职责,使得权限管理与组织的业务结构保持一致,易于理解和维护。

在若依系统中,这个模型由三个核心实体和两个关系实体构成:

  • 核心实体:

    • 用户 (User): 系统中的操作个体,如 admin, ry
    • 角色 (Role): 权限的集合,代表一种职责或岗位,如“超级管理员”、“普通用户”。
    • 菜单/权限 (Menu/Permission): 系统的可操作资源。在若依中,它被巧妙地统一到了“菜单管理”中。一个“菜单”项(如“课程管理”)代表了页面访问权限,而一个“按钮”项(如“课程新增”)代表了具体的操作权限。
  • 关系实体:

    • 用户-角色关系: 定义了哪个用户拥有哪个角色(一个用户可以有多个角色)。
    • 角色-菜单关系: 定义了哪个角色拥有哪些菜单和按钮的权限(一个角色可以有多个权限)。

这五个实体之间的关系,在若依系统里被定义为了如下这五张表:
RBAC 核心五张表(用户、角色、菜单、用户角色、角色菜单

这张图清晰地揭示了它们在数据库层面是如何通过 sys_user_rolesys_role_menu 这两张中间表,建立起多对多的关系的。当一个用户登录时,系统会:

  1. 根据用户 ID,在 sys_user_role 表中找到他所拥有的所有角色 ID。
  2. 根据这些角色 ID,在 sys_role_menu 表中找到这些角色所拥有的所有菜单/权限 ID。
  3. 系统将这些权限信息(通常是一组权限标识符,如 course:course:list)存入该用户的会话(或 Token)中。
  4. 当用户访问一个页面或点击一个按钮时,后端(通过 Spring Security 的 @PreAuthorize 注解)和前端(通过自定义的 v-hasPermi 指令)会检查用户的会话中是否包含所需的权限标识符,从而决定是否放行。

3.1.2. 实战:创建“课研专员”角色并分配权限

理论知识是基础,现在让我们通过一个具体的业务场景,将理论付诸实践。

场景需求:我们需要在系统中创建一个新的角色——“课研专员”。这个角色的工作人员,其核心职责是管理课程信息,因此他们 只需要“课程管理”模块的全部权限,而不能访问系统中的其他任何功能(如用户管理、角色管理等)。

我们将分三步来完成这个任务:

第一步:创建新角色

  1. 在若依后台,导航至 系统管理 -> 角色管理
  2. 点击左上角的 新增 按钮。
  3. 在弹出的“添加角色”窗口中,填写以下信息:
    • 角色名称: 课研专员
    • 权限字符: course_researcher (这是一个全局唯一的 Key,后端权限校验时会用到)
    • 显示排序: 输入一个数字,如 3
    • 状态: 保持“正常”。

image-20251101103100627

第二步:为角色分配菜单权限

  1. 在“菜单权限”的树形结构中,取消勾选 最顶层的“系统管理”、“系统监控”、“系统工具”等所有默认选中的权限。

  2. 展开 系统工具 目录,找到并 只勾选“课程管理” 这一项。当您勾选父菜单“课程管理”时,其下属的所有按钮权限(查询、新增、修改、删除、导出)也会被自动勾选。
    创建新角色并为其分配菜单权限的界面截图

  3. 点击 保存 按钮。

至此,“课研专员”这个角色已经被我们精确地赋予了它所需的所有、且仅有的权限。

第三步:创建新用户并关联角色

  1. 导航至 系统管理 -> 用户管理
  2. 点击 新增 按钮。
  3. 在“新增用户”页面,填写新用户的基本信息,例如:
    • 用户昵称: 小P
    • 用户名称: Prorise
    • 密码: 设置一个初始密码。
  4. 在页面的下半部分,找到 角色 分配区域。取消勾选 默认的“普通用户”角色,然后 只勾选我们刚刚创建的“课研专员”
  5. 点击 确定 保存用户。

image-20251101103353049

第四步:验证

所有配置已完成。现在,请退出当前的 admin 账户,使用我们刚刚创建的 Prorise 账户登录系统。

image-20251101103458422

登录成功后,观察左侧的菜单栏。您会发现,原本庞大的菜单树消失了,只剩下了一个“系统工具”目录,且该目录下只有一个可点击的“课程管理”菜单。尝试访问其他被隐藏的 URL,系统会提示权限不足。进入“课程管理”页面,所有的新增、修改、删除按钮均可正常使用。

实验结论:我们成功地通过 RBAC 模型,创建了一个职责明确、权限最小化的新角色,并将其赋予了新用户。这个过程没有修改任何代码,完全通过后台界面配置完成。这充分展示了若依权限系统的灵活性与强大功能。


3.2. 数据字典:让你的页面“活”起来

数据字典是企业级应用中一个看似简单但至关重要的功能。它负责集中管理系统中相对稳定、但又可能需要调整的“静态数据”或“枚举值”。

3.2.1. 什么是数据字典及其应用场景

想象一下,在一个系统中,有多少地方需要用到“状态”这个概念?

  • 用户有“正常”、“停用”两种状态。
  • 订单有“待支付”、“已支付”、“已发货”、“已完成”、“已取消”等多种状态。
  • 通知公告有“通知”、“公告”两种类型。

如果我们在代码的每个角落都硬编码这些值(比如 if (status == 0) 代表正常,if (status == 1) 代表停用),会带来一场灾难:

  • 可读性差:代码中充满了“魔法数字”(Magic Numbers),01 本身不具备任何业务含义,极难理解。
  • 维护困难:如果有一天,需要增加一种“锁定”状态 2,你需要大海捞针般地找出系统中所有与用户状态相关的代码,进行修改,极易遗漏。
  • 不一致性:前端页面、后端逻辑、数据库存储,三者对状态的定义可能产生偏差,导致难以追踪的 BUG。

数据字典正是为了解决这些问题而生。

它提供了一个统一的地方,让我们用业务人员能理解的语言,来定义这些静态数据。例如,我们可以创建一个名为 sys_user_status 的字典类型,在里面定义:

标签 (Label)值 (Value)
正常0
停用1

这样,在整个系统中:

  • 前端:可以调用接口获取这个字典,自动生成下拉框或单选框,用户看到的是“正常”、“停用”这样的友好文本。
  • 后端:在接收或返回数据时,处理的是 01 这样规范的值,同时也可以方便地将 0 转换为“正常”用于日志或展示。
  • 数据库:存储的是简洁的 01,节省空间且便于索引。

当需要增加“锁定”状态时,我们只需在数据字典管理界面新增一条记录 {"锁定", "2"},整个系统(如果设计得当)无需修改一行代码,就能自动适应这种变化。

若依的数据字典功能主要由两部分构成

  • 字典类型: 对字典进行分组,相当于一个“文件夹”。例如 sys_user_status (用户状态), sys_notice_type (公告类型)。每个字典类型都有一个全局唯一的 类型名称 (Dict Type)
  • 字典数据: 隶属于某个字典类型下的具体键值对。例如 sys_user_status 下的 {"正常", "0"}{"停用", "1"}

它们在数据库中对应两张核心表:sys_dict_type (字典类型表) 和 sys_dict_data (字典数据表),通过 dict_type 字段进行关联。
若依数据字典的两张核心表 sys_dict_type 和 sys_dict_data 的关系图

3.2.2. 实战:为“课程学科”创建并应用数据字典

现在,让我们运用数据字典的知识,来完成第二章未竟的事业。我们的目标是,将“课程管理”模块中“课程学科”的查询条件和新增/修改表单,都改造为下拉选择框。

这个过程将完美地形成一个“学习 -> 配置 -> 应用 -> 验证”的闭环,让您深刻体验若依“配置驱动开发”的魅力。

第一步:创建字典类型

  1. 在若依后台,导航至 系统管理 -> 字典管理

  2. 点击左上角的 新增 按钮。

  3. 在弹出的“添加字典类型”窗口中,填写以下信息:

    • 字典名称: 课程学科 (这是给人看的,方便理解)
    • 字典类型: course_subject (非常重要!这是给程序用的唯一标识符,必须是英文且唯一)
    • 状态: 保持“正常”。
    • 备注: 可选填,如“用于定义课程的所有学科分类”。
  4. 点击 确定 保存。

image-20251101104607175

第二步:添加字典数据

字典类型这个“文件夹”已经建好,现在我们往里面添加具体的“文件”。

  1. 在字典管理列表页,找到我们刚创建的“字典类型”这一行,点击其高亮的蓝色标签
  2. 页面会跳转到“字典数据”管理界面。点击左上角的 新增 按钮。
  3. 在“添加字典数据”窗口中,填写第一条数据:
    • 字典类型: 自动带入 course_subject
    • 数据标签: JavaEE (这是显示在下拉框中的文本)
    • 数据键值: 0 (这是提交到后端并存入数据库的值)
    • 显示排序: 1(用于下拉框选择项的排序顺序)
    • 状态: 正常
  4. 点击 确定 保存。
  5. 重复操作:请参照上一步,继续添加 PythonHarmonyOS 这两个学科。确保它们的“数据键值”也是对应的英文。

全部添加完成后,您应该能在 course_subject 的字典数据列表中看到三条记录。

image-20251101104733262

第三步:将数据字典应用到代码生成器

现在,我们的数据字典已经准备就绪。是时候回到第二章我们留下“伏笔”的地方,将这块“拼图”拼上了。

  1. 导航回到 系统工具 -> 代码生成
  2. 找到 tb_course (课程管理表) 这一行,点击 编辑
  3. 在编辑页面,切换到 字段信息 选项卡。
  4. 找到 subject (课程学科) 这一行,定位到最右侧的 字典类型 这一列。
  5. 点击该列的下拉框,您现在应该能在列表中找到我们刚刚创建的 course_subject选中它
    在代码生成器中为字段选择数据字典的截图
  6. 点击页面底部的 提交 按钮保存配置。

第四步:重新生成并集成代码

我们的“设计图纸”已经更新,现在需要让“工厂”按照新的图纸重新生产“零件”。

  1. 在代码生成主列表,重新勾选 tb_course 表。

  2. 再次点击 生成代码 按钮,下载一个新的 ruoyi.zip 文件。

  3. 解压这个新的压缩包。注意,这次我们不需要关心后端的 Java 代码或 SQL 文件,因为数据字典的应用主要体现在前端。

  4. 覆盖前端代码

    • 源路径: 新解压的 ruoyi/vue/views/course/index.vue
    • 目标路径: ruoyi-modern-project/ruoyi-ui/src/views/course/index.vue
    • 操作: 直接用新的 index.vue 文件,覆盖 掉项目中原有的同名文件。

课程管理页面,课程学科学段变为下拉框并成功显示字典数据

第五步:修正数据不匹配问题

在验证成果之前,我们需要解决一个关键问题:数据库中现有数据与数据字典的值不匹配。

回顾一下,在第二章初始化数据时,我们插入的课程数据中 subject 字段的值是 'JavaEE''Python' 等字符串。但在刚才创建数据字典时,我们将 “数据键值” 设置为了 012 这样的数字。

这会导致一个问题:当您打开 “课程管理” 页面时,现有的课程记录在 “课程学科” 列会显示为纯数字,因为系统无法将数据库中的 'JavaEE' 字符串匹配到字典值 0

为什么会有这个问题?

这是一个典型的 “历史数据兼容性” 问题。在实际项目中非常常见:

  • 设计初期:我们直接在数据库中存储了业务含义明确的字符串 'JavaEE',这样做简单直观。
  • 引入数据字典后:为了规范化和便于维护,我们改用数字编码 012 来存储,前端通过字典将其转换为友好的中文标签展示给用户。

解决方案有两种

方案一:修改数据字典的键值(推荐用于学习)

如果您的系统刚刚起步,数据量还很少,最简单的做法是调整数据字典,让它的 “数据键值” 与数据库现有数据保持一致。

  1. 返回 系统管理 -> 字典管理
  2. 点击 course_subject 字典类型,进入字典数据列表。
  3. 逐一编辑三条字典数据,将它们的 数据键值 修改为:
    • JavaEE 的数据键值改为 JavaEE (而不是 0
    • Python 的数据键值改为 Python (而不是 1
    • HarmonyOS 的数据键值改为 HarmonyOS (而不是 2
  4. 保存修改。

这样,数据字典的键值就与数据库中 subject 字段的实际存储值完全一致了,页面可以正常匹配显示。

方案二:修改数据库中的历史数据(推荐用于生产)

如果您希望数据库存储更规范的数字编码(这在大型系统中更常见),则需要更新数据库中的历史数据。

在 Navicat 或其他数据库工具中执行以下 SQL 语句:

1
2
3
UPDATE tb_course SET subject = '0' WHERE subject = 'JavaEE';
UPDATE tb_course SET subject = '1' WHERE subject = 'Python';
UPDATE tb_course SET subject = '2' WHERE subject = 'HarmonyOS';

执行后,数据库中的 subject 字段值就变成了 012,与我们最初创建的数据字典键值完全对应。

本教程采用方案二,因为它操作更简单,我们的测试数据很少,更适合初学者。在实际项目中,您可以根据具体情况灵活选择。

第六步:修复前端样式问题

覆盖完代码后,您可能会发现 “课程学科” 下拉框显示异常:它可能只显示为一个小方块,无法正常展开选择。这是因为代码生成器生成的 el-select 组件默认没有设置宽度,导致组件收缩。

我们需要手动为下拉框添加宽度样式。

打开项目中的 ruoyi-modern-project/RuoYi-Vue3/src/views/course/Course/index.vue 文件:

位置一:查询表单中的下拉框

找到第 12-21 行左右的查询表单部分,将:

1
2
<el-form-item label="课程学科" prop="subject">
<el-select v-model="queryParams.subject" placeholder="请选择课程学科" clearable>

修改为(在 el-select 标签中添加 style="width: 240px"):

1
2
<el-form-item label="课程学科" prop="subject">
<el-select v-model="queryParams.subject" placeholder="请选择课程学科" clearable style="width: 240px">

位置二:新增/编辑对话框中的下拉框

找到第 133-141 行左右的对话框表单部分,将:

1
2
<el-form-item label="课程学科" prop="subject">
<el-select v-model="form.subject" placeholder="请选择课程学科">

修改为(添加 style="width: 100%"):

1
2
<el-form-item label="课程学科" prop="subject">
<el-select v-model="form.subject" placeholder="请选择课程学科" style="width: 100%">

为什么要设置不同的宽度?

  • 查询表单是 内联布局 (inline="true"),各个表单项横向排列,设置固定宽度 240px 可以保持页面紧凑美观。
  • 对话框表单是 垂直布局,表单项纵向堆叠,设置 100% 宽度可以让下拉框填充整个表单项区域,与其他输入框保持视觉一致。

保存文件后,下拉框就能正常显示了。

第七步:验证成果

回到您的浏览器,强制刷新“课程管理”页面(可能需要重新登录)。

现在,请观察页面顶部的搜索栏和点击“新增”或“修改”按钮弹出的表单。您会惊喜地发现,原本的“课程学科”文本输入框,已经 神奇地变成了功能完善的下拉选择框!点击它,会清晰地列出我们在数据字典中配置的“JavaEE”、“Python”和“HarmonyOS”三个选项。

实验结论:我们成功地通过数据字典,以一种零编码、纯配置的方式,优化了一个重要的前端交互。这个完整的闭环流程充分证明了数据字典在解耦前后端数据、提升开发效率和系统可维护性方面的巨大价值。现在,您已经完全掌握了若依的这一核心功能。


3.3. 参数设置:系统的动态“开关”

在任何一个正式的软件项目中,我们都会遇到一类特殊的配置项:它们不像数据库地址那样恒定不变,但又不能直接硬编码在代码里,因为业务人员或运维人员可能需要根据实际情况随时调整。

参数设置 功能,正是为了解决这一痛点而设计的。它本质上是一个 存储在数据库中的、全局的键值对(Key-Value)配置中心。通过后台界面,我们可以方便地对这些参数进行动态维护。

使用该功能的核心优势在于:

  • 避免硬编码:将易变的业务逻辑值(如“密码最大重试次数”、“是否开启某项活动”)从代码中剥离,提高了代码的可维护性。
  • 运行时动态生效:修改参数后,通常只需刷新缓存即可在整个系统中生效,无需重新编译代码或重启服务,这对于生产环境的运维至关重要。
  • 配置集中化:所有动态参数都在一个统一的界面进行管理,一目了然。

3.3.1. 实战案例:动态关闭登录验证码

业务场景: 在项目开发和测试阶段,开发人员需要频繁地登录、退出系统进行调试。默认开启的登录验证码虽然增强了安全性,但在这个阶段却大大降低了调试效率。我们的需求是:在不修改任何代码的情况下,为开发环境动态地关闭登录验证码功能。

实现步骤:

  1. 导航至参数设置
    在若依后台,依次点击 系统管理 -> 参数设置。您会看到一个列表,其中包含了系统预设的多个参数。
    参数设置功能的主界面截图
  2. 定位目标参数
    在参数列表中,找到 参数键名sys.account.captchaEnabled 的记录。从键名我们可以直观地理解,这个参数就是用来控制“账户验证码是否启用”的。
  3. 修改参数值
    点击该行右侧操作列的 修改 按钮。在弹出的“修改参数”窗口中,将 参数键值true 修改为 false

  1. 清除缓存以使配置生效
    点击 确定 保存修改。此时,配置已经更新到了数据库中,但正在运行的系统为了性能,读取的是 Redis 缓存中的旧配置。因此,我们需要执行关键的最后一步:点击页面右上角的 “刷新缓存” 按钮。这个操作会通知系统从数据库重新加载所有配置项到 Redis 中。

  2. 验证结果
    现在,请退出当前 admin 账户。当您返回到登录页面时,会发现原先的验证码输入框和图片已经消失了,可以直接输入用户名和密码进行登录。

    验证码关闭后,登录页面不再显示验证码输入框的对比图

通过这个简单的案例,我们以一种零代码、纯配置的方式,动态地改变了系统的核心行为,这正是“参数设置”功能的强大之处。


3.4. 日志管理:系统操作的全程记录仪

日志是系统安全、问题排查和行为审计的生命线。若依提供了两个开箱即用的日志管理模块,它们就像是安装在系统内部的“黑匣子”和“监控摄像头”,忠实地记录着发生的一切。

3.4.1. 操作日志:行为审计与问题追溯

是什么?
操作日志精确记录了用户在系统中所有 对数据产生变更或执行重要查询 的关键操作。

背后原理:
该功能是通过 Spring AOP(面向切面编程) 和一个自定义的 @Log 注解 实现的。当一个 Controller 方法被 @Log 注解标记后,AOP 切面会自动拦截该方法的调用。在方法执行前后,切面会收集诸如 操作用户、IP 地址、请求 URL、调用方法、传入参数、操作耗时、是否成功 等信息,并将其异步地保存到数据库的 sys_oper_log 表中。

实战联动:追踪“课程管理”的操作记录

  1. 执行操作: 请您现在导航至 系统工具 -> 课程管理 模块。执行一次 新增 操作,成功添加一条新的课程记录。然后,再执行一次 删除 操作,将这条新记录删除。
  2. 查看日志: 操作完成后,立刻导航至 系统监控 -> 操作日志
  3. 分析结果: 在日志列表的顶部,您会看到两条最新的记录:
    • 一条记录的 业务类型“新增”请求方式POST。点击“详细”按钮,您甚至可以看到当时提交的完整 JSON 数据。
    • 另一条记录的 业务类型“删除”请求方式DELETE

image-20251101115201922

这个联动的过程清晰地展示了操作日志的价值:它为每一次关键操作都留下了不可否认的证据,无论是用于事后排查问题(“是谁误删了数据?”),还是进行安全审计,都至关重要。

3.4.2. 登录日志:守护系统安全的第一道防线

是什么?
登录日志专门、独立地记录每一次用户登录系统的尝试,无论成功与否。

核心价值:
它是系统安全审计的关键环节。通过分析登录日志,管理员可以:

  • 发现异常登录: 例如,在短时间内,同一个账户从多个不同的地理位置 IP 尝试登录,这极有可能是账户被盗或被攻击的迹象。
  • 监控失败尝试: 如果一个账户连续多次登录失败,系统可以触发告警或自动锁定该账户,防止暴力破解。

如何使用:
导航至 系统监控 -> 登录日志。这里详细列出了所有登录尝试的账号、状态(成功/失败)、IP 地址、登录地点、浏览器和操作系统信息。

image-20251101115337828


3.5. 通知公告:系统的“广播站”

是什么?
这是一个简单但非常实用的内容发布功能,允许管理员向系统内的用户发布结构化的信息。

核心功能:

  • 富文本编辑: 创建公告时,支持使用富文本编辑器,可以方便地设置文本格式、插入图片、超链接等。
  • 公告分类: 公告可以被分为不同的类型,如“通知”和“公告”。这个分类本身也是由 数据字典 (sys_notice_type) 维护的。

实战案例:发布一条版本更新通知

  1. 导航: 进入 系统管理 -> 通知公告
  2. 新增公告: 点击“新增”按钮。
  3. 填写内容:
    • 公告标题: 系统 V3.8.7 版本更新通知
    • 公告类型: 选择 通知
    • 公告内容: 在富文本编辑器中输入更新详情。

目前 ruoyi 普通版只有内置对于公告的 CRUD,对于页面来说他不会有任何变化,如果希望自己集成公告推送的话可以参考如下这篇文章:

[Ruoyi 若依通知公告功能实现(轮询信息铃铛)_若依消息通知-CSDN 博客](https://blog.csdn.net/TinpeaV/article/details/137146115?spm = 1001.2014.3001.5501)

这个功能虽然简单,但在需要向全体用户传达重要信息的场景(如系统维护、版本更新、节假日通知)下,非常高效。

3.6. 菜单管理:构建系统的导航骨架与权限节点

在 3.1 节讲解 RBAC 模型时,我们已经初步接触了“菜单”作为“权限”载体的概念。然而,那只是从角色分配的角度去理解。本节,我们将 完全聚焦于“菜单管理”功能本身,以系统构建者和架构师的视角,深入学习如何通过它来 手动 规划、构建和维护整个应用的导航体系,并为每一个可操作的“点”精确地定义权限。

这项技能至关重要,因为在任何实际的二次开发中,无论是添加一个全新的业务模块,还是想调整现有功能的布局,亦或是将一个大页面拆分为多个子页面,“菜单管理”都是您必须操作的第一站。

3.6.1.深度解析菜单、目录与按钮

若依的“菜单管理”是将 前端视图(Component)前端路由(Route)后端权限(Permission) 进行统一声明和绑定的核心枢纽。其设计由三种不同类型的“菜单”构成,每种类型都有其精确的角色和核心配置。

A. 目录 (Directory)

“目录”扮演着纯粹的 “组织容器” 的角色,用于组织一组相关的菜单,形成清晰的导航层级。

image-20251102153649880

关键配置 (UI 字段)描述与说明
上级菜单指定该目录所属的父节点。选择“主类目”则为顶级目录。
菜单图标为目录选择一个在导航栏中显示的图标。
菜单名称显示在导航栏中的文本,如“系统管理”。
路由地址核心配置。作为所有子菜单的 URL 路径前缀,必须唯一。
显示状态控制该目录及其下所有子项是否在导航栏中可见。

B. 菜单 (Menu)

“菜单”是用户能与之交互、通往具体功能页面的 “真正入口”

image-20251102153830017

关键配置 (UI 字段)描述与说明
组件路径核心配置。指向前端 src/views/ 目录下的 .vue 文件路径。
权限字符核心配置。连接前后端权限校验的 唯一凭证
路由参数(高级) 定义路由的动态参数,如 /user/profile/:userId
是否缓存控制该页面是否被 Vue 的 <keep-alive> 组件缓存,提升二次访问速度。

C. 按钮 (Button)

“按钮”是一种 “隐藏的权限节点”,专门用于定义页面内部的具体操作权限。

image-20251102153917601

关键配置 (UI 字段)描述与说明
上级菜单必须选择一个“菜单”类型的父节点,表明该按钮隶属于哪个页面。
权限字符核心配置。对应页面上某个按钮的 操作权限,后端用于注解,前端用于指令。
菜单名称用于在后台管理时识别此权限,如“用户新增”、“用户修改”。

3.6.2. 实战案例:手动创建并重组“课程管理”模块

业务场景: 将“课程管理”模块从“系统工具”中移除,并放置到一个全新的、名为 “教学管理” 的顶级模块下。

  • 第一步:创建新的顶级“目录” - 教学管理

    1. 导航: 系统管理 -> 菜单管理,点击 新增
    2. 配置: 参照下表完成目录的关键信息配置。
配置项 (UI 字段)填写值目的与说明
上级菜单主类目创建一个顶级的、没有父级的导航分组。
菜单类型目录声明这是一个组织容器,不可跳转。
菜单名称教学管理导航栏中显示的文本。
路由地址education定义该模块下所有子页面的 URL 路径前缀。
显示排序5控制在同级菜单中的显示顺序。
  • 第二步:创建“课程管理”页面“菜单”

    1. 清理: 先删除原“系统工具”下的“课程管理”相关菜单。
    2. 新增: 再次点击 新增
    3. 配置: 参照下表完成菜单的关键信息配置。
配置项 (UI 字段)填写值目的与说明
上级菜单教学管理将此菜单归属于新创建的“教学管理”目录下。
菜单类型菜单声明这是一个可点击、链接到页面的入口。
路由地址course定义页面的具体路径,最终 URL 为 /education/course
组件路径course/Course/index精确指定要加载的前端 Vue 组件文件。
权限字符course:course:list定义访问此页面的核心权限凭证。
是否缓存缓存开启页面缓存,提升用户体验。
  • 第三步:为新菜单添加“按钮”权限

    1. 新增: 再次点击 新增
    2. 配置: 参照下表,为“新增”操作创建按钮权限。
配置项 (UI 字段)填写值目的与说明
上级菜单课程管理将此按钮权限附属于“课程管理”页面。
菜单类型按钮声明这是一个页面内部的操作权限,不在导航栏显示。
菜单名称课程新增用于在后台管理时识别此权限。
权限字符course:course:add定义“新增”操作的唯一权限凭证。
  1. 重复操作: 参照上表,继续添加 修改 (course:course:edit)、删除 (course:course:remove) 等其他按钮权限。
  • 第四步:验证成果

    1. 操作: 点击右上角头像 -> 清除缓存,然后强制刷新浏览器页面。
    2. 观察: 左侧菜单栏出现新的“教学管理”顶级目录,展开后可点击“课程管理”并正常访问。

通过这个手动配置的过程,您已经掌握了如何运用“三位一体”的模型,自由地构建和调整若依系统的功能布局与权限体系。


3.7. 部门管理:构建企业的组织架构树

在完成了对菜单和权限的精细化定义后,我们转向企业管理的另一个核心维度——组织架构。“部门管理”功能正是若依框架中用于构建和维护这一结构的基础模块。

3.7.1. 是什么:超越通讯录的组织核心

“部门管理”远不止是一个简单的“公司通讯录”或部门列表。它是一个以 树形结构 来定义企业内部组织层级的核心功能,为实现复杂的、基于组织汇报关系的管理需求提供了数据基础。

image-20251102155158912

核心价值

部门管理本身只是一个组织结构的定义,但它的真正价值在于 与其他模块的联动,从而实现基于组织架构的数据权限控制和业务流程流转:

联动模块实现功能业务场景举例
用户管理用户归属每个用户必须归属于一个部门,这是构建“按部门筛选/统计用户”等功能的基础。
角色管理数据权限最重要的应用。可以为角色配置不同的数据范围,如“本部门数据权限”、“本部门及以下数据权限”等。
业务模块 (二次开发)数据隔离在 CRM、ERP 等系统中,可以实现销售只能看到本部门的客户,财务只能看到本分公司的账目。
工作流 (二次开发)流程审批定义审批流,如“员工提交 -> 部门经理审批 -> 总监审批”,审批人根据部门层级关系自动确定。

数据权限的背后原理

当一个角色被赋予了例如“本部门数据权限”后,若依的后端会通过 AOP 切面 在执行数据库查询时进行拦截。切面会获取当前登录用户的部门 ID,并 自动向正在执行的 SQL 语句动态拼接上 WHERE 条件(例如,AND u.dept_id = 103),从而在数据库层面就完成了数据的过滤,保证了数据权限的安全性与高效性。

他的最重要的用途是在 用户管理 页面提供筛选功能,可以通过筛选去查看不同部门的用户情况,

image-20251102161421229