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,48 +1,48 @@
# AI銝游<EFBFBD><EFBFBD>𠉛弦撟喳蝱 - <20>亙虜<E4BA99>湔鰵敹恍<E695B9><E6818D><EFBFBD>雿𨀣<E99BBF><F0A880A3>?
# AI临床研究平台 - 日常更新快速操作手册
> **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*嚗𡁏𠯫撣詨<E692A3><E8A9A8>賣凒<E8B3A3><EFBFBD>敹恍<E695B9><E6818D><EFBFBD>雿𨀣<E99BBF><F0A880A3>?
> **文档用途**:日常功能更新的快速操作指南
> **目标用户**开发团队、运维人员、AI助手
> **<EFBFBD>湔鰵<EFBFBD>園𡢿**嚗?025-12-25
> **更新时间**2025-12-25
> **特点**:短小精悍、关键信息密集、可直接复制执行
---
## 🎯 使用说明
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鍂鈭?*嚗?
- <EFBFBD>?<3F>亙虜<E4BA99><EFBFBD><E8A098>湔鰵嚗<E9B0B5><EFBFBD>嫣誨<E5ABA3><E8AAA8><EFBFBD><EFBFBD>湔鰵<E6B994>函蔡嚗?
- <EFBFBD>?敹恍<E695B9>蠘翮隞<E7BFAE><E99A9E>瘥誩予/瘥誩𪂹<E8AAA9>湔鰵嚗?
- <EFBFBD>?<3F><EFBFBD><EFBD81><EFBFBD><EFBFBD><E59A97>隞碶犖<E7A2B6>䨝I敹恍<E695B9><EFBFBD><E785BA><EFBFBD>
**本文档适用于**
- ✅ 日常功能更新(修改代码后更新部署)
- ✅ 快速迭代(每天/每周更新)
- ✅ 团队协作其他人或AI快速上手
**銝漤<EFBFBD><EFBFBD>鍂鈭?*嚗?
- <EFBFBD>?擐𡝗活摰峕㟲<E5B395>函蔡嚗<E894A1><EFBFBD>?`17-摰峕㟲<E5B395>函蔡摰墧<E691B0><E5A2A7><EFBFBD>-2025<EFBFBD>?md`嚗?
- <EFBFBD>?<3F><EFBFBD><E887AC><EFBFBD>靽格㺿嚗<E3BABF><EFBFBD>𧢲𧋦<F0A7A2B2><F0A78BA6>﹝蝚?<3F><><EFBFBD>
- <EFBFBD>?<3F><EFBFBD><E6A185>埝䰻嚗<E4B0BB><EFBFBD>?`15-Node.js<6A>𡒊垢-<2D>函蔡<E587BD>𣂼<EFBFBD><F0A382BC><EFBFBD>.md`嚗?
**不适用于**
- ❌ 首次完整部署(请看 `17-完整部署实战手册-2025版.md`
- ❌ 环境变量修改请看本文档第5节
- ❌ 问题排查(请看 `15-Node.js后端-部署成功总结.md`
---
## <EFBFBD>𣑐 銝<><E98A9D><EFBFBD><EFBFBD>蝵桐縑<E6A190><EFBFBD><EFBFBD>粉5<E7B289><35><EFBFBD>嚗?
## 📦 一、前置信息必读5分钟
### 1.1 ACR镜像仓库信息
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
**登录凭证**
```bash
Registry: crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
<EFBFBD><EFBFBD><EFBFBD>? gofeng117@163.com
用户名: gofeng117@163.com
密码: fengzhibo117
```
**<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
**镜像地址格式**
```bash
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦<EFBFBD>唳綫<EFBFBD><EFBFBD>鍂嚗?
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/<隞枏<EFBFBD><EFBFBD>?:<<3C><>𧋦<EFBFBD>?
# 公网地址(本地推送用)
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/<仓库名>:<版本号>
# VPC地址SAE拉取用
crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/<隞枏<EFBFBD><EFBFBD>?:<<3C><>𧋦<EFBFBD>?
crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/<仓库名>:<版本号>
```
**3銝芷<EFBFBD><EFBFBD><EFBFBD>摨?*嚗?
- `python-extraction` - Python敺格<EFBFBD><EFBFBD>?
**3个镜像仓库**
- `python-extraction` - Python微服务
- `backend-service` - Node.js后端
- `ai-clinical_frontend-nginx` - 前端Nginx
@@ -52,33 +52,33 @@ crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/<仓
| 应用名称 | 服务 | 当前版本 | 内网地址 |
|---------|------|---------|---------|
| `python-extraction-test` | Python敺格<EFBFBD><EFBFBD>?| v1.0 | 172.17.173.66:8000 |
| `python-extraction-test` | Python微服务 | v1.0 | 172.17.173.66:8000 |
| `nodejs-backend-test` | Node.js后端 | v1.3 | 172.17.173.73:3001 |
| `frontend-nginx-service` | 前端Nginx | v1.0 | 172.17.173.72:80 |
**SAE<EFBFBD><EFBFBD><EFBFBD>?*嚗冴ttps://sae.console.aliyun.com/
**SAE控制台**https://sae.console.aliyun.com/
---
### 1.3 <EFBFBD><EFBFBD>𧋦<EFBFBD><EFBFBD><EFBFBD>?
### 1.3 版本号规范
**霂凋<EFBFBD><EFBFBD>𣇉<EFBFBD><EFBFBD>?*嚗䫤v銝餌<E98A9D><E9A48C>?甈∠<E79488><E288A0>?靽株恥<E6A0AA>
**语义化版本**`v主版本.次版本.修订号`
```bash
v1.0 <EFBFBD>?擐𡝗活<F0A19D97>函蔡
v1.1 <EFBFBD>?<3F><EFBFBD><E8A098>湔鰵
v1.2 <EFBFBD>?<3F><EFBFBD><E8A098>湔鰵
v1.3 <EFBFBD>?<3F><EFBFBD><E8A098>湔鰵
v2.0 <EFBFBD>?<3F>滚之<E6BB9A>湔鰵
v1.0 → 首次部署
v1.1 → 功能更新
v1.2 → 功能更新
v1.3 → 功能更新
v2.0 → 重大更新
```
**撱箄悅**嚗𡁏<E59A97>甈⊥凒<E28AA5><EFBFBD><EFBFBD>甈∠<E79488><E288A0>砍噡嚗ǒ1.3 <EFBFBD>?v1.4嚗?
**建议**每次更新递增次版本号v1.3 v1.4
---
## 🚀 二、更新Node.js后端最常用⭐⭐⭐⭐⭐
### 甇仿炊1嚗𡁏𧋦<EFBFBD><EFBFBD>撱綽<EFBFBD>5<EFBFBD><EFBFBD><EFBFBD>嚗?
### 步骤1本地构建5分钟
```bash
# 进入后端目录
@@ -89,17 +89,17 @@ npm run build
# 验证编译结果
dir dist
# 摨磰砲<EFBFBD><EFBFBD>嚗餜ndex.js, common/, modules/ 蝑?
# 应该看到index.js, common/, modules/
# <EFBFBD><EFBFBD>Docker<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>砍噡<EFBFBD><EFBFBD>嚗?
# 构建Docker镜像(版本号递增)
docker build -t backend-service:v1.4 .
```
**<EFBFBD><EFBFBD>園𡢿**嚗?<3F><><EFBFBD>
**预计时间**5分钟
---
### 甇仿炊2嚗𡁏綫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ACR嚗?0<><30><EFBFBD>嚗?
### 步骤2推送镜像到ACR10分钟
```bash
# 1. 登录ACR首次需要
@@ -107,36 +107,36 @@ docker login --username=gofeng117@163.com \
--password=fengzhibo117 \
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
# 2. <EFBFBD>𤘪<EFBFBD>蝑?
# 2. 打标签
docker tag backend-service:v1.4 \
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.4
# 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
# 3. 推送镜像
docker push \
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.4
# 蝑匧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝥?0<><30><EFBFBD>嚗屸<E59A97><E5B1B8>讐漲838MB嚗?
# 等待推送完成约10分钟镜像约838MB
# 看到 "digest: sha256:..." 表示成功
```
**<EFBFBD><EFBFBD>園𡢿**嚗?0<><30><EFBFBD>
**预计时间**10分钟
---
### 甇仿炊3嚗𡁜銁SAE<EFBFBD>湔鰵摨𠉛鍂嚗?<3F><><EFBFBD>嚗?
### 步骤3在SAE更新应用3分钟
**<EFBFBD><EFBFBD>1嚗阳eb<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?*
**方式1Web控制台推荐**
1. 登录SAEhttps://sae.console.aliyun.com/
2. 进入应用:`nodejs-backend-test`
3. <EFBFBD>孵稬<EFBFBD><EFBFBD>蝵脣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
4. <EFBFBD>滨蔭<EFBFBD><EFBFBD>㺭嚗?
3. 点击【部署应用】按钮
4. 配置参数:
```yaml
镜像地址: 选择 backend-service
镜像版本: 选择 v1.4
```
5. <EFBFBD>孵稬<EFBFBD>霈扎<EFBFBD>?
6. 蝑匧<EFBFBD><EFBFBD>函蔡摰峕<EFBFBD><EFBFBD>漲5-8<><38><EFBFBD>嚗?
5. 点击【确认】
6. 等待部署完成约5-8分钟
**方式2命令行高级**
@@ -147,31 +147,31 @@ aliyun sae DeployApplication \
--ImageUrl crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.4
```
**<EFBFBD><EFBFBD>園𡢿**嚗?<3F><><EFBFBD><EFBFBD><EFBFBD> + 5-8<><38><EFBFBD>蝑匧<E89D91><E58CA7>函蔡
**预计时间**3分钟操作 + 5-8分钟等待部署
---
### 甇仿炊4嚗𡁻<EFBFBD><EFBFBD><EFBFBD>蝵莎<EFBFBD>2<EFBFBD><EFBFBD><EFBFBD>嚗?
### 步骤4验证部署2分钟
```bash
# 1. <EFBFBD><EFBFBD>摨𠉛鍂<EFBFBD><EFBFBD>?
# SAE<EFBFBD><EFBFBD><EFBFBD>?<3F>?摰硺<E691B0><E7A1BA>函蔡 <20>?<3F><EFBFBD><E59786><EFBFBD>銝?"Running"
# 1. 查看应用状态
# SAE控制台 → 实例部署 → 状态应为 "Running"
# 2. 查看日志(确认启动成功)
# SAE<EFBFBD><EFBFBD><EFBFBD>?<3F>?<3F><EFBFBD><E4BA99>亥砭 <20>?摨磰砲<E7A3B0><EFBFBD>嚗?
# SAE控制台 → 日志查询 → 应该看到:
# "🚀 AI临床研究平台 - 后端服务器启动成功!"
# 3. <EFBFBD>亙熒璉<EFBFBD><EFBFBD>?
# 3. 健康检查
curl http://172.17.173.73:3001/health
# 或通过公网
curl http://8.140.53.236/api/v1/health
# 4. 功能测试
# 访问前端http://8.140.53.236/
# 瘚贝<EFBFBD><EFBFBD>湔鰵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
# 测试更新的功能
```
**<EFBFBD><EFBFBD>園𡢿**嚗?<3F><><EFBFBD>
**预计时间**2分钟
---
@@ -180,68 +180,68 @@ curl http://8.140.53.236/api/v1/health
| 步骤 | 操作 | 时间 |
|------|------|------|
| 1 | 本地构建 | 5分钟 |
| 2 | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| 10<EFBFBD><EFBFBD><EFBFBD> |
| 2 | 推送镜像 | 10分钟 |
| 3 | SAE部署 | 3分钟操作 + 5-8分钟等待 |
| 4 | 验证 | 2分钟 |
| **总计** | - | **20-25分钟** |
---
## <EFBFBD>綫 銝剹<E98A9D><E589B9><EFBFBD><EFBFBD>蝡烤ginx嚗<78>活撣貊鍂嚗争<E59A97>潃鐥<E6BD83>潃?
## 🎨 三、更新前端Nginx次常用⭐⭐⭐⭐
### 甇仿炊1嚗𡁏𧋦<EFBFBD><EFBFBD>撱綽<EFBFBD>10<EFBFBD><EFBFBD><EFBFBD>嚗?
### 步骤1本地构建10分钟
```bash
# 进入前端目录
cd D:\MyCursor\AIclinicalresearch\frontend-v2
# <EFBFBD><EFBFBD>Docker<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>砍噡<EFBFBD><EFBFBD>嚗?
# 构建Docker镜像(版本号递增)
docker build -t ai-clinical_frontend-nginx:v1.1 .
# 瘜冽<EFBFBD>嚗鋽ockerfile隡朞䌊<EFBFBD><EFBFBD>銵?npm run build
# 注意Dockerfile会自动执行 npm run build
```
**<EFBFBD><EFBFBD>園𡢿**嚗?0<><30><EFBFBD><EFBFBD><E59A97><EFBFBD>俘eact<63><74>遣嚗?
**预计时间**10分钟包含React构建
---
### 甇仿炊2嚗𡁏綫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ACR嚗?<3F><><EFBFBD>嚗?
### 步骤2推送镜像到ACR3分钟
```bash
# 1. <EFBFBD>𤘪<EFBFBD>蝑?
# 1. 打标签
docker tag ai-clinical_frontend-nginx:v1.1 \
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.1
# 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
# 2. 推送镜像
docker push \
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.1
# 蝑匧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝥?<3F><><EFBFBD>嚗屸<E59A97><E5B1B8>讐漲50MB嚗?
# 等待推送完成约3分钟镜像约50MB
```
**<EFBFBD><EFBFBD>園𡢿**嚗?<3F><><EFBFBD>
**预计时间**3分钟
---
### 甇仿炊3嚗𡁜銁SAE<EFBFBD>湔鰵摨𠉛鍂嚗?<3F><><EFBFBD>嚗?
### 步骤3在SAE更新应用3分钟
1. 登录SAEhttps://sae.console.aliyun.com/
2. 进入应用:`frontend-nginx-service`
3. <20>孵稬<E5ADB5><EFBFBD>蝵脣<E89DB5><E884A3><EFBFBD>?
3. 点击【部署应用】
4. 选择镜像版本:`v1.1`
5. 确认部署
**<EFBFBD><EFBFBD>園𡢿**嚗?<3F><><EFBFBD><EFBFBD><EFBFBD> + 3-5<><35><EFBFBD>蝑匧<E89D91>
**预计时间**3分钟操作 + 3-5分钟等待
---
### 甇仿炊4嚗𡁻<EFBFBD><EFBFBD><EFBFBD>蝵莎<EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>嚗?
### 步骤4验证部署1分钟
```bash
# 访问前端
open http://8.140.53.236/
# <EFBFBD>?
#
curl http://8.140.53.236/
```
@@ -249,9 +249,9 @@ curl http://8.140.53.236/
---
## <EFBFBD><EFBFBD> <20><EFBFBD><E49C98><EFBFBD>訐ython敺格<E695BA><E6A0BC><EFBFBD><EFBFBD><E9A2B2><EFBFBD><EFBFBD>潃鐥<E6BD83>潃?
## 🐍 四、更新Python微服务较少用⭐⭐⭐
### 甇仿炊1嚗𡁏𧋦<EFBFBD><EFBFBD>撱綽<EFBFBD>15<EFBFBD><EFBFBD><EFBFBD>嚗?
### 步骤1本地构建15分钟
```bash
# 进入Python服务目录
@@ -261,27 +261,27 @@ cd D:\MyCursor\AIclinicalresearch\extraction_service
docker build -t python-extraction:v1.1 .
```
**<EFBFBD><EFBFBD>園𡢿**嚗?5<><35><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>憭改<E686AD>
**预计时间**15分钟镜像较大
---
### 甇仿炊2嚗𡁏綫<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧶏<EFBFBD>10<EFBFBD><EFBFBD><EFBFBD>嚗?
### 步骤2推送镜像10分钟
```bash
# <20>𤘪<EFBFBD>蝑?
# 打标签
docker tag python-extraction:v1.1 \
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.1
# <EFBFBD><EFBFBD>?
# 推送
docker push \
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.1
```
**<EFBFBD><EFBFBD>園𡢿**嚗?0<><30><EFBFBD><EFBFBD><E59A97><EFBFBD>讐漲1.1GB嚗?
**预计时间**10分钟镜像约1.1GB
---
### 甇仿炊3嚗锭AE<EFBFBD>函蔡嚗?<3F><><EFBFBD>嚗?
### 步骤3SAE部署3分钟
1. 进入应用:`python-extraction-test`
2. 部署新版本:`v1.1`
@@ -296,34 +296,34 @@ docker push \
**⚠️ 重要**:修改环境变量时,使用【重启应用】,不要用【部署应用】!
| <EFBFBD><EFBFBD> | <20><EFBFBD>?| IP<49>臬炏<E887AC>?|
| 操作 | 用途 | IP是否变 |
|------|------|---------|
| **<EFBFBD>滚鍳摨𠉛鍂** <20>?| 靽格㺿<E6A0BC>滨蔭 | <20>?銝滢<E98A9D><E6BBA2>?|
| **<EFBFBD>函蔡摨𠉛鍂** <20>?| <20>湔鰵<E6B994>𨅯<EFBFBD> | <20>?隡𡁜<E99AA1><F0A1819C>?|
| **重启应用** ✅ | 修改配置 | ❌ 不会变 |
| **部署应用** ❌ | 更新镜像 | ✅ 会变更 |
---
### <EFBFBD><EFBFBD>甇仿炊嚗?<3F><><EFBFBD>嚗?
### 操作步骤5分钟
1. 登录SAEhttps://sae.console.aliyun.com/
2. 餈𥕦<E9A488>撖孵<E69296>摨𠉛鍂嚗<E98D82><E59A97> `nodejs-backend-test`嚗?
3. <20>孵稬<E5ADB5>𣂼<EFBFBD><F0A382BC><EFBFBD>蝵柴<E89DB5><EFBFBD><E78897>鞟㴓憓<E3B493><E68693><EFBFBD><EFBFBD>?
4. <20><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5AFA7><EFBFBD>嚗𣬚<E59A97><F0A3AC9A><EFBFBD><EFBFBD>颲㻫<E9A2B2>?
5. 靽格㺿<E6A0BC><EFBFBD><E3979B>?
6. <20>孵稬<E5ADB5>𣂷<EFBFBD>摮塩<E691AE>?
2. 进入对应应用(如 `nodejs-backend-test`
3. 点击【应用配置】→【环境变量】
4. 找到要修改的变量,点击【编辑】
5. 修改变量值
6. 点击【保存】
7. 点击【重启应用】(⚠️ 不是"部署应用"
8. 蝑匧<E89D91><E58CA7>滚鍳摰峕<E691B0><EFBFBD>漲2-3<><33><EFBFBD>嚗?
8. 等待重启完成约2-3分钟
---
### 常用环境变量速查
**Node.js<EFBFBD>𡒊垢<EFBFBD>喲睸<EFBFBD><EFBFBD>**嚗?
**Node.js后端关键变量**
```bash
# Python<EFBFBD>滚𦛚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>儭?<3F><EFBFBD><E3979B><EFBFBD>憿餌移蝖殷<E89D96>嚗?
# Python服务地址(⚠️ 变量名必须精确!)
EXTRACTION_SERVICE_URL=http://172.17.173.66:8000
# <EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>?
# 数据库连接
DATABASE_URL=postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research
# LLM API密钥
@@ -331,33 +331,33 @@ DEEPSEEK_API_KEY=sk-...
DASHSCOPE_API_KEY=sk-...
```
**<EFBFBD>滨垢Nginx<EFBFBD>喲睸<EFBFBD><EFBFBD>**嚗?
**前端Nginx关键变量**
```bash
# 后端服务地址
BACKEND_SERVICE_HOST=172.17.173.73
BACKEND_SERVICE_PORT=3001
```
**摰峕㟲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
**完整环境变量清单**
- 查看 `11-Node.js后端-SAE部署配置清单.md`
---
## <EFBFBD><EFBFBD> <20><EFBFBD><E58786><EFBFBD>𧢲𠯫敹梹<E695B9><E6A2B9>亙虜餈鞟輕嚗争<E59A97>潃鐥<E6BD83>潃?
## 📋 六、查看日志(日常运维)⭐⭐⭐⭐
### SAE<EFBFBD><EFBFBD><EFBFBD>唳䰻<EFBFBD>?
### SAE控制台查看
1. 登录SAEhttps://sae.console.aliyun.com/
2. 进入对应应用
3. <20>孵稬<E5ADB5>鞉𠯫敹埈䰻霂<E99C82>?
3. 点击【日志查询】
4. 选择时间范围
5. 查看实时日志
---
### 撣貊鍂<EFBFBD><EFBFBD><EFBFBD>喲睸摮?
### 常用日志关键字
**<EFBFBD><EFBFBD>臬𢆡**嚗?
**正常启动**
```bash
# Node.js后端
"🚀 AI临床研究平台 - 后端服务器启动成功!"
@@ -372,13 +372,13 @@ BACKEND_SERVICE_PORT=3001
"Backend Service: 172.17.173.73:3001"
```
**撣貉<EFBFBD><EFBFBD>躰秤**嚗?
**常见错误**
```bash
# 环境变量问题
"EXTRACTION_SERVICE_URL"
"connect ECONNREFUSED"
# <EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>仿䔮憸?
# 数据库连接问题
"Can't reach database server"
"Connection timeout"
@@ -389,44 +389,44 @@ BACKEND_SERVICE_PORT=3001
---
## <EFBFBD><EFBFBD><><E98A9D><EFBFBD><EFBFBD>皛𡁏<E79A9B>雿頣<E99BBF>蝝扳<E89D9D><EFBFBD><E4BAA4><EFBFBD>潃鐥<E6BD83>潃?
## 🔄 七、回滚操作(紧急情况)⭐⭐⭐
### 什么时候需要回滚?
- <20>?<3F><EFBFBD><E59581><EFBFBD>銝仿<E98A9D>Bug
- <20>?<3F><EFBFBD>銝滨泵<E6BBA8><E6B3B5><EFBFBD><EFBFBD>?
- <20>?<3F><EFBFBD>銝钅<E98A9D><E99285>擧遬
- ❌ 新版本有严重Bug
- ❌ 功能不符合预期
- ❌ 性能下降明显
---
### <EFBFBD><EFBFBD>甇仿炊嚗?<3F><><EFBFBD>嚗?
### 回滚步骤5分钟
1. 登录SAEhttps://sae.console.aliyun.com/
2. 进入对应应用
3. <20>孵稬<E5ADB5><EFBFBD>蝵脣<E89DB5><E884A3><EFBFBD>?
4. **<EFBFBD>㗇𥋘<EFBFBD><EFBFBD><EFBFBD>砍噡**嚗<><E59A97> v1.3嚗?
3. 点击【部署应用】
4. **选择旧版本号**(如 v1.3
5. 确认部署
6. 蝑匧<E89D91><E58CA7><EFBFBD>摰峕<E691B0><EFBFBD>漲5<E6BCB2><35><EFBFBD>嚗?
6. 等待回滚完成约5分钟
---
### 验证回滚
```bash
# <20><EFBFBD><E4BAA6><EFBFBD>嚗𣬚霈斤<E99C88><E696A4>?
# 查看日志,确认版本
# 或访问应用,测试功能
```
---
## <EFBFBD><20><EFBFBD><E68092><EFBFBD><EFBFBD>格凒<E6A0BC><EFBFBD><E59597>穿<EFBFBD>擃条漣嚗?
## 🎯 八、一键更新脚本(高级)
### 为Node.js后端创建更新脚本
**创建文件**`backend/update-and-deploy.ps1`
```powershell
# Node.js<EFBFBD>𡒊垢銝<EFBFBD><EFBFBD>格凒<EFBFBD><EFBFBD><EFBFBD>?
# Node.js后端一键更新脚本
# 使用方法: .\update-and-deploy.ps1 v1.5
param(
@@ -435,56 +435,56 @@ param(
)
Write-Host "========================================" -ForegroundColor Green
Write-Host "<EFBFBD>憪𧢲凒<EFBFBD>衹ode.js<6A>𡒊垢<F0A1928A><EFBFBD><E59581>? $Version" -ForegroundColor Green
Write-Host "开始更新Node.js后端到版本: $Version" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Green
# 1. 编译TypeScript
Write-Host "`n[1/4] 编译TypeScript..." -ForegroundColor Cyan
npm run build
if ($LASTEXITCODE -ne 0) {
Write-Host "<EFBFBD>?蝻𤥁<E89DBB>憭梯揖嚗? -ForegroundColor Red
Write-Host "❌ 编译失败!" -ForegroundColor Red
exit 1
}
Write-Host "<EFBFBD>?蝻𤥁<E89DBB><F0A4A581>𣂼<EFBFBD>嚗? -ForegroundColor Green
Write-Host "✅ 编译成功!" -ForegroundColor Green
# 2. 构建Docker镜像
Write-Host "`n[2/4] 构建Docker镜像..." -ForegroundColor Cyan
docker build -t backend-service:$Version .
if ($LASTEXITCODE -ne 0) {
Write-Host "<EFBFBD>?<3F><>遣憭梯揖嚗? -ForegroundColor Red
Write-Host "❌ 构建失败!" -ForegroundColor Red
exit 1
}
Write-Host "<EFBFBD>?<3F>𨅯<EFBFBD><F0A885AF><EFBFBD><EFBFBD>𣂼<EFBFBD>嚗? -ForegroundColor Green
Write-Host "✅ 镜像构建成功!" -ForegroundColor Green
# 3. <EFBFBD>𤘪<EFBFBD>蝑?
Write-Host "`n[3/4] <EFBFBD>𤘪<EFBFBD>蝑?.." -ForegroundColor Cyan
# 3. 打标签
Write-Host "`n[3/4] 打标签..." -ForegroundColor Cyan
$ImageUrl = "crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:$Version"
docker tag backend-service:$Version $ImageUrl
Write-Host "<EFBFBD>?<3F><>倌撌脫<E6928C>嚗? -ForegroundColor Green
Write-Host "✅ 标签已打!" -ForegroundColor Green
# 4. 推送到ACR
Write-Host "`n[4/4] 推送到ACR..." -ForegroundColor Cyan
Write-Host "推送地址: $ImageUrl" -ForegroundColor Yellow
docker push $ImageUrl
if ($LASTEXITCODE -ne 0) {
Write-Host "<EFBFBD>?<3F><EFBFBD><E588B8>仃韐伐<E99F90>" -ForegroundColor Red
Write-Host "❌ 推送失败!" -ForegroundColor Red
exit 1
}
Write-Host "`n========================================" -ForegroundColor Green
Write-Host "<EFBFBD>?<3F>𨅯<EFBFBD>撌脫綫<E884AB><E7B6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" -ForegroundColor Green
Write-Host "✅ 镜像已推送成功!" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Green
Write-Host "`n下一步操作" -ForegroundColor Yellow
Write-Host "1. <EFBFBD><EFBFBD>SAE<EFBFBD><EFBFBD><EFBFBD>? https://sae.console.aliyun.com/" -ForegroundColor Yellow
Write-Host "1. 登录SAE控制台: https://sae.console.aliyun.com/" -ForegroundColor Yellow
Write-Host "2. 进入应用: nodejs-backend-test" -ForegroundColor Yellow
Write-Host "3. <EFBFBD>孵稬<EFBFBD><EFBFBD>蝵脣<EFBFBD><EFBFBD><EFBFBD>? -ForegroundColor Yellow
Write-Host "3. 点击【部署应用】" -ForegroundColor Yellow
Write-Host "4. 选择镜像版本: $Version" -ForegroundColor Yellow
Write-Host "5. 确认部署" -ForegroundColor Yellow
Write-Host "`n<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>嚗ĀPC嚗?" -ForegroundColor Cyan
Write-Host "`n镜像地址VPC:" -ForegroundColor Cyan
Write-Host "crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:$Version" -ForegroundColor Cyan
```
**雿輻鍂<EFBFBD><EFBFBD>**嚗?
**使用方法**
```powershell
cd D:\MyCursor\AIclinicalresearch\backend
.\update-and-deploy.ps1 v1.5
@@ -492,33 +492,33 @@ cd D:\MyCursor\AIclinicalresearch\backend
---
### 銝箏<EFBFBD>蝡臬<EFBFBD>撱箸凒<EFBFBD><EFBFBD><EFBFBD>?
### 为前端创建更新脚本
**创建文件**`frontend-v2/update-and-deploy.ps1`
```powershell
# <20>滨垢Nginx銝<78><E98A9D>格凒<E6A0BC><EFBFBD><E59597>?
# 前端Nginx一键更新脚本
param(
[Parameter(Mandatory=$true)]
[string]$Version
)
Write-Host "撘<>憪𧢲凒<F0A7A2B2><EFBFBD>蝡烤ginx<6E><EFBFBD><E59581>? $Version" -ForegroundColor Green
Write-Host "开始更新前端Nginx到版本: $Version" -ForegroundColor Green
# 1. 构建镜像
docker build -t ai-clinical_frontend-nginx:$Version .
# 2. <EFBFBD>𤘪<EFBFBD>蝑曉僎<EFBFBD><EFBFBD>?
# 2. 打标签并推送
$ImageUrl = "crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:$Version"
docker tag ai-clinical_frontend-nginx:$Version $ImageUrl
docker push $ImageUrl
Write-Host "<22>?摰峕<E691B0><EFBFBD><EFBFBD>沒AE<41><EFBFBD><E689B9><EFBFBD>蝵脩<E89DB5><E884A9>? $Version" -ForegroundColor Green
Write-Host "✅ 完成请在SAE控制台部署版本: $Version" -ForegroundColor Green
```
---
## <EFBFBD><EFBFBD> 銋腈<E98A8B><E88588><EFBFBD><EFBFBD>雿𨀣𧒄<F0A880A3>港摯蝞?
## 📊 九、常用操作时间估算
| 操作 | 操作时间 | 等待时间 | 总计 |
|------|---------|---------|------|
@@ -531,15 +531,15 @@ Write-Host "
---
## <EFBFBD>𩤃<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>格釣<E6A0BC><EFBFBD>憿?
## ⚠️ 十、关键注意事项
### 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>憿餌移蝖?
### 1. 环境变量名必须精确
```bash
# <20>?<3F>躰秤
# ❌ 错误
PYTHON_SERVICE_URL=http://172.17.173.66:8000
# <EFBFBD>?甇<>
# ✅ 正确
EXTRACTION_SERVICE_URL=http://172.17.173.66:8000
```
@@ -550,8 +550,8 @@ EXTRACTION_SERVICE_URL=http://172.17.173.66:8000
### 2. 重启 vs 部署
```
靽格㺿<EFBFBD>滨蔭 <20>?<3F>滚鍳摨𠉛鍂嚗㇆P銝滚<E98A9D>嚗争<E59A97>
<EFBFBD>湔鰵隞<EFBFBD><EFBFBD> <20>?<3F>函蔡摨𠉛鍂嚗㇆P<E38786><EFBFBD><E888AA><EFBFBD><E79F8B>𩤃<EFBFBD>
修改配置 → 重启应用IP不变
更新代码 → 部署应用IP可能变
```
**建议**尽量使用服务发现代替硬编码IP
@@ -570,13 +570,13 @@ crpi-xxx.cn-beijing.personal.cr.aliyuncs.com/...
---
### 4. <EFBFBD><EFBFBD>𧋦<EFBFBD>瑞恣<EFBFBD>?
### 4. 版本号管理
**撱箄悅閫<EFBFBD><EFBFBD>**嚗?
**建议规范**
```bash
v1.0 - 首次部署
v1.1 - 撠誩<EFBFBD><EFBFBD>賣凒<EFBFBD>?
v1.2 - 撠誩<EFBFBD><EFBFBD>賣凒<EFBFBD>?
v1.1 - 小功能更新
v1.2 - 小功能更新
v2.0 - 重大版本升级
```
@@ -584,13 +584,13 @@ v2.0 - 重大版本升级
---
## <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>虜閫<E8999C>䔮憸?
## 🆘 十一、常见问题
### Q1推送镜像失败
**现象**`denied: requested access to the resource is denied`
**<EFBFBD><EFBFBD>**嚗?
**解决**
```bash
# 重新登录ACR
docker login --username=gofeng117@163.com \
@@ -600,28 +600,28 @@ docker login --username=gofeng117@163.com \
---
### Q2嚗锭AE<EFBFBD>函蔡憭梯揖嚗?
### Q2SAE部署失败
**甇仿炊**嚗?
1. <EFBFBD><EFBFBD>摰硺<EFBFBD><EFBFBD><EFBFBD>嚗峕𪄳<EFBFBD><EFBFBD>雿㯄<EFBFBD>霂?
2. <EFBFBD><EFBFBD><EFBFBD>?`15-Node.js<EFBFBD>𡒊垢-<2D>函蔡<E587BD>𣂼<EFBFBD><F0A382BC><EFBFBD>.md`
3. <EFBFBD><EFBFBD>亦㴓憓<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵?
4. 撉諹<EFBFBD><EFBFBD>𨅯<EFBFBD><EFBFBD>臬炏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
**步骤**
1. 查看实例日志,找到具体错误
2. 参考 `15-Node.js后端-部署成功总结.md`
3. 检查环境变量配置
4. 验证镜像是否推送成功
---
### Q3功能更新后不生效
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
- 瘚讛<EFBFBD><EFBFBD><EFBFBD>摮矋<EFBFBD>Ctrl+F5撘箏<E69298><E7AE8F>瑟鰵嚗?
- SAE<EFBFBD>函蔡<EFBFBD><EFBFBD><EFBFBD>?
**可能原因**
- 浏览器缓存Ctrl+F5强制刷新
- SAE部署未完成
- 版本号选择错误
---
### Q4IP地址变更了怎么办
**甇仿炊**嚗?
**步骤**
1. 记录新的IP地址
2. 更新依赖该IP的服务的环境变量
3. 重启相关服务
@@ -631,41 +631,40 @@ docker login --username=gofeng117@163.com \
## 📞 十二、需要帮助?
### 霂衣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
### 详细文档参考
- **摰峕㟲<EFBFBD>函蔡**嚗䫤17-摰峕㟲<E5B395>函蔡摰墧<E691B0><E5A2A7><EFBFBD>-2025<EFBFBD>?md`
- **完整部署**`17-完整部署实战手册-2025版.md`
- **资源查询**`00-部署进度总览.md`
- **问题排查**`15-Node.js后端-部署成功总结.md`
- **<EFBFBD><EFBFBD>﹝撖潸⏛**嚗䫤README.md` <20>?`18-<2D>函蔡<E587BD><E894A1>﹝雿輻鍂<E8BCBB><E98D82><EFBFBD>.md`
- **文档导航**`README.md``18-部署文档使用指南.md`
---
## 🎯 总结
### <EFBFBD>亙虜<EFBFBD><EFBFBD>撣貊鍂<EFBFBD>?銝芣<E98A9D>雿?
### 日常最常用的3个操作
1. **<EFBFBD>湔鰵Node.js<6A>𡒊垢**嚗?0-25<32><35><EFBFBD>嚗?
2. **靽格㺿<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?<3F><><EFBFBD>嚗?
3. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?<3F><><EFBFBD>嚗?
1. **更新Node.js后端**20-25分钟
2. **修改环境变量**5分钟
3. **查看日志**1分钟
### 记住3个关键点
1. <EFBFBD>?**<2A><>𧋦<EFBFBD><EFBFBD><EFBFBD>**嚗鯝1.3 <EFBFBD>?v1.4 <EFBFBD>?v1.5
2. <EFBFBD>?**靽格㺿<E6A0BC>滨蔭<E6BBA8><EFBFBD><E588B8><EFBFBD><E88D94>湔鰵隞<E9B0B5><E99A9E><EFBFBD><EFBFBD>蝵?*
3. <EFBFBD>?**雿輻鍂VPC<50><EFBFBD><E595A3><EFBFBD><E58CA7>𨅯<EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>**
1. **版本号递增**v1.3 v1.4 v1.5
2. **修改配置用重启,更新代码用部署**
3. **使用VPC地址拉取镜像省钱**
### 一句话总结
**蝻𤥁<EFBFBD> <20>?<3F><><20>?<3F><EFBFBD>?<3F>?<3F>函蔡 <20>?撉諹<E69289>嚗?0<><30><EFBFBD><EFBFBD>𧼮<EFBFBD><EFBFBD><E59A97>**
**编译 → 构建 → 推送 → 部署 → 验证20分钟搞定**
---
> **<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*嚗?025-12-25
> **蝏湔擪鈭箏<EFBFBD>**嚗𡁜<E59A97><F0A1819C>穃𣪧<E7A983>?
> **雿輻鍂<EFBFBD><EFBFBD>**嚗朞窈<E69C9E>𦠜𧒄<F0A6A09C>湔鰵<E6B994><EFBFBD>獢?
**蟡脲<E89FA1><E884B2>湔鰵憿箏⏚嚗?* <20><>
> **最后更新**2025-12-25
> **维护人员**:开发团队
> **使用反馈**:请及时更新本文档
**祝您更新顺利!** 🚀