# 设计文档：代码清理和规范文档更新

## 概述

本变更旨在清理项目中的临时代码和不一致的注释，完善规范文档，并增强 CI 检查，确保代码质量和规范一致性。

## 设计目标

1. **代码清理**：移除未使用的占位代码，避免潜在的安全风险
2. **注释一致性**：确保代码注释与实际路由路径一致
3. **规范完善**：补充缺失的规范文档和实际案例
4. **自动化检查**：通过 CI 脚本自动检测规范违规

## 架构设计

### 1. 任务模块清理

#### 现状分析

```
internal/
├── routes/
│   ├── routes.go
│   └── task.go              # 占位路由，未接入业务
└── handler/
    └── admin/
        └── task.go          # 占位 Handler，空实现
```

**问题**：
- 占位代码可能被误用，导致鉴权不一致
- 增加代码维护成本
- 没有实际业务价值

#### 解决方案

**完全移除策略**：
- 删除 `internal/routes/task.go`
- 删除 `internal/handler/admin/task.go`
- 从 `internal/routes/routes.go` 移除 `registerTaskRoutes()` 调用
- 清理相关 import

**不采用保留注释/TODO 的原因**：
- 如需任务功能，应重新设计实现
- 避免遗留代码污染代码库

### 2. 注释路径清理

#### 现状分析

Handler 层注释中存在已弃用的路径：

```go
// 错误示例
// @Summary 获取用户列表
// @Router /api/v1/users [get]    // ❌ 已不存在
func ListUsers(c *fiber.Ctx) error { ... }

// 正确示例
// @Summary 获取用户列表
// @Router /api/admin/users [get]  // ✅ 与真实路由一致
func ListUsers(c *fiber.Ctx) error { ... }
```

**真实路由体系**：
- `/api/admin/*`：后台管理接口
- `/api/h5/*`：H5 端接口
- `/api/c/v1/*`：个人客户接口

#### 解决方案

**扫描和修复流程**：

```bash
# 1. 扫描所有残留路径
grep -rn "/api/v1" internal/handler/ | grep -v "_test.go" > /tmp/path_comments.txt

# 2. 根据模块修复
# - internal/handler/admin/*.go → /api/admin/*
# - internal/handler/h5/*.go → /api/h5/*
# - internal/handler/personal/*.go → /api/c/v1/*

# 3. 验证清理结果
grep -r "/api/v1" internal/handler/ | grep -v "_test.go"  # 应无结果
```

### 3. 规范文档更新

#### 3.1 错误处理规范（openspec/specs/error-handling/spec.md）

**新增内容**：

##### Purpose 章节

```markdown
## Purpose

统一项目的错误处理机制，确保：
- 错误码一致性和可追踪性
- 客户端能准确识别错误类型
- 日志记录完整便于排查
- 避免泄露内部实现细节
```

##### 错误报错规范章节

```markdown
## 错误报错规范（必须遵守）

### Handler 层

**禁止行为**：
- ❌ 直接返回/拼接底层错误信息给客户端
  ```go
  // 错误示例
  return response.Error(c, 400, errors.CodeInvalidParam, "参数验证失败: "+err.Error())
  ```

**正确做法**：
- ✅ 参数校验失败统一返回 `errors.New(CodeInvalidParam)`
- ✅ 详细校验错误写日志，对外返回通用消息
  ```go
  // 正确示例
  if err := c.BodyParser(&req); err != nil {
      logger.Error("参数解析失败", zap.Error(err))
      return errors.New(errors.CodeInvalidParam)
  }
  ```

### Service 层

**禁止行为**：
- ❌ 对外返回 `fmt.Errorf(...)`
  ```go
  // 错误示例
  return fmt.Errorf("用户不存在: %w", err)
  ```

**正确做法**：
- ✅ 业务错误使用 `errors.New(code[, msg])`
- ✅ 系统错误使用 `errors.Wrap(code, err[, msg])`
  ```go
  // 正确示例
  if user == nil {
      return errors.New(errors.CodeUserNotFound, "用户不存在")
  }
  if err := db.Save(&user).Error; err != nil {
      return errors.Wrap(errors.CodeInternalError, err, "保存用户失败")
  }
  ```
```

