feat: strengthen backup and mobile workflows
This commit is contained in:
+29
-80
@@ -1,97 +1,46 @@
|
||||
# dodo 数据模型
|
||||
|
||||
所有业务实体使用 UUIDv7 主键并按 `user_id` 隔离。生产使用 PostgreSQL,测试使用 SQLite;模型保持两者兼容。
|
||||
业务主键使用 UUIDv7;带 `user_id` 的实体按用户隔离。时间点按 UTC 保存,用户时区用于日期语义与展示。生产使用 PostgreSQL,测试使用 SQLite。
|
||||
|
||||
## app_state
|
||||
## 账户
|
||||
|
||||
- `key` 主键
|
||||
- `created_at`
|
||||
- `app_state`:初始化状态
|
||||
- `users`:用户名、密码散列、时区
|
||||
- `sessions`:会话令牌散列、过期/最近访问时间、IP 与 User-Agent
|
||||
- `audit_logs`:用户、动作、实体、非敏感摘要和时间
|
||||
|
||||
## users
|
||||
## 任务域
|
||||
|
||||
- `id`
|
||||
- `username` 唯一
|
||||
- `password_hash`
|
||||
- `timezone`
|
||||
- `created_at`
|
||||
- `folders`:名称、位置、软删除时间;删除文件夹只解除清单分组
|
||||
- `task_lists`:文件夹、名称、收集箱标记、位置、软删除时间
|
||||
- `tasks`:清单、可空父任务、标题、Markdown 描述、优先级、完成/完成时间、截止时间、`due_has_time`、位置、版本、软删除与外部 ID
|
||||
- `recurrence_templates`:任务的一对一重复规则、开始/结束、计划或完成后触发模式、完成后间隔与最近完成时间
|
||||
- `recurrence_exceptions`:模板发生时间及标题/截止/完成/删除覆盖
|
||||
- `attachments`:任务、原始文件名、服务端存储名、MIME、大小和创建时间
|
||||
- `purge_operations`:清单永久删除时附件隔离区清理的补偿状态
|
||||
|
||||
## sessions
|
||||
任务树只允许一层,父子任务属于同一清单。清单归档仅设置清单 `deleted_at`,保留所有任务的 `list_id`;查询隐藏归档清单内任务,恢复清单后原任务和完成状态重新可见。任务与子任务软删除/恢复按生命周期规则处理,永久删除会清理关联重复数据和附件。
|
||||
|
||||
- `id`
|
||||
- `token_hash` 唯一
|
||||
- `user_id` → users,级联删除
|
||||
- `expires_at`
|
||||
- `created_at`
|
||||
## 习惯、倒数日与备忘录
|
||||
|
||||
## folders
|
||||
- `habits`:完成型/数值型、目标/上限、日/周/月/间隔计划、开始日、排序和归档
|
||||
- `habit_logs`:习惯与日期唯一的数值记录
|
||||
- `habit_pauses`:习惯暂停区间
|
||||
- `countdowns`:标题、日期、公历/农历字段、类型、重复、兼容保留的图标字段、置顶与归档
|
||||
- `memos`:标题、Markdown 内容、乐观锁版本、创建/更新时间和软删除时间
|
||||
|
||||
- `id`
|
||||
- `user_id` → users
|
||||
- `name`
|
||||
- `position`
|
||||
- `created_at`
|
||||
- `deleted_at`,非空表示软删除
|
||||
## 完整备份 v2 内部状态
|
||||
|
||||
删除文件夹不会删除清单;清单的 `folder_id` 被置空。
|
||||
- `backup_preflights`:令牌散列、用户、备份 ID/摘要/大小、暂存路径、模式、状态、过期/消费时间和待清理路径
|
||||
- `backup_imports`:每用户已导入备份 ID、归档摘要、模式和时间;用于幂等判断
|
||||
- `backup_import_entities`:源实体 ID 到目标 ID 的映射及内容摘要;用于 merge 冲突检测与可重试导入
|
||||
|
||||
## task_lists
|
||||
这些表和账户/会话/审计信息不属于用户可迁移业务实体。ZIP v2 只导出:
|
||||
|
||||
- `id`
|
||||
- `user_id` → users
|
||||
- `folder_id` → folders,可空
|
||||
- `name`
|
||||
- `is_inbox`,每个用户初始化时创建一个受保护的系统收集箱
|
||||
- `position`
|
||||
- `created_at`
|
||||
- `deleted_at`,非空表示软删除
|
||||
`folders`、`lists`、`tasks`、`recurrences`、`recurrence_exceptions`、`habits`、`habit_logs`、`habit_pauses`、`countdowns`、`memos`、`attachments`。
|
||||
|
||||
删除普通清单时,其未删除任务原子移动到系统收集箱。系统收集箱不可重命名或删除。
|
||||
|
||||
## tasks
|
||||
|
||||
- `id`
|
||||
- `user_id` → users
|
||||
- `list_id` → task_lists
|
||||
- `parent_id` → tasks,可空;仅允许一层子任务且必须与父任务同清单
|
||||
- `title`
|
||||
- `description`
|
||||
- `priority`(0–3)
|
||||
- `completed`
|
||||
- `due_at`,可空
|
||||
- `version`,乐观锁版本;单任务更新用 `id + user_id + version` 原子比较更新
|
||||
- `position`
|
||||
- `created_at`
|
||||
- `updated_at`
|
||||
- `deleted_at`,非空表示进入回收站
|
||||
|
||||
顶层任务软删除、恢复或永久删除时同步处理直接子任务。列表与回收站使用 `(created_at, id)` 作为稳定游标排序键。
|
||||
|
||||
## countdowns
|
||||
|
||||
- `id`
|
||||
- `user_id` → users,级联删除
|
||||
- `title`
|
||||
- `event_date`,仅日期
|
||||
- `kind`:`countdown` / `anniversary` / `birthday`
|
||||
- `repeat_rule`:`none` / `weekly` / `monthly` / `yearly`
|
||||
- `icon`
|
||||
- `pinned`,每个用户仅保留一个置顶项
|
||||
- `archived_at`,非空表示归档
|
||||
- `created_at` / `updated_at`
|
||||
附件导出时去掉内部 `storage_name`,改用归档内安全路径并携带真实字节;恢复时生成目标存储名。每个实体文件和附件字节均由 manifest SHA-256 覆盖。
|
||||
|
||||
## 迁移
|
||||
|
||||
- `0001_initial.py`:已部署的初始模式,不修改
|
||||
- `0002_task_management.py`:新增文件夹/清单软删除列、历史标签表及游标/回收站索引
|
||||
- `0008_remove_calendar_subscriptions.py`:移除日历订阅表
|
||||
- `0009_remove_tags.py`:移除历史标签表及任务标签关联表
|
||||
- `0010_countdowns.py`:新增倒数日、纪念日与生日表
|
||||
|
||||
## 后续阶段预留
|
||||
|
||||
- task_reminders
|
||||
- task_recurrence_templates
|
||||
- task_recurrence_exceptions
|
||||
- habits / habit_logs / habit_reminders
|
||||
- attachments
|
||||
- audit_logs
|
||||
迁移按 `0001` 至 `0019` 顺序应用;当前最新 `0019_backup_imports.py` 增加完整备份预检、导入及实体映射账本。历史迁移还覆盖任务管理、会话元数据、查询索引、习惯排序、倒数日/农历、日期型截止语义、重复触发模式、备忘录与 `completed_at` 等演进。
|
||||
|
||||
Reference in New Issue
Block a user