# campus task **Repository Path**: campus-task/campus-task_group ## Basic Information - **Project Name**: campus task - **Description**: 实现一个最小版CampusTask,支持添加任务 、查看任务 、完成任务 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2026-06-29 - **Last Updated**: 2026-06-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CampusTask - 校园任务清单 一个模块化设计的命令行任务管理工具,帮助学生管理课程作业、实验报告和考试复习任务。 ## 项目结构 ``` campus_task/ ├── campus_task/ # 包目录 │ ├── __init__.py # 包初始化文件 │ ├── task_model.py # 模型层 - 定义任务数据结构 │ ├── task_storage.py # 存储层 - 负责JSON读写 │ └── task_service.py # 业务逻辑层 - 添加、查询、完成任务 ├── main.py # 命令行交互层 ├── tasks.json # 任务数据文件 └── README.md # 项目说明文档 ``` ## 模块职责说明 ### 模块关系图 ``` ┌─────────────────────────────────────────────────────┐ │ main.py │ │ (命令行交互层 - CLI) │ │ 负责解析命令、接收用户输入、展示任务列表 │ └───────────────────────┬─────────────────────────────┘ │ 调用 ▼ ┌─────────────────────────────────────────────────────┐ │ task_service.py │ │ (业务逻辑层 - Service) │ │ 负责添加任务、查询任务列表、标记任务完成 │ └───────────────────────┬─────────────────────────────┘ │ 使用 ┌────────────┴────────────┐ ▼ ▼ ┌─────────────────────┐ ┌─────────────────────┐ │ task_model.py │ │ task_storage.py │ │ (模型层) │ │ (存储层) │ │ 定义Task数据结构 │ │ 负责JSON文件读写 │ └─────────────────────┘ └─────────────────────┘ ``` ### 各模块职责 | 模块 | 职责 | 说明 | |------|------|------| | **task_model.py** | 模型层 | 定义 Task 类,封装任务数据结构和序列化方法 | | **task_storage.py** | 存储层 | 负责从 JSON 文件读取和写入任务数据 | | **task_service.py** | 业务逻辑层 | 实现任务的添加、查询、完成等业务逻辑 | | **main.py** | 命令行交互层 | 处理命令行参数和交互式界面,调用业务层 | ## 功能特性 - 添加任务:支持设置任务标题和截止日期 - 查看任务:显示所有任务的详细信息 - 完成任务:标记任务为已完成状态 ## 命令用法 ### 添加任务 ```bash python main.py add "任务标题" [截止日期] ``` 示例: ```bash python main.py add "完成软件工程实验1" python main.py add "提交数据结构作业" 2026-06-15 ``` ### 列出所有任务 ```bash python main.py list ``` ### 标记任务完成 ```bash python main.py done <任务编号> ``` 示例: ```bash python main.py done 1 ``` ### 交互式模式 ```bash python main.py ``` ## 用户故事 ### 1. 记录任务截止日期 - **用户故事**:作为学生,我希望记录任务截止日期,以免忘记。 - **验收标准**:添加任务时可填写截止日期,查看任务时能正常展示该日期。 ### 2. 添加带标题的任务 - **用户故事**:作为学生,我希望添加带标题的任务,以便区分不同校园任务。 - **验收标准**:add 命令可输入标题,任务标题能正确保存。 ### 3. 查看任务创建时间 - **用户故事**:作为学生,我希望查看任务创建时间,以便了解任务的添加时间。 - **验收标准**:list 命令能显示每个任务的创建时间。 ### 4. 标记任务完成 - **用户故事**:作为学生,我希望用编号标记任务完成,以便更新任务状态。 - **验收标准**:done 编号 可将对应任务改为"已完成"。 ### 5. 列出所有任务 - **用户故事**:作为学生,我希望列出所有任务,以便一次性查看全部待办和已办。 - **验收标准**:list 命令能显示所有已添加的任务。 ## 数据存储 任务数据保存在 `tasks.json` 文件中,每个任务包含以下字段: - id: 任务编号 - title: 任务标题 - status: 任务状态(待完成/已完成) - created_at: 创建时间 - deadline: 截止日期(可选) ## 运行环境 - Python 3.x ## 测试与验收 ### 运行测试 ```bash python -m unittest discover tests/ ``` 或直接运行测试文件: ```bash python tests/test_campus_task.py ``` ### 测试用例列表 | 编号 | 测试用例名称 | 测试内容 | |------|-------------|---------| | 1 | `test_add_task_success` | 添加任务成功,验证标题、状态、编号、创建时间 | | 2 | `test_add_task_with_deadline` | 添加带截止日期的任务 | | 3 | `test_add_empty_title_fails` | 添加空标题任务失败,抛出 ValueError | | 4 | `test_view_empty_task_list` | 查看空任务列表 | | 5 | `test_view_non_empty_task_list` | 查看非空任务列表 | | 6 | `test_complete_existing_task` | 完成存在的任务,状态变为"已完成" | | 7 | `test_complete_non_existing_task` | 完成不存在的任务,返回 False | | 8 | `test_task_id_increments` | 任务编号递增 | | 9 | `test_json_file_not_exists_creates_empty_list` | JSON 文件不存在时自动创建空列表 | | 10 | `test_json_file_corrupted_returns_empty_list` | JSON 文件损坏时返回空列表 | | 11 | `test_completed_task_not_repeatedly_completed` | 已完成任务不重复完成 | | 12 | `test_task_persists_after_save_and_reload` | 任务保存后重新读取仍然存在 | ### 需求-测试用例对应表 | 用户故事 | 对应测试用例 | |---------|-------------| | 添加任务(标题) | test_add_task_success, test_add_empty_title_fails | | 添加任务(截止日期) | test_add_task_with_deadline | | 查看任务列表 | test_view_empty_task_list, test_view_non_empty_task_list | | 标记任务完成 | test_complete_existing_task, test_complete_non_existing_task, test_completed_task_not_repeatedly_completed | | 任务编号递增 | test_task_id_increments | | 数据持久化 | test_task_persists_after_save_and_reload | | 边界情况 | test_json_file_not_exists_creates_empty_list, test_json_file_corrupted_returns_empty_list | ### Bug 修复过程记录 **步骤 1:故意制造 Bug** - 修改 `mark_task_done` 函数,将 `task.status = "已完成"` 改为 `tasks.remove(task)` - 意图:将"完成任务"错误地实现为"删除任务" **步骤 2:运行测试观察失败** - `test_complete_existing_task` 失败:任务被删除后 `get_task_by_id` 返回 None - `test_completed_task_not_repeatedly_completed` 失败:同上 **步骤 3:修复 Bug** - 将 `tasks.remove(task)` 改回 `task.status = "已完成"` **步骤 4:验证测试通过** - 所有 12 个测试用例全部通过 ## 课后反思问题 ### 实验二反思 为什么软件设计常常不是"多此一举",而是为了未来少改错? 答:软件设计将复杂系统分解为职责单一的模块,降低了代码的耦合度,提高了可维护性。当需求变更时,只需修改特定模块而不影响其他部分,减少了引入错误的风险。良好的设计还提升了代码的可读性和可测试性,使得团队协作更加高效。 ### 实验三反思 测试是在"找老师要分",还是在给未来的自己提供安全网? 答:测试的真正价值在于为未来的自己和团队提供安全网。通过自动化测试,可以快速验证代码修改是否破坏了现有功能,防止回归错误。测试用例也是文档的一种形式,清晰地说明了代码应该如何工作。当需求变更或代码重构时,测试用例确保系统行为的一致性,减少了维护成本。