40. Desktop Sync Client 桌面同步客户端
V1 — 1个用户:文件变更监控
Section titled “V1 — 1个用户:文件变更监控”你想做一个工具,监控某个文件夹里的文件变化,随时知道什么被改了。
你要解决什么
Section titled “你要解决什么”- 监控本地文件夹的文件变化
- 显示变更列表(新增/修改/删除)
- 基本的文件信息展示
给AI的Prompt
Section titled “给AI的Prompt”用Electron实现一个文件变更监控工具:
功能:1. 启动时选择要监控的文件夹2. 用fs.watch(或chokidar库)监控文件变化3. 变更事件类型:add(新增) / change(修改) / unlink(删除)4. 变更列表界面: - 时间 | 类型 | 文件路径 | 文件大小 - 新增=绿色,修改=黄色,删除=红色5. 过滤器:忽略.git, node_modules, .DS_Store等6. 统计信息:监控文件总数、今日变更次数7. 变更历史存本地JSON文件(最近1000条)
Electron结构:- main.js:主进程,处理文件系统操作- renderer.js:渲染进程,显示UI- preload.js:安全桥接
技术:Electron, Node.js, chokidar, HTML+CSS+JS- 选择文件夹后开始监控
- 新增文件显示绿色条目
- 修改文件显示黄色条目
- 删除文件显示红色条目
- 过滤规则生效(忽略.git等)
- 历史记录持久化到JSON文件
- 重启应用后历史仍在
你学到了什么
Section titled “你学到了什么”- 文件系统监控(fs.watch/chokidar)→ Module: Node.js文件系统
- Electron主进程/渲染进程架构 → Module: Electron基础
- 文件事件处理 → Module: 事件驱动
V2 — 10个用户:单向上传同步
Section titled “V2 — 10个用户:单向上传同步”想把本地文件的变更自动上传到服务器,实现简单的备份。
你要解决什么
Section titled “你要解决什么”- 变更文件上传到服务器
- 文件哈希对比避免重复传输
- 单向同步(本地→服务器)
给AI的Prompt
Section titled “给AI的Prompt”在V1基础上实现单向上传同步:
Go后端:1. 文件存储API: - POST /api/files/upload — 上传文件(multipart) - GET /api/files/list — 文件列表(path, hash, size, updated_at) - DELETE /api/files/delete?path=xxx — 删除文件 - GET /api/files/hash?path=xxx — 获取服务端文件哈希2. 文件存储在服务器本地目录3. SQLite记录文件元数据(path, hash, size, uploaded_at)
Electron客户端改进:1. 文件变更检测到后: - 计算文件MD5哈希 - 与服务端哈希比对 - 哈希不同 → 上传文件 - 哈希相同 → 跳过(已同步)2. 删除事件 → 通知服务端删除3. 同步状态显示: - 每个文件旁边显示同步图标(已同步✓/同步中.../待同步○) - 底部状态栏:同步进度(3/10文件已同步)4. 同步队列:变更文件排队上传,避免并发过多5. 重试机制:上传失败自动重试3次
配置:1. 服务器地址配置2. 同步文件夹路径配置3. 忽略规则配置(.gitignore格式)
技术:Electron, Go+Gin, SQLite, MD5哈希- 文件变更自动触发上传
- 哈希相同的文件跳过上传
- 服务端正确接收和存储文件
- 删除同步正常
- 同步状态图标正确显示
- 上传失败自动重试
- 忽略规则生效
你学到了什么
Section titled “你学到了什么”- 文件哈希对比 → Module: 数据完整性
- HTTP文件上传 → Module: 网络编程
- 同步队列管理 → Module: 任务调度
- 重试策略 → Module: 容错设计
V3 — 100个用户:双向同步
Section titled “V3 — 100个用户:双向同步”不仅本地改动要同步到服务器,服务器上的改动也要同步回本地。
你要解决什么
Section titled “你要解决什么”- 双向同步(本地↔服务器)
- 冲突检测和标记
- 文件元数据管理
给AI的Prompt
Section titled “给AI的Prompt”在V2基础上实现双向同步:
PostgreSQL存文件元数据:1. 表:files(id, user_id, path, hash, size, version, updated_at, deleted)2. 表:sync_states(id, user_id, device_id, path, local_hash, remote_hash, last_sync_at)
双向同步流程:1. 客户端定时(每30秒)发起同步请求2. 上传阶段: - 客户端发送本地变更列表(path, hash, updated_at) - 服务端比对,接受更新或标记冲突3. 下载阶段: - 服务端返回客户端缺少的变更 - 客户端下载并应用4. 同步API: - POST /api/sync/check — 发送本地文件清单,返回需要上传/下载的列表 - POST /api/sync/upload — 上传文件 - GET /api/sync/download?path=xxx — 下载文件
冲突检测:1. 冲突条件:本地和服务端都有修改(hash都变了且不同)2. 冲突处理: - 两个版本都保留(file.txt → file.txt, file.conflict.txt) - 客户端弹窗提示用户选择3. 冲突日志记录
Electron改进:1. 同步面板:显示同步状态、最近同步时间2. 冲突列表:显示冲突文件,点击查看两个版本3. 同步日志:详细的操作记录
技术:Electron, Go+Gin, PostgreSQL, React(Electron渲染层)- 本地变更同步到服务器
- 服务器变更同步到本地
- 同时修改同一文件触发冲突
- 冲突文件两个版本都保留
- 冲突提示弹窗显示
- 同步日志记录完整
- 删除操作双向同步
你学到了什么
Section titled “你学到了什么”- 双向同步算法 → Module: 同步系统
- 冲突检测策略 → Module: 分布式一致性
- 文件版本管理 → Module: 版本控制
- 同步状态机 → Module: 状态管理
V4 — 1000个用户:增量传输
Section titled “V4 — 1000个用户:增量传输”大文件频繁修改,每次传整个文件太浪费带宽,需要只传变化的部分。
你要解决什么
Section titled “你要解决什么”- 文件分块和块级哈希
- 只传输变化的块(rsync思想)
- 带宽优化
给AI的Prompt
Section titled “给AI的Prompt”在V3基础上实现增量传输:
文件分块:1. 将文件按固定大小分块(默认4MB)2. 每个块计算MD5哈希3. 文件指纹 = 所有块哈希的列表4. 存储:block_index表(file_id, block_index, hash, size)
增量对比(rsync思想简化版):1. 客户端计算本地文件的块哈希列表2. 发送给服务端3. 服务端比对每个块: - 哈希相同 → 跳过 - 哈希不同 → 标记需要传输 - 新增块 → 需要传输4. 返回需要传输的块索引5. 客户端只上传变化的块6. 服务端用已有块+新块重组文件
API:1. POST /api/sync/prepare — 发送块哈希列表,返回需上传的块索引2. POST /api/sync/upload-block — 上传单个块(block_index + data)3. POST /api/sync/commit — 所有块上传完毕,服务端重组文件
带宽优化:1. 传输压缩(gzip)2. 并行上传(最多3个块同时上传)3. 带宽监控:显示上传/下载速度4. 限速配置:避免占满带宽
Electron改进:1. 传输进度条:显示块级进度(5/20块已传输)2. 传输速度显示3. 节省的带宽统计(跳过的块大小)
技术:Electron, Go+Gin, PostgreSQL, 文件分块, gzip压缩- 文件正确分块,哈希计算准确
- 只传输变化的块
- 服务端正确重组文件
- 大文件增量传输带宽明显减少
- 并行上传正常工作
- 传输进度准确显示
- gzip压缩生效
你学到了什么
Section titled “你学到了什么”- 文件分块与哈希 → Module: 数据完整性
- rsync增量同步算法 → Module: 同步算法
- 并行上传 → Module: 并发编程
- 传输压缩 → Module: 网络优化
V5 — 1万个用户:多设备同步
Section titled “V5 — 1万个用户:多设备同步”用户有多台设备(办公电脑+家里电脑+笔记本),文件要在所有设备间同步。
你要解决什么
Section titled “你要解决什么”- 设备注册和管理
- 变更事件实时广播
- 选择性同步
给AI的Prompt
Section titled “给AI的Prompt”在V4基础上实现多设备同步:
设备管理:1. 设备注册: - 首次连接时生成device_id - 记录设备名称、操作系统、最后在线时间2. 设备列表API: - GET /api/devices — 我的所有设备 - DELETE /api/devices/:id — 移除设备(清除该设备同步状态)3. 设备在线状态(WebSocket心跳)
变更广播:1. 文件变更时,服务端通过WebSocket通知其他在线设备2. 消息格式:{type: "file_changed", path, hash, updated_at, source_device}3. 收到通知的设备立即触发该文件的同步4. 离线设备上线后全量对比一次
选择性同步:1. 设备级配置:选择要同步的文件夹2. 未选择的文件夹不下载到本地3. 但在文件浏览器中显示(灰色图标)4. 点击可触发按需下载5. 磁盘空间不足时提示用户取消部分文件夹
设备间传输优化:1. 同一局域网的设备直接P2P传输(速度更快)2. 局域网发现:UDP广播发现同一网络的设备3. P2P传输失败回退到服务器中转
Electron改进:1. 设备管理页面2. 选择性同步配置界面3. 局域网设备发现状态显示
技术:Electron, Go+Gin, PostgreSQL, WebSocket, UDP广播- 设备注册和列表显示正确
- 文件变更实时通知其他设备
- 离线设备上线后补全同步
- 选择性同步只下载选中文件夹
- 按需下载功能正常
- 局域网P2P传输生效
- P2P失败回退到服务器
你学到了什么
Section titled “你学到了什么”- 设备注册与管理 → Module: 多端系统
- WebSocket事件广播 → Module: 实时通信
- 选择性同步策略 → Module: 同步设计
- P2P局域网发现 → Module: P2P网络
V6 — 10万+用户:团队同步与版本回滚
Section titled “V6 — 10万+用户:团队同步与版本回滚”团队共享文件夹,需要权限控制、版本历史和离线支持。
你要解决什么
Section titled “你要解决什么”- 共享文件夹与权限控制
- 文件版本历史和回滚
- 离线操作队列
给AI的Prompt
Section titled “给AI的Prompt”在V5基础上实现团队同步:
共享文件夹:1. 创建共享文件夹,邀请团队成员2. 权限模型: - owner:完全控制(读写+管理成员+删除) - editor:读写 - viewer:只读3. 成员管理:邀请/移除/修改权限4. 共享文件夹独立于个人文件夹
权限控制:1. 文件级权限继承:默认继承文件夹权限2. 可对单个文件设置特殊权限3. 权限检查:上传/下载/删除前验证4. 操作审计日志(谁在什么时间操作了什么文件)
版本历史:1. 每次文件变更保存历史版本2. PostgreSQL存版本元数据,块存储保留历史块3. 版本列表:显示每个版本的时间、修改者、大小4. 版本预览:查看历史版本内容5. 版本回滚:恢复到指定版本6. 版本保留策略:最近30天所有版本 + 之前每月保留1个
离线队列:1. 离线时操作记录到本地队列2. 队列项:{operation, path, data, timestamp}3. 上线后按顺序回放队列4. 回放冲突处理(离线期间他人修改了同一文件)5. 队列持久化(IndexedDB),断电不丢失
存储优化:1. 去重:相同内容的块只存一份(content-addressable storage)2. 冷热分离:最近文件在SSD,历史版本在HDD/S33. 存储配额:每个用户/团队配额限制4. 配额告警:接近限额时通知
技术:Electron, Go微服务, PostgreSQL, Redis, 块存储, WebSocket- 共享文件夹创建和邀请正常
- 权限控制生效(viewer不能写)
- 操作审计日志完整
- 版本历史正确记录
- 版本回滚文件内容正确
- 离线队列正确记录操作
- 上线后队列回放正确
- 内容去重减少存储空间
- 存储配额限制生效
你学到了什么
Section titled “你学到了什么”- RBAC权限模型 → Module: 权限系统
- 版本控制(快照+增量)→ Module: 版本管理
- 离线队列与冲突回放 → Module: 离线优先
- Content-Addressable Storage → Module: 存储系统