RBAC模块分析:菜单-权限/角色-权限/用户-角色

微服务模块的请求链路分析

在这个微服务模块中,我们可以识别出几个核心的请求链路:

  1. 菜单管理相关的请求链路
  2. 菜单权限相关的请求链路
  3. 角色管理相关的请求链路

下面我们将针对这三个请求链路进行详细分析。

1. 菜单管理的请求链路

1.1 获取路由菜单

scss 复制代码
MenuController.route()
  -> MenuService.listBySysType()
    -> MenuMapper.listBySysType()
  1. 用户访问/menu/route接口
  2. MenuController.route()方法被调用
  3. MenuService.listBySysType()方法查询出当前用户有权限访问的菜单列表
  4. MenuMapper.listBySysType()方法从数据库中查询菜单数据

1.2 获取单个菜单

scss 复制代码
MenuController.getByMenuId()
  -> MenuService.getByMenuId()
    -> MenuMapper.getByMenuId()
  1. 用户访问/menu?menuId={id}接口
  2. MenuController.getByMenuId()方法被调用
  3. MenuService.getByMenuId()方法查询指定菜单ID的菜单详情
  4. MenuMapper.getByMenuId()方法从数据库中查询菜单数据

1.3 保存菜单

scss 复制代码
MenuController.save()
  -> MenuService.save()
    -> MenuMapper.save()
  1. 用户访问/menu接口发起保存菜单请求
  2. MenuController.save()方法被调用
  3. MenuService.save()方法保存菜单数据
  4. MenuMapper.save()方法将菜单数据插入数据库

1.4 更新菜单

scss 复制代码
MenuController.update()
  -> MenuService.update()
    -> MenuMapper.update()
  1. 用户访问/menu接口发起更新菜单请求
  2. MenuController.update()方法被调用
  3. MenuService.update()方法更新菜单数据
  4. MenuMapper.update()方法将菜单数据更新到数据库

1.5 删除菜单

scss 复制代码
MenuController.delete()
  -> MenuService.deleteById()
    -> MenuMapper.deleteById()
  1. 用户访问/menu?menuId={id}接口发起删除菜单请求
  2. MenuController.delete()方法被调用
  3. MenuService.deleteById()方法删除指定菜单ID的菜单
  4. MenuMapper.deleteById()方法从数据库中删除该菜单数据

2. 菜单权限的请求链路

2.1 获取菜单下的权限列表

scss 复制代码
MenuPermissionController.listByMenuId()
  -> MenuPermissionService.listByMenuId()
    -> MenuPermissionMapper.listByMenuId()
  1. 用户访问/menu_permission/list_by_menu?menuId={id}接口
  2. MenuPermissionController.listByMenuId()方法被调用
  3. MenuPermissionService.listByMenuId()方法查询指定菜单ID下的权限列表
  4. MenuPermissionMapper.listByMenuId()方法从数据库中查询该菜单下的权限数据

2.2 获取单个菜单权限

scss 复制代码
MenuPermissionController.getByMenuPermissionId()
  -> MenuPermissionService.getByMenuPermissionId()
    -> MenuPermissionMapper.getByMenuPermissionId()
  1. 用户访问/menu_permission?menuPermissionId={id}接口
  2. MenuPermissionController.getByMenuPermissionId()方法被调用
  3. MenuPermissionService.getByMenuPermissionId()方法查询指定菜单权限ID的权限详情
  4. MenuPermissionMapper.getByMenuPermissionId()方法从数据库中查询该权限数据

2.3 保存菜单权限

scss 复制代码
MenuPermissionController.save()
  -> MenuPermissionService.save()
    -> MenuPermissionMapper.save()
  1. 用户访问/menu_permission接口发起保存菜单权限请求
  2. MenuPermissionController.save()方法被调用
  3. MenuPermissionService.save()方法保存菜单权限数据
  4. MenuPermissionMapper.save()方法将菜单权限数据插入数据库

2.4 更新菜单权限

