第七章. 系统管理(一):用户管理细节剖析

第七章. 系统管理(一):用户管理细节剖析

摘要:本章我们将深入 RVP 框架的核心——用户管理。我们将以实战演练的方式,逐一操作从搜索、新增、修改、删除到批量导入导出的所有功能,彻底理解部门、岗位、角色、用户四大组织架构要素是如何在系统中协同工作的。


本章学习路径

我们将以一个后台管理员的视角,按照实际操作流程来“解剖”用户管理模块:

用户管理模块实操解析

学习建议

  • 用户管理 是 RVP 系统中 功能最复杂、联动最多 的页面。请务必亲自动手操作,特别是 7.3 节的“部门岗位联动”和 7.4 节的“状态权限变更”,这是理解 RVP 权限设计的关键。

7.1. 界面总览与搜索过滤

在第六章中,我们已经对 plus-ui 前端项目的“地图”有了全面的认识,知道了 viewsapistore 各自的职责。现在,我们正式以后台管理员(如 admin 账号)的身份登录系统,开始探索 RVP 功能较为核心的管理页面——用户管理。本节我们的目标是熟该页面的整体布局,并熟练掌握其强大的数据筛选功能。

登录系统后,我们点击左侧菜单栏的 系统管理 -> 用户管理

7.1.1. 用户管理界面布局

呈现在我们面前的页面,是 RVP 组织架构管理的核心中枢。我们可以清晰地将其划分为四大功能区域:

  1. 部门筛选区(左侧):以树形结构展示当前租户下的所有部门。
  2. 多条件搜索区(顶部):提供基于用户属性的精确搜索。
  3. 功能操作区(中上):提供“新增”、“修改”、“删除”、“导入/导出”等主要操作按钮。
  4. 用户列表区(主体):以表格和卡片形式展示筛选后的用户数据。

image-20251109100746075

7.1.2. 筛选(一):部门树筛选

左侧的“部门树”是组织架构的快速导航。它允许我们通过点击部门,快速筛选出 该部门及其所有子部门 下的用户。

  • 操作
    1. 点击根节点(如 “XXX 科技”),列表将显示 所有 用户。
    2. 点击父节点(如 “深圳总公司”),列表将只显示“深圳总公司”及其子部门(如“研发部”、“市场部”)的用户。
    3. 点击叶子节点(如 “研发部”),列表将只显示“研发部”的用户(如 admin)。

7.1.3. 筛选(二):多条件搜索与重置

顶部的搜索区提供了更精细的“服务端过滤”能力。它支持多个条件 同时生效(AND 关系),是对部门树筛选结果的“二次过滤”。

  • 支持的搜索条件

  • 用户名称:按用户账号(user_name)模糊搜索。
    * 手机号码:按手机号(phonenumber)模糊搜索。
    * 状态:按用户当前状态(status,如“正常”或“停用”)精确筛选。
    * 创建时间:通过日期范围选择器,筛选出在特定时间区间内创建的用户。

    • 操作流程

      1. 输入条件(如用户名称 “test”)。
      2. 点击 搜索 按钮,列表刷新,展示搜索结果。
      3. 输入多个条件(如手机号 “158…”)。
      4. 点击 重置 按钮,所有搜索框(用户名称、手机、状态、时间)被清空,列表恢复到搜索前的状态。

7.1.4. 工具栏操作(隐藏搜索、刷新、显隐列)

在列表区域的右上方,还提供了三个便捷的辅助工具:

  1. 隐藏/显示搜索:点击该图标,可以 收起/展开 顶部的“多条件搜索区”。当我们需要更大的列表可视空间时非常有用。
  2. 刷新:点击后,重新向后端发起请求,刷新当前页面的用户列表数据。
  3. 显隐列:点击后,弹出一个复选框列表,允许我们 临时 控制表格中哪些列(如“用户编号”、“手机号”、“创建时间”)需要显示或隐藏。

注意:“显隐列”功能是 临时性 的。当我们修改了显示列(例如隐藏了“手机号”)之后,如果 刷新浏览器页面(F5),所有列会恢复到默认显示状态。这个设置并不会被保存。


7.1.5. 本节小结

我们熟悉了“用户管理”页面的布局和核心筛选功能,这是后续所有操作的基础:

  • 四大区域:界面分为 部门筛选区多条件搜索区功能操作区用户列表区
  • 两种筛选
    • 部门树:用于按组织架构快速筛选。
    • 搜索栏:用于按用户属性(账号、手机、状态等)进行二次精确筛选。
  • 辅助工具隐藏搜索 用于优化布局,刷新 用于同步数据,显隐列 用于临时控制表格列。

7.2. 核心操作(一):新增用户

在上一节中,我们已经熟练掌握了用户管理界面的四大区域,并学会了如何使用部门树和搜索栏快速筛选数据。筛选数据只是第一步,管理的“增、删、改、查”才刚刚开始。本节我们将开始第一个核心实战操作:在系统中创建一个全新的用户。

7.2.1. 填写用户表单

在“功能操作区”,我们点击第一个 新增 按钮,系统会弹出一个“添加用户”的模态框。

image-20251109101115135

这个表单是创建新用户的入口。在 RVP 5.x 中,为了保证数据的完整性,系统默认设置了四个必填项(字段前有红色 * 号):

  1. 用户昵称 (nick_name):用户的显示名称,例如 “Prorise”,作为用户在 dashboard 页面的显示名称,可以修改
  2. 用户名称 (user_name)[关键] 用户的唯一 登录账号。这个账号在整个系统中必须是唯一的,可以是中文或英文,例如 “Prorise”。
  3. 用户密码 (password):用户的初始登录密码。系统默认提供了一个(例如 123456),可以自行修改。
  4. 角色 (role_ids)[关键] 这是权限的核心。一个用户必须至少被分配一个角色,他才能在登录后拥有对应的菜单和操作权限。如果一个用户没有角色,他登录后将是一个“空”系统,几乎一无所获。

我们来实际创建一个用户:

image-20251109101327210

填写完毕后,点击 确定。系统提示“新增成功”,我们就能在用户列表中看到这条新数据。

7.2.2. 登录验证:验证新用户的权限与菜单

用户创建成功,我们必须立即验证他的权限是否符合预期。

我们打开一个新的浏览器(或使用浏览器的“无痕模式”),访问登录页。

  • 账号:Prorise
  • 密码:123456
  • 验证码:正常填写

点击 登录

image-20251109101734725

登录成功后,我们观察左侧菜单栏。由于我们在 7.2.1 步骤中只为他分配了“仅本人”这个角色,该角色只关联了“测试菜单”。因此,Prorise 用户登录后,只能 看到“测试菜单”及其子菜单,而看不到“系统管理”等其他核心模块,这完全符合我们在 RBAC 权限模型中(第四章)学到的设计。


7.2.3. 本节小结

我们完成了“新增用户”的实战操作,并验证了其权限:

  • 操作路径:点击“新增”按钮,打开模态框。
  • 核心必填项用户昵称用户名称(唯一登录账号)、用户密码角色
  • 权限关键角色 是必填的,因为它直接决定了新用户登录后能看到哪些菜单、操作哪些功能。

实操任务

  • 基础任务(必做)
    1. 按照本节步骤,自行创建一个新用户,用户名称自定(如 test_user)。
    2. 为这个新用户分配 “本部门及以下” 角色。
  • 进阶挑战(选做)
    1. 登出 admin 账号,使用你新创建的 test_user 账号登录。
    2. 验证 test_user 是否能看到“系统管理”菜单,并尝试能否(a)查看用户列表,(b)新增其他用户。

7.3. 核心操作(二):修改用户

在上一节中,我们成功创建了一个新用户 Prorise 并验证了他的登录权限。但在实际工作中,用户的归属部门、昵称、岗位等信息是经常发生变更的。本节我们就来学习如何修改一个已存在的用户信息,并重点关注 5.x 架构中一个非常重要的变更点。

