# PRD_计划执行_P0级问题修复

## 1. 项目概述

### 1.1 项目背景

修复代码质量分析发现的 3 个 P0 级别问题，确保代码安全性和可维护性。

### 1.2 项目目标

| 目标编号 | 描述 | 优先级 |
|----------|------|--------|
| P0-1 | 移除所有硬编码密码，使用环境变量管理 | 高 |
| P0-2 | 修复 server.py 重复赋值 Bug | 高 |
| P0-3 | 消除 skill/ 与 deploy/ 代码重复 | 高 |

### 1.3 开发周期

**总计：1.2 天**

---

## 2. 项目结构

```
troubleshoot-ai-assistant/
├── skill/code/web/           # 开发环境（保留）
│   ├── server.py             # 需修改
│   └── ...
├── deploy/                   # 部署目录
│   ├── check_service.py      # 需修改
│   ├── upload_to_server.py   # 需修改
│   ├── deploy.sh             # 需修改
│   └── web/                  # 删除（改用部署脚本复制）
├── skill/code/
│   ├── test_login_auth.py    # 需修改
│   └── test_normal_user.py   # 需修改
├── .env.example              # 新增
├── .gitignore                # 需修改
└── README.md                 # 需修改
```

---

## 3. 技术方案

### 3.1 技术栈

| 技术 | 用途 |
|------|------|
| python-dotenv | 环境变量管理 |
| os.environ.get() | 环境变量读取 |
| Shell 脚本 | 部署自动化 |

### 3.2 核心流程

```
P0-1：移除硬编码密码
├── 1. 创建 .env.example 模板文件
├── 2. 修改所有硬编码密码文件，使用环境变量
├── 3. 更新 .gitignore，忽略 .env 文件
└── 4. 更新 README.md，添加配置说明

P0-2：修复重复赋值 Bug
├── 1. 定位 server.py 第 796-797 行
├── 2. 删除重复的第 797 行
└── 3. 验证流式 API 功能正常

P0-3：消除代码重复
├── 1. 删除 deploy/web/ 目录
├── 2. 更新 deploy/deploy.sh，从 skill/code/web/ 复制
└── 3. 更新 README.md 目录结构说明
```

---

## 4. 详细设计

### 4.1 P0-1：移除硬编码密码

#### 4.1.1 创建 .env.example 模板

```bash
# .env.example - 环境变量配置模板
# 复制此文件为 .env 并填写实际值

# SSH 连接配置
SSH_HOST=192.168.5.60
SSH_USER=ubains
SSH_PASSWORD=your_password_here

# Flask Session 密钥（生产环境必须修改）
SECRET_KEY=your_secret_key_here

# Claude API 配置
CLAUDE_API_BASE=https://office.ubainsyun.com:8400
CLAUDE_API_KEY=your_api_key_here
```

#### 4.1.2 修改 deploy/check_service.py

```python
# 修改前
PASSWORD = 'Ubains@123'

# 修改后
import os
PASSWORD = os.environ.get('SSH_PASSWORD', '')
```

#### 4.1.3 修改 deploy/upload_to_server.py

```python
# 修改前
PASSWORD = 'Ubains@123'

# 修改后
import os
PASSWORD = os.environ.get('SSH_PASSWORD', '')
```

#### 4.1.4 修改 skill/code/test_login_auth.py

```python
# 修改前
ssh.connect('192.168.5.60', username='ubains', password='Ubains@123')

# 修改后
import os
ssh.connect(
    os.environ.get('SSH_HOST', '192.168.5.60'),
    username=os.environ.get('SSH_USER', 'ubains'),
    password=os.environ.get('SSH_PASSWORD', '')
)
```

#### 4.1.5 修改 skill/code/web/server.py

```python
# 修改前
app.secret_key = os.environ.get('SECRET_KEY', 'troubleshoot-secret-key-2026-secure')

# 修改后（移除默认值，强制配置）
app.secret_key = os.environ.get('SECRET_KEY')
if not app.secret_key:
    print("警告：SECRET_KEY 环境变量未设置，使用随机密钥")
    import secrets
    app.secret_key = secrets.token_hex(32)
```

