项目展示:Todo Manager 待办事项管理系统
🎯 项目概述
Todo Manager 是一个功能完整的待办事项管理系统,展示了 Python 编程的各个重要方面。这个项目不仅是一个实用的工具,更是学习 Python 编程的绝佳实例。
🏗️ 项目架构
todo-manager/
├── todo_manager/ # 核心模块
│ ├── __init__.py # 包初始化
│ ├── task.py # 任务类定义
│ ├── manager.py # 任务管理器
│ ├── storage.py # 数据存储
│ └── cli.py # 命令行界面
├── tests/ # 测试模块
│ ├── __init__.py # 测试包初始化
│ ├── test_task.py # 任务类测试
│ ├── test_manager.py # 管理器测试
│ └── run_tests.py # 测试运行器
├── main.py # 主程序入口
├── requirements.txt # 依赖管理
├── setup.py # 安装配置
├── pyproject.toml # 项目配置
├── Makefile # 构建脚本
└── README.md # 项目说明
🔧 核心功能
1. 任务管理 (task.py)
功能特性:
- ✅ 任务创建和编辑
- 🏷️ 分类管理(工作、学习、生活、健康、爱好)
- ⭐ 优先级设置(高、中、低)
- 📅 截止日期管理
- ✔️ 完成状态跟踪
技术亮点:
class Task:
"""任务类 - 展示面向对象编程"""
def __init__(self, title: str, description: str = "",
category: Category = Category.LIFE,
priority: Priority = Priority.MEDIUM,
due_date: Optional[date] = None):
# 数据验证
if not title or title is None:
raise ValueError("任务标题不能为空")
self.title = title.strip()
self.category = category
self.priority = priority
# ... 其他属性
def is_overdue(self) -> bool:
"""检查任务是否过期 - 展示逻辑判断"""
if self.due_date is None or self.completed:
return False
return date.today() > self.due_date
def to_dict(self) -> Dict[str, Any]:
"""序列化为字典 - 展示数据转换"""
return {
'id': self.id,
'title': self.title,
'description': self.description,
# ... 其他字段
}
学习要点:
- 🎯 枚举类型:使用
Enum定义分类和优先级 - 🔒 数据验证:构造函数中的输入验证
- 📊 类型注解:使用
typing模块提供类型提示 - 🔄 特殊方法:实现
__str__,__repr__,__eq__等
2. 数据管理 (manager.py)
功能特性:
- 📝 任务增删改查
- 🔍 任务搜索和过滤
- 📊 任务统计分析
- 💾 数据持久化
- 🔄 备份和恢复
技术亮点:
class TodoManager:
"""任务管理器 - 展示系统设计"""
def __init__(self, storage_backend=None):
self.tasks: List[Task] = []
self.storage = storage_backend or JsonStorage()
self._next_id = 1
self.load_tasks()
def filter_tasks(self, category: Optional[Category] = None,
priority: Optional[Priority] = None,
completed: Optional[bool] = None,
due_date: Optional[date] = None) -> List[Task]:
"""任务过滤 - 展示函数式编程"""
filtered = self.tasks
if category is not None:
filtered = [t for t in filtered if t.category == category]
if priority is not None:
filtered = [t for t in filtered if t.priority == priority]
# ... 其他过滤条件
return filtered
def get_statistics(self) -> Dict[str, Any]:
"""统计分析 - 展示数据处理"""
total = len(self.tasks)
completed = len([t for t in self.tasks if t.completed])
overdue = len([t for t in self.tasks if t.is_overdue()])
return {
'total_tasks': total,
'completed_tasks': completed,
'completion_rate': completed / total if total > 0 else 0,
'overdue_tasks': overdue
}
学习要点:
- 🏗️ 设计模式:使用依赖注入和策略模式
- 📋 列表推导式:高效的数据过滤和处理
- 🔢 ID管理:自动生成唯一标识符
- 📈 数据分析:统计计算和比率分析
3. 数据存储 (storage.py)
功能特性:
- 💾 JSON 格式存储
- 🔄 自动备份机制
- 📤 数据导入导出
- 🛡️ 错误处理和恢复
技术亮点:
class JsonStorage(StorageInterface):
"""JSON存储 - 展示接口实现和文件操作"""
def save(self, tasks: List[Task]) -> bool:
"""保存任务 - 展示异常处理"""
try:
# 创建备份
self._create_backup()
# 序列化数据
data = {
'tasks': [task.to_dict() for task in tasks],
'metadata': {
'version': '1.0',
'created_at': datetime.now().isoformat(),
'task_count': len(tasks)
}
}
# 写入文件
with open(self.file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
return True
except Exception as e:
print(f"保存失败: {e}")
self._restore_from_backup()
return False
学习要点:
- 🔌 接口设计:使用抽象基类定义接口
- 📁 文件操作:安全的文件读写和路径处理
- 🛡️ 异常处理:完整的错误处理和恢复机制
- 🔄 数据序列化:JSON 格式的数据转换
4. 命令行界面 (cli.py)
功能特性:
- 🖥️ 交互式菜单系统
- 🎨 彩色输出显示
- ⌨️ 用户输入处理
- 📋 表格化数据展示
技术亮点:
class TodoCLI:
"""命令行界面 - 展示用户交互设计"""
def display_tasks(self, tasks: List[Task], title: str = "任务列表"):
"""显示任务列表 - 展示格式化输出"""
if not tasks:
print(f"\n📋 {title}")
print("暂无任务")
return
print(f"\n📋 {title}")
print("-" * 80)
for i, task in enumerate(tasks, 1):
status = task.get_status_display()
priority = task.get_priority_display()
category = task.get_category_display()
print(f"{i:2d}. {task.title}")
print(f" 状态: {status} | 优先级: {priority} | 分类: {category}")
if task.due_date:
days = task.days_until_due()
if days is not None:
if days < 0:
print(f" ⚠️ 已过期 {abs(days)} 天")
elif days == 0:
print(f" 🔥 今天到期")
else:
print(f" 📅 还有 {days} 天到期")
学习要点:
- 🎨 用户界面设计:清晰的信息展示和交互流程
- 🔤 字符串格式化:多种格式化技巧的应用
- ⌨️ 输入验证:用户输入的验证和处理
- 🎯 控制流程:复杂的程序流程控制
🧪 测试系统
测试覆盖
测试模块:
test_task.py- 任务类测试(20个测试用例)test_manager.py- 管理器测试(18个测试用例)run_tests.py- 测试运行器
测试特性:
class TestTask(unittest.TestCase):
"""任务类测试 - 展示单元测试"""
def setUp(self):
"""测试准备 - 展示测试数据设置"""
future_date = date.today() + timedelta(days=7)
self.task = Task(
title="测试任务",
description="这是一个测试任务",
category=Category.STUDY,
priority=Priority.HIGH,
due_date=future_date
)
def test_task_creation(self):
"""测试任务创建 - 展示基本断言"""
self.assertEqual(self.task.title, "测试任务")
self.assertEqual(self.task.category, Category.STUDY)
self.assertFalse(self.task.completed)
def test_invalid_data_handling(self):
"""测试异常处理 - 展示异常测试"""
with self.assertRaises(ValueError):
Task("") # 空标题应该抛出异常
with self.assertRaises(ValueError):
Task(None) # None标题应该抛出异常
学习要点:
- 🧪 单元测试:使用
unittest框架编写测试 - 🎯 测试策略:边界条件、异常情况、正常流程
- 🔍 断言方法:各种断言方法的使用
- 🎨 彩色输出:自定义测试结果显示
🛠️ 开发工具
项目配置
setup.py - 包管理:
setup(
name="todo-manager",
version="1.0.0",
description="一个功能完整的待办事项管理系统",
packages=find_packages(),
install_requires=[
"colorama>=0.4.4",
"rich>=10.0.0",
],
entry_points={
'console_scripts': [
'todo-manager=todo_manager.cli:main',
'todo=todo_manager.cli:main',
],
},
)
Makefile - 自动化构建:
# 安装依赖
install:
pip install -r requirements.txt
# 运行测试
test:
python -m pytest tests/ -v
# 代码格式化
format:
black todo_manager/ tests/
isort todo_manager/ tests/
# 类型检查
type-check:
mypy todo_manager/
学习要点:
- 📦 包管理:使用 setuptools 创建可安装的包
- 🔧 自动化:使用 Makefile 自动化常见任务
- 📋 配置文件:pyproject.toml, setup.cfg 的使用
- 🎯 入口点:创建命令行工具
💡 设计模式应用
1. 策略模式 (Strategy Pattern)
# 存储策略接口
class StorageInterface(ABC):
@abstractmethod
def save(self, tasks: List[Task]) -> bool:
pass
@abstractmethod
def load(self) -> List[Task]:
pass
# 具体策略实现
class JsonStorage(StorageInterface):
# JSON存储实现
pass
class CsvStorage(StorageInterface):
# CSV存储实现
pass
2. 工厂模式 (Factory Pattern)
class TaskFactory:
@staticmethod
def create_task(task_type: str, **kwargs) -> Task:
"""根据类型创建不同的任务"""
if task_type == "work":
return Task(category=Category.WORK, **kwargs)
elif task_type == "study":
return Task(category=Category.STUDY, **kwargs)
# ... 其他类型
3. 观察者模式 (Observer Pattern)
class TaskObserver(ABC):
@abstractmethod
def on_task_completed(self, task: Task):
pass
class TodoManager:
def __init__(self):
self.observers: List[TaskObserver] = []
def add_observer(self, observer: TaskObserver):
self.observers.append(observer)
def complete_task(self, task_id: int):
task = self.get_task(task_id)
task.complete()
# 通知观察者
for observer in self.observers:
observer.on_task_completed(task)
📊 性能优化
1. 数据结构优化
# 使用字典索引提高查找效率
class TodoManager:
def __init__(self):
self.tasks: List[Task] = []
self._task_index: Dict[int, Task] = {} # ID索引
self._category_index: Dict[Category, List[Task]] = defaultdict(list)
def get_task(self, task_id: int) -> Optional[Task]:
"""O(1) 时间复杂度的任务查找"""
return self._task_index.get(task_id)
2. 内存优化
# 使用生成器减少内存占用
def get_overdue_tasks(self) -> Generator[Task, None, None]:
"""生成器版本,节省内存"""
for task in self.tasks:
if task.is_overdue():
yield task
# 使用 __slots__ 减少内存占用
class Task:
__slots__ = ['id', 'title', 'description', 'category',
'priority', 'due_date', 'completed', 'created_at']
🎓 学习价值
编程概念覆盖
基础概念:
- ✅ 变量和数据类型
- ✅ 函数定义和调用
- ✅ 控制流程(条件、循环)
- ✅ 异常处理
面向对象:
- ✅ 类和对象设计
- ✅ 继承和多态
- ✅ 抽象类和接口
- ✅ 特殊方法实现
高级特性:
- ✅ 装饰器使用
- ✅ 生成器和迭代器
- ✅ 上下文管理器
- ✅ 类型注解
软件工程:
- ✅ 模块化设计
- ✅ 单元测试
- ✅ 文档编写
- ✅ 版本控制
实际应用技能
数据处理:
- JSON 序列化和反序列化
- 文件读写操作
- 数据验证和清洗
- 统计分析计算
用户界面:
- 命令行界面设计
- 用户输入处理
- 信息格式化显示
- 交互流程控制
系统设计:
- 架构设计原则
- 接口定义和实现
- 错误处理策略
- 性能优化技巧
🚀 扩展可能
功能扩展
- 🌐 Web界面:使用 Flask/Django 创建 Web 版本
- 📱 移动应用:使用 Kivy 创建移动应用
- 🔄 同步功能:添加云端同步功能
- 📊 数据分析:使用 matplotlib 生成统计图表
技术扩展
- 🗄️ 数据库:使用 SQLite/PostgreSQL 存储数据
- 🔐 用户系统:添加用户认证和权限管理
- 📧 通知系统:邮件和短信提醒功能
- 🤖 AI集成:智能任务分类和优先级建议
🎉 总结
Todo Manager 项目是一个完美的 Python 学习案例,它:
- 📚 覆盖全面:涵盖了 Python 编程的各个重要方面
- 🎯 实用性强:解决实际问题,有明确的应用价值
- 🏗️ 架构清晰:展示了良好的软件设计原则
- 🧪 测试完整:包含完整的测试覆盖
- 📖 文档详细:提供了丰富的学习资源
通过学习和理解这个项目,您将:
- 掌握 Python 编程的核心技能
- 理解软件开发的最佳实践
- 获得实际项目开发经验
- 建立完整的编程思维体系
这不仅仅是一个代码项目,更是一个完整的学习旅程!🐍✨
"A project is worth a thousand tutorials." - 一个项目胜过一千个教程。
