/* main.go - 待办事项列表主程序 这是一个命令行待办事项管理程序,演示了 Go 语言的综合应用 */ package main import ( "bufio" "fmt" "os" "strconv" "strings" "./todo" "./ui" ) func main() { // 创建任务管理器 manager, err := todo.NewManager("data/todos.json") if err != nil { fmt.Printf("❌ 初始化失败: %v\n", err) os.Exit(1) } // 加载现有数据 if err := manager.Load(); err != nil { fmt.Printf("⚠️ 加载数据失败: %v\n", err) } // 创建命令行界面 cli := ui.NewCLI() scanner := bufio.NewScanner(os.Stdin) // 显示欢迎信息 cli.ShowWelcome() // 主循环 for { fmt.Print("> ") // 读取用户输入 if !scanner.Scan() { break } input := strings.TrimSpace(scanner.Text()) if input == "" { continue } // 解析命令 parts := strings.Fields(input) command := strings.ToLower(parts[0]) // 执行命令 switch command { case "add": handleAdd(manager, cli, parts[1:]) case "list", "ls": handleList(manager, cli, parts[1:]) case "done", "complete": handleDone(manager, cli, parts[1:]) case "delete", "del", "rm": handleDelete(manager, cli, parts[1:]) case "edit", "update": handleEdit(manager, cli, parts[1:]) case "search", "find": handleSearch(manager, cli, parts[1:]) case "stats", "statistics": handleStats(manager, cli) case "help", "h": cli.ShowHelp() case "quit", "exit", "q": handleQuit(manager, cli) return case "clear": cli.Clear() default: cli.ShowError(fmt.Sprintf("未知命令: %s", command)) cli.ShowInfo("输入 'help' 查看可用命令") } } // 检查扫描器错误 if err := scanner.Err(); err != nil { fmt.Printf("❌ 读取输入时发生错误: %v\n", err) } } // handleAdd 处理添加任务命令 func handleAdd(manager *todo.Manager, cli *ui.CLI, args []string) { if len(args) == 0 { cli.ShowError("请提供任务内容") cli.ShowInfo("用法: add <任务内容>") return } content := strings.Join(args, " ") task, err := manager.AddTask(content) if err != nil { cli.ShowError(fmt.Sprintf("添加任务失败: %v", err)) return } cli.ShowSuccess(fmt.Sprintf("任务已添加: %s (ID: %d)", task.Content, task.ID)) // 保存数据 if err := manager.Save(); err != nil { cli.ShowError(fmt.Sprintf("保存数据失败: %v", err)) } } // handleList 处理列出任务命令 func handleList(manager *todo.Manager, cli *ui.CLI, args []string) { var filter string if len(args) > 0 { filter = strings.ToLower(args[0]) } tasks := manager.GetTasks() // 应用过滤器 var filteredTasks []todo.Task switch filter { case "done", "completed": for _, task := range tasks { if task.Completed { filteredTasks = append(filteredTasks, task) } } case "pending", "todo": for _, task := range tasks { if !task.Completed { filteredTasks = append(filteredTasks, task) } } default: filteredTasks = tasks } if len(filteredTasks) == 0 { if filter != "" { cli.ShowInfo(fmt.Sprintf("没有找到 %s 状态的任务", filter)) } else { cli.ShowInfo("暂无任务") } return } cli.ShowTaskList(filteredTasks) } // handleDone 处理完成任务命令 func handleDone(manager *todo.Manager, cli *ui.CLI, args []string) { if len(args) == 0 { cli.ShowError("请提供任务ID") cli.ShowInfo("用法: done <任务ID>") return } id, err := strconv.Atoi(args[0]) if err != nil { cli.ShowError("无效的任务ID") return } task, err := manager.CompleteTask(id) if err != nil { cli.ShowError(fmt.Sprintf("完成任务失败: %v", err)) return } cli.ShowSuccess(fmt.Sprintf("任务已完成: %s", task.Content)) // 保存数据 if err := manager.Save(); err != nil { cli.ShowError(fmt.Sprintf("保存数据失败: %v", err)) } } // handleDelete 处理删除任务命令 func handleDelete(manager *todo.Manager, cli *ui.CLI, args []string) { if len(args) == 0 { cli.ShowError("请提供任务ID") cli.ShowInfo("用法: delete <任务ID>") return } id, err := strconv.Atoi(args[0]) if err != nil { cli.ShowError("无效的任务ID") return } task, err := manager.DeleteTask(id) if err != nil { cli.ShowError(fmt.Sprintf("删除任务失败: %v", err)) return } cli.ShowSuccess(fmt.Sprintf("任务已删除: %s", task.Content)) // 保存数据 if err := manager.Save(); err != nil { cli.ShowError(fmt.Sprintf("保存数据失败: %v", err)) } } // handleEdit 处理编辑任务命令 func handleEdit(manager *todo.Manager, cli *ui.CLI, args []string) { if len(args) < 2 { cli.ShowError("请提供任务ID和新内容") cli.ShowInfo("用法: edit <任务ID> <新内容>") return } id, err := strconv.Atoi(args[0]) if err != nil { cli.ShowError("无效的任务ID") return } newContent := strings.Join(args[1:], " ") task, err := manager.UpdateTask(id, newContent) if err != nil { cli.ShowError(fmt.Sprintf("编辑任务失败: %v", err)) return } cli.ShowSuccess(fmt.Sprintf("任务已更新: %s", task.Content)) // 保存数据 if err := manager.Save(); err != nil { cli.ShowError(fmt.Sprintf("保存数据失败: %v", err)) } } // handleSearch 处理搜索任务命令 func handleSearch(manager *todo.Manager, cli *ui.CLI, args []string) { if len(args) == 0 { cli.ShowError("请提供搜索关键词") cli.ShowInfo("用法: search <关键词>") return } keyword := strings.Join(args, " ") tasks := manager.SearchTasks(keyword) if len(tasks) == 0 { cli.ShowInfo(fmt.Sprintf("没有找到包含 '%s' 的任务", keyword)) return } cli.ShowInfo(fmt.Sprintf("搜索结果 (关键词: %s):", keyword)) cli.ShowTaskList(tasks) } // handleStats 处理统计信息命令 func handleStats(manager *todo.Manager, cli *ui.CLI) { stats := manager.GetStatistics() cli.ShowStatistics(stats) } // handleQuit 处理退出命令 func handleQuit(manager *todo.Manager, cli *ui.CLI) { // 保存数据 if err := manager.Save(); err != nil { cli.ShowError(fmt.Sprintf("保存数据失败: %v", err)) } cli.ShowInfo("数据已保存") cli.ShowSuccess("再见!") }