粥里有勺糖

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-11 技术笔记个人作品CLI工具

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

# 前言

上一篇文章主要详细介绍了工具的使用,到目前为止已经支持了不少指令了

本期主要做一些优化工作,新增一个指令

  • timec report [option] [filenames...]:导出报告
    • 可以不传入任何可选的参数,直接使用咱们配置的自动记录事务的文件地址
    • 这个指令主要是将导出报告的指令抽离出来

# 功能优化

# 报告导出

注册一个新的command,将原有的option移动下来

其中当[param]后面带有... => [param...]时,标识这个参数类型是一个数组,即可以获取输入的多个值

commander.command("report [filenames...]")
    .description('Automatic generation of time management reports')
    .option('-D, --day [date]', 'One day')
    .option('-M, --month [month]', 'One month')
    .option('-Y, --year [year]', 'One year')
    .option('-R, --range [startDate_endDate]', 'A time period')
    .action((filenames, cmdObj) => {
      // ...code
    }
1
2
3
4
5
6
7
8
9

从配置文件中获取到记录文件的位置

如果没有输入文件名且没有指定默认记录文件,那么抛出提示信息

const config = require(configPath)
const { recordFilepath } = config

if (filenames.length === 0 && !existsSync(recordFilepath)) {
    console.log(`${recordFilepath} is not exist`);
    console.log('you can use "timec upPath <recordFilepath>" set it');
    return
}
1
2
3
4
5
6
7
8

如果没有输入文件,就读取配置的文件中的内容

const content = getFilesContent(filenames.length === 0 ? [recordFilepath] : filenames.map(filename => {
    return getFilePath(cwd, filename)
}))
1
2
3

后续的逻辑不变,跟原来的一致,这里额外添加了一个兜底逻辑

当没有指定输出时间范围的时候,输出1970-2970(手动滑稽)的数据

// ...more code
if (month) {
    const year = new Date().getFullYear()
    return output(`${year}-${month}-01`, `${year}-${month}-${new Date(year, month, 0).getDate()}`)
}

// 兜底(上下1000年,希望代码还在)
output('1970-01-01','2970-01-01')
1
2
3
4
5
6
7
8

# 使用

直接导出默认全部的数据

timec report
1

图片

导出某天

timec report -D 2021-08-11
1

导出今年某月

timec report -M 8
1

导出某年

timec report -Y 2021
1

导出一段时间

timec report -R 2021-08-01_2021-08-11
1

# 导出MD/JSON

这部分逻辑原来和上述部分逻辑耦合在一起,这里也将其拆分出来

预期的指令timec output [option] [filenames...]

逻辑跟上述相同,默认会以配置中的defaultFilepath作为输入文件

commander.Command('output [filenames...]')
    .option('-j, --json', 'Export result as json description file')
    .option('-m, --markdown', 'Export the result as a markdown file')
    .option('-t, --time', 'Export the result with time')
    .action((filenames, cmdObj) => {
        // ...code 添加跟上述一样的逻辑
    })
1
2
3
4
5
6
7

后续逻辑基本一致

  1. 判断是否有输入文件
  2. 判断是否配置了默认输入文件
  3. 获取文件内容
  4. 判断使用的option
  5. 调用对应的逻辑
// 1.
if (filenames.length === 0 && !existsSync(recordFilepath)){
  // code
}

// 2.
// 获取所有文件的内容

// 3.
// 判断输入的option
const { json, markdown, time } = cmdObj
if(json){

}
// ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

优化后的指令如下

导出json

timec output -j
1

导出md

timec output -m
1

option可以组合使用

使用自定义的输入文件

timec output -mj ./file1 ./file2
1

图片

# 小结

目前的指令如下timec --help

图片

现在的代码就像shi⛰,下一期和大家一起优化一下

整洁代码就要来了

然后后续再做一个可视化的功能,将报告通过一个网页展示出来

# 其它

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

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

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

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

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