TaskBridge 由后端服务、Web/PWA、Android App 和 Windows 桌面端组成。系统采用本地优先架构,客户端先写本地数据库,再通过同步队列与服务器保持一致。
- 后端服务: 负责账号、设备、任务持久化、同步顺序、同步日志和 WebSocket 通知。
- Android App: 负责移动端任务管理、本地缓存、后台同步、系统提醒和桌面小组件。
- Web/PWA: 负责浏览器端任务查看、新建、编辑、搜索、完成、删除、恢复和后端同步状态查看;远程任务列表通过
cursor_id/cursor_updated_at分页拉取,避免只展示第一页;通过 IndexedDB 保存任务快照和离线队列,恢复在线后自动同步本地 mutation。 - Windows 桌面端: 负责桌面端任务管理、本地缓存、托盘、悬浮窗、全局快捷键和常驻 WebSocket。
- 客户端本地优先,所有用户操作先写入本地数据库;Web/PWA 使用 IndexedDB 承载浏览器端缓存和 offline queue。
- HTTP API 是唯一真实同步通道。
- WebSocket 只发送通知,不承载完整任务数据。
- 服务端是服务器侧权威数据源,任务归属必须按
user_id校验。 - 同步冲突通过任务
version做乐观锁检测。 - Android 后台同步交给 WorkManager,不长期保活 WebSocket。
- Windows 桌面端可常驻 WebSocket,并在断线后自动重连。
- 客户端渲染层不直接持有数据库、Token 和系统能力,敏感操作必须经过受控桥接层。
- 任务时间线排序属于跨端契约,后端、Android、Windows 桌面端必须使用
shared/task-timeline-fixtures.json的同一组样本验证完成态别名、逾期、计划日期、优先级、手动排序和完成时间倒序。
任务列表默认按“逾期、即将到期、计划日期、无时间、已完成”排序;完成状态读取时同时接受 completed 和历史别名 done,写入时统一写 canonical completed。shared/task-timeline-fixtures.json 是这套行为的共享测试向量:
- 后端通过
backend/tests/test_task_timeline_fixtures.py验证/api/v1/tasks普通列表、cursor 分页、today 视图和 meta 计数。 - Android 通过
TaskTimelineTest和TodayTaskWidgetRepositoryTest验证领域排序和小组件 raw projection 排序。 - Windows 桌面端通过
npm run check:task-order验证 Vue 排序工具和 Electron SQLite 查询不会退回单值completed判断。
flowchart LR
subgraph Android["Android App"]
AUI["Compose UI"]
ARoom["Room"]
AQueue["Sync Queue"]
AWorker["WorkManager"]
AWidget["AppWidget"]
ANotify["Notification"]
end
subgraph Desktop["Windows Desktop"]
DUI["Vue UI"]
DSQLite["SQLite"]
DQueue["Sync Queue"]
DTray["Tray"]
DFloat["Floating Window"]
DWS["WebSocket Client"]
end
subgraph Backend["FastAPI Backend"]
API["HTTP API"]
Auth["Auth Service"]
Sync["Sync Service"]
WS["WebSocket Manager"]
MySQL[("MySQL")]
Redis[("Redis")]
end
AUI --> ARoom
AWidget --> ARoom
ANotify --> ARoom
ARoom --> AQueue
AWorker --> API
DUI --> DSQLite
DFloat --> DSQLite
DTray --> DFloat
DSQLite --> DQueue
DWS -. notification .-> WS
DQueue --> API
API --> Auth
API --> Sync
Sync --> MySQL
WS --> Redis
Sync -. notify .-> WS
后端维护用户、设备、任务、同步日志和在线设备状态。
主要目录:
| 目录 | 职责 |
|---|---|
app/api |
FastAPI 路由和鉴权依赖 |
app/core |
配置、安全、数据库、Redis、统一响应和异常处理 |
app/models |
SQLAlchemy ORM 模型 |
app/schemas |
Pydantic 请求和响应模型 |
app/services |
认证、任务、设备、同步和 WebSocket 业务流程 |
app/repositories |
复杂数据访问边界 |
tests |
后端自动化测试 |
Android 和 Windows 都需要维护:
- 当前登录用户。
- 当前设备 ID。
- Access Token 和 Refresh Token。
- 最近一次成功拉取时间
last_sync_time。 - 等待上传的本地变更队列。
- 任务本地状态和同步状态。
- 用户在客户端新增、编辑、完成或删除任务。
- 客户端写入本地数据库。
- 客户端将任务标记为
pending_create、pending_update或pending_delete。 - 网络可用时,客户端调用
POST /api/v1/sync/push。 - 后端校验用户、设备、任务归属和
version。 - 后端写入任务数据和
sync_logs。 - 后端通过 WebSocket 通知同账号下其他在线设备。
- 其他设备收到通知后调用
GET /api/v1/sync/pull。 - 客户端合并增量数据并更新本地界面、小组件或悬浮窗。
- MySQL: 保存用户、设备、任务和同步日志。
- Redis: 用于在线设备状态、WebSocket 辅助、短期 Ticket 和限流扩展。
- Alembic: 管理数据库迁移。
- Docker Compose: 用于本地联调后端、MySQL 和 Redis。
- GitHub Actions: 用于 CI、Release 和 GHCR 镜像发布。
- 后端所有业务数据按
user_id过滤,任务父子关系也必须校验归属。 - Refresh Token 绑定设备;删除设备会撤销该设备登录态。
- WebSocket 使用短期 Ticket,连接后仍校验
device_id。 - Android Release 优先使用正式签名;缺少签名配置时可构建明确标注的 unsigned release APK。
- Windows Electron renderer 启用 sandbox,IPC 会校验调用方窗口。
- Docker release 部署默认只暴露 API,MySQL 和 Redis 保持在 Compose 内部网络。