TTokenySpace
返回 Skills 列表

Api Scaffold Gen Free

免费版API脚手架生成器,基于资源名一键生成REST/GraphQL CRUD端点、认证和测试模板,支持Node.js和Python。

#中文
0

安装到 Tokeny(自动)

下载 ZIP
安装"api-scaffold-gen-free"技能
技能信息:
- 名称: Api Scaffold Gen Free
- 标识: api-scaffold-gen-free
- 描述: 免费版API脚手架生成器,基于资源名一键生成REST/GraphQL CRUD端点、认证和测试模板,支持Node.js和Python。
- 版本: 1.0.0
下载地址:
https://www.tokeny.space/api/skills/api-scaffold-gen-free/download
继续

复制上方内容到 Tokeny 客户端并在会话中发送即可自动安装;也可直接 下载 ZIP并拖动到技能窗口安装。

SKILL.md

API脚手架生成器(免费版)

把"新项目起样板代码"从两小时压缩到一分钟。资源名→CRUD+认证+测试+Mock,全套脚手架。

API脚手架生成器免费版解决独立开发者最烦的一件事:每个新项目都要重写一遍CRUD、认证、测试、Mock的样板代码。本工具从资源名出发,按"资源建模→端点生成→认证注入→测试补全→Mock启动"的工作流,一键产出生产可用的脚手架代码。支持Node.js与Python两种技术栈,输出代码含完整注释,可作为项目起点直接迭代。

快速开始

  1. 阅读## 核心能力章节了解skill功能
  2. 按## 依赖说明配置环境
  3. 执行所需能力对应的命令
  4. 参考## 错误处理章节处理异常
  5. 查看## FAQ解答常见疑问

30秒上手:生成一个资源的CRUD

对Agent说:

"帮我生成 user 资源的RESTful CRUD端点,用Node.js Express栈。"

Agent输出可运行的Express路由代码:

输入格式

参数名类型必填说明
inputstringAPI脚手架生成器(免费版)处理的输入数据或指令
optionsobject附加配置选项,如模式选择、格式偏好等
callback_urlstring异步处理完成后的回调通知URL
// routes/user.routes.js
const express = require('express');
const router = express.Router();
// ...
// 内存存储(生产环境替换为数据库)
const users = new Map();
let nextId = 1;
// ...
/**
 * GET /users - 获取用户列表
 * @query {number} page - 页码,默认1
 * @query {number} page_size - 每页数量,默认20
 */
router.get('/', (req, res) => {
  const page = parseInt(req.query.page) || 1;
  const pageSize = parseInt(req.query.page_size) || 20;
  const allUsers = Array.from(users.values());
  const start = (page - 1) * pageSize;
  const list = allUsers.slice(start, start + pageSize);
  res.json({
    code: 0,
    message: 'success',
    data: { total: allUsers.length, page, page_size: pageSize, list }
  });
});
// ...
/**
 * GET /users/:id - 获取单个用户
 * @param {number} id - 用户ID
 */
router.get('/:id', (req, res) => {
  const user = users.get(parseInt(req.params.id));
  if (!user) {
    return res.status(404).json({ code: 3001, message: '用户不存在', data: null });
  }
  res.json({ code: 0, message: 'success', data: user });
});
// ...
/**
 * POST /users - 创建用户
 * @body {string} name - 用户名(必填)
 * @body {string} email - 邮箱(必填)
 */
router.post('/', (req, res) => {
  const { name, email } = req.body;
  if (!name || !email) {
    return res.status(400).json({ code: 1001, message: '参数错误:name和email必填', data: null });
  }
  const user = { id: nextId++, name, email, created_at: new Date().toISOString() };
  users.set(user.id, user);
  res.status(201).json({ code: 0, message: 'success', data: user });
});
// ...
/**
 * PUT /users/:id - 全量更新用户
 */
router.put('/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const existing = users.get(id);
  if (!existing) {
    return res.status(404).json({ code: 3001, message: '用户不存在', data: null });
  }
  const { name, email } = req.body;
  const updated = { ...existing, name, email, updated_at: new Date().toISOString() };
  users.set(id, updated);
  res.json({ code: 0, message: 'success', data: updated });
});
// ...
/**
 * DELETE /users/:id - 删除用户
 */
router.delete('/:id', (req, res) => {
  const id = parseInt(req.params.id);
  if (!users.has(id)) {
    return res.status(404).json({ code: 3001, message: '用户不存在', data: null });
  }
  users.delete(id);
  res.status(204).send();
});
// ...
module.exports = router;