#### 4.1.6 更新 .gitignore

```gitignore
# 环境变量文件
.env
.env.local
.env.*.local
```

---

### 4.2 P0-2：修复重复赋值 Bug

#### 4.2.1 问题定位

skill/code/web/server.py 第 772-797 行：

```python
@app.route('/api/analyze/stream', methods=['GET'])
def analyze_stream():
    project_name = request.args.get('project_name', '').strip()
    system_type = request.args.get('system_type', '').strip()
    apk_product = request.args.get('apk_product', '').strip()
    query = request.args.get('query', '').strip()
    model = request.args.get('model', '') or config.get('default_model', 'glm-5.1')
    query = request.args.get('query', '').strip()  # 重复！需删除
```

#### 4.2.2 修复方案

删除第 797 行重复代码：

```python
@app.route('/api/analyze/stream', methods=['GET'])
def analyze_stream():
    project_name = request.args.get('project_name', '').strip()
    system_type = request.args.get('system_type', '').strip()
    apk_product = request.args.get('apk_product', '').strip()
    query = request.args.get('query', '').strip()
    model = request.args.get('model', '') or config.get('default_model', 'glm-5.1')
    # 删除重复的 query 赋值
```

---

### 4.3 P0-3：消除代码重复

#### 4.3.1 方案选择

采用**部署脚本复制方案**：
- 保留 `skill/code/web/` 作为唯一开发源
- 删除 `deploy/web/` 目录
- 部署时从 `skill/code/web/` 复制到目标位置

**优点**：
- 单一数据源，维护简单
- 无需符号链接（Windows 兼容性差）
- 部署脚本可控

#### 4.3.2 更新 deploy/deploy.sh

```bash
#!/bin/bash

# 部署目录
DEPLOY_DIR="/opt/troubleshoot"
SOURCE_DIR="$(cd "$(dirname "$0")/../skill/code/web" && pwd)"

echo "=== 问题排查助手部署脚本 ==="

# 1. 安装依赖
echo "[1/6] 安装 Python 依赖..."
pip3 install -r ../skill/code/requirements.txt

# 2. 创建部署目录
echo "[2/6] 创建部署目录..."
sudo mkdir -p $DEPLOY_DIR
sudo mkdir -p $DEPLOY_DIR/问题记录

# 3. 复制 Web 服务（从 skill/code/web/）
echo "[3/6] 复制 Web 服务..."
sudo cp -r $SOURCE_DIR/* $DEPLOY_DIR/

# 4. 复制问题记录
echo "[4/6] 复制问题记录..."
sudo cp -r ../deploy/问题记录/* $DEPLOY_DIR/问题记录/

# 5. 复制搜索索引
echo "[5/6] 复制搜索索引..."
sudo cp ../Docs/搜索索引.json $DEPLOY_DIR/

# 6. 创建 systemd 服务
echo "[6/6] 创建 systemd 服务..."
sudo cp ../config/troubleshoot.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable troubleshoot
sudo systemctl start troubleshoot

echo "=== 部署完成 ==="
echo "访问地址: http://$(hostname -I | awk '{print $1}'):8088"
```

#### 4.3.3 删除 deploy/web/ 目录

```bash
rm -rf deploy/web/
```

---

## 5. 实施计划

### 5.1 任务分解