我们回到 admin 管理员界面。有两种方式可以触发“修改”操作:

  1. 批量触发:在列表中 勾选 一个用户(只能选一个),顶部的“功能操作区”中的 修改 按钮会从灰色变为可用状态,点击它。
  2. 单行触发:直接点击用户数据行右侧的 修改(铅笔)图标。

7.3.1. 编辑用户信息

我们点击 Prorise 用户右侧的 修改 图标,打开“修改用户”模态框。

我们会立刻发现一个关键点:“用户名称”(即登录账号)字段是灰色的,不可修改。

这是 RVP 框架为了保证数据完整性而做的 有意设计user_name(用户名称)是用户登录的唯一凭证,也是数据库中关联各种权限数据的“主键”之一。一旦在界面上被随意修改,极易造成数据混乱(例如旧的日志找不到对应的用户)。

image-20251109101916432

注意:如果业务上 必须 修改用户的登录账号,唯一的方式是 直接去数据库 sys_user 表中修改 user_name 字段

虽然账号不能改,但其他信息如“用户昵称”是可以修改的。我们将 Prorise 的昵称从 “Prorise” 修改为 “Esirorp”,点击 确定

验证:我们切换到 Prorise 已登录的浏览器,点击右上角头像 -> “个人中心”,可以看到其用户昵称已经成功刷新为 “Esirorp”。

7.3.2. 关键变更:5.x 架构下“部门”与“岗位”的联动关系

在 4.x 版本的 RVP 中,“岗位”和“部门”是 解耦 的,这会导致一个不合理的情况:我们可以给一个“研发部”的员工,分配一个“财务部”的“会计”岗位,这在组织架构上是混乱的。

RVP 5.x 彻底解决了这个问题,实现了“岗位必须归属于部门”的强关联设计。

我们在 Prorise 的“修改用户”模态框中来验证这一点:

  1. 不选部门,看岗位:此时“归属部门”为空,我们直接点击“岗位”下拉框,会发现它是 空的,没有任何岗位可选。

  2. 选择部门,再看岗位:我们先为 Prorise 选择“归属部门”为 “XXX 科技 -> 深圳总公司 -> 研发部”。

  3. 动态加载岗位:再次点击“岗位”下拉框。此时,系统会 动态加载只显示 归属于“研发部”的岗位(例如 “董事长”、“项目经理”)。

这个设计是 5.x 架构在数据模型上(sys_post 表关联了 sys_dept)的巨大进步,它从根本上保证了组织架构数据的 逻辑正确性


7.3.3. 本节小结

我们掌握了修改用户功能,并重点理解了 5.x 架构的部门岗位联动:

  • 触发方式:可通过 顶部按钮(需勾选)或 行内按钮 触发。
  • 核心限制用户名称(登录账号) 在 UI 界面 默认不可修改,这是为了保证数据一致性。
  • 5.x 关键特性岗位部门强关联 的。必须先为用户选择“归属部门”,系统才会动态加载该部门下的可用“岗位”列表。

7.4. 权限与安全操作

在上一节中,我们成功修改了用户 Prorise 的基本信息,并掌握了 5.x 架构下“部门-岗位”的联动设计。然而,用户信息只是基础,权限 才是后台管理的核心。一个用户的角色、密码和状态,直接决定了系统的安全边界。本节我们将深入用户管理中最重要的安全操作:分配角色、重置密码和启/停用。

7.4.1. 分配角色(支持多角色)

我们在“新增用户”时已经为用户分配了角色,但 RVP 也提供了独立的、更快捷的分配入口。在 Prorise 用户的数据行右侧,我们点击 分配角色 按钮。

系统会弹出一个“分配角色”模态框,列出当前系统所有可用的角色。

RVP 5.x 支持一个用户拥有 多个角色。用户的最终权限,是其所有角色所拥有权限的 并集

  • 操作
    1. 我们为 Prorise 用户同时勾选“本部门及以下”和“仅本人”两个角色。
    2. 点击 提交
  • 验证
    1. 我们再次点击该用户的 修改 按钮。
    2. 在表单中,可以看到“角色”字段已经显示该用户同时拥有了两个角色。

