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%)
166 lines
8.0 KiB
Markdown
166 lines
8.0 KiB
Markdown
# **<2A><><EFBFBD>航挽霈⊥<E99C88>獢<EFBFBD><E78DA2>撌亙<E6928C> C \- 蝘𤑳<E89D98><F0A491B3>唳旿蝻𤥁<E89DBB><F0A4A581>?(The Research Editor)**
|
||
|
||
| <20><>﹝蝐餃<E89D90> | Technical Design Document (TDD) |
|
||
| :---- | :---- |
|
||
| **撖孵<E69296> PRD** | **PRD\_撌亙<E6928C>C\_蝘𤑳<E89D98><F0A491B3>唳旿蝻𤥁<E89DBB><F0A4A581>沔_V2.1.md** |
|
||
| **<EFBFBD><EFBFBD>𧋦** | **V2.1** (<28>啣<EFBFBD> Pivot 蝞埈<E89D9E>銝?Web Worker <20>嗆<EFBFBD>) |
|
||
| **<EFBFBD>嗆<EFBFBD>?* | Final Draft |
|
||
| **<EFBFBD>詨<EFBFBD><EFBFBD>格<EFBFBD>** | <20><>遣銝<E981A3>銝芷<E98A9D><E88AB7>扯<EFBFBD><E689AF>?Web 蝡舀㺭<E88880>桃<EFBFBD>颲穃膥嚗峕𣈲<E5B395>?5 銝<><E98A9D>蝥扳㺭<E689B3>桃<EFBFBD>摰墧𧒄皜<F0A79284><E79A9C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>誩<EFBFBD>撌伐<E6928C><E4BC90>恍鵭摰質蓮<E8B3AA>g<EFBFBD>銝𡡞<E98A9D>餉<EFBFBD>瘝餌<E7989D>嚗峕<E59A97>靘𥕞<E99D98>𣈯妟撱嗉<E692B1><E59789>脲<EFBFBD>雿靝<E99BBF>撉䎚<E69289>?|
|
||
|
||
## **1\. <20>颱<EFBFBD><E9A2B1>嗆<EFBFBD>霈曇恣 (Architecture Overview)**
|
||
|
||
銝箔<EFBFBD>皛∟雲 **PRD V2.1** 銝凌<E98A9D>𨅯朖<F0A885AF>嗅<EFBFBD>擐<EFBFBD><E69390>腈<EFBFBD><E88588><EFBFBD>𨀣伃<F0A880A3><E4BC83><EFBFBD>滚<EFBFBD><E6BB9A>苷誑<E88BB7>𠰴<EFBFBD><F0A0B0B4><EFBFBD><EFBFBD><EFBFBD>𣈯鵭摰質蓮<E8B3AA>T<EFBFBD>嗪<EFBFBD>瘙<EFBFBD><E79899>撌亙<E6928C> C <20><>鍂 **"Local-First" (<28>砍𧑐隡睃<E99AA1>)** <20>嗆<EFBFBD><E59786>?
|
||
<EFBFBD>詨<EFBFBD>蝑𣇉裦嚗?
|
||
1. **<EFBFBD>唳旿撽餌<EFBFBD>嚗?* <20>唳旿<E594B3>㰘蝸<E3B098>𦒘蜓閬<E89C93><E996AC><EFBFBD>典銁瘚讛<E7989A><E8AE9B>函<EFBFBD> **IndexedDB (Dexie.js)** <20>?**<2A><><EFBFBD> (Zustand)** 銝准<E98A9D>?
|
||
2. **霈∠<E99C88>銝𧢲𦆮嚗?* 憭齿<E686AD><E9BDBF><EFBFBD>恣蝞烾<E89D9E>餉<EFBFBD>嚗<EFBFBD><E59A97> Pivot<6F><74><EFBFBD>撘讛圾<E8AE9B>琜<EFBFBD>銝𧢲𦆮<F0A7A2B2>?**Web Worker**嚗屸<E59A97><E5B1B8>漤獈憛?UI 銝餌瑪蝔卝<E89D94>?
|
||
### **1.1 蝟餌<E89D9F><E9A48C>嗆<EFBFBD><E59786>?*
|
||
|
||
graph TD
|
||
subgraph Browser\_Layer \[瘚讛<E7989A><E8AE9B>函垢 (React SPA)\]
|
||
UI\_Shell\[UI 憯喳<E686AF>: <20><>像<EFBFBD>?Toolbar \+ <20>箄<EFBFBD> Sidebar\]
|
||
|
||
subgraph Core\_Engine \[<5B>詨<EFBFBD>撘閙<E69298>\]
|
||
GridComponent\[AG Grid (閫<>㦛撅?\]
|
||
StateManager\[Zustand Store (<28>嗆<EFBFBD><E59786><EFBFBD>)\]
|
||
|
||
subgraph Worker\_Thread \[Web Worker 蝥輻<E89DA5>\]
|
||
ComputeEngine\[霈∠<E99C88>撘閙<E69298> (Math.js / Pivot Alg)\]
|
||
StatEngine\[蝏蠘恣撘閙<E69298> (<28>湔䲮<E6B994>?憸烐活)\]
|
||
end
|
||
|
||
HistoryManager\[Immer Patches (<28>日<EFBFBD><E697A5>?\]
|
||
end
|
||
|
||
subgraph Local\_Storage \[<5B><><EFBFBD><EFBFBD>硋<EFBFBD>\]
|
||
Dexie\[Dexie.js (IndexedDB Wrapper)\]
|
||
end
|
||
end
|
||
|
||
subgraph Server\_Layer \[<5B>滚𦛚蝡?(Node.js)\]
|
||
API\[Fastify API\]
|
||
S3\[撖寡情摮睃<E691AE> (MinIO/OSS)\]
|
||
end
|
||
|
||
User \--1.<2E>滢<EFBFBD>(憒<>ivot)--\> UI\_Shell
|
||
UI\_Shell \--2.<2E>煾<EFBFBD><E785BE><EFBFBD><EFBFBD>?postMessage)--\> Worker\_Thread
|
||
Worker\_Thread \--3.霈∠<E99C88>蝏𤘪<E89D8F>--\> StateManager
|
||
StateManager \--4.<2E>湔鰵閫<E9B0B5>㦛--\> GridComponent
|
||
StateManager \--5.撘<>郊憭<E9838A>遢--\> Dexie
|
||
|
||
User \--6.靽嘥<E99DBD>/撖澆枂--\> API
|
||
|
||
## **2\. <20><><EFBFBD>舫<EFBFBD>匧<EFBFBD> (Tech Stack)**
|
||
|
||
| 撅<>漣 | <20><><EFBFBD>舐<EFBFBD>隞?| <20>匧<EFBFBD><E58CA7><EFBFBD>眏 |
|
||
| :---- | :---- | :---- |
|
||
| **銵冽聢<E586BD>詨<EFBFBD>** | **AG Grid Community** | <20>臭<EFBFBD><E887AD>賢<EFBFBD>韐寞𣈲<E5AF9E><F0A388B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>具<EFBFBD><E585B7><EFBFBD><EFBFBD>𡝗嗻<F0A19D97><E597BB><EFBFBD><EFBFBD>扯<EFBFBD>皜脫<E79A9C><E884AB>?React 銵冽聢摨瓐<E691A8>?|
|
||
| **<EFBFBD>砍𧑐<EFBFBD>唳旿摨?* | **Dexie.js (IndexedDB)** | <20>豢<EFBFBD> localStorage (5MB<4D>𣂼<EFBFBD>)嚗䬠ndexedDB 摰寥<E691B0>憭找<E686AD>撘<EFBFBD>郊嚗屸<E59A97><E5B1B8><EFBFBD>摮睃<E691AE> 5銝? 銵𣬚<E98AB5> JSON <20>唳旿<E594B3><E697BF><EFBFBD>?|
|
||
| **<EFBFBD>嗆<EFBFBD><EFBFBD>恣<EFBFBD>?* | **Zustand \+ Immer** | Zustand 頧駁<E9A0A7>擃䀹<E69383>嚗熘mmer <20>其<EFBFBD>憭<EFBFBD><E686AD>銝滚虾<E6BB9A>䀹㺭<E480B9>桃<EFBFBD><E6A183><EFBFBD><EFBFBD><EFBFBD>?produce <20>?patches <20>蠘<EFBFBD><E8A098>臬<EFBFBD><E887AC>?Undo/Redo <20><>瓲敹<E793B2><E695B9>?|
|
||
| **霈∠<E99C88>撘閙<E69298>** | **Math.js \+ Web Worker** | 閫<><E996AB> JS 瘚桃<E7989A><E6A183>啁移摨阡䔮憸?(0.1+0.2\!=0.3)嚗𢫕eb Worker <20>其<EFBFBD>撠?Pivot 蝑厰<E89D91>霈∠<E99C88>蝘餃枂銝餌瑪蝔卝<E89D94>?|
|
||
| **<EFBFBD>唳旿憭<EFBFBD><EFBFBD>** | **Lodash** | <20>箇<EFBFBD><E7AE87><EFBFBD>㺭<EFBFBD>格<EFBFBD>雿頣<E99BBF><E9A0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>皛扎<E79A9B><E6898E>楛<EFBFBD>瑁<EFBFBD>嚗剹<E59A97>?|
|
||
| **<EFBFBD>航<EFBFBD><EFBFBD>?* | **Ant Design Charts** | <20>冽惣<E586BD>賭儒颲寞<E9A2B2>銝剔<E98A9D><E58994>嗥凒<E597A5>孵㦛 (Histogram) <20>屸<EFBFBD>甈∪㦛 (Bar)<29>?|
|
||
|
||
## **3\. <20>詨<EFBFBD>璅∪<E79285>霂衣<E99C82>霈曇恣**
|
||
|
||
### **3.1 <20>詨<EFBFBD>霈∠<E99C88>撘閙<E69298> (Compute Engine \- Web Worker)**
|
||
|
||
#### **A. <20>踹捐頧祆揢 (Pivot / Reshaping Algorithm) \- V2.1 <20>詨<EFBFBD><E8A9A8>曄<EFBFBD>**
|
||
|
||
餈蹱糓<EFBFBD><EFBFBD>憭齿<EFBFBD><EFBFBD><EFBFBD>恣蝞𦯀遙<EFBFBD>∴<EFBFBD>敹<EFBFBD>◆<EFBFBD>?Web Worker 銝剜<E98A9D>銵䕘<E98AB5><E49598>血<EFBFBD>憿菟𢒰隡𡁜㨃甇颯<E79487>?
|
||
* **颲枏<E9A2B2><E69E8F><EFBFBD>㺭嚗?*
|
||
* data: <20>笔<EFBFBD>撖寡情<E5AFA1>啁<EFBFBD> Row\[\]
|
||
* indexCol: 銝駁睸<E9A781>堒<EFBFBD> (e.g., 'patient\_id') \- 蝖桀<E89D96><E6A180>𡏭<EFBFBD><F0A18FAD>?
|
||
* pivotKeyCol: <20>箏<EFBFBD><E7AE8F>堒<EFBFBD> (e.g., 'visit\_date') \- 蝖桀<E89D96><E6A180>𨅯<EFBFBD><F0A885AF>𡒊<EFBFBD><F0A1928A>?
|
||
* valueCols: <20>澆<EFBFBD><E6BE86>齿㺭蝏?(e.g., \['wbc', 'bmi'\]) \- 蝖桀<E89D96><E6A180>𨅯‵<F0A885AF><E280B5><EFBFBD>潑<EFBFBD>?
|
||
* **蝞埈<E89D9E><E59F88>餉<EFBFBD>嚗?*
|
||
1. **憸<><E686B8><EFBFBD>?(Guard):** 霈∠<E99C88> Unique(pivotKeyCol).length \* valueCols.length<74><68><EFBFBD><EFBFBD>𦦵<EFBFBD><F0A6A6B5>鞟<EFBFBD>瞏𨅯銁<F0A885AF>埈㺭 \> 1000嚗峕<E59A97><E5B395>粹<EFBFBD>霂胼<E99C82>𦦵<EFBFBD><F0A6A6B5>鞟<EFBFBD><E99E9F>埈㺭餈<E3BAAD><E9A488>嚗諹窈<E8ABB9><E7AA88><EFBFBD><EFBFBD>㗇㺭<E39787>栽<EFBFBD>腈<EFBFBD>?
|
||
2. **<EFBFBD><EFBFBD><EFBFBD> (Grouping):** 雿輻鍂 \_.groupBy(data, indexCol) <20>劐蜓<E58A90>桀<EFBFBD>蝏<EFBFBD><E89D8F>?
|
||
3. **頧祆揢 (Transformation):** <20>滚<EFBFBD>瘥讐<E798A5><E8AE90>唳旿嚗?
|
||
* <20>𥕦遣銝<E981A3>銝芣鰵銵<E9B0B5>笆鞊∴<E99E8A>靽萘<E99DBD>銝駁睸<E9A781>?
|
||
* <20>滚<EFBFBD>霂亦<E99C82><E4BAA6><EFBFBD><EFBFBD>銝<EFBFBD><E98A9D>∟扇敶𤏪<E695B6><F0A48FAA>瑕<EFBFBD> pivotKeyCol <20><><EFBFBD>潘<EFBFBD>靘见<E99D98> "2023-01-01"嚗剹<E59A97>?
|
||
* <20>滚<EFBFBD> valueCols嚗<73><E59A97><EFBFBD>潭<EFBFBD>撠<EFBFBD>蛹 ValueCol\_PivotKey (靘见<E99D98> "wbc\_2023-01-01")<29>?
|
||
4. **Schema<6D><61><EFBFBD>:** <20>冽<EFBFBD><E586BD><EFBFBD><EFBFBD>鞉鰵<E99E89>?ColumnDefs<66>?
|
||
* **颲枏枂嚗?* { newRows, newColumnDefs }
|
||
|
||
#### **B. <20>砍<EFBFBD><E7A08D>㗛<EFBFBD> (Formula)**
|
||
|
||
* 雿輻鍂 math.evaluate(formula, row)<29>?
|
||
* **摰匧<E691B0>瘝嗵拳嚗?* <20>𣂼<EFBFBD><F0A382BC>砍<EFBFBD>銝剖虾霈輸䔮<E8BCB8><E494AE><EFBFBD><EFBFBD>譍<EFBFBD>銝箏<E98A9D><E7AE8F>滩<EFBFBD><E6BBA9><EFBFBD>㺭<EFBFBD>殷<EFBFBD><E6AEB7>脫迫 XSS<53>?
|
||
* **撘<>虜憭<E8999C><E686AD>嚗?* 憭<><E686AD><EFBFBD>支誑<E694AF>?(Infinity) <20>屸<EFBFBD><E5B1B8>啣<EFBFBD>霈∠<E99C88> (NaN) <20><><EFBFBD><EFBFBD>蛛<EFBFBD>蝏煺<E89D8F>餈𥪜<E9A488> null <20>㚚<EFBFBD>霂舀<E99C82>霈啜<E99C88>?
|
||
### **3.2 <20>箄<EFBFBD>靘扯器<E689AF>誩<EFBFBD><E8AAA9>?(Insight Engine)**
|
||
|
||
* **閫血<E996AB>:** <20>穃𨯬 AG Grid <20>?onColumnHeaderClicked 鈭衤辣<E8A1A4>?
|
||
* **<2A>餅<EFBFBD> (Debounce):** 200ms 撱嗉<E692B1>霈∠<E99C88>嚗屸俈甇W翰<EFBCB7>笔<EFBFBD><E7AC94>W<EFBFBD><EFBCB7>?UI <20>芰<EFBFBD><E88AB0>?
|
||
* **蝏蠘恣<E8A098>餉<EFBFBD>:**
|
||
* **<2A>啣<EFBFBD>澆<EFBFBD>:** 霈∠<E99C88> Min, Max, Mean, SD嚗<44>僎雿輻鍂 Freedman-Diaconis 閫<><E996AB>霈∠<E99C88><E288A0>湔䲮<E6B994>曄<EFBFBD> Bins<6E>?
|
||
* **<2A><>𧋦<EFBFBD>?** 霈∠<E99C88> Top 10 憸𤑳<E686B8><F0A491B3><EFBFBD>擃条<E69383>霂溻<E99C82>?
|
||
### **3.3 <20><>蟮霈啣<E99C88>銝擧伃<E693A7><E4BC83> (History Manager)**
|
||
|
||
* **Undo/Redo 蝑𣇉裦:**
|
||
* **<2A>桅<EFBFBD>𡁏<EFBFBD>雿?(蝻𤥁<E89DBB>/<2F>踵揢):** 霈啣<E99C88> patches (Immer)<29>?
|
||
* **蝏𤘪<E89D8F><F0A498AA>扳<EFBFBD>雿?(Pivot/<2F><><EFBFBD>/<2F><><EFBFBD><EFBFBD>啣<EFBFBD><E595A3>?:** <20>曹<EFBFBD>銵函<E98AB5><E587BD><EFBFBD><EFBFBD><EFBFBD>冽㺿<E586BD>矋<EFBFBD>霈啣<E99C88> patches <20>鞉𧋦餈<F0A78BA6><E9A488>銝娪𠗕隞亙<E99A9E>皛𠾼<E79A9B><F0A0BEBC><EFBFBD><EFBFBD>交㺿銝綽<E98A9D>**<2A>冽<EFBFBD>銵峕迨蝐餅<E89D90>雿𨅯<E99BBF>嚗<EFBFBD>撩<EFBFBD>嗡<EFBFBD>摮䀝<E691AE>銝芸<E98A9D><E88AB8>誩翰<E8AAA9>?(Checkpoint)**<2A><>伃<EFBFBD><E4BC83><EFBFBD>嗥凒<E597A5>仿<EFBFBD>頧賢翰<E8B3A2>扼<EFBFBD>?
|
||
## **4\. <20>唳旿瘚<E697BF><E7989A>摮睃<E691AE>霈曇恣**
|
||
|
||
### **4.1 瘚讛<E7989A><E8AE9B>函垢摮睃<E691AE> (Dexie Schema)**
|
||
|
||
<EFBFBD>其<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>冽<EFBFBD>甇<EFBFBD>銁蝻𤥁<EFBFBD><EFBFBD><EFBFBD>㺭<EFBFBD>殷<EFBFBD>摰䂿緵<EFBFBD>𡏭䌊<EFBFBD>典翰<EFBFBD>把<EFBFBD>嘥<EFBFBD><EFBFBD>𨅯援皞<EFBFBD><EFBFBD>憭𨧀<EFBFBD>腈<EFBFBD>?
|
||
const db \= new Dexie('ResearchEditorDB');
|
||
db.version(2).stores({
|
||
// 憿寧𤌍<E5AFA7><F0A48C8D>㺭<EFBFBD>?
|
||
projects: '++id, name, lastModified, rowCount',
|
||
|
||
// <20>唳旿<E594B3>?(Chunks): 撠?5銝<35><E98A9D><EFBFBD>唳旿<E594B3><E697BF><EFBFBD>銝箏<E98A9D>銝?Chunk 摮睃<E691AE>嚗屸<E59A97><E5B1B8>滚<EFBFBD>甈∟粉<E2889F>躰<EFBFBD>憭批紡<E689B9>湔<EFBFBD>閫<EFBFBD>膥撏拇<E6928F>
|
||
dataChunks: '\[projectId+chunkIndex\], projectId',
|
||
|
||
// <20>滢<EFBFBD><E6BBA2><EFBFBD>蟮 (<28>其<EFBFBD><E585B6>W<EFBFBD><EFBCB7>啣㦤)
|
||
history: 'projectId, stack',
|
||
|
||
// 摰峕㟲敹怎<E695B9> (<28>其<EFBFBD> Pivot 蝑匧之<E58CA7>滢<EFBFBD><E6BBA2><EFBFBD><EFBFBD>皛?
|
||
checkpoints: '++id, projectId, createdAt'
|
||
});
|
||
|
||
### **4.2 <20>𡒊垢摮睃<E691AE> (PostgreSQL \+ OSS)**
|
||
|
||
<EFBFBD>𡒊垢隞<EFBFBD><EFBFBD>韐<EFBFBD><EFBFBD><EFBFBD>兩<EFBFBD>𨅯歇靽嘥<EFBFBD><EFBFBD>萘<EFBFBD>敹怎<EFBFBD>嚗䔶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰墧𧒄蝻𤥁<EFBFBD><EFBFBD>?
|
||
model DatasetSnapshot {
|
||
id String @id @default(uuid())
|
||
taskId String // <20>唾<EFBFBD>隞餃𦛚
|
||
version Int // <20><>𧋦<EFBFBD>?
|
||
|
||
// 摮睃<E691AE>銝箏之<E7AE8F>?JSON Blob嚗峕<E59A97><E5B395><EFBFBD><EFBFBD><EFBFBD>?OSS <20><>辣頝臬<E9A09D> (<28>刻<EFBFBD> OSS)
|
||
// <20><>捆<EFBFBD><E68D86>鉄嚗鬏ows\[\], columnDefs\[\], metadata
|
||
ossKey String
|
||
|
||
createdAt DateTime @default(now())
|
||
}
|
||
|
||
## **5\. API <20>亙藁摰帋<E691B0>**
|
||
|
||
* POST /api/editor/init: <20>嘥<EFBFBD><E598A5>𣇉<EFBFBD>颲穃膥隡朞<E99AA1>嚗䔶<E59A97> OSS <20>㰘蝸<E3B098>笔<EFBFBD><E7AC94><EFBFBD>辣嚗<E8BEA3><E59A97><EFBFBD>𨀣糓隞𤾸極<F0A4BEB8>?A/B 瘚<>蓮餈<E893AE>䔉<EFBFBD><E49489><EFBFBD><EFBFBD>?
|
||
* POST /api/editor/save: 靽嘥<E99DBD>敶枏<E695B6>敹怎<E695B9><E6808E>?
|
||
* POST /api/editor/export: 霂瑟<E99C82><E7919F>𡒊垢<F0A1928A><E59EA2><EFBFBD> Excel/SPSS <20><>辣<EFBFBD>?
|
||
* *Payload:* { rows: \[...\], format: 'spss' }
|
||
* *霂湔<E99C82>:* 憒<><E68692><EFBFBD>唳旿<E594B3>誩<EFBFBD>嚗𣬚凒<F0A3AC9A>亙<EFBFBD>蝡?SheetJS <20><><EFBFBD>嚗𥟇㺭<F0A59F87>桅<EFBFBD>憭?(\>5MB) <20>𤑳<EFBFBD><F0A491B3>𡒊垢<F0A1928A><E59EA2><EFBFBD><EFBFBD>?
|
||
## **6\. <20>扯<EFBFBD><E689AF><EFBFBD><EFBFBD>銝舘器<E88898>?(Performance Guardrails)**
|
||
|
||
| <20>唳旿<E594B3>讐漣 | 蝑𣇉裦 |
|
||
| :---- | :---- |
|
||
| **\< 50,000 銵?* | **<EFBFBD>券<EFBFBD><EFBFBD>㰘蝸璅∪<EFBFBD>**<2A><><EFBFBD><EFBFBD>㗇㺭<E39787>桅<EFBFBD><E6A185>典<EFBFBD>摮?IndexedDB嚗峕<E59A97>雿𨀣<E99BBF>敹怒<E695B9>?|
|
||
| **\> 50,000 銵?* | **<EFBFBD>漤<EFBFBD><EFBFBD>瑟芋撘?(Downsampling)**<2A><><EFBFBD>蝡臭<E89DA1><E887AD>㰘蝸<E3B098>?5 銝<><E98A9D><EFBFBD>其<EFBFBD>憸<EFBFBD><E686B8><EFBFBD>諹<EFBFBD><E8ABB9>坔<EFBFBD>摰𠾼<E691B0><F0A0BEBC>紡<EFBFBD>箸𧒄嚗<F0A79284><E59A97>皜<EFBFBD><E79A9C>閫<EFBFBD><E996AB>嚗㇌ecipe嚗匧<E59A97><E58CA7><EFBFBD><EFBFBD><EFBFBD>𡒊垢嚗𣬚眏<F0A3AC9A>𡒊垢 Worker 撖孵<E69296><E5ADB5>𤩺㺭<F0A4A9BA>株<EFBFBD>銵峕鸌憭<E9B88C><E686AD><EFBFBD>?|
|
||
|
||
## **7\. 撘<><E69298>𤏸恣<F0A48FB8>?(Milestones)**
|
||
|
||
1. **Week 1: <20>詨<EFBFBD>蝵烐聢銝𤾸<E98A9D><F0A4BEB8>?*
|
||
* <20>剖遣 React \+ AG Grid <20>臬<EFBFBD><E887AC>?
|
||
* 摰䂿緵 SheetJS 撖澆<E69296>銝?Dexie.js <20><><EFBFBD><EFBFBD>㚚<EFBFBD>餉<EFBFBD><E9A489>?
|
||
2. **Week 2: <20><>像<EFBFBD>硋極<E7A18B>瑟<EFBFBD>銝?Web Worker**
|
||
* <20>剖遣 Web Worker <20>帋縑<E5B88B>嗆<EFBFBD><E59786>?
|
||
* 摰䂿緵 Formula 霈∠<E99C88><E288A0>?Math.js <20><><EFBFBD><EFBFBD>?
|
||
* 摰䂿緵 Undo/Redo <20><><EFBFBD>Immer嚗剹<E59A97>?
|
||
3. **Week 3: 憭齿<E686AD>霈∠<E99C88> (Pivot)**
|
||
* **<2A>滨<EFBFBD><E6BBA8>餃<EFBFBD>嚗?* <20>?Web Worker 銝剖<E98A9D><E58996>?Pivot 蝞埈<E89D9E><E59F88>?
|
||
* 摰䂿緵 Pivot <20>?UI <20>滨蔭撘寧<E69298><E5AFA7>?
|
||
4. **Week 4: <20>箄<EFBFBD>靘扯器<E689AF>譍<EFBFBD>撖澆枂**
|
||
* 撘<><E69298>𤑳凒<F0A491B3>孵㦛/憸烐活<E78390>曄<EFBFBD>隞?(AntD Charts)<29>?
|
||
* 摰䂿緵<E482BF><E7B7B5>拳<EFBFBD><E68BB3><EFBFBD>撠<EFBFBD><E692A0><EFBFBD>‵銵亦撩憭勗<E686AD>潮<EFBFBD>餉<EFBFBD><E9A489>?
|
||
* 撖寞𦻖<E5AF9E>𡒊垢靽嘥<E99DBD><E598A5>亙藁<E4BA99> |