build-flow.admin/docs/BACKEND_INTEGRATION.md
2026-07-23 17:16:04 +08:00

111 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# build-flow.admin 对接 build-flow.api 指南
本文档记录新前端 `build-flow.admin`(Ant Design Pro v6 + React 19 + antd v6)与 .NET 10 后端 `build-flow.api` 的对接细节。
## 1. 后端关键信息
| 项 | 值 | 出处 |
|---|---|---|
| 全局 API 前缀 | `/api` | `BuildFlowHostModule.cs` 中 `config.Endpoints.RoutePrefix = "api"` |
| 本地监听端口 | `5200`(命令行 `--urls` 优先) | `run-dev.sh` |
| 登录接口 | `POST /api/auth/login` | `Endpoints/Platform/Auth/LoginEndpoint.cs` |
| 当前用户 | `GET /api/user/info` | `Endpoints/Platform/Auth/GetCurrentUserEndpoint.cs` |
| 用户菜单 | `GET /api/menu/all` | `Endpoints/Platform/Menus/GetAllMenusEndpoint.cs` |
| 菜单管理树 | `GET /api/menu/tree` | `Endpoints/Platform/Menus/GetMenuTreeEndpoint.cs` |
| Token 类型 | JWT (AccessToken) + HttpOnly Cookie (RefreshToken) | `LoginEndpoint.cs` |
| 响应信封 | `{ code: 200, message, data }` | `ApiResponseMiddleware` |
| 时间格式 | UTC 毫秒时间戳(FastEndpoints 序列化器配置) | `BuildFlowHostModule.cs` |
| 默认拒绝策略 | 任何未显式 `AllowAnonymous` 的端点都需登录 | `BuildFlowHostModule.cs` `FallbackPolicy` |
## 2. 前端启动
```bash
cd build-flow.admin
pnpm install
pnpm start # 默认 dev 模式,监听 http://localhost:8000
# 或:MOCK=none pnpm start 关闭 mock(推荐,避免 demo mock 拦截 /api)
```
代理:`config/proxy.ts` 默认把 `/api/**` 代理到 `http://localhost:5200`。
- 远程后端:`BUILDFLOW_API_TARGET=http://114.132.44.45:5200 pnpm start`
## 3. 后端启动(需 PG/Redis/MongoDB/RabbitMQ 等中间件已起)
```bash
cd build-flow.api
./run-dev.sh # 加载根 .env 后 dotnet run --urls http://localhost:5200
```
## 4. 联调登录清单
按以下顺序验证:
1. **后端 health**:`curl http://localhost:5200/api/auth/login -X POST -H "Content-Type: application/json" -d '{"username":"x","password":"y"}'` 应返回 200 或 400(业务校验错误),而非连接拒绝。
2. **前端代理**:`curl http://localhost:8000/api/auth/login -X POST -H "Content-Type: application/json" -d '{"username":"x","password":"y"}'` 应与上面响应一致。
3. **登录**:浏览器打开 `http://localhost:8000/user/login`,输入后端真实账号密码。
- 成功:`services/ant-design-pro/api.ts` 的 `login()` 把 `accessToken` 写入 `localStorage`,触发 `window.location.href = redirectUrl` 整页刷新。
- 失败:底部 toast 提示。
4. **getInitialState**:刷新后 `src/app.tsx` 检测 token,并行拉 `/user/info` + `/menu/all`,填充 `initialState.currentUser` 和 `initialState.menuRoutes`。
5. **菜单渲染**:`layout.menu.request` 把后端 `MenuRouteDto[]` 转成 `ProLayout MenuDataItem[]`(见 `src/utils/menuTransform.ts`)。
- icon 字符串 `"home"` 会解析为 `<HomeOutlined />`。
- `path` 与静态路由匹配时点击可跳;不匹配时点击进入 404(渐进迁移提示)。
## 5. 字段映射对照表
### 5.1 用户信息(GET /api/user/info → API.CurrentUser)
| 后端 CurrentUserInfo | 前端 API.CurrentUser | 说明 |
|---|---|---|
| UserId | userid | 字符串化 long |
| Username | username | 登录账号 |
| RealName | name, realName | 显示名 |
| Avatar | avatar | 预签名 URL(后端已签) |
| Desc | signature, desc | |
| Email | email | |
| Roles | roles, access | access 由 roles 推断(含 admin → 'admin') |
| HomePath | homePath | 登录后落地页 |
### 5.2 菜单(GET /api/menu/all → API.MenuRoute → ProLayout MenuDataItem)
| 后端 MenuRouteDto | ProLayout 字段 | 说明 |
|---|---|---|
| name | name(作 i18n key,但本工程 locale:false 当文案兜底) | |
| path | path | |
| component | (忽略,由静态 routes.ts 决定) | |
| redirect | redirect | |
| children | routes | 递归转换 |
| meta.title | name(覆盖 i18n) | |
| meta.icon | icon(解析为 antd 图标) | |
| meta.hideInMenu | hideInMenu | |
| meta.link | target(外链) | |
| meta.authority | (前端暂不做按钮级权限,仅用 access.ts 做路由级) | |
| meta.order | (ProLayout 按数组顺序,需后端已 ORDER BY) | GetAllMenusQueryHandler 已 ORDER BY m.Order |
| meta.noBasicLayout | (ProLayout 用 layout: false,待补) | |
| meta.renderType | (BuildFlowForm 模式待补) | Phase 2 |
## 6. 已知限制(Phase 1)
- 静态 routes.ts 仅保留 `/welcome` + `/user/*` + `*`。后端菜单返回的 path 不在静态路由里时点击会 404。
**后续每做一个业务模块,需要:**
1. 在 `src/pages/` 下新建组件
2. 在 `config/routes.ts` 加上 `{ path, component }`(不写 name/icon,让后端菜单控制)
- 后端菜单返回的 `path` 必须与静态路由的 `path` 完全一致(包括前导斜杠、大小写)。
- BuildFlowForm 类型菜单(renderType='BuildFlowForm')的运行时表单渲染尚未实现。
- AccessToken 过期后用 RefreshToken(HttpOnly Cookie)调 `/auth/refresh` 自动续期的逻辑尚未实现(Vben 老前端有,可参考 `build-flow.web/apps/web-antdv-next/src/api/request.ts`)。
## 7. 改造文件清单
| 文件 | 改动 |
|---|---|
| `config/proxy.ts` | 加 dev/test/pre 代理到 5200 |
| `config/defaultSettings.ts` | title=BuildFlow, logo=/logo.svg |
| `config/config.ts` | title=BuildFlow |
| `config/routes.ts` | 简化为 login/welcome/404(业务路由后续补) |
| `src/services/ant-design-pro/typings.d.ts` | 重写 CurrentUser/LoginParams/LoginResult,加 MenuRoute/MenuMeta/ProMenuItem |
| `src/services/ant-design-pro/api.ts` | login→/auth/login, currentUser→/user/info, outLogin→清 token |
| `src/services/ant-design-pro/menu.ts` | 新建:getCurrentUserMenus, getMenuTree |
| `src/utils/menuTransform.ts` | 新建:MenuRouteDto → ProLayout MenuDataItem |
| `src/requestErrorConfig.ts` | JWT 注入、{ code, message, data } 解包、401 跳登录 |
| `src/access.ts` | 基于 roles 判断 canAdmin |
| `src/app.tsx` | 并行拉 user/info + menu/all,layout.menu.request 接入动态菜单 |