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

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

相关推荐
why1518 小时前
腾讯(QQ浏览器)后端开发
开发语言·后端·golang
浪裡遊8 小时前
跨域问题(Cross-Origin Problem)
linux·前端·vue.js·后端·https·sprint
声声codeGrandMaster8 小时前
django之优化分页功能(利用参数共存及封装来实现)
数据库·后端·python·django
呼Lu噜9 小时前
WPF-遵循MVVM框架创建图表的显示【保姆级】
前端·后端·wpf
bing_1589 小时前
为什么选择 Spring Boot? 它是如何简化单个微服务的创建、配置和部署的?
spring boot·后端·微服务
学c真好玩9 小时前
Django创建的应用目录详细解释以及如何操作数据库自动创建表
后端·python·django
Asthenia04129 小时前
GenericObjectPool——重用你的对象
后端
Piper蛋窝9 小时前
Go 1.18 相比 Go 1.17 有哪些值得注意的改动?
后端
excel10 小时前
招幕技术人员
前端·javascript·后端
盖世英雄酱5813610 小时前
什么是MCP
后端·程序员