scss 复制代码
MenuPermissionController.update()
  -> MenuPermissionService.update()
    -> MenuPermissionMapper.update()
  1. 用户访问/menu_permission接口发起更新菜单权限请求
  2. MenuPermissionController.update()方法被调用
  3. MenuPermissionService.update()方法更新菜单权限数据
  4. MenuPermissionMapper.update()方法将菜单权限数据更新到数据库

2.5 删除菜单权限

scss 复制代码
MenuPermissionController.delete()
  -> MenuPermissionService.deleteById()
    -> MenuPermissionMapper.deleteById()
  1. 用户访问/menu_permission?menuPermissionId={id}接口发起删除菜单权限请求
  2. MenuPermissionController.delete()方法被调用
  3. MenuPermissionService.deleteById()方法删除指定菜单权限ID的权限
  4. MenuPermissionMapper.deleteById()方法从数据库中删除该菜单权限数据

3. 角色管理的请求链路

3.1 分页获取角色列表

scss 复制代码
RoleController.page()
  -> RoleService.page()
    -> RoleMapper.list()
  1. 用户访问/role/page接口
  2. RoleController.page()方法被调用
  3. RoleService.page()方法查询角色分页数据
  4. RoleMapper.list()方法从数据库中查询角色列表数据

3.2 获取单个角色

scss 复制代码
RoleController.getByRoleId()
  -> RoleService.getByRoleId()
    -> RoleMapper.getByRoleId()
    -> RoleMenuMapper.getByRoleId()
  1. 用户访问/role?roleId={id}接口
  2. RoleController.getByRoleId()方法被调用
  3. RoleService.getByRoleId()方法查询指定角色ID的角色详情
  4. RoleMapper.getByRoleId()方法从数据库中查询角色数据
  5. RoleMenuMapper.getByRoleId()方法查询该角色关联的菜单和权限ID

3.3 保存角色

scss 复制代码
RoleController.save()
  -> RoleService.save()
    -> RoleMapper.save()
    -> RoleMenuMapper.insertBatch()
  1. 用户访问/role接口发起保存角色请求
  2. RoleController.save()方法被调用
  3. RoleService.save()方法保存角色数据
  4. RoleMapper.save()方法将角色数据插入数据库
  5. RoleMenuMapper.insertBatch()方法保存角色与菜单/权限的关联关系

3.4 更新角色

scss 复制代码
RoleController.update()
  -> RoleService.update()
    -> RoleMapper.update()
    -> RoleMenuMapper.deleteByRoleId()
    -> RoleMenuMapper.insertBatch()
  1. 用户访问/role接口发起更新角色请求
  2. RoleController.update()方法被调用
  3. RoleService.update()方法更新角色数据
  4. RoleMapper.update()方法将角色数据更新到数据库
  5. RoleMenuMapper.deleteByRoleId()方法删除该角色之前的菜单/权限关联关系
  6. RoleMenuMapper.insertBatch()方法保存角色与菜单/权限的新关联关系

3.5 删除角色

scss 复制代码
RoleController.delete()
  -> RoleService.deleteById()
    -> RoleMapper.deleteById()
    -> RoleMenuMapper.deleteByRoleId()
    -> UserRoleMapper.deleteByRoleId()
  1. 用户访问/role?roleId={id}接口发起删除角色请求
  2. RoleController.delete()方法被调用
  3. RoleService.deleteById()方法删除指定角色ID的角色
  4. RoleMapper.deleteById()方法从数据库中删除该角色数据
  5. RoleMenuMapper.deleteByRoleId()方法删除该角色与菜单/权限的关联关系
  6. UserRoleMapper.deleteByRoleId()方法删除用户与该角色的关联关系

通过以上对微服务模块的请求链路分析,我们可以清楚地了解各个功能的实现细节。下面我们用时序图的方式总结一下整个模块的核心请求链路:

