项目展示: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." - 一个项目胜过一千个教程。

上次更新:
贡献者: Joe