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,10 +1,10 @@
# <EFBFBD><EFBFBD> <20><EFBFBD>鈭騌AE<41>函蔡摰<E894A1><E691B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
# 🚀 阿里云SAE部署完全指南产品经理版
> **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦嚗?* v1.0
> **<EFBFBD>𥕦遣<EFBFBD><EFBFBD>嚗?* 2025-12-11
> **<EFBFBD><EFBFBD>鍂鈭箇黎嚗?* <20>𣳇<EFBFBD>蝵脩<E89DB5>撉𣬚<E69289>鈭批<E988AD>蝏讐<E89D8F><E8AE90><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
> **<EFBFBD><EFBFBD>園𡢿嚗?* 2-3撠𤩺𧒄嚗<F0A79284><E59A97><EFBFBD><EFBFBD><EFBFBD>𧒄<EFBFBD><EFBFBD>
> **<EFBFBD>曉漲蝑厩漣嚗?* 潃鐥<E6BD83><><E89D9E>𤏪<EFBFBD>靽嘥<E99DBD>蝥扳<E89DA5>蝔页<E89D94>
> **文档版本:** v1.0
> **创建日期:** 2025-12-11
> **适用人群:** 无部署经验的产品经理、项目负责人
> **预计时间:** 2-3小时包含等待时间
> **难度等级:** ⭐⭐ 简单(保姆级教程)
---
@@ -15,61 +15,61 @@
3. [第一步准备Docker镜像](#第一步准备docker镜像)
4. [第二步:配置阿里云服务](#第二步配置阿里云服务)
5. [第三步部署到SAE](#第三步部署到sae)
6. [蝚砍<EFBFBD>甇伐<EFBFBD><EFBFBD>函蔡<EFBFBD>滨垢](#蝚砍<EFBFBD>甇仿<EFBFBD>蝵脣<EFBFBD>蝡?
7. [蝚砌<EFBFBD>甇伐<EFBFBD>撉諹<EFBFBD><EFBFBD>函蔡](#蝚砌<EFBFBD>甇仿<EFBFBD><EFBFBD><EFBFBD>蝵?
6. [第四步:部署前端](#第四步部署前端)
7. [第五步:验证部署](#第五步验证部署)
8. [常见问题解决](#常见问题解决)
---
## 前置准备
### <EFBFBD>?<3F>典歇蝏讛揚銋啁<E98A8B><E59581>滚𦛚
### ✅ 您已经购买的服务
| <EFBFBD>滚𦛚 | <20><EFBFBD>?| 霂湔<E99C82> |
| 服务 | 状态 | 说明 |
|------|------|------|
| **<EFBFBD><EFBFBD>鈭騌AE** | <EFBFBD>?撌脰揚銋?| Serverless摨𠉛鍂撘閙<EFBFBD> |
| **鈭烐㺭<EFBFBD><EFBFBD>RDS PostgreSQL** | <EFBFBD>?撌脰揚銋?| <20>唳旿摨𤘪<E691A8><F0A498AA>?|
| **撖寡情摮睃<EFBFBD>OSS** | <EFBFBD>?撌脰揚銋?| <20><>辣摮睃<E691AE><E79D83>滚𦛚 |
| **阿里云SAE** | ✅ 已购买 | Serverless应用引擎 |
| **云数据库RDS PostgreSQL** | ✅ 已购买 | 数据库服务 |
| **对象存储OSS** | ✅ 已购买 | 文件存储服务 |
### 💻 您需要安装的工具
1. **Docker Desktop**
- 下载地址https://www.docker.com/products/docker-desktop/
- Windows系统选择 "Docker Desktop for Windows"
- 摰㕑<EFBFBD><EFBFBD>𡡞<EFBFBD><EFBFBD>舐㩞<EFBFBD>?
- 安装后重启电脑
2. **阿里云CLI可选**
- <EFBFBD><EFBFBD>銝齿<EFBFBD><EFBFBD>典𦶢隞方<EFBFBD><EFBFBD>虾隞亙<EFBFBD>蝔衤蝙<EFBFBD>券燵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>憿菜<EFBFBD>雿?
- 如果不想用命令行,可以全程使用阿里云控制台网页操作
---
## <EFBFBD><EFBFBD>銝漤<EFBFBD><EFBFBD>揚銋訌edis嚗?
## 需不需要购买Redis
### <EFBFBD><EFBFBD> 蝑娍<E89D91>嚗?*<2A><EFBFBD>銝漤<E98A9D><EFBFBD><E996AC><EFBFBD>芣䔉<E88AA3><EFBFBD><E888AA><EFBFBD>閬?*
### 📊 答案:**初期不需要,未来可能需要**
| 场景 | 是否需要Redis | 说明 |
|------|--------------|------|
| **<EFBFBD><EFBFBD><EFBFBD>霂閧㴓憓?* | <20>?銝漤<E98A9D>閬?| 雿輻鍂<E8BCBB><E98D82><EFBFBD>蝻枏<E89DBB><E69E8F>喳虾 |
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><100鈭?* | <20>?銝漤<E98A9D>閬?| 雿輻鍂<E8BCBB><E98D82><EFBFBD>蝻枏<E89DBB>頞喳<E9A09E> |
| **銝剜<EFBFBD><EFBFBD><EFBFBD>100-1000鈭?* | <20>𩤃<EFBFBD> 撱箄悅韐凋僭 | <20>𣂼<EFBFBD><F0A382BC><EFBFBD>嚗𡐿?00/<EFBFBD>?|
| **<EFBFBD><EFBFBD><EFBFBD>毺鍂<EFBFBD>?1000鈭?* | <20>?敹<>◆韐凋僭 | 敹<>◆雿輻鍂Redis |
| **开发测试环境** | ❌ 不需要 | 使用内存缓存即可 |
| **初期用户<100人** | ❌ 不需要 | 使用内存缓存足够 |
| **中期用户100-1000** | ⚠️ 建议购买 | 提升性能¥200/|
| **成熟期用户>1000人** | ✅ 必须购买 | 必须使用Redis |
### 🎯 我的建议
**现在创建开发测试环境不要购买Redis**
<EFBFBD><EFBFBD>嚗?
1. <EFBFBD>?<3F><EFBFBD><EFBFBD><E99A9E>撌脩<E6928C><E884A9><EFBFBD> `CACHE_TYPE=memory`<EFBFBD><EFBFBD>摮条<EFBFBD>摮矋<EFBFBD>
2. <EFBFBD>?撘<><E69298><EFBFBD>霂閖𧫴畾蛛<E795BE><E89B9B><EFBFBD><EFBFBD>蝻枏<E89DBB><EFBFBD><E691B0>憭毺鍂
3. <EFBFBD>?蝑厩<E89D91><EFBFBD><E79487>蝥踹<E89DA5>嚗峕覔<E5B395><EFBFBD><E6A180><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E89084><EFBFBD>
4. <EFBFBD>?<3F><><EFBFBD><EFBFBD>鞉𧋦嚗<F0A78BA6><E59A97><EFBFBD><EFBFBD>200/<EFBFBD><EFBFBD><EFBFBD>
原因:
1. ✅ 您的代码已经支持 `CACHE_TYPE=memory`(内存缓存)
2. ✅ 开发测试阶段,内存缓存完全够用
3. ✅ 等真正上线后,根据实际情况再决定
4. ✅ 节省成本(初期省¥200/月)
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滨蔭嚗?*
**环境变量配置:**
```bash
# 不使用Redis
CACHE_TYPE=memory
# <EFBFBD>芣䔉<EFBFBD><EFBFBD><EFBFBD>𧒄嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嫣蛹嚗?
# 未来需要时,只需改为:
CACHE_TYPE=redis
REDIS_HOST=r-xxxx.redis.rds.aliyuncs.com
REDIS_PASSWORD=your_password
@@ -81,7 +81,7 @@ REDIS_PASSWORD=your_password
### 📦 1.1 创建Dockerfile文件
<EFBFBD>?`AIclinicalresearch/backend/` <EFBFBD><EFBFBD>銝见<EFBFBD>撱箸<EFBFBD>隞?`Dockerfile`<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摮睃銁嚗㚁<EFBFBD>
`AIclinicalresearch/backend/` 目录下创建文件 `Dockerfile`(如果不存在):
```dockerfile
# ==================== 构建阶段 ====================
@@ -93,19 +93,19 @@ WORKDIR /app
COPY package*.json ./
COPY prisma ./prisma/
# 摰㕑<EFBFBD>靘肽<EFBFBD>嚗ěpm ci 瘥?npm install <EFBFBD>渡迅摰𡄯<EFBFBD>
# 安装依赖npm ci npm install 更稳定)
RUN npm ci
# 憭滚<EFBFBD>皞𣂷誨<EFBFBD>?
# 复制源代码
COPY . .
# 生成 Prisma Client
RUN npx prisma generate
# <EFBFBD><EFBFBD> TypeScript <EFBFBD>?JavaScript
# 构建 TypeScript JavaScript
RUN npm run build
# ==================== 餈鞱<EFBFBD><EFBFBD>嗆挾嚗<EFBFBD>移蝞<EFBFBD><EFBFBD>𨅯<EFBFBD>嚗?===================
# ==================== 运行阶段(精简镜像)====================
FROM node:22-alpine
WORKDIR /app
@@ -114,13 +114,13 @@ WORKDIR /app
COPY package*.json ./
COPY prisma ./prisma/
# <EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭找<EFBFBD>韏吔<EFBFBD>雿梶妖<EFBFBD><EFBFBD>嚗?
# 只安装生产依赖(体积更小)
RUN npm ci --only=production
# 生成 Prisma Client
RUN npx prisma generate
# 隞擧<EFBFBD>撱粹𧫴畾萄<EFBFBD><EFBFBD><EFBFBD>霂穃<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
# 从构建阶段复制编译后的代码
COPY --from=builder /app/dist ./dist
# 复制配置文件
@@ -145,7 +145,7 @@ CMD ["node", "dist/index.js"]
### 📦 1.2 创建 .dockerignore 文件
<EFBFBD>?`backend/` <EFBFBD><EFBFBD>銝见<EFBFBD>撱?`.dockerignore`嚗?
`backend/` 目录下创建 `.dockerignore`
```
node_modules
@@ -162,142 +162,142 @@ tests
### 📦 1.3 构建Docker镜像
**<EFBFBD><EFBFBD>PowerShell嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗㚁<EFBFBD>餈𥕦<EFBFBD>backend<EFBFBD><EFBFBD>嚗?*
**打开PowerShell管理员模式进入backend目录**
```powershell
# 进入后端目录
cd D:\MyCursor\AIclinicalresearch\backend
# <EFBFBD><EFBFBD><EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>甇仿<EFBFBD>閬?-10<31><30><EFBFBD>嚗?
# 构建镜像这一步需要5-10分钟
docker build -t aiclinical-backend:dev .
# 查看镜像是否构建成功
docker images | Select-String "aiclinical-backend"
```
**<EFBFBD><EFBFBD>颲枏枂嚗?*
**预期输出:**
```
aiclinical-backend dev xxxx 2 minutes ago xxx MB
```
---
## 蝚砌<EFBFBD>甇伐<EFBFBD><EFBFBD>滨蔭<EFBFBD><EFBFBD>鈭烐<EFBFBD><EFBFBD>?
## 第二步:配置阿里云服务
### <EFBFBD><EFBFBD>儭?2.1 <20>滨蔭RDS<44>唳旿摨?
### 🗄️ 2.1 配置RDS数据库
#### Step 1: 登录阿里云控制台
1. 打开浏览器,访问 https://www.aliyun.com
2. <EFBFBD>孵稬<EFBFBD><EFBFBD>閫鉝<EFBFBD>𣬚蒈敶𨰻<EFBFBD>?
3. <EFBFBD>㗇𥋘<EFBFBD><EFBFBD><EFBFBD>唳旿摨?RDS<EFBFBD>?
2. 点击右上角「登录」
3. 选择「云数据库 RDS
#### Step 2: <EFBFBD>滨蔭<EFBFBD><EFBFBD><EFBFBD>?
#### Step 2: 配置白名单
1. 点击您的RDS实例
2. 撌虫儒<EFBFBD>𨅯<EFBFBD> <20>?<3F>峕㺭<E5B395><EFBFBD><E6A180><EFBFBD><EFBFBD>?<3F>?<3F>𣬚蒾<F0A3AC9A><EFBFBD>霈曄蔭<E69B84>?
3. <EFBFBD>孵稬<EFBFBD>峕溶<EFBFBD>删蒾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
2. 左侧菜单 → 「数据安全性」 → 「白名单设置」
3. 点击「添加白名单分组」
- 分组名称:`SAE应用`
- <EFBFBD><EFBFBD><EFBFBD>𣗏P嚗𡁜<EFBFBD>憛?`0.0.0.0/0`<EFBFBD><EFBFBD>霈豢<EFBFBD><EFBFBD><EFBFBD>瘚贝<EFBFBD><EFBFBD><EFBFBD>
- 白名单IP先填 `0.0.0.0/0`(允许所有,测试用)
- **⚠️ 正式上线后要改为SAE的VPC网段**
#### Step 3: 创建数据库和用户
1. 撌虫儒<EFBFBD>𨅯<EFBFBD> <20>?<3F>峕㺭<E5B395><EFBFBD>蝞∠<E89D9E><E288A0>?
2. <EFBFBD>孵稬<EFBFBD><EFBFBD><EFBFBD>撱箸㺭<EFBFBD><EFBFBD><EFBFBD>?
1. 左侧菜单 → 「数据库管理」
2. 点击「创建数据库」
- 数据库名称:`aiclinical_dev`
- 字符集:`UTF8`
- <EFBFBD>孵稬<EFBFBD>𣬚摰𠾼<EFBFBD>?
- 点击「确定」
3. 撌虫儒<EFBFBD>𨅯<EFBFBD> <20>?<3F>諹揭<E8ABB9>瑞恣<E7919E><E681A3><EFBFBD>?
4. <EFBFBD>孵稬<EFBFBD><EFBFBD><EFBFBD>撱箄揭<EFBFBD><EFBFBD>?
3. 左侧菜单 → 「账号管理」
4. 点击「创建账号」
- 账号名称:`aiclinical`
- 韐血噡蝐餃<EFBFBD>嚗𡁏芦<EFBFBD>朞揭<EFBFBD>?
- 账号类型:普通账号
- 密码:设置一个强密码(记住它!)
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>唳旿摨橒<EFBFBD><EFBFBD>㗇𥋘 `aiclinical_dev`嚗峕<EFBFBD><EFBFBD><EFBFBD>諹粉<EFBFBD><EFBFBD>?
- <EFBFBD>孵稬<EFBFBD>𣬚摰𠾼<EFBFBD>?
- 授权数据库:选择 `aiclinical_dev`,权限「读写」
- 点击「确定」
#### Step 4: 获取连接地址
1. <EFBFBD>孵稬摰硺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>砌縑<EFBFBD><EFBFBD>漤△<EFBFBD>?
2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵穃𧑐<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝐颱撮嚗䫤rm-xxxx.mysql.rds.aliyuncs.com`嚗?
3. **憭滚<EFBFBD>撟嗡<EFBFBD>摮䁅<EFBFBD>銝芸𧑐<EFBFBD><EFBFBD>**嚗<><E59A97><EFBFBD><EFBFBD><EFBCB6><EFBFBD>嚗?
1. 点击实例「基本信息」页面
2. 找到「内网地址」(类似:`rm-xxxx.mysql.rds.aliyuncs.com`
3. **复制并保存这个地址**(后面会用到)
---
### 📦 2.2 配置OSS对象存储
#### Step 1: 创建Bucket
1. <EFBFBD><EFBFBD>鈭烐綉<EFBFBD>嗅蝱 <20>?<3F><>笆鞊<E99E8A><E288AA>汰SS<53>?
2. <EFBFBD>孵稬<EFBFBD>𩱳ucket<EFBFBD>𡑒”<EFBFBD>?<3F>?<3F><><EFBFBD>撱慷ucket<EFBFBD>?
- Bucket<EFBFBD>滨妍嚗䫤aiclinical-dev`<EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘥?<3F><EFBFBD>+璅芣<E79285>嚗?
- <EFBFBD><EFBFBD>嚗𡁻<EFBFBD>㗇𥋘銝竃DS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𦒘<EFBFBD>1嚗?
- 摮睃<EFBFBD>蝐餃<EFBFBD>嚗𠾼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- 霂餃<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𠾼<EFBFBD>𣬚<EFBFBD><EFBFBD><EFBFBD>?
1. 阿里云控制台 → 「对象存储OSS」
2. 点击「Bucket列表」 → 「创建Bucket
- Bucket名称:`aiclinical-dev`(小写字母+数字+横杠)
- 区域选择与RDS相同的区域华东1
- 存储类型:「标准存储」
- 读写权限:「私有」
- 其他选项默认
- <EFBFBD>孵稬<EFBFBD>𣬚摰𠾼<EFBFBD>?
- 点击「确定」
#### Step 2: <EFBFBD>𥕦遣RAM<EFBFBD><EFBFBD><EFBFBD>鍂鈭垾PI霈輸䔮嚗?
1. <EFBFBD><EFBFBD>鈭烐綉<EFBFBD>嗅蝱 <20>?<3F>諹挪<E8ABB9>格綉<E6A0BC>買AM<41>?
2. 撌虫儒<EFBFBD>𨅯<EFBFBD> <20>?<3F>𣬚鍂<F0A3AC9A><EFBFBD>?<3F>?<3F><><EFBFBD>撱箇鍂<E7AE87><EFBFBD>?
#### Step 2: 创建RAM用户用于API访问
1. 阿里云控制台 → 「访问控制RAM」
2. 左侧菜单 → 「用户」 → 「创建用户」
- 登录名称:`aiclinical-oss`
- 霈輸䔮<EFBFBD><EFBFBD>嚗𡁜㗲<EFBFBD><EFBFBD>𣬚<EFBFBD>蝔贝挪<EFBFBD><EFBFBD>?
- <EFBFBD>孵稬<EFBFBD>𣬚摰𠾼<EFBFBD>?
- 访问方式:勾选「编程访问」
- 点击「确定」
3. <EFBFBD>𥕦遣<EFBFBD>𣂼<EFBFBD><EFBFBD>𠬍<EFBFBD>**蝡见朖靽嘥<E99DBD><E598A5>曄內<E69B84><E585A7>ccessKey**嚗?
3. 创建成功后,**立即保存显示的AccessKey**
```
AccessKeyId: LTAI5t...(复制保存)
AccessKeySecret: xxxxxx<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摮矋<EFBFBD><EFBFBD>芣遬蝷箔<EFBFBD>甈∴<EFBFBD>嚗?
AccessKeySecret: xxxxxx(复制保存,只显示一次!)
```
4. 给用户授权:
- <EFBFBD>孵稬<EFBFBD><EFBFBD><EFBFBD>滨妍 <20>?<3F><EFBFBD><E5B395>鞟恣<E99E9F><E681A3><EFBFBD>?<3F>?<3F>峕溶<E5B395><EFBFBD><E4ADBE><EFBFBD>?
- 点击用户名称 → 「权限管理」 → 「添加权限」
- 选择权限:`AliyunOSSFullAccess`
- <20>孵稬<E5ADB5>𣬚摰𠾼<E691B0>?
- 点击「确定」
---
### <EFBFBD> 2.3 <EFBFBD>滨蔭摰孵膥<EFBFBD>𨅯<EFBFBD><EFBFBD>滚𦛚嚗㇁CR嚗?
### 🐳 2.3 配置容器镜像服务ACR
#### Step 1: <EFBFBD><EFBFBD>𡁏<EFBFBD><EFBFBD>?
1. <20><EFBFBD>鈭烐綉<E78390>嗅蝱 <20>?<3F><><EFBFBD><EFBFBD><E588B8>𤩺<EFBFBD><F0A4A9BA><EFBFBD>?
2.<><E68692><EFBFBD>鞟內撘<E585A7><E69298>𡄯<EFBFBD><F0A184AF>孵稬<E5ADB5>𣬚<EFBFBD><F0A3AC9A><EFBFBD><E596B3>𠾼<EFBFBD><EFBFBD>**<2A>滩晶**嚗?
#### Step 1: 开通服务
1. 阿里云控制台 → 「容器镜像服务」
2. 如果提示开通,点击「立即开通」(**免费**
#### Step 2: 创建命名空间
1. 撌虫儒<E899AB>𨅯<EFBFBD> <20>?<3F><EFBFBD>霈文<E99C88>靘卝<E99D98>?<3F>?<3F><>𦶢<EFBFBD>滨征<E6BBA8><EFBFBD>?
2. <20>孵稬<E5ADB5><E7A8AC><EFBFBD>撱箏𦶢<E7AE8F>滨征<E6BBA8><EFBFBD>?
1. 左侧菜单 → 「默认实例」 → 「命名空间」
2. 点击「创建命名空间」
- 命名空间:`aiclinical`
- <20>孵稬<E5ADB5>𣬚摰𠾼<E691B0>?
- 点击「确定」
#### Step 3: 创建镜像仓库
1. 撌虫儒<E899AB>𨅯<EFBFBD> <20>?<3F><EFBFBD><E5B1B8><EFBFBD>摨瓐<E691A8>?<3F>?<3F><><EFBFBD>撱粹<E692B1><E7B2B9><EFBFBD>摨瓐<E691A8>?
1. 左侧菜单 → 「镜像仓库」 → 「创建镜像仓库」
- 仓库名称:`backend-dev`
- 命名空间:选择 `aiclinical`
- 摘要:`AI临床研究平台后端-开发环境`
- 隞枏<E99A9E>蝐餃<E89D90>嚗𠾼<E59A97>𣬚<EFBFBD><F0A3AC9A><EFBFBD>?
-<><E99A9E>皞琜<E79A9E><E7909C>峕𧋦<E5B395><EFBFBD>摨瓐<E691A8>?
- <20>孵稬<E5ADB5><EFBFBD><EFBFBD>甇乓<E79487>𨧀<EFBFBD><F0A8A780><EFBFBD><EFBFBD>撱箝<E692B1>?
- 仓库类型:「私有」
- 代码源:「本地仓库」
- 点击「下一步」→「创建」
#### Step 4: 获取登录密码
1. <20><EFBFBD>閫垍<E996AB><E59E8D>餌鍂<E9A48C>瑕仍<E79195>?<3F>?<3F>ccessKey蝞∠<EFBFBD><EFBFBD>?
2. <20>𤥁<EFBFBD><F0A4A581><EFBFBD>摰孵膥<E5ADB5>𨅯<EFBFBD><F0A885AF>滚𦛚 <20>?<3F><EFBFBD>閫鉝<E996AB>諹挽蝵株挪<E6A0AA>桀鐯霂<E990AF><E99C82>?
1. 右上角点击用户头像 → 「AccessKey管理」
2. 或者:容器镜像服务 → 右上角「设置访问凭证」
3. 设置镜像仓库登录密码(记住它!)
---
### <EFBFBD> 2.4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭?
### 📤 2.4 推送镜像到阿里云
**打开PowerShell执行以下命令**
```powershell
# 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭穃捆<EFBFBD><EFBFBD><EFBFBD>𤩺<EFBFBD><EFBFBD>?
# <EFBFBD>踵揢<雿删<E99BBF><E588A0><EFBFBD>鈭𤏸揭<F0A48FB8>?銝箔<E98A9D><E7AE94><EFBFBD><EFBFBD><EFBFBD><E494B6><EFBFBD><E9A483>桃拳<E6A183>𣇉鍂<F0A38789><EFBFBD>
docker login --username=<雿删<EFBFBD><EFBFBD><EFBFBD>鈭𤏸揭<EFBFBD>? registry.cn-hangzhou.aliyuncs.com
# 1. 登录阿里云容器镜像服务
# 替换<你的阿里云账号>为你的阿里云登录邮箱或用户名
docker login --username=<你的阿里云账号> registry.cn-hangzhou.aliyuncs.com
# 颲枏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滩挽蝵桃<EFBFBD><EFBFBD>𨅯<EFBFBD>隞枏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
# 输入密码(就是刚才设置的镜像仓库登录密码)
# 2. 给镜像打标签
# <EFBFBD>踵揢 <雿删<E99BBF><E588A0><EFBFBD>蝛粹𡢿> 銝?aiclinical
# 替换 <你的命名空间> 为 aiclinical
docker tag aiclinical-backend:dev `
registry.cn-hangzhou.aliyuncs.com/aiclinical/backend-dev:v1.0.0
# 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭𡢅<EFBFBD><EFBFBD><EFBFBD>閬?-5<><35><EFBFBD>嚗?
# 3. 推送到阿里云需要3-5分钟
docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/backend-dev:v1.0.0
```
@@ -312,33 +312,33 @@ v1.0.0: digest: sha256:xxxx size: xxxx
### 🚀 3.1 创建SAE应用
#### Step 1: 餈𥕦<EFBFBD>SAE<EFBFBD><EFBFBD><EFBFBD>?
1. <20><EFBFBD>鈭烐綉<E78390>嗅蝱 <20>?<3F>erverless摨𠉛鍂撘閙<EFBFBD>SAE<EFBFBD>?
2. <20>㗇𥋘<E39787><EFBFBD><EFBFBD><E59A97>RDS<44><53>SS<53><EFBFBD>嚗?
#### Step 1: 进入SAE控制台
1. 阿里云控制台 → 「Serverless应用引擎SAE
2. 选择区域与RDS、OSS相同
#### Step 2: 创建应用
1. <20>孵稬<E5ADB5><E7A8AC><EFBFBD>撱箏<E692B1><E7AE8F><EFBFBD>?
2. **<EFBFBD>箸𧋦靽⊥<EFBFBD>**嚗?
1. 点击「创建应用」
2. **基本信息**
- 应用名称:`aiclinical-backend-dev`
- <20><EFBFBD>蝛粹𡢿嚗𡁻<E59A97>霈?
- 命名空间:默认
- VPC选择与RDS相同的VPC
- vSwitch嚗帋遙<EFBFBD><EFBFBD>㗇𥋘銝<EFBFBD>銝?
- vSwitch:任意选择一个
3. **摨𠉛鍂<EFBFBD>函蔡<EFBFBD>滨蔭**嚗?
- 摨𠉛鍂<F0A0899B>函蔡<E587BD><EFBFBD>嚗𠾼<E59A97><EFBFBD><E5B1B8><EFBFBD>?
- <20>𨅯<EFBFBD><F0A885AF><EFBFBD>嚗𠾼<E59A97><F0A0BEBC><EFBFBD><EFBFBD><E588B8>𤩺<EFBFBD><F0A4A9BA><EFBFBD>銝𡁶<E98A9D>摰硺<E691B0><E7A1BA>?
3. **应用部署配置**
- 应用部署方式:「镜像」
- 镜像来源:「容器镜像服务企业版实例」
- 镜像:选择刚才推送的 `registry.cn-hangzhou.aliyuncs.com/aiclinical/backend-dev:v1.0.0`
- 镜像版本:`v1.0.0`
4. **摰硺<EFBFBD><EFBFBD>聢**嚗?
- 摰硺<E691B0><EFBFBD>聢嚗䫤1<E4ABA4>?GB`
- 摰硺<E691B0><E7A1BA><EFBFBD>1銝迎<E98A9D><E8BF8E><EFBFBD>嚗?
4. **实例规格**
- 实例规格:`1核2GB`
- 实例数1个固定
5. **蝵𤑳<EFBFBD><EFBFBD>滨蔭**嚗?
- <20><EFBFBD><EFBFBD><E589B9><EFBFBD>蝵𤏸挪<F0A48FB8><EFBFBD>?
5. **网络配置**
- 勾选「公网访问」
- 端口:`3001`
6. <20>孵稬<E5ADB5><EFBFBD><EFBFBD>甇乓<E79487>?
6. 点击「下一步」
---
@@ -353,7 +353,7 @@ PORT=3001
SERVICE_NAME=aiclinical-backend-dev
LOG_LEVEL=debug
# ========== <EFBFBD>唳旿摨㯄<EFBFBD>蝵?==========
# ========== 数据库配置 ==========
# 替换为您的RDS地址
DATABASE_URL=postgresql://aiclinical:你的密码@rm-xxxx.mysql.rds.aliyuncs.com:5432/aiclinical_dev
@@ -364,7 +364,7 @@ OSS_BUCKET=aiclinical-dev
OSS_ACCESS_KEY_ID=你的AccessKeyId
OSS_ACCESS_KEY_SECRET=你的AccessKeySecret
# ========== 蝻枏<EFBFBD><EFBFBD>滨蔭嚗<EFBFBD><EFBFBD>雿輻鍂Redis嚗?=========
# ========== 缓存配置(不使用Redis==========
CACHE_TYPE=memory
QUEUE_TYPE=memory
@@ -383,61 +383,61 @@ DIFY_API_KEY=你的Dify API Key
DIFY_API_URL=https://api.dify.ai/v1
# ========== 安全配置 ==========
JWT_SECRET=霂瑞<EFBFBD><EFBFBD>𣂷<EFBFBD>銝芷<EFBFBD><EFBFBD><EFBFBD>蝚虫葡嚗<EFBFBD>秐撠?2雿㵪<E99BBF>
JWT_SECRET=请生成一个随机字符串至少32位
CORS_ORIGIN=*
# ========== Python敺格<EFBFBD><EFBFBD><EFBFBD>蝵?==========
# ========== Python微服务配置 ==========
# 暂时先用公网地址后续改为SAE内网
EXTRACTION_SERVICE_URL=http://你的Python服务地址:8000
```
**<EFBFBD>𩤃<EFBFBD> <20><EFBFBD><E6BBA9>鞟內嚗?*
- <EFBFBD>踵揢<EFBFBD><EFBFBD><EFBFBD>?`雿删<E99BBF>XXX` 銝箇<E98A9D>摰䂿<E691B0><E482BF>?
**⚠️ 重要提示:**
- 替换所有 `你的XXX` 为真实的值
- JWT_SECRET 可以用在线工具生成https://www.random.org/strings/
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>霈曄蔭<EFBFBD>躰秤<EFBFBD><EFBFBD>蝵脣仃韐亦<EFBFBD>銝餉<EFBFBD><EFBFBD><EFBFBD>嚗?
- 环境变量设置错误是部署失败的主要原因!
---
### <EFBFBD>?3.3 <EFBFBD>滨蔭<EFBFBD>亙熒璉<EFBFBD><EFBFBD>?
### 3.3 配置健康检查
在「健康检查」部分:
```yaml
<EFBFBD><EFBFBD>交䲮撘? HTTP
<EFBFBD><EFBFBD>亥楝敺? /health
检查方式: HTTP
检查路径: /health
端口: 3001
<EFBFBD><EFBFBD>撱嗉<EFBFBD>: 30蝘?
<EFBFBD><EFBFBD>仿𡢿<EFBFBD>? 10蝘?
<EFBFBD>𧒄<EFBFBD>園𡢿: 3蝘?
銝滚<EFBFBD>摨琿<EFBFBD><EFBFBD>? 3甈?
<EFBFBD>亙熒<EFBFBD><EFBFBD><EFBFBD>? 2甈?
初始延迟: 30
检查间隔: 10秒
超时时间: 3
不健康阈值: 3次
健康阈值: 2次
```
<EFBFBD>孵稬<EFBFBD><EFBFBD><EFBFBD>撱箏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑匧<EFBFBD>3-5<><35><EFBFBD><EFBFBD>?
点击「创建应用」等待3-5分钟。
---
### 🎉 3.4 验证部署
#### Step 1: <EFBFBD><EFBFBD><EFBFBD>函蔡<EFBFBD><EFBFBD>?
1. 摨𠉛鍂<EFBFBD>𡑒”銝剜𪄳<EFBFBD>?`aiclinical-backend-dev`
#### Step 1: 查看部署状态
1. 应用列表中找到 `aiclinical-backend-dev`
2. 查看状态:
- <EFBFBD>?<3F>臬𢆡銝?<3F>?蝑匧<E89D91>
- <EFBFBD>?撘<><20>?<3F><EFBFBD><E4BAA6><EFBFBD><E4BA99>埝䰻<E59F9D><EFBFBD>
- <EFBFBD>?餈鞱<E9A488>銝?<3F>?<3F>𣂼<EFBFBD>嚗?
- ❌ 启动中 → 等待
- ❌ 异常 → 查看日志排查问题
- ✅ 运行中 → 成功!
#### Step 2: 获取公网地址
1. 点击应用名称进入详情
2. <EFBFBD><EFBFBD><EFBFBD>砌縑<EFBFBD><EFBFBD>漤△<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵騌LB<EFBFBD><EFBFBD><EFBFBD>?
3. 憭滚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>掩隡潘<EFBFBD>`http://123.456.789.0:3001`嚗?
2. 「基本信息」页面找到「公网SLB地址」
3. 复制地址(类似:`http://123.456.789.0:3001`
#### Step 3: 测试接口
<EFBFBD><EFBFBD>瘚讛<EFBFBD><EFBFBD><EFBFBD>霈輸䔮嚗?
打开浏览器,访问:
```
http://<你的SAE公网地址>/health
```
**<EFBFBD><EFBFBD>餈𥪜<EFBFBD>嚗?*
**预期返回:**
```json
{
"status": "ok",
@@ -450,9 +450,9 @@ http://<你的SAE公网地址>/health
## 第四步:部署前端
### <EFBFBD><EFBFBD> 4.1 <EFBFBD><EFBFBD><EFBFBD>滨垢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞?
### 🌐 4.1 构建前端静态文件
**<EFBFBD><EFBFBD>PowerShell嚗諹<EFBFBD><EFBFBD>rontend-v2<EFBFBD><EFBFBD>嚗?*
**打开PowerShell进入frontend-v2目录:**
```powershell
# 进入前端目录
@@ -465,14 +465,14 @@ npm install
# 打开 vite.config.ts配置代理或直接修改 API_BASE_URL
```
**靽格㺿 `vite.config.ts`嚗?*
**修改 `vite.config.ts`**
```typescript
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://雿删<EFBFBD>SAE<EFBFBD>𡒊垢<EFBFBD><EFBFBD>:3001', // <EFBFBD>?<3F><EFBFBD>雿删<E99BBF>SAE<41><EFBFBD>
target: 'http://你的SAE后端地址:3001', // ← 改成你的SAE地址
changeOrigin: true,
},
},
@@ -484,36 +484,36 @@ export default defineConfig({
})
```
**<EFBFBD><EFBFBD><EFBFBD>煺漣<EFBFBD><EFBFBD>𧋦嚗?*
**构建生产版本:**
```powershell
npm run build
```
<EFBFBD><EFBFBD>遣摰峕<EFBFBD><EFBFBD>𠬍<EFBFBD><EFBFBD>?`dist/` <20><EFBFBD><E6A180><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B9B1><EFBFBD>隞嗚<E99A9E>?
构建完成后,在 `dist/` 目录生成静态文件。
---
### 🚀 4.2 部署前端到OSS
#### <EFBFBD><EFBFBD>A嚗帋蝙<EFBFBD>券燵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
#### 方案A使用阿里云控制台推荐新手
1. <EFBFBD><EFBFBD>OSS<EFBFBD><EFBFBD><EFBFBD>?
1. 打开OSS控制台
2. 进入 `aiclinical-dev` Bucket
3. <EFBFBD>孵稬<EFBFBD><EFBFBD>隞嗥恣<EFBFBD><EFBFBD><EFBFBD>?<3F>?<3F><EFBFBD>隡䭾<E99AA1>隞嗚<E99A9E>?
4. <EFBFBD>㗇𥋘 `frontend-v2/dist/` <EFBFBD><EFBFBD>銝讠<EFBFBD>**<2A><><EFBFBD><EFBFBD>隞?*
5. 銝𠹺<EFBFBD>摰峕<EFBFBD><EFBFBD>𠬍<EFBFBD>霈曄蔭 `index.html` 銝粹<EFBFBD>霈日<EFBFBD>憿?
3. 点击「文件管理」 → 「上传文件」
4. 选择 `frontend-v2/dist/` 目录下的**所有文件**
5. 上传完成后,设置 `index.html` 为默认首页
#### <EFBFBD><EFBFBD>B嚗帋蝙<EFBFBD>汰SS<EFBFBD>賭誘銵<EFBFBD><EFBFBD>?
#### 方案B使用OSS命令行工具
**摰㕑<EFBFBD>ossutil<EFBFBD><EFBFBD><EFBFBD>嚗?*
**安装ossutil(可选):**
```powershell
# 下载 ossutil
# Windows: https://gosspublic.alicdn.com/ossutil/ossutil64.exe
# 配置
.\ossutil64.exe config
# 颲枏<EFBFBD> AccessKeyId<EFBFBD><EFBFBD>ccessKeySecret<EFBFBD><EFBFBD>ndpoint<EFBFBD><EFBFBD> oss-cn-hangzhou.aliyuncs.com嚗?
# 输入 AccessKeyId、AccessKeySecret、Endpoint(如 oss-cn-hangzhou.aliyuncs.com
# 上传前端文件
.\ossutil64.exe cp -r .\dist\ oss://aiclinical-dev/frontend/ --update
@@ -521,35 +521,35 @@ npm run build
---
### <EFBFBD><EFBFBD> 4.3 <EFBFBD>滨蔭OSS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝡蹱<EFBFBD>蝞?
### 🌐 4.3 配置OSS静态网站托管
1. OSS<EFBFBD><EFBFBD><EFBFBD>?<3F>?`aiclinical-dev` Bucket
2. 撌虫儒<EFBFBD>𨅯<EFBFBD> <20>?<3F><>抅蝖<E68A85>霈曄蔭<E69B84>?<3F>?<3F><EFBFBD><E5B1B8><EFBFBD><EFBFBD><EFBFBD>?
1. OSS控制台 → `aiclinical-dev` Bucket
2. 左侧菜单 → 「基础设置」 → 「静态页面」
3. 点击「设置」:
- 默认首页:`index.html`
- 默认404页`index.html`
- <EFBFBD>孵稬<EFBFBD><EFBFBD>摮塩<EFBFBD>?
- 点击「保存」
4. <EFBFBD><EFBFBD>霈輸䔮<EFBFBD><EFBFBD>嚗?
- Bucket<EFBFBD><EFBFBD>憿菟𢒰嚗峕𪄳<EFBFBD><EFBFBD>𩱳ucket<EFBFBD><EFBFBD><EFBFBD>?
4. 获取访问地址:
- Bucket概览页面找到「Bucket域名」
- 外网访问地址:`http://aiclinical-dev.oss-cn-hangzhou.aliyuncs.com/`
---
## 第五步:验证部署
### <EFBFBD>?5.1 <EFBFBD>券曎頝舀<EFBFBD>霂?
### 5.1 全链路测试
#### 瘚贝<EFBFBD>1嚗𡁜<EFBFBD>摨瑟<EFBFBD><EFBFBD>?
#### 测试1健康检查
```
访问http://你的SAE地址:3001/health
<EFBFBD><EFBFBD>嚗朞<EFBFBD><EFBFBD>?{"status":"ok"}
预期:返回 {"status":"ok"}
```
#### 测试2数据库连接
```powershell
# <EFBFBD>沒AE<EFBFBD><EFBFBD><EFBFBD>?<3F>?摨𠉛鍂霂行<E99C82> <20>?摰墧𧒄<E5A2A7><EFBFBD>
# <EFBFBD><EFBFBD><EFBFBD>臬炏<EFBFBD>?"<22>?<3F>唳旿摨栞<E691A8><E6A09E><EFBFBD><E4BAA4>? <20><EFBFBD>
# 在SAE控制台 → 应用详情 → 实时日志
# 查看是否有 "✅ 数据库连接成功" 日志
```
#### 测试3OSS存储
@@ -558,7 +558,7 @@ npm run build
上传一个测试文件,查看是否成功
```
#### 瘚贝<EFBFBD>4嚗𡁜<EFBFBD>蝡航挪<EFBFBD>?
#### 测试4前端访问
```
访问http://aiclinical-dev.oss-cn-hangzhou.aliyuncs.com/
查看页面是否正常显示
@@ -568,53 +568,53 @@ npm run build
### 📊 5.2 查看监控数据
1. SAE<EFBFBD><EFBFBD><EFBFBD>?<3F>?摨𠉛鍂霂行<E99C82> <20>?<3F>𣬚<EFBFBD><F0A3AC9A>批之<E689B9><EFBFBD>?
2. <EFBFBD><EFBFBD>嚗?
- CPU雿輻鍂<EFBFBD>?
- <EFBFBD><EFBFBD><EFBFBD>雿輻鍂<EFBFBD>?
- QPS<EFBFBD><EFBFBD>蝘坿窈瘙<EFBFBD>㺭嚗?
1. SAE控制台 → 应用详情 → 「监控大盘」
2. 查看:
- CPU使用率
- 内存使用率
- QPS(每秒请求数)
- 响应时间
---
## 常见问题解决
### <EFBFBD>?<3F><EFBFBD>1嚗𡁜<E59A97><F0A1819C>典鍳<E585B8>典仃韐?
### ❌ 问题1应用启动失败
**<EFBFBD><EFBFBD>𠶖嚗?*
- 摨𠉛鍂<EFBFBD><EFBFBD><EFBFBD>遬蝷箝<EFBFBD><EFBFBD><EFBFBD>撣詻<EFBFBD>?
- <EFBFBD>亙熒璉<EFBFBD><EFBFBD>亙仃韐?
**症状:**
- 应用状态显示「异常」
- 健康检查失败
**<EFBFBD><EFBFBD>甇仿炊嚗?*
**解决步骤:**
1. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?*
1. **查看日志:**
```
SAE<EFBFBD><EFBFBD><EFBFBD>?<3F>?摨𠉛鍂霂行<E99C82> <20>?摰墧𧒄<E5A2A7><EFBFBD>
<EFBFBD><EFBFBD>𠧧<EFBFBD>?ERROR <EFBFBD><EFBFBD>
SAE控制台 → 应用详情 → 实时日志
找到红色的 ERROR 日志
```
2. **撣貉<EFBFBD><EFBFBD>躰秤嚗?*
2. **常见错误:**
**错误A数据库连接失败**
```
Error: Connection refused
```
- <EFBFBD><EFBFBD>?`DATABASE_URL` <EFBFBD><EFBFBD><EFBFBD>臬炏甇<EFBFBD>
- <EFBFBD><EFBFBD>?RDS <20><EFBFBD><E8B3A2>閙糓<E99699><EFBFBD><E8A180>?SAE <EFBFBD>?IP
- <EFBFBD><EFBFBD>?RDS <20><EFBFBD><E586BD><EFBFBD><E6BB9A><EFBFBD><EFBFBD>行迤蝖?
- 检查 `DATABASE_URL` 格式是否正确
- 检查 RDS 白名单是否包含 SAE IP
- 检查 RDS 用户名密码是否正确
**<EFBFBD>躰秤B嚗𡁶㴓憓<EFBFBD><EFBFBD><EFBFBD>讐撩憭?*
**错误B环境变量缺失**
```
DATABASE_URL is required
```
- <EFBFBD><EFBFBD>亦㴓憓<EFBFBD><EFBFBD><EFBFBD>𤩺糓<EFBFBD><EFBFBD>蝵桀<EFBFBD><EFBFBD>?
- 检查环境变量是否配置完整
- 重新部署应用
**错误CPrisma 连接失败**
```
Prisma Client initialization failed
```
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>銵峕㺭<EFBFBD><EFBFBD><EFBFBD>宏嚗?
- 需要运行数据库迁移:
```bash
# 本地执行迁移然后推送到RDS
npx prisma migrate deploy
@@ -622,16 +622,16 @@ npm run build
---
### <EFBFBD>?<3F><EFBFBD>2嚗鐾SS銝𠹺<E98A9D>憭梯揖
### ❌ 问题2OSS上传失败
**<EFBFBD><EFBFBD>𠶖嚗?*
**症状:**
- 文件上传返回 403 Forbidden
**<EFBFBD><EFBFBD>甇仿炊嚗?*
**解决步骤:**
1. <EFBFBD><EFBFBD>?RAM <20><EFBFBD><E586BD><EFBFBD><EFBFBD>嚗?
- <EFBFBD><EFBFBD><EFBFBD>?<3F>?RAM <20>?<3F><EFBFBD> <20>?<3F><><EFBFBD>
- 蝖桐<EFBFBD><EFBFBD>?`AliyunOSSFullAccess`
1. 检查 RAM 用户权限:
- 控制台 → RAM → 用户 → 权限
- 确保有 `AliyunOSSFullAccess`
2. 检查环境变量:
```bash
@@ -640,7 +640,7 @@ npm run build
OSS_BUCKET=正确的Bucket名称
```
3. 瘚贝<EFBFBD> OSS 餈墧𦻖嚗?
3. 测试 OSS 连接:
```javascript
// 在应用日志中查看
console.log('OSS配置:', {
@@ -651,21 +651,21 @@ npm run build
---
### <EFBFBD>?<3F><EFBFBD>3嚗𡁜<E59A97>蝡舀<E89DA1>瘜閗挪<E99697><EFBFBD>蝡?
### ❌ 问题3前端无法访问后端
**<EFBFBD><EFBFBD>𠶖嚗?*
- <EFBFBD>滨垢<EFBFBD>曄內<EFBFBD>𣬚<EFBFBD>蝏𣈯<EFBFBD>霂胯<EFBFBD>?
**症状:**
- 前端显示「网络错误」
- API 请求失败
**<EFBFBD><EFBFBD>甇仿炊嚗?*
**解决步骤:**
1. <EFBFBD><EFBFBD>丘ORS<EFBFBD>滨蔭嚗?
1. 检查CORS配置
```bash
# <EFBFBD>沒AE<EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝剔霈?
# 在SAE环境变量中确认
CORS_ORIGIN=* # 允许所有来源(开发环境)
```
2. <EFBFBD><EFBFBD><EFBFBD>蝡臬𧑐<EFBFBD><EFBFBD>嚗?
2. 检查后端地址:
```javascript
// frontend-v2/vite.config.ts
proxy: {
@@ -684,19 +684,19 @@ npm run build
---
### <EFBFBD>?<3F><EFBFBD>4嚗䥪ython敺格<E695BA><E6A0BC><EFBFBD>瘜閗<E7989C><E99697>?
### ❌ 问题4Python微服务无法连接
**<EFBFBD><EFBFBD>𠶖嚗?*
**症状:**
- 文件提取失败
- 日志显示 `Connection refused to extraction service`
**銝湔𧒄<EFBFBD><EFBFBD>嚗?*
**临时方案:**
<EFBFBD><EFBFBD>Python敺格<EFBFBD><EFBFBD><EFBFBD><EFBFBD>冽𧋦<EFBFBD><EFBFBD>銵䕘<EFBFBD><EFBFBD><EFBFBD><EFBFBD>誑銝衤舅蝘齿䲮獢<EFBFBD><EFBFBD><EFBFBD>嚗?
目前Python微服务还在本地运行,需要以下两种方案之一:
**方案APython服务也部署到SAE推荐**
1. <EFBFBD>𥕦遣 `extraction_service/Dockerfile`嚗?
1. 创建 `extraction_service/Dockerfile`
```dockerfile
FROM python:3.10-slim
@@ -721,28 +721,28 @@ npm run build
docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/python-dev:v1.0.0
```
3. <EFBFBD>沒AE<EFBFBD>𥕦遣<EFBFBD><EFBFBD><EFBFBD>?`aiclinical-python-dev`
3. 在SAE创建新应用 `aiclinical-python-dev`
4. 靽格㺿Node<EFBFBD>𡒊垢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
4. 修改Node后端环境变量:
```bash
EXTRACTION_SERVICE_URL=http://python服务的SAE内网地址:8000
```
**方案B使用内网穿透临时开发**
1. 雿輻鍂ngrok<EFBFBD>餻rp蝑匧極<EFBFBD>?
2. <EFBFBD>𧋦<EFBFBD>?000蝡臬藁<E887AC>湧蠧<E6B9A7><EFBFBD>蝵?
1. 使用ngrok或frp等工具
2. 将本地8000端口暴露到公网
3. 修改环境变量为公网地址
---
## <EFBFBD><EFBFBD> <20>函蔡摰峕<E691B0><EFBFBD><E79289><EFBFBD><E4BAA4>?
## 📊 部署完成检查清单
### <EFBFBD>?<3F>𡒊垢<F0A1928A>函蔡
### ✅ 后端部署
- [ ] Docker镜像构建成功
- [ ] 镜像推送到阿里云ACR
- [ ] RDS<EFBFBD>唳旿摨㯄<EFBFBD>蝵桀<EFBFBD><EFBFBD>?
- [ ] RDS数据库配置完成
- [ ] RDS白名单已添加
- [ ] OSS Bucket创建完成
- [ ] RAM用户权限配置正确
@@ -751,18 +751,18 @@ npm run build
- [ ] 健康检查通过
- [ ] `/health` 接口返回正常
### <EFBFBD>?<3F>滨垢<E6BBA8>函蔡
### ✅ 前端部署
- [ ] 前端代码构建成功
- [ ] API地址配置正确
- [ ] 文件上传到OSS
- [ ] <EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝡蹱<EFBFBD><EFBFBD><EFBFBD>?
- [ ] <EFBFBD>滨垢憿菟𢒰<EFBFBD>航挪<EFBFBD>?
- [ ] 静态网站托管开启
- [ ] 前端页面可访问
- [ ] 前后端通信正常
### <EFBFBD>?<3F>唳旿摨?
### ✅ 数据库
- [ ] <EFBFBD>唳旿摨栞<EFBFBD>蝘餅<EFBFBD>銵峕<EFBFBD><EFBFBD>?
- [ ] 数据库迁移执行成功
- [ ] Schema创建完成
- [ ] 测试数据插入成功
@@ -772,38 +772,38 @@ npm run build
### 📝 记录重要信息
霂瑕<EFBFBD>隞乩<EFBFBD>靽⊥<EFBFBD>靽嘥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>唳䲮嚗?
请将以下信息保存到安全的地方:
```
<EFBFBD>𣂼<EFBFBD><EFBFBD><EFBFBD>霂閧㴓憓<EFBFBD><EFBFBD>?
【开发测试环境】
后端地址http://你的SAE地址:3001
前端地址http://aiclinical-dev.oss-cn-hangzhou.aliyuncs.com
RDS餈墧𦻖靽⊥<EFBFBD>嚗?
RDS连接信息:
- 地址rm-xxxx.mysql.rds.aliyuncs.com
- 数据库aiclinical_dev
- 用户名aiclinical
- <EFBFBD><EFBFBD>嚗?**嚗<>窈靽嘥<E99DBD>嚗?
- 密码:***(请保密)
OSS靽⊥<EFBFBD>嚗?
OSS信息:
- Bucketaiclinical-dev
- AccessKeyIdLTAI5t***
- AccessKeySecret嚗?**嚗<>窈靽嘥<E99DBD>嚗?
- AccessKeySecret***(请保密)
ACR<EFBFBD>𨅯<EFBFBD>隞枏<EFBFBD>嚗?
ACR镜像仓库:
- 命名空间aiclinical
- 仓库backend-dev, python-dev
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?**嚗<>窈靽嘥<E99DBD>嚗?
- 登录密码:***(请保密)
```
---
## <EFBFBD><EFBFBD> 銝衤<E98A9D>甇?
## 📚 下一步
1. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>函蔡嚗㇃I/CD嚗?*
1. **持续集成/持续部署CI/CD**
- 配置GitHub Actions或Jenkins
- <EFBFBD>芸𢆡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵?
- 自动构建和部署
2. **监控告警**
- 开通阿里云ARMS监控
@@ -811,10 +811,10 @@ ACR镜像仓库
3. **正式环境部署**
- 创建生产环境Bucket`aiclinical-prod`
- <EFBFBD>𥕦遣<EFBFBD>煺漣<EFBFBD><EFBFBD>RDS嚗𡁶𡠺蝡见<EFBFBD>靘?
- 创建生产环境RDS独立实例
- 创建生产环境SAE应用
- 韐凋僭Redis嚗𡁶鍂鈭𡒊<EFBFBD>鈭抒㴓憓<EFBFBD><EFBFBD>摮?
- <EFBFBD>滨蔭CDN嚗𡁜<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>皞?
- 购买Redis:用于生产环境缓存
- 配置CDN加速静态资源
4. **域名配置**
- 购买域名
@@ -826,30 +826,29 @@ ACR镜像仓库
## 💡 成本优化建议
### <EFBFBD><EFBFBD><EFBFBD>霂閧㴓憓<EFBFBD><EFBFBD>敶枏<EFBFBD><EFBFBD>滨蔭嚗?
### 开发测试环境(当前配置)
| 服务 | 规格 | 月费 | 说明 |
|------|------|------|------|
| SAE | 1C2G × 1实例 | ¥150 | 按量付费 |
| RDS | 2C4G <EFBFBD>𡁶鍂<EFBFBD>?| 300 | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?|
| OSS | 100GB摮睃<EFBFBD> | 10 | <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?|
| RDS | 2C4G 通用版 | ¥300 | 包年更优惠 |
| OSS | 100GB存储 | ¥10 | 按实际使用 |
| ACR | 免费额度 | ¥0 | 无需付费 |
| **<EFBFBD><EFBFBD>** | | **瞼460/<EFBFBD>?* | |
| **合计** | | **¥460/月** | |
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD>鞉𧋦<EFBFBD><EFBFBD>撌?
### 节省成本技巧
1. **RDS<EFBFBD><EFBFBD>僑隡䀹<EFBFBD>**嚗朞揚銋?撟游虾<E6B8B8><E899BE><EFBFBD>15%
2. **<EFBFBD>脫𧒄<EFBFBD>喲𡡒SAE**嚗𡁏<E59A97>霂閧㴓憓<E3B493><E68693><EFBFBD>游虾<E6B8B8>喲𡡒嚗諹<E59A97><E8ABB9>?0%
3. **OSS<EFBFBD>笔𦶢<EFBFBD><EFBFBD>**嚗朞挽蝵?0憭拙<E686AD>頧砌<E9A0A7>憸穃<E686B8><E7A983>?
4. **銝滢蝙<EFBFBD>沖edis**嚗𡁶<E59A97>200/<EFBFBD>?
1. **RDS包年优惠**购买1年可节省15%
2. **闲时关闭SAE**测试环境夜间可关闭节省50%
3. **OSS生命周期**设置90天后转低频存储
4. **不使用Redis**:省¥200/
---
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦嚗?* v1.0
**文档版本:** v1.0
**最后更新:** 2025-12-11
**维护者:** 技术架构师
**<EFBFBD><EFBFBD>嚗?* 憒<><E68692><EFBFBD><EFBFBD>嚗諹窈<E8ABB9>𠉛頂<F0A0899B><E9A082><EFBFBD>臬𣪧<E887AC>?
**反馈:** 如有问题,请联系技术团队