1. 为什么我们需要命令行待办事项应用
在数字时代,任务管理工具层出不穷,但大多数都过于臃肿。作为一名长期使用Linux系统的开发者,我一直在寻找一个轻量级、快速响应的任务管理方案。命令行工具恰好满足了这个需求——它们启动快、资源占用低、可以通过脚本扩展功能,而且不受图形界面限制,在任何SSH会话中都能使用。
这个项目就是要用Python构建一个完全运行在终端里的待办事项管理器。它不需要数据库,数据直接存储在纯文本文件中;不需要复杂依赖,标准库就能满足基本需求;最重要的是,它要足够快——从启动到添加任务不超过1秒。
2. 核心功能设计与技术选型
2.1 功能需求拆解
基础功能必须包括:
- 任务添加(带优先级和分类标签)
- 任务列表查看(支持筛选和排序)
- 任务完成标记
- 任务删除
- 数据持久化存储
进阶功能考虑:
- 自然语言识别(如"明天下午开会"自动解析时间)
- 定期任务提醒
- 多设备同步(通过Git实现)
- 统计报表生成
2.2 技术栈选择
经过评估,我选择了以下技术组合:
- Python 3.8+:语法简洁,标准库丰富,跨平台支持好
- Click库:比argparse更优雅的命令行参数解析
- Rich库:让终端输出有颜色和表格等富文本效果
- SQLite:轻量级嵌入式数据库,避免直接操作文本文件
- APScheduler(可选):用于定时提醒功能
提示:虽然可以直接操作文本文件,但SQLite能提供更可靠的事务支持和查询能力,且性能影响可以忽略。
3. 详细实现步骤
3.1 项目初始化
首先创建项目结构:
bash复制todo-cli/
├── todo.py # 主程序
├── models.py # 数据模型
├── db.py # 数据库操作
└── utils.py # 辅助函数
安装依赖:
bash复制pip install click rich sqlite3
3.2 数据库设计
在models.py中定义数据模型:
python复制import sqlite3
from dataclasses import dataclass
from datetime import datetime
@dataclass
class Task:
id: int
title: str
priority: int = 1 # 1-3,3为最高
tags: str = "" # 逗号分隔的标签
created_at: datetime = datetime.now()
completed: bool = False
数据库初始化脚本:
python复制# db.py
def init_db():
conn = sqlite3.connect('todo.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS tasks
(id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
priority INTEGER DEFAULT 1,
tags TEXT DEFAULT '',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
completed BOOLEAN DEFAULT FALSE)''')
conn.commit()
conn.close()
3.3 核心命令实现
使用Click定义命令行接口:
python复制# todo.py
import click
from rich.console import Console
from rich.table import Table
console = Console()
@click.group()
def cli():
"""一个简单的命令行待办事项管理器"""
pass
@cli.command()
@click.argument('title')
@click.option('--priority', type=int, default=1, help='任务优先级(1-3)')
@click.option('--tags', default='', help='逗号分隔的标签')
def add(title, priority, tags):
"""添加新任务"""
# 数据库操作省略...
console.print(f"[green]✓ 已添加任务: {title}[/green]")
@cli.command()
@click.option('--all', is_flag=True, help='显示所有任务(包括已完成)')
@click.option('--tag', help='按标签筛选')
def list(all, tag):
"""列出任务"""
table = Table(title="待办事项")
table.add_column("ID", style="cyan")
table.add_column("任务", style="magenta")
table.add_column("优先级", style="red")
# ...更多列和数据处理
console.print(table)
4. 高级功能实现技巧
4.1 自然语言解析
使用正则表达式识别日期时间:
python复制import re
from dateutil.parser import parse
def parse_natural_language(text):
# 识别"明天下午3点"这类表达
time_expr = re.search(r'(今天|明天|后天|下周)\D*(\d+)点', text)
if time_expr:
due_date = calculate_date(time_expr.group(1))
return f"(截止时间: {due_date} {time_expr.group(2)}:00)"
return ""
4.2 终端通知提醒
结合系统通知工具:
python复制import platform
import subprocess
def notify(title, message):
if platform.system() == "Darwin":
subprocess.run(['osascript', '-e', f'display notification "{message}" with title "{title}"'])
elif platform.system() == "Linux":
subprocess.run(['notify-send', title, message])
5. 实际使用示例
添加任务:
bash复制python todo.py add "完成项目文档" --priority 2 --tags "工作,重要"
查看任务列表:
bash复制python todo.py list --tag "工作"
完成任务:
bash复制python todo.py complete 3 # 完成ID为3的任务
6. 性能优化与调试技巧
6.1 数据库性能优化
- 为常用查询字段创建索引:
python复制c.execute("CREATE INDEX IF NOT EXISTS idx_priority ON tasks(priority)")
c.execute("CREATE INDEX IF NOT EXISTS idx_completed ON tasks(completed)")
- 使用连接池避免频繁开关连接
6.2 常见问题排查
问题1:数据库被锁
- 原因:多进程同时写入
- 解决:设置超时参数
sqlite3.connect('todo.db', timeout=10)
问题2:终端显示乱码
- 原因:终端不支持UTF-8
- 解决:设置环境变量
export LANG=en_US.UTF-8
7. 扩展思路
- Git集成:将todo.db放入Git仓库,通过hook实现自动提交
- Web界面:使用FastAPI暴露REST接口
- 移动端支持:通过Termux在Android上运行
- 数据分析:使用Matplotlib生成任务完成趋势图
这个项目最让我满意的是它的响应速度——在老旧的服务器上也能瞬间加载。经过三个月的日常使用,它稳定处理了超过500个任务条目,数据库体积仍不到100KB。对于开发者来说,命令行工具的高效是图形界面难以替代的。