Files
AIclinicalresearch/docs/00-系统总体设计/前后端模块化架构设计-V2.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

1477 lines
65 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.
# 鍓嶅悗绔<E68297>ā鍧楀寲鏋舵瀯璁捐<E79281> V2.0
> **鐗堟湰锛?* V2.3
> **鍒涘缓鏃ユ湡锛?* 2025-11-12
> **瀹炴柦闃舵<E99783>锛?* Week 2~3锛?025-11-13~17锛?
> **缁存姢鑰咃細** 寮€鍙戝洟闃?
> **鐘舵€侊細** 鉁?Week 2 Day 6-9 + 骞冲彴鍩虹<E98DA9>璁炬柦 鍏ㄩ儴瀹屾垚 猸愨瓙猸?
---
## 馃搵 鏂囨。璇存槑
<EFBFBD>枃妗槸**AI涓村簥鐮旂┒骞冲彴鐨勬ā鍧楀寲鏋舵瀯璁捐<E79281>鎬荤翰**锛屽畾涔変簡锛?
1. **鍓嶇<E98D93>鏋舵瀯**锛氬叏鏂扮殑 frontend-v2 妯″潡鍖栨灦鏋?2. **鍚庣<E98D9A>鏋舵瀯**锛氬熀浜嶴chema闅旂<E99785>鐨勫垎灞傛灦鏋?3. **鍓嶅悗绔<E68297><E7BB94>搴斿叧绯?*锛氭ā鍧楀寲鐨勭粍缁囨柟寮?4. **寮€鍙戣<E98D99>鑼?*锛氱粺涓€鐨勪唬鐮佺粍缁囧拰鍛藉悕瑙勮寖
5. **瀹炴柦璺<E69FA6>嚎**锛氭笎杩涘紡鐨勬灦鏋勬敼閫犺<E996AB>鍒?
**閫傜敤瀵硅薄锛?*
- 鏂板姞鍏ョ殑寮€鍙戜汉鍛橈紙蹇<E7B499>€熶簡瑙郴缁熸灦鏋勶級
- AI鍔╂墜锛堢悊瑙唬鐮佺粍缁囩粨鏋勶級
- 鎶€鏈<E282AC>喅绛栬€咃紙鏋舵瀯婕旇繘鍙傝€冿級
---
## 馃幆 鏋舵瀯婕旇繘鍘嗗彶
### V1.0 闃舵<E99783>锛?025-10涔嬪墠锛?- 鉂?鍗曚綋鍓嶇<E98D93>搴旂敤锛堟墍鏈夊姛鑳借€﹀悎锛?- 鉂?鍚庣<E98D9A>爜骞抽摵锛堟棤妯″潡鍒掑垎锛?- 鉂?鏁版嵁搴撹〃鍏ㄥ湪public schema
### V1.5 闃舵<E99783>锛?025-11-12瀹屾垚锛?- 鉁?**鏁版嵁搴揝chema闅旂<E99785>**锛?0涓猄chema锛?- 鉁?Prisma澶歋chema閰嶇疆
- 鉁?鏁版嵁100%杩佺Щ鎴愬姛
- 鈿狅笍 鍓嶅悗绔<E68297>唬鐮佷粛闇€妯″潡鍖?
### V2.0 闃舵<E99783>锛?025-11-13~14瀹屾垚锛夆瓙
- 鉁?**鍓嶇<E98D93>妯″潡鍖栨灦鏋?*锛坒rontend-v2锛? Day 6-7瀹屾垚
- 鉁?**妯″潡娉ㄥ唽鏈哄埗**锛堟潈闄愭帶鍒?閿欒<E996BF>杈圭晫+璺<>敱瀹堝崼锛? Day 7瀹屾垚
- 鉁?**鍚庣<E98D9A>澧為噺婕旇繘鏋舵瀯**锛坙egacy/common/modules锛? Day 8-9瀹屾垚
- 鉁?鍓嶅悗绔<E68297>ā鍧楀<E98DA7>搴?- 鉁?鏀<>寔妯″潡鐙<E6BDA1>珛寮€鍙戝拰閮ㄧ讲
- 鉁?**鎵€鏈夊姛鑳芥祴璇曢€氳繃**锛堝寘鎷<E5AF98>壒澶勭悊淇<E6828A><E6B787>锛夆瓙猸愨瓙
### V2.1 闃舵<E99783>锛?025-11-17瀹屾垚锛夆瓙猸愨瓙 鏈€鏂?- 鉁?**骞冲彴鍩虹<E98DA9>璁炬柦瀹炴柦瀹屾垚**锛?涓<>牳蹇冩ā鍧楋級
- 鉁?**瀛樺偍鏈嶅姟**锛歀ocalAdapter + OSSAdapter锛堥<E9949B>鐣欙級
- 鉁?**鏃ュ織绯荤粺**锛歐inston + 缁撴瀯鍖朖SON鏃ュ織
- 鉁?**缂撳瓨鏈嶅姟**锛歁emoryCache + Redis锛堥<E9949B>鐣欙級
- 鉁?**寮傛<E5AFAE>浠诲姟**锛歁emoryQueue + DatabaseQueue锛堥<E9949B>鐣欙級
- 鉁?**鍋ュ悍妫€鏌?*锛歀iveness + Readiness + 璇︾粏妫€鏌?- 鉁?**鐩戞帶鎸囨爣**锛氭暟鎹<E69A9F>簱杩炴帴/鍐呭瓨/API鐩戞帶
- 鉁?**鏁版嵁搴撹繛鎺ユ睜**锛歋erverless浼樺寲锛堥槻姝㈣繛鎺ユ暟瓒呴檺锛?- 鉁?**鐜<><E9909C>閰嶇疆绠悊**锛氱粺涓€鐨勯厤缃<E58EA4>姞杞藉拰楠岃瘉
- 鉁?**閫傞厤鍣ㄦā寮?*锛氶浂浠爜鐜<E7889C><E9909C>鍒囨崲锛堟湰鍦?鈫?浜戠<E6B59C>锛?- 鉁?**鍏ㄩ儴娴嬭瘯楠岃瘉閫氳繃**锛?00%娴嬭瘯瑕嗙洊鐜?- 鉁?**浠爜缁熻<E7BC81>**锛?,532琛屾柊浠爜锛?2涓<32>柊鏂囦欢
- 鉁?**鏂囨。瀹屽杽**锛?1涓<31>枃妗洿鏂帮紝3涓<33>姤鍛婄敓鎴?
**鏍稿績鎴愭灉锛?*
- 馃幆 涓轰簯鍘熺敓閮ㄧ讲锛堥樋閲屼簯SAE锛夊仛濂藉噯澶?- 馃幆 ASL妯″潡寮€鍙戝彲鐩存帴浣跨敤骞冲彴鑳藉姏
- 馃幆 鏀<>寔鏈<E5AF94>湴寮€鍙戝拰浜戠<E6B59C>閮ㄧ讲鏃犵紳鍒囨崲
---
## 馃摳 褰撳墠鏋舵瀯鐪熷疄鐘舵€侊紙2025-11-17锛?
> **猸?閲嶈<E996B2>鎻愮ず锛氭湰绔犺妭鎻忚堪褰撳墠瀹為檯杩愯<E69DA9>鐨勬灦鏋勭姸鎬?*
> **閫傜敤瀵硅薄锛氭柊寮€鍙戜汉鍛樸€佹柊AI鍔╂墜銆佸揩閫熶笂鎵?*
> **鏇存柊棰戠巼锛氭灦鏋勫彉鏇存椂绔嬪嵆鏇存柊**
---
### 馃幆 鏋舵瀯姒傝<E5A792>
```
銆愬綋鍓嶇姸鎬併€戝<EFBFBD>閲忔紨杩涙灦鏋勶紙鏂版棫骞跺瓨锛?
Frontend-v2 (鏂? Backend (娣峰悎) Database (闅旂<E99785>)
鈫? 鈫? 鈫?椤堕儴瀵艰埅 + 6妯″潡 legacy/ + common/ 10涓<30>嫭绔?Schema
鍗犱綅 + modules/asl (3璇︾粏 + 7绌?
```
**鏍稿績绛栫暐锛?*
- 鉁?鍓嶇<E98D93>锛氬叏鏂版灦鏋勶紙frontend-v2锛?- 鉁?鍚庣<E98D9A>锛氭柊鏃у苟瀛橈紙legacy淇濇寔绋冲畾锛屾柊妯″潡鏍囧噯鍖栵級
- 鉁?鏁版嵁搴擄細Schema闅旂<E99785>瀹屾垚
---
### 馃搧 鍓嶇<E98D93>鐪熷疄鏋舵瀯锛團rontend-v2锛?
#### **鐩<>綍缁撴瀯锛堝疄闄呭瓨鍦<E793A8>級**
```bash
frontend-v2/
鈹溾攢鈹€ src/
鈹? 鈹溾攢鈹€ framework/ # 馃彈锔?妗嗘灦灞傦紙宸插疄鐜帮級
鈹? 鈹? 鈹溾攢鈹€ layout/
鈹? 鈹? 鈹? 鈹溾攢鈹€ MainLayout.tsx # 鉁?涓诲竷灞€
鈹? 鈹? 鈹? 鈹溾攢鈹€ TopNavigation.tsx # 鉁?椤堕儴瀵艰埅
鈹? 鈹? 鈹? 鈹斺攢鈹€ UserMenu.tsx # 鉁?鐢ㄦ埛鑿滃崟
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ modules/
鈹? 鈹? 鈹? 鈹溾攢鈹€ moduleRegistry.ts # 鉁?妯″潡娉ㄥ唽涓<E594BD>
鈹? 鈹? 鈹? 鈹溾攢鈹€ ErrorBoundary.tsx # 鉁?閿欒<E996BF>杈圭晫
鈹? 鈹? 鈹? 鈹斺攢鈹€ ModuleErrorFallback.tsx # 鉁?閿欒<E996BF>鍥為€€UI
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ router/
鈹? 鈹? 鈹? 鈹溾攢鈹€ RouteGuard.tsx # 鉁?璺<>敱瀹堝崼
鈹? 鈹? 鈹? 鈹斺攢鈹€ PermissionDenied.tsx # 鉁?鏉冮檺鎷掔粷椤?鈹? 鈹? 鈹?鈹? 鈹? 鈹斺攢鈹€ permission/
鈹? 鈹? 鈹溾攢鈹€ PermissionContext.tsx # 鉁?鏉冮檺涓婁笅鏂?鈹? 鈹? 鈹溾攢鈹€ usePermission.ts # 鉁?鏉冮檺Hook
鈹? 鈹? 鈹斺攢鈹€ types.ts # 鉁?鏉冮檺绫诲瀷
鈹? 鈹?鈹? 鈹溾攢鈹€ modules/ # 馃摝 涓氬姟妯″潡锛堝崰浣嶏級
鈹? 鈹? 鈹溾攢鈹€ asl/ # 馃毀 Week 3寮€鍙?鈹? 鈹? 鈹? 鈹斺攢鈹€ index.tsx # 鉁?鍗犱綅椤甸潰
鈹? 鈹? 鈹溾攢鈹€ aia/ # 馃搵 鍗犱綅
鈹? 鈹? 鈹溾攢鈹€ pkb/ # 馃搵 鍗犱綅
鈹? 鈹? 鈹溾攢鈹€ dc/ # 馃搵 鍗犱綅
鈹? 鈹? 鈹溾攢鈹€ ssa/ # 馃搵 鍗犱綅
鈹? 鈹? 鈹斺攢鈹€ st/ # 馃搵 鍗犱綅
鈹? 鈹?鈹? 鈹溾攢鈹€ pages/
鈹? 鈹? 鈹斺攢鈹€ Home.tsx # 鉁?棣栭〉
鈹? 鈹?鈹? 鈹斺攢鈹€ App.tsx # 鉁?搴旂敤鍏ュ彛
鈹?鈹溾攢鈹€ package.json # 鉁?React 19
鈹斺攢鈹€ vite.config.ts # 鉁?Vite閰嶇疆
```
**褰撳墠杩愯<E69DA9>鐘舵€侊細**
- 鉁?璁块棶鍦板潃锛歨ttp://localhost:3000
- 鉁?椤堕儴瀵艰埅鏄剧ず6涓<36>ā鍧?- 鉁?鏉冮檺鎺у埗宸ヤ綔姝父锛坢ock premium鐢ㄦ埛锛?- 鉁?璺<>敱瀹堝崼鐢熸晥
- 鉁?閿欒<E996BF>杈圭晫姝父鎹曡幏
---
### 馃梽锔?鍚庣<E98D9A>鐪熷疄鏋舵瀯锛圔ackend锛?
#### **鐩<>綍缁撴瀯锛堝疄闄呭瓨鍦<E793A8>級猸?鍏抽敭**
```bash
backend/
鈹溾攢鈹€ src/
鈹? 鈹溾攢鈹€ legacy/ # 馃敻 鐜版湁涓氬姟浠g爜锛堢ǔ瀹氳繍琛岋級
鈹? 鈹? 鈹溾攢鈹€ routes/ # 7涓<37>矾鐢辨枃浠?鈹? 鈹? 鈹? 鈹溾攢鈹€ agents.ts # AIA: 鏅鸿兘浣撹矾鐢?鈹? 鈹? 鈹? 鈹溾攢鈹€ conversations.ts # AIA: 瀵硅瘽璺<E798BD>
鈹? 鈹? 鈹? 鈹溾攢鈹€ chatRoutes.ts # AIA: 閫氱敤瀵硅瘽璺<E798BD>
鈹? 鈹? 鈹? 鈹溾攢鈹€ projects.ts # AIA: 椤圭洰璺<E6B4B0>
鈹? 鈹? 鈹? 鈹溾攢鈹€ knowledgeBases.ts # PKB: 鐭ヨ瘑搴撹矾鐢?鈹? 鈹? 鈹? 鈹溾攢鈹€ batchRoutes.ts # PKB: 鎵瑰<E98EB5>鐞嗚矾鐢?鈹? 鈹? 鈹? 鈹斺攢鈹€ reviewRoutes.ts # RVW: 绋夸欢瀹℃煡璺<E785A1>
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ controllers/ # 8涓<38>帶鍒跺櫒
鈹? 鈹? 鈹? 鈹溾攢鈹€ agentController.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ conversationController.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ chatController.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ projectController.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ knowledgeBaseController.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ documentController.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ batchController.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ reviewController.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ services/ # 8涓<38>湇鍔?鈹? 鈹? 鈹? 鈹溾攢鈹€ agentService.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ conversationService.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ projectService.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ knowledgeBaseService.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ documentService.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ batchService.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ reviewService.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ tokenService.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹斺攢鈹€ templates/
鈹? 鈹? 鈹斺攢鈹€ clinicalResearch.ts # 鎵瑰<E98EB5>鐞嗘ā鏉?鈹? 鈹?鈹? 鈹溾攢鈹€ common/ # 馃敡 閫氱敤鑳藉姏灞傦紙鍏变韩锛? 猸?骞冲彴鍩虹<E98DA9>璁炬柦锛堜簯鍘熺敓锛?鈹? 鈹? 鈹? # 馃搵 璇﹁<E79287>锛歞ocs/09-鏋舵瀯瀹炴柦/04-骞冲彴鍩虹<E98DA9>璁炬柦瑙勫垝.md
鈹? 鈹? 鈹溾攢鈹€ llm/
鈹? 鈹? 鈹? 鈹斺攢鈹€ adapters/ # LLM閫傞厤鍣?鈹? 鈹? 鈹? 鈹溾攢鈹€ DeepSeekAdapter.ts # 鉁?DeepSeek-V3
鈹? 鈹? 鈹? 鈹溾攢鈹€ QwenAdapter.ts # 鉁?Qwen3-72B + Qwen-Long
鈹? 鈹? 鈹? 鈹溾攢鈹€ LLMFactory.ts # 鉁?宸ュ巶绫?鈹? 鈹? 鈹? 鈹斺攢鈹€ types.ts # 鉁?LLM绫诲瀷瀹氫箟
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ rag/ # RAG鑳藉姏
鈹? 鈹? 鈹? 鈹溾攢鈹€ DifyClient.ts # 鉁?Dify瀹㈡埛绔?鈹? 鈹? 鈹? 鈹斺攢鈹€ types.ts # 鉁?RAG绫诲瀷
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ document/ # 鏂囨。澶勭悊
鈹? 鈹? 鈹? 鈹斺攢鈹€ ExtractionClient.ts # 鉁?鏂囨。鎻愬彇瀹㈡埛绔?鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ storage/ # 猸?瀛樺偍鎶借薄灞傦紙浜戝師鐢燂級
鈹? 鈹? 鈹? 鈹溾攢鈹€ StorageAdapter.ts # 猸?鎺ュ彛瀹氫箟
鈹? 鈹? 鈹? 鈹溾攢鈹€ LocalAdapter.ts # 猸?鏈<>湴瀹炵幇
鈹? 鈹? 鈹? 鈹溾攢鈹€ OSSAdapter.ts # 猸?OSS瀹炵幇
鈹? 鈹? 鈹? 鈹溾攢鈹€ StorageFactory.ts # 猸?宸ュ巶绫?鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts # 猸?缁熶竴瀵煎嚭
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ logging/ # 猸?鏃ュ織绯荤粺锛堜簯鍘熺敓锛?鈹? 鈹? 鈹? 鈹溾攢鈹€ logger.ts # 猸?Winston鏃ュ織閰嶇疆
鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts # 猸?瀵煎嚭
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ cache/ # 猸?缂撳瓨鏈嶅姟锛堜簯鍘熺敓锛?鈹? 鈹? 鈹? 鈹溾攢鈹€ CacheAdapter.ts # 猸?鎺ュ彛瀹氫箟
鈹? 鈹? 鈹? 鈹溾攢鈹€ MemoryCacheAdapter.ts # 猸?鍐呭瓨瀹炵幇
鈹? 鈹? 鈹? 鈹溾攢鈹€ RedisCacheAdapter.ts # 猸?Redis瀹炵幇
鈹? 鈹? 鈹? 鈹溾攢鈹€ CacheFactory.ts # 猸?宸ュ巶绫?鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts # 猸?瀵煎嚭
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ jobs/ # 猸?寮傛<E5AFAE>浠诲姟锛堜簯鍘熺敓锛?鈹? 鈹? 鈹? 鈹溾攢鈹€ types.ts # 猸?浠诲姟绫诲瀷瀹氫箟锛圝ob/JobQueue鎺ュ彛锛?鈹? 鈹? 鈹? 鈹溾攢鈹€ MemoryQueue.ts # 猸?鍐呭瓨闃熷垪瀹炵幇
鈹? 鈹? 鈹? 鈹溾攢鈹€ JobFactory.ts # 猸?闃熷垪宸ュ巶绫?鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts # 猸?缁熶竴瀵煎嚭
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ health/ # 猸?鍋ュ悍妫€鏌ワ紙浜戝師鐢燂級
鈹? 鈹? 鈹? 鈹溾攢鈹€ healthCheck.ts # 猸?鍋ュ悍妫€鏌ヨ矾鐢?鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts # 猸?瀵煎嚭
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ monitoring/ # 猸?鐩戞帶鎸囨爣锛堜簯鍘熺敓锛?鈹? 鈹? 鈹? 鈹溾攢鈹€ metrics.ts # 猸?鎸囨爣鏀堕泦
鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts # 猸?瀵煎嚭
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ middleware/
鈹? 鈹? 鈹? 鈹斺攢鈹€ validateProject.ts # 鉁?椤圭洰楠岃瘉涓<E79889>棿浠?鈹? 鈹? 鈹?鈹? 鈹? 鈹斺攢鈹€ utils/
鈹? 鈹? 鈹斺攢鈹€ jsonParser.ts # 鉁?JSON瑙瀽宸ュ叿
鈹? 鈹?鈹? 鈹溾攢鈹€ modules/ # 馃専 鏂版灦鏋勬ā鍧楋紙鏍囧噯鍖栵級
鈹? 鈹? 鈹斺攢鈹€ asl/ # 猸?AI鏅鸿兘鏂囩尞锛堝崰浣嶏紝Week 3寮€鍙戯級
鈹? 鈹? 鈹斺攢鈹€ (绌虹洰褰曪紝绛夊緟寮€鍙?
鈹? 鈹?鈹? 鈹溾攢鈹€ config/ # 鈿欙笍 閰嶇疆灞?鈹? 鈹? 鈹溾攢鈹€ database.ts # 鉁?鏁版嵁搴撻厤缃<E58EA4>紙猸?浜戝師鐢熻繛鎺ユ睜浼樺寲锛?鈹? 鈹? 鈹斺攢鈹€ env.ts # 鉁?鐜<><E9909C>鍙橀噺绠悊锛堚瓙 缁熶竴閰嶇疆鍔犺浇锛?鈹? 鈹?鈹? 鈹溾攢鈹€ scripts/ # 馃洜锔?宸ュ叿鑴氭湰
鈹? 鈹? 鈹溾攢鈹€ create-mock-user.ts
鈹? 鈹? 鈹溾攢鈹€ test-dify-client.ts
鈹? 鈹? 鈹斺攢鈹€ test-platform-infrastructure.ts # 猸?骞冲彴鍩虹<E98DA9>璁炬柦娴嬭瘯
鈹? 鈹?鈹? 鈹溾攢鈹€ test-platform-api.ts # 猸?涓存椂娴嬭瘯API锛?test/platform锛?鈹? 鈹?鈹? 鈹斺攢鈹€ index.ts # 鉁?涓诲叆鍙o紙缁熶竴娉ㄥ唽锛?鈹?鈹溾攢鈹€ config/ # 澶栭儴閰嶇疆鏂囦欢
鈹? 鈹斺攢鈹€ agents.yaml # 鉁?鏅鸿兘浣撻厤缃<E58EA4>紙348琛岋級
鈹?鈹溾攢鈹€ prompts/ # Prompt妯℃澘
鈹? 鈹溾攢鈹€ topic_evaluation_system.txt
鈹? 鈹溾攢鈹€ review_editorial_system.txt
鈹? 鈹斺攢鈹€ review_methodology_system.txt
鈹?鈹溾攢鈹€ prisma/
鈹? 鈹溾攢鈹€ schema.prisma # 鉁?10涓猄chema瀹氫箟
鈹? 鈹斺攢鈹€ migrations/ # 鉁?4涓<34>縼绉绘枃浠?鈹?鈹溾攢鈹€ package.json # 鉁?Fastify + Prisma
鈹斺攢鈹€ .env # 鉁?鐜<><E9909C>鍙橀噺
```
**褰撳墠杩愯<E69DA9>鐘舵€侊細**
- 鉁?璁块棶鍦板潃锛歨ttp://localhost:3001
- 鉁?鍋ュ悍妫€鏌ワ細http://localhost:3001/health (绠€鍖栫増)
- 鉁?鍋ュ悍妫€鏌ワ紙璇︾粏锛夛細http://localhost:3001/health/liveness
- 鉁?鍋ュ悍妫€鏌ワ紙璇︾粏锛夛細http://localhost:3001/health/readiness
- 鉁?娴嬭瘯API锛歨ttp://localhost:3001/test/platform 锛堥獙璇佸钩鍙板熀纭€璁炬柦锛?- 鉁?Legacy妯″潡锛圓IA/PKB/RVW锛夋<E9949B>甯歌繍琛?- 鉁?Common灞傞€氱敤鑳藉姏鍙<E5A78F>
- 鉁?**猸?骞冲彴鍩虹<E98DA9>璁炬柦**锛?涓<>ā鍧楀叏閮ㄦ祴璇曢€氳繃锛?00%锛?- 鉁?Modules/asl 鍗犱綅灏辩华锛岀瓑寰匴eek 3寮€鍙?
**涓诲叆鍙紙index.ts锛夊疄闄呬唬鐮侊細**
```typescript
// ============================================
// 銆愭棫鏋舵瀯銆慙egacy 妯″潡 - 淇濇寔涓嶅彉
// ============================================
import { projectRoutes } from './legacy/routes/projects.js';
import { agentRoutes } from './legacy/routes/agents.js';
import { conversationRoutes } from './legacy/routes/conversations.js';
import knowledgeBaseRoutes from './legacy/routes/knowledgeBases.js';
import { chatRoutes } from './legacy/routes/chatRoutes.js';
import { batchRoutes } from './legacy/routes/batchRoutes.js';
import reviewRoutes from './legacy/routes/reviewRoutes.js';
// 娉ㄥ唽 Legacy 妯″潡璺<E6BDA1>
await fastify.register(projectRoutes, { prefix: '/api/v1/aia' });
await fastify.register(agentRoutes, { prefix: '/api/v1/aia' });
await fastify.register(conversationRoutes, { prefix: '/api/v1/aia' });
await fastify.register(chatRoutes, { prefix: '/api/v1/aia' });
await fastify.register(knowledgeBaseRoutes, { prefix: '/api/v1/pkb' });
await fastify.register(batchRoutes, { prefix: '/api/v1/pkb' });
await fastify.register(reviewRoutes, { prefix: '/api/v1/rvw' });
```
---
### 馃梼锔?鏁版嵁搴撶湡瀹炴灦鏋勶紙PostgreSQL 15锛?
#### **Schema 缁撴瀯锛堝疄闄呭瓨鍦<E793A8>級**
```sql
-- ==================== 骞冲彴灞?Schema ====================
platform_schema (<EFBFBD>?
users # ?<EFBFBD>
-- ==================== 璇︾粏 Schema锛堟暟鎹<E69A9F>凡杩佺Щ锛?===================
aia_schema (AI鏅鸿兘闂<EFBFBD>)
projects # ?? agents # ?鸿<EFBFBD>
conversations # ?? messages # ??
pkb_schema (<EFBFBD>?
knowledge_bases # ?
documents # ?? batch_tasks # ?<EFBFBD>¤
batch_results # ?<EFBFBD>
task_templates # ??
rvw_schema ()
review_tasks # ?? (ublic schema涓? #
-- ==================== 鍗犱綅 Schema锛堟暟鎹<E69A9F>粨鏋勬湭瀹氫箟锛?===================
asl_schema (AI鏅鸿兘鏂囩尞) # Week 3? ()
common_schema () #
dc_schema () #
ssa_schema (<EFBFBD>) #
st_schema () #
admin_schema () #
```
**Prisma Schema 閰嶇疆锛?*
```prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
schemas = [
"platform_schema", # 鉁?骞冲彴
"aia_schema", # 鉁?鏅鸿兘闂<E58598>
"pkb_schema", # 鉁?鐭ヨ瘑搴? "asl_schema", # 馃毀 鏅鸿兘鏂囩尞锛圵eek 3锛? "common_schema", # 馃搵 鍗犱綅
"dc_schema", # 馃搵 鍗犱綅
"rvw_schema", # 馃搵 鍗犱綅
"admin_schema", # 馃搵 鍗犱綅
"ssa_schema", # 馃搵 鍗犱綅
"st_schema", # 馃搵 鍗犱綅
"public" # 鉁?鍘嗗彶閬楃暀
]
}
```
---
### 馃攲 API 鐪熷疄璺<E79684>敱锛堝綋鍓嶅彲鐢<E5BDB2>
#### **AIA 妯″潡锛圓I鏅鸿兘闂<E58598>瓟锛?*
```
鍩虹<EFBFBD><EFBFBD>緞锛?api/v1/aia
椤圭洰绠$悊锛? 鉁?GET /projects # 鑾峰彇椤圭洰鍒楄〃
鉁?POST /projects # 鍒涘缓椤圭洰
鉁?GET /projects/:id # 鑾峰彇椤圭洰璇︽儏
鉁?PUT /projects/:id # 鏇存柊椤圭洰
鉁?DELETE /projects/:id # 鍒犻櫎椤圭洰
鏅鸿兘浣撶<EFBFBD>鐞嗭細
鉁?GET /agents # 鑾峰彇鏅鸿兘浣撳垪琛? 鉁?GET /agents/enabled # 鑾峰彇鍚<E5BD87>敤鐨勬櫤鑳戒綋
鉁?GET /agents/:id # 鑾峰彇鏅鸿兘浣撹<E6B5A3>鎯?
瀵硅瘽绠$悊锛? 鉁?POST /conversations # 鍒涘缓瀵硅瘽
鉁?GET /conversations # 鑾峰彇瀵硅瘽鍒楄〃
鉁?GET /conversations/:id # 鑾峰彇瀵硅瘽璇︽儏
鉁?POST /conversations/:id/messages/stream # 娴佸紡鍙戦€佹秷鎭? 鉁?POST /conversations/:id/messages # 闈炴祦寮忓彂閫佹秷鎭? 鉁?DELETE /conversations/:id # 鍒犻櫎瀵硅瘽
閫氱敤瀵硅瘽锛? 鉁?POST /chat/stream # 閫氱敤娴佸紡瀵硅瘽
鉁?POST /chat # 閫氱敤闈炴祦寮忓<E5AFAE>璇?```
#### **PKB 妯″潡锛堜釜浜虹煡璇嗗簱锛?*
```
鍩虹<EFBFBD><EFBFBD>緞锛?api/v1/pkb
鐭ヨ瘑搴撶<EFBFBD>鐞嗭細
鉁?GET /knowledge-bases # 鑾峰彇鐭ヨ瘑搴撳垪琛? 鉁?POST /knowledge-bases # 鍒涘缓鐭ヨ瘑搴? 鉁?GET /knowledge-bases/:id # 鑾峰彇鐭ヨ瘑搴撹<E690B4>鎯? 鉁?PUT /knowledge-bases/:id # 鏇存柊鐭ヨ瘑搴? 鉁?DELETE /knowledge-bases/:id # 鍒犻櫎鐭ヨ瘑搴?
鏂囨。绠$悊锛? 鉁?POST /knowledge-bases/:id/documents # 涓婁紶鏂囨。
鉁?GET /knowledge-bases/:id/documents # 鑾峰彇鏂囨。鍒楄〃
鉁?DELETE /knowledge-bases/:kbId/documents/:docId # 鍒犻櫎鏂囨。
鎵瑰<EFBFBD>鐞嗭細
鉁?POST /batch/execute # 鎵ц<E98EB5>鎵瑰<E98EB5>鐞嗕换鍔? 鉁?GET /batch/tasks/:taskId # 鑾峰彇浠诲姟鐘舵€? 鉁?GET /batch/tasks/:taskId/results # 鑾峰彇浠诲姟缁撴灉
鉁?POST /batch/tasks/:taskId/retry-failed # 閲嶈瘯澶辫触椤?```
#### **RVW 妯″潡锛堢ǹ浠跺<E6B5A0>鏌ワ級**
```
鍩虹<EFBFBD><EFBFBD>緞锛?api/v1/rvw
绋夸欢瀹℃煡锛? 鉁?POST /review/upload # 涓婁紶绋夸欢骞跺紑濮嬪<E6BFAE>鏌? 鉁?GET /review/tasks/:taskId # 鏌ヨ<E98F8C>浠诲姟鐘舵€? 鉁?GET /review/tasks/:taskId/report # 鑾峰彇瀹屾暣鎶ュ憡
鉁?GET /review/tasks # 鑾峰彇浠诲姟鍒楄〃
鉁?DELETE /review/tasks/:taskId # 鍒犻櫎浠诲姟
```
#### **绯荤粺绔<E7B2BA>偣**
```
鉁?GET /health # 鍋ュ悍妫€鏌?鉁?GET /api/v1 # API淇℃伅
```
---
### 馃搳 鎶€鏈<E282AC>爤鐪熷疄閰嶇疆
#### **鍓嶇<E98D93>锛團rontend-v2锛?*
```json
{
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-router-dom": "^6.x",
"typescript": "^5.x",
"vite": "^6.x",
"antd": "^5.x",
"tailwindcss": "^3.x"
}
```
#### **鍚庣<E98D9A>锛圔ackend锛?*
```json
{
"fastify": "^4.x",
"typescript": "^5.x",
"prisma": "^6.17.0",
"@prisma/client": "^6.17.0",
"tsx": "^4.x",
"axios": "^1.x",
"js-yaml": "^4.x",
"p-queue": "^8.x"
}
```
#### **鏁版嵁搴?*
```
PostgreSQL: 15.x
Schema鏁伴噺: 10涓<30>紙3璇︾粏 + 7鍗犱綅锛?杩佺Щ鏂囦欢: 4涓?```
#### **LLM 闆嗘垚锛圕loseAI锛?*
```
鉁?DeepSeek-V3 (涓诲姏锛屾€т环姣?
鉁?Qwen3-72B (澶囩敤锛屼腑鏂囩悊瑙?
鉁?Qwen-Long (瓒呴暱涓婁笅鏂?M)
鉁?GPT-4o (鍙<>€夛紝楂樿川閲?
```
---
### 馃攧 鍓嶅悗绔<E68297>ā鍧楀<E98DA7>搴斿叧绯伙紙褰撳墠锛?
| 鍓嶇<E98D93>妯″潡 | 鍚庣<E98D9A>浣嶇疆 | 鏁版嵁搴揝chema | API璺<49>敱 | 鐘舵€?|
|---------|---------|-------------|---------|------|
| frontend-v2/modules/asl/ | backend/modules/asl/ | asl_schema | /api/v1/asl/* | 馃毀 Week 3寮€鍙?|
| frontend-v2/modules/aia/ | backend/legacy/routes/agents.ts绛?| aia_schema | /api/v1/aia/* | 鉁?杩愯<E69DA9>涓?|
| frontend-v2/modules/pkb/ | backend/legacy/routes/knowledgeBases.ts绛?| pkb_schema | /api/v1/pkb/* | 鉁?杩愯<E69DA9>涓?|
| frontend-v2/modules/rvw/ | backend/legacy/routes/reviewRoutes.ts | public + rvw_schema | /api/v1/rvw/* | 鉁?杩愯<E69DA9>涓?|
| frontend-v2/modules/dc/ | (鏈<>疄鐜? | dc_schema | /api/v1/dc/* | 馃搵 鍗犱綅 |
| frontend-v2/modules/ssa/ | (鏈<>疄鐜? | ssa_schema | /api/v1/ssa/* | 馃搵 鍗犱綅 |
| frontend-v2/modules/st/ | (鏈<>疄鐜? | st_schema | /api/v1/st/* | 馃搵 鍗犱綅 |
---
### 馃搵 鍔熻兘娴嬭瘯娓呭崟锛堝凡楠岃瘉锛?
| 鍔熻兘 | 娴嬭瘯椤?| 鐘舵€?| 澶囨敞 |
|------|--------|------|------|
| 鏅鸿兘闂<E58598>瓟 | 鍒涘缓椤圭洰 | 鉁?| |
| 鏅鸿兘闂<E58598>瓟 | 瀵硅瘽妯″紡 | 鉁?| 娴佸紡+闈炴祦寮?|
| 鏅鸿兘闂<E58598>瓟 | 鐭ヨ瘑搴撴ā寮?| 鉁?| RAG妫€绱?|
| 鏅鸿兘闂<E58598>瓟 | 鎵瑰<E98EB5>鐞嗘ā寮?| 鉁?| 淇<><E6B787>rawOutput闂<74><E99782>鍚庢<E98D9A>甯?|
| 鐭ヨ瘑搴?| 鍒涘缓鐭ヨ瘑搴?| 鉁?| |
| 鐭ヨ瘑搴?| 涓婁紶鏂囨。 | 鉁?| PDF/Word/TXT/MD |
| 鐭ヨ瘑搴?| 鏂囨。绠$悊 | 鉁?| 鍒楄〃/鍒犻櫎 |
| 绋夸欢瀹℃煡 | 涓婁紶绋夸欢 | 鉁?| |
| 绋夸欢瀹℃煡 | 瀹℃煡鎶ュ憡 | 鉁?| |
| 鍓嶇<E98D93> | 椤堕儴瀵艰埅 | 鉁?| 6涓<36>ā鍧?|
| 鍓嶇<E98D93> | 鏉冮檺鎺у埗 | 鉁?| mock premium |
| 鍓嶇<E98D93> | 璺<>敱瀹堝崼 | 鉁?| |
| 鍓嶇<E98D93> | 閿欒<E996BF>杈圭晫 | 鉁?| |
---
### 馃幆 鏂版ā鍧楀紑鍙戞寚鍗楋紙浠<E7B499>SL涓轰緥锛?
#### **寮€鍙戞祦绋嬶紙Week 3锛夛細**
```
绗?姝ワ細鏁版嵁搴撹<E690B4>璁? 鈹溾攢 璁捐<E79281> asl_schema 琛ㄧ粨鏋? 鈹溾攢 鍦?Prisma schema 涓<>畾涔夋ā鍨? 鈹斺攢 杩愯<E69DA9>杩佺Щ鍒涘缓琛?
绗?姝ワ細鍚庣<E98D9A>寮€鍙? 鈹溾攢 鍦?backend/src/modules/asl/ 涓嬪紑鍙? 鈹溾攢 鍒涘缓 routes/锛堣矾鐢憋級
鈹溾攢 鍒涘缓 controllers/锛堟帶鍒跺櫒锛? 鈹溾攢 鍒涘缓 services/锛堟湇鍔★級
鈹斺攢 娉ㄥ唽璺<E594BD>敱鍒?index.ts
绗?姝ワ細鍓嶇<E98D93>寮€鍙? 鈹溾攢 鍦?frontend-v2/src/modules/asl/ 涓嬪紑鍙? 鈹溾攢 鍒涘缓 pages/锛堥〉闈<E38089>
鈹溾攢 鍒涘缓 components/锛堢粍浠讹級
鈹溾攢 鍒涘缓 api/锛圓PI璋冪敤锛? 鈹斺攢 鏇存柊 index.tsx锛堟ā鍧楁敞鍐岋級
绗?姝ワ細鑱旇皟娴嬭瘯
鈹溾攢 鍓嶅悗绔<E68297>仈璋? 鈹斺攢 鍔熻兘楠屾敹
```
---
### 馃摎 鐩稿叧鏂囨。绱㈠紩
**蹇<>€熶笂鎵嬶細**
- 猸?**鏈<>枃妗?* - 鏋舵瀯鎬荤翰 + 褰撳墠鐘舵€?- 猸?`docs/09-鏋舵瀯瀹炴柦/鍚庣<E98D9A>鏋舵瀯澧為噺婕旇繘鏂规<E98F82>.md` - 鍚庣<E98D9A>璇︾粏璇存槑锛?50琛岋級
**浠诲姟璁板綍锛?*
- `docs/08-椤圭洰绠$悊/涓嬩竴闃舵<E99783>琛屽姩璁″垝-V2.2-瀹屾暣鐗?md` - 椤圭洰璁″垝
- `docs/09-鏋舵瀯瀹炴柦/鍓嶇<E98D93>妯″潡娉ㄥ唽鏈哄埗瀹炴柦鎶ュ憡.md` - 鍓嶇<E98D93>浠诲姟17锛圵eek 2 Day 6-7锛?- `docs/08-椤圭洰绠$悊/2025-11-14-浠诲姟19瀹屾垚鎬荤粨.md` - 鍚庣<E98D9A>浠诲姟19锛圵eek 2 Day 8-9锛?- `docs/08-椤圭洰绠$悊/03-姣忓懆璁″垝/2025-11-17-骞冲彴鍩虹<E98DA9>璁炬柦瀹炴柦瀹屾垚鎶ュ憡.md` - 猸?骞冲彴鍩虹<E98DA9>璁炬柦瀹炴柦
- `docs/08-椤圭洰绠$悊/03-姣忓懆璁″垝/2025-11-17-骞冲彴鍩虹<E98DA9>璁炬柦楠岃瘉鎶ュ憡.md` - 猸?楠岃瘉娴嬭瘯鎶ュ憡
**鎶€鏈<E282AC><E98F88>鑼冿細**
- `docs/04-寮€鍙戣<E98D99>鑼?08-浜戝師鐢熷紑鍙戣<E98D99>鑼?md` - 猸?浜戝師鐢熷紑鍙戣<E98D99>鑼冿紙蹇呰<E8B987>锛?- `docs/04-寮€鍙戣<E98D99>鑼?06-Git鎻愪氦瑙勮寖.md` - Git鎻愪氦瑙勮寖锛堝惈鎻愪氦棰戠巼瑙勫垯锛?- `docs/09-鏋舵瀯瀹炴柦/缂栫爜瑙勮寖-UTF8鏈€浣冲疄璺?md` - 缂栫爜瑙勮寖
- `.editorconfig` - 缂栬緫鍣ㄩ厤缃?- `.gitattributes` - Git閰嶇疆
---
**鏈<>珷鑺傛洿鏂版棩鏈燂細** 2025-11-17
**涓嬫<E6B693>鏇存柊鏃舵満锛?* ASL妯″潡寮€鍙戝畬鎴愬悗
**鏈€鏂板彉鏇达細** 娣诲姞骞冲彴鍩虹<E98DA9>璁炬柦瀹炴柦鍜岄獙璇佺姸鎬侊紙V2.1闃舵<EFBFBD>锛?
---
## 鈿欙笍 骞冲彴鍩虹<E98DA9>璁炬柦锛?025-11-17 鏂板<E98F82>锛夆渽
> **猸?閲嶈<E996B2>鎻愮ず锛氬钩鍙板熀纭€璁炬柦鎻愪緵浜戝師鐢熺殑閫氱敤鑳藉姏锛屾墍鏈変笟鍔℃ā鍧楃洿鎺ュ<E98EBA>鐢?*
> **璇︾粏瑙勫垝锛?* 鍙傝<E98D99> [骞冲彴鍩虹<E98DA9>璁炬柦瑙勫垝](../09-鏋舵瀯瀹炴柦/04-骞冲彴鍩虹<E98DA9>璁炬柦瑙勫垝.md)
> **浣跨敤鎸囧崡锛?* 鍙傝<E98D99> [backend/src/common/README.md](../../backend/src/common/README.md)
> **寮€鍙戣<E98D99>鑼冿細** 鍙傝<E98D99> [浜戝師鐢熷紑鍙戣<E98D99>鑼僝(../04-寮€鍙戣<E98D99>鑼?08-浜戝師鐢熷紑鍙戣<E98D99>鑼?md)
---
### 馃幆 璁捐<E79281><EFBFBD>
**鏍稿績鍘熷垯锛?* 閫氳繃**閫傞厤鍣ㄦā寮忥紙Adapter Pattern锛?*瀹炵幇鏈<E5B987>湴寮€鍙戝拰浜戠<E6B59C>閮ㄧ讲闆朵唬鐮佸垏鎹?
```
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?鈹? 涓氬姟妯″潡灞? 鈹?鈹? ASL | AIA | PKB | DC | SSA | ST | UAM 鈹?鈹? 鍙<>叧娉ㄤ笟鍔¢€昏緫锛屽<E9949B>鐢ㄥ钩鍙拌兘鍔? 鈹?鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈫?import from '@/common/'
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?鈹? 骞冲彴鍩虹<E98DA9>璁炬柦灞傦紙Adapter Pattern锛? 鈹?鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?鈹?瀛樺偍锛歀ocalAdapter 鈫愨啋 OSSAdapter 鈹?鈹?缂撳瓨锛歁emoryCacheAdapter 鈫愨啋 RedisCacheAdapter 鈹?鈹?浠诲姟锛歁emoryQueueAdapter 鈫愨啋 DatabaseQueueAdapter 鈹?鈹?鏃ュ織锛欳onsoleLogger 鈫愨啋 闃块噷浜慡LS 鈹?鈹?鏁版嵁搴擄細鏈<E7B4B0>湴PostgreSQL 鈫愨啋 闃块噷浜慠DS锛堣繛鎺ユ睜锛? 鈹?鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈫?鐜<><E9909C>鍙橀噺鍒囨崲
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?鈹? 閮ㄧ讲鐜<E8AEB2><E9909C>锛堥浂浠爜鏀瑰姩锛? 鈹?鈹? 鏈<>湴寮€鍙?| 浜戠<E6B59C>SaaS | 绉佹湁鍖栭儴缃?| 鍗曟満鐗? 鈹?鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?```
---
### 馃摝 鏍稿績妯″潡娓呭崟
| 妯″潡 | 璺<>緞 | 鐘舵€?| 璇存槑 | 鐜<><E9909C>鍒囨崲 |
|------|------|------|------|---------|
| **瀛樺偍鏈嶅姟** | `common/storage/` | 鉁?瀹屾垚 | 鏂囦欢涓婁紶涓嬭浇 | `STORAGE_TYPE=local/oss` |
| **鏁版嵁搴撹繛鎺ユ睜** | `config/database.ts` | 鉁?瀹屾垚 | Prisma杩炴帴姹?| `DATABASE_URL` |
| **鏃ュ織绯荤粺** | `common/logging/` | 鉁?瀹屾垚 | 缁撴瀯鍖栨棩蹇?| 鑷<>姩鍒囨崲锛堟牴鎹甆ODE_ENV锛?|
| **鐜<><E9909C>閰嶇疆** | `config/env.ts` | 鉁?瀹屾垚 | 缁熶竴閰嶇疆绠$悊 | `.env`鏂囦欢鎴栫幆澧冨彉閲?|
| **寮傛<E5AFAE>浠诲姟** | `common/jobs/` | 鉁?瀹屾垚 | 闀挎椂闂翠换鍔″<E98D94>鐞?| `QUEUE_TYPE=memory/database` |
| **缂撳瓨鏈嶅姟** | `common/cache/` | 鉁?瀹屾垚 | 鍐呭瓨/Redis缂撳瓨 | `CACHE_TYPE=memory/redis` |
| **鍋ュ悍妫€鏌?* | `common/health/` | 鉁?瀹屾垚 | SAE鍋ュ悍妫€鏌?| N/A |
| **鐩戞帶鎸囨爣** | `common/monitoring/` | 鉁?瀹屾垚 | 鍏抽敭鎸囨爣鐩戞帶 | N/A |
---
### 馃捇 浣跨敤绀轰緥
#### **1. 瀛樺偍鏈嶅姟锛堥浂浠g爜鍒囨崲锛?*
```typescript
import { storage } from '@/common/storage'
// 涓氬姟浠g爜锛堝畬鍏ㄧ浉鍚岋級
const buffer = await readFile('example.pdf')
const url = await storage.upload('literature/123.pdf', buffer)
// 鐜<><E9909C>鍒囨崲锛?// 鏈<>湴寮€鍙戯細STORAGE_TYPE=local 鈫?瀛樺偍鍒?backend/uploads/
// 浜戠<E6B59C>閮ㄧ讲锛歋TORAGE_TYPE=oss 鈫?瀛樺偍鍒伴樋閲屼簯OSS
```
#### **2. 鏃ュ織绯荤粺锛堢粨鏋勫寲鏃ュ織锛?*
```typescript
import { logger } from '@/common/logging'
// 鍩虹<E98DA9>鏃ュ織
logger.info('User logged in', { userId: 123 })
logger.error('Database error', { error: err.message })
// 甯︿笂涓嬫枃鐨勬棩蹇?const aslLogger = logger.child({ module: 'ASL', projectId: 456 })
aslLogger.info('Screening started', { count: 100 })
// 杈撳嚭鏍煎紡锛?// 鏈<>湴寮€鍙戯細褰╄壊鍙<E5A38A><E98D99>鏍煎紡
// 鐢熶骇鐜<E9AA87><E9909C>锛欽SON鏍煎紡锛堜究浜庨樋閲屼簯SLS瑙瀽锛?```
#### **3. 寮傛<E5AFAE>浠诲姟锛堥伩鍏峉erverless瓒呮椂锛?*
```typescript
import { jobQueue } from '@/common/jobs'
// 鍒涘缓浠诲姟锛堢珛鍗宠繑鍥烇級
const job = await jobQueue.push('asl:screening', {
projectId: 123,
literatureIds: [1, 2, 3]
})
// 杩斿洖浠诲姟ID缁欏墠绔?res.send({ jobId: job.id })
// 鍓嶇<E98D93><EFBFBD><E69D9E>浠诲姟鐘舵€?const status = await jobQueue.getJob(job.id)
// { status: 'processing', progress: 45 }
```
#### **4. 缂撳瓨鏈嶅姟锛堝噺灏慙LM璋冪敤鎴愭湰锛?*
```typescript
import { cache } from '@/common/cache'
// 缂撳瓨LLM鍝嶅簲锛?灏忔椂锛?const cacheKey = `llm:${model}:${hash(prompt)}`
const cached = await cache.get(cacheKey)
if (!cached) {
const response = await llm.chat(prompt)
await cache.set(cacheKey, response, 60 * 60)
return response
}
return cached
```
---
### 馃實 澶氱幆澧冮厤缃?
#### **鏈<>湴寮€鍙戯紙.env.development锛?*
```bash
# 瀛樺偍锛氭湰鍦版枃浠剁郴缁?STORAGE_TYPE=local
LOCAL_STORAGE_DIR=uploads
# 缂撳瓨锛氬唴瀛樼紦瀛?CACHE_TYPE=memory
# 浠诲姟闃熷垪锛氬唴瀛橀槦鍒?QUEUE_TYPE=memory
# 鏃ュ織锛氬僵鑹茶緭鍑?LOG_LEVEL=debug
```
#### **浜戠<E6B59C>閮ㄧ讲锛?env.production锛?*
```bash
# 瀛樺偍锛氶樋閲屼簯OSS
STORAGE_TYPE=oss
OSS_REGION=oss-cn-hangzhou
OSS_BUCKET=aiclinical-prod
OSS_ACCESS_KEY_ID=your-key-id
OSS_ACCESS_KEY_SECRET=your-key-secret
# 缂撳瓨锛氶樋閲屼簯Redis
CACHE_TYPE=redis
REDIS_HOST=r-xxx.redis.aliyuncs.com
REDIS_PORT=6379
REDIS_PASSWORD=your-password
# 浠诲姟闃熷垪锛氭暟鎹<E69A9F>簱闃熷垪
QUEUE_TYPE=database
# 鏃ュ織锛欽SON杈撳嚭
LOG_LEVEL=info
```
---
### 鈿狅笍 閲嶈<E996B2>娉ㄦ剰浜嬮」
#### **1. Winston渚濊禆鏈<E7A686>畨瑁?*
```bash
# 闇€瑕佸畨瑁?cd backend
npm install winston
npm install -D @types/winston
```
#### **2. Legacy妯″潡鍏煎<E98D8F>鎬?*
- 鉁?**Legacy妯″潡**锛圥KB銆丄IA銆丏C锛変繚鎸佺幇鐘讹紝姝父杩愯<E69DA9>
- 鉁?**鏂版ā鍧?*锛圓SL锛変娇鐢ㄥ钩鍙板熀纭€璁炬柦
- 馃攧 **鍙<>€夎縼绉?*锛歀egacy妯″潡鎸夐渶杩佺Щ锛堥<E9949B>璁?灏忔椂锛?
#### **3. 浜戠<E6B59C>瀹炵幇棰勭暀**
- `OSSAdapter`銆乣RedisCacheAdapter` 褰撳墠涓洪<E6B693>鐣欏疄鐜?- 浜戠<E6B59C>閮ㄧ讲鍓嶉渶瀹夎<E780B9>渚濊禆骞跺彇娑堟敞閲?- 璇﹁<E79287>瀹炴柦鏂囨。
---
### 馃摎 鐩稿叧鏂囨。
- **璇︾粏瑙勫垝锛?* [骞冲彴鍩虹<EFBFBD>璁炬柦瑙勫垝](../09-鏋舵瀯瀹炴柦/04-骞冲彴鍩虹<E98DA9>璁炬柦瑙勫垝.md)
- **浣跨敤鎸囧崡锛?* [backend/src/common/README.md](../../backend/src/common/README.md)
- **瀹炴柦鎶ュ憡锛?* [2025-11-17-骞冲彴鍩虹<E98DA9>璁炬柦瀹炴柦瀹屾垚鎶ュ憡](../08-椤圭洰绠$悊/03-姣忓懆璁″垝/2025-11-17-骞冲彴鍩虹<E98DA9>璁炬柦瀹炴柦瀹屾垚鎶ュ憡.md)
- **楠岃瘉鎶ュ憡锛?* [2025-11-17-骞冲彴鍩虹<E98DA9>璁炬柦楠岃瘉鎶ュ憡](../08-椤圭洰绠$悊/03-姣忓懆璁″垝/2025-11-17-骞冲彴鍩虹<E98DA9>璁炬柦楠岃瘉鎶ュ憡.md) 猸?鏂板<E98F82>
- **寮€鍙戣<E98D99>鑼冿細** [浜戝師鐢熷紑鍙戣<E98D99>鑼僝(../04-寮€鍙戣<E98D99>鑼?08-浜戝師鐢熷紑鍙戣<E98D99>鑼?md)
---
### 鉁?娴嬭瘯楠岃瘉鐘舵€侊紙2025-11-17锛?
**娴嬭瘯瑕嗙洊鐜囷細** 100%锛?/8妯″潡鍏ㄩ儴閫氳繃锛?
| 妯″潡 | 娴嬭瘯鐘舵€?| 娴嬭瘯绔<E798AF>偣/鏂规硶 | 缁撴灉 |
|------|---------|-------------|------|
| 瀛樺偍鏈嶅姟 | 鉁?閫氳繃 | `storage.upload/download/delete/exists` | 鍔熻兘姝e父 |
| 鏃ュ織绯荤粺 | 鉁?閫氳繃 | `logger.info/warn/error` + context | 杈撳嚭姝g‘ |
| 缂撳瓨鏈嶅姟 | 鉁?閫氳繃 | `cache.set/get/has/delete/mset/mget` | 鍏ㄩ儴姝e父 |
| 寮傛<E5AFAE>浠诲姟 | 鉁?閫氳繃 | `jobQueue.push/getJob/process` | 闃熷垪宸ヤ綔姝e父 |
| 鍋ュ悍妫€鏌?| 鉁?閫氳繃 | `/health/liveness`, `/health/readiness` | 200 OK |
| 鏁版嵁搴撹繛鎺ユ睜 | 鉁?閫氳繃 | 杩炴帴鏁扮洃鎺с€佷紭闆呭叧闂?| 1/400杩炴帴 |
| 鐜<><E9909C>閰嶇疆 | 鉁?閫氳繃 | `config` 瀵硅薄鍔犺浇 | 鎵€鏈夊彉閲忔<E996B2>甯?|
| 鐩戞帶鎸囨爣 | 鉁?閫氳繃 | `Metrics.recordDBConnectionCount()` | 鏁版嵁閲囬泦姝e父 |
**娴嬭瘯鏂瑰紡锛?*
- 鍗曞厓娴嬭瘯锛氶€氳繃娴嬭瘯API `/test/platform`<>姩鍖栭獙璇?- 闆嗘垚娴嬭瘯锛氭墍鏈夋ā鍧楀疄闄呰皟鐢ㄩ獙璇?- 鍋ュ悍妫€鏌ワ細3涓<33><E6B693>鐐瑰叏閮ㄥ搷搴旀<E690B4>甯?
**涓嬩竴姝ワ細**
- 鉁?鏈<>湴寮€鍙戠幆澧冨凡灏辩华锛屽彲浠ュ紑濮婣SL妯″潡寮€鍙?- 馃攧 浜戠<E6B59C>閮ㄧ讲闇€瑕佸畨瑁?`ali-oss` 鍜?`ioredis` 渚濊禆
---
## 馃尌锔?浜戝師鐢熼儴缃叉灦鏋勶紙2025-11-16 鏂板<E98F82>锛?
> **猸?閲嶈<E996B2>鎻愮ず锛氭湰绔犺妭瀹氫箟骞冲彴鐨勪簯鍘熺敓閮ㄧ讲绛栫暐锛岄€傜敤浜庢墍鏈変笟鍔℃ā鍧?*
> **璇︾粏鎸囧崡锛?* 鍙傝<E98D99> [浜戝師鐢熼儴缃叉灦鏋勬寚鍗梋(../09-鏋舵瀯瀹炴柦/03-浜戝師鐢熼儴缃叉灦鏋勬寚鍗?md)
> **寮€鍙戣<E98D99>鑼冿細** 鍙傝<E98D99> [浜戝師鐢熷紑鍙戣<E98D99>鑼僝(../04-寮€鍙戣<E98D99>鑼?08-浜戝師鐢熷紑鍙戣<E98D99>鑼?md)
---
### 馃幆 閮ㄧ讲鏋舵瀯閫夊瀷
**鐩<>爣骞冲彴**锛氶樋閲屼簯 Serverless 搴旂敤寮曟搸 (SAE) + 浜戞暟鎹<E69A9F>簱 RDS + 瀵硅薄瀛樺偍 OSS
**閫夊瀷鐞嗙敱**锛?- 鉁?**鎸夐渶浠樿垂**锛氬垵鏈熸垚鏈<E59E9A>綆锛埪?00/鏈堣捣锛夛紝鏃犻渶棰勪粯澶ч噺鏈嶅姟鍣ㄦ垚鏈?- 鉁?**鑷<>姩鎵╃缉瀹?*锛氶珮宄版湡涓嶅畷鏈猴紝浣庤胺鏈熶笉娴<E7AC89>垂锛岄€傚悎鍒涗笟鍏<E7AC9F>徃娴侀噺涓嶇瀹氱殑鍦烘櫙
- 鉁?**鍥藉唴璁块棶浼樺寲**锛氶樋閲屼簯鍥藉唴鑺傜偣澶氾紝鍖荤枟鐢ㄦ埛璁块棶閫熷害蹇?- 鉁?**閫傚悎AI浠诲姟**锛氬紓姝ユ壒閲忎换鍔★紙LLM绛涢€夈€丳DF鎻愬彇锛夊ぉ鐒跺<E99092>鍚?Serverless
- 鉁?**闄嶄綆杩愮淮鎴愭湰**锛氭棤闇€涓撹亴杩愮淮浜哄憳锛屽洟闃熶笓娉ㄤ笟鍔″紑鍙?
**鏋舵瀯鍥?*锛?```
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?鈹? 浜戝師鐢熼儴缃叉灦鏋? 鈹?鈹溾攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?鈹? 鐢ㄦ埛娴忚<E5A8B4>鍣? 鈹?鈹? 鈫? 鈹?鈹? CDN鍔犻€燂紙鍙<E7B499>€夛級 鈹?鈹? 鈫? 鈹?鈹? 闃块噷浜?SAE (Serverless 搴旂敤寮曟搸) 鈹?鈹? 鈹溾攢鈹€ 鑷<>姩鎵╃缉瀹癸紙0-100瀹炰緥锛? 鈹?鈹? 鈹溾攢鈹€ 鍐呯疆璐熻浇鍧囪  鈹?鈹? 鈹斺攢鈹€ Docker 瀹瑰櫒杩愯<E69DA9> 鈹?鈹? 鈫? 鈹?鈹? 浜戞暟鎹<E69A9F>簱 RDS (PostgreSQL 15) 鈹?鈹? 鈹溾攢鈹€ 10涓猄chema闅旂<E99785> 鈹?鈹? 鈹溾攢鈹€ 鑷<>姩澶囦唤 鈹?鈹? 鈹斺攢鈹€ 杩炴帴姹犵<E5A7B9>鐞? 鈹?鈹? 鈫? 鈹?鈹? 瀵硅薄瀛樺偍 OSS 鈹?鈹? 鈹溾攢鈹€ PDF/Excel 鏂囦欢瀛樺偍 鈹?鈹? 鈹溾攢鈹€ 11涓?鍙<>潬鎬? 鈹?鈹? 鈹斺攢鈹€ 鍐呯綉璁块棶鍏嶆祦閲忚垂 鈹?鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?```
---
### 馃彈锔?鏍稿績璁捐<E79281>鍘熷垯锛堟墍鏈夋ā鍧楀繀椤婚伒瀹堬級
#### **鍘熷垯1锛氭棤鐘舵€佸簲鐢ㄨ<E990A2>璁?*
**瑕佹眰**锛氬簲鐢ㄤ笉鑳戒緷璧栨湰鍦版枃浠剁郴缁熸垨鍐呭瓨鐘舵€?
| 绂佹<E7BB82>鍋氭硶 鉂?| 姝g‘鍋氭硶 鉁?| 璇存槑 |
|-----------|-----------|------|
| 鏂囦欢瀛樺偍鍒?`./uploads/` | 涓婁紶鍒?OSS 鎴?鍐呭瓨澶勭悊 | 瀹瑰櫒閲嶅惎浼氫涪澶辨湰鍦版枃浠?|
| Session 瀛樺唴瀛?| Session 瀛?Redis/鏁版嵁搴?| 澶氬疄渚嬮棿鏃犳硶鍏变韩鍐呭瓨 |
| 缂撳瓨瀛樺唴瀛樺彉閲?| 浣跨敤 Redis | 鎵╁<E98EB5>鍚庣紦瀛樺け鏁?|
| 渚濊禆 `/tmp` 闀挎湡瀛樺偍 | 鐢ㄥ畬绔嬪嵆鍒犻櫎 | /tmp 瀹归噺鏈夐檺涓斾笉鎸佷箙 |
**绀轰緥**锛?```typescript
// 鉂?绂佹<E7BB82>锛氭湰鍦版枃浠跺瓨鍌?fs.writeFileSync('./uploads/file.pdf', buffer)
// 鉁?姝锛歄SS瀛樺偍鎴栧唴瀛樺<E7809B>鐞?const storage = StorageFactory.create()
const url = await storage.upload('files/file.pdf', buffer)
```
---
#### **鍘熷垯2锛氬瓨鍌ㄦ娊璞″眰璁捐<E79281>**
**瑕佹眰**锛氶€氳繃鎶借薄灞傛敮鎸佹湰鍦板紑鍙?+ 浜戠<E6B59C>閮ㄧ讲鏃犵紳鍒囨崲
**鏋舵瀯**锛?```typescript
StorageFactory
鈫?StorageAdapter (鎺ュ彛)
鈫?鈹溾攢鈹€ LocalAdapter (鏈<>湴寮€鍙?
鈹斺攢鈹€ OSSAdapter (鐢熶骇鐜<E9AA87><E9909C>)
```
**浣跨敤**锛?```typescript
// 浠爜涓<E7889C>粺涓€浣跨敤宸ュ巶绫伙紝鐜<E7B49D><E9909C><EFBFBD>姩鍒囨崲
const storage = StorageFactory.create()
const url = await storage.upload(key, buffer)
```
**鐜<><E9909C>閰嶇疆**锛?```bash
# 鏈<>湴寮€鍙?STORAGE_TYPE=local
# 鐢熶骇鐜<E9AA87><E9909C>
STORAGE_TYPE=oss
```
---
#### **鍘熷垯3锛氭暟鎹<E69A9F>簱杩炴帴姹犵<E5A7B9>鐞?*
**椋庨櫓**锛歋erverless 鎵╁<E98EB5>鍚庤繛鎺ユ暟鏆村<E98F86>锛岃秴杩?RDS 鏈€澶ц繛鎺ユ暟
**瑙喅鏂规<E98F82>**锛?```typescript
// 璁畻鍏<E795BB>紡锛氭瘡瀹炰緥杩炴帴鏁?= RDS鏈€澶ц繛鎺ユ暟 / SAE鏈€澶у疄渚嬫暟
// 绀轰緥锛歊DS 400杩炴帴 / SAE 20瀹炰緥 = 姣忓疄渚?0杩炴帴
const prisma = new PrismaClient({
connectionPool: {
connectionLimit: 20, // 姣忓疄渚嬫渶澶?0杩炴帴
idleTimeout: 60000, // 绌洪棽60绉掗噴鏀? maxWait: 5000, // 绛夊緟鏈€澶?绉? }
})
```
**鐩戞帶**锛氬畾鏈熸<E98F88>鏌ユ暟鎹<E69A9F>簱杩炴帴鏁帮紝鎺ヨ繎涓婇檺鏃跺憡璀?
---
#### **鍘熷垯4锛氱幆澧冨彉閲忛厤缃?*
**瑕佹眰**锛氭墍鏈夐厤缃<E58EA4>紙瀵嗛挜銆両P銆佺<E98A86>級蹇呴』閫氳繃鐜<E7B983><E9909C>鍙橀噺绠
```bash
# 鉂?绂佹<E7BB82><EFBFBD>紪鐮?const apiKey = 'sk-xxx'
const dbHost = '192.168.1.100'
# 鉁?鐜<><E9909C>鍙橀噺
const apiKey = process.env.LLM_API_KEY
const dbHost = process.env.DB_HOST
```
---
#### **鍘熷垯5锛氬紓姝ヤ换鍔″<E98D94>鐞?*
**椋庨櫓**锛歋AE 榛樿<E6A69B>璇锋眰瓒呮椂 30 绉?
**瑙喅鏂规<E98F82>**锛氶暱鏃堕棿浠诲姟锛? 10绉掞級蹇呴』寮傛<E5AFAE>澶勭悊
```typescript
// 鉁?姝g‘锛氬紓姝ヤ换鍔℃ā寮?app.post('/screening/start', async (req, res) => {
const task = await prisma.aslScreeningTask.create({...})
res.send({ taskId: task.id }) // 绔嬪嵆杩斿洖
// 鍚庡彴鎵ц<E98EB5>
processScreeningAsync(task.id)
})
// 鍓嶇<E98D93><EFBFBD><E69D9E>杩涘害
app.get('/screening/tasks/:id', async (req, res) => {
const task = await prisma.aslScreeningTask.findUnique({...})
res.send({ progress: task.completedItems / task.totalItems })
})
```
---
### 馃搳 寮€鍙戠幆澧?vs 鐢熶骇鐜<E9AA87><E9909C>
#### **鏈<>湴寮€鍙戠幆澧冿紙鏃犻渶浜戞湇鍔★級**
```bash
# 浣跨敤 Docker 鏈<>湴鏈嶅姟
docker run -d --name postgres -p 5432:5432 postgres:15
docker run -d --name redis -p 6379:6379 redis:7
# 鐜<><E9909C>鍙橀噺
STORAGE_TYPE=local
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/dev_db
```
**浼樺娍**锛?- 鉁?瀹屽叏绂荤嚎寮€鍙?- 鉁?鏃犱簯鏈嶅姟璐圭敤
- 鉁?璋冭瘯鏂逛究
---
#### **鐢熶骇鐜<E9AA87><E9909C>锛堥樋閲屼簯锛?*
```bash
# SAE 鎺у埗鍙伴厤缃<E58EA4>幆澧冨彉閲?STORAGE_TYPE=oss
DATABASE_URL=postgresql://user:pass@rm-xxx.aliyuncs.com:5432/prod_db
OSS_REGION=oss-cn-hangzhou
OSS_BUCKET=aiclinical-prod
```
**鍒囨崲鏂瑰紡**锛?- 鉁?浠g爜闆舵敼鍔?- 鉁?浠呬慨鏀圭幆澧冨彉閲?- 鉁?閲嶆柊閮ㄧ讲鍗冲彲
---
### 馃殌 閮ㄧ讲娴佺▼锛堢畝瑕侊級
1. **鏈<>湴寮€鍙?*锛氫娇鐢?Docker + LocalAdapter
2. **浠g爜鎻愪氦**锛欸it push
3. **鏋勫缓闀滃儚**锛欴ocker build
4. **鎺ㄩ€侀暅鍍?*锛氭帹閫佸埌闃块噷浜戝<E6B59C>鍣ㄩ暅鍍忔湇鍔?5. **SAE 閮ㄧ讲**锛氶厤缃<E58EA4>幆澧冨彉閲忥紝鑷<E7B49D>姩鎷夊彇闀滃儚閮ㄧ讲
6. **楠岃瘉閮ㄧ讲**锛氬仴搴锋<E690B4>鏌ラ€氳繃锛屾祦閲忓垏鎹?
璇︾粏娴佺▼瑙侊細[浜戝師鐢熼儴缃叉灦鏋勬寚鍗梋(../09-鏋舵瀯瀹炴柦/03-浜戝師鐢熼儴缃叉灦鏋勬寚鍗?md)
---
### 馃搵 寮€鍙戞<E98D99>鏌ユ竻鍗?
鍦ㄦ彁浜や唬鐮佸墠锛岃<EFBFBD><EFBFBD><EFBFBD>锛?
- [ ] 鏄<>惁浣跨敤 `StorageFactory` 鑰岄潪鐩存帴 `fs.writeFile`锛?- [ ] 鏄<>惁浣跨敤鍏ㄥ眬 `prisma` 瀹炰緥鑰岄潪鏂板缓杩炴帴锛?- [ ] 鏄<>惁鎵€鏈夐厤缃<E58EA4>兘浠庣幆澧冨彉閲忚<E996B2>鍙栵紵
- [ ] 鏄<>惁闀挎椂闂翠换鍔¢兘鏀逛负寮傛<E5AFAE>澶勭悊锛?- [ ] 鏄<>惁鏃ュ織閮借緭鍑哄埌 stdout锛?- [ ] 鏄<>惁 `/tmp` 鐩<>綍浣跨敤鍚庣珛鍗虫竻鐞嗭紵
- [ ] 鏄<>惁閬垮厤渚濊禆鏈<E7A686>湴鏂囦欢璺<E6ACA2>緞锛?
瀹屾暣妫€鏌ユ竻鍗曡<EFBFBD>锛歔浜戝師鐢熷紑鍙戣<EFBFBD>鑼僝(../04-寮€鍙戣<E98D99>鑼?08-浜戝師鐢熷紑鍙戣<E98D99>鑼?md)
---
### 馃摎 鐩稿叧鏂囨。
- 猸?**[浜戝師鐢熼儴缃叉灦鏋勬寚鍗梋(../09-鏋舵瀯瀹炴柦/03-浜戝師鐢熼儴缃叉灦鏋勬寚鍗?md)** - 鍖呭惈瀹屾暣浠g爜绀轰緥鍜岄儴缃叉祦绋?- 猸?**[浜戝師鐢熷紑鍙戣<E98D99>鑼僝(../04-寮€鍙戣<E98D99>鑼?08-浜戝師鐢熷紑鍙戣<E98D99>鑼?md)** - DO/DON'T 妫€鏌ユ竻鍗?- [Schema闅旂<E99785>鏋舵瀯璁捐<E79281>](../09-鏋舵瀯瀹炴柦/01-Schema闅旂<E99785>鏋舵瀯璁捐<E79281>锛?0涓<30>級.md)
- [鏁版嵁搴撹繛鎺ラ厤缃甝(../09-鏋舵瀯瀹炴柦/02-鏁版嵁搴撹繛鎺ラ厤缃?md)
---
**鏈<>珷鑺傚垱寤烘棩鏈燂細** 2025-11-16
**缁存姢鑰咃細** 鏋舵瀯鍥㈤槦
**閫傜敤鑼冨洿锛?* 鎵€鏈変笟鍔℃ā鍧楋紙ASL銆丄IA銆丳KB銆丏C绛夛級
---
## 馃彈锔?鏁翠綋鏋舵瀯璁捐<E79281>
### 绯荤粺鏋舵瀯鍥?
```
鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?鈹? AI涓村簥鐮旂┒骞冲彴 鈹?鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹? 鈹? 鈹屸攢鈹€鈹€鈹€鈻尖攢鈹€鈹€鈹€鈹€鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈻尖攢鈹€鈹€鈹€鈹? 鈹? 鍓嶇<E98D93>灞? 鈹? 鈹? 鍚庣<E98D9A>灞? 鈹? 鈹俧rontend-v2鈹傗梽鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€ HTTP API 鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈻衡攤 backend 鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹? 鈹? 鈹?妯″潡鍖? 鈹?妯″潡鍖?+ Schema闅旂<E99785>
鈹? 鈹? 鈹屸攢鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹粹攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹? 鈹? 鈹? 鈹? 鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹?鈹? 鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?鈹? 鈹? 鈹?ASL 鈹? 鈹?AIA 鈹? 鈹?PKB 鈹?鈹? 鈹? 鈹?PostgreSQL 鈹?鈹? 鈹? 鈹傛ā鍧?鈹? 鈹傛ā鍧?鈹? 鈹傛ā鍧?鈹?鈹? 鈹? 鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹愨攤 鈹? 鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹?鈹? 鈹? 鈹? 鈹?platform_schema 鈹傗攤 鈹? 鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹? 鈹屸攢鈹€鈹€鈹€鈹€鈹? 鈹? 鈹? 鈹? 鈹?aia_schema 鈹傗攤 鈹? 鈹? 鈹?RVW 鈹? 鈹?DC 鈹? ... 鈹? 鈹? 鈹? 鈹?pkb_schema 鈹傗攤 鈹? 鈹? 鈹傛ā鍧?鈹? 鈹傛ā鍧?鈹? 鈹? 鈹? 鈹? 鈹?asl_schema 鈹傗攤 鈹? 鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹? 鈹? 鈹? 鈹? 鈹?... 鈹傗攤 鈹? 鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹樷攤 鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹? 鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?鈹? 鈹斺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹?```
---
## 馃搧 鍓嶇<E98D93>鏋舵瀯璁捐<E79281>锛坒rontend-v2锛?
### 璁捐<E79281>鍘熷垯
1. **褰诲簳鐨勬ā鍧楀寲** - 姣忎釜涓氬姟妯″潡瀹屽叏鐙<E58F8F>
2. **妗嗘灦涓庝笟鍔″垎绂?* - 妗嗘灦灞傛彁渚涘熀纭€鑳藉姏锛屼笟鍔℃ā鍧椾笓娉ㄥ姛鑳?3. **娓愯繘寮忓紑鍙?* - 鏂版灦鏋勪笌鏃т唬鐮佸苟瀛橈紝閫愭<E996AB>鏇挎崲
4. **鐙<>珛閮ㄧ讲鏀<E8AEB2>寔** - 妯″潡鍙<E6BDA1>嫭绔嬫墦鍖呭拰閮ㄧ讲
### 鐩<>綍缁撴瀯
```
frontend-v2/
鈹溾攢鈹€ src/
鈹? 鈹溾攢鈹€ framework/ # 馃彈锔?妗嗘灦灞傦紙骞冲彴绾у熀纭€璁炬柦锛?鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ layout/ # 甯冨眬绯荤粺
鈹? 鈹? 鈹? 鈹溾攢鈹€ MainLayout.tsx # 涓诲竷灞€锛堥《閮ㄥ<E996AE>鑸?鍐呭<E98D90>鍖猴級
鈹? 鈹? 鈹? 鈹溾攢鈹€ TopNavigation.tsx # 椤堕儴瀵艰埅鏍?鈹? 鈹? 鈹? 鈹溾攢鈹€ UserMenu.tsx # 鐢ㄦ埛鑿滃崟
鈹? 鈹? 鈹? 鈹斺攢鈹€ ModuleContainer.tsx # 妯″潡瀹瑰櫒
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ modules/ # 妯″潡绠$悊绯荤粺
鈹? 鈹? 鈹? 鈹溾攢鈹€ moduleRegistry.ts # 妯″潡娉ㄥ唽涓<E594BD>
鈹? 鈹? 鈹? 鈹溾攢鈹€ ModuleLoader.tsx # 鍔ㄦ€佹ā鍧楀姞杞藉櫒
鈹? 鈹? 鈹? 鈹溾攢鈹€ types.ts # 妯″潡鎺ュ彛瀹氫箟
鈹? 鈹? 鈹? 鈹斺攢鈹€ config.ts # 妯″潡閰嶇疆
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ router/ # 璺<>敱绯荤粺
鈹? 鈹? 鈹? 鈹溾攢鈹€ AppRouter.tsx # 搴旂敤璺<E695A4>敱閰嶇疆
鈹? 鈹? 鈹? 鈹溾攢鈹€ RouteGuard.tsx # 璺<>敱瀹堝崼
鈹? 鈹? 鈹? 鈹斺攢鈹€ routes.ts # 璺<>敱瀹氫箟
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ permission/ # 鏉冮檺鎺у埗锛堥<E9949B>鐣欙級
鈹? 鈹? 鈹? 鈹溾攢鈹€ PermissionProvider.tsx # 鏉冮檺涓婁笅鏂?鈹? 鈹? 鈹? 鈹溾攢鈹€ usePermission.ts # 鏉冮檺Hook
鈹? 鈹? 鈹? 鈹斺攢鈹€ config.ts # 鏉冮檺閰嶇疆
鈹? 鈹? 鈹?鈹? 鈹? 鈹斺攢鈹€ config/ # 鍏ㄥ眬閰嶇疆
鈹? 鈹? 鈹溾攢鈹€ env.ts # 鐜<><E9909C>鍙橀噺
鈹? 鈹? 鈹溾攢鈹€ api.ts # API閰嶇疆
鈹? 鈹? 鈹斺攢鈹€ theme.ts # 涓婚<E6B693>閰嶇疆
鈹? 鈹?鈹? 鈹溾攢鈹€ modules/ # 馃摝 涓氬姟妯″潡锛堝畬鍏ㄧ嫭绔嬶級
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ asl/ # 猸?AI鏅鸿兘鏂囩尞妯″潡锛堜紭鍏堝紑鍙戯級
鈹? 鈹? 鈹? 鈹溾攢鈹€ index.tsx # 妯″潡鍏ュ彛锛堝<E9949B>鍑篗oduleDefinition锛?鈹? 鈹? 鈹? 鈹溾攢鈹€ routes.tsx # 妯″潡璺<E6BDA1>敱閰嶇疆
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ layouts/ # 妯″潡甯冨眬
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ ASLLayout.tsx # ASL宸︿晶瀵艰埅甯冨眬
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ pages/ # 妯″潡椤甸潰
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ ProjectList.tsx # 椤圭洰鍒楄〃
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ ProjectCreate.tsx # 鍒涘缓椤圭洰
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ TitleScreening/ # 鏍囬<E98F8D>鎽樿<E98EBD>鍒濈瓫
鈹? 鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ index.tsx
鈹? 鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ ScreeningWorkbench.tsx
鈹? 鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ ResultsView.tsx
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ FullTextScreening/ # 鍏ㄦ枃澶嶇瓫
鈹? 鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ ...
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ DataExtraction/ # 鏁版嵁鎻愬彇
鈹? 鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ ...
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ Analysis/ # 缁煎悎鍒嗘瀽
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ ...
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ components/ # 妯″潡缁勪欢锛堜粎鏈<E7B28E>ā鍧椾娇鐢<E5A887>
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ LiteratureCard.tsx
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ ScreeningPanel.tsx
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ LLMSelector.tsx
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ ...
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ api/ # 妯″潡API锛堝<E9949B>鎺ュ悗绔<E68297>
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ projectApi.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ screeningApi.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ extractionApi.ts
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ hooks/ # 妯″潡Hooks
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ useProject.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ useScreening.ts
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ useLLMScreening.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ store/ # 妯″潡鐘舵€佺<E282AC>鐞?鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ projectStore.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ screeningStore.ts
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ types/ # 妯″潡绫诲瀷瀹氫箟
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ project.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ literature.ts
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹斺攢鈹€ utils/ # 妯″潡宸ュ叿鍑芥暟
鈹? 鈹? 鈹? 鈹溾攢鈹€ fileParser.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ exportHelper.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ aia/ # 馃搵 AI鏅鸿兘闂<E58598>瓟妯″潡锛堝悗缁<E68297>噸鍐欙級
鈹? 鈹? 鈹? 鈹溾攢鈹€ index.tsx
鈹? 鈹? 鈹? 鈹斺攢鈹€ Placeholder.tsx # 涓存椂鍗犱綅椤甸潰
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ pkb/ # 馃搵 涓<>汉鐭ヨ瘑搴撴ā鍧楋紙鍚庣画閲嶅啓锛?鈹? 鈹? 鈹? 鈹溾攢鈹€ index.tsx
鈹? 鈹? 鈹? 鈹斺攢鈹€ Placeholder.tsx
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ rvw/ # 馃搵 瀹ǹ绯荤粺妯″潡锛堝悗缁<E68297>噸鍐欙級
鈹? 鈹? 鈹? 鈹溾攢鈹€ index.tsx
鈹? 鈹? 鈹? 鈹斺攢鈹€ Placeholder.tsx
鈹? 鈹? 鈹?鈹? 鈹? 鈹斺攢鈹€ dc/ # 馃搵 鏁版嵁娓呮礂妯″潡锛堝崰浣嶏級
鈹? 鈹? 鈹溾攢鈹€ index.tsx
鈹? 鈹? 鈹斺攢鈹€ Placeholder.tsx
鈹? 鈹?鈹? 鈹溾攢鈹€ shared/ # 馃敡 鍏变韩璧勬簮锛堣法妯″潡浣跨敤锛?鈹? 鈹? 鈹溾攢鈹€ components/ # 閫氱敤UI缁勪欢
鈹? 鈹? 鈹? 鈹溾攢鈹€ Button/
鈹? 鈹? 鈹? 鈹溾攢鈹€ Table/
鈹? 鈹? 鈹? 鈹溾攢鈹€ Modal/
鈹? 鈹? 鈹? 鈹斺攢鈹€ ...
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ hooks/ # 閫氱敤Hooks
鈹? 鈹? 鈹? 鈹溾攢鈹€ useDebounce.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ useAsync.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ ...
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ utils/ # 宸ュ叿鍑芥暟
鈹? 鈹? 鈹? 鈹溾攢鈹€ date.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ format.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ validation.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ ...
鈹? 鈹? 鈹?鈹? 鈹? 鈹斺攢鈹€ api/ # API瀹㈡埛绔?鈹? 鈹? 鈹溾攢鈹€ client.ts # Axios瀹炰緥
鈹? 鈹? 鈹溾攢鈹€ request.ts # 璇锋眰鎷︽埅鍣?鈹? 鈹? 鈹斺攢鈹€ types.ts # API绫诲瀷
鈹? 鈹?鈹? 鈹溾攢鈹€ App.tsx # 搴旂敤鏍圭粍浠?鈹? 鈹溾攢鈹€ main.tsx # 搴旂敤鍏ュ彛
鈹? 鈹斺攢鈹€ vite-env.d.ts
鈹?鈹溾攢鈹€ public/ # 闈欐€佽祫婧?鈹溾攢鈹€ package.json
鈹溾攢鈹€ vite.config.ts # Vite閰嶇疆
鈹溾攢鈹€ tsconfig.json # TypeScript閰嶇疆
鈹溾攢鈹€ tailwind.config.js # Tailwind閰嶇疆
鈹斺攢鈹€ README.md
```
### 妯″潡瀹氫箟鎺ュ彛
```typescript
// framework/modules/types.ts
/**
* 妯″潡瀹氫箟鎺ュ彛
* 姣忎釜涓氬姟妯″潡蹇呴』瀹炵幇杩欎釜鎺ュ彛
*/
export interface ModuleDefinition {
/** 妯″潡鍞<E6BDA1>竴鏍囪瘑 */
id: string
/** 妯″潡鍚嶇О锛堟樉绀哄湪瀵艰埅鏍忥級 */
name: string
/** 妯″潡璺<E6BDA1>敱鍓嶇紑 */
path: string
/** 妯″潡鍥炬爣锛堝彲閫夛級 */
icon?: ReactNode
/** 妯″潡鍏ュ彛缁勪欢锛堟噿鍔犺浇锛?*/
component: LazyExoticComponent<ComponentType<any>>
/** 妯″潡璺<E6BDA1>敱閰嶇疆 */
routes?: RouteObject[]
/** 妯″潡鏄<E6BDA1>惁鏈夊乏渚у<E6B89A>鑸?*/
hasSideNav?: boolean
/** 宸︿晶瀵艰埅閰嶇疆锛堝<E9949B>鏋滄湁锛?*/
sideNavConfig?: SideNavItem[]
/** 鏉冮檺瑕佹眰锛堝彲閫夛級 */
requiredVersion?: UserVersion
/** 鏄<>惁涓哄崰浣嶆ā鍧?*/
placeholder?: boolean
/** 鏄<>惁鏀<E68381>寔鐙<E5AF94>珛閮ㄧ讲 */
standalone?: boolean
}
/**
* 宸︿晶瀵艰埅椤? */
export interface SideNavItem {
id: string
label: string
path: string
icon?: ReactNode
children?: SideNavItem[]
}
```
### 妯″潡娉ㄥ唽绀轰緥
```typescript
// modules/asl/index.tsx
import { lazy } from 'react'
import { ModuleDefinition } from '@/framework/modules/types'
import routes from './routes'
import { sideNavConfig } from './config'
const ASLModule: ModuleDefinition = {
id: 'asl',
name: 'AI鏅鸿兘鏂囩尞',
path: '/literature',
icon: <FileTextOutlined />,
component: lazy(() => import('./layouts/ASLLayout')),
routes,
hasSideNav: true,
sideNavConfig,
requiredVersion: 'advanced',
}
export default ASLModule
```
### 妯″潡璺<E6BDA1>敱绀轰緥
```typescript
// modules/asl/routes.tsx
import { lazy } from 'react'
import { RouteObject } from 'react-router-dom'
const routes: RouteObject[] = [
{
path: '',
element: lazy(() => import('./pages/ProjectList')),
},
{
path: 'project/:projectId',
children: [
{
path: 'title-screening',
element: lazy(() => import('./pages/TitleScreening')),
},
{
path: 'fulltext-screening',
element: lazy(() => import('./pages/FullTextScreening')),
},
{
path: 'extraction',
element: lazy(() => import('./pages/DataExtraction')),
},
{
path: 'analysis',
element: lazy(() => import('./pages/Analysis')),
},
],
},
]
export default routes
```
---
## 馃搧 鍚庣<E98D9A>鏋舵瀯璁捐<E79281>锛坆ackend锛?
### 璁捐<E79281>鍘熷垯
1. **Schema闅旂<E99785>** - 鏁版嵁搴撳眰闈㈢殑妯″潡闅旂<E99785>锛堝凡瀹屾垚锛?2. **浠g爜鍒嗗眰** - platform/common/modules涓夊眰鏋舵瀯
3. **妯″潡鐙<E6BDA1>珛** - 姣忎釜妯″潡鐨凙PI鍜岄€昏緫鐙<E7B7AB>
4. **淇濇寔鍏煎<E98D8F>** - 杞诲害閲嶆瀯锛屼笉鐮村潖鐜版湁鍔熻兘
### 鐩<>綍缁撴瀯
```
backend/
鈹溾攢鈹€ src/
鈹? 鈹溾攢鈹€ platform/ # 馃彌锔?骞冲彴灞傦紙鍩虹<E98DA9>璁炬柦锛?鈹? 鈹? 鈹溾攢鈹€ auth/ # 璁よ瘉鎺堟潈
鈹? 鈹? 鈹? 鈹溾攢鈹€ authController.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ authService.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ authMiddleware.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ routes.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹斺攢鈹€ users/ # 鐢ㄦ埛绠$悊
鈹? 鈹? 鈹溾攢鈹€ userController.ts
鈹? 鈹? 鈹溾攢鈹€ userService.ts
鈹? 鈹? 鈹斺攢鈹€ routes.ts
鈹? 鈹?鈹? 鈹溾攢鈹€ common/ # 馃敡 閫氱敤灞傦紙鍏变韩鑳藉姏锛?鈹? 鈹? 鈹溾攢鈹€ middleware/ # 涓<>棿浠?鈹? 鈹? 鈹? 鈹溾攢鈹€ errorHandler.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ logger.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ validation.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ cors.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ utils/ # 宸ュ叿鍑芥暟
鈹? 鈹? 鈹? 鈹溾攢鈹€ date.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ encryption.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ format.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ errors/ # 閿欒<E996BF>澶勭悊
鈹? 鈹? 鈹? 鈹溾攢鈹€ AppError.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ errorTypes.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ errorHandler.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹斺攢鈹€ types/ # 閫氱敤绫诲瀷
鈹? 鈹? 鈹溾攢鈹€ request.ts
鈹? 鈹? 鈹溾攢鈹€ response.ts
鈹? 鈹? 鈹斺攢鈹€ common.ts
鈹? 鈹?鈹? 鈹溾攢鈹€ modules/ # 馃摝 涓氬姟妯″潡
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ aia/ # AI鏅鸿兘闂<E58598>瓟妯″潡
鈹? 鈹? 鈹? 鈹溾攢鈹€ controllers/ # 鎺у埗鍣?鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ projectController.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ agentController.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ conversationController.ts
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ chatController.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ services/ # 涓氬姟閫昏緫
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ projectService.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ conversationService.ts
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ llmService.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ routes/ # 璺<>敱閰嶇疆
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ types/ # 妯″潡绫诲瀷
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ project.ts
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ conversation.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹斺攢鈹€ utils/ # 妯″潡宸ュ叿
鈹? 鈹? 鈹? 鈹斺攢鈹€ prompt.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ pkb/ # 涓<>汉鐭ヨ瘑搴撴ā鍧?鈹? 鈹? 鈹? 鈹溾攢鈹€ controllers/
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ knowledgeBaseController.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ documentController.ts
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ batchController.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ services/
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ kbService.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ documentService.ts
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ batchService.ts
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ difyService.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ routes/
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹斺攢鈹€ types/
鈹? 鈹? 鈹? 鈹溾攢鈹€ knowledgeBase.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ document.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ rvw/ # 瀹$ǹ绯荤粺妯″潡
鈹? 鈹? 鈹? 鈹溾攢鈹€ controllers/
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ reviewController.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ services/
鈹? 鈹? 鈹? 鈹? 鈹溾攢鈹€ reviewService.ts
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ extractionService.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹溾攢鈹€ routes/
鈹? 鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts
鈹? 鈹? 鈹? 鈹?鈹? 鈹? 鈹? 鈹斺攢鈹€ types/
鈹? 鈹? 鈹? 鈹斺攢鈹€ review.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹斺攢鈹€ asl/ # 猸?AI鏅鸿兘鏂囩尞妯″潡锛圵eek 3鏂板缓锛?鈹? 鈹? 鈹溾攢鈹€ controllers/
鈹? 鈹? 鈹? 鈹溾攢鈹€ projectController.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ literatureController.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ screeningController.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ extractionController.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ services/
鈹? 鈹? 鈹? 鈹溾攢鈹€ projectService.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ literatureService.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ screeningService.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ llmScreeningService.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ extractionService.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ routes/
鈹? 鈹? 鈹? 鈹斺攢鈹€ index.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹溾攢鈹€ types/
鈹? 鈹? 鈹? 鈹溾攢鈹€ project.ts
鈹? 鈹? 鈹? 鈹溾攢鈹€ literature.ts
鈹? 鈹? 鈹? 鈹斺攢鈹€ screening.ts
鈹? 鈹? 鈹?鈹? 鈹? 鈹斺攢鈹€ utils/
鈹? 鈹? 鈹溾攢鈹€ fileParser.ts
鈹? 鈹? 鈹溾攢鈹€ llmPrompts.ts
鈹? 鈹? 鈹斺攢鈹€ exportHelper.ts
鈹? 鈹?鈹? 鈹溾攢鈹€ config/ # 閰嶇疆鏂囦欢锛堢幇鏈夛級
鈹? 鈹? 鈹溾攢鈹€ database.ts
鈹? 鈹? 鈹溾攢鈹€ env.ts
鈹? 鈹? 鈹斺攢鈹€ ...
鈹? 鈹?鈹? 鈹斺攢鈹€ index.ts # 搴旂敤鍏ュ彛
鈹?鈹溾攢鈹€ prisma/
鈹? 鈹斺攢鈹€ schema.prisma # Prisma Schema锛堝凡閰嶇疆10涓猄chema锛?鈹?鈹溾攢鈹€ package.json
鈹斺攢鈹€ tsconfig.json
```
### 妯″潡璺<E6BDA1>敱娉ㄥ唽
```typescript
// src/index.ts
import { platformRoutes } from './platform/routes'
import { aiaRoutes } from './modules/aia/routes'
import { pkbRoutes } from './modules/pkb/routes'
import { rvwRoutes } from './modules/rvw/routes'
import { aslRoutes } from './modules/asl/routes'
// 娉ㄥ唽骞冲彴璺<E5BDB4>
fastify.register(platformRoutes, { prefix: '/api/v1/platform' })
// 娉ㄥ唽涓氬姟妯″潡璺<E6BDA1>
fastify.register(aiaRoutes, { prefix: '/api/v1/aia' })
fastify.register(pkbRoutes, { prefix: '/api/v1/pkb' })
fastify.register(rvwRoutes, { prefix: '/api/v1/rvw' })
fastify.register(aslRoutes, { prefix: '/api/v1/asl' })
```
---
## 馃敆 鍓嶅悗绔<E68297><E7BB94>搴斿叧绯?
### 妯″潡鏄犲皠琛?
| 鍓嶇<E98D93>妯″潡 | 鍚庣<E98D9A>妯″潡 | 鏁版嵁搴揝chema | 璺<>敱鍓嶇紑 | 寮€鍙戠姸鎬?|
|---------|---------|-------------|---------|---------|
| `frontend-v2/src/modules/asl/` | `backend/src/modules/asl/` | `asl_schema` | `/api/v1/asl/*` | 馃毀 Week 3寮€鍙?|
| `frontend-v2/src/modules/aia/` | `backend/src/modules/aia/` | `aia_schema` | `/api/v1/aia/*` | 馃搵 鍚庣画閲嶅啓 |
| `frontend-v2/src/modules/pkb/` | `backend/src/modules/pkb/` | `pkb_schema` | `/api/v1/pkb/*` | 馃搵 鍚庣画閲嶅啓 |
| `frontend-v2/src/modules/rvw/` | `backend/src/modules/rvw/` | `public.review_tasks` | `/api/v1/rvw/*` | 馃搵 鍚庣画閲嶅啓 |
| `frontend-v2/src/modules/dc/` | `backend/src/modules/dc/` | `dc_schema` | `/api/v1/dc/*` | 馃搵 鍗犱綅 |
### API璋冪敤绀轰緥
```typescript
// 鍓嶇<E98D93>锛歠rontend-v2/src/modules/asl/api/projectApi.ts
import { apiClient } from '@/shared/api/client'
export const aslProjectApi = {
// 鍒涘缓椤圭洰
create: (data: CreateProjectDTO) =>
apiClient.post('/api/v1/asl/projects', data),
// 鑾峰彇椤圭洰鍒楄〃
list: () =>
apiClient.get('/api/v1/asl/projects'),
// 鑾峰彇椤圭洰璇︽儏
getById: (id: string) =>
apiClient.get(`/api/v1/asl/projects/${id}`),
}
// 鍚庣<E98D9A>锛歜ackend/src/modules/asl/routes/index.ts
import { FastifyInstance } from 'fastify'
import { aslProjectController } from '../controllers/projectController'
export async function aslRoutes(fastify: FastifyInstance) {
fastify.post('/projects', aslProjectController.create)
fastify.get('/projects', aslProjectController.list)
fastify.get('/projects/:id', aslProjectController.getById)
}
```
---
## 馃搻 寮€鍙戣<E98D99>鑼?
### 鍛藉悕瑙勮寖
#### 鍓嶇<E98D93>
**鏂囦欢鍛藉悕锛?*
- 缁勪欢锛歅ascalCase锛坄ProjectList.tsx`锛?- Hooks锛歝amelCase + use鍓嶇紑锛坄useProject.ts`锛?- 宸ュ叿鍑芥暟锛歝amelCase锛坄formatDate.ts`锛?- 绫诲瀷瀹氫箟锛歅ascalCase锛坄Project.ts`锛?
**浠g爜鍛藉悕锛?*
- 缁勪欢锛歅ascalCase锛坄ProjectList`锛?- 鍑芥暟锛歝amelCase锛坄fetchProjects`锛?- 甯搁噺锛歎PPER_SNAKE_CASE锛坄API_BASE_URL`锛?- 鎺ュ彛锛歅ascalCase + I鍓嶇紑锛坄IProject`锛?- 绫诲瀷锛歅ascalCase锛坄Project`锛?
#### 鍚庣<E98D9A>
**鏂囦欢鍛藉悕锛?*
- Controller锛歝amelCase + Controller鍚庣紑锛坄projectController.ts`锛?- Service锛歝amelCase + Service鍚庣紑锛坄projectService.ts`锛?- Routes锛歚index.ts` 鎴?`routes.ts`
- Types锛歝amelCase锛坄project.ts`锛?
**浠g爜鍛藉悕锛?*
- 绫伙細PascalCase锛坄ProjectService`锛?- 鍑芥暟锛歝amelCase锛坄createProject`锛?- 甯搁噺锛歎PPER_SNAKE_CASE锛坄MAX_FILE_SIZE`锛?- 鎺ュ彛锛歅ascalCase锛坄ProjectDTO`锛?
### 妯″潡寮€鍙戣<E98D99>鑼?
#### 1. 鏂版ā鍧楀紑鍙戞祦绋?
```
<EFBFBD>竴姝ワ細鏁版嵁搴撹<EFBFBD>璁?鈹溾攢 鍦?docs/03-涓氬姟妯″潡/[妯″潡鍚峕/02-鎶€鏈<E282AC><E98F88>璁?01-鏁版嵁搴撹<E690B4>璁?md
鈹溾攢 璁捐<E79281>琛ㄧ粨鏋?鈹溾攢 鍦?Prisma schema 涓<>畾涔夋ā鍨?鈹斺攢 杩愯<E69DA9>杩佺Щ
<EFBFBD>簩姝ワ細鍚庣<EFBFBD>寮€鍙?鈹溾攢 鍒涘缓 backend/src/modules/[妯″潡鍚峕/
鈹溾攢 缂栧啓 controllers/
鈹溾攢 缂栧啓 services/
鈹溾攢 缂栧啓 routes/
鈹斺攢 娴嬭瘯 API
<EFBFBD>笁姝ワ細鍓嶇<EFBFBD>寮€鍙?鈹溾攢 鍒涘缓 frontend-v2/src/modules/[妯″潡鍚峕/
鈹溾攢 瀹氫箟妯″潡鎺ュ彛锛坕ndex.tsx锛?鈹溾攢 缂栧啓 pages/
鈹溾攢 缂栧啓 components/
鈹溾攢 缂栧啓 api/
鈹溾攢 缂栧啓 hooks/
鈹斺攢 娴嬭瘯鍔熻兘
<EFBFBD>洓姝ワ細闆嗘垚娴嬭瘯
鈹溾攢 绔<>埌绔<E59F8C>祴璇?鈹斺攢 鎬ц兘娴嬭瘯
```
#### 2. 妯″潡鐙<E6BDA1>珛鎬у師鍒?
**DO 鉁咃細**
- 妯″潡鍐呯殑缁勪欢鍙<E6ACA2>湪妯″潡鍐呬娇鐢?- 妯″潡鏈夎嚜宸辩殑鐘舵€佺<E282AC>鐞?- 妯″潡鏈夎嚜宸辩殑API璋冪敤
- 妯″潡鏈夎嚜宸辩殑绫诲瀷瀹氫箟
- 妯″潡鍙<E6BDA1>互鐙<E4BA92>珛杩愯<E69DA9>鍜岄儴缃?
**DON'T 鉂岋細**
- 涓嶈<E6B693>鍦ㄦā鍧楅棿鐩存帴import缁勪欢
- 涓嶈<E6B693>鍦ㄦā鍧楅棿鍏变韩鐘舵€?- 涓嶈<E6B693>鍦ㄦā鍧楅棿鐩存帴璋冪敤API
- 鍏变韩鐨勯€昏緫鏀惧湪 `shared/`<>
#### 3. API璁捐<E79281>瑙勮寖
**RESTful椋庢牸锛?*
```
GET /api/v1/[module]/resources # 鍒楄〃
GET /api/v1/[module]/resources/:id # 璇︽儏
POST /api/v1/[module]/resources # 鍒涘缓
PUT /api/v1/[module]/resources/:id # 鏇存柊
DELETE /api/v1/[module]/resources/:id # 鍒犻櫎
```
**鍝嶅簲鏍煎紡锛?*
```typescript
// 鎴愬姛鍝嶅簲
{
success: true,
data: any,
message?: string
}
// 閿欒<E996BF>鍝嶅簲
{
success: false,
error: {
code: string,
message: string,
details?: any
}
}
```
---
## 馃殌 瀹炴柦璁″垝
### Week 2锛氭灦鏋勬敼閫狅紙2025-11-13 鑷?2025-11-17锛?
#### Day 6锛?1-13锛夛細鍓嶇<E98D93>鏋舵瀯鍩虹<E98DA9> 鈴?4-6灏忔椂
**涓婂崍锛氶」鐩<E3808D>垱寤哄拰妗嗘灦灞?*
- [x] 鍒涘缓 frontend-v2 椤圭洰锛圴ite + React + TS锛?- [x] 瀹夎<E780B9>渚濊禆锛圓ntd銆丷outer銆乑ustand銆丷eact Query锛?- [x] 閰嶇疆 Tailwind CSS
- [x] 鍒涘缓鐩<E7BC93>綍缁撴瀯锛坒ramework/modules/shared锛?- [x] 瀹炵幇 TopNavigation.tsx
- [x] 瀹炵幇 MainLayout.tsx
- [x] 瀹氫箟妯″潡鎺ュ彛锛圡oduleDefinition锛?
**涓嬪崍锛氭ā鍧楀崰浣?*
- [x] 涓?涓<>ā鍧楀垱寤虹洰褰?- [x] 鍒涘缓 Placeholder.tsx 缁勪欢
- [x] 閰嶇疆鍩烘湰璺<E6B9B0>
- [x] 娴嬭瘯瀵艰埅鍒囨崲
**浜や粯鐗╋細**
- 鉁?鍙<>繍琛岀殑 frontend-v2 椤圭洰
- 鉁?椤堕儴瀵艰埅姝e父宸ヤ綔
- 鉁?5涓<35>ā鍧楀崰浣嶉〉闈?
#### Day 7锛?1-14锛夛細妯″潡娉ㄥ唽鏈哄埗 鈴?6-8灏忔椂
**涓婂崍锛氭敞鍐岀郴缁?*
- [ ] 瀹炵幇 moduleRegistry.ts
- [ ] 瀹炵幇 ModuleLoader.tsx
- [ ] 瀹炵幇鍔ㄦ€佽矾鐢卞姞杞?- [ ] 瀹炵幇鎳掑姞杞芥満鍒?
**涓嬪崍锛氭祴璇曞拰鏂囨。**
- [ ] 娴嬭瘯妯″潡娉ㄥ唽
- [ ] 娴嬭瘯璺<E798AF>敱鍒囨崲
- [ ] 缂栧啓寮€鍙戞枃妗?- [ ] 鏇存柊 README
**浜や粯鐗╋細**
- 鉁?瀹屾暣鐨勬ā鍧楁敞鍐岀郴缁?- 鉁?鍔ㄦ€佽矾鐢卞姞杞?- 鉁?寮€鍙戞枃妗?
#### Day 8-9锛?1-15 鑷?11-16锛夛細鍚庣<E98D9A>爜鍒嗗眰 鈴?1-2澶?
**Day 8 涓婂崍锛氬垱寤虹洰褰曠粨鏋?*
- [ ] 鍒涘缓 platform/ 鐩<>
- [ ] 鍒涘缓 common/ 鐩<>
- [ ] 鍒涘缓 modules/ 鐩<>
**Day 8 涓嬪崍锛氳縼绉?AIA 妯″潡**
- [ ] 鍒涘缓 modules/aia/ 缁撴瀯
- [ ] 杩佺Щ projectController.ts
- [ ] 杩佺Щ conversationController.ts
- [ ] 鏇存柊璺<E69F8A>敱娉ㄥ唽
**Day 9 涓婂崍锛氳縼绉?PKB 鍜?RVW**
- [ ] 杩佺Щ PKB 妯″潡浠g爜
- [ ] 杩佺Щ RVW 妯″潡浠g爜
- [ ] 鏇存柊鎵€鏈?import 璺<>
**Day 9 涓嬪崍锛氭祴璇曞拰鏂囨。**
- [ ] 娴嬭瘯鎵€鏈?API
- [ ] 鏇存柊 API 鏂囨。
- [ ] 缂栧啓杩佺Щ璇存槑
**浜や粯鐗╋細**
- 鉁?瀹屾垚鍚庣<E98D9A>爜鍒嗗眰
- 鉁?鎵€鏈堿PI姝父宸ヤ綔
- 鉁?鏇存柊鏂囨。
#### Day 10锛?1-17锛夛細Week 2 楠屾敹 鈴?4灏忔椂
- [ ] 鍓嶇<E98D93>鏋舵瀯楠屾敹
- [ ] 鍚庣<E98D9A>鍒嗗眰楠屾敹
- [ ] 闆嗘垚娴嬭瘯
- [ ] 缂栧啓 Week 2 鎬荤粨鎶ュ憡
- [ ] 瑙勫垝 Week 3 ASL 浠诲姟
---
### Week 3-4锛欰SL妯″潡寮€鍙戯紙鍦ㄦ柊鏋舵瀯涓嬶級
**鍦ㄥ叏鏂扮殑 frontend-v2 鍜屽垎灞傚悗鐨?backend 涓<>紑鍙?ASL 妯″潡**
璇﹁<EFBFBD>锛歔涓嬩竴闃舵<EFBFBD>琛屽姩璁″垝-V2.2-瀹屾暣鐗?md](../08-椤圭洰绠$悊/涓嬩竴闃舵<E99783>琛屽姩璁″垝-V2.2-瀹屾暣鐗?md)
---
## 馃摑 鏃т唬鐮佸<E990AE>鐞?
### frontend/ 鐩<>
**鐘舵€侊細** 鈴革笍 淇濈暀锛屼笉鍐嶅紑鍙?
**澶勭悊鏂瑰紡锛?*
1. 娣诲姞 `README-ARCHIVED.md` 璇存槑鏂囦欢
2. 鍦ㄦ牴鐩<E789B4>`package.json`<>尯鍒嗗惎鍔ㄥ懡浠?3. 淇濈暀3-6涓<36>湀锛屼綔涓哄弬鑰冨拰搴旀€ュ<E282AC>浠?4. 鏂版灦鏋勭ǔ瀹氬悗鍐嶅垹闄?
**鍙傝€冧环鍊硷細**
- UI浜や簰璁捐<E79281>
- 鏌愪簺缁勪欢瀹炵幇
- API璋冪敤閫昏緫
- 涓氬姟娴佺▼
### 鍚<>姩鍛戒护
```json
{
"scripts": {
"dev:frontend-old": "cd frontend && npm run dev",
"dev:frontend-new": "cd frontend-v2 && npm run dev",
"dev:frontend": "npm run dev:frontend-new",
"dev:backend": "cd backend && npm run dev",
"dev": "concurrently \"npm run dev:backend\" \"npm run dev:frontend\""
}
}
```
---
## 馃幆 鎴愬姛鏍囧噯
### Week 2 楠屾敹鏍囧噯
**鍓嶇<E98D93>锛?*
- [x] frontend-v2 椤圭洰鍙<E6B4B0>繍琛?- [x] 椤堕儴瀵艰埅姝e父宸ヤ綔
- [x] 妯″潡娉ㄥ唽绯荤粺瀹屾暣
- [x] 5涓<35>ā鍧楀崰浣嶉〉闈?- [x] 璺<>敱鍒囨崲姝
- [x] 瀹屾暣鐨勫紑鍙戞枃妗?
**鍚庣<E98D9A>锛?*
- [ ]爜鍒嗗眰瀹屾垚锛坧latform/common/modules锛?- [ ] 鎵€鏈夌幇鏈堿PI姝父宸ヤ綔
- [ ]<>敱鍓嶇紑缁熶竴锛?api/v1/[module]/*锛?- [ ] import璺<74>緞鍏ㄩ儴鏇存柊
- [ ] API鏂囨。鏇存柊
**鏂囨。锛?*
- [x]<>灦鏋勮<E98F8B>璁℃枃妗?- [ ] 鍓嶇<E98D93>寮€鍙戣<E98D99>鑼冩枃妗?- [ ] 鍚庣<E98D9A>寮€鍙戣<E98D99>鑼冩枃妗?- [ ] Week 2鎬荤粨鎶ュ憡
---
## 馃摎 鐩稿叧鏂囨。
### 鏋舵瀯璁捐<E79281>
- [Schema闅旂<EFBFBD>鏋舵瀯璁捐<EFBFBD>锛?0涓<30>](../09-鏋舵瀯瀹炴柦/01-Schema闅旂<E99785>鏋舵瀯璁捐<E79281>锛?0涓<30>級.md)
- [鍓嶇<EFBFBD>鎬讳綋鏋舵瀯璁捐<EFBFBD>](../01-骞冲彴鍩虹<E98DA9>灞?06-鍓嶇<E98D93>鏋舵瀯/01-鍓嶇<E98D93>鎬讳綋鏋舵瀯璁捐<E79281>.md)
- [瀵艰埅缁撴瀯璁捐<EFBFBD>](../01-骞冲彴鍩虹<E98DA9>灞?06-鍓嶇<E98D93>鏋舵瀯/02-瀵艰埅缁撴瀯璁捐<E79281>.md)
### 鏁版嵁搴撹<E690B4>璁?- [AIA鏁版嵁搴撹<E690B4><EFBFBD>(../03-涓氬姟妯″潡/AIA-AI鏅鸿兘闂<E58598>瓟/02-鎶€鏈<E282AC><E98F88>璁?01-鏁版嵁搴撹<E690B4>璁?md)
- [PKB鏁版嵁搴撹<E690B4><EFBFBD>(../03-涓氬姟妯″潡/PKB-涓<>汉鐭ヨ瘑搴?02-鎶€鏈<E282AC><E98F88>璁?01-鏁版嵁搴撹<E690B4>璁?md)
### 瀹炴柦鎶ュ憡
- [Schema杩佺Щ瀹屾垚鎶ュ憡](../09-鏋舵瀯瀹炴柦/Schema杩佺Щ瀹屾垚鎶ュ憡.md)
- [Prisma閰嶇疆瀹屾垚鎶ュ憡](../09-鏋舵瀯瀹炴柦/Prisma閰嶇疆瀹屾垚鎶ュ憡.md)
### 椤圭洰绠$悊
- [涓嬩竴闃舵<E99783>琛屽姩璁″垝-V2.2-瀹屾暣鐗圿(../08-椤圭洰绠$悊/涓嬩竴闃舵<E99783>琛屽姩璁″垝-V2.2-瀹屾暣鐗?md)
---
## 馃攧 鐗堟湰鍘嗗彶
| 鐗堟湰 | 鏃ユ湡 | 鍙樻洿鍐呭<E98D90> | 缁存姢鑰?|
|------|------|---------|--------|
| V2.0 | 2025-11-12 | 鍒涘缓鏈<E7BC93>枃妗紝瀹氫箟鍓嶅悗绔<E68297>ā鍧楀寲鏋舵瀯 | AI鍔╂墜 |
| V2.1 | 2025-11-13 | 瀹屾垚鏉冮檺绯荤粺銆侀敊璇<E6958A>竟鐣屻€佽矾鐢卞畧鍗<E795A7>疄鏂?| AI鍔╂墜 |
---
**鏂囨。缁存姢鑰咃細** AI鍔╂墜 + 寮€鍙戝洟闃?
**鏈€鍚庢洿鏂帮細** 2025-11-13
**鏂囨。鐘舵€侊細** 鉁?宸插畬鎴愶紝Week 2 Day 7瀹炴柦瀹屾垚
**馃帀 杩欐槸绯荤粺鏋舵瀯婕旇繘鐨勯噸瑕侀噷绋嬬<E7BB8B>锛?*