52 lines
2.6 KiB
Markdown
52 lines
2.6 KiB
Markdown
## Why
|
||
|
||
当前登录接口只返回扁平的权限码列表 `permissions: []`,前端需要额外处理才能渲染侧边栏菜单(需要树形结构)和控制按钮显示(需要按钮权限列表)。这导致前端需要额外请求菜单接口或在本地维护菜单配置,增加了复杂度和请求次数。通过在登录时直接返回分类好的菜单树和按钮权限,前端可以一次性获取所有必要数据并存储到 localStorage,无需二次请求,简化前端实现并提升用户体验。
|
||
|
||
## What Changes
|
||
|
||
- 在 `LoginResponse` DTO 中新增两个字段:
|
||
- `menus: []MenuNode` - 菜单树(树形结构)
|
||
- `buttons: []string` - 按钮权限码列表(扁平)
|
||
- 新增 `MenuNode` DTO 结构体,包含 `id`, `perm_code`, `name`, `url`, `sort`, `children` 字段
|
||
- 修改 `auth.Service.Login()` 方法,新增权限分类逻辑:
|
||
- 基于 `perm_type` 字段分类(1=菜单权限,2=按钮权限)
|
||
- 根据 `device` 参数过滤平台(`platform=web/h5/all`)
|
||
- 构建菜单树(基于 `parent_id` 字段的递归结构)
|
||
- 超级管理员返回所有菜单和按钮
|
||
- 保留原有 `permissions` 字段(向后兼容,包含所有权限码)
|
||
- `GetMe` 接口保持不变(不返回菜单,避免频繁查询)
|
||
|
||
## Capabilities
|
||
|
||
### New Capabilities
|
||
|
||
- `login-menu-button-response`: 登录接口返回菜单树和按钮权限,支持前端直接使用无需二次处理
|
||
|
||
### Modified Capabilities
|
||
|
||
(无现有能力被修改,这是新增功能)
|
||
|
||
## Impact
|
||
|
||
**修改的文件**:
|
||
- `internal/model/dto/auth_dto.go` - 新增 MenuNode 结构体,修改 LoginResponse 结构体
|
||
- `internal/service/auth/service.go` - 修改 Login() 方法,新增权限分类和菜单树构建逻辑
|
||
|
||
**API 变更**(向后兼容):
|
||
- `POST /api/admin/login` - 响应体增加 `menus` 和 `buttons` 字段
|
||
- `POST /api/h5/login` - 响应体增加 `menus` 和 `buttons` 字段
|
||
- `GET /api/admin/me` - 保持不变(不返回菜单)
|
||
- `GET /api/h5/me` - 保持不变(不返回菜单)
|
||
|
||
**数据库影响**:
|
||
- 无需修改数据库 schema(复用现有 `tb_permission` 表的 `perm_type`, `parent_id`, `platform` 字段)
|
||
|
||
**前端影响**:
|
||
- 可选升级:前端可以选择使用新的 `menus` 和 `buttons` 字段,也可以继续使用 `permissions` 字段(向后兼容)
|
||
- 推荐使用方式:登录后将 `menus` 和 `buttons` 存储到 localStorage,页面刷新时从本地读取
|
||
|
||
**性能影响**:
|
||
- 登录响应体增大(预计增加 5-10KB,取决于权限数量)
|
||
- 菜单树构建计算量增加(O(n) 复杂度,n 为权限数量,通常 < 100)
|
||
- 不影响 GetMe 接口性能(未修改)
|