Files
AIclinicalresearch/docs/08-项目管理/PKB和RVW功能迁移计划.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

945 lines
29 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.
# PKB锛堜釜浜虹煡璇嗗簱锛夊拰 RVW锛堝<E9949B>绋垮姛鑳斤級杩佺Щ璁″垝
> **鍒涘缓鏃ユ湡锛?* 2025-12-28
> **缁存姢鑰咃細** 鎶€鏈<E282AC>洟闃?
> **鐩<>爣锛?* 灏嗗凡寮€鍙戠殑PKB鍜孯VW鍔熻兘杩佺Щ鍒版渶鏂扮殑妯″潡鍖栨灦鏋勪笂
---
## 馃搵 鎵ц<E98EB5>鎽樿<E98EBD>
### 杩佺Щ鐩<D0A9>
灏嗘棫鐗堟湰锛坄frontend` + `backend/src/legacy`锛変腑鐨?*涓<>汉鐭ヨ瘑搴擄紙PKB锛?*鍜?*瀹ǹ鍔熻兘锛圧VW锛?*杩佺Щ鍒版柊鏋舵瀯锛坄frontend-v2` + `backend/src/modules`锛夛紝浣垮叾绗﹀悎鏈€鏂扮殑妯″潡鍖栥€佷簯鍘熺敓璁捐<EFBFBD>瑙勮寖銆?
### 褰撳墠鐘舵€?
| 鍔熻兘 | 鏃ф灦鏋勪綅缃?| 瀹屾垚搴?| 鏁版嵁搴揝chema | 鍓嶇<E98D93>UI |
|------|-----------|--------|-------------|--------|
| **PKB 涓<>汉鐭ヨ瘑搴?* | `backend/src/legacy` + `frontend/src` | 鉁?100% | `pkb_schema` | 鉁?瀹屾暣UI |
| **RVW 瀹$ǹ鍔熻兘** | `backend/src/legacy` + `frontend/src` | 鉁?100% | `public.ReviewTask` | 鉁?瀹屾暣UI |
### 杩佺Щ浼樺厛绾?
1. **P0锛堟渶楂樹紭鍏堢骇锛?*: PKB涓<42>汉鐭ヨ瘑搴?- 宸?00%瀹屾垚锛岃縼绉婚<E7BB89>闄╀綆
2. **P1锛堥珮浼樺厛绾э級**: RVW瀹ǹ鍔熻兘 - 宸?00%瀹屾垚锛岃縼绉婚<E7BB89>闄╀綆
---
## 馃攳 宸叉湁鍔熻兘娣卞害鍒嗘瀽
### 涓€銆丳KB锛堜釜浜虹煡璇嗗簱锛夊姛鑳借<E991B3>鎯?
#### 1.1 鍔熻兘鐗规€?
**鏍稿績鑳藉姏锛?*
- 鉁?**鐭ヨ瘑搴揅RUD**锛氬垱寤恒€佹煡鐪嬨€佺紪杈戙€佸垹闄ょ煡璇嗗簱
- 鉁?**閰嶉<E996B0>悊**锛氭瘡鐢ㄦ埛3涓<33>煡璇嗗簱锛屾瘡搴?0涓<30>枃妗?
- 鉁?**鏂囨。涓婁紶**锛氭敮鎸丳DF銆乄ord銆乀XT銆丮arkdown
- 鉁?**鏂囨。鐘舵€佽拷韪?*锛歶ploading 鈫?parsing 鈫?indexing 鈫?completed/error
- 鉁?**Dify RAG闆嗘垚**锛氬熀浜嶥ify骞冲彴鐨勫悜閲忔<E996B2>绱?
- 鉁?**璇<>箟妫€绱?*锛氭敮鎸佸<E98EB8>鐭ヨ瘑搴撹仈鍚堟<E98D9A><EFBFBD>紝top_k=15
- 鉁?**缁熻<E7BC81>淇℃伅**锛氭枃妗暟銆乀oken鏁般€佹<E282AC>钀芥暟缁熻<E7BC81>
- 鉁?**鍏ㄦ枃闃呰<E99783>妯″紡**锛圥hase2锛夛細Token闄愬埗銆佹櫤鑳芥枃妗€夋嫨
**鎶€鏈<E282AC>寒鐐癸細**
- 馃弳 **Python寰<6E>湇鍔¢泦鎴?*锛氳皟鐢╜extraction_service`鎻愬彇鏂囨。鏂囨湰
- 馃弳 **Dify Dataset绠悊**锛氭瘡涓<E798A1>煡璇嗗簱瀵瑰簲涓€涓狣ify Dataset
- 馃弳 **Token绮剧畻**锛氫娇鐢╰iktoken璁畻Token鏁帮紝鍙岄噸闄愬埗锛?0鏂囦欢 + 980K tokens锛?
- 馃弳 **鏅鸿兘鏂囨。閫夋嫨**锛氬熀浜嶵oken瀹归噺鐨勬櫤鑳芥帹鑽愮畻娉?
#### 1.2 鏁版嵁搴撶粨鏋?
**PKB Schema锛坄pkb_schema`锛夛細**
```prisma
model KnowledgeBase {
id String @id @default(uuid())
userId String
name String
description String?
difyDatasetId String // 鏄犲皠鍒癉ify
fileCount Int @default(0)
totalSizeBytes BigInt @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
documents Document[]
batchTasks BatchTask[]
}
model Document {
id String @id @default(uuid())
kbId String
userId String
filename String
fileType String
fileSizeBytes BigInt
fileUrl String
difyDocumentId String
status String // uploading/parsing/indexing/completed/error
progress Int @default(0)
errorMessage String?
segmentsCount Int?
tokensCount Int?
extractionMethod String? // nougat/pymupdf/mammoth
extractionQuality Float?
charCount Int?
language String? // chinese/english
extractedText String? // Phase2锛氬叏鏂囧瓨鍌?
uploadedAt DateTime @default(now())
processedAt DateTime?
}
model BatchTask {
id String @id @default(uuid())
userId String
kbId String
name String
templateType String
templateId String?
prompt String
status String
totalDocuments Int
completedCount Int @default(0)
failedCount Int @default(0)
modelType String
concurrency Int @default(3)
startedAt DateTime?
completedAt DateTime?
durationSeconds Int?
results BatchResult[]
}
```
#### 1.3 鍚庣<E98D9A>爜缁撴瀯
**鏈嶅姟灞傦紙`backend/src/legacy/services/`锛夛細**
```typescript
knowledgeBaseService.ts (365?
createKnowledgeBase() // 鍒涘缓鐭ヨ瘑搴擄紙Dify Dataset锛?
getKnowledgeBases() // 鑾峰彇鍒楄〃
getKnowledgeBaseById() // 鑾峰彇璇︽儏
updateKnowledgeBase() // 鏇存柊
deleteKnowledgeBase() // 鍒犻櫎锛堢骇鑱斿垹闄<E59EB9>ify Dataset锛?
searchKnowledgeBase() // 璇<>箟妫€绱<E282AC>紙璋冪敤Dify API锛?
getKnowledgeBaseStats() // 缁熻<E7BC81>淇℃伅
getDocumentSelection() // 鏅鸿兘鏂囨。閫夋嫨锛圥hase2锛?
documentService.ts
uploadDocument() // 涓婁紶鏂囨。
getDocuments() // 鑾峰彇鏂囨。鍒楄〃
deleteDocument() // 鍒犻櫎鏂囨。
reprocessDocument() // 閲嶆柊澶勭悊
pollDocumentStatus() // 杞<><E69D9E>鐘舵€?
tokenService.ts (243?
calculateDocumentTokens() // 璁畻Token
selectDocumentsForFullText() // 鏅鸿兘閫夋嫨
TOKEN_LIMITS
```
**鎺у埗鍣ㄥ眰锛坄backend/src/legacy/controllers/`锛夛細**
```typescript
knowledgeBaseController.ts (341?
POST /knowledge-bases
GET /knowledge-bases
GET /knowledge-bases/:id
PUT /knowledge-bases/:id
DELETE /knowledge-bases/:id
GET /knowledge-bases/:id/search
GET /knowledge-bases/:id/stats
GET /knowledge-bases/:id/document-selection
documentController.ts
POST /knowledge-bases/:kbId/documents
GET /knowledge-bases/:kbId/documents
GET /documents/:id
GET /documents/:id/full-text
DELETE /documents/:id
POST /documents/:id/reprocess
```
#### 1.4 鍓嶇<E98D93>爜缁撴瀯
**涓婚〉闈<E38089>紙`frontend/src/pages/KnowledgePage.tsx`锛夛細** 281琛?
- 鐭ヨ瘑搴撳垪琛ㄨ<E7909B>鍥?
- 鐭ヨ瘑搴撹<E690B4>鎯呰<E98EAF>鍥撅紙Tabs锛氭枃妗<E5A697>鐞?+ 缁熻<E7BC81>淇℃伅锛?
- 鍙岃繘搴︽潯瀹归噺鏄剧ず锛堟枃浠舵暟 + Token鏁帮級
**缁勪欢锛坄frontend/src/components/knowledge/`锛夛細**
```
KnowledgeBaseList.tsx // 鐭ヨ瘑搴撳崱鐗囧垪琛?
CreateKBDialog.tsx // 鍒涘缓瀵硅瘽妗?
EditKBDialog.tsx // 缂栬緫瀵硅瘽妗?
DocumentList.tsx // 鏂囨。鍒楄〃锛堝惈鐘舵€佸窘绔狅級
DocumentUpload.tsx // 鏂囦欢涓婁紶锛堟嫋鎷芥敮鎸侊級
```
**鐘舵€佺<E282AC>鐞嗭紙`frontend/src/stores/useKnowledgeBaseStore.ts`锛夛細**
- Zustand鐘舵€佺<E282AC>鐞?
- API璋冪敤灏佽<E7818F>
- 瀹炴椂鐘舵€佽疆璇<E79686>紙5绉掗棿闅旓級
---
### 浜屻€丷VW锛堝<E9949B>绋垮姛鑳斤級鍔熻兘璇︽儏
#### 2.1 鍔熻兘鐗规€?
**鏍稿績鑳藉姏锛?*
- 鉁?**绋夸欢涓婁紶**锛氭敮鎸乄ord鏂囨。锛?doc/.docx锛夛紝鏈€澶?MB
- 鉁?**鍙岀淮搴﹁瘎浼?*锛?
- 绋跨害瑙勮寖鎬ц瘎浼帮紙11椤规爣鍑嗭級
- 鏂规硶瀛﹁瘎浼帮紙3澶ч儴鍒嗭級
- 鉁?**鍩轰簬鐪熷疄鏈熷垔鏍囧噯**锛氥€婁腑鍗庡尰瀛﹁秴澹版潅蹇椼€嬬ǹ绾?
- 鉁?**鏅鸿兘鍒嗘瀽**锛氫娇鐢↙LM杩涜<E69DA9>缁撴瀯鍖栬瘎浼?
- 鉁?**瀹屾暣鎶ュ憡**锛欽SON鏍煎紡缁撴灉锛屾敮鎸佸<E98EB8>鍑篜DF/澶嶅埗鏂囨湰
- 鉁?**妯″瀷閫夋嫨**锛欴eepSeek-V3 / Qwen3-72B / Qwen-Long
- 鉁?**浠诲姟绠$悊**锛氫换鍔″垪琛ㄣ€佺姸鎬佽拷韪<E68BB7>€佽繘搴︽樉绀?
**璇勪及鏍囧噯锛?*
**绋跨害瑙勮寖鎬ц瘎浼帮紙11椤癸級锛?*
1. 鏂囬<E98F82>锛圱itle锛?
2. 浣滆€咃紙Authors锛?
3.<>枃鎽樿<E98EBD>锛圕hinese Abstract锛?
4. 鑻辨枃鎽樿<E98EBD>锛圗nglish Abstract锛?
5.<>枃鍏抽敭璇嶏紙Chinese Keywords锛?
6. 鑻辨枃鍏抽敭璇嶏紙English Keywords锛?
7.枃锛圡ain Text锛?
8. 鍙傝€冩枃鐚<E69E83>紙References锛?
9. 鍥捐〃锛團igures and Tables锛?
10. 鍒╃泭鍐茬獊锛圕onflict of Interest锛?
11. 浼︾悊瀹℃煡锛圗thics Approval锛?
**鏂规硶瀛﹁瘎浼帮紙3閮ㄥ垎锛夛細**
1. 绉戠爺璁捐<E79281>锛圧esearch Design锛?
2. 缁熻<E7BC81>鏂规硶锛圫tatistical Methods锛?
3. 缁熻<E7BC81>鍒嗘瀽锛圫tatistical Analysis锛?
#### 2.2 鏁版嵁搴撶粨鏋?
**ReviewTask琛<6B>紙褰撳墠鍦╜public` schema锛岄渶杩佺Щ鍒癭rvw_schema`锛夛細**
```prisma
model ReviewTask {
id String @id @default(uuid())
userId String
fileName String
fileSize BigInt
extractedText String?
wordCount Int?
status String // pending/extracting/reviewing_editorial/reviewing_methodology/completed/failed
modelUsed String
overallScore Float?
editorialReview Json? // 绋跨害瑙勮寖鎬ц瘎浼扮粨鏋?
methodologyReview Json? // 鏂规硶瀛﹁瘎浼扮粨鏋?
errorMessage String?
startedAt DateTime?
completedAt DateTime?
durationSeconds Int?
createdAt DateTime @default(now())
}
```
#### 2.3 鍚庣<E98D9A>爜缁撴瀯
**鏈嶅姟灞傦紙`backend/src/legacy/services/reviewService.ts`锛夛細** 453琛?
```typescript
reviewManuscript() // 涓诲叆鍙紙寮傛<E5AFAE>鎵ц<E98EB5>锛?
processReviewTask() // 鍚庡彴澶勭悊浠诲姟
reviewEditorialStandards() // 绋跨害瑙勮寖鎬ц瘎浼?
reviewMethodology() // 鏂规硶瀛﹁瘎浼?
parseJSONFromLLMResponse() // 瀹归敊JSON瑙
getReviewTask() // 鑾峰彇浠诲姟鐘舵€?
getReviewTasks() // 鑾峰彇浠诲姟鍒楄〃锛堝垎椤碉級
deleteReviewTask() // 鍒犻櫎浠诲姟
getReviewReport() // 鑾峰彇瀹屾暣鎶ュ憡
```
**Prompt璁捐<E79281>锛坄backend/prompts/`锛夛細**
```
review_editorial_system.txt (210琛?
鈹斺攢鈹€ 11涓<31>瘎浼扮淮搴︾殑璇︾粏鏍囧噯
review_methodology_system.txt (231琛?
鈹斺攢鈹€ 3涓<33>儴鍒嗙殑璇勪及鏍囧噯
```
**鎺у埗鍣ㄥ眰锛坄backend/src/legacy/controllers/reviewController.ts`锛夛細** 265琛?
```typescript
POST /review/upload // 涓婁紶绋夸欢骞跺紑濮嬪<E6BFAE>鏌?
GET /review/tasks/:taskId // 鑾峰彇浠诲姟鐘舵€?
GET /review/tasks/:taskId/report // 鑾峰彇瀹℃煡鎶ュ憡
GET /review/tasks // 鑾峰彇浠诲姟鍒楄〃锛堝垎椤碉級
DELETE /review/tasks/:taskId // 鍒犻櫎浠诲姟
```
#### 2.4 鍓嶇<E98D93>爜缁撴瀯
**涓婚〉闈<E38089>紙`frontend/src/pages/ReviewPage.tsx`锛夛細** 625琛?
- 娓愬彉鑹叉爣棰樺崱鐗?
- 3姝ユ祦绋嬶細涓婁紶绋夸欢 鈫?閫夋嫨妯″瀷 鈫?寮€濮嬪<E6BFAE>鏌?
- 5姝ヨ繘搴﹀睍绀猴細涓婁紶 鈫?鎻愬彇鏂囨湰 鈫?绋跨害璇勪及 鈫?鏂规硶瀛﹁瘎浼?鈫?鐢熸垚鎶ュ憡
- 鎶ュ憡灞曠ず锛圱abs鍒囨崲锛?
- 瀵煎嚭鍔熻兘锛圥DF鐢熸垚 + 鏂囨湰澶嶅埗锛?
**缁勪欢锛坄frontend/src/components/review/`锛夛細**
```
ScoreCard.tsx // 鍒嗘暟鍗墖锛堥<E9949B>鑹茬紪鐮侊級
EditorialReview.tsx // 绋跨害瑙勮寖鎬ц瘎浼拌<E6B5BC>鎯?
MethodologyReview.tsx // 鏂规硶瀛﹁瘎浼拌<E6B5BC>鎯?
```
**瑙嗚<E79199>璁捐<E79281>锛?*
- 娓愬彉鑹蹭富棰橈細`linear-gradient(135deg, #667eea 0%, #764ba2 100%)`
- 鍒嗘暟棰滆壊缂栫爜锛氣墺90浼樼<E6B5BC>锛堢豢锛夈€佲墺80鑹<30>ソ锛堣摑锛夈€佲墺70涓<30>瓑锛堥粍锛夈€?70闇€鏀硅繘锛堢孩锛?
- 鎷栨嫿涓婁紶鏀<E7B4B6>
- 鍝嶅簲寮忓竷灞€
---
## 馃幆 杩佺Щ绛栫暐
### 杩佺Щ鍘熷垯
1. **淇濇寔鍔熻兘瀹屾暣鎬?*锛?00%淇濈暀鐜版湁鍔熻兘锛屼笉鍋氬垹鍑?
2. **閬靛惊鏂版灦鏋勮<E98F8B>鑼?*锛氱<E9949B>鍚堟ā鍧楀寲銆丼chema闅旂<E99785>銆佷簯鍘熺敓璁捐<E79281>
3. **澶嶇敤骞冲彴鑳藉姏**锛氫娇鐢╜common`灞傜殑瀛樺偍銆佹棩蹇椼€丩LM銆佹枃妗<E5A697>鐞嗘湇鍔?
4. **娓愯繘寮忚縼绉?*锛氬厛鍚庣<E98D9A>鍐嶅墠绔<E5A2A0>紝纭<E7B49D>繚姣忔<E5A7A3><EFBFBD>祴璇?
5. **淇濇寔鏁版嵁鍏煎<E98D8F>**锛氭暟鎹<E69A9F>簱琛ㄧ粨鏋勫钩婊戣縼绉伙紝涓嶄涪澶辨暟鎹?
---
## 馃搵 杩佺Щ浠诲姟娓呭崟
### Phase 1: PKB涓<42>汉鐭ヨ瘑搴撹縼绉伙紙浼樺厛锛?
#### Task 1.1锛氬悗绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂
**鐩<>爣鐩<E788A3>綍锛?* `backend/src/modules/pkb/`
**杩佺Щ姝ラ<E5A79D>锛?*
1. **鍒涘缓妯″潡缁撴瀯** (30鍒嗛挓)
```bash
backend/src/modules/pkb/
鈹溾攢鈹€ README.md # 妯″潡璇存槑
鈹溾攢鈹€ controllers/
鈹? 鈹溾攢鈹€ knowledgeBaseController.ts # 浠巐egacy杩佺Щ
鈹? 鈹斺攢鈹€ documentController.ts # 浠巐egacy杩佺Щ
鈹溾攢鈹€ services/
鈹? 鈹溾攢鈹€ knowledgeBaseService.ts # 浠巐egacy杩佺Щ
鈹? 鈹溾攢鈹€ documentService.ts # 浠巐egacy杩佺Щ
鈹? 鈹斺攢鈹€ tokenService.ts # 浠巐egacy杩佺Щ
鈹溾攢鈹€ routes/
鈹? 鈹斺攢鈹€ index.ts # 璺<>敱娉ㄥ唽
鈹斺攢鈹€ types/
鈹斺攢鈹€ index.ts # 绫诲瀷瀹氫箟
```
2. **澶嶅埗骞舵洿鏂版湇鍔″眰** (60鍒嗛挓)
- 浠巂backend/src/legacy/services/`澶嶅埗鏂囦欢
- 鏇存柊瀵煎叆璺<E58F86>緞锛?
```typescript
// 鉂?鏃т唬鐮?
import { prisma } from '../../config/database.js';
import { difyClient } from '../../common/rag/DifyClient.js';
// 鉁?鏂颁唬鐮?
import { prisma } from '@/config/database';
import { difyClient } from '@/common/rag/DifyClient';
```
- 浣跨敤骞冲彴鑳藉姏锛?
```typescript
// 鉁?浣跨敤storage鎶借薄灞傦紙濡傛灉闇€瑕佹枃浠跺瓨鍌<E793A8>
import { storage } from '@/common/storage';
// 鉁?浣跨敤logger锛堟浛鎹<E6B59B>onsole.log锛?
import { logger } from '@/common/logging';
// 鉁?浣跨敤extractionClient锛堝凡鏈夛級
import { extractionClient } from '@/common/document/ExtractionClient';
```
3. **澶嶅埗骞舵洿鏂版帶鍒跺櫒灞?* (30鍒嗛挓)
- 浠巂backend/src/legacy/controllers/`澶嶅埗鏂囦欢
- 鏇存柊瀵煎叆璺<E58F86>
- 绉婚櫎`MOCK_USER_ID`锛屼粠`request.user`鑾峰彇锛堝緟瀹炵幇璁よ瘉涓<EFBFBD>棿浠讹級
4. **鍒涘缓璺<E7BC93>敱鏂囦欢** (30鍒嗛挓)
```typescript
// backend/src/modules/pkb/routes/index.ts
import type { FastifyInstance } from 'fastify';
import * as knowledgeBaseController from '../controllers/knowledgeBaseController';
import * as documentController from '../controllers/documentController';
export default async function pkbRoutes(fastify: FastifyInstance) {
// 鐭ヨ瘑搴撶<E690B4>鐞?
fastify.post('/api/v1/pkb/knowledge-bases', knowledgeBaseController.createKnowledgeBase);
fastify.get('/api/v1/pkb/knowledge-bases', knowledgeBaseController.getKnowledgeBases);
fastify.get('/api/v1/pkb/knowledge-bases/:id', knowledgeBaseController.getKnowledgeBaseById);
fastify.put('/api/v1/pkb/knowledge-bases/:id', knowledgeBaseController.updateKnowledgeBase);
fastify.delete('/api/v1/pkb/knowledge-bases/:id', knowledgeBaseController.deleteKnowledgeBase);
fastify.get('/api/v1/pkb/knowledge-bases/:id/search', knowledgeBaseController.searchKnowledgeBase);
fastify.get('/api/v1/pkb/knowledge-bases/:id/stats', knowledgeBaseController.getKnowledgeBaseStats);
fastify.get('/api/v1/pkb/knowledge-bases/:id/document-selection', knowledgeBaseController.getDocumentSelection);
// 鏂囨。绠$悊
fastify.post('/api/v1/pkb/knowledge-bases/:kbId/documents', documentController.uploadDocument);
fastify.get('/api/v1/pkb/knowledge-bases/:kbId/documents', documentController.getDocuments);
fastify.get('/api/v1/pkb/documents/:id', documentController.getDocumentById);
fastify.get('/api/v1/pkb/documents/:id/full-text', documentController.getDocumentFullText);
fastify.delete('/api/v1/pkb/documents/:id', documentController.deleteDocument);
fastify.post('/api/v1/pkb/documents/:id/reprocess', documentController.reprocessDocument);
}
```
5. **鍦ㄤ富鍏ュ彛娉ㄥ唽璺<E594BD>敱** (10鍒嗛挓)
```typescript
// backend/src/index.ts
import pkbRoutes from './modules/pkb/routes';
// 娉ㄥ唽PKB璺<42>
await fastify.register(pkbRoutes);
```
6. **鍒涘缓妯″潡README** (20鍒嗛挓)
```markdown
# PKB 涓<>汉鐭ヨ瘑搴撴ā鍧?
## 鍔熻兘姒傝堪
- 鐭ヨ瘑搴揅RUD
- 鏂囨。涓婁紶涓庣<E6B693>鐞?
- Dify RAG妫€绱?
- 鎵瑰<E98EB5>鐞嗕换鍔?
## API绔<49>
...
## 鏁版嵁搴揝chema
- pkb_schema.knowledge_bases
- pkb_schema.documents
- pkb_schema.batch_tasks
- pkb_schema.batch_results
```
#### Task 1.2锛氬墠绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂
**鐩<>爣鐩<E788A3>綍锛?* `frontend-v2/src/modules/pkb/`
**杩佺Щ姝ラ<E5A79D>锛?*
1. **鍒涘缓妯″潡缁撴瀯** (30鍒嗛挓)
```bash
frontend-v2/src/modules/pkb/
鈹溾攢鈹€ index.tsx # 妯″潡鍏ュ彛锛堣矾鐢遍厤缃<E58EA4>
鈹溾攢鈹€ api/
鈹? 鈹斺攢鈹€ index.ts # API灏佽<E7818F>
鈹溾攢鈹€ pages/
鈹? 鈹溾攢鈹€ KnowledgeBasePage.tsx # 鐭ヨ瘑搴撳垪琛ㄩ〉
鈹? 鈹斺攢鈹€ KnowledgeBaseDetail.tsx # 鐭ヨ瘑搴撹<E690B4>鎯呴〉
鈹溾攢鈹€ components/
鈹? 鈹溾攢鈹€ KnowledgeBaseList.tsx
鈹? 鈹溾攢鈹€ CreateKBDialog.tsx
鈹? 鈹溾攢鈹€ EditKBDialog.tsx
鈹? 鈹溾攢鈹€ DocumentList.tsx
鈹? 鈹斺攢鈹€ DocumentUpload.tsx
鈹溾攢鈹€ hooks/
鈹? 鈹斺攢鈹€ useKnowledgeBase.ts # 鐘舵€佺<E282AC>鐞?
鈹斺攢鈹€ types/
鈹斺攢鈹€ index.ts # 绫诲瀷瀹氫箟
```
2. **澶嶅埗骞舵洿鏂癆PI灞?* (30鍒嗛挓)
- 浠巂frontend/src/api/knowledgeBaseApi.ts`澶嶅埗
- 鏇存柊API璺<49>緞锛歚/api/knowledge-bases` 鈫?`/api/v1/pkb/knowledge-bases`
3. **澶嶅埗骞舵洿鏂扮粍浠?* (90鍒嗛挓)
- 浠巂frontend/src/components/knowledge/`澶嶅埗鎵€鏈夌粍浠?
- 鏇存柊瀵煎叆璺<E58F86>
- 浣跨敤鏂扮殑`request`瀹炰緥锛堝<EFBFBD>鏋滄湁锛?
- 淇濇寔Ant Design 6.0缁勪欢鍏煎<EFBFBD>鎬?
4. **澶嶅埗骞舵洿鏂颁富椤甸潰** (60鍒嗛挓)
- 浠巂frontend/src/pages/KnowledgePage.tsx`澶嶅埗
- 鎷嗗垎涓轰袱涓<E8A2B1>〉闈<E38089>細鍒楄〃椤?+ 璇︽儏椤碉紙鍙<E7B499>€夛級
- 鏇存柊鐘舵€佺<E282AC>鐞嗭細Zustand 鈫?React Query鎴栦繚鎸乑ustand
5. **鍒涘缓妯″潡鍏ュ彛** (30鍒嗛挓)
```typescript
// frontend-v2/src/modules/pkb/index.tsx
import { lazy } from 'react';
import { ModuleConfig } from '@/framework/modules/types';
const KnowledgeBasePage = lazy(() => import('./pages/KnowledgeBasePage'));
const pkbModule: ModuleConfig = {
id: 'pkb',
name: '涓<>汉鐭ヨ瘑搴?,
icon: 'FileTextOutlined',
routes: [
{
path: '/pkb',
element: <KnowledgeBasePage />,
permission: 'pkb:view',
},
],
};
export default pkbModule;
```
6. **鍦ㄦ<E98DA6>鏋朵腑娉ㄥ唽妯″潡** (10鍒嗛挓)
```typescript
// frontend-v2/src/framework/modules/moduleRegistry.ts
import pkbModule from '@/modules/pkb';
registerModule(pkbModule);
```
#### Task 1.3锛氭暟鎹<EFBFBD>簱Schema楠岃瘉 鈴憋笍 棰勮<E6A3B0>30鍒嗛挓
**妫€鏌ヤ簨椤癸細**
- 鉁?`pkb_schema.knowledge_bases` 琛ㄧ粨鏋勫畬鏁?
- 鉁?`pkb_schema.documents` 琛ㄧ粨鏋勫畬鏁?
- 鉁?`pkb_schema.batch_tasks` 琛ㄧ粨鏋勫畬鏁?
- 鉁?`pkb_schema.batch_results` 琛ㄧ粨鏋勫畬鏁?
- 鉁?澶栭敭鍏崇郴姝g‘
- 鉁?绱㈠紩榻愬叏
**Prisma Schema宸插瓨鍦<E793A8>紝鏃犻渶淇<E6B8B6>敼銆?*
#### Task 1.4锛氶泦鎴愭祴璇?鈴憋笍 棰勮<E6A3B0>1灏忔椂
**娴嬭瘯娓呭崟锛?*
1. 鉁?鍒涘缓鐭ヨ瘑搴?
2. 鉁?涓婁紶鏂囨。锛圥DF/Word锛?
3. 鉁?鏂囨。鐘舵€佽疆璇?
4. 鉁?璇<>箟妫€绱?
5. 鉁?鍒犻櫎鏂囨。
6. 鉁?鍒犻櫎鐭ヨ瘑搴?
7. 鉁?Token璁畻鍜屾櫤鑳介€夋嫨
8. 鉁?鎵瑰<E98EB5>鐞嗕换鍔″垱寤哄拰鎵ц<E98EB5>
---
### Phase 2: RVW瀹ǹ鍔熻兘杩佺Щ
#### Task 2.1锛氬悗绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂
**鐩<>爣鐩<E788A3>綍锛?* `backend/src/modules/rvw/`
**杩佺Щ姝ラ<E5A79D>锛?*
1. **鍒涘缓妯″潡缁撴瀯** (30鍒嗛挓)
```bash
backend/src/modules/rvw/
鈹溾攢鈹€ README.md
鈹溾攢鈹€ controllers/
鈹? 鈹斺攢鈹€ reviewController.ts
鈹溾攢鈹€ services/
鈹? 鈹斺攢鈹€ reviewService.ts
鈹溾攢鈹€ routes/
鈹? 鈹斺攢鈹€ index.ts
鈹溾攢鈹€ prompts/
鈹? 鈹溾攢鈹€ editorial_system.txt # 浠巄ackend/prompts/澶嶅埗
鈹? 鈹斺攢鈹€ methodology_system.txt # 浠巄ackend/prompts/澶嶅埗
鈹斺攢鈹€ types/
鈹斺攢鈹€ index.ts
```
2. **澶嶅埗骞舵洿鏂版湇鍔″眰** (60鍒嗛挓)
- 浠巂backend/src/legacy/services/reviewService.ts`澶嶅埗
- 鏇存柊瀵煎叆璺<E58F86>
- 浣跨敤骞冲彴鑳藉姏锛?
```typescript
import { logger } from '@/common/logging';
import { extractionClient } from '@/common/document/ExtractionClient';
import { LLMFactory } from '@/common/llm/adapters/LLMFactory';
```
- 绉诲姩Prompt鏂囦欢鍒版ā鍧楀唴閮?
3. **澶嶅埗骞舵洿鏂版帶鍒跺櫒灞?* (30鍒嗛挓)
- 浠巂backend/src/legacy/controllers/reviewController.ts`澶嶅埗
- 鏇存柊瀵煎叆璺<E58F86>
4. **鍒涘缓璺<E7BC93>敱鏂囦欢** (30鍒嗛挓)
```typescript
// backend/src/modules/rvw/routes/index.ts
import type { FastifyInstance } from 'fastify';
import * as reviewController from '../controllers/reviewController';
export default async function rvwRoutes(fastify: FastifyInstance) {
fastify.post('/api/v1/rvw/upload', reviewController.uploadManuscript);
fastify.get('/api/v1/rvw/tasks/:taskId', reviewController.getTaskStatus);
fastify.get('/api/v1/rvw/tasks/:taskId/report', reviewController.getTaskReport);
fastify.get('/api/v1/rvw/tasks', reviewController.getTaskList);
fastify.delete('/api/v1/rvw/tasks/:taskId', reviewController.deleteTask);
}
```
5. **鍦ㄤ富鍏ュ彛娉ㄥ唽璺<E594BD>敱** (10鍒嗛挓)
```typescript
// backend/src/index.ts
import rvwRoutes from './modules/rvw/routes';
await fastify.register(rvwRoutes);
```
#### Task 2.2锛氭暟鎹<EFBFBD>簱Schema杩佺Щ 鈴憋笍 棰勮<E6A3B0>1灏忔椂
**褰撳墠闂<E5A2A0><E99782>锛?* `ReviewTask`琛ㄥ湪`public` schema锛岄渶杩佺Щ鍒癭rvw_schema`
**杩佺Щ姝ラ<E5A79D>锛?*
1. **鏇存柊Prisma Schema** (20鍒嗛挓)
```prisma
// backend/prisma/schema.prisma
model ReviewTask {
id String @id @default(uuid())
userId String @map("user_id")
fileName String @map("file_name")
fileSize BigInt @map("file_size")
extractedText String? @map("extracted_text")
wordCount Int? @map("word_count")
status String @default("pending")
modelUsed String @map("model_used")
overallScore Float? @map("overall_score")
editorialReview Json? @map("editorial_review")
methodologyReview Json? @map("methodology_review")
errorMessage String? @map("error_message")
startedAt DateTime? @map("started_at")
completedAt DateTime? @map("completed_at")
durationSeconds Int? @map("duration_seconds")
createdAt DateTime @default(now()) @map("created_at")
@@index([userId], map: "idx_rvw_tasks_user_id")
@@index([status], map: "idx_rvw_tasks_status")
@@index([createdAt], map: "idx_rvw_tasks_created_at")
@@map("review_tasks")
@@schema("rvw_schema") // 猸?杩佺Щ鍒皉vw_schema
}
```
2. **鍒涘缓杩佺Щ鑴氭湰** (20鍒嗛挓)
```sql
-- backend/prisma/migrations/migrate_review_to_rvw_schema.sql
-- 1. 鍒涘缓rvw_schema锛堝<E9949B>鏋滀笉瀛樺湪锛?
CREATE SCHEMA IF NOT EXISTS rvw_schema;
-- 2. 鍦╮vw_schema涓<61>垱寤烘柊琛?
CREATE TABLE rvw_schema.review_tasks (
-- 澶嶅埗public.ReviewTask琛ㄧ粨鏋?
-- 娣诲姞铔囧舰鍛藉悕锛坲ser_id, file_name绛夛級
);
-- 3. 杩佺Щ鏁版嵁
INSERT INTO rvw_schema.review_tasks
SELECT * FROM public."ReviewTask";
-- 4. 鍒涘缓绱㈠紩
CREATE INDEX idx_rvw_tasks_user_id ON rvw_schema.review_tasks(user_id);
CREATE INDEX idx_rvw_tasks_status ON rvw_schema.review_tasks(status);
CREATE INDEX idx_rvw_tasks_created_at ON rvw_schema.review_tasks(created_at);
-- 5. 楠岃瘉鏁版嵁
SELECT COUNT(*) FROM rvw_schema.review_tasks;
-- 6. 澶囦唤鍚庡垹闄ゆ棫琛<E6A3AB>紙鍙<E7B499>€夛級
-- DROP TABLE public."ReviewTask";
```
3. **杩愯<E69DA9>杩佺Щ** (20鍒嗛挓)
```bash
# 鐢熸垚Prisma Client
cd backend
npx prisma generate
# 杩愯<E69DA9>鎵嬪姩杩佺Щ鑴氭湰
psql $DATABASE_URL < prisma/migrations/migrate_review_to_rvw_schema.sql
# 楠岃瘉
npm run test:db
```
#### Task 2.3锛氬墠绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂
**鐩<>爣鐩<E788A3>綍锛?* `frontend-v2/src/modules/rvw/`
**杩佺Щ姝ラ<E5A79D>锛?*
1. **鍒涘缓妯″潡缁撴瀯** (30鍒嗛挓)
```bash
frontend-v2/src/modules/rvw/
鈹溾攢鈹€ index.tsx
鈹溾攢鈹€ api/
鈹? 鈹斺攢鈹€ index.ts
鈹溾攢鈹€ pages/
鈹? 鈹溾攢鈹€ ReviewPage.tsx
鈹? 鈹斺攢鈹€ ReviewList.tsx (鍙<>€?
鈹溾攢鈹€ components/
鈹? 鈹溾攢鈹€ ScoreCard.tsx
鈹? 鈹溾攢鈹€ EditorialReview.tsx
鈹? 鈹斺攢鈹€ MethodologyReview.tsx
鈹溾攢鈹€ hooks/
鈹? 鈹斺攢鈹€ useReviewTask.ts
鈹斺攢鈹€ types/
鈹斺攢鈹€ index.ts
```
2. **澶嶅埗骞舵洿鏂癆PI灞?* (30鍒嗛挓)
- 浠巂frontend/src/api/reviewApi.ts`澶嶅埗
- 鏇存柊API璺<49>緞锛歚/api/review` 鈫?`/api/v1/rvw`
3. **澶嶅埗骞舵洿鏂扮粍浠?* (60鍒嗛挓)
- 浠巂frontend/src/components/review/`澶嶅埗鎵€鏈夌粍浠?
- 淇濇寔瑙嗚<E79199>璁捐<E79281>锛堟笎鍙樿壊銆侀<E98A86>鑹茬紪鐮侊級
4. **澶嶅埗骞舵洿鏂颁富椤甸潰** (90鍒嗛挓)
- 浠巂frontend/src/pages/ReviewPage.tsx`澶嶅埗
- 淇濇寔瀹屾暣UI娴佺▼
- 鏇存柊CSS瀵煎叆锛堝<E9949B>鏋滈渶瑕侊級
5. **鍒涘缓妯″潡鍏ュ彛** (30鍒嗛挓)
```typescript
// frontend-v2/src/modules/rvw/index.tsx
import { lazy } from 'react';
import { ModuleConfig } from '@/framework/modules/types';
const ReviewPage = lazy(() => import('./pages/ReviewPage'));
const rvwModule: ModuleConfig = {
id: 'rvw',
name: '绋夸欢瀹℃煡',
icon: 'FileTextOutlined',
routes: [
{
path: '/rvw',
element: <ReviewPage />,
permission: 'rvw:view',
},
],
};
export default rvwModule;
```
6. **鍦ㄦ<E98DA6>鏋朵腑娉ㄥ唽妯″潡** (10鍒嗛挓)
#### Task 2.4锛氶泦鎴愭祴璇?鈴憋笍 棰勮<E6A3B0>1灏忔椂
**娴嬭瘯娓呭崟锛?*
1. 鉁?涓婁紶Word绋夸欢
2. 鉁?鐘舵€佽疆璇<E79686>紙5涓<35><E6B693>楠わ級
3. 鉁?绋跨害瑙勮寖鎬ц瘎浼帮紙11椤癸級
4. 鉁?鏂规硶瀛﹁瘎浼帮紙3閮ㄥ垎锛?
5. 鉁?鎬讳綋璇勫垎璁$畻
6. 鉁?鎶ュ憡灞曠ず锛圱abs鍒囨崲锛?
7. 鉁?瀵煎嚭PDF
8. 鉁?澶嶅埗鎶ュ憡鏂囨湰
9. 鉁?浠诲姟鍒楄〃鏌ヨ<E98F8C>
10. 鉁?鍒犻櫎浠诲姟
---
## 馃敡 鎶€鏈<E282AC>粏鑺傝ˉ鍏?
### 鍏抽敭渚濊禆澶嶇敤
**宸叉湁骞冲彴鑳藉姏锛堝彲鐩存帴澶嶇敤锛夛細**
```typescript
// 鉁?鏂囨。鎻愬彇鏈嶅姟锛堝凡鏈夛級
import { extractionClient } from '@/common/document/ExtractionClient';
// 鏀<>寔锛歅DF銆乄ord銆乀XT锛屽凡闆嗘垚Python寰<6E>湇鍔?
// 鉁?LLM缃戝叧锛堝凡鏈夛級
import { LLMFactory } from '@/common/llm/adapters/LLMFactory';
// 鏀<>寔锛欴eepSeek-V3, Qwen-Max, GPT-5-Pro, Claude-4.5
// 鉁?瀛樺偍鏈嶅姟锛堝凡鏈夛級
import { storage } from '@/common/storage';
// 鏀<>寔锛歀ocalAdapter 鈫?OSSAdapter闆朵唬鐮佸垏鎹?
// 鉁?鏃ュ織绯荤粺锛堝凡鏈夛級
import { logger } from '@/common/logging';
// 鉁?RAG鏈嶅姟锛堝凡鏈夛紝PKB闇€瑕侊級
import { difyClient } from '@/common/rag/DifyClient';
```
### 澶栭儴渚濊禆
**PKB妯″潡棰濆<E6A3B0>渚濊禆锛?*
- 鉁?**Dify骞冲彴**锛氬凡閮ㄧ讲锛屾彁渚汻AG妫€绱㈣兘鍔?
- 鉁?**tiktoken**锛歍oken璁畻锛屽凡瀹夎<E780B9>锛坄@dqbd/tiktoken`锛?
- 鉁?**Python寰<6E>湇鍔?*锛氭枃妗f彁鍙栵紝宸查儴缃?
**RVW妯″潡棰濆<E6A3B0>渚濊禆锛?*
- 鉁?**html2canvas**锛歅DF瀵煎嚭锛堝墠绔<E5A2A0>級锛岄渶瀹夎<E780B9>
- 鉁?**jspdf**锛歅DF鐢熸垚锛堝墠绔<E5A2A0>級锛岄渶瀹夎<E780B9>
### API璺<49>緞瑙勮寖
**鏂版灦鏋凙PI璺<49>緞锛?*
```
PKB妯″潡锛?
/api/v1/pkb/knowledge-bases/*
/api/v1/pkb/documents/*
RVW妯″潡锛?
/api/v1/rvw/upload
/api/v1/rvw/tasks/*
```
**鏃ф灦鏋凙PI璺<49>緞锛堥渶鍚戝悗鍏煎<E98D8F>锛夛細**
```
/api/knowledge-bases/* 锛堝彲淇濈暀锛岄噸瀹氬悜鍒版柊璺<E69F8A>緞锛?
/api/review/* 锛堝彲淇濈暀锛岄噸瀹氬悜鍒版柊璺<E69F8A>緞锛?
```
---
## 馃摑 鏁版嵁杩佺Щ涓庡悜鍚庡吋瀹?
### PKB妯″潡
- 鉁?**鏃犻渶鏁版嵁杩佺Щ**锛歚pkb_schema`宸插瓨鍦ㄤ笖缁撴瀯瀹屾暣
- 鉁?**API鍚戝悗鍏煎<E98D8F>**锛氫繚鐣欐棫璺<E6A3AB>`/api/knowledge-bases`锛屽唴閮ㄨ浆鍙戝埌鏂拌矾寰?
### RVW妯″潡
- 鈿狅笍 **闇€瑕佹暟鎹<E69A9F>縼绉?*锛歚public.ReviewTask` 鈫?`rvw_schema.review_tasks`
- 鈿狅笍 **瀛楁<E7809B>鍚嶈皟鏁?*锛氶┘宄板懡鍚?鈫?铔囧舰鍛藉悕锛坄userId` 鈫?`user_id`锛?
- 鉁?**API鍚戝悗鍏煎<E98D8F>**锛氫繚鐣欐棫璺<E6A3AB>`/api/review`锛屽唴閮ㄨ浆鍙戝埌鏂拌矾寰?
**杩佺Щ鑴氭湰妯℃澘锛?*
```sql
-- 鍒涘缓鏂癝chema
CREATE SCHEMA IF NOT EXISTS rvw_schema;
-- 鍒涘缓鏂拌〃锛堣泧褰㈠懡鍚嶏級
CREATE TABLE rvw_schema.review_tasks AS
SELECT
id,
"userId" AS user_id,
"fileName" AS file_name,
"fileSize" AS file_size,
"extractedText" AS extracted_text,
"wordCount" AS word_count,
status,
"modelUsed" AS model_used,
"overallScore" AS overall_score,
"editorialReview" AS editorial_review,
"methodologyReview" AS methodology_review,
"errorMessage" AS error_message,
"startedAt" AS started_at,
"completedAt" AS completed_at,
"durationSeconds" AS duration_seconds,
"createdAt" AS created_at
FROM public."ReviewTask";
-- 鍒涘缓绱㈠紩
CREATE INDEX idx_rvw_tasks_user_id ON rvw_schema.review_tasks(user_id);
CREATE INDEX idx_rvw_tasks_status ON rvw_schema.review_tasks(status);
CREATE INDEX idx_rvw_tasks_created_at ON rvw_schema.review_tasks(created_at);
```
---
## 鉁?楠屾敹鏍囧噯
### PKB妯″潡杩佺Щ瀹屾垚鏍囧噯
1. 鉁?鍚庣<E98D9A>爜鍦╜backend/src/modules/pkb/`
2. 鉁?鍓嶇<E98D93>爜鍦╜frontend-v2/src/modules/pkb/`
3. 鉁?API璺<49>緞涓篳/api/v1/pkb/*`
4. 鉁?鎵€鏈夊姛鑳芥祴璇曢€氳繃锛堢煡璇嗗簱CRUD銆佹枃妗笂浼犮€佹<E282AC>绱€€佹壒澶勭悊锛?
5. 鉁?鍓嶇<E98D93>UI瀹屽叏杩佺Щ锛堝垪琛ㄣ€佽<E282AC>鎯呫€佷笂浼犮€佸<E282AC>璇濇<E79287>锛?
6. 鉁?澶嶇敤骞冲彴鑳藉姏锛坙ogger銆乻torage銆乪xtractionClient銆乨ifyClient锛?
7. 鉁?鏂囨。瀹屾暣锛圧EADME.md銆丄PI鏂囨。锛?
### RVW妯″潡杩佺Щ瀹屾垚鏍囧噯
1. 鉁?鍚庣<E98D9A>爜鍦╜backend/src/modules/rvw/`
2. 鉁?鍓嶇<E98D93>爜鍦╜frontend-v2/src/modules/rvw/`
3. 鉁?API璺<49>緞涓篳/api/v1/rvw/*`
4. 鉁?鏁版嵁宸茶縼绉诲埌`rvw_schema.review_tasks`
5. 鉁?鎵€鏈夊姛鑳芥祴璇曢€氳繃锛堜笂浼犮€佽瘎浼般€佹姤鍛娿€佸<E282AC>鍑猴級
6. 鉁?鍓嶇<E98D93>UI瀹屽叏杩佺Щ锛堜笂浼犮€佽繘搴︺€佹姤鍛娿€佸<E282AC>鍑猴級
7. 鉁?澶嶇敤骞冲彴鑳藉姏锛坙ogger銆乪xtractionClient銆丩LMFactory锛?
8. 鉁?Prompt鏂囦欢鍦ㄦā鍧楀唴閮<E594B4>`modules/rvw/prompts/`锛?
---
## 馃摎 鏂囨。鏇存柊娓呭崟
### 闇€瑕佹洿鏂扮殑鏂囨。
1. **绯荤粺褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?*
- 鏂囦欢锛歚docs/00-绯荤粺鎬讳綋璁捐<E79281>/00-绯荤粺褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?md`
- 鏇存柊锛歅KB鍜孯VW妯″潡鐘舵€佷粠"宸插畬鎴愶紙鏃ф灦鏋勶級"鏀逛负"鉁?100%锛堟柊鏋舵瀯锛?
2. **妯″潡README鍒涘缓**
- `backend/src/modules/pkb/README.md`
- `backend/src/modules/rvw/README.md`
3. **鍓嶇<E98D93>妯″潡鏂囨。**
- `frontend-v2/src/modules/pkb/README.md`
- `frontend-v2/src/modules/rvw/README.md`
4. **API鏂囨。鏇存柊**
- `docs/04-寮€鍙戣<E98D99>鑼?04-API璺<49>敱鎬昏<E98EAC>.md`
- 娣诲姞PKB鍜孯VW鐨凙PI绔<49>偣娓呭崟
5. **杩佺Щ瀹屾垚鎶ュ憡**
- 鏂板缓锛歚docs/08-椤圭洰绠$悊/PKB鍜孯VW杩佺Щ瀹屾垚鎶ュ憡.md`
- 璁板綍锛氳縼绉绘椂闂淬€侀亣鍒扮殑闂<E6AE91><E99782>銆佽В鍐虫柟妗堛€佹祴璇曠粨鏋?
---
## 馃幆 鎬荤粨
### 杩佺Щ浼樺娍
1. 鉁?**鏋舵瀯缁熶竴**锛氭墍鏈夋ā鍧楅伒寰<E4BC92>浉鍚岀殑妯″潡鍖栫粨鏋?
2. 鉁?**鏄撲簬缁存姢**锛氫唬鐮佺粍缁囨竻鏅帮紝鑱岃矗鏄庣‘
3. 鉁?**澶嶇敤骞冲彴鑳藉姏**锛氬噺灏戦噸澶嶄唬鐮侊紝鎻愬崌浠g爜璐ㄩ噺
4. 鉁?**鏀<>寔鐙<E5AF94>珛閮ㄧ讲**锛氭瘡涓<E798A1>ā鍧楀彲鐙<E5BDB2>珛鎵撳寘銆侀儴缃层€侀攢鍞?
5. 鉁?**Schema闅旂<E99785>**锛氭暟鎹<E69A9F>簱灞傞潰妯″潡鐙<E6BDA1>珛锛岄檷浣庤€﹀悎
### 棰勮<E6A3B0>鎬昏€楁椂
- **PKB妯″潡杩佺Щ**锛?-8灏忔椂
- **RVW妯″潡杩佺Щ**锛?-9灏忔椂锛堝惈鏁版嵁杩佺Щ锛?
- **鎬昏<E98EAC>**锛?3-17灏忔椂锛堢害2涓<32>伐浣滄棩锛?
### 椋庨櫓璇勪及
- 鉁?**椋庨櫓浣?*锛氬姛鑳藉凡100%瀹屾垚锛屼唬鐮佽川閲忛珮
- 鉁?**娴嬭瘯瑕嗙洊**锛氭湁瀹屾暣鐨勬墜鍔ㄦ祴璇曟祦绋?
- 鉁?**鍚戝悗鍏煎<E98D8F>**锛氫繚鐣欐棫API璺<49>緞锛屼笉褰卞搷鐜版湁鍓嶇<E98D93>
---
**鏂囨。缁存姢鑰咃細** 鎶€鏈<E282AC>洟闃?
**鏈€鍚庢洿鏂帮細** 2025-12-28
**涓嬩竴姝ワ細** 鎵ц<E98EB5>杩佺Щ浠诲姟锛屾寜TODO娓呭崟閫愰」瀹屾垚