diff --git a/DC模块代码恢复指南.md b/DC模块代码恢复指南.md index d9b20d5d..98583041 100644 --- a/DC模块代码恢复指南.md +++ b/DC模块代码恢复指南.md @@ -246,5 +246,6 @@ + diff --git a/backend/migrations/add_data_stats_to_tool_c_session.sql b/backend/migrations/add_data_stats_to_tool_c_session.sql index c867fca6..19582824 100644 --- a/backend/migrations/add_data_stats_to_tool_c_session.sql +++ b/backend/migrations/add_data_stats_to_tool_c_session.sql @@ -41,5 +41,6 @@ WHERE table_schema = 'dc_schema' + diff --git a/backend/prisma/manual-migrations/001_add_postgres_cache_and_checkpoint.sql b/backend/prisma/manual-migrations/001_add_postgres_cache_and_checkpoint.sql index fd71cdb5..f0b6abcd 100644 --- a/backend/prisma/manual-migrations/001_add_postgres_cache_and_checkpoint.sql +++ b/backend/prisma/manual-migrations/001_add_postgres_cache_and_checkpoint.sql @@ -81,3 +81,4 @@ ORDER BY ordinal_position; + diff --git a/backend/prisma/manual-migrations/run-migration-002.ts b/backend/prisma/manual-migrations/run-migration-002.ts index 05fa9263..b400bca2 100644 --- a/backend/prisma/manual-migrations/run-migration-002.ts +++ b/backend/prisma/manual-migrations/run-migration-002.ts @@ -94,3 +94,4 @@ runMigration() + diff --git a/backend/prisma/migrations/20251208_add_column_mapping/migration.sql b/backend/prisma/migrations/20251208_add_column_mapping/migration.sql index 35dc9774..62c2f520 100644 --- a/backend/prisma/migrations/20251208_add_column_mapping/migration.sql +++ b/backend/prisma/migrations/20251208_add_column_mapping/migration.sql @@ -26,5 +26,6 @@ COMMENT ON COLUMN "dc_schema"."dc_tool_c_sessions"."column_mapping" IS '列名 + diff --git a/backend/prisma/migrations/create_tool_c_session.sql b/backend/prisma/migrations/create_tool_c_session.sql index 95582a7c..8915a963 100644 --- a/backend/prisma/migrations/create_tool_c_session.sql +++ b/backend/prisma/migrations/create_tool_c_session.sql @@ -53,5 +53,6 @@ COMMENT ON COLUMN dc_schema.dc_tool_c_sessions.expires_at IS '过期时间(创 + diff --git a/backend/recover-code-from-cursor-db.js b/backend/recover-code-from-cursor-db.js index 9002a5a3..a6b7d86e 100644 --- a/backend/recover-code-from-cursor-db.js +++ b/backend/recover-code-from-cursor-db.js @@ -203,5 +203,6 @@ function extractCodeBlocks(obj, blocks = []) { + diff --git a/backend/scripts/check-dc-tables.mjs b/backend/scripts/check-dc-tables.mjs index 968fb4ee..958bef15 100644 --- a/backend/scripts/check-dc-tables.mjs +++ b/backend/scripts/check-dc-tables.mjs @@ -222,5 +222,6 @@ checkDCTables(); + diff --git a/backend/scripts/create-tool-c-ai-history-table.mjs b/backend/scripts/create-tool-c-ai-history-table.mjs index fa456984..9c1ae84f 100644 --- a/backend/scripts/create-tool-c-ai-history-table.mjs +++ b/backend/scripts/create-tool-c-ai-history-table.mjs @@ -174,5 +174,6 @@ createAiHistoryTable() + diff --git a/backend/scripts/create-tool-c-table.js b/backend/scripts/create-tool-c-table.js index 6b7fd057..0a809566 100644 --- a/backend/scripts/create-tool-c-table.js +++ b/backend/scripts/create-tool-c-table.js @@ -161,5 +161,6 @@ createToolCTable() + diff --git a/backend/scripts/create-tool-c-table.mjs b/backend/scripts/create-tool-c-table.mjs index 1fa8a3bc..da74f400 100644 --- a/backend/scripts/create-tool-c-table.mjs +++ b/backend/scripts/create-tool-c-table.mjs @@ -158,5 +158,6 @@ createToolCTable() + diff --git a/backend/src/common/jobs/utils.ts b/backend/src/common/jobs/utils.ts index 3ab1b4e1..cf8b281e 100644 --- a/backend/src/common/jobs/utils.ts +++ b/backend/src/common/jobs/utils.ts @@ -292,3 +292,4 @@ export function getBatchItems( + diff --git a/backend/src/modules/asl/fulltext-screening/__tests__/api-integration-test.ts b/backend/src/modules/asl/fulltext-screening/__tests__/api-integration-test.ts index 4399143e..f0545147 100644 --- a/backend/src/modules/asl/fulltext-screening/__tests__/api-integration-test.ts +++ b/backend/src/modules/asl/fulltext-screening/__tests__/api-integration-test.ts @@ -326,5 +326,6 @@ runTests().catch((error) => { + diff --git a/backend/src/modules/asl/fulltext-screening/__tests__/e2e-real-test-v2.ts b/backend/src/modules/asl/fulltext-screening/__tests__/e2e-real-test-v2.ts index 579695f0..4f2bfef2 100644 --- a/backend/src/modules/asl/fulltext-screening/__tests__/e2e-real-test-v2.ts +++ b/backend/src/modules/asl/fulltext-screening/__tests__/e2e-real-test-v2.ts @@ -267,5 +267,6 @@ runTest() + diff --git a/backend/src/modules/asl/fulltext-screening/__tests__/fulltext-screening-api.http b/backend/src/modules/asl/fulltext-screening/__tests__/fulltext-screening-api.http index 70aba035..d1a16340 100644 --- a/backend/src/modules/asl/fulltext-screening/__tests__/fulltext-screening-api.http +++ b/backend/src/modules/asl/fulltext-screening/__tests__/fulltext-screening-api.http @@ -305,5 +305,6 @@ Content-Type: application/json + diff --git a/backend/src/modules/dc/tool-b/services/ConflictDetectionService.ts b/backend/src/modules/dc/tool-b/services/ConflictDetectionService.ts index 186aa823..a1cfe305 100644 --- a/backend/src/modules/dc/tool-b/services/ConflictDetectionService.ts +++ b/backend/src/modules/dc/tool-b/services/ConflictDetectionService.ts @@ -241,5 +241,6 @@ export const conflictDetectionService = new ConflictDetectionService(); + diff --git a/backend/src/modules/dc/tool-c/README.md b/backend/src/modules/dc/tool-c/README.md index 084d6f58..6e6e88c5 100644 --- a/backend/src/modules/dc/tool-c/README.md +++ b/backend/src/modules/dc/tool-c/README.md @@ -191,5 +191,6 @@ curl -X POST http://localhost:3000/api/v1/dc/tool-c/test/execute \ + diff --git a/backend/src/modules/dc/tool-c/controllers/StreamAIController.ts b/backend/src/modules/dc/tool-c/controllers/StreamAIController.ts index c8d99bf7..b5661777 100644 --- a/backend/src/modules/dc/tool-c/controllers/StreamAIController.ts +++ b/backend/src/modules/dc/tool-c/controllers/StreamAIController.ts @@ -245,5 +245,6 @@ export const streamAIController = new StreamAIController(); + diff --git a/backend/src/tests/README.md b/backend/src/tests/README.md index cf6f1778..24a9c243 100644 --- a/backend/src/tests/README.md +++ b/backend/src/tests/README.md @@ -393,3 +393,4 @@ SET session_replication_role = 'origin'; + diff --git a/backend/src/tests/verify-test1-database.sql b/backend/src/tests/verify-test1-database.sql index e35ae621..0ec238c8 100644 --- a/backend/src/tests/verify-test1-database.sql +++ b/backend/src/tests/verify-test1-database.sql @@ -95,3 +95,4 @@ WHERE key = 'verify_test'; + diff --git a/backend/src/tests/verify-test1-database.ts b/backend/src/tests/verify-test1-database.ts index 2305ad22..0d675cce 100644 --- a/backend/src/tests/verify-test1-database.ts +++ b/backend/src/tests/verify-test1-database.ts @@ -238,3 +238,4 @@ verifyDatabase() + diff --git a/backend/src/types/global.d.ts b/backend/src/types/global.d.ts index 141888c2..156d732c 100644 --- a/backend/src/types/global.d.ts +++ b/backend/src/types/global.d.ts @@ -28,3 +28,4 @@ export {} + diff --git a/backend/sync-dc-database.ps1 b/backend/sync-dc-database.ps1 index 06cf05fa..ceb087fa 100644 --- a/backend/sync-dc-database.ps1 +++ b/backend/sync-dc-database.ps1 @@ -49,5 +49,6 @@ Write-Host "✅ 完成!" -ForegroundColor Green + diff --git a/backend/test-tool-c-advanced-scenarios.mjs b/backend/test-tool-c-advanced-scenarios.mjs index e1b8bc13..336e7c13 100644 --- a/backend/test-tool-c-advanced-scenarios.mjs +++ b/backend/test-tool-c-advanced-scenarios.mjs @@ -336,5 +336,6 @@ runAdvancedTests().catch(error => { + diff --git a/backend/test-tool-c-day2.mjs b/backend/test-tool-c-day2.mjs index f7269be9..4e2d6ac1 100644 --- a/backend/test-tool-c-day2.mjs +++ b/backend/test-tool-c-day2.mjs @@ -402,5 +402,6 @@ runAllTests() + diff --git a/backend/test-tool-c-day3.mjs b/backend/test-tool-c-day3.mjs index 0b43520c..0bbeb9a3 100644 --- a/backend/test-tool-c-day3.mjs +++ b/backend/test-tool-c-day3.mjs @@ -360,5 +360,6 @@ runAllTests() + diff --git a/deploy-to-sae.ps1 b/deploy-to-sae.ps1 index 5d9dda7c..c4270a07 100644 --- a/deploy-to-sae.ps1 +++ b/deploy-to-sae.ps1 @@ -146,3 +146,4 @@ Set-Location .. + diff --git a/docs/00-系统总体设计/00-系统当前状态与开发指南.md b/docs/00-系统总体设计/00-系统当前状态与开发指南.md index 680aaab9..14720e29 100644 --- a/docs/00-系统总体设计/00-系统当前状态与开发指南.md +++ b/docs/00-系统总体设计/00-系统当前状态与开发指南.md @@ -1,10 +1,10 @@ # AIclinicalresearch 系统当前状态与开发指南 -> **文档版本:** v2.1 +> **文档版本:** v2.2 > **创建日期:** 2025-11-28 > **维护者:** 开发团队 -> **最后更新:** 2024-12-24 -> **重大进展:** 🚀 **阿里云生产环境部署启动** - PostgreSQL数据迁移完成、前端Nginx与Python微服务镜像已推送ACR +> **最后更新:** 2025-12-24 +> **重大进展:** 🚀 **后端核心服务镜像构建完成** - Node.js后端镜像已推送ACR(修复200+TS错误,补全30+Prisma关系) > **文档目的:** 快速了解系统当前状态,为新AI助手提供上下文 --- @@ -97,14 +97,16 @@ - 10个Schema隔离(platform/aia/pkb/asl/dc/ssa/st/rvw/admin/common) **云原生部署**: -- 阿里云 SAE (Serverless 应用引擎) +- 阿里云 SAE (Serverless 应用引擎) ✅ 已部署Python微服务 +- 阿里云 ACR (容器镜像服务) ✅ 已推送3个镜像(Frontend、Backend、Python) +- 阿里云 RDS (PostgreSQL 15) ✅ 已迁移数据 - RDS PostgreSQL 15 + OSS (对象存储) + NAT网关 - ACR (容器镜像服务 - 个人版免费) - **部署状态**:🚀 **进行中**(PostgreSQL✅、Python微服务✅、前端镜像✅、Node.js后端⏳) --- -## 🚀 当前开发状态(2024-12-24) +## 🚀 当前开发状态(2025-12-24) ### ✅ 已完成模块 @@ -256,7 +258,7 @@ --- -## 🚀 阿里云生产环境部署状态(2024-12-24) +## 🚀 阿里云生产环境部署状态(2025-12-24) ### ✅ 已完成部署 @@ -276,7 +278,7 @@ - **数据迁移**: ✅ 完成(90MB SQL文件,约12秒导入) - **Schema验证**: ✅ 11个Schema全部迁移成功 - **数据验证**: ✅ 用户3条、项目2条、文献1204条 - - **部署时间**: 2024-12-24 + - **部署时间**: 2025-12-24 - ✅ **OSS对象存储** - Bucket: `ai-clinical-research` @@ -290,23 +292,37 @@ - ✅ **Registry**: `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com` - ✅ **已推送镜像**: - **前端Nginx**: `ai-clinical_frontend-nginx:v1.0`(约50MB) - - 构建时间: 2024-12-24 + - 构建时间: 2025-12-24 - 基础镜像: `nginx:alpine` - 功能: React SPA + Nginx反向代理 + 动态环境变量 - 配置文件: `frontend-v2/Dockerfile`, `nginx.conf`, `.dockerignore` - **Python微服务**: `python-extraction:v1.0`(1.12GB) - - 构建时间: 2024-12-24 + - 构建时间: 2025-12-24 - 基础镜像: `python:3-slim` - 功能: PDF提取(PyMuPDF)+ 数据清洗(pandas/numpy/polars) - 特性: 移除Nougat(减小1.5GB)、使用阿里云Debian源 - 配置文件: `extraction_service/Dockerfile`, `requirements-prod.txt`, `.dockerignore` + + - **Node.js后端**: `backend-service:v1.0`(838MB,压缩后~186MB)✨ 新增! + - 构建时间: 2025-12-24(约5分钟) + - 基础镜像: `node:alpine` + - 构建策略: 改进版方案B(本地编译+Docker打包) + - 技术突破: 修复200+TypeScript错误、手动补全30+Prisma关系字段 + - 架构特性: Postgres-Only(pg-boss队列+PostgreSQL缓存) + - 配置文件: `backend/Dockerfile`, `backend/.dockerignore`, `backend/prisma/schema.prisma` ### 🚧 进行中 #### 4. SAE应用部署 -- ⏳ **Python微服务**: 镜像已推送,待部署到SAE - - 目标规格: 1核2GB +- ✅ **Python微服务**: 已成功部署到SAE轻量版 + - 应用名称: `python-extraction-test` + - 规格: 1核2GB + - 内网地址: `http://172.17.173.66:8000` + - 状态: 运行中 ✅ + +- ⏳ **Node.js后端**: 镜像已推送,待部署到SAE + - 目标规格: 1核2GB(测试环境) - 端口: 8000 - 健康检查: `/api/health` @@ -471,24 +487,34 @@ AIclinicalresearch/ | **2025-11-26~27** | DC Day 2-3 | ✅ DC工具B健康检查+模板管理 | | **2025-11-28** | DC Day 4-8 | ✅ DC Tool C MVP + UX重大改进完成 | | **2025-12-13** | 架构优化 | ✅ Postgres-Only架构改造完成 | -| **2024-12-24** | **部署启动** 🚀 | ✅ PostgreSQL数据迁移 + 前端/Python镜像推送ACR | -| **当前** | 部署进行中 | 🚧 SAE应用部署 + Node.js后端构建 | +| **2025-12-24 上午** | **部署启动** 🚀 | ✅ PostgreSQL数据迁移 + 前端/Python镜像推送ACR | +| **2025-12-24 下午** | **后端镜像构建** 🎉 | ✅ Node.js后端镜像构建成功(修复200+TS错误) | +| **当前** | 部署进行中 | 🚧 SAE应用部署(Python已完成,Node.js待部署) | --- ## 🎯 下一步计划 -### 🔥 最高优先级(1-2天)- 部署到生产环境 -1. **Python微服务部署到SAE** - - 创建SAE应用 - - 配置环境变量 - - 健康检查验证 - - 获取内网地址 +### 🔥 最高优先级(当前)- 部署到生产环境 +1. ✅ **Python微服务部署到SAE** - 已完成 + - ✅ 创建SAE应用(轻量版) + - ✅ 配置环境变量(OSS、数据库) + - ✅ 健康检查验证 + - ✅ 获取内网地址:`http://172.17.173.66:8000` -2. **Node.js后端Docker镜像构建** - - 创建Dockerfile - - 配置数据库连接(RDS内网地址) - - 构建并推送到ACR +2. ✅ **Node.js后端Docker镜像构建** - 已完成 + - ✅ Prisma反向同步(32个模型) + - ✅ 手动补全Prisma关系字段(30+个) + - ✅ 修复TypeScript编译错误(200+ → 0) + - ✅ 创建Dockerfile(改进版方案B) + - ✅ 构建并推送到ACR(838MB镜像) + +3. ⏳ **Node.js后端部署到SAE** - 待执行 + - [ ] 创建SAE应用(1核2GB,测试环境) + - [ ] 配置ACR镜像拉取认证 + - [ ] 配置环境变量(数据库、Python服务、OSS、LLM API) + - [ ] 健康检查验证 + - [ ] 获取内网地址 3. **Node.js后端部署到SAE** - 创建SAE应用(2核4GB) @@ -624,8 +650,8 @@ npm run dev # http://localhost:3000 ### 部署完成度 - ✅ **基础设施**:VPC(100%)、NAT网关(100%)、安全组(100%) - ✅ **数据存储**:RDS PostgreSQL(100%)、OSS(100%) -- ✅ **容器镜像**:前端Nginx(100%)、Python微服务(100%) -- 🚧 **SAE应用**:Python微服务(待部署)、Node.js后端(镜像待构建)、前端Nginx(待部署) +- ✅ **容器镜像**:前端Nginx(100%)、Python微服务(100%)、Node.js后端(100%)✨ 新增! +- ✅ **SAE应用**:Python微服务(100%,已运行)、Node.js后端(镜像已推送,待部署)、前端Nginx(待部署) - 📋 **验证测试**:全链路测试(待进行) ### 测试覆盖率 @@ -756,7 +782,7 @@ if (items.length >= 50) { --- **文档版本**:v2.1 -**最后更新**:2024-12-24 +**最后更新**:2025-12-24 **下次更新**:SAE应用部署完成 或 全链路验证测试完成 --- diff --git a/docs/02-通用能力层/Postgres-Only异步任务处理指南.md b/docs/02-通用能力层/Postgres-Only异步任务处理指南.md index ff9f19a3..4fe31d38 100644 --- a/docs/02-通用能力层/Postgres-Only异步任务处理指南.md +++ b/docs/02-通用能力层/Postgres-Only异步任务处理指南.md @@ -588,3 +588,4 @@ async saveProcessedData(recordId, newData) { + diff --git a/docs/02-通用能力层/通用能力层技术债务清单.md b/docs/02-通用能力层/通用能力层技术债务清单.md index e341d678..b628c25a 100644 --- a/docs/02-通用能力层/通用能力层技术债务清单.md +++ b/docs/02-通用能力层/通用能力层技术债务清单.md @@ -775,3 +775,4 @@ export const AsyncProgressBar: React.FC = ({ + diff --git a/docs/03-业务模块/ASL-AI智能文献/04-开发计划/05-全文复筛前端开发计划.md b/docs/03-业务模块/ASL-AI智能文献/04-开发计划/05-全文复筛前端开发计划.md index 9ce250c0..322d21de 100644 --- a/docs/03-业务模块/ASL-AI智能文献/04-开发计划/05-全文复筛前端开发计划.md +++ b/docs/03-业务模块/ASL-AI智能文献/04-开发计划/05-全文复筛前端开发计划.md @@ -1266,5 +1266,6 @@ interface FulltextScreeningResult { + diff --git a/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-01-23_全文复筛前端开发完成.md b/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-01-23_全文复筛前端开发完成.md index 379bdcd9..66a4b2b2 100644 --- a/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-01-23_全文复筛前端开发完成.md +++ b/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-01-23_全文复筛前端开发完成.md @@ -380,5 +380,6 @@ GET /api/v1/asl/fulltext-screening/tasks/:taskId/export + diff --git a/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-01-23_全文复筛前端逻辑调整.md b/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-01-23_全文复筛前端逻辑调整.md index d8fbcc89..ab1b2b8b 100644 --- a/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-01-23_全文复筛前端逻辑调整.md +++ b/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-01-23_全文复筛前端逻辑调整.md @@ -323,5 +323,6 @@ Linter错误:0个 + diff --git a/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-23_Day5_全文复筛API开发.md b/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-23_Day5_全文复筛API开发.md index 001e4aef..f9a18e25 100644 --- a/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-23_Day5_全文复筛API开发.md +++ b/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-23_Day5_全文复筛API开发.md @@ -482,5 +482,6 @@ Failed to open file '\\tmp\\extraction_service\\temp_10000_test.pdf' + diff --git a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_AI_Few-shot示例库.md b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_AI_Few-shot示例库.md index f36c20d3..29ded393 100644 --- a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_AI_Few-shot示例库.md +++ b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_AI_Few-shot示例库.md @@ -548,5 +548,6 @@ df['creatinine'] = pd.to_numeric(df['creatinine'], errors='coerce') + diff --git a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Bug修复总结_2025-12-08.md b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Bug修复总结_2025-12-08.md index 1b0f5cb2..e53d6842 100644 --- a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Bug修复总结_2025-12-08.md +++ b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Bug修复总结_2025-12-08.md @@ -386,5 +386,6 @@ npm run dev + diff --git a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Day3开发计划.md b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Day3开发计划.md index 1f91c6e0..fa854858 100644 --- a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Day3开发计划.md +++ b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Day3开发计划.md @@ -963,5 +963,6 @@ export const aiController = new AIController(); + diff --git a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Day4-5前端开发计划.md b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Day4-5前端开发计划.md index 4d373262..ca88fb36 100644 --- a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Day4-5前端开发计划.md +++ b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Day4-5前端开发计划.md @@ -1297,5 +1297,6 @@ npm install react-markdown + diff --git a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Pivot列顺序优化总结.md b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Pivot列顺序优化总结.md index 68ae79dc..0cd395b4 100644 --- a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Pivot列顺序优化总结.md +++ b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_Pivot列顺序优化总结.md @@ -206,4 +206,5 @@ FMA___基线 | FMA___1个月 | FMA___2个月 + diff --git a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_方案B实施总结_2025-12-09.md b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_方案B实施总结_2025-12-09.md index 9fbb8219..db3207a8 100644 --- a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_方案B实施总结_2025-12-09.md +++ b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_方案B实施总结_2025-12-09.md @@ -364,4 +364,5 @@ formula = "FMA总分(0-100) / 100" + diff --git a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_缺失值处理_开发进度_2025-12-10.md b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_缺失值处理_开发进度_2025-12-10.md index 109e792b..7d689234 100644 --- a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_缺失值处理_开发进度_2025-12-10.md +++ b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_缺失值处理_开发进度_2025-12-10.md @@ -199,3 +199,4 @@ async handleFillnaMice(request, reply) { + diff --git a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_缺失值处理功能_更新说明.md b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_缺失值处理功能_更新说明.md index 17833f14..9f6ea2fc 100644 --- a/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_缺失值处理功能_更新说明.md +++ b/docs/03-业务模块/DC-数据清洗整理/04-开发计划/工具C_缺失值处理功能_更新说明.md @@ -171,3 +171,4 @@ method: 'mean' | 'median' | 'mode' | 'constant' | 'ffill' | 'bfill' + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-02_工作总结.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-02_工作总结.md index a55bddbe..32abafdf 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-02_工作总结.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-02_工作总结.md @@ -319,5 +319,6 @@ Changes: + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-06_工具C_Day1开发完成总结.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-06_工具C_Day1开发完成总结.md index 02fa8daf..28b5966e 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-06_工具C_Day1开发完成总结.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-06_工具C_Day1开发完成总结.md @@ -391,5 +391,6 @@ cd path; command + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-06_工具C_Day2开发完成总结.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-06_工具C_Day2开发完成总结.md index dbfbda4d..a4913aa5 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-06_工具C_Day2开发完成总结.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-06_工具C_Day2开发完成总结.md @@ -620,5 +620,6 @@ import { logger } from '../../../../common/logging/index.js'; + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_AI对话核心功能增强总结.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_AI对话核心功能增强总结.md index d9d7ad5f..ddef8ca5 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_AI对话核心功能增强总结.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_AI对话核心功能增强总结.md @@ -624,5 +624,6 @@ Content-Length: 45234 + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Bug修复_DataGrid空数据防御.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Bug修复_DataGrid空数据防御.md index 1c15cd41..77ce439e 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Bug修复_DataGrid空数据防御.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Bug修复_DataGrid空数据防御.md @@ -276,5 +276,6 @@ Response: + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Day5_Ant-Design-X重构完成.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Day5_Ant-Design-X重构完成.md index 6733c0c4..7580235e 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Day5_Ant-Design-X重构完成.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Day5_Ant-Design-X重构完成.md @@ -429,5 +429,6 @@ Response: + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Day5最终总结.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Day5最终总结.md index 4ef90815..95c200a2 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Day5最终总结.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_Day5最终总结.md @@ -423,5 +423,6 @@ import { ChatContainer } from '@/shared/components/Chat'; + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_UI优化与Bug修复.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_UI优化与Bug修复.md index 7a00a176..27a729d0 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_UI优化与Bug修复.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_UI优化与Bug修复.md @@ -333,5 +333,6 @@ const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{ + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_后端API完整对接完成.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_后端API完整对接完成.md index a1486efe..a82df41f 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_后端API完整对接完成.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_后端API完整对接完成.md @@ -373,5 +373,6 @@ python main.py + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_完整UI优化与功能增强.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_完整UI优化与功能增强.md index 747c81d5..525d4cc3 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_完整UI优化与功能增强.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_完整UI优化与功能增强.md @@ -621,5 +621,6 @@ http://localhost:5173/data-cleaning/tool-c + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_工具C_Day4前端基础完成.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_工具C_Day4前端基础完成.md index a6e98931..0856251b 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_工具C_Day4前端基础完成.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/2025-12-07_工具C_Day4前端基础完成.md @@ -231,5 +231,6 @@ Day 5 (6-8小时): + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/DC模块重建完成总结-Day1.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/DC模块重建完成总结-Day1.md index 7ed55d85..f8178b2f 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/DC模块重建完成总结-Day1.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/DC模块重建完成总结-Day1.md @@ -409,5 +409,6 @@ Docs: docs/03-业务模块/DC-数据清洗整理/06-开发记录/DC模块重建 + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Phase1-Portal页面开发完成-2025-12-02.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Phase1-Portal页面开发完成-2025-12-02.md index 87fb809f..012e0149 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Phase1-Portal页面开发完成-2025-12-02.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Phase1-Portal页面开发完成-2025-12-02.md @@ -384,5 +384,6 @@ const mockAssets: Asset[] = [ + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Phase2-ToolB-Step1-2开发完成-2025-12-03.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Phase2-ToolB-Step1-2开发完成-2025-12-03.md index 376c2f92..dae83da2 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Phase2-ToolB-Step1-2开发完成-2025-12-03.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Phase2-ToolB-Step1-2开发完成-2025-12-03.md @@ -368,5 +368,6 @@ frontend-v2/src/modules/dc/ + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Portal页面UI优化-2025-12-02.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Portal页面UI优化-2025-12-02.md index 5f44acbb..104ab2cd 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Portal页面UI优化-2025-12-02.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Portal页面UI优化-2025-12-02.md @@ -328,5 +328,6 @@ + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Tool-B-MVP完成总结-2025-12-03.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Tool-B-MVP完成总结-2025-12-03.md index 7b9cfad8..4795339d 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Tool-B-MVP完成总结-2025-12-03.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/Tool-B-MVP完成总结-2025-12-03.md @@ -282,5 +282,6 @@ ConflictDetectionService // 冲突检测(字段级对比) + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB-UI优化-2025-12-03.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB-UI优化-2025-12-03.md index 1e09856c..15a5dd31 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB-UI优化-2025-12-03.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB-UI优化-2025-12-03.md @@ -331,5 +331,6 @@ + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB-UI优化-Round2-2025-12-03.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB-UI优化-Round2-2025-12-03.md index 1178743b..e843f4dc 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB-UI优化-Round2-2025-12-03.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB-UI优化-Round2-2025-12-03.md @@ -294,5 +294,6 @@ + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB浏览器测试计划-2025-12-03.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB浏览器测试计划-2025-12-03.md index 9eed7e99..47cd0b00 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB浏览器测试计划-2025-12-03.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/ToolB浏览器测试计划-2025-12-03.md @@ -358,5 +358,6 @@ + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/后端API测试报告-2025-12-02.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/后端API测试报告-2025-12-02.md index 69fd29d7..44bbdebc 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/后端API测试报告-2025-12-02.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/后端API测试报告-2025-12-02.md @@ -446,5 +446,6 @@ Tool B后端代码**100%复用**了平台通用能力层,无任何重复开发 + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/待办事项-下一步工作.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/待办事项-下一步工作.md index c8714d19..29f16f8d 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/待办事项-下一步工作.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/待办事项-下一步工作.md @@ -292,5 +292,6 @@ + diff --git a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/数据库验证报告-2025-12-02.md b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/数据库验证报告-2025-12-02.md index 463d8deb..b77d9502 100644 --- a/docs/03-业务模块/DC-数据清洗整理/06-开发记录/数据库验证报告-2025-12-02.md +++ b/docs/03-业务模块/DC-数据清洗整理/06-开发记录/数据库验证报告-2025-12-02.md @@ -223,5 +223,6 @@ $ node scripts/check-dc-tables.mjs + diff --git a/docs/03-业务模块/DC-数据清洗整理/07-技术债务/Tool-B技术债务清单.md b/docs/03-业务模块/DC-数据清洗整理/07-技术债务/Tool-B技术债务清单.md index 0e29540d..275ecfca 100644 --- a/docs/03-业务模块/DC-数据清洗整理/07-技术债务/Tool-B技术债务清单.md +++ b/docs/03-业务模块/DC-数据清洗整理/07-技术债务/Tool-B技术债务清单.md @@ -456,5 +456,6 @@ ${fields.map((f, i) => `${i + 1}. ${f.name}:${f.desc}`).join('\n')} + diff --git a/docs/05-部署文档/00-部署进度总览.md b/docs/05-部署文档/00-部署进度总览.md index d9bbae3f..f442fa39 100644 --- a/docs/05-部署文档/00-部署进度总览.md +++ b/docs/05-部署文档/00-部署进度总览.md @@ -1,7 +1,7 @@ # 🚀 AI临床研究平台 - 部署进度总览 > **文档用途**:统一展示项目部署状态、资源信息、操作手册索引 -> **更新时间**:2024-12-24 +> **更新时间**:2025-12-24 > **维护人员**:开发团队 --- @@ -10,10 +10,10 @@ | 服务名称 | 部署状态 | 镜像版本 | 部署位置 | 完成时间 | 操作文档 | |---------|---------|---------|---------|---------|---------| -| **PostgreSQL数据库** | ✅ 已完成 | PostgreSQL 15 | RDS | 2024-12-24 | [08-PostgreSQL数据库部署操作手册.md](./08-PostgreSQL数据库部署操作手册.md) | -| **前端Nginx服务** | ✅ 已完成 | v1.0 | SAE(待部署) | 2024-12-24 | [07-前端Nginx-SAE部署操作手册.md](./07-前端Nginx-SAE部署操作手册.md) | -| **Python微服务** | ✅ 已完成 | v1.0 | SAE(轻量版) | 2024-12-24 | [09-Python微服务-SAE部署操作手册.md](./09-Python微服务-SAE部署操作手册.md) | -| **Node.js后端** | ⏳ 待开始 | - | - | - | - | +| **PostgreSQL数据库** | ✅ 已完成 | PostgreSQL 15 | RDS | 2025-12-24 | [08-PostgreSQL数据库部署操作手册.md](./08-PostgreSQL数据库部署操作手册.md) | +| **前端Nginx服务** | ✅ 已完成 | v1.0 | SAE(待部署) | 2025-12-24 | [07-前端Nginx-SAE部署操作手册.md](./07-前端Nginx-SAE部署操作手册.md) | +| **Python微服务** | ✅ 已完成 | v1.0 | SAE(轻量版) | 2025-12-24 | [09-Python微服务-SAE部署操作手册.md](./09-Python微服务-SAE部署操作手册.md) | +| **Node.js后端** | ✅ 已完成 | v1.0 | SAE(待部署) | 2025-12-24 | [10-Node.js后端-Docker镜像构建手册.md](./10-Node.js后端-Docker镜像构建手册.md) | | **Dify AI服务** | ⏳ 待开始 | - | - | - | - | **图例说明**: @@ -40,7 +40,7 @@ |---------|---------|---------|---------|---------| | **python-extraction** | v1.0 | 1.12GB | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0` | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0` | | **ai-clinical_frontend-nginx** | v1.0 | ~50MB | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.0` | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.0` | -| **nodejs-backend** | - | - | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/nodejs-backend` | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/nodejs-backend` | +| **backend-service** | v1.0 | 838MB | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0` | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0` | --- @@ -99,7 +99,7 @@ | `common_schema` | 公共模块 | 0 | 预留 | | `information_schema` | 系统元数据 | - | PostgreSQL标准 | -**关键数据量**(截至2024-12-24): +**关键数据量**(截至2025-12-24): - 用户:3条 - AI项目:2条 - 文献:1204条 @@ -125,7 +125,7 @@ postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyun | 应用名称 | 状态 | 规格 | 实例数 | 端口 | 内网地址 | 公网地址 | |---------|------|------|-------|------|---------|---------| | **python-extraction-test** | ✅ 运行中 | 1核2GB | 1 | 8000 | `http://172.17.173.66:8000` | 无(仅内网) | -| **nodejs-backend** | 待构建 | 2核4GB | 1 | 3001 | 待部署后填写 | 待部署后填写 | +| **nodejs-backend-test** | 镜像已推送 | 1核2GB | 1 | 3001 | 待部署后填写 | 待部署后填写 | | **frontend-nginx** | 镜像已推送 | 1核2GB | 1 | 80 | 待部署后填写 | 待部署后填写 | --- @@ -189,16 +189,19 @@ AIclinicalresearch/extraction_service/ VPC:crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0 ``` -**Node.js后端**(待构建): +**Node.js后端**: ``` AIclinicalresearch/backend/ -├── Dockerfile ⏳ 待创建 -├── .dockerignore ⏳ 待创建 -└── (配置文件) ⏳ 待确认 +├── Dockerfile ✅ 已提交Git(改进版方案B:本地编译+Docker打包) +├── .dockerignore ✅ 已提交Git(优化构建上下文) +├── prisma/schema.prisma ✅ 已同步RDS(32个模型+30+关系字段) +└── tsconfig.json ✅ 已优化(排除测试文件) -镜像存储位置(预留): -公网:crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/nodejs-backend:v1.0 -VPC:crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/nodejs-backend:v1.0 +镜像存储位置: +公网:crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0 +VPC:crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0 + +镜像摘要:sha256:a4ffb61c15af1cd1ed9de187b4464a1aab773918e5b41b4df5b8ad96514f9941 ``` **Git提交规范**: @@ -218,7 +221,7 @@ VPC:crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ ### 3.1 PostgreSQL数据库 **部署概要**: -- **部署时间**:2024-12-24 +- **部署时间**:2025-12-24 - **部署方式**:`pg_dump` 全量导出 → RDS导入 - **数据迁移时长**:约12秒(90MB SQL文件) - **验证状态**:✅ Schema完整、数据一致、关系正确 @@ -256,7 +259,7 @@ docker run --name ai-clinical-postgres \ - **镜像版本**:`v1.0` - **镜像大小**:约50MB - **基础镜像**:`nginx:alpine` -- **构建时间**:2024-12-24 +- **构建时间**:2025-12-24 **镜像功能**: - ✅ 托管React单页应用(SPA) @@ -292,14 +295,95 @@ docker run --name ai-clinical-postgres \ --- -### 3.3 Python微服务 +### 3.3 Node.js后端服务 + +**镜像信息**: +- **仓库名称**:`backend-service` +- **镜像版本**:`v1.0` +- **镜像大小**:838MB (压缩后 ~186MB) +- **基础镜像**:`node:alpine` +- **构建时间**:2025-12-24 +- **构建策略**:改进版方案B(本地编译+Docker打包) + +**构建成果**: +- ✅ TypeScript编译成功(0错误,修复200+个错误) +- ✅ Prisma Schema已同步RDS(32个模型) +- ✅ 手动补全30+个关系字段 +- ✅ 镜像已推送到ACR(v1.0 + latest) + +**技术架构**: +- **Node.js版本**:22.x +- **Prisma版本**:6.17.0 +- **ORM**:Prisma(支持多Schema) +- **Web框架**:Fastify +- **队列系统**:pg-boss(Postgres-Only架构) +- **缓存系统**:PostgreSQL(替代Redis) + +**构建产物**: +- **Dockerfile**:`AIclinicalresearch/backend/Dockerfile` +- **.dockerignore**:`AIclinicalresearch/backend/.dockerignore` +- **Prisma Schema**:`AIclinicalresearch/backend/prisma/schema.prisma` + +**SAE配置建议**: +- **CPU/内存**:1核 / 2GB(测试环境) +- **实例数**:1 +- **端口**:3001 +- **健康检查**:`GET /health` 返回200 +- **环境变量**(关键配置): + ```bash + NODE_ENV=production + PORT=3001 + DATABASE_URL=postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=18&pool_timeout=10 + + # Python微服务地址 + PYTHON_SERVICE_URL=http://172.17.173.66:8000 + + # OSS配置 + OSS_ACCESS_KEY_ID=LTAI5tB2Dt3NdvBL3G7nYGv7 + OSS_ACCESS_KEY_SECRET=1iSN9k39RkApP93QjUhC1DcPIeMG4V + OSS_BUCKET=ai-clinical-research + OSS_ENDPOINT=oss-cn-beijing-internal.aliyuncs.com + + # JWT密钥 + JWT_SECRET=your-secret-key-change-in-production + JWT_EXPIRES_IN=7d + + # LLM API Keys + DEEPSEEK_API_KEY=sk-7f8cc37a79fa4799860b38fc7ba2e150 + DASHSCOPE_API_KEY=sk-75b4ff29a14a49e79667a331034f3298 + + # 队列和缓存(Postgres-Only) + QUEUE_TYPE=pgboss + CACHE_TYPE=postgres + ``` + +**操作文档**: +- [10-Node.js后端-Docker镜像构建手册.md](./10-Node.js后端-Docker镜像构建手册.md) - 镜像构建详细步骤 +- [05-Node.js后端-SAE容器部署指南.md](./05-Node.js后端-SAE容器部署指南.md) - SAE部署技术指南 + +**部署状态**: +- ✅ Prisma反向同步完成(32个模型) +- ✅ TypeScript编译成功(修复200+错误) +- ✅ Docker镜像构建成功 +- ✅ 镜像已推送至ACR +- ⏳ 待部署到SAE + +**关键突破**: +1. ✅ 解决了Prisma `db pull` 后缺少关系字段的问题(手动补全30+个) +2. ✅ 修复了TypeScript类型错误(JSON、Buffer、pg-boss等) +3. ✅ 优化了Docker构建策略(本地编译,避免网络超时) +4. ✅ 实现了零编译错误(200+ → 0) + +--- + +### 3.4 Python微服务 **镜像信息**: - **仓库名称**:`python-extraction` - **镜像版本**:`v1.0` - **镜像大小**:1.12GB - **基础镜像**:`python:3-slim` -- **构建时间**:2024-12-24 +- **构建时间**:2025-12-24 **功能模块**: - ✅ **PDF文本提取**:PyMuPDF 1.26.7 @@ -369,7 +453,7 @@ docker run --name ai-clinical-postgres \ http://172.17.173.66:8000 ``` -**部署时间**:2024-12-24 +**部署时间**:2025-12-24 **健康检查**:✅ 通过 --- @@ -482,7 +566,7 @@ docker exec ai-clinical-postgres pg_dump \ > "backup_$(date +%Y%m%d_%H%M%S).sql" # 导入到RDS(需临时开启外网) -cat backup_20241224_154529.sql | \ +cat backup_20251224_154529.sql | \ docker exec -i -e PGPASSWORD="Xibahe@fengzhibo117" \ ai-clinical-postgres psql \ -h pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com \ @@ -557,12 +641,12 @@ aliyun sae DeployApplication \ 1. ✅ **基础设施**:VPC、NAT网关、安全组 2. ✅ **数据库**:RDS PostgreSQL(数据迁移+验证) 3. ✅ **对象存储**:OSS Bucket创建+权限配置 -4. 🔄 **后端服务**: - - Python微服务(文档提取+数据清洗) - - Node.js后端(API服务器) -5. 🔄 **前端服务**:Nginx静态资源托管 -6. 🔄 **AI服务**:Dify部署 -7. 🔄 **验证测试**:全链路功能验证 +4. ✅ **后端服务**: + - ✅ Python微服务(文档提取+数据清洗)- 已部署到SAE + - ✅ Node.js后端(API服务器)- 镜像已构建,待部署 +5. ⏳ **前端服务**:Nginx静态资源托管 - 镜像已推送,待部署 +6. ⏳ **AI服务**:Dify部署 +7. ⏳ **验证测试**:全链路功能验证 **依赖关系**: ``` @@ -641,7 +725,10 @@ aliyun sae DescribeApplicationInstances --AppId xxx ### 高优先级 🔴 - [x] **Python微服务**:部署到SAE并验证 ✅ 已完成 - [x] **Python微服务**:创建SAE部署操作手册 ✅ 已完成 -- [ ] **Node.js后端**:Docker镜像构建 +- [x] **Node.js后端**:Docker镜像构建 ✅ 已完成(2025-12-24) +- [x] **Node.js后端**:Prisma反向同步 ✅ 已完成(32个模型) +- [x] **Node.js后端**:TypeScript编译修复 ✅ 已完成(修复200+错误) +- [x] **Node.js后端**:镜像推送到ACR ✅ 已完成 - [ ] **Node.js后端**:部署到SAE - [ ] **Node.js后端**:配置环境变量(Python服务地址) @@ -669,11 +756,12 @@ aliyun sae DescribeApplicationInstances --AppId xxx - [07-前端Nginx-SAE部署操作手册.md](./07-前端Nginx-SAE部署操作手册.md) - 前端Nginx部署步骤 - [08-PostgreSQL数据库部署操作手册.md](./08-PostgreSQL数据库部署操作手册.md) - PostgreSQL部署步骤 - [09-Python微服务-SAE部署操作手册.md](./09-Python微服务-SAE部署操作手册.md) - Python微服务部署步骤 -- 待创建:Node.js后端SAE部署操作手册 +- [10-Node.js后端-Docker镜像构建手册.md](./10-Node.js后端-Docker镜像构建手册.md) - Node.js后端Docker构建详解 ### 技术架构文档 - [00-部署架构总览.md](./00-部署架构总览.md) - 架构设计与技术选型 - [04-Python微服务-SAE容器部署指南.md](./04-Python微服务-SAE容器部署指南.md) - Python服务技术详解 +- [05-Node.js后端-SAE容器部署指南.md](./05-Node.js后端-SAE容器部署指南.md) - Node.js后端技术详解 - [06-前端Nginx-SAE容器部署指南.md](./06-前端Nginx-SAE容器部署指南.md) - 前端Nginx技术详解 ### 分析报告 @@ -683,7 +771,7 @@ aliyun sae DescribeApplicationInstances --AppId xxx ## 🔄 八、更新日志 -### 2024-12-24 +### 2025-12-24 - ✅ PostgreSQL数据库部署完成 - ✅ 前端Nginx Docker镜像构建并推送至ACR - ✅ Python微服务Docker镜像构建并推送至ACR @@ -691,6 +779,11 @@ aliyun sae DescribeApplicationInstances --AppId xxx - ✅ 创建Python微服务SAE部署操作手册(轻量版SAE配置) - ✅ Python微服务成功部署到SAE(内网地址:172.17.173.66:8000) - ✅ 解决ACR镜像拉取权限问题(配置镜像仓库认证) +- ✅ Node.js后端Prisma反向同步完成(32个模型,手动补全30+关系字段) +- ✅ Node.js后端TypeScript编译修复完成(修复200+错误→0错误) +- ✅ Node.js后端Docker镜像构建成功(838MB,改进版方案B) +- ✅ Node.js后端镜像推送至ACR(v1.0 + latest) +- ✅ 创建Node.js后端Docker镜像构建手册 --- @@ -708,5 +801,5 @@ aliyun sae DescribeApplicationInstances --AppId xxx --- > **提示**:本文档会随着部署进度持续更新,请定期查看最新版本! -> **最后更新**:2024-12-24 +> **最后更新**:2025-12-24 diff --git a/docs/05-部署文档/02-SAE部署完全指南(产品经理版).md b/docs/05-部署文档/02-SAE部署完全指南(产品经理版).md index d0c92e77..a6ed204a 100644 --- a/docs/05-部署文档/02-SAE部署完全指南(产品经理版).md +++ b/docs/05-部署文档/02-SAE部署完全指南(产品经理版).md @@ -865,3 +865,4 @@ ACR镜像仓库: + diff --git a/docs/05-部署文档/07-前端Nginx-SAE部署操作手册.md b/docs/05-部署文档/07-前端Nginx-SAE部署操作手册.md index 8ef3ee22..4c322cb4 100644 --- a/docs/05-部署文档/07-前端Nginx-SAE部署操作手册.md +++ b/docs/05-部署文档/07-前端Nginx-SAE部署操作手册.md @@ -1352,3 +1352,4 @@ SAE应用配置: + diff --git a/docs/05-部署文档/08-PostgreSQL数据库部署操作手册.md b/docs/05-部署文档/08-PostgreSQL数据库部署操作手册.md index 966b085e..4b2c2465 100644 --- a/docs/05-部署文档/08-PostgreSQL数据库部署操作手册.md +++ b/docs/05-部署文档/08-PostgreSQL数据库部署操作手册.md @@ -1168,3 +1168,4 @@ docker exec -e PGPASSWORD="密码" ai-clinical-postgres psql -h RDS地址 -U air 祝部署顺利!🎉 + diff --git a/docs/05-部署文档/10-Node.js后端-Docker镜像构建手册.md b/docs/05-部署文档/10-Node.js后端-Docker镜像构建手册.md new file mode 100644 index 00000000..4135d6d3 --- /dev/null +++ b/docs/05-部署文档/10-Node.js后端-Docker镜像构建手册.md @@ -0,0 +1,582 @@ +# Node.js 后端 - Docker 镜像构建操作手册 + +**文档版本**: v1.0 +**创建时间**: 2024-12-24 +**适用范围**: AIclinicalresearch 平台 - Node.js 后端服务 +**目标读者**: 运维工程师、后端开发工程师 + +--- + +## 📋 目录 + +1. [构建概述](#构建概述) +2. [前置准备](#前置准备) +3. [构建流程](#构建流程) +4. [镜像信息](#镜像信息) +5. [故障排查](#故障排查) +6. [最佳实践](#最佳实践) + +--- + +## 1. 构建概述 + +### 1.1 构建策略 + +本次构建采用**改进版方案B(本地编译+Docker打包)**,相比传统方案有以下优势: + +| 对比项 | 传统方案 | 改进版方案B | +|--------|----------|-------------| +| **TypeScript编译** | Docker中执行 | 本地预编译 ✅ | +| **依赖安装** | 完整依赖 | 仅生产依赖 ✅ | +| **网络依赖** | 高(易超时) | 低(更稳定) ✅ | +| **构建时间** | ~10分钟 | ~5分钟 ✅ | +| **平台兼容性** | 有风险 | 无风险 ✅ | + +### 1.2 构建成果 + +``` +镜像名称: backend-service:v1.0 +镜像大小: 838MB (压缩后 ~186MB) +镜像ID: a4ffb61c15af +构建时间: ~5分钟 +ACR地址: crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0 +``` + +--- + +## 2. 前置准备 + +### 2.1 环境检查 + +```powershell +# 1. 检查Docker状态 +docker --version +docker ps + +# 2. 检查Node.js环境 +node --version # 应该显示 v22.x +npm --version + +# 3. 确认当前目录 +cd D:\MyCursor\AIclinicalresearch\backend +``` + +### 2.2 代码准备 + +#### ✅ 必须完成的步骤 + +**步骤1:Prisma反向同步(必须)** + +```powershell +# 设置临时RDS连接环境变量 +$env:DATABASE_URL = "postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5oo.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=18&pool_timeout=10" + +# 执行Prisma反向同步 +npx prisma db pull + +# 输出应该显示: +# ✔ Introspected 32 models and wrote them into prisma\schema.prisma +``` + +**步骤2:生成Prisma Client** + +```powershell +npx prisma generate + +# 输出应该显示: +# ✔ Generated Prisma Client (v6.17.0) +``` + +**步骤3:TypeScript编译(必须)** + +```powershell +# 编译TypeScript代码 +npm run build + +# 成功输出: +# > ai-clinical-backend@1.0.0 build +# > tsc +# (无错误信息) + +# 检查dist目录是否生成 +ls dist +``` + +⚠️ **重要提示**:如果编译失败,必须先修复所有TypeScript错误! + +--- + +## 3. 构建流程 + +### 3.1 完整构建步骤 + +```powershell +# 1. 确保在backend目录 +cd D:\MyCursor\AIclinicalresearch\backend + +# 2. 检查Dockerfile和.dockerignore +ls Dockerfile +ls .dockerignore + +# 3. 开始构建(需要5分钟) +docker build -t backend-service:v1.0 . + +# 4. 查看构建结果 +docker images backend-service:v1.0 +``` + +### 3.2 构建过程说明 + +**阶段1:依赖安装(约4分钟)** +```dockerfile +FROM node:alpine AS builder +RUN apk add --no-cache openssl +COPY package*.json ./ +COPY prisma ./prisma/ +RUN npm ci --production # 仅安装生产依赖 +RUN npx prisma generate # 生成Prisma Client +``` + +**阶段2:复制本地编译结果(约10秒)** +```dockerfile +COPY dist ./dist # 复制本地已编译的TypeScript代码 +``` + +**阶段3:运行镜像打包(约1分钟)** +```dockerfile +FROM node:alpine +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/prisma ./prisma +``` + +### 3.3 推送到ACR + +```powershell +# 1. 登录ACR(使用个人版实例地址) +echo "fengzhibo117" | docker login --username=gofeng117@163.com --password-stdin crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com + +# 输出:Login Succeeded + +# 2. 打标签 +docker tag backend-service:v1.0 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0 +docker tag backend-service:v1.0 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest + +# 3. 推送镜像 +docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0 +docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest + +# 输出: +# v1.0: digest: sha256:a4ffb61c15af... size: 856 +# latest: digest: sha256:a4ffb61c15af... size: 856 +``` + +--- + +## 4. 镜像信息 + +### 4.1 镜像地址 + +**VPC内网地址(SAE部署使用):** +``` +crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0 +``` + +**公网地址(查看和拉取):** +``` +crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0 +``` + +### 4.2 镜像详情 + +```yaml +镜像摘要: sha256:a4ffb61c15af1cd1ed9de187b4464a1aab773918e5b41b4df5b8ad96514f9941 +大小: 838MB (压缩后 ~186MB) +架构: linux/amd64 +基础镜像: node:alpine +Node版本: 22.x +标签: v1.0, latest +``` + +### 4.3 镜像内容 + +``` +/app/ +├── node_modules/ # 生产依赖 +├── dist/ # 编译后的JS代码 +├── prisma/ # Prisma Schema +│ └── schema.prisma +├── package.json +└── uploads/ # 临时文件目录 +``` + +### 4.4 启动命令 + +```dockerfile +CMD ["node", "dist/index.js"] +``` + +### 4.5 健康检查 + +```dockerfile +HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ + CMD node -e "require('http').get('http://localhost:3001/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1); })" +``` + +--- + +## 5. 故障排查 + +### 5.1 常见问题 + +#### ❌ 问题1:TypeScript编译失败 + +**症状:** +``` +error TS2554: Expected 2-3 arguments, but got 1. +error TS2322: Type 'XXX' is not assignable to type 'YYY'. +``` + +**原因:** +- Prisma反向同步后缺少关系字段 +- 代码与Prisma生成的类型不匹配 + +**解决方案:** +```powershell +# 1. 重新同步Prisma +npx prisma db pull +npx prisma generate + +# 2. 重新编译 +npm run build + +# 3. 如果还有错误,检查tsconfig.json配置 +``` + +#### ❌ 问题2:Docker构建网络超时 + +**症状:** +``` +npm error code ECONNRESET +npm error network aborted +``` + +**原因:** +- npm镜像源网络不稳定 +- npm ci 下载依赖失败 + +**解决方案:** +✅ **使用改进版方案B(本次采用的方案)** +- 本地预编译,跳过Docker中的编译步骤 +- 只安装生产依赖,减少网络传输 + +#### ❌ 问题3:推送到ACR失败(403 Forbidden) + +**症状:** +``` +Error response from daemon: login attempt to https://registry.cn-beijing.aliyuncs.com/v2/ failed with status: 403 Forbidden +``` + +**原因:** +- 使用了错误的ACR地址 +- 应该使用个人版实例地址,不是企业版地址 + +**解决方案:** +```powershell +# ✅ 正确的登录地址(个人版实例) +docker login crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com + +# ❌ 错误的登录地址(企业版) +docker login registry.cn-beijing.aliyuncs.com +``` + +#### ❌ 问题4:VPC内网地址推送超时 + +**症状:** +``` +failed to do request: Head "https://crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/...": net/http: TLS handshake timeout +``` + +**原因:** +- VPC内网地址只能在阿里云VPC内访问 +- 本地开发环境无法访问VPC内网 + +**解决方案:** +```powershell +# 本地开发环境使用公网地址推送 +docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0 + +# SAE部署时使用VPC内网地址拉取(在SAE控制台配置) +``` + +### 5.2 验证镜像 + +```powershell +# 1. 检查镜像是否存在 +docker images backend-service:v1.0 + +# 2. 查看镜像详细信息 +docker inspect backend-service:v1.0 + +# 3. 测试运行镜像(可选) +docker run -d ` + --name backend-test ` + -p 3001:3001 ` + -e DATABASE_URL="postgresql://..." ` + -e NODE_ENV=production ` + backend-service:v1.0 + +# 4. 查看容器日志 +docker logs backend-test + +# 5. 测试健康检查 +curl http://localhost:3001/health + +# 6. 清理测试容器 +docker stop backend-test +docker rm backend-test +``` + +--- + +## 6. 最佳实践 + +### 6.1 构建前检查清单 + +- [ ] 已完成Prisma反向同步(`npx prisma db pull`) +- [ ] 已生成Prisma Client(`npx prisma generate`) +- [ ] TypeScript编译成功(`npm run build`) +- [ ] dist目录已生成且包含所有编译后的JS文件 +- [ ] Docker Desktop已启动并运行 +- [ ] 网络连接正常 + +### 6.2 版本管理 + +**镜像标签规范:** +``` +v1.0 - 特定版本(推荐用于生产环境) +latest - 最新版本(用于测试环境) +v1.0.1 - Bug修复版本 +v1.1.0 - 功能更新版本 +``` + +**推送策略:** +```powershell +# 生产环境部署(推送特定版本) +docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0 + +# 测试环境部署(同时推送latest) +docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0 +docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest +``` + +### 6.3 构建优化 + +**1. 利用Docker缓存** +```dockerfile +# ✅ 先复制package.json,利用依赖缓存 +COPY package*.json ./ +RUN npm ci --production + +# ✅ 最后复制代码,代码变化不影响依赖层缓存 +COPY dist ./dist +``` + +**2. 使用.dockerignore** +``` +node_modules +.env +.env.* +dist # 本地dist通过COPY显式复制 +test +tests +*.md +.git +``` + +**3. 多阶段构建** +```dockerfile +# 阶段1:依赖安装 +FROM node:alpine AS builder +... + +# 阶段2:运行时镜像(更小) +FROM node:alpine +COPY --from=builder ... +``` + +### 6.4 安全建议 + +1. **不要在镜像中包含敏感信息** + - ❌ 不要把`.env`文件复制到镜像 + - ✅ 使用SAE环境变量注入配置 + +2. **使用非root用户运行** + ```dockerfile + RUN addgroup -g 1001 -S nodejs && \ + adduser -S nodejs -u 1001 + USER nodejs + ``` + +3. **定期更新基础镜像** + ```dockerfile + FROM node:alpine # 使用最新的Alpine版本 + ``` + +--- + +## 附录A:Dockerfile完整内容 + +```dockerfile +# ==================== 阶段 1: 依赖安装阶段 ==================== +FROM node:alpine AS builder + +# 替换Alpine镜像源为阿里云镜像(解决网络问题) +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories + +# 安装 Prisma 运行时依赖 +RUN apk add --no-cache openssl + +WORKDIR /app + +# 1. 复制依赖文件 +COPY package*.json ./ + +# 2. 复制 Prisma Schema(用于生成Prisma Client) +COPY prisma ./prisma/ + +# 3. 只安装生产依赖(大幅减少网络传输和安装时间) +RUN npm config set registry https://registry.npmmirror.com && \ + npm config set fetch-retry-mintimeout 20000 && \ + npm config set fetch-retry-maxtimeout 120000 && \ + npm config set fetch-retries 5 && \ + npm ci --production --prefer-offline --no-audit + +# 4. 生成 Prisma Client(生产环境需要) +RUN npx prisma generate + +# 5. 复制本地已编译好的 dist 文件夹(跳过TypeScript编译) +COPY dist ./dist + +# ==================== 阶段 2: 运行阶段 ==================== +FROM node:alpine + +# 替换Alpine镜像源为阿里云镜像(解决网络问题) +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories + +# 安装运行时依赖 + 时区数据 +RUN apk add --no-cache \ + openssl \ + curl \ + ca-certificates \ + tzdata + +# ⚠️ 统一时区:Asia/Shanghai +ENV TZ=Asia/Shanghai + +# 创建非 root 用户(安全最佳实践) +RUN addgroup -g 1001 -S nodejs && \ + adduser -S nodejs -u 1001 + +WORKDIR /app + +# 从构建阶段复制产物 +COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules +COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist +COPY --from=builder --chown=nodejs:nodejs /app/package*.json ./ +COPY --from=builder --chown=nodejs:nodejs /app/prisma ./prisma + +# 创建上传目录(用于临时文件) +RUN mkdir -p /app/uploads && chown -R nodejs:nodejs /app/uploads + +# 切换到非 root 用户 +USER nodejs + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ + CMD node -e "require('http').get('http://localhost:3001/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1); })" + +# 暴露端口 +EXPOSE 3001 + +# 🔥 启动命令(仅启动应用,不执行数据库迁移) +CMD ["node", "dist/index.js"] +``` + +--- + +## 附录B:.dockerignore完整内容 + +``` +# Node.js +node_modules +npm-debug.log +yarn-error.log + +# 开发文件 +.env +.env.* +*.local + +# 构建产物(改进方案B:使用本地编译好的dist) +# dist # 暂时注释掉,允许复制本地dist + +# 测试文件 +test +tests +*.test.ts +*.spec.ts +coverage + +# 文档和临时文件 +docs +*.md +.vscode +.idea +.DS_Store +Thumbs.db + +# 上传文件(运行时生成) +uploads/* + +# Git +.git +.gitignore + +# 日志 +*.log +logs + +# 临时文件 +temp +tmp +*.swp +*.swo +*~ + +# 数据库文件(SQLite,如果有) +*.db +*.sqlite + +# 脚本文件(仅开发使用) +scripts/*.ts +*.bat +*.ps1 +``` + +--- + +## 附录C:相关文档 + +- [Node.js后端-SAE容器部署指南](./05-Node.js后端-SAE容器部署指南.md) +- [部署进度总览](./00-部署进度总览.md) +- [PostgreSQL数据库部署操作手册](./08-PostgreSQL数据库部署操作手册.md) +- [Python微服务-SAE部署操作手册](./09-Python微服务-SAE部署操作手册.md) + +--- + +**文档维护者**: AI Assistant +**最后更新**: 2024-12-24 +**版本**: v1.0 + + diff --git a/docs/05-部署文档/文档修正报告-20251214.md b/docs/05-部署文档/文档修正报告-20251214.md index c5dbc277..2c2867b1 100644 --- a/docs/05-部署文档/文档修正报告-20251214.md +++ b/docs/05-部署文档/文档修正报告-20251214.md @@ -476,3 +476,4 @@ NAT网关成本¥100/月,对初创团队是一笔开销 + diff --git a/docs/07-运维文档/03-SAE环境变量配置指南.md b/docs/07-运维文档/03-SAE环境变量配置指南.md index 925ac98c..085e3aa7 100644 --- a/docs/07-运维文档/03-SAE环境变量配置指南.md +++ b/docs/07-运维文档/03-SAE环境变量配置指南.md @@ -381,3 +381,4 @@ curl http://你的SAE地址:3001/health + diff --git a/docs/07-运维文档/05-Redis缓存与队列的区别说明.md b/docs/07-运维文档/05-Redis缓存与队列的区别说明.md index 32bf4ba9..c2c2a2a2 100644 --- a/docs/07-运维文档/05-Redis缓存与队列的区别说明.md +++ b/docs/07-运维文档/05-Redis缓存与队列的区别说明.md @@ -713,3 +713,4 @@ const job = await queue.getJob(jobId); + diff --git a/docs/07-运维文档/06-长时间任务可靠性分析.md b/docs/07-运维文档/06-长时间任务可靠性分析.md index 977b3845..40d06f1a 100644 --- a/docs/07-运维文档/06-长时间任务可靠性分析.md +++ b/docs/07-运维文档/06-长时间任务可靠性分析.md @@ -480,3 +480,4 @@ processLiteraturesInBackground(task.id, projectId, testLiteratures); + diff --git a/docs/07-运维文档/07-Redis使用需求分析(按模块).md b/docs/07-运维文档/07-Redis使用需求分析(按模块).md index 515864b2..576d940d 100644 --- a/docs/07-运维文档/07-Redis使用需求分析(按模块).md +++ b/docs/07-运维文档/07-Redis使用需求分析(按模块).md @@ -957,3 +957,4 @@ ROI = (¥22,556 - ¥144) / ¥144 × 100% = 15,564% + diff --git a/docs/08-项目管理/03-每周计划/2025-12-13-Postgres-Only架构改造完成.md b/docs/08-项目管理/03-每周计划/2025-12-13-Postgres-Only架构改造完成.md index 55873b24..fe4e2971 100644 --- a/docs/08-项目管理/03-每周计划/2025-12-13-Postgres-Only架构改造完成.md +++ b/docs/08-项目管理/03-每周计划/2025-12-13-Postgres-Only架构改造完成.md @@ -1014,3 +1014,4 @@ Redis 实例:¥500/月 + diff --git a/docs/08-项目管理/05-技术债务/通用对话服务抽取计划.md b/docs/08-项目管理/05-技术债务/通用对话服务抽取计划.md index d4a2ac5b..750bcd80 100644 --- a/docs/08-项目管理/05-技术债务/通用对话服务抽取计划.md +++ b/docs/08-项目管理/05-技术债务/通用对话服务抽取计划.md @@ -470,5 +470,6 @@ import { ChatContainer } from '@/shared/components/Chat'; + diff --git a/extraction_service/.dockerignore b/extraction_service/.dockerignore index d7225ab4..bdabf092 100644 --- a/extraction_service/.dockerignore +++ b/extraction_service/.dockerignore @@ -47,3 +47,4 @@ models/ *.onnx + diff --git a/extraction_service/operations/__init__.py b/extraction_service/operations/__init__.py index 80f980c5..145fa7b6 100644 --- a/extraction_service/operations/__init__.py +++ b/extraction_service/operations/__init__.py @@ -33,5 +33,6 @@ __version__ = '1.0.0' + diff --git a/extraction_service/operations/dropna.py b/extraction_service/operations/dropna.py index 7f602ac4..6085a244 100644 --- a/extraction_service/operations/dropna.py +++ b/extraction_service/operations/dropna.py @@ -166,5 +166,6 @@ def get_missing_summary(df: pd.DataFrame) -> dict: + diff --git a/extraction_service/operations/filter.py b/extraction_service/operations/filter.py index 9105a921..9e12a001 100644 --- a/extraction_service/operations/filter.py +++ b/extraction_service/operations/filter.py @@ -126,5 +126,6 @@ def apply_filter( + diff --git a/extraction_service/operations/unpivot.py b/extraction_service/operations/unpivot.py index 4095e911..a4536781 100644 --- a/extraction_service/operations/unpivot.py +++ b/extraction_service/operations/unpivot.py @@ -292,3 +292,4 @@ def get_unpivot_preview( + diff --git a/extraction_service/test_dc_api.py b/extraction_service/test_dc_api.py index eb1eb685..2d933781 100644 --- a/extraction_service/test_dc_api.py +++ b/extraction_service/test_dc_api.py @@ -300,5 +300,6 @@ if __name__ == "__main__": + diff --git a/extraction_service/test_execute_simple.py b/extraction_service/test_execute_simple.py index 944bcc03..18793069 100644 --- a/extraction_service/test_execute_simple.py +++ b/extraction_service/test_execute_simple.py @@ -66,5 +66,6 @@ except Exception as e: + diff --git a/extraction_service/test_module.py b/extraction_service/test_module.py index 0f5d9941..674179ae 100644 --- a/extraction_service/test_module.py +++ b/extraction_service/test_module.py @@ -46,5 +46,6 @@ except Exception as e: + diff --git a/frontend-v2/.dockerignore b/frontend-v2/.dockerignore index 1a20b1dd..756449aa 100644 --- a/frontend-v2/.dockerignore +++ b/frontend-v2/.dockerignore @@ -67,3 +67,4 @@ vite.config.*.timestamp-* + diff --git a/frontend-v2/docker-entrypoint.sh b/frontend-v2/docker-entrypoint.sh index a1c6218c..bb431b84 100644 --- a/frontend-v2/docker-entrypoint.sh +++ b/frontend-v2/docker-entrypoint.sh @@ -34,3 +34,4 @@ exec nginx -g 'daemon off;' + diff --git a/frontend-v2/nginx.conf b/frontend-v2/nginx.conf index 51380236..d22501ff 100644 --- a/frontend-v2/nginx.conf +++ b/frontend-v2/nginx.conf @@ -190,3 +190,4 @@ http { + diff --git a/frontend-v2/src/modules/asl/components/FulltextDetailDrawer.tsx b/frontend-v2/src/modules/asl/components/FulltextDetailDrawer.tsx index d9fb1016..f9932b65 100644 --- a/frontend-v2/src/modules/asl/components/FulltextDetailDrawer.tsx +++ b/frontend-v2/src/modules/asl/components/FulltextDetailDrawer.tsx @@ -535,5 +535,6 @@ export default FulltextDetailDrawer; + diff --git a/frontend-v2/src/modules/dc/hooks/useAssets.ts b/frontend-v2/src/modules/dc/hooks/useAssets.ts index be07e13d..cdf6a194 100644 --- a/frontend-v2/src/modules/dc/hooks/useAssets.ts +++ b/frontend-v2/src/modules/dc/hooks/useAssets.ts @@ -128,5 +128,6 @@ export const useAssets = (activeTab: AssetTabType) => { + diff --git a/frontend-v2/src/modules/dc/hooks/useRecentTasks.ts b/frontend-v2/src/modules/dc/hooks/useRecentTasks.ts index 113a4642..e4fd1fd7 100644 --- a/frontend-v2/src/modules/dc/hooks/useRecentTasks.ts +++ b/frontend-v2/src/modules/dc/hooks/useRecentTasks.ts @@ -118,5 +118,6 @@ export const useRecentTasks = () => { + diff --git a/frontend-v2/src/modules/dc/pages/tool-c/components/DropnaDialog.tsx b/frontend-v2/src/modules/dc/pages/tool-c/components/DropnaDialog.tsx index ef50cfac..3825b44b 100644 --- a/frontend-v2/src/modules/dc/pages/tool-c/components/DropnaDialog.tsx +++ b/frontend-v2/src/modules/dc/pages/tool-c/components/DropnaDialog.tsx @@ -317,5 +317,6 @@ export default DropnaDialog; + diff --git a/frontend-v2/src/modules/dc/pages/tool-c/components/MetricTimePanel.tsx b/frontend-v2/src/modules/dc/pages/tool-c/components/MetricTimePanel.tsx index 890ff0be..15c70bf9 100644 --- a/frontend-v2/src/modules/dc/pages/tool-c/components/MetricTimePanel.tsx +++ b/frontend-v2/src/modules/dc/pages/tool-c/components/MetricTimePanel.tsx @@ -404,3 +404,4 @@ export default MetricTimePanel; + diff --git a/frontend-v2/src/modules/dc/pages/tool-c/components/PivotPanel.tsx b/frontend-v2/src/modules/dc/pages/tool-c/components/PivotPanel.tsx index fc107c41..51e3302b 100644 --- a/frontend-v2/src/modules/dc/pages/tool-c/components/PivotPanel.tsx +++ b/frontend-v2/src/modules/dc/pages/tool-c/components/PivotPanel.tsx @@ -290,3 +290,4 @@ export default PivotPanel; + diff --git a/frontend-v2/src/modules/dc/pages/tool-c/hooks/useSessionStatus.ts b/frontend-v2/src/modules/dc/pages/tool-c/hooks/useSessionStatus.ts index 98a36d9b..942c9c60 100644 --- a/frontend-v2/src/modules/dc/pages/tool-c/hooks/useSessionStatus.ts +++ b/frontend-v2/src/modules/dc/pages/tool-c/hooks/useSessionStatus.ts @@ -90,3 +90,4 @@ export function useSessionStatus({ + diff --git a/frontend-v2/src/modules/dc/pages/tool-c/types/index.ts b/frontend-v2/src/modules/dc/pages/tool-c/types/index.ts index 08d04cef..c9180a90 100644 --- a/frontend-v2/src/modules/dc/pages/tool-c/types/index.ts +++ b/frontend-v2/src/modules/dc/pages/tool-c/types/index.ts @@ -80,5 +80,6 @@ export interface DataStats { + diff --git a/frontend-v2/src/modules/dc/types/portal.ts b/frontend-v2/src/modules/dc/types/portal.ts index 9281b2a3..0961deeb 100644 --- a/frontend-v2/src/modules/dc/types/portal.ts +++ b/frontend-v2/src/modules/dc/types/portal.ts @@ -76,5 +76,6 @@ export type AssetTabType = 'all' | 'processed' | 'raw'; + diff --git a/frontend-v2/src/shared/components/index.ts b/frontend-v2/src/shared/components/index.ts index 5951df33..79614464 100644 --- a/frontend-v2/src/shared/components/index.ts +++ b/frontend-v2/src/shared/components/index.ts @@ -31,5 +31,6 @@ export { default as Placeholder } from './Placeholder'; + diff --git a/frontend-v2/src/vite-env.d.ts b/frontend-v2/src/vite-env.d.ts index ca7136a0..4311b761 100644 --- a/frontend-v2/src/vite-env.d.ts +++ b/frontend-v2/src/vite-env.d.ts @@ -13,3 +13,4 @@ interface ImportMeta { + diff --git a/python-microservice/operations/__init__.py b/python-microservice/operations/__init__.py index 80f980c5..145fa7b6 100644 --- a/python-microservice/operations/__init__.py +++ b/python-microservice/operations/__init__.py @@ -33,5 +33,6 @@ __version__ = '1.0.0' + diff --git a/python-microservice/operations/binning.py b/python-microservice/operations/binning.py index 064f8ca7..57db4a62 100644 --- a/python-microservice/operations/binning.py +++ b/python-microservice/operations/binning.py @@ -140,5 +140,6 @@ def apply_binning( + diff --git a/python-microservice/operations/filter.py b/python-microservice/operations/filter.py index 9105a921..9e12a001 100644 --- a/python-microservice/operations/filter.py +++ b/python-microservice/operations/filter.py @@ -126,5 +126,6 @@ def apply_filter( + diff --git a/python-microservice/operations/recode.py b/python-microservice/operations/recode.py index 443f73a1..efa85f5f 100644 --- a/python-microservice/operations/recode.py +++ b/python-microservice/operations/recode.py @@ -96,5 +96,6 @@ def apply_recode( + diff --git a/recover_dc_code.py b/recover_dc_code.py index aed6e9c9..25de795a 100644 --- a/recover_dc_code.py +++ b/recover_dc_code.py @@ -240,5 +240,6 @@ if __name__ == "__main__": + diff --git a/run_recovery.ps1 b/run_recovery.ps1 index 4e7c516d..b352bec8 100644 --- a/run_recovery.ps1 +++ b/run_recovery.ps1 @@ -64,5 +64,6 @@ Write-Host "==================================================================== + diff --git a/t === Checking Git status === -ForegroundColor Cyan b/t === Checking Git status === -ForegroundColor Cyan new file mode 100644 index 00000000..dd8eb5eb --- /dev/null +++ b/t === Checking Git status === -ForegroundColor Cyan @@ -0,0 +1,120 @@ +commit ef967d7d7cb1a731d36a6568e5b0b0c1e34e71aa (HEAD -> master, origin/master) +Author: HaHafeng +AuthorDate: Wed Dec 24 22:12:00 2025 +0800 +Commit: HaHafeng +CommitDate: Wed Dec 24 22:12:00 2025 +0800 + + build(backend): Complete Node.js backend deployment preparation + + Major changes: + - Add Docker configuration (Dockerfile, .dockerignore) + - Fix 200+ TypeScript compilation errors + - Add Prisma schema relations for all models (30+ relations) + - Update tsconfig.json to relax non-critical checks + - Optimize Docker build with local dist strategy + + Technical details: + - Exclude test files from TypeScript compilation + - Add manual relations for ASL, PKB, DC, AIA modules + - Use type assertions for JSON/Buffer compatibility + - Fix pg-boss, extractionWorker, and other legacy code issues + + Build result: + - Docker image: 838MB (compressed ~186MB) + - Successfully pushed to ACR + - Zero TypeScript compilation errors + + Related docs: + - Update deployment documentation + - Add Python microservice SAE deployment guide + + DC模块代码恢复指南.md | 1 + + backend/.dockerignore | 55 + + backend/.env.backup | 31 + + backend/Dockerfile | 74 ++ + .../add_data_stats_to_tool_c_session.sql | 1 + + .../001_add_postgres_cache_and_checkpoint.sql | 1 + + .../prisma/manual-migrations/run-migration-002.ts | 1 + + .../20251208_add_column_mapping/migration.sql | 1 + + .../prisma/migrations/create_tool_c_session.sql | 1 + + backend/prisma/schema.prisma | 1350 +++++++++----------- + backend/recover-code-from-cursor-db.js | 1 + + backend/scripts/check-dc-tables.mjs | 1 + + backend/scripts/create-tool-c-ai-history-table.mjs | 1 + + backend/scripts/create-tool-c-table.js | 1 + + backend/scripts/create-tool-c-table.mjs | 1 + + backend/src/common/jobs/PgBossQueue.ts | 5 +- + backend/src/common/jobs/utils.ts | 1 + + .../legacy/controllers/conversationController.ts | 2 +- + backend/src/legacy/controllers/reviewController.ts | 2 +- + backend/src/legacy/services/batchService.ts | 2 +- + .../modules/asl/controllers/projectController.ts | 8 +- + .../__tests__/api-integration-test.ts | 1 + + .../__tests__/e2e-real-test-v2.ts | 1 + + .../__tests__/fulltext-screening-api.http | 1 + + .../fulltext-screening/services/ExcelExporter.ts | 5 +- + .../services/FulltextScreeningService.ts | 10 +- + .../modules/asl/services/llmScreeningService.ts | 2 +- + .../dc/tool-b/services/ConflictDetectionService.ts | 1 + + .../modules/dc/tool-b/services/TemplateService.ts | 5 +- + .../modules/dc/tool-b/workers/extractionWorker.ts | 1 + + backend/src/modules/dc/tool-c/README.md | 1 + + .../dc/tool-c/controllers/StreamAIController.ts | 1 + + .../modules/dc/tool-c/services/SessionService.ts | 6 +- + backend/src/tests/README.md | 1 + + backend/src/tests/verify-test1-database.sql | 1 + + backend/src/tests/verify-test1-database.ts | 1 + + backend/src/types/global.d.ts | 1 + + backend/sync-dc-database.ps1 | 1 + + backend/test-tool-c-advanced-scenarios.mjs | 1 + + backend/test-tool-c-day2.mjs | 1 + + backend/test-tool-c-day3.mjs | 1 + + backend/tsconfig.json | 16 +- + deploy-to-sae.ps1 | 1 + + docs/00-系统总体设计/00-系统当前状态与开发指南.md | 2 +- + .../02-通用能力层/Postgres-Only异步任务处理指南.md | 1 + + docs/02-通用能力层/通用能力层技术债务清单.md | 1 + + .../04-开发计划/05-全文复筛前端开发计划.md | 1 + + .../05-开发记录/2025-01-23_全文复筛前端开发完成.md | 1 + + .../05-开发记录/2025-01-23_全文复筛前端逻辑调整.md | 1 + + .../05-开发记录/2025-11-23_Day5_全文复筛API开发.md | 1 + + .../04-开发计划/工具C_AI_Few-shot示例库.md | 1 + + .../04-开发计划/工具C_Bug修复总结_2025-12-08.md | 1 + + .../DC-数据清洗整理/04-开发计划/工具C_Day3开发计划.md | 1 + + .../04-开发计划/工具C_Day4-5前端开发计划.md | 1 + + .../04-开发计划/工具C_Pivot列顺序优化总结.md | 1 + + .../04-开发计划/工具C_方案B实施总结_2025-12-09.md | 1 + + .../04-开发计划/工具C_缺失值处理_开发进度_2025-12-10.md | 1 + + .../04-开发计划/工具C_缺失值处理功能_更新说明.md | 1 + + .../DC-数据清洗整理/06-开发记录/2025-12-02_工作总结.md | 1 + + .../06-开发记录/2025-12-06_工具C_Day1开发完成总结.md | 1 + + .../06-开发记录/2025-12-06_工具C_Day2开发完成总结.md | 1 + + .../06-开发记录/2025-12-07_AI对话核心功能增强总结.md | 1 + + .../06-开发记录/2025-12-07_Bug修复_DataGrid空数据防御.md | 1 + + .../06-开发记录/2025-12-07_Day5_Ant-Design-X重构完成.md | 1 + + .../06-开发记录/2025-12-07_Day5最终总结.md | 1 + + .../06-开发记录/2025-12-07_UI优化与Bug修复.md | 1 + + .../06-开发记录/2025-12-07_后端API完整对接完成.md | 1 + + .../06-开发记录/2025-12-07_完整UI优化与功能增强.md | 1 + + .../06-开发记录/2025-12-07_工具C_Day4前端基础完成.md | 1 + + .../06-开发记录/DC模块重建完成总结-Day1.md | 1 + + .../06-开发记录/Phase1-Portal页面开发完成-2025-12-02.md | 1 + + .../06-开发记录/Phase2-ToolB-Step1-2开发完成-2025-12-03.md | 1 + + .../06-开发记录/Portal页面UI优化-2025-12-02.md | 1 + + .../06-开发记录/Tool-B-MVP完成总结-2025-12-03.md | 1 + + .../06-开发记录/ToolB-UI优化-2025-12-03.md | 1 + + .../06-开发记录/ToolB-UI优化-Round2-2025-12-03.md | 1 + + .../06-开发记录/ToolB浏览器测试计划-2025-12-03.md | 1 + + .../06-开发记录/后端API测试报告-2025-12-02.md | 1 + + .../DC-数据清洗整理/06-开发记录/待办事项-下一步工作.md | 1 + + .../06-开发记录/数据库验证报告-2025-12-02.md | 1 + + .../DC-数据清洗整理/07-技术债务/Tool-B技术债务清单.md | 1 + + docs/05-部署文档/00-部署进度总览.md | 27 +- + docs/05-部署文档/02-SAE部署完全指南(产品经理版).md | 1 + + docs/05-部署文档/07-前端Nginx-SAE部署操作手册.md | 1 + + .../05-部署文档/08-PostgreSQL数据库部署操作手册.md | 1 + + .../05-部署文档/09-Python微服务-SAE部署操作手册.md | 844 ++++++++++++ + docs/05-部署文档/文档修正报告-20251214.md | 1 + + docs/07-运维文档/03-SAE环境变量配置指南.md | 1 + + docs/07-运维文档/05-Redis缓存与队列的区别说明.md | 1 + + docs/07-运维文档/06-长时间任务可靠性分析.md | 1 + \ No newline at end of file diff --git a/tests/QUICKSTART_快速开始.md b/tests/QUICKSTART_快速开始.md index dc5d5fa5..9a2356f1 100644 --- a/tests/QUICKSTART_快速开始.md +++ b/tests/QUICKSTART_快速开始.md @@ -113,3 +113,4 @@ INFO: Uvicorn running on http://0.0.0.0:8001 + diff --git a/tests/README_测试说明.md b/tests/README_测试说明.md index 3cce9fe2..26c04980 100644 --- a/tests/README_测试说明.md +++ b/tests/README_测试说明.md @@ -269,3 +269,4 @@ df_numeric.to_excel('test_data/numeric_test.xlsx', index=False) + diff --git a/tests/run_tests.bat b/tests/run_tests.bat index f5af4c06..661d2dea 100644 --- a/tests/run_tests.bat +++ b/tests/run_tests.bat @@ -64,3 +64,4 @@ pause + diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 78058301..832cd973 100644 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -60,3 +60,4 @@ echo "========================================" + diff --git a/快速部署到SAE.md b/快速部署到SAE.md index 4f0ae57f..815b6294 100644 --- a/快速部署到SAE.md +++ b/快速部署到SAE.md @@ -325,3 +325,4 @@ OSS AccessKeySecret:_______________ + diff --git a/部署检查清单.md b/部署检查清单.md index 4acc69b8..572121c9 100644 --- a/部署检查清单.md +++ b/部署检查清单.md @@ -361,3 +361,4 @@ OSS配置: +