feat(admin): Add user management and upgrade to module permission system

Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,17 +1,18 @@
# **€譛ッ隶セ隶。譁<EFBFBD>。」<EFBFBD>壼キ・蜈キ C \- 遘醍<E98198>疲焚謐ョ郛冶セ大<EFBDBE>?(V7 莠醍ォッ豐咏ョア謚鈴」朱勦迚<E58BA6>)**
# **技术设计文档:工具 C \- 科研数据编辑器 (V7 云端沙箱抗风险版)**
| 文档类型 | Technical Design Document (TDD) |
| :---- | :---- |
| **蟇ケ蠎泌次蝙<EFBFBD>** | **蟾・蜈キC\_遘醍<E98198>疲焚謐ョ郛冶セ大勣\_蜴溷梛隶セ隶。\_V6\_菫ョ螟咲<E89E9F>?html** |
| **迚域悽** | **V7.1** (螳梧紛謾カ蠖墓楔譫<EFBFBD><EFBFBD><EFBFBD> ADR 荳守コ「髦滄」朱勦蟇ケ遲? |
| **迥カ諤?* | Final Standard |
| **譬ク蠢<EFBFBD>岼譬<EFBFBD>** | <EFBFBD>サコ荳€荳ェ鬮伜庄髱<EFBFBD><EFBFBD>コ醍ォ?Python 謨ー謐ョ貂<EFBDAE>エ怜ケウ蜿ー縲ょ惠菫晞囿窶懈焚謐ョ荳榊<E88DB3>蝓溪€晉噪蜑肴署荳具シ碁€夊ソ<E5A48A> Apache Arrow 蜥梧<E89CA5>キ蠑丞<E8A091>遖サ謚€譛ッ<E8AD9B>瑚ァ」蜀ウ譛榊苅遶ッ謇ァ陦悟クヲ譚・逧<EFBDA5>サカ霑滉ク取<EFBDB8>シ蠑丈ク「螟ア髣ョ鬚倥€?|
| **对应原型** | **工具C\_科研数据编辑器\_原型设计\_V6\_修复版.html** |
| **版本** | **V7.1** (完整收录架构决策 ADR 与红队风险对策) |
| **状态** | Final Standard |
| **核心目标** | 构建一个高可靠的云端 Python 数据清洗平台。在保障“数据不出域”的前提下,通过 Apache Arrow 和样式分离技术,解决服务端执行带来的延迟与格式丢失问题。 |
## **1\. 总体架构设计 (System Architecture)**
驩エ莠取枚莉カ螟ァ蟆城剞蛻カ (\<20MB) 蜥瑚┳謨丞燕謠撰シ碁㊦逕ィ 窶廸ode.js BFF \+ Python Microservice窶?譫カ譫<EFBDB6>€?
V7 譬ク蠢<EFBFBD>合郤ァ<EFBFBD>?蠑募<E8A091> Apache Arrow 菴應クコ蜑榊錘遶ッ謨ー謐ョ莠、謐「譬<EFBFBD><EFBFBD>梧崛莉」菴取譜逧?Excel 譁<>サカ蜿榊、崎ッサ蜀呻シ悟ー<E6829F>黒谺。莠、莠貞サカ霑滉サ?8s 髯堺ス手<EFBDBD>?0.5s縲?
### **1.1 譫カ譫<EFBDB6>挙謇大<E8AC87>?(V7 莨伜喧迚?**
鉴于文件大小限制 (\<20MB) 和脱敏前提,采用 “Node.js BFF \+ Python Microservice” 架构。
V7 核心升级: 引入 Apache Arrow 作为前后端数据交换标准,替代低效的 Excel 文件反复读写,将单次交互延迟从 8s 降低至 0.5s
### **1.1 架构拓扑图 (V7 优化版)**
graph TD
subgraph Client\_Layer \[用户端\]
@@ -19,13 +20,13 @@ graph TD
ArrowClient\[Apache Arrow JS\]
end
subgraph Aliyun\_SAE \[髦ソ驥御コ?Serverless 蠎皮畑蠑墓梼\]
subgraph Aliyun\_SAE \[阿里云 Serverless 应用引擎\]
BFF\[Node.js Web 服务 (Fastify)\]
PythonService\[Python 隶。邂怜セョ譛榊<EFBFBD>?(FastAPI)\]
PythonService\[Python 计算微服务 (FastAPI)\]
end
subgraph Cache\_Layer \[高速缓存层\]
Redis\_Session\[Redis (蟄?DataFrame Arrow 蠎丞<EFBFBD>蛹?\]
Redis\_Session\[Redis (DataFrame Arrow 序列化)\]
end
subgraph AI\_PaaS \[AI 能力层\]
@@ -34,15 +35,15 @@ graph TD
end
subgraph Cloud\_Infra \[持久化层\]
OSS\[蟇ケ雎。蟄伜お (蟄?Excel 蠎墓攸)\]
OSS\[对象存储 (存 Excel 底板)\]
RDS\[RDS PostgreSQL (存元数据)\]
end
%% 莠、莠呈オ?
%% 交互流
User\[用户\] \--\>|1. 上传| BFF
BFF \--\>|2. 存原始Excel| OSS
BFF \--\>|3. 预热 Session| PythonService
PythonService \--\>|4. <EFBFBD>霓ス蟷カ霓ャ荳?Arrow| Redis\_Session
PythonService \--\>|4. 加载并转为 Arrow| Redis\_Session
User \--\>|5. AI 指令| Dify
Dify \--\>|6. Python 代码| BFF
@@ -60,69 +61,77 @@ graph TD
## **2\. 关键架构决策记录 (ADR)**
譛ャ闃りョー蠖穂コ<EFBFBD>クコ菴穂サ寂€懷燕遶?Pyodide窶晁スャ蜷鯛€懷錘遶ッ豐咏ョア窶晉噪蜀ウ遲冶ソ<E586B6>ィ具シ御セ帛屬髦溷盾閠<E79BBE>€?
本节记录了为何从“前端 Pyodide”转向“后端沙箱”的决策过程供团队参考。
### **决策点:前端运行 (WASM) vs 后端运行 (Server-side)**
| 扈エ蠎ヲ | 譁ケ譯<EFBDB9> A<>壼燕遶?Pyodide (WASM) | 譁ケ譯<EFBDB9> B<>壼錘遶?Python (譛ャ譁ケ譯? | 蜀ウ遲也サ楢ョコ |
| 维度 | 方案 A前端 Pyodide (WASM) | 方案 B后端 Python (本方案) | 决策结论 |
| :---- | :---- | :---- | :---- |
| **蜷ッ蜉ィ蟒カ霑<EFBFBD>** | **譫∵<EFBFBD> (15s+)**縲る怙荳玖スス \~20MB 蠑墓梼蛹<E6A2BC>シ檎畑謌キ菴馴ェ梧栫蟾ョ縲?| **遘貞シ€**縲ら識蠅<E8AD98>惠譛榊苅蝎ィ鬚<EFBDA8>Ο<EFBFBD>悟叉蠑€蜊ウ逕ィ縲?| **蜷守ォッ閭?* |
| **莠、莠貞サカ霑<EFBFBD>** | **譫∝ソォ (\< 0.1s)**縲よ悽蝨ー蜀<EFBDB0>ュ俶桃菴懶シ梧裏鄂醍サ懷シ€€縲?| **荳ュ遲<EFBFBD> (0.5s)**縲る€夊ソ<E5A48A> Apache Arrow 莨伜喧蜷主庄謗・蜿励€?| 蜑咲ォッ閭?|
| **遞ウ螳壽€?* | **鬮倬」朱<EFBFBD>?*縲よオ剰ァ亥勣 Tab 蜀<>ュ俶怏髯撰シ梧<EFBDBC> OOM 蟠ゥ貅<EFBDA9>€?| **鬮倡ィウ螳?*縲よ恪蜉。蝎ィ蜀<EFBDA8>ュ伜<EFBDAD>雜ウ<E99B9C>悟ョケ蝎ィ髫皮ヲサ<EFBDA6>悟エゥ貅<EFBDA9>ク榊スア蜩榊燕遶ッ縲?| **蜷守ォッ閭?* |
| **蠎捺髪謖?* | **譛蛾剞**縲ゆク肴髪謖<E9ABAA>Κ<CE9A> C 謇ゥ螻募コ?(螯ょ、肴揩扈溯ョ。蠎<EFBDA1>)縲?| **<EFBFBD><EFBFBD>**縲よ<E7B8B2><E38288><EFBFBD>?Linux 邇ッ蠅<EFBDAF>シ檎函諤∝ョ梧紛縲?| **蜷守ォッ閭?* |
| **蠑€蜿鷹埓蠎?* | **<EFBFBD><EFBFBD>**縲る怙螟<E68099>炊 JS-Python 騾壻ソ。縲∝<E7B8B2>蟄倡ョ。逅<EFBDA1>€?| **菴?*縲よ<E7B8B2><E38288><EFBFBD>?Web API 蠑€蜿代€?| **蜷守ォッ閭?* |
| **启动延迟** | **极慢 (15s+)**。需下载 \~20MB 引擎包,用户体验极差。 | **秒开**。环境在服务器预热,即开即用。 | **后端胜** |
| **交互延迟** | **极快 (\< 0.1s)**。本地内存操作,无网络开销。 | **中等 (0.5s)**。通过 Apache Arrow 优化后可接受。 | 前端胜 |
| **稳定性** | **高风险**。浏览器 Tab 内存有限,易 OOM 崩溃。 | **高稳定**。服务器内存充足,容器隔离,崩溃不影响前端。 | **后端胜** |
| **库支持** | **有限**。不支持部分 C 扩展库 (如复杂统计库)。 | **无限**。标准 Linux 环境,生态完整。 | **后端胜** |
| **开发难度** | **极高**。需处理 JS-Python 通信、内存管理。 | ****。标准 Web API 开发。 | **后端胜** |
**扈楢ョコ<EFBFBD>?* 驩エ莠寂€懈焚謐ョ蟾イ閼ア謨鞘€昜ク披€懈枚莉カ霎<EFBDB6>ー鞘€晢シ<E699A2>**蜷守ォッ謇ァ陦梧婿譯<E5A9BF>** 蝨ィ遞ウ螳壽€ァ縲∝<E7B8B2>螳ケ諤ァ蜥悟シ€蜿第<E89CBF>譛ャ荳雁<E88DB3>髱「閭懷<E996AD>縲?
## **3\. 謚€譛ッ騾牙梛荳手檮蜷?(Tech Stack Fusion)**
**结论:** 鉴于“数据已脱敏”且“文件较小”,**后端执行方案** 在稳定性、兼容性和开发成本上全面胜出。
## **3\. 技术选型与融合 (Tech Stack Fusion)**
### **3.1 核心组件更新**
| 领域 | 选型 | V7 新增理由 |
| :---- | :---- | :---- |
| **謨ー謐ョ莠、謐「** | **Apache Arrow** | **蜈ウ髞ョ蜊<EFBFBD>コァ**縲ら畑莠?Python 蜥?Node.js/蜑咲ォッ荵矩龍逧<EFBFBD>ォ俶€ァ閭ス謨ー謐ョ莨<EFBFBD>霎難シ碁∩蜈?JSON 蠎丞<E8A08E>蛹門シ€€<E9AB9E>?*隗」蜀ウ IO 蟒カ霑滓<E99C91>ク蠢<EFBDB8>**縲?|
| **Excel <EFBFBD>** | **openpyxl** | 譖ソ莉」郤?Pandas縲ら畑莠主惠蟇シ蜃コ譌?*菫晉蕗蜴溷ァ<E6BAB7> Excel 譬キ蠑<EFBDB7>**<2A>亥ヲる「懆牡縲∬セケ譯<EFBDB9>シ会シ?*隗」蜀ウ譬シ蠑丈ク「螟ア譬ク蠢<EFBDB8>**縲?|
| **莨夊ッ晉シ灘ュ<EFBFBD>** | **Redis** | 逕ィ莠取嘯蟄倡畑謌キ逧?DataFrame (蠎丞<EFBFBD>蛹紋クコ Parquet/Arrow)<EFBFBD>碁∩蜈肴ッ乗ャ。謫堺ス憺<EFBFBD>蜴?OSS 隸サ譁<EFBDBB>サカ縲?|
| **隶。邂玲恪蜉。** | **FastAPI \+ Celery** | 蠑募<EFBFBD> Celery <EFBFBD>炊蠑よュ・莉サ蜉。<EFBFBD>碁亟豁「髟ソ隶。邂鈴仆蝪<EFBFBD> HTTP 郤ソ遞九€?|
| **数据交换** | **Apache Arrow** | **关键升级**。用于 Python Node.js/前端之间的高性能数据传输,避免 JSON 序列化开销,**解决 IO 延迟核心**。 |
| **Excel 处理** | **openpyxl** | 替代纯 Pandas。用于在导出时**保留原始 Excel 样式**(如颜色、边框),**解决格式丢失核心**。 |
| **会话缓存** | **Redis** | 用于暂存用户的 DataFrame (序列化为 Parquet/Arrow),避免每次操作都去 OSS 读文件。 |
| **计算服务** | **FastAPI \+ Celery** | 引入 Celery 处理异步任务,防止长计算阻塞 HTTP 线程。 |
## **4\. <EFBFBD>髄鬟朱勦隸<EFBFBD>シー荳主ッケ遲?(Red Teaming Analysis)**
## **4\. 逆向风险评估与对策 (Red Teaming Analysis)**
譛ャ闃りッヲ扈<EFBFBD>ョー蠖穂コ<EFBFBD>€懃コ「髦滓オ玖ッ補€昜クュ蜿醍鴫逧<EFBFBD>ス懷惠閾エ蜻ス鬟朱勦蜿雁<EFBFBD>蟾・遞句喧隗」蜀ウ譁ケ譯医€?
### **鬟朱勦荳€<E88DB3>壻コ、莠貞サカ霑溽噪窶應ス捺─蟠ゥ蝪娯€?*
本节详细记录了“红队测试”中发现的潜在致命风险及其工程化解决方案。
### **风险一:交互延迟的“体感崩塌”**
* **逆向拷问:** 每次 AI 操作都走 OSS 下载 \-\> Pandas 读取 \-\> 计算 \-\> 上传,单次耗时可能超过 8秒用户无法忍受。
* **V7 解决方案:** **Session 驻留模式 (Memory-Resident)**
1. **初始化:** 用户上传 Excel 后,后端将其加载为 DataFrame并序列化为 **Arrow** 格式存入 Redis (TTL 30min)。
2. **增量交互:** 前端发送指令Python 从 Redis 读取 Arrow 数据(毫秒级),执行 Pandas 计算,将结果写回 Redis。
3. **轻量反馈:** 计算完成后,只返回 **前 100 行预览数据** 给前端 AG Grid 渲染。
4. **效果:** 耗时缩短至 **0.5s \- 1s**
* **騾<>髄諡キ髣ョ<E9ABA3>?* 豈乗ャ。 AI 謫堺ス憺<EFBDBD>襍ー OSS 荳玖スス \-\> Pandas 隸サ蜿<EFBDBB> \-\> 隶。邂<EFBDA1> \-\> 荳贋シ<E8B48B><EFBDBC>悟黒谺。閠玲慮蜿ッ閭ス雜<EFBDBD>ソ<EFBFBD> 8遘抵シ檎畑謌キ譌<EFBDB7>豕募ソ榊女縲?
* **V7 隗」蜀ウ譁ケ譯茨シ?* **Session 鬩サ逡呎ィ。蠑<EFBDA1> (Memory-Resident)**
1. **蛻晏ァ句喧<E58FA5><E596A7>** 逕ィ謌キ荳贋シ<E8B48B> Excel 蜷趣シ悟錘遶ッ蟆<EFBDAF><E89F86><EFBFBD>霓ス荳?DataFrame<6D>悟ケカ蠎丞<E8A08E>蛹紋クコ **Arrow** 譬シ蠑丞ュ伜<EFBDAD> Redis (TTL 30min)縲?
2. **蠅樣㍼莠、莠抵シ?* 蜑咲ォッ蜿鷹€∵欠莉、<E88E89>訓ython 莉?Redis 隸サ蜿<EFBDBB> Arrow 謨ー謐ョ<E8AC90>域ッォ遘堤コァ<EFBDBA>会シ梧鴬陦<E9B4AC> Pandas 隶。邂暦シ悟ー<E6829F>サ捺棡蜀吝屓 Redis縲?
3. **霓サ驥丞渚鬥茨シ?* 隶。邂怜ョ梧<EFBDAE>蜷趣シ悟宵霑泌<E99C91>?**蜑?100 陦碁「<E7A281>ァ域焚謐?* 扈吝燕遶?AG Grid 貂イ譟薙€?
4. **謨域棡<E59F9F>?* 閠玲慮郛ゥ遏ュ閾?**0.5s \- 1s**縲?
### **风险二Excel 格式丢失 (The Format Loss)**
* **<EFBFBD>髄諡キ髣ョ<EFBFBD>?* Pandas 逧?to\_excel 莨夐㍾鄂ョ謇€譛牙黒蜈<EFBFBD><EFBFBD>シ譬キ蠑擾シ悟現逕滓<EFBFBD><EFBFBD>ウィ逧<EFBFBD>「懆牡蜥梧音豕ィ莨壻ク「螟ア縲?
* **V7 隗」蜀ウ譁ケ譯茨シ?* **蠎墓攸蛻<E694B8>ヲサ遲也払 (Template Separation)**
1. **荳贋シ<EFBFBD>譌カ<EFBFBD><EFBFBD>** <EFBFBD>次蟋?Excel <EFBFBD>ョー荳?**"Style Template" (譬キ蠑丞コ墓攸)**<2A>梧ーク荵<EFBDB8>ソ晏ュ伜惠 OSS縲?
2. **隶。邂玲慮<EFBFBD><EFBFBD>** 蜿ェ蝨ィ蜀<EFBDA8><EFBFBD>/Redis 荳ュ螟<EFBDAD>炊郤ッ謨ー謐ョ (Values)<29>御ク榊<EFBDB8><EFBFBD><E8A0A2>キ蠑上€?
3. **蟇シ蜃コ譌カ<EFBFBD><EFBFBD>** 菴ソ逕ィ openpyxl <EFBFBD>霓ス窶懈<EFBFBD>キ蠑丞コ墓攸窶晢シ悟ー<EFBFBD><EFBFBD>蟄倅クュ逧<EFBFBD>眠謨ー謐ョ**蝪ォ蜈・**蛻ー蠎墓攸逧<E694B8>ッケ蠎泌攝譬<E6949D>クュ<EFBDB8>御ソ晉蕗譛ェ菫ョ謾ケ蛹コ蝓溽噪閭梧勹濶イ蜥梧音豕ィ縲?
### **鬟朱勦荳会シ夂憾諤∝酔豁・逧<EFBDA5>€懷曙蜀吝<E89C80>遯≫€?*
* **逆向拷问:** Pandas to\_excel 会重置所有单元格样式,医生标注的颜色和批注会丢失。
* **V7 解决方案:** **底板分离策略 (Template Separation)**
1. **上传时:** 将原始 Excel 标记为 **"Style Template" (样式底板)**,永久保存在 OSS
2. **计算时:** 只在内存/Redis 中处理纯数据 (Values),不关心样式。
3. **导出时:** 使用 openpyxl 加载“样式底板”,将内存中的新数据**填入**到底板的对应坐标中,保留未修改区域的背景色和批注。
* **騾<>髄諡キ髣ョ<E9ABA3>?* 逕ィ謌キ謇句勘菫ョ謾ケ莠<EFBDB9>ャャ 5 陦鯉シ悟酔譌カ AI 蛻<>髯、莠<EFBDA4>ャャ 5 陦鯉シ悟ッシ閾エ謨ー謐ョ迥カ諤∽ク堺ク€閾エ縲?
* **V7 隗」蜀ウ譁ケ譯茨シ?* **UI 莠呈箕髞?(UI Locking)**
* 蠖?AI 豁」蝨ィ逕滓<E98095>莉」遐∵<E98190>蜷守ォッ豁」蝨ィ隶。邂玲慮<E78EB2>窟G Grid 蠑コ蛻カ霑帛<E99C91> **readOnly** 讓。蠑擾シ悟ケカ蝨ィ逡碁擇譏セ遉?"AI 豁」蝨ィ螟<EFBDA8>炊..." 驕ョ鄂ゥ<E98482>?*迚ゥ逅<EFBDA9>アる擇荳顔ヲ∵ュ「蟷カ蜿第桃菴?*縲?
### **鬟朱勦蝗幢シ壼ョ牙<EFBDAE>豐咏ョア騾<EFBDB1>€?*
### **风险三:状态同步的“双写冲突”**
* **<EFBFBD>髄諡キ髣ョ<EFBFBD>?* AI 逕滓<E98095>莠?import os; os.system('rm \-rf /')縲?
* **V7 隗」蜀ウ譁ケ譯茨シ?* **AST 髱呎€<C280>譫?\+ 螳ケ蝎ィ髫皮ヲサ**
* **鬚<>€<EFBDA3>?* 蝨ィ謇ァ陦?exec() 蜑搾シ御スソ逕ィ Python ast 讓。蝮玲沖謠丈サ」遐∵<E98190>托シ梧」€豬句芦 import os 遲牙<E981B2>髞ョ隸咲峩謗・謚帛<E8AC9A>蠑ょクク縲?
* **襍<>コ宣剞鬚晢シ?* 菴ソ逕ィ Python resource 讓。蝮鈴剞蛻カ蜊墓ャ。謇ァ陦檎<E999A6>?CPU 譌カ髣エ (10s) 蜥?蜀<><EFBFBD> (1GB)縲?
## **5\. 謨ー謐ョ蠎楢ョセ隶?(蜈<>焚謐ョ螻<EFBDAE>)**
* **逆向拷问:** 用户手动修改了第 5 行,同时 AI 删除了第 5 行,导致数据状态不一致。
* **V7 解决方案:** **UI 互斥锁 (UI Locking)**
* 当 AI 正在生成代码或后端正在计算时AG Grid 强制进入 **readOnly** 模式,并在界面显示 "AI 正在处理..." 遮罩,**物理层面上禁止并发操作**。
### **风险四:安全沙箱逃逸**
* **逆向拷问:** AI 生成了 import os; os.system('rm \-rf /')。
* **V7 解决方案:** **AST 静态分析 \+ 容器隔离**
* **预检:** 在执行 exec() 前,使用 Python ast 模块扫描代码树,检测到 import os 等关键词直接抛出异常。
* **资源限额:** 使用 Python resource 模块限制单次执行的 CPU 时间 (10s) 和 内存 (1GB)。
## **5\. 数据库设计 (元数据层)**
新增 TaskAudit 表用于记录每一次 AI 操作的上下文,便于回滚和审计。
譁ー蠅<EFBFBD> TaskAudit 陦ィ逕ィ莠手ョー蠖墓ッ丈ク€谺?AI 謫堺ス懃噪荳贋ク区枚<E58CBA>御セソ莠主屓貊壼柱螳。隶。縲?
model TaskAudit {
id String @id @default(uuid())
datasetId String
version Int // 謫堺ス懷錘逧<EFBFBD>沿譛ャ蜿?
version Int // 操作后的版本号
actionType String // "AI\_CODE" or "MANUAL\_EDIT"
prompt String? // 用户的自然语言指令
code String? // AI 逕滓<EFBFBD>逧?Python 莉」遐<EFBFBD>
code String? // AI 生成的 Python 代码
executionTime Int // 执行耗时 (ms)
status String // SUCCESS / FAILED
@@ -132,23 +141,24 @@ model TaskAudit {
## **6\. API 接口定义 (V7 优化)**
* POST /api/session/init: 荳贋シ<EFBFBD><EFBFBD>サカ<EFBFBD><EFBFBD>蟋句喧 Redis Session<EFBFBD>瑚ソ泌<EFBFBD>?sessionId縲?
* POST /api/session/init: 上传文件,初始化 Redis Session,返回 sessionId
* POST /api/session/execute:
* **Input:** { sessionId, code, version }
* **Output:** { previewData: ArrowBase64, newVersion: int, logs: string }
* **隸エ譏<EFBFBD>:** 莉<>ソ泌屓鬚<E5B193>ァ域焚謐ョ<E8AC90>御ク咲函謌?Excel 譁<>サカ縲?
* **说明:** 仅返回预览数据,不生成 Excel 文件。
* POST /api/session/save:
* **Input:** { sessionId }
* **Output:** { downloadUrl }
* **隸エ譏<EFBFBD>:** 隗ヲ蜿<EFBDA6> openpyxl 蜷亥ケカ騾サ霎托シ檎函謌先怙扈?Excel 蟷カ荳贋シ?OSS縲?
## **7\. 蠑€蜿大<E89CBF>蟾・蟒コ隶?*
* **说明:** 触发 openpyxl 合并逻辑,生成最终 Excel 并上传 OSS
* **Python 扈?(驥堺クュ荵矩㍾):**
* 螳樒鴫 Arrow \<-\> Pandas 逧<>コ丞<EFBDBA>蛹夜€サ霎代€?
* 蟆∬」<EFBFBD> openpyxl 逧<><E980A7>キ蠑丞屓蝪ォ騾サ霎代€?
* 謳ュ蟒コ FastAPI \+ Redis 邇ッ蠅<EFBDAF>€?
* **Node.js 扈?**
* 雍溯エ」 Dify 霓ャ蜿大柱驩エ譚<EFBDB4>€?
* **蜑咲ォッ扈?**
* <EFBFBD><EFBFBD> apache-arrow JS 蠎難シ瑚ァ」譫仙錘遶ッ霑泌屓逧<E5B193>コ瑚ソ帛宛豬∝ケカ蝨?AG Grid 螻慕、コ縲?
* 螳樒鴫窶廣I 螟<>炊荳ュ窶晉噪蜈ィ螻城煤螳壻コ、莠偵€
## **7\. 开发分工建议**
* **Python 组 (重中之重):**
* 实现 Arrow \<-\> Pandas 的序列化逻辑。
* 封装 openpyxl 的样式回填逻辑。
* 搭建 FastAPI \+ Redis 环境。
* **Node.js 组:**
* 负责 Dify 转发和鉴权。
* **前端组:**
* 集成 apache-arrow JS 库,解析后端返回的二进制流并在 AG Grid 展示。
* 实现“AI 处理中”的全屏锁定交互。