从零打造个人任务管理系统:Python 命令行实践
从零打造个人任务管理系统:Python 命令行实践
引言
在日常工作和学习中,我们常常需要管理各种任务:待办事项、项目进度、截止日期提醒等等。虽然市面上有众多任务管理工具,但很多时候我们只需要一个轻量级、可定制、完全掌控的解决方案。本文将带你从零开始,使用 Python 构建一个功能完整的命令行任务管理系统。
这个项目不仅能够帮助你管理日常任务,更是一个学习 Python 编程、文件操作、数据结构的绝佳实践。通过完成这个项目,你将掌握如何设计 CLI 应用、如何持久化存储数据、如何处理用户输入等核心技能。
项目功能说明
本任务管理系统包含以下核心功能:
1. 任务创建
- 支持添加任务标题和详细描述
- 自动分配唯一任务 ID
- 记录创建时间
- 支持设置优先级(高/中/低)
- 支持添加标签分类
2. 任务查看
- 列出所有任务
- 按状态筛选(待办/进行中/已完成)
- 按优先级筛选
- 按标签筛选
- 搜索任务关键词
3. 任务更新
- 修改任务标题和描述
- 更改任务状态
- 调整优先级
- 添加或移除标签
4. 任务删除
- 删除单个任务
- 批量删除已完成任务
- 支持确认机制防止误删
5. 数据统计
- 显示任务总数
- 按状态统计数量
- 显示完成率
技术栈选择
核心语言:Python 3.8+
选择 Python 是因为其简洁的语法、丰富的标准库以及出色的跨平台兼容性。Python 的 INLINE_CODE_0 模块可以方便地构建命令行接口,INLINE_CODE_1 模块提供了便捷的数据持久化方案。
数据存储:JSON 文件
使用 JSON 格式存储任务数据,原因如下:
- 人类可读,便于调试和手动编辑
- 跨平台兼容,无需数据库依赖
- Python 原生支持,无需额外安装库
- 适合小规模数据存储(几百到几千条任务)
命令行框架:argparse
Python 标准库中的 INLINE_CODE_2 模块提供了强大的命令行参数解析能力,支持子命令、位置参数、可选参数等功能,完全满足本项目需求。
时间处理:datetime
使用 Python 内置的 INLINE_CODE_3 模块处理时间戳,支持任务的创建时间记录、完成时间追踪以及过期提醒功能。
核心代码结构
项目目录结构
task_manager/
├── task_manager.py # 主程序入口
├── storage.py # 数据存储模块
├── models.py # 数据模型定义
├── commands.py # 命令处理逻辑
├── tasks.json # 任务数据存储文件
└── README.md # 项目说明文档
数据模型设计(models.py)
from dataclasses import dataclass, asdict
from datetime import datetime
from typing import Optional, List
import uuid
@dataclass
class Task:
id: str
title: str
description: str
status: str # pending, in_progress, completed
priority: str # high, medium, low
tags: List[str]
created_at: str
completed_at: Optional[str] = None
@classmethod
def create(cls, title: str, description: str,
priority: str = "medium", tags: List[str] = None) -> "Task":
return cls(
id=str(uuid.uuid4())[:8],
title=title,
description=description,
status="pending",
priority=priority,
tags=tags or [],
created_at=datetime.now().isoformat()
)
def to_dict(self) -> dict:
return asdict(self)
@classmethod
def from_dict(cls, data: dict) -> "Task":
return cls(**data)
数据存储模块(storage.py)
import json
from pathlib import Path
from typing import List, Optional
from models import Task
class TaskStorage:
def __init__(self, db_path: str = "tasks.json"):
self.db_path = Path(db_path)
self._ensure_db_exists()
def _ensure_db_exists(self):
if not self.db_path.exists():
self.db_path.write_text("[]")
def load_all(self) -> List[Task]:
data = json.loads(self.db_path.read_text())
return [Task.from_dict(item) for item in data]
def save_all(self, tasks: List[Task]):
data = [task.to_dict() for task in tasks]
self.db_path.write_text(json.dumps(data, indent=2, ensure_ascii=False))
def add(self, task: Task):
tasks = self.load_all()
tasks.append(task)
self.save_all(tasks)
def get_by_id(self, task_id: str) -> Optional[Task]:
tasks = self.load_all()
for task in tasks:
if task.id == task_id:
return task
return None
def update(self, task: Task):
tasks = self.load_all()
for i, t in enumerate(tasks):
if t.id == task.id:
tasks[i] = task
break
self.save_all(tasks)
def delete(self, task_id: str):
tasks = self.load_all()
tasks = [t for t in tasks if t.id != task_id]
self.save_all(tasks)
命令处理模块(commands.py)
from typing import List
from storage import TaskStorage
from models import Task
class CommandHandler:
def __init__(self):
self.storage = TaskStorage()
def add_task(self, title: str, description: str,
priority: str, tags: List[str]):
task = Task.create(title, description, priority, tags)
self.storage.add(task)
print(f"✓ 任务已创建 (ID: {task.id})")
def list_tasks(self, status: str = None, priority: str = None,
tags: List[str] = None):
tasks = self.storage.load_all()
# 筛选逻辑
if status:
tasks = [t for t in tasks if t.status == status]
if priority:
tasks = [t for t in tasks if t.priority == priority]
if tags:
tasks = [t for t in tasks if any(tag in t.tags for tag in tags)]
# 显示结果
if not tasks:
print("暂无任务")
return
for task in tasks:
status_icon = {"pending": "⏳", "in_progress": "🔄", "completed": "✅"}
priority_icon = {"high": "🔴", "medium": "🟡", "low": "🟢"}
print(f"{status_icon[task.status]} [{task.id}] {task.title}")
print(f" 优先级:{priority_icon[task.priority]} {task.priority}")
print(f" 标签:{', '.join(task.tags) if task.tags else '无'}")
print(f" 创建:{task.created_at[:10]}")
print()
def complete_task(self, task_id: str):
task = self.storage.get_by_id(task_id)
if not task:
print(f"✗ 未找到任务 {task_id}")
return
task.status = "completed"
task.completed_at = datetime.now().isoformat()
self.storage.update(task)
print(f"✓ 任务 {task_id} 已完成")
def delete_task(self, task_id: str):
self.storage.delete(task_id)
print(f"✓ 任务 {task_id} 已删除")
def stats(self):
tasks = self.storage.load_all()
total = len(tasks)
completed = len([t for t in tasks if t.status == "completed"])
pending = len([t for t in tasks if t.status == "pending"])
in_progress = len([t for t in tasks if t.status == "in_progress"])
print("📊 任务统计")
print(f" 总计:{total}")
print(f" 待办:{pending}")
print(f" 进行中:{in_progress}")
print(f" 已完成:{completed}")
if total > 0:
rate = completed / total * 100
print(f" 完成率:{rate:.1f}%")
主程序入口(task_manager.py)
import argparse
from commands import CommandHandler
def main():
parser = argparse.ArgumentParser(description="个人任务管理系统")
subparsers = parser.add_subparsers(dest="command", help="可用命令")
# add 命令
add_parser = subparsers.add_parser("add", help="添加新任务")
add_parser.add_argument("title", help="任务标题")
add_parser.add_argument("-d", "--description", default="", help="任务描述")
add_parser.add_argument("-p", "--priority", choices=["high", "medium", "low"],
default="medium", help="优先级")
add_parser.add_argument("-t", "--tags", nargs="*", default=[], help="标签列表")
# list 命令
list_parser = subparsers.add_parser("list", help="列出任务")
list_parser.add_argument("-s", "--status", choices=["pending", "in_progress", "completed"])
list_parser.add_argument("-p", "--priority", choices=["high", "medium", "low"])
list_parser.add_argument("-t", "--tags", nargs="*", help="按标签筛选")
# complete 命令
complete_parser = subparsers.add_parser("complete", help="完成任务")
complete_parser.add_argument("task_id", help="任务 ID")
# delete 命令
delete_parser = subparsers.add_parser("delete", help="删除任务")
delete_parser.add_argument("task_id", help="任务 ID")
# stats 命令
subparsers.add_parser("stats", help="显示统计信息")
args = parser.parse_args()
handler = CommandHandler()
if args.command == "add":
handler.add_task(args.title, args.description, args.priority, args.tags)
elif args.command == "list":
handler.list_tasks(args.status, args.priority, args.tags)
elif args.command == "complete":
handler.complete_task(args.task_id)
elif args.command == "delete":
handler.delete_task(args.task_id)
elif args.command == "stats":
handler.stats()
else:
parser.print_help()
if __name__ == "__main__":
main()
运行步骤
第一步:环境准备
确保已安装 Python 3.8 或更高版本:
python --version
第二步:创建项目目录
mkdir task_manager
cd task_manager
第三步:创建源代码文件
将上述代码分别保存为对应的 INLINE_CODE_4 文件:
- INLINE_CODE_5 - 数据模型
- INLINE_CODE_6 - 存储模块
- INLINE_CODE_7 - 命令处理
- INLINE_CODE_8 - 主程序
第四步:运行测试
# 添加任务
python task_manager.py add "完成项目文档" -d "撰写 README 和使用说明" -p high -t 文档 工作
# 查看任务列表
python task_manager.py list
# 按状态筛选
python task_manager.py list -s pending
# 完成任务
python task_manager.py complete <任务 ID>
# 查看统计
python task_manager.py stats
第五步:添加命令行别名(可选)
为了方便使用,可以添加 shell 别名:
# ~/.bashrc 或 ~/.zshrc
alias tm='python /path/to/task_manager/task_manager.py'
总结与扩展建议
通过本项目,我们成功构建了一个功能完整的命令行任务管理系统。这个系统虽然简洁,但具备了任务管理的核心功能:创建、查看、更新、删除和统计。
项目亮点
- 零依赖:仅使用 Python 标准库,无需安装第三方包
- 数据持久化:JSON 存储确保任务数据不会丢失
- 灵活筛选:支持按状态、优先级、标签多维度筛选
- 扩展友好:模块化设计便于后续功能扩展
可扩展方向
- 添加过期提醒:增加截止日期字段,支持过期任务提醒
- 数据导出:支持导出为 CSV、Markdown 等格式
- 任务依赖:支持设置任务之间的依赖关系
- 时间追踪:记录任务实际耗时,生成时间报告
- GUI 界面:使用 tkinter 或 PyQt 添加图形界面
- 云同步:集成 WebDAV 或云存储实现多设备同步
学习收获
通过这个项目,你掌握了:
- Python 命令行应用开发流程
- 数据模型设计与实现
- 文件存储与数据持久化
- 模块化代码组织方式
- 命令行参数解析技巧
这个项目可以作为你 Python 学习之路的里程碑,也可以作为日常使用的实用工具。更重要的是,它展示了如何将一个想法转化为实际可用的软件产品。现在,开始动手构建属于你自己的任务管理系统吧!