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 层会采用事务控制来保证数据一致性。这种设计模式可以很好地避免因并发操作导致的数据不一致问题。

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

相关推荐
Asthenia041215 分钟前
Spring事件机制:微服务架构下的子服务内部解耦合/多场景代码分析
后端
Asthenia041228 分钟前
面试官问我:Spring AOP的代理模式与实现原理深度剖析
后端
小马爱打代码41 分钟前
Spring Boot - 实现邮件发送
spring boot·后端
褚翾澜42 分钟前
Ruby语言的代码重构
开发语言·后端·golang
你的人类朋友1 小时前
浅谈Object.prototype.hasOwnProperty.call(a, b)
javascript·后端·node.js
仙灵灵2 小时前
前端的同学看过来,今天讲讲jwt登录
前端·后端·程序员
Home2 小时前
一、Java性能优化--Nginx篇(一)
后端
陈随易2 小时前
VSCode v1.99发布,王者归来,Agent和MCP正式推出
前端·后端·程序员
ShooterJ2 小时前
海量序列号的高效处理方案
后端
你的人类朋友2 小时前
CommonJS模块化规范
javascript·后端·node.js