API 文档管理方案

调研日期: 2026-02-07 | 状态: 待实施

目录

1. 背景与问题

当前痛点

现有基础设施

组件状态说明
swagger-jsdoc@6.2.8 已安装 从 JSDoc 注释生成 OpenAPI 规范
swagger-ui-express@5.0.1 已安装但未直接使用 用的是 CDN 版本的自定义 HTML
/api-docs 可用 自定义 Swagger UI + 快速登录按钮
/api-docs.json 可用 OpenAPI JSON(可导入 Postman)
API Registry 内存 Map 统计 API 使用情况

2. 业界调研 (2025-2026)

核心结论

完全零注解的自动方案在 2026 年仍不成熟。所有自动方案只能提取路由路径,参数描述、响应 schema、业务说明都需要人工编写。大型项目的最佳实践是:手动注解 + CI 强制检查 + 现代渲染工具

工具生态一览

工具 下载量/周 Stars 类型 特点
swagger-ui-express 140万+ 1,445 手动注解 老牌稳定,Swagger UI 3.x
swagger-jsdoc 52万+ 1,720 手动注解 JSDoc 注释生成 OpenAPI(我们在用)
tsoa 21万+ 3,875 自动生成 TypeScript 装饰器,需要 OOP 改造
swagger-autogen 8.1万+ 505 半自动 扫描路径自动,参数仍需手动
express-oas-generator 9,173 230 运行时 拦截请求/响应,真正零注解
@scalar/express-api-reference - - 渲染层 2025-2026 新星,MIT 开源,现代 UI
redoc-express - - 渲染层 企业级,FastAPI/Django 内置

3. 五种主流方案对比

方案 A:手动注解(传统主流)

写代码 补 @swagger 注释 swagger-jsdoc 解析 生成 OpenAPI JSON 渲染 UI

代表swagger-jsdoc + swagger-ui-express(我们现在用的)

优点 成熟稳定,文档与代码紧密结合,社区资源多

缺点 需要手动编写大量注释,容易遗漏,重构时文档易过期

方案 B:半自动扫描

写代码 swagger-autogen 扫描源码 自动提取路由路径 参数/响应仍需注释

代表swagger-autogen

优点 快速上手,路径自动发现

缺点 只能自动提取路径,参数和响应必须手动补充

方案 C:运行时拦截

启动服务器 中间件拦截所有请求/响应 自动推断 schema 生成 OpenAPI

代表express-oas-generator

优点 真正零注解,跑过请求就有文档

缺点 冷启动文档不完整,推断 schema 可能不准,生产环境建议关闭

方案 D:TypeScript 装饰器

用装饰器定义路由 TypeScript 类型自动推断 同时生成路由代码 + OpenAPI

代表tsoaNestJS @nestjs/swagger

优点 类型安全,文档自动与代码同步

缺点 必须用 TypeScript + OOP 类语法,改造成本极高

方案 E:设计优先

先写 OpenAPI 规范 团队评审 再写代码实现 CI 校验代码符合规范

代表:Stoplight Studio、Swagger Editor

优点 规范即文档,前后端可并行开发

缺点 需改变工作习惯,现有项目改造成本高

4. 设计优先 vs 代码优先

代码优先(Code-First)

我们现在用的方式

写代码 补文档

设计优先(Design-First)

先画图纸再盖房子

写规范 审批 写代码

对 Celoria 的判断

设计优先对我们 现阶段不合适:单人/小团队开发、70+ 已有 API 文件回头补规范成本大、迭代速度快。我们更适合 代码优先 + CI 检查兜底

5. Celoria 推荐方案

方案:swagger-jsdoc + Scalar + CI 检查

保留现有 swagger-jsdoc 注解机制,用 Scalar 替换 Swagger UI 获得现代 UI,加 CI 检查脚本防止遗漏。

三个组件

1. Scalar 渲染层(替换 Swagger UI)

@scalar/express-api-reference - MIT 开源,2025-2026 年新星

