# 2026-07-23 泰额版:当前登录账号菜单接口 本文档说明 **泰额版**「获取当前登录账号菜单」的两套接口:**平台级**与**公司级(租户)**。 > 与「平台给公司配置 SaaS 菜单权限」(`menu-permission-tree` / `company-menus`)不同: > 本文接口返回的是**当前登录人自己可见的菜单**,用于侧边栏 / 动态路由 / 按钮权限。 --- ## 一、对照一览 | 维度 | 平台级 | 公司级(租户业务端) | |------|--------|----------------------| | 适用角色 | 平台管理员(Yi 框架 / 主库账号) | 某公司(租户)下的业务管理员 / 员工 | | 登录接口 | `POST /api/app/account/login` | `POST /api/app/th-web-auth/login`(须带 `tenantId`) | | 拉菜单接口 | `GET /api/app/account/Vue3Router/vben5` | `GET /api/app/auth-session/my-menus` | | 备选 | `GET /api/app/account`(用户+角色+菜单) | — | | 数据来源 | 当前 Account 上下文下的 `menu`(按 `MenuSource` 过滤) | **当前租户业务库** `menu` + 角色菜单 | | 租户上下文 | 一般**无** `__tenant` / JWT TenantId | JWT 含 `TenantId`,建议 Header 再带 `__tenant` | | 实现 | `AccountService.GetVue3Router` | `AuthSessionAppService.GetMyMenusAsync` | **Base URL 示例**:`http://127.0.0.1:19002`(以 `appsettings` / 部署环境为准)。 --- ## 二、公司级:当前登录账号菜单 ### 2.1 接口 | 项 | 值 | |----|------| | 方法 / 路径 | `GET /api/app/auth-session/my-menus` | | 鉴权 | `Authorization: Bearer {token}` | | 租户 | Token 须来自 `th-web-auth/login`;建议同时传 Header `__tenant: {tenantId}` | | 说明 | 返回当前用户角色、权限码、可见菜单树;未识别租户时会报错引导使用泰额登录 | ### 2.2 登录(前置) ```http POST /api/app/th-web-auth/login Content-Type: application/json { "tenantId": "11111111-1111-1111-1111-111111111111", "userName": "admin", "password": "123456" } ``` > 不要用 `POST /api/app/account/login` 作为泰额公司端主登录(无租户会查主库)。 ### 2.3 curl 示例 ```bash # 1) 登录拿 Token curl -X POST "http://127.0.0.1:19002/api/app/th-web-auth/login" \ -H "Content-Type: application/json" \ -d "{\"tenantId\":\"\",\"userName\":\"admin\",\"password\":\"123456\"}" # 2) 拉当前账号菜单 curl -G "http://127.0.0.1:19002/api/app/auth-session/my-menus" \ -H "Authorization: Bearer " \ -H "__tenant: " ``` ### 2.4 出参要点(`CurrentUserMenuPermissionsOutputDto`) | 字段 | 说明 | |------|------| | `user` | 当前用户简要信息 | | `roleCodes` | 角色编码列表 | | `permissionCodes` | 权限码列表(超管常见 `*:*:*`) | | `accessPermissionCodes` | 角色访问权限编码(如 `manage_people`) | | `menus` | 菜单树(`children` 嵌套;根 `parentId` 多为 `"0"`) | | `role` | 角色展示名 | | `fullName` | 全名 | | `lastUpdated` | 系统编辑 / 业务变更相关时间(供前端刷新缓存) | 未带租户上下文时,典型错误提示: > 未识别租户上下文。请使用泰额登录接口(th-web-auth / th-app-auth)或请求头 `__tenant` 携带租户 Id。 --- ## 三、平台级:当前登录账号菜单 ### 3.1 接口(推荐) | 项 | 值 | |----|------| | 方法 / 路径 | `GET /api/app/account/Vue3Router/vben5` | | 鉴权 | `Authorization: Bearer {token}` | | 说明 | 将当前登录用户菜单转为 **Vben5** 前端路由结构 | `routerType` 路径参数: | 值 | 对应 `MenuSourceEnum` | 说明 | |----|----------------------|------| | `vben5`(推荐) | 2 = Vben5 | Vben Admin v5 路由构建 | | `ruoyi` | 0 = Ruoyi | 若依 Vue3 路由构建 | | `pure` | 1 = Pure | vue-pure-admin 路由构建 | | 省略 | 默认按 ruoyi | 与框架历史默认一致 | 完整路径示例: - `GET /api/app/account/Vue3Router/vben5` - `GET /api/app/account/Vue3Router/ruoyi` - `GET /api/app/account/Vue3Router/pure` ### 3.2 备选:账户信息(含菜单) | 项 | 值 | |----|------| | 方法 / 路径 | `GET /api/app/account` | | 鉴权 | 需登录 | | 说明 | 返回 `UserRoleMenuDto`(用户、角色、菜单等),非专门「路由树」格式 | ### 3.3 登录(前置) ```http POST /api/app/account/login Content-Type: application/json { "userName": "admin", "password": "123456" } ``` > 平台主库账号;一般不传 `tenantId`。字段名以 Swagger 为准(历史上 Web 登录可能按邮箱匹配)。 ### 3.4 curl 示例 ```bash # 1) 平台登录 curl -X POST "http://127.0.0.1:19002/api/app/account/login" \ -H "Content-Type: application/json" \ -d "{\"userName\":\"admin\",\"password\":\"123456\"}" # 2) 拉当前账号 Vben5 路由菜单 curl -G "http://127.0.0.1:19002/api/app/account/Vue3Router/vben5" \ -H "Authorization: Bearer " ``` ### 3.5 行为说明 - 按当前用户角色关联菜单过滤;用户名为 `admin` 时框架侧可返回对应 `MenuSource` 下全部菜单再构建路由。 - 只消费 `menu` 表中 `MenuSource` 与 `routerType` 匹配的记录。 --- ## 四、容易混淆的接口(不是「当前登录人菜单」) 以下属于**平台给公司配置权限**,不要当成「当前登录账号菜单」: | 方法 / 路径 | 用途 | |-------------|------| | `GET /api/app/th-multi-tenancy/menu-permission-tree` | SaaS 菜单权限目录树(配置用) | | `GET /api/app/th-multi-tenancy/company-menus` | 查询某公司已开通的 `menuPermissionKeys` | | `PUT /api/app/th-multi-tenancy/company-menus` | 设置某公司 SaaS 菜单权限 | | `GET /api/app/th-rbac-menu/tree` | 租户业务库菜单 **CRUD/管理** 全量树(非会话权限接口) | 详见:`项目相关文档/2026-07-21代码优化.md`、`项目相关文档/2026-07-22代码优化.md`。 --- ## 五、前端对接建议 | 端 | 登录后拉菜单 | |----|----------------| | 公司 / 租户 Web | `th-web-auth/login` → `auth-session/my-menus`;请求始终带 Token + `__tenant` | | 平台管理端(Vben5) | `account/login` → `account/Vue3Router/vben5` | | Token 混用 | 禁止:公司 Token 调平台路由,或平台 Token 调 `my-menus`(缺租户会失败) | --- ## 六、相关代码位置 | 角色 | 路径 | |------|------| | 公司级菜单 | `food-labeling-us/.../AuthSessionAppService.cs` → `GetMyMenusAsync` | | 公司级登录 | `FoodLabeling.Th.Application/.../ThWebAuthAppService.cs` | | 平台级路由 | `Yi.Framework.Rbac.Application/.../AccountService.cs` → `GetVue3Router` | | 平台级登录 | 同 `AccountService` 登录接口 | --- ## 七、自检清单 - [ ] 公司端:用 `th-web-auth/login` 拿到 Token 后再调 `auth-session/my-menus` - [ ] 公司端:Header 含 `__tenant` 或 JWT 内 `TenantId` 有效 - [ ] 平台端:用 `account/login` 后再调 `account/Vue3Router/vben5` - [ ] 未把 `company-menus` / `menu-permission-tree` 误当作当前登录人菜单 - [ ] Swagger 中确认实际 Host / 路径与本文一致