feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes: - Add StreamingService with OpenAI Compatible format - Upgrade Chat component V2 with Ant Design X integration - Implement AIA module with 12 intelligent agents - Update API routes to unified /api/v1 prefix - Update system documentation Backend (~1300 lines): - common/streaming: OpenAI Compatible adapter - modules/aia: 12 agents, conversation service, streaming integration - Update route versions (RVW, PKB to v1) Frontend (~3500 lines): - modules/aia: AgentHub + ChatWorkspace (100% prototype restoration) - shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook - Update API endpoints to v1 Documentation: - AIA module status guide - Universal capabilities catalog - System overview updates - All module documentation sync Tested: Stream response verified, authentication working Status: AIA V2.0 core completed (85%)
This commit is contained in:
@@ -1,29 +1,29 @@
|
||||
# 璅∪<E79285>霈方<E99C88>閫<EFBFBD><E996AB>
|
||||
|
||||
> 本文档定义了业务模块如何正确使用平台认证能力,确保所有 API 都正确携带和验证用户身份。
|
||||
> <EFBFBD>祆<EFBFBD>獢<EFBFBD><EFBFBD>銋劐<EFBFBD>銝𡁜𦛚璅∪<EFBFBD>憒<EFBFBD><EFBFBD>甇<EFBFBD>&雿輻鍂撟喳蝱霈方<EFBFBD><EFBFBD>賢<EFBFBD>嚗𣬚&靽脲<EFBFBD><EFBFBD>?API <20>賣迤蝖格𡉼撣血<E692A3>撉諹<E69289><E8ABB9>冽<EFBFBD>頨思遢<E6809D>?
|
||||
|
||||
## 1. <20>嗆<EFBFBD>璁<EFBFBD><E79281>
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 前端 │
|
||||
│ ┌─────────────────────────────────────────────────────┐ │
|
||||
│ │ common/api/axios.ts ← 带认证的 axios 实例 │ │
|
||||
│ │ framework/auth/api.ts ← Token 管理 (getAccessToken)│ │
|
||||
│ └─────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
│ Authorization: Bearer <token>
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 后端 │
|
||||
│ ┌─────────────────────────────────────────────────────┐ │
|
||||
│ │ common/auth/auth.middleware.ts │ │
|
||||
│ │ - authenticate: 验证 JWT Token │ │
|
||||
│ │ - requirePermission: 权限检查 │ │
|
||||
│ │ - requireRoles: 角色检查 │ │
|
||||
│ └─────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
<EFBFBD>? <EFBFBD>滨垢 <EFBFBD>?
|
||||
<EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
|
||||
<EFBFBD>? <20>? common/api/axios.ts <EFBFBD>?撣西恕霂<E68195><E99C82> axios 摰硺<EFBFBD> <EFBFBD>? <20>?
|
||||
<EFBFBD>? <20>? framework/auth/api.ts <EFBFBD>?Token 蝞∠<EFBFBD> (getAccessToken)<EFBFBD>? <20>?
|
||||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
|
||||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
<EFBFBD>?
|
||||
<EFBFBD>?Authorization: Bearer <token>
|
||||
<EFBFBD>?
|
||||
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
<EFBFBD>? <EFBFBD>𡒊垢 <EFBFBD>?
|
||||
<EFBFBD>? <20>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
|
||||
<EFBFBD>? <20>? common/auth/auth.middleware.ts <EFBFBD>? <20>?
|
||||
<EFBFBD>? <20>? - authenticate: 撉諹<EFBFBD> JWT Token <EFBFBD>? <20>?
|
||||
<EFBFBD>? <20>? - requirePermission: <EFBFBD><EFBFBD><EFBFBD>璉<EFBFBD><EFBFBD>? <EFBFBD>? <20>?
|
||||
<EFBFBD>? <20>? - requireRoles: 閫坿𠧧璉<EFBFBD><EFBFBD>? <EFBFBD>? <20>?
|
||||
<EFBFBD>? <20>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20>?
|
||||
<EFBFBD>婙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
```
|
||||
|
||||
## 2. <20>滨垢閫<E59EA2><E996AB>
|
||||
@@ -34,12 +34,12 @@
|
||||
// 撖澆<E69296>撣西恕霂<E68195><E99C82> apiClient
|
||||
import apiClient from '../../../common/api/axios';
|
||||
|
||||
// 使用方式与 axios 完全相同,自动携带 JWT Token
|
||||
// 雿輻鍂<EFBFBD>孵<EFBFBD>銝?axios 摰<><E691B0><EFBFBD>詨<EFBFBD>嚗諹䌊<E8ABB9>冽𡉼撣?JWT Token
|
||||
const response = await apiClient.get('/api/v2/xxx');
|
||||
const response = await apiClient.post('/api/v2/xxx', data);
|
||||
```
|
||||
|
||||
### 2.2 使用原生 fetch(需手动添加 Token)
|
||||
### 2.2 雿輻鍂<EFBFBD>毺<EFBFBD> fetch嚗<68><E59A97><EFBFBD>见𢆡瘛餃<E7989B> Token嚗?
|
||||
|
||||
```typescript
|
||||
import { getAccessToken } from '../../../framework/auth/api';
|
||||
@@ -56,12 +56,12 @@ function getAuthHeaders(): HeadersInit {
|
||||
return headers;
|
||||
}
|
||||
|
||||
// 所有 fetch 请求使用 getAuthHeaders()
|
||||
// <EFBFBD><EFBFBD><EFBFBD>?fetch 霂瑟<EFBFBD>雿輻鍂 getAuthHeaders()
|
||||
const response = await fetch(url, {
|
||||
headers: getAuthHeaders(),
|
||||
});
|
||||
|
||||
// 文件上传(不设置 Content-Type)
|
||||
// <EFBFBD><EFBFBD>辣銝𠹺<EFBFBD>嚗<EFBFBD><EFBFBD>霈曄蔭 Content-Type嚗?
|
||||
const token = getAccessToken();
|
||||
const headers: HeadersInit = {};
|
||||
if (token) {
|
||||
@@ -76,22 +76,22 @@ const response = await fetch(url, {
|
||||
|
||||
## 3. <20>𡒊垢閫<E59EA2><E996AB>
|
||||
|
||||
### 3.1 路由添加认证中间件
|
||||
### 3.1 頝舐眏瘛餃<EFBFBD>霈方<EFBFBD>銝剝𡢿隞?
|
||||
|
||||
```typescript
|
||||
// 导入认证中间件
|
||||
// 撖澆<EFBFBD>霈方<EFBFBD>銝剝𡢿隞?
|
||||
import { authenticate, requirePermission } from '../../../common/auth/auth.middleware.js';
|
||||
|
||||
// 添加到路由
|
||||
// 瘛餃<EFBFBD><EFBFBD>啗楝<EFBFBD>?
|
||||
fastify.get('/xxx', { preHandler: [authenticate] }, handler);
|
||||
|
||||
// 需要特定权限
|
||||
// <EFBFBD><EFBFBD>閬<EFBFBD>鸌摰𡁏<EFBFBD><EFBFBD>?
|
||||
fastify.post('/xxx', {
|
||||
preHandler: [authenticate, requirePermission('module:action')]
|
||||
}, handler);
|
||||
```
|
||||
|
||||
### 3.2 控制器获取用户 ID
|
||||
### 3.2 <EFBFBD>批<EFBFBD><EFBFBD>刻繮<EFBFBD>𣇉鍂<EFBFBD>?ID
|
||||
|
||||
```typescript
|
||||
/**
|
||||
@@ -105,7 +105,7 @@ function getUserId(request: FastifyRequest): string {
|
||||
return userId;
|
||||
}
|
||||
|
||||
// 在控制器方法中使用
|
||||
// <EFBFBD>冽綉<EFBFBD>嗅膥<EFBFBD>寞<EFBFBD>銝凋蝙<EFBFBD>?
|
||||
async function myHandler(request: FastifyRequest, reply: FastifyReply) {
|
||||
const userId = getUserId(request);
|
||||
// ... 雿輻鍂 userId
|
||||
@@ -117,7 +117,7 @@ async function myHandler(request: FastifyRequest, reply: FastifyReply) {
|
||||
```typescript
|
||||
interface DecodedToken {
|
||||
userId: string; // <20>冽<EFBFBD>ID
|
||||
phone: string; // 手机号
|
||||
phone: string; // <EFBFBD>𧢲㦤<EFBFBD>?
|
||||
role: string; // 閫坿𠧧
|
||||
tenantId: string; // 蝘<><E89D98>ID
|
||||
tenantCode?: string; // 蝘<><E89D98>Code
|
||||
@@ -126,68 +126,69 @@ interface DecodedToken {
|
||||
}
|
||||
```
|
||||
|
||||
## 4. 检查清单
|
||||
## 4. 璉<EFBFBD><EFBFBD>交<EFBFBD><EFBFBD>?
|
||||
|
||||
### 4.1 新模块开发检查清单
|
||||
### 4.1 <EFBFBD>唳芋<EFBFBD>堒<EFBFBD><EFBFBD>烐<EFBFBD><EFBFBD>交<EFBFBD><EFBFBD>?
|
||||
|
||||
- [ ] **<EFBFBD>滨垢 API <20><>辣**
|
||||
- [ ] 使用 `apiClient` 或添加 `getAuthHeaders()`
|
||||
- [ ] 文件上传单独处理(不设置 Content-Type)
|
||||
- [ ] 雿輻鍂 `apiClient` <EFBFBD>𡝗溶<EFBFBD>?`getAuthHeaders()`
|
||||
- [ ] <EFBFBD><EFBFBD>辣銝𠹺<EFBFBD><EFBFBD>閧𡠺憭<EFBFBD><EFBFBD>嚗<EFBFBD><EFBFBD>霈曄蔭 Content-Type嚗?
|
||||
- [ ] 撖澆枂<E6BE86>賣㺭銝滚<E98A9D><E6BB9A>急<EFBFBD>霂閧鍂 userId <20><>㺭
|
||||
|
||||
- [ ] **<EFBFBD>𡒊垢頝舐眏<EFBFBD><EFBFBD>辣**
|
||||
- [ ] 导入 `authenticate` 中间件
|
||||
- [ ] 撖澆<EFBFBD> `authenticate` 銝剝𡢿隞?
|
||||
- [ ] <20><><EFBFBD>厰<EFBFBD>閬<EFBFBD>恕霂<E68195><E99C82>頝舐眏瘛餃<E7989B> `preHandler: [authenticate]`
|
||||
- [ ] 公开 API(如模板列表)可不添加认证
|
||||
- [ ] <EFBFBD>砍<EFBFBD> API嚗<EFBFBD><EFBFBD>璅⊥踎<EFBFBD>𡑒”嚗匧虾銝齿溶<EFBFBD>㰘恕霂?
|
||||
|
||||
- [ ] **后端控制器文件**
|
||||
- [ ] **<EFBFBD>𡒊垢<EFBFBD>批<EFBFBD><EFBFBD>冽<EFBFBD>隞?*
|
||||
- [ ] 瘛餃<E7989B> `getUserId()` 颲<>𨭌<EFBFBD>賣㺭
|
||||
- [ ] 移除所有 `MOCK_USER_ID` 或硬编码默认值
|
||||
- [ ] 蝘駁膄<EFBFBD><EFBFBD><EFBFBD>?`MOCK_USER_ID` <EFBFBD>𣇉′蝻𣇉<EFBFBD>暺䁅恕<EFBFBD>?
|
||||
- [ ] 雿輻鍂 `getUserId(request)` <20>瑕<EFBFBD><E79195>冽<EFBFBD> ID
|
||||
|
||||
### 4.2 已完成模块状态
|
||||
### 4.2 撌脣<EFBFBD><EFBFBD>鞉芋<EFBFBD>㛖𠶖<EFBFBD>?
|
||||
|
||||
| 模块 | 前端 API | 后端路由 | 后端控制器 | 状态 |
|
||||
| 璅∪<EFBFBD> | <20>滨垢 API | <20>𡒊垢頝舐眏 | <20>𡒊垢<F0A1928A>批<EFBFBD><E689B9>?| <20>嗆<EFBFBD>?|
|
||||
|------|---------|---------|-----------|------|
|
||||
| RVW | ✅ apiClient | ✅ authenticate | ✅ getUserId | ✅ |
|
||||
| PKB | ✅ 拦截器 | ✅ authenticate | ✅ getUserId | ✅ |
|
||||
| ASL | ✅ getAuthHeaders | ✅ authenticate | ✅ getUserId | ✅ |
|
||||
| DC Tool B | ✅ getAuthHeaders | ✅ authenticate | ✅ getUserId | ✅ |
|
||||
| DC Tool C | ✅ apiClient | ✅ authenticate | ✅ getUserId | ✅ |
|
||||
| IIT | N/A (企业微信) | N/A | ✅ 企业微信userId | ✅ |
|
||||
| Prompt管理 | ✅ getAuthHeaders | ✅ authenticate | ✅ getUserId | ✅ |
|
||||
| RVW | <EFBFBD>?apiClient | <EFBFBD>?authenticate | <EFBFBD>?getUserId | <EFBFBD>?|
|
||||
| PKB | <EFBFBD>?<3F>行⏛<E8A18C>?| <20>?authenticate | <EFBFBD>?getUserId | <EFBFBD>?|
|
||||
| ASL | <EFBFBD>?getAuthHeaders | <EFBFBD>?authenticate | <EFBFBD>?getUserId | <EFBFBD>?|
|
||||
| DC Tool B | <EFBFBD>?getAuthHeaders | <EFBFBD>?authenticate | <EFBFBD>?getUserId | <EFBFBD>?|
|
||||
| DC Tool C | <EFBFBD>?apiClient | <EFBFBD>?authenticate | <EFBFBD>?getUserId | <EFBFBD>?|
|
||||
| IIT | N/A (隡<EFBFBD><EFBFBD>敺桐縑) | N/A | <EFBFBD>?隡<><E99AA1>敺桐縑userId | <EFBFBD>?|
|
||||
| Prompt蝞∠<EFBFBD> | <EFBFBD>?getAuthHeaders | <EFBFBD>?authenticate | <EFBFBD>?getUserId | <EFBFBD>?|
|
||||
|
||||
## 5. 常见错误和解决方案
|
||||
## 5. 撣貉<EFBFBD><EFBFBD>躰秤<EFBFBD>諹圾<EFBFBD>單䲮獢?
|
||||
|
||||
### 5.1 401 Unauthorized
|
||||
|
||||
**原因**: 前端没有携带 JWT Token 或 Token 过期
|
||||
**<EFBFBD>笔<EFBFBD>**: <EFBFBD>滨垢瘝⊥<EFBFBD><EFBFBD>箏蒂 JWT Token <EFBFBD>?Token 餈<EFBFBD><EFBFBD>
|
||||
|
||||
**閫<><E996AB>**:
|
||||
1. 检查前端 API 是否使用 `apiClient` 或 `getAuthHeaders()`
|
||||
2. 检查 localStorage 中是否有 `accessToken`
|
||||
1. 璉<EFBFBD><EFBFBD>亙<EFBFBD>蝡?API <20>臬炏雿輻鍂 `apiClient` <EFBFBD>?`getAuthHeaders()`
|
||||
2. 璉<EFBFBD><EFBFBD>?localStorage 銝剜糓<EFBFBD>行<EFBFBD> `accessToken`
|
||||
3. 憒<><E68692> Token 餈<><E9A488>嚗<EFBFBD><E59A97>霂訫<E99C82><E8A8AB>唳<EFBFBD><E594B3>齿鰵<E9BDBF>餃<EFBFBD>
|
||||
|
||||
### 5.2 User not authenticated
|
||||
|
||||
**原因**: 后端路由没有添加 `authenticate` 中间件
|
||||
**<EFBFBD>笔<EFBFBD>**: <EFBFBD>𡒊垢頝舐眏瘝⊥<EFBFBD>瘛餃<EFBFBD> `authenticate` 銝剝𡢿隞?
|
||||
|
||||
**閫<><E996AB>**: <20>刻楝<E588BB>勗<EFBFBD>銋劐葉瘛餃<E7989B> `preHandler: [authenticate]`
|
||||
|
||||
### 5.3 TypeError: Cannot read property 'userId' of undefined
|
||||
|
||||
**原因**: 使用了错误的属性名(`request.user.id` 而非 `request.user.userId`)
|
||||
**<EFBFBD>笔<EFBFBD>**: 雿輻鍂鈭<EFBFBD><EFBFBD>霂舐<EFBFBD>撅墧<EFBFBD>批<EFBFBD>嚗Ǒrequest.user.id` <20>屸<EFBFBD> `request.user.userId`嚗?
|
||||
|
||||
**閫<><E996AB>**: 雿輻鍂 `(request as any).user?.userId`
|
||||
|
||||
## 6. 参考文件
|
||||
## 6. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞?
|
||||
|
||||
- <20>滨垢 axios 摰硺<E691B0>: `frontend-v2/src/common/api/axios.ts`
|
||||
- <20>滨垢 Token 蝞∠<E89D9E>: `frontend-v2/src/framework/auth/api.ts`
|
||||
- 后端认证中间件: `backend/src/common/auth/auth.middleware.ts`
|
||||
- <20>𡒊垢霈方<E99C88>銝剝𡢿隞? `backend/src/common/auth/auth.middleware.ts`
|
||||
- <20>𡒊垢 JWT <20>滚𦛚: `backend/src/common/auth/jwt.service.ts`
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user