调研日期: 2026-02-07 | 状态: 待实施
@swagger 注解| 组件 | 状态 | 说明 |
|---|---|---|
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 使用情况 |
完全零注解的自动方案在 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 内置 |
代表:swagger-jsdoc + swagger-ui-express(我们现在用的)
优点 成熟稳定,文档与代码紧密结合,社区资源多
缺点 需要手动编写大量注释,容易遗漏,重构时文档易过期
代表:swagger-autogen
优点 快速上手,路径自动发现
缺点 只能自动提取路径,参数和响应必须手动补充
代表:express-oas-generator
优点 真正零注解,跑过请求就有文档
缺点 冷启动文档不完整,推断 schema 可能不准,生产环境建议关闭
代表:tsoa、NestJS @nestjs/swagger
优点 类型安全,文档自动与代码同步
缺点 必须用 TypeScript + OOP 类语法,改造成本极高
代表:Stoplight Studio、Swagger Editor
优点 规范即文档,前后端可并行开发
缺点 需改变工作习惯,现有项目改造成本高
我们现在用的方式
先画图纸再盖房子
设计优先对我们 现阶段不合适:单人/小团队开发、70+ 已有 API 文件回头补规范成本大、迭代速度快。我们更适合 代码优先 + CI 检查兜底。
保留现有 swagger-jsdoc 注解机制,用 Scalar 替换 Swagger UI 获得现代 UI,加 CI 检查脚本防止遗漏。
@scalar/express-api-reference - MIT 开源,2025-2026 年新星
集成方式:替换 server.js 中的 GET /api-docs,保留 GET /api-docs.json
@swagger 注解静态分析脚本,对比实际路由 vs OpenAPI 文档:
命令:npm run check:api-docs
现有 swagger-custom.html 中的快速登录功能(管理员/超级管理员一键登录)将通过注入脚本的方式迁移到 Scalar:
scalar-login-inject.js,拦截 Scalar HTML 响应注入/api/auth/employee/login 获取 token 后设置到 Scalar 认证| 阶段 | 内容 | 时间 | 改动文件 |
|---|---|---|---|
| 阶段一 | Scalar 替换 Swagger UI + 快速登录迁移 | ~1 小时 |
swagger.config.js (更新 info/tags/security)server.js (L481-515 替换端点)新建 scalar-login-inject.js
|
| 阶段二 | CI 检查脚本 | ~1 小时 |
新建 scripts/check-api-docs.jspackage.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 等 |
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
| 文件 | 端点数(估) | 说明 |
|---|---|---|
guest-auth.js | 13 | 注册/登录/密码重置/邮箱验证 |
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 | 收支记录 |
| 文件 | 说明 |
|---|---|
admin/guest-app.js | Guest App 管理 |
admin/job-titles.js | 职位管理 |
admin/onboarding.js | 租户入驻 |
checkin-config.js | 签到配置 |
messaging-config.js | 消息配置 |
sync-config.js | 同步配置 |
experiments.js | A/B 实验 |
research.js | 市场调研 |
tags.js | 标签管理 |
| 文件 | 说明 |
|---|---|
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 | 待实施