# Elysia ToDo - 接口文档 > 爱莉希雅待办事项系统 RESTful API 接口文档 > 基础地址:`http://localhost:23994` > 认证方式:无(所有接口均为公开访问) --- ## 目录 - [1. 健康检查](#1-健康检查) - [2. 任务管理 (Tasks)](#2-任务管理-tasks) - [3. 分类管理 (Categories)](#3-分类管理-categories) - [4. 标签管理 (Tags)](#4-标签管理-tags) - [5. 习惯组管理 (Habit Groups)](#5-习惯组管理-habit-groups) - [6. 习惯管理 (Habits)](#6-习惯管理-habits) - [7. 习惯打卡 (Habit Check-ins)](#7-习惯打卡-habit-check-ins) - [8. 纪念日分类 (Anniversary Categories)](#8-纪念日分类-anniversary-categories) - [9. 纪念日管理 (Anniversaries)](#9-纪念日管理-anniversaries) - [10. 财务账户 (Accounts)](#10-财务账户-accounts) - [11. 分期还款 (Debt Installments)](#11-分期还款-debt-installments) - [12. 用户设置 (User Settings)](#12-用户设置-user-settings) - [附录:通用响应格式](#附录通用响应格式) - [附录:数据模型关系图](#附录数据模型关系图) --- ## 1. 健康检查 ### `GET /health` 服务健康检查接口,用于确认服务是否正常运行。 **请求参数:** 无 **响应示例:** ```json { "status": "ok", "message": "Elysia ToDo API is running!" } ``` | 字段 | 类型 | 说明 | |------|------|------| | status | string | 服务状态,`"ok"` 表示正常 | | message | string | 服务描述信息 | --- ## 2. 任务管理 (Tasks) ### `GET /api/tasks` 获取任务列表,支持按状态、分类、优先级筛选和排序。 **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | status | string | 否 | `"all"` | 任务状态:`all`(全部)、`in_progress`(进行中)、`completed`(已完成) | | category_id | integer | 否 | - | 按分类 ID 筛选 | | priority | string | 否 | - | 按优先级筛选:`q1`(重要且紧急)、`q2`(重要不紧急)、`q3`(不重要但紧急)、`q4`(不重要不紧急) | | sort_by | string | 否 | `"created_at"` | 排序字段:`created_at`、`priority`、`due_date` | | sort_order | string | 否 | `"desc"` | 排序方向:`asc`(升序)、`desc`(降序) | **响应示例:** ```json [ { "id": 1, "title": "完成接口文档", "description": "为项目编写完整的 API 接口文档", "priority": "q1", "due_date": "2026-03-15T00:00:00", "is_completed": false, "category_id": 2, "created_at": "2026-03-14T10:00:00", "updated_at": "2026-03-14T10:00:00", "category": { "id": 2, "name": "工作", "color": "#FF6B6B", "icon": "briefcase" }, "tags": [ { "id": 1, "name": "重要" } ] } ] ``` --- ### `POST /api/tasks` 创建新任务。 **请求体:** | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | title | string | **是** | - | 任务标题,最长 200 字符 | | description | string | 否 | null | 任务描述 | | priority | string | 否 | `"q4"` | 优先级:`q1`、`q2`、`q3`、`q4` | | due_date | string | 否 | null | 截止日期,ISO 8601 格式 | | category_id | integer | 否 | null | 所属分类 ID | | tag_ids | integer[] | 否 | [] | 关联标签 ID 列表 | **请求示例:** ```json { "title": "完成接口文档", "description": "为项目编写完整的 API 接口文档", "priority": "q1", "due_date": "2026-03-15T00:00:00", "category_id": 2, "tag_ids": [1, 3] } ``` **响应:** HTTP `201 Created`,返回 `TaskResponse` 对象(格式同上)。 --- ### `GET /api/tasks/{task_id}` 获取单个任务详情。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | task_id | integer | 任务 ID | **响应:** 返回 `TaskResponse` 对象。 **错误响应:** | 状态码 | 说明 | |--------|------| | 404 | 任务不存在 | --- ### `PUT /api/tasks/{task_id}` 更新任务信息(部分更新,只提交需要修改的字段)。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | task_id | integer | 任务 ID | **请求体(所有字段均为可选):** | 字段 | 类型 | 说明 | |------|------|------| | title | string | 任务标题 | | description | string | 任务描述 | | priority | string | 优先级:`q1`、`q2`、`q3`、`q4` | | due_date | string | 截止日期 | | is_completed | boolean | 是否完成 | | category_id | integer | 所属分类 ID | | tag_ids | integer[] | 关联标签 ID 列表 | **响应:** 返回更新后的 `TaskResponse` 对象。 --- ### `DELETE /api/tasks/{task_id}` 删除任务。关联的标签关系将自动解除。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | task_id | integer | 任务 ID | **响应示例:** ```json { "success": true, "message": "任务已删除" } ``` --- ### `PATCH /api/tasks/{task_id}/toggle` 切换任务的完成状态(已完成 ↔ 未完成)。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | task_id | integer | 任务 ID | **响应:** 返回更新后的 `TaskResponse` 对象,其中 `is_completed` 字段已被取反。 --- ## 3. 分类管理 (Categories) ### `GET /api/categories` 获取分类列表,支持分页。 **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | skip | integer | 否 | 0 | 跳过的记录数 | | limit | integer | 否 | 100 | 每页记录数,最大 100 | **响应示例:** ```json [ { "id": 1, "name": "工作", "color": "#FF6B6B", "icon": "briefcase" }, { "id": 2, "name": "学习", "color": "#4ECDC4", "icon": "book" } ] ``` --- ### `POST /api/categories` 创建新分类。 **请求体:** | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | name | string | **是** | - | 分类名称,最长 100 字符 | | color | string | 否 | `"#FFB7C5"` | 颜色值(十六进制) | | icon | string | 否 | `"folder"` | 图标标识 | **响应:** HTTP `201 Created`,返回 `CategoryResponse` 对象。 --- ### `PUT /api/categories/{category_id}` 更新分类信息。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | category_id | integer | 分类 ID | **请求体(所有字段可选):** | 字段 | 类型 | 说明 | |------|------|------| | name | string | 分类名称 | | color | string | 颜色值 | | icon | string | 图标标识 | **响应:** 返回更新后的 `CategoryResponse` 对象。 --- ### `DELETE /api/categories/{category_id}` 删除分类。如果该分类下有关联的任务,将返回 400 错误。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | category_id | integer | 分类 ID | **成功响应:** ```json { "success": true, "message": "分类已删除" } ``` **错误响应:** | 状态码 | 说明 | |--------|------| | 400 | 该分类下存在关联任务,无法删除 | --- ## 4. 标签管理 (Tags) ### `GET /api/tags` 获取标签列表。 **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | skip | integer | 否 | 0 | 跳过的记录数 | | limit | integer | 否 | 100 | 每页记录数 | **响应示例:** ```json [ { "id": 1, "name": "重要" }, { "id": 2, "name": "紧急" }, { "id": 3, "name": "待审核" } ] ``` --- ### `POST /api/tags` 创建新标签。 **请求体:** | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | name | string | **是** | 标签名称,最长 50 字符,全局唯一 | **请求示例:** ```json { "name": "重要" } ``` **响应:** HTTP `201 Created`,返回 `TagResponse` 对象。 **错误响应:** | 状态码 | 说明 | |--------|------| | 400 | 标签名称已存在 | > **注意:** 标签不支持更新操作,如需修改请先删除再重新创建。 --- ### `DELETE /api/tags/{tag_id}` 删除标签,关联的任务-标签关系将自动解除。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | tag_id | integer | 标签 ID | **响应示例:** ```json { "success": true, "message": "标签已删除" } ``` --- ## 5. 习惯组管理 (Habit Groups) 习惯组用于对习惯进行分组管理,类似于文件夹的概念。 ### `GET /api/habit-groups` 获取所有习惯组列表。 **响应示例:** ```json [ { "id": 1, "name": "健康", "color": "#FF6B6B", "icon": "heart", "sort_order": 0 }, { "id": 2, "name": "学习", "color": "#4ECDC4", "icon": "book", "sort_order": 1 } ] ``` --- ### `POST /api/habit-groups` 创建新的习惯组。 **请求体:** | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | name | string | **是** | - | 组名称,最长 100 字符 | | color | string | 否 | `"#FFB7C5"` | 颜色值 | | icon | string | 否 | `"flag"` | 图标标识 | | sort_order | integer | 否 | 0 | 排序顺序 | **响应:** HTTP `201 Created`,返回 `HabitGroupResponse` 对象。 --- ### `PUT /api/habit-groups/{group_id}` 更新习惯组信息。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | group_id | integer | 习惯组 ID | **请求体(所有字段可选):** | 字段 | 类型 | 说明 | |------|------|------| | name | string | 组名称 | | color | string | 颜色值 | | icon | string | 图标标识 | | sort_order | integer | 排序顺序 | **响应:** 返回更新后的 `HabitGroupResponse` 对象。 --- ### `DELETE /api/habit-groups/{group_id}` 删除习惯组。组内的习惯不会被删除,但其 `group_id` 将被设为 `null`。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | group_id | integer | 习惯组 ID | **响应示例:** ```json { "success": true, "message": "习惯组已删除" } ``` --- ## 6. 习惯管理 (Habits) ### `GET /api/habits` 获取习惯列表。 **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | include_archived | boolean | 否 | false | 是否包含已归档的习惯 | **响应示例:** ```json [ { "id": 1, "name": "每日阅读", "description": "至少阅读 30 分钟", "group_id": 2, "target_count": 1, "frequency": "daily", "active_days": "[0,1,2,3,4,5,6]", "is_archived": false, "created_at": "2026-03-01T00:00:00", "updated_at": "2026-03-14T00:00:00", "group": { "id": 2, "name": "学习", "color": "#4ECDC4", "icon": "book", "sort_order": 1 } } ] ``` **HabitResponse 字段说明:** | 字段 | 类型 | 说明 | |------|------|------| | id | integer | 习惯 ID | | name | string | 习惯名称 | | description | string\|null | 习惯描述 | | group_id | integer\|null | 所属习惯组 ID | | target_count | integer | 每日/每周目标次数(≥1) | | frequency | string | 频率:`daily`(每日)、`weekly`(每周) | | active_days | string\|null | 活跃日期(JSON 数组),如 `"[0,2,4]"` 表示周一/三/五(0=周一,6=周日) | | is_archived | boolean | 是否已归档 | | created_at | datetime | 创建时间 | | updated_at | datetime | 更新时间 | | group | object\|null | 关联的习惯组信息 | --- ### `POST /api/habits` 创建新习惯。 **请求体:** | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | name | string | **是** | - | 习惯名称,最长 200 字符 | | description | string | 否 | null | 习惯描述 | | group_id | integer | 否 | null | 所属习惯组 ID | | target_count | integer | 否 | 1 | 目标次数(≥1) | | frequency | string | 否 | `"daily"` | 频率:`daily`、`weekly` | | active_days | string | 否 | null | 活跃日期(JSON 数组字符串) | **响应:** HTTP `201 Created`,返回 `HabitResponse` 对象。 --- ### `PUT /api/habits/{habit_id}` 更新习惯信息。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | habit_id | integer | 习惯 ID | **请求体(所有字段可选):** | 字段 | 类型 | 说明 | |------|------|------| | name | string | 习惯名称 | | description | string | 习惯描述 | | group_id | integer | 所属习惯组 ID | | target_count | integer | 目标次数 | | frequency | string | 频率 | | active_days | string | 活跃日期 | **响应:** 返回更新后的 `HabitResponse` 对象。 --- ### `DELETE /api/habits/{habit_id}` 删除习惯,关联的打卡记录将一并被级联删除。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | habit_id | integer | 习惯 ID | **响应示例:** ```json { "success": true, "message": "习惯已删除" } ``` --- ### `PATCH /api/habits/{habit_id}/archive` 切换习惯的归档状态。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | habit_id | integer | 习惯 ID | **响应:** 返回更新后的 `HabitResponse` 对象,`is_archived` 字段已被取反。 --- ## 7. 习惯打卡 (Habit Check-ins) ### `GET /api/habits/{habit_id}/checkins` 获取习惯的打卡记录。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | habit_id | integer | 习惯 ID | **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | from_date | string | 否 | - | 起始日期(YYYY-MM-DD) | | to_date | string | 否 | - | 结束日期(YYYY-MM-DD) | **响应示例:** ```json [ { "id": 1, "habit_id": 1, "checkin_date": "2026-03-14", "count": 2, "created_at": "2026-03-14T08:00:00" } ] ``` --- ### `POST /api/habits/{habit_id}/checkins` 进行打卡。如果当天已有打卡记录,将累加 `count`;否则创建新记录。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | habit_id | integer | 习惯 ID | **请求体:** | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | count | integer | 否 | 1 | 本次打卡次数 | **响应:** 返回 `CheckinResponse` 对象。 --- ### `DELETE /api/habits/{habit_id}/checkins` 取消打卡(减少当天打卡次数)。如果次数减至 0,将删除该天的打卡记录。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | habit_id | integer | 习惯 ID | **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | count | integer | 否 | 1 | 要减少的次数(≥1) | **响应示例:** ```json { "success": true, "message": "打卡已取消" } ``` --- ### `GET /api/habits/{habit_id}/checkins/stats` 获取习惯的统计数据。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | habit_id | integer | 习惯 ID | **响应示例:** ```json { "total_days": 42, "current_streak": 7, "longest_streak": 15, "today_count": 1, "today_completed": true } ``` **HabitStatsResponse 字段说明:** | 字段 | 类型 | 说明 | |------|------|------| | total_days | integer | 总打卡天数 | | current_streak | integer | 当前连续打卡天数 | | longest_streak | integer | 最长连续打卡天数 | | today_count | integer | 今日已打卡次数 | | today_completed | boolean | 今日目标是否已完成 | --- ## 8. 纪念日分类 (Anniversary Categories) 纪念日分类用于对纪念日进行分组管理。 ### `GET /api/anniversary-categories` 获取所有纪念日分类列表。 **响应示例:** ```json [ { "id": 1, "name": "生日", "icon": "cake", "color": "#FF6B6B", "sort_order": 0 }, { "id": 2, "name": "节日", "icon": "star", "color": "#FFD93D", "sort_order": 1 } ] ``` --- ### `POST /api/anniversary-categories` 创建新的纪念日分类。 **请求体:** | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | name | string | **是** | - | 分类名称,最长 50 字符 | | icon | string | 否 | `"calendar"` | 图标标识 | | color | string | 否 | `"#FFB7C5"` | 颜色值 | | sort_order | integer | 否 | 0 | 排序顺序 | **响应:** HTTP `201 Created`,返回 `AnniversaryCategoryResponse` 对象。 --- ### `PUT /api/anniversary-categories/{category_id}` 更新纪念日分类信息。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | category_id | integer | 纪念日分类 ID | **请求体(所有字段可选):** | 字段 | 类型 | 说明 | |------|------|------| | name | string | 分类名称 | | icon | string | 图标标识 | | color | string | 颜色值 | | sort_order | integer | 排序顺序 | **响应:** 返回更新后的 `AnniversaryCategoryResponse` 对象。 --- ### `DELETE /api/anniversary-categories/{category_id}` 删除纪念日分类。分类下的纪念日不会被删除,但其 `category_id` 将被设为 `null`。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | category_id | integer | 纪念日分类 ID | **响应示例:** ```json { "success": true, "message": "纪念日分类已删除" } ``` --- ## 9. 纪念日管理 (Anniversaries) ### `GET /api/anniversaries` 获取纪念日列表,包含计算出的下次日期、剩余天数和第 N 次纪念日信息。结果按即将到来的日期排序。 **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | category_id | integer | 否 | - | 按分类 ID 筛选 | **响应示例:** ```json [ { "id": 1, "title": "爱莉希雅生日", "date": "2020-03-14", "year": 2020, "category_id": 1, "description": "最重要的日子!", "is_recurring": true, "remind_days_before": 3, "created_at": "2026-01-01T00:00:00", "updated_at": "2026-01-01T00:00:00", "category": { "id": 1, "name": "生日", "icon": "cake", "color": "#FF6B6B", "sort_order": 0 }, "next_date": "2026-03-14", "days_until": 0, "year_count": 6 } ] ``` **计算字段说明:** | 字段 | 类型 | 说明 | |------|------|------| | next_date | date\|null | 下一次纪念日日期 | | days_until | integer\|null | 距离下一次纪念日的天数 | | year_count | integer\|null | 第几次纪念日(从原始年份起算) | --- ### `POST /api/anniversaries` 创建新的纪念日。 **请求体:** | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | title | string | **是** | - | 纪念日标题,最长 200 字符 | | date | string | **是** | - | 日期(YYYY-MM-DD) | | year | integer | 否 | null | 原始年份,用于计算第 N 次 | | category_id | integer | 否 | null | 所属分类 ID | | description | string | 否 | null | 描述信息 | | is_recurring | boolean | 否 | true | 是否每年重复 | | remind_days_before | integer | 否 | 3 | 提前几天提醒 | **响应:** HTTP `201 Created`,返回 `AnniversaryResponse` 对象。 --- ### `GET /api/anniversaries/{anniversary_id}` 获取单个纪念日详情。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | anniversary_id | integer | 纪念日 ID | **响应:** 返回 `AnniversaryResponse` 对象(含计算字段)。 --- ### `PUT /api/anniversaries/{anniversary_id}` 更新纪念日信息。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | anniversary_id | integer | 纪念日 ID | **请求体(所有字段可选):** | 字段 | 类型 | 说明 | |------|------|------| | title | string | 纪念日标题 | | date | string | 日期 | | year | integer | 原始年份 | | category_id | integer | 所属分类 ID | | description | string | 描述信息 | | is_recurring | boolean | 是否每年重复 | | remind_days_before | integer | 提前几天提醒 | **响应:** 返回更新后的 `AnniversaryResponse` 对象。 --- ### `DELETE /api/anniversaries/{anniversary_id}` 删除纪念日。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | anniversary_id | integer | 纪念日 ID | **响应示例:** ```json { "success": true, "message": "纪念日已删除" } ``` --- ## 10. 财务账户 (Accounts) 财务账户支持储蓄账户和债务账户两种类型。GET 列表接口会返回每个账户的分期还款汇总信息。 ### `GET /api/accounts` 获取所有财务账户列表。对于债务类型账户,`installments` 字段会包含分期还款计划摘要。 **响应示例:** ```json [ { "id": 1, "name": "招商银行储蓄卡", "account_type": "savings", "balance": 15000.00, "icon": "bank", "color": "#FF6B6B", "sort_order": 0, "is_active": true, "description": "日常储蓄", "created_at": "2026-01-01T00:00:00", "updated_at": "2026-03-14T00:00:00", "installments": [] }, { "id": 2, "name": "信用卡", "account_type": "debt", "balance": -5000.00, "icon": "credit-card", "color": "#4ECDC4", "sort_order": 1, "is_active": true, "description": null, "created_at": "2026-01-01T00:00:00", "updated_at": "2026-03-14T00:00:00", "installments": [ { "id": 1, "total_amount": 6000.0, "remaining_periods": 5, "next_payment_date": "2026-04-15", "days_until_payment": 32 } ] } ] ``` --- ### `POST /api/accounts` 创建新的财务账户。 **请求体:** | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | name | string | **是** | - | 账户名称,最长 100 字符 | | account_type | string | 否 | `"savings"` | 账户类型:`savings`(储蓄)、`debt`(债务) | | balance | number | 否 | 0.0 | 初始余额 | | icon | string | 否 | `"wallet"` | 图标标识 | | color | string | 否 | `"#FFB7C5"` | 颜色值 | | sort_order | integer | 否 | 0 | 排序顺序 | | is_active | boolean | 否 | true | 是否启用 | | description | string | 否 | null | 描述信息 | **响应:** HTTP `201 Created`,返回 `AccountResponse` 对象。 --- ### `GET /api/accounts/{account_id}` 获取单个账户详情。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | account_id | integer | 账户 ID | **响应:** 返回 `AccountResponse` 对象。 --- ### `PUT /api/accounts/{account_id}` 更新账户信息。 > **注意:** 此接口不支持直接修改余额,余额请通过 `POST /api/accounts/{id}/balance` 修改。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | account_id | integer | 账户 ID | **请求体(所有字段可选,**不包含 balance**):** | 字段 | 类型 | 说明 | |------|------|------| | name | string | 账户名称 | | account_type | string | 账户类型 | | icon | string | 图标标识 | | color | string | 颜色值 | | sort_order | integer | 排序顺序 | | is_active | boolean | 是否启用 | | description | string | 描述信息 | **响应:** 返回更新后的 `AccountResponse` 对象。 --- ### `DELETE /api/accounts/{account_id}` 删除账户,关联的历史记录和分期还款计划将一并被级联删除。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | account_id | integer | 账户 ID | **响应示例:** ```json { "success": true, "message": "账户已删除" } ``` --- ### `POST /api/accounts/{account_id}/balance` 更新账户余额,自动创建余额变动历史记录。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | account_id | integer | 账户 ID | **请求体:** | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | new_balance | number | **是** | 新的余额值 | | note | string | 否 | 变动备注,最长 200 字符 | **请求示例:** ```json { "new_balance": 16000.00, "note": "工资到账" } ``` **响应:** 返回更新后的 `AccountResponse` 对象。同时会自动在 `account_history` 表中创建一条记录。 --- ### `GET /api/accounts/{account_id}/history` 获取账户的余额变动历史,支持分页。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | account_id | integer | 账户 ID | **查询参数:** | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | page | integer | 否 | 1 | 页码(从 1 开始) | | page_size | integer | 否 | 20 | 每页记录数,最大 100 | **响应示例:** ```json { "total": 15, "page": 1, "page_size": 20, "records": [ { "id": 15, "account_id": 1, "change_amount": 1000.0, "balance_before": 15000.0, "balance_after": 16000.0, "note": "工资到账", "created_at": "2026-03-14T10:00:00" } ] } ``` **AccountHistoryResponse 字段说明:** | 字段 | 类型 | 说明 | |------|------|------| | id | integer | 记录 ID | | account_id | integer | 账户 ID | | change_amount | number | 变动金额(正数=收入,负数=支出) | | balance_before | number | 变动前余额 | | balance_after | number | 变动后余额 | | note | string\|null | 变动备注 | | created_at | datetime | 记录时间 | --- ## 11. 分期还款 (Debt Installments) 分期还款计划仅与 `account_type` 为 `debt` 的账户关联。GET 列表接口会返回计算出的下次还款日期、剩余天数和剩余期数等字段。 ### `GET /api/debt-installments` 获取所有分期还款计划列表,包含计算字段,按紧急程度排序。 **响应示例:** ```json [ { "id": 1, "account_id": 2, "total_amount": 6000.0, "total_periods": 12, "current_period": 8, "payment_day": 15, "payment_amount": 500.0, "start_date": "2025-09-15", "is_completed": false, "created_at": "2025-09-01T00:00:00", "updated_at": "2026-03-01T00:00:00", "next_payment_date": "2026-04-15", "days_until_payment": 32, "remaining_periods": 5, "account_name": "信用卡", "account_icon": "credit-card", "account_color": "#4ECDC4" } ] ``` **计算字段说明:** | 字段 | 类型 | 说明 | |------|------|------| | next_payment_date | date\|null | 下一次还款日期 | | days_until_payment | integer\|null | 距离下次还款的天数 | | remaining_periods | integer\|null | 剩余还款期数 | | account_name | string\|null | 关联账户名称 | | account_icon | string\|null | 关联账户图标 | | account_color | string\|null | 关联账户颜色 | --- ### `POST /api/debt-installments` 创建新的分期还款计划。 **请求体:** | 字段 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | account_id | integer | **是** | - | 关联的债务账户 ID | | total_amount | number | **是** | - | 总金额 | | total_periods | integer | **是** | - | 总期数 | | current_period | integer | 否 | 1 | 当前期数(从 1 开始,指向下一期未还) | | payment_day | integer | **是** | - | 每月还款日(1-31) | | payment_amount | number | **是** | - | 每期还款金额 | | start_date | string | **是** | - | 起始日期(YYYY-MM-DD) | | is_completed | boolean | 否 | false | 是否已完成 | **响应:** HTTP `201 Created`,返回 `DebtInstallmentResponse` 对象。 **错误响应:** | 状态码 | 说明 | |--------|------| | 400 | 关联账户不是债务类型(`account_type` 不为 `debt`) | --- ### `PUT /api/debt-installments/{installment_id}` 更新分期还款计划。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | installment_id | integer | 分期计划 ID | **请求体(所有字段可选):** | 字段 | 类型 | 说明 | |------|------|------| | account_id | integer | 关联账户 ID | | total_amount | number | 总金额 | | total_periods | integer | 总期数 | | current_period | integer | 当前期数 | | payment_day | integer | 每月还款日 | | payment_amount | number | 每期还款金额 | | start_date | string | 起始日期 | | is_completed | boolean | 是否已完成 | **响应:** 返回更新后的 `DebtInstallmentResponse` 对象。 --- ### `DELETE /api/debt-installments/{installment_id}` 删除分期还款计划。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | installment_id | integer | 分期计划 ID | **响应示例:** ```json { "success": true, "message": "分期计划已删除" } ``` --- ### `PATCH /api/debt-installments/{installment_id}/pay` 标记一期为已还款。`current_period` 递增 1,如果所有期数都已还完,自动将 `is_completed` 设为 `true`。 **路径参数:** | 参数 | 类型 | 说明 | |------|------|------| | installment_id | integer | 分期计划 ID | **响应:** 返回更新后的 `DebtInstallmentResponse` 对象。 **错误响应:** | 状态码 | 说明 | |--------|------| | 400 | 分期计划已全部还完 | --- ## 12. 用户设置 (User Settings) 用户设置为单例模式,全局只有一条记录(`id=1`)。首次访问时自动创建默认设置。 ### `GET /api/user-settings` 获取用户设置。如果不存在,自动创建默认设置并返回。 **响应示例:** ```json { "id": 1, "nickname": "爱莉希雅", "avatar": null, "signature": "美好的一天从微笑开始~", "birthday": "2020-03-14", "email": null, "site_name": "爱莉希雅待办", "theme": "pink", "language": "zh-CN", "default_view": "list", "default_sort_by": "created_at", "default_sort_order": "desc", "created_at": "2026-01-01T00:00:00", "updated_at": "2026-03-14T00:00:00" } ``` **字段说明:** | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | id | integer | 1 | 固定为 1 | | nickname | string | `"爱莉希雅"` | 用户昵称 | | avatar | string\|null | null | 头像 URL | | signature | string\|null | null | 个性签名 | | birthday | date\|null | null | 生日 | | email | string\|null | null | 邮箱 | | site_name | string | `"爱莉希雅待办"` | 站点名称 | | theme | string | `"pink"` | 主题 | | language | string | `"zh-CN"` | 语言 | | default_view | string | `"list"` | 默认视图 | | default_sort_by | string | `"created_at"` | 默认排序字段 | | default_sort_order | string | `"desc"` | 默认排序方向 | --- ### `PUT /api/user-settings` 更新用户设置(upsert 模式,不存在则创建)。 **请求体(所有字段可选):** | 字段 | 类型 | 说明 | |------|------|------| | nickname | string | 用户昵称 | | avatar | string | 头像 URL | | signature | string | 个性签名 | | birthday | string | 生日(YYYY-MM-DD) | | email | string | 邮箱 | | site_name | string | 站点名称 | | theme | string | 主题 | | language | string | 语言 | | default_view | string | 默认视图 | | default_sort_by | string | 默认排序字段 | | default_sort_order | string | 默认排序方向 | **响应:** 返回更新后的 `UserSettingsResponse` 对象。 --- ## 附录:通用响应格式 ### 成功响应 大部分接口返回具体数据对象或对象列表。部分接口(如删除操作)返回以下格式: ```json { "success": true, "message": "操作成功提示" } ``` ### 错误响应 | 状态码 | 说明 | |--------|------| | 400 | 请求参数错误 / 业务逻辑错误(如重复名称、关联约束等) | | 404 | 资源不存在 | | 422 | 请求体验证失败(Pydantic 校验错误) | | 500 | 服务器内部错误 | **422 错误响应示例:** ```json { "detail": [ { "loc": ["body", "title"], "msg": "field required", "type": "value_error.missing" } ] } ``` **500 错误响应示例:** ```json { "success": false, "message": "服务器内部错误", "error_code": "INTERNAL_ERROR" } ``` --- ## 附录:数据模型关系图 ``` ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ categories │ 1───N │ tasks │ N───M │ tags │ │──────────────│ │──────────────│ │──────────────│ │ id │ │ id │ │ id │ │ name │ │ title │ │ name (unique)│ │ color │ │ description │ └──────────────┘ │ icon │ │ priority │ └──────────────┘ │ due_date │ ┌──────────────┐ │ is_completed │ │ task_tags │ │ category_id ─┤ │──────────────│ │ created_at │ │ task_id (PK) │ │ updated_at │ │ tag_id (PK) │ └──────────────┘ └──────────────┘ ┌──────────────┐ 1───N ┌──────────────┐ 1───N ┌────────────────┐ │habit_groups │ │ habits │ │ habit_checkins │ │──────────────│ │──────────────│ │────────────────│ │ id │ │ id │ │ id │ │ name │ │ name │ │ habit_id (FK) │ │ color │ │ description │ │ checkin_date │ │ icon │ │ group_id ────│ │ count │ │ sort_order │ │ target_count │ │ created_at │ └──────────────┘ │ frequency │ └────────────────┘ │ active_days │ │ is_archived │ └──────────────┘ ┌────────────────────┐ 1───N ┌────────────────┐ │anniversary_ │ │ anniversaries │ │categories │ │────────────────│ │────────────────────│ │ id │ │ id │ │ title │ │ name │ │ date │ │ icon │ │ year │ │ color │ │ category_id ───│ │ sort_order │ │ description │ └────────────────────┘ │ is_recurring │ │ remind_days_ │ │ before │ └────────────────┘ ┌──────────────────┐ 1───N ┌────────────────┐ │financial_accounts│ │account_history │ │──────────────────│ │────────────────│ │ id │ │ id │ │ name │ │ account_id ────│ │ account_type │ │ change_amount │ │ balance │ │ balance_before │ │ icon │ │ balance_after │ │ color │ │ note │ │ sort_order │ │ created_at │ │ is_active │ └────────────────┘ │ description │ └──────────────────┘ │ 1───N ┌────────────────┐ │debt_installments │ │────────────────│ │ id │ │ account_id ────│ │ total_amount │ │ total_periods │ │ current_period │ │ payment_day │ │ payment_amount │ │ start_date │ │ is_completed │ └────────────────┘ ┌──────────────────┐ │ user_settings │ (单例, id=1) │──────────────────│ │ id │ │ nickname │ │ avatar │ │ signature │ │ birthday │ │ email │ │ site_name │ │ theme │ │ language │ │ default_view │ │ default_sort_by │ │ default_sort_order│ └──────────────────┘ ``` --- ## 接口总览(共 50 个接口) | # | 方法 | 路径 | 功能 | |---|------|------|------| | 1 | GET | `/health` | 健康检查 | | 2 | GET | `/api/tasks` | 获取任务列表 | | 3 | POST | `/api/tasks` | 创建任务 | | 4 | GET | `/api/tasks/{id}` | 获取任务详情 | | 5 | PUT | `/api/tasks/{id}` | 更新任务 | | 6 | DELETE | `/api/tasks/{id}` | 删除任务 | | 7 | PATCH | `/api/tasks/{id}/toggle` | 切换任务完成状态 | | 8 | GET | `/api/categories` | 获取分类列表 | | 9 | POST | `/api/categories` | 创建分类 | | 10 | PUT | `/api/categories/{id}` | 更新分类 | | 11 | DELETE | `/api/categories/{id}` | 删除分类 | | 12 | GET | `/api/tags` | 获取标签列表 | | 13 | POST | `/api/tags` | 创建标签 | | 14 | DELETE | `/api/tags/{id}` | 删除标签 | | 15 | GET | `/api/habit-groups` | 获取习惯组列表 | | 16 | POST | `/api/habit-groups` | 创建习惯组 | | 17 | PUT | `/api/habit-groups/{id}` | 更新习惯组 | | 18 | DELETE | `/api/habit-groups/{id}` | 删除习惯组 | | 19 | GET | `/api/habits` | 获取习惯列表 | | 20 | POST | `/api/habits` | 创建习惯 | | 21 | PUT | `/api/habits/{id}` | 更新习惯 | | 22 | DELETE | `/api/habits/{id}` | 删除习惯 | | 23 | PATCH | `/api/habits/{id}/archive` | 切换习惯归档状态 | | 24 | GET | `/api/habits/{id}/checkins` | 获取打卡记录 | | 25 | POST | `/api/habits/{id}/checkins` | 打卡 | | 26 | DELETE | `/api/habits/{id}/checkins` | 取消打卡 | | 27 | GET | `/api/habits/{id}/checkins/stats` | 获取习惯统计 | | 28 | GET | `/api/anniversary-categories` | 获取纪念日分类列表 | | 29 | POST | `/api/anniversary-categories` | 创建纪念日分类 | | 30 | PUT | `/api/anniversary-categories/{id}` | 更新纪念日分类 | | 31 | DELETE | `/api/anniversary-categories/{id}` | 删除纪念日分类 | | 32 | GET | `/api/anniversaries` | 获取纪念日列表 | | 33 | POST | `/api/anniversaries` | 创建纪念日 | | 34 | GET | `/api/anniversaries/{id}` | 获取纪念日详情 | | 35 | PUT | `/api/anniversaries/{id}` | 更新纪念日 | | 36 | DELETE | `/api/anniversaries/{id}` | 删除纪念日 | | 37 | GET | `/api/accounts` | 获取账户列表 | | 38 | POST | `/api/accounts` | 创建账户 | | 39 | GET | `/api/accounts/{id}` | 获取账户详情 | | 40 | PUT | `/api/accounts/{id}` | 更新账户 | | 41 | DELETE | `/api/accounts/{id}` | 删除账户 | | 42 | POST | `/api/accounts/{id}/balance` | 更新余额 | | 43 | GET | `/api/accounts/{id}/history` | 获取余额变动历史 | | 44 | GET | `/api/debt-installments` | 获取分期还款列表 | | 45 | POST | `/api/debt-installments` | 创建分期还款计划 | | 46 | PUT | `/api/debt-installments/{id}` | 更新分期还款计划 | | 47 | DELETE | `/api/debt-installments/{id}` | 删除分期还款计划 | | 48 | PATCH | `/api/debt-installments/{id}/pay` | 标记一期为已还 | | 49 | GET | `/api/user-settings` | 获取用户设置 | | 50 | PUT | `/api/user-settings` | 更新用户设置 |