docs: add comprehensive documentation
- Add docstrings to models and main.py - Create API.md with detailed endpoint documentation - Create CHANGELOG.md for version tracking - Enhance FastAPI app metadata (description, version, tags) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
dc463b3bfa
commit
164326ce76
26
CHANGELOG.md
Normal file
26
CHANGELOG.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# 更新日志
|
||||||
|
|
||||||
|
本项目遵循[语义化版本](https://semver.org/lang/zh-CN/)。
|
||||||
|
|
||||||
|
## [1.0.0] - 2026-05-07
|
||||||
|
|
||||||
|
### 新增
|
||||||
|
- 初始版本发布
|
||||||
|
- 健康检查端点 `GET /health`
|
||||||
|
- 项目 CRUD 端点
|
||||||
|
- `GET /items` 列出所有项目
|
||||||
|
- `POST /items` 创建新项目
|
||||||
|
- `GET /items/{id}` 获取单个项目
|
||||||
|
- 完整测试套件(5 个测试用例)
|
||||||
|
- Swagger UI 和 ReDoc 文档支持
|
||||||
|
|
||||||
|
### 文档
|
||||||
|
- README.md 项目说明
|
||||||
|
- API 设计文档
|
||||||
|
- 实现计划文档
|
||||||
|
|
||||||
|
### 技术栈
|
||||||
|
- FastAPI 0.100.0+
|
||||||
|
- Pydantic 数据验证
|
||||||
|
- pytest 测试框架
|
||||||
|
- Uvicorn ASGI 服务器
|
||||||
29
app/main.py
29
app/main.py
@ -1,21 +1,31 @@
|
|||||||
|
"""FastAPI 应用入口。
|
||||||
|
|
||||||
|
提供健康检查和项目 CRUD 端点。
|
||||||
|
"""
|
||||||
from fastapi import FastAPI, HTTPException
|
from fastapi import FastAPI, HTTPException
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
from app.models import Item, ItemCreate
|
from app.models import Item, ItemCreate
|
||||||
|
|
||||||
app = FastAPI(title="FastAPI Example")
|
app = FastAPI(
|
||||||
|
title="FastAPI Example",
|
||||||
|
description="最小化 CRUD API 示例",
|
||||||
|
version="1.0.0"
|
||||||
|
)
|
||||||
|
|
||||||
# 内存存储
|
# 内存存储
|
||||||
_items: Dict[int, Item] = {}
|
_items: Dict[int, Item] = {}
|
||||||
_item_id_counter = 0
|
_item_id_counter = 0
|
||||||
|
|
||||||
|
|
||||||
@app.get("/health")
|
@app.get("/health", tags=["系统"])
|
||||||
async def health_check():
|
async def health_check():
|
||||||
|
"""健康检查端点,返回服务状态。"""
|
||||||
return {"status": "ok"}
|
return {"status": "ok"}
|
||||||
|
|
||||||
|
|
||||||
@app.post("/items", response_model=Item)
|
@app.post("/items", response_model=Item, tags=["项目"])
|
||||||
async def create_item(item: ItemCreate):
|
async def create_item(item: ItemCreate):
|
||||||
|
"""创建新项目。"""
|
||||||
global _item_id_counter
|
global _item_id_counter
|
||||||
_item_id_counter += 1
|
_item_id_counter += 1
|
||||||
new_item = Item(id=_item_id_counter, **item.model_dump())
|
new_item = Item(id=_item_id_counter, **item.model_dump())
|
||||||
@ -23,13 +33,22 @@ async def create_item(item: ItemCreate):
|
|||||||
return new_item
|
return new_item
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items", response_model=list[Item])
|
@app.get("/items", response_model=list[Item], tags=["项目"])
|
||||||
async def list_items():
|
async def list_items():
|
||||||
|
"""列出所有项目。"""
|
||||||
return list(_items.values())
|
return list(_items.values())
|
||||||
|
|
||||||
|
|
||||||
@app.get("/items/{item_id}", response_model=Item)
|
@app.get("/items/{item_id}", response_model=Item, tags=["项目"])
|
||||||
async def get_item(item_id: int):
|
async def get_item(item_id: int):
|
||||||
|
"""获取单个项目。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
item_id: 项目 ID
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
HTTPException: 项目不存在时返回 404
|
||||||
|
"""
|
||||||
if item_id not in _items:
|
if item_id not in _items:
|
||||||
raise HTTPException(status_code=404, detail="Item not found")
|
raise HTTPException(status_code=404, detail="Item not found")
|
||||||
return _items[item_id]
|
return _items[item_id]
|
||||||
@ -1,13 +1,19 @@
|
|||||||
|
"""数据模型定义。
|
||||||
|
|
||||||
|
定义 API 请求和响应使用的 Pydantic 模型。
|
||||||
|
"""
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
class Item(BaseModel):
|
class Item(BaseModel):
|
||||||
|
"""项目完整数据模型,包含 ID。"""
|
||||||
id: Optional[int] = None
|
id: Optional[int] = None
|
||||||
name: str
|
name: str
|
||||||
description: Optional[str] = None
|
description: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
class ItemCreate(BaseModel):
|
class ItemCreate(BaseModel):
|
||||||
|
"""创建项目的请求模型,不包含 ID。"""
|
||||||
name: str
|
name: str
|
||||||
description: Optional[str] = None
|
description: Optional[str] = None
|
||||||
132
docs/API.md
Normal file
132
docs/API.md
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
# API 设计文档
|
||||||
|
|
||||||
|
版本:1.0.0
|
||||||
|
更新日期:2026-05-07
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
本 API 提供简单的 CRUD 操作,用于管理项目(Item)。
|
||||||
|
|
||||||
|
## 基础信息
|
||||||
|
|
||||||
|
- 基础 URL: `http://localhost:8000`
|
||||||
|
- 内容类型: `application/json`
|
||||||
|
- 认证: 无
|
||||||
|
|
||||||
|
## 端点
|
||||||
|
|
||||||
|
### 健康检查
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /health
|
||||||
|
```
|
||||||
|
|
||||||
|
**响应示例:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": "ok"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 创建项目
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /items
|
||||||
|
```
|
||||||
|
|
||||||
|
**请求体:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "string (必填)",
|
||||||
|
"description": "string (可选)"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**响应示例:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "My Item",
|
||||||
|
"description": "A test item"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态码:**
|
||||||
|
- 200: 创建成功
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 列出项目
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /items
|
||||||
|
```
|
||||||
|
|
||||||
|
**响应示例:**
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "My Item",
|
||||||
|
"description": "A test item"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态码:**
|
||||||
|
- 200: 成功
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 获取单个项目
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /items/{item_id}
|
||||||
|
```
|
||||||
|
|
||||||
|
**路径参数:**
|
||||||
|
- `item_id`: 项目 ID (integer)
|
||||||
|
|
||||||
|
**响应示例:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "My Item",
|
||||||
|
"description": "A test item"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**状态码:**
|
||||||
|
- 200: 成功
|
||||||
|
- 404: 项目不存在
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 错误响应
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"detail": "错误描述"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 数据模型
|
||||||
|
|
||||||
|
### Item
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": "integer",
|
||||||
|
"name": "string",
|
||||||
|
"description": "string | null"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ItemCreate
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "string",
|
||||||
|
"description": "string | null"
|
||||||
|
}
|
||||||
|
```
|
||||||
Loading…
x
Reference in New Issue
Block a user