#### 3.2 开发规范（AGENTS.md）

**新增 Code Review 检查清单**：

```markdown
## Code Review 检查清单

### 错误处理
- [ ] Service 层无 `fmt.Errorf` 对外返回
- [ ] Handler 层参数校验不泄露细节
- [ ] 错误码使用正确（4xx vs 5xx）
- [ ] 错误日志完整（包含上下文）

### 代码质量
- [ ] 遵循 Handler → Service → Store → Model 分层
- [ ] 函数长度 ≤ 100 行（核心逻辑 ≤ 50 行）
- [ ] 常量定义在 `pkg/constants/`
- [ ] 使用 Go 惯用法（非 Java 风格）

### 测试覆盖
- [ ] 核心业务逻辑测试覆盖率 ≥ 90%
- [ ] 所有 API 端点有集成测试
- [ ] 测试验证真实功能（不绕过核心逻辑）

### 文档和注释
- [ ] 所有注释使用中文
- [ ] 导出函数/类型有文档注释
- [ ] API 路径注释与真实路由一致
```

#### 3.3 使用指南（docs/003-error-handling/使用指南.md）

**补充实际案例**：

从现有代码库中提取真实案例：
- Service 层业务校验错误示例
- Service 层系统依赖错误示例
- Handler 层参数校验示例
- 单元测试示例

### 4. CI 检查增强

#### 4.1 Service 层错误检查脚本

**文件**：`scripts/check-service-errors.sh`

```bash
#!/bin/bash
# 检查 Service 层是否使用 fmt.Errorf 对外返回

echo "🔍 检查 Service 层错误处理规范..."

FILES=$(find internal/service -name "*.go" -type f)
VIOLATIONS=$(grep -n "fmt\.Errorf" $FILES | grep -v "// whitelist:")

if [ -n "$VIOLATIONS" ]; then
    echo ""
    echo "❌ 发现 Service 层使用 fmt.Errorf："
    echo "$VIOLATIONS"
    echo ""
    echo "请使用以下方式替代："
    echo "  - 业务错误：errors.New(code, msg)"
    echo "  - 系统错误：errors.Wrap(code, err, msg)"
    echo ""
    echo "如果某处确实需要使用 fmt.Errorf（如内部调试），请添加注释：// whitelist:"
    exit 1
fi

echo "✅ Service 层错误处理检查通过"
```

**设计考虑**：
- 仅检查 `internal/service` 目录
- 跳过带有 `// whitelist:` 注释的行（特殊场景）
- 返回非零退出码以集成到 CI

#### 4.2 注释路径检查脚本

**文件**：`scripts/check-comment-paths.sh`

```bash
#!/bin/bash
# 检查注释中的 API 路径是否一致

echo "🔍 检查注释中的 API 路径..."

VIOLATIONS=$(grep -rn "/api/v1" internal/handler/ | grep -v "_test.go")

if [ -n "$VIOLATIONS" ]; then
    echo ""
    echo "❌ 发现残留的 /api/v1 路径注释："
    echo "$VIOLATIONS"
    echo ""
    echo "请修复为真实路径（/api/admin、/api/h5、/api/c/v1）"
    exit 1
fi

echo "✅ 注释路径检查通过"
```

#### 4.3 统一检查脚本

**文件**：`scripts/check-all.sh`

```bash
#!/bin/bash
# 运行所有代码规范检查

set -e

echo "🚀 运行代码规范检查..."
echo ""

bash scripts/check-service-errors.sh
bash scripts/check-comment-paths.sh

echo ""
echo "✅ 所有检查通过"
```