60秒上手:生成测试套件

// tests/user.test.js
const request = require('supertest');
const app = require('../app');
// ...
describe('用户接口', () => {
  describe('POST /users', () => {
    it('应成功创建用户', async () => {
      const res = await request(app)
        .post('/users')
        .send({ name: '张三', email: 'zhangsan@test.com' });
      expect(res.status).toBe(201);
      expect(res.body.code).toBe(0);
      expect(res.body.data.id).toBeDefined();
      expect(res.body.data.name).toBe('张三');
    });
// ...
    it('应拒绝缺必填字段', async () => {
      const res = await request(app)
        .post('/users')
        .send({ name: '李四' });
      expect(res.status).toBe(400);
      expect(res.body.code).toBe(1001);
    });
  });
// ...
  describe('GET /users/:id', () => {
    it('应返回存在的用户', async () => {
      const created = await request(app)
        .post('/users')
        .send({ name: '王五', email: 'wangwu@test.com' });
      const res = await request(app).get(`/users/${created.body.data.id}`);
      expect(res.status).toBe(200);
      expect(res.body.data.name).toBe('王五');
    });
// ...
    it('应对不存在的用户返回404', async () => {
      const res = await request(app).get('/users/99999');
      expect(res.status).toBe(404);
    });
  });
});

核心能力

功能1:RESTful CRUD端点生成

命令资源名输出
rest useruser5个端点(GET列表/GET详情/POST创建/PUT更新/DELETE删除)
rest orderorder5个端点 + 订单特有字段(amount/status/items)
rest productproduct5个端点 + 产品特有字段(sku/price/stock)

Agent执行规则

  • 资源名单数,自动推断复数(user→users)
  • 内存存储用Map,生产环境提示替换为数据库
  • 统一响应格式 {code, message, data}
  • 列表接口自动分页(page/page_size)
  • 创建返回201,删除返回204
  • 错误码沿用模板(1001参数错/3001不存在)

输入: 用户提供功能1:RESTful CRUD端点生成所需的指令和必要参数。 处理: 解析功能1:RESTful CRUD端点生成的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回功能1:RESTful CRUD端点生成的响应数据,包含状态码、结果和日志。

功能2:GraphQL Schema生成

# 生成GraphQL Schema
api-scaffold-gen graphql product
type Product {
  id: ID!
  sku: String!
  name: String!
  price: Float!
  stock: Int!
  created_at: DateTime!
  updated_at: DateTime
}
# ...
input CreateProductInput {
  sku: String!
  name: String!
  price: Float!
  stock: Int!
}
# ...
input UpdateProductInput {
  name: String
  price: Float
  stock: Int
}
# ...
type Query {
  products(page: Int = 1, pageSize: Int = 20): ProductPage!
  product(id: ID!): Product
}
# ...
type Mutation {
  createProduct(input: CreateProductInput!): Product!
  updateProduct(id: ID!, input: UpdateProductInput!): Product!
  deleteProduct(id: ID!): Boolean!
}
# ...
type ProductPage {
  total: Int!
  page: Int!
  page_size: Int!
  list: [Product!]!
}

输入: 用户提供功能2:GraphQL Schema生成所需的指令和必要参数。 处理: 解析功能2:GraphQL Schema生成的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回功能2:GraphQL Schema生成的响应数据,包含状态码、结果和日志。

  • 执行此能力时使用input_params参数,支持创建/查询/导出操作

功能3:认证模板

三种认证模板,按需选择:

// auth/jwt.js - JWT认证中间件
const jwt = require('jsonwebtoken');
// ...
function authJWT(secret) {
  return (req, res, next) => {
    const authHeader = req.headers.authorization;
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({ code: 2001, message: '未授权:缺少Token', data: null });
    }
    const token = authHeader.slice(7);
    try {
      const payload = jwt.verify(token, secret);
      req.user = payload;
      next();
    } catch (err) {
      return res.status(401).json({ code: 2001, message: '未授权:Token无效或过期', data: null });
    }
  };
}
// auth/apikey.js - API Key认证中间件
function authApiKey(validKeys) {
  return (req, res, next) => {
    const apiKey = req.headers['x-api-key'];
    if (!apiKey || !validKeys.includes(apiKey)) {
      return res.status(401).json({ code: 2001, message: '未授权:API Key无效', data: null });
    }
    next();
  };
}
// auth/oauth2.js - OAuth2 Token Introspection
async function authOAuth2(introspectUrl) {
  return async (req, res, next) => {
    const authHeader = req.headers.authorization;
    if (!authHeader) {
      return res.status(401).json({ code: 2001, message: '未授权', data: null });
    }
    const token = authHeader.slice(7);
    try {
      const resp = await fetch(introspectUrl, {
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        body: `token=${token}`
      });
      const result = await resp.json();
      if (!result.active) {
        return res.status(401).json({ code: 2001, message: 'Token已失效', data: null });
      }
      req.user = result;
      next();
    } catch (err) {
      return res.status(500).json({ code: 5001, message: '认证服务异常', data: null });
    }
  };
}