image-20251109102620259

7.4.2. 重置密码

当用户忘记密码时,管理员需要为其重置。

  • 操作
    1. 点击 Prorise 用户数据行右侧的 重置密码(钥匙)图标。
    2. 在弹出的模态框中,输入新密码(例如 666666)。
    3. 点击 确定,提示“修改成功”。

该用户下次登录时,就必须使用新密码 666666

image-20251109102636996

7.4.3. 启用与停用(状态切换)及登录验证

“停用”是比“删除”更常用的管理手段。它可以临时冻结一个账号,使其无法登录系统,但保留其所有数据。

image-20251109102659938

  • 操作(停用)

    1. Prorise 用户当前的状态为“正常”。
    2. 我们点击状态栏的 绿色开关
    3. 系统弹出确认框:“确认要停用用户’Prorise’吗?”
    4. 点击 确定
  • 验证

    1. 我们切换到 Prorise 所在的浏览器,尝试重新登录(如果已退出)。
    2. 输入账号 Prorise 和密码 666666
    3. 系统提示:“错误:该账号已被禁用,请联系管理员”。
  • 操作(启用)

    1. 回到 admin 界面,Prorise 用户的状态开关已变为 灰色(停用)。
    2. 再次点击该 灰色开关,确认“启用用户’Prorise’”。
    3. 点击 确定
  • 验证

    1. 切换回 Prorise 浏览器,再次尝试登录。
    2. 登录成功,系统恢复访问。

7.4.4. 重点:停用“已登录”用户的权限状态分析

一个在企业管理中非常常见的场景:员工 A 正在系统中操作,此时管理员因故紧急停用了员工 A 的账号。会发生什么?

我们来模拟这个关键场景:

  1. 用户 Prorise 已登录Prorise 保持登录状态,并且可以看到“测试菜单”。
  2. 管理员强制停用admin 管理员在用户管理界面,将 Prorise 的状态 切换为“停用”
  3. Prorise 浏览器状态(关键)
    • Prorise 并不会 被立刻强制踢出系统。
    • 仍然可以 点击他已经加载出来的页面(例如 首页),因为这是前端的 路由缓存
    • 但是,当他尝试进行一次 需要后端鉴权 的操作时(例如,点击“测试单表”菜单,向后端发起获取数据的请求)。
  4. 后端拦截
    • 后端 Sa-Token 框架在收到请求时,不仅会校验 Token 是否有效,还会 实时检查Token 对应的用户 状态是否为“正常”
    • 此时后端发现 Prorisestatus 已被设为“停用”,于是 拒绝 了此次请求。
  5. 前端表现
    • Prorise 的界面会收到一个“没有操作权限”或类似的错误提示。
    • 此时如果 Prorise 退出登录,他将 无法再次登录,直到管理员将其重新启用。

这个机制确保了 RVP 的安全性:用户的状态变更是准实时的,它会在用户下一次发起后端请求时立即生效,阻止其进一步操作。


7.4.5. 本节小结

我们掌握了用户管理中至关重要的三项安全操作:

  • 分配角色:一个用户可以拥有 多个角色,权限是所有角色的 并集
  • 重置密码:管理员可以通过“重置密码”功能,强制为用户设置新密码。
  • 启/停用状态
    • 停用用户会使其 无法登录 系统。
    • 对于 已登录 的用户,停用操作会在其 下一次请求后端 时生效,阻止其后续操作。

7.5. 核心操作(三):删除用户

在上一节中,我们掌握了停用/启用用户这种“软”控制手段。但在某些情况下,如员工离职,我们需要从系统中“硬”删除一个账号。本节我们将学习如何删除用户,并理解 RVP 5.x 中“逻辑删除”的概念。

7.5.1. 单行删除 vs 批量删除