sequenceDiagram participant Client participant MenuController participant MenuService participant MenuMapper participant MenuPermissionController participant MenuPermissionService participant MenuPermissionMapper participant RoleController participant RoleService participant RoleMapper participant RoleMenuMapper participant UserRoleMapper Client->>MenuController: GET /menu/route MenuController->>MenuService: listBySysType() MenuService->>MenuMapper: listBySysType() MenuMapper-->>MenuService: 菜单列表 MenuService-->>MenuController: 菜单列表 Client->>MenuPermissionController: GET /menu_permission/list_by_menu MenuPermissionController->>MenuPermissionService: listByMenuId() MenuPermissionService->>MenuPermissionMapper: listByMenuId() MenuPermissionMapper-->>MenuPermissionService: 权限列表 MenuPermissionService-->>MenuPermissionController: 权限列表 Client->>RoleController: GET /role/page RoleController->>RoleService: page() RoleService->>RoleMapper: list() RoleMapper-->>RoleService: 角色分页列表 RoleService-->>RoleController: 角色分页列表 Client->>RoleController: GET /role RoleController->>RoleService: getByRoleId() RoleService->>RoleMapper: getByRoleId() RoleMapper-->>RoleService: 角色详情 RoleService->>RoleMenuMapper: getByRoleId() RoleMenuMapper-->>RoleService: 关联菜单权限ID RoleService-->>RoleController: 角色详情 Client->>RoleController: POST /role RoleController->>RoleService: save() RoleService->>RoleMapper: save() RoleMapper-->>RoleService: 保存角色 RoleService->>RoleMenuMapper: insertBatch() RoleMenuMapper-->>RoleService: 保存角色菜单权限关系 Client->>RoleController: PUT /role RoleController->>RoleService: update() RoleService->>RoleMapper: update() RoleMapper-->>RoleService: 更新角色 RoleService->>RoleMenuMapper: deleteByRoleId() RoleMenuMapper-->>RoleService: 删除旧菜单权限关系 RoleService->>RoleMenuMapper: insertBatch() RoleMenuMapper-->>RoleService: 保存新菜单权限关系 Client->>RoleController: DELETE /role RoleController->>RoleService: deleteById() RoleService->>RoleMapper: deleteById() RoleMapper-->>RoleService: 删除角色 RoleService->>RoleMenuMapper: deleteByRoleId() RoleMenuMapper-->>RoleService: 删除角色菜单权限关系 RoleService->>UserRoleMapper: deleteByRoleId() UserRoleMapper-->>RoleService: 删除用户角色关系

通过这个时序图,我们可以清楚地看到整个微服务模块中各个功能的实现流程。每个请求都经过 Controller -> Service -> Mapper 的调用链路,Controller 负责接收和响应请求,Service 负责实现业务逻辑,Mapper 负责数据库操作。这种清晰的职责划分有助于代码的可读性和可维护性。

同时我们还发现,在一些关键的操作中,比如保存/更新角色时,涉及到多个表的数据变更,Service 层会采用事务控制来保证数据一致性。这种设计模式可以很好地避免因并发操作导致的数据不一致问题。

总之,通过对这个微服务模块的请求链路分析,我们对其整体架构和实现细节有了更深入的理解,为后续的功能扩展和性能优化奠定了基础。

相关推荐
Pedantic10 分钟前
为什么 Swift 字符串不能用 `myString[3]` 随便取字符?
前端·后端
Apifox13 分钟前
提交代码后如何自动触发 Apifox 的自动化测试?
前端·后端·测试
程序员NEO16 分钟前
Spring AI 实现让你的 AI “三思而后行”
后端
天下一般17 分钟前
go入门 - day1 - 环境搭建
开发语言·后端·golang
程序员NEO18 分钟前
Spring AI 骚操作:让大模型乖乖听话,直接返回 Java 对象!
人工智能·后端
星辰大海的精灵19 分钟前
FastAPI开发AI应用,多厂商模型使用指南
人工智能·后端·架构
国家不保护废物19 分钟前
前端存储与后端服务的奇妙冒险:一个Node.js服务器的诞生记(cookie实现用户登入)
前端·javascript·后端
绅士玖23 分钟前
🍪 前后端相连小项目实战:Cookic的作用
前端·后端
易元31 分钟前
设计模式-模板方法模式
后端·设计模式
uhakadotcom31 分钟前
刚刚,Golang更新了, 1.24.5 与 Go 1.23.11有啥新能力?
后端·面试·架构