Ruo-Yi基础篇(三):第三章. 核心功能详解
Ruo-Yi基础篇(三):第三章. 核心功能详解
Prorise第三章. 核心功能详解
摘要: 本章将深入剖析支撑若依框架高效、安全运行的三大核心功能支柱:权限系统 (RBAC)、数据字典 和 菜单管理。我们将从理解 RBAC 的理论模型入手,通过实战创建一个受限角色来掌握其具体应用。接着,我们将聚焦于解决第二章遗留的“下拉框”问题,系统性地学习数据字典的创建与使用。最后,我们还会对其他重要的系统管理功能进行快速概览。学完本章,您将不再仅仅是若依的使用者,而是能够随心所欲配置其核心功能的管理者。
在本章中,我们将像研究一本精密仪器的说明书一样,逐一拆解若依的核心部件:
- 首先,我们将深入若依的“安全内核”——权限系统 (RBAC),理解它是如何实现“正确的人,做正确的事”的。
- 接着,我们将掌握若依的“数据中枢”——数据字典,学会如何用它来管理系统中的静态数据,并解决实际开发中的 UI 交互问题。
- 最后,我们会快速导览 参数配置、日志管理 等其他常用功能,完善我们的知识体系。
3.1. 权限系统 (RBAC)
权限管理是任何企业级后台系统的基石。若依内置了一套功能强大且设计经典的权限模型——RBAC(Role-Based Access Control,基于角色的访问控制)。理解 RBAC,是理解若依乃至绝大多数后台系统安全设计的关键。
3.1.1. 理解 RBAC:用户、角色与权限的关系
RBAC 的核心思想非常简洁:不直接给用户分配权限,而是将权限赋予“角色”,再将“角色”赋予用户。
想象一下,在一个公司里,我们不会对新员工“张三”说:“你可以使用打印机、可以访问 A 系统、可以审批 B 流程……”。而是直接告诉他:“你的岗位是‘市场专员’”。而“市场专员”这个角色,已经被预先设定好了一揽子完成其工作所必需的权限。
这种模式带来了巨大的管理优势:
- 高效授权:当一个新员工入职时,我们只需给他分配一个或多个角色,他便立即拥有了这些角色的所有权限。
- 批量变更:当“市场专员”的职责发生变化,需要增加一项新权限时,我们只需修改“市场专员”这个角色本身,所有拥有该角色的员工权限便会自动更新。
- 职责清晰:角色本身就代表了一组业务职责,使得权限管理与组织的业务结构保持一致,易于理解和维护。
在若依系统中,这个模型由三个核心实体和两个关系实体构成:
核心实体:
- 用户 (User): 系统中的操作个体,如
admin,ry。 - 角色 (Role): 权限的集合,代表一种职责或岗位,如“超级管理员”、“普通用户”。
- 菜单/权限 (Menu/Permission): 系统的可操作资源。在若依中,它被巧妙地统一到了“菜单管理”中。一个“菜单”项(如“课程管理”)代表了页面访问权限,而一个“按钮”项(如“课程新增”)代表了具体的操作权限。
- 用户 (User): 系统中的操作个体,如
关系实体:
- 用户-角色关系: 定义了哪个用户拥有哪个角色(一个用户可以有多个角色)。
- 角色-菜单关系: 定义了哪个角色拥有哪些菜单和按钮的权限(一个角色可以有多个权限)。
这五个实体之间的关系,在若依系统里被定义为了如下这五张表:
这张图清晰地揭示了它们在数据库层面是如何通过 sys_user_role 和 sys_role_menu 这两张中间表,建立起多对多的关系的。当一个用户登录时,系统会:
- 根据用户 ID,在
sys_user_role表中找到他所拥有的所有角色 ID。 - 根据这些角色 ID,在
sys_role_menu表中找到这些角色所拥有的所有菜单/权限 ID。 - 系统将这些权限信息(通常是一组权限标识符,如
course:course:list)存入该用户的会话(或 Token)中。 - 当用户访问一个页面或点击一个按钮时,后端(通过 Spring Security 的
@PreAuthorize注解)和前端(通过自定义的v-hasPermi指令)会检查用户的会话中是否包含所需的权限标识符,从而决定是否放行。
3.1.2. 实战:创建“课研专员”角色并分配权限
理论知识是基础,现在让我们通过一个具体的业务场景,将理论付诸实践。
场景需求:我们需要在系统中创建一个新的角色——“课研专员”。这个角色的工作人员,其核心职责是管理课程信息,因此他们 只需要“课程管理”模块的全部权限,而不能访问系统中的其他任何功能(如用户管理、角色管理等)。
我们将分三步来完成这个任务:
第一步:创建新角色
- 在若依后台,导航至 系统管理 -> 角色管理。
- 点击左上角的 新增 按钮。
- 在弹出的“添加角色”窗口中,填写以下信息:
- 角色名称:
课研专员 - 权限字符:
course_researcher(这是一个全局唯一的 Key,后端权限校验时会用到) - 显示排序: 输入一个数字,如
3。 - 状态: 保持“正常”。
- 角色名称:

第二步:为角色分配菜单权限
在“菜单权限”的树形结构中,取消勾选 最顶层的“系统管理”、“系统监控”、“系统工具”等所有默认选中的权限。
展开 系统工具 目录,找到并 只勾选“课程管理” 这一项。当您勾选父菜单“课程管理”时,其下属的所有按钮权限(查询、新增、修改、删除、导出)也会被自动勾选。

点击 保存 按钮。
至此,“课研专员”这个角色已经被我们精确地赋予了它所需的所有、且仅有的权限。
第三步:创建新用户并关联角色
- 导航至 系统管理 -> 用户管理。
- 点击 新增 按钮。
- 在“新增用户”页面,填写新用户的基本信息,例如:
- 用户昵称:
小P - 用户名称:
Prorise - 密码: 设置一个初始密码。
- 用户昵称:
- 在页面的下半部分,找到 角色 分配区域。取消勾选 默认的“普通用户”角色,然后 只勾选我们刚刚创建的“课研专员”。
- 点击 确定 保存用户。

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

登录成功后,观察左侧的菜单栏。您会发现,原本庞大的菜单树消失了,只剩下了一个“系统工具”目录,且该目录下只有一个可点击的“课程管理”菜单。尝试访问其他被隐藏的 URL,系统会提示权限不足。进入“课程管理”页面,所有的新增、修改、删除按钮均可正常使用。
实验结论:我们成功地通过 RBAC 模型,创建了一个职责明确、权限最小化的新角色,并将其赋予了新用户。这个过程没有修改任何代码,完全通过后台界面配置完成。这充分展示了若依权限系统的灵活性与强大功能。
3.2. 数据字典:让你的页面“活”起来
数据字典是企业级应用中一个看似简单但至关重要的功能。它负责集中管理系统中相对稳定、但又可能需要调整的“静态数据”或“枚举值”。
3.2.1. 什么是数据字典及其应用场景
想象一下,在一个系统中,有多少地方需要用到“状态”这个概念?
- 用户有“正常”、“停用”两种状态。
- 订单有“待支付”、“已支付”、“已发货”、“已完成”、“已取消”等多种状态。
- 通知公告有“通知”、“公告”两种类型。
如果我们在代码的每个角落都硬编码这些值(比如 if (status == 0) 代表正常,if (status == 1) 代表停用),会带来一场灾难:
- 可读性差:代码中充满了“魔法数字”(Magic Numbers),
0和1本身不具备任何业务含义,极难理解。 - 维护困难:如果有一天,需要增加一种“锁定”状态
2,你需要大海捞针般地找出系统中所有与用户状态相关的代码,进行修改,极易遗漏。 - 不一致性:前端页面、后端逻辑、数据库存储,三者对状态的定义可能产生偏差,导致难以追踪的 BUG。
数据字典正是为了解决这些问题而生。
它提供了一个统一的地方,让我们用业务人员能理解的语言,来定义这些静态数据。例如,我们可以创建一个名为 sys_user_status 的字典类型,在里面定义:
| 标签 (Label) | 值 (Value) |
|---|---|
正常 | 0 |
停用 | 1 |
这样,在整个系统中:
- 前端:可以调用接口获取这个字典,自动生成下拉框或单选框,用户看到的是“正常”、“停用”这样的友好文本。
- 后端:在接收或返回数据时,处理的是
0、1这样规范的值,同时也可以方便地将0转换为“正常”用于日志或展示。 - 数据库:存储的是简洁的
0、1,节省空间且便于索引。
当需要增加“锁定”状态时,我们只需在数据字典管理界面新增一条记录 {"锁定", "2"},整个系统(如果设计得当)无需修改一行代码,就能自动适应这种变化。
若依的数据字典功能主要由两部分构成:
- 字典类型: 对字典进行分组,相当于一个“文件夹”。例如
sys_user_status(用户状态),sys_notice_type(公告类型)。每个字典类型都有一个全局唯一的 类型名称 (Dict Type)。 - 字典数据: 隶属于某个字典类型下的具体键值对。例如
sys_user_status下的{"正常", "0"}和{"停用", "1"}。
它们在数据库中对应两张核心表:sys_dict_type (字典类型表) 和 sys_dict_data (字典数据表),通过 dict_type 字段进行关联。
3.2.2. 实战:为“课程学科”创建并应用数据字典
现在,让我们运用数据字典的知识,来完成第二章未竟的事业。我们的目标是,将“课程管理”模块中“课程学科”的查询条件和新增/修改表单,都改造为下拉选择框。
这个过程将完美地形成一个“学习 -> 配置 -> 应用 -> 验证”的闭环,让您深刻体验若依“配置驱动开发”的魅力。
第一步:创建字典类型
在若依后台,导航至 系统管理 -> 字典管理。
点击左上角的 新增 按钮。
在弹出的“添加字典类型”窗口中,填写以下信息:
- 字典名称:
课程学科(这是给人看的,方便理解) - 字典类型:
course_subject(非常重要!这是给程序用的唯一标识符,必须是英文且唯一) - 状态: 保持“正常”。
- 备注: 可选填,如“用于定义课程的所有学科分类”。
- 字典名称:
点击 确定 保存。

