粥里有勺糖

vuePress-theme-reco 粥里有勺糖    2018 - 2023
粥里有勺糖 粥里有勺糖

Choose mode

  • dark
  • auto
  • light
关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
author-avatar

粥里有勺糖

285

文章

40

标签

关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
  • wheel

    • 个人作品
    • 时间管理CLI工具
      • 做一个CLI版的时间管理工具(一)
      • 做一个CLI版的时间管理工具(十)
      • 做一个CLI版的时间管理工具(11)
      • 做一个CLI版的时间管理工具(12)
      • 做一个CLI版的时间管理工具(13)
      • 做一个CLI版的时间管理工具(14)
      • 做一个CLI版的时间管理工具(15)
      • 做一个CLI版的时间管理工具(二)
      • 做一个CLI版的时间管理工具(三)
      • 做一个CLI版的时间管理工具(四)
      • 做一个CLI版的时间管理工具(五)
      • 做一个CLI版的时间管理工具(六)
      • 做一个CLI版的时间管理工具(七)
      • 做一个CLI版的时间管理工具(八)
      • 做一个CLI版的时间管理工具(九)
    • 组装个支持记笔记的CodePen
    • ESCheck工具原理解析及增强实现
    • 一款检测代码中TODO的eslint插件
    • 实现一个Web UI检测(视觉走查)工具ing
    • 从0-1实现文件下载CLI工具
    • 内联JS处理(ES语法降级&内容压缩)
    • Node CLI工具原理解析
    • 我打造的在线简历生成应用
    • 助你轻松编写与分享snippet的VsCode插件
    • SourceMap解析CLI工具实现
    • 一个通过NPM包共(分)享代码块的解决方案
    • 实践:给女朋友个性化定制应用-体重记录(一)
    • 实践:给女朋友个性化定制应用-体重记录(二)
    • 实践:给女朋友个性化定制应用-体重记录(三)

做一个CL版的时间管理工具(七)

vuePress-theme-reco 粥里有勺糖    2018 - 2023

做一个CL版的时间管理工具(七)

粥里有勺糖 2021-08-08 技术笔记个人作品CLI工具

# 做一个CLI版的时间管理工具(七)

# 前言

上一篇文章主要阐述了多种日期的数据导出与任务管理相关的指令开发

本文将会涉及指令:

  1. 删除指定任务:timec task -d [name]
    1. 添加了一个option参数-d,标识要移除这个任务
  2. 设置记录默认输出位置:timec upPath <recordFilepath>
    1. 用户后续通过指令添加/完成事务均会在此记录
  3. 开始/结束具体的事务:timec thing -s [name]
    1. 其中-s标识,是否暂存任务状态的可选参数

# 本期效果

TODO: 补一张图

# 功能开发

# 删除任务指令

这个功能只需在昨天开发的任务管理指令的基础上添加一个可选指令即可

  • 首先使用option方法注册--del可选参数
  • 通过解构从cmdObj上拿到del的值
