Blame view

项目相关文档/2026-07-23泰额版当前登录账号菜单接口.md 6.9 KB
acf259d5   李曜臣   2026-07-24
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  # 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\":\"<tenantId>\",\"userName\":\"admin\",\"password\":\"123456\"}"
  
  # 2) 拉当前账号菜单
  curl -G "http://127.0.0.1:19002/api/app/auth-session/my-menus" \
    -H "Authorization: Bearer <token>" \
    -H "__tenant: <tenantId>"
  ```
  
  ### 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 <platform-token>"
  ```
  
  ### 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 / 路径与本文一致