# 手札用户功能指南
# 1. 产品定位
手札是一个本地优先的加密笔记应用,专注于快速记录和个人数据安全。
| 核心理念 | 说明 |
|---|---|
| 本地优先 | 数据默认存储在本地,不依赖网络 |
| 隐私安全 | 端到端加密,服务端无法查看内容 |
| 跨设备同步 | 加密导出/导入,或通过 Yjs 增量同步 |
| 快速启动 | 即开即用,无需登录等待 |
# 2. 功能全景
# 2.1. 已实现功能
| 功能 | 状态 | 入口 |
|---|---|---|
| 手札 CRUD | ✅ 创建/读取/编辑/软删除 | 首页列表 + 编辑页 |
| 手札列表 | ✅ 按更新时间排序,显示标签 | 首页 |
| 搜索过滤 | ✅ 按标题和标签搜索 | 首页搜索栏 |
| 标签管理 | ✅ 常用标签快速选择 + 自定义标签 | 编辑页 |
| 加密保护 | ✅ 敏感标签自动触发 AES-GCM 加密 | 编辑页 |
| 解密查看 | ✅ 加密内容可临时解密查看 | 编辑页 🔓 按钮 |
| 导出备份 | ✅ 全量加密导出 JSON 文件 | 设置页 |
| 导入恢复 | ✅ 加密文件导入(含 ID 冲突处理) | 设置页 |
| 密钥备份 | ✅ 账户密钥导出/导入 | 设置页 |
| 自动保存 | ✅ 2秒防抖自动保存草稿到 localStorage | 编辑页 |
| 快捷键 | ✅ Ctrl+S 保存 | 编辑页 |
| 首次引导 | ✅ 首屏欢迎向导,自动创建账户密钥 | 首次启动 |
| 空状态 | ✅ 无数据时显示友好的空页面提示 | 首页 |
| 响应式布局 | ✅ 移动端优先,桌面端居中布局 | 全局 |
| 用户注册/登录 | ✅ 用户名+密码注册/登录 | /login |
| 设备注册 | ✅ 首次同步前注册设备 | 自动 + API |
| Yjs 增量同步 | ✅ 3-5秒防抖异步 CRDT 同步 | 自动 |
# 2.2. 未实现功能(计划中)
| 功能 | 优先级 | 说明 |
|---|---|---|
| 实时多人协作 | 未来 | 需要启用 WebSocket(当前 Yjs CRDT 架构已支持) |
| 邀请码系统 | 待定 | 用户注册邀请码生成和管理 |
| PWA 离线支持 | 已规划 | Service Worker + 离线缓存 |
| 富文本编辑 | 已规划 | Markdown 或所见即所得编辑器 |
| 主题切换 | 已规划 | 深色模式 |
# 3. 快速开始
# 3.1. 纯本地使用(无需注册)
打开应用 → 首次引导(自动生成账户密钥)→ 开始记录手札
↓
所有数据存储在本地 IndexedDB,导出备份到 JSON 文件
# 3.2. 跨设备同步(需注册)
1. 注册/登录 → 2. 开始记录(自动同步)→ 3. 其他设备登录同一账号 → 数据自动同步
# 4. 页面说明
# 4.1. 首页(手札列表)
┌─────────────────────────────────────┐
│ 手札 [🔍][⚙][新建] │
├─────────────────────────────────────┤
│ [🔍 搜索手札... ][✕] │ ← 搜索栏
├─────────────────────────────────────┤
│ 共 12 条 刷新 │
├─────────────────────────────────────┤
│ ┌─────────────────────────────┐ │
│ │ 工作笔记 🔒 🗑 │ │ ← 手札卡片
│ │ 今日完成了三个任务... │ │
│ │ 刚刚 [工作] [+2] │ │
│ └─────────────────────────────┘ │
│ │
│ ┌─────────────────────────────┐ │
│ │ 私密日记 🔒 🗑 │ │
│ │ (加密内容) │ │ ← 加密手札
│ │ 昨天 [#私密] │ │
│ └─────────────────────────────┘ │
│ │
│ 📝 还没有手札 │ ← 空状态
│ 点击"新建"按钮开始记录 │
└─────────────────────────────────────┘
| 元素 | 说明 |
|---|---|
| 🔍 | 展开/收起搜索栏 |
| ⚙ | 进入设置页 |
| 🔒 | 手札已加密 |
| 🗑 | 软删除(可在设置中恢复) |
# 4.2. 编辑页
┌─────────────────────────────────────┐
│ [← 返回] 已保存 🔓 [保存] │ ← 状态栏
├─────────────────────────────────────┤
│ 标题 │ ← 标题输入
├─────────────────────────────────────┤
│ 标签: [#私密] [工作] [灵感] [待办] │ ← 标签选择
│ [学习] [添加标签___] │
├─────────────────────────────────────┤
│ │
│ 在此输入内容... │ ← 正文编辑区
│ │
│ │
├─────────────────────────────────────┤
│ ⚠️ 检测到敏感标签,保存后将自动加密 │ ← 加密警告
└─────────────────────────────────────┘
| 状态 | 说明 |
|---|---|
| 已保存 | 上次保存成功 |
| 保存中… | 正在保存到 IndexedDB |
| 🔒 | 手札已加密 |
| 🔓 | 解密查看模式 |
# 4.3. 设置页
┌─────────────────────────────────────┐
│ [← 返回] 设置 │
├─────────────────────────────────────┤
│ 设备信息 │
│ 设备 ID: xxxx-xxxx... │
│ 创建时间: 2026-05-26 15:30 │
├─────────────────────────────────────┤
│ 备份与恢复 │
│ [📥 导出备份] [📤 导入备份] │
│ ✓ 导入成功:5 条 │
│ 跳过:2 条(已存在) │
├─────────────────────────────────────┤
│ 账户密钥 │
│ 导出密钥可用于在其他设备恢复数据 │
│ [🔑 导出密钥] │
├─────────────────────────────────────┤
│ 关于 │
│ 手札 ShouZha │
│ 本地优先的加密笔记应用 │
│ 版本:0.1.0 │
└─────────────────────────────────────┘
# 4.4. 登录页
┌─────────────────────────────────────┐
│ │
│ 手札 │
│ 登录以同步数据 │
│ │
│ ┌─────────────────────────┐ │
│ │ 用户名 │ │
│ └─────────────────────────┘ │
│ ┌─────────────────────────┐ │
│ │ 密码 │ │
│ └─────────────────────────┘ │
│ │
│ [ 登录 ] │
│ │
│ 还没有账户?注册 │
│ │
│ ┌─── 注册新账户(展开) ───┐ │
│ │ 用户名 │ │
│ │ 密码 │ │
│ │ [注册] [返回登录] │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
# 5. 数据安全
# 5.1. 加密层级
| 层级 | 加密方式 | 说明 |
|---|---|---|
| 手札内容 | AES-256-GCM | 敏感标签(#私密、#密码 等)自动触发加密 |
| 账户密钥 | IndexedDB 存储 | 浏览器安全环境,可导出备份 |
| 同步传输 | AES-256-GCM | Yjs 同步数据端到端加密,服务器不解密 |
| 导出文件 | AES-256-GCM | 全量数据加密导出,需账户密钥才能导入 |
# 5.2. 账户密钥
- 首次使用自动生成
- 存储在浏览器 IndexedDB 中
- 建议导出备份,设备丢失后无法恢复加密数据
# 6. 跨设备同步
# 6.1. 方案 A:手动导出/导入(无需账户)
设备 A: 设置 → 导出备份 → 生成 .json 文件
↓
设备 B: 设置 → 导入备份 → 选择 .json 文件
# 6.2. 方案 B:Yjs 自动同步(需账户)
设备 A: 注册 → 登录 → 编辑手札
↓
自动同步(3-5秒)
↓
设备 B: 登录同一账号 → 自动接收变更
| 特性 | 手动导出 | 自动同步 |
|---|---|---|
| 是否需要账号 | ❌ 否 | ✅ 是 |
| 实时性 | 手动操作 | 3-5秒自动 |
| 冲突处理 | 最后导入胜出 | Yjs CRDT 自动合并 |
| 网络要求 | 仅导出时 | 需要后端服务 |
# 7. 加密说明
# 7.1. 何时触发加密
| 场景 | 是否加密 | 说明 |
|---|---|---|
添加 #私密 标签 |
✅ 自动加密 | 敏感标签检测 |
添加 #密码 标签 |
✅ 自动加密 | 敏感标签检测 |
| 内容包含"密码" | ✅ 自动加密 | 内容敏感词检测 |
| 普通工作笔记 | ❌ 不加密 | 明文存储 |
| 导出备份文件 | ✅ 强制加密 | 无论手札是否加密 |
# 7.2. 加密标记
手札卡片上的 🔒 图标表示该手札已加密。 内容预览显示"(加密内容)"而非实际文本。
# 8. 常见问题
# 8.1. Q: 数据存储在哪儿?
所有手札数据存储在浏览器的 IndexedDB 中。后端服务器仅存储加密后的同步数据(无法解密查看内容)。
# 8.2. Q: 如何备份数据?
设置页 → 导出备份 → 保存 .json 文件。建议同时导出账户密钥。
# 8.3. Q: 换手机后如何恢复?
新设备上安装应用 → 设置 → 导入备份 → 选择备份文件。 如果手札有加密,还需要导入之前导出的账户密钥。
# 8.4. Q: 加密手札的密码是什么?
手札没有独立的密码。加密使用的是账户密钥(AES-256-GCM),密钥存储在浏览器中。导出密钥到安全位置即可实现跨设备解密查看。
# 8.5. Q: 同步会泄露我的内容吗?
不会。同步数据使用账户密钥加密后再传输,服务器端无法解密。这是端到端加密。
# 8.6. Q: 清除浏览器数据会怎样?
IndexedDB 数据会被清除。务必在清除前导出备份,否则数据无法恢复。
最后更新: 2026-07-31 19:58:33 +0800