southliu/south-admin-fastapi/demo-create
Claude Code and agent skill by southliu/south-admin-fastapi
- community
Checking that the SKILL.md file is still in the repository.
生成或修改增删改查(CRUD)模块时必须使用本skill。当用户要求新增业务模块、生成增删改查接口、创建xxx管理功能、或修改现有CRUD代码时,按本skill规定的文件结构、命名和接口契约生成,保证与项目现有格式一致。适用范围:新建 Model/Schema/Service/Route、批量删除、状态切换、分页过滤等。
Install
npx vskill@latest install southliu/south-admin-fastapi/demo-createSKILL.md
demo-create:fastApi 项目 CRUD 模块生成规范
为 south-admin-fastApi(FastAPI + SQLAlchemy async + MySQL)生成增删改查模块时,必须按本文件的结构和契约执行。以模块名 {{name}}(表 sys_{{name}})为例。
一、要创建/修改的文件(共 5 处)
| 文件 | 作用 | |
|---|---|---|
models/system/{{name}}.py | SQLAlchemy 模型(表名 sys_{{name}}) | |
schemas/{{name}}.py | Pydantic 请求/响应模型(继承 CamelModel) | |
services/system/{{name}}.py | 服务层(业务与数据库操作) | |
api/routes/system/{{name}}.py | 路由层 | |
core/router.py + database/init.sql | 注册路由 + 菜单权限种子数据 |
二、接口契约(与 react-admin 前端对齐,违反即为 bug)
- 响应结构:一律
ResponseModel(code=200, message="...", data=...);业务失败抛HTTPException(status_code=200, detail="原因")(由异常中间件转成统一响应体),不要返回 4xx/5xx HTTP 码。 - 分页参数别名是 `pageSize`:
``python page: int = 1, page_size: int = Query(default=10, alias="pageSize"), ` 禁止裸写 page_size: int = 10`(前端发的是 pageSize,会永远拿到默认值)。
- 分页返回:
{"items": ..., "page": page, "pageSize": page_size, "total": total, "totalPages": ...}。 - JSON 字段驼峰:请求/响应模型必须继承
schemas/base.py的CamelModel(alias_generator=to_camel),时间字段输出用models/base.py的format_datetime()转"YYYY-MM-DD HH:mm:ss"字符串。 - 零值合法:
state=0/status=0是有效值。过滤/更新判断用is not None,禁止用if data.state:(0 会被当成"未传")。 - 更新语义:非空 rule 类字段 → 复用/新建;显式传 null/空 → 解除关联或清空(参照
services/system/menu.py的 update_menu 注释块)。 - 接口面(依赖
get_current_user鉴权):
GET /page、GET /detail、POST /create、PUT /update/{id}、DELETE /{id}、POST /batchDelete、(有状态时)PUT /changeState、GET /list。
- 过滤参数:模糊匹配
LIKE %xx%,参数名与前端搜索框一致;total 跟随过滤。 - 不泄露密码:响应不得包含 password 哈希。
- 软删除:
is_deleted=1+deleted_at;批量删除空 ids 报"请选择要删除的xx"。
三、文件模板
1. models/system/{{name}}.py
2. schemas/{{name}}.py
3. services/system/{{name}}.py
参照 services/system/permission.py / menu.py:函数签名第一个参数是 db: AsyncSession;分页先 count 再 offset/limit;过滤条件同时作用于 count 与 select;软删用 update().values(is_deleted=1, deleted_at=datetime.now())。
4. api/routes/system/{{name}}.py
其余端点按第二节接口面补全,风格与 api/routes/system/permission.py 保持一致(try/except ValueError → HTTPException(200, detail))。
5. 注册与种子数据
core/router.py:system_router.include_router({{name}}.router)(并加 import)database/init.sql:参照"日志管理"三件套追加权限(/{{authority_prefix}}/{{name}}+ index/create/update/view/delete)、菜单(type=2/3)、sys_role_menu授权。
四、完成前自查
- [ ]
uv run python -c "import api.routes.system.{{name}}"(或启动服务)无报错 - [ ] curl 验证:
?pageSize=20生效、过滤生效、create/update/delete/batchDelete 正常 - [ ] 响应 JSON 键为驼峰、时间为
format_datetime字符串
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryChecking.zcode/skills/demo-create/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/southliu/south-admin-fastapi/demo-create)