第二步:添加字典数据
字典类型这个“文件夹”已经建好,现在我们往里面添加具体的“文件”。
- 在字典管理列表页,找到我们刚创建的“字典类型”这一行,点击其高亮的蓝色标签
- 页面会跳转到“字典数据”管理界面。点击左上角的 新增 按钮。
- 在“添加字典数据”窗口中,填写第一条数据:
- 字典类型: 自动带入
course_subject - 数据标签:
JavaEE(这是显示在下拉框中的文本) - 数据键值:
0(这是提交到后端并存入数据库的值) - 显示排序:
1(用于下拉框选择项的排序顺序) - 状态: 正常
- 字典类型: 自动带入
- 点击 确定 保存。
- 重复操作:请参照上一步,继续添加
Python和HarmonyOS这两个学科。确保它们的“数据键值”也是对应的英文。
全部添加完成后,您应该能在 course_subject 的字典数据列表中看到三条记录。

第三步:将数据字典应用到代码生成器
现在,我们的数据字典已经准备就绪。是时候回到第二章我们留下“伏笔”的地方,将这块“拼图”拼上了。
- 导航回到 系统工具 -> 代码生成。
- 找到
tb_course(课程管理表) 这一行,点击 编辑。 - 在编辑页面,切换到 字段信息 选项卡。
- 找到
subject(课程学科) 这一行,定位到最右侧的 字典类型 这一列。 - 点击该列的下拉框,您现在应该能在列表中找到我们刚刚创建的
course_subject!选中它。
- 点击页面底部的 提交 按钮保存配置。
第四步:重新生成并集成代码
我们的“设计图纸”已经更新,现在需要让“工厂”按照新的图纸重新生产“零件”。
在代码生成主列表,重新勾选
tb_course表。再次点击 生成代码 按钮,下载一个新的
ruoyi.zip文件。解压这个新的压缩包。注意,这次我们不需要关心后端的 Java 代码或 SQL 文件,因为数据字典的应用主要体现在前端。
覆盖前端代码:
- 源路径: 新解压的
ruoyi/vue/views/course/index.vue - 目标路径:
ruoyi-modern-project/ruoyi-ui/src/views/course/index.vue - 操作: 直接用新的
index.vue文件,覆盖 掉项目中原有的同名文件。
- 源路径: 新解压的

第五步:修正数据不匹配问题
在验证成果之前,我们需要解决一个关键问题:数据库中现有数据与数据字典的值不匹配。
回顾一下,在第二章初始化数据时,我们插入的课程数据中 subject 字段的值是 'JavaEE'、'Python' 等字符串。但在刚才创建数据字典时,我们将 “数据键值” 设置为了 0、1、2 这样的数字。
这会导致一个问题:当您打开 “课程管理” 页面时,现有的课程记录在 “课程学科” 列会显示为纯数字,因为系统无法将数据库中的 'JavaEE' 字符串匹配到字典值 0。
为什么会有这个问题?
这是一个典型的 “历史数据兼容性” 问题。在实际项目中非常常见:
- 设计初期:我们直接在数据库中存储了业务含义明确的字符串
'JavaEE',这样做简单直观。 - 引入数据字典后:为了规范化和便于维护,我们改用数字编码
0、1、2来存储,前端通过字典将其转换为友好的中文标签展示给用户。
解决方案有两种:
方案一:修改数据字典的键值(推荐用于学习)
如果您的系统刚刚起步,数据量还很少,最简单的做法是调整数据字典,让它的 “数据键值” 与数据库现有数据保持一致。
- 返回 系统管理 -> 字典管理。
- 点击
course_subject字典类型,进入字典数据列表。 - 逐一编辑三条字典数据,将它们的 数据键值 修改为:
JavaEE的数据键值改为JavaEE(而不是0)Python的数据键值改为Python(而不是1)HarmonyOS的数据键值改为HarmonyOS(而不是2)
- 保存修改。
这样,数据字典的键值就与数据库中 subject 字段的实际存储值完全一致了,页面可以正常匹配显示。
方案二:修改数据库中的历史数据(推荐用于生产)
如果您希望数据库存储更规范的数字编码(这在大型系统中更常见),则需要更新数据库中的历史数据。
在 Navicat 或其他数据库工具中执行以下 SQL 语句:
1 | UPDATE tb_course SET subject = '0' WHERE subject = 'JavaEE'; |
执行后,数据库中的 subject 字段值就变成了 0、1、2,与我们最初创建的数据字典键值完全对应。
本教程采用方案二,因为它操作更简单,我们的测试数据很少,更适合初学者。在实际项目中,您可以根据具体情况灵活选择。
第六步:修复前端样式问题
覆盖完代码后,您可能会发现 “课程学科” 下拉框显示异常:它可能只显示为一个小方块,无法正常展开选择。这是因为代码生成器生成的 el-select 组件默认没有设置宽度,导致组件收缩。
我们需要手动为下拉框添加宽度样式。
打开项目中的 ruoyi-modern-project/RuoYi-Vue3/src/views/course/Course/index.vue 文件:
位置一:查询表单中的下拉框
找到第 12-21 行左右的查询表单部分,将:
1 | <el-form-item label="课程学科" prop="subject"> |
修改为(在 el-select 标签中添加 style="width: 240px"):
1 | <el-form-item label="课程学科" prop="subject"> |
位置二:新增/编辑对话框中的下拉框
找到第 133-141 行左右的对话框表单部分,将:
1 | <el-form-item label="课程学科" prop="subject"> |
修改为(添加 style="width: 100%"):
1 | <el-form-item label="课程学科" prop="subject"> |
为什么要设置不同的宽度?
- 查询表单是 内联布局 (
inline="true"),各个表单项横向排列,设置固定宽度240px可以保持页面紧凑美观。 - 对话框表单是 垂直布局,表单项纵向堆叠,设置
100%宽度可以让下拉框填充整个表单项区域,与其他输入框保持视觉一致。
保存文件后,下拉框就能正常显示了。
第七步:验证成果
回到您的浏览器,强制刷新“课程管理”页面(可能需要重新登录)。
现在,请观察页面顶部的搜索栏和点击“新增”或“修改”按钮弹出的表单。您会惊喜地发现,原本的“课程学科”文本输入框,已经 神奇地变成了功能完善的下拉选择框!点击它,会清晰地列出我们在数据字典中配置的“JavaEE”、“Python”和“HarmonyOS”三个选项。
实验结论:我们成功地通过数据字典,以一种零编码、纯配置的方式,优化了一个重要的前端交互。这个完整的闭环流程充分证明了数据字典在解耦前后端数据、提升开发效率和系统可维护性方面的巨大价值。现在,您已经完全掌握了若依的这一核心功能。
3.3. 参数设置:系统的动态“开关”
在任何一个正式的软件项目中,我们都会遇到一类特殊的配置项:它们不像数据库地址那样恒定不变,但又不能直接硬编码在代码里,因为业务人员或运维人员可能需要根据实际情况随时调整。
参数设置 功能,正是为了解决这一痛点而设计的。它本质上是一个 存储在数据库中的、全局的键值对(Key-Value)配置中心。通过后台界面,我们可以方便地对这些参数进行动态维护。
使用该功能的核心优势在于:
- 避免硬编码:将易变的业务逻辑值(如“密码最大重试次数”、“是否开启某项活动”)从代码中剥离,提高了代码的可维护性。
- 运行时动态生效:修改参数后,通常只需刷新缓存即可在整个系统中生效,无需重新编译代码或重启服务,这对于生产环境的运维至关重要。
- 配置集中化:所有动态参数都在一个统一的界面进行管理,一目了然。
3.3.1. 实战案例:动态关闭登录验证码
业务场景: 在项目开发和测试阶段,开发人员需要频繁地登录、退出系统进行调试。默认开启的登录验证码虽然增强了安全性,但在这个阶段却大大降低了调试效率。我们的需求是:在不修改任何代码的情况下,为开发环境动态地关闭登录验证码功能。
实现步骤:
- 导航至参数设置
在若依后台,依次点击 系统管理 -> 参数设置。您会看到一个列表,其中包含了系统预设的多个参数。
- 定位目标参数
在参数列表中,找到 参数键名 为sys.account.captchaEnabled的记录。从键名我们可以直观地理解,这个参数就是用来控制“账户验证码是否启用”的。 - 修改参数值
点击该行右侧操作列的 修改 按钮。在弹出的“修改参数”窗口中,将 参数键值 从true修改为false。

清除缓存以使配置生效
点击 确定 保存修改。此时,配置已经更新到了数据库中,但正在运行的系统为了性能,读取的是 Redis 缓存中的旧配置。因此,我们需要执行关键的最后一步:点击页面右上角的 “刷新缓存” 按钮。这个操作会通知系统从数据库重新加载所有配置项到 Redis 中。验证结果
现在,请退出当前admin账户。当您返回到登录页面时,会发现原先的验证码输入框和图片已经消失了,可以直接输入用户名和密码进行登录。
通过这个简单的案例,我们以一种零代码、纯配置的方式,动态地改变了系统的核心行为,这正是“参数设置”功能的强大之处。
3.4. 日志管理:系统操作的全程记录仪
日志是系统安全、问题排查和行为审计的生命线。若依提供了两个开箱即用的日志管理模块,它们就像是安装在系统内部的“黑匣子”和“监控摄像头”,忠实地记录着发生的一切。
3.4.1. 操作日志:行为审计与问题追溯
是什么?
操作日志精确记录了用户在系统中所有 对数据产生变更或执行重要查询 的关键操作。
背后原理:
该功能是通过 Spring AOP(面向切面编程) 和一个自定义的 @Log 注解 实现的。当一个 Controller 方法被 @Log 注解标记后,AOP 切面会自动拦截该方法的调用。在方法执行前后,切面会收集诸如 操作用户、IP 地址、请求 URL、调用方法、传入参数、操作耗时、是否成功 等信息,并将其异步地保存到数据库的 sys_oper_log 表中。
实战联动:追踪“课程管理”的操作记录
- 执行操作: 请您现在导航至 系统工具 -> 课程管理 模块。执行一次 新增 操作,成功添加一条新的课程记录。然后,再执行一次 删除 操作,将这条新记录删除。
- 查看日志: 操作完成后,立刻导航至 系统监控 -> 操作日志。
- 分析结果: 在日志列表的顶部,您会看到两条最新的记录:
- 一条记录的 业务类型 是 “新增”,请求方式 是
POST。点击“详细”按钮,您甚至可以看到当时提交的完整 JSON 数据。 - 另一条记录的 业务类型 是 “删除”,请求方式 是
DELETE。
- 一条记录的 业务类型 是 “新增”,请求方式 是

这个联动的过程清晰地展示了操作日志的价值:它为每一次关键操作都留下了不可否认的证据,无论是用于事后排查问题(“是谁误删了数据?”),还是进行安全审计,都至关重要。
3.4.2. 登录日志:守护系统安全的第一道防线
是什么?
登录日志专门、独立地记录每一次用户登录系统的尝试,无论成功与否。
核心价值:
它是系统安全审计的关键环节。通过分析登录日志,管理员可以:
- 发现异常登录: 例如,在短时间内,同一个账户从多个不同的地理位置 IP 尝试登录,这极有可能是账户被盗或被攻击的迹象。
- 监控失败尝试: 如果一个账户连续多次登录失败,系统可以触发告警或自动锁定该账户,防止暴力破解。
如何使用:
导航至 系统监控 -> 登录日志。这里详细列出了所有登录尝试的账号、状态(成功/失败)、IP 地址、登录地点、浏览器和操作系统信息。

3.5. 通知公告:系统的“广播站”
是什么?
这是一个简单但非常实用的内容发布功能,允许管理员向系统内的用户发布结构化的信息。
核心功能:
- 富文本编辑: 创建公告时,支持使用富文本编辑器,可以方便地设置文本格式、插入图片、超链接等。
- 公告分类: 公告可以被分为不同的类型,如“通知”和“公告”。这个分类本身也是由 数据字典 (
sys_notice_type) 维护的。
实战案例:发布一条版本更新通知
- 导航: 进入 系统管理 -> 通知公告。
- 新增公告: 点击“新增”按钮。
- 填写内容:
- 公告标题:
系统 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)
“目录”扮演着纯粹的 “组织容器” 的角色,用于组织一组相关的菜单,形成清晰的导航层级。

| 关键配置 (UI 字段) | 描述与说明 |
|---|---|
上级菜单 | 指定该目录所属的父节点。选择“主类目”则为顶级目录。 |
菜单图标 | 为目录选择一个在导航栏中显示的图标。 |
菜单名称 | 显示在导航栏中的文本,如“系统管理”。 |
路由地址 | 核心配置。作为所有子菜单的 URL 路径前缀,必须唯一。 |
显示状态 | 控制该目录及其下所有子项是否在导航栏中可见。 |
B. 菜单 (Menu)
“菜单”是用户能与之交互、通往具体功能页面的 “真正入口”。

| 关键配置 (UI 字段) | 描述与说明 |
|---|---|
组件路径 | 核心配置。指向前端 src/views/ 目录下的 .vue 文件路径。 |
权限字符 | 核心配置。连接前后端权限校验的 唯一凭证。 |
路由参数 | (高级) 定义路由的动态参数,如 /user/profile/:userId。 |
是否缓存 | 控制该页面是否被 Vue 的 <keep-alive> 组件缓存,提升二次访问速度。 |
C. 按钮 (Button)
“按钮”是一种 “隐藏的权限节点”,专门用于定义页面内部的具体操作权限。

