本文件为 App 端专用的精简 API 说明,适合移动端按需加载与缓存。字段以“列表精简、详情完整”为原则。
- Base URL:
NEXT_PUBLIC_BASE_URL - 所有响应默认包含:
ok字段 - 错误响应:
ok: false+error/err+ 可选code
- 列表接口返回精简字段(适合瀑布流/网格)
- 详情接口返回完整字段
- 图片字段优先使用:
url_thumb→url_medium→url_large datetime_original优先用于排序,为空时回退created_at
GET /api/media/list
page(number, default 1)pageSize(number, default 20)q(string, optional)category(string, optional)tag(string, optional)sort(date|likes, defaultdate)orientation(landscape|portrait|square, optional)
idurlurl_thumburl_mediumurl_largewidthheightlikeslikeddatetime_originalcreated_at
{
"ok": true,
"results": [
{
"id": "m_123",
"url": "https://img.example.com/2025/01/uuid.jpg",
"url_thumb": "https://img.example.com/2025/01/uuid.jpg?thumb",
"url_medium": "https://img.example.com/2025/01/uuid.jpg?medium",
"url_large": "https://img.example.com/2025/01/uuid.jpg?large",
"width": 4032,
"height": 3024,
"likes": 12,
"liked": false,
"datetime_original": "2025-01-16T08:12:00.000Z",
"created_at": "2025-01-20T10:22:33.000Z"
}
],
"total": 120,
"page": 1,
"pageSize": 20,
"totalPages": 6
}GET /api/media/{id}
- 列表字段 +
filenamesizemime_typecamera_makecamera_modellens_modelapertureshutter_speedisofocal_lengthlocation_namegps_latgps_lontagscategories
{
"ok": true,
"data": {
"id": "m_123",
"url": "https://img.example.com/2025/01/uuid.jpg",
"url_thumb": "https://img.example.com/2025/01/uuid.jpg?thumb",
"url_medium": "https://img.example.com/2025/01/uuid.jpg?medium",
"url_large": "https://img.example.com/2025/01/uuid.jpg?large",
"filename": "DSC001.jpg",
"size": 4021312,
"mime_type": "image/jpeg",
"width": 4032,
"height": 3024,
"camera_make": "Sony",
"camera_model": "A7M4",
"lens_model": "24-70mm",
"aperture": "f/2.8",
"shutter_speed": "1/125",
"iso": "200",
"focal_length": "35mm",
"datetime_original": "2025-01-16T08:12:00.000Z",
"location_name": "Shanghai",
"gps_lat": 31.2304,
"gps_lon": 121.4737,
"tags": ["street", "night"],
"categories": [{"id": "c1", "name": "City"}]
}
}GET /api/albums
page(number, default 1)pageSize(number, default 20)q(string, optional)category(string, optional,分类 slug 或 id)
idtitledescriptioncover_media.url/url_thumb/url_mediummedia_countlikesslugis_protectedcategoriescategory_ids
{
"ok": true,
"albums": [
{
"id": "a_001",
"title": "Japan 2024",
"description": "Tokyo & Kyoto",
"cover_media": {
"id": "m_123",
"url": "https://img.example.com/2025/01/uuid.jpg",
"url_thumb": "https://img.example.com/2025/01/uuid.jpg?thumb",
"url_medium": "https://img.example.com/2025/01/uuid.jpg?medium"
},
"media_count": 88,
"likes": 10,
"slug": "japan-2024",
"is_protected": true,
"categories": [{ "id": "c1", "name": "Travel", "slug": "travel" }],
"category_ids": ["c1"]
}
],
"total": 5,
"totalPages": 1
}GET /api/albums/{id}
{
"ok": true,
"data": {
"id": "a_001",
"title": "Japan 2024",
"description": "Tokyo & Kyoto",
"cover_media": {
"id": "m_123",
"url": "https://img.example.com/2025/01/uuid.jpg",
"url_thumb": "https://img.example.com/2025/01/uuid.jpg?thumb",
"url_medium": "https://img.example.com/2025/01/uuid.jpg?medium"
},
"media_count": 88,
"views": 100,
"likes": 10,
"slug": "japan-2024",
"is_protected": true
}
}GET /api/albums/{id}/media
page(number, default 1)pageSize(number, default 50)
{
"ok": true,
"media": [
{
"id": "m_123",
"url": "https://img.example.com/2025/01/uuid.jpg",
"url_thumb": "https://img.example.com/2025/01/uuid.jpg?thumb",
"url_medium": "https://img.example.com/2025/01/uuid.jpg?medium",
"url_large": "https://img.example.com/2025/01/uuid.jpg?large",
"width": 4032,
"height": 3024,
"likes": 12,
"liked": false,
"datetime_original": "2025-01-16T08:12:00.000Z",
"created_at": "2025-01-20T10:22:33.000Z"
}
],
"total": 88
}POST /api/albums/{id}/unlock
{
"password": "your-password"
}{
"ok": true,
"token": "otp-token-string"
}App 侧应保存 token,并在后续访问相册时通过
Authorization: Bearer <token>传递。
POST /api/media/{id}/like
Request:
{ "action": "like" }Response:
{ "ok": true, "likes": 13, "liked": true }POST /api/albums/{id}/like
Request:
{ "action": "like" }Response:
{ "ok": true, "likes": 11, "liked": true }POST /api/albums/{id}/view
Response:
{ "ok": true }GET /api/media/categories
说明:仅返回 show_in_frontend = 1 的分类。
响应示例:
{
"ok": true,
"categories": [
{ "id": "c1", "name": "City", "slug": "city", "count": 12 }
]
}GET /api/albums/categories
说明:仅返回 show_in_frontend = 1 的分类。
响应示例:
{
"ok": true,
"categories": [
{ "id": "a1", "name": "Travel", "slug": "travel", "count": 5 }
]
}GET /api/albums/{id}/comments
POST /api/albums/{id}/comments
Request:
{
"author": "Tom",
"email": "tom@example.com",
"content": "Great photos!"
}Response:
{ "ok": true }PASSWORD_REQUIRED→ 403INVALID_PASSWORD→ 403UNAUTHORIZED→ 401NOT_FOUND→ 404RATE_LIMITED→ 429VALIDATION_ERROR→ 400SERVER_ERROR→ 500
如需更完整字段或后台接口说明,请参考 API_DOC.md / API_DOC_ZH.md。