与“修改”操作类似,RVP 提供了两种删除用户的途径:

  1. 批量删除(顶部按钮)

    • 操作:在用户列表中,勾选 一个或 多个 用户(例如 Prorisetest)。
    • 顶部的 删除 按钮变为可用状态。
    • 点击 删除,系统会弹出确认框,列出所有即将被删除的用户名。
    • 优势:可以一次性清除多个账号。
  2. 单行删除(行内按钮)

    • 操作:直接点击 Prorise 用户数据行右侧的 删除(垃圾桶)图标。
    • 系统弹出确认框:“确认要删除用户’Prorise’吗?”
    • 优势:操作更直接,用于删除单个特定用户。

7.5.2. 理解“逻辑删除”

无论使用哪种方式,我们点击 确定 删除 Prorise 用户后,他会立即从前端列表中消失。

最关键 的一点是:数据真的被从数据库中物理删除了吗?

答案是:没有。

RVP 框架默认采用的是“逻辑删除”(也称“软删除”)。这是一种企业级的最佳实践,它并不会执行 DELETE FROM sys_user ... 语句,而是执行一条 UPDATE sys_user SET del_flag = '2' WHERE user_id = ... 语句。

  • del_flag = '0' 代表 “存在”。
  • del_flag = '2' 代表 “已删除”。

为什么采用逻辑删除?

  1. 数据可追溯:保留了用户的操作日志、订单记录等所有历史关联数据。如果物理删除,这些历史记录将成为“孤儿数据”,导致报表和审计出错。
  2. 数据可恢复:如果管理员误删了某个重要账号,运维人员可以直接登录数据库,将该用户的 del_flag 状态从 '2' 修改回 '0',实现“一键恢复”。
  3. 安全性:防止恶意操作或误操作导致生产数据永久丢失。

7.5.3. 本节小结

我们掌握了删除用户的操作,并理解了其背后的“逻辑删除”机制:

  • 两种操作:可通过 顶部按钮(需勾选)实现 批量删除,或通过 行内按钮 实现 单行删除
  • 核心机制:RVP 默认采用“逻辑删除”。数据 不会 被物理删除,而是将其 del_flag 标记为“已删除”状态。
  • 核心价值:保证了数据的 可追溯性可恢复性,是企业级系统的安全基石。

7.6. 批量导入与导出

在 7.2 至 7.5 节中,我们演练了所有“手动”管理用户的操作(增、改、删、权限)。但在系统初始化或季度性组织架构调整时,手动处理成百上千的用户是不现实的。本节我们将学习 RVP 提供的强大“批处理”工具:使用 Excel 导入和导出用户。

7.6.1. 导出:导出用户数据

这是一个非常直接的功能,用于将当前系统的用户数据备份到本地。

image-20251109102850813

  • 操作
    1. 点击“功能操作区”的 更多 按钮。
    2. 在下拉菜单中选择 导出数据
    3. 系统会根据你当前的筛选条件(如果在搜索栏或部门树有筛选的话),生成一个 用户数据.xlsx 文件并下载。

image-20251109103039533

7.6.2. 导入(新增):下载模板、必填项与导入失败排查

“导入”功能允许我们通过 Excel 模板批量创建新用户。

  • 操作流程
    1. 点击 更多 -> 导入数据
    2. 在弹出的“用户导入”模态框中,首先点击 下载模板,获取 用户导入模板.xlsx
    3. 打开模板,我们会看到 *登录名称*用户名称 等字段。

image-20251109103119298

失败演练(缺少必填项):我们尝试只填写“登录名称”,例如 Prorise,然后保存 Excel。返回 RVP 界面,上传该文件并点击 确定。系统提示 导入失败,错误信息很明显,用户必须要拥有他的唯一用户名称”。

image-20251109103622229

image-20251109103254388

成功演练(导入新增)

  1. 我们打开模板,填入两个必填字段:
    • 登录名称Prorise12
    • 用户名称Prorise12
  2. 保存文件。
  3. 回到 RVP 界面,重新上传该文件,点击 确定
  4. 系统提示“导入成功”,我们刷新列表,新用户 Prorise12 已成功创建。

image-20251109103650098

7.6.3. 导入(更新):使用“是否更新支持”选项

