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/8/2 18:21:35 阅读更多 →
如何让老款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/8/4 7:26:31 阅读更多 →
大语言模型J空间:全局工作空间理论在AI意识访问机制中的发现与应用

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

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

2026/8/2 0:14:38 阅读更多 →

最新新闻

OpenClaw Clawdbot与6AI平台对接实战指南

OpenClaw Clawdbot与6AI平台对接实战指南

1. OpenClaw Clawdbot与6AI平台对接概述OpenClaw Clawdbot(社区昵称"小龙虾")是一款开源的智能对话机器人框架,近期因其支持多模型管理和灵活的插件系统在开发者社区走红。6AI作为国内主流AI能力聚合平台,提供了包括GPT…

2026/8/4 10:23:56 阅读更多 →
LLM幻觉与可验证性危机:构建外部验证层的工程实践

LLM幻觉与可验证性危机:构建外部验证层的工程实践

1. 背景与核心概念:LLM的“幻觉”与可验证性危机在当前的AI浪潮中,大语言模型(LLM)已成为开发者、研究者和普通用户不可或缺的工具。无论是代码生成、文档撰写还是复杂问题解答,LLM都展现出了惊人的能力。然而&#xf…

2026/8/4 10:23:56 阅读更多 →
WiFi发展历程与应用

WiFi发展历程与应用

一、引言 在21世纪的数字时代,WiFi已成为与水和电同等重要的基础设施。从智能手机、笔记本电脑到智能家居设备,围绕人们身边的几乎所有电子产品都离不开它。作为一种普遍且简单的无线网络连接方式,WiFi早已渗透到日常生活的方方面面。回顾WiF…

2026/8/4 10:23:56 阅读更多 →
AI音乐生成实战指南:从本地部署到效果验证

AI音乐生成实战指南:从本地部署到效果验证

说唱歌手 Fenix Flexin 的单曲《Rubz》近期在网络上引发了不小的波澜,但焦点并非其旋律或歌词,而是其来源的真实性。大量听众和业内人士质疑,这首听起来颇具专业水准的歌曲,是否由 AI 音乐生成工具创作。这起事件并非孤例&#xf…

2026/8/4 10:23:56 阅读更多 →
Python音乐数据分析系统开发实战

Python音乐数据分析系统开发实战

1. 项目背景与核心价值豆瓣音乐作为国内最具影响力的音乐社区之一,积累了海量用户评分、评论和标签数据。这些数据背后隐藏着音乐流行趋势、用户偏好特征等宝贵信息。传统的数据分析方式往往停留在表格和简单图表层面,难以直观呈现数据的内在规律。这个毕…

2026/8/4 10:23:56 阅读更多 →
抖音内容收藏神器:一键批量下载高清无水印视频的终极指南

抖音内容收藏神器:一键批量下载高清无水印视频的终极指南

抖音内容收藏神器:一键批量下载高清无水印视频的终极指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…

2026/8/4 10:22:55 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →