# API 文档自动生成更新总结

## 📝 更新概述

为了将 B 端认证系统的所有端点包含在自动生成的 OpenAPI 文档中，我们进行了以下更新：

---

## 🔧 更新内容

### 1. **路由注册函数更新**

**文件**: 
- `internal/routes/admin.go`
- `internal/routes/h5.go`

**改动**：将认证端点从直接注册改为使用 `Register` 辅助函数，以便生成文档

**修改前**:
```go
router.Post("/login", h.Login)
router.Post("/refresh-token", h.RefreshToken)
```

**修改后**:
```go
Register(router, doc, basePath, "POST", "/login", h.Login, RouteSpec{
    Summary: "后台登录",
    Tags:    []string{"认证"},
    Input:   new(model.LoginRequest),
    Output:  new(model.LoginResponse),
})
```

**新增端点文档**（共 10 个）:
- ✅ `POST /api/admin/login` - 后台登录
- ✅ `POST /api/admin/logout` - 登出
- ✅ `POST /api/admin/refresh-token` - 刷新 Token
- ✅ `GET /api/admin/me` - 获取当前用户信息
- ✅ `PUT /api/admin/password` - 修改密码
- ✅ `POST /api/h5/login` - H5 登录
- ✅ `POST /api/h5/logout` - 登出
- ✅ `POST /api/h5/refresh-token` - 刷新 Token
- ✅ `GET /api/h5/me` - 获取当前用户信息
- ✅ `PUT /api/h5/password` - 修改密码

---

### 2. **OpenAPI 生成器增强**

**文件**: `pkg/openapi/generator.go`

**新增功能**: 自动添加 Bearer Token 认证定义

**新增代码**:
```go
// addBearerAuth 添加 Bearer Token 认证定义
func (g *Generator) addBearerAuth() {
    bearerFormat := "JWT"
    g.Reflector.Spec.ComponentsEns().SecuritySchemesEns().WithMapOfSecuritySchemeOrRefValuesItem(
        "BearerAuth",
        openapi3.SecuritySchemeOrRef{
            SecurityScheme: &openapi3.SecurityScheme{
                HTTPSecurityScheme: &openapi3.HTTPSecurityScheme{
                    Scheme:       "bearer",
                    BearerFormat: &bearerFormat,
                },
            },
        },
    )
}
```

**效果**: 在 `openapi.yaml` 中自动生成：

```yaml
components:
  securitySchemes:
    BearerAuth:
      bearerFormat: JWT
      scheme: bearer
      type: http
```

---

### 3. **文档生成脚本更新**

**文件**: `cmd/api/docs.go`

**新增 Handler**:
- ✅ `AdminAuth` - 后台认证 Handler
- ✅ `H5Auth` - H5 认证 Handler
- ✅ `Shop` - 店铺管理 Handler
- ✅ `ShopAccount` - 店铺账号 Handler

**修改前**（只有 3 个 Handler）:
```go
accHandler := admin.NewAccountHandler(nil)
roleHandler := admin.NewRoleHandler(nil)
permHandler := admin.NewPermissionHandler(nil)

handlers := &bootstrap.Handlers{
    Account:    accHandler,
    Role:       roleHandler,
    Permission: permHandler,
}
```

**修改后**（7 个 Handler）:
```go
adminAuthHandler := admin.NewAuthHandler(nil, nil)
h5AuthHandler := h5.NewAuthHandler(nil, nil)
accHandler := admin.NewAccountHandler(nil)
roleHandler := admin.NewRoleHandler(nil)
permHandler := admin.NewPermissionHandler(nil)
shopHandler := admin.NewShopHandler(nil)
shopAccHandler := admin.NewShopAccountHandler(nil)

handlers := &bootstrap.Handlers{
    AdminAuth:   adminAuthHandler,
    H5Auth:      h5AuthHandler,
    Account:     accHandler,
    Role:        roleHandler,
    Permission:  permHandler,
    Shop:        shopHandler,
    ShopAccount: shopAccHandler,
}
```

**新增路由注册**:
```go
// 注册后台路由到文档生成器
adminGroup := app.Group("/api/admin")
routes.RegisterAdminRoutes(adminGroup, handlers, &bootstrap.Middlewares{}, adminDoc, "/api/admin")

// 注册 H5 路由到文档生成器
h5Group := app.Group("/api/h5")
routes.RegisterH5Routes(h5Group, handlers, &bootstrap.Middlewares{}, adminDoc, "/api/h5")
```

---

## 📊 生成的文档内容

### 认证端点示例

#### 1. 后台登录
```yaml
/api/admin/login:
  post:
    summary: 后台登录
    tags:
      - 认证
    requestBody:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ModelLoginRequest'
    responses:
      "200":
        description: OK
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ModelLoginResponse'
```

#### 2. 获取当前用户
```yaml
/api/admin/me:
  get:
    summary: 获取当前用户信息
    tags:
      - 认证
    responses:
      "200":
        description: OK
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ModelUserInfo'
```

### 请求/响应模型

自动生成的数据模型包括：
- ✅ `ModelLoginRequest` - 登录请求
- ✅ `ModelLoginResponse` - 登录响应
- ✅ `ModelRefreshTokenRequest` - 刷新 Token 请求
- ✅ `ModelRefreshTokenResponse` - 刷新 Token 响应
- ✅ `ModelChangePasswordRequest` - 修改密码请求
- ✅ `ModelUserInfo` - 用户信息

---

## 🎯 如何使用生成的文档

### 查看文档

生成的 OpenAPI 文档位于项目根目录：
```bash
cat openapi.yaml
```

### 使用 Swagger UI 查看

1. **在线工具**:
   - 访问 https://editor.swagger.io/
   - 将 `openapi.yaml` 内容粘贴进去

2. **本地启动 Swagger UI**:
   ```bash
   docker run -p 8080:8080 \
     -e SWAGGER_JSON=/openapi.yaml \
     -v $(pwd)/openapi.yaml:/openapi.yaml \
     swaggerapi/swagger-ui
   ```
   然后访问 http://localhost:8080

### 导入到 Postman

1. 打开 Postman
2. 点击 "Import"
3. 选择 `openapi.yaml` 文件
4. 自动生成所有 API 请求集合

---

## 🔄 文档生成流程

### 自动生成

文档在每次启动 API 服务时自动生成：

```go
// cmd/api/main.go
func main() {
    // ...
    
    // 12. 生成 OpenAPI 文档
    generateOpenAPIDocs("./openapi.yaml", appLogger)
    
    // 13. 启动服务器
    startServer(app, cfg, appLogger, cancelWatch)
}
```

### 手动生成

如果只想生成文档而不启动服务：

```bash
# 编译
go build -o /tmp/api_docs ./cmd/api/

# 运行并立即停止（文档会在启动时生成）
timeout 3s /tmp/api_docs || true

# 查看生成的文档
cat openapi.yaml
```

---

## 🎨 文档分类（Tags）

生成的文档按以下标签分类：

- **认证** - 所有认证相关端点（登录、登出、刷新等）
- **H5 认证** - H5 端认证端点
- **账号相关** - 账号管理（CRUD、角色分配等）
- **角色** - 角色管理
- **权限** - 权限管理
- **店铺** - 店铺管理
- **店铺账号** - 店铺账号管理

---

## ✅ 验证清单

- [x] 所有认证端点已包含在文档中
- [x] Bearer Token 认证方式已定义
- [x] 请求/响应模型完整
- [x] 端点描述清晰（中文 Summary）
- [x] 端点按标签正确分类
- [x] 后台和 H5 端点都已包含

---

## 📌 注意事项

### 1. **文档与实际路由同步**

由于使用了统一的 `Register` 函数，所有注册的路由都会自动出现在文档中。
确保不会出现文档与实际路由不一致的情况。

### 2. **nil 依赖 Handler**

文档生成时使用 `nil` 依赖创建 Handler：
```go
adminAuthHandler := admin.NewAuthHandler(nil, nil)
```

这是安全的，因为文档生成只需要路由结构，不会实际执行 Handler 逻辑。

### 3. **安全认证标记**

目前文档中的 `BearerAuth` 安全方案已定义，但未自动标记哪些端点需要认证。

**未来改进**（可选）:
可以在 `RouteSpec` 中添加 `RequireAuth bool` 字段，自动为需要认证的端点添加：
```yaml
security:
  - BearerAuth: []
```

---

## 🔮 后续可能的改进

### 1. **错误响应文档**

当前只定义了 200 成功响应，可以添加错误响应：

```go
// 在 RouteSpec 中添加
type RouteSpec struct {
    Summary     string
    Tags        []string
    Input       interface{}
    Output      interface{}
    ErrorOutput interface{}  // 新增
}
```

### 2. **安全端点标记**

为需要认证的端点自动添加安全要求：

```go
// 在 AddOperation 中添加逻辑
if spec.RequireAuth {
    op.Security = []openapi3.SecurityRequirement{
        {"BearerAuth": []string{}},
    }
}
```

### 3. **示例值**

为请求/响应添加示例值，便于前端开发者理解：

```yaml
examples:
  LoginExample:
    value:
      username: "admin"
      password: "Admin@123456"
```

---

## 📖 相关文档

- [API 文档](docs/api/auth.md) - 手写的详细 API 文档
- [使用指南](docs/auth-usage-guide.md) - 认证系统使用指南
- [架构说明](docs/auth-architecture.md) - 认证系统架构设计

---

## 总结

通过这次更新，我们实现了：
1. ✅ **认证端点完整性** - 所有 10 个认证端点都已包含
2. ✅ **安全定义** - Bearer Token 认证方式已定义
3. ✅ **自动同步** - 路由与文档自动保持一致
4. ✅ **易于维护** - 使用统一的 Register 函数

**OpenAPI 文档现在已经完整，可以直接用于前端开发、API 测试和文档展示！** 🎉
