2.2 KiB
2.2 KiB
数据与同步
核心实体
user:用户。device:设备。ledger:账本。ledger_member:账本成员。ledger_invitation:账本邀请。category:分类。entry:账目。sync_operation:同步操作。
账本字段
idnamevisibility:private或shared。owner_idcreated_atupdated_atdeleted_at
成员字段
ledger_iduser_idrole:owner或member。joined_atremoved_at
邀请字段
idledger_idtokencreated_byexpires_ataccepted_byaccepted_atrevoked_at
权限规则
- 用户只能同步自己有成员关系的账本。
- 独享账本只有 owner 一名成员。
- 共享账本可以有多名成员。
owner可以邀请和移除成员。member可以查看和记账。- 首版不做单条账目权限。
账目字段
id:客户端生成 UUID。ledger_idtype:expense或income。amount:金额,整数分。category_idoccurred_atnotecreated_byupdated_bycreated_atupdated_atdeleted_atversion
同步原则
- 客户端先写 IndexedDB,界面立即成功。
- 每次本地变更生成一个
operation_id。 - 同步 API 必须幂等。
- 服务端保存账本变更日志。
- 客户端用游标拉取增量。
- 同步范围必须按账本成员权限过滤。
同步流程
- 用户新增、编辑或删除账目。
- 客户端写 IndexedDB。
- 客户端写本地同步队列。
- 网络可用时推送队列。
- 服务端按
operation_id去重并应用。 - 客户端拉取远端增量。
- 客户端合并到 IndexedDB。
冲突策略
- 新增记录基本无冲突,ID 由客户端生成。
- 删除使用软删除。
- 同一条账目被多人离线修改时,首版最后写入胜出。
- 不做字段级合并。
- 冲突历史和人工选择版本后置。
冲突示例:
- 手机 A 和手机 B 都同步过同一笔账:
午餐 100 元。 - 两台手机同时离线。
- 手机 A 改成
120 CNY。 - 手机 B 改成
110 CNY或修改分类。 - 两台手机恢复网络后上传。
- 服务端必须决定最终版本。