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

19 KiB
Raw Blame History

蟷ウ蜿ー蜑咲ォッ諤サ菴捺楔譫<EFBFBD>ョセ隶。

*<EFBFBD>。」迚域悽<EFBFBD>? v1.0
*蛻帛サコ譌・譛滂シ? 2025-10-29
扈エ謚、閠<EFBFBD><EFBFBD> 蜑咲ォッ蠑€蜿大屬髦? €蜷取峩譁ー<EFBFBD><EFBFBD> 2025-10-29


<EFBFBD>搭 譁<>。」隸エ譏<EFBDB4>

譛ャ譁<EFBFBD>。」譏ッ**蟷ウ蜿ー郤ァ蜑咲ォッ譫カ譫<EFBDB6>ョセ隶?*<2A>梧カオ逶匁紛荳ェAI遘醍<E98198>泌ケウ蜿ー逧<EFBDB0>燕遶ッ譫カ譫<EFBDB6>シ悟桁諡ャ<E8ABA1>?

  • 扈滉ク€<EFBFBD>。カ驛ィ蟇シ闊ェ隶セ隶?
  • 讓。蝮怜喧譫カ譫<EFBFBD>ョセ隶?
  • 霍ッ逕ア隶セ隶。
  • <EFBFBD>剞謗ァ蛻カ邉サ扈滂シ?迚域悽驟咲スョ螳悟<EFBFBD>蜿ッ隹<EFBFBD><EFBFBD>?<EFBFBD>?
  • 讓。蝮礼峡遶区€ァ隶セ隶。<EFBFBD>域髪謖∵悴譚・迢ャ遶句<EFBFBD><EFBFBD>シ?

*豕ィ諢擾シ? 譛ャ譁<EFBDAC>。」譏ッ蟷ウ蜿ー郤ァ隶セ隶。<E99AB6>悟推讓。蝮礼噪隸ヲ扈<EFBDA6>楔譫<E6A594>ョセ隶。隸キ蜿り€<E3828A>推讓。蝮礼噪荳灘ア樊枚譯」縲?

驥崎ヲ∵署遉コ<EFBFBD>? 譛ャ譁<EFBDAC>。」荳ュ豸牙所逧<E68980>沿譛ャ譚<EFBDAC>剞蛻<E5899E><E89BBB><EFBFBD>亥渕遑€迚医€<E58CBB>ォ倡コァ迚医€∵覧闊ー迚育噪讓。蝮怜<E89DAE>驟搾シ牙插荳コ蛻晏ァ区婿譯<EFBFBD>*<2A>悟庄莉・譬ケ謐ョ荳壼苅髴€豎る囂譌カ隹<EFBDB6><EFBFBD>梧裏髴€謾ケ蜉ィ莉」遐<EFBDA3>€サ霎代€よ耳闕蝉サ主錘遶ッAPI蜉ィ諤∬執蜿也沿譛ャ驟咲スョ縲?


<EFBFBD>識 隶セ隶。蜴溷<E89CB4>

1. 讓。蝮怜喧隶セ隶?

  • 豈丈クェ蜉溯<EFBFBD>讓。蝮礼峡遶句シ€蜿代€∫峡遶矩Κ鄂?
  • 讓。蝮鈴龍譌<EFBFBD>萓晁オ門<EFBFBD>邉サ<EFBFBD>悟庄迢ャ遶玖ソ占。<EFBFBD>
  • 謾ッ謖∵ィ。蝮礼峡遶倶コァ蜩∝喧<EFBFBD>亥ヲ<EFBFBD>I譎コ閭ス譁<EFBFBD>鍵迢ャ遶句醗蜊厄シ?

2. 譚<>剞謗ァ蛻カ隶セ隶。

  • 蝓コ莠守畑謌キ迚域悽逧<EFBFBD>揀髯先而蛻?
  • 轣オ豢サ逧<EFBFBD>粥閭ス讓。蝮怜シ€蜈ウ譛コ蛻?
  • 謾ッ謖∵悴譚・蝠<EFBFBD>ク壽ィ。蠑乗挙螻包シ亥渕遑€迚医€<EFBFBD>ォ倡コァ迚医€∵覧闊ー迚茨シ?

3. 蜿ッ謇ゥ螻墓€ァ隶セ隶?

  • <EFBFBD>蕗譁ー讓。蝮玲磁蜈・謗・蜿?
  • 謠剃サカ蛹也噪讓。蝮怜刈霓ス譛コ蛻カ
  • 驟咲スョ鬩ア蜉ィ逧<EFBFBD>粥閭ス蠑€蜈?

4. 荳€閾エ諤ァ隶セ隶?

  • 扈滉ク€逧ФI/UX隗<58>
  • 扈滉ク€<EFBFBD>コ、莠呈ィ。蠑?
  • 扈滉ク€<EFBFBD>憾諤∫ョ。逅?

<EFBFBD>ァュ 鬘カ驛ィ蟇シ闊ェ隶セ隶。

蟇シ闊ェ扈捺桷

笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏?Logo  [AI髣ョ遲脳 [AI譎コ閭ス譁<EFBDBD>鍵] [遏・隸<EFBDA5>コ転 [譎コ閭ス謨ー謐ョ貂<EFBDAE>エ余 [譎コ閭ス扈溯ョ。蛻<EFBDA1>梵] [扈溯ョ。蛻<EFBDA1>梵蟾・蜈キ]  [逕ィ謌キ蜷?笆シ] 笏?
笏披楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?

蟇シ闊ェ鬘ケ隸ヲ諠?

菴咲スョ 荳ュ譁<EFBFBD>錐遘ー 闍ア譁<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 霍ッ逕ア霍ッ蠕<EFBFBD> 蠑€蜿醍憾諤? <EFBFBD>剞隕∵アゑシ亥<EFBFBD>蟋矩<EFBFBD>鄂ョ<EFBFBD><EFBFBD>
1 AI髣ョ遲<EFBFBD> ai-qa /ai-qa 笨?蟾イ蠑€蜿? 蝓コ遑€迚? 笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?
2 AI譎コ閭ス譁<EFBFBD> literature-platform /literature <EFBFBD>圦 蠕<>€蜿? 鬮倡コァ迚? 笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?
3 遏・隸<EFBFBD>コ? knowledge-base /knowledge-base 笨?蟾イ蠑€蜿? 蝓コ遑€迚? 笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?
4 譎コ閭ス謨ー謐ョ貂<EFBFBD><EFBFBD> data-cleaning /data-cleaning <EFBFBD>搭 蜊<><EFBFBD> 鬮倡コァ迚? 笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?
5 譎コ閭ス扈溯ョ。蛻<EFBFBD> statistical-analysis /intelligent-analysis 笨?蟾イ蠑€蜿托シ<E68998>ava蝗「髦滂シ? 譌苓芦迚?笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?
6 扈溯ョ。蛻<EFBFBD>梵蟾・蜈キ statistical-tools /statistical-tools 笨?蟾イ蠑€蜿托シ<E68998>ava蝗「髦滂シ? 譌苓芦迚?笞<><E7AC9E>丞庄隹<E5BA84><E99AB9>?
譛€蜿ウ萓ァ 荳ェ莠コ荳ュ蠢<EFBFBD> user-center /user/* 笨?蟾イ蠑€蜿? 謇€譛臥畑謌?

隸エ譏趣シ?<>剞隕∵アょ<EFBDB1>荳ュ逧?蝓コ遑€迚?"縲?鬮倡コァ迚?"縲?譌苓芦迚?荳?蛻晏ァ矩<EFBFBD>鄂ョ<EFBFBD>悟庄譬ケ謐ョ荳壼苅髴€豎る囂譌カ隹<EFBFBD><EFBFBD>梧裏髴€謾ケ蜉ィ莉」遐<EFBFBD>€サ霎代€よ耳闕蝉サ主錘遶ッAPI蜉ィ諤∬執蜿也沿譛ャ驟咲スョ縲?

霍ッ逕ア霍ッ蠕<EFBFBD>ョセ隶。

// 荳サ霍ッ逕ア扈捺<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>',
};

<EFBFBD><EFBFBD>?謨エ菴捺楔譫<E6A594>ョセ隶。

譫カ譫<EFBFBD>アよャ。蝗?

笏娯楳笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏€笏?
笏?                   蠎皮畑螻?(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>

<EFBFBD>柏 譚<>剞謗ァ蛻カ隶セ隶。

逕ィ謌キ迚域悽螳壻ケ<EFBFBD>

驥崎ヲ∬ッエ譏趣シ? 迚域悽譚<E682BD>剞蛻<E5899E><E89BBB>譏ッ螳悟<E89EB3>?*蜿ッ驟咲スョ縲∝庄隹<E5BA84><EFBFBD>€ゆサ・荳矩<EFBFBD>鄂ョ荳コ蛻晏ァ区婿譯<EFBFBD>*<2A>悟庄莉・譬ケ謐ョ荳壼苅髴€豎る囂譌カ菫ョ謾ケ<E8ACBE>梧裏髴€謾ケ蜉ィ莉」遐<EFBDA3>€サ霎代€?

// 逕ィ謌キ迚域悽邀サ蝙<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>

<EFBFBD>剞謗ァ蛻カ螳樒鴫

*隶セ隶。隸エ譏趣シ?<>剞謗ァ蛻カ驥<EFBDB6>畑驟咲スョ鬩ア蜉ィ逧<EFBDA8>婿蠑擾シ梧髪謖<E9ABAA>€夊ソ<E5A48A><EFBDBF>鄂ョ譁<EFBDAE>サカ謌門錘遶ッAPI蜉ィ諤∬執蜿也沿譛ャ驟咲スョ<EFBDBD>御セソ莠主錘譛溽<E8AD9B>豢サ隹<EFBDBB>紛縲?

// 譚<>剞謗ァ蛻カ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>ッ?
  };
};

迚域悽驟咲スョ蜉ィ諤∬執蜿厄シ域耳闕先婿譯茨シ?

// 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;
};

*莨伜漢<EFBFBD>?

  • 笨?迚域悽驟咲スョ蜿ッ蝨ィ蜷守ォッ螳樊慮隹<E685AE><EFBFBD>梧裏髴€蜑咲ォッ蜿醍沿
  • 笨?謾ッ謖、/B豬玖ッ穂ク榊酔迚域悽驟咲スョ
  • 笨?萓ソ莠手ソ占是莠コ蜻倡<E89CBB>豢サ隹<EFBDBB>紛莠ァ蜩∫ュ也払
  • 笨?蜑咲ォッ譛画悽蝨ー驟咲スョ菴應クコ蜈懷コ墓婿譯茨シ御ソ晁ッ∝庄逕ィ諤?

霍ッ逕ア螳亥梱

// RouteGuard.tsx
export const RouteGuard = ({ moduleId, children }) => {
  const { hasAccess } = usePermission();
  
  if (!hasAccess(moduleId)) {
    return <UpgradePrompt moduleId={moduleId} />;
  }
  
  return children;
};

<EFBFBD>伯 讓。蝮礼峡遶区€ァ隶セ隶?

讓。蝮玲ウィ蜀梧惻蛻カ

// 讓。蝮玲磁蜿」螳壻ケ<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>
];

迢ャ遶矩Κ鄂イ謾ッ謖<EFBFBD>

// 讓。蝮怜刈霓ス蝎?
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} />;
};

驟咲スョ鬩ア蜉ィ逧<EFBFBD>ィ。蝮怜刈霓?

// 邇ッ蠅<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));
};

<EFBFBD>盗 蟶<>€邉サ扈溯ョセ隶。

<EFBFBD>€螻よャ。

MainLayout (荳サ蟶<EFBDBB>€)
笏懌楳笏€ Header (鬘カ驛ィ蟇シ闊ェ)
笏?  笏懌楳笏€ Logo
笏?  笏懌楳笏€ TopNavigation (蟇シ闊ェ鬘?
笏?  笏披楳笏€ UserMenu (逕ィ謌キ闖懷黒)
笏?
笏披楳笏€ MainContent (荳サ蜀<EFBDBB>ョケ蛹コ)
    笏懌楳笏€ SideNavigation (蟾ヲ萓ァ蟇シ闊ェ) - 蜿ッ騾?
    笏披楳笏€ Content (蜀<>ョケ蛹コ蝓<EFBDBA>)
        笏披楳笏€ ModuleLayout (讓。蝮怜ク<E6809C>€)

<EFBFBD>€<EFBFBD>サカ

// 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>
  );
};

<EFBFBD>耳 UI/UX隶セ隶。隗<EFBDA1>

鬘カ驛ィ蟇シ闊ェ譬キ蠑<EFBFBD>

.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>。闖懷黒 + 謚ス螻牙ッシ闊ェ

<EFBFBD>統 螳樊命隶。蛻<EFBDA1>

隨ャ荳€髦カ谿オ<EFBFBD>壽。<EFBFBD>楔謳ュ蟒コ<EFBFBD><EFBFBD>eek 1<>?

  • 蛻帛サコ譁ー蜑咲ォッ鬘ケ逶ョ扈捺<EFBFBD>?
  • 螳樒鴫鬘カ驛ィ蟇シ闊ェ扈<EFBFBD>サカ
  • 螳樒鴫霍ッ逕ア邉サ扈<EFBFBD>
  • 螳樒鴫譚<EFBFBD>剞謗ァ蛻カ蝓コ遑€
  • 螳樒鴫蝓コ遑€<EFBFBD>€邉サ扈<EFBFBD>

隨ャ莠碁亳谿オ<EFBFBD>壽ィ。蝮鈴寔謌撰シ<EFBFBD>eek 2<>?

  • 霑∫ァサAI髣ョ遲疲ィ。蝮<EFBFBD>
  • 霑∫ァサ遏・隸<EFBFBD>コ捺ィ。蝮?
  • 螳樒鴫蜊<EFBFBD>菴肴ィ。蝮暦シ域匱閭ス謨ー謐ョ貂<EFBFBD>エ暦シ<EFBFBD>
  • 螳悟埋譚<EFBFBD>剞謗ァ蛻カ

隨ャ荳蛾亳谿オ<EFBFBD>哂I譎コ閭ス譁<EFBFBD>鍵蠑€蜿托シ<EFBFBD>eek 3+<2B>?

  • €蜿羨I譎コ閭ス譁<EFBFBD>鍵讓。蝮<EFBFBD>
  • 螳樒鴫讓。蝮礼峡遶玖ソ占。梧髪謖<EFBFBD>
  • 螳悟埋譁<EFBFBD>。」蜥梧オ玖ッ?

<EFBFBD>売 譛ェ譚・謇ゥ螻戊€<E6888A>

1. 讓。蝮礼峡遶倶コァ蜩∝<E89CA9>?

  • 謾ッ謖<EFBFBD>€夊ソ<EFBFBD>識蠅<EFBFBD>序驥城<EFBFBD>鄂ョ迢ャ遶玖ソ占。<EFBFBD>
  • 迢ャ遶狗噪API蝨ー蝮€驟咲スョ
  • 迢ャ遶狗噪驛ィ鄂イ驟咲ス?

2. 迚域悽譚<E682BD>剞邂。逅<EFBDA1>

  • 蜷守ォッAPI謠蝉セ帷畑謌キ迚域悽菫。諱ッ
  • 迚域悽驟咲スョ螳悟<EFBFBD>蜿ッ隹<EFBFBD><EFBFBD>域裏髴€謾ケ蜉ィ莉」遐<EFBFBD>シ?
  • 謗ィ闕蝉サ主錘遶ッAPI蜉ィ諤∬執蜿也沿譛ャ驟咲スョ<EFBFBD>梧髪謖∝ョ樊慮隹<EFBFBD>紛讓。蝮怜<EFBFBD><EFBFBD>
  • 蜑咲ォッ譬ケ謐ョ迚域悽蜉ィ諤∵仞遉?髫占酪讓。蝮<EFBDA1>
  • 謾ッ謖∫沿譛ャ蜊<EFBFBD>コァ謠千、コ
  • 迚域悽譚<EFBFBD>剞蛻<EFBFBD><EFBFBD>遲也払蜿ッ髫乗慮譬ケ謐ョ荳壼苅髴€豎りー<EFBFBD><EFBFBD>?

3. 譁ー讓。蝮玲磁蜈?

  • 驕オ蠕ェ讓。蝮玲磁蜿」隗<EFBFBD>
  • 蝨ィ驟咲スョ譁<EFBFBD>サカ荳ュ豕ィ蜀梧ィ。蝮<EFBFBD>
  • 閾ェ蜉ィ髮<EFBFBD><EFBFBD>蛻ー蟇シ闊ェ邉サ扈?

<EFBFBD>答 逶ク蜈ウ譁<EFBDB3>。」


*<EFBFBD>。」迚域悽<EFBFBD>? v1.0
€蜷取峩譁ー<EFBFBD><EFBFBD> 2025-10-29