Todo-CLI 交互式待办工具 v1.0.0-ts-精简学习版本v0.1
// 极简交互式Todo待办工具 | 核心功能增删改查本地JSON持久化 // 运行 bun src/todocli.ts 输入 exit 退出 import fs from fs/promises; import path from path; import readline from readline; // 持久化文件路径 const TASK_FILE path.resolve(__dirname, ./tasks.json); // 核心类型 type Task { id: number; title: string; priority: low | medium | high; status: active | done; }; type TaskStore { list: Task[]; nextId: number; }; // ---------------------- 文件读写核心工具 ---------------------- // 加载任务文件不存在返回空模板 async function loadTasks(): PromiseTaskStore { try { const raw await fs.readFile(TASK_FILE, utf8); return JSON.parse(raw) as TaskStore; } catch { return { list: [], nextId: 1 }; } } // 保存任务到本地json全量覆盖写入 async function saveTasks(store: TaskStore) { await fs.writeFile(TASK_FILE, JSON.stringify(store, null, 2), utf8); } // 错误打印工具 function errLog(msg: string) { console.log(\x1b[31m❌ ${msg}\x1b[0m); } // 成功打印封装统一绿色输出 function sucLog(msg: string) { console.log(\x1b[32m✅ ${msg}\x1b[0m); } // ---------------------- 完整CRUD业务命令 ---------------------- const cmdMap: Recordstring, (args: string[]) Promisevoid { // 【增】add 标题 --priorityhigh --done创建即完成 add: async (args) { const priorityArg args.find(item item.startsWith(--priority)); const priority priorityArg ? (priorityArg.split()[1] as Task[priority]) : medium; // 判断是否创建直接完成 const createDone args.includes(--done); // 过滤配置参数提取任务标题 const title args.filter(i !i.startsWith(--)).join( ).trim(); if (!title) return errLog(必须输入任务标题); const store await loadTasks(); const newTask: Task { id: store.nextId, title, priority, status: createDone ? done : active }; store.list.push(newTask); store.nextId 1; await saveTasks(store); const statusText createDone ? 已完成 : 待完成; sucLog(创建任务 #${newTask.id}【${statusText}】${title}); }, // 【查】list / list --statusactive/done list: async (args) { const statusArg args.find(item item.startsWith(--status)); const filterStatus statusArg ? statusArg.split()[1] : all; const store await loadTasks(); let showList store.list; if (filterStatus ! all) showList store.list.filter(t t.status filterStatus); console.log(\x1b[32m 任务列表\x1b[0m); if (showList.length 0) return console.log( 暂无任务); showList.forEach(t { const stat t.status active ? 待完成 : 已完成; console.log( ID:${t.id} | ${t.title} | 优先级:${t.priority} | ${stat}); }); }, // 【改】标记完成 done id done: async (args) { const id Number(args[0]); if (isNaN(id) || id 0) return errLog(请输入合法数字ID); const store await loadTasks(); const target store.list.find(t t.id id); if (!target) return errLog(不存在ID${id}的任务); target.status done; await saveTasks(store); sucLog(任务#${id}已标记完成); }, // 【改】update 1 --title新标题 --prioritylow update: async (args) { const id Number(args[0]); if (isNaN(id) || id 0) return errLog(第一个参数必须是任务ID); const titleArg args.find(i i.startsWith(--title)); const prioArg args.find(i i.startsWith(--priority)); const store await loadTasks(); const target store.list.find(t t.id id); if (!target) return errLog(不存在ID${id}的任务); // 按需更新字段 if (titleArg) target.title titleArg.split()[1]; if (prioArg) target.priority prioArg.split()[1] as Task[priority]; await saveTasks(store); sucLog(任务#${id}修改成功); }, // 【删】删除单条任务 delete id delete: async (args) { const id Number(args[0]); if (isNaN(id) || id 0) return errLog(请输入合法数字ID); const store await loadTasks(); const oldLen store.list.length; store.list store.list.filter(t t.id ! id); if (store.list.length oldLen) return errLog(不存在ID${id}的任务); await saveTasks(store); sucLog(任务#${id}已删除); }, // 批量清理已完成任务 clear clear: async () { const store await loadTasks(); const before store.list.length; store.list store.list.filter(t t.status ! done); const del before - store.list.length; await saveTasks(store); sucLog(清理完成移除${del}条已完成任务); } }; // ---------------------- 交互主循环 ---------------------- // 启动交互式命令行主程序负责终端输入输出、命令循环监听 async function startCli() { // 创建readline交互实例用于读取终端键盘输入与打印输出 const rl readline.createInterface({ input: process.stdin, // 标准输入流接收用户键盘输入 output: process.stdout, // 标准输出流向控制台打印文字 prompt: \x1b[32mtodo \x1b[0m // 自定义输入提示符\x1b[32m设置绿色字体\x1b[0m重置字体颜色 }); console.clear(); console.log( Todo极简工具【增删改查】); console.log(可用命令); console.log(add 任务名 --prioritylow/medium/high --done 创建任务--done直接完成); console.log(list --statusactive/done 查看任务); console.log(done ID 标记任务完成); console.log(update ID --title新标题 --priorityhigh 修改任务); console.log(delete ID 删除单条任务); console.log(clear 清空全部已完成任务); console.log(exit 退出程序\n); // 在控制台输出自定义提示符 todo 等待用户输入命令 rl.prompt(); // 监听用户按下回车的输入事件input 为用户输入的整行文本 rl.on(line, async (input) { // 去除输入文本首尾多余空格 const line input.trim(); // 判断输入为exit执行退出逻辑 if (line exit) { sucLog(退出程序数据已保存); // 关闭readline交互实例 rl.close(); // 终止当前事件回调后续代码执行 return; } // 用户仅输入空格/直接回车无有效内容重新弹出输入提示符 if (!line) { rl.prompt(); return; } // 以任意空白符空格、Tab分割整行输入拆分为命令参数数组 const parts line.split(/\s/); // 数组第一个元素为主命令add/list/update等 const cmd parts[0]; // 截取数组剩余所有元素作为命令的参数列表 const args parts.slice(1); // 判断输入的命令不存在 if (!cmdMap[cmd]) { errLog(未知命令${cmd}); } else { // 执行对应命令的异步处理函数捕获命令内部异常并打印错误 await cmdMap[cmd](args).catch(e errLog((e as Error).message)); } // 打印空行分隔两次命令输出优化控制台阅读体验 console.log(); // 执行完一条命令后再次弹出提示符等待下一次输入形成循环交互 rl.prompt(); }); // 监听readline关闭事件彻底结束Node/Bun进程0代表正常退出码 rl.on(close, () process.exit(0)); } // 启动程序捕获全局致命异常 startCli().catch(e errLog(全局异常${(e as Error).message}));0.1

