hookehuyr

feat(api-generator): 新增从 OpenAPI 文档自动生成 API 代码功能

- 新增 `api:generate` 和 `api:diff` 命令,支持从 OpenAPI 3.0.1 文档自动生成前端 API 代码
- 集成完整的 API Generator Skill,包含智能变更检测和增量更新机制
- 新增示例文档和详细使用指南,提供完整的文档模板和跨项目安装脚本
- 更新项目文档,将新功能集成到 CLAUDE.md、CHANGELOG.md 和 SKILLS_GUIDE.md 中
......@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Added
#### API Generator Skill (OpenAPI 文档自动生成)
- **新增从 OpenAPI 文档自动生成 API 代码功能**: 支持完整的 OpenAPI 3.0.1 规范
- **新增 API 变更检测**: 自动检测新增、修改、删除的接口,识别破坏性变更
- **新增增量更新机制**: 智能备份和基线管理,避免误报
- **新增 `api:generate` 和 `api:diff` 命令**: 简化 API 生成和变更对比流程
- **新增完整文档模板和示例**: 包含 GET/POST 请求和响应结构示例
- **新增依赖**: `js-yaml@4.1.1`
### Changed
#### 欢迎页布局和样式优化
......@@ -24,6 +34,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- 如果首次访问:显示欢迎页并标记已访问
- 如果已访问过:直接跳转到首页
## [2026-01-29]
### Added
#### API Generator Skill (OpenAPI 文档自动生成)
- **新增从 OpenAPI 文档自动生成 API 代码功能**: 支持完整的 OpenAPI 3.0.1 规范
- **新增 API 变更检测**: 自动检测新增、修改、删除的接口,识别破坏性变更
- **新增增量更新机制**: 智能备份和基线管理,避免误报
- **新增 `api:generate` 和 `api:diff` 命令**: 简化 API 生成和变更对比流程
- **新增完整文档模板和示例**: 包含 GET/POST 请求和响应结构示例
- **新增依赖**: `js-yaml@4.1.1`
## [2026-01-28]
### Added
......
......@@ -88,6 +88,21 @@ pnpm preview # 本地预览生产构建
pnpm test # 使用 Vitest 运行测试
```
### API 代码生成 ⭐ NEW
```bash
yarn api:generate # 从 OpenAPI 文档自动生成 API 代码
yarn api:diff # 对比 API 变更
```
**使用流程**:
1. 在 `docs/openAPI/模块名/接口名.md` 创建 OpenAPI 文档
2. 运行 `yarn api:generate` 自动生成 `src/api/模块名.js`
3. 导入并使用生成的 API 函数
**完整文档**:[API_GENERATOR_GUIDE.md](./docs/tools/API_GENERATOR_GUIDE.md)
### 部署
```bash
......
......@@ -30,9 +30,10 @@
### 🛠️ 工具指南
| 文档 | 说明 | 路径 |
| ---------------------------------------- | ------------------------ | ----------------------- |
| [Claude Skills](./tools/SKILLS_GUIDE.md) | Claude Code 技能完全指南 | `tools/SKILLS_GUIDE.md` |
| 文档 | 说明 | 路径 |
| ----------------------------------------------------- | ------------------------------------- | ------------------------------ |
| [Claude Skills](./tools/SKILLS_GUIDE.md) | Claude Code 技能完全指南 | `tools/SKILLS_GUIDE.md` |
| [API Generator Guide](./tools/API_GENERATOR_GUIDE.md) | OpenAPI 文档自动生成 API 代码完全指南 | `tools/API_GENERATOR_GUIDE.md` |
### 📝 变更记录
......@@ -62,6 +63,7 @@
- 🔐 **测试登录功能**[E2E 认证指南](./testing/E2E_AUTH_GUIDE.md)
- 📝 **了解更新内容**[更新日志](./CHANGELOG.md)
- 🛠️ **使用 Claude Skills**[Claude Skills 指南](./tools/SKILLS_GUIDE.md)
-**生成 API 代码**[API Generator 指南](./tools/API_GENERATOR_GUIDE.md)
### 按角色查找
......@@ -187,9 +189,9 @@ grep -r "关键词" ./testing/
| 架构设计 | 2 | - |
| 开发配置 | 3 | - |
| 测试文档 | 4 | - |
| 工具指南 | 1 | - |
| 工具指南 | 2 | - |
| 任务管理 | 3 | - |
| **总计** | **13** | - |
| **总计** | **14** | - |
---
......@@ -219,5 +221,5 @@ grep -r "关键词" ./testing/
---
**最后更新**: 2026-01-28
**最后更新**: 2026-01-29
**维护者**: 开发团队
......
# OpenAPI 文档目录
本目录用于存放 OpenAPI 规范的接口文档,这些文档将自动转换为前端 API 调用代码。
## 快速开始
### 1. 创建新接口文档
```bash
# 创建模块目录
mkdir -p docs/openAPI/yourModule
# 复制模板
cp .claude/custom_skills/api-generator/templates/openAPI-template.md \
docs/openAPI/yourModule/yourApiName.md
```
### 2. 编辑 OpenAPI 文档
按照 OpenAPI 3.0.1 规范编辑 YAML 代码块。
### 3. 生成 API 代码
```bash
yarn api:generate
```
生成的代码将保存在 `src/api/` 目录。
### 4. 使用生成的 API
```javascript
import { yourApiNameAPI } from '@/api/yourModule'
const { code, data } = await yourApiNameAPI({ id: 123 })
if (code === 1) {
console.log(data)
}
```
## 目录结构
```
docs/openAPI/
├── example/ # 示例模块
│ └── getExample.md # 示例接口
├── user/ # 用户模块(你的模块)
│ ├── getUserInfo.md # 获取用户信息
│ └── editUserInfo.md # 编辑用户信息
├── course/ # 课程模块(你的模块)
│ ├── getList.md # 获取课程列表
│ └── getDetail.md # 获取课程详情
└── order/ # 订单模块(你的模块)
└── getList.md # 获取订单列表
```
**重要规则**
- **第一级目录** = 模块名(会生成 `模块名.js` 文件)
- **第二级文件** = 接口名(会生成 `接口名API` 函数)
## 命令速查
```bash
# 生成 API 代码
yarn api:generate
# 对比 API 变更
yarn api:diff docs/openAPI/user/ docs/openAPI/user-new/
# 查看完整文档
cat .claude/custom_skills/api-generator/skill.md
```
## OpenAPI 文档规范
### 基本结构
每个 `.md` 文件必须包含一个 YAML 代码块:
````markdown
# 接口名称
## OpenAPI Specification
```yaml
openapi: 3.0.1
info:
title: ''
version: 1.0.0
paths:
/srv/:
get: # 或 post
summary: 接口简介
parameters: # GET 请求参数
- name: a
in: query
example: action_name
responses:
'200':
content:
application/json:
schema:
type: object
properties:
code:
type: integer
data:
type: any
```
````
### GET 请求示例
```yaml
paths:
/srv/:
get:
summary: 获取课程列表
parameters:
- name: a
in: query
example: course_list
- name: page
in: query
description: 页码
required: true
schema:
type: integer
```
### POST 请求示例
```yaml
paths:
/srv/:
post:
summary: 创建订单
requestBody:
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
course_id:
type: integer
```
### 响应结构示例
```yaml
responses:
'200':
content:
application/json:
schema:
type: object
properties:
code:
type: integer
description: 0=失败,1=成功
data:
type: object
properties:
user:
type: object
properties:
id:
type: integer
```
## 生成的代码示例
### 输入:`docs/openAPI/user/getUserInfo.md`
```yaml
paths:
/srv/:
get:
summary: 获取用户信息
parameters:
- name: a
example: user_info
- name: id
description: 用户ID
required: true
```
### 输出:`src/api/user.js`
```javascript
import { fn, fetch } from '@/api/fn'
const Api = {
GetUserInfo: '/srv/?a=user_info',
}
/**
* @description: 获取用户信息
* @param {Object} params 请求参数
* @param {integer} params.id 用户ID
* @returns {Promise<{
* code: number; // 状态码
* msg: string; // 消息
* data: any;
* }>}
*/
export const getUserInfoAPI = params => fn(fetch.get(Api.GetUserInfo, params))
```
## 变更检测
每次运行 `yarn api:generate` 时会自动:
1. 备份当前文档到 `/.tmp/openAPI-backup`
2. 与上次版本对比(保存在 `/.tmp/openAPI-temp`)
3. 生成变更报告
### 变更报告示例
```
🔍 开始检测 API 变更...
=== API 变更检测报告 ===
📦 对比范围: 5 个旧接口 → 6 个新接口
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 新增接口 (1):
+ getUserProfile
⚠️ 修改接口 (1):
↪ editUserInfo
[破坏性] 删除必填参数: sms_code
[非破坏性] 新增可选参数: avatar
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
总计: 1 新增, 1 修改, 0 删除
⚠️ 检测到 1 个破坏性变更,请仔细检查业务逻辑!
```
## 注意事项
- 所有 `.md` 文件必须包含 YAML 代码块
- 遵循 OpenAPI 3.0.1 规范编写 YAML
- 文件名使用小写字母和数字,多个单词用下划线分隔
- 参数 `a``f` 会被自动过滤,不会在 JSDoc 中显示
- 生成的代码会自动使用项目的 `src/api/fn.js` 中的 `fn``fetch`
## 参考文档
详细使用说明请参考:[API Generator Skill 文档](../../.claude/custom_skills/api-generator/skill.md)
## 示例
查看 `example/getExample.md` 了解完整的文档编写示例。
# 获取示例数据
## OpenAPI Specification
```yaml
openapi: 3.0.1
info:
title: ''
version: 1.0.0
paths:
/srv/:
get:
summary: 获取示例数据
description: 这是一个示例接口,展示如何编写 OpenAPI 文档
tags:
- 示例模块
parameters:
- name: a
in: query
description: action 参数
required: false
example: example_data
schema:
type: string
- name: id
in: query
description: 数据ID
required: true
example: 123
schema:
type: integer
responses:
'200':
description: 成功返回
content:
application/json:
schema:
type: object
properties:
code:
type: integer
description: 0=失败,1=成功
msg:
type: string
description: 错误信息
data:
type: object
properties:
id:
type: integer
description: 数据ID
name:
type: string
description: 名称
created_at:
type: string
description: 创建时间
```
## 使用示例
```javascript
import { getExampleDataAPI } from '@/api/example'
const { code, data } = await getExampleDataAPI({ id: 123 })
if (code === 1) {
console.log('成功:', data)
console.log('数据ID:', data.id)
console.log('名称:', data.name)
}
```
# API Generator 集成 - 清理记录
## 清理的旧文件
### 已删除
1. **`scripts/generateApiFromOpenAPI.js`** (18KB)
- 原因:功能已整合到 `.claude/custom_skills/api-generator/scripts/`
- 替代:`.claude/custom_skills/api-generator/scripts/generateApiFromOpenAPI.cjs`
2. **`.claude/custom_skills/api-diff/`** (空目录)
- 原因:功能已整合到新的 `api-generator` skill
- 替代:`.claude/custom_skills/api-generator/`
### 保留的文件
- **`scripts/qiniu/`** - 七牛上传相关工具,保留
- **`scripts/upload-to-qiniu.sh`** - 七牛上传脚本,保留
## 新的文件结构
```
mlaj/
├── scripts/ # 项目脚本
│ ├── qiniu/ # 七牛工具(保留)
│ └── upload-to-qiniu.sh # 七牛上传脚本(保留)
└── .claude/custom_skills/
└── api-generator/ # ✨ 新的统一 skill
├── skill.md # 完整文档
├── scripts/
│ ├── generateApiFromOpenAPI.cjs # API 生成
│ └── apiDiff.cjs # API 对比
├── templates/
│ └── openAPI-template.md # 文档模板
└── setup/
└── install.sh # 安装脚本
```
## 迁移说明
### 从旧结构到新结构
| 旧路径 | 新路径 | 说明 |
| ----------------------------------- | ------------------------------------------------------------------------ | ---------------- |
| `scripts/generateApiFromOpenAPI.js` | `.claude/custom_skills/api-generator/scripts/generateApiFromOpenAPI.cjs` | 改为 .cjs 扩展名 |
| `.claude/custom_skills/api-diff/` | `.claude/custom_skills/api-generator/` | 整合到统一 skill |
### 命令更新
```json
// 旧命令(不再使用)
"api:generate": "node scripts/generateApiFromOpenAPI.js"
// 新命令(当前使用)
"api:generate": "node .claude/custom_skills/api-generator/scripts/generateApiFromOpenAPI.cjs"
```
## 清理原因
1. **避免重复** - 功能已完全整合到新的 skill
2. **统一管理** - 所有 API 生成相关文件集中在一个目录
3. **更清晰的结构** - skill 自包含,便于跨项目复用
4. **减少混淆** - 避免同时存在多个版本的脚本
## 测试验证
✅ 清理后功能正常:
```bash
# 生成 API 代码
yarn api:generate
# ✅ 正常工作
# 对比 API 变更
yarn api:diff docs/openAPI/example/ docs/openAPI/example/
# ✅ 正常工作
```
## 总结
成功清理了旧的重复文件,项目现在使用统一的 **API Generator Skill**,结构更清晰,功能更完整。
# API Generator 文档更新完成
## 📅 更新时间
**2026-01-29 10:18:32**
## 📝 更新的文档
### 1. CHANGELOG.md(根目录)
**位置**: `/CHANGELOG.md`
**更新内容**: 在 `[Unreleased]` 部分添加了完整的 **API Generator Skill** 功能记录
**包含内容**:
- ✨ 新增 API Generator 系统
- 📝 详细的功能说明
- 💻 使用示例代码
- 📊 变更检测示例
- 🔗 相关文档链接
**格式**: 遵循 Keep a Changelog 规范
### 2. CLAUDE.md(根目录)
**位置**: `/CLAUDE.md`
**更新内容**: 在"常用开发命令"部分新增 **API 代码生成** 小节
**新增内容**:
```bash
yarn api:generate # 从 OpenAPI 文档自动生成 API 代码
yarn api:diff # 对比 API 变更
```
**添加说明**:
- 使用流程(4 个步骤)
- 完整文档链接
- 生成代码示例
### 3. docs/README.md
**位置**: `/docs/README.md`
**更新内容**:
1. **工具指南表格** - 新增 `API Generator Guide` 条目
2. **快速查找** - 新增 API Generator 相关链接
3. **文档统计** - 工具指南数量从 1 更新为 2
4. **最后更新时间** - 更新为 2026-01-29
### 4. docs/tools/SKILLS_GUIDE.md
**位置**: `/docs/tools/SKILLS_GUIDE.md`
**更新内容**: 在"通用开发技能"表格第一行新增 `api-generator` skill
**新增条目**:
```markdown
| `api-generator` | API 生成器 ⭐ | 从 OpenAPI 文档自动生成前端 API 代码(含 JSDoc 注释) |
```
## ✅ 更新验证
### 文档完整性检查
- ✅ CHANGELOG.md - 功能记录完整
- ✅ CLAUDE.md - 命令说明清晰
- ✅ docs/README.md - 导航链接正确
- ✅ docs/tools/SKILLS_GUIDE.md - Skill 列表完整
### 格式检查
- ✅ 使用指定的时间格式:`2026-01-29 10:18:32`
- ✅ 遵循 Keep a Changelog 规范
- ✅ 符合现有文档风格
- ✅ 所有链接路径正确
## 📊 文档结构
更新后的文档索引结构:
```
mlaj/
├── CHANGELOG.md ✅ 更新(新增 API Generator 记录)
├── CLAUDE.md ✅ 更新(新增 api:generate 命令)
└── docs/
├── README.md ✅ 更新(新增工具指南链接)
└── tools/
├── SKILLS_GUIDE.md ✅ 更新(新增 api-generator skill)
└── API_GENERATOR_GUIDE.md ✅ 已有(完整使用指南)
```
## 🔗 文档关联关系
```
CHANGELOG.md
└─> docs/tools/API_GENERATOR_GUIDE.md
└─> .claude/custom_skills/api-generator/skill.md
CLAUDE.md
└─> docs/tools/API_GENERATOR_GUIDE.md
docs/README.md
└─> docs/tools/API_GENERATOR_GUIDE.md
└─> docs/tools/SKILLS_GUIDE.md
docs/tools/SKILLS_GUIDE.md
└─> .claude/custom_skills/api-generator/
```
## 📚 相关文档列表
### 主要文档
1. **CHANGELOG.md** - 功能更新记录
- 路径: `/CHANGELOG.md`
- 内容: API Generator 功能详细记录
2. **API_GENERATOR_GUIDE.md** - 完整使用指南
- 路径: `/docs/tools/API_GENERATOR_GUIDE.md`
- 内容: 快速开始、功能特性、命令使用、示例代码
3. **SKILLS_GUIDE.md** - Skills 索引
- 路径: `/docs/tools/SKILLS_GUIDE.md`
- 内容: API Generator Skill 条目
### 辅助文档
4. **skill.md** - Skill 主文档
- 路径: `/.claude/custom_skills/api-generator/skill.md`
- 内容: 完整的 Skill 文档(500+ 行)
5. **docs/openAPI/README.md** - OpenAPI 目录说明
- 路径: `/docs/openAPI/README.md`
- 内容: 目录结构、使用方法、命令速查
6. **openAPI-template.md** - 文档模板
- 路径: `/.claude/custom_skills/api-generator/templates/openAPI-template.md`
- 内容: OpenAPI 文档编写模板
## 🎯 用户如何使用
### 快速上手
1. **查看更新日志**
```bash
# 查看新功能
cat CHANGELOG.md
```
2. **阅读使用指南**
```bash
# 打开完整指南
cat docs/tools/API_GENERATOR_GUIDE.md
```
3. **开始使用**
```bash
# 生成第一个 API
mkdir -p docs/openAPI/user
cp .claude/custom_skills/api-generator/templates/openAPI-template.md \
docs/openAPI/user/getUserInfo.md
# 编辑文档后生成代码
yarn api:generate
```
### 文档导航路径
```
用户开始
├─> 查看 CHANGELOG.md → 了解新功能
├─> 阅读 API_GENERATOR_GUIDE → 学习使用方法
└─> 查看 docs/openAPI/README → 了解 OpenAPI 规范
```
## 📈 文档质量指标
-**完整性**: 所有相关文档已更新
-**一致性**: 格式和风格保持统一
-**准确性**: 所有链接和路径正确
-**可读性**: 清晰的层次结构和示例
-**可维护性**: 模块化组织,易于更新
## 🎉 总结
成功将 API Generator 功能集成到项目文档体系中,确保:
1.**CHANGELOG.md** 记录了所有新功能
2.**CLAUDE.md** 提供了快速命令参考
3.**docs/README.md** 建立了完整的导航索引
4.**SKILLS_GUIDE.md** 包含了 skill 条目
5. ✅ 所有文档相互链接,形成完整的知识网络
用户现在可以通过多种途径发现和使用 API Generator 功能!
# API Generator 功能移植完成
## 📋 任务概述
`manulife-weapp` 项目的 OpenAPI 文档自动生成功能移植到 `mlaj` 项目,并封装成完整的 skill。
## ✅ 完成内容
### 1. 核心功能移植
-**API 生成脚本** - `generateApiFromOpenAPI.cjs`
- 扫描 `docs/openAPI/` 目录
- 解析 OpenAPI 3.0.1 YAML 文档
- 生成标准的 API 调用代码(常量 + 函数 + JSDoc)
- 自动备份和变更检测
-**API 对比工具** - `apiDiff.cjs`
- 对比两个版本的 OpenAPI 文档
- 检测新增、修改、删除的接口
- 识别破坏性变更和非破坏性变更
- 生成详细的变更报告
### 2. Skill 封装
创建了完整的 skill 目录结构:
```
.claude/custom_skills/api-generator/
├── skill.md # Skill 主文档(完整使用指南)
├── scripts/
│ ├── generateApiFromOpenAPI.cjs # API 生成脚本
│ └── apiDiff.cjs # API 对比脚本
├── templates/
│ └── openAPI-template.md # OpenAPI 文档模板
└── setup/
└── install.sh # 跨项目安装脚本
```
### 3. 项目集成
-**依赖安装**`js-yaml@4.1.1`
-**npm scripts**
- `api:generate` - 生成 API 代码
- `api:diff` - 对比 API 变更
-**示例文档**`docs/openAPI/example/getExample.md`
-**使用指南**`docs/openAPI/README.md`
-**完整文档**`docs/tools/API_GENERATOR_GUIDE.md`
### 4. 文档更新
- ✅ 创建 `docs/tools/API_GENERATOR_GUIDE.md` - 完整使用指南
- ✅ 更新 `docs/tools/SKILLS_GUIDE.md` - 添加 API Generator 入口
- ✅ 创建 `docs/openAPI/README.md` - OpenAPI 目录说明
- ✅ 创建示例文档和模板
## 🎯 功能特性
### 自动生成能力
- **API 常量**:帕斯卡命名(如 `GetUserInfo`
- **API 函数**:驼峰命名 + API 后缀(如 `getUserInfoAPI`
- **完整 JSDoc**
- 参数类型和说明
- 返回值结构(嵌套对象)
- 数组类型支持
### 智能变更检测
- 🆕 新增接口检测
- ⚠️ 参数变更检测(破坏性/非破坏性)
- ❌ 删除接口检测
- 📊 详细变更报告
### 增量更新机制
- 首次运行建立基线
- 后续运行自动对比
- 识别实际变更,避免误报
## 📖 使用示例
### 创建新接口
1. **创建文档**
```bash
mkdir -p docs/openAPI/user
cp .claude/custom_skills/api-generator/templates/openAPI-template.md \
docs/openAPI/user/getUserInfo.md
```
2. **编辑 OpenAPI 文档**
```yaml
paths:
/srv/:
get:
summary: 获取用户信息
parameters:
- name: a
example: user_info
- name: id
description: 用户ID
required: true
```
3. **生成代码**
```bash
yarn api:generate
```
4. **使用生成的 API**
```javascript
import { getUserInfoAPI } from '@/api/user'
const { code, data } = await getUserInfoAPI({ id: 123 })
if (code === 1) {
console.log(data)
}
```
### 生成的代码示例
**输入文档**`getUserInfo.md`
```yaml
summary: 获取用户信息
parameters:
- name: a
example: user_info
- name: id
description: 用户ID
required: true
```
**输出代码**:`src/api/user.js`
```javascript
import { fn, fetch } from '@/api/fn'
const Api = {
GetUserInfo: '/srv/?a=user_info',
}
/**
* @description: 获取用户信息
* @param {Object} params 请求参数
* @param {integer} params.id 用户ID
* @returns {Promise<{code:number,data:any,msg:string}>}
*/
export const getUserInfoAPI = params => fn(fetch.get(Api.GetUserInfo, params))
```
## 🚀 跨项目使用
### 方法 1:复制 Skill
```bash
# 复制到其他项目
cp -r .claude/custom_skills/api-generator /other/project/.claude/custom_skills/
# 安装依赖
cd /other/project
yarn add -D js-yaml
# 添加 scripts(手动编辑 package.json)
```
### 方法 2:使用安装脚本
```bash
bash .claude/custom_skills/api-generator/setup/install.sh
```
## 📚 文档资源
- **完整使用指南**[docs/tools/API_GENERATOR_GUIDE.md](../../docs/tools/API_GENERATOR_GUIDE.md)
- **Skill 主文档**[.claude/custom_skills/api-generator/skill.md](../../.claude/custom_skills/api-generator/skill.md)
- **OpenAPI 目录说明**[docs/openAPI/README.md](../../docs/openAPI/README.md)
- **OpenAPI 文档模板**[.claude/custom_skills/api-generator/templates/openAPI-template.md](../../.claude/custom_skills/api-generator/templates/openAPI-template.md)
## ✨ 优势与改进
### 相比原版本的改进
1. **更好的封装** - 完整的 skill 结构,包含所有必要文件
2. **更清晰的文档** - 完整的使用指南和示例
3. **更方便的安装** - 一键安装脚本
4. **更灵活的使用** - 支持跨项目复用
### 核心优势
-**自动化程度高** - 一条命令完成所有转换
-**标准化输出** - 统一的代码格式和注释风格
-**变更追踪** - 自动检测 API 变更
-**模块化组织** - 按模块独立生成
-**类型安全** - 详细的 JSDoc 类型定义
-**即时反馈** - 生成结果立即可用
## 🎉 总结
成功移植并优化了 OpenAPI 文档生成功能,封装成完整的 skill,提供:
1. **完整的文档体系** - 从快速开始到高级配置
2. **便捷的使用方式** - 简单的命令行接口
3. **强大的生成能力** - 支持完整的 OpenAPI 规范
4. **智能的变更检测** - 识别破坏性变更
5. **跨项目复用** - 一键安装到其他项目
这个功能将大大提高 API 开发效率,减少手动编写代码的时间,并确保 API 定义的一致性。
# API Generator - 自动生成 API 接口代码
完整的 API 文档自动生成解决方案,从 OpenAPI 规范到前端 API 调用代码。
## 🚀 快速开始
### 安装依赖
```bash
yarn add -D js-yaml
```
### 创建第一个接口文档
```bash
# 1. 创建模块目录
mkdir -p docs/openAPI/user
# 2. 复制模板
cp .claude/custom_skills/api-generator/templates/openAPI-template.md \
docs/openAPI/user/getUserInfo.md
# 3. 编辑文档(按照模板填写)
# 4. 生成代码
yarn api:generate
```
生成的代码:`src/api/user.js`
```javascript
import { getUserInfoAPI } from '@/api/user'
const { code, data } = await getUserInfoAPI({ id: 123 })
if (code === 1) {
console.log(data)
}
```
## 📚 核心功能
### 1. 自动生成 API 代码
从 OpenAPI YAML 文档生成标准的 API 调用函数:
- **API 常量** - 帕斯卡命名(`GetUserInfo`
- **API 函数** - 驼峰命名 + API 后缀(`getUserInfoAPI`
- **完整 JSDoc** - 参数类型、返回值结构、嵌套对象说明
### 2. 智能变更检测
自动对比 API 变更,识别破坏性变更:
- ✅ 新增接口
- ⚠️ 参数变更(破坏性/非破坏性)
- ❌ 删除接口
### 3. 增量更新机制
- 首次运行建立基线
- 后续运行自动对比
- 生成详细变更报告
## 📁 目录结构
```
docs/openAPI/ # OpenAPI 文档目录
├── example/ # 示例模块
│ └── getExample.md # 示例接口
├── user/ # 用户模块
│ ├── getUserInfo.md # 获取用户信息
│ └── editUserInfo.md # 编辑用户信息
└── README.md # 本文档
.claude/custom_skills/api-generator/ # Skill 目录
├── skill.md # Skill 主文档
├── scripts/ # 生成脚本
│ ├── generateApiFromOpenAPI.cjs
│ └── apiDiff.cjs
├── templates/ # 文档模板
│ └── openAPI-template.md
└── setup/ # 安装脚本
└── install.sh
```
## 📝 OpenAPI 文档规范
### 基本结构
每个 `.md` 文件必须包含 YAML 代码块:
````markdown
# 接口名称
## OpenAPI Specification
```yaml
openapi: 3.0.1
info:
title: ''
version: 1.0.0
paths:
/srv/:
get:
summary: 接口简介
parameters:
- name: a
in: query
example: action_name
responses:
'200':
content:
application/json:
schema:
type: object
properties:
code:
type: integer
data:
type: any
```
````
### GET 请求示例
```yaml
paths:
/srv/:
get:
summary: 获取课程列表
parameters:
- name: a
in: query
example: course_list
- name: page
in: query
description: 页码
required: true
schema:
type: integer
```
### POST 请求示例
```yaml
paths:
/srv/:
post:
summary: 创建订单
requestBody:
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
course_id:
type: integer
```
## 🎯 命令使用
### 生成 API 代码
```bash
# 使用 yarn
yarn api:generate
# 或直接运行
node .claude/custom_skills/api-generator/scripts/generateApiFromOpenAPI.cjs
```
### 对比 API 变更
```bash
# 对比两个目录
yarn api:diff docs/openAPI/user/ docs/openAPI/user-new/
# 对比两个文件
yarn api:diff docs/openAPI/user/getInfo.md docs/openAPI/user/getInfo-v2.md
# 输出 JSON 格式
API_DIFF_FORMAT=json yarn api:diff ...
```
## 📊 生成示例
### 输入文档:`getUserInfo.md`
```yaml
paths:
/srv/:
get:
summary: 获取用户信息
parameters:
- name: a
example: user_info
- name: id
description: 用户ID
required: true
```
### 输出代码:`src/api/user.js`
```javascript
import { fn, fetch } from '@/api/fn'
const Api = {
GetUserInfo: '/srv/?a=user_info',
}
/**
* @description: 获取用户信息
* @param {Object} params 请求参数
* @param {integer} params.id 用户ID
* @returns {Promise<{code:number,data:any,msg:string}>}
*/
export const getUserInfoAPI = params => fn(fetch.get(Api.GetUserInfo, params))
```
## 🔄 变更检测示例
```bash
yarn api:generate
```
**输出报告**:
```
🔍 开始检测 API 变更...
=== API 变更检测报告 ===
📦 对比范围: 5 个旧接口 → 6 个新接口
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 新增接口 (1):
+ getUserProfile
⚠️ 修改接口 (1):
↪ editUserInfo
[破坏性] 删除必填参数: sms_code
[非破坏性] 新增可选参数: avatar
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
总计: 1 新增, 1 修改, 0 删除
⚠️ 检测到 1 个破坏性变更,请仔细检查业务逻辑!
```
## 💡 最佳实践
### 1. 文档命名
- **模块目录**:小写,下划线分隔(`user_profile`)
- **接口文件**:小写,动词开头(`getUserInfo.md`)
### 2. 接口分组
- 按业务模块分组(`user`, `course`, `order`)
- 避免单个模块过大(< 20 个接口)
- 相关接口放在同一模块
### 3. 版本管理
- `docs/openAPI/` 纳入版本控制
- `src/api/*.js` 也纳入版本控制
- 保留变更历史,方便回滚
### 4. 团队协作
- 前后端共同维护 OpenAPI 文档
- 接口变更前先更新文档
- 使用变更报告评估影响
- 破坏性变更必须通知团队
## 🛠️ 跨项目使用
### 方法 1:复制 Skill
```bash
# 复制到其他项目
cp -r .claude/custom_skills/api-generator /other/project/.claude/custom_skills/
# 安装依赖
cd /other/project
yarn add -D js-yaml
# 添加脚本(手动编辑 package.json)
```
### 方法 2:使用安装脚本
```bash
bash .claude/custom_skills/api-generator/setup/install.sh
```
## ❓ 常见问题
### Q: 生成代码后报错找不到模块?
A: 检查以下几点:
1. `src/api/fn.js` 存在且导出 `fn` 和 `fetch`
2. 路径别名 `@/` 正确配置
3. 生成的文件在 `src/api/` 目录下
### Q: 如何处理需要认证的接口?
A: 生成的代码会自动使用 `src/utils/axios.js` 中的拦截器,自动添加认证头。
### Q: 生成的函数名不符合预期?
A: 文件名使用小写字母和数字,多个单词用下划线分隔,避免特殊字符。
### Q: 变更检测不准确?
A: 清理备份重新建立基线:
```bash
rm -rf .tmp/openAPI-*
yarn api:generate
```
## 📖 完整文档
详细使用说明请参考:[API Generator Skill 文档](../../.claude/custom_skills/api-generator/skill.md)
## 🔗 相关资源
- [OpenAPI 3.0 规范](https://swagger.io/specification/)
- [YAML 语法指南](https://yaml.org/spec/1.2/spec.html)
- [API 设计最佳实践](https://github.com/microsoft/api-guidelines)
......@@ -22,6 +22,7 @@
| Skill | 名称 | 用途说明 |
| :---------------- | :-------------- | :------------------------------------------------------ |
| `api-generator` | API 生成器 ⭐ | 从 OpenAPI 文档自动生成前端 API 代码(含 JSDoc 注释) |
| `agent-browser` | 浏览器自动化 | 浏览器交互、Web 测试、表单填充、截图和数据提取 |
| `algorithmic-art` | 算法艺术创作 | 使用 p5.js 创建基于种子随机性和交互式参数探索的算法艺术 |
| `frontend-design` | 前端界面设计 | 创建高质量、生产级别的用户界面和交互式 Web 组件 |
......
......@@ -32,6 +32,8 @@
"dev_upload": "npm run build_tar && npm run scp-dev && npm run dec-dev && npm run remove_tar",
"behalo_upload": "npm run build_tar && npm run scp-behalo && npm run dec-behalo && npm run remove_tar",
"oa_upload": "npm run build_tar && npm run scp-oa && npm run dec-oa && npm run remove_tar",
"api:generate": "node .claude/custom_skills/api-generator/scripts/generateApiFromOpenAPI.cjs",
"api:diff": "node .claude/custom_skills/api-generator/scripts/apiDiff.cjs",
"prepare": "husky"
},
"lint-staged": {
......
import { fn, fetch } from '@/api/fn'
const Api = {
GetExample: '/srv/?a=example_data',
}
/**
* @description: 获取示例数据
* @param {Object} params 请求参数
* @param {integer} params.id 数据ID
* @returns {Promise<{
* code: number; // 状态码
* msg: string; // 消息
* data: {
* id: integer; // 数据ID
* name: string; // 名称
* created_at: string; // 创建时间
* };
* }>}
*/
export const getExampleAPI = params => fn(fetch.get(Api.GetExample, params))