| 关键配置 (UI 字段) | 描述与说明 |
|---|---|
上级菜单 | 必须选择一个“菜单”类型的父节点,表明该按钮隶属于哪个页面。 |
权限字符 | 核心配置。对应页面上某个按钮的 操作权限,后端用于注解,前端用于指令。 |
菜单名称 | 用于在后台管理时识别此权限,如“用户新增”、“用户修改”。 |
3.6.2. 实战案例:手动创建并重组“课程管理”模块
业务场景: 将“课程管理”模块从“系统工具”中移除,并放置到一个全新的、名为 “教学管理” 的顶级模块下。
第一步:创建新的顶级“目录” - 教学管理
- 导航: 系统管理 -> 菜单管理,点击 新增。
- 配置: 参照下表完成目录的关键信息配置。
| 配置项 (UI 字段) | 填写值 | 目的与说明 |
|---|---|---|
上级菜单 | 主类目 | 创建一个顶级的、没有父级的导航分组。 |
菜单类型 | 目录 | 声明这是一个组织容器,不可跳转。 |
菜单名称 | 教学管理 | 导航栏中显示的文本。 |
路由地址 | education | 定义该模块下所有子页面的 URL 路径前缀。 |
显示排序 | 5 | 控制在同级菜单中的显示顺序。 |
第二步:创建“课程管理”页面“菜单”
- 清理: 先删除原“系统工具”下的“课程管理”相关菜单。
- 新增: 再次点击 新增。
- 配置: 参照下表完成菜单的关键信息配置。
| 配置项 (UI 字段) | 填写值 | 目的与说明 |
|---|---|---|
上级菜单 | 教学管理 | 将此菜单归属于新创建的“教学管理”目录下。 |
菜单类型 | 菜单 | 声明这是一个可点击、链接到页面的入口。 |
路由地址 | course | 定义页面的具体路径,最终 URL 为 /education/course。 |
组件路径 | course/Course/index | 精确指定要加载的前端 Vue 组件文件。 |
权限字符 | course:course:list | 定义访问此页面的核心权限凭证。 |
是否缓存 | 缓存 | 开启页面缓存,提升用户体验。 |
第三步:为新菜单添加“按钮”权限
- 新增: 再次点击 新增。
- 配置: 参照下表,为“新增”操作创建按钮权限。
| 配置项 (UI 字段) | 填写值 | 目的与说明 |
|---|---|---|
上级菜单 | 课程管理 | 将此按钮权限附属于“课程管理”页面。 |
菜单类型 | 按钮 | 声明这是一个页面内部的操作权限,不在导航栏显示。 |
菜单名称 | 课程新增 | 用于在后台管理时识别此权限。 |
权限字符 | course:course:add | 定义“新增”操作的唯一权限凭证。 |
- 重复操作: 参照上表,继续添加 修改 (
course:course:edit)、删除 (course:course:remove) 等其他按钮权限。
第四步:验证成果
- 操作: 点击右上角头像 ->
清除缓存,然后强制刷新浏览器页面。 - 观察: 左侧菜单栏出现新的“教学管理”顶级目录,展开后可点击“课程管理”并正常访问。
- 操作: 点击右上角头像 ->
通过这个手动配置的过程,您已经掌握了如何运用“三位一体”的模型,自由地构建和调整若依系统的功能布局与权限体系。
3.7. 部门管理:构建企业的组织架构树
在完成了对菜单和权限的精细化定义后,我们转向企业管理的另一个核心维度——组织架构。“部门管理”功能正是若依框架中用于构建和维护这一结构的基础模块。
3.7.1. 是什么:超越通讯录的组织核心
“部门管理”远不止是一个简单的“公司通讯录”或部门列表。它是一个以 树形结构 来定义企业内部组织层级的核心功能,为实现复杂的、基于组织汇报关系的管理需求提供了数据基础。

核心价值
部门管理本身只是一个组织结构的定义,但它的真正价值在于 与其他模块的联动,从而实现基于组织架构的数据权限控制和业务流程流转:
| 联动模块 | 实现功能 | 业务场景举例 |
|---|---|---|
| 用户管理 | 用户归属 | 每个用户必须归属于一个部门,这是构建“按部门筛选/统计用户”等功能的基础。 |
| 角色管理 | 数据权限 | 最重要的应用。可以为角色配置不同的数据范围,如“本部门数据权限”、“本部门及以下数据权限”等。 |
| 业务模块 (二次开发) | 数据隔离 | 在 CRM、ERP 等系统中,可以实现销售只能看到本部门的客户,财务只能看到本分公司的账目。 |
| 工作流 (二次开发) | 流程审批 | 定义审批流,如“员工提交 -> 部门经理审批 -> 总监审批”,审批人根据部门层级关系自动确定。 |
数据权限的背后原理
当一个角色被赋予了例如“本部门数据权限”后,若依的后端会通过 AOP 切面 在执行数据库查询时进行拦截。切面会获取当前登录用户的部门 ID,并 自动向正在执行的 SQL 语句动态拼接上 WHERE 条件(例如,AND u.dept_id = 103),从而在数据库层面就完成了数据的过滤,保证了数据权限的安全性与高效性。
他的最重要的用途是在 用户管理 页面提供筛选功能,可以通过筛选去查看不同部门的用户情况,










