一个基于文件的todo工具
yarn global add node-todo-1
新增了“买晚饭的任务”
已经完成
直接使用t add xx
来添加任务
t clear
清除全部任务
这就是今天的目标工具。
具体实现
功能
- 可以列出所有的todo
- 可以新增todo
- 可以删除todo
- 可以编辑todo
- 可以标记已经完成的todo
命令
- t
- t add
- t clear
项目创建
在node-todo-1目录下,yarn init -y
初始化项目,创建package.json文件。
yarn add commander
安装commander的依赖。
进入commander的官方github进行CRM。
添加子命令:
通过一些测试可以得知最后一项是command对象所以要slice一下。
实现add功能
这里我们可以新建一个js文件,将add的方法然后在cli.js中引入。
index.js
cli.js
这样就成功引入并且执行了。
add要实现的时候在数据库中添加item。我们现在需要创建数据库。
逻辑中我们用到了fs.readFile
语法
选项部分flag
选择a+
因为我们要追加内容并且自动生成文件。
我们再次执行,在家目录下的得到一个buffer。
如果我们发现之前的数据是空的,那么就要创建一个空的数组用来存储。
尝试运行node cli add task1
虽然能够成功运行,但是得到的结果并非是我们理想中的结果,我们希望它返回一个字符串。
这里我们用到了fs.writeFile()
方法
这样就基本实现了add功能。
可以看到代码非常冗杂,所以可以对其进行封装优化。
我们的核心思路是:读取之前任务;添加新的任务;存储这个任务到文件。就这三步,也就是说我们的代码应该最好只有如下三行:
接下来是面向接口编程封装。
新建db.js
因为readFile的过程是一个异步的代码,所以我们需要用promise进行一个封装。
read方法:
由于read返回的是promise所以要用await
测试:
封装完成,最后index.js如下。
实现clear功能
实现clear就是要清空当前db的所有数据,也就是直接把db写成一个空数组就可以了。
实现展示任务
process.argv
可以展示用户对此程序的运行记录。
现在写showAll的方法,逻辑就是:读取已有任务并打印出任务
测试成功:
添加完成状态
这时我们的done状态是有问题的,需要引入一个列表。列表在命令行中是很难实现的,所以我们引入一个库。这里我们选择inquirer
官方的模版案例:
测试样例:
很明显123并不是我们需要的结果,所以我们对choices进行一个操作,返回对list的一个数组
添加退出选项并优化
完善所有操作逻辑
如果选中了一个任务,那么它可以有五种操作选项:
- 退出
- 已完成
- 未完成
- 改标题
- 删除
具体操作如下:
如果选择创建任务,那么就只需要把任务push进list即可
最终效果: