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%)
29 KiB
PKB锛堜釜浜虹煡璇嗗簱锛夊拰 RVW锛堝<E9949B>绋垮姛鑳斤級杩佺Щ璁″垝
*鍒涘缓鏃ユ湡锛? 2025-12-28
缁存姢鑰咃細 鎶€鏈<E282AC>洟闃? *鐩<EFBFBD>爣锛? 灏嗗凡寮€鍙戠殑PKB鍜孯VW鍔熻兘杩佺Щ鍒版渶鏂扮殑妯″潡鍖栨灦鏋勪笂
馃搵 鎵ц<E98EB5>鎽樿<E98EBD>
杩佺Щ鐩<EFBFBD>爣
灏嗘棫鐗堟湰锛坄frontend+backend/src/legacy锛変腑鐨?*涓<>汉鐭ヨ瘑搴擄紙PKB锛?*鍜?*瀹$ǹ鍔熻兘锛圧VW锛?*杩佺Щ鍒版柊鏋舵瀯锛坄frontend-v2 + backend/src/modules锛夛紝浣垮叾绗﹀悎鏈€鏂扮殑妯″潡鍖栥€佷簯鍘熺敓璁捐<EFBFBD>瑙勮寖銆?
褰撳墠鐘舵€?
| 鍔熻兘 | 鏃ф灦鏋勪綅缃? | 瀹屾垚搴? | 鏁版嵁搴揝chema | 鍓嶇<EFBFBD>UI |
|---|---|---|---|---|
| *PKB 涓<>汉鐭ヨ瘑搴? | backend/src/legacy + frontend/src |
鉁?100% | pkb_schema |
鉁?瀹屾暣UI |
| RVW 瀹$ǹ鍔熻兘 | backend/src/legacy + frontend/src |
鉁?100% | public.ReviewTask |
鉁?瀹屾暣UI |
杩佺Щ浼樺厛绾?
- **P0锛堟渶楂樹紭鍏堢骇锛?*: PKB涓<42>汉鐭ヨ瘑搴?- 宸?00%瀹屾垚锛岃縼绉婚<E7BB89>闄╀綆
- P1锛堥珮浼樺厛绾э級: RVW瀹$ǹ鍔熻兘 - 宸?00%瀹屾垚锛岃縼绉婚<E7BB89>闄╀綆
馃攳 宸叉湁鍔熻兘娣卞害鍒嗘瀽
涓€銆丳KB锛堜釜浜虹煡璇嗗簱锛夊姛鑳借<EFBFBD>鎯?
1.1 鍔熻兘鐗规€?
*鏍稿績鑳藉姏锛?
- 鉁?鐭ヨ瘑搴揅RUD锛氬垱寤恒€佹煡鐪嬨€佺紪杈戙€佸垹闄ょ煡璇嗗簱
- 鉁?閰嶉<EFBFBD>绠$悊锛氭瘡鐢ㄦ埛3涓<EFBFBD>煡璇嗗簱锛屾瘡搴?0涓<30>枃妗?
- 鉁?鏂囨。涓婁紶锛氭敮鎸丳DF銆乄ord銆乀XT銆丮arkdown
- 鉁?**鏂囨。鐘舵€佽拷韪?*锛歶ploading 鈫?parsing 鈫?indexing 鈫?completed/error
- 鉁?Dify RAG闆嗘垚锛氬熀浜嶥ify骞冲彴鐨勫悜閲忔<EFBFBD>绱?
- 鉁?**璇<>箟妫€绱?*锛氭敮鎸佸<E98EB8>鐭ヨ瘑搴撹仈鍚堟<E98D9A>绱<EFBFBD>紝top_k=15
- 鉁?缁熻<EFBFBD>淇℃伅锛氭枃妗f暟銆乀oken鏁般€佹<EFBFBD>钀芥暟缁熻<EFBFBD>
- 鉁?鍏ㄦ枃闃呰<EFBFBD>妯″紡锛圥hase2锛夛細Token闄愬埗銆佹櫤鑳芥枃妗i€夋嫨
鎶€鏈<EFBFBD>寒鐐癸細
- 馃弳 **Python寰<6E>湇鍔¢泦鎴?*锛氳皟鐢╜extraction_service`鎻愬彇鏂囨。鏂囨湰
- 馃弳 Dify Dataset绠$悊锛氭瘡涓<EFBFBD>煡璇嗗簱瀵瑰簲涓€涓狣ify Dataset
- 馃弳 Token绮剧‘璁$畻锛氫娇鐢╰iktoken璁$畻Token鏁帮紝鍙岄噸闄愬埗锛?0鏂囦欢 + 980K tokens锛?
- 馃弳 鏅鸿兘鏂囨。閫夋嫨锛氬熀浜嶵oken瀹归噺鐨勬櫤鑳芥帹鑽愮畻娉?
1.2 鏁版嵁搴撶粨鏋?
PKB Schema锛坄pkb_schema`锛夛細
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>浠g爜缁撴瀯
鏈嶅姟灞傦紙backend/src/legacy/services/锛夛細
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/`锛夛細
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>浠g爜缁撴瀯
涓婚〉闈<EFBFBD>紙frontend/src/pages/KnowledgePage.tsx锛夛細 281琛?
- 鐭ヨ瘑搴撳垪琛ㄨ<EFBFBD>鍥?
- 鐭ヨ瘑搴撹<EFBFBD>鎯呰<EFBFBD>鍥撅紙Tabs锛氭枃妗g<EFBFBD>鐞?+ 缁熻<E7BC81>淇℃伅锛?
- 鍙岃繘搴︽潯瀹归噺鏄剧ず锛堟枃浠舵暟 + Token鏁帮級
缁勪欢锛坄frontend/src/components/knowledge/`锛夛細
KnowledgeBaseList.tsx // 鐭ヨ瘑搴撳崱鐗囧垪琛?
CreateKBDialog.tsx // 鍒涘缓瀵硅瘽妗?
EditKBDialog.tsx // 缂栬緫瀵硅瘽妗?
DocumentList.tsx // 鏂囨。鍒楄〃锛堝惈鐘舵€佸窘绔狅級
DocumentUpload.tsx // 鏂囦欢涓婁紶锛堟嫋鎷芥敮鎸侊級
鐘舵€佺<EFBFBD>鐞嗭紙frontend/src/stores/useKnowledgeBaseStore.ts锛夛細
- Zustand鐘舵€佺<EFBFBD>鐞?
- API璋冪敤灏佽<EFBFBD>
- 瀹炴椂鐘舵€佽疆璇<EFBFBD>紙5绉掗棿闅旓級
浜屻€丷VW锛堝<EFBFBD>绋垮姛鑳斤級鍔熻兘璇︽儏
2.1 鍔熻兘鐗规€?
*鏍稿績鑳藉姏锛?
- 鉁?绋夸欢涓婁紶锛氭敮鎸乄ord鏂囨。锛?doc/.docx锛夛紝鏈€澶?MB
- 鉁?**鍙岀淮搴﹁瘎浼?*锛?
- 绋跨害瑙勮寖鎬ц瘎浼帮紙11椤规爣鍑嗭級
- 鏂规硶瀛﹁瘎浼帮紙3澶ч儴鍒嗭級
- 鉁?鍩轰簬鐪熷疄鏈熷垔鏍囧噯锛氥€婁腑鍗庡尰瀛﹁秴澹版潅蹇椼€嬬ǹ绾?
- 鉁?鏅鸿兘鍒嗘瀽锛氫娇鐢↙LM杩涜<EFBFBD>缁撴瀯鍖栬瘎浼?
- 鉁?瀹屾暣鎶ュ憡锛欽SON鏍煎紡缁撴灉锛屾敮鎸佸<EFBFBD>鍑篜DF/澶嶅埗鏂囨湰
- 鉁?妯″瀷閫夋嫨锛欴eepSeek-V3 / Qwen3-72B / Qwen-Long
- 鉁?浠诲姟绠$悊锛氫换鍔″垪琛ㄣ€佺姸鎬佽拷韪<EFBFBD>€佽繘搴︽樉绀?
*璇勪及鏍囧噯锛?
*绋跨害瑙勮寖鎬ц瘎浼帮紙11椤癸級锛?
- 鏂囬<EFBFBD>锛圱itle锛?
- 浣滆€咃紙Authors锛?
- 涓<EFBFBD>枃鎽樿<EFBFBD>锛圕hinese Abstract锛?
- 鑻辨枃鎽樿<EFBFBD>锛圗nglish Abstract锛?
- 涓<EFBFBD>枃鍏抽敭璇嶏紙Chinese Keywords锛?
- 鑻辨枃鍏抽敭璇嶏紙English Keywords锛?
- 姝f枃锛圡ain Text锛?
- 鍙傝€冩枃鐚<EFBFBD>紙References锛?
- 鍥捐〃锛團igures and Tables锛?
- 鍒╃泭鍐茬獊锛圕onflict of Interest锛?
- 浼︾悊瀹℃煡锛圗thics Approval锛?
鏂规硶瀛﹁瘎浼帮紙3閮ㄥ垎锛夛細
- 绉戠爺璁捐<EFBFBD>锛圧esearch Design锛?
- 缁熻<EFBFBD>鏂规硶锛圫tatistical Methods锛?
- 缁熻<EFBFBD>鍒嗘瀽锛圫tatistical Analysis锛?
2.2 鏁版嵁搴撶粨鏋?
ReviewTask琛<EFBFBD>紙褰撳墠鍦╜public schema锛岄渶杩佺Щ鍒癭rvw_schema锛夛細
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>浠g爜缁撴瀯
鏈嶅姟灞傦紙backend/src/legacy/services/reviewService.ts锛夛細 453琛?
reviewManuscript() // 涓诲叆鍙o紙寮傛<E5AFAE>鎵ц<E98EB5>锛?
processReviewTask() // 鍚庡彴澶勭悊浠诲姟
reviewEditorialStandards() // 绋跨害瑙勮寖鎬ц瘎浼?
reviewMethodology() // 鏂规硶瀛﹁瘎浼?
parseJSONFromLLMResponse() // 瀹归敊JSON瑙f瀽
getReviewTask() // 鑾峰彇浠诲姟鐘舵€?
getReviewTasks() // 鑾峰彇浠诲姟鍒楄〃锛堝垎椤碉級
deleteReviewTask() // 鍒犻櫎浠诲姟
getReviewReport() // 鑾峰彇瀹屾暣鎶ュ憡
Prompt璁捐<EFBFBD>锛坄backend/prompts/`锛夛細
review_editorial_system.txt (210琛?
鈹斺攢鈹€ 11涓<31>瘎浼扮淮搴︾殑璇︾粏鏍囧噯
review_methodology_system.txt (231琛?
鈹斺攢鈹€ 3涓<33>儴鍒嗙殑璇勪及鏍囧噯
鎺у埗鍣ㄥ眰锛坄backend/src/legacy/controllers/reviewController.ts`锛夛細 265琛?
POST /review/upload // 涓婁紶绋夸欢骞跺紑濮嬪<E6BFAE>鏌?
GET /review/tasks/:taskId // 鑾峰彇浠诲姟鐘舵€?
GET /review/tasks/:taskId/report // 鑾峰彇瀹℃煡鎶ュ憡
GET /review/tasks // 鑾峰彇浠诲姟鍒楄〃锛堝垎椤碉級
DELETE /review/tasks/:taskId // 鍒犻櫎浠诲姟
2.4 鍓嶇<E98D93>浠g爜缁撴瀯
涓婚〉闈<EFBFBD>紙frontend/src/pages/ReviewPage.tsx锛夛細 625琛?
- 娓愬彉鑹叉爣棰樺崱鐗?
- 3姝ユ祦绋嬶細涓婁紶绋夸欢 鈫?閫夋嫨妯″瀷 鈫?寮€濮嬪<E6BFAE>鏌?
- 5姝ヨ繘搴﹀睍绀猴細涓婁紶 鈫?鎻愬彇鏂囨湰 鈫?绋跨害璇勪及 鈫?鏂规硶瀛﹁瘎浼?鈫?鐢熸垚鎶ュ憡
- 鎶ュ憡灞曠ず锛圱abs鍒囨崲锛?
- 瀵煎嚭鍔熻兘锛圥DF鐢熸垚 + 鏂囨湰澶嶅埗锛?
缁勪欢锛坄frontend/src/components/review/`锛夛細
ScoreCard.tsx // 鍒嗘暟鍗$墖锛堥<E9949B>鑹茬紪鐮侊級
EditorialReview.tsx // 绋跨害瑙勮寖鎬ц瘎浼拌<E6B5BC>鎯?
MethodologyReview.tsx // 鏂规硶瀛﹁瘎浼拌<E6B5BC>鎯?
*瑙嗚<EFBFBD>璁捐<EFBFBD>锛?
- 娓愬彉鑹蹭富棰橈細
linear-gradient(135deg, #667eea 0%, #764ba2 100%) - 鍒嗘暟棰滆壊缂栫爜锛氣墺90浼樼<EFBFBD>锛堢豢锛夈€佲墺80鑹<EFBFBD>ソ锛堣摑锛夈€佲墺70涓<EFBFBD>瓑锛堥粍锛夈€?70闇€鏀硅繘锛堢孩锛?
- 鎷栨嫿涓婁紶鏀<EFBFBD>寔
- 鍝嶅簲寮忓竷灞€
馃幆 杩佺Щ绛栫暐
杩佺Щ鍘熷垯
- **淇濇寔鍔熻兘瀹屾暣鎬?*锛?00%淇濈暀鐜版湁鍔熻兘锛屼笉鍋氬垹鍑?
- **閬靛惊鏂版灦鏋勮<E98F8B>鑼?*锛氱<E9949B>鍚堟ā鍧楀寲銆丼chema闅旂<E99785>銆佷簯鍘熺敓璁捐<E79281>
- 澶嶇敤骞冲彴鑳藉姏锛氫娇鐢╜common`灞傜殑瀛樺偍銆佹棩蹇椼€丩LM銆佹枃妗e<E5A697>鐞嗘湇鍔?
- **娓愯繘寮忚縼绉?*锛氬厛鍚庣<E98D9A>鍐嶅墠绔<E5A2A0>紝纭<E7B49D>繚姣忔<E5A7A3>鍙<EFBFBD>祴璇?
- **淇濇寔鏁版嵁鍏煎<E98D8F>**锛氭暟鎹<E69A9F>簱琛ㄧ粨鏋勫钩婊戣縼绉伙紝涓嶄涪澶辨暟鎹?
馃搵 杩佺Щ浠诲姟娓呭崟
Phase 1: PKB涓<42>汉鐭ヨ瘑搴撹縼绉伙紙浼樺厛锛?
Task 1.1锛氬悗绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂
*鐩<EFBFBD>爣鐩<EFBFBD>綍锛? backend/src/modules/pkb/
*杩佺Щ姝ラ<EFBFBD>锛?
-
鍒涘缓妯″潡缁撴瀯 (30鍒嗛挓)
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 # 绫诲瀷瀹氫箟 -
澶嶅埗骞舵洿鏂版湇鍔″眰 (60鍒嗛挓)
- 浠巂backend/src/legacy/services/`澶嶅埗鏂囦欢
- 鏇存柊瀵煎叆璺<EFBFBD>緞锛?
// 鉂?鏃т唬鐮? import { prisma } from '../../config/database.js'; import { difyClient } from '../../common/rag/DifyClient.js'; // 鉁?鏂颁唬鐮? import { prisma } from '@/config/database'; import { difyClient } from '@/common/rag/DifyClient'; - 浣跨敤骞冲彴鑳藉姏锛?
// 鉁?浣跨敤storage鎶借薄灞傦紙濡傛灉闇€瑕佹枃浠跺瓨鍌<E793A8>級 import { storage } from '@/common/storage'; // 鉁?浣跨敤logger锛堟浛鎹<E6B59B>onsole.log锛? import { logger } from '@/common/logging'; // 鉁?浣跨敤extractionClient锛堝凡鏈夛級 import { extractionClient } from '@/common/document/ExtractionClient';
-
*澶嶅埗骞舵洿鏂版帶鍒跺櫒灞? (30鍒嗛挓)
- 浠巂backend/src/legacy/controllers/`澶嶅埗鏂囦欢
- 鏇存柊瀵煎叆璺<EFBFBD>緞
- 绉婚櫎
MOCK_USER_ID锛屼粠request.user鑾峰彇锛堝緟瀹炵幇璁よ瘉涓<EFBFBD>棿浠讹級
-
鍒涘缓璺<EFBFBD>敱鏂囦欢 (30鍒嗛挓)
// 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); } -
鍦ㄤ富鍏ュ彛娉ㄥ唽璺<EFBFBD>敱 (10鍒嗛挓)
// backend/src/index.ts import pkbRoutes from './modules/pkb/routes'; // 娉ㄥ唽PKB璺<42>敱 await fastify.register(pkbRoutes); -
鍒涘缓妯″潡README (20鍒嗛挓)
# 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灏忔椂
*鐩<EFBFBD>爣鐩<EFBFBD>綍锛? frontend-v2/src/modules/pkb/
*杩佺Щ姝ラ<EFBFBD>锛?
-
鍒涘缓妯″潡缁撴瀯 (30鍒嗛挓)
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 # 绫诲瀷瀹氫箟 -
*澶嶅埗骞舵洿鏂癆PI灞? (30鍒嗛挓)
- 浠巂frontend/src/api/knowledgeBaseApi.ts`澶嶅埗
- 鏇存柊API璺<EFBFBD>緞锛歚/api/knowledge-bases
鈫?/api/v1/pkb/knowledge-bases`
-
*澶嶅埗骞舵洿鏂扮粍浠? (90鍒嗛挓)
- 浠巂frontend/src/components/knowledge/`澶嶅埗鎵€鏈夌粍浠?
- 鏇存柊瀵煎叆璺<EFBFBD>緞
- 浣跨敤鏂扮殑
request瀹炰緥锛堝<EFBFBD>鏋滄湁锛? - 淇濇寔Ant Design 6.0缁勪欢鍏煎<EFBFBD>鎬?
-
澶嶅埗骞舵洿鏂颁富椤甸潰 (60鍒嗛挓)
- 浠巂frontend/src/pages/KnowledgePage.tsx`澶嶅埗
- 鎷嗗垎涓轰袱涓<EFBFBD>〉闈<EFBFBD>細鍒楄〃椤?+ 璇︽儏椤碉紙鍙<E7B499>€夛級
- 鏇存柊鐘舵€佺<EFBFBD>鐞嗭細Zustand 鈫?React Query鎴栦繚鎸乑ustand
-
鍒涘缓妯″潡鍏ュ彛 (30鍒嗛挓)
// 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; -
鍦ㄦ<EFBFBD>鏋朵腑娉ㄥ唽妯″潡 (10鍒嗛挓)
// 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灏忔椂
*娴嬭瘯娓呭崟锛?
- 鉁?鍒涘缓鐭ヨ瘑搴?
- 鉁?涓婁紶鏂囨。锛圥DF/Word锛?
- 鉁?鏂囨。鐘舵€佽疆璇?
- 鉁?璇<>箟妫€绱?
- 鉁?鍒犻櫎鏂囨。
- 鉁?鍒犻櫎鐭ヨ瘑搴?
- 鉁?Token璁$畻鍜屾櫤鑳介€夋嫨
- 鉁?鎵瑰<E98EB5>鐞嗕换鍔″垱寤哄拰鎵ц<E98EB5>
Phase 2: RVW瀹$ǹ鍔熻兘杩佺Щ
Task 2.1锛氬悗绔<EFBFBD>唬鐮佽縼绉?鈴憋笍 棰勮<E6A3B0>2-3灏忔椂
*鐩<EFBFBD>爣鐩<EFBFBD>綍锛? backend/src/modules/rvw/
*杩佺Щ姝ラ<EFBFBD>锛?
-
鍒涘缓妯″潡缁撴瀯 (30鍒嗛挓)
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 -
澶嶅埗骞舵洿鏂版湇鍔″眰 (60鍒嗛挓)
- 浠巂backend/src/legacy/services/reviewService.ts`澶嶅埗
- 鏇存柊瀵煎叆璺<EFBFBD>緞
- 浣跨敤骞冲彴鑳藉姏锛?
import { logger } from '@/common/logging'; import { extractionClient } from '@/common/document/ExtractionClient'; import { LLMFactory } from '@/common/llm/adapters/LLMFactory'; - 绉诲姩Prompt鏂囦欢鍒版ā鍧楀唴閮?
-
*澶嶅埗骞舵洿鏂版帶鍒跺櫒灞? (30鍒嗛挓)
- 浠巂backend/src/legacy/controllers/reviewController.ts`澶嶅埗
- 鏇存柊瀵煎叆璺<EFBFBD>緞
-
鍒涘缓璺<EFBFBD>敱鏂囦欢 (30鍒嗛挓)
// 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); } -
鍦ㄤ富鍏ュ彛娉ㄥ唽璺<EFBFBD>敱 (10鍒嗛挓)
// backend/src/index.ts import rvwRoutes from './modules/rvw/routes'; await fastify.register(rvwRoutes);
Task 2.2锛氭暟鎹<EFBFBD>簱Schema杩佺Щ 鈴憋笍 棰勮<E6A3B0>1灏忔椂
*褰撳墠闂<EFBFBD><EFBFBD>锛? ReviewTask琛ㄥ湪public schema锛岄渶杩佺Щ鍒癭rvw_schema`
*杩佺Щ姝ラ<EFBFBD>锛?
-
鏇存柊Prisma Schema (20鍒嗛挓)
// 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 } -
鍒涘缓杩佺Щ鑴氭湰 (20鍒嗛挓)
-- 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"; -
杩愯<EFBFBD>杩佺Щ (20鍒嗛挓)
# 鐢熸垚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灏忔椂
*鐩<EFBFBD>爣鐩<EFBFBD>綍锛? frontend-v2/src/modules/rvw/
*杩佺Щ姝ラ<EFBFBD>锛?
-
鍒涘缓妯″潡缁撴瀯 (30鍒嗛挓)
frontend-v2/src/modules/rvw/ 鈹溾攢鈹€ index.tsx 鈹溾攢鈹€ api/ 鈹? 鈹斺攢鈹€ index.ts 鈹溾攢鈹€ pages/ 鈹? 鈹溾攢鈹€ ReviewPage.tsx 鈹? 鈹斺攢鈹€ ReviewList.tsx (鍙<EFBFBD>€? 鈹溾攢鈹€ components/ 鈹? 鈹溾攢鈹€ ScoreCard.tsx 鈹? 鈹溾攢鈹€ EditorialReview.tsx 鈹? 鈹斺攢鈹€ MethodologyReview.tsx 鈹溾攢鈹€ hooks/ 鈹? 鈹斺攢鈹€ useReviewTask.ts 鈹斺攢鈹€ types/ 鈹斺攢鈹€ index.ts -
*澶嶅埗骞舵洿鏂癆PI灞? (30鍒嗛挓)
- 浠巂frontend/src/api/reviewApi.ts`澶嶅埗
- 鏇存柊API璺<EFBFBD>緞锛歚/api/review
鈫?/api/v1/rvw`
-
*澶嶅埗骞舵洿鏂扮粍浠? (60鍒嗛挓)
- 浠巂frontend/src/components/review/`澶嶅埗鎵€鏈夌粍浠?
- 淇濇寔瑙嗚<EFBFBD>璁捐<EFBFBD>锛堟笎鍙樿壊銆侀<EFBFBD>鑹茬紪鐮侊級
-
澶嶅埗骞舵洿鏂颁富椤甸潰 (90鍒嗛挓)
- 浠巂frontend/src/pages/ReviewPage.tsx`澶嶅埗
- 淇濇寔瀹屾暣UI娴佺▼
- 鏇存柊CSS瀵煎叆锛堝<EFBFBD>鏋滈渶瑕侊級
-
鍒涘缓妯″潡鍏ュ彛 (30鍒嗛挓)
// 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; -
鍦ㄦ<EFBFBD>鏋朵腑娉ㄥ唽妯″潡 (10鍒嗛挓)
Task 2.4锛氶泦鎴愭祴璇?鈴憋笍 棰勮<E6A3B0>1灏忔椂
*娴嬭瘯娓呭崟锛?
- 鉁?涓婁紶Word绋夸欢
- 鉁?鐘舵€佽疆璇<E79686>紙5涓<35><E6B693>楠わ級
- 鉁?绋跨害瑙勮寖鎬ц瘎浼帮紙11椤癸級
- 鉁?鏂规硶瀛﹁瘎浼帮紙3閮ㄥ垎锛?
- 鉁?鎬讳綋璇勫垎璁$畻
- 鉁?鎶ュ憡灞曠ず锛圱abs鍒囨崲锛?
- 鉁?瀵煎嚭PDF
- 鉁?澶嶅埗鎶ュ憡鏂囨湰
- 鉁?浠诲姟鍒楄〃鏌ヨ<E98F8C>
- 鉁?鍒犻櫎浠诲姟
馃敡 鎶€鏈<E282AC>粏鑺傝ˉ鍏?
鍏抽敭渚濊禆澶嶇敤
宸叉湁骞冲彴鑳藉姏锛堝彲鐩存帴澶嶇敤锛夛細
// 鉁?鏂囨。鎻愬彇鏈嶅姟锛堝凡鏈夛級
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妯″潡棰濆<EFBFBD>渚濊禆锛?
- 鉁?Dify骞冲彴锛氬凡閮ㄧ讲锛屾彁渚汻AG妫€绱㈣兘鍔?
- 鉁?tiktoken锛歍oken璁$畻锛屽凡瀹夎<EFBFBD>锛坄@dqbd/tiktoken`锛?
- 鉁?**Python寰<6E>湇鍔?*锛氭枃妗f彁鍙栵紝宸查儴缃?
*RVW妯″潡棰濆<EFBFBD>渚濊禆锛?
- 鉁?html2canvas锛歅DF瀵煎嚭锛堝墠绔<EFBFBD>級锛岄渶瀹夎<EFBFBD>
- 鉁?jspdf锛歅DF鐢熸垚锛堝墠绔<EFBFBD>級锛岄渶瀹夎<EFBFBD>
API璺<EFBFBD>緞瑙勮寖
*鏂版灦鏋凙PI璺<EFBFBD>緞锛?
PKB妯″潡锛?
/api/v1/pkb/knowledge-bases/*
/api/v1/pkb/documents/*
RVW妯″潡锛?
/api/v1/rvw/upload
/api/v1/rvw/tasks/*
鏃ф灦鏋凙PI璺<EFBFBD>緞锛堥渶鍚戝悗鍏煎<EFBFBD>锛夛細
/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锛屽唴閮ㄨ浆鍙戝埌鏂拌矾寰?
*杩佺Щ鑴氭湰妯℃澘锛?
-- 鍒涘缓鏂癝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妯″潡杩佺Щ瀹屾垚鏍囧噯
- 鉁?鍚庣<E98D9A>浠g爜鍦╜backend/src/modules/pkb/`
- 鉁?鍓嶇<E98D93>浠g爜鍦╜frontend-v2/src/modules/pkb/`
- 鉁?API璺<49>緞涓篳/api/v1/pkb/*`
- 鉁?鎵€鏈夊姛鑳芥祴璇曢€氳繃锛堢煡璇嗗簱CRUD銆佹枃妗d笂浼犮€佹<E282AC>绱€€佹壒澶勭悊锛?
- 鉁?鍓嶇<E98D93>UI瀹屽叏杩佺Щ锛堝垪琛ㄣ€佽<E282AC>鎯呫€佷笂浼犮€佸<E282AC>璇濇<E79287>锛?
- 鉁?澶嶇敤骞冲彴鑳藉姏锛坙ogger銆乻torage銆乪xtractionClient銆乨ifyClient锛?
- 鉁?鏂囨。瀹屾暣锛圧EADME.md銆丄PI鏂囨。锛?
RVW妯″潡杩佺Щ瀹屾垚鏍囧噯
- 鉁?鍚庣<E98D9A>浠g爜鍦╜backend/src/modules/rvw/`
- 鉁?鍓嶇<E98D93>浠g爜鍦╜frontend-v2/src/modules/rvw/`
- 鉁?API璺<49>緞涓篳/api/v1/rvw/*`
- 鉁?鏁版嵁宸茶縼绉诲埌
rvw_schema.review_tasks - 鉁?鎵€鏈夊姛鑳芥祴璇曢€氳繃锛堜笂浼犮€佽瘎浼般€佹姤鍛娿€佸<E282AC>鍑猴級
- 鉁?鍓嶇<E98D93>UI瀹屽叏杩佺Щ锛堜笂浼犮€佽繘搴︺€佹姤鍛娿€佸<E282AC>鍑猴級
- 鉁?澶嶇敤骞冲彴鑳藉姏锛坙ogger銆乪xtractionClient銆丩LMFactory锛?
- 鉁?Prompt鏂囦欢鍦ㄦā鍧楀唴閮<E594B4>紙
modules/rvw/prompts/锛?
馃摎 鏂囨。鏇存柊娓呭崟
闇€瑕佹洿鏂扮殑鏂囨。
-
*绯荤粺褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?
- 鏂囦欢锛歚docs/00-绯荤粺鎬讳綋璁捐<E79281>/00-绯荤粺褰撳墠鐘舵€佷笌寮€鍙戞寚鍗?md`
- 鏇存柊锛歅KB鍜孯VW妯″潡鐘舵€佷粠"宸插畬鎴愶紙鏃ф灦鏋勶級"鏀逛负"鉁?100%锛堟柊鏋舵瀯锛?
-
妯″潡README鍒涘缓
backend/src/modules/pkb/README.mdbackend/src/modules/rvw/README.md
-
鍓嶇<EFBFBD>妯″潡鏂囨。
frontend-v2/src/modules/pkb/README.mdfrontend-v2/src/modules/rvw/README.md
-
API鏂囨。鏇存柊
docs/04-寮€鍙戣<E98D99>鑼?04-API璺<49>敱鎬昏<E98EAC>.md- 娣诲姞PKB鍜孯VW鐨凙PI绔<EFBFBD>偣娓呭崟
-
杩佺Щ瀹屾垚鎶ュ憡
- 鏂板缓锛歚docs/08-椤圭洰绠$悊/PKB鍜孯VW杩佺Щ瀹屾垚鎶ュ憡.md`
- 璁板綍锛氳縼绉绘椂闂淬€侀亣鍒扮殑闂<EFBFBD><EFBFBD>銆佽В鍐虫柟妗堛€佹祴璇曠粨鏋?
馃幆 鎬荤粨
杩佺Щ浼樺娍
- 鉁?鏋舵瀯缁熶竴锛氭墍鏈夋ā鍧楅伒寰<EFBFBD>浉鍚岀殑妯″潡鍖栫粨鏋?
- 鉁?鏄撲簬缁存姢锛氫唬鐮佺粍缁囨竻鏅帮紝鑱岃矗鏄庣‘
- 鉁?澶嶇敤骞冲彴鑳藉姏锛氬噺灏戦噸澶嶄唬鐮侊紝鎻愬崌浠g爜璐ㄩ噺
- 鉁?鏀<EFBFBD>寔鐙<EFBFBD>珛閮ㄧ讲锛氭瘡涓<EFBFBD>ā鍧楀彲鐙<EFBFBD>珛鎵撳寘銆侀儴缃层€侀攢鍞?
- 鉁?**Schema闅旂<E99785>**锛氭暟鎹<E69A9F>簱灞傞潰妯″潡鐙<E6BDA1>珛锛岄檷浣庤€﹀悎
棰勮<EFBFBD>鎬昏€楁椂
- PKB妯″潡杩佺Щ锛?-8灏忔椂
- RVW妯″潡杩佺Щ锛?-9灏忔椂锛堝惈鏁版嵁杩佺Щ锛?
- **鎬昏<E98EAC>**锛?3-17灏忔椂锛堢害2涓<32>伐浣滄棩锛?
椋庨櫓璇勪及
- 鉁?**椋庨櫓浣?*锛氬姛鑳藉凡100%瀹屾垚锛屼唬鐮佽川閲忛珮
- 鉁?娴嬭瘯瑕嗙洊锛氭湁瀹屾暣鐨勬墜鍔ㄦ祴璇曟祦绋?
- 鉁?**鍚戝悗鍏煎<E98D8F>**锛氫繚鐣欐棫API璺<49>緞锛屼笉褰卞搷鐜版湁鍓嶇<E98D93>
鏂囨。缁存姢鑰咃細 鎶€鏈<E282AC>洟闃?
鏈€鍚庢洿鏂帮細 2025-12-28
涓嬩竴姝ワ細 鎵ц<E98EB5>杩佺Щ浠诲姟锛屾寜TODO娓呭崟閫愰」瀹屾垚