集成方式:替换 server.js 中的 GET /api-docs,保留 GET /api-docs.json

2. 增量注解补充

3. CI 检查脚本

静态分析脚本,对比实际路由 vs OpenAPI 文档:

从 API 文件提取 router.get/post/... 从 OpenAPI spec 提取文档化路由 对比差集 输出覆盖率报告

命令:npm run check:api-docs

快速登录保留方案

现有 swagger-custom.html 中的快速登录功能(管理员/超级管理员一键登录)将通过注入脚本的方式迁移到 Scalar:

6. 实施计划

阶段 内容 时间 改动文件
阶段一 Scalar 替换 Swagger UI + 快速登录迁移 ~1 小时 swagger.config.js (更新 info/tags/security)
server.js (L481-515 替换端点)
新建 scalar-login-inject.js
阶段二 CI 检查脚本 ~1 小时 新建 scripts/check-api-docs.js
package.json (新增命令)
阶段三 P0 注解补充(8 个核心文件) ~2 小时 guest-auth, time-clock, payroll, public/booking, booking-config, booking-policies, day-end-closeout, income-expense
阶段四 P1 注解补充(12 个管理文件) ~2 小时 admin/*, checkin-config, messaging-config, experiments 等
阶段五 P2 注解补充(剩余文件)+ 清理 ~2 小时 mobile/*, templates, chat 等

7. 注解覆盖现状

有注解的文件(36 个,~65%)

appointments.js      cart_appointment.js   cash-drawer.js
centers.js           checkin.js            daily_availability.js
dev.js               discounts.js          employee_availability.js
employee_list.js     employees.js          gift-cards.js
guest-notes.js       guest-relationships.js guests.js
invoices.js          logs.js               loyalty.js
marketing.js         payment-docs.js       payment.js
permissions.js       promotion.js          receipts.js
schedule-templates.js schedules.js         services.js
settings.js          shopping_cart.js      stores.js
sync.js              terminals.js          user_feedback.js
user.js              voice-bot.js
admin/: audit, employees, gift-cards, permissions, roles, services

缺少注解的文件(~19 个核心 + 辅助)

P0 - 核心业务

文件端点数(估)说明
guest-auth.js13注册/登录/密码重置/邮箱验证
time-clock.js~15考勤打卡
payroll.js~8工资计算
public/booking.js~10公开预约 API
booking-config.js~5预约配置
booking-policies.js~5取消费/押金政策
day-end-closeout.js~5日结
income-expense.js~8收支记录

P1 - 管理功能

文件说明
admin/guest-app.jsGuest App 管理
admin/job-titles.js职位管理
admin/onboarding.js租户入驻
checkin-config.js签到配置
messaging-config.js消息配置
sync-config.js同步配置
experiments.jsA/B 实验
research.js市场调研
tags.js标签管理

P2 - 移动端 + 辅助

文件说明
mobile/*.js (7个)员工移动端 API
email-template-builder.js邮件模板构建
templates.js模板管理
chat.js聊天
tenant-activate.js租户激活
demo-request.js演示申请

注解规范模板

/**
 * @swagger
 * /api/{prefix}/{path}:
 *   {method}:
 *     summary: 一句话描述
 *     description: 详细说明(可选)
 *     tags: [{Tag Name}]
 *     security:                    # 需认证时
 *       - bearerAuth: []           # 员工 JWT
 *       - guestBearerAuth: []      # Guest JWT
 *     parameters:                  # GET / 路径参数
 *       - in: query|path
 *         name: xxx
 *         required: true|false
 *         schema:
 *           type: string|integer
 *     requestBody:                 # POST/PUT/PATCH
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             required: [field1]
 *             properties:
 *               field1:
 *                 type: string
 *                 example: value
 *     responses:
 *       200: { description: 成功 }
 *       400: { description: 参数错误 }
 *       401: { description: 未认证 }
 *       403: { description: 权限不足 }
 *       404: { description: 不存在 }
 */

Celoria API 文档管理方案 | 2026-02-07 | 待实施