命令行版的 TodoList 工具#
项目地址:https://github.com/MrTwoc/todo-rs
用 rust 语言实现的一个基于控制台的 todolist,主要用于对事件的记录 & 打卡,目前实现了基础的增删改查功能。
后续计划用 [表格化输出 + emoji 符号] 来美化一下输出结果,比如:
✅🟢【已经完成】 🟡⏸️【待定】
逻辑处理#
添加=>
command_add()=>接收用户输入,判断第一个参数是否为add,然后判断参数长度,参数<3 则提示参数不足,
然后调用Target::add()=>方法接收四个参数,包括<任务名称><截止日期>[描述][分组],[]为可选参数,
所以只需要输入任务名和日期就能添加任务,其他参数都会被设默认值
添加之前会先遍历文件中所有任务的id,然后 +1 给新的任务,随后写入json
删除=>
将json文件读取出来,定义个变量存储长度,调用.retain方法,作用=>
遍历tasks向量中的每个元素
对每个元素执行闭包|task| task.id != Some(id)
保留闭包返回true的元素,移除返回false的元素
然后比较删除前和删除后的长度,小于前长度就删除成功了。
查询=>
读取json然后遍历
编辑=>
接收用户输入,判断指令长度<3 或者 (指令长度 - 1) % 2 == 0 则会提示不匹配,因为第0、1是edit和任务ID,
2是字段名 2+1则为修改内容,所以能这样匹配,然后进入Target::edit()=>方法
判断id是否合法与存在,然后按id取出该任务,进入for循环,定义:字段和参数俩变量,进入match匹配字段,
符合后修改,然后写入json文件
// 获取可变任务引用
let task = &mut tasks[task_index];
// 解析并应用字段更新(从索引1开始,每两个参数为一组)
for i in (2..args.len()).step_by(2) {
let field = args[i];
let value = args[i + 1];
// 任务状态可用指令单独修改
match field {
"name" => task.target_name = value.to_string(),
"deadline" => task.deadline = value.to_string(),
"description" => task.description = Some(value.to_string()),
"group" => task.group = Some(value.to_string()),
_ => eprintln!("不支持的字段: {}", field),
}
}
项目 TODO#
- 添加任务的完成类型,例如 ——
每年 | 月 | 周 | 日 | 累计 X 次 | 指定日期前完成 - 应用可以在桌面托盘中或者后台运行
- 多窗口,例如查看指定组的任务详情,就会在新窗口中显示
- 关键词查找,可以按关键词查找任务。
- 批量操作:输入一次指令,编辑多个任务,比如批量完成任务。
- 操作记录,完成记录:记录用户的每条成功执行的命令,以及用时间戳的形式记录任务完成时间,以及可以在应用内查看记录
- 性能优化:目前内存占用 12MB 左右觉得有些高,打算尽可能的降低资源占用。
- ⏸️任务日历:可以输出当月日历