commander.command("task [name]")
    .option('-d, --del', 'Delete task or thing')
    .action((name, cmdObj) => {
        const { del } = cmdObj
        // ...code
    }
1
2
3
4
5
6

如果del的值为true,表明设置了del这个option

  • 使用splice方法,从任务数组中删除这一项
  • 删除后更新配置文件
    • 如果任务被清空了,那么将defaultTaskIdx置为-1
    • 否则以当前任务列表的第一项,作为正在进行的任务
const idx = tasks.findIndex(v => v === name)

if (del) {
    tasks.splice(idx, 1)
    console.log(`del ${name} success`);
    config.defaultTaskIdx = tasks.length ? 0 : -1
    if (config.defaultTaskIdx === 0) {
        console.log('now use task:', tasks[config.defaultTaskIdx]);
    }
}

writeFileSync(configPath, JSON.stringify(config))
1
2
3
4
5
6
7
8
9
10
11
12

删除任务的功能,就简简单单的搞定了

# 设置记录默认输出位置

# 功能背景

在未引入通过指令记录所做任务的耗时时

需要手动将这些记录添加到记录文件中

期望后续能通过指令,就自动计算事务耗时,然后将记录自动写到目标文件中

如果目标文件的地址是拼在参数中,难免在每次使用的时候稍显麻烦

为了避免这个小麻烦,就将目标文件的路径存到配置文件中

# 指令开发

其中存储位置对应配置文件中的recordFilepath属性

{
    "recordFilepath":"/Users/sugar/Documents/fe-project/time-control/test.md"
}
1
2
3

通过commander.command注册指令,设置为upPath <recordFilepath>

  • emm这个命名感觉有点奇怪,暂时没想到更好的命名方式,后续在优化阶段统一更新
/**
 * 更改默认记录文件的位置
 */
commander.command("upPath <recordFilepath>")
    // .alias('urp')
    .description('update config recordFilepath')
    .action((recordFilePath) => {
        // ...code
    })
1
2
3
4
5
6
7
8
9

通过指令执行目录cwd与传入的文件相对路径recordFilePath得到输出文件所在位置的绝对路径

然后将这个绝对路径赋值给配置文件的recordFilePath属性

通过fs.existsSync方法,判断这个文件是否存在,如果不存在就自动创建

最后通过fs.writeFileSync更新配置文件

const config = require(configPath)
const fullPath = path.resolve(cwd, recordFilePath)
config.recordFilepath = fullPath
if (!existsSync(fullPath)) {
    // 自动创建空文件
    createFile(fullPath, '', false)
}
writeFileSync(configPath, JSON.stringify(config))
console.log('set recordFilePath success:', fullPath);
1
2
3
4
5
6
7
8
9

设置输出文件路径的指令开发到这就完毕了

# 事务管理指令开发

期望通过简单的timec thing -s [name],即可完成事务的添加,结束,自动写入到文件

其中--stopoption是可选的,标识结束这个工作,将其写入到文件之中去

首先注册指令,然后从配置文件中取出相关的配置项目

其中thing属性的结构如下

{
    "name":"abc",
    "startTime":"2021-08-08 22:18:19"
}
1
2
3
4

分别存放当前进行中的事务名和事务开始时间

commander.command("thing [name]")
    .option('-s, --stop', 'stop a thing ')
    .description('update config recordFilepath')
    .action((name, cmdObj) => {
        const config = require(configPath)
        const { thing, recordFilepath, tasks, defaultTaskIdx } = config
        const task = tasks[defaultTaskIdx]
        
    })
1
2
3
4
5
6
7
8
9

首先做一些判断,避免引发错误

  1. 判断是否设置了写出文件路径
  2. 判断是否设置了任务

如果没有设置,抛出响应提示信息

const s = new Date(thing.startTime)

if (!existsSync(recordFilepath)) {
    console.log(`${recordFilepath} is not exist`);
    console.log('you can use "timec upPath <recordFilepath>" set it');
    return
}
if (!task) {
    console.log('not set task');
    console.log('you can use "timec task [name]" set it');
    return
}

1
2
3
4
5
6
7
8
9
10
11
12
13

如果没有传入事件名称name,表示使用查询功能,打印当前事务的基本信息

  • 名称
  • 开始时间
  • 已经持续了多久(暂时毫秒代替),TODO:后续优化

如果设置了结束的标志stop,则将这个事务的记录写入到文件之中去,更新配置文件

      
if (!name) {
    if (!thing.name) {
        console.log('Events not in progress');
        return
    }
    const { stop } = cmdObj
    if (stop) {
        writeRecord(recordFilepath, task, thing.name, thing.startTime)
        thing.name = ''
        thing.startTime = ''
        writeFileSync(configPath, JSON.stringify(config))
        return
    }
    console.log('------');
    console.log(`-name:     ${thing.name}`);
    console.log(`-start:    ${s.format('yyyy-MM-dd hh:mm:ss')}`);
    // TODO:时分秒
    console.log(`-duration: ${Date.now() - s} mss`);
    console.log('------');
    return
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

具体的输出到文件的方法writeRecord逻辑稍微有些复杂,今日时间实在有限,明日再详细分析

# 其它

由于每天空闲时间有限,本文就先到这

如果读者还感觉意犹未尽,敬请期待后续更新,或持续关注一下仓库 (opens new window)的状态

欢迎评论区提需求,交流探讨

本系列会不断的更新迭代,直至产品初代完成

  • 仓库地址 (opens new window)
Edit this page (opens new window)
Last Updated: 2022/5/15 12:46:34