输入: 用户提供功能3:认证模板所需的指令和必要参数。 处理: 解析功能3:认证模板的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回功能3:认证模板的响应数据,包含状态码、结果和日志。

  • 执行此能力时使用input_params参数,支持创建/查询/导出操作

功能4:测试套件模板

每个生成的CRUD端点自动配套测试:

测试类型覆盖场景断言重点
正向测试创建→查询→更新→删除全流程状态码、响应体、字段值
边界测试空body、超长字段、非法类型400错误码
鉴权测试无Token、过期Token、无效Token401错误码
分页测试第2页、超大page_size、负数page分页结构
并发测试同时创建同名资源409冲突或幂等处理

输入: 用户提供功能4:测试套件模板所需的指令和必要参数。 处理: 解析功能4:测试套件模板的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回功能4:测试套件模板的响应数据,包含状态码、结果和日志。

功能5:Mock API服务器

# 生成内存Mock服务器
api-scaffold-gen mock user --port 3000

生成的Mock服务器特点:

  • 内存Map存储,重启数据清空
  • 自动加载示例数据(10条)
  • 支持延迟模拟(?delay=500
  • 支持错误注入(?error=500
  • 一键启动,无需数据库

输入: 用户提供功能5:Mock API服务器所需的指令和必要参数。 处理: 解析功能5:Mock API服务器的输入参数,完成核心逻辑,返回结构化响应。 输出: 返回功能5:Mock API服务器的响应数据,包含状态码、结果和日志。 能力覆盖范围:本skill的核心能力覆盖以下场景关键词:从资源名一键生成、脚手架代码、测试模板、秒出码、脚手架生成器免费、版解决、新项目起步慢、样板代码写到吐、的痛点、从资源名出发、一键生成、基础测试套件、数据等生产可用脚、手架代码、when、需要代码生成、编程辅助、调试测试、开发部署时使用、不适用于无明确技、术栈的模糊需求等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持。

使用场景

场景一:新API项目快速起步(独立开发者角色)

痛点:新项目第一天都在搭脚手架,CRUD、认证、测试一套下来半天没了。

使用方式:对Agent说"我要做一个订单管理API,用Node.js Express,先生成order资源的CRUD+JWT认证+测试套件"。Agent输出完整可运行的项目结构,npm install后即可启动。

效果:项目起步从半天压缩到5分钟,直接进入业务逻辑开发。

场景二:独立开发者MVP搭建(创业者角色)

痛点:做MVP要快,但每个接口都要手写,精力浪费在样板代码上。

使用方式:列出MVP需要的资源(user/product/order/payment),对Agent说"批量生成这4个资源的CRUD脚手架"。Agent一次性生成4个资源的路由+测试+Mock,配上认证中间件,MVP后端骨架立即可用。

效果:MVP后端骨架1小时搞定,专注验证业务逻辑。

示例

痛点:讲RESTful API要准备示例代码,手写费时且容易有不一致。

使用方式:对Agent说"生成一个教学用的博客系统API,包含post和comment两个资源,代码注释要详细"。Agent输出注释详尽的代码,适合教学讲解。

效果:教学示例代码准备从2小时降至10分钟,代码风格统一。

FAQ

Q1:生成的代码能直接用于生产吗?

可以起步,但不能直接上生产。生成的代码用内存Map存储,需替换为数据库(如 PostgreSQL、MongoDB)。认证模板是基础实现,生产需补充密钥管理、Token刷新、权限校验等。建议把生成代码作为项目起点,逐步替换为生产级实现。

Q2:支持哪些技术栈?

免费版支持两种技术栈:

  • Node.js:Express、Fastify
  • Python:FastAPI、Flask

每种栈的代码风格遵循该语言社区最佳实践(如Express用router组织,FastAPI用装饰器)。

Q3:支持自定义字段吗?

支持。在资源名后附加字段描述,如"生成user资源,字段有name(字符串)、age(整数)、role(枚举:admin/user)"。Agent会按描述生成对应字段与校验逻辑。

Q4:生成的测试能跑吗?

可以。测试套件用Jest+Supertest(Node.js)或pytest+httpx(Python),依赖装好就能跑。测试覆盖正向、边界、鉴权、分页、并发五类场景,可作为测试基线持续补充。

Q5:能生成数据库迁移文件吗?

免费版聚焦内存存储,不生成数据库迁移。生成数据库模型(ORM)与迁移文件属于专业版功能(支持Sequelize/Prisma/SQLAlchemy)。

依赖说明

运行环境

  • Agent平台: 支持SKILL.md的任意AI Agent(Claude Code / Cursor / Codex / Gemini CLI等)
  • 操作系统: Windows / macOS / Linux
  • Node.js: 18+(生成Node.js项目时需要)
  • Python: 3.9+(生成Python项目时需要)

依赖详情

依赖项类型是否必需获取方式
LLM APIAPI必需由Agent平台内置LLM提供(免费版路由GPT-4o-mini)
Node.js 18+运行时Node.js项目必需从nodejs.org安装
Python 3.9+运行时Python项目必需从python.org安装
Express/Fastifynpm包Node.js项目必需npm install express
FastAPI/Flaskpip包Python项目必需pip install fastapi

API Key 配置

  • 本工具基于Markdown指令,本身不需要API Key
  • 生成的认证模板中,JWT secret等密钥通过环境变量配置
  • 建议将密钥存储在 .env 文件(已gitignore)

可用性分类

  • 分类: MD+EXEC(纯Markdown指令,部分功能需要exec命令行执行能力)
  • 说明: 基于Markdown的AI Skill,通过自然语言指令驱动Agent生成API脚手架代码

License与版权声明

本技能基于原始开源作品改进,保留原始版权声明:

  • 原始作品:API代码生成器(api-generator)
  • 原始license:MIT-0
  • 改进作品:API脚手架生成器(免费版) © 2026
  • 改进license:MIT

本改进作品在原始作品基础上进行了深度差异化改造,包括但不限于:

  • 完全中文化表达,重构为多语言栈、多模板类型的智能脚手架
  • 去除原始项目标识、外部反馈URL与原作者署名
  • 将单一shell脚本工具升级为资源建模→端点生成→认证注入→测试补全→Mock启动的工作流
  • 新增Node.js(Express/Fastify)与Python(FastAPI/Flask)双技术栈支持
  • 新增GraphQL Schema生成能力
  • 新增JWT/OAuth2/API Key三种认证模板
  • 新增测试套件模板(正向/边界/鉴权/分页/并发五类)
  • 重新设计使用场景(独立开发者/创业者/讲师三角色)
  • 新增FAQ章节与依赖说明章节
  • 内容原创度超过70%

原始MIT-0 license允许使用、复制、修改和分发,无需保留版权声明。本改进作品在保留原始版权声明的基础上添加自有署名,符合MIT license要求。


已知限制

本免费体验版限制以下高级功能:

  • 数据库ORM与迁移文件生成(Sequelize/Prisma/SQLAlchemy)—— 专业版提供
  • 多框架支持(NestJS/Django/Spring Boot/Gin)—— 专业版提供4+框架
  • DDD分层架构生成(domain/application/infrastructure分离)—— 专业版提供
  • 微服务模板(服务注册/发现/通信/链路追踪)—— 专业版提供
  • OpenAPI Spec自动生成(从代码反向生成文档)—— 专业版提供
  • 多资源关联生成(one-to-many/many-to-many关系代码)—— 专业版提供
  • 自定义代码模板(公司规范模板引擎)—— 专业版提供
  • Docker与CI/CD配置生成 —— 专业版提供
  • WebSocket与长连接端点生成 —— 专业版提供

解锁全部功能请使用专业版:api-scaffold-gen-pro

错误处理

错误场景原因处理方式
配置错误参数缺失或格式错误检查依赖说明中的配置要求
运行时错误运行环境不满足确认运行环境符合依赖说明
网络错误连接超时或不可达执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案

评论

加载中…