让事项和文字各有位置
#后台待办在 0.327.0 加入,负责记录需要推进的小事。0.334.0 补上未完成事项的首尾排序,0.336.0 再把待办与私有便签接起来:从一条已保存事项出发,打开新的便签编辑器,继续补充完整的文字。
事项仍留在原清单里,便签也保持私有。两者分别保存、分别维护;这一步不改变完成状态,也不会把私有文字带入公开日志。
顺序对应整个未完成清单
#未完成事项可移至最前或最后。操作针对完整未完成清单,包括当前关键词没有显示的事项;页面会明确说明这个范围。位于首尾时,对应按钮不可用,没有位置变化也不会产生新的历史。
排序保留事项的标识、文字、创建时间、修改时间与完成状态,已完成事项的保存位置也保留。管理概览按整理后的顺序显示前三条未完成事项,清单与概览可以沿同一顺序继续。每次实际调整前,会保留一份完整清单历史。
查看排序和历史恢复说明 →用版本读取已保存的文字
#选择「用已保存事项展开」后,服务端先核对登录状态、CSRF 与请求来源,再检查清单版本和事项标识。读取只使用当前清单中的已保存文字,忽略请求里另附的输入文字。
下面是当前 saved_text 函数的原文。read 沿用清单读取锁和格式检查;版本来自已保存文件原始字节的摘要。如果其他页面已更新清单,展开会返回版本冲突,要求刷新后核对。这个函数只返回文字,不执行待办或便签写入。
代码示例 · 13 行
pub fn saved_text(app: &App, revision: &str, id: &str) -> Result<String, String> {
let saved = read(app)?;
if saved.revision != revision {
return Err("版本冲突:清单已在其他页面更新,请刷新后重试。".into());
}
saved
.document
.items
.iter()
.find(|item| item.id == id)
.map(|item| item.text.clone())
.ok_or_else(|| "事项不存在,请刷新后重试。".into())
}
停在尚未保存的编辑器
#展开后,新便签标题最多取事项前 100 个 Unicode 字符,正文保留完整事项,标签留空。新编辑器会说明「尚未创建便签」;只有明确保存,才会生成独立的私有便签。原事项、顺序、完成状态和待办历史都保持不变。
未完成和已完成事项都能展开。页面其他尚未保存的待办修改不会带入;启用脚本时,离开有未保存文字的待办页仍会提醒。带入的新便签同样保留未保存提醒,取消离开后可以继续编辑。
查看从事项展开便签的步骤 →把原事项和验证一起保留
#下方是独立编写的版本 1 待办结构示例,标识、文字和时间均为示例。排序只调整未完成条目的顺序,展开便签只读取其中的文字;这两步都不会改写事项文字。完整清单和更改历史继续随应用备份保存。
0.336.0 的验证包含 379 项 Rust 测试,以及隔离副本中的 70 项待办流程检查和 80 种布局组合。检查覆盖展开不写入、伪造输入排除、版本冲突、登录与表单保护、160 字符原文和 100 字符标题、未保存提醒,以及明确保存便签后原清单和历史不变。另验证了便签及便签历史的新写入在创建临时文件时使用 0600;既有文件未批量改写。
这些私有写入检查只使用新建的隔离示例。线上验证采用只读私有页面检查及公开工作流程检查,没有提交实际待办或便签变更;本次没有重新运行全部公开检查组。
代码示例 · 9 行
# 独立结构示例,文字、标识和时间均为示例。
version = 1
[[items]]
id = "00000000-0000-4000-8000-000000000001"
text = "示例:把这件事补充成完整记录"
done = false
created_at = "2026-11-06T00:00:00+00:00"
updated_at = "2026-11-06T00:00:00+00:00"