Files
AIclinicalresearch/docs/01-平台基础层/06-前端架构/01-前端总体架构设计.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

590 lines
19 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 蟷ウ蜿ー蜑咲ォッ諤サ菴捺楔譫<E6A594>ョセ隶。
> **譁<>。」迚域悽<E59F9F>?* v1.0
> **蛻帛サコ譌・譛滂シ?* 2025-10-29
> **扈エ謚、閠<EFBDA4><EFBFBD>** 蜑咲ォッ蠑€蜿大屬髦?
> **譛€蜷取峩譁ー<E8AD81><EFBDB0>** 2025-10-29
---
## <20>搭 譁<>。」隸エ譏<EFBDB4>
譛ャ譁<EFBFBD>。」譏ッ**蟷ウ蜿ー郤ァ蜑咲ォッ譫カ譫<EFBDB6>ョセ隶?*<2A>梧カオ逶匁紛荳ェAI遘醍<E98198>泌ケウ蜿ー逧<EFBDB0>燕遶ッ譫カ譫<EFBDB6>シ悟桁諡ャ<E8ABA1>?
- 扈滉ク€<C280>。カ驛ィ蟇シ闊ェ隶セ隶?
- 讓。蝮怜喧譫カ譫<EFBDB6>ョセ隶?
- 霍ッ逕ア隶セ隶。
-<>剞謗ァ蛻カ邉サ扈滂シ?*迚域悽驟咲スョ螳悟<E89EB3>蜿ッ隹<EFBDAF><E99AB9>?*<2A>?
- 讓。蝮礼峡遶区€ァ隶セ隶。<E99AB6>域髪謖∵悴譚・迢ャ遶句<E981B6><EFBFBD>シ?
> **豕ィ諢擾シ?* 譛ャ譁<EFBDAC>。」譏ッ蟷ウ蜿ー郤ァ隶セ隶。<E99AB6>悟推讓。蝮礼噪隸ヲ扈<EFBDA6>楔譫<E6A594>ョセ隶。隸キ蜿り€<E3828A>推讓。蝮礼噪荳灘ア樊枚譯」縲?
> **驥崎ヲ∵署遉コ<E98189>?* 譛ャ譁<EFBDAC>。」荳ュ豸牙所逧<E68980>沿譛ャ譚<EFBDAC>剞蛻<E5899E><E89BBB><EFBFBD>亥渕遑€迚医€<E58CBB>ォ倡コァ迚医€∵覧闊ー迚育噪讓。蝮怜<E89DAE>驟搾シ牙插荳コ**蛻晏ァ区婿譯<E5A9BF>**<2A>悟庄莉・譬ケ謐ョ荳壼苅髴€豎る囂譌カ隹<EFBDB6><EFBFBD>梧裏髴€謾ケ蜉ィ莉」遐<EFBDA3>€サ霎代€よ耳闕蝉サ主錘遶ッAPI蜉ィ諤∬執蜿也沿譛ャ驟咲スョ縲?
---
## <20>識 隶セ隶。蜴溷<E89CB4>
### 1. 讓。蝮怜喧隶セ隶?
- 豈丈クェ蜉溯<E89C89>讓。蝮礼峡遶句シ€蜿代€∫峡遶矩Κ鄂?
- 讓。蝮鈴龍譌<E9BE8D>萓晁オ門<EFBDB5>邉サ<E98289>悟庄迢ャ遶玖ソ占。<E58DA0>
- 謾ッ謖∵ィ。蝮礼峡遶倶コァ蜩∝喧<E2889D>亥ヲ<E4BAA5>I譎コ閭ス譁<EFBDBD>鍵迢ャ遶句醗蜊厄シ?
### 2. 譚<>剞謗ァ蛻カ隶セ隶。
- 蝓コ莠守畑謌キ迚域悽逧<E682BD>揀髯先而蛻?
- 轣オ豢サ逧<EFBDBB>粥閭ス讓。蝮怜シ€蜈ウ譛コ蛻?
- 謾ッ謖∵悴譚・蝠<EFBDA5>ク壽ィ。蠑乗挙螻包シ亥渕遑€迚医€<E58CBB>ォ倡コァ迚医€∵覧闊ー迚茨シ?
### 3. 蜿ッ謇ゥ螻墓€ァ隶セ隶?
-<>蕗譁ー讓。蝮玲磁蜈・謗・蜿?
- 謠剃サカ蛹也噪讓。蝮怜刈霓ス譛コ蛻カ
- 驟咲スョ鬩ア蜉ィ逧<EFBDA8>粥閭ス蠑€蜈?
### 4. 荳€閾エ諤ァ隶セ隶?
- 扈滉ク€逧ФI/UX隗<58>
- 扈滉ク€<C280>コ、莠呈ィ。蠑?
- 扈滉ク€<C280>憾諤∫ョ。逅?
---
## <20>ァュ 鬘カ驛ィ蟇シ闊ェ隶セ隶。
### 蟇シ闊ェ扈捺桷
```
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏?Logo [AI髣ョ遲脳 [AI譎コ閭ス譁<EFBDBD>鍵] [遏・隸<EFBDA5>コ転 [譎コ閭ス謨ー謐ョ貂<EFBDAE>エ余 [譎コ閭ス扈溯ョ。蛻<EFBDA1>梵] [扈溯ョ。蛻<EFBDA1>梵蟾・蜈キ] [逕ィ謌キ蜷?笆シ] 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
```
### 蟇シ闊ェ鬘ケ隸ヲ諠?
| 菴咲スョ | 荳ュ譁<EFBDAD>錐遘ー | 闍ア譁<EFBDB1><E8AD81><EFBFBD><EFBFBD> | 霍ッ逕ア霍ッ蠕<EFBDAF> | 蠑€蜿醍憾諤?| 譚<>剞隕∵アゑシ亥<EFBDBC>蟋矩<E89F8B>鄂ョ<E98482><EFBDAE> |
|------|---------|---------|---------|---------|---------------------|
| 1 | AI髣ョ遲<EFBDAE> | `ai-qa` | `/ai-qa` | 笨?蟾イ蠑€蜿?| 蝓コ遑€迚? 笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?|
| 2 | AI譎コ閭ス譁<EFBDBD>鍵 | `literature-platform` | `/literature` | <20>圦 蠕<>€蜿?| 鬮倡コァ迚? 笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?|
| 3 | 遏・隸<EFBDA5>コ?| `knowledge-base` | `/knowledge-base` | 笨?蟾イ蠑€蜿?| 蝓コ遑€迚? 笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?|
| 4 | 譎コ閭ス謨ー謐ョ貂<EFBDAE><EFBFBD> | `data-cleaning` | `/data-cleaning` | <20>搭 蜊<><EFBFBD> | 鬮倡コァ迚? 笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?|
| 5 | 譎コ閭ス扈溯ョ。蛻<EFBDA1>梵 | `statistical-analysis` | `/intelligent-analysis` | 笨?蟾イ蠑€蜿托シ<E68998>ava蝗「髦滂シ?| 譌苓芦迚?笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?|
| 6 | 扈溯ョ。蛻<EFBDA1>梵蟾・蜈キ | `statistical-tools` | `/statistical-tools` | 笨?蟾イ蠑€蜿托シ<E68998>ava蝗「髦滂シ?| 譌苓芦迚?笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?|
| 譛€蜿ウ萓ァ | 荳ェ莠コ荳ュ蠢<EFBDAD> | `user-center` | `/user/*` | 笨?蟾イ蠑€蜿?| 謇€譛臥畑謌?|
> **隸エ譏趣シ?* 譚<>剞隕∵アょ<EFBDB1>荳ュ逧?蝓コ遑€迚?"縲?鬮倡コァ迚?"縲?譌苓芦迚?荳?*蛻晏ァ矩<EFBDA7>鄂ョ**<2A>悟庄譬ケ謐ョ荳壼苅髴€豎る囂譌カ隹<EFBDB6><EFBFBD>梧裏髴€謾ケ蜉ィ莉」遐<EFBDA3>€サ霎代€よ耳闕蝉サ主錘遶ッAPI蜉ィ諤∬執蜿也沿譛ャ驟咲スョ縲?
### 霍ッ逕ア霍ッ蠕<EFBDAF>ョセ隶。
```typescript
// 荳サ霍ッ逕ア扈捺<E68988>?
const routes = {
// 讓。蝮苓キッ逕ア
'/ai-qa': 'AI髣ョ遲疲ィ。蝮<EFBDA1>',
'/literature': 'AI譎コ閭ス譁<EFBDBD>鍵讓。蝮<EFBDA1>',
'/knowledge-base': '遏・隸<EFBDA5>コ捺ィ。蝮?,
'/data-cleaning': '<EFBFBD><EFBFBD>',
'/intelligent-analysis': '<EFBFBD><EFBFBD>ava蝗€<EFBFBD><EFBFBD><EFBFBD>?,
'/statistical-tools': '扈溯ョ。蛻<EFBDA1>梵蟾・蜈キ讓。蝮暦シ<E69AA6>ava蝗「髦溷シ€蜿托シ悟宵蛛夐。カ驛ィ蟇シ闊ェ髮<EFBDAA><E9ABAE><EFBFBD>?,
// 逕ィ謌キ逶ク蜈ウ
'/user/profile': '<EFBFBD> - <EFBFBD>',
'/user/settings': '<EFBFBD> - ',
'/user/history': '<EFBFBD> - <EFBFBD><EFBFBD>',
'/user/subscription': '<EFBFBD> - <EFBFBD><EFBFBD>',
};
```
---
## <20><EFBFBD>?謨エ菴捺楔譫<E6A594>ョセ隶。
### 譫カ譫<EFBDB6>アよャ。蝗?
```
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? 蠎皮畑螻?(Application) 笏?
笏? 笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏? 笏?AI髣ョ遲<EFBDAE> 笏?笏<>I譎コ閭ス譁<EFBDBD>鍵笏?笏?遏・隸<EFBDA5>コ? 笏?笏?蜈カ莉匁ィ。蝮<EFBDA1> 笏? 笏?
笏? 笏?Module 笏?笏?Module 笏?笏?Module 笏?笏?Module 笏? 笏?
笏? 笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
竊?
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? 譯<>楔螻?(Framework Layer) 笏?
笏? 笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏? 笏?蟇シ闊ェ邉サ扈<EFBDBB> 笏?笏?霍ッ逕ア邉サ扈<EFBDBB> 笏?笏?譚<>剞謗ァ蛻カ 笏? 笏?
笏? 笏?Navigation 笏?笏?Router 笏?笏?Permission 笏? 笏?
笏? 笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏? 笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏? 笏?蟶<>€邉サ扈<EFBDBB> 笏?笏?迥カ諤∫ョ。逅? 笏?笏?驟咲スョ邂。逅<EFBDA1> 笏? 笏?
笏? 笏?Layout 笏?笏?State Mgmt 笏?笏?Config 笏? 笏?
笏? 笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏? 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
竊?
笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏? 蝓コ遑€螻?(Base Layer) 笏?
笏? React + TypeScript + Ant Design + Tailwind CSS 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
```
### 逶ョ蠖慕サ捺桷隶セ隶。
```
frontend-v2/
笏懌楳笏€ src/
笏? 笏懌楳笏€ app/ # 蠎皮畑蜈・蜿」
笏? 笏? 笏懌楳笏€ App.tsx # 譬ケ扈<EFBDB9>サ?
笏? 笏? 笏懌楳笏€ main.tsx # 蜈・蜿」譁<EFBDA3>サカ
笏? 笏? 笏披楳笏€ routes.tsx # 霍ッ逕ア驟咲スョ
笏? 笏?
笏? 笏懌楳笏€ framework/ # 譯<>楔螻ゑシ域<EFBDBC>ク蠢<EFBDB8>シ?
笏? 笏? 笏懌楳笏€ navigation/ # 蟇シ闊ェ邉サ扈<EFBDBB>
笏? 笏? 笏? 笏懌楳笏€ TopNavigation.tsx # 鬘カ驛ィ蟇シ闊ェ
笏? 笏? 笏? 笏懌楳笏€ SideNavigation.tsx # 蟾ヲ萓ァ蟇シ闊ェ
笏? 笏? 笏? 笏披楳笏€ navigationConfig.ts # 蟇シ闊ェ驟咲スョ
笏? 笏? 笏?
笏? 笏? 笏懌楳笏€ routing/ # 霍ッ逕ア邉サ扈<EFBDBB>
笏? 笏? 笏? 笏懌楳笏€ RouterConfig.tsx # 霍ッ逕ア驟咲スョ
笏? 笏? 笏? 笏懌楳笏€ RouteGuard.tsx # 霍ッ逕ア螳亥梱<E4BAA5>域揀髯撰シ<E692B0>
笏? 笏? 笏? 笏披楳笏€ LazyLoader.tsx # 諛貞刈霓?
笏? 笏? 笏?
笏? 笏? 笏懌楳笏€ permission/ # 譚<>剞謗ァ蛻カ
笏? 笏? 笏? 笏懌楳笏€ PermissionProvider.tsx
笏? 笏? 笏? 笏懌楳笏€ usePermission.ts # 譚<>剞Hook
笏? 笏? 笏? 笏懌楳笏€ permissionConfig.ts # 譚<>剞驟咲スョ
笏? 笏? 笏? 笏披楳笏€ versionConfig.ts # 迚域悽驟咲スョ
笏? 笏? 笏?
笏? 笏? 笏懌楳笏€ layout/ # 蟶<>€邉サ扈<EFBDBB>
笏? 笏? 笏? 笏懌楳笏€ MainLayout.tsx # 荳サ蟶<EFBDBB>€
笏? 笏? 笏? 笏懌楳笏€ ModuleLayout.tsx # 讓。蝮怜ク<E6809C>€
笏? 笏? 笏? 笏披楳笏€ EmptyLayout.tsx # 遨コ蟶<EFBDBA>€
笏? 笏? 笏?
笏? 笏? 笏懌楳笏€ config/ # 驟咲スョ邂。逅<EFBDA1>
笏? 笏? 笏? 笏懌楳笏€ moduleConfig.ts # 讓。蝮鈴<E89DAE>鄂ョ
笏? 笏? 笏? 笏懌楳笏€ appConfig.ts # 蠎皮畑驟咲スョ
笏? 笏? 笏? 笏披楳笏€ environment.ts # 邇ッ蠅<EFBDAF><E8A085>鄂ョ
笏? 笏? 笏?
笏? 笏? 笏披楳笏€ state/ # 蜈ィ螻€迥カ諤?
笏? 笏? 笏懌楳笏€ userStore.ts # 逕ィ謌キ迥カ諤?
笏? 笏? 笏懌楳笏€ navigationStore.ts # 蟇シ闊ェ迥カ諤?
笏? 笏? 笏披楳笏€ permissionStore.ts # 譚<>剞迥カ諤?
笏? 笏?
笏? 笏懌楳笏€ modules/ # 蜉溯<E89C89>讓。蝮暦シ育峡遶具シ<E585B7>
笏? 笏? 笏懌楳笏€ ai-qa/ # AI髣ョ遲疲ィ。蝮<EFBDA1>
笏? 笏? 笏? 笏懌楳笏€ index.tsx
笏? 笏? 笏? 笏懌楳笏€ routes.tsx
笏? 笏? 笏? 笏披楳笏€ ...
笏? 笏? 笏?
笏? 笏? 笏懌楳笏€ literature/ # AI譎コ閭ス譁<EFBDBD>鍵讓。蝮<EFBDA1>
笏? 笏? 笏? 笏懌楳笏€ index.tsx
笏? 笏? 笏? 笏懌楳笏€ routes.tsx
笏? 笏? 笏? 笏披楳笏€ ...
笏? 笏? 笏?
笏? 笏? 笏懌楳笏€ knowledge-base/ # 遏・隸<EFBDA5>コ捺ィ。蝮?
笏? 笏? 笏? 笏懌楳笏€ index.tsx
笏? 笏? 笏? 笏懌楳笏€ routes.tsx
笏? 笏? 笏? 笏披楳笏€ ...
笏? 笏? 笏?
笏? 笏? 笏懌楳笏€ data-cleaning/ # 譎コ閭ス謨ー謐ョ貂<EFBDAE>エ暦シ亥頃菴搾シ<E690BE>
笏? 笏? 笏? 笏披楳笏€ Placeholder.tsx
笏? 笏? 笏?
笏? 笏? 笏懌楳笏€ intelligent-analysis/ # 譎コ閭ス扈溯ョ。蛻<EFBDA1>
笏? 笏? 笏? 笏披楳笏€ ...
笏? 笏? 笏?
笏? 笏? 笏披楳笏€ statistical-tools/ # 扈溯ョ。蛻<EFBDA1>梵蟾・蜈キ
笏? 笏? 笏披楳笏€ ...
笏? 笏?
笏? 笏懌楳笏€ components/ # 騾夂畑扈<E79591>サカ
笏? 笏? 笏懌楳笏€ common/ # 蝓コ遑€<C280>サカ
笏? 笏? 笏懌楳笏€ business/ # 荳壼苅扈<E88B85>サカ
笏? 笏? 笏披楳笏€ hooks/ # 騾夂畑Hooks
笏? 笏?
笏? 笏懌楳笏€ api/ # API螻?
笏? 笏? 笏懌楳笏€ client.ts # API螳「謌キ遶?
笏? 笏? 笏懌楳笏€ modules/ # 讓。蝮輸PI
笏? 笏? 笏披楳笏€ types/ # API邀サ蝙<EFBDBB>
笏? 笏?
笏? 笏懌楳笏€ utils/ # 蟾・蜈キ蜃ス謨ー
笏? 笏披楳笏€ types/ # 蜈ィ螻€邀サ蝙<EFBDBB>
```
---
## <20>柏 譚<>剞謗ァ蛻カ隶セ隶。
### 逕ィ謌キ迚域悽螳壻ケ<E5A3BB>
> **驥崎ヲ∬ッエ譏趣シ?* 迚域悽譚<E682BD>剞蛻<E5899E><E89BBB>譏ッ螳悟<E89EB3>?*蜿ッ驟咲スョ縲∝庄隹<E5BA84>紛**逧<>€ゆサ・荳矩<E88DB3>鄂ョ荳コ**蛻晏ァ区婿譯<E5A9BF>**<2A>悟庄莉・譬ケ謐ョ荳壼苅髴€豎る囂譌カ菫ョ謾ケ<E8ACBE>梧裏髴€謾ケ蜉ィ莉」遐<EFBDA3>€サ霎代€?
```typescript
// 逕ィ謌キ迚域悽邀サ蝙<EFBDBB>
type UserVersion = 'basic' | 'advanced' | 'premium';
// 迚域悽驟咲スョ<EFBDBD>亥庄驟咲スョ<EFBDBD>梧髪謖∝錘譛溯ー<E6BAAF><EFBFBD><E7B49B>
// 驟咲スョ譁<EFBDAE>サカ菴咲スョ<EFBDBD>嘖rc/framework/permission/versionConfig.ts
// 謌冶€<E586B6>€夊ソ<E5A48A>錘遶ッAPI蜉ィ諤∬執蜿夜<E89CBF>鄂?
const VERSION_CONFIG = {
basic: {
name: '蝓コ遑€迚?,
modules: ['ai-qa', 'knowledge-base'], // 蛻晏ァ矩<EFBDA7>鄂ョ<E98482>壼渕遑€迚亥桁蜷ォ讓。蝮?
},
advanced: {
name: '?,
modules: [
'ai-qa',
'knowledge-base',
'literature-platform',
'data-cleaning',
], // 蛻晏ァ矩<EFBDA7>鄂ョ<E98482>夐ォ倡コァ迚亥桁蜷ォ讓。蝮<EFBDA1>
},
premium: {
name: '譌苓芦迚?,
modules: [
'ai-qa',
'knowledge-base',
'literature-platform',
'data-cleaning',
'intelligent-analysis',
'statistical-tools',
], // 蛻晏ァ矩<EFBDA7>鄂ョ<E98482>壽覧闊ー迚亥桁蜷ォ蜈ィ驛ィ讓。蝮<EFBDA1>
},
};
// 隸エ譏趣シ?
// 1. 莉・荳頑ィ。蝮怜<E89DAE>驟堺クコ蛻晏ァ区婿譯茨シ悟庄譬ケ謐ョ螳樣刔荳壼苅髴€豎りー<E3828A><EFBDB0>?
// 2. 謾ッ謖<EFBDAF>€夊ソ<E5A48A><EFBDBF>鄂ョ譁<EFBDAE>サカ菫ョ謾ケ<E8ACBE>梧裏髴€謾ケ蜉ィ莉」遐<EFBDA3>
// 3. 譖エ謗ィ闕蝉サ主錘遶ッAPI蜉ィ諤∬執蜿也沿譛ャ驟咲スョ<EFBDBD>御セソ莠主ョ樊慮隹<E685AE>
```
### 譚<>剞謗ァ蛻カ螳樒鴫
> **隶セ隶。隸エ譏趣シ?* 譚<>剞謗ァ蛻カ驥<EFBDB6>畑驟咲スョ鬩ア蜉ィ逧<EFBDA8>婿蠑擾シ梧髪謖<E9ABAA>€夊ソ<E5A48A><EFBDBF>鄂ョ譁<EFBDAE>サカ謌門錘遶ッAPI蜉ィ諤∬執蜿也沿譛ャ驟咲スョ<EFBDBD>御セソ莠主錘譛溽<E8AD9B>豢サ隹<EFBDBB>紛縲?
```typescript
// 譚<>剞謗ァ蛻カHook
export const usePermission = () => {
const userVersion = useUserStore((state) => state.version);
// 譁ケ蠑<EFBDB9>1<EFBFBD>壻サ朱撕諤<E69295><E8ABA4>鄂ョ隸サ蜿厄シ磯€ょ粋蠑€蜿鷹亳谿オ<E8B0BF><EFBDB5>
// const allowedModules = VERSION_CONFIG[userVersion].modules;
// 譁ケ蠑<EFBDB9>2<EFBFBD>壻サ主錘遶ッAPI蜉ィ諤∬執蜿厄シ域耳闕撰シ梧髪謖∝ョ樊慮隹<E685AE><EFBFBD><E7B49B>
const versionConfig = useVersionConfig(); // 莉拶PI闔キ蜿匁怙譁ー驟咲ス?
const allowedModules = versionConfig[userVersion]?.modules || [];
const hasAccess = (moduleId: string): boolean => {
return allowedModules.includes(moduleId);
};
const getFilteredNavigation = (navigation: NavigationItem[]) => {
return navigation.filter((item) => {
// 譽€譟・逕ィ謌キ迚域悽譏ッ蜷ヲ貊。雜ウ讓。蝮苓ヲ∵ア?
if (!item.requiredVersion) return true;
const versionHierarchy = ['basic', 'advanced', 'premium'];
const userLevel = versionHierarchy.indexOf(userVersion);
const requiredLevel = versionHierarchy.indexOf(item.requiredVersion);
return userLevel >= requiredLevel;
});
};
return {
hasAccess,
getFilteredNavigation,
userVersion,
versionConfig, // 霑泌屓蠖灘燕迚域悽驟咲スョ<EFBDBD>御セソ莠手ー<E6898B>ッ?
};
};
```
### 迚域悽驟咲スョ蜉ィ諤∬執蜿厄シ域耳闕先婿譯茨シ?
```typescript
// src/framework/permission/useVersionConfig.ts
import { useQuery } from '@tanstack/react-query';
export const useVersionConfig = () => {
const { data, isLoading } = useQuery({
queryKey: ['versionConfig'],
queryFn: async () => {
// 莉主錘遶ッAPI闔キ蜿也沿譛ャ驟咲スョ
const response = await fetch('/api/config/version');
return response.json();
},
staleTime: 5 * 60 * 1000, // 郛灘ュ<E78198>5蛻<35>
refetchOnWindowFocus: false,
});
// 螯よ棡API隸キ豎ょ、ア雍・<E99B8D>悟屓騾€蛻ー譛ャ蝨ー驟咲ス?
return data || VERSION_CONFIG;
};
```
**莨伜漢<E4BC9C>?*
- 笨?迚域悽驟咲スョ蜿ッ蝨ィ蜷守ォッ螳樊慮隹<E685AE><EFBFBD>梧裏髴€蜑咲ォッ蜿醍沿
- 笨?謾ッ謖、/B豬玖ッ穂ク榊酔迚域悽驟咲スョ
- 笨?萓ソ莠手ソ占是莠コ蜻倡<E89CBB>豢サ隹<EFBDBB>紛莠ァ蜩∫ュ也払
- 笨?蜑咲ォッ譛画悽蝨ー驟咲スョ菴應クコ蜈懷コ墓婿譯茨シ御ソ晁ッ∝庄逕ィ諤?
### 霍ッ逕ア螳亥梱
```typescript
// RouteGuard.tsx
export const RouteGuard = ({ moduleId, children }) => {
const { hasAccess } = usePermission();
if (!hasAccess(moduleId)) {
return <UpgradePrompt moduleId={moduleId} />;
}
return children;
};
```
---
## <20>伯 讓。蝮礼峡遶区€ァ隶セ隶?
### 讓。蝮玲ウィ蜀梧惻蛻カ
```typescript
// 讓。蝮玲磁蜿」螳壻ケ<E5A3BB>
interface ModuleDefinition {
id: string; // 讓。蝮怜髪荳€<C280><EFBFBD>
name: string; // 讓。蝮怜錐遘ー
route: string; // 霍ッ逕ア霍ッ蠕<EFBDAF>
icon?: ReactNode; // 蝗セ譬<EFBDBE>
component: LazyComponent; // 諛貞刈霓ス扈<EFBDBD>サ?
sideNav?: SideNavConfig; // 蟾ヲ萓ァ蟇シ闊ェ驟咲スョ
version?: UserVersion[]; // 謾ッ謖∫噪迚域<E8BF9A>?
standalone?: boolean; // 譏ッ蜷ヲ謾ッ謖∫峡遶玖ソ占。<E58DA0>
apiBaseUrl?: string; // 迢ャ遶玖ソ占。梧慮逧БPI蝨ー蝮€
}
// 讓。蝮鈴<E89DAE>鄂ョ
const MODULES: ModuleDefinition[] = [
{
id: 'literature-platform',
name: 'AI譎コ閭ス譁<EFBDBD>鍵',
route: '/literature',
component: lazy(() => import('@/modules/literature')),
version: ['advanced', 'premium'],
standalone: true, // 謾ッ謖∫峡遶玖ソ占。<E58DA0>
apiBaseUrl: process.env.LITERATURE_API_URL, // 蜿ッ驟咲ス?
},
// ... 蜈カ莉匁ィ。蝮<EFBDA1>
];
```
### 迢ャ遶矩Κ鄂イ謾ッ謖<EFBDAF>
```typescript
// 讓。蝮怜刈霓ス蝎?
export const ModuleLoader = ({ moduleId }: { moduleId: string }) => {
const module = MODULES.find((m) => m.id === moduleId);
if (!module) {
return <NotFound />;
}
// 譽€譟・譏ッ蜷ヲ迢ャ遶玖ソ占。梧ィ。蠑?
const isStandalone = module.standalone &&
window.location.hostname === module.apiBaseUrl;
if (isStandalone) {
// 迢ャ遶玖ソ占。鯉シ壻ク肴仞遉コ鬘カ驛ィ蟇シ闊ェ<E9978A>悟宵譏セ遉コ讓。蝮怜<E89DAE>螳ケ
return <StandaloneLayout module={module} />;
}
// 髮<><E9ABAE>霑占。鯉シ壽仞遉コ螳梧紛蟇シ闊ェ蜥悟ク<E6829F>€
return <ModuleLayout module={module} />;
};
```
### 驟咲スョ鬩ア蜉ィ逧<EFBDA8>ィ。蝮怜刈霓?
```typescript
// 邇ッ蠅<EFBDAF>序驥城<E9A9A5>鄂ョ
// .env
REACT_APP_ENABLED_MODULES=ai-qa,knowledge-base,literature-platform
REACT_APP_STANDALONE_MODULE=literature-platform
// 讓。蝮鈴<E89DAE>鄂ョ隸サ蜿<EFBDBB>
const getEnabledModules = () => {
const enabled = process.env.REACT_APP_ENABLED_MODULES?.split(',') || [];
return MODULES.filter((m) => enabled.includes(m.id));
};
```
---
## <20>盗 蟶<>€邉サ扈溯ョセ隶。
### 蟶<>€螻よャ。
```
MainLayout (荳サ蟶<EFBDBB>€)
笏懌楳笏€ Header (鬘カ驛ィ蟇シ闊ェ)
笏? 笏懌楳笏€ Logo
笏? 笏懌楳笏€ TopNavigation (蟇シ闊ェ鬘?
笏? 笏披楳笏€ UserMenu (逕ィ謌キ闖懷黒)
笏?
笏披楳笏€ MainContent (荳サ蜀<EFBDBB>ョケ蛹コ)
笏懌楳笏€ SideNavigation (蟾ヲ萓ァ蟇シ闊ェ) - 蜿ッ騾?
笏披楳笏€ Content (蜀<>ョケ蛹コ蝓<EFBDBA>)
笏披楳笏€ ModuleLayout (讓。蝮怜ク<E6809C>€)
```
### 蟶<>€<C280>サカ
```typescript
// MainLayout.tsx
export const MainLayout = () => {
return (
<div className="min-h-screen flex flex-col">
<Header />
<div className="flex flex-1">
<SideNavigation /> {/* 譬ケ謐ョ讓。蝮玲仞遉コ/髫占酪 */}
<main className="flex-1">
<Outlet /> {/* 霍ッ逕ア蜃コ蜿」 */}
</main>
</div>
</div>
);
};
// ModuleLayout.tsx
export const ModuleLayout = ({ module }: { module: ModuleDefinition }) => {
return (
<div className="module-layout">
{module.sideNav && <ModuleSideNav config={module.sideNav} />}
<div className="module-content">
<Outlet />
</div>
</div>
);
};
```
---
## <20>耳 UI/UX隶セ隶。隗<EFBDA1>
### 鬘カ驛ィ蟇シ闊ェ譬キ蠑<EFBDB7>
```css
.top-navigation {
height: 64px;
background: #ffffff;
border-bottom: 1px solid #e5e7eb;
display: flex;
align-items: center;
padding: 0 24px;
}
.nav-item {
padding: 8px 16px;
margin: 0 4px;
color: #4b5563;
font-weight: 500;
border-bottom: 2px solid transparent;
transition: all 0.2s;
}
.nav-item:hover {
color: #0ea5e9;
}
.nav-item.active {
color: #0ea5e9;
border-bottom-color: #0ea5e9;
font-weight: 600;
}
```
### 蜩榊コ泌シ剰ョセ隶?
- **譯碁擇遶?(>1024px)**: 螳梧紛譏セ遉コ謇€譛牙ッシ闊ェ鬘ケ
- **蟷ウ譚ソ遶?(768-1024px)**: 譏セ遉コ蜑?荳ェ<E88DB3><EFBFBD>菴呎釜蜿<E9879C>蛻?譖エ螟<EFBDB4>"闖懷黒
- **遘サ蜉ィ遶?(<768px)**: 豎牙<E8B18E>。闖懷黒 + 謚ス螻牙ッシ闊ェ
---
## <20>統 螳樊命隶。蛻<EFBDA1>
### 隨ャ荳€髦カ谿オ<E8B0BF>壽。<E5A3BD>楔謳ュ蟒コ<E89F92><EFBDBA>eek 1<>?
- [x] 蛻帛サコ譁ー蜑咲ォッ鬘ケ逶ョ扈捺<E68988>?
- [ ] 螳樒鴫鬘カ驛ィ蟇シ闊ェ扈<EFBDAA>サカ
- [ ] 螳樒鴫霍ッ逕ア邉サ扈<EFBDBB>
- [ ] 螳樒鴫譚<E9B4AB>剞謗ァ蛻カ蝓コ遑€
- [ ] 螳樒鴫蝓コ遑€<C280>€邉サ扈<EFBDBB>
### 隨ャ莠碁亳谿オ<E8B0BF>壽ィ。蝮鈴寔謌撰シ<E692B0>eek 2<>?
- [ ] 霑∫ァサAI髣ョ遲疲ィ。蝮<EFBDA1>
- [ ] 霑∫ァサ遏・隸<EFBDA5>コ捺ィ。蝮?
- [ ] 螳樒鴫蜊<E9B4AB>菴肴ィ。蝮暦シ域匱閭ス謨ー謐ョ貂<EFBDAE>エ暦シ<E69AA6>
- [ ] 螳悟埋譚<E59F8B>剞謗ァ蛻カ
### 隨ャ荳蛾亳谿オ<E8B0BF>哂I譎コ閭ス譁<EFBDBD>鍵蠑€蜿托シ<E68998>eek 3+<2B>?
- [ ]€蜿羨I譎コ閭ス譁<EFBDBD>鍵讓。蝮<EFBDA1>
- [ ] 螳樒鴫讓。蝮礼峡遶玖ソ占。梧髪謖<E9ABAA>
- [ ] 螳悟埋譁<E59F8B>。」蜥梧オ玖ッ?
---
## <20>売 譛ェ譚・謇ゥ螻戊€<E6888A>
### 1. 讓。蝮礼峡遶倶コァ蜩∝<E89CA9>?
- 謾ッ謖<EFBDAF>€夊ソ<E5A48A>識蠅<E8AD98>序驥城<E9A9A5>鄂ョ迢ャ遶玖ソ占。<E58DA0>
- 迢ャ遶狗噪API蝨ー蝮€驟咲スョ
- 迢ャ遶狗噪驛ィ鄂イ驟咲ス?
### 2. 迚域悽譚<E682BD>剞邂。逅<EFBDA1>
- 蜷守ォッAPI謠蝉セ帷畑謌キ迚域悽菫。諱ッ
- 迚域悽驟咲スョ螳悟<E89EB3>蜿ッ隹<EFBDAF><EFBFBD>域裏髴€謾ケ蜉ィ莉」遐<EFBDA3>シ?
- 謗ィ闕蝉サ主錘遶ッAPI蜉ィ諤∬執蜿也沿譛ャ驟咲スョ<EFBDBD>梧髪謖∝ョ樊慮隹<E685AE>紛讓。蝮怜<E89DAE><EFBFBD>
- 蜑咲ォッ譬ケ謐ョ迚域悽蜉ィ諤∵仞遉?髫占酪讓。蝮<EFBDA1>
- 謾ッ謖∫沿譛ャ蜊<EFBDAC>コァ謠千、コ
- 迚域悽譚<E682BD>剞蛻<E5899E><E89BBB>遲也払蜿ッ髫乗慮譬ケ謐ョ荳壼苅髴€豎りー<E3828A><EFBDB0>?
### 3. 譁ー讓。蝮玲磁蜈?
- 驕オ蠕ェ讓。蝮玲磁蜿」隗<EFBDA3>
- 蝨ィ驟咲スョ譁<EFBDAE>サカ荳ュ豕ィ蜀梧ィ。蝮<EFBDA1>
- 閾ェ蜉ィ髮<EFBDA8><E9ABAE>蛻ー蟇シ闊ェ邉サ扈?
---
## <20>答 逶ク蜈ウ譁<EFBDB3>。」
- [蟇シ闊ェ扈捺桷隶セ隶。](./02-蟇シ闊ェ扈捺桷隶セ隶。.md)
- [霍ッ逕ア隶セ隶。](./03-霍ッ逕ア隶セ隶。.md)
- [<EFBFBD>€隶セ隶。](./04-蟶<>€隶セ隶。.md)
- [<EFBFBD>剞謗ァ蛻カ隶セ隶。](./05-譚<>剞謗ァ蛻カ隶セ隶。.md)
- [AI譎コ閭ス譁<EFBFBD>鍵讓。蝮玲楔譫<EFBFBD>ョセ隶。](../AI譎コ閭ス譁<EFBDBD>鍵/00-邉サ扈溯ョセ隶。/01-讓。蝮玲楔譫<E6A594>ョセ隶。.md)
---
**譁<>。」迚域悽<E59F9F>?* v1.0
**譛€蜷取峩譁ー<E8AD81><EFBDB0>** 2025-10-29