| 序号 | 任务 | 预计时间 | 状态 | 依赖 |
|------|------|----------|------|------|
| 1 | P0-1：移除硬编码密码 | 0.5天 | 待开始 | - |
| 1.1 | 创建 .env.example 模板 | 0.05天 | 待开始 | - |
| 1.2 | 修改 deploy/check_service.py | 0.05天 | 待开始 | 1.1 |
| 1.3 | 修改 deploy/upload_to_server.py | 0.05天 | 待开始 | 1.1 |
| 1.4 | 修改 skill/code/test_*.py | 0.1天 | 待开始 | 1.1 |
| 1.5 | 修改 skill/code/web/server.py | 0.1天 | 待开始 | 1.1 |
| 1.6 | 更新 .gitignore | 0.05天 | 待开始 | 1.1 |
| 1.7 | 更新 README.md | 0.1天 | 待开始 | 1.2-1.6 |
| 2 | P0-2：修复重复赋值 Bug | 0.1天 | 待开始 | - |
| 2.1 | 定位并删除重复代码 | 0.05天 | 待开始 | - |
| 2.2 | 测试流式 API | 0.05天 | 待开始 | 2.1 |
| 3 | P0-3：消除代码重复 | 0.4天 | 待开始 | 1,2 |
| 3.1 | 更新 deploy/deploy.sh | 0.2天 | 待开始 | - |
| 3.2 | 删除 deploy/web/ 目录 | 0.05天 | 待开始 | 3.1 |
| 3.3 | 更新 README.md 目录结构 | 0.1天 | 待开始 | 3.2 |
| 3.4 | 测试部署脚本 | 0.05天 | 待开始 | 3.3 |
| 4 | 整体测试与文档更新 | 0.2天 | 待开始 | 1,2,3 |

**总计：约 1.2 天**

---

## 6. 测试验证

### 6.1 单元测试

- 测试环境变量读取功能
- 测试默认值处理逻辑
- 测试部署脚本复制功能

### 6.2 集成测试

- 测试服务启动（配置环境变量后）
- 测试流式 API 功能
- 测试部署后服务正常运行

### 6.3 验收标准

| 验收项 | 标准 |
|--------|------|
| 硬编码密码移除 | grep 搜索无密码明文 |
| 环境变量配置 | .env.example 存在且格式正确 |
| .gitignore | .env 已被忽略 |
| 重复代码删除 | server.py 无重复赋值 |
| 流式 API | 功能正常返回 |
| 代码重复消除 | deploy/web/ 目录已删除 |
| 部署脚本 | 可正常复制并部署 |

---

## 7. 执行记录

### 7.1 执行日志

| 日期 | 任务 | 执行人 | 结果 | 备注 |
|------|------|--------|------|------|
| 2026-07-12 | P0-1.1 创建 .env.example | Claude | 完成 | 环境变量模板 |
| 2026-07-12 | P0-1.2 修改 deploy/check_service.py | Claude | 完成 | 使用环境变量 |
| 2026-07-12 | P0-1.3 修改 deploy/upload_to_server.py | Claude | 完成 | 使用环境变量 |
| 2026-07-12 | P0-1.4 修改 skill/code/test_*.py | Claude | 完成 | 3个文件 |
| 2026-07-12 | P0-1.5 修改 skill/code/upload_*.py | Claude | 完成 | 3个文件 |
| 2026-07-12 | P0-1.6 修改 server.py SECRET_KEY | Claude | 完成 | 使用随机密钥 |
| 2026-07-12 | P0-1.7 创建 .gitignore | Claude | 完成 | 忽略 .env |
| 2026-07-12 | P0-2 删除重复赋值 | Claude | 完成 | server.py:802 |
| 2026-07-12 | P0-3.1 更新 deploy/deploy.sh | Claude | 完成 | 从 skill/code/web/ 复制 |
| 2026-07-12 | P0-3.2 删除 deploy/web/ | Claude | 完成 | 消除重复代码 |
| 2026-07-12 | P0-3.3 更新 README.md | Claude | 完成 | 目录结构说明 |

### 7.2 问题记录

| 日期 | 问题 | 解决方案 | 状态 |
|------|------|----------|------|
| 2026-07-12 | 发现额外3个文件有硬编码密码 | 同步修改 upload_*.py 文件 | 已解决 |

---

## 8. 注意事项

1. **环境变量配置**：部署前必须配置 .env 文件
2. **测试文件**：修改后需要更新测试环境配置
3. **部署验证**：部署后需验证服务功能正常
4. **向后兼容**：开发环境可使用默认值，生产环境强制配置

---

## 9. 相关文档

- [PRD_需求文档_P0级问题修复](./PRD_需求文档_P0级问题修复.md)
- [README.md](../README.md)
- [部署指南_问题排查助手Web服务.md](./部署指南_问题排查助手Web服务.md)