**用途**：
- 本地开发：`bash scripts/check-all.sh`
- CI 集成：在 `.github/workflows/lint.yml` 中调用

#### 4.4 CI 集成（可选）

**文件**：`.github/workflows/lint.yml`

```yaml
name: Code Quality Check

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: '1.25'
      
      - name: Run Code Quality Checks
        run: bash scripts/check-all.sh
```

## 数据流设计

### 注释清理流程

```
┌─────────────────────────────────────────────────────────────┐
│                     注释清理流程                             │
└────────────────────────────┬────────────────────────────────┘
                             │
                ┌────────────▼────────────┐
                │ 1. 扫描残留路径         │
                │ grep -rn "/api/v1"     │
                └────────────┬────────────┘
                             │
                ┌────────────▼────────────┐
                │ 2. 分析文件模块         │
                │ - admin/ → /api/admin  │
                │ - h5/ → /api/h5        │
                │ - personal/ → /api/c   │
                └────────────┬────────────┘
                             │
                ┌────────────▼────────────┐
                │ 3. 批量修复注释         │
                │ - 手动编辑文件          │
                │ - 或使用 sed 批量替换   │
                └────────────┬────────────┘
                             │
                ┌────────────▼────────────┐
                │ 4. 验证清理结果         │
                │ grep -r "/api/v1"      │
                │ 应无结果                │
                └─────────────────────────┘
```

### CI 检查流程

```
┌─────────────────────────────────────────────────────────────┐
│                      CI 检查流程                             │
└────────────────────────────┬────────────────────────────────┘
                             │
                ┌────────────▼────────────┐
                │ 1. 代码提交/PR          │
                └────────────┬────────────┘
                             │
                ┌────────────▼────────────┐
                │ 2. 触发 GitHub Actions  │
                └────────────┬────────────┘
                             │
                ┌────────────▼────────────┐
                │ 3. 运行 check-all.sh    │
                └────────────┬────────────┘
                             │
        ┌────────────────────┼────────────────────┐
        │                    │                    │
┌───────▼────────┐  ┌────────▼────────┐  ┌───────▼────────┐
│ Service 错误检查│  │ 注释路径检查    │  │ 其他检查...    │
└───────┬────────┘  └────────┬────────┘  └───────┬────────┘
        │                    │                    │
        └────────────────────┼────────────────────┘
                             │
                    ┌────────▼────────┐
                    │ 4. 汇总结果      │
                    │ - ✅ 全部通过    │
                    │ - ❌ 有违规      │
                    └────────┬────────┘
                             │
                ┌────────────▼────────────┐
                │ 5. 反馈结果到 PR        │
                │ - 通过：允许合并        │
                │ - 失败：阻止合并        │
                └─────────────────────────┘
```

## 技术决策

### 1. 为什么完全删除任务模块而非保留注释？

**决策**：完全删除占位代码

**理由**：
- **避免误用**：占位代码可能被后续开发者误用
- **代码简洁**：减少维护成本和认知负担
- **版本控制**：Git 历史保留了代码，需要时可恢复
- **重新设计**：如需任务功能，应基于实际需求设计

### 2. 为什么只检查 Service 层的 fmt.Errorf？

**决策**：只强制检查 Service 层

**理由**：
- **影响范围**：Service 层错误直接影响客户端体验
- **降低噪音**：Handler 层有时需要拼接调试信息（不对外返回）
- **测试文件**：测试代码可以使用 `fmt.Errorf` 构造错误

**特殊场景处理**：
- 内部调试需要 `fmt.Errorf`：添加 `// whitelist:` 注释跳过检查

### 3. 为什么文档案例从实际代码提取？

**决策**：使用真实代码案例而非虚构示例

**理由**：
- **实用性**：开发者可直接参考实际实现
- **一致性**：确保文档与代码同步
- **可信度**：真实案例更有说服力

