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:
2026-01-14 19:15:01 +08:00
parent 3d35e9c58b
commit 1b53ab9d52
386 changed files with 52096 additions and 65238 deletions

View File

@@ -3,31 +3,31 @@
## <20><> <20><EFBFBD><EFBFBD>
**<EFBFBD><EFBFBD><EFBFBD>園𡢿**: 2026-01-06
**修复状态**: ✅ **已全部修复**
**问题来源**: 用户反馈 + 原型图对比
**靽桀<EFBFBD><EFBFBD><EFBFBD>?*: <20>?**撌脣<E6928C><E884A3>其耨憭?*
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><EFBFBD><E7AC94>曉笆瘥?
---
## 🐛 发现的4个问题
## <EFBFBD><EFBFBD> <20>𤑳緵<F0A491B3>?銝芷䔮憸?
### 问题1页面不是全屏顶部有导航栏 ❌
**现象**: 进入Workspace页面后,顶部仍然显示平台的全局导航栏
### <EFBFBD><EFBFBD>1嚗𡁻△<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撅𧶏<EFBFBD>憿園<EFBFBD><EFBFBD>匧紡<EFBFBD><EFBFBD> <20>?
**<EFBFBD>啗情**: 餈𥕦<EFBFBD>Workspace憿菟𢒰<EFBFBD>𠬍<EFBFBD>憿園<EFBFBD>隞滨<EFBFBD><EFBFBD>曄內撟喳蝱<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撖潸⏛<EFBFBD>?
**<EFBFBD><EFBFBD>**: WorkspacePage鋡怠<E98BA1>鋆孵銁`MainLayout`銝哨<EFBFBD>撖潸稲蝏扳㗁鈭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**敶勗<E695B6>**:
- 不符合V3设计的"沉浸式"体验
- 銝滨泵<EFBFBD>Ā3霈曇恣<EFBFBD>?瘝㗇絡撘?雿㯄<E99BBF>
- 瘚芾晶撅誩<E69285>蝛粹𡢿
- 与原型图不一致
- 銝𤾸<EFBFBD><EFBFBD>见㦛銝滢<EFBFBD><EFBFBD>?
---
### 问题2没有上下滚动条 ❌
**现象**: Chat消息区域无法滚动,内容超出时看不到
### <EFBFBD><EFBFBD>2嚗𡁏瓷<EFBFBD><EFBFBD>銝𧢲<EFBFBD><EFBFBD>冽辺 <20>?
**<EFBFBD>啗情**: Chat<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>皛𡁜𢆡嚗<EFBFBD><EFBFBD>摰寡<EFBFBD><EFBFBD>箸𧒄<EFBFBD><EFBFBD><EFBFBD>?
**<EFBFBD><EFBFBD>**:
- 容器没有正确设置`overflow`属性
- 高度计算不正确
- 摰孵膥瘝⊥<EFBFBD><EFBFBD>霈曄蔭`overflow`撅墧<EFBFBD>?
- 擃睃漲霈∠<EFBFBD>銝齿迤蝖?
**敶勗<E695B6>**:
- <20><EFBFBD><E4ADBE><EFBFBD><E4BAA6><EFBFBD>蟮瘨<E89FAE><E798A8>
@@ -35,34 +35,34 @@
---
### 问题3Tab导航高度太高 ❌
**现象**: "智能问答"和"知识资产"Tab导航栏高度过高显得粗糙
### <EFBFBD><EFBFBD>3嚗関ab撖潸⏛擃睃漲憭芷<EFBFBD> <20>?
**<EFBFBD>啗情**: "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"<22>?<3F><EFBFBD><EFBFBD>漣"Tab撖潸⏛<E6BDB8><EFBFBD>摨西<E691A8>擃矋<E69383><E79F8B><EFBFBD>蝎㛖<E89D8E>
**<EFBFBD><EFBFBD>**:
- 使用了`h-14`56px而非原型的`h-12`48px
- 图标和文字尺寸过大
- 雿輻鍂鈭<EFBFBD>h-14`嚗?6px嚗㕑<E59A97><EFBFBD><E5B1B8><EFBFBD><E7AC94><EFBFBD>h-12`嚗?8px嚗?
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>摮堒偕撖貉<EFBFBD>憭?
**敶勗<E695B6>**:
- 与原型图不一致
- 视觉效果不精致
- 銝𤾸<EFBFBD><EFBFBD>见㦛銝滢<EFBFBD><EFBFBD>?
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝滨移<EFBFBD>?
---
### 问题4AI对话报错 - JSON格式错误 ❌
### <EFBFBD><EFBFBD>4嚗鋫I撖寡<EFBFBD><EFBFBD>仿<EFBFBD> - JSON<4F><EFBFBD><E6BE86>躰秤 <20>?
**<2A>啗情**: <20><EFBFBD><E785BE><EFBFBD><EFBFBD><EFBFBD><E887AC>仿<EFBFBD>嚗䫤Unexpected token 'd', "data: {"co"... is not valid JSON`
**<2A><EFBFBD>**:
- 后端返回的是SSEServer-Sent Events)流式格式
- 前端使用`response.json()`解析,导致格式错误
- <20>𡒊垢餈𥪜<E9A488><F0A5AA9C><EFBFBD>SSE嚗𠄎erver-Sent Events嚗㗇<EFBFBD>撘𤩺聢撘?
- <20>滨垢雿輻鍂`response.json()`閫<><E996AB><EFBFBD><EFBFBD>湔聢撘誯<E69298>霂?
- 瘝⊥<E7989D><EFBFBD><EFBC86><E686AD>`data: `<60><EFBFBD>
**敶勗<E695B6>**:
- 摰<><E691B0><EFBFBD><EFBFBD>雿輻鍂AI撖寡<E69296><E5AFA1><EFBFBD>
- 核心功能不可用
- <20><EFBFBD><E8A9A8><EFBFBD>銝滚虾<E6BB9A>?
---
## ✅ 修复方案
## <EFBFBD>?靽桀<E99DBD><E6A180><EFBFBD>
### 靽桀<E99DBD>1嚗𡁜<E59A97><F0A1819C><EFBFBD>撅𤩺<E69285>瘚詨<E7989A><EFBFBD><E692A3>
@@ -75,10 +75,10 @@ interface WorkspacePageProps {
}
const WorkspacePage: React.FC<WorkspacePageProps> = ({ standalone = false }) => {
// 如果是standalone模式,使用固定定位覆盖整个屏幕
// <EFBFBD><EFBFBD><EFBFBD>tandalone<EFBFBD>嚗䔶蝙<EFBFBD>典𤐄摰𡁜<EFBFBD>雿滩<EFBFBD><EFBFBD>𡝗㟲銝芸<EFBFBD>撟?
const containerClass = standalone
? "fixed inset-0 z-50 flex flex-col bg-gray-50" // <20><EFBFBD><EFBFBD><E996AC>
: "flex flex-col h-screen bg-gray-50"; // 普通模式
: "flex flex-col h-screen bg-gray-50"; // <EFBFBD><EFBFBD>𡁏芋撘?
return (
<div className={containerClass}>
@@ -100,9 +100,9 @@ const WorkspacePage: React.FC<WorkspacePageProps> = ({ standalone = false }) =>
```
#### <20><><EFBFBD>
Workspace页面完全覆盖屏幕
✅ 没有顶部导航栏
✅ 沉浸式体验
<EFBFBD>?Workspace憿菟𢒰摰<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撅誩<EFBFBD>
<EFBFBD>?瘝⊥<E7989D>憿園<E686BF>撖潸⏛<E6BDB8>?
<EFBFBD>?瘝㗇絡撘譍<E69298>撉?
---
@@ -110,17 +110,17 @@ const WorkspacePage: React.FC<WorkspacePageProps> = ({ standalone = false }) =>
#### 隞<><E99A9E>靽格㺿
```typescript
// WorkspacePage.tsx - 主容器
// WorkspacePage.tsx - 銝餃捆<EFBFBD>?
<main className="flex-1 overflow-hidden relative">
{activeTab === 'chat' && (
<div className="h-full flex overflow-hidden"> {/* 瘛餃<E7989B>overflow-hidden */}
<div className="flex-1 flex flex-col bg-white overflow-hidden">
{/* 工作模式选择器 */}
{/* 撌乩<E6928C><E79285><E288AA>㗇𥋘<E39787>?*/}
<div className="p-3 border-b border-gray-100 flex-shrink-0">
{/* ... */}
</div>
{/* Chat区域 - 可滚动 */}
{/* Chat<EFBFBD><EFBFBD> - <20><EFBFBD><E88880>?*/}
<div className="flex-1 overflow-y-auto"> {/* 瘛餃<E7989B>overflow-y-auto */}
{/* ... */}
</div>
@@ -137,16 +137,16 @@ const WorkspacePage: React.FC<WorkspacePageProps> = ({ standalone = false }) =>
<Alert {...} />
</div>
<div className="flex-1 overflow-hidden px-4 pb-4"> {/* 可滚动区域 */}
<div className="flex-1 overflow-hidden px-4 pb-4"> {/* <20><EFBFBD><E88880>典躹<E585B8>?*/}
<ChatContainer {...} />
</div>
</div>
```
#### <20><><EFBFBD>
✅ Chat消息区域可以正常滚动
✅ 工作模式选择器固定在顶部
✅ 滚动条样式美观
<EFBFBD>?Chat瘨<74><E798A8><EFBFBD><EFBFBD><E7AE8F>臭誑甇<E8AA91>虜皛𡁜𢆡
<EFBFBD>?撌乩<E6928C><E79285><E288AA>㗇𥋘<E39787>典𤐄摰𡁜銁憿園<E686BF>
<EFBFBD>?皛𡁜𢆡<F0A1819C>⊥甅撘讐<E69298>閫?
---
@@ -156,7 +156,7 @@ const WorkspacePage: React.FC<WorkspacePageProps> = ({ standalone = false }) =>
```typescript
// WorkspacePage.tsx
// 修改前
// 靽格㺿<EFBFBD>?
<div className="bg-white border-b border-gray-200 px-6 flex items-center shadow-sm z-20 h-14">
<button className="...">
<MessageSquare className="w-5 h-5 mr-2" />
@@ -164,26 +164,26 @@ const WorkspacePage: React.FC<WorkspacePageProps> = ({ standalone = false }) =>
</button>
</div>
// 修改后
// 靽格㺿<EFBFBD>?
<div className="bg-white border-b border-gray-200 px-6 flex items-center shadow-sm z-20 h-12 flex-shrink-0">
<button className="...">
<MessageSquare className="w-4 h-4 mr-2" /> {/* w-5 w-4 */}
<span className="text-sm"></span> {/* text-base text-sm */}
<MessageSquare className="w-4 h-4 mr-2" /> {/* w-5 <EFBFBD>?w-4 */}
<span className="text-sm"><3E><EFBFBD><E7AE84><EFBFBD></span> {/* text-base <EFBFBD>?text-sm */}
</button>
</div>
```
#### 撖寞<E69296>
| 属性 | 修改前 | 修改后 | 原型图 |
| 撅墧<E69285>?| 靽格㺿<E6A0BC>?| 靽格㺿<E6A0BC>?| <20><EFBFBD><E7AC94>?|
|------|--------|--------|--------|
| 高度 | h-14 (56px) | h-12 (48px) | h-12 |
| 图标 | w-5 h-5 (20px) | w-4 h-4 (16px) | w-4 h-4 |
| 文字 | text-base (16px) | text-sm (14px) | text-sm |
| 擃睃漲 | h-14 (56px) | h-12 (48px) | <EFBFBD>?h-12 |
| <EFBFBD><EFBFBD> | w-5 h-5 (20px) | w-4 h-4 (16px) | <EFBFBD>?w-4 h-4 |
| <EFBFBD><EFBFBD><EFBFBD> | text-base (16px) | text-sm (14px) | <EFBFBD>?text-sm |
#### <20><><EFBFBD>
✅ Tab高度精确匹配原型
✅ 视觉效果更精致
✅ 与V3设计100%一致
<EFBFBD>?Tab擃睃漲蝎曄<E69B84><EFBFBD><E5AFA5><EFBFBD>
<EFBFBD>?閫<><E996AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>渡移<E6B8A1>?
<EFBFBD>?銝竚3霈曇恣100%銝<><E98A9D>?
---
@@ -192,15 +192,15 @@ const WorkspacePage: React.FC<WorkspacePageProps> = ({ standalone = false }) =>
#### <20><EFBFBD><E6A185><EFBFBD><EFBFBD>
<EFBFBD>𡒊垢餈𥪜<EFBFBD><EFBFBD><EFBFBD>聢撘𧶏<EFBFBD>
```
data: {"content":"您","role":"assistant"}
data: {"content":"好","role":"assistant"}
data: {"content":"","role":"assistant"}
data: {"content":"<EFBFBD>?,"role":"assistant"}
data: {"content":"憟?,"role":"assistant"}
data: {"content":"嚗?,"role":"assistant"}
data: [DONE]
```
前端错误代码:
<EFBFBD>滨垢<EFBFBD>躰秤隞<EFBFBD><EFBFBD>嚗?
```typescript
// ❌ 错误直接使用response.json()
// <20>?<3F>躰秤嚗𡁶凒<F0A181B6>乩蝙<E4B9A9>禿esponse.json()
const data = await response.json();
```
@@ -219,7 +219,7 @@ requestFn: async (message: string) => {
content: message,
modelType: 'qwen-long', // 雿輻鍂qwen-long璅<E79285>
knowledgeBaseIds: [kbId],
fullTextDocumentIds, // documentIds
fullTextDocumentIds, // <EFBFBD>?documentIds
}),
});
@@ -266,9 +266,9 @@ requestFn: async (message: string) => {
```
#### <20><><EFBFBD>
✅ 正确解析SSE流式响应
✅ AI对话功能正常工作
✅ 支持流式输出(逐字显示)
<EFBFBD>?甇<><EFBC86><E996AB>SSE瘚<45><E7989A><EFBFBD><EFBFBD>
<EFBFBD>?AI撖寡<E69296><E5AFA1><EFBFBD><EFBFBD>虜撌乩<E6928C>
<EFBFBD>?<3F><EFBFBD><EFBFBD><E7989A>颲枏枂嚗<E69E82><E59A97>𣂼<EFBFBD><F0A382BC>曄內嚗?
---
@@ -276,38 +276,38 @@ requestFn: async (message: string) => {
### 閫<><E996AB><EFBFBD><EFBFBD><EFBFBD>撖寞<E69296>
| 项目 | 修复前 | 修复后 | 原型图一致性 |
| 憿寧𤌍 | 靽桀<E99DBD><E6A180>?| 靽桀<E99DBD><E6A180>?| <20><EFBFBD><E7AC94><EFBFBD><E69B86><EFBFBD>?|
|------|--------|--------|--------------|
| 全屏模式 | ❌ 有顶部导航 | ✅ 完全全屏 | 100% |
| 滚动条 | ❌ 无法滚动 | ✅ 正常滚动 | 100% |
| Tab高度 | 56px (粗糙) | 48px (精致) | 100% |
| 图标尺寸 | 20px | 16px | 100% |
| 文字大小 | 16px | 14px | 100% |
| <EFBFBD><EFBFBD><EFBFBD> | <20>?<3F>厰▲<E58EB0>典紡<E585B8>?| <20>?摰<><E691B0><EFBFBD><EFBFBD> | <EFBFBD>?100% |
| 皛𡁜𢆡<EFBFBD>?| <20>?<3F><EFBFBD>皛𡁜𢆡 | <20>?甇<>虜皛𡁜𢆡 | <EFBFBD>?100% |
| Tab擃睃漲 | <EFBFBD>?56px (蝎㛖<EFBFBD>) | <EFBFBD>?48px (蝎曇稲) | <EFBFBD>?100% |
| <EFBFBD><EFBFBD>撠箏站 | <EFBFBD>?20px | <EFBFBD>?16px | <EFBFBD>?100% |
| <EFBFBD><EFBFBD><EFBFBD>憭批<EFBFBD> | <EFBFBD>?16px | <EFBFBD>?14px | <EFBFBD>?100% |
### <20><EFBFBD>撖寞<E69296>
| 功能 | 修复前 | 修复后 |
| <EFBFBD><EFBFBD> | 靽桀<E99DBD><E6A180>?| 靽桀<E99DBD><E6A180>?|
|------|--------|--------|
| AI对话 | ❌ 报错无法使用 | ✅ 正常工作 |
| 全文阅读 | ❌ 无法使用 | ✅ 正常工作 |
| 逐篇精读 | ❌ 无法使用 | ✅ 正常工作 |
| 消息滚动 | ❌ 无法滚动 | ✅ 正常滚动 |
| AI撖寡<EFBFBD> | <20>?<3F>仿<EFBFBD><E4BBBF><EFBFBD>雿輻鍂 | <20>?甇<>虜撌乩<E6928C> |
| <EFBFBD><EFBFBD><EFBFBD><EFBFBD>粉 | <20>?<3F><EFBFBD>雿輻鍂 | <20>?甇<>虜撌乩<E6928C> |
| <EFBFBD><EFBFBD>蝎曇粉 | <20>?<3F><EFBFBD>雿輻鍂 | <20>?甇<>虜撌乩<E6928C> |
| <EFBFBD><EFBFBD>皛𡁜𢆡 | <20>?<3F><EFBFBD>皛𡁜𢆡 | <20>?甇<>虜皛𡁜𢆡 |
---
## <20><20><><EFBFBD><EFBFBD><E888AA><EFBFBD><EFBFBD>
### 1. <20><EFBFBD>瘝㗇絡撘誩<E69298><EFBFBD>
**关键技术**:
**<2A>喲睸<E596B2><E79DB8><EFBFBD>?*:
- `fixed inset-0 z-50`嚗𡁜𤐄摰𡁜<E691B0>雿㵪<E99BBF><EFBFBD><E996AC><EFBFBD>港葵閫<E891B5>
- `standalone` prop:控制是否使用全屏模式
- 独立路由不包裹在MainLayout
- `standalone` prop嚗𡁏綉<EFBFBD>嗆糓<EFBFBD>虫蝙<EFBFBD><EFBFBD>撅𤩺芋撘?
- <20><EFBFBD>頝舐眏嚗帋<E59A97><E5B88B><EFBFBD><EFBFBD>ainLayout銝?
### 2. 皛𡁜𢆡摰孵膥撅<E886A5>
**正确的层级结构**:
**甇<><EFBFBD><EFBC86><EFBFBD>蝥抒<E89DA5><E68A92>?*:
```
<main className="flex-1 overflow-hidden"> {/* 外层:隐藏溢出 */}
<div className="h-full flex overflow-hidden"> {/* 中层:固定高度 */}
<main className="flex-1 overflow-hidden"> {/* 憭硋<EFBFBD>嚗𡁻<EFBFBD><EFBFBD>𤩺滯<EFBFBD>?*/}
<div className="h-full flex overflow-hidden"> {/* 銝剖<EFBFBD>嚗𡁜𤐄摰𡁻<EFBFBD>摨?*/}
<div className="flex-1 overflow-y-auto"> {/* <20><><EFBFBD>嚗𡁜虾皛𡁜𢆡 */}
{/* <20><>捆 */}
</div>
@@ -325,16 +325,16 @@ requestFn: async (message: string) => {
### 4. 蝎曄餈睃<E9A488>霈曇恣
**霈曇恣閫<E681A3><E996AB>**:
- 高度严格使用Tailwind的h-12、h-14
- 图标w-4 h-416px
- 文字text-sm14px
- 间距p-312px
- 擃睃漲嚗帋艇<EFBFBD>潔蝙<EFBFBD>ailwind<EFBFBD><EFBFBD>-12<EFBFBD><EFBFBD>-14蝑?
- <EFBFBD><EFBFBD>嚗鯱-4 h-4嚗?6px嚗?
- <EFBFBD><EFBFBD><EFBFBD>嚗魩ext-sm嚗?4px嚗?
- <EFBFBD><EFBFBD>嚗䮝-3嚗?2px嚗?
---
## <20><> 靽格㺿<E6A0BC><E3BABF>辣皜<E8BEA3><E79A9C>
### 修改文件5个
### 靽格㺿<EFBFBD><EFBFBD>辣嚗?銝迎<E98A9D>
```
frontend-v2/src/modules/pkb/
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> index.tsx (瘛餃<E7989B>standalone頝舐眏)
@@ -346,52 +346,52 @@ frontend-v2/src/modules/pkb/
---
## ✅ 验证清单
## <EFBFBD>?撉諹<E69289><EFBFBD><E79A9C>
### 必须验证P0
### <EFBFBD>◆撉諹<EFBFBD>嚗㇊0嚗?
- [x] Workspace憿菟𢒰<E88F9F><EFBFBD><E585B8>曄內
- [x] 没有顶部导航栏
- [x] 瘝⊥<EFBFBD>憿園<EFBFBD>撖潸⏛<EFBFBD>?
- [x] Chat瘨<74><E798A8><EFBFBD>臭誑甇<E8AA91>虜皛𡁜𢆡
- [x] Tab高度为48px
- [x] Tab擃睃漲銝?8px
- [x] AI撖寡<E69296><EFBFBD>虜撌乩<E6928C>
- [x] <20><EFBFBD><E586BD><EFBFBD>粉璅<E79285><E288AA>舐鍂
- [x] <20><EFBFBD>蝎曇粉璅<E79285><E288AA>舐鍂
### 应该验证P1
- [ ] 滚动条样式美观
### 摨磰砲撉諹<EFBFBD>嚗㇊1嚗?
- [ ] 皛𡁜𢆡<EFBFBD>⊥甅撘讐<EFBFBD>閫?
- [ ] Tab<61><62>揢瘚<E68FA2><E7989A>
- [ ] 撌乩<E6928C><E79285><E288AA><EFBFBD>揢甇<E68FA2>
- [ ] PDF侧边栏正常
- [ ] PDF靘扯器<EFBFBD>𤩺迤撣?
### 可以优化P2
### <EFBFBD>臭誑隡睃<EFBFBD>嚗㇊2嚗?
- [ ]<><E7989A>颲枏枂<E69E8F>函𤫇<E587BD><F0A4AB87><EFBFBD>
- [ ] <20>躰秤<E8BAB0>鞟內隡睃<E99AA1>
- [ ] 加载状态优化
- [ ] <EFBFBD>㰘蝸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
---
## 🚀 下一步
## <EFBFBD><EFBFBD> 銝衤<E98A9D>甇?
1. **用户验证**: 请用户重新加载页面测试
1. **<EFBFBD><EFBFBD>撉諹<EFBFBD>**: 霂瑞鍂<EFBFBD><EFBFBD><EFBFBD><EFBFBD>頧賡△<EFBFBD><EFBFBD>霂?
2. **<EFBFBD><EFBFBD>隡睃<EFBFBD>**: 隡睃<E99AA1><EFBFBD><E7989A><EFBFBD><EFBFBD><E6BB9A><EFBFBD><EFBFBD>𤘪<EFBFBD><EFBFBD>
3. **<EFBFBD>躰秤憭<EFBFBD><EFBFBD>**: 摰<><E691B0>API<50>躰秤<E8BAB0>鞟內
4. **批处理模式**: 实现批处理功能的完整流程
4. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>芋撘?*: 摰䂿緵<E482BF><EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰峕㟲瘚<E39FB2><E7989A>
---
## <20>働 蝏誯<E89D8F><E8AAAF>躰悌
### 1. 设计还原要精确
- 不能"差不多",要"完全一致"
- 每个像素都要对比原型图
### 1. 霈曇恣餈睃<EFBFBD><EFBFBD>移蝖?
- 銝滩<EFBFBD>"撌桐<E6928C>憭?嚗諹<E59A97>"摰<><E691B0><EFBFBD><E98A9D>?
- 瘥譍葵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>撖寞<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- 雿輻鍂Tailwind<6E><64>移蝖桀偕撖貊掩
### 2. 全屏页面需要特殊处理
- 不能简单地放在MainLayout
- 需要`fixed`定位或独立路由
### 2. <EFBFBD><EFBFBD>憿菟𢒰<EFBFBD><EFBFBD><EFBFBD>鸌畾𠰴<EFBFBD><EFBFBD>?
- 銝滩<EFBFBD><EFBFBD><EFBFBD>訫𧑐<EFBFBD>曉銁MainLayout銝?
- <EFBFBD><EFBFBD><EFBFBD>fixed`摰帋<EFBFBD><EFBFBD>𣇉𡠺蝡贝楝<EFBFBD>?
- <20><><EFBFBD>z-index撅<78>
### 3. 滚动容器要仔细设计
### 3. 皛𡁜𢆡摰孵膥閬<EFBFBD><EFBFBD><EFBFBD>挽霈?
- 憭硋<E686AD>`overflow-hidden`
- <20><><EFBFBD>`overflow-y-auto`
- <20><EFBFBD><E7AE8F><EFBFBD>`flex-shrink-0`
@@ -404,8 +404,9 @@ frontend-v2/src/modules/pkb/
---
**靽桀<E99DBD>摰峕<E691B0><E5B395>園𡢿**: 2026-01-06
**修复人**: AI Assistant
**验证状态**: 待用户确认
**靽桀<EFBFBD>鈭?*: AI Assistant
**撉諹<EFBFBD><EFBFBD><EFBFBD>?*: 敺<><EFBFBD>霈?