“导入”功能不仅能新增,还能 批量更新。这个操作通常与“导出”配合使用。

  • 操作流程

    1. 导出:首先执行 7.6.1 节的“导出数据”操作,得到包含所有用户(如 Prorise12)的 Excel 文件。
    2. 修改:打开导出的文件,将 Prorise12 的“用户名称”(昵称)修改为 “Prorise13”,然后保存。
    3. 导入(失败演练)
      • 回到 RVP,点击 导入数据,上传这个 被修改过 的文件。
      • 保持“是否更新支持”为未勾选状态
      • 点击 确定。系统提示导入失败:“登录账号 ‘Prorise12’ 已存在”。这是因为 RVP 默认导入是“新增”模式,Prorise12 账号已存在,导入被阻止。

    image-20251109104039048

导入(成功演练):再次点击 导入数据,上传文件。

  • [关键] 勾选 “是否更新支持” 复选框。

image-20251109104148502


7.6.4. 本节小结

我们掌握了用户管理的批量操作,这是提升运维效率的关键:

  • 导出数据:用于备份和作为“批量更新”的模板。
  • 导入(新增):需下载模板,登录名称 (账号) 和 用户名称 (昵称) 是最小必填项。
  • 导入(更新):必须 勾选“是否更新支持” 选项,RVP 才会根据“登录名称”去匹配并更新已有数据。

7.7. 特殊用户:超级管理员 (admin)

在 7.2 至 7.6 节中,我们对 ProriseProrise12 等普通用户执行了各种操作。但系统中还有一个最特殊的用户——admin(用户编号 1)。本节我们将探讨 RVP 框架对这个“超级管理员”账号设置的特殊安全限制。

7.7.1. 界面限制(无“操作”按钮)

我们回到用户管理列表,找到 admin 用户(通常是第一条数据)。

我们会立即发现一个最明显的区别:admin 用户的数据行右侧,是空的!

所有其他用户拥有的“修改”、“删除”、“重置密码”、“分配角色”等 所有操作按钮,在 admin 用户这里全被 隐藏 了。

7.7.2. 导入限制(禁止操作超级管理员)

我们可能会想:既然界面上不能操作,我是否可以通过 7.6.3 节的“导入更新”功能来修改 admin 呢?

我们来演练一下:

  1. 导出 数据,得到包含 admin 用户的 Excel。
  2. 修改 admin 用户的“用户名称”(昵称)或“手机号码”。
  3. 导入 该文件,并 勾选“是否更新支持”
  4. 点击 确定

在导入结果中,系统会明确提示 admin 导入失败:“超级管理员用户是不允许操作的”。

7.7.3. 唯一维护路径:通过数据库修改 admin 用户

RVP 框架在 代码层面(前端 UI 和后端 API)都 写死了限制,禁止通过应用本身来操作 admin 账号。

为什么这样设计?
这是一种“防锁死”和“最高权限保护”的安全机制。它防止了任何管理员(包括 admin 自己)通过界面误操作(如误删除、误停用、误修改角色)导致 唯一 的超级管理员账号被锁定或权限丢失,从而使整个系统无人可管。

如何维护 admin
RVP 框架的设计哲学是:admin 账号的变更,必须由 拥有服务器和数据库最高权限 的“运维人员”来执行,这是一种权限升级确认。

唯一 的维护路径是:

  1. 使用数据库客户端(如 Navicat)登录数据库。
  2. 打开 sys_user 表。
  3. 直接在表中修改 admin 用户(user_id = 1)的数据,例如修改其 phonenumber(手机号)字段。
  4. 保存修改。
  5. 回到 RVP 界面刷新,会发现 admin 的手机号已经成功变更。

7.7.4. 本节小结

我们了解了 admin 超级管理员账号的特殊性:

  • 界面限制admin 用户在 UI 界面上 没有任何操作按钮(修改、删除、重置密码等)。
  • 导入限制:通过 Excel 导入更新的方式也 无法 操作 admin 账号。
  • 设计目的:“防锁死”机制,保护系统唯一的超级管理员不被误操作导致系统失控。
  • 唯一路径:对 admin 账号的任何修改(如改手机号、重置密码),都 必须 通过 直连数据库 进行操作。