# 多窗口并行开发指南

> 适用场景：多个 Claude Code 窗口同时开发不同子菜单功能
> 创建时间：2026-07-21

---

## 一、核心冲突点

| 冲突点 | 原因 | 解决方案 |
|--------|------|----------|
| SQLite 数据库 | 两个窗口同时写入 `test_platform.db` 会 `database is locked` | 错开数据库操作时间 |
| 后端端口 8001 | 同一端口只能一个实例 | 新窗口使用 8002 端口 |
| Playwright 浏览器 | 两个窗口同时执行用例会抢登录态 | 不同时执行用例 |
| Git 提交 | 同一分支后提交需先 pull | 提交前先 pull，或用不同分支 |

---

## 二、端口隔离方案（推荐）

### 窗口 A（主窗口）— 继续开发会议管理

```bash
# 后端端口：8001
cd backend
uvicorn app.main:app --port 8001

# 前端端口：3000
cd frontend
npm run dev
```

### 窗口 B（新窗口）— 开发其他子菜单

```bash
# 后端端口：8002（使用不同端口）
cd backend
uvicorn app.main:app --port 8002

# 前端端口：3001（使用不同端口）
cd frontend
# 临时修改 vite.config.ts 的 proxy 指向 8002
npm run dev -- --port 3001
```

**注意**：窗口 B 的前端需要临时修改 `vite.config.ts` 中的 proxy target：

```typescript
// vite.config.ts 中临时改为
proxy: {
  '/api': {
    target: 'http://localhost:8002',  // 改为 8002
    changeOrigin: true,
  }
}
```

---

## 三、数据库隔离方案

### 方案 A：错开操作时间（简单）

- 窗口 A 创建用例时，窗口 B 不操作数据库
- 窗口 B 创建用例时，窗口 A 不操作数据库
- 两个窗口不同时运行用例创建脚本

### 方案 B：使用独立数据库副本（更安全）

```bash
# 窗口 B 使用独立的数据库副本
cd backend/data
cp test_platform.db test_platform_dev2.db
```

然后修改 `backend/config.py` 临时指定数据库路径：

```python
# 窗口 B 临时修改
DATABASE_URL = "sqlite+aiosqlite:///./data/test_platform_dev2.db"
```

**缺点**：两个数据库数据不互通，最后需要手动合并。

### 方案 C：模块级隔离（推荐）

两个窗口各自开发不同的模块（module_id 不同），这样：

- 用例数据按模块隔离
- 执行时按模块筛选
- 数据库写入冲突概率降低

---

## 四、Git 提交协作

### 同一分支协作（platform-auto-test）

```bash
# 窗口 A 提交后
git push origin platform-auto-test

# 窗口 B 提交前（先拉取 A 的变更）
git pull origin platform-auto-test
# 如有冲突，解决后再提交
git push origin platform-auto-test
```

### 不同分支协作（更安全）

```bash
# 窗口 B 使用独立分支
git checkout -b feature/数据分析模块
# 开发完成后合并回 platform-auto-test
```

---

## 五、Playwright 执行隔离

### ⚠️ 绝对禁止：两个窗口同时执行用例

**原因**：
1. Playwright 会打开同一个被测系统 `https://192.168.5.44`
2. 两个执行器会互相覆盖登录态
3. 可能导致一个用例失败（登录被另一个踢掉）

### ✅ 正确做法

- **窗口 A 执行用例时，窗口 B 不执行**
- **窗口 B 执行用例时，窗口 A 不执行**
- 或者：窗口 B 只开发代码，不执行用例验证（由窗口 A 统一执行）

---

## 六、实操检查清单

### 开发前确认

| 检查项 | 窗口 A | 窗口 B |
|--------|--------|--------|
| 后端端口 | 8001 | 8002（或不同时启动） |
| 前端端口 | 3000 | 3001（或不同时启动） |
| 开发模块 | 会议管理 | 其他子菜单 |
| git 分支 | platform-auto-test | 同一分支或独立分支 |

### 操作时确认

- [ ] 不同时运行用例创建脚本（操作数据库）
- [ ] 不同时执行测试用例（Playwright 隔离）
- [ ] 提交前先 pull 对方的变更
- [ ] 冲突时及时沟通

---

## 七、推荐分工模式

### 模式 1：代码开发 + 用例验证分离

| 窗口 | 职责 |
|------|------|
| 窗口 A（主） | 用例执行验证、数据库维护、最终提交 |
| 窗口 B（辅） | 纯代码开发（前端组件、后端路由），不执行用例 |

### 模式 2：模块并行开发

| 窗口 | 开发模块 | 用例范围 |
|------|----------|----------|
| 窗口 A | 会议管理 | module_e80a5d08... |
| 窗口 B | 数据分析 | 新建 module_xxx... |

各自创建独立模块，用例互不干扰，最后合并。

---

## 八、快速启动命令

### 窗口 A（主窗口）

```bash
# 后端
cd E:\GithubData\ubains-module-test\platform-auto-test\backend
uvicorn app.main:app --port 8001

# 前端
cd E:\GithubData\ubains-module-test\platform-auto-test\frontend
npm run dev
```

### 窗口 B（新窗口）

```bash
# 后端（不同端口）
cd E:\GithubData\ubains-module-test\platform-auto-test\backend
uvicorn app.main:app --port 8002

# 前端（不同端口，proxy 指向 8002）
cd E:\GithubData\ubains-module-test\platform-auto-test\frontend
# 先修改 vite.config.ts 的 proxy target 为 8002
npm run dev -- --port 3001
```

---

## 九、常见问题

### Q1: 端口被占用怎么办？

```bash
# 查找占用进程
netstat -ano | findstr :8001
# 强制释放（替换 PID）
taskkill /PID <PID> /F
```

### Q2: 数据库锁定怎么办？

等待几秒后重试，或确保另一个窗口没有在写数据库。

### Q3: Git 冲突怎么办？

```bash
# 查看冲突文件
git status
# 手动解决冲突后
git add <冲突文件>
git commit -m "merge: 解决冲突"
```

---

*本文档用于多窗口并行开发场景，确保开发效率和数据安全。*