### 4. CI 集成为什么设为可选？

**决策**：CI 集成为可选任务

**理由**：
- **灵活性**：本地开发可直接运行脚本
- **渐进式**：项目可选择何时启用 CI
- **成本考虑**：小型项目可能不需要 CI

## 非功能性需求

### 性能考虑

- **脚本性能**：检查脚本应在 10 秒内完成
- **CI 耗时**：代码检查不应显著增加 CI 时间（< 30 秒）

### 可维护性

- **脚本可读性**：使用清晰的错误消息和帮助文本
- **规则扩展**：易于添加新的检查规则
- **白名单机制**：支持特殊场景豁免

### 兼容性

- **Shell 兼容性**：脚本使用 Bash 标准语法（兼容 Linux/macOS）
- **工具依赖**：仅依赖标准工具（grep、find），无需额外安装

## 验证策略

### 1. 代码清理验证

```bash
# 确认文件已删除
test ! -f internal/routes/task.go
test ! -f internal/handler/admin/task.go

# 确认引用已移除
! grep -r "registerTaskRoutes" internal/
! grep -r "TaskHandler" internal/ | grep -v "_test.go"

# 编译检查
go build -o /tmp/test_api ./cmd/api
go build -o /tmp/test_worker ./cmd/worker
```

### 2. 注释清理验证

```bash
# 确认无残留 /api/v1 注释
! grep -r "/api/v1" internal/handler/ | grep -v "_test.go"
```

### 3. CI 脚本验证

```bash
# 运行检查（应通过）
bash scripts/check-all.sh

# 测试能检测违规（应失败）
echo 'return fmt.Errorf("test")' >> internal/service/test_violation.go
bash scripts/check-service-errors.sh  # 应返回退出码 1
rm internal/service/test_violation.go

# 测试白名单机制（应通过）
echo 'return fmt.Errorf("debug") // whitelist:' >> internal/service/test.go
bash scripts/check-service-errors.sh  # 应返回退出码 0
rm internal/service/test.go
```

### 4. 文档完整性验证

```bash
# 确认规范文档已更新
grep -q "错误报错规范" openspec/specs/error-handling/spec.md
grep -q "错误报错规范" AGENTS.md
grep -q "Service 层错误处理" docs/003-error-handling/使用指南.md

# 确认文档包含实际案例（非空占位）
test $(wc -l < docs/003-error-handling/使用指南.md) -gt 100
```

## 实施计划

### 阶段 1：代码清理（0.5h）

1. 删除任务模块文件
2. 移除路由注册调用
3. 编译验证

### 阶段 2：注释清理（0.5h）

1. 扫描残留路径
2. 批量修复注释
3. 验证清理结果

### 阶段 3：文档更新（1h）

1. 更新错误处理规范
2. 更新开发规范
3. 补充使用指南案例

### 阶段 4：CI 增强（0.5h）

1. 创建检查脚本
2. 测试脚本功能
3. 更新 README

### 阶段 5：全量验证（0.5h）

1. 运行所有验证命令
2. 确认文档完整性
3. 更新 README

## 风险和缓解

| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| 误删有用代码 | 高 | 仔细审查 Git 历史，确认代码未被引用 |
| 注释修复遗漏 | 中 | 使用自动化脚本扫描，手动验证结果 |
| CI 脚本误报 | 中 | 提供白名单机制，允许特殊场景豁免 |
| 文档案例过时 | 低 | 从当前代码库提取，确保时效性 |

## 总结

本设计通过系统化的方法清理代码、完善文档、增强 CI 检查，确保项目代码质量和规范一致性。关键设计决策包括：

1. **完全删除**占位代码而非保留注释
2. **自动化检查** Service 层错误处理规范
3. **真实案例**补充文档使用指南
4. **渐进式集成** CI 检查（可选）

预计总工作量约 3 小时，无 Breaking Changes，对现有功能无影响。
