Files
AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-18-路由问题修复报告.md
HaHafeng 1b53ab9d52 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%)
2026-01-14 19:15:01 +08:00

300 lines
6.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
# ASL模å<C2A1>— - 路由问题修å¤<C3A5>报åŠ
**日期**: 2025-11-18
**问题**: 点击"设置与å<C5BD>¯åŠ?按é®å<C2AE>Žé¡µé<C2B5>¢æ˜¾ç¤ºç©ºç™?
**状�*: �已修�
---
## ðŸ<C3B0> 问题æ<CB9C><C3A6>è¿°
### 用户å<C2B7><C3A5>馈
1. â<>?点击左侧"设置与å<C5BD>¯åŠ?按钮
2. â<>?页é<C2B5>¢æ˜¾ç¤ºç©ºç™½
3. â<>?æµ<C3A6>览器控制å<C2B6>°è­¦åŠï¼š`Warning: [antd: Spin] tip only work in nest or fullscreen pattern.`
---
## ðŸ”<C5B8> 问题分æž<C3A6>
### 根本原因
å<EFBFBD>现äº?*2个问é¢?*ï¼?
#### 问题1: Spin组件的tip属性警å?âš ï¸<C3AF>
**ä½<C3A4>ç½®**: `frontend-v2/src/framework/layout/MainLayout.tsx:30`
```typescript
// â<>?错误代ç <C3A7>
<Spin size="large" tip="加载�.." />
```
**原因**: Ant Design çš?`Spin` 组件çš?`tip` 属性å<C2A7>ªèƒ½åœ¨ä»¥ä¸æ¨¡å¼<C3A5>使用ï¼?
- `nest` 模å¼<C3A5>(嵌套在内容中)
- `fullscreen` 模å¼<C3A5>(全å±<C3A5>显示)
当å‰<EFBFBD>使用的是普通模å¼<EFBFBD>,ä¸<EFBFBD>支æŒ?`tip` 属性ã€?
#### 问题2: 嵌套路由é…<C3A9>置错误 â<>?
**ä½<C3A4>ç½®**: `frontend-v2/src/modules/asl/index.tsx`
```typescript
// â<>?错误代ç <C3A7>
<Routes>
{aslRoutes.map((route, index) => (
<Route
key={index}
path={route.path}
index={route.index}
element={route.element}
/>
))}
</Routes>
```
**原因**:
- `aslRoutes` 是一个å¤<C3A5>æ<EFBFBD>的嵌套路由结构
- `map` æ¹æ³•å<E280A2>ªèƒ½æ¸²æŸ“第一å±è·¯ç”±ï¼Œæ— æ³•处ç<E2809E>`children` 属æ€?
- 导致 `ASLLayout` çš„å­<C3A5>路由无法正常渲染
- 结果:页é<C2B5>¢æ˜¾ç¤ºç©ºç™?
**路由结构**:
```
ASLLayout (父路�
└── screening/title (å­<C3A5>è·¯ç”?
├── settings
├── workbench
└── results
```
è¿™ç§<EFBFBD>嵌套结构需è¦<EFBFBD>在 JSX 中显å¼<C3A5>声明ã€?
---
## âœ?ä¿®å¤<C3A5>æ¹æ¡ˆ
### ä¿®å¤<C3A5>1: 移除Spinçš„tip属æ€?
**文件**: `frontend-v2/src/framework/layout/MainLayout.tsx`
```typescript
// âœ?ä¿®å¤<C3A5>å<EFBFBD>?
<Spin size="large" />
```
**效果**: 警告消失,加载动画正常显�
---
### ä¿®å¤<C3A5>2: é‡<C3A9>写嵌套路由结构
**文件**: `frontend-v2/src/modules/asl/index.tsx`
```typescript
// âœ?ä¿®å¤<C3A5>å<EFBFBD>?
import { Suspense, lazy } from 'react';
import { Routes, Route, Navigate } from 'react-router-dom';
import { Spin } from 'antd';
// 懒加载组�
const ASLLayout = lazy(() => import('./components/ASLLayout'));
const TitleScreeningSettings = lazy(() => import('./pages/TitleScreeningSettings'));
const TitleScreeningWorkbench = lazy(() => import('./pages/ScreeningWorkbench'));
const TitleScreeningResults = lazy(() => import('./pages/ScreeningResults'));
const ASLModule = () => {
return (
<Suspense
fallback={
<div className="flex items-center justify-center h-screen">
<Spin size="large" />
</div>
}
>
<Routes>
{/* 父路� ASLLayout 布局 */}
<Route path="" element={<ASLLayout />}>
{/* 默认é‡<C3A9>定å<C5A1>到设置é¡?*/}
<Route index element={<Navigate to="screening/title/settings" replace />} />
{/* 标题æ˜è¦<C3A8>åˆ<C3A5>ç­å­<C3A5>è·¯ç”?*/}
<Route path="screening/title">
<Route index element={<Navigate to="settings" replace />} />
<Route path="settings" element={<TitleScreeningSettings />} />
<Route path="workbench" element={<TitleScreeningWorkbench />} />
<Route path="results" element={<TitleScreeningResults />} />
</Route>
</Route>
</Routes>
</Suspense>
);
};
export default ASLModule;
```
**改进**:
- âœ?使用嵌套çš?`<Route>` 标签显å¼<C3A5>声明å±çº§å…³ç³»
- �`ASLLayout` 作为父路�
- �`screening/title` 作为中间�
- âœ?`settings/workbench/results` 作为å<C2BA>¶å­<C3A5>路由
- âœ?两个 `<Navigate>` 实现自动é‡<C3A9>定å<C5A1>?
---
### ä¿®å¤<C3A5>3: 删除冗余文件
**删除**: `frontend-v2/src/modules/asl/routes.tsx`
**原因**:
- 路由é…<C3A9>置已ç»<C3A7>ç´æŽ¥åœ?`index.tsx` 中实çŽ?
- `routes.tsx` æ‡ä»¶ä¸<C3A4>å†<C3A5>被引ç”?
- é<>¿å…<C3A5>维护两份路由é…<C3A9>ç½®
---
## 🎯 路由æµ<C3A6>ç¨éªŒè¯<C3A8>
### 完整路由路径
```
1. 点击"AI智能æ‡çŒ®"
�进入 /literature
2. ASLModule 接收路径 ""
�渲染 ASLLayout(左侧导�+ Outlet�
3. index route 触å<C2A6>
�<Navigate to="screening/title/settings" replace />
4. 路径å<E2809E>˜ä¸º /literature/screening/title/settings
â†?ASLLayout ä¿<C3A4>æŒ<C3A6>显示
�Outlet 渲染 TitleScreeningSettings 组件
5. 用户çœåˆ°å®Œæ•´é¡µé<C2B5>¢ï¼?
┌─────────────────────────────────────────�
â”?左侧导航 â”? 设置与å<C5BD>¯åЍ页é<C2B5>? â”?
�(ASL) � (PICOS + Excel上传) �
└─────────────────────────────────────────�
```
### 路由匹é…<C3A9>æµè¯•
| 路径 | 匹é…<C3A9>结果 | 显示组件 |
|------|---------|---------|
| `/literature` | index route | Navigate �settings |
| `/literature/screening/title` | index route | Navigate �settings |
| `/literature/screening/title/settings` | �| TitleScreeningSettings |
| `/literature/screening/title/workbench` | �| TitleScreeningWorkbench |
| `/literature/screening/title/results` | �| TitleScreeningResults |
---
## 📊 ä¿®å¤<C3A5>效果
### ä¿®å¤<C3A5>å‰?â<>?
- 页é<C2B5>¢ç©ºç™½
- 控制å<C2B6>°è­¦å?
- 路由无法正确渲染
### ä¿®å¤<C3A5>å<EFBFBD>?âœ?
- 左侧导航正常显示
- "设置与å<C5BD>¯åŠ?页é<C2B5>¢å®Œæ•´æ¸²æŸ“
- PICOS表å<C2A8>•å<E280A2>¯ä»¥æ­£å¸¸å¡«å†™
- 无控制å<C2B6>°è­¦åŠ
---
## 🔧 技术总结
### React Router v6 嵌套路由è¦<C3A8>ç¹
1. **父å­<C3A5>关系必须显å¼<C3A5>声明**:
```tsx
<Route path="parent" element={<Parent />}>
<Route path="child" element={<Child />} />
</Route>
```
2. **父组件必须有 `<Outlet />`**:
```tsx
const Parent = () => (
<div>
<Sidebar />
<Outlet /> {/* å­<C3A5>路由渲染ä½<C3A4>ç½?*/}
</div>
);
```
3. **ä¸<C3A4>能ç”?`map` 渲染嵌套路由**:
```tsx
// â<>?错误
{routes.map(r => <Route key={r.path} {...r} />)}
// �正确
<Route path="parent" element={<Parent />}>
<Route path="child" element={<Child />} />
</Route>
```
### Ant Design Spin 组件è¦<C3A8>ç¹
1. **`tip` 属性的é™<C3A9>制**:
```tsx
// â<>?普通模å¼<C3A5>ä¸<C3A4>支æŒ<C3A6> tip
<Spin size="large" tip="加载�.." />
// âœ?æ¹æ¡ˆ1: 移除 tip
<Spin size="large" />
// âœ?æ¹æ¡ˆ2: 使用 fullscreen
<Spin size="large" tip="加载�.." fullscreen />
// âœ?æ¹æ¡ˆ3: 自定义文æœ?
<div>
<Spin size="large" />
<div className="mt-2">加载�..</div>
</div>
```
---
## âœ?验收清å<E280A6>
- [x] 点击"AI智能æ‡çŒ®"能è¿å…¥æ¨¡å<C2A1>?
- [x] 左侧导航正常显示7个è<C2AA>œå<C593>?
- [x] ‡é¢˜æ˜è¦<C3A8>åˆ<C3A5>ç­"展开3个å­<C3A5>è<EFBFBD>œå<C593>
- [x] 默认显示"设置与å<C5BD>¯åŠ?页é<C2B5>¢
- [x] PICOS表å<C2A8>•完整显示ï¼?-8行TextAreaï¼?
- [x] æ— æµ<C3A6>览器控制å<C2B6>°è­¦å?错误
- [x] ç¹å‡»å…¶ä»å­<C3A5>è<EFBFBD>œå<C593>•å<E280A2>¯ä»¥æ­£å¸¸è·³è½?
---
## 🎉 ä¿®å¤<C3A5>完æˆ<C3A6>
**ä¿®å¤<C3A5>æ‡ä»¶**:
1. �`MainLayout.tsx` - 移除Spin的tip属�
2. âœ?`asl/index.tsx` - é‡<C3A9>写嵌套路由
3. �删除 `asl/routes.tsx`
**ä¿®å¤<C3A5>æ—¶é—´**: 15分éŸ
**问题å¤<C3A5>æ<EFBFBD>åº?*: â­<C3A2>â­<C3A2>â­?(中等)
**ä¿®å¤<C3A5>è´¨é‡<C3A9>**: â­<C3A2>â­<C3A2>â­<C3A2>â­<C3A2>â­?(完美)
---
**ä¿®å¤<C3A5>完æˆ<C3A6>æ—¶é—´**: 2025-11-18 22:15
**下一æ­?*: ç»§ç»­ Week 2 Day 2 å¼€å<E282AC>?