相关新闻

SpringBoot+Vue3智慧停车场管理系统实战开发指南

SpringBoot+Vue3智慧停车场管理系统实战开发指南

这次我们来看一个完整的智慧停车场管理系统项目,基于SpringBootVue3技术栈实现。这个项目特别适合Java学习者、毕业设计开发者以及需要快速搭建停车场管理系统的团队使用。项目采用前后端分离架构,前端使用Vue3Element Plus,后端基于SpringBo…

2026/7/19 6:51:41 阅读更多 →
如何让老款Mac焕发新生:OpenCore Legacy Patcher终极使用指南

如何让老款Mac焕发新生:OpenCore Legacy Patcher终极使用指南

如何让老款Mac焕发新生:OpenCore Legacy Patcher终极使用指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否还在为苹果官方宣布你的老Mac…

2026/7/19 6:50:41 阅读更多 →
大语言模型J空间:全局工作空间理论在AI意识访问机制中的发现与应用

大语言模型J空间:全局工作空间理论在AI意识访问机制中的发现与应用

在探索大语言模型内部工作机制的过程中,研究人员发现了一个令人着迷的现象:模型内部存在着类似人类"意识访问"的机制。这种机制被称为"全局工作空间",在Claude模型中具体表现为J空间(J-space)。这…

2026/7/19 6:50:41 阅读更多 →

最新新闻

C++结构体函数与交换函数:从封装到高效数据操作

C++结构体函数与交换函数:从封装到高效数据操作

1. 项目概述:结构体函数与交换函数在C中的核心地位 在C的修炼路上,结构体(struct)和函数(function)是两块绕不开的基石。很多初学者,包括当年的我,都曾把它们当作两个独立的知识点来…

2026/7/19 10:24:24 阅读更多 →
如何彻底移除Windows Defender:终极系统优化与安全自定义指南

如何彻底移除Windows Defender:终极系统优化与安全自定义指南

如何彻底移除Windows Defender:终极系统优化与安全自定义指南 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirr…

2026/7/19 10:24:24 阅读更多 →
Python入门关键4天:数据结构到面向对象编程精要

Python入门关键4天:数据结构到面向对象编程精要

1. Python入门学习的关键阶段解析作为一门易学难精的编程语言,Python的学习曲线在初期相对平缓,但第9-12天这个阶段往往成为新手的分水岭。这个时期学习者已经掌握了基础语法,开始接触更复杂的编程概念,同时也是最容易产生困惑和放…

2026/7/19 10:24:24 阅读更多 →
TMS320F2838x开发:从寄存器到Driverlib的高效映射与实战

TMS320F2838x开发:从寄存器到Driverlib的高效映射与实战

1. 从寄存器到Driverlib:TMS320F2838x高效开发的核心桥梁在嵌入式实时控制领域,尤其是面对德州仪器(TI)C2000系列中像TMS320F2838x这样功能强大的多核异构微控制器时,开发者常常面临一个核心矛盾:一方面&am…

2026/7/19 10:24:24 阅读更多 →
分享一款Python自动打包工具

分享一款Python自动打包工具

今天分享的是一款python自动打包成exe文件的工具。 本工具可将Python脚本(.py)打包为单个可执行文件(.exe),它采用静态分析和动态追踪双重分析机制,两者结合科覆盖99%的依赖检测场景。支持常用支持库检测,可自由选择缺失的依赖安装&#xff…

2026/7/19 10:24:24 阅读更多 →
Reloaded-II依赖循环:技术解析与3种根治方案

Reloaded-II依赖循环:技术解析与3种根治方案

Reloaded-II依赖循环:技术解析与3种根治方案 【免费下载链接】Reloaded-II Universal .NET Core Powered Modding Framework for any Native Game X86, X64. 项目地址: https://gitcode.com/gh_mirrors/re/Reloaded-II Reloaded-II作为一款功能强大的.NET Co…

2026/7/19 10:23:24 阅读更多 →

日新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

月新闻